学生の備忘録なブログ

日々のことを忘れないためのブログです。一日一成果物も目標。

Dropboxにファイルを置きたい。手元にも置きたい。複製することなく。

シンボリックリンクを使う

macOSにはエイリアスシンボリックリンクという2つの選択肢がある。

windowsはまた違うらしいのでwinユーザーの方は参考になりません。

どっちを使うべきなのか

Mac OS Xの10.2より前のバージョンでは、エイリアスはファイルやフォルダを特定する際に、最初にそのユニークIDを用いて、次にパス名を用いました。Mac OS X 10.2で始める際には、エイリアスはこの検索順を逆転し、パス名は最初に用いて、ユニークIDを二番目に用いるようにしました。

これが意味しているのは、もしあなたがファイルを移動し、全く同じ名前のファイルで置き換えた場合、元のファイルへのエイリアスは、今度は新しいファイルを指すということです。

エイリアスは最初にファイルの位置を決定するためにファイルシステムパスを使用するため、今ではシンボリックリンクと同様の振る舞いを提供するようになっています。

シンボリックリンクはファイルを特定するために、完全にパス情報のみに依存しています。

もしあなたが、ファイルを置き換えずに同一ボリューム上のどこかに移動したら、エイリアスは追従するのに対して、そのファイルへのシンボリックリンクは壊れてしまいます。

シンボリックリンクを修復する唯一の方法は、削除してから新しく作るしかありません。

違い

エイリアスは、ファイル固有のIDを持ち、OS側がIDを追跡することで、エイリアス先ファイルを移動しても、リンクが壊れないらしい。驚き。

結論エイリアスを使う

ファイルを選択して、GUIで実行可能。 もしあなたが、ファイルを置き換えずに同一ボリューム上のどこかに移動したら、エイリアスは追従するのに対して、そのファイルへのシンボリックリンクは壊れてしまいます。

シンボリックリンクの方法

むしろ余計なID追跡とかが嫌な人向けに。

ln -s シンボリックリンク元絶対パス リンク先絶対パス

参考文献

ファイルシステムの概要

チームでのwikiの作成手段

gitでいいのでは

チームで議事録、ログ、憲章などを書くときのツール HackMD https://hackmd.io/

キーバインド

emacs,vimどちらも使えるようだ。

エクストリームリーディング

チームで輪読する手段の一つ。

プロジェクト開始時に、プロジェクトマネジメントの本を皆でエクストリームリーディングすることにより、 同時にマネジメント手法の検討ができる。

pythonのリストの記法,参照と配列操作

リスト

リスト

Pythonの組み込みとは違って、numpyのndarrayはスライスのネストa[:][-5][1:8:2]をカンマ区切りでa[:, -5, 1:8:2]とも書くことができ、こちらの方が高速なので普通こちらを使う

スライス記法の復習

list[start:end] マイナスをつければ、終わりから0スタートでカウントした順番を示す [-5:-2]なら終わりから5番目から3番目と思いきや、終わりから4番目から2番目

In [18]:
lt1 = [10,20,30,40,50,60]
print(lt1[-5:-2])
lt1[2:5] = [200, 300, 400]
print(lt1)
[20, 30, 40]
[10, 20, 200, 300, 400, 60]

スライス記法と参照,代入

Pythonの組み込みシーケンスとは違って、配列のスライスは新たにシーケンスを生成せず、もとのシーケンスへのビューを生成する。 これはどういうことだろう。

In [25]:
a = np.arange(10)
In [26]:
a
Out[26]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [36]:
# ビューオブジェクト
a_slice = a[3:6]
In [28]:
a_slice
Out[28]:
array([3, 4, 5])
In [29]:
a_slice[0] = 100
In [30]:
a_slice
Out[30]:
array([100,   4,   5])
In [31]:
a
Out[31]:
array([  0,   1,   2, 100,   4,   5,   6,   7,   8,   9])

ビューは元の配列を参照しているだけなので、ビューの要素に代入すると元の配列が変更される。

ビューではなくコピーが作りたいときは、copyメソッドを使ってa[:5, 3:].copy()などとする

In [33]:
b = np.arange(10)
b_slice = b[3:5].copy()
b_slice[0] = 100
In [35]:
print(b_slice)
print(b)
[100   4]
[0 1 2 3 4 5 6 7 8 9]
In [ ]:
## ファンシーインデックス
これは配列の参照を配列で指定するというようなイメージ
In [38]:
a = np.arange(12).reshape(3, 4)
In [39]:
a
Out[39]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [41]:
a[[0,2,1],[3,2,0]]
Out[41]:
array([ 3, 10,  4])

配列[a[0][3],a[2][3],a[1][0]]が返ってきている。

イメージは


a[[n行目],[m列目]] array([n1m2 , n2m2 , n3*m3])


In [45]:
a[:, [3, 2, 1, 0, 3]]
Out[45]:
array([[ 3,  2,  1,  0,  3],
       [ 7,  6,  5,  4,  7],
       [11, 10,  9,  8, 11]])

このように列で操作することもできる。これは便利。

同じことを複数の行、例えば2行目1行目について行いたい場合は、ネストする。

In [49]:
c = np.arange(12).reshape(3, 4)
print(c)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
In [48]:
c[[1, 0]] [:, [3, 2, 1]]
Out[48]:
array([[7, 6, 5],
       [3, 2, 1]])
