ofutonneko

情弱がんばる自分用めも

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    # 公開鍵

ssh-agentに鍵の追加

作った鍵を以下のコマンドでssh-agentに追加します。鍵を作るごとにこの作業が必要。

$ ssh-add -K ~/.ssh/id_rsa_hoge

GitHubに鍵の追加

公開鍵をクリップボードにコピーする。今までlessで開いて〜とやっていたけどこれの方がスマートっぽい。

$ pbcopy < ~/.ssh/id_rsa.pub

あとはGitHubのWeb画面から操作。

  • 画面右上の自分のアイコンから、Settings -> SSH and GPG keys -> New SSH key の順でクリック
  • Titleはお好みで
    • 私は今後ほかの鍵を追加するとしたら、どの端末の鍵かを区別できるようにしたいなと思い、そんな内容を入力しました
  • Key欄にpbcopyされたものをペースト
  • Add SSH key をクリック

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

リストのソート
# 昇順
l.sort()
# 降順
l.sort(reverse=True)

ソートについての公式ドキュメント:ソート HOW TO — Python 3.6.5 ドキュメント

リストから偶数番目の要素の取り出し
# 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]

参考:Pythonのリストの偶数と奇数の取り出し方のメモ - 牌語備忘録 -pygo

リストの重複を排除してソート
set(l)
# setの結果はタプルなので、リストにしたい場合は
list(set(l))

参考:Pythonでリスト(配列)から重複した要素を削除・抽出 | note.nkmk.me

VMware Fusion上のUbuntuでCapsLockが掛かって外せなくなった

MacBook ProVMware Fusion上でUbuntu 14.04を使っていたところ,
適当に押したキーでCapsLockが掛かってしまったようなのですが,
CapsLockのショートカットがわからない!
全部大文字で入力されるなんて耐えられない…!

犯人は「英数キー」でした。

スペースキーの左隣のあれ。
組み合わせとかはなく単独。

JISキーボード特有の悩みということか…。
設定すればキーバインド直せるはずなので今度試してみる。

Macのターミナルからアプリケーションを起動する

emacsとかviみたいに、sublime filename.txtとか打ったらSublime Textでファイルを開きたい!
これをMacのターミナル(bash)でやります。

まずは単純にアプリケーションを起動する

openコマンドを使います。
アプリケーションのときは-aオプションです。
bashSublime Textを開くときは以下。

$ open -a /Applications/Sublime\ Text.app/

一応バージョン3の方なのでこの名前ですが2の場合は適宜合わせて。

これをエイリアスとして登録

$ emacs ~/.bash_profile

.bash_profileに以下を書き加える。

alias sublime="open -a /Applications/Sublime\ Text.app/"

"sublime"で"open 〜"のコマンド操作を実行するように指定しました。

読み込み。

$ source ~/.bash_profile

実行

$ sublime test.txt

これでSublime Textをbashからラクラク使えるようになりました! やったね!
ただし存在しないファイル名を指定しても、emacsたちのようにそういう名前のファイルを作成して編集し始めてくれたりなんてことはせず、ただ開けずに終わるので、touchコマンドで空ファイル作成してからとかで実行しましょう!

参考:
qiita.com