Weekly Report

途中で寝てももいいよね,ゆとりだもんね

OS X でスクリーンショット名を変更する

SS を好きなものに変える

$ defaults write com.apple.screencapture name "SS"
$ defaults read com.apple.screencapture
{
    name = SS;
}

before

f:id:arairyoya:20170120104938p:plain

after

f:id:arairyoya:20170120104931p:plain

日記 1回目

深夜,唐突に運動がしたくなり,クロスバイクで家から6km程度の海辺まで行くことにした. この季節は車とコンクリートの熱で昼間のサイクリングは厳しいが,夜中は比較的涼しい. 走り進めていくと,だんだん磯の香りがしてきて,海が近づいたことがわかった. そして到着した直後,遊覧船らしきものが通ったので,写真を撮った.(すこし見づらいが,暗さとiPhoneの性能から仕方がない) f:id:arairyoya:20160720001745p:plain

なぜだろう,急に,旅がしたくなった.

OS Xで端末からアプリケーションを開く

ほとんどの作業を端末で行うゆとりの僕は,LaunchpadやDockからいちいちアプリケーションを開くのが手間だと感じる. ところで,openコマンドを使えば,ファイルやアプリケーションを開くことができる. よく使うものをここでまとめておく.

ファイル

ファイル名を指定すると,ひも付けられたアプリケーションで開かれる.

open hoge.txt
open -a TextEdit hoge.txt # `-a`で開くアプリケーションを明示

URL

URLを指定すると,デフォルトブラウザでそのURLを開く.

open http://example.com

Finder

パスを指定すると,Finderがディレクトリを開く.

open ~/Docuemnts

アプリケーション

オプション-aの後に,アプリケーション名を指定すると,そのアプリケーションを開く.

open -a Firefox

他には

man openを読もう.

...
HISTORY
     First appeared in NextStep.

お前の名を久々に聞いた...

書いた時間

25分

Pythonにおける引数の評価順序

関数呼び出しにおける引数の評価順序は,プログラミング言語によっていろいろと規定されている.

C言語 (C99)

例えばC言語 (C99)では,実引数の評価順序は未規定である.

これは推測だが,C言語コンパイラの実装の手間の軽減や,最適化の余地を残すための規定なのだろう. この規定から,評価順序に依存するようなCのプログラムを書くべきでないことがわかる.

Python (CPython)

ところで,Pythonではどうなのだろうか? 先に検索して,答えを調べてしまうのも良いかもしれない. しかし,せっかくインタプリタが手元にあるのだから,動かして調べてみよう.

バージョン

> python -V
Python 3.4.3

実験

>>> p = lambda s: print(s)

>>> def f(x, y=2, *args, z=3, **kwargs): pass