In [5]:
# スライス記号が入ってわけわからないコード
import numpy as np
In [62]:
lt = [[10,11,12,13,14,15,16,17,18,19,],[20,21,22],[30,31,32,33,34,35]]
seq_len = 3
features = np.zeros((len(lt),seq_len), dtype=int) #0埋め
In [63]:
for i , row in enumerate(lt):
    features[i, -len(row):] = np.array(row)[:seq_len]
    
# numpy.arrayは、組み込みのlistとは違い、スライスを使った記法がある
# a[][] と a[,,] は等価
# features[i][ltの途中row分から最後まで]
In [64]:
features
Out[64]:
array([[10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])
In [65]:
np.array(row)#元データ全体
Out[65]:
array([30, 31, 32, 33, 34, 35])
In [66]:
np.array(row)[:seq_len]#元データから制限文字数までを取り出す。
Out[66]:
array([30, 31, 32])
</div>

pythonのイテレータとイテラブルについて enumerate()のドキュメントを参照した際の備忘録

イテレータとイテラブルとは

イテラブルとは反復可能であるということ。 イテレータnextメソッドを持つ。 イテレータは、処理の状態をもっている。よって順番に取り出すときにリストより便利な場合がある。

enumerate()

ドキュメント参照

enumerate(iterable, start=0) Return an enumerate object. iterable must be a sequence, an iterator, or some other object which supports iteration. The next() method of the iterator returned by enumerate() returns a tuple containing a count (from start which defaults to 0) and the values obtained from iterating over iterable.

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
next(seasons)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-9-a76fcce3fb20> in <module>()
----> 1 next(seasons)


TypeError: 'list' object is not an iterator

iter()

iter()によってコンテナをイテレータにすることができる。

seasons_iter = iter(seasons)
next(seasons_iter)
'Spring'
next(seasons_iter)
'Summer'
next(seasons_iter)
'Fall'
next(seasons_iter)
'Winter'
next(seasons_iter)
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-20-f2e6da853580> in <module>()
----> 1 next(seasons_iter)


StopIteration: 

参照元

http://www.bokupy.com/detail/29

https://docs.python.jp/3/library/functions.html#enumerate




    
  

pythonのタプルとイミュータブルについて

タプルはイミュータブルとは

「イミュータブル」というのはあくまでも「オブジェクト id を変えずに要素を追加・変更・削除をすることができないこと」のみを表します

イミュータブルでも可能なこと

    1. タプルを参照している変数に再代入すること
    1. タプルの中の要素がミュータブルな場合にその要素そのものを変更すること

a. タプルを参照している変数に再代入すること

# タプルは += の結果新しいタプルが生成される
t2 = t1 = ('みかん', 'りんご')
print(id(t1))    

t1 += ('バナナ', 'パイナップル')
print(id(t1))    
print(t1 is t2)  # => False
print(t1)
print(t2)
4511412168
4506233176
False
('みかん', 'りんご', 'バナナ', 'パイナップル')
('みかん', 'りんご')
# 一方、リストは += で元のリストが維持される
l2 = l1 = ['みかん', 'りんご']
print(id(l1))    

l1 += ['バナナ', 'パイナップル']
print(id(l1))    
print(l1 is l2)  # => True
print(l1)
print(l2)
4506173256
4506173256
True
['みかん', 'りんご', 'バナナ', 'パイナップル']
['みかん', 'りんご', 'バナナ', 'パイナップル']

b. タプルの中の要素がミュータブルな場合にその要素そのものを変更すること

「タプルが持つ参照」を変更することと「タプルが参照するオブジェクトの中身」を変更することは別であって、タプルが禁止しているのは前者のみです。

参照されたオブジェクトが dict 等のミュータブルなオブジェクトであれば当然そのオブジェクトの中身は更新することができます。

# 第 1 要素に dict を持つタプルを定義する
# (要素数が 1 のタプルを定義するときは () 内の末尾に , を入れる必要あり)
t1 = ({'mark': 'ハート', 'number': '7'}, )

print(id(t1))

# dict を変更する
t1[0]['mark'] = 'スペード'

print(id(t1))

print(t1)
# => ({'mark': 'スペード', 'number': '7'}, )
4511897808
4511897808
({'mark': 'スペード', 'number': '7'},)



参照文献

https://www.lifewithpython.com/2017/12/python-tuple-list-difference.html

C言語の復習。*argv[]

cat kata.c
#include <stdio.h>
int main(int argc, char *argv[]){//argcはコマンドラインの数つまりls -a なら2,
                                 //argvは文字配列へのポインタ変数
  int ary1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};//
  char ary2[] ="helloworld";
  for (int i=0; i<10; i++){
    printf("%d\n", ary1[i]);
    printf("%c\n", ary2[i]);
  }
  getchar();//実行待ちになり、適当なキーで終わる。
  return 0;
}

引数をとって、そのコマンドがなんなのか、引数がなにかを認識したりするときにも使える。

char aryC2[] ="helloworld"; このように書くことで、いちいち文字数を配列にひとつずつ入れずとも、配列に一文字ずつ持たせられる。[]とかくことで、文字数を指定せずとも勝手に入る。

./a.out 
0
h
1
e
2
l
3
l
4
o
5
w
6
o
7
r
8
l
9
d