きつねたぬきだし

ちょっとしたメモ代わりに。

Qiita 始めた

Qiita 始めた。

OSX - .bash_history のように、 OS X のアプリケーションの使用履歴を記録するスクリプト - Qiita

もともと、本名とは別のいろんなハンドルネームで OSS に首を突っ込んでいた。

今年は 2015 年、いつまでも若くはないので、そろそろ本名のアカウントにシフトすべきだなと思った。

まずは手始めに Qiita から…。

Mac で WebDAV

Backlog のファイル管理には WebDAV が使用できることをしりました。 しかし、プロジェクトページのリンクをたどったら、 Windows XP での操作しか書いてなかったです…。 http://www.backlog.jp/help/usersguide/file/userguide238.html

わざわざブログに書くほどのことでもない簡単なことですが、 備忘録として OS X 版のやり方を記載しておこうと思います。

私は OS X を US ロケールで使ってるので、スナップショットは英語表記になってますが、 記憶を頼りに適当に日本語での操作を書いてあります。 訳が間違ってましたら気軽にご指摘ください!

Finder で「移動」→「サーバに接続」

f:id:kitsunetanukidashi:20140719162426p:plain

出現するプロンプトに、 WebDAV の URL を入力

f:id:kitsunetanukidashi:20140719162433p:plain

「接続」を押すと、はい、マウントできました。

f:id:kitsunetanukidashi:20140719162438p:plain

簡単ですね。

ファイルを個別に管理していると、各々での思い違いの原因になりやすいです。

情報を共有する方法自体を、共有しておいたほうが良いと思います。

2014-09-23 追記:

OS X はマウントしたディレクトリに対しても、システムファイル .DS_Store を生成してしまいます。

以下のコマンドでネットワークストレージをマウントした際に、 .DS_Store ファイルを作らない設定になります。

設定してなかった人は、必ず設定しておきましょう。

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

シェルスクリプトマナー

bashシェルスクリプトを書くときに、

  • 「 exit code が 0 じゃなきゃダメ」
  • 「未知の変数があったらダメ」
  • 「 pipe でつないだ時に途中の pipe で躓いてもダメ」

を矯正するには、それぞれ

set -e
set -u
set -o pipefail

する。短縮して

set -euo pipefail

と書ける。

多くの Linux 環境では /bin/sh の実態は bash なのだけど、 sh といえば bash と決まっているわけではない。 csh も ash も bashzsh もある。

Dash を初め、いくつかのシェルには pipefail がない。 http://ja.wikipedia.org/wiki/Debian_Almquist_shell なので #!/bin/sh ではなく #!/usr/bin/env bash と書く方が石橋を叩いて渡れる。

#!/usr/bin/env bash
set -euo pipefail

これらオプションについては賛否両論あるようだ。 例えば diff や cmp は、 exit code を比較結果を伝えるのに用いる。

Debian コミュニティでは set -e を init.d スクリプトに使うときは注意せよ、と言っている。 https://www.debian.org/doc/debian-policy/ch-opersys.html

より詳細な bash プログラミングについては Advanced Bash-Scripting Guide を読むと良い。 http://www.tldp.org/LDP/abs/html/

PyPI の Top 50 プロジェクトで予約語・組み込み関数の合計出現回数を調べてみた。

書いたスクリプトがこちら

gist: https://gist.github.com/kitsuyui/11cb65ef4f4630432bfa

引数にファイルを指定すると、そのファイル内の Python 予約語・組み込み関数名の出現回数を数え上げ、降順で TSV 形式で出力します。

例えば、このファイル自体の予約語・組み込み関数名の出現回数を出力するとこうなります。

$ python keyword_counting.py keyword_counting.py
in 11
for 10
import  8
if  7
yield   6
def 6
open    4
elif    3
return  3
from    1
help    1
format  1
sum 1
tuple   1
__name__    1
print   1
dir 1

対象は Python ファイルだけでなく、 Python ファイルを含むディレクトリや、 tar.gz, zip 形式などにも対応しています。

PyPI Ranking という PyPI での人気プロジェクトをまとめているサイトがあります。

PyPI Ranking

これを元に、 Top 50 プロジェクトでキーワードの出現回数を記録してみました。

自分のプロジェクトと出現頻度を比較してみると面白いかもしれません。

