Python3で階乗を求める
math.factorial(n)
を使う。
>>> import math >>> math.factorial(5) 120 >>> math.factorial(10) 3628800
Python3で2点間の距離を求める
公式の通り書く、でよさそう。
2点を (x1, y1), (x2, y2) とする。
import math math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
distance.euclidean
でもできるが遅かった。
from scipy.spatial import distance distance.euclidean((x1, y1), (x2, y2))
numpyの linalg.norm
を使うのはもっと遅かった…。
import numpy as np np.linalg.norm(np.array([x1, y1]) - np.array([x2, y2]))
***
実験してみる。
culc_distance.py
import math import numpy as np import time from scipy.spatial import distance # 公式の通り def distance_fomula(a, b): return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) def distance_scipy(a, b): return distance.euclidean((a[0], a[1]), (b[0], b[1])) def distance_numpy(a, b): return np.linalg.norm(np.array([a[0], a[1]]) - np.array([b[0], b[1]])) if __name__ == '__main__': # 適当な点を4つ a = (330, 68) b = (19, -5221) c = (-778, 768) d = (-230, -23) start = time.time() distance_fomula(a, b) distance_fomula(b, c) distance_fomula(c, d) distance_fomula(d, a) elapsed_time = time.time() - start print("[distance_fomula] elapsed_time:{:f}".format(elapsed_time) + "[sec]") start = time.time() distance_scipy(a, b) distance_scipy(b, c) distance_scipy(c, d) distance_scipy(d, a) elapsed_time = time.time() - start print("[distance_scipy] elapsed_time:{:f}".format(elapsed_time) + "[sec]") start = time.time() distance_numpy(a, b) distance_numpy(b, c) distance_numpy(c, d) distance_numpy(d, a) elapsed_time = time.time() - start print("[distance_numpy] elapsed_time:{:f}".format(elapsed_time) + "[sec]")
3回実行してみた結果:
$ python3 culc_distance.py [distance_fomula] elapsed_time:0.000006[sec] [distance_scipy] elapsed_time:0.000569[sec] [distance_numpy] elapsed_time:0.000040[sec] $ python3 culc_distance.py [distance_fomula] elapsed_time:0.000010[sec] [distance_scipy] elapsed_time:0.000201[sec] [distance_numpy] elapsed_time:0.000064[sec] $ python3 culc_distance.py [distance_fomula] elapsed_time:0.000009[sec] [distance_scipy] elapsed_time:0.000195[sec] [distance_numpy] elapsed_time:0.000059[sec]
測り方どのくらい適切なのかわからないけれど、結構はっきり差が出た…。
Python3でリストやタプルの要素の並びを全通り列挙する
リストの要素の並び替えを全通り列挙したい時は、itertools.permutations(l)
とすればOK。
タプルでも同様に可。
>>> import itertools >>> l = ['a', 'b', 'c'] >>> for i in itertools.permutations(l): ... print(i) ... ('a', 'b', 'c') ('a', 'c', 'b') ('b', 'a', 'c') ('b', 'c', 'a') ('c', 'a', 'b') ('c', 'b', 'a')
そのものはitertools.permutationsオブジェクト。
>>> itertools.permutations(l) <itertools.permutations object at 0x10c5fc3b0>
出力したかったらキャストしたりしないといけない。
>>> list(itertools.permutations(l)) [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
SSH鍵生成〜GitHubに登録する手順のメモ
Macのターミナルからssh鍵生成してGitHubに登録してgit cloneするまでの手順のメモ。
リポジトリの作成はやってある前提で(Web画面からポチポチするだけだし…)。
より参考にすべきページはこちら。
Connecting to GitHub with SSH - User Documentation
この中の
Generating a new SSH key and adding it to the ssh-agent - User Documentation
と
Adding a new SSH key to your GitHub account - User Documentation
をやれば目的は達成されます。
鍵生成
.ssh配下など使いたい場所でssh-keygen
コマンド。
$ cd ~/.ssh $ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ./id_rsa_hoge
-C
でコメント。メールアドレスが一般的らしい。鍵を使い分けるため等ファイル名を変えたい場合は-f
オプションで。
実行するとパスフレーズを聞かれるので入力。不要な場合はenterで空に。
$ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ./id_rsa_hoge Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: ...
ファイルが2つ作られてればOK。
$ ls id_rsa_hoge # 秘密鍵 id_rsa_hoge.pub # 公開鍵
GitHubに鍵の追加
公開鍵をクリップボードにコピーする。今までlessで開いて〜とやっていたけどこれの方がスマートっぽい。
$ pbcopy < ~/.ssh/id_rsa.pub
あとはGitHubのWeb画面から操作。
git clone
ここまで終わったらターミナルに戻り、お好きなディレクトリでいざgit clone
!
$ git clone git@github.com:hoge/myrepo.git Cloning into 'myrepo'... ...
$ ls -la myrepo total 16 drwxr-xr-x 5 hoge staff 160 2 10 11:01 . drwxr-xr-x+ 31 hoge staff 992 2 10 11:01 .. drwxr-xr-x 12 hoge staff 384 2 10 11:01 .git -rw-r--r-- 1 hoge staff 1203 2 10 11:01 .gitignore -rw-r--r-- 1 hoge staff 39 2 10 11:01 README.md
期待通りの中身が入ってれば問題なし。お疲れさまでした。
ハマったところ
git clone
しようとしたところで悲しみのPermission denied (publickey)
。
$ git clone git@github.com:hoge/myrepo.git Cloning into 'myrepo'... (省略) git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
ssh-agentへの鍵の追加が必要でした。
$ ssh-add -K ~/.ssh/id_rsa_hoge
これを実行して再度git clone
したら無事できました。
Generating a new SSH key and adding it to the ssh-agent - User Documentation
ここの Adding your SSH key to the ssh-agent の節ですね。ちゃんと読んで、手順はきちんと守りましょう。
先人の知見:githubからcloneするときにPermission denied (publickey)エラーが発生する | ハックノート
Python3 リスト操作などメモ
AtCoder最初の10問やりながら使ったPython3リスト操作のメモ
スペースで区切られた複数個の要素をリストで受け取る
# 1 3 4 7 l = [int(i) for i in input().split()] l = list(map(int, input().split())) # 上と同じ # l = [1, 3, 4, 7]
スペースで区切られたn行の複数個の要素をリストで受け取る
# 2 # 1 3 4 7 # 2 4 6 n = int(input()) l = [int(input()) for i in range(n)] # l = [[1, 3, 4, 7], [2, 4, 6]]
標準入力の受け取り方まとめはこの記事が素晴らしい:AtCoderで使ってる入力メソッド(Python3) - Qiita
リストから偶数番目の要素の取り出し
# n番目からm個飛ばしで取り出す l[n::m] # l = [1, 3, 4, 7, 11] l[0::2] l[::2] # 0は省略可 # [1, 4, 11] l[3::1] # [7, 11]
リストの重複を排除してソート
set(l) # setの結果はタプルなので、リストにしたい場合は list(set(l))
VMware Fusion上のUbuntuでCapsLockが掛かって外せなくなった
MacBook ProのVMware Fusion上でUbuntu 14.04を使っていたところ,
適当に押したキーでCapsLockが掛かってしまったようなのですが,
CapsLockのショートカットがわからない!
全部大文字で入力されるなんて耐えられない…!
犯人は「英数キー」でした。
スペースキーの左隣のあれ。
組み合わせとかはなく単独。
JISキーボード特有の悩みということか…。
設定すればキーバインド直せるはずなので今度試してみる。
Macのターミナルからアプリケーションを起動する
emacsとかviみたいに、sublime filename.txtとか打ったらSublime Textでファイルを開きたい!
これをMacのターミナル(bash)でやります。
まずは単純にアプリケーションを起動する
openコマンドを使います。
アプリケーションのときは-aオプションです。
bashでSublime Textを開くときは以下。
$ open -a /Applications/Sublime\ Text.app/
一応バージョン3の方なのでこの名前ですが2の場合は適宜合わせて。