>>> f(p(1), p(2), p(3), z=p(4), w=p(5))
1
2
3
4
5
>>> f(n, globals().update({'n': 1}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined

>>> f(globals().update({'n': 1}), n)

>>> n
1

どうやら,左から右に評価されるようだ.

答え

ドキュメントによると,左から右 (left to right)に評価されると記述されている. ここに載っている例が,評価順序を明瞭に表している.

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

記事を書いた時間

35分

調布から秋葉原をママチャリで往復 (50km)

調布から秋葉原をママチャリで往復 (50km)

f:id:arairyoya:20150529144422p:plain

体力を高めるため,職場まで自転車で行ってみた.

平均的にプログラマーは体力がなく,僕もそれに漏れないので 死を覚悟しながら進んだ.

結果としては,新宿以外はスムーズに進めた. 新宿は人が多すぎる.

朝と夜の乗ると,ほどよく風を切る感覚が気持ち良かった. 夏の朝夜なら快適かもしれない.

今度はクロスバイクを買って行こうかと画策している.

若くない

今日の運動

ランニングしたら15分で脇腹が痛くなった.

とてもつらい.

大学一年生のころは,軽い運動なんてスイスイできたのに.

若くないのだ,こつこつ頑張ろう.

購入理由

2012年に買ったMac Book Air 13-inchの性能にずいぶん物足りなさを感じていた. 具体的には,仮想マシンをよく立てていたので,割り当てられるメモリや容量に ずいぶん不満があったからだ. 最近では,VAIO Zなんかもかっこよかったが,こだわりがなかったのでMacBook Proにした. Apple製品はこだわらない人の方が合う気がする.

作業環境の構築

MacBook Air時代はhomebrew, homebrew caskを使っていた. 特に不満はないので今回もこの2つをメインに使う. 加えて,最近の若者に流行っている自動化ツールも 使ってみる.

作業内容

homebrew, homebrew cask, Ansibleで今風? (2015年春)のOS X用の環境構築.

参考にした記事は Macの開発環境構築を自動化する (2015年初旬編)

Xcodeのインストール

全ての作業の前にXcodeをいれなければならない.

$ xcode-select -install

お茶でも飲みながら終わるのを待つ.

Homebrewのインストール

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew doctor
$ brew update # もし上のコマンドで必要と言われたら

Ansibleのインストール

Ansibleを動かすにはPython2.7が必要だが,Pythonはpyenvで管理したいので今のうちにいれておく. 詳しくは前のエントリを参考に

$ brew install pyenv-virtualenv
$ pyenv install 2.7.8
$ pyenv global 2.7.8 && pyenv rehash
$ pyenv versions
  system
* 2.7.8 (set by /Users/<user>/.pyenv/version)
$ brew install ansible

Ansibleによる自動化

プロビジョニング用ディレクトリの作成

ホームディレクトリに.macbook-provisioningというディレクトリを作る. そこにivententoryファイルも配置.

$ mkdir .macbook-provisioning && cd .macbook-provisioning
$ echo 'localhost' > hosts'

PlayBookの作成

先に挙げたエントリからほとんど変えずに設定. パッケージは前のマシンのうちすぐ思い出せるものだけにした. 残りは必要になったら入れることにしよう.

- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  vars:
    homebrew_taps:
      - caskroom/cask
    homebrew_packages:
      - { name: git }
      - { name: tig }
      - { name: reattach-to-user-namespace }
      - { name: mercurial }
      - { name: tmux }
      - { name: zsh }
      - { name: tmux }
      - { name: ansible }
      - { name: vim, install_options: with-lua }
      - { name: ctags }
      - { name: peco }
      - { name: autojump }
    homebrew_cask_packages:
      - { name: iterm2 }
      - { name: firefox }
      - { name: google-chrome }
      - { name: virtualbox }
  tasks:
    - name: add tap repos
      homebrew_tap: tap={{ item }} state=present
      with_items: homebrew_taps

    - name: update homebrew
      homebrew: update_homebrew=yes

    # brew
    - name: install brew packages
      homebrew: >
        name={{ item.name }}
        state={{ item.state | default('latest') }}
        install_options={{
          item.install_options | default() | join(',')
          if item.install_options is not string
          else item.install_options
        }}
      with_items: homebrew_packages
      register: brew_result
    - name: make package info dir
      file: path=brew_info state=directory
    - name: save package info
      shell: brew info {{ item }} > brew_info/{{ item }}
      with_items: brew_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list

    # cask
    - name: install homebrew-cask
      homebrew: name=brew-cask state=latest
    - name: install packages
      homebrew_cask: name={{ item.name }} state={{ item.state | default('installed') }}
      with_items: homebrew_cask_packages
      register: cask_result
    - name: make package info dir
      file: path=cask_info state=directory
    - name: save package info
      shell: brew cask info {{ item }} > cask_info/{{ item }}
      with_items: cask_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list
  handlers:
    - name: run fc-cache
      shell: fc-cache -vf

自動化

$ ansible-playbook -i hosts -v localhost.yml

どんどんログが流れていく.気持ちいい. ただし,caskで入れるGUIアプリはいくつか手動で認証が必要なので, 完全な自動化とはいえない.

それでも大部分をやってくれるだけでうれしい.

感想

環境構築は毎回ほとんど手動だったので,これだけでもずいぶん便利だった. とりあえずdotfilesに突っ込むことに.