def    69445
if  48572
return  39990
None    34503
import  27266
in  24468
from    19493
not 17805
for 15311
class   14378
True    14318
else    12466
is  11888
False   10909
assert  8753
raise   7870
try 7530
and 6988
except  6662
len 5970
id  5857
elif    5402
isinstance  5143
pass    5131
or  4991
object  4128
list    3408
type    3104
str 2832
set 2655
as  2613
print   2529
__name__    2466
dict    2407
ValueError  2258
with    2048
lambda  2044
getattr 2022
property    2009
int 1897
super   1875
hasattr 1763
yield   1697
TypeError   1538
del 1432
filter  1386
finally 1330
range   1328
classmethod 1326
continue    1293
open    1232
while   1227
compile 1221
all 1129
Exception   1106
ImportError 1096
break   1085
KeyError    1071
tuple   989
next    954
file    940
AttributeError  882
format  840
repr    825
setattr 781
help    712
map 708
NotImplementedError 606
iter    550
bytes   517
bool    495
__doc__ 492
sorted  471
enumerate   448
basestring  427
buffer  423
dir 411
vars    404
unicode 400
float   377
max 357
global  347
zip 337
IOError 313
OSError 313
exit    295
min 293
callable    290
input   270
long    269
hash    259
AssertionError  258
xrange  249
RuntimeError    214
globals 206
IndexError  205
locals  201
frozenset   199
StopIteration   197
ord 178
issubclass  177
staticmethod    174
DeprecationWarning  168
any 164
__import__  162
SystemExit  157
NameError   151
chr 123
sum 119
eval    116
reversed    114
unichr  114
NotImplemented  107
SyntaxError 101
KeyboardInterrupt   101
reduce  99
hex 93
abs 91
apply   90
cmp 86
exec    82
slice   81
coerce  78
LookupError 67
reload  60
delattr 60
UnicodeDecodeError  58
divmod  58
pow 56
intern  55
memoryview  54
UnicodeError    53
PendingDeprecationWarning   50
Warning 47
OverflowError   46
bin 45
raw_input   44
EOFError    39
license 38
execfile    36
bytearray   35
UnicodeEncodeError  34
ZeroDivisionError   33
UserWarning 30
StandardError   29
quit    29
round   28
copyright   26
RuntimeWarning  25
EnvironmentError    25
MemoryError 24
SyntaxWarning   21
BaseException   21
complex 14
__debug__   10
__package__ 6
UnboundLocalError   6
oct 5
SystemError 4
Ellipsis    3
IndentationError    3
credits 3
GeneratorExit   3
ReferenceError  3
FloatingPointError  1
UnicodeTranslateError   1
ArithmeticError 1
TabError    1

Homebrew と Homebrew Cask でインストールしたパッケージ

私は普段、 OS XUbuntu Server で開発しています。 OS X 上でのソフトウェア管理は、以下の 3 つを使っています。

Mac Ports, Fink, Boxen なども試したのですが、今は Homebrew に落ち着いています。

出先で新しい OS X を使う機会があれば今使っているパッケージをすぐに使えるよう、備忘録として gist に上げておくことにしました。

gist: https://gist.github.com/kitsuyui/c0e10fea42dbdefa6494

ポリシー

  • Mac 上は常にクリーンな状態に保つ
    • 可能な限り vagrantAWS 上に VM を建てることで OS X 上での構成管理を減らす。
  • App Store か Homebrew Cask で管理できない GUI はできるだけインストールしない。

インストール方法

一括でインストールする際には xargs で行を展開してインストールしています。

xargs < brew.leaves.txt -I% brew install %
xargs < brew.cask.list.txt -I% brew cask install %

libpeerconnection.log

Google Chrome が libpeerconnection.log をルートディレクトリに勝手に生成するようになった。 時期的には、 28 にバージョンが上がったあたりか。 無害らしいけれども、 Finder に表示されるとなんか変な気分。

sudo chflags hidden /libpeerconnection.log

不可視にした。

The Zen of Python の元ネタ?

(注意: 本記事の書籍のリンク先は Amazon になっています。)

Python

>>> import this

すると出てくる、 The Zen of Python の 17 行目

Now is better than never.

これの元ネタと思しき文章が、先ほど読んでいた本に偶然載っていたのでメモ。

Now
if not forever
is
sometimes
better than never

R.D.Laing 著の Do You Love Me? という本の EIGHT-59 にある。

日本語訳は「好き?好き?大好き?

ちなみに、同著者・訳者の「結ぼれ」は、 詩集にも関わらず、 Python のようなインデントや、 Graphviz で出力したかのようなモデル図が載っている、素敵な本。