# マスタカの ChangeLog メモ
> マスタカの変更履歴が記録されていくブログです。
--------------------------------------------------------------------------------
title: "Hugo で作ったサイトに llms.txt と llms-full.txt を設置した"
date: "2025-05-18"
--------------------------------------------------------------------------------
## llms.txt とは?
`llms.txt` は LLM のコンテキストウィンドウが小さくて、ウェブサイト全体を処理できないという制限に対応するため提案された、Markdown 形式のテキストファイルです。
2024/9/3 に Answer.AI の Jeremy Howard 氏が https://llmstxt.org/ で提案しました。robots.txt のように RFC で定義されているわけではありません。
H1 セクションでのウェブサイト名、短い要約、H2 セクションでのリンクリストなど、ある程度フォーマットが決まっています。
例: https://llmstxt.org/llms.txt
ウェブサイト情報全てが含まれた `llms-full.txt` というものもあります。
例: https://developers.cloudflare.com/llms-full.txt
llms.txt のディレクトリサイトもあります。
* https://llmstxt.site/
* https://directory.llmstxt.cloud/
* https://llmstxthub.com/
## 設置した llms.txt と llms-full.txt
両方を設置してみました。
* https://masutaka.net/llms.txt
* https://masutaka.net/llms-full.txt
## Hugo への設定方法
必要な作業は、3 つのファイルを変更または新規作成するだけです。
* config.toml(変更)
* layouts/index.llms.txt(新規作成)
* layouts/index.llmsfull.txt(新規作成)
### config.toml
config.toml に以下を追加しました。
`llms` と `llmsfull` の output formats を定義しつつ、outputs.home[^1] のデフォルト値 `["html", "rss"]` に追加しています。
```toml
[outputs]
home = ["html", "rss", "llms", "llmsfull"]
[outputFormats.llms]
baseName = "llms"
isPlainText = true
mediaType = "text/plain"
rel = "alternate"
root = true
[outputFormats.llmsfull]
baseName = "llms-full"
isPlainText = true
mediaType = "text/plain"
rel = "alternate"
root = true
```
[^1]: [Configure outputs - Hugo Documentation](https://gohugo.io/configuration/outputs/)
### layouts/index.llms.txt
`llms.txt` のテンプレートとして、`layouts/index.llms.txt` を作成しました。
```go-text-template
# {{ .Site.Title }}
> {{ .Site.Params.Description }}
## Articles
{{ $yearMonthGroups := slice -}}
{{ range where (where (sort (.Site.GetPage "/posts/").Pages "Date" "desc") "Draft" "ne" true) "Sitemap.Disable" "ne" true -}}
{{ $yearMonth := .Date.Format "2006/01" -}}
{{ if not (in $yearMonthGroups $yearMonth) }}
* {{ $yearMonth -}}
{{ $yearMonthGroups = $yearMonthGroups | append $yearMonth -}}
{{ end }}
* [{{ .Title }}]({{ .Permalink }})
{{- end }}
## Others
{{- $baseURL := .Site.BaseURL | strings.TrimSuffix "/" }}
* [Device]({{ $baseURL }}/device/): 所有デバイス
* [History]({{ $baseURL }}/history/): このサイトの歴史
* [About]({{ $baseURL }}/about/): 自己紹介
* [Privacy Policy]({{ $baseURL }}/privacy/): 当サイトの広告、アフィリエイト、プライバシーポリシー
```
Hugo のサイト構成は様々だと思いますので、あくまで一例です。本ブログはブログ記事とそれ以外の記事があり、それ以外の記事が増減することは少ないので Others はハードコードしました。
### layouts/index.llmsfull.txt
`llms-full.txt` のテンプレートとして、`layouts/index.llmsfull.txt` を作成しました。
```go-text-template
# {{ .Site.Title }}
> {{ .Site.Params.Description }}
{{/* Articles */}}
{{ range where (where (sort (.Site.GetPage "/posts/").Pages "Date" "desc") "Draft" "ne" true) "Sitemap.Disable" "ne" true }}
--------------------------------------------------------------------------------
title: "{{ .Title }}"
date: "{{ .Date.Format "2006-01-02" }}"
--------------------------------------------------------------------------------
{{ replaceRE "{{<\\s*comment\\s*>}}(.|\n)*?{{<\\s*/comment\\s*>}}" "" .RawContent -}}
{{ end -}}
{{/* Others */}}
{{ range slice "device.md" "history.md" "about.md" "privacy.md" -}}
{{ with site.GetPage . -}}
--------------------------------------------------------------------------------
title: "{{ .Title }}"
lastmod: "{{ .Date.Format "2006-01-02" }}"
--------------------------------------------------------------------------------
{{ replaceRE "{{<\\s*comment\\s*>}}(.|\n)*?{{<\\s*/comment\\s*>}}" "" .RawContent -}}
{{ end -}}
{{ end -}}
```
`---` を含む記事があったので、区切り文字は長めにしました。
また、以下のようなコメントがある記事があったので、llms-full.txt に出力されないようにしました。
```markdown
{{<comment>}}
これは Hugo のコメントです。HTML のコメントとしても出力されません。
{{</comment>}}
```
:bulb: コード中の `<` と `>` は、それぞれ `<` と `>` に置換してください。
## nginx への設定
llms.txt と llms-full.txt が文字化けしてしまったので、server ディレクティブに以下を追加しました。
```nginx
location ~ "^/llms(-full)?\.txt" {
root /usr/share/nginx/html;
charset UTF-8;
}
```
## まとめ
Hugo で作られた本ブログに llms.txt と llms-full.txt を設置しました。
* https://masutaka.net/llms.txt
* https://masutaka.net/llms-full.txt
需要はさておき、自己満足したので良しとしました。
余談ですが、最初に [Hugo Discourse で見つけた方法](https://discourse.gohugo.io/t/support-for-llms-txt-standard-for-ai-crawlers/53782/3)では、`layouts/robots.txt` の `resources.ExecuteAsTemplate` をトリガーとして llms.txt を生成していました。しかし、この方法は採用を見送りました。現在 robots.txt に llms.txt を記載することは一般的ではないためです。
さらに余談ですが、本ブログは昔、ChangeLog メモ形式のファイル1つを [chalow](https://chalow.org/) というツールで HTML に変換して作っていたサイトでした。今回 llms-full.txt を作ってその時を思い出しました。また戻ってきたなと。
--------------------------------------------------------------------------------
title: "Pixel 6a から Pixel 9a に機種変更した"
date: "2025-05-04"
--------------------------------------------------------------------------------
Google の [Pixel 9a](https://store.google.com/product/pixel_9a?hl=ja) を購入し、Pixel 6a {{< post "2022-07-30-1" >}} から乗り換えました。Android スマートフォンは Pixel 3a XL {{< post "2020-07-14-1" >}} から 3 台目です。その前は iPhone を丸 10 年使っていました。
4/9(水)に日本での発売が発表されて、Google Store で同日に予約。届いたのは発売日の 4/16(水)でした。素晴らしい。
Pixel 6a は多少バッテリーのもちが悪くなってきたくらいで、特に不満はなかったのですが、3 年経ったし、どのくらい変わったか興味があったので購入しました。
* [Google Pixel 6a スペック・仕様](https://kakaku.com/keitai/smartphone/model/M0000000951/spec/)
* [Google Pixel 9a スペック・仕様](https://kakaku.com/keitai/smartphone/model/M0000001131/spec/)
## 選択したストレージと色
ストレージを 128GB にして、色は Iris(薄青)にしました。
{{< amazon asin="B0F531S2TC" title="Google Pixel 9a 128GB+8GB SIMフリー [Iris] * SIM FREE スマートフォン" >}}
ストレージは 128GB と 256GB から選べます。Pixel 6a では 128GB でだいぶ余裕があったので、今回も迷わず 128GB にしました。
選べる色は Iris(薄青)、Peony(薄ピンク)、Porcelain(白)、Obsidian(黒)の 4 種類です。薄ピンクはさすがに似合わないし、白や黒は iPhone 時代に散々使ったので、Iris(薄青)にしました。Pixel 6a は Sage(薄緑)でしたが、同じような理由だったのでしょう。
## 購入価格
¥79,900 でした。今や 10 万円オーバーが当たり前で 20 万円を超えることもある iPhone と比べるとだいぶ安いです。でも性能は悪くない。
しかも Pixel 6a の下取り価格が ¥25,100 だったので、実質 ¥54,800 でした。
さらに Google Store のクレジット ¥15,000 に加えて、5/31 まで Pixel Watch 3 等に使える 15% オフクーポンも付いてきました。
Google Store で何を買ったら良いの?という質問にはお答えできません :sweat_smile:
## 機種変更作業
Pixel 9a の電源を入れると、今回も移行のためのナビが始まりました。前回は両機種を USB ケーブルで繋ぐ必要がありましたが、今回は必要なく Wifi 経由で移行できました。
物理 SIM カードもナビに従って付け替えるだけでよく、前回必要だった IIJmio の「アクセスポイント名」の設定は不要でした。
ナビが完了すると、Pixel 6a で使っていたアプリが次々とダウンロードされ、インストールされていきます。ログイン済みのアプリとそうでないアプリの違いは何だろう?と思いました。
いくつかのアプリは、個別に移行する必要がありました。
* LINE
* Pixel 9a でログインしようとすると、自動的に移行作業が始まり、Pixel 6a の LINE が無効になった
* 友だちは引き継げるが、トーク履歴は Google Drive を介して自分で移行する必要があるため、心配なら先に手動バックアップすると良いと思う
* モバイルSuica
* 前回同様、Pixel 6a のおサイフケータイアプリでカードを一旦サーバー側に預け、Pixel 9a で受け取る必要があった
* Google マップ
* 去年の今ぐらいから、タイムラインの保存先が Google のサーバーから、ユーザーの各モバイル端末に変わった影響で、Pixel 6a のデータを引き継ぐ必要があった
* タイムライン右上の :cloud: をタップすると、Pixel 6a のバックアップを確認できるので、インポートした。割と毎日マメに手動修正していた、タイムラインの場所は反映されていなかった...
* それとは別な話として、タイムラインを有効にする UI を見つけるのは大変だった
* マイナポータル
* Pixel 9a でスマホ用電子証明書を有効にした。Pixel 6a の電子証明書は無効になった
## 良くなったこと
* 性能向上を少し体感した
* Google Tensor から Google Tensor G4 への性能アップによるもの
* 指紋認証の精度が向上した
* ガラスフィルムを付けても、問題なくロックを解除できる
* Pixel 6a では「画面保護シート モード」を有効にしても、ロックを解除するのが難しいレベルだった
* 顔認証も使える
* 指紋認証と両方使えるのは、地味に結構便利
* ワイヤレス充電が使える
* {{< post "2024-06-25-1" >}} のワイヤレス充電器が Pixel でも使えるようになったが、ちょっとずれるとやたら熱くなるのでイマイチ。充電器の問題だと思うが、高速充電でもないのに...
* Google VPN[^1] が使える
* 指定した Wifi アクセスポイント以外で、VPN を有効にできるのがとても良い。これで公衆 Wifi を気兼ねなく使えそう
* {{< post "2024-05-29-1" >}} で採用しなかった NordVPN の課題を解決できた :+1:
[^1]: 2024/06/20 に終了した Google One VPN とは違うサービスで、[Pixel 7 移行で無料で使える VPN です](https://support.google.com/pixelphone/answer/2819573?hl=ja)
## 悪くなったこと
そこまで悪くはないのですが、カタログスペック以上に大きさと重さを感じます。
| | Pixel 6a | Pixel 9a |
|---|---:|---:|
| サイズ | W:71.8mm x H:152.2mm x D:8.9mm | W:73.3mm x H:154.7mm x D:8.9mm |
| 重量 | 178g | 185.9g |
| 画面サイズ| 6.1inch | 6.3inch |
## あまり変わらないこと
上に書いたこと以外は特に変わらないですが、逆にそれが良いのかも。
¥54,800 払う価値があったかは分かりません :sweat_smile:
## 購入したケースとガラスフィルム
{{< post "2023-12-10-1" >}} の「何の変哲もないケース」で満足したので、同じようなケースを買いました。
ガラスフィルムも同封されていたので付けましたが、要らない気がしたので、止めてしまいました。前述したとおり、このガラスフィルムを付けていても、指紋認証は問題なく通ります。
{{< amazon asin="B0DY16RQDN" title="Google Pixel 9a ケース クリア 黄変防止 グーグルピクセル9a ケース 耐衝撃 ガラスフイルム保護付き 指紋防止 落下防止 耐久性 ストラップホール付 薄型 軽量 ソフトカバー ワイヤレス充電対応 googleピクセル9a用" >}}
## まとめ
Pixel 9a を購入して、Pixel 6a からの移行と、全体的な感想を書きました。
劇的に良くなったことはありませんが、¥54,800 で細かな改善を体験できたことは良かったです。
獲得した Google Store クレジット ¥15,000 で、Fitbit Sense 2 も買いました。それはまた次回の記事で 🙃
--------------------------------------------------------------------------------
title: "GitHub Issue/PR/Discussion URL のタイトルを挿入する Emacs Lisp 関数を作った"
date: "2025-04-15"
--------------------------------------------------------------------------------
GitHub では Issue/PR/Discussion URL をリストで書くと、ステータスやタイトル、No. を描画してくれる。
例えばこのように書くと、
```markdown
* https://github.com/masutaka/sandbox/issues/93
* https://github.com/masutaka/sandbox/issues/70
* https://github.com/masutaka/sandbox/pull/90
* https://github.com/masutaka/sandbox/discussions/91
```
このように描画される。

ただ、テキストエリアやテキストエディタで書いている時は描画されないので、タイトルやステータスが分からない。この数なら問題ないけど、数が多くなると取り違えることがある。
以前は手でこんなコメントを書いていたが、流石に面倒になったので、そんな Emacs Lisp 関数を作った。
```markdown
* https://github.com/masutaka/sandbox/issues/93 (In Progress)
* https://github.com/masutaka/sandbox/issues/70 (Done)
* https://github.com/masutaka/sandbox/pull/90
* https://github.com/masutaka/sandbox/discussions/91
```
## 作成した関数
:link: [~/.emacs.d/init.el#L109-L152](https://github.com/masutaka/dotfiles-public/blob/2ba4f3f9a53405e6de01aaede3ad9676ed346930/.emacs.d/init.el#L109-L152)
```elisp
(require 'cl-lib)
(require 'request)
(defun github-expand-link ()
"Use the GitHub API to get the information and
insert a comment at the end of the current line in the following format:
- Issue URL (Done or In Progress)
- PR/Discussion URL "
(interactive)
(let ((url (thing-at-point 'url 'no-properties)))
(if (not url)
(message "[github-expand-link] No URL at point")
(let* ((parsed-url (url-generic-parse-url url))
(host (url-host parsed-url))
(parts (split-string (url-filename parsed-url) "/" t)))
(if (and (string-match-p "github\\.com$" host) (>= (length parts) 4))
(let ((access-token (my-lisp-load "github-expand-link-token"))
(org (nth 0 parts))
(repo (nth 1 parts))
(type (nth 2 parts))
(number (nth 3 parts))
(type-alist '(("issues" . "issue") ("pull" . "pullRequest") ("discussions" . "discussion"))))
(request
"https://api.github.com/graphql"
:type "POST"
:headers `(("Authorization" . ,(concat "Bearer " access-token)))
:data (json-encode `(("query" . ,(format "query { repository(owner: \"%s\", name: \"%s\") { %s(number: %d) { %s } } }"
(url-hexify-string org) (url-hexify-string repo)
(cdr (assoc type type-alist)) (string-to-number number)
(if (equal type "issues") "title state" "title")))))
:parser 'json-read
:sync t
:success (cl-function
(lambda (&key data response &allow-other-keys)
(let* ((body (car (alist-get 'repository (alist-get 'data data))))
(title (alist-get 'title body))
(state (alist-get 'state body)))
(end-of-line)
(insert (if state
(format " (%s)" title (if (equal "CLOSED" state) "Done" "In Progress"))
(format " " title))))))
:error (cl-function
(lambda (&key error-thrown response &allow-other-keys)
(message "[github-expand-link] Fail %S to POST %s"
error-thrown (request-response-url response))))))
(message "[github-expand-link] Not a valid GitHub Issue/PR/Discussion URL"))))))
```
Discussion の情報を取得する GitHub の REST API はないようなので、GraphQL API を使っている。
サードパーティのパッケージはあまり使わないようにしているけど、[request.el](https://github.com/tkf/emacs-request) は好んで使っている。
my-lisp-load は {{< post "2016-05-06-2" >}} で紹介した関数。 https://github.com/settings/tokens で作った PAT を ~/.emacs.d/spec/github-expand-link-token に保存すると、`(my-lisp-load "github-expand-link-token")` で読み込める。プライベートリポジトリの Issue/PR/Discussion を参照したい時は PAT の scope を `repo` にする。
キーバインドは `⌘-i` に割り当ててる。
```elisp
(define-key global-map (kbd "s-i") 'github-expand-link)
```
## まとめ
シェルの TAB 補完の感覚でタイトルを補完できるので、予想以上に便利に使っている。
今回の記事を書いていたら、Issue のステータスも追加したくなったので、割とガッツリ変更した。
Emacs Lisp は頻繁に書かないので、昔はググったり公式ドキュメント確認したり面倒だったけど、最近は ChatGPT とかで便利関数を知ることができるのは便利。今回はそれで alist-get 関数を知った。
--------------------------------------------------------------------------------
title: "circleci-bundle-update-pr 10 周年 🎉"
date: "2025-03-01"
--------------------------------------------------------------------------------
## 10 年前の今日が始まり
{{< ruby_gems "circleci-bundle-update-pr" >}}
10 年前の今日、circleci-bundle-update-pr の最初の commit [a7b2f92](https://github.com/masutaka/circleci-bundle-update-pr/commit/a7b2f9284d388229f480357e112dca48e0aff4d4) をしました。
{{< github_repo "masutaka/circleci-bundle-update-pr" >}}
このブログで circleci-bundle-update-pr を紹介したのは、2 日後の {{< post "2015-03-03-1" >}} でした。
すっかり忘れていましたが、下記記事を {{< post "2015-01-25-1" >}} で Heroku アプリ化した後に、Gem 化したようです。
* [CircleCIを使ってbundle updateを定期実行する - Qiita](http://qiita.com/yuku_t/items/0f8e48771822420d3ffa)
## 10 年間の歴史
改めて [Releases](https://github.com/masutaka/circleci-bundle-update-pr/releases) を眺めたところ、そこまで大きな機能追加はしていません。当初から割と完成されていたためだと思います。
皆さんからの PR で小さな機能を追加できたり、README.md も充実されたりと、ありがとうございました :pray:
最近は GitHub 公式の Dependabot version updates や、非公式の Renovate などがあるため、Gem のダウンロード数は減少しています。

Raw data
| Version | Release date | Downloads |
|---|---|---:|
| v0.0.1 | 2015/03/01 | 2667 |
| v0.0.2 | 2015/03/01 | 2682 |
| v1.0.0 | 2015/03/07 | 2708 |
| v1.0.1 | 2015/03/29 | 2667 |
| v1.0.2 | 2015/04/04 | 2668 |
| v1.0.3 | 2015/04/11 | 2660 |
| v1.0.4 | 2015/04/19 | 2648 |
| v1.0.5 | 2015/04/26 | 2746 |
| v1.0.6 | 2015/06/13 | 2650 |
| v1.0.7 | 2015/07/12 | 2705 |
| v1.0.8 | 2015/08/28 | 2588 |
| v1.1.0 | 2015/08/29 | 2572 |
| v1.1.1 | 2015/08/31 | 2710 |
| v1.1.2 | 2015/10/07 | 2521 |
| v1.2.0 | 2015/10/09 | 2634 |
| v1.2.1 | 2015/11/06 | 2593 |
| v1.2.2 | 2015/11/13 | 2749 |
| v1.3.0 | 2015/11/25 | 2530 |
| v1.3.1 | 2015/12/01 | 2608 |
| v1.3.2 | 2015/12/09 | 2890 |
| v1.3.3 | 2016/01/04 | 2606 |
| v1.3.4 | 2016/01/16 | 2433 |
| v1.3.5 | 2016/01/18 | 4404 |
| v1.4.0 | 2016/06/07 | 3857 |
| v1.5.0 | 2016/10/09 | 6282 |
| v1.6.0 | 2017/04/02 | 4327 |
| v1.6.1 | 2017/05/22 | 5787 |
| v1.6.2 | 2017/08/01 | 2697 |
| v1.7.0 | 2017/08/11 | 2643 |
| v1.7.1 | 2017/08/21 | 2277 |
| v1.8.0 | 2017/08/26 | 5204 |
| v1.8.1 | 2017/11/03 | 4677 |
| v1.8.2 | 2017/12/24 | 4304 |
| v1.8.3 | 2018/02/03 | 6424 |
| v1.8.4 | 2018/04/03 | 4325 |
| v1.9.0 | 2018/05/26 | 2351 |
| v1.9.1 | 2018/06/02 | 3105 |
| v1.10.0 | 2018/06/24 | 2161 |
| v1.11.0 | 2018/06/25 | 2681 |
| v1.11.1 | 2018/07/15 | 4038 |
| v1.11.2 | 2018/09/17 | 1797 |
| v1.11.3 | 2018/09/17 | 2340 |
| v1.12.0 | 2018/09/29 | 2183 |
| v1.13.0 | 2018/10/06 | 2229 |
| v1.14.0 | 2018/10/14 | 3507 |
| v1.14.1 | 2018/11/22 | 6100 |
| v1.14.2 | 2019/03/08 | 2168 |
| v1.14.3 | 2019/03/14 | 3074 |
| v1.14.4 | 2019/04/14 | 1805 |
| v1.16.0 | 2019/04/16 | 1800 |
| v1.16.1 | 2019/04/17 | 9643 |
| v1.17.0 | 2019/09/27 | 9015 |
| v1.19.0 | 2020/01/29 | 4068 |
| v1.19.1 | 2020/03/17 | 11875 |
| v2.0.0 | 2020/11/04 | 4056 |
| v2.1.0 | 2021/01/12 | 8799 |
| v3.0.0 | 2021/11/03 | 11185 |
| v3.1.0 | 2022/10/30 | 3937 |
| v4.0.0 | 2023/03/04 | 2977 |
| v4.0.1 | 2023/04/09 | 1040 |
| v4.0.2 | 2023/05/06 | 1270 |
| v4.0.3 | 2023/06/02 | 1091 |
| v4.0.4 | 2023/07/02 | 2465 |
| v4.0.5 | 2023/09/02 | 1880 |
| v4.0.6 | 2023/10/07 | 1741 |
| v4.0.7 | 2023/11/01 | 1016 |
| v4.0.8 | 2023/12/01 | 1602 |
| v4.0.9 | 2024/01/02 | 1145 |
| v4.1.0 | 2024/02/04 | 980 |
| v5.0.0 | 2024/03/02 | 1101 |
| v5.0.1 | 2024/04/01 | 1324 |
| v5.0.2 | 2024/05/02 | 1445 |
| v5.0.3 | 2024/06/02 | 473 |
| v5.0.4 | 2024/06/16 | 2109 |
| v5.0.5 | 2024/08/02 | 495 |
| v5.0.6 | 2024/09/01 | 526 |
| v5.0.7 | 2024/10/02 | 1000 |
| v5.0.8 | 2024/11/03 | 522 |
| v5.0.9 | 2024/12/06 | 451 |
| v5.0.10 | 2025/01/01 | 487 |
| v5.1.0 | 2025/02/02 | 411 |
## 今後の予定
特にありません。
今は私も使っておらず、保守対応しているだけです。
* circleci-bundle-update-pr 自身を毎月アップデートし、問題なければパッチリリースしている
* Ruby がメジャーアップデートしたら、対応バージョンに加えている
* rubocop が古いバージョンの Ruby を Drop したら、circleci-bundle-update-pr でも Drop している
私のやる気がなくなるまで続けると思いますが、もしメンテナーになりたい方がいれば、記事の最後にある `[ メッセージ送信 ]` でお知らせください :smile:
--------------------------------------------------------------------------------
title: "パブリックリポジトリに無料版の PR-Agent を導入しつつ、各種導入方法をまとめた"
date: "2025-02-24"
--------------------------------------------------------------------------------
PR-Agent はパブリックリポジトリで無料でも使えることを知ったので、個人のパブリックリポジトリに導入してみました。
{{< github_repo "qodo-ai/pr-agent" >}}
## PR-Agent とは
PR-Agent は LLM を使った、pull request (PR) の作成支援や効率的なレビュー、改善等ができるツールです。
導入方法は 2 種類あります。
:link: [Installation - Qodo Merge (and open-source PR-Agent)](https://qodo-merge-docs.qodo.ai/installation/)
* Self-hosted PR-Agent
* GitHub Actions や GitLab Pipeline に自分で導入する
* パブリックリポジトリとプライベートリポジトリの両方で、無料で利用できる
* Qodo Merge
* GitHub や Bitbucket にアプリをインストールする
* パブリックリポジトリでは無料で、プライベートリポジトリでは有料で利用できる
* ドキュメント中の💎の機能が使える(後述)
## Qodo Merge をパブリックリポジトリに導入する
:link: [💎 Qodo Merge - Qodo Merge (and open-source PR-Agent)](https://qodo-merge-docs.qodo.ai/installation/qodo_merge/)
GitHub の場合は [Qodo Merge Pro for Open Source][Qodo Merge Pro for Open Source] という GitHub App を当該パブリックリポジトリにインストールするだけです。
## Qodo Merge の動作例
下記は個人のパブリックリポジトリに導入し、動作している様子です。PR を In Review にすると、PR Description が自動的に設定され、PR Reviewer Guide と PR Code Suggestions がコメントされます。
* 例: https://github.com/masutaka/github-nippou/pull/240
* [Markers template](https://qodo-merge-docs.qodo.ai/tools/describe/#markers-template) を使うために、[PR template を若干カスタマイズ](https://github.com/masutaka/github-nippou/blob/v4.2.34/.github/pull_request_template.md?plain=1)しています。
PR-Agent のリポジトリにも導入されているので、こちらも参考になるかもしれません。
* 例: https://github.com/qodo-ai/pr-agent/pull/1564
## PR コメントを使った手動トリガー
PR に以下のようにコメントすることで、手動でトリガーすることができます。詳しくは [Tools](https://qodo-merge-docs.qodo.ai/tools/) をご覧ください。
* `/describe`
* PR の description や label を設定する
* PR を In Review した時もトリガーされる
* `/review`
* PR に関するフィードバックをコメントする
* PR を In Review した時もトリガーされる
* `/improve`
* PR の改善提案をコメントする
* PR を In Review した時もトリガーされる
* `/ask ...`
* 当該 PR に関する質問をする([例](https://github.com/masutaka/masutaka-feed/pull/65#issuecomment-2677716736))
## Qodo Merge のカスタマイズ方法
:link: [Configuration File - Qodo Merge (and open-source PR-Agent)](https://qodo-merge-docs.qodo.ai/usage-guide/configuration_options/)
リポジトリの Wiki ページ `.pr_agent.toml` や、リポジトリルートの `.pr_agent.toml` というファイルなどで、カスタマイズが可能です。
現在の設定は PR に `/config` とコメントすると確認できます([例](https://github.com/masutaka/masutaka-feed/pull/65#issuecomment-2677582236))。
PR-Agent のリポジトリには[設定ファイル](https://github.com/qodo-ai/pr-agent/blob/main/pr_agent/settings/configuration.toml)とともにデフォルト設定が定義されているので、[ドキュメント](https://qodo-merge-docs.qodo.ai/)とともに参考になると思います。
## Qodo Merge のプライベートリポジトリへの導入方法
:link: [💎 Qodo Merge - Qodo Merge (and open-source PR-Agent)](https://qodo-merge-docs.qodo.ai/installation/qodo_merge/)
ついでに GitHub プライベートリポジトリへの導入方法も紹介しますが、[Qodo Merge Pro][Qodo Merge Pro] というアプリをインストールするだけです。
前述の Self-hosted PR-Agent でもプライベートリポジトリに導入できますが、ドキュメントで💎が付いた機能は使えません。以下は例です。
* [💎 Auto Best Practices](https://qodo-merge-docs.qodo.ai/core-abilities/auto_best_practices/)
1. Code Suggestions で受け入れた commit はリポジトリの Wiki ページ `.pr_agent_accepted_suggestions` に蓄積される
* 例: https://github.com/qodo-ai/pr-agent/wiki/.pr_agent_accepted_suggestions
2. Qodo Merge はこれを毎月分析し Wiki ページ `.pr_agent_auto_best_practices` に保存する
* 例: https://github.com/qodo-ai/pr-agent/wiki/.pr_agent_auto_best_practices
3. `.pr_agent_auto_best_practices` は次回の Code Suggestions で参考にされる
* [💎 Analyze](https://qodo-merge-docs.qodo.ai/tools/analyze/)
* PR に `/analyze` とコメントすると、PR による変更の包括的な分析をする
* 例: https://github.com/masutaka/masutaka-feed/pull/65#issuecomment-2677632196
[Qodo Merge Pro][Qodo Merge Pro] には 2 週間の試用期間が提供されています。
:link: [Codium is now Qodo | CodiumAI Plans & Pricing](https://www.qodo.ai/pricing/)
## まとめ
パブリックリポジトリに無料版の PR-Agent ([Qodo Merge Pro for Open Source][Qodo Merge Pro for Open Source]) を導入しつつ、他の導入方法をまとめました。
* パブリックリポジトリには、Self-hosted PR-Agent または [Qodo Merge Pro for Open Source][Qodo Merge Pro for Open Source] を導入する
* プライベートリポジトリには、Self-hosted PR-Agent または [Qodo Merge Pro][Qodo Merge Pro] を導入する
* [ドキュメント](https://qodo-merge-docs.qodo.ai/)の💎は、Self-hosted PR-Agent で利用できない機能である
個人的にはドキュメントの💎が、有料版である [Qodo Merge Pro][Qodo Merge Pro] とそれ以外の違いだと誤って理解していたため、今回修正できました。
[Qodo Merge Pro for Open Source]: https://github.com/apps/qodo-merge-pro-for-open-source
[Qodo Merge Pro]: https://github.com/apps/qodo-merge-pro
--------------------------------------------------------------------------------
title: "Hugo の検索フォームを改めて検討して DuckDuckGo にした"
date: "2025-01-25"
--------------------------------------------------------------------------------
ここ何年か、個人でウェブ検索する時は [DuckDuckGo](https://duckduckgo.com/) を使っているので、右上の [Search]({{< relref "search.md" >}}) も DuckDuckGo にしました。
## なぜ DuckDuckGo ?
DuckDuckGo はプライバシー保護、広告の少なさ、フィルターバブル(特定の情報だけが表示される状態)の回避、国別の結果切り替えが容易、などが気に入って個人用途で使っています。macOS と Android のデフォルトの検索エンジンにしています。
このブログの右上の [Search]({{< relref "search.md" >}}) を使う人は私くらいだと思いますが、他の方の利用も考慮し、プライバシー保護の観点から DuckDuckGo にしました。
一方で Google 検索と比較して、たまに DuckDuckGo が反応しない、検索精度に多少不安がある、などのデメリットは感じており、これらを許容しています。
## なぜ外部検索エンジン?
このブログは [Hugo](https://gohugo.io/) の [PaperMod](https://github.com/adityatelange/hugo-PaperMod/) テーマを使っているので、素直に [Fuse.js](https://github.com/krisk/fuse) を使えば良いのですが、記事数が 1,500 近くあり検索がもっさりしてしまうので、外部の検索エンジンを使っています。
## 設置例
DuckDuckGo を始めとして、今まで使っていた Google や、その他試した検索方法を貼っておきます。
### DuckDuckGo
**content/search.md:**
```markdown
---
title: "Search"
showtoc: false
comments: false
author: " " # 姑息な手段で author を非表示にする。空 div は残る
_build:
list: "never"
---
```
### Google
**content/search.md:**
```markdown
---
title: "Search"
showtoc: false
comments: false
author: " " # 姑息な手段で author を非表示にする。空 div は残る
_build:
list: "never"
---
```
### Fuse.js
[PaperMod](https://github.com/adityatelange/hugo-PaperMod/) テーマでは [Fuse.js](https://github.com/krisk/fuse) が使えるので、これだけで検索フォームを設置できます。
**config.toml:**
```toml
[outputs]
home = ["html", "json", "rss"]
```
**content/search.md:**
```markdown
---
title: "Search"
layout: "search"
---
```
これらが検索フォーム用のファイルのようです。
* [assets/css/common/search.css](https://github.com/adityatelange/hugo-PaperMod/blob/v8.0/assets/css/common/search.css)
* [assets/js/fastsearch.js](https://github.com/adityatelange/hugo-PaperMod/blob/v8.0/assets/js/fastsearch.js)
* [assets/js/fuse.basic.min.js](https://github.com/adityatelange/hugo-PaperMod/blob/v8.0/assets/js/fuse.basic.min.js)
* [layouts/_default/search.html](https://github.com/adityatelange/hugo-PaperMod/blob/v8.0/layouts/_default/search.html)
### Lunr.js
今回 [Lunr.js](https://lunrjs.com/) も知ったので手元で試作しましたが、Fuse.js とのパフォーマンスの違いを感じなかったので採用しませんでした。
リファクタリングの余地はあると思いますが、以下のファイルが増えてしまうのも避けたい気持ちがありました。
* layouts/_default/index.json
* static/js/lunr.ja.js
* static/js/lunr.multi.js
* static/js/lunr.stemmer.support.js
* static/js/search.js
* static/js/tinyseg.js
### その他
* [Meilisearch](https://github.com/meilisearch/meilisearch)
* Cloud 版に課金するか、インスタンスを立てる必要があるため不採用としました
* [Algolia](https://www.algolia.com/)
* デプロイ時に Algolia 用に調整した index.json をビルド&アップロードして、検索用の JS を書いて...と考えて止めました :sweat_smile:
* 気が向いたら試すかもしれません
* [Search tools | Hugo](https://gohugo.io/tools/search/)
* Hugo オフィシャルで、その他の方法がまとまっています
## まとめ
あれこれ考えた結果、Hugo の検索フォームを Google から DuckDuckGo に変えました。
時間があるときに Algolia も試してみます。
おすすめの Hugo 検索ツールがあれば、下の `[メッセージ送信]` から教えてもらえると嬉しいです。
--------------------------------------------------------------------------------
title: "github-nippou 10 周年 🎉"
date: "2024-12-07"
--------------------------------------------------------------------------------
## 10 年前の今日が始まり
10 年前の今日、github-nippou の最初の commit [5767b9c](https://github.com/masutaka/github-nippou/commit/5767b9ce0bb50c50fe228198a000e82c25d29977) をしました。
このブログで github-nippou を紹介したのも 10 年前の今日 {{< post "2014-12-07-1" >}} です。この記事でも触れていますが、私のアイディアがオリジナルではなく、[きたけーさんの Ruby スクリプト](https://kitak.hatenablog.jp/entry/2014/04/22/013849)の~~パクリ~~インスパイアです。
当時はその Ruby のスクリプトを Gem 化した程度の実装でしたが、何回かの機能追加を経て、2017/10/13 に Golang 版である [v4.0.0](https://github.com/masutaka/github-nippou/releases/tag/v4.0.0) をリリースしました。
## 10 年間の歴史
リポジトリの README.md の [External articles](https://github.com/masutaka/github-nippou?tab=readme-ov-file#external-articles) セクションに、これまでの歴史が簡単にまとまっています。
{{< github_repo "masutaka/github-nippou" >}}
Golang 版をリリースして以降、大きな機能追加はしていませんが、メンテナンスは続けています。継続して改善を積み重ねることは大切だと思うので、これからもできる限り続けていきます。
## 皆さんへの感謝
利用数は把握していませんが、それなりに使って頂いていると感じています。ありがとうございます :pray:
## 今後の予定
来年の 1/30 に GitHub の Events API が更新されるそうです。
:link: [Upcoming changes to data retention for Events API, Atom feed, /timeline and /dashboard-feed features - GitHub Changelog](https://github.blog/changelog/2024-11-08-upcoming-changes-to-data-retention-for-events-api-atom-feed-timeline-and-dashboard-feed-features/)
* Events API で取得できるデータ保存期間が、過去 90 日から 30 日に変更される
* :thought_balloon: この半年程度続いている、Events API のデータ取得遅延が解消されるといいな[^1]
* `DiscussionEvents` がサポートされる
[^1]: https://github.com/masutaka/github-nippou/issues/189
github-nippou でもそれぞれ以下の issue で対応していきます。
* [Starting January 30, 2025, the queryable period in the Events API will change from 90 days to 30 days](https://github.com/masutaka/github-nippou/issues/226)
* [Support DiscussionEvent](https://github.com/masutaka/github-nippou/issues/227)
--------------------------------------------------------------------------------
title: "初めてプロレスの試合を観戦した"
date: "2024-11-24"
--------------------------------------------------------------------------------
11/18(月)に「[神取忍還暦祭](https://llpw-x.com/kandorishinobukanrekimatsuri/)」を現地観戦してきました。場所は東京ドームシティホールです。
格闘技の試合は {{< post "2022-05-29-1" >}} 含めて 2 回観戦したことがありますが、プロレスの観戦は男子含めて初めてです。
この記事では、観戦の感想や、女子プロレスに興味を持ったきっかけを紹介します。
以下、敬称は省略させていただきます :pray:
## 女子プロレスに興味を持ったきっかけ
[Netflix の極悪女王](https://www.netflix.com/title/81351263)がきっかけです。
思い返せば、子供の頃にテレビでやってた(男子の)プロレスから始まり、1990 年代の闘魂三銃士、1990~2000 年代の K1, K1-Max はそれなりに見て、2000 年代の PRIDE はあまり見ず、10 年ほどプロレスも格闘技を全く見ない期間を経て、2020 年から RIZIN を中心とした 総合格闘技を見るようになりました。
※ RIZIN は 2020/08 の {{< wikipedia word="RIZIN.22 - STARTING OVER -" text="RIZIN.22" >}} 以降、LANDMARK 大会含めてすべての PPV を購入しています。
ではありますが、女子プロレスは神取忍やブル中野など、トップどころの把握はしつつも、ほぼ見ずに過ごしてきました。
9 月に極悪女王を見た後は、登場人物のその後をかなり調べました。私が歴史好きだからだと思います。
全女自体消滅してしまったり、松永兄弟などその後がなかなか大変なことになったりの一方で、ダンプ松本やジャガー横田のように今も現役を続けていることを微笑ましく思ったりと、徐々に興味が深まっていきました。
YouTube もかなり見ましたが、なかでも[ブル中野のぶるちゃんねる](https://www.youtube.com/channel/UCRZCwHb4VhgEAF3owfdKATw)はインタビュー動画が多く、自分の中で昔と今を繋げる手がかりになりました。
今回の観戦に至った経緯は、ざっくりこんな感じです。
1. [イッキ見の再生リスト](https://www.youtube.com/playlist?list=PLZ4e5uc49qzAonxAPNSfm2KFFe8hOCy84)を中心に、ダンプ松本、長与千種、ジャガー横田、神取忍、井上貴子などの今を知る
1. 神取忍が {{< wikipedia "LLPW-X" >}} という団体の代表で、井上貴子も所属していることを知る。もちろん LLPW-X の歴史も調べた。風間さん :pray:
1. 7/13 にマリーゴールドという団体と対抗戦をしていたらしい。相変わらずお強い...
* [【速報】マリーゴールドvsLLPW-X@両国決戦!「高橋奈七永&桜井麻衣&石川奈青vs神取忍&井上貴子&NØRI」神取の辞書に手加減の文字は無し!!【神取忍】 - YouTube](https://www.youtube.com/watch?v=6OjBRhHGNCk)
1. 11 月に神取さんの還暦祭(!)があるらしい。勢いでチケットを購入した
## 神取忍還暦祭の感想
プロレスの試合以外にも、氣志團の綾小路翔と早乙女光が歌を披露したりと、まさにお祭りでした。
[神取忍の「還暦祭り」に井上貴子、ダンプ松本ら女子プロレジェンドが集結…「極悪女王」ゆりやんも観戦](https://www.msn.com/ja-jp/news/entertainment/%E7%A5%9E%E5%8F%96%E5%BF%8D%E3%81%AE-%E9%82%84%E6%9A%A6%E7%A5%AD%E3%82%8A-%E3%81%AB%E4%BA%95%E4%B8%8A%E8%B2%B4%E5%AD%90-%E3%83%80%E3%83%B3%E3%83%97%E6%9D%BE%E6%9C%AC%E3%82%89%E5%A5%B3%E5%AD%90%E3%83%97%E3%83%AD%E3%83%AC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%89%E3%81%8C%E9%9B%86%E7%B5%90-%E6%A5%B5%E6%82%AA%E5%A5%B3%E7%8E%8B-%E3%82%86%E3%82%8A%E3%82%84%E3%82%93%E3%82%82%E8%A6%B3%E6%88%A6/ar-AA1uisJS)
前から 7 列目の席を取れたので、間近で見る場外乱闘やリアル出血大サービス(!)など、満足度は高かったです。
神取忍選手と LLPW-X の選手:

竹刀片手に暴れまわるダンプ松本選手:

## 総合格闘技との違いを再認識
前述のとおり、最近は RIZIN などの総合格闘技(MMA)をよく見ていたため、プロレスと MMA の違いを改めて実感しました。以下は、私なりに理解した両者の違いです。
* 試合頻度の違い
* プロレスの選手は週 2 回以上試合を行うこともあり、連日の試合も珍しくありません。一方、MMA の選手は数ヶ月に 1 回の試合が一般的です
* 戦績の扱い
* プロレスでは戦績よりも「ベルト」が重要で、観客を盛り上げることが重視されます。MMA では戦績が選手評価の重要な指標となります
* ストーリー性の違い
* プロレスの試合は相手の技を受けつつ、ストーリーが続くように構成されます。MMA は相手を封じ込め、一方的に勝つことを目指します
* 階級制度の違い
* プロレスは基本的に無差別級で試合が行われることが多いですが、MMA は階級制度に基づいて試合が組まれます
## 留まらない女子プロレス熱
前述の LLPW-X vs マリーゴールド の時は、{{< wikipedia word="マリーゴールド (女子プロレス)" text="マリーゴールド" >}}という団体を知らなかったのですが、前述のぶるちゃんねるも見て、高橋奈七永という選手が自分の中で浮かび上がってきました。
{{< youtube id="ENJJBzsieGU" title="① シードリングを退団した高橋奈七永選手登場!! - ぶるちゃんねるBULLCHANNEL" >}}
愛川ゆず季の channel も見始めていたので、徐々に繋がっていきました。
{{< youtube id="UvqU-J4aRE8" title="【蘇るデビュー戦】愛川ゆず季&高橋奈七永 伝説の試合を解説【10.31】 - ゆずポンちゃんねる" >}}
決定打になったのが、天麗皇希のインタビューです。ミーハーですが、ビジュアルにやられました :sweat_smile:
{{< youtube id="m9ACvEHgVcc" title="女子プロレス界注目の超新星!天麗皇希選手と対談してきました! - ゆずポンちゃんねる" >}}
この動画を見てすぐに [Wrestle Universe](https://www.wrestle-universe.com/)をサブスクして、今はマリーゴールドの 5.20 旗揚戦からの試合を全部見ようとしているところです。今は特定の選手というより、箱推しみたいになってます。
マリーゴールドの代表であるロッシー小川も知りました。会見の作り方がうまい。様々な経緯を知ると、特に後半に涙腺が緩くなります。
{{< youtube id="kZfoT5SkYhE" title="ロッシー小川緊急記者会見! - MARIGOLD" >}}
## まとめ
初めてのプロレス観戦の話と、そこに至った経緯をまとめました。
特に子供の頃は、物理的に強いもの同士が戦わないと面白くないと思ってましたが、年を重ねて、女子同士でもこんなに楽しめるものだと知りました。強いもの同士を突き詰めていくと、熊同士でいいじゃんとなってしまいますし?
プロレスには複数の側面からの楽しみ方があるので、しばらく忙しい日々が続きそうです。
P.S.
来月はマリーゴールドの試合を観戦する予定です。ファンビジネスを知るために(?)ファンクラブも入りました。
--------------------------------------------------------------------------------
title: "AGA 治療を始めて半年経ったので経過を記録する (n=1)"
date: "2024-10-22"
--------------------------------------------------------------------------------
:warning: この記事は個人の体験であり、結果は人それぞれです。AGA 治療薬には副作用の可能性もあります。医師の指導を仰いでください。
## 始めたきっかけ
ここ数年、生え際の後退や、髪が濡れた時の残念感がそれなりに気になっていました。
とある音声配信を聞いて、最近の AGA 治療が進化していることと、オンラインクリニックがお手軽でお得になっていることを知ったので、始めることにしました。
## 2 種類の薬
AGA 治療薬は 2 種類あります。
* 抜け毛防止
* {{< wikipedia word="フィナステリド" >}}(商品名: プロペシア)
* {{< wikipedia word="デュタステリド" >}}
* 発毛促進
* {{< wikipedia word="ミノキシジル" >}}(内服薬)
* ミノキシジル(外用薬、商品名: リアップ)
今回はデュタステリドとミノキシジル(内服薬)を選択しました。オプションで他の薬もありますが、今回は選択しませんでした。
:warning: ミノキシジル(内服薬)は国内未承認の薬なので、万が一重篤な副作用が出た場合は、[国の医薬品副作用被害救済制度](https://www.pmda.go.jp/kenkouhigai_camp/)の対象外となる点は注意が必要です。
## 以前も試したことがある
実は 2008 年くらいに、プロペシアとリアップを違うタイミングで試したことがあります。
その頃はまだ 30 代でしたが、ある日鏡で生え際をチェックしたら、これは夢では?と思うくらい生え際が後退していました(汗)。当時、仕事で強いストレスが続いたからかもしれません。
その時は全く効かず、プロペシアは副作用もあり、リアップはベタベタ感が気になり、止めてしまいました。
## オンラインクリニックを使った
たしか以前は、最寄りの皮膚科でプロペシアを処方してもらいました。現在はオンラインクリニックでも処方可能になり、選択肢が増えています。
結局、同じ薬を飲むだけなので、安さ優先でオンラインクリニック、DMM アカウントを持っていたので「[DMMオンラインクリニック](https://clinic.dmm.com/)」を使いました。
DMMオンラインクリニックはめちゃめちゃ便利で、アクションを起こしてから 2 日で薬が届きました。
* 4/7(日)17:40
* 18:00 からの予約を入れて、問診票を記入した
* 4/7(日)18:00 - 18:20
* 顔出ししてオンライン診察開始。感じの良い医師から診察を受けた。どんな薬でどんなプランにするかは、前もって決めておいた方が良いと思った
* 診察が終わったら、オペレーターに変わりプランを決定した。こちらは顔出し不要
* 4/7(日)18:37
* 決済完了のメールが届いた
* 4/8(月)13:15
* 発送完了のメールが届いた
* 4/9(火)
* 1 ヶ月分の薬が届いた
副作用のリスクも考慮して、1 ヶ月ごとの定期便にしました。
9,500円(税込10,450円)+ 配送料500円(税込550円)
定期便を 12 ヶ月ごとにすれば、月あたり 5,417円(税込5,958円)まで下がります。
税込71,500円 + 配送料500円(税込550円)
## 治療による変化
* 飲み始めて 1 週間ほど
* 体のむくみに気がついた。長袖シャツで袖が脱ぎづらかったり、ふくらはぎから下がむくんでいたり。体重も 1~2kg 増えた。一旦様子見
* 飲み始めて 2 週間ほど
* いわゆる初期脱毛の症状が出てきた。風呂場の排水口に溜まる髪の毛が心なしか多い。見た目が変わるほどは抜けなかった
* 飲み始めて 6 週間ほど
* むくみが落ち着いてきた
* ヒゲが濃くなってきた気がする。ミノキシジル(内服薬)は全身に作用する
* 飲み始めて 7 週間ほど
* 定期便を 6 ヶ月くらいにしようとオンライン診察を受けたが、12 ヶ月にしないとあまり安くならないので止めた
* 診察によると、むくみはミノキシジルの副作用で毛細血管拡張によるものだそう。心臓がより強く働くので、心臓に負担がかかる。むくみが落ち着かない場合は、処方は中止するものだそう
* 飲み始めて 3 ヶ月ほど
* 生え際がクッキリとし始めた
* 4 週間に一度お世話になっている美容師さんから、全体的にだいぶ変わりましたね〜と言われた
* 今まで生えてなかったところの腕毛が生えてきた。鼻毛も濃くなってきたのでエチケットカッターを買った {{< post "2024-08-11-1" >}}
* 飲み始めて 5 ヶ月ほど
* 髪全体がモサモサになってきて、黒色が濃くなってきた。朝起きるとモッサモサ。昔はこんな感じだったのかも
* 抜け毛がかなり減ったことも実感。朝に髪を整える時に、全然抜けなくなった
* 定期で通っている内科の先生から、髪型変えたんですねと言われた。いや変えてなくて AGA 治療の効果なんですよと言ったら、たいそうビックリされた
* 定期で通っている整骨院の先生からもビックリされた
* 帰省した時の母親からは気づかれず、髪型を変えたと思われたみたい
## まとめ
生え際が改善するだけだと思っていたら、髪全体がモサモサになって黒色も強くなって予想外でした。結構減っていたんだなあ...。増えた毛が少しクセ毛なのは気になる。
頭髪以外は、眉毛、鼻毛、まつ毛、顔のうぶ毛、腕毛など全体的に毛深くなり、気になるほどではありませんが少しウザいかなあという状態にはなりました。
2008 年頃に後退した生え際はやはり戻りませんでした。
ミノキシジル(内服薬)は国内未承認ですし、デュタステリドも詳しく書きませんが副作用を感じたので、なかなかの沼だなと思いました。ミノキシジルは近々外用薬に変えると思います。でも塗るのが面倒なんですよね(経験者)。
ちなみに AGA 治療は美容扱いなので、医療費控除対象ではないことをご注意ください。
以上、AGA 治療を始めて半年経ったので経過を記録したお話でした。
--------------------------------------------------------------------------------
title: "OSS 関連の取り組みを個人プロジェクトにも取り入れ始めた"
date: "2024-09-25"
--------------------------------------------------------------------------------
先日、会社ブログでこんな記事を書きました。
{{< hatenablog title="OSS 推進観点で Supabase の GitHub 設計が参考になった - ROUTE06 Tech Blog" url="https://tech.route06.co.jp/entry/2024/09/10/160000" >}}
記事冒頭にも書かれているとおり、最近の私は社内プロダクトの OSS 化を推進する活動をしています。
昔から仕事の技術や成果はプライベートにも導入するようにしているので、個人プロジェクトにも取り入れ始めました。
## 1. Community Standards にできるだけ従った
Community Standards はプライベートリポジトリの Insights タブから辿れます。
例: https://github.com/masutaka/github-nippou/community
GitHub は彼らが作った「[オープンソースガイドライン](https://opensource.guide/ja/)」を、奨励される Community Standards(コミュニティ基準)だと定義しており、以下のチェックリストの完了を促しています。
:link: [パブリックリポジトリのコミュニティプロフィールについて - GitHub Docs](https://docs.github.com/ja/communities/setting-up-your-project-for-healthy-contributions/about-community-profiles-for-public-repositories)
* Description
* README
* Code of conduct
* Contributing
* License
* Security policy
* Issue templates
* Pull request template
README.md や LICENSE.md は普通に作っていましたが、活発でもない個人プロジェクトで CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md をどこまで真面目に作るかは悩みどころです。
## 2. 利用パッケージのライセンスを継続的に監視した
[FOSSA](https://fossa.com/) という、利用パッケージのライセンスを継続的に監視する SaaS を導入し、ささやかなバッジを付けました。バッジのリンク先は、誰でも閲覧できる FOSSA のダッシュボードになっています。
例: https://github.com/masutaka/github-nippou/tree/v4.2.31
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fmasutaka%2Fgithub-nippou?ref=badge_shield)
FOSSA は無料プランだと、ライセンスの問題を表面化する依存の深さが 5 までという制限はありますが、取りあえず導入して概要を把握することが出来ます。
## 3. Private vulnerability reporting を有効にした
GitHub にはセキュリティの脆弱性を、パブリックリポジトリの所有者や管理者に非公開で報告できる Private vulnerability reporting という仕組みがあります。
:link: [セキュリティの脆弱性を非公開で報告する - GitHub Docs](https://docs.github.com/ja/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability)
Settings タブの Code security から、`Private vulnerability reporting` を有効にすると、Security タブの Advisories に `New draft security advisory` というボタンが現れ、ユーザーは非公開で報告できます。
SECURITY.md から誘導するケースが多いようなので、そのようにしました。
例: https://github.com/masutaka/github-nippou/blob/v4.2.31/SECURITY.md
参考: [リポジトリ セキュリティ アドバイザリについて - GitHub Docs](https://docs.github.com/ja/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories)
## 4. GitHub Advanced Security を有効にした
GitHub には Advanced Security (GHAS) という、追加のセキュリティ機能があります。
:link: [GitHub Advanced Security について - GitHub Docs](https://docs.github.com/ja/get-started/learning-about-github/about-github-advanced-security)
* Code scanning
* CodeQL CLI
* Secret scanning
* カスタム自動トリアージ ルール
* 依存関係の確認
このうち、Code scanning と Secret scanning について、有効にしました。
### Code scanning
Settings タブの Code security から、`Code scanning` を設定すると、デフォルトではプッシュ単位やスケジュールで CodeQL を実行し、セキュリティの脆弱性とコーディングエラーを見つけることができます。
参考: [コード スキャンについて - GitHub Docs](https://docs.github.com/ja/code-security/code-scanning/introduction-to-code-scanning/about-code-scanning)
デフォルトだと、関係のないファイルのプッシュでも実行され、CI で常に待ちが発生するため、それを避ける reusable workflow [route06/actions/.github/workflows/codeql.yml](https://github.com/route06/actions/blob/v2.4.0/.github/workflows/codeql.yml) を使っています。
使用例:
* [プッシュ単位で CodeQL を実行する](https://github.com/masutaka/github-nippou/blob/v4.2.31/.github/workflows/test.yml#L26-L32)
* [CodeQL をスケジュール実行する](https://github.com/masutaka/github-nippou/blob/v4.2.31/.github/workflows/schedule.yml)
### Secret scanning
Settings タブの Code security から、`Secret scanning(シークレット スキャン)` と `Push protection(プッシュ保護)` を有効化しました。
:link: [シークレット スキャンについて - GitHub Docs](https://docs.github.com/ja/code-security/secret-scanning/introduction/about-secret-scanning)
> シークレット スキャンは、API キー、パスワード、トークン、その他のシークレットなどの機密情報がリポジトリに誤って含まれることを検出して防止するセキュリティ機能です。シークレット スキャンを有効にすると、リポジトリ内のコミットをスキャンして既知のタイプのシークレットを検出し、検出時にリポジトリ管理者に警告します。
:link: [プッシュ保護について - GitHub Docs](https://docs.github.com/ja/code-security/secret-scanning/introduction/about-push-protection)
> コミットされた後にシークレットを検出する secret scanning とは異なり、プッシュ保護は、プッシュ プロセス中にコードでシークレットを事前にスキャンし、何かが検出された場合はプッシュをブロックします。
## まとめ
会社での OSS 関連の取り組みを、個人プロジェクトにも取り入れ始めました。
個人プロジェクトで特に Community Standards にしっかり取り組む必要はないかもしれませんが、逆にオーバーに取り組めるのも個人プロジェクトの醍醐味です(?)
以上、近況も兼ねた OSS 関連の取り組みの紹介でした。
--------------------------------------------------------------------------------
title: "マッサージガンを買った"
date: "2024-08-16"
--------------------------------------------------------------------------------
マッサージガンというものを買いました。[おぎちゃんの動画](https://youtu.be/uLqK6Vwls5Q?si=f92TamAGBf0YL9lB)で 5% クーポンが使えたので、¥840 オフの ¥15,960 でした。
{{< amazon asin="B093S6D8L6" title="【日本国内メーカー】uFit RELEASER Mini 筋膜リリースガン ミニ 強力 8mm 振幅 500g 軽量 プロアスリート 水谷隼 愛用 静音 振動レベル 4段階 使い方動画 タイプc usb プレゼント" >}}
ふくらはぎの外側上部が慢性的に凝っていて、整骨院の先生曰くストレッチはやや難しいとのことが買った理由です。
ちょっと使っただけで、足がめちゃめちゃ軽くなります。状態が悪かったから、すぐ効果が出るのだと思います。他も適当に使うだけで、体がポカポカと熱くなってきます。体全体の血流が良くなるのかも。
整骨院の先生によると、こんなところに使うと筋肉が緩むそう。
* 腱と筋肉の間
* 例: アキレス腱とふくらはぎの間
* 首と肩先の間
* 首を斜め前に倒したストレッチも同時にやると良さげ
起床後と就寝前のストレッチと合わせて使っています。
--------------------------------------------------------------------------------
title: "鼻毛カッターをエチケットカッターにアップグレードした"
date: "2024-08-11"
--------------------------------------------------------------------------------
今まで使っていた鼻毛カッターが全然切れなくなったので、ちょっと良いやつを買いました。
買ったのは Panasonic の「[ER-GN71](https://panasonic.jp/mens/products/ER-GN71.html)」です。鼻毛だけでなく眉毛や耳毛もカットできるので、エチケットカッターという分類らしいです。
今までとは比較にならないくらい、めちゃめちゃ切れて大満足です。試してないですが、水洗いもできるみたいです。
## どこで購入したか
7/1 にヨドバシ.comで購入しました。¥4,470(税込)で、446 ポイントの還元でした。
:link: [ヨドバシ.com - パナソニック Panasonic エチケットカッター 水洗い&毛クズ吸引モデル 黒 ER-GN71-K 通販【全品無料配達】](https://www.yodobashi.com/product-detail/100000001008445625/)
Amazon.co.jp に同じ型番の商品はありませんでしたが、ER-NGNH1-K が同じらしいです。¥5,000 だったので、今回はヨドバシ.comで購入しました。
{{< amazon asin="B0CY4LX65R" title="【2024年発売】パナソニック 鼻毛カッター エチケットカッター メンズ 眉毛 ヒゲ 水洗い ER-NGNH1-K 【Amazon.co.jp限定】 " >}}
## 余談
今まで使っていた鼻毛カッターは、National の「[ER413](https://panasonic.jp/mens/p-db/ER413P.html)」でした。
元々切れなかったのか、刃がダメになって切れなくなったのか、そもそもいつどこで買ったのか、もはや定かではありません。
--------------------------------------------------------------------------------
title: "github-nippou のリリース時に formula ファイルも自動更新するようにした"
date: "2024-07-30"
--------------------------------------------------------------------------------
少し前の話になりますが、{{< post "2023-11-14-1" >}} に [github-nippou](https://github.com/masutaka/github-nippou) という Golang 製ツールのリリースを自動化しました。
1. 自動的に作られた Release PR[^1] をマージする
2. タグが自動で振られ、[Releases](https://github.com/masutaka/github-nippou/releases) ページに新しいリリースが作られる
3. macOS, Linux, Windows 用のバイナリがビルドされ、`2` の新しいリリースにアップロードされる
[^1]: 例: https://github.com/masutaka/github-nippou/pull/192
今回はさらに、Homebrew の formula ファイル[^2]もアップデートするようにしました。
[^2]: https://github.com/masutaka/homebrew-tap/blob/main/github-nippou.rb
## 準備したもの
今回は [goreleaser](https://github.com/goreleaser/goreleaser) の仕組みを使って、github-nippou のリリース時に [masutaka/homebrew-tap](https://github.com/masutaka/homebrew-tap) の formula ファイルを更新します。そのためには何らかの GitHub Access Token が必要です。
Personal Access Token でも出来ますが、有効期限を設定するにせよ、生存期間の長い Token を使うことになります。それは避けたいので、今回は GitHub App を作成し、使用時に Access Token を作るようにしました。
## やったこと
### 1. GitHub App を作成してインストールした
https://github.com/settings/apps から、以下の設定で GitHub App を作成しました。
* WebHook は使わないので `Active` のチェックを外す
* 以下の Repository permission を有効にする
* Contents: `Read` and `Write`
* Metadata: `Read`
* `Only on this account` はそのまま選択する
private key を作るように促されるので作成し、ローカルにダウンロードしました。App ID も控えておきました。
サイドバーの `Install App` から [masutaka/homebrew-tap](https://github.com/masutaka/homebrew-tap) にインストールしました。
### 2. 作成した GitHub App の情報を Actions secrets and variables に登録した
https://github.com/masutaka/github-nippou/settings/secrets/actions から以下を登録しました。
* `CI_APP_PRIVATE_KEY` という名前の secret
* 値は private key を設定する
* `CI_APP_ID` という名前の variable
* 値は App ID を設定する
* 秘匿情報ではないため variable にした
### 3. GitHub Actions の workflow ファイルを変更した
リリースを実行する `.github/workflows/release.yml` を以下のように変更しました。
* `2` で設定した `CI_APP_PRIVATE_KEY` と `CI_APP_ID` を [actions/create-github-app-token](https://github.com/actions/create-github-app-token) に渡すことで、Access Token を生成する
* 生成した Access Token を環境変数 `TAP_GITHUB_TOKEN` に設定し、`$ make release` に渡す
```diff
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c23d3be..1d4ed3e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -53,10 +53,18 @@ jobs:
uses: goreleaser/goreleaser-action@v6
with:
install-only: true
+ - uses: actions/create-github-app-token@v1
+ id: app-token
+ with:
+ app-id: ${{ vars.RELEASE_APP_ID }}
+ private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
+ owner: 'masutaka'
+ repositories: 'homebrew-tap'
- name: Release
run: make release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ TAP_GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
pushover:
name: pushover if failure
if: failure()
```
変更後のファイルです。
https://github.com/masutaka/github-nippou/blob/v4.2.29/.github/workflows/release.yml#L39-L71
### 4. `.goreleaser.yaml` を変更した
`.goreleaser.yaml` に以下の設定を追加しました。formula ファイルの種を設定しつつ、更新対象先である formula ファイル[^2]を指定しています。
`3` で設定した環境変数 `TAP_GITHUB_TOKEN` が使われているのも分かると思います。
:link: https://github.com/masutaka/github-nippou/blob/v4.2.29/.goreleaser.yaml#L57-L84
```yaml
brews:
- name: github-nippou
repository:
owner: masutaka
name: homebrew-tap
token: "{{ .Env.TAP_GITHUB_TOKEN }}"
commit_author:
name: "github-actions[bot]"
email: "github-actions[bot]@users.noreply.github.com"
homepage: "https://github.com/masutaka/github-nippou"
description: "Print today's your GitHub activity for issues and pull requests"
license: "MIT"
install: |
bin.install 'github-nippou'
# Install bash completion
output = Utils.safe_popen_read("#{bin}/github-nippou", 'completion', 'bash')
(bash_completion/'github-nippou').write output
# Install fish completion
output = Utils.safe_popen_read("#{bin}/github-nippou", 'completion', 'fish')
(fish_completion/'github-nippou.fish').write output
# Install zsh completion
output = Utils.safe_popen_read("#{bin}/github-nippou", 'completion', 'zsh')
(zsh_completion/'_github-nippou').write output
test: |
system 'github-nippou', 'version'
```
## リリース後に更新された formula ファイル
リリース後にこのような formula ファイルに更新されました。
:link: https://github.com/masutaka/homebrew-tap/blob/38e9c24327b98c19239756ddf1f20e72f5616c56/github-nippou.rb
今までの formula ファイルの中身は無視して、`.goreleaser.yaml` の設定を種とした formula ファイルで完全に上書きする形でした。
## まとめ
下記リリースフロー `4` を追加しました。github-nippou のリリースが完全に自動化されて、本当に楽になりました。
1. 自動的に作られた Release PR[^1] をマージする
2. タグが自動で振られ、[Releases](https://github.com/masutaka/github-nippou/releases) ページに新しいリリースが作られる
3. macOS, Linux, Windows 用のバイナリがビルドされ、リリースページにアップロードされる
4. Homebrew の formula ファイル[^2]もアップデートされる :new:
## 参考
* [GitHub App の作成について - GitHub Docs](https://docs.github.com/ja/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps)
* [Homebrew Taps - GoReleaser](https://goreleaser.com/customization/homebrew/)
--------------------------------------------------------------------------------
title: "Anker のワイヤレス充電器を買った"
date: "2024-06-25"
--------------------------------------------------------------------------------
初めてワイヤレスの充電器を買いました。¥1,490 でした。
{{< amazon asin="B07TJ1CRLF" title="Anker PowerWave 10 Pad ワイヤレス充電器 Qi認証 iPhone 15シリーズ / 14シリーズ Galaxy AirPods 各種対応 最大10W出力 (ブラック)" >}}
とは言え、私が持っているワイヤレス充電器対応デバイスは、{{< post "2023-09-18-1" >}} に買った Pixel Buds Pro だけです。あとは会社から支給されている iPhone SE(第3世代)ですね。
## なぜ買ったのか?
仕事中に iPhone SE を充電する時、Lightning ケーブルの取り回しが邪魔だったからです。これが改善するかな?と思って買いました。もちろん、物珍しさもあります。
最大 10W で充電できますが、7.5W にも対応しているので iPhone SE に充電できるみたいです。
最新モデルは {{< amazon_link asin="B0BG2F4RZ8" title="Anker 315 Wireless Charger (Pad)" >}} らしいですが、こちらは ¥2,490 です。性能の違いが分からなかったことと、初めて買うので失敗のダメージが少ない安い方にしました。
## 良かったこと
* 置くだけで充電できるのは便利です(当たり前)
* Lightning ケーブルが要らなくなりました
* 充電中のデバイスが熱くなるというレビューがありましたが、気にならないレベルでした。真ん中からズレるとロスが出て、熱くなりやすいそうです
## 微妙だったこと
* 充電しない時に場所を使うので、邪魔ではあります
* ホコリがつきやすい素材なので、時々掃除が必要です。Anker 315 はどうでしょうか?
* iPhone SE を置いた状態でホームボタンを押すと、iPhone SE が浮いてしまうので、うまく押さえながらホームボタンを押す必要があります
* 入力は micro-USB です。私は気になりませんが、賛否はあるかもしれません
## まとめ
ワイヤレス充電器を買って、ようやく Lightning ケーブルが要らなくなりました。他のメリットは一長一短ですかね。
ワイヤレス充電器自体のケーブルは必要なので、狭い机だとそこまで「買って良かった〜」でもなかったです。
今後対応デバイスを買っていくと思うので、徐々に活用できたら良いですね。
--------------------------------------------------------------------------------
title: "NordVPN を一週間使ってみた感想"
date: "2024-05-29"
--------------------------------------------------------------------------------
## NordVPN を使うまでの経緯
モバイル回線が繋がりづらい飲食店で、公衆無線 LAN が使えることがある。新幹線にもあるよね。
最近は私のセキュリティ意識が高くなっているので、そこはグッと堪えて繋がないようにしていた。
1 年ほど前に Google One のトライアルをしたことがあり、VPN も試せて悪くなかった。Google の容量がいよいよ足りなくなったら Google One を契約しつつ VPN を使えばいいかなと思っていた。
〜時は流れ〜
:link: [Google One VPN はどうなるのでしょうか? - Google One ヘルプ](https://support.google.com/googleone/answer/14806901?hl=ja)
> 2024 年 6 月 20 日をもって、Google One VPN はご利用いただけなくなります。
Google One VPN 終了のお知らせが来た。うーむ。
YouTube を見ていたら、たまたま NordVPN の案件動画があった。そこでなんとなくクーポン片手に [NordVPN](https://nordvpn.com/ja/) のアカウントを作り、MacBook とスマホにアプリをインストールして設定してみた。
## NordVPN を一週間使ってみた感想
継続利用はしないかなーという感想です。
そもそも私の用途が限定的という話がある。個人の MacBook を自宅から持ち出すことはほぼなく、本当に VPN を使いたいのはスマホだけ。さらにはユースケースは、モバイル回線が繋がりづらく、Wi-Fi が使える飲食店くらいという、針の穴を通すようなもの。
MacBook とスマホは、VPN を使うことで遅くはならなかったけど、どちらもたまにアクセス出来ないサイトがあって、デメリットがメリットを上回ってしまった。VPN を OFF して調べる手間が面倒なんだよね。
メッシュネットワーク、特殊サーバー(P2P、Onion Over VPN、難読化サーバー、Double VPN)など、面白そうな機能はあったんだけど。
ワンショットで使える VPN があれば良いのだけど、そう都合が良いものはないよね。
## NordVPN には 30 日間の返金保証がある
:link: [Terms of Service - Nord Account](https://my.nordaccount.com/ja/legal/terms-of-service/)
> 6.2. 返金:当社は、当社のサービスに完全に満足していただけるよう努めています。当社のサービスに満足されない場合については、サービスのご購入から30日以内にサブスクリプションをキャンセルし、返金をリクエストできます(「返金保証」)。
2 年プランで購読してしまったけど、NordVPN は 30 日間の返金保証があるので、あとでリクエストすると思う。
## まとめ
VPN を改めて使ってみて、自分にはオーバーだなと再認識した。
とは言え、たまに使いたい時があるのが悩ましい。VPN という性質上、信頼できないサービスを使うことも出来ないし。Cloudflare Warp+[^1] はどうなんだろう?
[^1]: [ついにWARPが完成(お待たせしました) - The Cloudflare Blog](https://blog.cloudflare.com/announcing-warp-plus-ja-jp)
## 落ち穂拾い
スマホから qiita.com にアクセスできなかった。
→「設定」から「脅威対策ライト版」を OFF にしたらアクセスできた。[カスタマーサポート案件](https://support.nordvpn.com/hc/ja/articles/20095679510801-VPN%E3%81%AB%E6%8E%A5%E7%B6%9A%E4%B8%AD-%E4%B8%80%E9%83%A8%E3%81%AE%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93)らしい。
スマホから Chromecast に繋がらなかった。
→「設定」から「ローカルネットワーク探索」を ON にしたら繋がった。
MacBook の Firefox/Chrome ブラウザ拡張は要らない。表示できない画像があったり、悪影響がある。
→ アプリ版の NordVPN を使えない時に使うものらしい?
## 追記: 2024-06-02
> 2 年プランで購読してしまったけど、NordVPN は 30 日間の返金保証があるので、あとでリクエストすると思う。
こちらの記事を参考にして、購読のキャンセルと返金が完了しました。
[【NordVPN】30日間返金保証を受ける手順を分かりやすく解説](https://webcommu.net/nordvpn-refund/)
--------------------------------------------------------------------------------
title: "このブログのドメインレジストラと DNS を Google Domains から Cloudflare に移行した"
date: "2024-04-13"
--------------------------------------------------------------------------------
このブログは {{< post "2022-10-01-1" >}} で全部 Google のサービスで揃えて、その時ドメインレジストラと DNS も Amazon Route53 から Google Domains に移行しました。
私はこのブログをちょっとした実験場にしていて、出来るだけ仕事と関係するサービスを使うようにしています。[そんな歴史]({{< ref "/history.md" >}})です。
今の仕事は Google は全然使わなくて、AWS をよく使うのですが、また Route53 に戻るのも面白くないなと思い、今回はとりあえずドメインまわりを Cloudflare に移行しました。Cloudflare は仕事では使いませんがね。
もちろん [Google Domains が終了し、Squarespace に移行される件](https://support.google.com/domains/answer/13689670?hl=ja)とも関係しています。何もしなければ Squarespace に移行されはしますが、自分で選んだのに勝手に移行される腹立たしさは少しあり、今回 Cloudflare に移行しました。
## 移行作業は簡単
ざっくりこんな感じです。4/6(土)の夕方に始めて、作業時間としては 2 時間程度だったと思います。慣れていればもっと早いかと。
1. DNS を移行する
1. Cloudflare 上でサイトを追加し、DNS の移行を開始する
1. Google Domains 上でネームサーバを Cloudflare に向ける
1. ドメインを移管する
1. Google Domains 上でドメインのロックを解除し、移管用の認証コードを取得する
1. Cloudflare 上でドメインを移管し、認証コードを入力する
公式ドキュメントに沿えば割と迷わずに移行できると思います。
:link: [ドメインをCloudflareに移管するためのステップバイステップガイド](https://blog.cloudflare.com/ja-jp/a-step-by-step-guide-to-transferring-domains-to-cloudflare-ja-jp)
と書きたいところですが、今回は意識が低くて Qiita の記事を参考にしました。ありがとうございます。
:link: [GoogleドメインからCloudFlareに移管する。 #Web - Qiita](https://qiita.com/napspans/items/3e4030ea54948295c53e)
移行するタイミングも気にする必要はなくて、次の更新を考慮してくれます。
今回は 2024/05/17 が Google Domains 上での有効期限でしたが、Cloudflare に移行したら 2025/05/17 が有効期限になりました。
## 発生したトラブル
作業完了後に https://masutaka.net/ にアクセスすると、リダイレクトループになることがありました。
どうやら Cloudflare あるあるみたいで、中途半端に Cloudflare の SSL/TLS 証明書を使ってしまうためのようです。SSL/TLS の設定を「フレシキブル」から「フル」に変更し、サーバ上[^1]の証明書を使わせたら直りました。
:link: [Cloudflare + Vercelでのリダイレクトループエラーの解消メモ #SSL - Qiita](https://qiita.com/n0bisuke/items/ebdace6abf4423197373)
[^1]: 今回は Cloud Run の証明書
## 料金の変化
多少値上がりしました。
| サービス名 | 料金 | 備考 |
|---|---|---|
| Google Domains | 1,400円/年 | |
| Cloudflare | 1,776円/年 | $11.84/年 を 1USD=150JPY 換算で計算 |
## DNSSEC の有効化は時間がかかる
DNSSEC も 4/6(土)に有効化しました。こちらはしばらくかかって、5 日後の 4/11(木)に有効化が完了しました。
* [DNSViz で masutaka.net の DNSSEC を可視化した様子](https://dnsviz.net/d/masutaka.net/dnssec/)
:link: [DNSセキュリティと DNSSEC | Cloudflare](https://www.cloudflare.com/ja-jp/learning/dns/dns-security/)
## 次のアクション
次はこのブログ自体を Cloud Run からどこかに移動しないと。
Hugo で作った静的サイトなので Cloudflare Pages でも良いのですが、過去 URL のリダイレクトを真面目にやっているのと、趣味なので少しオーバーな技術を採用したい意図があります。
Docker が使えればベストです。でも Cloudflare の CDN は使いたいですね。
## まとめ
このブログのドメインレジストラと DNS を Google Domains から Cloudflare に移行しました。
今までさくらインターネット、Amazon Route53、Google Domains と使ってきましたが、Cloudflare は管理画面が充実していて面白そうです。

--------------------------------------------------------------------------------
title: "『ビジネスプロセスの教科書 第2版』を読んだ"
date: "2024-03-20"
--------------------------------------------------------------------------------
職場の同僚が読んでいて良さそうだったので、読んでみました。各章が割とコンパクトに収まっているので、1日1章を目安に読み進められました。全8章です。
{{< amazon asin="B0BFHGPP6N" title="ビジネスプロセスの教科書 第2版―共感とデジタルが導く新時代のビジネスアーキテクチャ" >}}
この本では「ビジネスプロセスとは」の話から始まり、ビジネスプロセスの構造を管理し改善し続ける活動である「ビジネスプロセスマネジメント」を学んでいきます。
ビジネスプロセスは業務の集合体です。業務は前工程からインプットを受け取り、何らかの処理(プロセス)を加えたうえで、後工程にアウトプットを送り出します。それを取り巻くガイドとイネーブラもあります。
このビジネスプロセスの理解は、ソフトウェアにおけるコードリーディングそっくりだなと思いました。コードリーディングも、基本は関数のインプットとアウトプットに注目して理解し、その後の実装やリファクタリング等に繋げていきます。
インプットやアウトプットが整理されていない関数は、いわゆるスパゲッティコードを生み、生産性を下げる要因になります。
ビジネスプロセスが難しいのは、プログラムという分かりやすい形に落とし込まれていないこと。地道に業務フローを書いたり人を巻き込んで、理解できる形に落とし込んでいくそう。
ビジネスプロセスの理解から問題点の特定、改善に至るまでは「手ごたえを感じるのに 2 年から 3 年、本当に成果を実感するのに 5 年かかった」とのこと。さらに現場の担当者が、なかなか進まない活動に心折れてしまうことがあるそう。これはツラすぎる...。
出来るかどうかは別にして、ソフトウェア開発のスキルがビジネスプロセスマネジメントに活かせそうと知れた点において、読んで良かった本でした。
--------------------------------------------------------------------------------
title: "エレクトロラックスの掃除機を買って、以前のバッテリー内蔵式掃除機をリサイクルに出した"
date: "2024-03-17"
--------------------------------------------------------------------------------
今まで使っていた掃除機のバッテリーが劣化して、5 分くらいしか使えなくなってしまったので、[エレクトロラックス](https://www.electrolux.co.jp/)の掃除機を購入しました。Well Q7 という機種で、型番は `WQ71-2OIB` です。購入価格は ¥19,800 でした。
{{< amazon asin="B08KGRD83Q" title="エレクトロラックス(Electrolux) Well Q7 ゴミ除去率99%コードレスクリーナー充電時間約4.5時間 ハンディクリーナー搭載 インディゴブルー 5ステップフィルターでキレイな排気 最大モードで約14分運転可能 LEDライト搭載 フローリング カーペット 壁際 エアコン上 髪の毛 ホコリ 紙くず ペット 毛 掃除機 Well Q7 WQ71-2OIB" >}}
## 今までの掃除機
実は今までの掃除機もエレクトロラックス製で、エルゴラピード・リチウムという機種でした。型番は `ZB3105AK` で、2017/08/06 に ¥28,063 で購入してました。
:thought_balloon: 今見ると良いお値段です。おまけに同月に母親用にもう一つ購入していました。
6 年半くらい使っていたことになります。バッテリーの寿命は利用頻度によるようですが、週に一度程度の利用だと、こんなものですかね。
もっとも、最後の方は掃除の間に充電を挟みつつ、かなり急いで使っていました。それでも間に合わないことは何度も...。
なぜ早く買い替えなかったかというと、リチウムイオン電池のリサイクル方法が分からなかったからです。
## リチウムイオン電池を内蔵する電子機器のリサイクル方法
:link: [小型充電式電池・小型充電式電池内蔵製品の出し方、リサイクル/荒川区公式サイト](https://www.city.arakawa.tokyo.jp/a025/recycle/bunbetsu/judensikidenti.html)
掃除機や電動歯ブラシなど、リチウムイオン電池を内蔵し且つ取り外しができない電子機器は、荒川区では回収してくれません。どうすれば良いのかなあ?と調べずに先延ばしにしていました。
[エレクトロラックス公式サイトの製品ページ](https://www.electrolux.co.jp/appliances/stick-vacuum-cleaners/wq71-2oib/)を見たら、「小型家電リサイクル宅配回収サービス」という文字列が。[リネットジャパンのサービス](https://www.renet-recycle.jp/)を知りました[^1]。
[^1]: [クリーニングのリネット](https://www.lenet.jp/)とは違います
## リネットジャパンの小型家電リサイクル宅配回収サービス
リネットジャパンの宅配便リサイクルは単独で利用することもできて、Amazon.co.jp でリサイクル券を購入することができます。今回は ¥2,014 で購入しました。
{{< amazon asin="B09K3FK4T1" title="リネットジャパンリサイクル(RenetJapanRecycle) 小型家電リサイクル券 廃家電を自宅から宅配便で回収" >}}
こんな流れです。
1. 自宅にリサイクル券が届く
1. リネットジャパンのサイト上で、リサイクル券に記載されたシリアル番号を入力し、回収日を登録する
* 今回は 2 日後に回収してもらいました
1. 3 辺の合計が 160cm・重量 30kg 以内に収まるように梱包する
* 今回は新しい掃除機のダンボールを使いました
1. 佐川急便が回収に来る
ダンボールの中には、他のリサイクル品を入れることもできます。今回は電動歯ブラシや、ワイヤレスイヤホン、電源ケーブルなども入れました。
これで ¥2,014 は安いと思います。
**余談:** 今回掃除機を ¥19,800 で Amazon.co.jp で購入しました。リサイクル券を加えて ¥21,814 です。一方の公式サイトはセール中で ¥24,800 でした。リサイクル券も込みです。今見直しても Amazon.co.jp のほうが安いのですね...。気持ちとしては公式サイトで購入したかった。
## 新しい掃除機の使い心地
とても良いです。まだバッテリーが劣化してないので当然ですが、力強く吸い取ってくれます。今まで同様、自立するのも良いですね。
以前の掃除機よりも低音で静かになりました。
布団用のノズルはついておらず、今までの掃除機とも互換性がなかったのは残念でした。
## まとめ
今までと同じエレクトロラックスの掃除機を購入し、掃除が捗るようになりました。
リチウムイオン電池を内蔵する電子機器のリサイクル方法も分かったので、次回はもっと早く買い替えられそうです。
## 補足: 掃除機のバッテリーを長持ちさせるには?
以前の掃除機は 6 年半使ったものの、次はバッテリーの劣化を出来るだけ抑えつつ使いたいものです。
:link: [Well Q6 & Well Q7 のよくあるご質問 | Electrolux Japan](https://www.electrolux.co.jp/support/faq/vacuum-cleaner/well-q6-q7/)
> <充電について>追加充電(継ぎ足し充電)について
>
> 追加充電による問題はございません。充電が完了すると自動的に待機モードに入り、消費電力を大幅に抑えます。
> 追加充電(継ぎ足し充電)のようなこまめな使い方の場合、電池がより長持ちする(電池に負担がかからない)ように設計されています。
公式サイトには、充電しっぱなしでも問題ないと書いてありました。
とは言え心配ではあるので、スマートプラグを使って、充電開始から N 時間で停止するようにしました。以前の掃除機も晩年はそうしてました。
{{< amazon asin="B08BRX8BLZ" title="【HomeKit対応】Meross スマートプラグミニ スマートコンセント Wi-Fi スマホのSiriで家電を操作 タイマー コンセント 節電·省エネ HomeKit, Amazon Alexa, Google Home 対応可能1個入り" >}}
## 付録: 新旧掃除機のスペック比較
* [旧: エルゴラピード・リチウム ZB3105AK](https://kakaku.com/item/J0000019978/spec/#tab)
* [新: Well Q7 WQ71-2OIB](https://kakaku.com/item/K0001316785/spec/#tab)
--------------------------------------------------------------------------------
title: "2024/01/01 から Amazon アソシエイトの商品画像が表示されなくなった問題を Hugo で解決した"
date: "2024-03-12"
--------------------------------------------------------------------------------
前回 {{< post "2024-03-10-1" >}} は Product Advertising API (PA-API) を使って、過去記事で参照している Amazon の商品画像情報を全部 json ファイルとして保存しました。
今回は json ファイルを使った Hugo の amazon ショートコードを紹介します。
Hugo の記事にこのように書くと、
```
{{* amazon asin="4003115015" title="新美南吉童話集 (岩波文庫 緑 150-1)" */>}}
```
このように表示されます。
{{< amazon asin="4003115015" title="新美南吉童話集 (岩波文庫 緑 150-1)" >}}
## 実装の概要
前回取得した json ファイルは `data/amazon_items/` 以下にあります。実装したのは `assets/css/extended/custom.css` と `layouts/shortcodes/amazon.html` です。
```
.
├── assets
│ └── css
│ └── extended
│ └── custom.css
├── data
│ └── amazon_items
│ ├── 4003115015.json
│ ├── 4022645237.json
│ ├── (snip)
│ └── B0CDZWZXLF.json
└── layouts
└── shortcodes
└── amazon.html
```
ここで「実装した」と書きましたが、「改造した」が正しいです。
実は今までゆーすけべーさんのコードを使わせてもらっていましたが、画像が表示できなくなり対応したのが今回の経緯になります。
:link: [Hugoでわりと楽してわりとかっこよくAmazon商品紹介をする - ゆーすけべー日記](https://yusukebe.com/posts/2020/amazon-shortcode/)
## 実装の詳細
`layouts/shortcodes/amazon.html` がこちらです。3 行目の `YOUR_PARTNER_TAG` はご自身のパートナータグに置き換えてください。
```html
{{- $asin := .Get "asin" | default (.Get 0) -}}
{{- $title := .Get "title" -}}
{{- $myaid := "YOUR_PARTNER_TAG" -}}
{{ $item_url := "" }}
{{ $image_url := "" }}
{{ with index .Site.Data.amazon_items $asin }}
{{ if ne $asin .ASIN }}
{{ errorf "Inputted ASIN %q is not match with %q in data/amazon_items/%s.json." $asin .ASIN $asin }}
{{ end }}
{{ $item_url = .DetailPageURL }}
{{ $image_url = .Images.Primary.Large.URL }}
{{ else }}
{{ $item_url = printf "https://www.amazon.co.jp/dp/%s?tag=%s&linkCode=ogi&th=1&psc=1" $asin $myaid }}
{{ $image_url = "/images/Amazon-logo-RGB.png" }}
{{ end }}
```
`index .Site.Data.amazon_items $asin` で `data/amazon_items/4003115015.json` 等の json ファイルを読み込みます。
json ファイルが見つからなければ、デフォルトの画像 [/images/Amazon-logo-RGB.png](/images/Amazon-logo-RGB.png) が使われます。
前回の記事で取得した json ファイルはこのような中身です。
```json
{
"ASIN": "4003115015",
"DetailPageURL": "https://www.amazon.co.jp/dp/4003115015?tag=masutaka04-22&linkCode=ogi&th=1&psc=1",
"Images": {
"Primary": {
"Large": {
"Height": 500,
"URL": "https://m.media-amazon.com/images/I/51bQQhcQqXL._SL500_.jpg",
"Width": 357
}
}
}
}
```
最後に `assets/css/extended/custom.css` です。ゆーすけべーさんとほぼ同じです。
```css
.amazon-widget {
margin: 2rem 0;
max-width: 480px;
position: relative;
}
.amazon-widget a {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
box-shadow: none;
}
.amazon-widget-img {
border: 1px solid var(--border);
border-radius: var(--radius);
text-align: center;
}
.amazon-widget-img img {
border: none;
margin: 0 auto;
max-height: 200px;
padding: 16px;
}
.amazon-widget-info {
border-right: 1px solid var(--border);
border-bottom: 1px solid var(--border);
border-left: 1px solid var(--border);
border-radius: var(--radius);
padding: 5px 10px 10px 10px;
}
.amazon-widget:hover .amazon-widget-info {
background-color: var(--code-bg);
}
.amazon-widget-title {
display: block;
}
.amazon-widget-via {
color: var(--secondary);
font-size: 14px;
}
.amazon-widget-via img {
border: none;
width: 18px;
height: 18px;
margin: 0;
padding: 0;
display: inline;
vertical-align: text-bottom;
}
```
## まとめ
商品画像 URL を含む json ファイルをローカルに保存し、Hugo の amazon ショートコードで参照することで、Amazon アソシエイトの商品画像が表示されなくなった問題を解決しました。
結構大変でしたが、商品画像が表示されて良かったです。
今後、このブログで Amazon の商品を紹介する時は json ファイルを手動で作ってから、amazon ショートコードを使っていきます。
```
$ make data/amazon_items/.json
```
--------------------------------------------------------------------------------
title: "Product Advertising API (PA-API) を使って、過去記事で参照している Amazon の商品画像情報を全部取得した"
date: "2024-03-10"
--------------------------------------------------------------------------------
2024/01/01 から、Amazon アソシエイトを使った Amazon の商品画像表示が出来なくなりました。
こちらのブログ記事で知りました。Product Advertising API (PA-API) を使う必要があるようです。
:link: [2024年1月1日からAmazonアフィリンクの画像が表示できなくなりそうなので、対応をまとめた: わたしが知らないスゴ本は、きっとあなたが読んでいる](https://dain.cocolog-nifty.com/myblog/2023/12/post-86e9f4.html)
本ブログも Amazon アソシエイトで商品画像を表示していたので、年明けから Amazon の商品画像がすべてリンク切れになりました。
仕方がないので、[Product Advertising API (PA-API) 5.0](https://webservices.amazon.com/paapi5/documentation/) を使って、過去記事で参照している Amazon の商品画像情報を全て取得し、ローカルで保持することにしました。
このように進めました。
1. Product Advertising API の認証キーを取得する
2. 自分のトラッキング ID をメモしておく
3. API テスト実行ツールを使って、PHP の Code snippet を取得する
4. PHP の Code snippet を Docker で動かして、1 つの商品画像情報を 1 つの json ファイルとして保存する
`1` 〜 `3` は前述のブログで解説されているので、割愛します。
`4` を解説していきます。
## 実装の概要
macOS Sonoma 上にこのように実装しました。
```
.
├── Makefile
├── amazon_affiliate
│ ├── .envrc
│ ├── Dockerfile
│ ├── Makefile
│ ├── asins.txt
│ ├── compose.yml
│ ├── entrypoint.bash
│ └── get_image_info.php
└── data
└── amazon_items
├── 4003115015.json
├── 4022645237.json
```
`amazon_affiliate/` 以下に実装コード関連ファイルを作りました。
例えば以下の make コマンドを実行すると、ASIN `4003115015` に対応する商品画像情報を `data/amazon_items/4003115015.json` として作成します。
```
$ make data/amazon_items/4003115015.json
```
`data/amazon_items/4003115015.json` の内容です。
```json
{
"ASIN": "4003115015",
"DetailPageURL": "https://www.amazon.co.jp/dp/4003115015?tag=masutaka04-22&linkCode=ogi&th=1&psc=1",
"Images": {
"Primary": {
"Large": {
"Height": 500,
"URL": "https://m.media-amazon.com/images/I/51bQQhcQqXL._SL500_.jpg",
"Width": 357
}
}
}
}
```
以下の make コマンドを実行すると、`amazon_affiliate/asins.txt` に羅列された全ての商品について、`data/amazon_items/.json` を作成します。
```
$ make amazon_items
```
以下の make コマンドを実行すると、`amazon_affiliate/asins.txt` に羅列された全ての商品について、`data/amazon_items/.json` を削除します。
```
$ make clean_amazon_items
```
## 実装の詳細
### 1. get_image_info.php の作成
今回のメイン処理である PHP のコードを用意していきます。このような json を返す PHP プログラムです。
```json
{
"ItemsResult": {
"Items": [
{
"ASIN": "4003115015",
"DetailPageURL": "https://www.amazon.co.jp/dp/4003115015?tag=masutaka04-22&linkCode=ogi&th=1&psc=1",
"Images": {
"Primary": {
"Large": {
"Height": 500,
"URL": "https://m.media-amazon.com/images/I/51bQQhcQqXL._SL500_.jpg",
"Width": 357
}
}
}
}
]
}
}
```
:bulb: `DetailPageURL` が自分のパートナータグ(アソシエイトID)と紐づく Amazon の 商品 URL で、`Images.Primary.Large.URL` が商品画像の Large URL です。
[API テスト実行ツール](https://webservices.amazon.co.jp/paapi5/scratchpad/)のサイドメニュー `ITEM > GetItems` をクリックして、以下のフィールドを埋めます。
* Partner Tag
* Access Key
* Secret Key
* ItemIds
* ASIN を指定する。例: `4003115015`
* Resources
* 商品画像の大きさ。今回は `Images.Primary.Large` にした
`Run request` すると、Rendered response に商品画像が表示されつつ、Code snippets に JAVA, PHP, cURL のコードを確認できると思います。
今回は PHP のコードを `get_image_info.php` として保存しました。さらに以下の変更を加えて、前述の Partner Tag をはじめとする、5 つのパラメータを環境変数として注入できるようにしました。
```diff
diff --git a/amazon_affiliate/get_image_info.php b/amazon_affiliate/get_image_info.php
index 621c4f3a..01f24c60 100644
--- a/amazon_affiliate/get_image_info.php
+++ b/amazon_affiliate/get_image_info.php
@@ -6,16 +6,16 @@
// Put your Secret Key in place of **********
$serviceName="ProductAdvertisingAPI";
$region="us-west-2";
-$accessKey="AKIAIO4JUZQ7C7T2L2UQ";
-$secretKey="**********";
+$accessKey=getenv('AMAZON_ACCESS_KEY');
+$secretKey=getenv('AMAZON_SECRET_KEY');
$payload="{"
." \"ItemIds\": ["
- ." \"B00T8RUFTW\""
+ ." \"". getenv('ASIN') ."\""
." ],"
." \"Resources\": ["
- ." \"Images.Primary.Large\""
+ ." \"". getenv('RESOURCE') ."\""
." ],"
- ." \"PartnerTag\": \"masutaka04-22\","
+ ." \"PartnerTag\": \"". getenv('PARTNER_TAG') ."\","
." \"PartnerType\": \"Associates\","
." \"Marketplace\": \"www.amazon.co.jp\""
."}";
```
最終的な `get_image_info.php` がこちらです。
```php
setRegionName($region);
$awsv4->setServiceName($serviceName);
$awsv4->setPath ($uriPath);
$awsv4->setPayload ($payload);
$awsv4->setRequestMethod ("POST");
$awsv4->addHeader ('content-encoding', 'amz-1.0');
$awsv4->addHeader ('content-type', 'application/json; charset=utf-8');
$awsv4->addHeader ('host', $host);
$awsv4->addHeader ('x-amz-target', 'com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetItems');
$headers = $awsv4->getHeaders ();
$headerString = "";
foreach ( $headers as $key => $value ) {
$headerString .= $key . ': ' . $value . "\r\n";
}
$params = array (
'http' => array (
'header' => $headerString,
'method' => 'POST',
'content' => $payload
)
);
$stream = stream_context_create ( $params );
$fp = @fopen ( 'https://'.$host.$uriPath, 'rb', false, $stream );
if (! $fp) {
throw new Exception ( "Exception Occured" );
}
$response = @stream_get_contents ( $fp );
if ($response === false) {
throw new Exception ( "Exception Occured" );
}
echo $response;
class AwsV4 {
private $accessKey = null;
private $secretKey = null;
private $path = null;
private $regionName = null;
private $serviceName = null;
private $httpMethodName = null;
private $queryParametes = array ();
private $awsHeaders = array ();
private $payload = "";
private $HMACAlgorithm = "AWS4-HMAC-SHA256";
private $aws4Request = "aws4_request";
private $strSignedHeader = null;
private $xAmzDate = null;
private $currentDate = null;
public function __construct($accessKey, $secretKey) {
$this->accessKey = $accessKey;
$this->secretKey = $secretKey;
$this->xAmzDate = $this->getTimeStamp ();
$this->currentDate = $this->getDate ();
}
function setPath($path) {
$this->path = $path;
}
function setServiceName($serviceName) {
$this->serviceName = $serviceName;
}
function setRegionName($regionName) {
$this->regionName = $regionName;
}
function setPayload($payload) {
$this->payload = $payload;
}
function setRequestMethod($method) {
$this->httpMethodName = $method;
}
function addHeader($headerName, $headerValue) {
$this->awsHeaders [$headerName] = $headerValue;
}
private function prepareCanonicalRequest() {
$canonicalURL = "";
$canonicalURL .= $this->httpMethodName . "\n";
$canonicalURL .= $this->path . "\n" . "\n";
$signedHeaders = '';
foreach ( $this->awsHeaders as $key => $value ) {
$signedHeaders .= $key . ";";
$canonicalURL .= $key . ":" . $value . "\n";
}
$canonicalURL .= "\n";
$this->strSignedHeader = substr ( $signedHeaders, 0, - 1 );
$canonicalURL .= $this->strSignedHeader . "\n";
$canonicalURL .= $this->generateHex ( $this->payload );
return $canonicalURL;
}
private function prepareStringToSign($canonicalURL) {
$stringToSign = '';
$stringToSign .= $this->HMACAlgorithm . "\n";
$stringToSign .= $this->xAmzDate . "\n";
$stringToSign .= $this->currentDate . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "\n";
$stringToSign .= $this->generateHex ( $canonicalURL );
return $stringToSign;
}
private function calculateSignature($stringToSign) {
$signatureKey = $this->getSignatureKey ( $this->secretKey, $this->currentDate, $this->regionName, $this->serviceName );
$signature = hash_hmac ( "sha256", $stringToSign, $signatureKey, true );
$strHexSignature = strtolower ( bin2hex ( $signature ) );
return $strHexSignature;
}
public function getHeaders() {
$this->awsHeaders ['x-amz-date'] = $this->xAmzDate;
ksort ( $this->awsHeaders );
// Step 1: CREATE A CANONICAL REQUEST
$canonicalURL = $this->prepareCanonicalRequest ();
// Step 2: CREATE THE STRING TO SIGN
$stringToSign = $this->prepareStringToSign ( $canonicalURL );
// Step 3: CALCULATE THE SIGNATURE
$signature = $this->calculateSignature ( $stringToSign );
// Step 4: CALCULATE AUTHORIZATION HEADER
if ($signature) {
$this->awsHeaders ['Authorization'] = $this->buildAuthorizationString ( $signature );
return $this->awsHeaders;
}
}
private function buildAuthorizationString($strSignature) {
return $this->HMACAlgorithm . " " . "Credential=" . $this->accessKey . "/" . $this->getDate () . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "," . "SignedHeaders=" . $this->strSignedHeader . "," . "Signature=" . $strSignature;
}
private function generateHex($data) {
return strtolower ( bin2hex ( hash ( "sha256", $data, true ) ) );
}
private function getSignatureKey($key, $date, $regionName, $serviceName) {
$kSecret = "AWS4" . $key;
$kDate = hash_hmac ( "sha256", $date, $kSecret, true );
$kRegion = hash_hmac ( "sha256", $regionName, $kDate, true );
$kService = hash_hmac ( "sha256", $serviceName, $kRegion, true );
$kSigning = hash_hmac ( "sha256", $this->aws4Request, $kService, true );
return $kSigning;
}
private function getTimeStamp() {
return gmdate ( "Ymd\THis\Z" );
}
private function getDate() {
return gmdate ( "Ymd" );
}
}
?>
```
### 2. Docker 関連ファイルの作成
macOS Sonoma には PHP 環境はありません。asdf 等で作ってもよいのですが、今回以外の用途で PHP を使う予定はなさそうなので、前述の `get_image_info.php` は Docker で動かすことにしました。
`Dockerfile` はこのようにしました。
```dockerfile
FROM php:8.3-cli
RUN apt -y update && \
apt install -y jq
WORKDIR /work
COPY get_image_info.php get_image_info.php
COPY asins.txt asins.txt
COPY entrypoint.bash entrypoint.bash
RUN chmod +x entrypoint.bash
ENTRYPOINT ["/work/entrypoint.bash"]
```
COPY している `asins.txt` は 1 行 1 ASIN のテキストファイルです。`#` で始まる行は、次で説明する `entrypoint.bash` 内でスキップされます。
```txt
4003115015
4022645237
#B000YZN92W is not found
B092ZCGHGW
```
同様に COPY している `entrypoint.bash` はこんな内容です。このスクリプトは `get_image_info.php` のラッパーです。レスポンスを少し簡素化して、`data/amazon_items/.json` に保存します。
```bash
#!/bin/bash
set -euo pipefail
# Usage:
# $ entrypoint.bash
# $ entrypoint.bash -f
if [ -z "$PARTNER_TAG" ]; then
echo 'required $PARTNER_TAG'
exit 1
fi
if [ -z "$AMAZON_ACCESS_KEY" ]; then
echo 'required $AMAZON_ACCESS_KEY'
exit 1
fi
if [ -z "$AMAZON_SECRET_KEY" ]; then
echo 'required $AMAZON_SECRET_KEY'
exit 1
fi
if [ -z "$RESOURCE" ]; then
echo 'required $RESOURCE'
exit 1
fi
if [ "$1" = "-f" ]; then
ASIN_LIST=$(grep -v '^#' "$2")
else
ASIN_LIST="$1"
fi
for ASIN in $ASIN_LIST; do
OUTPUT_JSON_PATH=/work/amazon_items/${ASIN}.json
if [ -r "$OUTPUT_JSON_PATH" ]; then
echo "$OUTPUT_JSON_PATH is already exist."
continue
fi
echo "Getting ASIN: $ASIN"
set +e
RESULT=$(ASIN=$ASIN php get_image_info.php)
EXIT_CODE=$?
set -e
echo $RESULT
if [ "$EXIT_CODE" != 0 ]; then
exit $EXIT_CODE
fi
if [ "$(echo $RESULT | jq -r '.Errors')" = "null" ]; then
echo $RESULT | jq '.ItemsResult.Items[0]' > $OUTPUT_JSON_PATH
echo "Created $OUTPUT_JSON_PATH"
echo
fi
sleep 1
done
```
簡単に実行できるように `compose.yml` も作ります。秘匿情報である `AMAZON_ACCESS_KEY` と `AMAZON_SECRET_KEY`、今回の説明ではやんわり隠したい `PARTNER_TAG` を、環境変数経由で Docker コンテナに注入します。
```yaml
services:
amazon-affiliate:
build: .
image: amazon-affiliate
container_name: amazon-affiliate
environment:
- AMAZON_ACCESS_KEY=$AMAZON_ACCESS_KEY
- AMAZON_SECRET_KEY=$AMAZON_SECRET_KEY
- PARTNER_TAG=$PARTNER_TAG
- RESOURCE=Images.Primary.Large
volumes:
- ../data/amazon_items:/work/amazon_items
```
こんな `.envrc` を作って、direnv 経由で環境変数を注入していきます。
```sh
export AMAZON_ACCESS_KEY="YOUR_AMAZON_ACCESS_KEY"
export AMAZON_SECRET_KEY="YOUR_AMAZON_SECRET_KEY"
export PARTNER_TAG="YOUR_PARTNER_TAG"
```
`get_image_info.php` を実行できるようになりました。
```
# ASIN を 1 つ指定すると、../data/amazon_items/.json が作られる
$ docker compose run --rm --build amazon-affiliate 4003115015
# asins.txt を指定すると、../data/amazon_items/*.json が作られる
$ docker compose run --rm --build amazon-affiliate -f asins.txt
```
### 3. Makefile の作成
もっと簡単に実行するために Makefile も作っていきます。
ルートの `Makefile` です。
```makefile
DIRENV := direnv
MAKE := make
data/amazon_items/%.json:
@$(DIRENV) exec amazon_affiliate $(MAKE) -w -C amazon_affiliate ASIN=$(basename $(@F)) amazon_item
.PHONY: amazon_items
amazon_items:
@$(DIRENV) exec amazon_affiliate $(MAKE) -w -C amazon_affiliate amazon_items
.PHONY: clean_amazon_items
clean_amazon_items:
@$(MAKE) -w -C amazon_affiliate clean
```
`amazon_affiliate/Makefile` です。
```makefile
DOCKER_COMPOSE := docker compose
ASINS_FILE := asins.txt
.PHONY: amazon_item
amazon_item:
$(DOCKER_COMPOSE) run --rm --build amazon-affiliate $(ASIN)
.PHONY: amazon_items
amazon_items:
$(DOCKER_COMPOSE) run --rm --build amazon-affiliate -f $(ASINS_FILE)
.PHONY: clean
clean:
for i in $$(cat $(ASINS_FILE)); do \
$(RM) ../data/amazon_items/$${i}.json; \
done
```
ルートディレクトリで且つ、docker compose を意識せずに使えるようになりました。
```
# data/amazon_items/4003115015.json を作成する
$ make data/amazon_items/4003115015.json
# amazon_affiliate/asins.txt を読み込んで、data/amazon_items/*.json を作成する
$ make amazon_items
```
## まとめ
Product Advertising API (PA-API) を使って、Amazon の商品画像 URL を取得する方法をまとめました。
次回は `data/amazon_items/*.json` を参照する Hugo の Amazon ショートコードを紹介する予定です。
**追記(2024-03-12):**
{{< post "2024-03-12-1" >}} で紹介しました。
## 補足
### 商品画像自体を自分のサーバにアップロードするのは規約違反
実は最初は商品画像を全部ダウンロードして、このブログの /images/amazon/ 以下に数日間置いていました。商品画像 URL が変わり得えたら嫌だなと思ったからです。
:link: [Amazon アソシエイト > ヘルプ > はじめに > 適切な行為](https://affiliate.amazon.co.jp/help/node/topic/GKT6X2R3NGW5V23K)
> **・商品画像をダウンロードして利用する。**
> 商品画像を保存後、任意のAmazonではないサーバーにアップしなおしての利用はできません。Amazonが提供している商品画像URLを指定する形でご利用ください
あとからこの規約に気づいて、今回の実装に変更しました。
仮に商品画像 URL が変わってしまったら、`$ make clean_amazon_items amazon_items` で `data/amazon_items/*.json` を作り直せば良いと割り切りました。
### Rate Limit が結構厳しい
今回の asins.txt は 368 行あります。途中、PA-API のレスポンスがタイムアウトしたり、エラーになったことが多々ありました。
:link: [API Rates · Product Advertising API 5.0](https://webservices.amazon.com/paapi5/documentation/troubleshooting/api-rates.html)
> As soon as you create your Product Advertising API 5.0 credentials, you are allowed an initial usage limit up to a maximum of one request per second (one TPS) and a cumulative daily maximum of 8640 requests per day (8640 TPD) for the first 30-day period. This will help you begin your integration with the API, test it out, and start building links and referring products to your readers.
1 秒間に実行できる API コールの最大値は `1` 回で、1 日あたりでは `60 * 60 * 24 = 86,400` 回ではなく `8,640` 回とのこと。
> Your PA API usage limit will be adjusted based on your shipped item revenue. Your account will earn a usage limit of one TPD for every five cents or one TPS (up to a maximum of ten TPS) for every $4320 of shipped item revenue generated via the use of Product Advertising API 5.0 for shipments in the previous 30-day period.
出荷商品収益によって Rate Limit が緩和されるようだが、このブログには関係なさそう。:sweat_smile:
--------------------------------------------------------------------------------
title: "仕事用にモバイルディスプレイを買った"
date: "2024-02-27"
--------------------------------------------------------------------------------
突然思い立って、モバイルディスプレイを購入しました。
設置した様子です。15inch MacBook Air と繋いでいるので小さく見えますが、15.6inch なので割と大きいです。Windows ノートパソコンのディスプレイだけと言えば、伝わるでしょうか...?

使わない時は立てかけておけば、邪魔になりません。

## なぜ買ったのか?
私はマイルドなデフォルト厨なので、MacBook 用のサブディスプレイを持っていませんでした。机が狭くなるのも嫌でした。
そんな私が仕事用に購入しました。Google Meet では、画面共有中に他のタブを表示させると、参加者の顔が見えなくなってしまいます。ピクチャーインピクチャー機能を使えば解決できますが、内蔵ディスプレイに表示させると結構邪魔です。
コミュニケーションの情報量が減るのは避けたいので、今までは 43inch のテレビを繋げてピクチャーインピクチャーを表示させていましたが、なにせ大げさです。
そんな話を会社の人にしたら、モバイルディスプレイを勧められたので、即日ポチりました。
## お値段は?
¥19,970 に驚きの ¥6,000 のクーポンがついて、¥13,970 で買えました。
中華製ということもあり大丈夫か?と思いましたが、結果的に大満足でした。
## 何に満足したのか?
MacBook と Type-C ケーブル 1 本繋げるだけで良いのがとてもお手軽です。装着されているカバーで自立もします。
ケーブル 3 種類が親切な袋に入っていて感動しました。今回は下の「給電&映像転送」用のケーブルを使っています。

試していませんが、他のケーブルを使えば PS4 や Switch、スマホとも繋げられるようです。
## まとめ
思い立って買ったモバイルディスプレイに大満足しました。
今は仕事中は常時 Slack も表示させており、マイルドなデフォルト厨とは言えなくなってしまいました。
場所を取るディスプレイを買うのをためらっている人は、特におすすめします。出先で使うのも良さそうです。
{{< amazon asin="B083RFYZGW" title="モバイルモニター モバイルディスプレイゲームモニター cocopar15.6インチ スイッチ用モニター 非光沢IPS液晶パネル 薄い 軽量 1920x1080FHD HDRモード/FreeSync対応/ブルーカット機能 USB Tpye-C/mini HDMI/スピーカー内蔵/カバー付PS4/PS5/XBOX/Switch/PC/Macなど対応 在宅ワーク リモートワーク zs-156" >}}
--------------------------------------------------------------------------------
title: "銀行口座とクレジットカードを断捨離した"
date: "2024-02-20"
--------------------------------------------------------------------------------
ここ 2 年くらいかけて、徐々に銀行口座とクレジットカードを整理してきました。
整理に一区切りついたので、昔を思い出しながらまとめます。
## 解約したもの
### みずほ銀行
新卒で入った会社の給与振込先として、入社初日の研修室で銀行口座の用紙を書いた記憶があります。当時は富士銀行という名前でした。
昔の銀行らしく、毎週 ATM が使えない時間帯があります。常に ATM の引き落とし料金がかかることが決め手になり、使うのを止めました。オンラインで確認できる通帳の期間も短かったです。不具合ももちろん怖かったですね。
解約のために、近くの支店に行く必要がありました。{{< post "2023-06-12-1" >}}
### 三菱UFJ銀行
新卒で入った会社のもうひとつの取引先銀行でした。当時は東京三菱銀行だったかな?
入社前に給与振込先の銀行口座が必要かなと、先走って作ってしまったのは秘密です。引っ越し予定の蒲田に支店があったので、富士銀行ではなくこちらにしました。
みずほ銀行の普通預金を分散させるくらいしか使っていなかったので、解約しました。
### PayPay銀行
前職で経費精算の振込先銀行に指定されたので作りました。
私は PayPay 経済圏にいませんし、退職して不要になったので解約しました。
### セゾンカード
人生で初めて作った、思い出深いクレジットカードです。大学時代の友人がセゾンカードのアルバイトをしていたので、その流れで作りました。
年会費無料は学生にはありがたかったですし、インターネットの黎明期に契約したプロバイダ(infoweb & nifty)はクレジットカードが必要だったので重宝しました。
ここ 10 年くらい使っていなかったので、つい先ほど解約しました。長い間ありがとうございました。
## 現在使用しているもの
### 住信SBIネット銀行
今のメインバンクです。NISA と iDeCo を始めるために SBI 証券の口座を作った時に、流れで作りました。SBI 証券を使うなら作った方が良いですし、今は SBI 経済圏にいるので、いろいろお得に使えてます。
SBI 証券経由で作ると、キャッシュカードが発行されないようですが、申し込めば発行されるようです。
スマホアプリでも ATM から現金を引き落とせます。でも、Android アプリはもっさりしていることもあり、シュッと引き出せずに毎回もたついてしまいます。
### ソニー銀行
みずほ銀行に変わるメインバンクとして使う予定だった銀行口座です。今はサブバンクとして使っています。
Sony Bank WALLET というデビットカードの還元率は割と良いですが、今は使ってないです。
住信SBIネット銀行と違って、即日振込が出来るのは良いです。
### 三井住友カード
現在メインで使っているクレジットカードです。100 万円マラソンを達成したので、ゴールドカードの年会費を永年無料[^1]で使えています。
0.5% のポイント還元率に加えて、年間 100 万円の利用で 10,000 ポイントが付与されます。SBI 証券でつみたて NISA の支払いに使うとさらにポイントが付きます。
今年からの新 NISA では月の投資上限 10 万円のうち、5 万円までしかクレカ払いにできません。月の投資上限まで積み立てるには、残り 5 万を現金で支払う必要がありますが、この規制が緩和される話は挙がっています[^2]。
さらに iD や EX-IC カードなどを追加できるのも良いです。iD は決済時の反応が早く、マネーフォワードに明細も載るので、メインの電子マネーとして使っています。
[^1]: 「永久」でないことがポイントです(?)
[^2]: [クレカで投資、月5万から10万円へ 新NISAのつみたて上限に:朝日新聞デジタル](https://www.asahi.com/articles/ASS1V5VQLS1VULFA00L.html)
### エポスカード
川崎のマルイによく行っていた頃に作ったのかもしれません。昔から服はマルイで買っています。それ以外のどこで買えばよいか分からないです...。
長く使っていたからか、ゴールドカードへの無料招待がありました。だからずっと年会費は無料です。(^^)
ポイント還元率は三井住友カードと同じ 0.5% と良いです。さらに 1 年で 50 万円使うと 2,500 ポイント、100 万円使うと 10,000 ポイント付与されるので、サブカードの立ち位置になりました。
もちろんマルイで買い物してもポイントが付きます。
### オリコカード
今住んでいる賃貸マンションの契約時に作らされたカードです。このカードで家賃を支払う必要があります。
家賃とは別に年間いくらか使うと年会費無料になるみたいですが、面倒で年会費 1,375 円を払い続けています。
ポイントは溜まるので、Amazon ギフト券に交換しています。
## まとめ
さらっとまとめるつもりが、思いのほか長文になってしまいました。
個人発信でこういう情報は多くないと思うので、誰かの参考になれば幸いです。
--------------------------------------------------------------------------------
title: "仕事用に Pixel Buds A-Series を買った"
date: "2024-02-03"
--------------------------------------------------------------------------------
年末に [Pixel Buds A-Series](https://store.google.com/jp/product/pixel_buds_a_series?hl=ja) を購入しました。

{{}} の Pixel Buds Pro に引き続いての購入です。今回もキャンペーンに合わせたので、購入価格は ¥4,000 引きの ¥9,700 でした。
## なぜ購入したのか
完全に仕事用です。
前回購入した Pixel Buds Pro はプライベートと仕事の両方で使っていましたが、Bluetooth の切り替えが面倒でした。
頻繁な充電による、バッテリーの持ちも少し心配になりました。
もう一つ買おうかと考えましたが、在宅ワークだとノイズキャンセリングや外部音取り込みモードのような機能は要らないと思い、廉価版を購入しました。
## Pixel Buds Pro との違い
購入時に気にした仕様の違いです。
| | Pixel Buds Pro | Pixel Buds A-Series |
|---|:---:|:---:|
| 料金 | ¥28,200 | ¥13,700 |
| アクティブ ノイズ キャンセリング(ANC) | :white_check_mark: | :no_entry_sign: |
| 音楽再生時間 | 最長 11 時間(ANC なし)
最長 7 時間(ANC あり) | 最長 5 時間 |
| 音楽再生時間合計(充電ケースを使用した場合) | 最長 31 時間(ANC なし)
最長 20 時間(ANC あり) | 最大 24 時間 |
| クリアな通話 | Bluetooth(スーパー ワイドバンド)
クリア音声通話
ビームフォーミング マイク
音声加速度計
風の音を軽減するメッシュカバー | クリア音声通話
ビームフォーミング マイク |
| 外部音取り込みモード | :white_check_mark: | :no_entry_sign: |
*※ [Pixel Buds Pro と Pixel Buds A-Series の比較から抜粋](https://store.google.com/jp/magazine/pixel_buds_compare?hl=ja)*
A-Series を実際に触ってみると、Pro と比べて軽くてチープな作りです。装着時のフィット感も甘くて、たまにポロッと外れてしまいます。でも許容範囲かなと思いました。
肝心の音声は、同僚曰く問題ないとのこと。
## まとめ
仕事用に Pixel Buds A-Series を購入して、1 ヶ月ほど使っています。概ね満足しています。
* 音質は問題なし
* 装着感はほどほど
* バッテリーの持ちは問題なし
* ケースは週に 1~2 回充電している
この手のイヤホンにしては安価なため、バッテリーの持ちが悪くなったりしたら、買い替えれば良いと思っています。
こんなことなら、Pixel 6a 購入時 {{}} の無料特典で、もらっておけば良かったです。でもあの頃は Pixel Buds(第2世代)のトラウマが尾を引いていたのですよね...。
## おまけ
形状が似ているため、一度間違えて Pixel Buds A-Series を持って外出してしまったことがありました。間違えないようにダサいテプラを貼って、もう完璧です! :grin:

--------------------------------------------------------------------------------
title: "Android であまりに広告が酷いので対策した"
date: "2024-01-05"
--------------------------------------------------------------------------------
{{< post "2020-07-14-1" >}} に、iPhone から Pixel に乗り換えて約 3 年半。広告には比較的寛容な私でも耐えがたくなってきたため、今回対策しました。
## 何に耐えがたくなってきたのか
Pixel に乗り換えて以来、ニュースアプリは「[Google ニュース](https://play.google.com/store/apps/details?id=com.google.android.apps.magazines&hl=ja&gl=US)」を利用しています。しかし、特にこの 1 年くらいで、目にする広告が非常に不快になってきました。
* 私の年齢的によく出てくる、毛穴や歯の黄ばみの広告が非常に不快
* 右上の「X」印で非表示にしても別な記事でまた似たような広告が出てくるし、「X」印がない広告も多い
* 誤タップを誘うような広告が増えてきた気がする
* 例: スクロール操作をタップと認識し、広告に誤って遷移させるケース
Google ニュースアプリ自体にも問題があるのか、ページ分割されている記事の 2 ページ目を見ようとタップしても、また 1 ページ目を表示することがあり、こちらもストレスでした。
## まずは広告ブロッカーアプリを入れてみた
今まで私は広告をブロックしたことがほとんどありません。iOS 9 にコンテンツブロッカーが導入された頃に試した程度です。
自分が設置した Instagram の iframe がブロックされたことがあり、意図しない表示になるのは嫌だなと感じて、その時からブロックしないことにしていました。
アプリはちょっと調べて『[AdGuard](https://play.google.com/store/apps/details?id=com.adguard.android.contentblocker)』を入れてみました。
結果的に Pixel 上のアプリからほぼ全ての広告がなくなりましたが、数日経って削除してしまいました。
* VPN を使って、全ての広告を非表示にするぞ!という思想に賛同できなかった
* 特定のアプリに絞るようなカスタマイズは出来るけど、それでも VPN 使うのはオーバースペックだと感じた
* 個人的には天気アプリ等でちょろっと出る程度は許容範囲
* 事情は理解できるが、Google Play ストア経由でインストール出来ないアプリを使うのは気持ち悪い
* そんな事情です → [Google Play に AdGuard がない理由](https://adguard.com/ja/blog/adguard-google-play-removal.html)
必要なのは広告ブロッカーアプリではなく、広告が酷くないニュースアプリな気がしてきました。
例えば『[Satena](https://play.google.com/store/apps/details?id=com.suihan74.satena)』というサードパーティのはてブアプリは、URL ブロックという機能でしれっと~~広告~~リソースをブロックしています。この程度で良いと思いました。
## どのニュースアプリが良いだろうか
ざっと検索すると、いくつもヒットします。
* Yahoo!ニュース
* NewsPicks
* SmartNews
* グノシー
* NHKニュース
正直、グッと来るものがありません。SmartNews は iPhone 時代に使っていましたが、記事と広告の見分けが付きづらくなったなと思い出しました。
よく考えたら、Google ニュースで recommend される記事には不満がなかったことに気が付きました。精度が良くて逆に気持ち悪かったくらいです :sweat_smile:
## Firefox で Google ニュースを読むことにした
このように課題を解きほぐした結果、Firefox を Android のデフォルトブラウザにして、常に https://news.google.com/ をタブで開いて、今まで通り Google ニュースを読むことにしました。
Firefox を選んだのはこんな理由からです。
* プライベートでは {{< post "2021-08-07-1" >}} から、デスクトップで Firefox をメインブラウザにしており、親近感がある
* デスクトップの Firefox でも時々 Google ニュースを見る
* Firefox には Android 版にも[強化型トラッキング防止機能](https://support.mozilla.org/ja/kb/enhanced-tracking-protection-firefox-android)があり、安心感がある
* [タイミングよく先月 12/14 に、Android 版の Firefox で使える拡張機能がかなり増えた](https://blog.mozilla.org/addons/2023/12/14/a-new-world-of-open-extensions-on-firefox-for-android-has-arrived/)ので、広告ブロッカーを導入することも可能
アプリを止めたことで「ページ分割されている記事の 2 ページ目を見ようとタップしても、また 1 ページ目を表示する」の問題は解消されたように見えます。
広告ブロッカーは『[AdBlocker Ultimate](https://addons.mozilla.org/ja/android/addon/adblocker-ultimate/)』という拡張機能をインストールしました。この拡張機能は公式ドキュメント[^1]でも紹介されているので、信頼できそうな気がします。
[^1]: [広告ブロッカー — 迷惑な広告に対抗する秘密兵器。](https://www.mozilla.org/ja/firefox/features/adblocker/)
## まとめ
不快な広告から逃れるために、アプリ版の Google ニュースから、Firefox で開いた Google ニュースに乗り換え、AdBlocker Ultimate という拡張機能をインストールしました。
バッテリー使用量に占める Firefox の割合が半分程度に増え、バッテリーの減りも早くなった気はしますが、帰省中でいつもよりスマホを使う頻度が高かったからかもしれません。
広告収入で運営しているサイトはあるので複雑な感情はありますが、Pixel 上の Firefox 以外では広告をブロックする予定はないので許して欲しいです(?)
いずれにせよ、ニュースを読む体験は良くなりました :+1:
## 追記: 2024-01-13
その後思い直して、広告ブロッカーアプリを使うのは止めました。
代わりに前述の強化型トラッキング防止機能を「標準」から「厳格」に変更しました。不快な広告からの追跡から逃れられた気がします。誤タップを誘うような広告は相変わらずですが、気持ち減ったような?
:bulb: 強化型トラッキング防止機能の設定は、デスクトップ版に同期されないことを確認しました。
ちなみに今回の Android とは関係ありませんが、デスクトップ版 Firefox にある「トラッキング拒否機能(DNT)」は ON にしないほうが良いかもしれません。
* [現在は非推奨な機能であるため](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/DNT)
* Chrome のヘルプには ["ほとんどのウェブサイトやウェブサービスは、Google を含め、「トラッキング拒否」リクエストを受け取っても動作を変更しません"](https://support.google.com/chrome/answer/2790761) と書いてありました...
* [ほとんどのユーザーはこの機能を使っていないため、逆にブラウザのフィンガープリントとして使われてしまうため](https://wiki.archlinux.jp/index.php/Firefox/%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC#.22Do_Not_Track.22_.E3.83.98.E3.83.83.E3.83.80.E3.82.92.E6.9C.89.E5.8A.B9.E5.8C.96.E3.81.99.E3.82.8B)
--------------------------------------------------------------------------------
title: "MacBook パームレストの変色防止用フィルムを買った"
date: "2023-12-10"
--------------------------------------------------------------------------------
## 変色してきたパームレスト
会社用 MacBook Pro のパームレストが変色してきました。退勤時に毎日クリーナーで拭いていたのですが...。

以前の職場で使っていた MacBook Pro も、結果として手の甲の痕が残ってしまいました。今回はそれを避けようと思いました。
プライベートで 2 年半使っていた Windows PC {{< post "2021-05-06-1" >}} もこんな有様です。写真よりも実物の方がくっきりしています。

## なぜ変色する?
手汗に含まれる塩類が、アルミニウムを腐食させるそうです。
話題に出てこないように見えるのは、昨今は外付けキーボードを使う人が大多数になったから?それとも手汗をかく人が少数派?私は集中すると冬でも手汗をかくのですが。:sob:
## 変色ではなく汚れでは?
今の職場の同僚に教えてもらった、良さげなクリーナーでは変化がなかったので、変色だと判断しました。
{{< amazon asin="B0029ZDRSQ" title="ROGGE DUO-Clean スクリーン クリーニングキット(250ml) " >}}
## エレコムのプロテクターフィルムを購入
エレコムのプロテクターフィルムが良さそうだったので、会社の [MacBook Pro (14インチ, 2023)](https://support.apple.com/kb/SP889?locale=ja_JP) と、プライベートベートの [MacBook Air (15インチ, M2, 2023)](https://support.apple.com/kb/SP893?locale=ja_JP) 用に購入しました。
{{< amazon asin="B09QW5BNP4" title="エレコム MacBook Pro 14インチ (2023/2021年発売モデル)対応 プロテクターフィルム 抗菌 トラックパッド保護 クリア PKT-MBP1421" >}}
{{< amazon asin="B0CC8Z15JP" title="エレコム プロテクターフィルム Macbook Air 2023 15.3 インチ M2モデル対応 抗菌 トラックパッド保護 クリア PKT-MBA1523" >}}
滑りがよく、付けたことを忘れるくらい違和感がありません。また、ほとんど目立ちません。
ピッタリと且つ、気泡が残らないようにフィルムを貼るのは少し手間がかかりますが、不器用な私でも出来ました。[こちらの記事](https://moriblo.com/macbook-palmrest-protector-film/)は参考になるかもしれません。
私の手汗がプロテクターフィルムを越えて浸透しないことを祈ります。:pray:
--------------------------------------------------------------------------------
title: "Pixel 6a 用に何の変哲もないケースを買った"
date: "2023-12-10"
--------------------------------------------------------------------------------
Pixel 3a XL の時から {{< post "2021-12-26-1" >}} に紹介したスマホスタンドを便利に使っていましたが、今回何の変哲もないスマホケースに変更しました。
{{< amazon asin="B0B4VG5JS8" title="Google Pixel 6a 用 ケース クリア 薄型 ドイツバイエル製TPU素材 超耐衝撃 全透明 黄変防止 レンズ保護 指紋防止 「ストラップホール付き」 ピクセル6a 用カバー クリスタル・クリア" >}}
Pixel 6a では G マークすぐ下にある NFC センサーがこのスマホスタンドで隠れてしまうためか、マイナンバーカードの読み取りに失敗し、ロックされることがありました。
署名用電子証明書暗証番号はコンビニでもロックを解除できますが、利用者証明用電子証明書暗証番号は区役所に行かないと解除できません。ええ行きましたとも...。
個人的にはケースを付けるのは好きではありませんが、Pixel 6a は滑りやすく、机に置いた時に持ち出しづらく、特に乾燥する冬は下に落とす危険性もありました。
いろいろ調べて行き着いた先が、今回の何の変哲もないケースです。軽量で薄いので、そこまでサイズ感が変わらなくてよかったです。
何ヶ月か使うと変色する可能性はあるようですが、値段が高いものではないのでまた買えば良いかと思っています。
--------------------------------------------------------------------------------
title: "github-nippou のリリースを gox+ghr の手動実行から、tagpr+goreleaser の自動実行に変えた"
date: "2023-11-14"
--------------------------------------------------------------------------------
最近、私が所属する ROUTE06 で私が作った github-nippou がよく使われ始め、リリース頻度が上がってきました。[github-nippou の Web 版](https://github.com/MH4GF/github-nippou-web)が出来た影響が大きそうです。
{{< github_repo "masutaka/github-nippou" >}}
今まで何年も手作業(!)でリリース作業をしていましたが、この度えいやっと自動化しましたので、ここに記録を残します。
## これまでの手動リリースフロー
MacBook 上で、こんなことをしていました。温かみのある手作業です。:relaxed:
1. git pull で最新の main ブランチをローカルに持ってくる
2. lib/version.go を手動で書き換え、git commit&push する
3. `$ make dist` で [gox](https://github.com/mitchellh/gox) を使ってクロスビルドする
4. `$ make release` で [ghr](https://github.com/tcnksm/ghr) を使って GitHub にリリースする
## これからの自動リリースフロー
1. main ブランチに commit が追加されると、[tagpr](https://github.com/Songmu/tagpr)[^1] がリリース PR を作る
* 例: https://github.com/masutaka/github-nippou/pull/132
* CHANGELOG.md とともに、lib/version.go も更新してくれる
* デフォルトではパッチバージョンが 1 つ上がる。メジャーバージョンを上げたいときは `tagpr:major` ラベルを、マイナーバージョンを上げたいときは `tagpr:minor` ラベルを付ければ良い
* すでに存在していれば、tagpr はリリース PR を更新する
2. リリース PR をマージすると、tagpr は新しいバージョンの git のタグを振りつつ、[Releases](https://github.com/masutaka/github-nippou/releases) に新しいバージョンのリリースを作る
3. [goreleaser](https://github.com/goreleaser/goreleaser) が github-nippou のバイナリをビルドし、上記リリースにアップロードする
以上を [masutaka/github-nippou/.github/workflows/release.yml](https://github.com/masutaka/github-nippou/blob/v4.2.10/.github/workflows/release.yml) に実装しました。リリース PR をマージするだけで、リリース作業が完了します。
[^1]: [リリース用のpull requestを自動作成し、マージされたら自動でタグを打つtagpr | おそらくはそれさえも平凡な日々](https://songmu.jp/riji/entry/2022-09-05-tagpr.html)
## 参考にしたもの
[k1LoW/runn/.github/workflows/tagpr.yml](https://github.com/k1LoW/runn/blob/v0.90.0/.github/workflows/tagpr.yml) をかなり参考にしつつ、削れる箇所は削りました。
今回の自動化で gox+ghr の組み合わせを変える必要はなかったのですが、goreleaser は[昔見た記事](https://zenn.dev/kyoh86/articles/5e7fe8c16a39aa3d3796)で気になっていたので導入してみました。1 つのツールが複数のことをやるのは UNIX 的ではないかもしれませんがね...。
また、タイミングが良いのか悪いのか、[gox リポジトリ](https://github.com/mitchellh/gox)が 2023/11/01 にアーカイブされていたことも少し関係します。
## まだ自動化出来ていないこと
github-nippou の formula リポジトリの更新はまだ手作業です。
{{< github_repo "masutaka/homebrew-github-nippou" >}}
ただ今回の件で、[maltmill](https://github.com/Songmu/maltmill)[^2] を知ったので `$ make update` で formula ファイルを更新できるようにはしました。
[k1LoW/homebrew-tap](https://github.com/k1LoW/homebrew-tap) は GitHub Actions の schedule で自動更新してたので、同じことをやれば良いのですが(続く)、
:link: [ワークフローの無効化と有効化 - GitHub Docs](https://docs.github.com/ja/actions/using-workflows/disabling-and-enabling-a-workflow)
> パブリックリポジトリでは、60日間にリポジトリにアクティビティがなかった場合、スケジュールされたワークフローは自動的に無効化されます。
更新頻度が低い私のリポジトリで同じことをやると、:point_up: この 60 日間の制限に引っかかり、[Keepalive Workflow](https://github.com/gautamkrishnar/keepalive-workflow) を導入する/しないなどを考える必要がありそうで、一旦保留にしています。
[^2]: [Homebrewで自作ツールを簡単にインストール可能にする | おそらくはそれさえも平凡な日々](https://songmu.jp/riji/entry/2019-02-22-maltmill.html)
## まとめと雑感
2014 年に誕生し、ruby gems から golang へと書き換えた github-nippou のリリースがようやく自動化されました。とても満足しています。
こうしてみると、これから益々 Songmu さんプロダクトにお世話になることを実感しています。:pray:
* https://github.com/Songmu/tagpr
* https://github.com/Songmu/gh2changelog [^3]
* https://github.com/Songmu/maltmill
[^3]: tagpr から使われる
[ghr のクロスビルドツールを確認したら](https://github.com/tcnksm/ghr/blob/v0.16.2/Makefile#L29-L32)、こちらも Songmu さんプロダクトでした。いつか使わせてもらうかも。
* https://github.com/Songmu/godzil
## 追記: 2024-07-30
{{< post "2024-07-30-1" >}} で「まだ自動化出来ていないこと」に対応しました :tada:
--------------------------------------------------------------------------------
title: "tfupdate Github Action の修正版を GitHub Marketplace に公開しました"
date: "2023-10-31"
--------------------------------------------------------------------------------
[tfupdate](https://github.com/minamijoyo/tfupdate) の GitHub Action を [GitHub Marketplace に公開](https://github.com/marketplace/actions/tfupdate-github-actions-by-masutaka)しました。
{{< github_repo "masutaka/tfupdate-github-actions" >}}
新規作成したわけではなく、[daisaru11/tfupdate-github-actions](https://github.com/daisaru11/tfupdate-github-actions) の Fork 版です。
## なぜ Fork 版を作ったのか
[Git v2.35.2 以降に入った CVE-2022-24765 対応](https://github.blog/2022-04-12-git-security-vulnerability-announced/)により、daisaru11/tfupdate-github-actions は 1 年以上壊れた状態でした。
当時は仕事で Terraform を使うことはなく、個人で細々と使っていた程度だったので、この GitHub Action を使うのは止めて、Terraform 本体は毎月リマインダーを仕掛けて手動アップデート、Terraform provider は Dependabot に任せてました。
今の会社に入って、3~4 年ぶりに Terraform のコードを書くようになり、自動アップデートの仕組みを入れたいな、GitHub Action 直さないとなと思ったのが経緯です。
## なぜ GitHub Marketplace に公開したのか
その方が公益性があると思ったからです。
Fork 元の [daisaru11/tfupdate-github-actions は GitHub Marketplace に公開](https://github.com/marketplace/actions/tfupdate-github-actions)されています。それ自体はありがたいことでしたが、残念ながら壊れており、修正もされない雰囲気[^1]でした。
[^1]: 作者の方に Twitter や GitHub で連絡は試みました
GitHub Action は、Marketplace に公開しなくても普通に使えます。しかしながら、修正版の存在に気づくのは難しいですし、Marketplace を tfupdate で検索した時に、壊れたものだけヒットするのは良くないのでは?と思ったことが経緯です。
[今は 2 つヒットする](https://github.com/marketplace?category=&type=actions&verification=&query=tfupdate)ので、少なくとも存在には気づけるでしょう。

## 何を変更したのか?
[v2.0.0](https://github.com/masutaka/tfupdate-github-actions/releases/tag/v2.0.0) では、前述の 1 つの Critical なバグと、2 つの軽微なバグを修正しました。
加えて、`tfupdate_path` を指定した時に、PR タイトルとブランチ名に反映するようにしました。モノレポ戦略を取っていて、複数の PR に分けたい用途を想定しています。
[v2.1.0](https://github.com/masutaka/tfupdate-github-actions/releases/tag/v2.1.0) では PR に assignees を設定できるようにしました。
## 今後の予定
積極的に機能拡張する予定はありません。
~~ただ、仕事の Terraform コードでは [terraform-aws-modules/s3-bucket](https://registry.terraform.io/modules/terraform-aws-modules/s3-bucket) 等の公式モジュールも使っていたので、tfupdate の module サブコマンドにも対応するかもしれません。tfupdate で期待通りのアップデートが出来るかどうかは未確認です。~~
追記: Dependabot は terraform module もアップデートしてくれたので、何もしないことにしました。
## おまけ: 私の Terraform コードの自動アップデート方法
* Terraform 本体
* `.terraform-version` ファイルと、Terraform コード内の `terraform.required_version` は、今回の [masutaka/tfupdate-github-actions](https://github.com/masutaka/tfupdate-github-actions) でアップデートする
* Terraform provider
* `.terraform.lock.hcl` ファイル内の `provider.version` は、Dependabot にアップデートを任せる
* Terraform コード内の `terraform.required_providers` ではバージョンを設定していない
* Terraform module
* 公式モジュール利用箇所の `module.XXXX.version` は、Dependabot にアップデートを任せる
実は今回の GitHub Action は Terraform 本体のアップデートにしか使っていません。
--------------------------------------------------------------------------------
title: "『大規模データ管理』を読んだ"
date: "2023-09-27"
--------------------------------------------------------------------------------
年末に買ってから積んでたけど、今の仕事に関係する CQRS[^1] やイベントソーシングなどに言及していることを知ったので読んだ。
[^1]: Command and Query Responsibility Segregation の略。データを読み出す操作(クエリ)と、データを更新する操作(コマンド)を別々のインタフェースに分離すること
{{< amazon asin="481440008X" title="大規模データ管理 ―エンタープライズアーキテクチャのベストプラクティス" >}}
全体的に Scaled Architecture と呼ばれる分散型ドメインベースアーキテクチャを解説している。とは言え、具体的な実装方法には触れていないので、抽象的で難しいと感じた。年末に読んでたら本当に引っかかるものがなかったな。:sweat_drops:
プロダクト側が CQRS で実装されていること前提な気がしたけど、どうなんだろう?
以下、気になった点の引用。
> 中央集権的でモノリス型のデータ統合アーキテクチャから、ドメイン駆動型のデータ流通モデルに移行する際には、ハブスポークモデルが大きなメリットをもたらすと確信しています。
言い切っておる。
> 80/20の法則を覚えておいてください。ほとんどの場合、要件の80%は、20%の調和されたデーアでカバーできます。残りの20%は、おそらく非常に難しい部分であり、ユースケースに特有の問題が含まれるので注意が必要です。境界をしっかり描くことで、データの潜在能力を最大限に引き出すことが出来ます。また、データウェアハウスは決してすべての分析ユースケースに対応するものではなく、安定したデータのみを取り扱うものであることも忘れてはなりません。
広告データ基盤を作ってた頃の感覚に近い。
P.S.
きちんとした感想を書けるほど理解が追いついていない。今の仕事に活かせる日は来るのかな...。
--------------------------------------------------------------------------------
title: "Pixel Buds Pro を買った"
date: "2023-09-18"
--------------------------------------------------------------------------------
[Pixel Buds Pro](https://store.google.com/jp/product/pixel_buds_pro) を購入しました。

[Google 創立 25 周年キャンペーン](https://store.google.com/jp/collection/offers?hl=ja)がやっていたので、購入価格は ¥7,050 引きの ¥21,150 でした。
2020/08/20 に発売された [Pixel Buds(第2世代)](https://kakaku.com/item/K0001277923/) が買ってはいけないレベルで出来が悪く、Pixel Buds シリーズはもう二度と買わないつもりでしたが、評判が悪くなかったのでつい買ってしまいました。で、出来るだけグーグル製品で揃えたいだけだから...(震
## Pixel Buds(第2世代)の何が悪かったか
[昔の Tweet](https://twitter.com/search?q=from%3Amasutaka%20pixel%20buds&src=typed_query&f=live) を辿ると、買った直後から調子が悪く、最終的には使えなくなりました。
* 届いてファームウェアを最新にしたら、右から聞こえなくなった。工場出荷状態にリセットで直った様子
* 音飛びがまあまあ発生した
* 左右どちらから聞こえなくなり、工場出荷状態にリセットしないと直らないことが多かった
* 最終的には、左右どちらからも音が出なくなってしまった
* 正確に書くと、ケースから外さなければ音が出る。しかしそれではイヤホンとして使えない...
## 転じて Pixel Buds Pro はなかなか良いかも
使って 3 日目ですが、変な不具合はなく、普通に使えています。まだ気は抜いてませんがね。:sweat_smile:
何万円もするイヤホンを買うのは抵抗があったこともあり、ノイズキャンセリングイヤホンを買ったのは今回が初めてでした。これが噂のノイキャン...と思いました。外の音を増幅する「透過」も面白いですね。
設定アプリ → 接続設定 → Pixel Buds Pro の :gear: から、イコライザー含めていろいろ設定できます。

イヤホンの長押し操作でもノイキャン設定を変えられます。右イヤホンの長押しに設定しました。
イヤホンのこの手の操作は忘れがちですが、Pixel Buds Pro は覚えやすい気がします。

他は、MacBook など他のデバイスへの切り替えが簡単な点も良かったです。プライベートでは Pixel Buds Pro を Pixel 6a に繋げて、仕事ではペアリングし直さずに MacBook Pro に切り替えて使えそうです。
[Shokz の OpenMove](https://jp.shokz.com/products/bone-conduction-headphone-openmove) はこれが出来なかったので、プライベートと仕事用で 1 つずつ買ったことがあります。1 万円くらいだったので、ダメージは少なかった。:innocent:
## まとめ
Pixel Buds(第2世代)の失敗に飽き足らず、Pixel Buds Pro を購入しました。
総じて満足していますが、まだ 3 日目なので気は抜いていません。なにかあれば、この記事に追記します。:fire:
P.S.
ちゃんとしたレビューはこちらの記事が良さそうです。
[【Pixel Buds Proレビュー】使ってわかったメリット・デメリット・評価を解説|ちびめがねアンテナ](https://chibimegane.com/pixel-buds-pro/)
## 追記: 3 ヶ月弱使った感想
:link: [Pixel Buds Pro > 技術仕様](https://store.google.com/jp/product/pixel_buds_pro_specs?hl=ja)
> アクティブ ノイズ キャンセリングがオンの場合、音楽再生可能時間はイヤフォンのみで最長 7 時間、充電ケース併用時は合計で最長 20 時間です。
という割には、思っていたよりケースの充電が必要だと感じました。そこまで多くないミーティングと、毎日 30 分の散歩の使い方だと、少なくとも 3 日 に 1 回ほど充電が必要です。
あと、ケースもイヤホンも滑りやすいので、出しづらく落としやすいです。
極稀に、接続直後に Google Meet や Zoom で音が聞こえない事象も発生しました。こちらの声も届かないかも。接続し直すと直りはしますが、OpenMove で発生した事象に似ており、嫌な気分にはなります。
とは言え、総合的には満足しています。ミーティングは全部 Pixel Buds Pro を使っています。
--------------------------------------------------------------------------------
title: "『WEB+DB PRESS Vol.136』最終号を読んだ"
date: "2023-08-31"
--------------------------------------------------------------------------------
ずいぶんお世話になってきた WEB+DB PRESS も今回が最終号。積もる話はさておき、今回一番気になった特集の感想から書いていく。
{{< amazon asin="B0CDZWZXLF" title="WEB+DB PRESS Vol.136 Kindle版" >}}
## 「特集2 実戦投入パスキー」の感想
今まで気にはなっていたものの、プライベートのメインブラウザが Firefox ということもあり、日常的に使えてなかった。Chrome で Google や GitHub のパスキーを試したくらい。
今回の特集で、パスキーは「覚える必要がないパスワード」くらいに理解した。
私は 1Password を何年も使ってきて、ほぼ全てのパスワードを覚えていない。つまり、パスキーを使ったとしても使い勝手は変わらないということ。
現在、他のデバイスと同期できるのは iCloud Keychain と Google Password Manager くらいらしい。Apple は iOS 17, iPadOS 17, macOS 14 以降、Google は Android 14 以降で 1Password のようなサードパーティのパスワードマネージャーをサポートするらしい。
私のように Firefox on macOS + Android な人は、1Password で使えるまで待てば良い。必ずしもパスキーは使わなくても良いけど。
一方で全てを Apple 製品で揃えている人は、パスワードマネージャーとして意識的に iCloud Keychain を使えばよい。1Password でも良いけど。
著者の一人である nov さんの書いてたことが少し分かってきた?
http://twitter.com/nov/status/1694723538861834291
## 『WEB+DB PRESS』の感想
私と技術系(パソコン)雑誌との関わりは、1990 年代の DOS/V MAGAZINE やパソコン批評から始まったと思う。
2000 年代は組み込みエンジニアだったこともあり、Software Design や UNIX MAGAZINE をたまに読むくらいだった記憶。2011 年以降は Web エンジニアになったこともあり、読む頻度は増えていった。
一番読んでたのは、2019/06 ~ 2022/01 まで。発売されたらすぐ購入&ざっと読んで、面白そうな記事を社内に共有するという、意識の高いことをしていた[^1]。 雑誌は Web 記事と違って、普段キャッチアップしていない情報が目に入るのが良いのだよね。
{{< tweet user="masutaka" id="1141202402315341830" >}}
2022/02 以降は、毎号の目次をチェックして気になったら買うようにしていた。
ただの一読者としての関わりだったけど、なくなってしまうのは残念だし、日本の Web 業界が衰退に向かっているのでは?と少し怖くなる。
そういうわけで、お疲れさまでした。今までありがとうございました。:pray:
[^1]: Software Design も同じことをしてました。
--------------------------------------------------------------------------------
title: "『ビジネスダッシュボード 設計・実装ガイドブック』を読んだ"
date: "2023-08-26"
--------------------------------------------------------------------------------
ようやく読むことが出来た。Looker や Tableau などの BI ツールを使ったビジネスダッシュボードを構築するための良書。
{{< amazon asin="B0C37GD2RN" title="ビジネスダッシュボード 設計・実装ガイドブック 成果を生み出すデータと分析のデザイン" >}}
私は以下のような記事を参考にして試行錯誤してきたが、今思えば設計を意識できてなかったかな?と恥ずかしい気持ちになった。設計から説明されているのがとても良い。もっと前に出会えればよかったな。:sweat_smile:
* [良いダッシュボードを作成するための5つの原則 - Google Cloud Community](https://www.googlecloudcommunity.com/gc/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3-Japanese/%E8%89%AF%E3%81%84%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE5%E3%81%A4%E3%81%AE%E5%8E%9F%E5%89%87/td-p/579815)
* [DevelopersIO 2021 Decadeで俺が考える「ユーザーにちゃんと使用されるダッシュボード」について語りました #devio2021 | DevelopersIO](https://dev.classmethod.jp/articles/how_to_make_properly_used_dashboard/)
* [BIツールでダッシュボードを構築する正しい手順とは - 運用型広告 Unyoo.jp](https://www.atara.co.jp/unyoojp/2020/08/dashborad-operation-guide/)
* [「ダッシュボード」は「設計」「構築」などと同じくらい重要である Amazonのダッシュボード活用のポイント2つ - ログミーTech](https://logmi.jp/tech/articles/328518)
この本は特定の BI ツールを挙げない形で解説されている。逆に BI ツールでダッシュボードを作った経験があると、例えば Looker ダッシュボードのグリッドレイアウトは理にかなっているとか感じると思う。
ダッシュボードを作る人はざっと目を通すと良さそう。
--------------------------------------------------------------------------------
title: "個人のメインマシンを Linux から macOS に戻した"
date: "2023-08-07"
--------------------------------------------------------------------------------
{{< post "2021-05-06-1" >}} に購入した Windows ノートパソコンに Manjaro (Linux) をインストールし、約 2 年間使ってきましたが、地味に面倒なケースが増えてきたので、[先日発表された MacBook Air 15inch](https://www.apple.com/jp/newsroom/2023/06/apple-introduces-the-15-inch-macbook-air/) を購入し、乗り換えました。
[MacBook Air (15インチ, M2, 2023) スターライト](https://support.apple.com/kb/SP893?locale=ja_JP)

久々に Linux をメインマシンにした体験自体は大変ではありましたが、当時はそれを楽しんで、当時所属していた会社の技術勉強会でも自虐的に発表しました。
{{< hatenablog title="『ここがつらいよ普段使いのLinux』という発表をした - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2021/06/11/180000" >}}
## Linux での諸問題
Linux ではこの辺りが面倒でした。
### パッケージのアップデートによる不具合
割とマメにパッケージのアップデートをしてましたが、時々混入する不具合対応が面倒でした。
* 例1: OS の起動にものすごく時間がかかるようになり、Manjaro の再インストールを余儀なくされた
* 例2: Firefox やドキュメントビューアなど、特定のアプリの起動に 20 秒以上かかるようになった。未解決
macOS でも不具合はありましたが、先に誰かが遭遇していることが多かったので、そこまで困ったことはありませんでした。
Linux だと世界で自分一人しか遭遇していないのでは?と感じることが多かったです。
Windows 95 の時のように、数ヶ月に一度 OS をクリーンインストールする運用()を構築するのが良いのかも...。
### カメラやマイクの性能が怪しい
VivoBook 自体のカメラの性能が悪いのか、天井の照明が少し逆光になる程度でも Zoom や Google Meet のビデオが白飛びしてしまいました。
仕方がないので、Zoom や Google Meet を使うときは逆光にならないように椅子にノートパソコンを置いて、床に正座して使ってました。:sweat_smile:
あと、Manjaro のマイクが調子悪いのか、有線であっても Zoom や Google Meet で音飛びしていた気がしました。さらには、Bluetooth ヘッドホンだと、マイクのほうが認識されませんでした。
### 指紋認証が使えない
ASUS ノートパソコン共通の問題のようで、指紋認証が使えませんでした。fprintd-enroll で指紋を登録しようとしても、disconnect されてしまいます。
この Issue で報告されていましたが、解決できた人とできなかった人がいて、私は解決できませんでした。
:link: [Enroll result: enroll-disconnected on 04F3:0C6E (#402) · Issues · libfprint / libfprint · GitLab](https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/402)
### マウスが実質必須
VivoBook は MacBook に比べてトラックパッドの性能が低いようで、私にとってはマウスが必須でした。トラックパッドでは細かい操作の難易度が高かったです。
Windows ノートパソコンではマウスを使う人が多いことから、MacBook のトラックパッドが性能良すぎるのかもしれません。
### スリープが面倒くさい
デフォルトでは画面オフ程度のスリープしか用意されておらず、気がついたら半日程度で電源が切れていました。稀に復帰に失敗することもありました。
仕方がないので {{< post "2021-08-25-1" >}} でハイバネートできるようにしましたが、macOS や Windows のように画面を閉じればいい感じにはスリープできなかったので、手動でハイバネートする必要がありました。
### Linux を拒否するサイトがある
[確定申告のサイト](https://www.keisan.nta.go.jp/)など、Linux のブラウザが拒否されてしまうことがありました。User Agent を偽装すれば使えはしたので、大きな問題ではありませんでしたが。
## Windows での諸問題
プリインストールされた Windows 10 は特に問題はなく、CD のリッピング(!)などで iTunes をたまに使ってました。{{< post "2021-12-30-1" >}}
ただ、Windows 11 にアップデートしたらトラブルが続発しました。つらい。:sweat_drops:
* GRUB から起動できなくなった
* UEFI から Windows のパーティションを先頭にして起動してた。BitLocker 回復キーを毎回求められる
* 起動に 20 分以上かかるようになった
* 指紋認証が使えなくなった
* ネットワークサービスが自動起動しなくなった
## macOS に戻した感想
仕事ではずっと MacBook を使っていたとはいえ、やはり UI が使いやすいと思いました。
私が結局 Manjaro でも macOS の Dock やメニューバー、ショートカットキーなどを再現していたため、劣化 macOS になっていた側面はあります。
VivoBook の AMD Ryzen™ 7 4700U も速かったですが、M2 はさらに速いですね。ブラウザのレンダリングなんかが体感で速くなりました。
一方で、いやあ MacBook Air は高くなりましたねえ...。今回 13-inch にしたとしても、10 万円近い値上がりです。円安も影響してるとは思いますが。
| 購入履歴 | CPU | Memory | SSD | 購入価格(税込) |
|---|---|---:|---:|---:|
| [13-inch, Late 2010](https://support.apple.com/kb/SP618?locale=ja_JP) | 1.86GHz Intel Core 2 Duo | 4GB | 256GB | ¥156,838 |
| [13-inch, Early 2014](https://support.apple.com/kb/SP700?locale=ja_JP) | 1.4GHz dual-core Intel Core i5 | 8GB | 256GB | ¥138,888 |
| [13-inch, M2, 2022](https://support.apple.com/kb/SP869?locale=ja_JP)(参考) | Apple M2 | 16GB | 512GB | ¥236,800 |
| [15-inch, M2, 2023](https://support.apple.com/kb/SP893?locale=ja_JP) | Apple M2 | 16GB | 512GB | ¥254,800 |
※ VivoBook は ¥110,900 でした。{{< post "2021-05-06-1" >}}
## まとめ
元々 Linux にしたのは、Apple 製品が値上がりする中、Apple にロックインされる状況から逃げるためでした。でも戻ってきちゃいましたね...。
でもスマホは今後も Android にする予定なので、まだ足掻いている状態です。:sweat_drops:
自分の性格上、今回の MacBook Air は 5 年は使うと思うので、そこまで割高ではないと思います。さて、残った VivoBook はどうしようかなあ?
--------------------------------------------------------------------------------
title: "PayPay株式会社を退職しました"
date: "2023-08-03"
--------------------------------------------------------------------------------
本日 2023 年 8 月 3 日をもって、PayPay株式会社を退職しました。
{{< post "2023-01-31-1" >}} に書いたとおり、今年の 2 月 1 日が入社日だったので、在籍期間はわずか 6 ヶ月と 3 日です。先月から有休消化に入っていたので、実働はなんと 5 ヶ月という短期間でした。
今までの会社は 10 年程度は在籍していたので、なによりも自分がびっくりしています。:flushed:
## なぜ辞めたのか
ここで一方的に書くことはフェアではないですし、何よりも自分の価値を下げると思うので、理由は書かないことにします。
今回改めて分かったことは、[HRT](https://dev.classmethod.jp/articles/body-of-knowledge-for-working-in-a-team/#toc-4) に基づく心理的安全性がある環境でこそ、自分は伸び伸びとパフォーマンスを発揮できることでした。
{{< amazon asin="4873116309" title="Team Geek" >}}
前職フィードフォースではフリーライドはしていないつもりでしたが、実際は多くの方々の尽力の上に成り立っていたのだと改めて感じます。
## Looker との関わり方
2020 年 4 月から、「自称 Looker エバンジェリスト」として [Looker](https://cloud.google.com/looker?hl=ja) という BI ツールにガッツリ関わっていました。
{{< tweet user="masutaka" id="1550357627779284992" >}}
次の会社では少なくとも現時点では Looker の導入予定はないので、Looker との関わりは一旦終了です。
Looker は今でも素晴らしいツールだと思っていますが、Looker を使うことがゴールではないので、自分としてはそこまでこだわりはありません。
当時は敢えてキャラを演じることで、自分に行動を促していました。
{{< tweet user="TeppenTenshin" id="1675727467326349313" >}}
今後はもう少し広い視点で、セマンティックレイヤーと関わっていきたいなあとふんわり思っています。
## 今後の予定
8 月 16 日から [ROUTE06](https://route06.co.jp/)(ルートシックス)という会社で、これまでと同様にデータエンジニアとして働きます。
きっかけは前職フィードフォースの元同僚である星野さん {{< twitter "hoppiestar" >}} から、私のブログ記事を引用して良いか、連絡を受けたことでした。
{{< hatenablog title="ROUTE06エンジニア対談 - Ruby on Railsエンジニア星野は「naming」にこだわる - ROUTE06 Tech Blog" url="https://tech.route06.co.jp/entry/2023/05/01/083200" >}}
> **星野**
> 僕と同じ日に偶然入社した[ベテランエンジニアのマスタカ(増田貴士)さん](https://masutaka.net/2023-01-31-1/)。先日、フィードフォースを退職されたんですけど。
>
> マスタカさんの日々のふるまいやわかりやすいpull request、commit messageの出し方から開発と向き合う姿勢を学びました。
当時から職場環境に悩んでいたので、試しに話を聞いてみたら自分がパフォーマンスを発揮できそうな気がして、あれよあれよと決まった感じです。
NDA を結んでオンラインの 1 日社内見学もさせて頂き、その後社内の Slack や GitHub にも招待して頂いたので、入社前から社内の雰囲気を掴めていると思います。
前のめりになりすぎず、でもモチベーション高く、ROUTE06 で自分のパフォーマンスを発揮していきます。:fire:
P.S.
フィードフォースや PayPay で私の話を聞いてくださった方々、本当にありがとうございました。:pray:
--------------------------------------------------------------------------------
title: "Nature Remo を第 1 世代から、第 2 世代の mini に買い替えた"
date: "2023-07-20"
--------------------------------------------------------------------------------
Amazon プライムデーで安かったので、先週 [Nature Remo mini 2](https://nature.global/nature-remo/nature-remo-mini/) を購入しました。{{< post "2018-08-19-1" >}} に購入した Nature Remo(第 1 世代)からの買い替えです。
第 1 世代でも特に困っていませんでしたが、買って 5 年も経ったのでアップデートするかという気持ちからです。応援の気持ちもあります。
## アップデートによる影響
今回のアップデートによる影響、個人的 Top3 です。
### 1. 壁に掛けられるようになった
個人的にはこれが一番うれしいアップデートでした。:laughing:
今住んでいる部屋のクロスは、粘着テープで止められないタイプなので、今まで机の上にそのまま置いていました。手前が Nature Remo です。

微妙に机のスペースを占有してしまい、うっかり正面に物を置くと赤外線の通信が遮られてしまうことがありました。
今はこんな感じにスッキリしました。隣は [Google Nest Mini](https://store.google.com/jp/product/google_nest_mini?hl=ja) です。スマートリモコンを買ったら、スマートスピーカーは必須ですよね。

:warning: ひとつ下の nano モデルでは壁掛け用フックはないので、購入の際は注意が必要です。
### 2. 小さく、軽くなった
サイズは 2/3 ほど、重さは 1/3 ほどになりました。ただ、軽すぎて壁に掛けた時に安定せず、パカパカ浮いてしまう問題はあります。:sweat_drops:
| | 第 1 世代 | 第 2 世代 mini |
|---|:---:|:---:|
| サイズ | 74 x 74 x 20mm | 58 x 58 x 16mm |
| 重さ | 65g | 23g |
パッケージサイズもだいぶ違いがありました。

### 3. 湿度、照度、人感センサーがなくなった
※ 温度センサーはあります
Nature Remo を 5 年使って、自分の使い方だとセンサーはほぼ要らないことが分かりました。
温度センサーもほぼ要らなくて、外出先からスマホアプリを開いた時に見る程度です。
## まとめ
Nature Remo を第 1 世代から、第 2 世代の mini に買い替えました。出来ることは変わりませんが、壁にかけられてスッキリしたので大満足です。
先日、スマートホームの共通規格である [Matter](https://linkjapan.co.jp/blog/smarthome-standard-matter) に対応した [Nature Remo nano](https://nature.global/nature-remo/nature-remo-nano/) が発売されましたが、Google Nest Mini 1 台運用だと今のところ必要なさそうです。
家電のインタフェースも、うちは赤外線のみで十分そうです。物理ボタンしかない扇風機は Meross のスマートプラグで、自動化出来ています。
というわけで、現時点では Nature Remo mini 2 がうちのニーズを十分に満たしてくれそうです。
{{< amazon asin="B08P6ZSXWZ" title="Nature スマートリモコン Nature Remo mini 2 ネイチャーリモミニ2 Remo-2W2 Alexa/Google Home/Siri対応" >}}
{{< amazon asin="B08BRX8BLZ" title="メロス(Meross) スマートプラグ Wi-Fi スマホのSiriで家電を操作 主要スマートスピーカー対応 HomeKit, Amazon Alexa, Google Home 【Apple製品対応】1個入り" >}}
--------------------------------------------------------------------------------
title: "『人が増えても速くならない』を読んだ"
date: "2023-06-18"
--------------------------------------------------------------------------------
ソニックガーデンの倉貫さんが本を出していたので、答え合わせをする感覚で読んでみた。
{{< amazon asin="B0C3ZFZH37" title="人が増えても速くならない ~変化を抱擁せよ~" >}}
ふんわり思っていたことが言語化されており、読んで良かった本だった。112 ページと超短いので、サッと読めると思う。
以下、自分用メモ。
不確実性の高い状態では、人を増やしてもうまくいかない。むしろ状況は悪化する。ポイントは、作りたいものを全部、一度に作ろうとしないこと。
人を増やして工程を分離したウォータフォール開発をしても、生産性は変わらない。そのような工場のような作り方は、稼働後に変化がないシステムなら良いのかも。
> P47
> 何か作業をしようとしても、道具を探すのに時間がかかったり、作業する場所がなかったりする状態では、作業をしても生産性がよくありませんよね。
これは本当にそれ。{{< post "2023-03-19-1" >}} の「(1) ノイズを減らす」がまさにそれ。異動や転職で入る現場はだいたいこの状況になっていて、私は整理から始めることが多い。
> P54
> 頭を動かす仕事では、急いだからといって速く成果が出ない
ですよね。
--------------------------------------------------------------------------------
title: "みずほ銀行の口座を解約した"
date: "2023-06-12"
--------------------------------------------------------------------------------
2000 年 4 月に新卒で入社した時に作らされた(ネガティブな意味ではない)みずほ銀行の普通口座を解約した。当時は富士銀行って名前だったのよね。
ATM 利用手数料がかかる口座を保持する理由はなくなってしまったし、都市銀行の口座はもうひとつあるので、もういいかなと。
## 解約までの準備
この日のために口座残高をゼロにした。クレジットカードの引き落としに合わせて、1 円単位で帳尻を合わせた。
{{< tweet user="masutaka" id="1607518146554114048" >}}
{{< tweet user="masutaka" id="1618557280919900164" >}}
でもせっかくゼロにしたのに、利息で 2 円入ってしまった。気持ち悪いのでもう 1 回帳尻を合わせた。:innocent:
{{< tweet user="masutaka" id="1628602010152095744" >}}
## 解約当日にやったこと
解約手続きは、みずほ銀行の支店に行く必要がある。口座を開設した支店である必要はないので、近くの支店に行けば良い。予約も不要。
[FAQ](https://www.faq.mizuhobank.co.jp/faq/show/52) によると、これらが必要とのことだったが、実際には通帳とキャッシュカードだけで解約できた。暗証番号も必要だったので、それをもって認証という扱いなのだと思う。
* 通帳
* お届け印
* キャッシュカード
* 本人確認書類(運転免許証・各種健康保険証など)
みずほダイレクトにもログインできなくなったので、スマホの Money Forward ME アプリから「データの更新を停止」と「口座の非表示」を設定して完了。
23 年間維持して、しっかり解約までしたのは今回が初めてだったので、少しだけ感慨深いものがあった。
--------------------------------------------------------------------------------
title: "最近は GitHub Projects をこう使っている"
date: "2023-05-20"
--------------------------------------------------------------------------------
最近は小さなチームのリーダーとしてチーム運営をしており、[GitHub Projects](https://docs.github.com/ja/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects) を何年かぶりに使っています。
GitHub Projects は以前からありましたが、2022/07/27 に完全リニューアルし、GA (Generally Available) となりました。
[Planning next to your code - GitHub Projects is now generally available | The GitHub Blog](https://github.blog/2022-07-27-planning-next-to-your-code-github-projects-is-now-generally-available/)
## 最近の使い方
こんな前提です。
* 現在は自分含めた 3 人のチーム
* コア開発っぽいリポジトリと、案件ベースのリポジトリ合わせて 10 個くらいある
* 1 つの機能をチームで開発することはなく、それぞれが別々の開発をしている
* 出来るだけレビューを通した PR をマージするように、合意はしている
そんな GitHub Projects を再現したものがこちらです。Issue/PR が少ないのはご愛嬌。:sweat_smile:
[@masutaka's trial project](https://github.com/users/masutaka/projects/2)

## 各 view の使い方
### Board
いわゆるカンバンとして使います。
`-status:Idea` というフィルターのとおり、`Idea` カラム(後述)は非表示にしています。
`Inbox` や `Backlog` などのカラムには、短いながらも的確な Description を書いたつもりです。例えば `In Progress` の「1人1つまで」だとか。
### Schedule
期間を決めた主要 Issue や、期日が決まった Issue のスケジュールは、ここで確認できます。
Start Date もしくは Target Date を設定した Issue/PR が、この view に現れます。`-no:"start date","target date"` はそんなフィルターです[^1]。
[^1]: [projectsのフィルター処理 - GitHub Docs](https://docs.github.com/ja/issues/planning-and-tracking-with-projects/customizing-views-in-your-project/filtering-projects)
当初は `Roadmap` という view 名にして、`Epic` ラベルがついた Issue をこの view に出そうと考えていました。
しかし前述した前提のように、案件ベースの Issue のようなロードマップ以外の要素が多く、チームで普段から Epic という言葉を使うこともないため、一旦このようにしました。もちろん今後変える可能性はあります。
今のところ Epic 的な Issue のタイトルには「★親課題★」という Prefix を付けています。ダサいですが分かりやすいし、自然発生的に生まれたのでこの名前も良いかもしれません。
補足:
:link: [エピック | Atlassian](https://www.atlassian.com/ja/agile/project-management/epics)
> アジャイル エピックとは、顧客やエンドユーザーのニーズやリクエストに基づいて特定のタスク (通称「ユーザー ストーリー」) に細分化できるまとまった作業を指します。
今はアジャイル開発はしていないし、Epic から User Story に細分化するような大きな業務フローでもないので、実業務と距離が遠いなと感じた次第。
### List
カンバンを全体的に眺めて整理したい時を想定して作りました。あまり使いません。補助的な view です。
### Idea置き場
`Idea` カラムを表示するだけの view ですが、自分なりの工夫を凝らしました。
個人でうまくいっている「やるかもしれないリスト(パーキングロット)」{{< post "2021-01-05-1" >}} を、チーム向けにアレンジしています。
思いついたばかりの Issue は、考えが練られていないことが多いと思います。
例えば「○○をしたい」とか「△△を実装する」といった、「課題じゃなくて、願望や方法ですよね?」といった Issue を目にすることは多いでしょう。そのような Issue は、一番重要な「なにが課題なのか?」を説明した「背景」も置き去りにされているでしょう。
これを避けるための工夫が、この `Idea置き場` view です。Issue 化前の Idea 置き場として使います。
最初は「○○をすると良いかも」といった、緩い Draft Issue[^2] を作り、時間をかけて追記や修正などして、よく練られた Issue に近づけていきます。
[^2]: [GitHub Projects では Draft Issue を作ることができます。](https://docs.github.com/ja/issues/planning-and-tracking-with-projects/managing-items-in-your-project/adding-items-to-your-project#creating-draft-issues)リポジトリの Issues タブからは作れません。
本当に Issue を作ると管理が面倒になる気がしたので Draft Issue を奨励していますが、Issue 化は禁止していません。Draft Issue は、更新しても GitHub の通知が飛ばないという悩ましさもありますからね。
### me
自分の Issue/PR を眺めたい時に使います。これも補助的な view です。
## まとめ
会社で使っている GitHub Projects を紹介しました。
個人では何年もうまく運用できているが、チームへの展開が難しかった「やるかもしれないリスト」を、GitHub Projects で表現できたことにかなり満足しています。この記事を書くモチベーションになりました。
あくまでひとつのサンプルなので、自分達に合ったやり方を見つけ出すことが重要です。参考になれば幸いです。
## 参考情報
* [GitHub Projects勉強会を開催しました - ROUTE06 Tech Blog](https://tech.route06.co.jp/entry/2023/03/06/140302)
* GitHub Projects を使い始めようとしていた 2023/03 に、タイムリーに投稿された ROUTE06 さんの記事
* [How the Grafana Alerting team scales their issue management with GitHub Projects | The GitHub Blog](https://github.blog/2023-03-15-how-the-grafana-alerting-team-scales-their-issue-management-with-github-projects/)
* [Grafana](https://grafana.com/) というログ・データ可視化サービスの Alerting チーム用 GitHub Projects
* [Grafana Labs > Alerting](https://github.com/orgs/grafana/projects/52) で実際に閲覧可能。[Twitter でも少し調べた](https://twitter.com/masutaka/status/1636354383830216705)
--------------------------------------------------------------------------------
title: "『リーダーの仮面』を読んだ"
date: "2023-04-05"
--------------------------------------------------------------------------------
先週の 1 on 1 で上司から「増田さんには合わないと思いますが(^^;」という但し書きの上で紹介されたので、逆にやる気を出して読んでみた。
{{< amazon asin="B08G8W4TQ1" title="リーダーの仮面――「いちプレーヤー」から「マネジャー」に頭を切り替える思考法" >}}
確かに反論したい箇所は多々あるものの、その主張の根本を辿るとそうでもない気はした。むしろ合うかもしれない。
## 想定読者を読み誤っていた
全体的にリーダー(マネジメント)視点で書かれているので、プレイヤー視点で読むと、誤解が多く非常に良くなかった。← 最後まで誤解してた人
P11
> この本は、そんな識学のメソッドを元に、「若手リーダー」に向けてマネジメントのノウハウを伝えるものです。
> 初めて部下やスタッフを持つような人、いわゆる「中間管理職」を想定しています。
最初ここを流して読んでしまったけど、この前提を忘れて読み進めたので最後までヘイトが溜まってしまった。
特に「プロセス(過程)は評価しない」には嫌悪感さえ覚えた。プレイヤーがプロセスを軽視して良いわけがない。業務の属人性が高まるし、再現性の低いものばかりできる。そんなものはプロフェッショナルの仕事ではない...と。
P173
> そこでのひとつの結論は、「 プロセス(過程) は評価しない」ということ
ここでさらにヘイトが溜まったけど、、(続く)w
P214
> そこで重要なのが、第4章の「プロセスに口を出さない」ということでした
ここで、逆説的にはプレイヤー視点ではプロセスが大事と言っていることに気がついた。:bulb:
※ これ、解釈が間違っていたら前提が覆るね (^^;
P220
> **プレーヤーだった頃の自分を、部下たちがはるかに超えていく瞬間** 。 ぜひ、それを体感していただきたいと思います。
はい、完全なマネージャー向けの本ですね。失礼しました...。
{{< post "2023-03-26-1" >}} にも書いたけど、今は自分含めた4人チームのリーダーを任されたところで、且つ自分以外は業務委託の方々なので、想定読者ど真ん中ではなさそうだった。
## エンジニア組織に合うのだろうか?
これは最後まで疑問だった。営業組織向けの本かと思っていたら、、、
P189
> デザイナーやエンジニアの世界では、部下に対して、「上司が納得したらOK」という設定をすることもあるでしょう。
ここでズッコケてしまった。うーん、大企業ならあるのか...?
まだ私に前職までの、スタートアップでのウェブプロダクト開発の空気感が残っているので、賛同し兼ねてしまう。これからあるのかあ...。:cyclone:
## 肝心の感想
事実に対して淡々とフィードバックする。プロセスは見ない、結果だけにフォーカスする。
上司(≠プレイングマネージャー)と部下という関係なら、とても良いし、理想的とさえ思った。
本の中では 1 on 1 を否定していたけど、まさに {{< post "2023-03-26-1" >}} の『{{< amazon_link asin="B0716B52LP" title="ヤフーの1on1" >}}』と同じことをしている。作者の方はダメな 1 on 1 しか見たことがないのかも。
## まとめ
そういうわけで、マネージャー向けには良い本だと思う。ボリューム少ないのも良かった。2時間ちょっとで読めた(重要)。
## 自分用読書メモ
> いいリーダーの言葉は、 **「時間差」** で遅れて効いてきます。
これはそうかもね。最近小さく実感したところ(自画自賛)。
> 識学では、組織の成長スピードを考えたとき、「ピラミッド構造が最適であり、最速である」と考えます。
まだ自分の中で結論が出てないけど、条件付きで Yes かもしれない。
{{< post "2021-03-13-1" >}} でも思ったんだけど、スタートアップのような能力密度の高い組織では成り立たない可能性があるから。
大阪市のような普通の人が多そうな組織で成り立つのだと思う。大企業もそうだと思う。
> 「この仕事はAさんに任せた。契約に結びつけてください」 「来週の火曜の 15 時までに資料をまとめておいてください」
この辺の割り切りは自分に足りない。
> 大事なのは、 **「機械的なほうれんそうをさせる」** ということです。
これはエンジニアだと難易度は高くないと思う。GitHub Issue/PR を淡々と更新すれば良いので。それも難しいと言われそうな気はするけど...。
個人的には世間一般で認定されてそうな「ほうれんそう」には反対。部下が上司に報告するのではなく、部下はこまめに共有し続けて、上司は必要あれば Subscirbe すれば良いだけ。多少は部下からの説明はあると思うけどね。
大きな「ほうれんそう」をぶつけるのでなく、小さくコンパクトな「ほうれんそう」を出し続けたほうが時代に合っていると思うんだよね。昭和の時代と違って、結局上司はプレイングマネージャーで、忙しすぎること多いから。
--------------------------------------------------------------------------------
title: "『ヤフーの1on1』を読んだ"
date: "2023-03-26"
--------------------------------------------------------------------------------
数年ぶりに 1 on 1(をやるほう)をやることになったので、『{{< amazon_link asin="B0716B52LP" title="ヤフーの1on1" >}}』という本を読んでみた。
なぜこの本を選んだのかと言うと、前職で 1 on 1 をしてくれていた {{< twitter "meihong" >}} の記事 :point_down: で紹介されていたから。
:link: [コミュ障が1on1をやり始めたので参考になりそうなことを書いておく](https://meihong.work/management/a-bad-texter-has-started-1on1-meetings/)
※ この記事は自分の中でちょっとしたバイブルになっていて、必要な時に読み返しています。
もうひとつの『HIGH OUTPUT MANAGEMENT』は大事に積みました。(アカン :sweat_smile:
## 感想
第1章がマンガでの事例で始まるので、読み始めが楽。ボリュームも大きくなく、流し読み程度だけど1時間 x 2日で読み終わった。
全体的なキーワードは「アクティブリスニング」と「信頼関係」だと理解した。
「アクティブリスニング」は「傾聴」と訳されることが多いが、日本語だと真剣に黙って聞くというイメージが強いため、ヤフーでは「傾聴」ではなく「アクティブリスニング」を使っているそう。
うなずいたり、相槌を打ったり、相手が発したキーワードを繰り返したりするため「傾聴」とは異なる。そうすることで、相手の頭のなかの今まで動いていなかった一部分を動かすことができるとのこと。出来る気はしていない...。
ありがちな失敗として、上司がアドバイスしようと思うがあまり、「どういうふうに進めたいの?」「誰かに相談した?それは誰?」などと自分の理解のために質問をしてしまうこと。それでは部下から上司の依存が強くなってしまうだけ。まあそうだよね。
「信頼関係」は一朝一夕で出来るものではないので、会社からの支援と、上司の日々の行動が重要だと思った。
個人的には「いつも気にしているよ」というメッセージもしくはシグナルを投げかけるようにしている。
具体的には、Slack の活動は見えるものは全部読んで、絵文字リアクションを適宜付けている。GitHub の活動も全部読んで、こちらも適宜絵文字リアクションを付けている。それらを朝会などで必要に応じて伝えている。どれも上司(リーダー)だからやっている訳ではなく、今までもやってきたことを意識づけしただけ。
現実にはそのメッセージも限界はある気はするので、まだまだ悩み中。:cyclone:
## まとめ
ここまで書いたけど、今回私が始めた 1 on 1 は「上司と部下」ではなく、自分含めた4人チームのリーダーとメンバーなので、そのままでは使えない。例えば中長期にキャリアのことを話して欲しいなど。
とは言え、知識の整理や、心の拠り所にはなったので、実践や他のインプットも含めてやっていきます。
{{< amazon asin="B0716B52LP" title="ヤフーの1on1―――部下を成長させるコミュニケーションの技法" >}}
## 自分用読書メモ
> 1 on 1 では、考えを深めるツールとして「言い換え」をよく使う。
へー
> ヤフーでは、「アサインよりチョイス」と言っています。
めちゃめちゃええやないか。。。私もアサインという言葉は好きではない。
> 日本語での会話は、主語を省略することが多いので、カギとなるセンテンスでは、あえて主語を明確にすることによって、それが部下の本音なのかどうかを確認しています。
細かいけど重要なテクニック
> 傾聴するとは、真剣に聞くことではないと思っています。むしろ、話の中身はまったく頭に入れず「へえ」「そうなんだ」と返事をしていれば、話している側は勝手に内省を深めていくこともある。
面白い。
> しかし、あまり間隔が空きすぎるのは望ましくありません。最低でも3週間に1度は行うようにします。
ですよね。私の場合だと 1 on 1 の相手とも話して、一旦2週間に1度にしました。
> Q10. 1 on 1で知りえた部下のプライベートな話は、どの程度周囲と共有してもいいのでしょうか?
>
> A. 共有してはいけません。
ですよね。:sweat_smile: 私は第一回の 1 on 1 の時に、前提のひとつとしてお伝えしました。
--------------------------------------------------------------------------------
title: "チームのスピードを下げさせない3つの大原則"
date: "2023-03-19"
--------------------------------------------------------------------------------
前職フィードフォースで働いていた時から、チームを移動した後に見えた光景に「ああ...」という気持ちになることがあり、結果的にやっていることがあります。
フィードフォースの時もこんな記事を書きましたが、esa の社内記事に置いてきてしまったので、アップデートを加えつつまとめます。
この記事に触発される人には言わずもがなですが、どれも**最初の現状把握のあとに行動することが重要**です。現状把握なしの行動は、逆にチームのスピードを下げる可能性が高くなりますから...。
## (1) ノイズを減らす
まずはとにかくノイズを減らし、重要でない情報を目に入れないようにします。無意識のうちに集中が削がれるからです。
### 不要な記事はアーカイブもしくは削除
例えば、古くなったり要らなくなった社内記事はアーカイブもしくは削除します。
削除の判断は難しいことが多いので、アーカイブできるサービスを使うことが重要です。そういう意味では[アーカイブすると検索スコアが下がる esa.io](https://docs.esa.io/posts/389#%E4%B8%8D%E8%A6%81%E3%81%AA%E8%A8%98%E4%BA%8B%E3%81%AF%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F) は秀逸でした。検索対象から外さないのが素晴らしかったです。
### Slack channel をまとめる
Slack channel をまとめるのも良いでしょう。例えばめったに来ない通知用の channel をアーカイブし、チーム用の channel にマージするなど。
### メールのノイズも減らす
個人ではメールのノイズも減らします。不要なメルマガは停止したり、停止できないメールは Gmail のフィルター等で目に入れないようにしたり。gmailctl {{< post "2022-02-13-1" >}} のようなツールで、フィルターをコード管理すると意外と楽しくできたりはします。インボックスゼロを保つことが重要です。
## (2) リンクを添えることを日常とする
社内記事や、Slack や GitHub でのコミュニケーションの際は、リンクを添えることを日常として下さい。
### 読み手に情報源を推測させない
例えば Slack で何か書いた時に、読み手に情報源を推測させないようにします。書き手はリンクを添えて、読み手に情報源を見に行く選択肢を作ります。書く回数は 1 回ですが、読まれる回数は多くのケースで 1 回よりも多いです。
これが根付くと、情報をいもづる式に辿ることが出来るため、情報取得の難易度が下がります。出来てない場合は、辿れず諦めるケースも多いかと思います。「誰かに聞けば分かる」みたいな、属人性が根付いてしまう危険性もあります。
### 古くなった文書を敢えて削除しない
少し発展的な使い方としては、古くなった文書や Google スプレッドシートは削除せず、新しい文書へのリンクを張り、誘導するのもとても良いです。古くなった文書をそのまま放置するのが、一番良くありません。
### 導線を作るのも良い
なにか形が見えてきたら導線を作るのも良いでしょう。先月入社した会社では、一ヶ月かけてようやくこんな導線を作ることが出来ました。逆に言えばなかったので、最初の現状把握がとても大変でした。
```
チームのホームとなる Slack channel(新規作成)
↓ channel bookmark
チームのホームとなる社内記事(新規作成)
↓
チームの GitHub リポジトリまとめ社内記事(新規作成)
↓
各 GitHub リポジトリ の About に LookML プロジェクトの URL を追記
↓
各 LookML プロジェクト
```
## (3) 情報はできるだけ一ヶ所にする
現状把握が進み、文書をリンクで繋いだり、導線を作ったりしたら、いろいろ見えてくるものが出来てきます。例えば重複した文書を1つにまとめたり、似た情報の距離を近くしたり。
### 具体的な取り込み例
前職や現職では、こんな取り組みをしました。
* LookML プロジェクトと紐づく BigQuery の Table Scheme は同じ GitHub リポジトリで管理した
* [Looker User Meetup Online #8 で『BigQuery経由で使うGoogleスプレッドシートのスキーマ管理』の話をした - Feedforce Developer Blog](https://developer.feedforce.jp/entry/2022/07/21/210000)(スライド P19)
* コード管理されておらず、置き場がない SQL 用の GitHub リポジトリを作った
### GitHub Wiki は使わない
社内記事用のツールを分散させないことも重要です。
例えば私は会社では GitHub Wiki を使いません。GitHub リポジトリの Settigns から Wiki 機能自体を Disable にします。
既存の社内記事と分散するのもそうですが、GitHub Wiki は変更しても通知が飛ばないのと、ページを跨いだ Diff URL を組み立てるのが面倒だからです。
GitHub と紐づく情報は社内記事に記載し README.md からリンクを張るか、GitHub リポジトリに `.md` ファイルを作ります。両者の使い分けはケースバイケースです。
更新頻度が高かったりガイドラインのような情報だったら社内記事、API ドキュメントや Scheme 定義のように Pull Request でまとめて差分を表現したい時は GitHub リポジトリの `.md` ファイルなど。
## まとめと考察
「チームのスピードを下げさせない3つの大原則」をまとめました。
マネージャーやチームリーダーは、チームにこれらの仕掛けをしたり習慣を根付かせることで、チームのスピードを下げさせないことが重要だと思います。
すでにチームのスピードが高くない場合でも、実践することで積もり積もってスピードが上がるはずです。実感としては「気づいたら上がっていた」かな。
今回の大原則を踏まえれば、さらにチームが良くなる可能性があります。再現性もありそうです。
以下は例です。
* チームメンバーでも他メンバーの状況を把握しやすくなるので、今までより短時間で密度の濃い朝会が出来る
* KPT などの振り返りで、メンバー間で改善ポイントを話しやすくなる
* 余裕が出来て、情報共有会などで相互に高め合う取り組みが生まれる
* 既存技術や新しい技術、ドキュメントライティング {{}} の共有など
--------------------------------------------------------------------------------
title: "『エンジニアのためのドキュメントライティング』を読んだ"
date: "2023-03-12"
--------------------------------------------------------------------------------
訳者である岩瀬さんのツイートをたまたま拝見し、ちょうど先月入社した会社の部署で大きな課題だと感じていたところだったので、購入して斜め読みした。
{{< tweet user="iwashi86" id="1634322683352748032" >}}
本書の対象者は、ドキュメントを書くエンジニアやテクニカルライターではあるけど、ユーザー向けドキュメントのようにある程度の規模が想定されているように思う。
私が感じた課題はもっと原始的で、GitHub リポジトリに README.md がなく、どのような README.md を書けば良いか伝える方法を模索していたので、本書がど真ん中だったわけではなかった。
※ 今は、既存ドキュメントへのリンクを張るくらいで良いので、まずは README.md を作るようにチームメンバーなどに伝えている。でもその先が難しい...。
ただ、最後の付録Bに出てきた「README チェックリスト」はチームメンバーへの説明のヒントになるかもしれない。良さそう。
{{< github_repo "ddbeck/readme-checklist" >}}
ちなみに自分がドキュメントを作る時はこんな流れ。これでは伝わらない。:sweat_smile:
1. 概要や書きたいことをとりあえず書いてみて、あれこれ並べる
1. やっているうちに見出しが見えてくるので、文書構造を作っていく
* 文書自体はできるだけリストではなく、パラグラフ記法 {{}} を使います
1. 詳細化したり、逆にバッサリ削除して、完成に近づけていく
読み手目線で書くだけではあるのだけど、それが難しいのだよね。書いたその日じゃなくて、次の日の少し冷静になった頭でもう一度読むなどの細かいテクニックはあるのだけど。
ドキュメントライティングに課題を感じている人は、何かのヒントになるかもしれないので読むと良いかも。
{{< amazon asin="B0BXSYF2N4" title="ユーザーの問題解決とプロダクトの成功を導く エンジニアのためのドキュメントライティング" >}}
--------------------------------------------------------------------------------
title: "WORKAHOLIC でコンシェルジュサービスを受けて、ハイエンドオフィスチェアを購入した"
date: "2023-02-26"
--------------------------------------------------------------------------------
{{< post "2023-01-31-1">}} に書いたとおり、先月は前職の最終出社月でまるまる有給消化していたので 、平日に [WORKAHOLIC](https://www.iamworkaholic.jp/) というオフィスチェアのコンシェルジュサービスを体験してきました。
時間があったのもそうですが、去年の 6 月から急に背中のおかしなハリや首の痛みが耐え難くなったからです。おまけに微熱も続き、結果的に整骨院で直ったのですが、それはまた別のお話で。
{{< tweet user="masutaka" id="1612719542593277952" >}}
## 予約〜来店
[WORKAHOLIC](https://www.iamworkaholic.jp/) のコンシェルジュサービスは完全予約制かつ有料制です。 [2021-09-01 からそうなった](https://www.iamworkaholic.jp/news/65/)ようです。電話もしくはウェブのフォームから予約します。2 時間 3,300 円。椅子は買わなくても問題ありません。
結構人気があるようで土日は予約が埋まりがちです。前述の通り有給消化期間だったので、平日の 1/10(火)13:00-15:00 で予約しました。
店舗の場所は秋葉原の隣駅、浅草橋から約 4 分です。着くと物静かなコンシェルジュの方が迎えてくれ、高さ調節が出来る机が、あらかじめ伝えておいた自宅の机と同じ高さに準備されていました。
そこで正しい椅子のセッティング方法を聞いたり、店舗に数ある椅子を試座して質問などしていました。ほとんどの時間を試座に使ったと思います。
## 購入〜到着
先入観を避けるために敢えて値段を見ずに試座を重ね、その場で購入したのがこちら。227,480 円です。た、高けぇ...。:scream:
{{< amazon asin="B08T9JG8C8" title="オカムラ オフィスチェア コンテッサ セコンダ 可動肘 エクストラハイバック ウレタンキャスター仕様 クッション イエロー CC87XZ-FPD9" >}}
_※ [オカムラのページはこちら](https://product.okamura.co.jp/ext/DispCate.do?volumeName=00001&lv0=%E3%83%81%E3%82%A7%E3%82%A2%EF%BC%8F%E3%82%BD%E3%83%95%E3%82%A1&lv2=%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%81%E3%82%A7%E3%82%A2&lv3=%E3%82%B3%E3%83%B3%E3%83%86%E3%83%83%E3%82%B5+%E3%82%BB%E3%82%B3%E3%83%B3%E3%83%80)_
最終的に 10 万円程度のバロンとの二択になりました。バロンも悪くはないのですが、座り心地が硬く、仕事以外のリラックスする時に座ることを考えてコンテッサセコンダにしました。もっと安い選択肢があっただろうことは認めます。
以前の椅子は 2 万円程度だったので、10 倍以上です。まさか自分がこんなに高い椅子を買うとは思ってもいませんでした。:sweat_smile:
そんな椅子が到着したのは 2/4(土)です。聞いていた 2 月下旬よりずっと早かったです。
## 3 週間使った感想
以前の椅子、{{< amazon_link asin="B00BS29UK0" title="同じオカムラのビラージュ" >}}が結構ひどかった事情がありました。
* 座面を調節できず、お尻を背面につけると膝が伸びてしまう。逆に膝裏を座面に合わせるとお尻の置き場所が安定しない
* 座面の素材がツルツルしている上、なぜか真ん中が盛り上がっていて滑りやすいので、無意識に力んでいた可能性がある
* テレビで YouTube を見る時などリラックスする時に、背面を倒した状態て固定できない。ヘッドレストもないので、頭の置き場所に困る
どうして 6 年以上も使っていたのか。:innocent:
一方のコンテッサセコンダはもちろん全部解決できています。
* 座面を調節して、お尻を背面に付けられるようになった。安定感が全然違う
* 背面を倒した状態でもちろん固定できるし、ヘッドレストがあるので頭の置き場所もある
とは言え、PC 作業中は背中をベッタリ椅子に付けずに、自立するようにしています。
あまりに楽な姿勢だと腸腰筋などのインナーマッスルを使う機会が減り、肩甲骨周辺や首の痛みが再発する恐れがあるからです。整骨院でのトレーニングで(多分)インナーマッスルをうまく使えるようになり、以前よりはマシになったので、できるだけ維持したい気持ちがあります。
*もっと言うと、整骨院の先生的には座りやすい椅子はかなりオススメしていませんでした。そういうわけで買ったことはあまり話していません。:sweat_smile:*
## まとめ
[WORKAHOLIC](https://www.iamworkaholic.jp/) でコンシェルジュサービスを受けて、ハイエンドオフィスチェアを購入しました。
総じて満足していますが、我ながら椅子に 20 万円もかけるのはいかがなものかと思います。:sweat_smile:
コンシェルジュサービスを受けつつ、あれだけの椅子を試座できる機会はあまりないでしょうし、椅子を買わない選択肢はもちろんあるので、興味ある方は体験してみると良いと思いました。
--------------------------------------------------------------------------------
title: "株式会社フィードフォースを退職しました"
date: "2023-01-31"
--------------------------------------------------------------------------------
本日 2023 年 1 月 31 日をもって、[株式会社フィードフォース](https://www.feedforce.jp/)を退職しました。退職は人生 3 回目で {{< post "2014-03-09-1" >}} に書いたラングリッチ以来です。
入社が 2014 年 3 月 1 日なので、8 年 11 ヶ月在籍していたことになります。新卒で入社したメタテクノの 11 年に続く長さです。
こんなに長く在籍するとは思ってもおらず、配属されたチームで目の前の課題に向き合っていたら、結果的にこれだけの期間在籍することとなりました。
いろいろ足りないところはあったと思いますが、フィードフォースならびに仕事で関わった皆様、これまでありがとうございました。楽しかったです。これからは一株主として応援しますし、将来また仕事で関わることもあるかもしれません。
## これまでのロールを振り返る
[About]({{< relref "about.md" >}})
新卒で入社したメタテクノでは、2000 年 4 月から 2011 年 初めまで、組み込みソフトウェアエンジニアとしての経験を積みました。
次の会社ラングリッチからフィードフォース中盤の 2011 年半ばから 2020 年 3 月までは、Web のバックエンドやインフラまわりのエンジニアとしての経験を積みました。
フィードフォースの後半 2020 年 4 月から 2023 年 1 月までは、LookML 開発を中心としてデータエンジニアとしての経験を積み、これは次の会社でも続く予定です。
こうして振り返ると 10 年周期で、ソフトウェアエンジニアとしてのロールが変わっていることが分かります。
全く計画的ではなく、内発的か外発的かの違いはあれど「なんとなく面白そう」が動機です。経験を積んだり信頼を貯めたりして、どうにか「きっかけ」を掴んできたのだと思います。
共通するのが本業と並行して、チームや会社を便利にすること。
* メタテクノでは UNIX ネットワークの管理者に立候補し、自発的にサーバーの保守やアップデート、便利ツールのインストールなどをした。チーム向けに自動テスト環境を作ったこともあった
* ラングリッチでは Redmine や Jenkins を導入し、アップデートにも追随した
* フィードフォースでは GitHub や CircleCI、Qiita:Team などを導入し、その後の運用にも責任を持った
データエンジニアもその側面があると思うので、何かが繋がった気がしました。
## 意識的なアウトプット
フィードフォース在籍中は出来るだけ情報をアウトプットすることを心がけました。
Heroku を使うプロダクトに所属していた時は、まずはチームで一番 Heroku に詳しい人になることを目標とし、社外でも登壇やブログ記事などアウトプットしました。当時の国内では一番アウトプットしていたかもしれません。
* [Feedforce Developer Blog > Heroku](https://developer.feedforce.jp/archive/category/Heroku)
* {{< tag name="Heroku" text="マスタカの ChangeLog メモ > Heroku" >}}
Looker に出会ってからもブログは書き続け、一度[オンラインで登壇する機会](https://developer.feedforce.jp/entry/2022/07/21/210000)も得ました。
* [Feedforce Developer Blog > Looker](https://developer.feedforce.jp/archive/category/Looker)
さらに戦略的に、勝手に「Looker エバンジェリスト」を名乗ることにし、[Twitter での発信](https://twitter.com/search?q=from%3Amasutaka%20Looker%20OR%20LookML&src=typed_query&f=live)も増やしていきました。
{{< tweet user="masutaka" id="1550357627779284992" >}}
以上の活動が、結果的に良い方向に転じたと思います。
## 次の会社は?
明日 2 月 1 日から、Fintech 系の会社[^1]で働き始めます。引き続き Looker に関わりつつ、データエンジニアとしてのスキルを広げる予定です。
[^1]: Fintech という性格上、会社名は公表しません。気になる方は個別にお知らせください。:-)
住む場所は今までと変わらず、今度は完全フルリモートワークでオフィスに行くことはなさそうです。
数千人規模の会社で働くのは初めてなので、期待と不安が半々といったところです。余談ですが、入社前の手続きやパソコンのセットアップは、今までと全然違って面白かったです。
というわけで、これからのマスタカにご期待ください。:pray::smile::pray:
## 追記(2023-03-11): フィードフォースのインタビュー記事が公開されました
年末に受けたインタビュー記事が公開されました。よろしければご覧下さい。:pray:
{{< note "n0d9c8fc5c268" >}}
--------------------------------------------------------------------------------
title: "『Web3とメタバースは人間を自由にするか』を読んだ"
date: "2023-01-13"
--------------------------------------------------------------------------------
{{< post "2022-03-06-1" >}} にも書いたとおり、[佐々木俊尚さんの Voicy](https://voicy.jp/channel/2185) をなんとなく毎日聞いています。Web3 関係の本を出したということで、なんとなく買って読んでみました。それについての読書メモ。
{{< amazon asin="B0BMPQ9CTP" title="Web3とメタバースは人間を自由にするか" >}}
「現在のウェブ3は、単なる権力奪取ゲームにすぎないと断言してもいいと考えている」には完全に同意。歴史好きの私としては、似たようなことが形を変えて螺旋状に続くと考えているので、ユートピアは来ないと思っています。
他もだいたい同意なんですが、自分の認識不足のこととしては「Zoom が平板な画面を並べているだけの二次元のオンラインミーティング」で「平面で全員が並んでいる」ということ。深く考えていなかったけど、現実のミーティングを再現しきれてなかったですね。
メタバースが究極的に進化すると、現実世界のミーティングや飲み会との差が少なくなるのかなと思いました。どの程度少なくなるのかは、とても興味があります。帰省とか楽になると良いな。
現時点では胡散臭く進化も不十分な Web3 やメタバースだけど、距離に関係する課題を解決できると良いですね。
ちなみに、人と人のあいだの距離は4つに分類できるそう。
| | | |
|---|---|---|
| 密接距離 | ↑ 近い | |
| 個体距離 | | メタバース |
| 社会距離 | | 例: Zoom |
| 公衆距離 | ↓ 遠い | |
他も Web3 のトークンエコノミーとは贈与経済ではないか?という話も興味深かったです。貨幣経済が「等価」という概念を生んでしまったことで、人間関係を持続させる手立てをひとつ失ってしまった。「貸し借り」を意識しづらくなる。なるほどね。
--------------------------------------------------------------------------------
title: "大腸カメラ飲んだ ٩(๑❛ᴗ❛๑)۶ Season2 〜2 泊 3 日の緊急入院〜"
date: "2022-12-28"
--------------------------------------------------------------------------------
{{}} に引き続き、また健康診断で便に潜血が見つかったので検査を受けてきました。
実は 3 年くらい前にも引っかかっていたのですが、また誤検知な気がするのと、なにより準備と検査が大変なことを知ってしまったのでスルーしてました。あかん。:roll_eyes:
:bulb: 今回は閲覧注意な内容ではないと思います。
## 前回との差分
| | 前回 | 今回 |
|---|---|---|
| 病院 | [河北総合病院](http://www.kawakita.or.jp/) | [荒川外科肛門医院](https://www.ara-kou.com/) |
| 洗浄剤 | ムーベン | [モビプレップ®](https://www.eapharma.co.jp/patient/treatment/moviprep) |
| 麻酔の方法 | 注射 | 点滴 |
病院を変えたのは、世田谷区から荒川区に引っ越していたからです。歩いて 10 分ちょっとなのでだいぶ近くなりました。
洗浄剤はモビプレップでした。ほんのり梅干しの味がするので、自分は少し苦手でしたね。ムーベンはつい最近の 2022-10-11 に販売中止になってたのですね[^1]。レモン味で飲みやすかったのに...。
[^1]: [武田薬品、後発品「ムーベン配合内用液」の販売中止 新薬に注力するため | 日刊薬業 - 医薬品産業の総合情報サイト](https://nk.jiho.jp/article/175068)
麻酔は後述します。
## 準備から検査まで
前日の昼と夜は配給食でした。昼がクラッカーと野菜のクリーム煮、夜が鳥雑炊と大根のそぼろ煮です。amazon.co.jp で発見。
{{< amazon asin="B072XFFWR7" title="【大腸内視鏡検査食】ダルムスペースデリシア 昼食+夕食 2食セット 1箱 ニッポンハム " >}}
当日はなんと 6:00 過ぎに起きました。11:30 受付の関係で、6:30 から洗浄剤を飲むよう指示があったからです。前回は 8:00 起床、14:20 受付でした。内容はアレだし、前回とだいたい同じなので省略します。
受付後、検査の前に点滴を打たれます。まだ麻酔ではないとのこと。
前回の検査は医師と看護師で 2 人くらいだったのに対して、今回は看護師が多め。
検査が始まり、点滴が麻酔[^2]に切り替わりました。なぜか喉の奥がカ〜ッとしてきて、1 分も立たないうちに検査が終わりました。え?と思ったら実は麻酔で意識が飛んでいて、実際は 15~20 分くらい経っていたようです。
[^2]: 後日改めて同意書を確認したら「鎮痛薬(ペチジン)や鎮静薬(ドルミカム)を使用」とありました。
まだはっきりしない意識の中、ポリープがあったので切除したみたいなことを看護師から伝えられました。その後数分で意識は復活。痛みや違和感などはありません。
着替えた後で、大腸内部やポリープの写真を院長から見せられつつ、1cm のポリープを切除したこと、これから 2 泊 3 日の緊急入院だと告げられました。
え、緊急入院!?:flushed:
## 突然の入院
入院なんて人生初です。年末にビッグイベント到来や!:sob:
とは言え、命に危険が迫っている訳ではなく、以下の偶発症に対応するためのようです。
* ① 出血:0.007%(ポリープ切除による出血:1~2%)
* ② 穿孔:0.02%(約 5000 人に 1 人)
* ③ ショック:0.0009%
「2 泊 3 日ならなんとかなるっしょ!」と思うことにしました。
もちろん入院の準備などしていなかったので、歩いて 10 分ちょっとの自宅に戻って、必要最小限の物資を持ってくることになりました。引き続き、痛みは全く感じません。
部屋着や着替え、洗面用具、スマホ充電器などは良いとして、イヤホンは絶対に忘れてはいけません。個室以外は迷惑になってしまうので。4F に販売機はあるそうでしたが。
今回忘れたのはコップです。部屋の外に自動給茶機があるのですが、コップがないので使えません。看護師さんが紙コップとペットボトルの水をくれました。優しい。2 日目に自動販売機も見つけました。
使い捨ての室内履きにしたのも失敗でした。落ち着きません。普通のサンダルが良いです。
Kindle で本を読もうと、タブレットは持っていきましたが、そんな気分にはなれず全く読めませんでした。
## 短くも辛い入院生活
入院中は 9:00 と 16:00 くらいに診察がありました。一度も出血は観察されませんでした。
他は何もすることがない入院生活。楽しみと言えば食事でしょう。ということで今回のメニューをどうぞ!!1
| | 朝食 | 昼食 | 夕食 |
|---|---|---|---|
| 1 日目 | x | (入院→)水分 | 水分 |
| 2 日目 | 水分 | ヨーグルト・スープ | ヨーグルト・スープ |
| 3 日目 | ヨーグルト・スープ(→退院) | おかゆ | おかゆ |
*※ 水分とは水またはお茶のこと、ヨーグルトは加糖の小が 2 個、スープは具なし*
水分って食事だったんですね...。(白目
出血のリスクを避けるためか、極力モノを食べない入院生活でした。1 日 1 回点滴があり、必要最小限の栄養と止血剤が入っています。余談ですが、最終日に看護師さんにカロリーを聞いてみたら、87kcal 程度でした。必要最小限とは...。:sweat_smile:
不思議なことに、そこまで空腹感は感じずに入院生活を乗り切ることが出来ました。
それよりも辛いのが点滴用の針です。毎回刺されるわけではなく、常に腕に刺しっぱなしで点滴時に管が装着されます。結局慣れることはなく、血管を突き抜けそうな小さな不安と、若干の痛みが気になって、緊張状態が途切れませんでした。
さらに辛いのがシャワーを浴びれなかったことです。冬の 2 泊 3 日だとそういうものなのでしょう。私は結構神経質なので、特に頭がどんどん油っぽくなっていくことはなかなかのストレスでした。
一番辛かったのは、謎の頭痛と肩凝りです。なぜこんな時に...。緊張状態に加えて、YouTube 見過ぎで目が疲れたのかも。あ、Wi-Fi は使えました。:+1:
あと、私はイビキが全くない無音人間なので大部屋(3 人部屋)にしたのですが、実際は逆でイビキの二重奏でなかなか寝付けませんでした。無音人間こそ個室が良いのかも知れません。一泊 +13,000 円くらいかかるみたいですがね...。
大部屋自体は悪くなく、自分のスペースは十分にありました。カーテンで見えない隣の人とも 3m くらいは離れていました。
## 待ちに待った退院
退院当日は 6:00 から点滴が始まります。「早く早く...」と 1 時間半弱、点滴が落ちる様子を眺めていました。ディストピア感があります。
点滴が終わったら 8:00 から朝食です。今回も誰よりも早く、3 分もかからずに具なしのスープとヨーグルトを完食です。ごちそうさま。
あとは帰る支度をして 8:45 からの診察を待つだけです。やることもなく 30 分も前に 1F に着いたので、看護師さんに許可を取り、コンビニ ATM から入院費を下ろしてきました。入院費は健康保険適用で 34,000 円ほどです。
診察はすぐに終わり、また診察してくださった院長に書き溜めていた質問をしました。
* Q. 一般的に便の潜血はポリープが原因なのか
* A. そうでない可能性の方が高い。今回のような検査は症状発見の良い機会だと考えている
* Q. ここ数年便秘が続いていたが、ポリープは関係するものか
* A. 全く関係ないですね
* Q. 残りの薬は飲み切る認識で合っているか
* A. Yes
* Q. このあと何を食べてよいのか
* A. 明朝までおかゆですね。その後は常食に戻して良いです[^3]
* Q. 軽い筋トレはやって良いか
* A. 切除から一週間禁止です
* Q. シャワーは浴びて良いか
* A. この後すぐ浴びて良いです。入浴は明日からオーケー
[^3]: 看護師さんから初日に紙をもらっていたのですが、気づかず質問してしまいました :bow:
実際にはニコニコと、穏やかに答えてくれました。:relaxed:
シャワーはうれしかったですね。食事はがっくりしました。軽めにセブンのうどんにしようかなーとか、ルンルンで考えていたのに。:sweat_smile:
## 病理検査の結果 → OK
結果は全く問題なし。
こんな分類だそうで、今回は「炎症性ポリープ」でした。経過観察のため、1 年後にまた検査を受けに来て下さいとのこと。
| | | | |
|---|---|---|---|
| | 過形成ポリープ | がん化する可能性の少ないポリープ | 良性 |
| 今回 | 炎症性ポリープ | 〃 | 〃 |
| | 腺腫 | がん化する可能性があるポリープ | 良性(境界) |
| | 粘膜内がん | 早期がん(内視鏡治療可能) | 悪性 |
| | 粘膜下層がん | 早期がん(手術が必要な場合があります) | 〃 |
## まとめ
ポリープは見つかったものの短時間且つ無痛で切除が終わり、予想外の緊急入院となったものの年内にケリをつけられて本当に良かったです。荒川外科肛門医院の医師や看護師の皆さんには、良くして下さって感謝しています。
当初は 2 泊 3 日の入院なら勢いでなんとかなると思いました。過ぎてしまえばあっという間ですが、入院中は辛かったです。退院して外を歩いている時、「人は退院していること自体が幸せなのだ」と幸せを噛み締めました。:laughing:
今後は検診でひっかかったら素直に検査してもらいます。3 年前だったらまだポリープが小さく、聞いた話だと日帰りで済んだ可能性はありそうでしたから。その後 2 日くらいの絶食は入院よりもマシです。
--------------------------------------------------------------------------------
title: "『プログラミング経験者のためのPython最速入門』を読んだ"
date: "2022-11-29"
--------------------------------------------------------------------------------
Python は今まで雰囲気で読んでいて、データまわりだとちょいちょい出てくるので購入した。購入したと言っても ¥250 と破格な上、kindle unlimited だと無料。
{{< amazon asin="B01M7WU1K4" title="プログラミング経験者のためのPython最速入門" >}}
63 ページと短いので 1 時間もかからずに読めた。
プログラミング経験者がなる早でつまみ食いするには良いかも。さすがにもう変数の説明から読むのはしんどいからね。デコレータや引数や戻り値の型指定など、書かれていないことはあるけど、必要あれば起点に深堀りすればよい。
こういうさくっと読める本好き。
--------------------------------------------------------------------------------
title: "『実践的データ基盤への処方箋』を読んだ"
date: "2022-11-27"
--------------------------------------------------------------------------------
読もうと思ったきっかけは忘れましたが、{{< post "2020-12-20-1" >}} の『{{< amazon_link asin="B085W4YSZJ" title="データマネジメントが30分でわかる本" >}}』のゆずたそさんが共著者だったのもあって購入しました。
{{< amazon asin="B09MSX9MQV" title="実践的データ基盤への処方箋〜 ビジネス価値創出のためのデータ・システム・ヒトのノウハウ" >}}
この 2 年半、ひとりで広告データ基盤を作ってきた答え合わせや整理が出来た気がしました。
例えば、用語としては知っていたデータレイク、データウェアハウス、データマートが、自分が作ったデータ基盤にも当てはまっており、それほど変な設計ではなかったこと。
{{< tweet user="masutaka" id="1592721120091770880" >}}
今の会社のデータ活用成熟度が、どの程度なのかも分かりました。(レベル1でした)
ついでに Airflow がよく使われていると知ったので、ローカルの Docker 環境と GCP の Cloud Composer を少し使ってみるなど。
https://github.com/masutaka/trial-airflow
{{< github_repo "masutaka/trial-airflow" >}}
ひとりもしくは少人数で日々奮闘している人こそ、読むと発見がある本かも知れません。
--------------------------------------------------------------------------------
title: "Heroku から Cloud Run に移行して、料金は本当に3分の1になったのか"
date: "2022-11-04"
--------------------------------------------------------------------------------
{{< post "2022-10-01-1" >}} にも書いたとおり、このブログを『CloudFront+Heroku』から『Cloud Run』に移行して一ヶ月ほど経ちました。
社内勉強会のお題にした、『引っ越ししたら家賃が3分の1になったかも』が実際どうだったのか、10 月の Google Cloud 料金を振り返っていきます。
{{< hatenablog title="自分のブログを CloudFront + Heroku から Cloud Run に移行した話をした - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2022/09/30/180000" >}}
## 結論
結論から書くと、あまり変わりませんでした。/(^o^)\
移行前:
Heroku の `$7/mo ≒ ¥1,015` のみ (1ドル145円換算)。CloudFront は無料枠内。
移行後:
Cloud Run の 10 月料金は `¥1,071` だった。
## 内訳
10 月の日別累積グラフです。

Top 5 の抜粋です。
1. Cloud Run Network Internet Egress Intercontinental (Excl Oceania and China)
2. Cloud Run Network Internet Egress AsiaPacific to AsiaPacific
3. CPU Allocation Time
4. Cloud Run Network Internet Egress Intercontinental to China
5. Cloud Run Network Inter Region Egress Intercontinental (Excl Oceania)
予想外に Network Egress がほとんどを占めていました。つまり、このブログの HTML や画像などの Google Cloud からインターネットへの転送料金です。
一番かかると予想していた CPU Allocation Time はわずかに ¥174 で、[Cloud Run の無料枠内](https://cloud.google.com/run/pricing?hl=ja)に収まっていました。
※ このブログが日本国外から需要があるとは思えないので、`1`, `4`, `5` は無駄な支払いの気はしなくもないです。
## まとめ
Heroku から Cloud Run に移行しても料金に変わりはありませんでした。料金を安くすることは目的ではなかったので、特に不満はありません。
現在は CDN (CloudFront) を使っていないため、以前と比べてアクセス数増加が料金に反映されやすい状況です。インフラとしては何かが良くなったわけではなく、新しい環境になって気分一新したくらいです。
勉強会の資料にも書きましたが、Google Cloud で CDN を使うためにはロードバランサーが必須で最低 `¥3,000/mo` 程度かかります。
Google Cloud の予算アラートはもちろん設定しているので、今後料金が高止まりするようであればまたどこかに引っ越します。:dash:
--------------------------------------------------------------------------------
title: "水出し緑茶が思ったより簡単に作れて、ペットボトルのお茶を買うのを止められた話"
date: "2022-10-17"
--------------------------------------------------------------------------------
ペットボトルのお茶を途切れさせずに、買い続けるのがずっと面倒でした。
途切れないように 2L のペットボトルを 2 本買うと重いし、現代日本には水道が通っているのに水を配達してもらうのもなんか違う気がするしで、ずっとモヤモヤしてました。
そういえば去年{{< amazon_link asin="B08GX731H1" title="ソーダストリーム" >}}を買って、ずっと水道水を飲み続けています。静岡出身ですが、東京の水が不味いと思ったこともありません。
それならばと買ったのが、この 2L のピッチャーです。茶こしがついています。
{{< amazon asin="B00T8RUFTW" title="岩崎 冷水筒 フェローズ タテヨコ・茶こし付ハンドルピッチャー 2.2L ネクスト K-1297MC" >}}
水出し緑茶を作るのはすごく簡単で、2L の水に対して 13g のお茶っ葉を入れ、半日〜丸1日経ったら茶こしを引き上げるだけです。引き上げ忘れても問題ないです。お茶っ葉はもっと少なくても良い気がしますし、安いので十分です。
ただ、このピッチャー自体は作りが若干甘くて、うまく注げずにこぼれることがあります。それもまた良し。
冷蔵庫が許すならば、2L のピッチャーを 1 本より、1L のピッチャーを 2 本のほうがローテーションできて良いと思います。
冷たいお茶は冬もそれなりに飲むので、これからも活躍しそうです。
--------------------------------------------------------------------------------
title: "このブログを『CloudFront+Heroku』から『Cloud Run』に移して知った Google のドメイン豆知識"
date: "2022-10-01"
--------------------------------------------------------------------------------
昨日社内勉強会でこんな発表をしました。いつもどおり右上の [History]({{< ref "/history.md" >}}) を更新しました。
{{< hatenablog title="自分のブログを CloudFront + Heroku から Cloud Run に移行した話をした - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2022/09/30/180000" >}}
スライド: 39 にもありますが、Google Cloud の [Cloud Run](https://cloud.google.com/run) への移行の他に、ドメインも [Amazon Route 53](https://aws.amazon.com/jp/route53/) から [Google Domains](https://domains.google/) に移行しました。これで上から下まで全部 Google になりました。
少し気になって Cloud Run のカスタムドメインとして設定した `masutaka.net` を辿ったら面白いことを知ったので、この記事にメモとして残します。
## masutaka.net を辿る旅
dig コマンドを使うと、`masutaka.net` が Google Domains のネームサーバーを使っていることを確認できます。
```console
$ dig -t NS masutaka.net
(snip)
;; ANSWER SECTION:
masutaka.net. 21399 IN NS ns-cloud-b4.googledomains.com.
masutaka.net. 21399 IN NS ns-cloud-b1.googledomains.com.
masutaka.net. 21399 IN NS ns-cloud-b2.googledomains.com.
masutaka.net. 21399 IN NS ns-cloud-b3.googledomains.com.
(snip)
```
普通に dig するとこうです。
```console
$ dig masutaka.net
(snip)
;; ANSWER SECTION:
masutaka.net. 279 IN A 216.239.36.21
masutaka.net. 279 IN A 216.239.32.21
masutaka.net. 279 IN A 216.239.34.21
masutaka.net. 279 IN A 216.239.38.21
(snip)
```
IP アドレスを逆引きしてみます。
```console
$ dig -x 216.239.32.21
(snip)
;; ANSWER SECTION:
21.32.239.216.in-addr.arpa. 86400 IN PTR any-in-2015.1e100.net.
(snip)
```
見慣れないドメイン `1e100.net` が出てきました。何でしょう?
## 1e100.net とは何か
`1e100.net` とは何でしょう?調べたら由来が興味深かったです。
:link: [What is 1e100.net? - Google ヘルプ](https://support.google.com/faqs/answer/174717?hl=ja)
> 1e100.net is a Google-owned domain name used to identify the servers in our network.
>
> Following standard industry practice, we make sure each IP address has a corresponding hostname. In October 2009, we started using a single domain name to identify our servers across all Google products, rather than use different product domains such as youtube.com, blogger.com, and google.com. We did this for two reasons: first, to keep things simpler, and second, to proactively improve security by protecting against potential threats such as cross-site scripting attacks.
>
> Most typical Internet users will never see 1e100.net, but we picked a Googley name for it just in case (1e100 is scientific notation for 1 googol).
>
> (DeepL 翻訳)
> 1e100.netは、Googleが所有するドメイン名で、当社のネットワーク内のサーバーを識別するために使用されます。
>
> 業界の標準的な慣行に従い、各IPアドレスに対応するホスト名があることを確認しています。2009年10月、Googleは、youtube.com、blogger.com、google.comといった異なる製品ドメインを使用せず、すべてのGoogle製品で単一のドメイン名を使用してサーバーを識別するようになりました。1つは、よりシンプルにするため、もう1つは、クロスサイトスクリプティング攻撃などの潜在的な脅威から保護することによって、セキュリティを積極的に向上させるためです。
>
> 一般的なインターネットユーザーが1e100.netを目にすることはありませんが、念のためGoogleyの名前を選びました(1e100は1 googolの科学的表記法です)。
なるほど。シンプルな設計にするためと、セキュリティ向上のために、Google のサービスはどれも `1e100.net` に行き着くようです。
「googolの科学的表記法」を調べました。
:link: [1e100.netとは - \[その他 + その他\] ぺんたん info](https://pentan.info/else/1e100_net.html)
> Google Inc.の『google』は、数学用語の『googol(グーゴル)』よりラリー・ペイジが命名したもので、『googol』とは10100を表す単位です。
> そしてこの10100を1e100とあらわして、『1e100.net』となったようです。
>
> Google → googol → 10100 → 1e100 → 1e100.net
へぇ!面白い!
## Cloud Run のドメインはどうなっている?
Cloud Run でサービスを作ると https://masutaka-net-xxxxxxxxxx-an.a.run.app のような URL が割り当てられます。このドメインも調べました。
```console
$ dig masutaka-net-xxxxxxxxxx-an.a.run.app
(snip)
;; ANSWER SECTION:
masutaka-net-xxxxxxxxxx-an.a.run.app. 19576 IN A 216.239.34.53
masutaka-net-xxxxxxxxxx-an.a.run.app. 19576 IN A 216.239.38.53
masutaka-net-xxxxxxxxxx-an.a.run.app. 19576 IN A 216.239.36.53
masutaka-net-xxxxxxxxxx-an.a.run.app. 19576 IN A 216.239.32.53
(snip)
```
逆引きします。
```console
$ dig -x 216.239.32.53
(snip)
;; ANSWER SECTION:
53.32.239.216.in-addr.arpa. 84358 IN PTR any-in-2035.1e100.net.
(snip)
```
やはり `1e100.net` に行き着きました。
記事にあるとおり、`youtube.com` や `gmail.com` も同じでした。
## まとめ
Google Domains に移行した `masutaka.net` を辿ったら、面白い豆知識を知りました。なにかのタイミングで話のネタに使えるかもしれません。
--------------------------------------------------------------------------------
title: "遮光カーテンを買った"
date: "2022-09-24"
--------------------------------------------------------------------------------
多分初めて遮光カーテンを買いました。設置した様子です。良さげです。

今までのカーテンは遮光でもなんでもなく、15 年くらい前に Francfranc あたりで買ったやつです。数年に 1 回は洗濯してましたし、そこまでボロボロでもなかったのですが、最近は平日の昼休みに昼寝することが多く、光が気になったので買いました。
## どこで買った?
当初は店頭で買おうと思ってましたが、結果的にググって見つけた「[ふくろうのカーテン](https://www.curtain-fukuro.jp/)」というECショップで買いました。
このショップさんを存じ上げなかったので若干不安はありましたが、HTML を確認したら前のプロジェクトで関わっていた [futureshop](https://www.future-shop.jp/) のショップのようだったので、大丈夫だろうと決めました。
## 何を買った?
「[防炎1級遮光カーテン](https://www.curtain-fukuro.jp/c/curtain/drape/0113260colore)」のエバーグリーン、サイズは 103cm x 186cm です。両開きなので 2 枚あります。完全遮光にはしていません。
お値段はサイズで変わります。今回は税込 ¥17,000 でした。格安を求めていたわけではないし、そう何度も買うものではないので、特に不満はありません。
でも引っ越して使えなくなったら嫌ですね。:sweat_drops:
## サイズに不安はなかった?
カーテンは高さを 1cm 間違えると、残念な感じになります。大学入学時に買ったカーテンは長すぎたので、縫って短くした思い出があります...。
店頭で買おうと思ったのもその不安からですが、かなりしっかり[カーテンサイズの測り方](https://www.curtain-fukuro.jp/f/size)がまとまっていたので、不安は減りました。
よくよく考えると店頭で確認できるのは色や質感くらいで、サイズは自分で測る必要がありますからね。
一番不安なのは自分の測り方だったので、何度も何度も測り直しました。:sweat_smile:
## まとめ
初めて遮光カーテンを買いました。カーテンをECショップで買ったのも初めてです。
設置するまで祈るような気持ちでしたが、サイズぴったり、色も落ち着いていて満足です。昼寝が待ち遠しいです。:relaxed:
--------------------------------------------------------------------------------
title: "Chromecast(第 3 世代)を Chromecast with Google TV に買い替えた"
date: "2022-09-19"
--------------------------------------------------------------------------------
先週 [Chromecast with Google TV](https://store.google.com/jp/product/chromecast_google_tv) を購入しました。{{< post "2020-08-14-1" >}} に購入した [Chromecast(第 3 世代)](https://store.google.com/jp/product/chromecast)からの買い替えです。

セールとタイミングを合わせつつ、Pixel 6a を購入したときのクーポンもあったので、¥7,600 - ¥2,620 - ¥1,000 = ¥3,980 と割とお得でした。
## 購入した理由
私にしては買い替えのサイクルが早かったのは、ネガティブな理由からです。
スマホから Chromecast に繋げた時、2~3 ヶ月ほど前からテレビ側の YouTube がログイン状態にならなくなりました。手動でのログインも不可です。
「あなたへのおすすめ」には全く興味がない動画が並び、それらをクリックすると(ログインしていないので)YouTube Premium に入っているのに広告を見させられるようになりました。
[どうやら YouTube 側で Chromecast(第 3 世代)のサポートが切られた様子](https://bbs.kakaku.com/bbs/K0001096578/SortID=24792964/)...。:expressionless:
## 一週間使ってみて
前述のネガティブな課題は解決できました。
今回は期待値低く購入したのでこれだけで十分ですが、他もちょいちょい良かったです。
### リモコンが割と良い
購入前は「またリモコンが増えるのか」と歓迎していませんでしたが、使い始めて HOME ボタンが便利だと思いました。
これはテレビのリモコンだと「入力切替」→「↓ x N」→「決定」に相当します。押すだけで「入力N」が起動するのは便利です。そもそもテレビに「入力N」ボタン付けてよという話ではありますがね...。
電源ボタンとボリューム調整ボタンもあるので、地上波を見ないのであればこれで事足ります。リモコンのサイズも小さいので、あまり邪魔になりません。
### Nature Remo には登録できなさそう
Chromecast with Google TV のリモコンを Nature Remo {{< post "2018-08-19-1" >}} に登録しようかとも思いましたが、うまくいきませんでした。ミュートとボリューム調整ボタンは Nature Remo が反応したので赤外線で、他は Bluetooth なのかな?
登録できたとしても、スマホからの家電操作はステップ数が多くなりがちで、便利にはならないので良しとします。
* 物理リモコン
1. リモコンを手に取る
2. ボタンを押す
* スマホからの家電操作
1. スマホを手に取る
2. Nature Remo アプリを開く
3. テレビデバイスを選択する
4. ボタンを押す
### Google TV がそれなりに便利
今までの Chromecast はスマホが必要で、YouTube や U-NEXT アプリとキャストするデバイスでした。PC では Chrome ブラウザが必要です。
Chromecast with Google TV には Google TV が組み込まれており、単独でもキャストでも動作します。
### その他
うちの [LG TV (43UH6500)](https://www.lg.com/jp/tv/lg-43UH6500) の問題ではあるのですが、おそらく赤外線受信部に不具合があり、特に電源を OFF から ON にするには 2 回以上押さないとほぼ反応しません。
Chromecast with Google TV のリモコンの電源ボタンは Bluetooth 経由だからか、(入力Nにはなりますが)確実に電源を ON/OFF 出来るようになりました。うーむ。
あと、HDR はたぶんきれいです。← 鈍感奴
## まとめ
Chromecast(第 3 世代)を Chromecast with Google TV に買い替えて、ネガティブな課題をいくつか解決できました。
ただ、これを定価で買うのは微妙だと思います。発売日が 2020 年 9 月 30 日と 2 年経つので、そろそろ新しいモデルも出るかもしれません。
本体含めて場所を取るデバイスではないので、選択肢に入れるのは良いかもしれません。
## オチ
**追記(2022-09-23):**
この記事を書いた 3 日後に新しい Chromecast with Google TV (HD) が発表されました。同日発売です。¥4,980 なので、仮に待っていたら全く同じ値段で購入できました。:innocent:
{{< tweet user="masutaka" id="1573106079873265664" >}}
**追記(2023-01-06):**
上の認識は間違い。今回買った無印の Chromecast with Google TV は Chromecast with Google TV (4K) のことだった。Chromecast with Google TV (HD) はそれよりも解像度が低いので、¥4,980 は妥当。現在も Chromecast with Google TV (4K) は ¥7,600 で通常の値段は変わっていない。今回買った Chromecast with Google TV を母にあげて、自分用に Chromecast with Google TV (4K) を買って気がついた。
--------------------------------------------------------------------------------
title: "『データ分析BIツール Looker導入ガイド』を読んだ #Looker"
date: "2022-08-29"
--------------------------------------------------------------------------------
本日発売とのことで、[自称 Looker エバンジェリスト](https://twitter.com/masutaka/status/1550357627779284992)としては放ってはおけず、購入してザッと流し読みしました。
{{< amazon asin="B0BBPYRM18" title="データ分析BIツール Looker導入ガイド" >}}
初心者向けの本ではありますが、LookML 開発者、ビジネスユーザー、Looker 管理者、いずれのロール向けではあります。これだけ網羅的に書くのは大変だったのだろうなあ。
## Looker の導入を検討する人向けかな?
ここまで親切な Looker の情報、特にスクリーンショット付きの LookML 開発の情報は少ないので、導入を検討する人には大きな助けになると思います。
## Looker の学習用教材としても良い
初心者向けの Looker 学習用教材としても良いと思います。
でも「これから導入するからみんなで読みましょう」というより、すでに Looker が導入された環境に、後から入る人向けかな?
導入時には Jumpstart もしくは Rapid deployment のプログラムを受講するはずですからね。受講は任意ですが、受講した身からすると必須という実感があります。
{{< hatenablog title="『4月から取り組んできたLookerの導入から実装までのお話(Redashとも比較)』という発表をした - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2020/10/23/190000" >}}
## まとめ
Looker 本は日本初だと思うので、Looker を愛する者としては素直にうれしいです。:joy:
P.S.
それにしても LookML の ML が Markup Language の略 (P29) とは全く考えたことがありませんでした。← そこ?:roll_eyes:
## 追記(2023-03-18): LookML の ML は何の略?
[LookMLの紹介 | Looker | Google Cloud](https://cloud.google.com/looker/docs/what-is-lookml?hl=ja)
> LookML は、Looker Modeling Language の略です。
現在は(?)**Markup** Language ではなく **Modeling** Language みたいです。執筆当時から変わった可能性はあります。
--------------------------------------------------------------------------------
title: "Pixel 3a XL から Pixel 6a に機種変更した"
date: "2022-07-30"
--------------------------------------------------------------------------------
Google の Pixel 6a を購入し、{{< post "2020-07-14-1" >}} にも書いた Pixel 3a XL から乗り換えました。
{{< tweet user="masutaka" id="1552138232774950912" >}}
7/21(木)の予約開始日にすぐ予約して、7/27(水)に到着しました。5/11 の Google I/O で発表があってから、待ち焦がれていました・・・!
Pixel 3a XL はミドルレンジモデルの Snapdragon 670 で正直もっさりとした動作でしたが、Pixel 6a はハイレンジモデルである Pixel 6 と同じ Google Tensor ということもあり、キビキビとした動作です。これで ¥53,900 は買いだ!と思い、ずっと狙っていました。
* [Google Pixel 3a XL スペック・仕様](https://kakaku.com/keitai/smartphone/model/M0000000671/spec/)
* [Google Pixel 6a スペック・仕様](https://kakaku.com/keitai/smartphone/model/M0000000951/spec/)
## 機種変更作業
それなりに面倒でした。
Pixel 6a の電源を入れると移行のためのナビが始まります。基本的にはそれに従うだけです。両機種を USB ケーブルで繋ぐよう、指示されました。
IIJmio を使っているので {{< post "2017-02-25-1" >}} 、SIM カードの移行もナビに従っただけです。iOS と違って「構成プロファイル」をインストールする必要はありませんが、Android は「アクセスポイント名」を指定する必要がありました([公式マニュアル](https://www.iijmio.jp/hdd/guide/apn.html))。外出してネットに繋がらなくて気づきました...。
いくつか、気をつけないといけないアプリもあり、慎重に移行しました。
* LINE
* 友だちは引き継げるが、トーク履歴は Google Drive を介して自分で移行する必要がある
* モバイルSuica
* カードを一旦サーバー側に預け、Pixel 6a で受け取る必要がある
* MetaMask
* 秘密のリカバリフレーズで移行した。他の方法はあったかも
* SQEX TOKEN
* 面倒そうだったので、1Password のワンタイムパスワードに移行した
* 他、移行に PIN が必要なアプリ
* 飲食店のスタンプアプリでそんなのがあった
作業後もすべてのアプリを開いて、ログイン出来ているか全部確認しました。
ひとつだけ、「[私の歯医者さん](https://apotool.jp/function/cardapp/)」という診察券アプリは移行できませんでした。どうやら次回受付の時にでも、招待コードを送ってもらう必要があるみたいです。
iPhone の時はパソコンの iTunes にまるごとバックアップ出来、安心感がありましたが、Pixel はなぜか不安です。移行直前にも Google Drive にバックアップはしましたが、USB ケーブルで繋いだため、使われたのか分かりませんでした。
## 良くなったこと
### 速くなった
すべての動作が速くなりました。Snapdragon 670 から Google Tensor へのアップグレードの恩恵です。
### 持ちやすくなった
サイズが少しコンパクトになり、持ちやすくなりました。Pixel 3a XL は大きかったですからね。重量増はそこまで感じません。
| | Pixel 3a XL | Pixel 6a |
|---|---:|---:|
| サイズ | W:76.1mm x H:160.1mm x D:8.2mm | W:71.8mm x H:152.2mm x D:8.9mm |
| 重量 | 167g | 178g |
| 画面サイズ | 6inch | 6.1inch |
細かいところだと Wifi 6 (IEEE 802.11ax) に対応したので、{{< post "2022-02-16-1" >}} に買ったルーターの真価が発揮できそうです(?)。
## 悪くなったこと
### 指紋認証の感度が非常に悪くなった
非常に悪くなりました。素人()にはオススメ出来ないレベルです。
Pixel 3a XL は裏側の専用センサーのためか、不安になるくらい高速にロック解除できました。
一方の Pixel 6a は表側の液晶でロック解除します。失敗する頻度が上がりました。指をわざわざ表側に移動する煩わしさもあります。
特に 1Password で失敗し続けると、マスターパスワードを求められるので、非常にストレスです。
おまけにこんな報告もあるようです。:sweat_drops:
[Google Pixel 6aで「誰の指でもロック解除できる」不具合が報告 | Gadget Gate](https://gadget.phileweb.com/post-7295/)
### バッテリーの持ちが悪くなった?
バッテリー容量は 3700mAh から 4410mAh に上がったのに、減りが早い気がします。
Pixel 3a XL で不要になったモバイルバッテリーの出番なのかも。:cyclone:
## カバーやケースはどうした?
ケースは好きではないので、Pixel 3a XL の時からガラスフィルムを付けています。Pixel 3a XL は何度か自宅の床に落としましたが、ガラスフィルムにヒビが入っただけで済みました。
iPhone X を使っていた時に、自宅の床に落としたら微細なヒビが入ってしまい、付けるようになりました。大画面のスマホは危険です...。
今回購入したこちらのガラスフィルムにはガイドが付いているので、本当に簡単にピッタリと貼ることが出来ました。
{{< amazon asin="B09YJVTLBN" title="Spigen AlignMaster ガラスフィルム Google Pixel 6a 用 ガイド枠付き 飛散防止 Pixel6a 対応 保護 フィルム 2枚入" >}}
あとは {{< post "2021-12-26-1" >}} にも紹介したスマホスタンドを付け替えました。Pixel 6a はワイヤレス充電には非対応ですし、このスタンドは仕事中にも見やすくて非常に便利です。
{{< amazon asin="B08NZPNV6F" title="スマホリング 【MindSky2021年業界初製品】、縦置きできるな新バンカーリング、折りたたみ耐久性スマホリング、携帯リングガ角度可調薄型180°360°回転、落下防止の携帯キラキラすまほりんぐ、 スマホ固定磁石強力粘着おしゃれフィンガーリング、取り外し可能片手操作可アイホン指リング、 横 縦 ホールドリング(ケイタイスマホスタンド機能式)、マグネット車載ホルダー付属、5つの3M VHB粘着パッド+5つ透明フィルム(いつでも交換可能) iphone/ipad/Android/switch/kindle/iFace ケース各種他対応" >}}
## まとめ
Pixel 3a XL から Pixel 6a への機種変更記録を書きました。
安価で速くなったことに非常に満足しています。指紋認証の問題は購入前から予想していたので、特に後悔はありません。
**追記(2022-08-22):**
ガラスフィルムを付けると、笑えないくらい指紋認証の精度が低くなることが分かったので、ガラスフィルムなしで使うことにしました。運が良ければロックを解除できるレベルでした。ガラスフィルムは{{< amazon_link asin="B0B5X1B2V5" title="もう一種類" >}}試しましたが、変わらなかったので Pixel 6a には合わないのかも。落として割れたらそれまでです。
--------------------------------------------------------------------------------
title: "『インテリジェンス入門』を読んだ"
date: "2022-06-26"
--------------------------------------------------------------------------------
しんゆうさんのこのツイートを見てから、すぐ買って少し読んで、半年くらい放置していました。:sweat_drops:
{{< tweet user="data_analyst_" id="1464024110921519117" >}}
数日前に :point_down: のツイートを社内の Slack で紹介したら、「インテリジェンス」の定義自体存在しないような、バラバラのような気がしたので、今日気合い入れて一気読みしました。結果的に読むタイミングは、今で良かったかもしれません。
{{< tweet user="data_analyst_" id="1539557784617791488" >}}
## インテリジェンスとは何か
ひょっとしたら聞いたことがない人のほうが多いのかしら?
聞いたことがある人も、スパイや諜報などのイメージで、自分とは関係ないと感じる人が多いのかもしれません。
国家レベルでのインテリジェンスの定義は置いといて、企業という現場では以下のような定義になるそうです。特別なものではありません。
> P9
> インテリジェンスとは、企業が戦略を立案・実行するために必要な知識である。
ビジネス・インテリジェンスと呼ばれるのかな。
社内で共通言語や共通課題を作るために、第1部「インテリジェンスとは何か」と第2部「インテリジェンスの創造と管理」くらいは読み合わせたほうが良いかもしれません。
インテリジェンスの定義は広範囲に及ぶため、私が今所属している会社の場合、関係するのはこの本の定義のごく一部です。
## 個人的に気になった箇所
> P67
> 逆に言うと、カスタマーの最終的な目標は、特定のインテリジェンスを得ることではない。インテリジェンスを得ることで、判断・行動し、自らの利益を養護・増進することなのである。
インテリジェンスの世界でも「なぜやるのか?」という Issue が必要だと理解した。
> P90
> 以上をまとめると、結局重要なのは、カスタマーと情報サイドの間の距離が「遠い」とか「近い」とかいうことではなくて「情報サイドが、カスタマーの利益を充分に理解しているかどうか」だということになる。
カスタマー(依頼者)と分析者の間には、上下関係はないということ。
> P110
> 「機密情報に頼らなくても、公開情報を丹念に分析すれば、実態の九割は把握できる」といった議論がその例である。
これは懐かしい。昔 SAPIO を定期購読していた時、これを知った記憶。インテリジェンスという概念もその時知った。
> P151
> 米国の CI (Competitive Intelligence) と呼ばれる企業にとってのインテリジェンスの世界では、情報サイドの人間が、戦略や戦術の立案・実行の機会に立ち会うことが奨励されているのだ。
これは分かる。Looker 等でデータ整備する時もそれ以前も、出来るだけチームに飛び込んで、空気感を掴むようにしていた。
> P151
> このようにあらゆる特定の制作や企業戦略・戦術を相対化出来るほどに、カスタマーの利益を理解できるような人材を育成することが、最も重要なのである。
インテリジェンスの文脈だと目的が「カスタマーの利益を理解するために」になるが、インテリジェンスでなくてもそうだよね。
> P152
> 日本に限ったことではないのだが、インテリジェンスを専門としている人間は、カスタマーに対して、コンプレックスを感じやすい。またカスタマーは、全てがそうではないが、情報サイドに対して高踏的な態度を取りやすい。
なんとなく分かるかな。だからこそ情報サイドの人間は、ある程度の勇気を持ってコミュニケーションすることが重要。プロダクトオーナーとソフトウェア開発者の関係とも似ている。
> P217
> そこでヘリングは、能動的モードを考案する。つまりCI部門が戦略を策定・執行する者に定期的にインタビューを行い、彼らが適切なリクワイヤメントを自ら発見できるように手助けするのである。これがヘリングのKITプロセスだ。
「質問待ってます」みたいな受動的モードがうまくいかなくて、能動的モードに移行するのよく分かる。インタビューの例は P220 にある。
> P230
> (二)意思決定への関与
情報サイドは意思決定に関与すべきでないと明言している。
> P246
> 両者の対話の段階に入った瞬間に、「リクワイヤメントの伝達」は「リクワイヤメントの創出」へと変化し「鶏と卵」の問題は回避し得るかに見える。しかしその代償は、図に描かれている通り、インテリジェンスの客観性の低下である。
確かに「インテリジェンスの客観性の低下」は警戒したほうが良い。P249 に解決策あり。
{{< amazon asin="4766416821" title="インテリジェンス入門―利益を実現する知識の創造" >}}
--------------------------------------------------------------------------------
title: "初めて格闘技の試合を観戦した"
date: "2022-05-29"
--------------------------------------------------------------------------------
今日、[DEEP TOKYO IMPACT 2022 4th ROUND](http://www.deep2001.com/event/schedule/deeptokyoimpact4th.php) という総合格闘技のイべントを実際に観戦してきました。場所は{{< wikipedia "新宿FACE" >}}です。
## 総合格闘技を見るようになった経緯
総合格闘技(MMA)はコロナ禍が始まってから見始めました。そもそも格闘技は 1990 年代の K1 やプロレス、2000 年代の PRIDE, DREAM, K1 などをぼんやりと見ていて、2020 年まで 10 年以上、完全に見ていませんでした。
コロナ禍が始まったあたりにやっちくん YouTube の達人シリーズから始まって、朝倉海、朝倉未来とズブズブと {{< wikipedia word="RIZIN_FIGHTING_FEDERATION" text="RIZIN" >}} に取り込まれ、{{< wikipedia word="RIZIN.22_-_STARTING_OVER_-" text="RIZIN.22" >}} から TRIGGER, LANDMARK 含めた全ての PPV を買っています。{{< wikipedia word="DEEP_(格闘技団体)" text="DEEP" >}} もたまに PPV を買う感じでした。
実際に見に行こうとは思っていましたが、特に行動しないまま時は流れ、2ヶ月ほど前にMMA言語化挑戦中さんの動画を見ました。カードはともかく、まずは「ちっちゃい会場」で見ようと、今日に至ったわけです。
{{< youtube id="N7O6EVeHGyU" title="最近のRIZIN、カード弱い問題について" start="960" >}}
## 今日の感想
自由席 7,000 円でしたが、開場の 17:00 過ぎに入場したら前から 2 列目に座ることが出来ました。1 列目は VIP 席とともに、両方ともパイプ椅子です。良い意味で味わい深いです。:laughing:
DEEP 佐伯代表の御背中を拝見しつつ観戦しました。判定は多かったけど、KO と一本の試合もあり、全試合それなりに楽しむことが出来ました。
VIP 席後ろの席ということもあり、YUSHI 選手が近くにいたり、セコンド陣は大沢さん、ピカさん、未来選手、今日の選手はヒロヤ選手、西谷選手など、見たことがある方でも楽しめました。
次回は DEEP 本戦を見に行こうと思います。
## 今回の学び
* ゴングの音はかなり大きい
* 人を殴る(!)音は思ったより大きくない(イベントのレベルは関係ありそう)
* 会場は情報収集しづらいので事前に調べるのと、入口で紙の対戦カードをもらおう
* 一人で観戦すると、トイレタイムが難しい
あと、メガネは忘れないようにね。> 自分
**追記(2022-05-31):**
さっそくヒロヤ選手と西谷選手の試合映像が公開されていました。
{{< youtube id="MWweMBprpAg" title="1年チャレンジの試合" >}}
**追記(2022-06-02):**
さすが前から2列目。カメラにちょいちょい写り込んでいました。(黄色い服を着た人の左後ろ)
{{< youtube id="S1j_Iis4s6U" title="ジャカ季美香(Kimika Jaka) VS 河合 瑠菜(Runa Kawai) DEEP TOKYO IMPACT 4th ROUND" start="490" >}}
--------------------------------------------------------------------------------
title: "やっぱり iD なんだよなあ"
date: "2022-05-28"
--------------------------------------------------------------------------------
電子マネーはガラケー時代の [Edy](https://edy.rakuten.co.jp/) から使っていて、使用歴は長いほうだと思う。2005 年くらいから?当時は Edy が Euro Dollar Yen から命名されたことに、たいそう感動した思い出。:laughing:
Edy は楽天が買収した 2009 年の前くらいまで使っていて、それ以降有名どころの電子マネーはひと通り使ったと思う。
その中で iD が一番良かったので、他と比較しつつまとめてみた。
## iD
https://id-credit.com/index.html
個人的には iD というややこしい名前以外に欠点は感じない。:heart_eyes:
* チャージの必要がない
* スマホをかざすだけで決済できる。反応も一番早い
* マネーフォーワードME上で、どの店で買ったのか分かる
* 後述の Suica は全部「物販」になる対比として
他に欠点があるとすれば、クレジットカードとセットで作る必要があることかな?でも[サイト](https://id-credit.com/card/index.html)を見ると、プリペイド型とかデビット型とかもあるみたい。むずい。
私は三井住友カードと一緒に作った。もちろん iD 追加するのは無料。物理カードが送られてくるけど、Google Pay や Apple Pay に登録すれば持ち歩く必要はない。
最近[三井住友ゴールドカード(NL)](https://www.smbc-card.com/nyukai/card/gold-numberless.jsp)を作って、三井住友カードから乗り換え中。ちなみに NL は Number Less の略。カードに番号が書いておらず、セキュリティ面で安心。
還元率は 0.5 ~ 5.0% と高い。年間 100 万円使うと 10,000 ポイント還元され、翌年から年会費 5,500 円が永年無料になるとのこと。たまに初年度年会費無料のキャンペーンもやってる。
さらに [EX カードを追加出来る(年会費 1,100 円)](https://www.smbc-card.com/mem/service/li/plusex.jsp)ので、新幹線の予約も楽ちんになる。
さらにさらにSBI証券と相性が良く、[ゴールドカードだと積立額の 1% がポイント還元される](https://www.smbc-card.com/camp/00012/index.html)らしい。って、三井住友ゴールドカードの宣伝になってきた。:sweat_smile:
## QUICPay
https://www.quicpay.jp/
iD と似てて、それなりにオススメできる。ただ、リーダーの反応がワンテンポ遅いのはイマイチ。店員さんが一瞬こちらを見るレベル。
iD と違って物理カードはなく、例えばセゾンカードを Google Pay や Apple Pay に登録すれば QUICPay として使える。
## Visa のタッチ決済
https://www.visa.co.jp/pay-with-visa/featured-technologies/contactless/contactless.html
今回紹介する中で一番使いづらい。今は諸事情で一時的に使っていて、毎回ストレス。それにしても URL の長さよ。:neutral_face:
iD や QUICPay と違って、Google Pay アプリを開いてタッチ決済を選択しないと、なぜかリーダーが反応しない。
それだけでも使いづらいのに、店員さんに決済の種類を伝える必要がある時は、苦痛レベルのややこしさ。
ワイ「Visa タッチで!」
店員さん「え、なんですか?」
ワイ「Visa で!」
店員さん「?クレジットですか?」
ワイ「タッチ決済で!」
店員さん「」
なぜなのか。:innocent:
## Suica
https://www.jreast.co.jp/suica/
チャージ必要なので私的には論外。
おまけにマネーフォーワードME上では、電車以外は全部「物販」になる。出来るだけ電車以外では使わないようにしている。
## PayPay
https://paypay.ne.jp/
チャージが必要な点でこれも論外。
宗教上の理由で使っていなかったが、現金はもっと使いたくないので、少し前に今さらながら使い始めた。
## まとめ
iD と三井住友ゴールドカードの素晴らしさについてまとめた。
Visa のタッチ決済での店員さんとのやり取りを書きたかっただけの説はある。
--------------------------------------------------------------------------------
title: "このブログの静的ジェネレーターを chalow から Hugo に変更した"
date: "2022-05-05"
--------------------------------------------------------------------------------
このブログは {{< post "2008-09-25-1" >}} から長らく [chalow](https://chalow.org/) という静的 HTML ジェネレーターで作っていましたが、この度 [Hugo](https://gohugo.io/) に変更しました。:rocket:
{{< github_repo "gohugoio/hugo" >}}
## なぜ変えたのか?
開始から 20 年以上、ブログ公開から 13 年以上経ち、メンテナンスコストが大きくなってきたからです。[このサイトの歴史]({{< relref "history.md" >}})も是非・・・!:bulb:
一般的には記事の移行はしないで、ブログを新しく作ることが多いと思います。でも私の性格上「もったいない精神」が発動してしまい、ここまで来てしまいました。:sweat_smile:
## 今までの仕組み
{{< wikipedia word="ChangeLog" country="en" >}} というフォーマットで書かれた 1 つのテキストファイルを chalow で HTML に変換していました。最終的に 48,204 行、2.3MB になりました。
Hugo 移行前のスクリーンショット:

## 現在の仕組み
Markdown で書かれた 1 記事 1 ファイル(合計約 1,400 ファイル)を Hugo で HTML で変換しています。
Hugo のテーマは 15 個くらいから選定して、[PaperMod](https://github.com/adityatelange/hugo-PaperMod) にしました。
* メンテナンスされている
* ダークモードがある
* 画像少なめでも貧相にならない
* Archive ページを作ることが出来る
* toc(Table of contents, 目次)を使える
* ` ``` ` で括ったコードエリアに copy ボタンを付けられる
* dateFormat を変えられる
PaperMod が理想的かと言えばそうでもなくて、消去法で決めました。いろんなテーマを試したり、コードを読んだりしていました。
## 今回変えなかったこと
{{< post "2019-01-19-1" >}} から変わらず、インフラは CloudFront+Heroku です。
```
User -> CloudFront -> Heroku (Docker)
```
Heroku は[先月の OAuth token 漏洩インシデント](https://zenn.dev/hiroga/articles/heroku-incident-2413-checklist)で、自分の中の評価がだいぶ下がりました。あと、3 年以上使ったのでそろそろ引っ越したい気持ちはあります。
## 移行による変化
### Good
* 文字のパースや見栄えをまるっと Hugo に任せられる
* 何を言っているんだ?と思うかも知れませんが、今まで全部自前だったので、結構大変かつ、ひどい見栄えでした。Perl は苦手です :cry:
* Markdown を使える
* やっぱり慣れた Markdown が一番ですかねえ。chalow は Hiki ベースの記法でした
* 気軽に見出し (h1, h2,...) を使えるようになった
* そもそも chalow に見出し機能はなかったので、改造してました
* それでも目次は使えなかったので、見出しを使うことに躊躇することは多かったです
* ChangeLog の書き方に縛られなくなった
* 例えば ChangeLog では人間が見やすように適度に改行を入れますが、同じことをすると、ブラウザ上で不自然な改行になります。スマホが顕著です。過去記事はそうなってます...
* 1 ファイルはメリットでしたが、例えば行数が多いコードは貼らないように微妙に忖度していました
* あとはやはり、本文をタブコード始まりにしなくて良いことですかね :sweat_smile:
* LiveReload が楽
* 今まではエディタのショートカットで chalow を実行し、ローカルの nginx コンテナで確認していました :sweat_drops:
* `:smile:` のような絵文字記法を使える
* Hugo が Unicode の絵文字に変換するとは言え、直接絵文字を書くのになんとなく躊躇してしまいます。機種依存文字的な...
### Bad
* 記事が複数ファイルになったため、エディタで雑に検索することが出来なくなった
* この点は本当に便利でした
* 良くも悪くも「味」がなくなり無個性になってしまった
* Hugo のテーマを使っている以上、致し方なしか
* 「最近の記事」が出なくなった
* Hugo としては可能ですが、PaperMod テーマが対応していません
* 「最近追記された記事」が出なくなった
* chalow 作者の「[たつをの ChangeLog](https://chalow.net/)」を研究しまくって改造した記憶です :upside_down_face:
* 「この記事に言及しているこのブログ内の記事」が出なくなった
* chalow の機能としては用意されていたかもしれません。タイトルが出るように改造しました
* Hugo の [Related Content](https://gohugo.io/content-management/related/) は近いですが、PaperMod テーマは対応していません
**追記(2022-05-14):**
以前のテーマ ([Honoka v3.3.7-a](https://github.com/windyakin/Honoka/tree/v3.3.7-a)) と同じ色にして「味」を再現してみた。
## 長かった移行期間
構想に 5 年、移行は 1 ヶ月くらいかかったと思います。マジで。:sweat_drops:
技術的な課題はありましたが、「1 つの ChangeLog メモファイル」の資産を捨てて良いものかの決断が出来ませんでした。
### ChangeLog 形式から Markdown 形式への変換
「ChangeLogメモ -> chalow -> HTML」を「ChangeLogメモ -> chalow -> Markdown」になるよう、chalow をまたまた改造していました。要らないコードを極限まで削って削って...。
さらにこんなこともしていました。
* Hiki 記法に似た、文字修飾や特殊記法を、Markdown 記法に変換
* テーブル記法の変換は自分には無理そうだったので全部手作業で変換。その他、レイアウトが崩れていたら、可能な範囲で修正
* chalow のプラグインを Hugo の Shortcodes として移植しつつ、作った Shortcode を chalow に出力させる
自作の tweet プラグインの例:
```
# chalow のプラグイン記法
{{tweet('masutaka', '270811664381800449')}}
↓
# Hugo の Shortcode 記法
{{* tweet user="masutaka" id="270811664381800449" */>}}
```
### リダイレクト設定
nginx の設定で、今までの URL を極力変えないことも出来ますが、負債になるのでバッサリ 301 リダイレクトしました。
| 移行前 | 現在 | 備考 |
|---|---|---|
| /chalow/ | / | |
| /chalow/2022-05.html | /archives/2022/ | 月ページは作らなかったため、悩んだ末に年にした |
| /chalow/2022-05-01.html | /2022-05-01-1/ | 日ページは作らなかったため、その日の最初の記事にした |
| /chalow/2022-05-01-1.html | /2022-05-01-1/ | |
| /chalow/cat_カテゴリ名.html | /tags/タグ名/ | |
| /chalow/cl.rss | /index.xml | RSS/Atom のリダイレクトは忘れがち :sunglasses: |
### Disqus のコメント
Disqus の [URL Mapper](https://help.disqus.com/en/articles/1717129-url-mapper) という機能で、紐づく URL を変更できました。知らなかった。:flushed:
例えば {{< post "2020-07-24-1" >}} のコメントは移行できています。
### はてなブックマーク
はてブの移行は出来ないので諦めました。そう言えば https 対応した時 {{< post "2016-03-15-1" >}} も諦めたのでした。
**追記(2022-05-08):**
適切に 301 リダイレクト設定すれば、何かのタイミングではてブ URL も移行される雰囲気でした。
例えば {{< post "2014-04-08-1" >}} の公開当時のはてブ URL はこちらでした。
https://b.hatena.ne.jp/entry/masutaka.net/chalow/2014-04-08-1.html
今回気づいたのですが、{{< post "2016-03-15-1" >}} に HTTPS 対応した時に、こちらのはてブ URL が作られたようです。[^1]
https://b.hatena.ne.jp/entry/s/masutaka.net/chalow/2014-04-08-1.html
[^1]: もちろん HTTP から HTTPS への 301 リダイレクトの設定はしました。
そして今回さらにリダイレクト設定が加わり、こちらのはてブ URL が作られていました。
https://b.hatena.ne.jp/entry/s/masutaka.net/2014-04-08-1/
いずれも作られるタイミングはよく分かりません。
はてブ裏側のデータを想像すると、これらは nginx の rewrite 等でデータを共有しているのかも知れません。
**追記(2022-05-08):**
上のはてブは、こちらの対応で移行されたっぽい。現在の URL で誰かに非公開はてブされたのだと思う。
:link: [URLが複数存在する同一ページでコメント一覧ページが分散する仕様を、統合されるよう変更します - はてなブックマーク開発ブログ](https://bookmark.hatenastaff.com/entry/2019/02/13/105009)
## まとめ
とてつもなくニッチな話題、chalow から Hugo への移行について長々と書きました。
本当によく頑張ったね!:joy:
## 今後の予定
「ブログのための ChangeLog メモ」はなくなりましたが、手元の「非公開 ChangeLog メモ」には今後も記録し続けます。1 つのテキストファイルにまとまることや、整理不要な点は大きなメリットだからです。
ローカルで chalow を使い続けるかは考え中。でもブラウザでの表示に慣れてしまったからなあ...。
--------------------------------------------------------------------------------
title: "『本を聴く毎日を送っています』という LT をした"
date: "2022-04-09"
--------------------------------------------------------------------------------
私が所属しているフィードフォースでは、毎月 [FFLT](https://developer.feedforce.jp/archive/category/FFLT) という LT 大会があります。
最近久しぶりに参加していて、昨日は本当に久しぶりに LT をしました。久しぶりすぎて LT が 5 分であることを気にかけなかったという...。いや、もちろん覚えてはいたのですが(汗)。
{{< google_slide "2PACX-1vQJuoCvTXBJC19TfPP328xDJ8pJ7RWpI8OrJyIGHU8gBtdFkoyB3bQpH-v8BK3-vp-piR4V1alu_4HE" >}}
お題は {{< post "2022-03-06-1" >}} や {{< post "2022-03-30-1" >}} でそれとなく書いていた「Kindle 本を聴く」方法です。
すべてのケースに合うわけでも、ベストな方法でもありませんが、集中力が必要で眠くなりがちな本を読むという作業を省エネ化出来たことは、自分にとって価値あるものでした。
まだまだ最適化が必要なので、やっていきます。
--------------------------------------------------------------------------------
title: "『銃・病原菌・鉄』を読み終えた"
date: "2022-03-30"
--------------------------------------------------------------------------------
購入から6年半以上。下巻の途中で数年止まっていましたが、今月えいやっと読み終えました。
※ 正確に書くと、Kindle 本をオーディオブック化して聴き終えました。
上巻はもはや覚えていませんが、全体を通して覚えていることは「人種間に能力の優劣などなく、地理的環境的なアドバンテージが文化的な発展の違いに繋がった」ことです。
例えばユーラシア大陸は横に長いため、作物や技術が伝播しやすいです。緯度が変わらないため、気候が似通っているからです。しかし、南北アメリカ大陸やアフリカ大陸は縦に長いため、ユーラシア大陸に比べて伝播が遅かったり、途中で止まったりします。こちらを知れただけで読んだ価値がありました。
下巻の最後では、なぜヨーロッパの国々はアメリカ大陸やアジア諸国で植民地支配が広がったのに、中国はそうでなかったのかという興味深い話が解説されていました。
ヨーロッパは国の数が多く競争が激しいため、新しい技術が開発されたら取り入れざるを得ず、ある国の支援が得られなくても他の国でなら可能(コロンブスの話)という事情が生まれるそうです。
一方で中国は1つの王朝が統一しているため、例えば外洋航海の禁止という決定事項が中国全土に浸透し、その決定が愚かだったかの検証さえ出来なくなってしまったそう。
Kindle 本をオーディオブック化するスキルを身に付けたので、これからもジャンジャン~~読んで~~聴いていきます。
{{< amazon asin="B00DNMG8Q2" title="銃・病原菌・鉄 上巻" >}} {{< amazon asin="B00DNMG8QC" title="銃・病原菌・鉄 下巻" >}}
P.S.
これから読む予定。
[日本の地理学は『銃・病原菌・鉄』をいかに語るのか―英語圏と日本における受容過程の比較検討から―](https://www.jstage.jst.go.jp/article/ejgeo/7/2/7_225/_article/-char/ja/)
--------------------------------------------------------------------------------
title: "1Password に SSH キーをインポートしたら UX として良かった"
date: "2022-03-29"
--------------------------------------------------------------------------------
- [1password 8 beta の macOS バージョンで ssh キーをすべて扱うようにした - HsbtDiary(2022-03-18)](https://www.hsbt.org/diary/20220318.html#p01)
- [SSH and Git, meet 1Password 🥰|1Password](https://blog.1password.com/1password-ssh-agent/)
macOS はベータ版をインストールする必要があるが、メインマシンの Manjaro (Linux) の 1Password はすでに 8.6.1 だったので、試しに使ってみた。
1Password には SSH 秘密鍵をインポートする。1Password 内では秘密鍵から公開鍵を作ってくれる。~/.ssh/ 以下の SSH キーは秘密鍵と公開鍵の両方とも不要になる。
UNIX Socket ファイルが出来るようなので、~/.ssh/config で設定をそこに向ければ勝手に使ってくれる。こんなことが出来るんだ。
```
Host *
IdentityAgent "~/.1password/agent.sock"
```
ただ、git fetch や git pull のたびに指紋認証が要求されるので、利用頻度が多い GitHub なんかは今まで通りが良い気はした。
```
Host github.com
IdentityFile "~/.ssh/github_ed25519"
IdentityAgent none
Host *
IdentityAgent "~/.1password/agent.sock"
```
ssh config は設定が上書かれないことには注意。先にマッチしたほうが優先される。
[ssh_config(5) - Linux manual page](https://man7.org/linux/man-pages/man5/ssh_config.5.html)
--------------------------------------------------------------------------------
title: "『だから僕たちは、組織を変えていける』を読んだ"
date: "2022-03-10"
--------------------------------------------------------------------------------
組織に課題を持った同僚が紹介していたので、ポチッとしました。
{{< amazon asin="B09MHRWJKN" title="だから僕たちは、組織を変えていける" >}}
読んだ感想としては、まあそうだよねって感じで異論とかはなかった。なんなら自分は読む前から理解していたつもりだし、やる気溢れるメンタルで実践してたつもり。※ 現在一人開発なので難易度が低い。
でも、組織で実践出来る風景が全く思い浮かばない。
[日本は不満を撒き散らす社員が多く、やる気に満ちた社員が少ない 「とんでもなく時代遅れ」な組織が抱える問題点 - ログミーBiz](https://logmi.jp/business/articles/325643)
こちらの記事が紹介記事。今の会社は不満を撒き散らす社員は思いつかないし、とんでもなく時代遅れな会社でもないと思う。やる気のありなしはフルリモートワークもあってよく分からない。
バラバラなピースをどう完成させていけば良いのかな。自分はまだ正解が分からない。
--------------------------------------------------------------------------------
title: "『読む力 最新スキル大全』を読んだ"
date: "2022-03-06"
--------------------------------------------------------------------------------
コロナ禍に突入して丸2年。よく散歩をするようになりました。基本在宅ワークなので、意識的に散歩しないとさすがに健康リスクが高いからです。
散歩は考えを整理するのにもとても良くて、直近の課題への良いアイディアが出てきたり、寝かせた課題への解決策がふっと浮き上がってきたりします。{{< post "2021-01-05-1" >}} でも書いた件です。馴染みの曲を聞きながら、いつもと同じコースを歩くと、特に効果的です。
それと相反してはしまうのですが、最近はそれに飽きてしまい、散歩中に技術系や格闘技系、歴史系の Podcast をよく聞くようになりました。ちなみにインプットモードになるので、思考の整理にはなりません。(^^;
そんな中、[格闘家の青木選手](https://voicy.jp/channel/603)きっかけで [Voicy](https://voicy.jp/) の存在を知り、他に聞くものないかなーと探して見つけたのが、佐々木俊尚さんの Voicy でした。
{{< voicy channel="2185" talk="288521" title="流行りのDX、昔の「OA」と混同してる会社や人をよく見かける" >}}
佐々木さんは {{< twitter "sasakitoshinao" >}} での朝のキュレーションが有名なジャーナリストで、私は 2011 年ごろからフォローしていたと思います。※ よくアンチが湧いていますが、そんな変なことは言ってないと思うんだよなあ。
私、朝はツイッターをあまり見ないので、佐々木さんとは一方的に疎遠みたいになってました。そんなこんなで懐かしい気持ちで聞き始め、とうとう過去の放送を全部聞いてしまいました。放送開始は去年の 9 月で、佐々木さんは毎朝 Voicy を配信しているので、それなりの数です。
そんな佐々木さんが本を出しました。お礼の気持ち半分、佐々木さんの情報収集方法を知ること半分で購入してみました。
{{< amazon asin="B09KG9XFDT" title="現代病「集中できない」を知力に変える 読む力 最新スキル大全―脳が超スピード化し、しかもクリエイティブに動き出す!" >}}
読んだ感想としては「良い本だとは思うけど、マッチする人とそうでもない人がいると思う」かなあ?
私の情報収集方法は、佐々木さんほど深くはありませんが、似たりよったりです。肝心の「マルチタスクワーキング」は、ちょっと使わないかなあ?なんでだろう?
私がプログラマーだから、割とガッツリしたタスクが多いから?会社員だから、請求書作るだとかの細かいタスクが少ないから? ※ 過去にポモドーロやタスクシュート {{< post "2016-10-26-1" >}} は試した上での感想です。
だいたい毎日、仕事を始めたら溜まった Slack 読んでウォーミングアップして、あとはそれなりの大きさのタスクをガーッと処理する感じです。不惑の年はとうに越しましたが、集中力が続かない悩みはあまり感じたことはありません。
あ、キリが悪いところで止めるテクニックは、プログラマーの間ではテストを失敗させた状態で作業を止めるテクニックとして知られていて、私もたまに使いますね。
一方でビジネス職の人には、情報収集方法や仕事の仕方は参考になるかもしれません。Feedly, Pocket, Twitter(のリスト)など、存在や良さげな使い方はプログラマーよりは知らないかもしれませんし、タスクの粒度は小さく、種類は多い印象があります。
ということで、気になる方はポチッとすると良いと思いました。
ここまでで、私ひとつ嘘をつきました。
「『読む力 最新スキル大全』を読んだ」と書きましたが、実際には Fire HD 8 の「Kindle 読み上げ」で全部聞きました。読んでいません。皮肉みたいになって、なんだかすみません。
{{< amazon asin="B07WJSJ28X" title="Fire HD 8 タブレット ブラック (8インチHDディスプレイ) 32GB" >}}
「マルチタスクワーキング」は集中力など要らない、時間を細切れに使えという提案ですが、聞くという解はあると思います。
さすがに私も本を読む集中力は頻繁に切れます。Twitter は見ちゃうし、格闘技系 YouTube も気になる。
そんな課題がある中で、Podcast や Voicy は異様に捗っていました。どうやら今の生活にマッチしていたようです。
だったら本も聞いてしまえば、集中力が切れる課題を解決できるかな?と試した最初の本が『読む力 最新スキル大全』でした。伏線回収?
もしかしたら、佐々木さんの Voicy を聞いているうちに「集中力なんか要らない」という仮説を認識し、それと Podcast や Voicy が生活にマッチしていることがうまく結びついて、課題を解決できたのかもしれません。
などと、この記事を書いていて思いました。
「Kindle 読み上げ」を使って、どのように本を聞いているかは、近々記事にする予定です。いろいろあって大変でした。(^^;
ではまた明日。
--------------------------------------------------------------------------------
title: "『GitHubセキュリティ Organization運用のベストプラクティス』を読んだ"
date: "2022-03-03"
--------------------------------------------------------------------------------
昨日、職場の同僚から教えてもらった、昨日公開されたこちらの本を読みました。
[GitHubセキュリティ Organization運用のベストプラクティス](https://zenn.dev/tmknom/books/github-organization-security)
著者は {{< twitter "tmknom" >}} さん。{{< post "2019-05-07-1" >}} に読んだ『Pragmatic Terraform on AWS』改め『{{< amazon_link asin="B07XT7LJLC" title="実践Terraform" >}}』の著者でもあります。
今の会社は 2014 年から GitHub を使っています。当初は全部分かりまっせ!という設定ボリュームでしたが、時を経てものすごくてんこ盛りになり、把握しきれない設定項目も増えてきました。
本書によって、それらの棚卸しが出来た気がします。
本自体のボリュームは大きくないので、流し読みすることも出来ますし、適度に [GiHub Docs](https://docs.github.com) へのリンクになっているため、ガッツリ読むことも出来ます。
いたく感動したため、少額ながらサポートさせて頂きました。(^^)
欲張りすぎずにコツコツ改善していくことが大事だと、自分をリセット出来た気がします。
--------------------------------------------------------------------------------
title: "Wi-Fi 6 ルーターを買うまでの長い検討メモと結論、そして数日使った感想"
date: "2022-02-16"
--------------------------------------------------------------------------------
2019/4/1 に買った [WN-AX2033GR2/E](https://www.iodata.jp/product/network/wnlan/wn-ax2033gr2e/) を Wi-Fi 6 対応ルーターにグレードアップしたくなった。
{{< amazon asin="B07FTS23J3" title="I-O DATA WiFi 無線LAN ルーター ac2000 1733+300Mbps IPv6 フィルタリング デュアルバンド 3階建/4LDK/返金保証 WN-AX2033GR2/E" >}}
¥5,980 という超安値で買って、特に不満はないどころかかなり満足して使っていたのだけど、ウェブに関わるものとしては最新技術を追いかけたほうが良いと思うし、Wi-Fi 6 ルーターを体感してはみたい。変わるのか変わらないのかを知りたかった。※ 人はそれを物欲と呼びます。
などと {{< twitter "meihong" >}} のツイートを見て勝手に意識が高まっていた。
{{< tweet user="meihong" id="1487650020325167107" >}}
※ 補足すると、{{< post "2018-04-30-1" >}} に某 B 社のルーターを買ったものの失敗し、1 年後に上の WN-AX2033GR2/E で取り返した感じです。
今までの Wi-Fi 規格名は「IEEE 802.11ac」だったんだね。もはや忘れていた。Wi-Fi 6 が出たタイミングで、"Wi-Fi 5" という新呼称が付いたらしい。Wi-Fi 5 に 2.4GHz 帯がないことも知らなかった。いや気にしてなかった?
[初心者向け 次世代Wi-Fi規格“Wi-Fi 6”とは? Happy Wi-Fi Life - エレコム株式会社](https://www.elecom.co.jp/pickup/contents/00024/)
|Wi-Fi 規格名|最大通信速度|周波数|新呼称
|---|---:|---:|---
|IEEE 802.11a|54Mbps|5GHz 帯|-
|IEEE 802.11b|11Mbps|2.4GHz 帯|-
|IEEE 802.11g|54Mbps|2.4GHz 帯|-
|IEEE 802.11n|600Mbps|2.4GHz 帯、5GHz 帯|Wi-Fi 4
|IEEE 802.11ac|6.9Gbps|5GHz 帯|Wi-Fi 5
|IEEE 802.11ax|9.6Gbps|2.4GHz 帯、5GHz 帯|Wi-Fi 6
## 現在の Wi-Fi 5 ルーター情報
先に今まで使っていた Wi-Fi 5 ルーター情報をまとめる。利用目安はどちらも「4LDK/3階建て」。
|型番|接続台数目安|5GHz 速度|2.4GHz 速度|備考
|---|---:|---:|---:|---
|[WN-AX2033GR2/E](https://www.iodata.jp/product/network/wnlan/wn-ax2033gr2e/)|16台|1733Mbps|300Mbps (Wi-Fi 4)|現在利用
|[WN-DX2033GR/E](https://www.iodata.jp/product/network/wnlan/wn-dx2033gre/)|24台|1733Mbps|300Mbps (Wi-Fi 4)|上の後継機(参考)
アンテナの数も確認しておく。
|型番|アンテナ方式|備考
|---|---|---
|WN-AX2033GR2/E|内蔵アンテナ×4(2.4GHz&5GHz送受信用×2、5GHz送受信用×2)|現在利用
|WN-DX2033GR/E|内蔵アンテナ×4(2.4GHz&5GHz送受信用×2、5GHz送受信用×2)|上の後継機
## 候補とする Wi-Fi 6 ルーター情報
次に候補とする Wi-Fi 6 ルーター情報をまとめた。某 B 社と違って、I-O DATA には非常に満足しているので、引き続きお世話になってみる。これらの利用目安も全部「4LDK/3階建て」。
|No.|型番|Amazon 価格目安|接続台数目安|5GHz 速度|2.4GHz 速度|備考
|---|---|---:|---:|---:|---:|---
|1|[WN-DAX3600QR](https://www.iodata.jp/product/network/wnlan/wn-dax3600qr/)|¥14,459|32台|2402Mbps|1147Mbps|有線インターネットポートのみ 2.5GBASE-T
|2|[WN-DAX3600XR](https://www.iodata.jp/product/network/wnlan/wn-dax3600xr/)|¥20,045|32台|2402Mbps|1150Mbps|クアッドコア CPU、有線 10GBASE-T
|3|[WN-DAX3000QR](https://www.iodata.jp/product/network/wnlan/wn-dax3000qr/)|¥22,800|30台|2402Mbps|574Mbps|クアッドコア CPU、有線インターネットポート、LAN×1 のみ 2.5GBASE-T、2022/2/21 発売
|4|[WN-DAX1800GR](https://www.iodata.jp/product/network/wnlan/wn-dax1800gr/)|¥8,980|20台|1201Mbps|574Mbps|-
|5|[WN-DEAX1800GR](https://www.iodata.jp/product/network/wnlan/wn-deax1800gr/)|¥7,200|20台|1201Mbps|574Mbps|-
速度に違いがあるのは、アンテナの数が違うから。「現在利用」のルーターを基準として考える。
|No.|型番|アンテナ方式
|---|---|---
|1|WN-DAX3600QR|内蔵アンテナ×4(2.4GHz&5GHz送受信用×4)
|2|WN-DAX3600XR|内蔵アンテナ×4(2.4GHz&5GHz送受信用×4)
|3|WN-DAX3000QR|内蔵アンテナ×4(2.4GHz&5GHz送受信用×2 & 5GHz送受信専用×2)
|4|WN-DAX1800GR|内蔵アンテナ×2(2.4GHz&5GHz送受信用×2)
|5|WN-DEAX1800GR|外付けアンテナ×2(2.4GHz&5GHz送受信用×2)
## 結論
No. 1 の WN-DAX3600QR に決めた。¥5,980 から ¥14,459 はなかなかのジャンプアップ。でも前の前に使ってた AirMac Extreme は 2 万円くらいしたからね。
{{< amazon asin="B09BYW1SR9" title="アイ・オー・データ Wi-Fi 6 2.5G対応ルーター 11ax 2402Mbps+1147Mbps 360コネクト 日本メーカー WN-DAX3600QR" >}}
理由1:アンテナの数
今の 4 本からは減らしたくはなかった。一人暮らしとは言え同時に利用するデバイスはあるし、WFH はまだまだ続きそうだし。そうなると No. 4~5 は候補から外したい。
理由2:CPU の性能
CPU はクアッドコアまで必要なのかなあ?オンラインゲームしないなら要らない気はする。
理由3:大きさが気になった
No. 2~3 は大きさが気になった。半年くらい待って No. 3 の価格は下がるかもしれないが、小さくはならない。今の置き場所だと邪魔になる恐れがある。
|No.|型番|サイズ|重量|備考
|---|---|---|---|---
|0|WN-AX2033GR2/E|180(W)×120(D)×186(H)mm|約410g|現在利用
|1|WN-DAX3600QR|196(W)×52(D)×197(H)mm|約600g|購入決定
|2|WN-DAX3600XR|238(W)×84(D)×248(H)mm|約970g|
|3|WN-DAX3000QR|270(W)×67(D)×218(H)mm|約730g|
理由3:有線 LAN の性能
10GBASE-T の要/不要も考慮したい。これはデバイス(クライアント)も対応していないと意味がない。その時は LAN ケーブルも変えないとね。
現時点では有線 LAN 接続は、PS4 Pro, nasne, NAS (LS210D0201C) だけなので、10GBASE-T は一旦無視した。これら 3 つで 10GBASE-T に対応しているのは PS4 Pro だけ。他の 2 つは 1GBASE-T。
あと、No. 1 もインターネット側は 2.5GBASE-T 対応なので遅いわけではない。
以上のことから、現時点では 10GBASE-T は要らない気がする。
ルーターのメトリクス(利用状況)が分からないので、全体的に勘に頼らざるを得なかった...。
## 購入後数日経った感想
特に問題なく使えている。
ただ、セットアップ時にインターネット(IPv4)に繋がらなくなる現象が発生して、2 回くらい初期化はした。DHCP の IP range を少し変更したせい? WPA2(AES) を WPA2/WPA3(AES) に変更したせい?分からない。
このまま 3 ヶ月くらい再起動が必要なければ合格としよう。某 B 社の Wi-Fi ルーターは月に 1 回くらいインターネットに繋がらなくなり、再起動を余儀なくされたので慎重になっている。
肝心の Wi-Fi 6 の体感だけど、まあ分からない。https://fast.com/ で測ると 200Mbps が 230Mbps くらいには上がっているような?自己満足の世界。有線インターネットポートが 1GBASE-T から 2.5GBASE-T に上がったことも影響しているのかも。
あと、買ってから Wi-Fi ルーターはアンテナ数よりもストリーム数が大事らしいと知った。でもなぜか公式スペックには見つけられず...。価格.comで調べたのがこちら。
|No.|型番|アンテナ数|ストリーム数|備考
|---|---|---:|---:|---
|0|WN-AX2033GR2/E|4|2|今までの機種
|1|WN-DAX3600QR|4|4|今回購入
|2|WN-DAX3600XR|4|4|
|3|WN-DAX3000QR|4|4|
|4|WN-DAX1800GR|2|2|
|5|WN-DEAX1800GR|2|2|
ここで初めて、今まで使っていた No. 0 と同じ組み合わせはなかったと知った。No. 4 でも問題はなかっただろうなあ。でも後悔はしていない。
**追記(2022-08-13):**
> このまま 3 ヶ月くらい再起動が必要なければ合格としよう。
3 ヶ月どころか、半年再起動不要で安定して使えている。本当に優秀な Wi-Fi ルーターです。
--------------------------------------------------------------------------------
title: "Gmail のフィルターをコード管理して心の平穏を得ることが出来た"
date: "2022-02-13"
--------------------------------------------------------------------------------
最近は人間からのメールは減り、機械からのメールが多くを占めるようになりました。その中にはメールを停止できなかったり、メール購読を義務付けられた酷いサービスもあります。
私は仕事もプライベートもインボックス・ゼロを実践しています。それもあって今まで [Gmail の検索演算子](https://support.google.com/mail/answer/7190?hl=ja)をチマチマと調べて、チマチマと設定していましたが、以前から全てを自分の管理下に起きたい欲求がありました。この度ついに強い衝動にかられたので、ゴリッと管理し始めました。
## gmailctl を使うことにした
こちらの記事にも影響されて、私的には gmailctl が良いという結論に達しました。
[Gmail filters as a code. Using gmailctl to create filters and…|by Hans Jakob Emmel|The Startup|Medium](https://medium.com/swlh/gmail-filters-as-a-code-670fd719f473)
{{< github_repo "mbrt/gmailctl" >}}
最初は [gmailfilters](https://github.com/jessfraz/gmailfilters) を試したのですが、既存の Gmail フィルターがほとんど消えてしまいました。本末転倒。つらすぎます...。(ToT)
Export や例外処理にバグがあるように見えました。
gmailctl の README.md [Comparison with existing projects](https://github.com/mbrt/gmailctl/tree/v0.10.0#comparison-with-existing-projects) でも言及されている [gmail-britta](https://github.com/antifuchs/gmail-britta) は Ruby 製で任意のコードを書けてしまうので、こちらも選択肢から外しました。
任意のコードを書けてしまうと、凝った設定をする可能性があります。今回は単なる設定に過ぎないので、Terraform の HCL のような宣言型で設定できる gmailctl を採用しました。作者が Google で働いていることも少し考慮に入れました。(^^)v
## gmailctl の導入方法
`$ gmailctl init` のテキストナビゲーションに従います。Google の OAuth クライアントを作る必要がありますが、これが結構厄介でした。
```shell-session
$ gmailctl init
The credentials are not initialized.
To do so, head to https://console.developers.google.com
1. Create a new project if you don't have one.
1. Go to 'Enable API and services' and select Gmail.
2. Go to credentials and create a new one, by selecting 'Help me choose'.
2a. Select the Gmail API.
2b. Select 'Other UI'.
2c. Access 'User data'.
3. Go to 'OAuth consent screen'.
3a. If your account is managed by an organization, you have to
select 'Internal' as 'User Type' and Create (otherwise ignore).
3b. Set an application name (e.g. 'gmailctl').
3c. Update 'Scopes for Google API', by adding:
* https://www.googleapis.com/auth/gmail.labels
* https://www.googleapis.com/auth/gmail.settings.basic
5. IMPORTANT: you don't need to submit your changes for verification, as
you're only going to access your own data. Save and 'Go back to
Dashboard'.
5a. Make sure that the 'Publishig status' is set to 'In production'.
If it's set to 'Testing', Publish the app and ignore the
verification. Using the testing mode will make your tokens
expire every 7 days and require re-authentication.
6. Go back to Credentials.
6a. Click 'Create credentials'.
6b. Select 'OAuth client ID'.
6c. Select 'Desktop app' as 'Application type' and give it a name.
6d. Create.
7. Download the credentials file into '/home/masutaka/.gmailctl/credentials.json' and execute the 'init'
command again.
Documentation about Gmail API authorization can be found
at: https://developers.google.com/gmail/api/auth/about-auth
Error: opening credentials: open /home/masutaka/.gmailctl/credentials.json: no such file or directory
```
一時的にでも GCP の言語を English にしたほうが上のナビに悩みづらいと思います。"Help me choose" の日本語訳が "ウィザードで選択" だなんて無理でしょ...。
私は gmailctl という GCP プロジェクトを作って、その中に OAuth クライアントを作りました。自分だけが使うので「公開」はしませんでした。↓ これは面倒すぎる...。

「認証情報」の JSON をダウンロードできるようになるので、~/.gmailctl/credentials.json として保存します。
もう一度 `$ gmailctl init` すると認可用 URL が出てくるので、ブラウザで開いて認可を進めます。Authorization code を取得できるので、コンソールに貼り付けて Enter で完了です。トークンが ~/.gmailctl/token.json に保存されます。
```shell-session
Go to the following link in your browser then type the authorization code:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=(以下略)
Authorization code:
```
gmailctl init のナビに書いてあるとおり、テストモードだと 7 日ごとにトークンが失効するので、再認可が必要になります。
gmailfilters の例ですが、ここまでの流れはだいたい同じなので、参考になるかもしれません。
[最高すぎる!Gmail のフィルタ設定をデプロイできる CLI「gmailfilters」 - kakakakakku blog](https://kakakakakku.hatenablog.com/entry/2020/04/22/090002)
あとは `$ gmailctl download` で設定を全部エクスポートして ~/.gmailctl/config.jsonnet に保存すればスタートラインに立てます。
Gmail のフィルター(や場合によってはラベル)は ~/.gmailctl/config.jsonnet の内容で全て置き換えられるのでご注意を。でも `$ gmailctl diff` で確認できますし、`$ gmailctl apply` で Yes/No を聞かれるのでそこまで危険ではないと思います。
## gmailctl のルール例
ほんの一部です。
```
{
// xxx カードの都度利用通知はそこまで重要でないと、ひと目で分かるようにする
filter: {
and: [
{ subject: 'xxx カードより「カードご利用のお知らせ」' },
{ from: 'info@example.jp' },
],
},
actions: {
labels: ['notifications'],
markSpam: false,
},
},
{
// xxx カードからの毎月のリボ払いのススメはウザいので全部削除
filter: {
and: [
{ subject: '【xxx カード】リボ・分割変更' },
{ from: 'info@example.jp' },
],
},
actions: {
delete: true,
},
},
{
// xxx 新聞からのメールは多すぎてウザいので全部削除
filter: {
to: 'masutaka.net+xxx@gmail.com',
},
actions: {
delete: true,
},
},
{
// このブログのデプロイ失敗通知を Pushover で受け取る
filter: {
and: [
{ from: 'heroku' },
{
or: [
{ subject: 'Automatic deployment of masutaka-net failed' },
{ subject: '[masutaka-net] Release phase command failed to execute' },
],
},
],
},
actions: {
archive: true,
markRead: true,
markSpam: false,
forward: 'example@pomail.net',
},
},
```
Gmail の検索演算子は gmailctl の "query" operator で使えますが、私はそれは使わずに "and" や "or" operator を使うようにしました。Gmail 側のフィルターよりも、gmailctl のコードの可読性を重視しています。
gmailctl に任せると、フィルターの数が増えることはありますが、すっきりとした検索クエリに変換されることもあります。どちらにせよ、gmailctl を使うのであれば gmailctl のレールに乗ったほうが良いと思います。
## 便利関数の紹介
~/.gmailctl/config.jsonnet から import している ~/.gmailctl/gmailctl.libsonnet にはいくつかの便利関数があります。興味深かったので紹介しておきます。リポジトリの README.md にも言及があります。
### chainFilters
Gmail のフィルターには if-else 構文が存在しない。この関数を使えば、前のフィルターに一致したら次のフィルターは適用させないことが出来る。
### directlyTo
Gmail の検索演算子 to は cc や bcc にもマッチするそう。知らなかった。この関数を使えば、to のみにマッチしたフィルターを簡潔に書くことが出来る。
### rulesLabels
存在していないラベルを rules が参照すると、gmailctl apply でエラーが発生する。この関数を使えばそれを回避出来る。ただ、gmailctl とは関係のないラベルも管理下に置く必要がある。
## まとめ
gmailctl を導入して、Gmail のフィルターとラベルをコード管理しました。全てを手中に納めた気がして、とても良いです。心の平穏を得ることが出来ました。
* コード管理することで Git に履歴が残るので、要らなくなったフィルターを気軽に削除できる。戻すことも簡単
* Gmail のフィルターにはコメントを書けなかったが、~/.gmailctl/config.jsonnet には書ける
and や or の論理演算子と戯れるのも楽しかった。
--------------------------------------------------------------------------------
title: "仮想通貨ウォレットを知るために MetaMask と Coincheck のアカウントを作って、仮想通貨を送金してみた"
date: "2022-01-19"
--------------------------------------------------------------------------------
最近、PodCast や [Voicy](https://voicy.jp/) をよく聞くようになりました。今さらながら散歩や掃除中の「ながら聞き」を覚えたからです。
格闘技や歴史、テック系をよく聞きます。[Off Topic](https://open.spotify.com/show/2vQEUz4VUnLcl7vuqSBgJp) も分からないなりに最近は聞く関係で、仮想通貨やウォレット、Web3 関連の話題は気にはなってました。何も分からない...。
という流れで、先週会社でこのツイートが共有されていて「あ、これ~~進研ゼミで見た~~ Off Topic で聞いたやつだ!」と思い、勢いで試してみました。
{{< tweet user="Web3Capital" id="1478331188003557378" >}}
この記事も共有されていたので、一旦何も考えずに従いました。
[MetaMask(メタマスク)とは?使い方やログイン方法をスマホ版・PC版ごとに解説|InvestNavi(インヴェストナビ)](https://fisco.jp/media/metamask-about/)
## ビッコレのアカウント作成は不要
いきなりですが不要です。
記事中の動画には登場人物が3人います。
① [MetaMask](https://metamask.io/)
② [Coincheck](https://coincheck.com/)
③ [ビッコレ](https://bikkore.jp/)
これ、最後まで関係が分からず混乱していたのですが、私は③ビッコレのアカウント作成は不要でした。記事を書いている会社が運営しているサービスなので、紹介するのは分かるのですがね。
ビッコレは「ポイ活」をしてビットコインをゲットするサービスみたいです。ポイ活とか、ビッコレとか略称っぽいのが多くてワイは疲れました...。
LINE の友達になると 250 円相当のビットコインはもらえるのですが、如何せん少なすぎて Coincheck に送金できません。あと、友達をビッコレに招待すると 1,000 円もらえるみたいですが、私は仮想通貨自体には夢を持っていないのでね...。
今回はあくまで雰囲気を知ることが目的なので、私にはビッコレアカウント作成は不要でした。
結果的には、動画をざっと見て①MetaMaskと②Coincheckのアカウントを作るだけで良かったです。記事はより詳しく書いてあって、動画の後に読むと分かりやすかったです。
## 仮想通貨の体験だけなら MetaMask も不要
ちなみに Coincheck もウォレットの機能は持っているので、MetaMask は必須ではないのですが、記事によると
> イーサリアムブロックチェーンに連動する金融サービス、ゲーム、NFTを利用するには、仮想通貨ウォレットであるMetaMaskを通して決済しなくてはいけません。
という話はあるみたいです。なるほど。分からん。
あとは秘密鍵(シークレットリカバリーフレーズ)がオフラインで管理されることになるため、Coincheck などよりリスクが分散されてはいる理解です。
## 心が折れそうになった Coincheck の本人確認
Coincheck のアカウントを作った後に必要な「本人確認」が非常に厄介でした。私は4回失敗しました。20回くらい動画撮りましたよ...。
5回目に、本人確認に使う書類をマイナンバーカードから運転免許証に変えたら、一発で通りました。何も分からない...。
## 仮想通貨の購入
あとは Coincheck の銀行口座に日本円を振り込めば、仮想通貨を購入できます。私は一旦 5,000 円振り込みました。22:00 過ぎだったと思いますが、まもなく Coincheck のスマホアプリで入金を確認できました。
ここ一番注意なのですが、MetaMask にはイーサリアム系の仮想通貨しか入れられないので、**誤って先頭にある BTC(ビットコイン)を購入しないようにしましょう。ETH(イーサリアム)を購入すれば OK です。**
私は間違えて BTC を買ってしまい、泣く泣く BTC を売って ETH を購入しました。それでもう 2,500 円くらいに減ってしまいました。手数料怖い。
## MetaMask への送金
いよいよ今回の目玉、MetaMask への送金です。Coincheck のスマホアプリまたは Web から、MetaMask のスマホアプリで確認できるアドレスに送金するだけです。手数料は ETH でかかります。
これで今回のミッションは終了です。やったぜ!とツイートしたところ、
{{< tweet user="masutaka" id="1483086310751768576" >}}
ひゃー!(↑への返信を見るとわかります)ものの数秒で 10 件くらい返信やメンションが来ました。
{{< tweet user="masutaka" id="1483086687119220737" >}}
ご注意ください。全部無視すれば OK です。
{{< tweet user="masutaka" id="1483087404793995264" >}}
今は BAN されたのか確認できませんが、MetaMask のサポートに見えるアカウントからも返信が来てました。もちろん偽物です。
## まとめ
仮想通貨ウォレットを知るために MetaMask と Coincheck のアカウントを作ってみました。やってみて罠を踏んだり、腑に落ちたりと、実りある体験でした。
## [おまけ] マネーフォワード ME との連携
Coincheck はマネーフォワードと連携できます。API キーを作って、マネーフォワードから連携するだけです。今は 800 円ほど入ってます。
一方の MetaMask はマネーフォワードと連携できません。なんだか損した気になりますが、多分気のせいです。
MetaMask のスマホアプリを見ると 1,800 円ほど入っています。Coincheck と合わせて 2,600 円。2,400 円が亜空間に飲み込まれた計算になります。
--------------------------------------------------------------------------------
title: "Manjaro で CD をリッピングする"
date: "2021-12-30"
--------------------------------------------------------------------------------
[Asunder](http://littlesvr.ca/asunder/) という GUI ツールを使えば、簡単にリッピング出来る。
```
$ sudo pacman -S asunder
```
エンコーダがないので、Asunder 上で直接 AAC(.m4a) に変換出来ない。「設定」で促されるがままに fdkaac をインストールすれば OK 。
```
$ sudo pacman -S fdkaac
```
デフォルトの CDDB サーバ gnudb.gnudb.org:8880 だと、『青天を衝けI』のサントラは引けなかった。有志の方が立てたサーバだと引けた。
> サーバ: freedbtest.dyndns.org
> ポート: 80
ただ『青天を衝けII』は引けなかった。Linux からでもこの freedbtest サーバに登録は出来ると思うが、[サイト](https://freedbtest.dyndns.org/)に書かれているのは Windows アプリ CDex での登録方法のみ。
iTunes だとどちらのサントラも引けた。iTunes は Gracenote という CDDB サーバを使っているらしい?ちなみに CDDB は Gracenote の登録商標らしい。
freedbtest サーバに登録できたとしても、YouTube Music に登録するためには、各 .m4a ファイルにアートワークを登録しないと寂しいことになる。なんらかの方法で .m4a ファイルを編集する必要がある。
そういえば .mp3 ファイルの時は Emacs の [mpg123.el](http://www.gentei.org/~yuuji/software/mpg123el/) 経由で id3put を使って編集した記憶。当時はアートワークなんてものはなかったけどね。懐かしい...。
いろいろ面倒くさいので、結局 Windows の iTunes でリッピングするのが一番楽なのであった...。
・{{< wikipedia "CDDB" >}}
・[freedb 日本語](https://freedbtest.dyndns.org/)
・[Asunderで参照先CDDBサーバーを変更: k のガジェット日記](http://fanblogs.jp/kzgadgets/archive/476/0)
・[「まだ自作CDをCDDBに登録してないの?」実はあなたも出来ていない?!CDDBへの登録について - 夕立ノート](https://mofday.info/cddb/)
--------------------------------------------------------------------------------
title: "2021 年に買って良かったもの 7 選(ガチ)"
date: "2021-12-26"
--------------------------------------------------------------------------------
年末ということで、今年買って良かったものを紹介します。~~月に 1 本書くことにしている、ブログ記事のネタが思いつかないこともあり...。~~
## 1. Anker Magnetic Cable Holder
{{< amazon asin="B08CRCZ4NX" title="Anker Magnetic Cable Holder マグネット式 ケーブルホルダー ライトニングケーブル USB-C ケーブル Micro USB ケーブル 他対応 (ブルー)" >}}
これはマジおすすめです。机の下にケーブルが落ちて拾うストレスがなくなりました。
当時の机の天板は少しツルツルで、今はザラザラですが、どちらも全く問題なく吸着しています。シールタイプではないので、剥がした時に跡が残らないのも良いです。
詳しくは {{< post "2021-03-24-1" >}} をどうぞ。
## 2. ノートパソコンスタンド
{{< amazon asin="B08G8X8J3X" title="ノートパソコン スタンド PCスタンド 縦置き 3台収納 ホルダー幅調整可能 アルミ合金素材 Geecol Vertical Laptop Double Stand for MacBook Pro Air Mini Clamshell Mode & All Notepc" >}}
これも良かったです。パソコンを使わない時、個人用と仕事用のどちらも邪魔なく縦置き出来るようになりました。会社の同僚曰く「複数台を縦置きするスタンドの発想はなかったかも……」とのこと。
詳しくは {{< post "2021-04-04-1" >}} をどうぞ。
## 3. スマホスタンド
{{< amazon asin="B08NZPNV6F" title="スマホリング 【MindSky2021年業界初製品】、縦置きできるな新バンカーリング、折りたたみ耐久性スマホリング、携帯リングガ角度可調薄型180°360°回転、落下防止の携帯キラキラすまほりんぐ、 スマホ固定磁石強力粘着おしゃれフィンガーリング、取り外し可能片手操作可アイホン指リング、 横 縦 ホールドリング(ケイタイスマホスタンド機能式)、マグネット車載ホルダー付属、5つの3M VHB粘着パッド+5つ透明フィルム(いつでも交換可能) iphone/ipad/Android/switch/kindle/iFace ケース各種他対応" >}}
スタンド絡みでもう一丁。個人的には今年の MVP です。
今使っている Pixel 3a XL {{< post "2020-07-14-1" >}} は裏側に指紋センサーがあります。今まで机の上に平置きしていたので、スマホを使おうとすると以下の 2 ステップ必要でした。
1. スマホを持ち上げる
2. 指紋認証する
このスタンドのおかげで 1 ステップ減らせました。
1. 指紋認証する
横置きも出来るし、裏側のリングを伸ばして壁などにかけられるし、スマホリングにもなるので、万能感があります。普通のスマホスタンドと違って場所を取ることもありません。お値段も 1,000 円ちょっとです。
## 4. MacBook Pro 用クーラー
{{< amazon asin="B07281KZRJ" title="エレコム USB扇風機 縦置き/横置き/ PC&タブレット冷却台 3段階風量調整 ブラック FAN-U177BK" >}}
机の上がらみでさらにもう一丁。私の 2 代目 MacBook Pro 用クーラーです。これがないと指先が熱くて仕事になりません。
完全に仕事用に買いました。個人用の VivoBook では全く不要です。自分の中では正直言って、MacBook Pro は欠陥商品です。あ、ディスってしまった...。M1 MacBook Pro では不要なことを祈ります。
詳しくは {{< post "2021-05-23-1" >}} をどうぞ。
## 5. チェアマット
{{< amazon asin="B092ZCGHGW" title="チェアマット 床保護マット 140×90cm 厚み4mm デスク足元マット カーペット ラグ デスクマット 滑り止め加工 ズレない 吸着 床マット 床を傷から守る 床暖房対応 カットでき 吸音 幅広く使える パンチカーペット フロアマット オフィスチェア下マット" >}}
今度は机の下です。これも地味に良い買い物でした。会社の Slack で聞いたら教えてくれたやつです。
床に傷が付かない、掃除機をかけやすい、剥がしても床に跡が残らない、と良いことづくめです。おまけに値段も 2,000 円ちょっと。
ブラックやブラウンだとホコリが目立ちやすい気がしたので、ライトグレーを買いました。ホコリは気になっていません。
## 6. ソーダストリーム
{{< amazon asin="B08GX731H1" title="ソーダストリーム スピリット スターターキット (未発売ブランドロゴボトル付) " >}}
WFH (Work From Home) に突入してすぐに買えば良かったやつです。以前は毎日コンビニで数本の炭酸水を買って、2 週に 1 回は溜まったペットボトルを資源物回収に出していました。結構面倒でした。
躊躇していたのはうちの狭いキッチンには邪魔かと思っていたからです。意外とコンパクトで邪魔になりませんでした。
買ったのは電動ではなく手動タイプです。慣れれば十分かな。コードもありませんからね。
ガスシリンダーの扱いが独特で、ゴミに出すことは出来ず、購入時に空のシリンダーを返却というフローです。シリンダーは 2 本以上所持することも出来て、それぞれ初回は少し高かったかも。
うちから少し歩いたところのライフで売っているので、切れたらテクテク歩いて買いに行っています。そろそろ切れそう。
ガスシリンダーは宅配も可能だそうです。
## 7. 番外編: ブレインスリープのマットレスと枕
・[ブレインスリープ マットレス (オーバーレイ)](https://brain-sleep.zzz-land.com/products/brainsleepfloatmattress/)
・[ブレインスリープ ピロー + カバー](https://brain-sleep.zzz-land.com/products/brainsleeppillow/)
合う合わないは人によるので紹介だけ。
{{< post "2015-12-15-1" >}} に買った布団がヘタりすぎて、起きると腰痛ということが続いていたので、人生で一度くらい高いマットレスを買ってもいいか!と思って買いました。
YouTube で見つけた マットレス 20% OFF キャンペーンと、15,000 円 OFF クーボンを使って、お値段をそれなりに抑えることが出来ました。
¥88,000 マットレス + マットレスカバー
¥33,000 枕 + 枕カバー x 2
- ¥18,370 キャンペーン
- ¥15,000 クーポン
ーーーーーーーーーーーーーーーーーーー
¥87,630
さらに↑これで溜まったポイントを使って 2 枚目のマットレスカバーを購入。
¥6,600 マットレスカバー
- ¥1,376 ポイント
ーーーーーーーーーーーーーーーーーーー
¥5,224
起きがけの腰痛がほぼなくなったので、私は多分合いました(そう信じたい)。お値段相応か?と言われるとどうなんだろう?
## まとめ
2021 年に買って良かったもの 7 選を紹介しました。あいかわらず WFH が続いているので、それ関連への投資が多く、おかげでどんどん仕事環境が良くなっています。
来年も、より良い環境を作る予定です。それではよいお年を!
--------------------------------------------------------------------------------
title: "『論理が伝わる 世界標準の「書く技術」』を読んだ"
date: "2021-11-29"
--------------------------------------------------------------------------------
職場の同僚が勧めていたので遅ればせながら読みました。私が 20 年近くかけてたどり着いた技術(未だに不完全です)を、この本で習得出来る人が羨ましいです。
{{< amazon asin="B00IJ6UYYE" title="『論理が伝わる 世界標準の「書く技術」』を読んだ" >}}
仕事で少しでも文章を書く人全てにオススメします。ブログを書く人にもオススメできます。反対に、物語を書くための技術ではありません。
欧米では論理的な文章はパラグラフを使って書くそうです。パラグラフで書けば各パラグラフの先頭文をつまみ食いする、流し読みが出来ます。副次効果として、速読出来る文章になります。もちろんじっくり読むことも出来ます。論理的な文章は物語などと違って、関係者以外は流し読みしたいことが多いですからね。
特筆すべきことは、この本自体がパラグラフで書かれていることです。流し読みできます。しました。
パラグラフを適切に使っていれば、文字どおり見た目が良くなると感じてきました。良いメールやブログを書けた時は、見た目に惚れ惚れして何度も眺めたものです。
社内の日報や手順書、インシデントレポートなどの文書に目を向けると、なんでも箇条書きにされていることが多い印象です。関係性がないものが羅列されており、すごくネストしていることもあります。
パラグラフで書けば良いのにと、よく思ってきましたが、今まで説得するすべがありませんでした。これからは「この本読んで」で良さそうです。私もこれから意識的にこの本の技術を使います。
プログラミングにも通じそうです。悪いプログラムは全部読まないと理解できませんが、良いプログラムは先頭の一文(interface)を読めば何となく理解できます。
同じ著者のプレゼン版もあり、Kindle 版は 330 円割引だったので積みました。いつか読もう。あかん...。
{{< amazon asin="B00IJ6UZP2" title="論理が伝わる 世界標準の「プレゼン術」" >}}
--------------------------------------------------------------------------------
title: "サービス側にメールアドレスを公開しない方法を調べた(Firefox Relay や 1Password + Fastmail のお話)"
date: "2021-11-17"
--------------------------------------------------------------------------------
{{< post "2021-08-07-1" >}} にデフォルトブラウザを Firefox に変えて、3 ヶ月くらい続いている。
昔と違って、基本的な使い勝手や見た目は Chrome と違いがない。当たり前だけど Chrome と比べて良い点も悪い点もある。総合的に割と良い選択をしたと思っている。※ 変化できないことやロックインされることを、最近極端に恐れるようになった事情あり。
なにかの通知で [Firefox Monitor](https://monitor.firefox.com/) から、自分のメールアドレスやパスワードの流出を確認できることを知った。1Password でも出来るやつね。
その Firefox Monitor 経由で [Firefox Relay](https://relay.firefox.com) も知った。リリース当時のニュースは見ていたと思うので、「思い出した」が正確だと思うけど。
[無料でアカウント作成時に使える捨てメアドを自動生成して本来のメールアドレスを守る「Firefox Relay」レビュー - GIGAZINE](https://gigazine.net/news/20200825-firefox-relay/)
ということで、せっかくなので軽く調べてみた。流れで、類似サービスである 1Password+Fastmail や Apple のやつも。
## Firefox Relay
https://relay.firefox.com
無料だと 5 つまでランダムなメールアドレスを作れる。
日曜日はそれ以上作れなかったので、ベータリリースから 1 年以上経ってまだ正式リリースされてないんだ?と改めてログインして確認したら、Premium プランが現れていた・・・!

PayPal 払いの $0.99/month。本格的に使うとなるとロックインされるのは確か。さてどう判断するか。

メールエイリアスを 5 つ作ったから Premium プランが現れたのか、ログイン後数日経ったから現れたのか。どっちだろう?
オフィシャルで Add-on があるので、割と簡単に作れそう。
[Firefox Relay – 🦊 Firefox (ja) 向け拡張機能を入手](https://addons.mozilla.org/ja/firefox/addon/private-relay/)
**追記(2021-11-18):**
なんとびっくり!このタイミングでの正式リリースでした。メールエイリアスのドメインも relay.firefox.com から mozmail.com に変わってた。
[Firefox上でサービス登録用の捨てメアドを無限に自動生成して管理してくれる「Firefox Relay Premium」が登場 - GIGAZINE](https://gigazine.net/news/20211118-firefox-relay-premium/)
## 1Password + Fastmail
https://1password.com/jp/fastmail/
1Password でも同じことが出来る。正確には、1Password と提携した Fastmail でだけどね。
1Password ユーザーは無料かと思いきや、料金が発生する([Fastmail Pricing](https://www.fastmail.com/pricing/))。$3/month, $5/month, $9/month のプランがある。最初の1年間は 25% OFF らしい。
セキュリティ関係のサービスだから、安さを重視してはいけないとは思うけど、ロックインされるサービスなのでいろいろ悩ましい。サブスク地獄...。
## Apple の「メールを非公開」
[「メールを非公開」とは? - Apple サポート (日本)](https://support.apple.com/ja-jp/HT210425)
Apple ユーザーならこれだよね。ただしこれも [iCloud のサブスクリプション](https://support.apple.com/ja-jp/HT201238)が必要。最低 ¥130/month
私はつい最近まで Apple ユーザーだったから分かるけど、ガジェットでロックインされまくって、各種サービスのログインまで Apple にロックインされるのは、なかなかつらいものがある。※ 個人の感想です。
## 自前で頑張る
Amazon SES と自ドメインとか使って、サービスごとに異なるメールアドレスを発行する方法もあるにはある。
よほどのモチベーションがないと無理だなー。自分のオペミスや AWS のインシデント等で使えなくリスクはあるし、止めたくなった時に、各サービスのメールアドレスを変更しなおすのも面倒。
ちなみに hoge+aaa@gmail.com とかだと、メールアドレスがどこで流出したかはワンチャン分かるけど、自分のメールアドレス自体は隠せない。
※ [RFC 5233](https://datatracker.ietf.org/doc/html/rfc5233) の「サブアドレス拡張」で定義されているようです。
関連記事: [Gmailでメアドが無限に増殖できるワザの名前と起源について - in between days](https://mohritaroh.hateblo.jp/entry/2020/08/23/161500)
**追記(2021-11-17):**
会社の同僚から、さくらのメール専用プランを教えてもらいました。自前で頑張るよりは良いかもしれません。87円/month
https://rs.sakura.ad.jp/mail/
**追記(2021-12-05):**
Firefox Relay のバグチケットはこちら。日本ではまだ Premium プランに出来ないし、使えないサービス多いし、まだ全然実用的でない。
[550 5.7.1 TLS required by recipient · Issue #757 · mozilla/fx-private-relay](https://github.com/mozilla/fx-private-relay/issues/757)
--------------------------------------------------------------------------------
title: "ニチレイフーズダイレクトが自分に合うかも"
date: "2021-10-27"
--------------------------------------------------------------------------------
[ニチレイフーズダイレクト](https://wellness.nichirei.co.jp/)が良い感じです。
{{< tweet user="masutaka" id="1449715529317425152" >}}
{{< tweet user="masutaka" id="1450443226956005376" >}}
{{< tweet user="masutaka" id="1450788495677542404" >}}
サービスを知ったのはこのサイトです。
[ひとり暮らしの僕が「宅食&食材宅配サービス」を15個試したら、自炊の“苦手度”が下がった](https://card-media.money.rakuten.co.jp/articles/2021/09/07/01/)
一食あたり 700 円ちょっと。全体的に油控えめなのか、薄味なのか、自分に合います。
容器が薄いので冷凍庫を有効に使えるのも良い感じです。うちの中型冷蔵庫だと 8 食は余裕で入りました。
今だけなのか、500 円クーポンが毎回入っています。まあ私は飲食系に割引はあまり求めないですけどね。
ワンショットでの注文も、定期での注文も対応しています。そろそろ定期にしようかな。
## なぜ使い始めたのか
この前に [nosh](https://nosh.jp/) を2ヶ月くらい試していました。
悪くはなかったのですが、微妙に胃もたれするのと、カロリーを抑えるためか甘味料を使っていたので、代わりのサービスを探していました。
甘味料はスクラロースやアスパルテームがよく使われていました。私はそこまで抵抗はないのですが、今は特にカロリーを抑える理由はないので、nosh を選択する理由もないのかなと。お菓子に甘味料はまだ分かるけど、食事に甘味料はなあ?(それは抵抗があると言うのでは?)
あと、容器が微妙に大きくて冷凍庫に 6 食入れるのがやっとでした。
そもそもなぜ nosh を使い始めたのかというと、自炊に飽きたからですね。最近は野菜炒めかトマトソースしか作っていませんでした。(^^;
3 年くらい前は意識高い系()だったので、[マッスルデリ](https://muscledeli.co.jp/)も少し使ってました。温めがうまくいかず、ご飯はパリパリ、おかずは冷たいってことがよくあったので止めた記憶です。一食あたり 1200 円と高かったので長く続けるつもりもなかったですけどね。
## 残念なところ
[サイト](https://wellness.nichirei.co.jp/)が微妙に残念です。
サイトのログインセッションが 1 日くらいしかもたないかも? EC サイトでこれは珍しい。不便なだけでは?あと、1Password でログイン情報を入力するとパスワードが倍になる(abc だったら abcabc)っぽいです。変なところが残念です。
サインアップの時のパスワード再入力がコピペ禁止だったかもしれないです。こういうのは若干○意が湧きますね。(^^)
## 追記(2023-04-03): ログインが改善された
> 1Password でログイン情報を入力するとパスワードが倍になる(abc だったら abcabc)っぽいです。
少し前に直りました。良かった良かった。:smile:
--------------------------------------------------------------------------------
title: "RIZIN LANDMARK vol.1 の時間帯に発生した U-NEXT の障害体験メモ #RIZIN_LANDMARK #RIZIN_LANDMARK01"
date: "2021-10-03"
--------------------------------------------------------------------------------
RIZIN 初の、配信に特化した格闘技イベント [RIZIN LANDMARK vol.1](https://jp.rizinff.com/_ct/17475182) が 2021-10-02(土)19:00 から開催されるはずだった。ちなみに 4 試合で ¥3,800 と、オトクな料金設定ではない。
その時間に合わせて 18:45 頃に PC ブラウザで https://video.unext.jp/ にアクセスしたら、しばらく待たされた後 502 Bad Gateway が返ってきた。

U-NEXT 公式アカウントからはお知らせがあった。https://video.unext.jp/ 自体にアクセス出来ないため、サイト上でのお知らせは確認できず。
{{< tweet user="watch_UNEXT" id="1444240788150362117" >}}
しばらく待ってもアクセスできなかった。スマホアプリならアクセスできるとの情報を目にしたため Android 版をダウンロードしたところ、エラーにはならず静止画を見られた。幸い Chromecast を持っていたため、テレビにキャストして大画面には出来た。
PC ブラウザだと相変わらず 502 Bad Gateway が発生。その後 404 Not Found のケースや、CloudFront が返す nginx らしきエラー文言も確認できた。スマホアプリはしばらくお待ちくださいメッセージと BGM が流れるのみ。
自分の経験上、Chromecast でスマホアプリをテレビにキャストするより、PC をテレビに HDMI 接続するほうが安定性が高いので、見られはしたが不安要素はあった。
19:45 にスタジオの映像が繋がり、RIZIN CEO 榊原さんからお詫びとともに 20:00 に開催するとのお知らせがあった。実際開催され、21:30 頃の終了まで、特に問題なく視聴することが出来た。
ただし、その間 PC ブラウザはエラーになり続けたようだ。途中でブラウザのタブを閉じたため、復旧時間は分からない。
試合の合間に U-NEXT の CM が入ったのは視聴者体験として最悪だった。それも RIZIN に合わせたわけではない普通の U-NEXT の CM。もちろんその時はまだ障害発生中。いやー、最悪だったw
参考: {{< tweets_on_the_day text="当日の私のツイート" day="2021-10-02" >}}
## 勝手に想像したこと
PC ブラウザ経由のアクセスについて、RIZIN LANDMARK 視聴者だけでなく、U-NEXT 視聴者全体に影響が出ていたと思われる。
PC ブラウザはエラーになり、スマホアプリは問題なかったことと、502 Bad Gateway という事象から、両者のバックエンドサーバー群は別だったと考えられる。ちなみに成人向けの https://video.hnext.jp/ に PC ブラウザでアクセスしたらこちらも問題なかった。こちらも別だと考えられる。
PC ブラウザは 20:00 以降もエラーが解消されなかった。バックエンドサーバーをスケールアウトするのにそこまで時間がかかるものだろうか?
video.unext.jp は CloudFront の IP アドレスと紐付いていた。https://video.unext.jp から適当に見つけた in.unext.jp は AWS ELB の IP アドレスだった。
```
$ dig +short video.unext.jp
d1p8rc5i9ac9qt.cloudfront.net.
13.225.159.68
13.225.159.100
13.225.159.56
13.225.159.96
$ dig +short in.unext.jp
td-bridge-43693737.ap-northeast-1.elb.amazonaws.com.
35.74.87.62
54.65.156.101
52.193.64.209
```
勝手に想像するに、バックエンドサーバーは素の EC2 インスタンスで、運用の事情でスケールアウトに時間がかかったのかな。ECS を使っていたにしても、EC2 インスタンスの台数の上限に達してしまったのかもしれない。AWS のサポートに連絡するも、すぐには上限を開放できなかったとか、もしくは土曜日ということもあり、障害発生時に当番エンジニアに連絡がつかなかったとか。
## 格闘技イベントならではの事情
榊原さんの総括によると、格闘技イベントは間際の購入が多いそう。
{{< youtube id="atb4gU7YLto" title="榊原信行CEO 総括/ +WEED presents RIZIN LANDMARK vol.1" start="980" >}}
RIZIN Live は前日までの購入だと 500 円安いけど、U-NEXT は何もない。視聴者としては、今回早く買うインセンティブはなかった。ちなみに私は前日に買った。計画的奴。
それもあって調達すべきサーバーの台数を見誤り、今回の障害が発生したのだと思う。
U-NEXT では今まで音楽イベントのライブ配信はあったそうだが、外でも配信をしていたそう(噂レベル)。格闘技の独占配信ライブは初めてだったようなので完全な見積もりミス。初めての時は、見積もりの 2 倍くらいにはすると思うのですがね。ちなみにライブ視聴数は公式にはお知らせはないが 10 万人には行かないそう。
RIZIN としては「U-NEXT 独占配信」が仇となった。
## まとめ
2021-10-02(土)18:30 頃から 21:00 過ぎまで(?)に U-NEXT を PC ブラウザで見られない障害が発生した。スマホアプリでは見られた。
同時間帯は [RIZIN LANDMARK vol.1](https://jp.rizinff.com/_ct/17475182) のライブ配信のまっただ中。格闘技イベントという性質上、ネット上では不満が爆発した。選手もいつまでか分からない中待たされて、大変だったと思う。
RIZIN は U-NEXT とのタッグを今後も続けるのであれば、早く買えば少し安くなるなど、見積もりの制度を上げる施策は必須。加えて、試合の高揚感をぶち壊すような CM を流さないことはもちろん、U-NEXT 上でも RIZIN のユーザー体験が出来るような、コミュニケーションのすり合わせも。配信プラットフォームを冗長化することも必要かもしれないが、アライアンスという意味では難しいのかな?
そもそも今後、朝倉海選手の海外転向、那須川選手のボクシング転向など、スター選手が減る中で、配信特化型イベントを続けられるかという問題はあると思う。
## その後の動き
2021/10/04 に U-NEXT から謝罪のお知らせがありました。
[格闘技イベント『RIZIN LANDMARK』の配信につきまして - お知らせ|U-NEXTヘルプセンター](https://help.unext.jp/info/info293)
2021/12/24 に 500 ポイントのギフトコード付与のお知らせメールが来ました。
2022/02/25 時点でまだ決着が付いていないそう。
{{< tweet user="majan_saitou" id="1497087274030608384" >}}
--------------------------------------------------------------------------------
title: "Terraform を使わずに Route 53 の DNS レコードを管理する方法を調べてみた"
date: "2021-09-27"
--------------------------------------------------------------------------------
この1年半はインフラエンジニアっぽい仕事から離れて、LookML 開発者として仕事をしています。自分としてはジョブチェンジで、モチベーションはめっちゃ高いです。うぉー!🔥
LookML 開発に出来るだけ専念できるように配慮して頂いたり、自分でもそう心がけていますが、それでも DNS レコードの登録依頼や、その他諸々の相談がちょいちょいあります。
DNS レコードは Route 53 で管理しています。言われるがままに登録していけば悩みはないのですが、何のために登録するのか?や、登録されているこのレコードは何だ?とか考え始めると地味に悩ましいものがあります。
今の仕事では Terraform は使っていないし、このためだけに Terraform を導入するのはオーバー過ぎます。
Terraform を導入したらアップデートし続けない選択肢はありませんが、変なエラーでハマって何時間も浪費することがあります。今の仕事の性質上、それは絶対に避けたいので、Terraform 以外で Route 53 の DNS レコードを管理する方法を調べてみました。
## SAM で管理できるか?
つまり CloudFormation 管理下に置くか?ということです。
Terraform ではツールのアップデートに追随する必要がありますが、SAM なら serverless-application-model のバージョンに追随すれば良いだけです。最新は [2016/10/31](https://github.com/aws/serverless-application-model/blob/v1.38.0/versions/2016-10-31.md) なので、あまり考えなくて良さそうです。
{{< github_repo "aws/serverless-application-model" >}}
結論としては、止めたほうが良いと思いました。良くも悪くも CloudFormation 管理下に置かれるので、Route 53 Console 上で気軽に変更するとコードと乖離してしまいます。そのため常に SAM で変更する必要があります。もっとカジュアルに管理したいのです。
ちなみにこんな template.yaml で DNS レコードを作れます。ただ更新がうまく出来なかった。それ以上は調べてない...。
```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Managed by AWS SAM
Resources:
Hoge:
Type: AWS::Route53::RecordSet
Properties:
HostedZoneId: xxxxxxxxxxxxxx
Name: hoge.masutaka.net.
Type: TXT
TTL: 300
ResourceRecords:
- '"abcdefgxyz"'
```
## AWS CLI で管理できるか?
そもそもエネルギーを注ぐところではないので、新しいツールは増やしたくないところ。そういう意味では AWS CLI でどこまで出来るかは興味がありました。
AWS CLI を使った DNS レコードの設定方法はクラスメソッドさんのブログ記事が分かりやすいです。
[AWS CLI で Route53 のホストゾーンのレコードを操作してみた|DevelopersIO](https://dev.classmethod.jp/articles/route53-hostedzone-change-by-aws-cli/)
作成したいレコード設定を書いて、それに対して CREATE/DELETE/UPSERT をするイメージです。UPSERT は UPDATE+INSERT の造語です。なければ作るし、あれば更新する。
こんな Makefile があれば管理できるか検討しました。latest-update.json に変更したい設定を書き、route53-records.json に現在のレコードを全部記録します。
```
AWS := aws
IGNORE_EXIT_STATUS := || :
JSON_FILE := latest-update.json
ROUTE53_RECORDS := route53-records.json
WAIT_SEC := 5
ZONE_ID := xxxxxxxxxxxxxx
.PHONY: list
list:
@$(AWS) route53 list-resource-record-sets --hosted-zone-id $(ZONE_ID)
.PHONY: apply
apply:
@$(AWS) route53 change-resource-record-sets --hosted-zone-id $(ZONE_ID) --change-batch file://$(JSON_FILE) $(IGNORE_EXIT_STATUS)
@echo "Wait $(WAIT_SEC) seconds..."
@sleep $(WAIT_SEC)
@make --no-print-directory list > $(ROUTE53_RECORDS)
```
結論としては、変更は出来るけど管理をするのは難しいと思いました。
運用できなくはないのですが、管理のための管理になる気がしました。特に DELETE ではレコード名以外に TTL など現在の設定を全て指定する必要があります。面倒です。
せめて各レコードのコメントを route53-records.json に残せれば良いのですが、json にはコメントを書けないので、コード管理する旨味がありません。
## Roadworker で管理できるか?
最後に Roadworker を検討しました。
{{< github_repo "codenize-tools/roadworker" >}}
Roadworker は Ruby 製のツールです。"$ roadwork -e -o Routefile" で Routefile ファイルにエクスポートして、以後は Routefile を変更し、"$ roadwork -a" で Route 53 に適用します。
Routefile は Ruby の DSL なので、各レコードにコメントも残せます。
Route 53 Console 上で変更するとコードと乖離するのは SAM と同じですが、状態もコードも Routefile に集約されるので、そこまで気にしなくて良いかもしれません。
※ SAM は状態が CloudFormation に、コードは template.yaml に分かれるという理解。
問題は Routefile 自体にはバージョンがないため、Roadworker 自体のバージョンを気にする必要があることでしょうか。Gemfile で Roadworker のバージョンを管理した方が良いと思います。
でも今回のコンテキストではやりたくありません。まあ、気にせずグローバルにインストールすれば良いのですがね。自分が気にし過ぎなのか...。
## 結論
DNS レコード一覧の esa 記事作って、ゆるふわで把握することにします。(なんだそりゃ
今回の課題を掘り下げると、DNS レコードにメモを残したいだけなんですよね。特に TXT レコードはよく分からないものが残りがちで、消して良いのか判断が難しいです。
今回の中では Roadworker が及第点ではありますが、Routefile のための GitHub リポジトリが増える、新たなツールが登場するなど、デメリットがメリットを地味に上回り、オーバーだと判断しました。
Route 53 の各レコードに「メモ」を書きたいだけだった。:sob:
--------------------------------------------------------------------------------
title: "Manjaro でハイバネート出来るようにしたメモ"
date: "2021-08-25"
--------------------------------------------------------------------------------
4月から個人 PC を MacBook Air から Linux マシンに変えました。{{< post "2021-05-06-1" >}}
スライド P41 に書いたとおり、たまにスリープから復帰しなくてつらいです。仕方がないので「スリープしない設定にする。常にAC電源ON:hugs:」という運用でカバー()をしていました。:sob:
{{< hatenablog title="『ここがつらいよ普段使いのLinux』という発表をした - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2021/06/11/180000" >}}
いつまでも続けるわけにもいかないので、今回重い腰を上げてハイバネート出来るようにしました。
## Linux (Xfce4) のスリープ方式
私が使っているウィンドウマネージャーは Xfce4 です。電源管理の設定等で出てくるスリープ関連の用語と、自分なりの理解は以下のとおりです。情報源は {{< wikipedia word="Advanced_Configuration_and_Power_Interface" text="Wikipedia" >}} です。😆
* サスペンド
* メモリ以外の給電停止した状態。ACPI では S3 に相当する
* ハイバネート
* メモリの内容をストレージに移し電源断。ACPI では S4 に相当する
* ハイブリッドスリープ
* サスペンドとハイバネートの中間だと思われるが、試したらすぐハイバネートしただけだった...
## macOS (Big Sur) のスリープ方式
macOS ではサスペンドやハイバネートの使い分けは不要で、意識するのは「スリープ」のみです。以下のような「[セーフスリープ](https://support.apple.com/ja-jp/guide/mac-help/mh10328/mac)」という機構を備えているそうです。
* スリープ状態になると、メモリの内容を保持したままストレージにも保存する
* スリープ中にバッテリーが切れていなければ、復帰時にメモリの内容を使う
* スリープ中にバッテリーが切れていたら、復帰時にストレージの内容を使う
奨励はされていませんが、pmset コマンドでスリープ方式を「セーフスリープ」から「スリープ」または「ディープスリープ」に変更は出来るようです。
「スリープ」は ACPI の S3 に相当し、「ディープスリープ」は S4 に相当するようなので、Xfce4 の「ハイブリッドスリープ」は「セーフスリープ」が本来の振る舞いなのかも。
※ 状態としての「スリープ」と、その種類としての「スリープ」(と「セーフスリープ」「ディープスリープ」)があるので、文章がややこしいです。
## Linux と macOS の振る舞いの違い
macOS の素晴らしい点に、ユーザーにスリープをほぼ意識させない設計があると思います。
サスペンドやハイバネートのような用語が現れないこともさることながら、MacBook なら蓋を開けばログイン画面が表示されるだけです。多少復帰がもたつくことはあるのはご愛嬌。
Linux はサスペンドは同じとしても、ハイバネートは OS の起動から始まるので、「あれ?バッテリー切れてた?」と一瞬不安になります。Windows も同じという理解です。
どの OS もバックグラウンドの処理は同じだと思います。macOS はユーザーへの見せ方がきれいですね。
## Manjaro でのハイバネート設定方法
「[サスペンドとハイバネート - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%B5%E3%82%B9%E3%83%9A%E3%83%B3%E3%83%89%E3%81%A8%E3%83%8F%E3%82%A4%E3%83%90%E3%83%8D%E3%83%BC%E3%83%88)」に従いました。以下の流れです。
1. スワップファイルを作る
2. 関連するカーネルパラメータを GRUB(ブートローダー)に追加する
3. 関連するフックを initramfs に追加する
### 1. スワップファイルを作る
今回は /swapfile という 18GB のスワップファイルを作りました。
```console
$ sudo fallocate -l 18G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
```
この VivoBook のメモリは 16GB です。[RedHat の記事](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/ch-swapspace)に従い、スワップファイルのサイズは 18GB にしました。
無事作られました。
```shell-session
$ swapon -show
Filename Type Size Used Priority
/swapfile file 18874364 0 -2
```
永続化するために /etc/fstab に以下を追記しました。
```text
/swapfile none swap defaults 0 0
```
ちなみに、今回のような任意サイズのファイルは dd でも作れます。ただ、dd は実際にファイル書き込みが発生するため、可能なら fallocate を使うほうが無駄がなくて良いと思います。
参考記事: [Linuxでサイズ指定してダミーファイルを作成する方法 - conf t](https://monaski.hatenablog.com/entry/2016/02/21/225849)
### 2. 関連するカーネルパラメータを GRUB(ブートローダー)に追加する
/etc/default/grub を以下のように変更しました。/swapfile が、どのデバイスの、どの位置(オフセット)に存在するかを教えています。
```diff
--- /tmp/grub.orig 2021-08-25 01:12:57.415049508 +0900
+++ /etc/default/grub 2021-08-23 23:42:08.875333968 +0900
@@ -2,7 +2,7 @@
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISTRIBUTOR="Manjaro"
-GRUB_CMDLINE_LINUX_DEFAULT="quiet apparmor=1 security=apparmor udev.log_priority=3"
+GRUB_CMDLINE_LINUX_DEFAULT="quiet apparmor=1 security=apparmor udev.log_priority=3 resume=UUID=52d772c6-e49d-4be0-9963-c9aae2a9e4f9 resume_offset=52037632"
GRUB_CMDLINE_LINUX=""
# If you want to enable the save default function, uncomment the following
```
GRUB_CMDLINE_LINUX がユーザー用の変数かと思い、初めはこれを使ってしまいましたが、リカバリモード用でした([GNU GRUB Manual 2.06: Simple configuration](https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html))。
"resume=UUID=52d772c6-e49d-4be0-9963-c9aae2a9e4f9" で、/swapfile が置いてあるデバイスを教えています。
雑に調べると /dev/nvme0n1p5 です。/swapfile なので当たり前ですが、"/" がマウントポイントです。
```shell-session
$ df /swapfile
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/nvme0n1p5 527306168 62862840 437583404 13% /
```
"resume=/dev/nvme0n1p5" でも問題はないとは思いますが、外付けストレージの追加等で名前が変わるリスクはゼロではないため、UUID による永続的な命名方法を使いました。
各デバイスの UUID 確認方法は簡単です([永続的なブロックデバイスの命名 - ArchWiki](https://wiki.archlinux.jp/index.php/%E6%B0%B8%E7%B6%9A%E7%9A%84%E3%81%AA%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E5%91%BD%E5%90%8D))。
```shell-session
$ ls -alF /dev/disk/by-uuid
total 0
drwxr-xr-x 2 root root 100 8月 24 00:14 ./
drwxr-xr-x 8 root root 160 8月 24 00:14 ../
lrwxrwxrwx 1 root root 15 8月 24 00:14 2E80-83B2 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 8月 24 00:14 52d772c6-e49d-4be0-9963-c9aae2a9e4f9 -> ../../nvme0n1p5
lrwxrwxrwx 1 root root 15 8月 24 00:14 DA82730D8272ECFF -> ../../nvme0n1p4
```
"resume_offset=52037632" で、/swapfile が /dev/nvme0n1p5 の先頭からどの位置(オフセット)に存在するかを教えています。
filefrag というコマンドで分かるようです。
```shell-session
$ sudo filefrag -v /swapfile | head -n 5
Filesystem type is: ef53
File size of /swapfile is 19327352832 (4718592 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 52037632.. 52037632: 1:
1: 1.. 2047: 52037633.. 52039679: 2047: unwritten
```
ext4 はフラグメンテーションが起きづらいそうだけど、e4defrag で手動デフラグしたらオフセットは変わり得るのでは?と思いました。ちょっと怖いな。どうなんでしょう?
/etc/default/grub を変更したら /boot/grub/grub.cfg を再作成します。
```console
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
```
### 3. 関連するフックを initramfs に追加する
/etc/mkinitcpio.conf を以下のように変更しました。カーネル起動時に resume というモジュールがロードされるのかな。**filesystems の前に追加するのがとても重要**だそうです。
```diff
--- /tmp/mkinitcpio.conf.orig 2021-08-25 01:40:50.793227026 +0900
+++ /etc/mkinitcpio.conf 2021-08-23 23:07:04.396638336 +0900
@@ -49,7 +49,7 @@
#
## NOTE: If you have /usr on a separate partition, you MUST include the
# usr, fsck and shutdown hooks.
-HOOKS="base udev autodetect modconf block keyboard keymap filesystems fsck"
+HOOKS="base udev autodetect modconf block keyboard keymap resume filesystems fsck"
# COMPRESSION
# Use this to compress the initramfs image. By default, gzip compression
```
/etc/mkinitcpio.conf を変更したら /boot/initramfs-*.img を再作成します。
```console
$ sudo mkinitcpio -p linux510
```
linux510 は /etc/mkinitcpio.d/ 以下のファイルと対応していました。今回は /etc/mkinitcpio.d/linux510.preset しかなかったので、linux510 になりました。
ちなみに mkinitcpio を引数なしで実行すると、dry run モードによる確認が出来ます。
```shell-session
$ sudo mkinitcpio
==> Starting dry run: 5.10.59-1-MANJARO
-> Running build hook: [base]
-> Running build hook: [udev]
-> Running build hook: [autodetect]
-> Running build hook: [modconf]
-> Running build hook: [block]
-> Running build hook: [keyboard]
-> Running build hook: [keymap]
-> Running build hook: [resume]
-> Running build hook: [filesystems]
-> Running build hook: [fsck]
==> Generating module dependencies
==> Dry run complete, use -g IMAGE to generate a real image
```
## 注意点
GRUB や Linux カーネルが更新されたら、2 や 3 の再設定が必要みたいです。面倒なので私は mitamae でゆるふわ構成管理しています。
{{< github_repo "itamae-kitchen/mitamae" >}}
## まとめ
ハイバネート出来た時は、思わずおぉー!と声が出ました。他の OS では当たり前すぎるハイバネートですが、自分で設定すると感慨深いものがあります。
これで VivoBook から気軽に AC 電源コードを抜けるようになりました。なんと当たり前な...。今までは気がつくと電源が落ちていたので、AC 電源コードも気も抜けませんでした。:sob:
サスペンドは復帰時に画面が表示されず、電源ボタンを長押しするしかなくなることがあるので、まだ使えていません。
前述の「[サスペンドとハイバネート - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%B5%E3%82%B9%E3%83%9A%E3%83%B3%E3%83%89%E3%81%A8%E3%83%8F%E3%82%A4%E3%83%90%E3%83%8D%E3%83%BC%E3%83%88)」によると、この現象は多数報告されているそうです。そして、そのデバッグのベストプラクティスが[この記事](https://01.org/blogs/rzhang/2015/best-practice-debug-linux-suspend/hibernate-issues)とのこと。
長いので気が向いたら調べます。たぶん、Linux カーネルと ATI のドライバの相性()が悪いのだと思います。
## 他の参考記事
:link: [Arch Linux 快適デスクトップ環境の構築 2019 - Qiita](https://qiita.com/xorphitus/items/d543931ecd2c441e462f)
:link: [Linux におけるラップトップマシン向け電力管理スイートの紹介(Pm-utils, Laptop-mode-tools, Powertop, TLP) – 怠惰の形而上学](https://oppekepe.org/2284)
初めからインストールされていた TLP があればサスペンド(スリープ)は問題なく管理されているそう。Laptop-mode-tools はもう古いそう。なのにサスペンドだけだと数時間しかバッテリーがもたないのは、推して知るべし...。
--------------------------------------------------------------------------------
title: "Chrome から Firefox に乗り換えたよ"
date: "2021-08-07"
--------------------------------------------------------------------------------
{{< post "2011-06-03-1" >}} に Firefox から Chrome に乗り換えて以来です。ちょうど 10 年。iPhone から Android への乗り換え {{< post "2020-07-14-1" >}} も 10 年だったし、飽きづらいマスタカも 10 年が周期みたいです。
まあ、普通の人は乗り換えたことをいちいち記録しないし、もっとカジュアルにあっちこっち使う気はしてます。
このブログの名前が「マスタカの ChangeLog メモ」なので記録せざるを得ないのです。もう大変。(>o<)
飽きたのはありますが、[この Issue](https://github.com/mooz/xkeysnail/issues/140) がきっかけではあります。Xkeysnail と Chrome の組み合わせで、カーソル移動やタブ移動のキーが 2 回発行されてしまう問題です。もう修正されたようですが、回避方法がダウングレードしかなく地味に厄介でした。そんな私はブラウザ乗り換えで回避したという...。
10 年前は Firefox と [Keysnail](https://github.com/mooz/keysnail/) を使っていました。[個人 PC を Linux にした](https://developer.feedforce.jp/entry/2021/06/11/180000)ことで、また同じ作者である mooz さん作の [Xkeysnail](https://github.com/mooz/xkeysnail/) を Firefox でも使うことには感慨深いものがあります。
そういえば Manjaro (Linux) のデフォルトブラウザは Firefox でした。それも戻った理由ではあるかな。Chrome だと AUR でインストールする必要があるのですよね。
10 年と書きましたが、その間 2 回ほど Firefox に戻ろうとしていました。
2017 年の時は、20 日程度戻ってました。当時は Quantum として大型アップデートされた直後で、アドオンが割と壊れていた記憶。1Password アドオンはまだなかった。あと、[Multi-Account Containers](https://support.mozilla.org/ja/kb/containers) に惑わされてしまった。
{{< tweet user="masutaka" id="934307906186391552" >}}
{{< tweet user="masutaka" id="942405460098875392" >}}
2019 年は 15 日くらい頑張っていました。2014 年製の MacBook Air が遅いのが諦めた要因だったような。> 買えよ (^^;
{{< tweet user="masutaka" id="1109728737203875841" >}}
{{< tweet user="masutaka" id="1115627403710066688" >}}
今回は乗り換えのハードルを低くするために個人 PC だけ乗り換えました。PC も速くなった {{< post "2021-05-06-1" >}} ので、2019 年とは違います。会社の MacBook Pro はまだ(?)Chrome です。
Firefox でまず戸惑うのが、Chrome のユーザー(プロファイル)切り替えに相当する機能が見当たらないことです。
4 年前と変わらず、なぜか Multi-Account Containers を推してきますが、これはタブ単位でセッションを切り替える機能です。Firefox アカウントは切り替えられないので代わりにはなりません。
代わりに `about:profiles` が使えます。アドレスバーにこれを入力して開くと、素朴な画面が開いてプロファイルの管理や起動が出来ます。`$ firefox -P` などと `-P` オプション付きで Firefox を開いても、似た機能を持つプロファイルマネージャーが起動します。
公式ヘルプ: [プロファイルマネージャーを使用して、Firefox のプロファイルを作成または削除する|Firefox ヘルプ](https://support.mozilla.org/ja/kb/profile-manager-create-and-remove-firefox-profiles)
前回と同じように、私が使う数少ないアドオンの乗り換え記録も残しておきます。
## 今まで使っていた Chrome 拡張と移行先
### 1Password
これは普通にあります。X は気にしないでください。
[1Password X – パスワード保管庫 - Firefox Add-ons](https://addons.mozilla.org/ja/firefox/addon/1password-x-password-manager/)
Chrome 版は2つあって初心者を悩ませそうです。前者が X です。気にしないでください...。
[1Password – パスワード保管庫 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/1password-%E2%80%93-password-mana/aeblfdkhhhdcdjpifhhbdiojplfjncoa)
[1Password 拡張機能 (パソコンのアプリが必要) - Chrome ウェブストア](https://chrome.google.com/webstore/detail/1password-extension-deskt/aomjjhallfgjeglblehebfpbcfeobpgk)
### ato-ichinen
[ato-ichinen - Chrome ウェブストア](https://chrome.google.com/webstore/detail/ato-ichinen/pojaolkbbklmcifckclknpolncdmbaph)
ON にしている間、Google 検索を直近 1 年にするだけの Chrome 拡張です。技術系の調査は鮮度が大事なことがあるからです。
よく考えたらブックマークレットで十分なので、こんなのを作りました。どうでも良いですが、名前は G1nen にしました。
```
javascript:location.href=location.href+'&tbs=qdr:y'
```
ついでに G2en というブックマークレットも作りました。これは Google の検索対象を英語サイトにします([情報源](https://www.suzukikenichi.com/blog/how-to-search-on-google-com-in-english-from-japan/))。日本語の情報はノイズになることが多いので。だったら常に英語にしろよという意見は認めます。
```
javascript:location.href=location.href+'&gl=us&hl=en&gws_rd=cr&pws=0'
```
### Create Link
[Create Link - Chrome ウェブストア](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm)
今開いているページや選択したリンクを、Markdown や任意のフォーマットでクリップボードにコピーする Chrome 拡張です。esa とか書いてるとよく使いますよね。
[Format Link](https://addons.mozilla.org/ja/firefox/addon/format-link3/) に移行しました。若干上位互換風で、正規表現を使った置換も出来ます。
### Emoty
[Emoty - Chrome ウェブストア](https://chrome.google.com/webstore/detail/emoty/kgljgnbhcigffgoifhjbbifhbdkapmgm)
絵文字を一覧から選んでクリップボードにコピー出来る Chrome 拡張です。フォーマットは :smile: などで、Unicode 絵文字ではありません。
[Emoji Cheatsheet](https://addons.mozilla.org/ja/firefox/addon/emoji-cheatsheet/) に移行しました。こちらは Unicode 絵文字にも対応しています。
### Google Analytics オプトアウト アドオン
[Google Analytics オプトアウト アドオン (by Google) - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-analytics-opt-out/fllaojicojecljbmefodhfapmkghcbnh)
その名の通りの Chrome 拡張です。Chrome の機能を使って、自分のサイトや会社のサイトだけをオプトアウトしていました。宗教上の理由()がないので、全サイトはオプトアウトしていません。
良さげなアドオンが見つかっていません。情報求む。
**追記(2022-05-06):**
[Block Yourself from Analytics](https://addons.mozilla.org/ja/firefox/addon/block-yourself-from-analytics/) が良さそうでした。
### Google 翻訳
[Google 翻訳 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb)
その名の通りの Chrome 拡張です。選択範囲だけを翻訳したり、ページ全体を日本語に置き換えたり便利ですよね。
[To Google Translate](https://addons.mozilla.org/ja/firefox/addon/to-google-translate/) に移行しました。https://translate.google.com/ が別タブで開いてしまうので大げさではあります。まあいいか...。
### Grammarly for Chrome
[Grammarly for Chrome - Chrome ウェブストア](https://chrome.google.com/webstore/detail/grammarly-for-chrome/kbfnbcaeplbcioakkpcpgfkobkghlhen)
スペルチェッカーサービス [Grammarly](https://www.grammarly.com/) の Chrome 拡張です。今年も気がついたら課金していたので、来年は課金しないようにしました。
[Grammarly for Firefox](https://addons.mozilla.org/ja/firefox/addon/grammarly-1/) があります。ただ、Chrome と違って動作するサイトを絞れないので、フォームへの書き込みを邪魔することが多いです...。
### Keepa - Amazon Price Tracker
[Keepa - Amazon Price Tracker - Chrome ウェブストア](https://chrome.google.com/webstore/detail/keepa-amazon-price-tracke/neebplgakaahbhdphmkckjjcegoiijjo)
Amazon の商品ページに価格変動グラフを挿入してくれる Chrome 拡張です。「安くなった。買い時だ。」「高いけど買っちゃおう。」などと判断の助けになります。← 結局買う奴
[Amazon Price Tracker - Keepa.com](https://addons.mozilla.org/ja/firefox/addon/keepa/) があります。
### LINE
[LINE - Chrome ウェブストア](https://chrome.google.com/webstore/detail/line/ophjlpahpchlmihnnnihgmmeilfjmjjc)
LINE の Chrome アプリです。長めの文章が面倒な時に使ってました。
Firefox 版はないみたいです。LINE をあまり使わないので問題なし。
### Save to Pocket
[Save to Pocket - Chrome ウェブストア](https://chrome.google.com/webstore/detail/save-to-pocket/niloccemoadcdkdjlinkgdfekeahmflj)
[Pocket](https://getpocket.com/) の Chrome 拡張です。結局 Pocket に戻って来てしまいます。
Firefox にはこの機能が組み込まれています。2015-04-21 にそんなニュースがありました。
[速報: MozillaがPocket(旧Read It Later)をFirefox本体に統合(追記あり) - Mozilla Flux](https://rockridge.hatenablog.com/entry/2015/04/21/231112)
### twitter画像原寸ボタン
[twitter画像原寸ボタン - Chrome ウェブストア](https://chrome.google.com/webstore/detail/twitter%E7%94%BB%E5%83%8F%E5%8E%9F%E5%AF%B8%E3%83%9C%E3%82%BF%E3%83%B3/kmcomcgcopagkhcbmcmcfhpcmdolfijg)
twitter.com や TweetDeck で小さくて見づらい画像を原寸サイズで、別タブにバババッと開く Chrome 拡張です。
[Twitter 原寸びゅー](https://addons.mozilla.org/ja/firefox/addon/twitter-gensun-view/)に移行しました。モーダルで開き、ショートカットキーでサイズを変えられるので、こちらの方が便利です。
### はてなブックマーク
[はてなブックマーク - Chrome ウェブストア](https://chrome.google.com/webstore/detail/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF/dnlfpnhinnjdgmjfpccajboogcjocdla)
ご存知はてブの Chrome 拡張です。
[Hatena Bookmark](https://addons.mozilla.org/ja/firefox/addon/hatena-bookmark/) があります。なぜか英語。
**追記(2022-04-24):**
[Hatena Bookmark がなくなった](https://bookmark.hatenastaff.com/entry/extension_renewal2022)ので、[はてなブックマーク ブックマーク機能](https://addons.mozilla.org/ja/firefox/addon/hatena-bookmark-bookmarkadd/)に移行しました。
## 新たに Firefox にインストールしたアドオン
Chrome では要らなかったが、Firefox でインストールしたアドオンを書いていきます。
### Copy Link Text
[Copy Link Text - Firefox Add-ons](https://addons.mozilla.org/ja/firefox/addon/copy-link-text-webextension/)
リンクテキストをコピーするアドオンです。↑ だと `Copy Link Text - Firefox Add-ons` をコピーできます。信じられないことに Firefox ではこれが出来ないのです。
4 年前のやつが残ってて、何をするアドオンか思い出すのに時間がかかりました...。
## Firefox で不要になったアドオン
反対に、Chrome で使っていたが、Firefox で代わりは要らなかった Chrome 拡張を書いていきます。
### Close download bar
[Close download bar - Firefox Add-ons](https://chrome.google.com/webstore/detail/close-download-bar/bkfclmjddajodogcbpohgfpdkgdecgmg)
ファイルをダウンロードすると現れるうざいフッターを Option-w や Alt-w で閉じられる Chrome 拡張です。地味だけど便利です。
## まとめ
10 年ぶりに Firefox に戻ってきました。1 週間使っていますが、課題はありつつも、Firefox だと忘れてしまう程度には主張してきません。割と快適です。
アドオンがエラーを起こすのはたまたまなんですかね?この記事を書いている間、Format Link が使えませんでした...。
--------------------------------------------------------------------------------
title: "3月に無償提供となった Microsoft Power Automate Desktop を今さらながら使ってみた"
date: "2021-07-28"
--------------------------------------------------------------------------------
※ 会社の「インフラ共有会」用に書いた記事の転載です。Windows PC を買った {{< post "2021-05-06-1" >}} ので、個人で試せることに気づいてちょろっと試したって経緯です。
[Microsoft、自社製RPAツールを全Windows 10ユーザーに無償提供 マウスクリックやキーボード入力をGUIで自動化:Microsoft Ignite 2021 - ITmedia NEWS](https://www.itmedia.co.jp/news/articles/2103/03/news096.html)
・動作するのは目の前の Windows PC。エクセルとかのマクロをパワーアップしたものに近いかも
・ スケジュール(時間を指定した自動実行)の機能は見つけられなかった。寝ている間に自動実行とかは出来ない気がした
・Chrome の「要素を検証」みたいな感覚で、クリックやフォームの位置を指定できる
・要素名を変更するなど細かい微調整は出来ないようなので、id 名等が少しでも変わるとフローが動かなくなるかも
・アクションの種類は多彩で、頑張れば「LINEビジネスアカウントでログインして、レポートをローカルフォルダにダウンロードし、それを Google スプレッドシートにインポート」は出来ると思う
・今起動しているブラウザにも接続できるようなので、2段階認証突破のハードルは多少低そう
Power Automate と Power Automate Desktop との違いはイマイチ理解できていない。難しい...。
・[Power Automate](https://flow.microsoft.com/ja-jp/)
・[Power Automate Desktop](https://flow.microsoft.com/ja-jp/desktop/) ← 今回はこっち
## 多彩なアクション
※ フローの新規作成画面です。

## フローを作った様子
https://www.myfitnesspal.com/ja/account/login にログインして csv ファイルをダウンロードするフローを作ったが、MyFitnesspal は「CSV ファイルをダウンロードするためのリンクを含んだメールが届きます」だと知った。試しに作るには大きすぎるため心が折れた。(^^;

## インストール方法や実行方法などの紹介動画
うぃんどうずしょしんしゃなので、わかりやすいどうがをみたよ。
{{< youtube "YHB-Mu7fnB0" >}}
--------------------------------------------------------------------------------
title: "Dependabot の Terraform 1.0 対応が完了した件"
date: "2021-06-10"
--------------------------------------------------------------------------------
{{< post "2021-05-27-1" >}} のつづき。この間に [1.0 がリリースされてました](https://www.hashicorp.com/blog/announcing-hashicorp-terraform-1-0-general-availability)ね。
先ほど、Lockfile (.terraform.lock.hcl) の対応が完了したそうです。
https://github.com/dependabot/dependabot-core/issues/1176#issuecomment-858490407
これで Dependabot での terraform 対応が完了しました。
・terraform version は自動更新できない
・provider version を自動更新できる。その際、.terraform.lock.hcl も更新されるはず
・以前の Dependabot で対応されていた module version はどうなんだろう?使ってないので分からない
[dependabot.yml のドキュメントはこちら。](https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates)
[circleci-tfupdate-orb](https://github.com/masutaka/circleci-tfupdate-orb) はそろそろアーカイブしたいな。でも Dependabot だと terraform version は更新出来ないんだよね...。
**追記(2021-06-11):**
公式でもアナウンスされてました。
[Dependabot now supports Terraform 1.0|GitHub Changelog](https://github.blog/changelog/2021-06-10-dependabot-now-supports-terraform-1-0/)
--------------------------------------------------------------------------------
title: "暑がりの私にはマスクチェーンがとても合ってる"
date: "2021-05-30"
--------------------------------------------------------------------------------
去年の秋くらいからマスクチェーン(ストラップ)を使っています。私はとても暑がりなのと、マスクの着用感が好きではないので、かなり重宝しています。
どのくらい暑がりかと言うと、中学生の時は暑くない水泳部に入ったり、毎日スーツを着る会社には絶対に入社しなかったり、今の会社が上場した時も暑かったので(スーツが必要な)東証には行かなかったり、まあそんな感じです。
外に出た時にスッと外せるのがとても良いです。店で食事をする時、ベタッと置かずに済むのも良いです。
弱点は強風です。一度強風に煽られて外れたことがあります。どうにかならないかな...?
最近買って、とても気に入ったのがこちらです。約 70cm あり、チェーンもしっかりしています。男性向けらしいです。
{{< amazon asin="B08ZMVW923" title="男性のためのステンレス鋼のメガネチェーン めがね眼鏡ストラップネックレス フェイスマスクストラップホルダークリップ" >}}
その少し前に買ったのがこちら。メンズと書いてありますが、女性向けかなと思いました。55cm と少し短いのと、見た目よりもチェーンがずっと細いからです。細いせいでやや絡まりやすいです。クロスの飾りは結構きれいで、マスクをした時に主張してくれます。チェーンの長さが足りないので常用はしませんが、特別な日()には付けようと思いました。
{{< amazon asin="B08KGK15DG" title="マスクチェーン ブラッククロス マスクストラップ スワロフスキー メンズ" >}}
こちらは入門者向けかな?最初に買いました。当時の値段も ¥398 でとても安かったです。ストラップの長さは 60cm です。このくらいは欲しいところです。後ろで止めると、耳が痛くならないみたいです。しかし4本は要らなかった...。
{{< amazon asin="B08FRD894Y" title="WJ wish 長さ調整 ストラップ 快適なネックバンド 落下防止 耳が痛くならない" >}}
これから暑い夏が始まるので、さらに活躍してくれそうです。
--------------------------------------------------------------------------------
title: "Dependabot の Terraform 0.15 対応が進んでいる件"
date: "2021-05-27"
--------------------------------------------------------------------------------
最近この Issue が活発になってきました。
[Terraform 0.15 support · Issue #1176 · dependabot/dependabot-core](https://github.com/dependabot/dependabot-core/issues/1176)
実はプロバイダーバージョンのアップデートだけならもう使えます。
・**プロバイダーバージョンのアップデートはもう動く**
・↑の後に必要な .terraform.lock.hcl の更新は実装中とのこと。現在は手動で "$ terraform init -upgrade" が必要
・[terraform バージョンのアップデートはロードマップに含まれていない](https://github.com/dependabot/dependabot-core/issues/1176#issuecomment-848941622)
↓プライベートリポジトリで動いている様子。


[dependabot.yml のドキュメントはここにある](https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates)ので、試してみるのも良いかもしれません。
↓このブログが置いてあるリポジトリの .github/dependabot.yml です。daily はやり過ぎなのであとで減らそう。
```
version: 2
updates:
- package-ecosystem: "terraform"
directory: "/terraform/aws"
schedule:
interval: "daily"
time: "12:00"
timezone: "Asia/Tokyo"
assignees:
- "masutaka"
open-pull-requests-limit: 10
- package-ecosystem: "terraform"
directory: "/terraform/heroku"
schedule:
interval: "daily"
time: "12:00"
timezone: "Asia/Tokyo"
assignees:
- "masutaka"
open-pull-requests-limit: 10
```
## 今までの経緯とか
Terraform 0.11 まで、Dependabot はモジュールのアップデートだけ対応していました。
https://dependabot.com/docs/config-file/ でその痕跡を確認できます。
※ Dependabot は GitHub に統合されたので、https://dependabot.com はもう古いです。
ですが、Terraform 0.12 で HCL2 が導入されてから、全く動かなくなりました。前述の Issue も要望の嵐。
{{< github_user "minamijoyo" >}} が [tfupdate](https://github.com/minamijoyo/tfupdate) を作ってくれたので、私もその CircleCI Orb を作ってみるなど。
{{< github_repo "masutaka/circleci-tfupdate-orb" >}}
※ 現在この Orb は terraform 本体とプロバイダーバージョンのアップデートのみ対応しています。terraform.lock.hcl の更新には対応していないので、手動で $ terraform init -upgrade が必要です。https://github.com/minamijoyo/tfupdate-circleci-example のサンプルコードは対応しているみたいです。
--------------------------------------------------------------------------------
title: "ノートパソコンクーラーを買い替えた"
date: "2021-05-23"
--------------------------------------------------------------------------------
2 年使っていた冷却パッドが寿命っぽいので、エレコムのノートパソコンクーラーを買いました。心配していた冷却効果は申し分なく、ひとまずホッとしています。
{{< amazon asin="B07281KZRJ" title="エレコム USB扇風機 縦置き/横置き/ PC&タブレット冷却台 3段階風量調整 ブラック FAN-U177BK" >}}
元々こちらの冷却パッドを使っていました。ゲーミング PC 向けみたいです。
{{< amazon asin="B079DLQYLP" title="Nobebird ノートパソコン 冷却クーラー" >}}
この動画お気に入りです。つい何度も見てしまう中毒性があります。
{{< youtube "lRNnLCSDNOo" >}}
少々デカイのが難点でしたが、冷却効果は申し分ありませんでした。
ただ 2 年も使うとホコリが溜まってきます。分解は無理そうで、掃除機で吸うのも限度があります。おまけに 1 本しかないオスオス USB ケーブルがほぼ断線し、5 つあるファンのうち 2 つも回らなくなりました。
ホコリさえ取れれば使い続けるモチベーションはあったのですが、それが無理なので交換するか!という気持ちになりました。今思えばエアダスター使えばよかったのかな。まあいいか...。
冷却パッドは仕事用です。私は仕事で [MacBook Pro 13inch (2019)](https://support.apple.com/kb/SP795?locale=ja_JP) を使っています。MacBook Pro はアルミの筐体全体から放熱する設計は良いのですが、一緒にキーボードまで熱くなります。激しく集中を削がれるため、やむを得ずこの手のクーラーを使っています。
今回買ったクーラーの話に戻します。

先程書いたとおり冷却効果は申し分ありません。3 段階に調節できる風量は一番小さい 1 で十分です。ただ、風が手前に吹き付けるため、机の上にティッシュとか置いてると吹き飛ばされます。
他はこんな感じです。ホコリは溜まっちゃいそうです。次溜まったらエアダスターを使ってみるか。
良いところ:
軽くてコンパクト。たまの出社日にも持って行けそう
卓上扇風機でもあるけど、実際使っても良さそうな軽さと見た目、それに風量
良くないところ:
micro USB でもなく Type-C でもない謎端子。手持ちの程よい長さのケーブルを使えない
スタンドの傾斜角度がおかしい。ノートパソコンの奥側をどうしても2点で支えることになる。どんな意図で設計したのだろう?
それもあって中華製スマートウォッチ {{< post "2018-01-28-1" >}} と干渉して手首が痛い。仕方がないので外してる
ホコリが溜まりそうで掃除も難しそう。この手の冷却器の運命なのか...
それなりにうるさい。仕事だと気にならないけど、プライベートだと気になるかも
そんなわけでノートパソコンクーラーにまあまあ満足したお話でした。
<おまけ>
ファンでホコリが溜まるのなら、ファンがないやつを買えば良いじゃないということで、先にこちらを買ってました。
{{< amazon asin="B07T459WP6" title="ノートパソコン 冷却台 アルミ スタンド 放熱 電源不要 ノートPCクーラー NP STAND COOL シルバー" >}}
結果は大失敗。「うん、冷却台が温まったね」ってだけで冷却効果は皆無でした。返品しました。
--------------------------------------------------------------------------------
title: "スマホ専用テプラ LR30 を買った"
date: "2021-05-20"
--------------------------------------------------------------------------------
私はテプラが苦手です。あのワープロみたいなキーボードがダメ。パソコンと微妙に似ているけどちょっと違う、csh や tcsh みたいな立ち位置がダメです。← 分かりづらい
でもこのテプラはスマホで文字を打てます。[発表された当初](https://www.itmedia.co.jp/news/articles/1908/06/news093.html)から気にはなっていて、今さらながら買ってみました。6,000 円弱とそこまで高くないことと、あったら便利で邪魔にもならないと思ったからです。
{{< amazon asin="B07W3R1LQK" title="キングジム ラベルプリンター スマホ専用 「テプラ」Lite 青 LR30アオ" >}}
使った感想としては「そこまでオススメはしないけど悪くもない」です。
良いところ:
・Bluetooth 接続がとても楽。ペアリングが必要ない
・スマホ操作なので普通のテプラよりは打ちやすい
・電源が電池なので取り回しが楽。会社でコンセント探したなあ...
良くないところ:
・感熱プリントなので印刷が1年くらいしかもたない
・同じ理由で印刷が安っぽい
・良さそうな色のテープがない
画像は見てのとおりオレガノです。たまたま家にあった赤ちゃん用のミルカーに入れています。これでバジリコと間違えることはないでしょう。

オレガノの容器はもっと良いのを探しています。なかなかないんだよなあ...。
もし普通のテプラと同じ印刷方式と同じテープが使えて、スマホから使えて、そこそこの値段だったら買うかも。
と思って改めて探したらあった・・・!(ToT) ただしアプリはヒドイみたい。
{{< amazon asin="B08HLN39HY" title="キングジム ラベルプリンタ-「テプラ」PRO SR-MK1へ-" >}}
{{< amazon asin="B0084BPUC0" title="キングジム Lite専用テープ テプラ LP15S ホワイト" >}}
{{< amazon asin="B000BNCBEE" title="ピジョン ミルカー" >}}
--------------------------------------------------------------------------------
title: "Windows ノートパソコン(ASUS VivoBook S15 M533IA)を買った"
date: "2021-05-06"
--------------------------------------------------------------------------------
1 ヶ月ほど前になりますが、10 数年ぶりに Windows ノートパソコンを買いました。とても満足しています。
[ASUS VivoBook S15 M533IA-BQ0BLT(インディーブラック)](https://jp.store.asus.com/store/asusjp/ja_JP/pd/productID.5438112600)

{{< post "2020-07-14-1" >}} に iPhone から Android に乗り換えたことと関係していて、脱 Apple 計画の最終章(?)です。
スペックはこんな感じです。トラックパッド右上に指紋認証用のセンサーも付いています。
| |
|---|---
|CPU|AMD Ryzen™ 7 4700U
|Memory|16GB
|Storage|1TB SSD
|Monitor|15.6inch
|Keyboard|109 日本語(画像は 104 英語キーボード)
今まで持っていたノートパソコンが [Early 2014 の(!)MacBook Air](https://support.apple.com/kb/SP700?locale=ja_JP) だったので、めちゃめちゃ速くなりました。Ryzen いいですねー!Intel 版もあったのですが、Ryzen への興味とお値段から Ryzen にしました。
そのお値段は ¥110,900 に 11,090 ヨドバシポイントが付いた形です。Amazon.co.jp は ¥99,810 だったので、Amazon.co.jp にしようかとは思いましたが、ヨドバシカメラ上野店で話しかけてきた店員さん 2 人に少しだけ敬意を払って、ヨドバシ.comで購入しました。
今見たら在庫がなくなっているし、だいぶ高くなってます。ひゃー
* [ヨドバシ.com](https://www.yodobashi.com/product/100000001005808909/)(¥134,150 - 13,415pt)
* {{< amazon_link asin="B08H8M8RY4" title="Amazon.co.jp" >}}(¥125,821 - 1,258pt)
ここ 10 年はほぼ Apple 製品で暮らしていたので、Windows PC や CPU 事情は全く分からない人になっていました。
ヨドバシカメラに視察に行ったあと、最終的にこの 3 つに絞ってうんうん考えていました。お値段はそれぞれ 20万、10万、14万と割と違います。
* [LG Gram 16Z90P-KA78J](https://www.lg.com/jp/computer-pc/lg-16z90p-ka78j)(インテル® Core™ i7-1165G7)
* [ASUS VivoBook S15 M533IA](https://jp.store.asus.com/store/asusjp/ja_JP/pd/productID.5438112600)(AMD Ryzen™ 7 4700U)
* [ASUS VivoBook S15 S533EA](https://jp.store.asus.com/store/asusjp/ja_JP/pd/productID.5457461600)(インテル® Core™ i7-1165G7)
本当は英語キーボードが欲しかったのですよねえ...。でも[国内だと VAIO を BTO するくらいしかないらしく](https://twitter.com/meihong/status/1375740956645859330)、Amazon.com や eBay とか見てました。
* [Amazon.com > LG Gram 16Z90P-K.AAB8U1](https://www.amazon.com/dp/B08SW3622C)(当時約¥190,535)
* [Amazon.com > ASUS VivoBook S15 M533IA](https://www.amazon.com/dp/B08NCL3K5M)(売り切れ...)
* [Amazon.com > ASUS VivoBook S15 S533EA](https://www.amazon.com/dp/B08KH4P5TL)(当時約¥140,802)
少し前なら [ASUS の物理ストアにキーボード換装サービスがあった](https://pc.watch.impress.co.jp/docs/news/1119909.html)らしいです。でも[去年の 8/16 をもって閉店](https://jp.store.asus.com/store/asusjp/html/pbPage.akasaka/)とのこと...。
それもあって Amazon.com の VivoBook S15 M533IA 売り切れは本当に涙です。仕方がないので Amazon.com で Intel 版の S533EA をポチりましたが、英語キーボードに4万円は出せないなーと思い直しキャンセル。頭を冷やして考えを整理しました。
* 久しぶりの Windows PC なので、失敗する可能性はある
* だとしたら、敢えて一番安い選択肢を採用してみよう。経験値をためて、2~3 年後により良い機種を買えば良いし
* VivoBook は4色から選べるけど、それは無視して一番安い色にする
* 英語キーボードも今回はこだわらない。アプリで変えれば良いだろう
そうなると、ASUS VivoBook S15 M533IA インディーブラックの日本語キーボード一択です。今度は迷いなく、ヨドバシ.comでポチりました。ポチったのが 3/29(月)、届いたのがその翌日です。さすがのヨドバシエクストリームです。
結果的にスペック的には大満足でした。インディーブラックも落ち着いていて悪くないです。
日本語キーボードになると、スペースキーがこんなに小さくなるのは驚きました。キーボードにこだわりがある人はきついかも。Windows PC は 15inch を超えると、テンキーがつく傾向があるのかな...?全く要らない...。
Windows には慣れない...。Windows をまともに使ったのは XP が最後だったので全く変わったような、Vista や 7 を考えると XP と少しは似ているような...。
頑張ります!
{{< amazon asin="B08H8M8RY4" title="ASUS VivoBook S15 M533IA-BQ0BLT(インディーブラック)" >}}
P.S.
ちゃんとしたレビューはこちらの記事が良いかと。
[ASUS VivoBook S15 M533IA レビュー:Ryzen 7 4700U搭載の高品質15.6インチスタンダードノートPC – こまめブログ](https://little-beans.net/review/vivobook-s15-m533ia/)
--------------------------------------------------------------------------------
title: "『こども地政学』を読んだ"
date: "2021-04-10"
--------------------------------------------------------------------------------
以前から地政学には興味があったのでポチって読んでみました。
{{< amazon asin="B08YQNC6NW" title="こども地政学 なぜ地政学が必要なのかがわかる本" >}}
子供向けの本で、漢字には全部ルビが振ってあります。でも大人向けの入門書としても良い気がしました。久々にさらっと読めて良い気分転換になったし、地政学の基礎の基礎を知れた気がします。
日本って、ランドパワーの中国にとっては海に出ていくための邪魔な蓋でしかないのかー。
追々、他の地政学の本も読んでみよう。
--------------------------------------------------------------------------------
title: "Android の TODO アプリは TickTick が鉄板かも"
date: "2021-04-07"
--------------------------------------------------------------------------------
iPhone から Android (Pixel 3a XL) に乗り換えて {{< post "2020-07-14-1" >}}、普通に使える TODO アプリを探していました。
私は基本デフォルト厨なので、[Google の ToDo リスト](https://play.google.com/store/apps/details?id=com.google.android.apps.tasks) か [Google Keep](https://play.google.com/store/apps/details?id=com.google.android.keep) で続けようと頑張りましたが、断念しました。
ToDo リストは一度でも繰り返しを設定したタスクは他のリストに移動できないという、理解不能な仕様(?)でした。
Google Keep は頑張って3ヶ月使いましたが、リマインダーアプリとしては xxx(伏せ字)でした。
※ Note アプリとしては普通に便利なので、今も使っています。
・未来のリマインダーを完了できない(早めに終わっても、その時間にならないと完了できない)
・リマインダーを完了しても残る。さらにアーカイブする必要がある。Note 機能との魔合体の弊害と思われる
・繰り返しのリマインダーを視界から消すのが面倒。完了してもアーカイブしてもまた現れる
・他にもあったかも?
そんな中行き着いたのが [TickTick](https://play.google.com/store/apps/details?id=com.ticktick.task) です。TikTok じゃないよ。
とても良かったのでプレミアム会員($27.99/year)になりましたが、無料でも十分使えます。
## 普通のリマインダーアプリとして使える
何が普通なのか難しいところですが、、こんな分類をしていると言えば分かりますかね?

## 2週間毎とかのリマインダーも設定できる
たまにこういうリマインダーがあるのですよね。加湿器の掃除とか。もちろん隔週や隔月なども出来ます。
## 1時間後とかに思い出させるとかも出来る
すぐ出来ない時ありますよね?そんな時にも後で思い出させてくれます。
## 習慣づけの機能がある
自分にはとても合いました。

私はログを取るのが好きみたいで、なるべく途切れさせないように行動するようになりました。
「飲酒をやめる」に至っては、今年の 1/31 以来続いています。そこまでストイックになる必要もないのですが、続けることが目的になっています。それに何もしなければ良いだけなので、この中では一番簡単です。
## その他
私は使っていませんが、ポモドーロテクニックを支援する機能もあります。プレミアム会員用の機能かも?
[Android と iOS、Web など、さまざまなプラットフォームに対応](https://ticktick.com/about/download)しています。今使っているリマインダーアプリからの移行など、まとまった量の作業は Web 版でゴリッとやると良いかもです。
あと、書き忘れましたが、私は仕事では TickTick を使ってません。プライベートだけです。仕事では Slack リマインダーや Gmail(Inbox Zero 運用、Snooze 機能)あたりでゆるふわ運用しています。仕事で使うツールはあまり増やしたくないのですよね。気にするものが増えてしまうので。
Slack から Gmail に簡単に送信できれば、Gmail に集約できるんだけど...。
## まとめ
Android で普通の TODO アプリを求めて TickTick に行き着いたという話をしました。
特に Android で TODO アプリに悩んでいる人は試すと良いと思います。無料でも十分使えますんで!
--------------------------------------------------------------------------------
title: "縦置きスタンドを買って、ノートパソコンを床に置いちゃう問題を解消した"
date: "2021-04-04"
--------------------------------------------------------------------------------
ここ1年はずっと家で仕事しているので、ノートパソコンは会社用と合わせて2台あります。最近 ASUS の Vivobook も買ったので、一時的に3台あります。そうなってくると地味に困るのが、使ってないパソコンの置き場所です。
今までこういうダメな置き方をしていました。気をつけてはいますが、椅子が当たるかもしれませんし、パタンと倒れるかもしれません。

そこで、こんな縦置きスタンドを買いました。¥2,650 というお値段以外はとても満足しています。
{{< amazon asin="B08G8X8J3X" title="ノートパソコン スタンド PCスタンド 縦置き 3台収納 ホルダー幅調整可能 アルミ合金素材 Geecol Vertical Laptop Double Stand for MacBook Pro Air Mini Clamshell Mode & All Notepc" >}}
使ってみた図です。奥が 15.6inch の Vivobook、手前が 13inch MacBook Pro です。Vivobook はやや厚いので、付属の六角レンチで調節しました。

このモデルは手前にタブレットやスマホも置けます。置いたのは 9.7inch の ZenPad です。3つ置いても、重量感があり安定しています。重さは 580g です。

サイズは 横 x 奥行き x 高さ = 15cm x 12cm x 4.8 cm なので、意外とコンパクトです。ゴムパッドも付いているので、デバイスに傷は付きづらいと思います。
同じメーカーで別のモデルもあったので紹介しておきます。
こちらはノートパソコン1台、タブレットまたはスマホ2台用です。奥行きが 9.5cm と多少小さいです。
{{< amazon asin="B08MXY6TSJ" title="Geecol最新版ノートパソコン スタンド 縦置き 3台収納 ホルダー ユニバーサル PCスタンド 幅調節可能 MacBook/iPad/iphone/フォルダー/本/PC/タブレット等あらゆるノートパソコンに対応します アルミ製 在宅勤務 スペース" >}}
こちらはノートパソコン2台、タブレットまたはスマホ2台用です。大きそうに見えますが、私が買ったモデルと同じサイズです。
{{< amazon asin="B08VHJQZ9K" title="ノートパソコン スタンド PCスタンド縦置き 4台収納 ホルダー幅調整可能 アルミ合金素材 Geecol Vertical Laptop Double Stand for MacBook Pro Air Mini Clamshell Mode & All Notepc" >}}
前回のマグネットケーブルホルダー {{< post "2021-03-24-1" >}} に引き続き、当たりを引けて良かったです。
--------------------------------------------------------------------------------
title: "Anker のマグネットケーブルホルダーを使って、ケーブルが下に落ちちゃう問題を解消できた"
date: "2021-03-24"
--------------------------------------------------------------------------------
今まではこんなんでした。3 本のケーブルを洗濯バサミ()でまとめて、Anker の USB 急速充電器に引っかけています。かろうじて落ちません。すみません嘘つきました。たまに落ちます。

Anker のマグネットケーブルホルダーを使えばアラすっきり!少し様子がおかしいのは気にしない。

付属のクリップでケーブルを挟み込んで、台座に磁石で付く仕組みなのですが、直径 3.5mm 以下という制約がなかなかキツイ。今どき珍しい Mini DisplayPort ケーブルは無理だったので、別のクリップで凌ぎました。
{{< amazon asin="B08CRCZ4NX" title="Anker Magnetic Cable Holder マグネット式 ケーブルホルダー ライトニングケーブル USB-C ケーブル Micro USB ケーブル 他対応 (ブルー)" >}}
こちらの記事を見て買いました。商品レビューはこちらを見たほうが良いと思います。
[Ankerの「マグネットケーブルホルダー」を使い始めたら、デスクワークの快適性が格段に向上しちゃいました|ROOMIE(ルーミー)](https://www.roomie.jp/2021/03/706545/)
--------------------------------------------------------------------------------
title: "現在の GitHub flow は v2 かな?"
date: "2021-03-15"
--------------------------------------------------------------------------------
{{< twitter "kyanny" >}} さんの記事を自分なりに整理してみる。
{{< hatenablog title="GitHub flow では Pull Request をマージする前に production デプロイする" url="https://blog.kyanny.me/entry/2021/02/16/121836" >}}
> ずっと「マージした後にメインブランチを production デプロイする」というワークフローだと勘違いしていた。
>
> 昔は「マージ後にデプロイ」だったが、いつの頃からか「マージ前にデプロイ」に変わったらしい。
どこかでそんな話は聞いていたけど、実際のところはどうなんだろう?と以前から疑問だった。やっぱりそうだったか。
## 現在の GitHub flow
というか、GiHub の公式ガイドにそのものズバリ書いてあったのね。灯台下暗し...。
[Understanding the GitHub flow · GitHub Guides](https://guides.github.com/introduction/flow/)
">" を数回クリックし、"Deploy" に進むと書いてある。
> With GitHub, you can deploy from a branch for final testing in production before merging to main.
main ブランチにマージする前に、最後の確認をするために本番環境にデプロイする。
> If your branch causes issues, you can roll it back by deploying the existing main branch into production.
もし問題が発生したら、main ブランチを本番環境にデプロイすることでロールバック出来る。
main ブランチの protection rule は "Require branches to be up to date before merging" を有効にしているのかな。いずれにせよ、main ブランチの commit 全部入りのブランチをデプロイしているはず。
## 以前の GitHub flow
2011/8/31 の [GitHub Flow – Scott Chacon](http://scottchacon.com/2011/08/31/github-flow.html) にまとまっている。この頃の GitHub は従業員 35 人だったそう。
"we can merge it into master for deployment" とあるので、この頃は確かに master ブランチにマージしたあとにデプロイしていたようだ。
## 自分なりの整理
Git は元々 Linux カーネルのバージョン管理をするためのツールとして開発された。その Linux カーネルの開発ではその性質上、[Git Flow](https://nvie.com/posts/a-successful-git-branching-model/) という重厚なブランチ戦略が使われていた。
GitHub flow は Web アプリケーションに合った軽量なブランチ戦略として誕生し、時を経てその内容も変わっていた。
以前の GitHub flow を v1、現在の GitHub flow を v2 と勝手にバージョニングすることにした。
P.S.
Apple っぽくするのだったら「新しい GitHub flow」なのかな?(^^;
**追記(2021-03-15):**
会社の同僚から「main(デフォルト)ブランチを常にリリース可能な状態に保つ」というルールが守られていれば、それが広義の GitHub flow でいいんじゃない?みたいな話を聞きました。なるほど。
--------------------------------------------------------------------------------
title: "フィード(RSS/Atom)を配信していないサイトのフィードを Feed43 で作成する"
date: "2021-03-14"
--------------------------------------------------------------------------------
「[Looker の記事一覧|DevelopersIO](https://dev.classmethod.jp/tags/looker/)」が更新されたら Slack に POST したかったのです。[トップページ](https://dev.classmethod.jp/)ならフィードが配信されているけど、これだと多すぎます。
ノンエンジニアである会社の同僚が https://feed43.com/ で作っているらしいので、試してみました。
結果的にこのフィードを作れましたがめっちゃ面倒くさかったので、記録として残します。同僚すごい...。
https://feed43.com/developersio-looker.xml
## 作成方法
https://feed43.com/ の "Create your first RSS feed" をクリックして、指示に従って作ります。
今回は https://dev.classmethod.jp/tags/looker/ です。入力し Reload します。

HTML が取得され、"extraction rules" の入力を促されるのでそうします。

予想はしていましたが、これがめちゃめちゃ大変で時間がかかりました。
1. HTML 構造を理解する
2. 記事一覧に相当する HTML をテキストエディタに貼り付ける
3. 記事の URL やタイトルなど、取り出したい箇所を {%} で置換し、Extract する
4. Extract できたら儲けもの。不要な HTML を {*} で置換して、少しずつ小さくしていく
最終的にこのルールを作ることが出来ました。
```
```
{*} はワイルドカードです。関係ない HTML はこれで省略しましょう。スペースや改行、HTML コメントなども削除したら {*} にする必要はあるかも。
{%} は正規表現の \1, \2 みたいなやつです。上の例だと 3 つあるので、あとで {%1}, {%2}, {%3} として取り出すことが出来ます。
取り出せた様子です。

あとはフィードの output format を設定するだけです。

Preview ボタンをクリックすると、無事フィードが生成されました。

任意のファイル名に変換することが出来ます。今回は developersio-looker にしました。

そして、私はこのあとハマりました...。Feed43 のアカウントを作って作業したためか、上の Make this feed private に User Name と Password が設定されてしまい、Slack から購読することが出来ませんでした。両方とも空にして Set すれば良いみたいです。
Slack やフィードリーダーでは単純に https://feed43.com/developersio-looker.xml を購読すれば良いです。
この URL をブラウザで開くと https://node2.feed43.com/developersio-looker.xml にリダイレクトされますが、こちらは変更され得ると思うので、購読してはいけません。
変更され得ると言えば、サイトの HTML 構造も変わり得るので、いつかは壊れるでしょう。スクレイピングあるあるです。そしたらフィード経由で分かるのかしら?[FAQ ページ](https://feed43.com/faq.html)には載ってませんでした。
検索すると似たような記事は見つかります。でも「めちゃめちゃ大変」なことが書かれていなかったので、今回記事を書きました。えぇ...
## 追記: 2021-08-17
https://dev.classmethod.jp/tags/looker/ のフィードは https://dev.classmethod.jp/feed/?tag=looker にありました。[その後書いた会社ブログ記事へのリアクション](https://twitter.com/sh19910711/status/1427429573117964306)で知りました。ありがとうございます。
## 追記: 2024-08-20
https://feed43.com/ がなくなってました。残念です。
Reddit にその悲しみと、代替サービスが紹介された記事がありました。
* [feed43 is no longer supported\. I'd be happy to pay if someone made this for me\. I have an idea for an RSS feed generator\. : r/rss](https://www.reddit.com/r/rss/comments/xv6y8d/feed43_is_no_longer_supported_id_be_happy_to_pay/)
--------------------------------------------------------------------------------
title: "『NO RULES』を読んだ"
date: "2021-03-13"
--------------------------------------------------------------------------------
2ヶ月くらいかけてようやく読み終えました。ビジネス書を読み切れたのはいつ以来ぶりだろう?
{{< amazon asin="B08LDBNG74" title="NO RULES(ノー・ルールズ) 世界一「自由」な会社、NETFLIX" >}}
NETFLIXは「能力密度を高める」ことを最優先にしており、そんな超優秀な彼らに「個人における最高水準の報酬を払って」います。
しかも、会社として成長できる環境を用意しているので、他の会社にも引き抜かれづらい理屈らしいです。ペパボのあんちぽさんが書いてた「[いるだけで成長できる環境](https://tech.pepabo.com/2015/11/17/pepabo-tech-blog-has-started/)」を思い出しました。
その原資はそれほど優秀でない人を解雇して確保しているとのこと。日本だと簡単に解雇できないみたいなので、アメリカの法律を最大限に利用しているのかな。NETFLIX の日本法人だとどうなっているんだろう?
NETFLIX ではピラミッド構造ではなく、分散型のいわゆるティール組織なんだと思う。{{< post "2019-08-13-1" >}} に読んだ橋本さんの本の中で、大阪市はピラミッド構造でないと無理、ティール組織は絶対無理だと言っていたが、「能力密度」の高い/低いの話だと理解しました。
そして能力密度を十分に高めた状態で、「情報に通じたキャプテン」に意思決定を完全にお任せする。上司は一切意思決定をしない。そのキャプテンはコンテキストをきちんと理解し、さまざまな立場の人からフィードバックを受け、あらゆる選択肢を理解することが求められるし、協力も受ける。
割とすんなり理解できたのは、今所属しているフィードフォースの社長や人事の方が、長い年月をかけて浸透させてきたからかな?以前の私だと納得できなかったかもしれないです。感謝。
それにしても長い。長すぎます。丁寧に説明されているけど、結論を先にして、2/3 くらいに圧縮できなかったものかなあ...。物理本だと 456 ページもあったんですね。よく読み切った・・・!
そういう意味では {{< post "2020-12-20-1" >}} の『{{< amazon_link asin="B085W4YSZJ" title="データマネジメントが30分でわかる本" >}}』の、読者が「30 秒コース」「3 分コース」「30 分コース」を選べる方式は秀逸でした。
しっかり読むと大変なので、ななめ読みくらいの気持ちでに読むと良いかも。まあでも良い本でした。
--------------------------------------------------------------------------------
title: "『集合論入門』の第1編まで読んであとは挫折した"
date: "2021-03-09"
--------------------------------------------------------------------------------
{{< post "2021-02-22-1" >}} の『{{< amazon_link asin="B07GB4CNKP" title="達人に学ぶSQL徹底指南書 第2版" >}}』から派生して読みました。Amazon のレビューでは読みやすい読みやすいと書いてあったので、どんなに読みやすいか期待しつつ読み進めました。
{{< amazon asin="B06WVP2ZQK" title="集合論入門" >}}
「第1編 集合の代数」は確かに読みやすかったですが、「第2編 濃度」から急に理解できなくなり、「第3編 順序数」も含めてペラペラとページをめくって終了しました。
正確に書くと、SQL との関連性に期待して読み進めたが、距離が遠すぎて読むのを止めたといった感じです。焦るところではないので、そういうものだと受け入れました。
以下は第1編の自分用メモです。高校の頃は数学が好きだったので、懐かしみながらメモを取りました。
a ∈ A
a は A に属する、a は A の元(げん)である
a ∉ A
a は A に属さない、a は A の元(げん)でない
A ⊆ B または B ⊇ A
A は B の部分集合である
A ⊂ B または B ⊃ A
A は B の真部分集合である
Ø または {}
空集合
A ∪ B
A と B の和集合。"A cup B" または "A join B" と読む。SQL では UNION なので、∪ は覚えやすい。
A ∩ B
A と B の共通部分(積集合)。"A cap B" または "A meet B" と読む。SQL では INTERSECT。A ∩ B = Ø の時(共通な元が1つもない)、A と B は「互いに素」である。
A × B
A と B の直積
P.S.
Kindle 版はハイライトやメモを取れませんでした。本気で理解しようとする人は煩わしいと感じるかも。
--------------------------------------------------------------------------------
title: "『達人に学ぶSQL徹底指南書 第2版』を読んだ"
date: "2021-02-22"
--------------------------------------------------------------------------------
{{< post "2020-12-20-1" >}} にも書いた通り、去年の 4 月から SQL と格闘する毎日です。もっとも全部自分で書くわけではなく、[Looker](https://ja.looker.com/) が出力する SQL を理解したり、発生したエラーやデータ不正の原因を SQL 視点で調査したり、検証用の使い捨ての SQL を書いたりといった感じです。
つまりは SELECT 文しか書かないです。しかし、SELECT 文こそが SQL そのものと言っても良いため、現在のデータアーキテクト(データ整備人)という立ち位置での学習教材を探していました。そんな中思い出したのが本書になります。
{{< amazon asin="B07GB4CNKP" title="達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ" >}}
LookML 開発者としてはこの本に書かれた全てが「優先度高」ではないため、敢えて流し読みを心がけました。
その中で重要だと思ったのはこのあたりでしょうか。
・1 CASE 式のススメ
・2 必ずわかるウィンドウ関数
・4 3値論理と NULL
・7 ウィンドウ関数で行間比較を行なう
・8 外部結合の使い方
・18 GROUP BY と PARTITION BY
Looker が出力する SQL で見かけない気がする EXISTS, HAVING あたりは流し読みしたので、正直まだ理解していません。近いうちに読み返すと思います。
それとは別に、「第1部 9 SQL での集合演算」は興味深かったです。すなわち、和(UNION)、差(EXCEPT)、積(CROSS JOIN)です。商(DIVEDE BY)は「諸事情」により標準化が遅れているそうです。今まで雰囲気で UNION ALL を使うくらいだったので、集合演算は自分のスコープが広がった気がしました。
「15 関係に始まり関係に終わる」に SQL の関係閉包性が UNIX のパイプの概念とよく似ているという記述も興味深かったです。
UNIX ではファイルがさまざまなコマンドの入力・出力になるため、(標準)出力をパイプで次々と渡すことが出来ます。SQL では UNIX のファイルはテーブルに相当します。SELECT 文はテーブルを引数にとってテーブルを返すため、UNIX と同じように次々と出力を渡すことが出来ます。これを関係の閉包性と呼ぶそうです。これを知って、SQL に一気に親近感が湧きました。
後半に進むにつれ、より抽象的な話になっていきます。集合論というワードはちょいちょい出てきて気になってましたが、後半の「SQLでは、集合論的な観点からプログラミングを考えることが上達の鍵」というセンテンスを見てちょっと学んでみようかと思い、評判が良さそうなこの本を購入しました。あまり気負わずに読んでみます。
{{< amazon asin="B06WVP2ZQK" title="集合論入門" >}}
データアーキテクト(データ整備人)という文脈でオススメの本を見つけて、大変満足したというお話でした。
--------------------------------------------------------------------------------
title: "pushover orb のメンテナーになった"
date: "2021-01-22"
--------------------------------------------------------------------------------
個人で Slack workspace を作るのはオーバースペックだという~~宗教的な~~理由から、各種通知は [Pushover](https://pushover.net/) という通知サービスを利用しています。{{< post "2015-03-08-1" >}} に紹介記事を書いてましたね。
今は亡き [im.kayac.com](http://im.kayac.com) を便利にしたやつと言えば、分かる人には分かるでしょうか?
長らく CI の失敗通知は CircleCI のコンソールを見て久しぶりに気づくという、ダメな運用をしていました。去年の 9 /13 に重い腰を上げて、CI が失敗したら Pushover に通知させようとしました。その時作った PR がこちらです。
https://github.com/pbrisbin/pushover-orb/pull/1
レビューして頂いたは良いが、放置してしまい、修正 commit をしたのが先日の 1/18。無事マージされましたが、作者様は GitHub Actions に移行しており、メンテナーにならないかとお誘いを受けました。
https://github.com/pbrisbin/pushover-orb/pull/1#issuecomment-762920348
ちょうど [tfupdate orb](https://github.com/masutaka/circleci-tfupdate-orb) で CircleCI Orb の勘所は掴んでいたので、喜んで承諾。リリース周りを整えたリポジトリがこちらです。
{{< github_repo "masutaka/pushover-orb" >}}
メンテナーも変わったことだし、メジャーバージョンアップしつつ v2.0.0 をリリースしました。
https://circleci.com/developer/orbs/orb/masutaka/pushover?version=2.0.0
https://github.com/masutaka/pushover-orb/releases/tag/v2.0.0
よろしければご利用くださいませ。
--------------------------------------------------------------------------------
title: "tfupdate orb の circleci/orb-tools を v8.27.5 から v10.0.3 にアップデートした"
date: "2021-01-16"
--------------------------------------------------------------------------------
{{< post "2019-12-20-1" >}} で circleci/orb-tools を解説しました。リリースフローがよく出来ていたので、感動した記憶があります。
{{< github_repo "CircleCI-Public/orb-tools-orb" >}}
しかし、記事を書いた時にはすでに [v9.0.0](https://github.com/CircleCI-Public/orb-tools-orb/releases/tag/v9.0.0) がリリースされており、それはそれは大きな BREAKING CHANGES でした...。
やる気が出なかったので、[tfupdate orb](https://github.com/masutaka/circleci-tfupdate-orb) で使っているバージョンはずっと据え置いていましたが、今日急にやる気になったので、最新の [v10.0.3](https://github.com/CircleCI-Public/orb-tools-orb/releases/tag/v10.0.3) にアップデートしました。
当該 PR はこちらです。.circleci/config.yml がかなり短くなりました。
https://github.com/masutaka/circleci-tfupdate-orb/pull/2
[公式ドキュメント](https://circleci.com/docs/2.0/creating-orbs/)や [circleci/orb-tools のドキュメント](https://circleci.com/developer/orbs/orb/circleci/orb-tools?version=10.0.3)はありますが、よく分からないのと、今までの経緯からあまり信用できないので、[v10.0.3 のコードリーディング](https://github.com/CircleCI-Public/orb-tools-orb/tree/v10.0.3)をして理解しました。
circleci/orb-tools 自身の .circleci/config.yml も読みました。結果的にここまで複雑にする必要はなかったです。
https://github.com/CircleCI-Public/orb-tools-orb/blob/v10.0.3/.circleci/config.yml
今までは master ブランチに commit するたびに orb のバージョンが自動的に上がっていきました。セマンティックバージョンの制御はできません。
現在はその commit message によって、orb バージョンを半自動的に上げられるようになりました。セマンティックバージョンを制御可能です。
## v8.27.5 での振る舞い
master ブランチに commit が追加された時、src/commands または src/jobs 以下が変更されていれば minor version が、それ以外の変更では patch version が自動的に上がりました。major version はサポートされていませんでした。
何も考えずに済んだので楽ではありましたが、制御できないのは不満があったのかもしれません。
## v10.0.3 での振る舞い
master ブランチに commit が追加された時、当該 commit message に以下の文字列が含まれていれば([例](https://github.com/masutaka/circleci-tfupdate-orb/commit/2356a5991f1ac0e57f692d7aa6337adef7c2a513))、その指定に従ってバージョンが上がります。
[semver:major]
[semver:minor]
[semver:patch]
必須パラメータ publish-version-tag が true の時は git tag も push してくれます。
含まれている文字列が [semver:skip] の時はバージョンは上がりません。
どれも含まれていない場合、必須パラメータ fail-if-semver-not-indicated によって、CI の成功/失敗を制御できます。私は false にしましたが、厳格にしたい時は true にすると良いと思います。
覚えている自信はありませんが、この記事が未来の自分への助けになることでしょう。
他に、必須パラメータ add-pr-comment を true にすると、紐づく PR にコメントを追加してくれるようです([例](https://github.com/CircleCI-Public/orb-tools-orb/pull/80#issuecomment-603964251))。私は false です。
P.S.
公式ドキュメントや [circleci/orb-tools 自身の .circleci/config.yml では orb-tools/trigger-integration-tests-workflow job を使って、新しい workflow をトリガーして](https://github.com/CircleCI-Public/orb-tools-orb/blob/v10.0.3/.circleci/config.yml#L181-L184)いますが、その必要は感じなかったので、[1 つの workflow の中で lint や publish を全部やりました](https://github.com/masutaka/circleci-tfupdate-orb/blob/20ac49bca3b4771c2cb177517628abf44ee7eb41/.circleci/config.yml#L7-L33)。公式の例では .circleci/config.yml の中からは [pipeline.parameters.run-integration-tests が true になるタイミング](https://github.com/CircleCI-Public/orb-tools-orb/blob/v10.0.3/src/jobs/trigger-integration-tests-workflow.yml#L18)の理解が非常に分かりづらくて、無駄に複雑な workflow を書いてしまうと思いました。
--------------------------------------------------------------------------------
title: "思考を寝かせて、優先順位を決めるための「やるかもしれないリスト」がとてもうまくワークしている"
date: "2021-01-05"
--------------------------------------------------------------------------------
{{< post "2020-12-03-1" >}} では優先度は優先順位の下位レイヤーであり、優先順位を決めることが大事という話をしました。では優先順位はどう決めると良いでしょうか?
私はここ 10 年くらいの試行錯誤の末に「やるかもしれないリスト」という方法にたどり着きました。
現在はこのような esa 上の 1 記事として存在しています。
{{< figure src="/images/yarukamo-list-s.png" link="/images/yarukamo-list.png" target="_blank" rel="noopener" alt="画像" >}}
私が「やるかもしれないリスト」でやっていることはだいたい 3 つです。
* 頭の中を 1 つのテキストファイルにリストとして書き出し続ける
* 優先順位を並べ替え続ける
* 敢えて時間を置くことで、思考を寝かせ、よく練られた考えにし続ける
2020-06-09 に作ってから 203 回更新しています。1 日 1 回以上更新している計算になります。
アイディアを思いつくたびに追加したり順番を入れ替えたりしているので、このような更新回数になりました。こういうことはだいたい、仕事以外の時間、例えば散歩やシャワーの時に思いつきますよね。
以下の 4 つのポリシーで「やるかもしれないリスト」を更新し続けています。
## 1. 1 つのテキストファイルにする
この段階では、GitHub Issue や Trello、Asana などの便利なタスク管理ツールは使いません。
そもそも「やるかもしれないリスト」はタスクに落とし込む前の、もっと曖昧なものを扱う方法です。
各種タスク管理ツールは、具現化し、やることが決まったタスクを扱うツールだと思うので、その前の段階で使うのには適さないと考えています。
思いついたベースでタスク管理ツールに追加していくと、重要度が低いものや、まだ考えが練られていないタスクが作られがちです。一度タスクにしてしまうと、思考を寝かせて考えを練るのは難しい気がしますし、順番もつけづらく、削除もやりづらいと思います。
「やるかもしれないリスト」に一旦溜めることで、それらを避けることが出来ます。
## 2. 番号付きリストにする
先に話したとおり優先順位を決めることが目的の 1 つなので、その意図を反映した番号付きリスト(ordered list)にしています。ただのリスト(unordered list)にはしていません。
さらに書くと、h1 や h2 などの構造化は、順番を付けづらくなるのでオススメはしません。
前述の画像で構造化しているのは、私が現在一時的に複数プロジェクトに所属していたり、会社全体に関わることを多少やっているからです。繰り返しますが、順番を付けづらくなるのでオススメはしません。
## 3. 説明はできるだけ簡素にする
以下は実際のリストを抜粋したものです。
```
1. xxx view の primary_key に媒体も加える [:slack:](URL)
* Yahoo! JAPAN と Yahoo! が混在しているので、力技で直す必要がある
1. primary_key のテストから始めてみる
* primary_key が null でないテストはしたほうが良さそう
1. Database Performance で 10 秒以上かかるクエリを減らす [:github:](Issue URL)
* :bulb: 「ここから探索」して、Query Link を加えれば遅いクエリにたどり着ける
```
各リストは説明を 1~2 行程度に留められる大きさにしています。大きすぎると、思い出したり順番を入れ替えるのが面倒になるので。あと、関連するリンクがあればそれも添えます。未来の自分への助けになります。
とは言え、情報量が多くなることもあるため、その時は諦めて GitHub の Issue を作って、リストにリンクを添えます。
## 4. バッサリ削除する
思いつきで追記しているので、必要なくなることはあります。そのような時はバッサリ削除です。
「やるかもしれないリスト」に溜め、時間を経過させることで、思考を寝かせ、考えを練ることを期待しているので、特に問題ではありません。考えを練ったことで、余計なことをやらずに済んでいます。
それもあって「やるかもしれないリスト」という名前にしています。「やることリスト」ではないし「やりたいことリスト」でもないです。
ついでに書くと、終わった作業もバッサリ削除して忘れます。markdown の checkbox などで終わったことを管理しません。
---
以上のようなポリシーで「やるかもしれないリスト」を更新し続けると、自然と優先順位の高いものが上がってきます。次何やろうかなーと思った時は、上の方にあるものを GitHub の Issue にします。
こうすれば、自然と優先順位を決めることができ、今必要なことに集中できます。考えが練られていないタスクが、タスク管理ツールに作られる確率は減ると思います。
常に考え続けている状態なので、次の Q (Quarter) の計画はすぐ立てられると思いますし、ここ数年「やることが何もない」ことも起きていません。
ここまでの考え方は『思考の整理学』という本から大いに影響を受けました。
{{< amazon asin="4480020470" title="思考の整理学" >}}
多少回りくどくて冗長な本だったと記憶していますが、「考えを寝かせる」この一点だけが自分に突き刺さりました。
最初に書いた、散歩やシャワーの時に良いアイディアが浮かぶことが多いのは、まさに考えを寝かせているためだと思います。
優先順位は {{< post "2020-12-03-1" >}} で書いたように、期日や優先度などで決める必要がありますが、「やるかもしれないリスト」で考えを寝かせることで、いい感じに優先順位が決まると体感できています。自分の脳に整理をお任せしているような気分です。
ここ数年「タスクを全部管理するなんて出来ないよなあ」ともやもやしていました。理由は簡単で、タスクに落とし込む前のものまで管理しようとしていたからです。よく練られたタスクであれば、数も少なく、フワッとしていることはないと思うので、管理(というか把握かな)出来そうです。
## 「やるかもしれないリスト」の欠点
欠点があるとすれば、チームへの展開が難しいことだと思います。メンバー 1 人 1 人が常に「考えを練って」いれば理想的ですが、現実的には不可能でしょう。
ただ、チームリーダー的な人は、今回のような方法で「常に考え、思考を寝かせる」と良いと思いますし、そうしないと良くない状況に陥りそうです。
※ 私の仕事は現在、開発者 1 人プロジェクトということもあるのか、とてもうまくワークしています。
1つの「やるかもしれないリスト」を複数人で使うのもオススメしません。複数人だと思考の摺り合わせに時間がかかるからです。「やるかもしれないリスト」は常にアップデートし続けるものなので、常にお互いの考えが合っている必要がありますが、現実的でないと思います。
## まとめ
自分の中でとてもうまくワークしている「やるかもしれないリスト」を紹介しました。「やるかもしれないリスト」を使って考えを寝かせることで、優先順位をいい感じに決められ、よく練られたタスクに集中できています。
**追記(2021-02-02):**
複数人で使うことをオススメしないことを追記しました。
**追記(2022-05-30):**
「パーキングロット」という方法らしいです。
[集中するためにやっていること2022 - 詩と創作・思索のひろば](https://motemen.hatenablog.com/entry/2022/05/concentration-hacks)
**追記(2023-10-05):**
チーム(複数人)にはオススメしませんが、GitHub Projects を使って似たことは出来るかも知れません。
{{< post "2023-05-20-1" >}} → 「Idea置き場」
--------------------------------------------------------------------------------
title: "『データマネジメントが30分でわかる本』を読んだ"
date: "2020-12-20"
--------------------------------------------------------------------------------
4 月からプログラマーからデータアーキテクト(データ整備人)にキャリアチェンジして(そうなの?)、[Looker Advent Calendar 2020](https://qiita.com/advent-calendar/2020/looker) のこの記事で知ったので読みました。¥500 と、大変お求めやすい価格になっています。
{{< hatenablog title="Looker活用によるバイモーダルITの実現" url="https://yuzutas0.hatenablog.com/entry/2020/12/02/173000" >}}
データマネジメント知識体系 [DMBOK](https://jp.drinet.co.jp/blog/abount_dmbok)(でぃんぼっく)の独自要約とケーススタディ集です。全 11 章それぞれで 30 秒、3 分、30 分コースを選ぶことが出来るので、ざっと読むのもじっくり読むのも自由な点が秀逸です。
DMBOK 自体知らなかったので、取っ掛かりにはとても良い本でした。SLA はいずれ決めようかなーとか思ったりしました。
{{< amazon asin="B085W4YSZJ" title="データマネジメントが30分でわかる本" >}}
--------------------------------------------------------------------------------
title: "優先度より優先順位のほうが偉い"
date: "2020-12-03"
--------------------------------------------------------------------------------
この記事は [Feedforce Advent Calendar 2020](https://adventar.org/calendars/5560) の 3 日目の記事です。
昨日は [kysnrm](https://note.com/kysn) の「[さよなら湯島](https://note.com/kysn/n/n978df929184f)」でした。私も今のところに住んで来年で 6 年になるので、8 回目の引っ越しを少し考えてますが、まだ状況が流動的なので悩ましい...。
(ここから歌詞)
優先度を付けると、高高高高高高とかになることあるよね。みんな優先度が高い。
でも人間は一度に複数のタスクを処理することは出来ないよ。
それに実際終わってみたら、終わった順番が付いているはずだよ。
じゃあ 1, 2, 3... とタスクに順番を付けてみようか。つまりは優先順位ね。
優先度より優先順位のほうが偉い。ダンダン
優先度は優先順位を決める1つの要素でしかないよ。区別しようか。
例えば他にもこんなのを考慮する必要があるよ。
・期日
・かかる時間
・かかるお金
・サービスへのインパクト(顧客増加、顧客満足度など)
・他のタスクがどれだけ効率化するか?
優先度より優先順位のほうが偉い。ダンダンダン
先の例だと、優先度はだいたい「期日」と「サービスへのインパクト」でふんわり決まっていることが多いと思うよ。
作業者は他の要素も考慮して「優先順位」を決めると良いよ。
とは言え、考えすぎても難しいから、最初は「優先度」「かかる時間」「期日」から「優先順位」を決めると良いよ。
タスクAのほうが優先度が高いけど、タスクBはすぐ終わりそうだし、タスクAの期日までまだ余裕があるから、タスクBを先にやろう的な。
優先度より優先順位のほうが偉い。ダンダンダ、ダン
つまりは優先度よりも優先順位は上位のレイヤー、優先度より優先順位のほうが偉いということよ!
優先度より優先順位のほうが偉い。ダンダンダ、ダダン(号泣してみんな立ち上がる)
(歌詞終わり)
次回(?)は、私が使っている優先順位を決めるための具体的なテクニックをご紹介します。
明日の [Feedforce Advent Calendar 2020](https://adventar.org/calendars/5560) は、八百くんがよく日報に書いていた AI Quest の話をしてくれるみたいです。お楽しみに。
--------------------------------------------------------------------------------
title: "『理論から学ぶデータベース実践入門』を読んだ"
date: "2020-11-10"
--------------------------------------------------------------------------------
4 月から [Looker](https://ja.looker.com/) という BI ツールを使って、ウェブ広告の媒体数値や計測数値などの分析や可視化をすべく、日々取り組んでいます。
ちょうど先月社内勉強会でそんな話をしました。
{{< hatenablog title="『4月から取り組んできたLookerの導入から実装までのお話(Redashとも比較)』という発表をした" url="https://developer.feedforce.jp/entry/2020/10/23/190000" >}}
現在扱っているデータは Web アプリケーションで扱うような、正規化されたきれいなデータではありません。NULL は頻繁に出てきますし、サブクエリ等でゴリッときれいにしてキャッシュする処理も書いたりします。いつの間にか想定外のレコードが入っていて、定義を変更することもあります。
今までこのようなデータに向き合ったことはなかったので、こんなスキーマで良いのかなあ?とか思いながらの毎日でした。
そんな中、数年前に 94 ページ目まで読んで挫折したこの本が頭にちらついていました。
{{< amazon asin="4774171972" title="理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL" >}}
以前はふわっと読み始めたと記憶していますが、今回は割と明確な課題があります。今回は挫折しなさそうな気がしたのと、何かのヒントを期待して読むことにしました。
結論から書くと P155 に明確な答えが書いてありました。
> リレーショナルモデルに適合しないデータをテーブルを用いて格納する場合は、リレーショナルモデルの原理原則に従う必要はまるでありません。そのようなテーブルでは、NULLを用いてもかまいませんし、正規化をする必要すらないでしょう。
ここを読むまでは、仮にリレーショナルモデルの原理原則に従うのだとしたら、すべてのカラムで NULL を許容しているテーブルを ETL 等でリレーショナルモデルに適合したテーブルにクリーニングするのかなあ?でも現実的ではないなあ?など考えながら読んでいました。なので、急に答えが降ってきたようでした。
SQL はリレーショナルモデルを扱うことが得意ですが、そうでないものも扱って良いと力強く書いてあります。もちろん用法用量を守って。
特に目の前の課題が解決したわけではありませんが、なにか光が見えた気がしました。
他の話も一応書いておくと、理論だけあって全部を理解するのはかなり難しく、特に第2〜4章は全く頭に入ってきませんでした。数年前はここで挫折...。
ただし、第1章の SQL と集合の関係については比較的容易で、私が数年前に読んだ時は SQL への向き合い方が変わりました。気になる人は第1章だけでも読むと良いかもしれません。他も第9章の履歴データや第13章のリファクタリングなども。
なにか課題を抱えている人は、あまり気負わずに流して読むと良いかもしれません。
--------------------------------------------------------------------------------
title: "CircleCI の旧 UI で設定した Slack Integration の設定を確認も変更も削除もできない件への対応方法"
date: "2020-10-30"
--------------------------------------------------------------------------------
今年の春くらいに CircleCI の UI が新しくなったタイミングで、各プロジェクトで設定した Slack 通知用の設定ページはどこかにいってしまいました。
こんな画面でした。

各プロジェクトの設定ページによると、現在は Slack orb を使う必要があるそう。
例: https://app.circleci.com/settings/project/github/masutaka/example/slack
それはまあ移行すれば良いのですが、旧 UI で設定した Slack の Webhook URL を確認したくても出来ません。Slack orb に移行した場合に、旧 UI で設定した通知を無効にしてくれるのかも気になります。
CircleCI のサポートに聞いたところ、**残念ながらそのような UI は用意されておらず、Slack orb に移行しても自動的な無効化はしてくれないそう。**
マジすか・・・!
Undocumented API を使って無効化が必要とのこと。新 UI では確認も変更も削除もできないとのこと。それはさすがに困る人が多いんじゃないかなあ...?全部サポート対応するのかしら。
それはそれとして、この記事ではその Undocumented API を使って、旧 UI で設定した Slack Integration の確認と変更、削除のやり方をまとめます。説明しませんが、IRC も出来ると思います。
※ 9 月にサポートに聞いた時、「Undocumented API を使うのは構わないのだけど、やり方自体も Undocumented なのは変なのでヘルプページに書いて欲しい」と伝えたけど、書かれてないようなのでこの記事を書いています。
## 確認する
こんな感じです。CIRCLE_TOKEN は https://app.circleci.com/settings/user/tokens で作ります。
```
CIRCLE_TOKEN=xxxxxx
VCS=gh
ORG=masutaka
PROJECT=example
curl "https://circleci.com/api/v1.1/project/${VCS}/${ORG}/${PROJECT}/settings" \
-X GET \
-H 'Content-Type: application/json; charset=utf-8' \
-H "Circle-Token: $CIRCLE_TOKEN" \
| jq '{
vcs_url: .vcs_url,
slack_channel_override: .slack_channel_override,
slack_channel: .slack_channel,
slack_subdomain: .slack_subdomain,
slack_api_token: .slack_api_token,
slack_notify_prefs: .slack_notify_prefs,
slack_webhook_url: .slack_webhook_url
}'
```
このような結果を得られます。
```
{
"vcs_url": "https://github.com/masutaka/example",
"slack_channel_override": null,
"slack_channel": null,
"slack_subdomain": null,
"slack_api_token": null,
"slack_notify_prefs": null,
"slack_webhook_url": "https://hooks.slack.com/services/*********/*********/************************"
}
```
## 変更する
PUT で変更します。
以下の例では slack_notify_prefs と slack_webhook_url を変更しています。ちなみに前述の画像にある "Fixed/Failed Only?" にチェックを入れた状態が "slack_notify_prefs":"smart" みたいです。
```
CIRCLE_TOKEN=xxxxxx
VCS=gh
ORG=masutaka
PROJECT=example
curl "https://circleci.com/api/v1.1/project/${VCS}/${ORG}/${PROJECT}/settings" \
-X PUT \
-H 'Content-Type: application/json; charset=utf-8' \
-H "Circle-Token: $CIRCLE_TOKEN" \
--data-raw '{"slack_notify_prefs":"smart","slack_webhook_url":"https://hooks.slack.com/services/*********/*********/************************"}'
```
channel の変更は slack_channel の変更で良いと思いますが、おそらく slack_channel_override も指定も必要なはず。ただ、文字列で何を指定するのかは分かりませんでした。
場合によりますが、Slack Webhook URL に紐付いた channel を変えたほうが楽だと思います。
## 削除する
削除も PUT を使います。Slack 関係の設定をすべて初期化(?)する点が異なります。
```
CIRCLE_TOKEN=xxxxxx
VCS=gh
ORG=masutaka
PROJECT=example
curl "https://circleci.com/api/v1.1/project/${VCS}/${ORG}/${PROJECT}/settings" \
-X PUT \
-H 'Content-Type: application/json; charset=utf-8' \
-H "Circle-Token: $CIRCLE_TOKEN" \
--data-raw '{"slack_channel_override":"","slack_channel":null,"slack_subdomain":null,"slack_api_token":null,"slack_notify_prefs":null,"slack_webhook_url":""}'
```
## おまけ
Slack Webhook URL が
https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ
だったら、Slack の設定ページは
https://slack.com/services/YYYYYYYYYYY
です。
https://example.slack.com/services/YYYYYYYYYYY
のように Slack の workspace 名を指定する必要はあるかもしれません。
--------------------------------------------------------------------------------
title: "Looker User Meetup in Tokyo #4(BEACON Japan 前夜祭)に参加した #lookermeetup"
date: "2020-09-03"
--------------------------------------------------------------------------------
[【Looker ユーザー限定】Looker User Meetup in Tokyo #4 - connpass](https://looker-japan-user-group.connpass.com/event/186409/)

昨日開催されたこちらのイベントに参加しました。本日 9/3 から 4 週に渡って行われる [Looker BEACON Japan](https://ja.looker.com/events/beacon/japan) の前夜祭です。
よく考えたら Looker ユーザーの方々を拝見するのは初めてで、生の声を聴けたことが一番の成果でした。運営の方々、ありがとうございました。
今は会社で Looker を導入し、そろそろ Jumpstart プログラムが終わるフェーズで、これからボッチ LookML 開発に拍車がかかるところです。実装がんばります・・・!
以下、個人的なメモです。
## User Talk 1 : Lookerを利用した医療ビッグデータのマーケティング分析ツールの開発
{{< slideshare "tfe6ayNpwgjcTy" >}}
医療データと Looker は相性が良かったとのこと。
それにしても作り込んであるなあ。元が構造化されたデータで扱いやすいのかもしれないが、複雑なデータであることは確かっぽい。
## User Talk 2 : DeNAゲームタイトルの共通分析におけるLooker活用事例
{{< speakerdeck "3bcfcd96cb5e4956980702c780954655" >}}
ソシャゲだけあって規模感がすごかった。スピーカーの鈴木さんによると、最大 5 人で LookML を開発していて、KPI ごとに担当者を分けているそう。5 人 x チーム数分のようだった。規模がすごいなあ。
共通定義プロジェクトを用意して、継承(extends)して使っているそう。共通定義の定義が難易度高そうだった。どうなんだろう?
## User Talk 3 : トレタの分析環境とLookerへのこだわり
{{< speakerdeck "4fb01f024c5345beb49850b97bc4dde6" >}}
Redash で行き詰まり(?)、Looker に移行したそう。分かる。とは言え、Looker はリターンが多い分、学習コストがかなり高いんだけど、その辺どうだったのかな。
開発体制はスピーカーの CTO 鄧さんと業務委託 2 人で 3 ヶ月で作ったそう。Jumpstart 使ったのかな?あと 2 人くらい Looker のエバンジェリスト的な人(ビジネス職の人かな?)はいるっぽい。
Explore はだいぶきれい。(1) や (2) は真似しようと思った。
https://debezium.io/ 使って(?)MySQL から BigQuery に同期しているっぽい。数秒で同期とか言ってた気がする。
## User Talk 4 : 分析者でもプロダクト開発がしたい!と思ったら Looker
{{< speakerdeck "9ae69ecedbfe47b9a28eb43d31c4821c" >}}
YAMAP さんのダッシュボードが風情があるとザワザワしてた。リモートなのにザワザワが分かるくらいには。
データ分析チーム(2人)で完結でき、フロントエンドエンジニアの力を借りずともリッチなダッシュボードを作ることが出来ているそう。あと2人、スポットで LookML 開発するために Developer 権限を与えているエンジニアはいるとのこと。
## Product Updates (BEACON Sneakpeak)
Google Slide と Looker の統合は良さそう。Google Slide 上で Looker のグラフ(Look)とか生データを表示できる。
[当日の #lookermeetup](https://twitter.com/search?q=%23lookermeetup%20since%3A2020-09-02_00%3A00%3A00_JST%20until%3A2020-09-02_23%3A59%3A59_JST&src=typed_query&f=live)
--------------------------------------------------------------------------------
title: "CircleCI の orb を fork して PR を送る前の動作確認方法"
date: "2020-09-02"
--------------------------------------------------------------------------------
今回 [pbrisbin/pushover orb](https://circleci.com/orbs/registry/orb/pbrisbin/pushover) を変更した。PR を送る前に、動作確認がてらしばらく使っている。今後のためにやり方を残しておく。
1. 動作確認用の orb を publish するために masutaka/pushover という scope を作る。orb の scope は一度作ったら削除できず、リネームしか出来ないようだ。自分用なので気にしないことにする。
```
$ circleci orb create masutaka/pushover
You are creating an orb called "masutaka/pushover".
You will not be able to change the name of this orb.
If you change your mind about the name, you will have to create a new orb with the new name.
✔ Are you sure you wish to create the orb: `masutaka/pushover`: y
Orb `masutaka/pushover` created.
Please note that any versions you publish of this orb are world-readable.
You can now register versions of `masutaka/pushover` using `circleci orb publish`.
```
2. [circleci/orb-tools](https://circleci.com/orbs/registry/orb/circleci/orb-tools) を使うと面倒な publish を自動化出来る関係で、orb は src/ 以下の複数の .yml によって構成されていることが多い。ちょっと古くなっているが、以前 {{< post "2019-12-20-1" >}} で説明した。
以下のコマンドで src/ 以下の .yml を 1 つにまとめることが出来る。
```
$ circleci config pack src > orb.yml
```
3. 作られた orb.yml は orb publish サブコマンドで一時的に公開することが出来る。
```
$ circleci orb publish orb.yml masutaka/pushover@dev:alpha
Orb `masutaka/pushover@dev:alpha` was published.
Please note that this is an open orb and is world-readable.
Note that your dev label `dev:alpha` can be overwritten by anyone in your organization.
Your dev orb will expire in 90 days unless a new version is published on the label `dev:alpha`.
```
上に書いてあるとおり、いわゆる publish された状態にはなったが 90 日経つと使えなくなる。orb は 1.2.3 のようなセマンティックバージョンは消えないが、それ以外のバージョン(dev:alpha 等)は 90 日後に消える。
orb info サブコマンドで情報を得ることが出来る。
```
$ circleci orb info masutaka/pushover@dev:alpha
This orb hasn't published any versions yet.
Total-commands: 1
Total-executors: 1
Total-jobs: 1
## Statistics (30 days):
Builds: 0
Projects: 0
Orgs: 0
Learn more about this orb online in the CircleCI Orb Registry:
https://circleci.com/orbs/registry/orb/masutaka/pushover
```
4. 上記例の場合、.circleci/config.yml にはこのように書いて使う。
```
orbs:
pushover: masutaka/pushover@dev:alpha
```
おまけ: 開発バージョンだけ公開された orb であれば、scope の情報は取れないようだ。
```
$ circleci orb info masutaka/pushover
# => 開発バージョンしか公開していない scope の情報を取れない
$ circleci orb info masutaka/tfupdate
# => セマンティックバージョンを公開しているので scope の情報を取れる
```
--------------------------------------------------------------------------------
title: "テレビ用に HDMI 切替器を買った"
date: "2020-08-21"
--------------------------------------------------------------------------------
{{< amazon asin="B07T35CKFV" title="HDMI切替器 LAWEI 4Kx2K HDMI分配器/セレクター 5入力1出力 金メッキコネクタ搭載1080p/3D対応(メス→オス) 電源不要 Chromecast Stick/Xbox One ゲーム機/レコーダー パソコン PS3 Xbox 3D 液晶テレビなどの対応" >}}
- MVOWIZON というメーカー
- 今は ¥1,899 だけど、私は ¥1,399 で買えた
- https://www.amazon.co.jp/gp/product/B087YRSHZK/ で購入したがすでにページがなかった
- 5 入力 1 出力、リモコン付き、補助電源も可能でこのお値段はすごい
- 3 入力 1 出力もある。現在 ¥1,198
- https://www.amazon.co.jp/dp/B07QQDV39T/
- テレビと繋げるための HDMI ケーブルは別途必要だった
- 30cm の https://www.amazon.co.jp/gp/product/B00QLF74BQ/ を買った
- こんな感じで使用中。補助電源はせずに使えている
- テレビ HDMI1: 個人用 MacBook Air(Thunderbolt)
- テレビ HDMI2: 仕事用 MacBook Pro(USB Type-c)
- テレビ HDMI3: 今回の HDMI 切替器
1. Chromecast
2. PS4 Pro
3. Nintendo Switch
4. 未使用
5. 未使用
- HDMI 切替器を Mac と繋いだ時はうまくいかなかった
- Nature Remo と連携したが、PS4 や Switch を ON にすると勝手に切り替わるのでほぼ使っていない
- Google Home mini とも連携したが、そもそもテレビと Chromecast の区別がついていなかった(?)事情もあり挙動が不安定
- 成功する時は「セレクターのチャンネルを1にして」で OK。失敗することもある
- Nature Remo にテレビとして登録する必要はあるっぽい
ダメな配線の例:

--------------------------------------------------------------------------------
title: "Emacs-27.1 がリリースされたので elscreen.el を tab-bar.el に移行した"
date: "2020-08-16"
--------------------------------------------------------------------------------
[8/11 に Emacs 27.1 がリリースされました。](https://lists.gnu.org/archive/html/emacs-devel/2020-08/msg00237.html)
全然追ってなかったのですが、タブ機能がようやくネイティブでサポートされたそうなので、elscreen.el から移行してみました。
https://github.com/masutaka/dotfiles-public/commit/14710b91d5342c4aec6666c0bd38dec7808d9927
tab-bar.el のコード(※)を見て、出来るだけ独自の設定はせずに、elscreen.el の挙動と合わせてみました。
※ M-x find-library [Enter] tab-bar [Enter] で開けます。
真のデフォルト厨なら `C-x t ?` で確認できるキーを使うべきなのでしょうが、ヘタレなので elscreen.el と同じ `C-z` を Prefix key にしました。
タブ数の制限がなくなったのはうれしいです(elscreen.el は 10 個までだった)。100 個以上作れることは確認しました。`C-x t m` (tab-move) でタブを移動できるようになったのも改善点です(しかしドラッグアンドドロップには対応していない...)。`C-z C-m` とかに定義するかも。
`C-x 3` で縦分割したときに、右側のウインドウがタブ領域を上書きしなくなったのもうれしいです。
2020 年にもなって、こんなことで困っていたんだよなあ...。
**追記(2022-08-10):**
> しかしドラッグアンドドロップには対応していない...
Emacs 28 で `drag-mouse-1` (tab-bar-mouse-move-tab) が実装されて、出来るようになっていました。
--------------------------------------------------------------------------------
title: "Chromecast を第1世代から第3世代に買い替えた"
date: "2020-08-14"
--------------------------------------------------------------------------------
https://store.google.com/jp/product/chromecast
- 触ってられないほどの発熱だったのに触っていられる!これはすごい!()
- 性能は向上しているので、変な遅延とかは感じられない
- スマホやタブレットからの YouTube のキャストは良いかも。PS4 やテレビ(LG)のアプリだと概要欄とコメントが見られないので
- YouTube Music とかの Music のキャストはオーバーかなあ。テレビ付けてるに音楽流すだけなので
- Google Home Mini がテレビと Chromecast をどう区別しているか分かっていない
- テレビの HDMI 端子足りない。PS4 と Switch が 3 つのうち 2 つを専有していて、残り 1 つを Chromecast と Mac からの出力で取り合っている。HDMI 分配器を買えば良いのかな
関連記事: [Chromecast第3世代、第1世代やUltraと比べて快適さは? - ケータイ Watch](https://k-tai.watch.impress.co.jp/docs/column/todays_goods/1165358.html)
--------------------------------------------------------------------------------
title: "何年も続いている私の Emacs パッケージ管理方法"
date: "2020-07-24"
--------------------------------------------------------------------------------
こちらの記事の私なりのアンサー記事になります。
[Emacs のパッケージを少しずつアップデートした: 麦汁三昧](http://mugijiru.seesaa.net/article/476478144.html)
> そもそも lock が Emacs のパッケージシステムと相性が良くはないのでちょっと考え直したいところはある
el-get は昔試したことはありますが、なにか合わなくて止めました。
今は素の package.el に落ち着いてます。
1. [インストールするパッケージは init.el で管理。](https://github.com/masutaka/dotfiles-public/blob/5d21ef6ef4c3dba9f5f90aa33ef09711d2150a9c/.emacs.d/init.el#L22-L84)
起動時にインストールされてなければインストールされるけど、それよりむしろインストールしたパッケージの把握のためにベタ書きしている。
2. アップデートが溜まってきたらゴリッとアップデートする。
バックアップを取って、
```
$ cd ~/.emacs.d
$ tar czf ~/.Trash/elpa-$(date '+%Y%m%d%H%M%S').tar.gz elpa
```
M-x list-packages → U → x でアップデート。
Emacs を再起動してエラーになったら、バックアップを復元して後で調べる。でも最近は遭遇してないな。
拙作の BitBar プラグイン [Emacs Package Updates](https://getbitbar.com/plugins/Dev/Emacs/emacs-package-updates.1d.sh) でのアップデート確認が便利。
**追記(2022-05-05):**
BitBar は [xbar](https://xbarapp.com/) として再起動し、[Emacs Package Updates の URL も変わりました。](https://xbarapp.com/docs/plugins/Dev/emacs-package-updates.1d.sh.html)
[SwiftBar](https://swiftbar.app/) という BitBar の fork 版もあり、私はこちらを使っています。
--------------------------------------------------------------------------------
title: "Android の HTTP Shortcuts アプリで Slack Status 変更と勤怠打刻をいい感じにする"
date: "2020-07-17"
--------------------------------------------------------------------------------
※ {{< post "2020-05-24-1" >}} の Android 版です。
{{< post "2020-07-14-1" >}} に書いたとおり、iPhone から Android に乗り換えました。そうなると、勤怠関係の iOS ショートカットも移植しないといけません(よね?)
Android には同じ機能はなさそうでしたが、ちょっと調べたら [HTTP Shortcuts](https://play.google.com/store/apps/details?id=ch.rmy.android.http_shortcuts&hl=ja) というアプリを見つけました。ほぼ同等の機能で移植できましたので、ご紹介します。
## 使い方
アプリ内にこのようにショートカットを作りました。各ショートカットはホームに配置することは出来ますが、誤タップを避けるためにこうしました。

使用感はこんな感じです。誤タップすると面倒なので、すべて確認ダイアログを出しています。
{{< youtube "ad1RkDb8Y3s" >}}
## ショートカット構成
動作確認しやすくするために、ショートカットをモジュール化しています。


①②③④が直接呼ぶショートカットは以下のとおりです。
① = ⑨ → ⑤
② = ⑥
③ = ⑦ → ⑧ → ⑨
④ = ⑨
## ① 出勤
長押しして Edit を表示した画面です。

`Trigger Shortcurts` をクリックすると、前述の通り「⑨ /jobcan_touch」 → 「⑤ slack status 出勤」の順に実行するショートカットだと分かります。

`Require confirmation before execution` にチェックを入れて、実行前に確認ダイアログを出すようにしています。

実行された様子。ずっと「仕事開始」も変なので、この Status は 30 分で消えるようにしています(後述)。

## ② ランチ
長押しして Edit を表示した画面です。

`Trigger Shortcurts` をクリックすると、前述の通り「⑥ slack status ランチ」だけを実行するショートカットだと分かります。

このショートカットも `Require confirmation before execution` にチェックを入れています。
「⑥ slack status ランチ」は Slack status に絵文字「昼」を 60 分後に消えるようにセットします(後述)。それとなく伝えるためで、mention などを拒絶しているわけではありません。(^^)

iOS ショートカットではタイマーも設定していましたが、HTTP Shortcuts アプリでは設定できないので、必要な時は Google Home を使っています。
Google が最近リリースした [Action Blocks アプリ](https://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.maui.actionblocks&hl=en_US)から HTTP Shortcuts アプリを呼べば、出来るのかもしれません。
## ③ 退勤
長押しして Edit を表示した画面です。

`Trigger Shortcurts` をクリックすると、前述の通り「⑦ slack status 退勤」 → 「⑧ slack status DND」 → 「⑨ /jobcan_touch」の順に実行するショートカットだと分かります。

⑦で Slack status を「退」という絵文字にします。次回の出社まで「退」も変なので、この Status は 3 時間で消えるようにしています(後述)。

加えて、⑧で DND (Do Not Disturb) に設定しています。

現在はアラートが Slack 通知される業務には就いていないことと、リモートワークでメリハリをつけるために、DND を設定しています。
公式ヘルプ: [おやすみモードによる通知の一時停止|Slack](https://slack.com/intl/ja-jp/help/articles/214908388-%E3%81%8A%E3%82%84%E3%81%99%E3%81%BF%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E9%80%9A%E7%9F%A5%E3%81%AE%E4%B8%80%E6%99%82%E5%81%9C%E6%AD%A2)
## ④ 中抜け
通院等で中抜けをすることがあるので、登録しました。「⑨ /jobcan_touch」をラッピングしただけのショートカットですが、アイコンが直感的で気に入っています。
長押しして Edit を表示した画面です。

`Trigger Shortcurts` をクリックすると、前述の通り「⑨ /jobcan_touch」だけを実行するショートカットだと分かります。

## ⑤ slack status 出勤
Slack API [users.profile.set](https://api.slack.com/methods/users.profile.set) を呼ぶショートカットです。

※ POST 先サブドメインは会社の Slack workspace 名である feedforce.slack.com にしていますが、slack.com でも良いみたいです。
`Request Body / Parameters` をクリックした画面です。

`token` は Slack App の OAuth Access Token です。User Token Scopes に `users.profile:write` を設定すれば OK です。
Slack には GitHub のような personal access token は存在しないため、面倒ですが、専用の Slack App を作って token を発行します。[公式ドキュメント](https://api.slack.com/start)は Slack App の作り方が書いてありオーバーなので、[Slack API 推奨Tokenについて - Qiita](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21) などを参考にすると良いかもしれません。
`profile` は JSON です。
```json
{
"status_emoji": ":start_work:",
"status_text": "出勤しました",
"status_expiration": {statusExpiration}
}
```
`{statusExpiration}` は HTTP Shortcuts アプリで使えるグローバル変数です。トップ右上の `{}` から設定します。今回はこのように設定しました。

※ `{numMinutes}` は「⑧ slack status DND」で使用します。
`{statusExpiration}` は `Scripting` の Run before Execution で代入しています。Slack API を呼ぶ前に実行されます。
そう! HTTP Shortcuts アプリは JavaScript が使えるのです。iOS ショートカットでは使えないため、かなりの工夫が必要でしたので、これはうれしいです。さすが Android!?
`{statusExpiration}` に 30 分後の Unix 時間を代入しています。

```js
const date = new Date;
date.setMinutes(date.getMinutes() + 30);
setVariable("statusExpiration", parseInt(date.getTime() / 1000));
```
## ⑥ slack status ランチ
「⑤ slack status 出勤」とだいたい同じなので、画像とコードだけ貼っておきます。


```json
{
"status_emoji": ":lunch:",
"status_text": "",
"status_expiration": {statusExpiration}
}
```
`{statusExpiration}` に 1 時間後の Unix 時間を代入しています。

```js
const date = new Date;
date.setHours(date.getHours() + 1);
setVariable("statusExpiration", parseInt(date.getTime() / 1000));
```
## ⑦ slack status 退勤
これもだいたい同じなので、画像とコードを貼っておきます。


```json
{
"status_emoji": ":taisya:",
"status_text": "private time",
"status_expiration": {statusExpiration}
}
```
`{statusExpiration}` に 3 時間後の Unix 時間を代入しています。

```js
const date = new Date;
date.setHours(date.getHours() + 3);
setVariable("statusExpiration", parseInt(date.getTime() / 1000));
```
## ⑧ slack status DND
Slack API [dnd.setSnooze](https://api.slack.com/methods/dnd.setSnooze) を呼ぶショートカットです。

`Request Body / Parameters` をクリックした画面です。

`{numMinutes}` には DND を続ける時間を分で設定します。
「翌営業日」の AM9:00 まで DND にしているので、金曜日の時だけ挙動を変えています。

```js
const now = new Date;
const dateOffset = (now.getDay() == 5) ? 3 : 1;
const date = new Date;
date.setDate(date.getDate() + dateOffset);
date.setHours(9);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
setVariable("numMinutes", parseInt((date - now) / 60 / 1000) + 1);
```
## ⑨ /jobcan_touch
Slack API `chat.command` を呼ぶショートカットです。

とは言ったものの、`chat.command` のドキュメントはありません。[Slack API Reference のリポジトリに定義がある](https://github.com/slack-ruby/slack-api-ref/blob/master/methods/undocumented/chat/chat.command.json)ので、それを参考にしました。
おまけに `chat.command` に相当する Scope はないため、Slack App の OAuth Access Token は使えず、Legacy Token を使うしかありません。この Token は全ての Scope を持つため、取り扱いには十分な注意が必要です。
https://api.slack.com/legacy/custom-integrations/legacy-tokens#legacy-info
さらには、最近は新規作成はできず、作り直ししかできないので、過去に発行したことがある workspace にしか Legacy Token は存在しないことになります。闇。
https://github.com/ErikKalkoken/slackApiDoc/issues/22 でもそんな話がありましたが、その後進展はないようです。
`Request Body / Parameters` をクリックした画面です。

`token` は前述のとおり、Slack の Legacy Token です。
channel は `/jobcan_touch` したい channel の ID です。その channel で任意のメッセージ link をコピーすると、channel ID が含まれているので、それを使います。
例えば https://example.slack.com/archives/C01AY7YDW/p1234567890000000 だったら、channel ID は C01AY7YDW です。
command はそのまんまです。
「/jobcan_touch おはようございます。」にしたい場合は、新規パラメータ text を追加し、値に「おはようございます。」と書きます。
## まとめ
Android の HTTP Shortcuts アプリを使って、Slack status 変更と勤怠打刻をいい感じにするための、さらなる惜しまぬ努力についてまとめました。参考になれば幸いです。
## おまけ: /jobcan_touch での mention がウザい件
2 回 mention が来るのはウザいと思ってました。

最近の私はチーム開発をしていないため、#dev-null という、私含めて誰も Join していない channel を作って、そこに向かって `/jobcan_touch` しています。少しディストピア感があります。
## おまけ: その他の Slack status 変更方法
最近は Google Calendar App で会議中の時は In a meeting という Slack status に変えてます。
https://slack.com/app-pages/google-calendar
この App は Slack status が空の時だけセットします。iOS ショートカットで Slack status に expire を指定しているのは、この理由もあります。
以前はこの Google Apps Script を使っていましたが、毎分セットされる関係で、今回の iOS ショートカットと相性が悪いので使わなくなりました。コードを変更すればかなり柔軟性はあるので、合う人は合うと思います。
https://github.com/masutaka/imananishiton
--------------------------------------------------------------------------------
title: "『第5回 データアーキテクト(データ整備人)を”前向きに”考える会』に参加した #前向きデータ整備人"
date: "2020-07-14"
--------------------------------------------------------------------------------
[第5回 データアーキテクト(データ整備人)を”前向きに”考える会 - connpass](https://analytics-and-intelligence.connpass.com/event/180202/)
前回 {{< post "2020-06-09-1" >}} に続いての参加。大きな組織に所属されている方が多いのかな。
[当日の #前向きデータ整備人 Tweet](https://twitter.com/search?q=%23%E5%89%8D%E5%90%91%E3%81%8D%E3%83%87%E3%83%BC%E3%82%BF%E6%95%B4%E5%82%99%E4%BA%BA%20since%3A2020-07-14_00%3A00%3A00_JST%20until%3A2020-07-14_23%3A59%3A59_JST&src=typed_query&f=live)
以下、個人的なメモです。
## 抽出の仕事をうまくやるために必要なこと
{{< speakerdeck "5846a1ec16fc47a2a33744fed484f97f" >}}
主催者のしんゆうさん
ヒアリングは重要だよなあ。少なくとも、データ整備にかける時間の半分はそれに使っても良いと思う。誤ったヒアリングをすると、誤ったデータ整備をしてしまうので。
雑用扱いはされてないので、その点は恵まれている。私がそもそもデータ整備人というよりエンジニアだからね。
## 片手間でもできる!BIレポート整備人のためのガイドライン
{{< slideshare "rL82ECpCo2JCXk" >}}
ウィルさん
ガッツリ専業なので、今の状況には当てはまらないけど、片手間の人は大変そうだな。
## 「#前向きデータ整備人」を参考にデータ基盤を立ち上げた話
{{< speakerdeck "d7dbc6e293434a1fb2d1486c974639fd" >}}
おおたさん
分析基盤構成は興味深かった。マネーフォワードも Looker 使っているんだね。
## DataOpsという観点からデータ整備人を考える
{{< speakerdeck "6ca27bbbe4804c97a4f34772ed7d0366" >}}
ぼうさん
こちらの発表に限らないけど、大企業所属の方が多いのかな。
今はビジネス職の人と二人三脚でやっているので、お互いを理解して、まずは動くものを実装していくフェーズ。役割がシンプルなので、今のポジションを深く考えていない。始まったのが4月からというのもある。
## ゼロから作ったデータサイエンス組織で意識した事
{{< speakerdeck "2ada20d65c8641a0b018986d68ac9466" >}}
高橋光さん
「データドリブンな会社にする」
それな!
--------------------------------------------------------------------------------
title: "iPhone X から Pixel 3a XL に乗り換えて一週間経った"
date: "2020-07-14"
--------------------------------------------------------------------------------
{{< post "2017-11-18-1" >}} に iPhone X を買って 2 年半。当時の購入価格で 12 万円だったこともあり、iPhone はもう最後かなと思ってた。スマホに 10 万円超は払えなくはないけど、選択肢がないのは健全ではないと思った。あと、iPhone 飽きた。
10 年前に iPhone(4) を初めて買った時は「スマホでネイティブコードを動かさない Android 意味分からん」と思っていたのに、随分な変わりようです。
Android は {{< post "2016-11-01-1" >}} から ZenPad のタブレットを使っているし、最近は iPhone とそう変わらないとよく聞くので、思い切って乗り換えてみました。
Pixel 3a XL にしたのは、SIM フリーの Felica 対応 Android があまりなかったからです。Android に土地勘がないので、もっと良い選択肢はあったかもしれません。
ただ、このスペックで定価の 6 万円は割高に感じられました。そこで Google アラートを仕掛けて待つこと 2 ヶ月。やりました!
{{< tweet user="masutaka" id="1278546780246798336" >}}
タイミング的にも最後だったみたいです。そろそろ Pixel 4a が出るそうですが、今回は安く Android に乗り換えるのが目的だったので、後悔とかはありません。
本当は LG G8X ThinQ の 2 画面のやつが良かったんですけどね。CPU は Snapdragon 855 と速いのに、そこまで高くないし(7万円くらい?)。ソフトバンクの実店舗で契約して SIM ロック解除すればイケるという情報もありましたが、人気で品薄だったのと、最近の情勢でやりづらかったので今回は諦めました。
Pixel 3a XL に乗り換えて結果的にかなり満足しています。ただ、自分のマインドは一般的ではないと思うので、共感はされないかもしれません。
## 良かったこと
画面が少し大きくなった。iPhone X で十分だったけど、このくらいの大きさまでなら許容範囲。ホーム画面広い。
少し軽くなった。スペック的には 174g から 167g への変化だけど、なんかぜんぜん違う。iPhone X の文鎮感すごい。
よく使うアプリだけホームに置けば良いので、目に入るアプリをかなり減らせる。
指紋認証が使える!笑い話みたいだけど、最近外ではマスクしていることが多いので、普通に便利ね。家にいることが多いので、SmartLock で認証要らずなのも便利。それでも時々認証を求められる。Wifi ネットワークも指定できたら良いのに。
当たり前だけど Google の各種サービスとの親和性がとても良い。iPhone で我々が使っていたのは Apple ではなく Google のサービスだったんや・・・! Google Home mini も Nature Remo & Meross と共に、便利に使っていたので、こちらも親和性良し。
Apple のスマホと、Google のスマホで、解釈がこうも違うのはなかなか興味深いと思った。デフォルトの Pixel Launcher では通知バッジは表示されず、通知ドットだけなんだけど、数日で慣れちゃった。上からスワイプして通知を見れば良いし。
## 良くなかったこと
処理が遅くなった。Twitter とかブラウジングとかには全く支障はないけど、ドラクエウォークはちょっと厳しい。我慢してやってるね。A11 と Snapdragon 670 って、こんなに違うんだ...。
Nature Remo 等、一部アプリが時々固まる。アプリを終了させれば直る。体感的にはネットワークで待たされているか、刺さっているかのような気がした。
一部アプリの移行が超絶面倒くさい。まだ終わってない。特に音楽ファイル。YouTube Music って、まだβ版だよね?え、違うの?
画像は移行自体は Google Photos のバックアップ使えば簡単だけど、アルバム情報は引き継がれないので、こだわる人は大変だと思う。
アイコンとかダサい(でもなんか好き)。スタイルをデフォルトからアッシュにして、ダークテーマにしたらだいぶマシになった。iPhone X ではダークテーマ使ってなかったけど、Pixel はバッテリーの持ちが悪いそうなので、なんとなくそうした。
地味なところではクマコポーロに相当するアプリを見つけられていないのは少し困っている。
Tweetbot での Twitter 未読管理は諦めて、公式 Twitter と TweetDeck に乗り換えた。こっちはなんとかなりそう。
Lightning ケーブル捨てられるかと思ったら、AirPods 充電のためだけにまだ必要だった...。
## 慎重に移行したもの
### 電話番号
SIM カード付け替えて、みおぽんの APN 構成プロファイルをインストール...と思ったら、プロファイルのインストールは必要なかった。へぇー
### SQEX TOKEN
強制解除パスワードを控えているとは言え、これ系のアプリは緊張するよね。
### ドラクエウォーク
データ引き継ぎを忘れると、今までの時間が水の泡になってしまう(微課金なのでお金は問題なし)。でもデータ引き継ぎ設定からゲームデータをバックアップするだけで、簡単だった。引き継がない人もやっておけば良い系。
### LINE
忘れると友だちリストが全部消えるけど、忘れなくてもトーク履歴は全部消える。ひとつひとつ手作業でテキストファイルに保存することは可能。人によっては致命的だと思う。WeChat はトーク履歴も移行できたので、LINE がサボっているのだと思う。
### メモ
数が少ないので、手作業で Google Keep に移行した。
### リマインダ
Google ToDo リストかと思いきや、Google Keep が正解のようだ。念のため、ToDo リストも試したが、一度でも繰り返しを設定したタスクは、他のリストに移動できない謎仕様だったので却下。Google Keep もリマインダとしては癖があり、使いやすいわけではない。指定時間前のリマインダは完了に出来ないとか...。
### Pushover
Android 用に Subscribe が必要だったので迷わず購入。またお世話になります。
### Photo
iPhone X 側でバックアップを仕掛けて、数時間でアップロード完了。前述のとおり、アルバム情報は引き継がれない。
### Music
MacBook Air から手作業で YouTube Music にアップロード中。アルバムが分割されることがあるけど自分では編集できないとか、時々アップロードに漏れがあるのでチェックが必要とか、ブラウザからのアップロードはパフォーマンスに難ありとか、全部移行したい人はとても大変だと思う。曲を購入するにはどうしたら良いのだろう? CD 買っても良いのだけど、物が増えるのは嫌だ。
### ショートカット
{{< post "2020-05-24-1" >}} に設定したばかりのショートカットを [HTTP Shortcuts アプリ](https://play.google.com/store/apps/details?id=ch.rmy.android.http_shortcuts&hl=ja)に移植した。需要はないと思うが、俺得なので後日まとめる。
### QUICPay & iD
これは簡単。念のため Apple Pay の登録を削除して、Google Pay に登録しただけ。
### モバイル Suica
すごく苦労したけど、結果的に 1 円も損せずに移行できた。三井住友カードに JR 東海の「プラスEXカード」を追加し、View カードのように使っている。モバイル Suica とは別サービスになるようで、iPhone のモバイル Suica を一旦解約し、翌日に Android でモバイル Suica を新規登録(クレジットカードに三井住友カードを指定)して移行できた。モバイル Suica を解約する前に、残金を Amazon ギフト券に変換した。1 円単位で変換可能。以下の記事に大変助けられた。ありがとうございます。
* [モバイルSuicaをiPhoneからAndroidスマホへと移行する手順と注意点](https://www.zbuffer3dp.com/entry/mobile-suica-iphone-android/)
* [モバイルSuicaの残額を無駄なく使い切って0円にする簡単な方法](https://www.zbuffer3dp.com/entry/mobile-suica-0yen/)
## まとめ
iPhone X から Pixel 3a XL に乗り換えた。それなりに大変で不便になったこともあるけど、かなり満足して使っている。選択肢と戻るボタンとカーソルキーがある世界は良い。万人にはオススメしない。
--------------------------------------------------------------------------------
title: "『第4回 データアーキテクト(データ整備人)を”前向きに”考える会』に初参加した #前向きデータ整備人"
date: "2020-06-09"
--------------------------------------------------------------------------------
[第4回 データアーキテクト(データ整備人)を”前向きに”考える会 - connpass](https://analytics-and-intelligence.connpass.com/event/176896/)
最近この辺の仕事をし始めていて会社の人が教えてくれたので、初参加してきました。YouTube ライブだったので、かなりお手軽な参加でした。
今回は LT 祭り。技術の話から温かみのある話まで、網羅的に話を聞けた気がします。
[当日の #前向きデータ整備人](https://twitter.com/search?q=%23%E5%89%8D%E5%90%91%E3%81%8D%E3%83%87%E3%83%BC%E3%82%BF%E6%95%B4%E5%82%99%E4%BA%BA%20since%3A2020-06-09_00%3A00%3A00_JST%20until%3A2020-06-09_23%3A59%3A59_JST&src=typed_query&f=live)
以下、個人的なメモです。
## どうやって「データを整備すると良いことがある」を周りに伝えるか
{{< speakerdeck "c83f9e00491e47cf9253dcab0ad13606" >}}
主催者のしんゆうさん
使う人の気にすることを減らし、本来の分析に集中させるためにも、データ整備が必要。
データ分析する人は難しい SQL 書きたいわけではないですからね。データ分析をしたいわけでもないし、意思決定を素早くしたいはず。
## データ整備に必要な「実装設計書」の作成とコミュニケーション事例
(フォーム URL を公開してよいか分からないので載せない)
小川 卓さん
分析の質は取得しているデータの質に依存する。いくら AI とかが発達してもこれは変わらない。まあそうだよね。
## もう一度、表計算ソフトを愛でる
{{< speakerdeck "c298bfe5b0d54842adb54258bccbafdc" >}}
高比良 めぐみさん
秘伝のタレしがちだけど、使いどころによるという話。
個人的には、使い捨てのスプレッドシートや、BigQuery を介した機械的な利用には良さそうな気はしている。
## スキル0が曖昧な領域を埋めるために人の流れを整備した話
TODO: 資料が公開されたらここに貼る
山崎 隆弘さん
今の会社は大企業ではないとは言え、関係性を増やすのは少し分かる。私がひきこもりニートなので、そんなには出来ないし、やりすぎないようにもしているけど。
## embulk, digdagを用いたデータ基盤構築
{{< speakerdeck "d38bcb1528bb49c5b8b134177c531f62" >}}
土川 稔生さん
BigQuery に集約するためのノウハウの話だった。
今回話には出なかったけど、Redash のクエリの数は辛くないのかな。
私もちょっと前まで Redash を構築したり、少し SQL 書いてたけど、Redash のクエリ数が多くて辛い問題はあった。
最近機会があって Looker を学習しているけど、「ビジネス職の方がかんたんにデータを扱えるとはこういうことか」と感動している。学習や導入が進んだらどこかで話したい。
## 未来を変える! Withユーザー志向
{{< speakerdeck "72c1c1944c7744448b4ec1dd489880c7" >}}
成瀬エールさん
> 多くの運用担当者は、"与えられた環境の中だけ" の発想で運用、改善を行います。かつ結構我慢強いものです。
この件に限らず、とても良くわかる。そのためにもこちらから踏み込んで、理解したり知ってもらうことは必要。
## 業務データ整備における課題と対応について
(資料は連絡が来たら送るとのこと)
和田怜さん
ここまで自由奔放なデータを扱う予定はいまのところなさそうだが、大変そうだな...。
## "あえて"データ整備人になるメリットを前向きに考えてみた
{{< slideshare "7GmKU4qIRdNIOQ" >}}
香村貴之さん
> 意思決定の支援
> 意思決定の最大化
> 手段にフォーカスするのではなく、目的にフォーカスする。
解釈と説明がうまいと思いました。今回一番刺さりました。
--------------------------------------------------------------------------------
title: "エニタイムフィットネスを退会した #筋トレ"
date: "2020-06-08"
--------------------------------------------------------------------------------
先ほど退会手続きを済ませてきた。
特に必要なものはなくて、(当たり前だが)建物に入るためにセキュリティキーが必要なくらい。署名をして手続完了。セキュリティキーは返却不要。7/1 から使えなくなるだけ。
正式な退会日は 6/30 なので、入会日である {{< post "2018-06-30-1" >}} からちょうど丸2年となる。止める時は町屋から引っ越す時だと思っていたので、我ながら意外な結末。
COVID-19 騒動が発端ではあるが、改めて考えてみると、複数の理由が重なった退会だった。1つだけだったら退会してなかったと思う。
- 自宅トレーニングを継続できてしまっている([#筋トレ from:masutaka](https://twitter.com/search?q=%23%E7%AD%8B%E3%83%88%E3%83%AC%20from%3Amasutaka&src=saved_search_click&f=live))。むしろ以前より頻度が上がった
- 自宅トレーニングを 2 ヶ月半ほど続けて、特に太らなかった。逆に腕立て伏せのおかげか、大胸筋が少し大きくなった
- ジムと比べて、自宅トレーニングで時間を短縮できた
- 3 月のエニタイムは以前より混んでいて、バーベルが使えない頻度が増えた
- 私が非常に暑がりなので、マスクしながらトレーニング出来ない
あと、改めて考えると、専属のトレーナーが 2 月に突然退職したことも影響したと思う。もし退職していなかったら、退会しなかったかもなという意味で。引力が減ってしまった。
退会者が急増しているのかと思ったけど、そこまでではないそう?東大の施設がまだ再開していないとかで、逆にそれ以上に入会者は増えているそう。それなら安心(?)
自宅トレーニングをいつまで続けられるか分からないけど、「やらなくちゃいけない」「やると決まっているのでやる」の精神で思考停止して継続していく。
自宅トレーニングで大いに参考にしたユウジさんの YouTube 動画。これを見て、ランジをかなり重要視してやってます。雨の日は室内でバックランジ。晴れたら広場でウォーキングランジ。腕立て伏せと腹筋はおまけ(それでもかなり息は上がるけど)。
{{< youtube "jUzbOjswiRg" >}}
{{< youtube "dKkqpbyoxFk" >}}
{{< youtube "GlQ5sxgFvMk" >}}
--------------------------------------------------------------------------------
title: "iOS のショートカットで Slack Status 変更と勤怠打刻をいい感じにする"
date: "2020-05-24"
--------------------------------------------------------------------------------
2 月からほぼフルリモートで仕事してます。
会社の勤怠管理システムは[ジョブカン](https://jobcan.ne.jp/)が導入されています。物理出社していた時は、物理 Suica カードを NFC リーダーにタッチして打刻していました。
リモートワークでは物理タッチはできないため、Slack の任意のチャンネルで `/jobcan_touch` と POST して打刻しています。他の社員への共有も兼ねています。
ただ、毎日の `/jobcan_touch` が面倒になってきました。私は Slack status もゆるふわでセットしているため、追い打ちで面倒です。
いくつか試して今は iOS のショートカットに落ち着いたので、記事に残しておきます。
## 使い方
ホーム画面を右にスワイプすると現れるウィジェットに iOS ショートカットを登録し、直接使う3つのショートカットを表示させています。

使用感はこんな感じです。
{{< youtube "RPTlkvHTVWw" >}}
誤タップして打刻してしまうと、取り消しの申請が必要になるため、確認ダイアログを出しています。タイマーのダイアログはなんとなくです。
## ショートカット構成
動作確認しやすくするために、ショートカットをコンポーネント化しています。

①②③が直接呼ぶショートカットは以下のとおりです。
① = ⑩ → ④
② = ⑤
③ = ⑥ → ⑩
さらに④⑤⑥はそれぞれ⑦⑧⑨を使います。
## ① 出勤
前述の通り、「⑩ /jobcan_touch」 → 「④ slack status 出勤」の順に実行するだけです。

実行された様子。ずっと「仕事開始」も変なので、この Status は 30 分で消えるようにしています(後述)。

## ② ランチ
「⑤ slack status ランチ」を実行したあと、確認ダイアログとともに iOS のタイマーを 60 分にセットしています。

「⑤ slack status ランチ」は Slack status に絵文字「昼」を 60 分後に消えるようにセットします(後述)。それとなく伝えるためで、mention などを拒絶しているわけではありません。(^^)

iOS のタイマーは自分用です。昼休みは各自好きな時間に取ることができるため、開始時間を忘れがちです。Slack status を確認するのも面倒なので、分かりやすくタイマーをセットしています。おかげさまで安心してガチの昼寝もできます。
## ③ 退勤
「⑥ slack status 退勤」 → 「⑩ /jobcan_touch」の順に実行するだけです。

⑥で Slack status を「退」という絵文字にします。次回の出社まで「退」も変なので、この Status は 3 時間で消えるようにしています(後述)。

## ④ slack status 出勤
Slack API [users.profile.set](https://api.slack.com/methods/users.profile.set) を呼ぶショートカットです。

一番下の「URL の内容を取得」の「表示を増やす」とこうなります。

`token` は Slack App の OAuth Access Token です。User Token Scopes に `users.profile:write` を設定すれば OK です。
Slack には GitHub のような personal access token は存在しないため、面倒ですが、専用の Slack App を作って token を発行します。[公式ドキュメント](https://api.slack.com/start)は Slack App の作り方が書いてありオーバーなので、[Slack API 推奨Tokenについて - Qiita](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21) などを参考にすると良いかもしれません。
`profile` は JSON です。
```json
{
"status_emoji": ":start_work:",
"status_text": "出勤しました",
"status_expiration": ショートカットの結果
}
```
最後の「ショートカットの結果」に最初の「30分後のUNIX時間」が入ってきます。分かるかな?

## ⑤ slack status ランチ
出勤とだいたい同じです。Slack status は 1 時間後に消えます。

profile JSON はこちらです。
```json
{
"status_emoji": ":lunch:",
"status_text": "",
"status_expiration": ショートカットの結果
}
```
## ⑥ slack status 退勤
これもだいたい同じです。Slack status は 3 時間後に消えます。

profile JSON はこちらです。
```json
{
"status_emoji": ":taisya:",
"status_text": "private time",
"status_expiration": ショートカットの結果
}
```
## ⑦ 30分後のUnix時間
文字通りの iOS ショートカットです。これは Slack API `users.profile.set` のパラメータ `status_expiration` に指定されます。

正直、今回一番難しかったです。iOS ショートカットには Unix 時間を取得する方法がありません。
仕方がないので、現在に 30 分加算した日時を取得し、1970-01-01 09:00:00 との差を秒で求めることで、代替としました。JST なので 09:00:00 にしているのがポイントです。
こちらの記事に感謝。
[Unix time and the Date content type - iOS / Shortcuts - Automators Talk](https://talk.automators.fm/t/unix-time-and-the-date-content-type/2108)
⑧と⑨も同じです。
## ⑩ /jobcan_touch(打刻)
Slack API `chat.command` を呼ぶショートカットです。

とは言ったものの、`chat.command` のドキュメントはありません。[Slack API Reference のリポジトリに定義がある](https://github.com/slack-ruby/slack-api-ref/blob/master/methods/undocumented/chat/chat.command.json)ので、それを参考にしました。
おまけに `chat.command` に相当する Scope はないため、Slack App の OAuth Access Token は使えず、Legacy Token を使うしかありません。この Token は全ての Scope を持つため、取り扱いには十分な注意が必要です。
https://api.slack.com/legacy/custom-integrations/legacy-tokens#legacy-info
さらには、最近は新規作成はできず、作り直ししかできないので、過去に発行したことがある workspace にしか Legacy Token は存在しないことになります。闇。
https://github.com/ErikKalkoken/slackApiDoc/issues/22 でもそんな話がありましたが、その後進展はないようです。
さて、一番下の「URL の内容を取得」の「表示を増やす」とこうなります。

`token` は前述のとおり、Slack の Legacy Token です。
`channel` は `/jobcan_touch` したい channel の ID です。その channel で任意のメッセージ link をコピーすると、channel ID が含まれているので、それを使います。
例えば https://example.slack.com/archives/C01AY7YDW/p1234567890000000 だったら、channel ID は C01AY7YDW です。
`command` はそのまんまです。
「/jobcan_touch おはようございます。」にしたい場合は、新規フィールド text を追加し、値に「おはようございます。」と書きます。
## まとめ
iOS のショートカットで Slack status 変更と勤怠打刻をいい感じにするための、惜しまぬ努力についてまとめました。参考になれば幸いです。
## おまけ: /jobcan_touch での mention がウザい件
2 回 mention が来るのはウザいと思ってました。

最近の私はチーム開発をしていないため、#dev-null という、私含めて誰も Join していない channel を作って、そこに向かって `/jobcan_touch` しています。少しディストピア感があります。
## おまけ: その他の Slack status 変更方法
最近は Google Calendar App で会議中の時は In a meeting という Slack status に変えてます。
https://slack.com/app-pages/google-calendar
この App は Slack status が空の時だけセットします。iOS ショートカットで Slack status に expire を指定しているのは、この理由もあります。
以前はこの Google Apps Script を使っていましたが、毎分セットされる関係で、今回の iOS ショートカットと相性が悪いので使わなくなりました。コードを変更すればかなり柔軟性はあるので、合う人は合うと思います。
https://github.com/masutaka/imananishiton
--------------------------------------------------------------------------------
title: "Docker マルチアーキテクチャイメージのメモ"
date: "2020-04-11"
--------------------------------------------------------------------------------
知らなかったのでメモしておく。
説明や利用方法はこちらの記事にまとまっている。
[Dockerのマルチアーキテクチャイメージについて調べてみた|Developers.IO](https://dev.classmethod.jp/articles/docker-multi-architecture-image/)
> ・単一のDockerイメージで複数種類のOSやCPUアーキテクチャをサポートさせることができる。
> ・このイメージを起動させると、Dockerが実行されているホストのアーキテクチャに応じて適切なイメージが自動で選択される。
> ・Docker Hub上の公式イメージの多くはマルチアーキテクチャをサポートしている。
作成方法は公式ドキュメントに書かれている。
[Leverage multi-CPU architecture support|Docker Documentation](https://docs.docker.com/docker-for-mac/multi-arch/)
Experimental な buildx サブコマンドを使う。Docker Engine 19.03.8 から使える。
Docker for Mac の場合、Settings > Command Line から experimental features を有効にする必要がある。
Settings > Docker Engine で以下も設定する必要もあるかも。私はすでにこうなっていた。
```
{
"debug": true,
"experimental": true
}
```
前述の公式ドキュメントの通りにやると Docker Hub に masutaka/demo:latest が push される。
https://hub.docker.com/repository/docker/masutaka/demo/tags

※ masutaka/demo:default は `$ docker build -t masutaka/demo:default .` で普通にビルドした Docker Image。
builder は忘れずに元に戻しておく。
```
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuilder docker-container
mybuilder0 unix:///var/run/docker.sock running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default * docker
default default running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
$ docker buildx use default
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuilder docker-container
mybuilder0 unix:///var/run/docker.sock running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default * docker
default default running linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
```
--------------------------------------------------------------------------------
title: "NHK Eテレのテキシコーメモ"
date: "2020-04-02"
--------------------------------------------------------------------------------
[テキシコー [総合 小学校3・4・5・6年生、中・高]|NHK for School](https://www.nhk.or.jp/sougou/texico/)
朝チラ見して良さげだったので、第5回まで全部見た。各回10分。以下メモ。
<第1回>
Scene2 電車のおもちゃのつかみが良かった。こんなふうに動くんだ。
<第2回>
Scene3 新幹線の座席のカバーを変えるやつ。プログラミング的思考とは何かが一番分かりやすいかも。
<第4回>
Scene3 犬のフンを片付けるやつ。チラ見した時、おーと普通に感心した。
Scene5 うんうん、こういうのもそうだよね。
--------------------------------------------------------------------------------
title: "terraform を再帰的に実行する Makefile"
date: "2020-03-26"
--------------------------------------------------------------------------------
{{< post "2019-05-07-1" >}} に紹介した『[Pragmatic Terraform on AWS](https://booth.pm/ja/items/1318735)』に沿って設計すると、terraform のディレクトリは複数出来ると思います。
依存を分けることと、まとめて実行することはやや矛盾します。とは言え terraform や terraform provider がアップデートした時の terraform init/plan/apply はまとめてやりたいものです。
少し前に作って使っていますが、なかなか良い感じです。
## 使っている Makefile たち
{{< gist "masutaka" "ab96bf8baed8670f438916bd4cf95f0d" >}}
この辺りを工夫しました。
・terraform init/plan/apply に失敗すると、即座に停止する
・make の -C オプションを使って、cd せずに make を実行できている。つまり cd .. とかで戻る必要がない。そういう理由で下位ディレクトリに Makefile 置いてる
・make の -w オプションを使って、以下のようなそれっぽいログを出している
```
$ make init-r
make[1]: Entering directory `/Users/masutaka/src/github.com/masutaka/masutaka.net/terraform/aws'
(snip)
make[1]: Leaving directory `/Users/masutaka/src/github.com/masutaka/masutaka.net/terraform/aws'
make[1]: Entering directory `/Users/masutaka/src/github.com/masutaka/masutaka.net/terraform/heroku'
(snip)
make[1]: Leaving directory `/Users/masutaka/src/github.com/masutaka/masutaka.net/terraform/heroku'
```
## direnv 使う場合
terraform では credential を注入するケースも多いので、[direnv](https://github.com/direnv/direnv) も使うことは多いのではないでしょうか。ルートに .envrc があるだけなら別ですが、各ディレクトリにもある場合はこのパッチが必要になると思います。
{{< gist "masutaka" "9fa8ae6b3f8029bbcc6d88c161e82886" >}}
今回 direnv の exec サブコマンドを知りました。
```
$ direnv --help
direnv v2.21.2
Usage: direnv COMMAND [...ARGS]
(snip)
exec DIR COMMAND [...ARGS]:
Executes a command after loading the first .envrc found in DIR
```
make の -C オプションに似ていて、DIR に cd した体で COMMAND を実行してくれます。もちろん各ディレクトリの .envrc は load されます。
## まとめ
普段使っている terraform 用の Makefile を紹介しました。他にもあるので、いつか紹介するかもしれません。
--------------------------------------------------------------------------------
title: "スレッドセーフでない Dir.chdir の使用を RuboCop で禁止する"
date: "2020-02-25"
--------------------------------------------------------------------------------
[週刊Railsウォッチ(20200225前編)RubyのShellwordsライブラリは知っておくべき、VCRはやはり有能、copを自作、Hix on Rails記事ほか|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社](https://techracho.bpsinc.jp/hachi8833/2020_02_25/88956)
> RuboCopでコードレビュー支援: Net::HTTPを使わせないcop([Hacklines](https://techracho.bpsinc.jp/hachi8833/2020_02_25/88956#hacklines)より)
そういえば以前業務で似たことをやったので、メモがてら置いておきます。
## Dir.chdir はスレッドセーフではない
Sidekiq で [Dir.chdir](https://docs.ruby-lang.org/ja/2.7.0/method/Dir/s/chdir.html) を使ったら、他のジョブと干渉してハマりました。
[Feature #9785: Feature Proposal: Dir.chdir Thread Safety - Ruby master - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/9785)
↑ こちらの Issue を見つけるまで、Dir.chdir がスレッドセーフでないことを知りませんでした。Dir.chdir はプロセス全体の working directory を変えてしまうようです。裏側を想像するに仕方がない気はしますが、ruby のドキュメントには書いてないです。
今後レビューで指摘し続けるのも大変なので、RuboCop の custom cop で解決できないか検討しました。
## RuboCop の custom cop は作成も導入も割と簡単だった
とは言え、[rubocop-rspec](https://github.com/rubocop-hq/rubocop-rspec) みたいな gem を作るのは大げさです。
調べたところ、gem を作らずに、簡単に自作の custom cop を導入することが出来ました。
{{< gist "masutaka" "68d372b7f7910f552eeb215bb2e5d3cc" >}}
ruby 付属の ruby-parse コマンドで AST(抽象構文木)を得ることが出来ます。
```
$ ruby-parse -e 'Dir.chdir'
(send
(const nil :Dir) :chdir)
$ ruby-parse -e 'hoge ? :aaa : :bbb'
(if
(send nil :hoge)
(sym :aaa)
(sym :bbb))
```
nil と nil? の微妙な違い、... 等は RuboCop の事情というか構文です。公式マニュアルに書いてあります。
https://github.com/rubocop-hq/rubocop/blob/v0.80.0/manual/node_pattern.md
## 追記: 2024-11-17
現在は [rubocop-thread_safety](https://rubygems.org/gems/rubocop-thread_safety) gem に組み込まれているようです。[Gist のコメント](https://gist.github.com/masutaka/68d372b7f7910f552eeb215bb2e5d3cc?permalink_comment_id=5287386#gistcomment-5287386)で教えてもらいました。
https://github.com/rubocop/rubocop-thread_safety/blob/v0.6.0/docs/modules/ROOT/pages/cops_threadsafety.adoc#threadsafetydirchdir
--------------------------------------------------------------------------------
title: "『AWSの薄い本 IAMのマニアックな話』を読んだ"
date: "2020-01-22"
--------------------------------------------------------------------------------
[【ダウンロード版】AWSの薄い本 IAMのマニアックな話 - 佐々木拓郎のオンライン本屋 - BOOTH](https://booth.pm/ja/items/1563844)
少し前に Twitter で流れてきて買ったのかな。最近 AWS 等の権限まわりに課題を感じることが増えてきたので読んだ。デザインパターンやセキュリティ、運用方法など、参考になることが多くて、読んで良かった。
開発者用の IAM User の権限はやっぱり難しいみたいで、ああなるほどと思ってみたり。
仕事では開発用の共通 IAM User development を作って、.envrc 経由で使っているんだけど、さすがにドンピシャの解はなかった。
本当は開発者ごとの開発用 IAM User(例: masutaka-devel)を作って、共通 IAM User は使わないほうが良いのだろうなあ。開発者ごとの通常 IAM User(例: masutaka)は作っているんだけど。
CloudFormation によるコード管理にも触れていて、IAM Group や Role までは管理するけど、IAM User は管理しないとのこと。なぜなら IAM User は一度作ったらお終いだから。なるほど。
CloudFormation はまだ直接使ったことがないので、本書にあるようにハードルが低い IAM から始めるのは良いと思った。
IAM Policy を使った MFA の強制もやらないとな。そういえば他のチームはやっていたな。
P.S. .pdf 以外にも .epub か .mobi 形式も欲しかった。気になった箇所にマーカーやメモを付けたかった。目次からの移動も出来ないので不便。
**追記(2020-03-15):**
Kindle 本発売されたようです。
[Kindle本の販売という実績解除しました - プログラマでありたい](https://blog.takuros.net/entry/2020/03/15/111406)
--------------------------------------------------------------------------------
title: "『私はどのようにしてLinuxカーネルを学んだか』を読んだ"
date: "2020-01-12"
--------------------------------------------------------------------------------
{{< amazon asin="B07VJKJY7M" title="私はどのようにしてLinuxカーネルを学んだかゆたかさんの技術書" >}}
職場の同僚が積読していて、153 ページしかないと聞いたので、Kindle 版を買って読んでみた。
10 年前にデバイスドライバとか書いたことがあったので(Linux ではなく VxWorks ですが)、懐かしながら読んだ。アドレス変換やったなーとか。
Linux カーネルを読むのはそこまで特別な知識は要らなくて、マクロ展開が分からない時はプリプロセッサ出力を確認したりして、超地道に読み進める必要があるそう。
P153 ページしかないので、近々で Linux カーネルを読む予定がなくても、興味がある人は読むと面白いかも。
以下は自分用メモ。
P95
> 周辺機器からの割り込みのことをハードウェア割り込みや外部割り込みといいますが、「/proc/interrupts」を見ることで何回割り込みが発生したかが分かります
P144
> SystemTap というツールを使うと、カーネルをビルドすることなく、変数の値を表示することが出来るので便利です。
P144
> どのモジュールのソースコードから読むのがいいかという話ですが、最初のうちはシンプルなモジュールからがよいです。例えば、「/dev/null」というただデータを吸い込むだけのデバイスがありますが、ソースコードの作りもシンプルです。「/dev/null」のソースファイルは「drivers/char/mem.c」です。
dmesg の出力は printk() の出力だったのか。
--------------------------------------------------------------------------------
title: "circleci/orb-tools を使った Orb のリリースフローが良く出来ていたので紹介する"
date: "2019-12-20"
--------------------------------------------------------------------------------
:warning: circleci/orb-tools [v8.27.6](https://github.com/CircleCI-Public/orb-tools-orb/releases/tag/v8.27.6) を使っています。さっき見たら [v9.0.0](https://github.com/CircleCI-Public/orb-tools-orb/releases/tag/v9.0.0) がリリースされており、trigger-integration-workflow 等のジョブ名が変わり、互換性がなくなったことは確認しました。
---
先日、tfupdate の CircleCI Orb を作りました。
{{< github_repo "masutaka/circleci-tfupdate-orb" >}}
## tfupdate とは
tfupdate は terraform のアップデートを支援してくれるツールです。ローカルの .tf ファイルに書かれた、terraform と terraform provider のバージョンを最新にしてくれます。
{{< github_repo "minamijoyo/tfupdate" >}}
.circleci/config.yml に組み込むと、定期的に pull request を作ってくれます。
例: https://github.com/minamijoyo/tfupdate-circleci-example/blob/cd8e5561b7eabb25aa3cd024dfcf5b868c4bda45/.circleci/config.yml
タイムリーなことに、作者の minamijoyo さんが書かれた記事があります。詳しくはこちらをどうぞ。
[tfupdateでTerraform本体/プロバイダ/モジュールのバージョンアップを自動化する - Qiita](https://qiita.com/minamijoyo/items/1350fb28ae82a3dbb354)
## なぜ circleci-tfupdate-orb を作ったのか
前述の .circleci/config.yml を見ると分かりますが、かなり行数が長いです。130 行あります。
tfupdate 以外にも CI の設定はありますし、これを各リポジトリに書くのは辛いです。そのため、ほぼそのまま Orb にしたのが v0.0.2 です。
https://github.com/masutaka/circleci-tfupdate-orb/tree/v0.0.2
CircleCI Orb Registry はこちらです。v0.0.2 は circleci CLI を使って手動で Publish しました。[Publishing Orbs](https://circleci.com/docs/2.0/creating-orbs/) や他の記事など、読み漁りました。
https://circleci.com/orbs/registry/orb/masutaka/tfupdate?version=0.0.2
## なぜ circleci/orb-tools を使ったのか
変更を加えるたびに Orb Registry に publish していくのはなかなか面倒です。
- 手順を覚えるのが面倒
- 手順通りに circleci CLI を使うのが面倒
- どのバージョンに上げれば良いか考えるのが面倒
前述のドキュメントだとベストプラクティス的なものは分からなかったです。ただ継続的に Publish したいだけなのに。
仕方がないので、[circleci/orb-tools](https://circleci.com/orbs/registry/orb/circleci/orb-tools) をしっかり読んで、いい感じにしました。v0.0.4 です。
https://github.com/masutaka/circleci-tfupdate-orb/blob/v0.0.4/.circleci/config.yml
master ブランチにマージしたら、以下のようにいい感じに Orb Registry に Publish されます。
- src/commands 以下が更新されたら minor version を上げて Publish される
- src/{examples,executors} 以下が更新されたら patch version を上げて Publish される
- major version は自動では上がらない。詳細は後述する
- それ以外のファイルが更新されても、Publish されない
このフローを理解した時は本当に秀逸だと思いました。
フローに乗せるため orb.yml を分割しました。最初は分割しない方法を探りましたが、調べるうちに分割することが楽な道だと理解しました。
```
src
├── @orb.yml
├── commands
│ ├── provider.yml
│ ├── setup.yml
│ └── terraform.yml
├── examples
│ └── tfupdate_and_create_pull_request.yml
└── executors
└── default.yml
```
## 今回作ったリリースフローの解説
今回作ったリリースフローを解説していきます。
https://github.com/masutaka/circleci-tfupdate-orb/blob/v0.0.4/.circleci/config.yml
まずは 7~34 行目の lint_pack-validate_publish-dev workflow から。
🔗 https://circleci.com/workflow-run/b1ad1325-648d-4e54-bfe9-66d6ea9f8a9e

<9行目> [orb-tools/lint](https://github.com/CircleCI-Public/orb-tools-orb/blob/v8.27.6/src/jobs/lint.yml) job([実行されたジョブ](https://circleci.com/gh/masutaka/circleci-tfupdate-orb/44))
yamllint を使った素朴な lint です。
<10~12行目>[orb-tools/pack](https://github.com/CircleCI-Public/orb-tools-orb/blob/v8.27.6/src/jobs/pack.yml) job([実行されたジョブ](https://circleci.com/gh/masutaka/circleci-tfupdate-orb/45))
以下のような YAML を 1 つにまとめてくれます。フローに乗るために、小さな Orb であってもこの構成にしましょう。
- src/@orb.yml
- src/commands/*.yml
- src/examples/*.yml
- src/executors/*.yml
<13~16行目> [orb-tools/publish-dev](https://github.com/CircleCI-Public/orb-tools-orb/blob/v8.27.6/src/jobs/publish-dev.yml) job([実行されたジョブ](https://circleci.com/gh/masutaka/circleci-tfupdate-orb/46))
dev:alpha と dev:${CIRCLE_SHA1:0:7} というバージョンを Orb registory に publish します。
※ Orb registory では 1.2.3 のようなセマンティックバージョンは immutable(上書き不可)、それ以外のバージョン(dev:alpha 等)は mutable(上書き可能)です。
<17~25行目> [orb-tools/trigger-integration-workflow](https://github.com/CircleCI-Public/orb-tools-orb/blob/v8.27.6/src/jobs/trigger-integration-workflow.yml) job([実行されたジョブ](https://circleci.com/gh/masutaka/circleci-tfupdate-orb/43))
master ブランチ以外で実行されます。前述のファイル構成にしてくれれば、自動的に minor/patch のバージョンを上げるための git のタグを打ってくれます。
例: integration-{minor,patch,skip}-{ブランチ名}-${CIRCLE_SHA1:0:7}
ちなみに [major バージョンのリリースにはまだ(?)対応していません。良いアプローチを考えてみましょう or 手動でやってね とのことです。](https://github.com/CircleCI-Public/orb-tools-orb/blob/v8.27.6/src/jobs/trigger-integration-workflow.yml#L144)
実はこの job はあまり意味はないです。git のタグを打つパーミッションがあるかのテストだと理解しました。cleanup-tags: true を設定すれば、打ったタグはすぐに消されます。
<26~34行目> orb-tools/trigger-integration-workflow job([実行されたジョブ](https://circleci.com/gh/masutaka/circleci-tfupdate-orb/47))
こちらは mater ブランチ用です。同じように git のタグを打ってくれます。
例: master-{minor,patch,skip}-{ブランチ名}-{commit hash}
このフォーマットのタグが打たれると、次に説明する orb-tools/dev-promote-prod job が発動します。
35~64 行目の prod-release workflow を説明します。
🔗 https://circleci.com/workflow-run/a7eb933e-00b9-43c5-8497-5a23a3319f35

<37\~44行目> [orb-tools/dev-promote-prod](https://github.com/CircleCI-Public/orb-tools-orb/blob/v8.27.6/src/jobs/dev-promote-prod.yml) job([実行されたジョブ](https://circleci.com/gh/masutaka/circleci-tfupdate-orb/48))
master-patch* という git tag が付いたら発動します。41\~42 行目で全ブランチ ignore しているのがポイントです。
13\~16行目で publish した dev:${CIRCLE_SHA1:0:7} を $ circleci orb publish promote ... で Promote します。
$ circleci orb info でバージョン番号を取得し、git のタグを打ってくれます。
最後に master-patch* という git tag は掃除(削除)してくれます。
<46\~54行目> orb-tools/dev-promote-prod job
minor バージョン版。
master-minor* という git tag が付いたら発動します。
最後に master-minor* という git tag は掃除(削除)してくれます。
<56\~64行目> orb-tools/dev-promote-prod job
major バージョン版。前述のとおり、手動でタグを打たない限り、自動的にこのジョブは実行されません。
master-major* という git tag が付いたら発動します。
最後に master-major* という git tag は掃除(削除)してくれます。
## 感想
Orb バージョンは勝手に Bump していくので、**今 1.0.1 だから、次 1.0.2 だなとか、考えなくてよいのが秀逸**だと思いました。
欠点を挙げるのであれば、GitHub の release page が荒れることかな...。
例: https://github.com/CircleCI-Public/orb-tools-orb/releases

--------------------------------------------------------------------------------
title: "Heroku 上での bundler version の決められ方"
date: "2019-12-17"
--------------------------------------------------------------------------------
[Ruby apps will now have the `BUNDLED WITH` declaration in their `Gemfile.lock` removed after detecting Bundler version|Heroku Dev Center](https://devcenter.heroku.com/changelog-items/1716)
このアナウンスがあったので、調べてツイートした。ブログにも貼っておく。
{{< tweet user="masutaka" id="1206783536092479488" >}}
## アナウンスの内容要約
Gemfile.lock の 'BUNDLED WITH' には問題があるから、Heroku では bundler version の決定(v1 or v2)に使った後、'BUNDLED WITH' は削除してからデプロイするよとのこと。
Heroku というより heroku-buildpack-ruby の話ね。
{{< github_repo "heroku/heroku-buildpack-ruby" >}}
## heroku-buildpack-ruby の処理
LanguagePack::Ruby#install_bundler_in_app から呼ばれるここで bundler v1 か v2 かを判別。
https://github.com/heroku/heroku-buildpack-ruby/blob/v207/lib/language_pack/helpers/bundler_wrapper.rb#L183-L192
下の LanguagePack::Helpers::BundlerWrapper#detect_bundler_version_and_dir_name! で、v1 なら 1.17.3、v2 なら v2.0.2 だと決定していた。
https://github.com/heroku/heroku-buildpack-ruby/blob/v207/lib/language_pack/helpers/bundler_wrapper.rb#L194-L204
その後の LanguagePack::Ruby#build_bundler で 'BUNDLED WITH' ブロックをゴリッと削除。
https://github.com/heroku/heroku-buildpack-ruby/blob/v207/lib/language_pack/ruby.rb#L788-L790
## 当該 PR
[Remove bundler version in Gemfile.lock by schneems · Pull Request #928 · heroku/heroku-buildpack-ruby](https://github.com/heroku/heroku-buildpack-ruby/pull/928)
--------------------------------------------------------------------------------
title: "3ヶ月間、総務省の家計調査に協力していた"
date: "2019-11-17"
--------------------------------------------------------------------------------
今年の8月から10月の3ヶ月間、総務省の家計調査に協力していました。
{{< wikipedia word="家計調査" text="Wikipedia" >}} によると、
> 日本国内の家計の支出を通じて個人消費を捉えることができる統計。2002年からは貯蓄・負債についても調査されるようになっており、調査結果は家計収支編と貯蓄・負債編に分けて発表されている。
とのこと。2018年の餃子消費量1位は浜松市とかのアレも、家計調査の結果らしいです。https://www.e-stat.go.jp/ から誰でも利用できるようです。
## はじまり
6月終わり頃のある日、突然のピンポンがはじまりでした。話を聞くと総務省から委託された調査員の方で、真面目そうなメガネを掛けたおばさまでした。年齢は60前後と推察しました。対象世帯は無作為に選ばれるらしいです。
私は10年以上家計簿をつけているし(現在はマネーフォワードを利用)、国勢調査みたいなものでしょと軽く考えていたのが想定外のはじまり。
その日はなぜか詳しい説明はなく、後日説明に再訪されることになりました。
※ 家計調査は訪問を介したコミュニケーションが多いです。オンラインを中心としたコミュニケーションが当たり前になっていると結構重いです。
## 想像を絶する苦行
後日の再訪で説明をよく聞くと「3ヶ月間毎日、レシートの中身をひとつひとつ全部、紙に記入する」という、想像を絶する苦行でした。そして毎月1日と16日に家計簿を取りに来るという...。予定を合わせるのも大変だし、家計簿を付ける以外のことが出来なくなりそうでした。
↓ これが1日分です。電子マネーや口座振替による支出は別のページに書きます。昭和か。

※ [家計簿の記入のしかた(単身世帯用)](https://www.stat.go.jp/data/kakei/form.html)P8 より引用
さすがに大変すぎるので断ろうとしたら、Web サービスもあるとのこと。え、Web がデフォルトじゃないの?
調査員の方が経験がなく講習を受けただけ(?)らしく、後日説明に来ることになりました。コミュニケーションが重い...。
{{< tweet user="masutaka" id="1142729561005629440" >}}
再々訪は2週間後だったでしょうか。どんな説明があるのか少し構えていたら、URLとID、パスワードを書かれた紙を渡されてその日は終わりました。うーむ。
割と断る気満々だったのですが、タイミングを逃したため、とりあえず始めてみるかという気持ちになりました。
## 家計調査 オンライン回答システム
https://www.e-kakei.go.jp/ です。SignUp は出来ません。Angular 製の SPA っぽくて、HTTP/1.1 でした。
最初はトップページの表示が激重でしたが、途中から問題ないレベルまで改善されました。
↓ 実際に入力したある日の家計簿です。

UI はあまり直感的でないです。例えば上の画面。しばらく経ってから、中央上部の日付をクリックするとカレンダーがポップアップし、他の日に移動できることに気づきました。日付の前後に "<" や ">" のナビゲータがあれば気づきやすいかと思います。
お問い合わせフォームはあったので、いくつか意見は送りました。例えばサイドメニューの「収支検索」でなにか記入して Enter すると、検索ではなくフォームのクリアが実行されるのは直感的でないとか。
あと、セッションタイムアウトが 1 時間くらいだったのは地味に不便でした。
## 家計調査スタート
実は私はこういうルーティンは得意です。ほぼ毎日マメにレシートやクレジットカード、電子マネー、現金の支出入を記録していました。文句ばかり書いていたのは、理不尽に自分の時間が奪われるから。
カメラによるレシート自動読み取り機能はなかなか良くできていて、文字認識はなんとか使えるレベル。iPhone からの記録はそれなりにスムーズでした。Mac はカメラの位置的に自動読み取りが使えなかったので、iPhone で入力して Mac で分類などを一括編集する必要があり、心折れる人は多い気がしました。
8/16, 9/1,... とそれなりに順調に提出をしていきました。覚えがないのに、10月上期分が提出されていたことは謎でしたが...。
調査員の方へのお知らせは特に必要なく、オンライン上で提出するだけです。
ただ、割と早く提出する必要があるようで、9/1 は午前中に SMS で提出依頼がありました。つらい。入力を溜めると大変そうです。
## 月末のお便り
家計調査通信という紙のお便りが、毎月末に郵便受けに入っていました。家計調査の方が届けて下さっていたようですが、担当世帯の数はどのくらいか想像すると複雑な気持ちになりました。
## 毎月お礼の品が届く
家計調査はボランティアですが、月末近くになると宅配便でお礼の品が届きます。価格帯は3000〜4000円くらいでしょうか。なかなか良い品です。ゼリーとジュースは会社で配りました。
8月の品(ゼリー詰め合わせ)

9月の品(ジュース詰め合わせ)

10月の品(カレー詰め合わせ)

## 10月の軽減税率スタート
運悪く、10月に消費増税とともに軽減税率が始まりました。その少し前に、前述のオンライン回答システムも UI 含めた大きなリニューアルがありました。強い。
当初は関係すると思いませんでしたが、各店レシートのフォーマットが変わり、キャッシュレス還元額の項目も増えたため、大いに関係がありました...。
例えばローソンは自動読み取りが全く出来なくなり、本当に苦行になったため、ローソンでの買い物は止めてしまいました。
{{< tweet user="masutaka" id="1180841171565699073" >}}
正直な気持ちです。
{{< tweet user="masutaka" id="1180841687112769536" >}}
余談ですが、このリニューアルで「代行入力」という機能も出来ていました。試しに一度使ったところ、レシートで撮影すると人力で入力してくれる機能でした。読み取りがうまくいかないケースへの対応でしょうか。うーむ。
代行入力を依頼したところ

## 感想
そんなこんなで、10/31 に最後の提出をして家計調査が終わりました。
思っていたとおりに大変だったという感想です。終わって一週間くらいは、レシートを必ず受け取る習慣が残っていました。
私と違って、大多数は紙で提出しているようです。2019 年にもなって、国の統計に紙を使って大変な労力を割いていることには正直ドン引きしました。働き方改革...。
システムも紙入力の仕様を取り込みきれていないようでした。例えば外食をしたら「カレー(外食)」などと書く必要があります。統計的に、家での食事と外食は分ける必要があるようです。
クレジットカードでの自動引き落としとも相性が悪く、マネーフォワードの iOS アプリがなければギブアップしていたかもしれません。
あと、なんとなくですが裏側に温かみのある運用を感じました。紙入力が大多数なことも考えると、都庁の担当者が別なシステムにうちこみ直していても、不思議ではないです。
この記事が今後誰かの最高になれば幸いです。
--------------------------------------------------------------------------------
title: "『Clean Architecture』を読んだ"
date: "2019-10-28"
--------------------------------------------------------------------------------
{{< amazon asin="B07FSBHS2V" title="Clean Architecture 達人に学ぶソフトウェアの構造と設計" >}}
一章一章は短いものの、全部で 34 章もあったので、読み終えるのに一ヶ月ほどもかけてしまった(付録は飛ばした)。
コードが出てきた記憶はなく、依存関係を表す図が多かった印象。
決して初心者向けの本ではなく、『オブジェクト指向設計実践ガイド』{{< post "2016-09-22-1" >}} {{< post "2017-11-01-1" >}} 程度を理解できる程度のスキルは必要だと思う。逆に言うと、『オブジェクト指向設計実践ガイド』の次に読む本としては良い。
そういう自分も、半分くらいはあまりピンと来ずに読んでいた記憶。
一方で一番自分にが価値があったのは「SOLID原則」のまとめのあたりかな。以下 5 つの原則の頭文字を取ったもの。
・単一責任の原則(SRP : Single Responsibility Principle)
・オープン・クローズドの原則(OCP : Open-Closed Principle)
・リスコフの置換原則(LSP : Liskov Substitution Principle)
・インターフェイス分離の原則(ISP : Interface Segregation Principle)
・依存関係逆転の原則(DIP : Dependency Inversion Principle)
業務に取り入れられる設計はあったので、良きタイミングで取り入れていきたい。
時間をおいてまた読み返そう。
--------------------------------------------------------------------------------
title: "terraform-provider-healthchecksio を Terraform Plugin SDK に移行した"
date: "2019-10-10"
--------------------------------------------------------------------------------
今まで terraform provider のビルドには、terraform 自体をライブラリとして要求されました。今後は [terraform-plugin-sdk](https://github.com/hashicorp/terraform-plugin-sdk) を使います。
この PR で移行しました。
[Migrate over to new terraform SDK by masutaka · Pull Request #16 · kristofferahl/terraform-provider-healthchecksio](https://github.com/kristofferahl/terraform-provider-healthchecksio/pull/16)
※ https://healthchecks.io はバッチが時間通りに動いたかの監視で重宝しています。
仕事で使っている terraform-provider-heroku の [v2.2.1](https://github.com/terraform-providers/terraform-provider-heroku/releases) で知りました。
9/26 にアナウンスがあったのかな? 知らなかった。
{{< tweet user="mitchellh" id="1176969121948405764" >}}
https://www.terraform.io/docs/extend/plugin-sdk.html に従うだけで割と簡単です。[tf-sdk-migrator](https://github.com/hashicorp/tf-sdk-migrator) という移行ツールが用意されています。
```
$ go get github.com/hashicorp/tf-sdk-migrator
$ go mod vendor
$ tf-sdk-migrator check
$ tf-sdk-migrator migrate
```
> $ tf-sdk-migrator check
> (snip)
> exit status 1
> build github.com/kristofferahl/terraform-provider-healthchecksio: cannot load github.com/hashicorp/terraform/helper/schema: open /Users/masutaka/src/github.com/kristofferahl/terraform-provider-healthchecksio/vendor/github.com/hashicorp/terraform/helper/schema: no such file or directory
go mod vendor しているのは、tf-sdk-migrator check で、このエラーに遭遇したからです。go-1.13 使っているんだけどなあ。よく分からない。
> $ tf-sdk-migrator check
> (snip)
> Terraform version does not satisfy constraint >=0.12.7. Found Terraform version: 0.12.2
> (snip)
go.mod に記載している Terraform のバージョンは 0.12.7 以上を要求されたため、アップデートを試みました。
まだ Go Modules でのライブラリアップデートを理解できておらず、[go get の使い方でハマっていました...。](https://github.com/kristofferahl/terraform-provider-healthchecksio/pull/16#discussion_r333103868)
go get -u だと、依存先もアップデートしてしまい、go.mod に "// indirect" が大量に追加されます。そうではなくて go get github.com/hashicorp/terraform が正解っぽかったです。
--------------------------------------------------------------------------------
title: "本番環境で heroku run する時の tips"
date: "2019-09-20"
--------------------------------------------------------------------------------
※ 会社の esa.io に投稿した記事の転載です。
本番環境で DB の値を書き換えるために、rails runner や rails console を使うことがある。bash もあるかもしれない。
```
$ heroku run rails r scripts/important.rb -a
# or
$ heroku run rails c -a
```
**heroku run のログは現在の端末だけにしか出力されない**。アプリのログには出力されないため、LogDNA や Papertrail などにも記録されない。
**現在の端末を閉じてしまうと、ログが消失する**ため十分注意すること。
## 回避方法
↓ 以下のような非対話型コマンドであれば、run:detached サブコマンドを使うことで、LogDNA などに送ることが出来る。ただし、現在の端末には出力されない。
・rails runner
・ls
↓ 対話型コマンドは今回の方法は使えない。他の回避方法があるかは不明。
・rails console
・bash
## 非対話型コマンドのログをアプリのログに出力する
※ 以下、 を immense-shelf-19179 とします。
run:detached サブコマンドと -t オプションを使う。
```
$ heroku run:detached -t ls -a immense-shelf-19179
Running ls on ⬢ immense-shelf-19179... done, run.7459 (Hobby)
2019-09-18T05:59:42.797129+00:00 heroku[run.7459]: Starting process with command `ls`
2019-09-18T05:59:43.429271+00:00 heroku[run.7459]: State changed from starting to up
2019-09-18T05:59:44.463225+00:00 heroku[run.7459]: State changed from up to complete
2019-09-18T05:59:44.442709+00:00 heroku[run.7459]: Process exited with status 0
2019-09-18T05:59:44.389919+00:00 app[run.7459]: Procfile
2019-09-18T05:59:44.389950+00:00 app[run.7459]: README.md
2019-09-18T05:59:44.389953+00:00 app[run.7459]: app.json
2019-09-18T05:59:44.389955+00:00 app[run.7459]: index.js
(snip)
```
以下のとおり、run サブコマンドとは出力フォーマットが異なる点には留意する。
```
$ heroku run ls -a immense-shelf-19179
Running ls on ⬢ immense-shelf-19179... up, run.7702 (Hobby)
Procfile README.md app.json index.js node_modules package-lock.json package.json public test.js views
```
## おまけ
### 対話型コマンドを run:detached サブコマンドで起動してしまったら
プロンプトが現在の端末に Attach されないため、向こう側で待ち続ける。
↓ よく見ると向こう側で '[1] pry(main)>' が出力されている。
```
$ heroku run:detached rails c -a immense-shelf-19179
Running rails c on ⬢ immense-shelf-19179... done, run.9514 (Hobby)
Run heroku logs --app immense-shelf-19179 --dyno run.9514 to view the output.
$ heroku logs --app immense-shelf-19179 --dyno run.9514
2019-09-18T06:02:02.544029+00:00 heroku[run.9514]: Starting process with command `rails c`
2019-09-18T06:02:03.329165+00:00 heroku[run.9514]: State changed from starting to up
2019-09-18T06:02:16.615759+00:00 heroku[run.9514]: State changed from up to complete
2019-09-18T06:02:16.557123+00:00 heroku[run.9514]: Process exited with status 0
2019-09-18T06:02:16.213234+00:00 app[run.9514]: Loading staging environment (Rails 5.2.3)
[1] pry(main)>02:16.538739+00:00 app[run.9514]:
```
今回の場合、run.9514 (One-off) Dyno が待機し続ける。
```
$ heroku ps -a immense-shelf-19179
=== run: one-off processes (1)
run.9514 (Hobby): up 2019/09/18 15:02:03 +0900 (~ 13s ago): rails c
=== web (Hobby): bundle exec puma -C config/puma.rb (1)
web.1: up 2019/09/18 12:04:41 +0900 (~ 2h ago)
```
1 時間経つと SIGTERM を受け取り自動終了する。
手動で停止するには ps:kill サブコマンドを使用する。
```
$ heroku ps:kill run.9514 -a immense-shelf-19179
Stopping run.9514 dyno on ⬢ immense-shelf-19179... done
```
### 裏で何が行われているか?
デバッグログを出して、両者を比較すると分かる。
↓ heroku run は、裏で attach_url が発行され、現在の端末に接続されるようだ。
```
$ DEBUG='*' heroku run ls -a immense-shelf-19179
(snip)
--> {"command":"ls","attach":true,"env":{"TERM":"screen","COLUMNS":165,"LINES":59}}
Running ls on ⬢ immense-shelf-19179... ⢿
<-- 201 Created
http <-- POST /apps/immense-shelf-19179/dynos
http {"attach_url":"rendezvous://rendezvous.runtime.heroku.com:5000/e9921dc55fcc6df5d863221874e70f5bef58318a8e785a108f1ff985309c7548","command":"ls","created_at":"2019-09-20T13:01:11Z","id":"0f0bde73-731f-4a52-82df-e84103dc34ab","name":"run.6626","app":{"id":"8b5795a0-98f6-478b-bb13-f53f4ff99e7c","name":"immense-shelf-19179"},"release":{"id":"c8f828c8-942c-40b6-907b-f3e71ff02732","version":3},"size":"Free","state":"starting","type":"run","updated_at":"2019-09-20T13:01:11Z"} +992ms
(snip)
```
※ rendezvous という URL スキーマを見た感じ、内部的に [rendezvous gem](https://github.com/heroku/rendezvous.rb) を使っているっぽい?(同僚氏談)
↓ heroku run:detached は、attach_url は発行されない。代わりに [Logplex](https://devcenter.heroku.com/articles/logplex) 経由で LogDNA 等にログを送るのだと思う。
```
$ DEBUG='*' heroku run:detached ls -a immense-shelf-19179
(snip)
--> {"command":"ls","attach":false,"env":{"TERM":"screen","COLUMNS":165,"LINES":59}}
Running ls on ⬢ immense-shelf-19179... ⢿
<-- 201 Created
http <-- POST /apps/immense-shelf-19179/dynos
http {"attach_url":null,"command":"ls","created_at":"2019-09-20T13:02:22Z","id":"32fddd0d-b8d3-41e6-806e-631cfef1e125","name":"run.6332","app":{"id":"8b5795a0-98f6-478b-bb13-f53f4ff99e7c","name":"immense-shelf-19179"},"release":{"id":"c8f828c8-942c-40b6-907b-f3e71ff02732","version":3},"size":"Free","state":"starting","type":"run","updated_at":"2019-09-20T13:02:22Z"} +1s
(snip)
```
※ Heroku では Logplex というログルーターが複数の宛先にログを送る。有名な Fluentd もログルーターの一種。
## 参考情報
[One-Off Dynos > Running tasks in background](https://devcenter.heroku.com/articles/one-off-dynos#running-tasks-in-background)
--------------------------------------------------------------------------------
title: "『改訂2版 みんなのGo言語』を読んだ"
date: "2019-08-16"
--------------------------------------------------------------------------------
{{< amazon asin="4297107279" title="改訂2版 みんなのGo言語" >}}
夏休みを利用して読みました。初版は {{< post "2016-09-25-1" >}} でじっくり読んで手も動かしたので、本当にさらっとね。
最近は Go のコードをほとんど書いてなくて、Go Modules に追いついている程度でした。ただ、それほど分からない情報もなかったので、ある意味答え合わせにはなった気がします。
例えば拙作の [github-nippou](https://github.com/masutaka/github-nippou) で [go-bindata から statik に乗り換えた](https://github.com/masutaka/github-nippou/pull/76)のは、誤りでなかったなとか(P41)。
ちょうど設定ファイルのフォーマットをどうしようとか、置き場所を [XDG Base Directory Specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html) に合わせようとか考えていたので、「2.8 設定ファイルの取り扱い(P45)」もタイムリーでした。
読んでて Interface 使ってコードを Testable にするだとか、HTTP Mock とか、課題をいろいろ思い出しました...。
相変わらずサラッと知識をアップデート出来るので、Go に興味ある人にはオススメの一冊です。
--------------------------------------------------------------------------------
title: "『カード決済業務のすべて』を読んだ"
date: "2019-08-13"
--------------------------------------------------------------------------------
{{< amazon asin="4322121225" title="カード決済業務のすべて―ペイメントサービスの仕組みとルール" >}}
業務でクレジットカード機能を実装した職場の同僚氏曰く、(確か)「始めはピンと来なかったけど、あとで必要なことが全部書いてあると気づいた」とのこと。私は実装には関わってないけど、目線を合わせるために読んだ。
全部を理解しようとせず、概要だけ理解するつもりで読んだ。幸いにもコンパクトに 157 ページにまとまっていたので、気合を入れたら一日で読めた。もちろんピンと来てなくて、1/3 も怪しいかなといったところ。
オーソリゼーション(オーソリ)の実装は必須でそれが通ったら、クリアリング(売り上げ処理)が行われ、最後にセツルメントで加盟店に利用代金が支払われる。
とか、そんな程度。
第1章「決済カード業務の概要と実務」でいきなりつまづいた。
全体的に説明が分かりづらい。対象が初心者向けなのに具体例が少なく、想像しづらいためだと思う。一方で途中のコラムは具体例多めで、理解しやすかった。
第2章「カード決済ネットワークの概要と実務」は、ビザやマスターカードなどの国際ブランドの話から始まり、割と理解しやすかった。特に P104 の図は具体的でとても良かった。こうやって各所収入を得ているのね。
P85 のアクセプタンスの話は少し気になった。
> アクセプタンスとは「特定のブランドを付したカードの平等な受け入れ」を表し、加盟店は、ビザブランドカードであればビザのロゴマークを付したカードのすべてを、その利用者がカード発行者と契約した決済方式ークレジット、デビット、プリペイドなどーにかかわらずまったく平等に取り扱わなければならない。いいかえれば、クレジットカードは受け入れるが、デビットカードは受け入れないということは許されない(ただし、オンラインオーソリ専用デビットカードのように、その仕組の制約から一部の加盟店でしか利用できない決済カードはある)。
実際は出来ていないケースも多いと書いてあった気がする。個人で愛用している、プリペイドカードである [Kyash](https://kyash.co/) は Web 上の決済に使えないことは多いけど、それぞれのサービスがこのアクセプタンスに違反しているってことかな?
第3章「金融決済用ICカード」はページ数が少なく助かった。とは言え、IC カードの概要や EMV、少額決済スキームが説明されている。読み飛ばさないほうが良いと思う。
2012 年の本なので、ここ一年で広まった QR コード決済や、各国の決済事情なども盛り込んだ改訂版の登場が待たれるところ。
アクワイアラとイシュアが理解しづらかったので、最後に簡単にまとめておく。
アクワイアラはクレジットカードの加盟店の獲得と管理をしており、イシュアがクレジットカードを発行する。歴史的経緯により、日本では同じ会社が兼任することが多いそう(だから分かりづらい)。海外では原則として銀行がアクワイアラとのこと。
<セゾン・アメリカン・エキスプレス・カードの例>
アクワイアラ:ユーシーカード株式会社(クレディ・セゾンの子会社)
イシュア:株式会社クレディ・セゾン
国際ブランド:AMEX
--------------------------------------------------------------------------------
title: "『実行力 結果を出す「仕組み」の作りかた』を読んだ"
date: "2019-08-13"
--------------------------------------------------------------------------------
{{< amazon asin="B07QL69YMJ" title="実行力 結果を出す「仕組み」の作りかた" >}}
職場の同僚氏がオススメしていたので、少し前に読んだ。
私は小さなグループでリーダーシップを発揮した経験はあるが、さすがに何万人もの組織での経験はないため、なかなか興味深かった。反対陣営の筆頭を側近にして、エッジの効いた政策をより良いものに落とし込むエピソードは、なかなか出来るものではない。そもそも会社だとそこまで敵対関係になることはあり得ないし。
他に、比較優位の思考は即仕事で使えるというか、会社でしれっと紹介した。
例えばなにか承認を得ようとする場合、当事者はいかにその案が良いかを説いたり、もしくは案を出すだけで判断を丸投げしたりする。承認者からするとなんとか協力はしたいものの、材料が少なくすぐに判断できない。そもそも他にいくつも承認を求められている。結果として承認が進まないことになりがち。
例えばA案とB案を持っていき、それぞれこのような比較優位性がある、私はこのような理由でこちらを推したいなどと伝えれば、スムーズに行く確率が上がるという話。
本の中では最善と考える案、その対極の案、中間のマイルドな案の3つを出して欲しいとあった。これは組織で働く上で非常に重要な考え方で、仕事が出来る/出来ないにも関わってくる。想像力が非常に重要。最初は難しいが、経験を重ねるとだんだん身に付くと思う。
他にも、先の先まで想像しながら、先手、先手を打っていかなければならないという下りは、ソフトウェア開発における新規機能のリリースや、サーバーの深夜作業などにも当てはまる。
以前の私は、出来ることを全部やってから深夜作業に望むという考えが足りなかった。いろいろ痛い目に合ったおかげで、今は「出来ることは全部やってそれでもダメだったら、仕方がない(今のスキルの上限)。」という考えに変わった。
橋本さんは好き嫌いが分かれやすい人だと思う。彼に限らずそのパーソナリティが好きでなかったとしても、その考え方は別にするべきで、有用であれば参考にすると良いと思う。
--------------------------------------------------------------------------------
title: "Heroku Logging Add-on Papertrail と LogDNA の比較"
date: "2019-08-05"
--------------------------------------------------------------------------------
**追記(2019-02-27):**
:warning: 今後 LogDNA を使うことはないと思う。S3 にアーカイブされるログフォーマットが急に変わったり、S3 のアーカイブが遅れたりされなかったりで、問い合わせをすることが多々あり疲れたため。Papertrail に戻った。[私の Tweet](https://twitter.com/search?q=from%3Amasutaka%20(LogDNA%20OR%20Papertrail)&src=typed_query&f=live) も参考になるかも?
## [Papertrail](https://elements.heroku.com/addons/papertrail)
Free プランでも S3 にアーカイブ可能。しかもアーカイブパスは [Athena のパーティション形式](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html)で、アップロードは 1 時間に 1 回という高頻度(※)。
※ 例えばアーカイブ先を s3://example-logs/ にした場合、以下の形式でアップロードされる。
s3://example-logs/dt=2019-08-01/2019-08-01-00.tsv.gz
s3://example-logs/dt=2019-08-01/2019-08-01-01.tsv.gz
s3://example-logs/dt=2019-08-01/...
s3://example-logs/dt=2019-08-01/2019-08-01-23.tsv.gz
s3://example-logs/dt=2019-08-02/2019-08-02-00.tsv.gz
s3://example-logs/dt=2019-08-02/2019-08-02-01.tsv.gz
s3://example-logs/dt=2019-08-02/...
s3://example-logs/dt=2019-08-02/2019-08-02-23.tsv.gz
Athena で Table を作るときに PARTITIONED BY ( dt string ) を付与してパーティションを有効にすれば、where dt = '2019-08-02' などで絞り込みができる。当該パーティション以外はロードされないので、高速かつ料金も抑えられる。
## [LogDNA](https://elements.heroku.com/addons/logdna)
Free プランだと、Add-on を表示しているときしかログを溜めない。Search Retention の Unlimited Live Tail がそれ。正直使い物にならないと思う。一番安い有料プラン $5/mo にすれば、Search Retention が 7 Days になり、使い物になる。
Free プランだと S3 へのアーカイブは出来ない。有料プランにしても S3 のアーカイブは Athena のパーティション形式ではないし、頻度も 1 日 1 回。
Athena の料金を抑えたり検索速度を上げるためには、Lambda などを使って Athena のパーティション形式に変更する必要がある。業務ではそうしている。
## 所感
業務では Papertrail を使っていたんだけど、2018 年 9 月に数日間にもおよぶインシデントが起きたことがきっかけで、LogDNA に乗り換えた。
LogDNA は Papertrail より結構安かったり、UI がシュッとしていたり、目立ったインシデントが今のところないことが優位。
Papertrail は $33/mo の次が $65/mo などと少々お得ではなかったり、UI が古めかしかったりするけど、Rails の request ID をクリックすると絞り込めたり、S3 へのアーカイブパスが Athena のパーティション形式だったり、かゆいところに手が届いていると感じる。
もう Papertrail 許しちゃおうかな...。
CloudFront ログでも Lambda 使って Athena のパーティション形式に変更しているので、そこまで積極的に移行する理由がないのがモヤモヤポイント。
--------------------------------------------------------------------------------
title: "ジム通いと食生活改善が 13 ヶ月目に突入した"
date: "2019-07-16"
--------------------------------------------------------------------------------
{{< post "2018-06-30-1" >}} から行き始めた『[エニタイムフィットネス新三河島店](https://www.anytimefitness.co.jp/shinmikawashima/)』も今月で早 13 ヶ月目。{{< post "2018-12-07-1" >}} の中間報告に引き続き、振り返り記事を書くことにしました。
データは後述するとして、今は週 2~3 回で通い続けています。たまに週 1 回になることもありますが、仕方がない。
冬と違って今は非常に通いやすいです。寒くなくて会社を出るのが遅くならなければ、通い続けるのはそれほど難しくないことが分かりました。
## 筋トレの内容
半年前と違って、今は一人でも BIG3 が出来るようになりました。スミスマシンじゃなくて、フリーウェイトのほうです。日毎に「ベンチプレス → スクワット → ベンチプレス → デッドリフト」などと上半身と下半身を交互でやっています。
まだまだ素人なので、ベンチプレスは 42.5kg、スクワットは 50kg、デッドリフトは 52.5kg 程度です。自重である 60kg くらいまでは頑張ります。
上半身の日はアブローラーを 20 回 x 3 セット、余裕があればクランチとニートゥチェスト 20 回もセットに加えます。
下半身の日は相変わらずブルガリアンスクワットを 左右 20 回 x 3 セットをやってます。最近は軽めのダンベルを持ちます。パーソナルトレーニングの日は、ケトルベルを持ったフォワードランジなどもやります。
日常生活での上り階段一段抜かしも継続しています。以前よりバランスが良くなり、体が軽くなった気がします。日によって体が重いとか分かるので、体調を図るのにも良い感じです。筋肉痛の日はキツイ・・・!
パーソナルトレーニングは週 1 回で継続しています。筋トレや食事のアドバイスももらっています。
## 食生活
1 年前と比べると、栄養成分量を意識するようになりました。
炭水化物は一日 100g、ジムに行く日は 200g 目標。だいぶキツイというか、達成できる日が少ない気が。
タンパク質は一日 120g 目標。これはサプリで補えるので割と簡単。
脂肪はあまり意識していませんが、揚げ物は出来るだけ避けてます。
ビタミンとミネラルはサプリで調整してます。
食事はこんな感じ。
<以前>
朝: コーヒーのみか、コンビニのサンドイッチ
昼: コンビニ弁当
夜: 近所の定食屋やラーメンなど。あと**週 2~3 でビールとか割と量を飲んでた**
<現在>
朝: {{< post "2018-12-07-1" >}} で紹介したような和食
昼: コンビニでおにぎり 1 つ、サラダ、ゆで卵、他サバ缶やザバスでタンパク質調整
夜: [BASE BREAD or BASE PASTA](https://basefood.co.jp/) or [All-in PASTA](https://www.allinseries.jp/)
炭水化物を夜ではなく朝に摂取することを心がけています。
夜に食べるものが決まっていると、じゃあビールでも飲むかーとかならないのが良いです。一方で脂肪を減らすためには、夜の炭水化物は減らしたほうが良いので、昼に BASE BREAD を持ってきて、夜をどうにかするかもしれません。
ただ、これが毎日だと人生に面白みがないので、土曜日はアルコールを解禁してます。平日もたまーに解禁しますが、以前より頻度が減りました。
## 結果
ライザップの CM のように数字にはそこまで現れていません。でも最近は腕が太くなった?顔が痩せた?胸板が厚くなった?とか言われます。
ジムにある InBody で測ってます。これはつい先日の結果。脂肪過多です。

体重の推移はこれ。実はあまり気にしていません。脂肪が減っても筋肉が増えれば変わらないので。

筋肉量は徐々に増えてます。1 年前より 2kg くらい増えました。

体脂肪率はひどいですねー。20% 前半までは持っていきたいです。1 年前より 3kg くらい減りました。

## 感想
もう少し結果が出せるかなーと思ってましたが、食事への配慮が足りなかったという感想です。体脂肪率を減らすためには食事が大事であり、その勘所も分かってきたので、まだまだ頑張って続けます。
とは言え、食事制限だけではリバウンドの危険性もあるので、ジムに通い続けたことは良かったです。
## 付録




--------------------------------------------------------------------------------
title: "esa の記事を Emacs から素早く開ける helm-esa.el を作った"
date: "2019-06-10"
--------------------------------------------------------------------------------
会社で使っている Qiita:Team が [esa](https://esa.io/) に移行されることになったので、早速作ってみました。
{{< github_repo "masutaka/emacs-helm-esa" >}}
こんな感じに esa の記事を Helm Interface 上で絞り込んで、ブラウザで開くことが出来ます。

デフォルトでは絞り込み対象は "watched:true kind:stock" で検索された記事です。よく参照または編集するであろう記事を、Web ブラウザで素早く開く使い方を想定しています。
[MELPAにも取り込まれた](https://github.com/melpa/melpa/pull/6186)ので、M-x package-install helm-esa でインストールできます。
## 作りながら考えたこと
今回の helm-esa.el は helm-qiita.el {{< post "2016-05-06-1" >}} の後継ツールのような気持ちで作り始めました。
最初、Qiita:Team の Stock は、esa だと Watch なのかなーくらいの考えで作っていましたが、やがてそうではないと気づきました。正確な意味で同じものはないと思います。
逆に esa の Watch は、Qiita:Team だと「通知を購読する」の記事全てです(Qiita API では取得できません)。
うーん、どうやって実装しよう?
考えていく中で、Qiita:Team は各個人で記事を Stock する作りであり、esa はみんなで Stock し、文書をみんなで育てていく設計思想だと改めて気づきました。
とは言え、何も考えずに全ての Stock 属性の記事を絞り込み対象とすると、対象記事が無駄に多くなります。
そのため、デフォルトでは汎用性のありそうな "watched:true kind:stock" を検索クエリとしつつ、"watched:true -in:日報" のように好みのクエリも設定できるようにしました。API 制限に達する可能性はありますが、"" を設定すれば全記事を対象とすることも出来ます。
工夫したのはこれだけなんですが、helm-qiita.el と比べてずいぶん柔軟なツールになりました。
ひとえに esa の設計の柔軟さによるものです。
## 設定方法
[README.md に書いてあるとおり](https://github.com/masutaka/emacs-helm-esa/blob/master/README.md#setup)、最小設定はこちらになります。
```elisp
(setq helm-esa-team-name "Your esa team name")
(setq helm-esa-access-token "Your Access Token")
(helm-esa-initialize)
```
helm-esa-team-name は https://feedforce.esa.io/ の場合は "feedforce" を設定して下さい。
helm-esa-access-token は https://{team_name}.esa.io/user/applications から作れます。Read のスコープを付けて下さい。
手前味噌ですが、{{< post "2016-05-06-2" >}} で紹介した方法を使うと、init.el にこのようなアクセストークンをべた書きせずに済みます。
## 使い方
M-x helm-esa で使えます。
helm-esa-source も用意しています。好みの helm-source を作っても良いでしょう。
私は esa の他に、自分のはてブ、自分の GitHub リポジトリ、Star を付けた GitHub リポジトリを横串検索出来るようにしています([設定はこちら](https://github.com/masutaka/dotfiles-public/blob/21e54bc7d09afe6a2d809e11d39b68efffdaa708/.emacs.d/init.el#L501-L510))。高速に検索できるといろいろ捗ります。
## カスタマイズ
### helm-esa-search-query
前述のとおり、検索クエリのデフォルト値は "watched:true kind:stock" です。好みの検索クエリに変更しても良いでしょう([ドキュメントはこちら](https://docs.esa.io/posts/104))。esa は検索クエリもだいぶ使いやすい・・・!
私はこのように検索クエリを変更しています。Watch している記事全てから、タイトルが日報から始まる記事を除外しています。
```elisp
(setq helm-esa-search-query "watched:true -in:日報")
```
検索クエリに空文字を設定すると、絞り込み対象は全記事になります。
```elisp
(setq helm-esa-search-query "")
```
ただし [API 制限](https://docs.esa.io/posts/102#%E5%88%A9%E7%94%A8%E5%88%B6%E9%99%90)もあるのでご注意ください。現時点では "429 Too Many Requests" が返った時点で、キャッシュファイル ~/.emacs.d/helm-esa の作成を中止します。
### helm-esa-interval
デフォルトでは 1 時間に 1 回、Emacs Timer から非同期で [esa の "GET /v1/teams/:team_name/posts" API](https://docs.esa.io/posts/102#GET%20/v1/teams/:team_name/posts) を叩いて ~/.emacs.d/helm-esa を更新します。M-x helm-esa するとこのファイルが参照されます。
30 分に 1 回に変更したい場合はこのように設定します。こちらも API 制限にはご注意ください。
```elisp
(setq helm-esa-interval (* 30 60))
```
## 制限事項
複数の esa team を絞り込み対象とすることは出来ません。良い設計を思いついて、気が向いたら実装するかもしれません。
## 余談
今回は以前と比べてマージまで時間がかかりました。レビューが厳しくなった気がします。
今回は https://github.com/melpa/melpa/pull/6186 を作ったのが 5/26 で、マージされたのが本日 6/10 なので、15 日です。
だいぶ昔になるので単純な比較はできませんが、[helm-hatena-bookmark は同日](https://github.com/melpa/melpa/pull/1199)、[helm-qiita は翌日](https://github.com/melpa/melpa/pull/3840)でした。
今回は0コメの Checklist を完璧にして PR を作成したら、8 日目に {{< github_user "purcell" >}} さんからコメントを頂きました。curl を直接使っているので、Windows 等への移植性が低いとのこと。
もっともな意見ですが、melpa 登録への必須条件ではなさそうだったので、すぐには直せないのでマージしてくれないかと書きましたが、コメントはありませんでした。
このままマージされなさそうだったので、昨日えいやっと [request.el を使って修正](https://github.com/masutaka/emacs-helm-esa/commit/134cc1b6e144328ea998a93e348b85ce66f0ee34)したら、別な方がマージしてくれました。
レビューは大変ありがたいのですが、以前はここまで厳しくなかったので、少々困惑しました。
{{< github_user "purcell" >}} さんはとても忙しいのに親切な人なのは分かっています。レビューにブレがあるのは仕方がないですね。
--------------------------------------------------------------------------------
title: "CaSy のエアコンクリーニングサービスを使った"
date: "2019-06-03"
--------------------------------------------------------------------------------
{{< post "2015-12-27-1" >}} に書いてからずっと、4 週間に 1 回、[CaSy](https://casy.co.jp/) の人に掃除に来てもらっています。
ここ 2 年はずっと同じ人に来てもらっているので、割と安心してお任せしています。
頻度は 4 週間に 1 回、時間は 2 時間で、月々このお値段。
¥5,646(掃除代行)+ ¥1,058(鍵預け代)- ¥1,000(クーポン)= ¥5,704
※ クーポンは前述の記事のおかげか、あと 90 枚もあります。
うちは 1K 8 畳 (26m) とさほど広くもないので、だいたい全部掃除してくれます。ガスレンジや水回りが、月に一度リセットされるのはとっても楽です。ただ、さすがにエアコンまでは掃除してくれません。
入居して 2 年半経ち、エアコンがカビカビになってしまったので、同じく CaSy のハウスクリーニングをお願いしました。
[CaSy(カジー)ハウスクリーニング【CaSy(カジー)】家事代行サービス](https://casy.co.jp/service/housecleaning)
## なぜ CaSy にしたのか
初めは安い業者を頼もうとしましたが、↓ こんな理由で今回は CaSy にしました。
* そのためだけに個人情報を渡すのが急に嫌になった
* 2,000 円程度安くなることを追求しても意味がないと思った
* CaSy の別なサービスも体験したくなった
## クリーニングの結果

作業に来ていただいた方はとても丁寧で、カビカビだったエアコンが新品みたいにピカピカになりました。(クリーニング前の写真は撮り忘れたのと、あっても出しちゃいけないやつです。)
時間は全部で 40 分ほど。思ったより早かったです。
お値段は税込みで 12,960 円。エアコンは自動掃除タイプでない普通のやつです。
エアコンのカビは冷房による結露が原因になるそうです。暖房では結露しないのでカビないらしいです。
※ そういえば以前こんなメモ {{< post "2008-08-19-1" >}} を書いたのだった。
夏が終わったら、クリーニングの良いタイミング。そうすれば、冬を越して次の夏になってもカビは生えていない理屈。
冷房の後に 10~15 分ほどの暖房か、内部クリーン(うちのエアコンにはあった)をして、結露を除去すると予防になるそうです。真夏にそこまでするかは悩ましい...。
## UX (User Experience)
正直に書くと最低でした。正直ですまぬ。
Web 上から予約した後に電話で連絡が来ることを知りました。電話は嫌いなので、この時点で止めようかと思いました...。
日中の仕事中に電話が来たが出られず。次の日にも電話が来たため、仕事を中断して電話に出ました。電話上で日程を決めました。
2 日後に、確定した日程がメールで来ました。このタイムラグはよく分からないですね。
あらかじめ知らされていたものの、作業の 2 日前にも電話で再度確認がありました。電話は苦手です...。
当日も時間を早められるけどどうします?と電話がありました。これは仕方がないです。早めることはせずに、予定通りに来てもらいました。
クリーニングが終わって次の日の深夜になろうとしていますが、特にアンケートとかもないみたいです。
MVP (Minimum Viable Product) で作っているのかな?とも思いましたが、[ハウスクリーニングが始まったのは 2017 年 10 月 1 日らしい](https://www.value-press.com/pressrelease/190505)ので、そうだとしたらいろいろ遅すぎます。
## まとめ
CaSy のエアコンクリーニングを体験しました。
UX は残念でしたが、エアコンがきれいになったので良かったです。作業に来ていただいた方も丁寧でよかった。良い夏を越せそうです。
P.S.
この記事を書く時に改めてググったところ、賃貸のエアコンクリーニングは大家に確認したほうが良いらしいです。もうやってしまったので仕方がない。みなさんはご注意を。
--------------------------------------------------------------------------------
title: "『アフターデジタル』を読んだ"
date: "2019-05-28"
--------------------------------------------------------------------------------
{{< amazon asin="B07PHYQ4HW" title="アフターデジタル オフラインのない時代に生き残る" >}}
会社で話題になっていたので読みました。
自分の知識は [2019/2/12 のクローズアップ現代](https://www.nhk.or.jp/gendai/articles/4245/index.html)を見て、中国には信用スコアというものがあると知っている程度。
中国(というかアリババ)の「信用スコア」はここ数年で急激に浸透したそうですが、それから中国人のマナーが格段に上がったそうです。元々文化大革命で儒教的な文化や考え方が一度リセットされていたとのこと。
(発展途上国では光ファイバーの整備は遅れたが、それを飛び越えて日本より Wifi が発達した話を思い出しました。)
一方の日本は誰かの目があれば、マナーは良い印象です。ある意味中途半端にマナーが良いので、中国のように浸透する確率は低い気がしました。
信用スコアを使うことで、企業は取引コストや与信の確認に伴うチェックや人件費を減らすことが出来ているそうです。個人でも家を借りるとき等の無駄な確認が要らなくなります。
個人の信用は場面場面で引き継がれないと感じているので、自分は悪い印象はあまり受けませんでした。
平安保険グループの事例は、自分にとっても興味深かったです。
私は以前から売上目標を KPI に掲げるやり方には懐疑的で、プロダクトを良くするための行動を指標にした方が良いと思っていました。それは半分は当たっていたわけですが、答えはこの本の中に書いてありました。
やはり、いかに顧客に寄り添っていられるかが鍵です。SaaS のようなサブスクリプションモデルであっても、売上を第一にしていたのでは、ツール販売とあまり変わらず競合に顧客を奪われやすい気はしました。
ちょっと前に『[Netflix「ライバルはフォートナイト。すでに負けている」と発言。TV画面の奪い合い激化](https://japanese.engadget.com/2019/01/18/netflix-tv/)』が話題になりましたが、根底は同じだと思います。
自分の中でいろいろ繋がった本でした。
一方で、日本全体が取り残されずに済むことはもう無理だと感じた一冊でもありました。
それぞれの企業や個人がそうならないように対策するしかないと思いますが、日本は電子マネーに代表されるように変なところで多様性があるので、日本全体が「ビフォーデジタル」から脱するのは長い時間を要すると思います。
--------------------------------------------------------------------------------
title: "『Pragmatic Terraform on AWS』を読んだ"
date: "2019-05-07"
--------------------------------------------------------------------------------
[【ダウンロード版】Pragmatic Terraform on AWS - KOS-MOS - BOOTH](https://booth.pm/ja/items/1318735)
これも職場の同僚氏がオススメしていた本。
普段から Terraform の設計に課題を感じていたので、ざーっと斜め読みして、第17章からしっかり読んだ。
その中での設計のやり方が
モノリス → モジュールの利用 → 環境(ステージ)の分離 → コンポーネント分離
と段階を踏んでおりとても良いと思った。そう、これなんですよ。最初は main.tf だけで十分。
Terraform の設計はアプリケーション設計とよく似ており、初めから抽象化すると難しくなると思う。
基本は宣言的に書いていき、設定ファイルのような読めるコードにする。3回くらい重複し始めたくらいで、変数やモジュールに落とし込むのが良いはず。
17.4.1 の "安定度の高いコンポーネントは、変動を想定したコンポーネントに依存してはいけません" もまさにアプリケーション設計あるある。『{{< amazon_link asin="477418361X" title="オブジェクト指向設計実践ガイド" >}}』にも同じことが書いてある。→ {{< post "2016-09-22-1" >}} {{< post "2017-11-01-1" >}}
Terraform の Workspaces をオススメしない点にも同意。状態を気にしながらの terraform apply は怖い。
18.4 のリモートステートは知らなかった。便利そう。現状、ちょっとだけ関連があるリソースを同じコンポーネント(ディレクトリ)に集めている。リモートのバックエンドを使えば疎結合に出来るかも。Data Source でも良いと思うけどね。
Terraform だけでなく、第19章のように AWS のベストプラクティスが書かれている点も良い。S3 の暗号化は確認しようと思った。
---
ちなみにダウンロード版には .epub と .pdf しか存在しない。kindlegen 使って .mobi に変換して、Kindle 用のメールアドレスに送った。久々だと忘れちゃうね。
```
$ brew cask install kindlegen
$ kindlegen PragmaticTerraformOnAWS.epub
```
**追記(2019-05-10):**
作者様からありがたいお言葉が・・・!
{{< tweet user="tmknom" id="1126304361611612160" >}}
**追記(2022-03-03):**
『実践Terraform』として商業出版されました。※ 書き忘れてたので今さらながら追記
[『実践Terraform』刊行のお知らせと技術書典7での頒布について #技術書典 #Terraform - 憂鬱な世界にネコパンチ!](https://nekopunch.hatenablog.com/entry/2019/09/13/154117)
{{< amazon asin="B07XT7LJLC" title="実践Terraform AWSにおけるシステム設計とベストプラクティス" >}}
--------------------------------------------------------------------------------
title: "『Webフロントエンド ハイパフォーマンス チューニング』を読んだ"
date: "2019-04-30"
--------------------------------------------------------------------------------
{{< amazon asin="4774189677" title="Webフロントエンド ハイパフォーマンス チューニング" >}}
職場の同僚氏から勧められた本。ブラウザのチューニングについて、レンダリングプロセスから説明されている。ブラウザがどう動いているかの解説本としては弱いけど、他に代わりはないそう。
[kosamari さんの記事](https://developers.google.com/web/updates/2018/09/inside-browser-part1)も紹介してくれたので、あとで読む。
2017 年の本なので、TLS 1.3 は言及しつつも説明してなかったり、Microsoft Edge のレンダリングエンジンがまだ EdgeHTML だったりするけどが、丁寧に書かれており良書だと思った。
私は最初の会社ではレーザープリンタのファームウェア側のレンダラを担当していたので、その知識と照らし合わせながら読んだ(Display List という単語を見た時はニヤリとした)。
なぜ 1 つの Display List でページ全体を表現しないのかと思ったけど、プリンタと違って再レンダリングが発生するからか。なるほど。他にもブラウザはアニメーションとかあって大変ね。
※ プリンタもメモリが足りなくなり Fallback が発生すると、Display List は 1 ページで複数回作るけどね。
Display List の生成コストは低く、レンダリングコストのほうが高いという解説も割とすんなり理解できた。
本では Virtual DOM への言及がなかったので、その点は惜しいと思った。Virtual DOM が更新されると、レンダリングプロセスはどこから始まるのか。
その辺り含めた改訂版が出ると良さそうな気がした。
--------------------------------------------------------------------------------
title: "Heroku Buildpack はどのようにインストールされるのか?"
date: "2019-04-27"
--------------------------------------------------------------------------------
先月、固定 IP アドレス機能を提供する [QuotaGuard Static Add-on](https://elements.heroku.com/addons/quotaguardstatic) の Buildpack を作りました。
- https://github.com/masutaka/heroku-buildpack-qgsocksify
- https://github.com/masutaka/heroku-buildpack-qgtunnel
Buildpack を自作したのは今回が初めてです。
[Add-on のドキュメント](https://devcenter.heroku.com/articles/quotaguardstatic#setting-up-socks5-tunnel)の通りにインストールすると、バイナリファイルをリポジトリに commit することになります。あまりきれいな方法に思えなかったことが、これらの Buildpack を作った動機です。
Buildpack を作ってみて、それがどのようにインストールされるか興味が湧いたので、詳しく調べてみました。
## 前準備
今回は [Getting Started on Heroku with Node.js](https://devcenter.heroku.com/articles/getting-started-with-nodejs) のサンプルアプリを使って確認しました。
Heroku App を作成したら、Buildpack に [heroku-buildpack-qgsocksify の check ブランチ](https://github.com/masutaka/heroku-buildpack-qgsocksify/tree/check)を指定しつつ、環境変数 HOGE をセットしておきます。
```
$ git clone https://github.com/heroku/node-js-getting-started.git
$ cd node-js-getting-started
$ heroku create
$ git push heroku master
$ heroku buildpacks:add 'https://github.com/masutaka/heroku-buildpack-qgsocksify#check'
$ heroku config:set HOGE=aaa
```
## Buildpack をインストールする
適当な commit をして 2 回目の git push を行うと、heroku-buildpack-qgsocksify のインストールが始まると同時に、check ブランチに仕込んだログがダラダラと出力されました。出力多めです。読み飛ばしても OK です。
{{< gist "masutaka" "9387aeb77fe7427f0e12bdff936c738a" >}}
## Buildpack の作り方
解説の前に Buildpack の作り方を話しておきましょう。
[今回使用した bin/compile](https://github.com/masutaka/heroku-buildpack-qgsocksify/blob/check/bin/compile) を見ると分かりますが、この実行ファイルがあればとりあえず動きます。
第1引数 BUILD_DIR にファイルを作れば、それが Buildpack の生成物となります。割と簡単です。
第2引数 CACHE_DIR には Node.js なら、前回のリリースで作られたキャッシュ、今回は Node.js 関連の metadata や node_modules などが含まれていました。
第3引数 ENV_DIR には 1 つの環境変数が 1 つのファイルとして格納されています。
さらなる情報は[ドキュメント](https://devcenter.heroku.com/articles/buildpack-api)をどうぞ。
## 分かったこと
何回か試してみて、分かったことをまとめます。
作業ディレクトリは /app/tmp/buildpacks/{128 byte のハッシュ文字列} で、同じ Heroku App なら毎回同じようだ。
例)/app/tmp/buildpacks/7c5e42d020854a726da281f9febed936c9d7051605dfa836df6b6091f19712beaf921429a7778d44215ea42db515c7066823f5ad87a54aa569aff75babfb73f8
BUILD_DIR は /tmp/build_{32 byte のハッシュ文字列} で、毎回異なるようだ。
例)/tmp/build_aed6ee4b7da0bd979d010dd5136c164d
CACHE_DIR は /app/tmp/cache で毎回同じようだ。
ENV_DIR は /tmp/d{YYYYMMDD}-{2 桁の数字}-{6 byte のハッシュ文字列} で、毎回異なるようだ。
例)/tmp/d20190426-60-1hbiilw
まさに {{< post "2018-12-21-1" >}} で説明した、Slug compiler の処理そのものという認識です。
303 行目 Compressing... の生成物が Slug で、305 行目 Launching... で、その Slug を元にして Dyno が起動しています。
## まとめ
Heroku Buildpack がどのようにインストールされるのかを調べました。
インストール時のディレクトリ構造を知ることで、Heroku Buildpack を身近に感じられましたし、以前調べた Slug compiler と繋がりました。
## おまけ
個人的には QuotaGuard Static 推しですが、世間的には Proximo が知られているようなので、こちらの Buildpack も作ってみました。
https://github.com/masutaka/heroku-buildpack-proximo
QuotaGuard Static のニッチな使い方は以下の記事をどうぞ。Proximo との比較も書きました。
{{< hatenablog title="Heroku で Chrome を使ったクローラの IP アドレスを固定する - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2019/04/26/154540" >}}
--------------------------------------------------------------------------------
title: "『思考する機械コンピュータ』を読んだ"
date: "2019-04-11"
--------------------------------------------------------------------------------
{{< amazon asin="4794209924" title="思考する機械コンピュータ" >}}
なんと第1刷が 2000/10/16。つまり 20 世紀の本。
2016/10/12 に買って積んでいたけど、えいやっと読んだ。20 世紀の本にニューラルネットワークが出てくるとは思わなかった。
正直、中盤までは読み進めるのが大変だった。面白さが分かったのが7章から。読書メモを書き始めるくらいには熱を帯びて読んだ。中盤までの説明は、終盤のために必要だったんだね。
個人的に最後のページがクライマックスだった。
> P272
> 科学者である友人たちは、人間がどのように思考するかが解明できる日は来ないと信じている私を神秘主義者と呼んで非難する。
>(中略)
> 私は、マシンの能力の潜在性を認めようとして「脳はマシンである」と言っているのである。人間の頭脳は我々の想像以下のものではなく、マシンは我々の想像をはるかに超えるものである。
「解明できる日は来ない」これを二度見した。
人間の知性や探求の限界を認めているのではなく、それだけマシンの能力が我々の想像をはるかに超えたものということ。
現在の工学的アプローチで作られたマシンが次のアプローチに進んだ時、人間には理解できないものが生まれるんだなと、ぼんやり思った。
ディープラーニングの世界ではすでにそうなっているから、自分が生きている間にはそうなりそう。
今は当然ながら、人間が作って人間が理解できるソフトウェアが本番環境で動いているけど(たまに理解できないソフトウェアもあるけどw)、今後は全く理解できないソフトウェアが動くのだと思う。一部ですでにそうなっていても驚かないかも。
私は情報専攻ではなかったので読んで良かった。もっと早く読めばよかったな。
--------------------------------------------------------------------------------
title: "『脆弱性診断スタートガイド』を読んだ"
date: "2019-03-24"
--------------------------------------------------------------------------------
{{< amazon asin="4798145629" title="Webセキュリティ担当者のための脆弱性診断スタートガイド 上野宣が教える情報漏えいを防ぐ技術" >}}
仕事で脆弱性検査ツールを検討する機会があり、この分野は完全に素人なので買った。会社では検査会社に依頼して、脆弱性検査を受けているプロダクトもあるので、それを想像しながら読んだ。
P11 によると、この本は脆弱性診断士「Silver」相当の技術を身につけることを目的としているらしい。[OWASP Japan にも脆弱性診断士のスキルマップやシラバスが掲載されている](https://www.owasp.org/index.php/Pentester_Skillmap_Project_JP)。
> [世界初の資格化を目指す、「脆弱性診断士」の取り組みが始まる(4ページ目)|日経 xTECH(クロステック)](https://tech.nikkeibp.co.jp/it/atcl/column/14/346926/031000194/?P=4))
>
> 脆弱性診断士のスキルマップやガイドラインの利用方法として、上野氏は「公開当初は、脆弱性診断技術者を目指す個人が、自分の現在のスキルレベルを調べたり、スキルアップの勉強に使ったりするケースを考えている」と述べる。
>
> そして今後は、「脆弱性診断士」という資格につなげたいと語る。「現在、脆弱性診断に関する資格は、私が知る限り存在しない。今回のスキルマップとガイドラインが、脆弱性診断士の資格化に向けた指標になればと考えている」(国分氏)。
↑ 2015/03/13 からアップデートはなく、まだ資格はないようだった。
この本をざっと読んでみて、これだったら検査会社に頼んでしまうかなーという感想。とは言え、予算や手間の関係上、頻度は上げられないと思うので、[VAddy](https://vaddy.net/ja/) 等のサービスを CI に組み込んで併用するのがやはり現実的か。
[[インターンレポ] Web脆弱性診断スキルマップのシルバーランクを目指す|Money Forward Engineers' Blog](https://moneyforward.com/engineers_blog/2017/11/07/pentester-skillmap/)
↑ Money Forward は脆弱性診断の内製化を進めているらしい。1 年半ほど前の記事だから、もう内製化したのかな?
そもそも Heroku 上で Rails を使っていて各種ライブラリも最新、かつ GraphQL を導入しエンドポイントが少ないサービスだと、検査会社を使ってまで脆弱性検査いるの?という大きな疑問があり、これは解消されなかった。この類いの例はたいがい、素の PHP だったりするので...。
P278 で紹介されていた [Google Hacking Database (GHDB)](https://www.exploit-db.com/google-hacking-database) は知らなかった。
例えば https://www.exploit-db.com/ghdb/3888 には RSA の Private SSL Key を Google 検索するテクニックが載っている。
> "BEGIN RSA PRIVATE KEY" filetype:key -github
脆弱性診断士でないと必要なさそうな情報だけど、知っておくといつか使うかも(?)
--------------------------------------------------------------------------------
title: "『はじめよう! プロセス設計』を読んだ"
date: "2019-03-10"
--------------------------------------------------------------------------------
{{< amazon asin="4774185922" title="はじめよう! プロセス設計 ~要件定義のその前に" >}}
「はじめに」がこんな出だしでした。
> 本書は『{{< amazon_link asin="4774172286" title="はじめよう! 要件定義" >}}』という書籍の続編に当たります。
順番間違えたー!と焦りましたが、
> 続編と言いつつも、本来は本書のほうが先に出ているべき・読まれているべきものであるというのが正しい位置付けです。
と書いてあった。安心ニッコリ。(^^)
なぜ読もうと思ったのかというと、しばらく前から同僚が社内に何度も布教していたので、えいやっと読んだという経緯。
途中までは「なぜこんな当たり前のことを、ここまで丁寧に説明しているのだろう?」とモヤモヤしていましたが、途中で「そうか、エンジニア以外の方はこれは当たり前のことではないのか!」と気づきました。先の同僚の言葉を思い出したのが正確ですが。
この本に書かれていることは、シニア以上のエンジニアは当たり前に出来ることだと思います。出来ないとヤバイ。
ですが、この「当たり前」のことが出来るエンジニア以外の方は、周りを見渡してみるとごく僅かです。逆に言うと、出来ている人はめちゃめちゃ優秀です。
じゃあ、エンジニアがその現場に入れば解決かというと、コンテキストを共有していないので、なかなかに困難です。
だからこそこの本が生まれたのだと思います。
これも先の同僚の言葉になりますが、「ここまで説明しないとエンジニア以外に伝わらないことを理解するためにもエンジニアも読んだほうが良い」かもしれません。
エンジニア以外の方にももちろん読んでほしいです。
--------------------------------------------------------------------------------
title: "『人事の超プロが明かす評価基準』を読んで自分の強みを考えた"
date: "2019-03-09"
--------------------------------------------------------------------------------
{{< amazon asin="B017U565CY" title="人事の超プロが明かす評価基準―――「できる人」と「認められる人」はどこが違うのか (三笠書房 電子書籍)" >}}
[柴田さんの記事](https://www.hsbt.org/diary/20190227.html)を読んで、これだ!と思って衝動的に買った。
本の中では「評価される人」=「影響力のある人」が一番響いたかな。
反面、この本の核心である後半に進むに連れて、ピンと来ない箇所が増えていった。総合職向けだからかな。
特に「スペシャリストとしての道を歩むなら、そのスキルが陳腐化するものではないか、よく見極める必要がある」のくだり。スペシャリストとして重要なのはスキルそのものではなく、スキルを習得するためのスキルだと思うので、何かが違う気がした。
コンピテンシーをまあそうだよねと思えるのは、ここ数年で構築された今の会社の評価制度を作った方々のおかげだろうなあ。私はただのフリーライダー...(白目
それはさておき、この記事を書いていて、気がついたら~~妄想し~~自分の強みを考えていたので、以下にまとめておく。
私は今の会社で割と高い評価を頂いている。でも自分から見ると評価高すぎでは?と感じており、しっくり来ていない部分もあった。今はその霧が少しだけ晴れている。
単純な技術力だと社内にもっと優れた人はいる。個々の技術力だと敵わないことも多い。
自分の強みは多分こんなところか。
1. ブログや GitHub でアウトプットし続けている。細くてもやり続けることが大事だと最近特に思う。たまに他のエンジニアに良い影響を与えたなと感じることもある。
2. バックエンドとインフラを横断して引き受けることが出来、組み込みエンジニア時代に経験した低レイヤーも多少分かる。
3. 部分最適化よりも全体最適化を好む。開発環境だったり、GCP のプロジェクト課金まわりなど。
4. 誰も拾わないボールを拾う。逆に言うと、拾われそうなボールは拾わない傾向にある。
2 については今までの経験に感謝している。
最初の会社ではプリンタのデバイスドライバの実装や自動評価システムの構築、100 台規模の Solaris ネットワーク管理など、いろいろ経験させてもらった。~~ブリッジエンジニアは経験しなくてよかった。~~次の会社と今の会社でも Web のインフラやバックエンドまわり、それにチームビルディングなどを経験することが出来ている。
一点集中型のスキルだと弾数が少ないし、非常に高いレベルが必要だったりするが、複数のことをそこそこのレベルでできる人は少ないようだし、割と需要があったり重宝される気がする。
複数のスキルを持つ私が糊のような役目を果たし、周りに良い影響を与えているのかもしれない。
良い影響を与えることで、他のエンジニアのやる気が上がり、続いてスキルが上がり、結果的に自分が動かずに全体が良い方向に進むのかも(妄想100%)。
とは言ったものの、そこそこのレベルでは通用しないことも多いので、仕事では常にやり抜くことを重要視しているし、プライベートではできるだけ素振りを続けてはいる。でも全然足りている気がしないし、全く素振りをしない期間もあったりするしで危機感...。
(まとまりなくこの記事は終わっていく)
--------------------------------------------------------------------------------
title: "JAWS DAYS 2019 に行ってきた #jawsdays #jawsdays2019"
date: "2019-02-24"
--------------------------------------------------------------------------------

https://jawsdays2019.jaws-ug.jp
{{< post "2017-03-12-1" >}} {{< post "2018-03-11-1" >}} に引き続き、3 回目の参加です。[去年の 6 月に EKS が GA になり](https://aws.amazon.com/jp/about-aws/whats-new/2018/06/amazon-elastic-container-service-for-kubernetes-eks-now-ga/)、その後 [12 月に Tokyo Region でも使えるようになった](https://aws.amazon.com/jp/blogs/news/amazon-eks-tokyo-region/)影響で、Kubernetes のセッションが大盛況でした。その他はそれほど変わらなかったように見えました。
午前中は AI/ML 関係のセッションをなんとなく見ていました。
## [[AI/ML] PythonとSageMakerで始める MLチームのみで完結するAPIの構築事例](https://jawsdays2019.jaws-ug.jp/session/1405/)
武田 研恒さん
{{< speakerdeck "5350306d59824b04ab460c8f84423afa" >}}
やっぱり機械学習エンジニアがサーバーの面倒見るのは無理というかもったいないよね、うんうんと聞いていました。
## [[AI/ML] メディアによるAI活用(時事クイズの生成と高校野球戦評記事の自動生成)](https://jawsdays2019.jaws-ug.jp/session/1519/)
佐渡 昭彦さん
{{< speakerdeck "9430f355a368483aa0e090d1718d2077" >}}
朝日新聞には、ICTRAD(アイシートラッド)と呼ばれる、情報技術本部(技術系)内にある研究開発チームがあるそう。本セッションのような研究や、セキュリティ対策をしているそう。朝日新聞はよく攻撃されるらしい。なるほど。
AI で時事クイズを作成。
[Amazon Comprehend](https://aws.amazon.com/jp/comprehend/) は日本語対応していないので不採用。
東大・横国大のオープンソース『[専門用語(キーワード)自動抽出システム](http://gensen.dl.itc.u-tokyo.ac.jp/)』を使って、分かち書きと単語ベクトル化(?)をしているらしい。
朝日新聞でも単語ベクトルを公開している。→ [朝日新聞単語ベクトル](http://www.asahi.com/shimbun/medialab/word_embedding/)
EC2 1 台で足りているとのこと。
## ランチタイム
めちゃめちゃ混んでいたけどなんとかゲット。種類を選ぶ余裕はなかった。職場の同僚 3 人はゲットできなかったそう。1000 人超もの弁当を用意した運営の方々には頭が下がります。

## [[Container/k8s] GitHub Actionsを使って、ワークフローもプルリクベースで開発しよう!](https://jawsdays2019.jaws-ug.jp/session/1044/)
池田 尚史さん
TODO: 資料が公開されたらここに貼る
{{< post "2019-02-11-1" >}} に自作の GitHub Action を GitHub Marketplace に公開したばかりなので、聞いてみました。
これはドキュメントに書いてない。GitHub Actions は HashiCorp 好きのエンジニアが作っていそう。
{{< tweet user="masutaka" id="1099163570254692352" >}}
デモでヒントがあった、GitHub の隠し API を見つけた様子。
{{< tweet user="masutaka" id="1099167411771568128" >}}
うぉー!!!
{{< tweet user="masutaka" id="1099169341612773376" >}}
GitHub Actions はまだクローズド beta だから、めっちゃブルーオーシャンなんですよね。
[All in one project](https://github.com/masutaka/github-actions-all-in-one-project) はシェルスクリプトで書いていて、それほど難しいことはしていないし。もちろん、作り込みには時間がかかりましたが。
ただ、今回は GitHub Action よりも、GitHub App のほうが正しい気がするので、作り直す予定です。
## [[Others] Infrastructure as Codeに疲れたので、僕たちが本来やりたかったことを整理する](https://jawsdays2019.jaws-ug.jp/session/1119/)
村主 壮悟さん
{{< speakerdeck "a034beb9ba2b4485856f9bbe365a7487" >}}
Infrastructure as Code はやりすぎず、うまくバランスを取ることが大事ですね。
{{< tweet user="masutaka" id="1099195115686359040" >}}
{{< tweet user="masutaka" id="1099196180288856066" >}}
{{< tweet user="masutaka" id="1099197073059004416" >}}
## [[CLI] AWS CLIではじめるコマンドラインライフ 〜 正しい「運用自動化」への第一歩](https://jawsdays2019.jaws-ug.jp/session/2216/)
波田野 裕一さん
{{< speakerdeck "0cbbc9f186a049f3b2ff0a96a1060172" >}}
AWS CLI は意外と熱いツールだと知った。とりあえず ~/.zshrc に
source /usr/local/share/zsh/site-functions/aws_zsh_completer.sh
を追加した。
CLI を使うことで、AWS を深く学ぶことができるそうで、[JAWS-UG CLI専門支部](https://jawsug-cli.doorkeeper.jp/) ではそれにより転職した方が 10 人前後もいるらしい。
{{< tweet user="masutaka" id="1099209965321895936" >}}
{{< tweet user="masutaka" id="1099214040973205505" >}}
{{< tweet user="masutaka" id="1099215018111844352" >}}
{{< tweet user="masutaka" id="1099217592508592129" >}}
## 付録
- [JAWS DAYS 2019 資料まとめ - Qiita](https://qiita.com/hayao_k/items/91c19480948f26b71705)
- {{< tweets_on_the_day text="JAWS DAYS 当日のツイート" day="2019-02-23" >}}
--------------------------------------------------------------------------------
title: "『経清記』を読んだ"
date: "2019-02-18"
--------------------------------------------------------------------------------
{{< amazon asin="4404020708" title="経清記" >}}
1993年(平成5年)の作品。
Amazon でずっと¥10,000くらいだったけど、急に安くなった(¥1,724)ので条件反射で買った。そこから1年3ヶ月経ってしまったが、ちょうど今日読み終わった。
※ 今 Amazon で値段見たら¥43,611だった。マジか...
『経清記』というタイトルではあるが、中身は「経清記」と「清衡伝」に分かれている。
「経清記」は1988年(昭和63年)の作品で、「清衡伝」はこの本のための書き下ろしとのこと。
> 「記」だの「伝」だのと題名をつけたのは作者の都合であって決して伝記小説という意味ではない
という筆者のあとがきにあるとおり、あくまで時代小説。
経清と清衡がきれいに書かれすぎのような気もするが、奥六郡(陸奥)に思いを馳せられることには変わりはない(大げさ)。高橋克彦氏の『{{< amazon_link asin="4061857630" title="炎立つ" >}}』との違いも興味深い。
残念ながら『炎立つ』はすでに手放してしまった。でも {{< post "2009-11-30-1" >}} の『奥州藤原氏物語』と『{{< wikipedia word="炎立つ_(NHK大河ドラマ)" text="NHK 大河ドラマの炎立つ" >}}』の録画は手元にあるので、大事にしていきたい。
--------------------------------------------------------------------------------
title: "『入門 監視』を読んだ"
date: "2019-02-17"
--------------------------------------------------------------------------------
{{< amazon asin="4873118646" title="入門 監視 ―モダンなモニタリングのためのデザインパターン" >}}
個人的に一番評価できるポイントは、そのボリュームでした。
この本は 200 ページほどしかなく、各章も 10~20 ページ程度なので、スプリント方式で勢いで読めました。
監視に興味があれば読むと良いでしょう。そこまで興味はないが気になる人は、読んだ人から話を聞くと良いと思います。
全部が全部必要な情報ではないので(例えば 9 章の SNMP を扱う人は少ないと思う)、一旦ザーッと流し読みして、気になったところを後で読み返したり、より専門的な本を読むとかすると良いかも。
本から少し脱線しますが一点だけ。
P10「1.2 アンチパターン2:役割としての監視」の中で "オペレーションチームだけでなく全員が本番環境に責任を持つ" という話が出ており、非常にもっともですが、そのような文化を作ることはなかなか難しいと思います。
うちの会社ではどのチームもこのような Slack のリマインダーを流しており、メトリクスを毎日見る文化が根付いています。

※ Heroku 使っている都合もあって、URL が多くなってしまっている。集約させたい。
アラートが出る以前の普段と違うメトリクスの変化や、アラートに関連したメトリクスの把握、そもそもどんなメトリクスを収集しているかの学習にもなるので、オススメです。
実際、全員がメトリクスを見ているわけではありませんが、「毎日何を見ているのか」という共有は大事だと思っていて、情報の非対称性が少しは解消されると思います。
しばらくスプリントミーティングなどで共有の場を設定し、それと並行してこのようなリマインダーを仕掛けると習慣が根付きやすいかもしれません。
以下、読書メモです。
## 1章 監視のアンチパターン
振る舞いを監視することが大事。OS のメトリクスの監視はプライベートメソッドのテストとよく似ていると思った。
※ レガシーコードや特別な理由を除いて「プライベートメソッドのテストは書かない」ということは、2013 年に決着がついている。
[プライベートメソッドのユニットテストは書かないもの? - QA@IT](https://qa.atmarkit.co.jp/q/2784)
## 3章 アラート、オンコール、インシデント管理
"アラートにメールを使うのをやめよう"
それな。
そういえば以前、こんな記事を書いた。
[ソーシャルPLUSで 1 日 700 通超のアラートメールを撲滅したお話|feedforce Engineers' blog](http://tech.feedforce.jp/socialplus-bugsnag.html)
今は全て Slack に送ってしまっているので、なんとかしたい。
ローテーションなあ...。365 日全員で対応している状況。幸いにもそこまでアラートは多くないが、バーンアウトの危険性はある。
頻度の多いアラートで、調査に着手し始めたとかなら、閾値を下げるなど検討したほうが良いと思った。
P35
・現場指揮官
・スクライブ(書記官)
・コミュニケーションの調整役
・SME(実際にインシデント対応する人)
振り返り(postmortem)大事。会社では大きなインシデントのあとに振り返る文化が根付きつつある。
## 4章 統計入門
たったの 10 ページにまとまっており、非常に良かった。
## 5章 ビジネスを監視する
Redash での可視化やアラートの設定など、もう少し詰めようと思った。
--------------------------------------------------------------------------------
title: "自作の GitHub Action を GitHub Marketplace に公開してみた"
date: "2019-02-11"
--------------------------------------------------------------------------------
**追記(2019-09-23):**
:warning: この記事の GitHub Actions は HCL 記法を使う古い方法です。現在は YAML 記法に変わりました。参考にしないで下さい。
---
先日 {{< post "2019-02-03-1" >}} 作った GitHub Action のリポジトリページにこんな表示が出てました。
https://github.com/masutaka/github-actions-all-in-one-project

[こちらのドキュメント](https://developer.github.com/marketplace/actions/publishing-an-action-in-the-github-marketplace/)によると、[リポジトリの Release ページ](https://github.com/masutaka/github-actions-all-in-one-project/releases)から公開できるとのこと。
全部グリーンになるように、[Icon や Color などを直しました](https://github.com/masutaka/github-actions-all-in-one-project/commit/4cff0f26498c1e7f8d945bf98df6694e40bddcb1)。あとは普通にリリース。

あっさりとリリースできました!
https://github.com/marketplace/actions/all-in-one-project

Marketplace の目立つところに表示!

されていたのですが、ちょうど週末 Marketplace がリニューアルしたようで、[最後のページ](https://github.com/marketplace?after=Y3Vyc29yOjYw&type=actions)に移動されていました。まあいいか...。
現在は https://github.com/masutaka/github-actions-all-in-one-project にアクセスすると、こんなメッセージが表示されています。ここの "View on Marketplace" から Marketplace の当該ページに飛ばされて、インストール出来る流れになっているようです。

とは言え、結構大味な流れなので、[README.md](https://github.com/masutaka/github-actions-all-in-one-project) を読んで導入したほうが良いと思います。{{< post "2019-02-03-1" >}} もどうぞ。
**追記(2019-02-12):**
GitHub Action の beta に申し込んでないと、上の Marketplace のページは全部見られないことを知りました。びっくり。https://github.com/features/actions から申し込めます。
--------------------------------------------------------------------------------
title: "Issue や PR を作ったら自動的に GitHub Project に追加する GitHub Action を作ってみた"
date: "2019-02-03"
--------------------------------------------------------------------------------
**追記(2019-09-23):**
:warning: この記事の GitHub Actions は HCL 記法を使う古い方法です。現在は YAML 記法に変わりました。参考にしないで下さい。
---
> Issue や Pullrequest を作ったら、GitHub Project に自動追加なんてことができそうですね。
と {{< post "2019-01-28-1" >}} に書いたので作ってみました。
{{< github_repo "masutaka/github-actions-all-in-one-project" >}}
この GitHub Action を使ったサンプルリポジトリが https://github.com/masutaka/sandbox-github-actions です。
Issue や PR を作ると [GitHub Actions Trial part2 Project](https://github.com/masutaka/sandbox-github-actions/projects/2) の To do または In progress カラムに自動的に追加されます。Fork 先からの PR でも同様です。[Actions タブ](https://github.com/masutaka/sandbox-github-actions/actions)で確認できますが、私以外は見られないのかな?
設定方法は簡単で、.github/main.workflow に以下を追加するだけです(GitHub Actions はまだ beta 版なので、[このページ](https://github.com/features/actions)から Sign up しておく必要はあります)。
{{< gist "masutaka" "df4e242dc519b651629fea23b41ece97" >}}
PROJECT_URL と INITIAL_COLUMN_NAME は必須です。GITHUB_TOKEN はリポジトリに紐付いた token が自動的に使われます。詳しくは[ドキュメント](https://developer.github.com/actions/creating-workflows/storing-secrets/#github-token-secret)をどうぞ。
Issue や PR がクローズされると Done カラムに、リオープンされると In progress カラムに移動します。これは [GitHub Projects の Automation](https://help.github.com/articles/about-automation-for-project-boards/) を使っています。
## やりたかったこと
会社で使っている [waffle.io](https://waffle.io/) は高機能なためか、だいぶ重いです。今回の GitHub Action があれば、GitHub Projects に移行できるかなあなんて思っていました。
とは言え、移行は難しいかもしれません。Issue と PR の関連付けや Epic などは GitHub Projects にはないため。
**追記(2019-08-12):**
結局 waffle.io から GitHub Projects に移行しました。
ただし、この GitHub Action は使わずに [project-bot](https://github.com/philschatz/project-bot) という GitHub App を使っています。
GitHub Action は CI と同じ扱いで、本来の CI と混ざったり、たまに失敗するのが Noisy だったからです。
project-bot もたまに移動してくれないことがありますが、運用でカバー()しています。
--------------------------------------------------------------------------------
title: "このブログの CI を GitHub Actions にしてみた"
date: "2019-01-28"
--------------------------------------------------------------------------------
**追記(2019-09-23):**
:warning: この記事の GitHub Actions は HCL 記法を使う古い方法です。現在は YAML 記法に変わりました。参考にしないで下さい。
---
> このブログの CI には割高なので、CircleCI あたりに乗り換える予定です。
と {{< post "2019-01-27-1" >}} で書いたばかりですが、舌の根も乾かぬうちに GitHub Actions に移行してみました。
料金はさておき、たまたま[クラスメソッドさんの記事](https://dev.classmethod.jp/etc/github-actions-golang/)を見て移行出来そうだったことと、GitHub Actions は一度素振りしてみたかったからです。
## GitHub Actions とは
[CircleCI の Workflows](https://circleci.com/docs/2.0/workflows/) と非常に良く似た機能で、Pipeline を組んで CI を実行することが出来ます。
現在はまだベータです。https://github.com/features/actions からリクエストすれば使えます。複数 Action 同時実行とか凝ったことはできないようです。時間がかかりすぎる Action も避けたほうが良いかも。
Action は自分で作ることも出来ますし、以下のような公開 Action を使うことも出来るようです。
- https://github.com/actions
- https://github.com/hashicorp/terraform-github-actions
日本語記事: [GitHub Actions: みなさんが開発し、GitHubで実行 - The GitHub Blog - Japan](https://github.blog/jp/2018-10-24-action-demos/)
Heroku CI よりもハマりどころはありますが、作り方はとてもシンプルです。
1. .github/main.workflow を作り、workflow と action を定義する
2. 各 action に紐付いた Dockerfile を作る、または参照する
## 今回の実装
ファイル構成と実装はこんな感じです。
{{< gist "masutaka" "6bb0d4c2d33818be8d03ffb60ef84c6e" >}}
main.workflow は Terraform ユーザーには馴染みのある [HCL](https://github.com/hashicorp/hcl) で書きます。
今回は on = "push" なので、git push をトリガーにして、hadolint と shellcheck という自作の Action が動きます。
それぞれ .github/hadolint と .github/shellcheck 以下の Dockerfile を使う Action で、引数をそれぞれ指定しています。
resolves = ["hadolint", "shellcheck"] という書き方だと並列に動きそうですが、現在は 1 Action ずつしか動かないようです。
## GitHub 上での見え方
今回は on = "push" なので、以下のように Pullrequest の Checks タブから参照できます。

リポジトリの Actions タブからは、可視化された main.workflow を見られます。右側の "View main.workflow" から Visual editor に遷移することも出来ます。

## 所感1
on には "push" 以外にも[結構な数の Event name を指定できる](https://developer.github.com/actions/creating-workflows/workflow-configuration-options/#events-supported-in-workflow-files)ようです。"issues" と "pull_request" は実際に確認しました。
on = "issues" で Issue を作った時のコンテナ内の環境変数の例です。
```
GITHUB_ACTION=Hello World
GITHUB_ACTOR=masutaka
GITHUB_EVENT_NAME=issues
GITHUB_EVENT_PATH=/github/workflow/event.json
GITHUB_REF=refs/heads/master
GITHUB_REPOSITORY=masutaka/masutaka.net
GITHUB_SHA=d628d46a126e2e4900af10a067c4be80cf574cbb
GITHUB_WORKFLOW=New workflow
GITHUB_WORKSPACE=/github/workspace
HOME=/github/home
HOSTNAME=9be975ed25f0
MY_NAME=Mona
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/github/workspace
```
/github/workflow/event.json の中身は整形すると 160 行ほどで、先頭に "action": "opened" と書いてありました。
```
{
"action": "opened",
"issue": {
"assignee": null,
"assignees": [],
"author_association": "OWNER",
(snip)
```
これで on = "issues" の種類を判別できるようです。前述のリンクによると、"edited" や "deleted" など、全部で 14 種類あります。
Issue や Pullrequest を作ったら、GitHub Project に自動追加なんてことができそうですね。
## 所感2
各 Action は Dockerfile と entrypoint.sh をセットで作るのが良いと思いました。
実は今回の shellcheck はこれでも動きます。
```
action "shellcheck" {
uses = "docker://koalaman/shellcheck:v0.6.0"
args = ["script/*", ".github/**/entrypoint.sh"]
}
```
でも、自分でログをコントロールすることが出来ないので、CI の結果としては不親切になることがあります。entrypoint.sh を与えて、多少なりともログを出したほうが良いと思います。デバッグもしやすいですし。今回は sh の -x で簡素に出しました。
ちなみに [hadolint](https://github.com/hadolint/hadolint) も [shellcheck](https://www.shellcheck.net/) もベースの Docker Image に [scratch](https://hub.docker.com/_/scratch) を使っているため、echo コマンドさえありません。
hadolint に至っては docker run で -i を与えて、標準入力から渡す必要があるため、GitHub Actions では公式の Docker Image を使うことは出来ませんでした。
> $ docker run --rm -i hadolint/hadolint:v1.15.0 hadolint - < Dockerfile
## 所感3
Dockerfile に以下の LABEL を付けると、Actions に icon や color が付いたりします。前述の図では紫マイクのアイコンがそれです。
- com.github.actions.name
- com.github.actions.description
- com.github.actions.icon
- com.github.actions.color
参考: [GitHub Actions > Creating a Docker container > LABEL](https://developer.github.com/actions/creating-github-actions/creating-a-docker-container/#label)
でも不安定なのか、いくら設定しても変わらなかったり、気がつくと変わっていたり、よく分かりませんでした。GA になれば安定するのかな。
## 所感4
GitHub Actions が失敗しても特に通知はないので、実装が必要かも。
Slack でよければ以下が使えそうですが、私は Pushover を愛用しているので...。
- https://github.com/pullreminders/slack-action
- https://github.com/apex/actions/tree/master/slack
CircleCI に移行しようかしら...(白目)
--------------------------------------------------------------------------------
title: "このブログの CI を Heroku CI にしてみた"
date: "2019-01-27"
--------------------------------------------------------------------------------
{{< post "2019-01-19-1" >}} で Heroku の Hobby Dyno ($7/mo) を使い始めたので、Heroku CI も導入してみました。
やり方はこのとおり簡単です。
1. pipeline を作成し、app と紐付ける
2. Heroku CI を有効にし、GitHub とも連携する
3. app.json を作成する
## 1. pipeline を作成し、App と紐付ける
[Heroku Dev Center > Pipelines](https://devcenter.heroku.com/articles/pipelines) を参考にして作るだけです。
## 2. Heroku CI を有効にし、GitHub とも連携する
pipeline 右上の Enable CI ボタンをクリックすると有効になります。

## 3. app.json を作成する
今回は [hadolint](https://github.com/hadolint/hadolint) で Dockerfile を、[shellcheck](https://www.shellcheck.net/) でシェルスクリプトの lint をするだけのテストを書きました。
このような素朴な設定で動きます。
{{< gist "masutaka" "38d61de4decafa19be7207f68f694b3b" >}}
test-setup と test のコンテキストは同じで、例えば test-setup で作ったファイルは test でも使えます。あと、App の環境変数も参照できますし、テスト用の環境変数を app.json に追加することも出来ます。
デフォルトでは Performance-M Dyno が使われます。Parallel Test も出来るらしいです。
詳しくは [Heroku Dev Center > Heroku CI](https://devcenter.heroku.com/articles/heroku-ci) をどうぞ。
## CI の結果
このように、pipeline の Tests タブで一覧が見られます。

## 注意事項
https://devcenter.heroku.com/articles/heroku-ci#docker-deploys
> Currently, it is not possible to use Heroku CI to test container builds.
まだ Docker には対応していません。
このブログは Docker on Heroku で動いていますが、テストではリポジトリの中身は展開されているので困りませんでした。場合によっては困るのかな?
## 現在の問題点
ずばり料金ですね。
1 pipeline あたり $10/month 課金されるほかに、テストの実行にも Dyno の料金がかかるようです。
今回は 5 日ほど使って、50 回テストを実行してこの料金でした。$10/month は日割になっていますね。

このブログの CI には割高なので、CircleCI あたりに乗り換える予定です。
CircleCI は 1 コンテナまで無料で使えるので、積極的に使う理由にはならない気がします。強いて言えば、利用サービスが増えないことと、複雑なことが出来ないことが Heroku CI のメリットかも。
--------------------------------------------------------------------------------
title: "Heroku にデプロイした時、Pushover を使って通知する"
date: "2019-01-20"
--------------------------------------------------------------------------------

個人の通知ツールとして、[Pushover](https://pushover.net/) を愛用しています。{{< post "2015-03-08-1" >}} でも紹介してます。
- GitHub の自分のリポジトリにスターが付いたら通知
- [Pushover gem](https://rubygems.org/gems/pushover) を使った、若干複雑なケースのデプロイ通知
- Heroku にデプロイしたら通知
今まで Heroku のデプロイ通知は [Heroku Deploy Hooks の Email](https://devcenter.heroku.com/articles/deploy-hooks#email) に [Pushover の E-mail Gateway](https://blog.pushover.net/posts/new-e-mail-gateway-features) を指定して出来ていましたが、[Heroku Deploy Hooks の Email は 2018 年 5 月に Deprecate になっていました](https://devcenter.heroku.com/changelog-items/1416)。
仕方がないので、[Heroku Deploy Hooks の HTTP post hook](https://devcenter.heroku.com/articles/deploy-hooks#http-post-hook) で通知する方法を調べました。
## デプロイ成功の通知方法
結論から書くと、GET パラメータっぽくダラダラと書けば通知出来ました。
([なぜか通知されなくて一人ハマってましたが...](https://twitter.com/masutaka/status/1086509433801211904))

以下は改行と半角スペースを入れて読みやすくしたものです。各パラメータは url encode が必要です。
```
https://api.pushover.net/1/messages.json
? user=
& token=
& device=iPhone
& priority=0
& title=masutaka.net+has+deployed
& message=masutaka+deployed+app
& url=https%3A%2F%2Fdashboard.heroku.com%2Fapps%2Fmasutaka-net
```
初めに curl で試してから HTTP post hook の URL を構築すると良いでしょう。
```
curl -s -X POST \
-d user= \
-d token= \
-d device=iPhone \
-d priority=0 \
-d title=masutaka.net+has+deployed \
-d message=masutaka+deployed+app \
-d url="https%3A%2F%2Fdashboard.heroku.com%2Fapps%2Fmasutaka-net" \
https://api.pushover.net/1/messages.json
```
各パラメータの説明は[ドキュメント](https://pushover.net/api)を参考にしてください。注意点として、[ドキュメントには {{user}} のような変数を使える記述](https://devcenter.heroku.com/articles/deploy-hooks#customizing-messages)がありますが、HTTP post hook では使えませんでした。他の Deploy Hooks では使えるようですが。
ちなみに私は Heroku の管理に terraform を使っており、かなりすっきり書くことが出来ました。
{{< gist "masutaka" "626a7efd4562592d2976867cf6ed8747" >}}
## デプロイ失敗の通知方法
Heroku Deploy Hooks の Email はデプロイ失敗は通知しません。
代わりに bot@notifications.heroku.com から以下の Subject でメールが届きます。他のパターンもあるかもしれません。
> Subject: Automatic deployment of failed.
> or
> Subject: Release phase command failed to execute
仕方がないので、Gmail のフィルタで Pushover の E-mail Gateway に転送することにしました。
Heroku → 私の Gmail アドレス → Pushover
フィルタは以下のように設定しました。Email Body に Heroku の APP NAME が含まれているので、それを参照するフィルタにしました。
- 条件: from:(bot@notifications.heroku.com) subject:failed
- 処理: 受信トレイをスキップ, 既読にする, @pomail.net に転送
優先度を上げて、iOS 上での表示を赤くします。さらに Heroku からの Email の Subject と Body を書き換えて、iOS 上での表示を分かりやすくします。`https://pushover.net/email/:id` から設定できます。
- Priority: 1 (High, bypass Quiet Hours)
- Replace E-mail Subject: deploy to masutaka.net
- Replace E-mail Body: masutaka failed to deploy app
これで失敗も通知してくれそうです。← まだ確認してない
**追記(2019-01-25):**
「デプロイ失敗の通知方法」を追記しました。
--------------------------------------------------------------------------------
title: "このブログを『さくらのVPS』から『CloudFront+Heroku』に移した"
date: "2019-01-19"
--------------------------------------------------------------------------------
ここ一年半くらい、このブログが乗っていたサーバをメンテンスしていませんでした。4月に Ubuntu 14.04 LTS が EOL になることと、サーバの面倒をみることに疲れてしまったので、このブログを CloudFront+Heroku に移しました。
さくらのVPSに引っ越したのは {{< post "2013-05-27-2" >}} だったので、5年半くらい使っていたことになります。このブログ自体は静的コンテンツですが、nginx のログを fluentd に流したり、各種メトリクスを kibana や GrowthForecast で可視化したり、ちょっとしたアプリケーションを動かしたり、いろいろ実験や素振りをすることが出来ました。今までありがとう。
さて、引っ越し前後の環境の変化です。
## 引っ越し前(さくらのVPS)
* https://vps.sakura.ad.jp/
| |
|---|---
| 仮想サーバのプラン | 2G、石狩リージョン、年額 18,770 円
| ドメイン | さくらのドメイン、年額 1,852 円
| OS | Ubuntu 14.04 LTS
| 構成管理 | knife-solo
| デプロイ方法 | GitHub の master ブランチに push すると、CircleCI 上で capistrano が自動デプロイ
| ビルド方法 | capistrano でのデプロイ時に [chalow](https://chalow.org/) が CHANGELOG メモを HTML に変換
| 配信方法 | 静的な HTML ファイルを nginx が配信
## 引っ越し後(CloudFront + Heroku)
* https://aws.amazon.com/jp/cloudfront/
* https://jp.heroku.com/
| |
|---|---
| Dyno Type | Hobby、年額 $7 x 12 = $84 ≒ 9,554 円
| ドメイン | AWS Route53、年額 $12 + ($0.5 x 12 ※) ≒ 1,976 円(※ HostedZone 代)
| 構成管理 | Dockerfile + terraform
| デプロイ方法 | GitHub の master ブランチに push すると、Heroku が自動デプロイ
| ビルド方法 | docker build 時に chalow が CHANGELOG メモを HTML に変換
| 配信方法 | 静的な HTML ファイルを nginx コンテナが配信。かつ CloudFront を使って高速化
{{< gist "masutaka" "193483b54bfd4873c82c24a013a98740" >}}
維持費は年間 9,000 円くらい削減できました。
単なる HTML の配信なので、GitHub Pages を使って維持費をゼロにしても良かったのですが、学習のために業務と同じ Heroku にしました。
CloudFront も使ったのは、Heroku のレイテンシー問題と、Heroku で HTTP2 使えない問題を回避するためです。
参考までに 4MB 程度のファイルは、以下のような転送速度でした。10 回の平均値です。
| |
|---|---
| さくらのVPS(石狩)| 0.511 sec
| Heroku (US) | 2.949 sec
| CloundFront | 0.338 sec ※
※ キャッシュを使えなかった場合は 2.265 sec とかです。
Heroku では [New Relic APM Add-on](https://elements.heroku.com/addons/newrelic) が使えますが、Free plan であっても自身の外形監視ができます。今までサーバは Mackerel で監視していましたが、外形監視が出来ていなかったので、想定外のメリットでした。
あと、今回初めてドメインを引っ越したのですが、以下の記事が大変参考になりました。
- [ドメインをさくらからAWSのRoute53に移行する方法|ニートエンジニアの日記](https://php-java.com/archives/2109)
さくらの管理画面は非常に分かりづらいので、Route53 に移行できて良かったです。ドメインまわりの理解が進みましたし、terraform でも管理出来ました。
## 所感
管理するサーバが減ったのは良いのですが、手頃な Linux マシンがなくなってしまいました。Docker は何か違うし、VirtualBox は起動するのが面倒です。
やはり作業マシンを Linux にするかあ...。
## おまけ
これ知らなかった。 今回は 3,921 円戻ってくるみたいです。
{{< tweet user="masutaka" id="1086284892852215808" >}}
--------------------------------------------------------------------------------
title: "最新の iPad(第6世代)を買った"
date: "2019-01-03"
--------------------------------------------------------------------------------

2012 年 3 月に買った母の iPad の動作が非常に重たくなってきたので、ノープランで iPad を買った。
どうやら{{< wikipedia word="iPad_(第3世代)" text="第3世代" >}}から{{< wikipedia word="iPad_(第6世代)" text="第6世代" >}}にアップデートされた形になったようだ。
以前の容量は当時最大の 64GB だったが、全く必要ないようだったので 32GB に減らした。というか、32GB か 128GB の選択肢で悩んだ結果の答え。128GB は流石に多すぎる。
画面サイズは当時も今も 9.7 インチ。
## なぜ突然買ったのか
iPad の動作が重いのは夏に帰省した時に知っていたが、今回どうするかは特に考えていなかった。
それとは別に以前からパスワードの使い回しが気になっており、1Password をファミリープランにして、アプリを入れてとかやっていたら、iPad 自体もどうにかしたくなってきた。
母の使い方を見ていたら、Youtube 見たり、オセロやったり、星座アプリを使ったりと、ヘビーな使い方はしていない様子。初めは私の ZenPad {{< post "2016-11-01-1" >}} を母に下げようと移行作業をやり始めた。
母のスマホは iPhone SE なので、写真連携は iPhone にも Google フォトアプリを入れるとして、リマインダーどうしよう?メモはどうにかなったっけ?とか考えていてたら、母が運用するのは無理だと悟り、iPad を買うことに決めた。それも今すぐに。
この辺りの決断は、相変わらず思い切りが良い。
## どの iPad を買えばよいか
ネットで調べたところ、最新の iPad は第6世代で、評判は良いみたいだった。発売は 2018 年 3 月で、[MacRumors 的には Caution だった](https://buyersguide.macrumors.com/#iPad)けど、今欲しいので問題ないと判断した。
他の選択肢として、iPad Pro はオーバースペック、iPad mini は母には画面サイズが小さいようだった。
判断したは良いが、浜松には Apple Store は存在しない。ビックカメラ浜松店が正規サービスプロバイダという役割らしい。
ただ、そのビックカメラに行ったら品切れ、ヤマダ電機も同じで、3 件目のケーズデンキでようやく買うことが出来た。
家でしか使わないので、AppleCare+ は購入しなかった。
## 移行作業
最近の iOS は移行作業がとっても楽ちんなので、試しに母にやらせてみた。
でも第3世代の iPad の iOS は 9.3.5 で打ち止めらしく、恩恵に預かることは出来なかった。iOS11 からの機能らしい。
仕方がないので普通にセットアップをやった。この辺りはデザインの敗北というか、母には難しいようだったので、一緒にセットアップした。
新しい iPad は指紋認証が使えてしまうので、アプリ毎の再ログインが非常に面倒だった。指紋認証は後回しにすればよかった。
## まとめ
大変喜んでいたので結果良しとする。
--------------------------------------------------------------------------------
title: "『どもる体』を読んだ"
date: "2018-12-25"
--------------------------------------------------------------------------------
{{< amazon asin="426003636X" title="どもる体 (シリーズ ケアをひらく)" >}}
しばらく前に読み終わった。
ここ数年、言葉を発しづらいことがある。言葉は思い浮かんでいるけど、口から出てこなかったり、ろれつが回らなかったりする。悩んでいると言うよりも不便で困っている。
一度気になって東大病院で MRI 検査を受けたこともあったっけ。結果は異常なし。
仕事で疲れた夕方や、酒を飲んだときに、発しづらくなる気がする。逆に元気いっぱいの午前中は、非常に滑舌が良い。リラックスしている時も問題がないことが多い。
そんな中で [HONZ の記事](https://honz.jp/articles/-/44810)で目にしたのがこの本を買ったきっかけ。
[HONZ](https://honz.jp/) は私がフィードリーダーで購読している、数少ない技術系以外のサイト。時々面白そうな本が見つかるので重宝している。もっとも今回のように実際に買うことは少なくて、書評で読んだ気になることがほとんど。ふと傍らに目をやると積ん読となった技術書達が。うっ、頭が・・・!
話が脱線した。
この本はどもり(吃音)の原因も解決方法も提示しない。あくまで観察するだけ。
そもそも私の場合、吃音であること自体はっきりしなかったが、この本を読んで典型的な吃音だと理解した。気が向いたら医者にかかるかもしれない。
吃音というと一般的には、「わわわわ私は」のような「連発」をイメージすることが多いと思う。
私は症状としてはあるけど、あまり困ってはいなかった。喋れないわけではないし、幸いにもバカにする人がいる環境でもない。ちなみにこの本を読んだ後、改めて周囲を観察してみたら、頻度の多い少ないはあるにせよ、連発する人は意外にいるなと思った。
一番困るのが「難発」。「・・・・」のように、「私は」などが出てこないので、変な雰囲気になる。
仕方がないので「言い換え」を試みるわけだが、代わりの単語が出てこないことは多いし、微妙にニュアンスが変わることもある。酒を飲んでいると頭がまわらないので、特に代わりの単語が出てこない。
酒で思い出したが、飲み会の時などに面白いことを思いついて、タイミングを計って喋ろうとした時も、難発が出て言えない時がある。
吃音は「言葉の代わりに体が伝わってしまう」ことらしいが、難発の時は体が硬直するのがよく分かる。
以上が最初に書いた「不便で困る」ということ。
どうやら歌っている時や、プレゼンをしている時などは吃音が出ないらしい。最近歌ってないので前者はよく分からないが、後者は多分そう。
根本原因は、無意識のうちにリラックス出来ていないからかも。自分だけの特殊な問題ではないことが分かったことと、こっそりリズムを刻むなどの回避策はなくはないので、うまく付き合っていこうと思う。
--------------------------------------------------------------------------------
title: "Heroku の Slug は友達"
date: "2018-12-21"
--------------------------------------------------------------------------------

この記事は [heroku Advent Calendar 2018](https://qiita.com/advent-calendar/2018/heroku) の 21 日目の記事です。
20 日目は [@pukka](https://qiita.com/pukka) さんの『[【Heroku検討者向け】デプロイ方法5選!](https://qiita.com/pukka/items/412bcac29cabc36da6fa)』でした。(4)マニフェストでの heroku.yml の使い方は初めて知りました。[デプロイした](https://gist.github.com/masutaka/d05c3908c3bef80788b8ee5b0ef7b3ba)ところ、heroku18 Stack の Docker Image が使われているようでした。Slug を作る従来の非 Docker デプロイも Docker に寄せられていくのかな?
今日はそんな Slug に注目した記事をお届けします。
## Slug とは
みなさん、Heroku の Slug はご存知でしょうか?
ダッシュボードの Settings タブからサイズを確認できます。

でもこれしか情報がないのですよね。恥ずかしがり屋さんかな?
[Slug Compiler](https://devcenter.heroku.com/articles/slug-compiler) のドキュメントによると、
> Slugs are compressed and pre-packaged copies of your application optimized for distribution to the [dyno manager](https://devcenter.heroku.com/articles/dynos#the-dyno-manager). When you git push to Heroku, your code is received by the slug compiler which transforms your repository into a slug. Scaling an application then downloads and expands the slug to a dyno for execution.
だそうです。git push すると Slug Compiler によって作られるみたいです。
自分なりの解釈を図にしてみました。

Heroku では [Dyno](https://jp.heroku.com/dynos) という軽量コンテナ上で、アプリケーションが動作します。アプリケーションは ↑ のように Slug というパッケージに固められます。Slug にはアプリケーションコードの他に Buildpack や、Ruby なら bundle install されたライブラリ等が含められています。Dyno が起動する時は Slug がダウンロードされ、展開して使われます。
という理解です。
Slug が何者かは分かりました。では実際にダウンロードして確認してみましょう。
## Slug をダウンロードしてみよう
[Slug Info API](https://devcenter.heroku.com/articles/platform-api-reference#slug-info) を使うとダウンロードできます。APP_NAME はご自分の Heroku App に置き換えてください。
```console
$ APP_NAME=github-organization-watcher
$ LATEST_SLUG_ID=$(heroku releases --json -a $APP_NAME | jq -r '.[0].slug.id')
$ SLUG_URL=$(curl -n https://api.heroku.com/apps/${APP_NAME}/slugs/${LATEST_SLUG_ID} \
-H "Accept: application/vnd.heroku+json; version=3" | jq -r '.blob.url')
$ curl -Lo ${LATEST_SLUG_ID}.tar.gz $SLUG_URL
$ tar xzf ${LATEST_SLUG_ID}.tar.gz
```
heroku run と同じ光景が広がっていますね。
```shell-session
$ tree -L 2 .
.
├── 50d9bdde-3ea4-42c0-8b05-d063164c0081.tar.gz
└── app
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── Procfile
├── README.md
├── Rakefile
├── app
├── app.json
├── bin
├── config
├── config.ru
├── db
├── docker-compose.yml
├── lib
├── log
├── public
├── spec
├── tmp
└── vendor
11 directories, 10 files
```
[Heroku slugs プラグイン](https://github.com/heroku/heroku-slugs) を使うともっと簡単です。
```console
$ heroku plugins:install heroku-slugs
$ APP_NAME=github-organization-watcher
$ heroku slugs:download -a $APP_NAME
```
## Slug を手動で作ってリリースしてみよう
前述のとおり、Slug は Slug Compiler が作ってくれます。ですが、[Heroku Dev Center > Creating Slugs from Scratch](https://devcenter.heroku.com/articles/platform-api-deploying-slugs) に従えば、自分で作ることが出来ます。
Ruby の場合だとこんな感じです。Node.js と Go の例もあります。
1. ruby buildpack をダウンロードして展開する
2. server.rb を追加して、tar で固め直す。実はこの tar ball がもう Slug
3. Heroku App を作る
4. [Slug Create API](https://devcenter.heroku.com/articles/platform-api-reference#slug-create) を使って、Heroku App に Slug アップロード用の箱を作る
5. 4 で PUT 用の URL が返るので、2 の tar ball をアップロードする
6. [Release Create API](https://devcenter.heroku.com/articles/platform-api-reference#release-create) を使って、手動でリリースする
4 で process_types を指定することにより、Procfile を使わないのは面白いと思いました。
あと、curl の -n オプションを初めて知りました。
> -n, --netrc Must read .netrc for user name and password
Heroku CLI と同様、認証のために ~/.netrc を参照します。Heroku CLI と curl は相性が良かったのですね・・・!
## Slug のサイズを減らしてみよう
[現在の上限は 500MB](https://devcenter.heroku.com/articles/limits#slug-size) なのでほとんどのアプリは下回るはずですが、300MB を超えると Heroku は警告を出すそうです。Dyno の起動時間が遅くなる可能性があるので、サイズを減らすと良いと思います。
1 つは単純に Slug に含めるファイルを減らすことです。git リポジトリから不要なファイルを削除したり、Slug に含めたくないファイルを [.slugignore](https://devcenter.heroku.com/articles/slug-compiler#ignoring-files-with-slugignore) に書くことでサイズを減らすことが出来ます。
もう 1 つは [heroku-repo プラグイン](https://github.com/heroku/heroku-repo)を使う方法です。前述の図にあるキャッシュのサイズが減るため、Slug サイズも減ります。
```console
$ heroku plugins:install heroku-repo
$ heroku repo:purge_cache -a $APP_NAME
$ git commit --allow-empty -m 'Decrease slug size'
$ git push heroku master
```
こんな感じにキャッシュサイズを減らしています。
https://github.com/heroku/heroku-repo/blob/v1.0.13/commands/purge_cache.js
1. `GET https://api.heroku.com/apps/{app-name}/build-metadata` して、キャッシュ GET 用 URL を取得する
2. ダウンロードすると tar ball が得られる
3. heruku run して、ダウンロードした tar ball の中から vendor/heroku 以外をすべて削除する
4. tar ball に固めて、1 で得られた PUT 用 URL にアップロードする
5. 次回のデプロイでは新規に bundle install 等行われる
ちなみに 1 の API は [Platform API Reference](https://devcenter.heroku.com/articles/platform-api-reference) に載っていません。
呼び出し箇所はここです。
https://github.com/heroku/heroku-repo/blob/v1.0.13/lib/repo.js#L6-L9
こんなレスポンスです。Heroku は AWS 上に構築されていることがよく分かります。
```shell-session
$ curl -n https://api.heroku.com/apps/{app-name}/build-metadata \
-H "Accept: application/vnd.heroku+json; version=3.build-metadata"
{
"app":{
"id":"",
"name":"{app-name}"
},
"cache_delete_url":"",
"cache_get_url":"",
"cache_put_url":"",
"repo_delete_url":"",
"repo_get_url":"",
"repo_put_url":""
}
#
# https://s3-external-1.amazonaws.com/heroku_repos/heroku.com/cache/.tgz?AWSAccessKeyId=&Signature=&Expires=
#
# https://s3-external-1.amazonaws.com/heroku_repos/heroku.com/.tgz?AWSAccessKeyId=&Signature=&Expires=
```
## 何がキャッシュされているか
Ruby だったらこんな感じです。
```shell-session
$ tree -L 5 .
.
├── heroku-18
│ └── vendor
│ └── bundle
│ ├── bin
│ │ ├── bundler
│ │ ├── erubis
│ │ ├── nokogiri
│ │ ├── puma
│ │ ├── pumactl
│ │ ├── rackup
│ │ ├── rails
│ │ ├── rake
│ │ ├── sass
│ │ ├── sass-convert
│ │ ├── scss
│ │ ├── slimrb
│ │ ├── sprockets
│ │ ├── thor
│ │ └── tilt
│ └── ruby
│ └── 2.4.0
├── public
│ └── assets
│ ├── application-2669f77215d52f68e22d0c5cf91d20a0833601d2eb3185776f03a6f59d7c3d2e.js
│ ├── application-2669f77215d52f68e22d0c5cf91d20a0833601d2eb3185776f03a6f59d7c3d2e.js.gz
│ ├── application-2bee43f63707bcd2903a160f8816cb729632b6d80a17add90f928f975b446312.css
│ └── application-2bee43f63707bcd2903a160f8816cb729632b6d80a17add90f928f975b446312.css.gz
├── tmp
│ └── cache
│ └── assets
│ └── sprockets
│ └── v3.0
└── vendor
└── heroku
├── buildpack_ruby_version
├── buildpack_version
├── bundler_version
├── ruby_version
├── rubygems_version
├── secret_key_base
└── stack
```
↑ は Rails アプリです。rails assets:precompile は毎回フルビルドしますが、Heroku は tmp/cache/assets をキャッシュすることで、ビルドを高速化しています。
[Heroku Dev Center > Rails 4+ Asset Pipeline on Heroku > Caching](https://devcenter.heroku.com/articles/rails-4-asset-pipeline)
tmp/cache/assets は 50MB までキャッシュされます。50MB というのはストレージのブロックサイズを考慮しない、実際のサイズらしいです。GNU du だと --apparent-size オプションで分かります。
キャッシュサイズ削減で登場した vendor/heroku 以下のファイルはこんな感じです。メタデータですね。
| ファイル名 | ファイルの中身 |
| --- | --- |
| buildpack_ruby_version | ruby-2.4.5 |
| buildpack_version | v196 |
| bundler_version | 1.15.2 |
| ruby_version | ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-linux] |
| rubygems_version | 2.6.14.3 |
| secret_key_base | [SECRET] |
| stack | heroku-18 |
## リポジトリサイズも減らしてみよう
heroku-repo プラグインを使うと、前述の図にあるリポジトリサイズも減らすことが出来ます。
```
$ heroku repo:gc -a $APP_NAME
```
ただし、Slug には .git ディレクトリは含まれないため、Slug サイズは減りません。Slug のコンパイル時間が減るでしょう。
## Docker デプロイ使っていると、Slug はどうなる?
{{< post "2018-11-21-1" >}} でも紹介した Docker デプロイでは、Slug はどうなるでしょう?
```
$ heroku releases --json -a aqueous-everglades-51851 | jq -r '.[0]'
{
(snip)
"slug": null,
(snip)
}
```
そりゃそうかあー。ダッシュボード上だとこのように見えます。

## まとめ
Slug をダウンロードしたり、自分で作ったり、サイズを減らしたりすることで、グッと身近に感じられました。もう友達ですね!
明日の [heroku Advent Calendar 2018](https://qiita.com/advent-calendar/2018/heroku) は [@sho7650](https://qiita.com/sho7650) さんが Private Space について書くようです。Private Space は全く使ったことがないので、楽しみです。
--------------------------------------------------------------------------------
title: "メールフッタのセパレータ "-- ""
date: "2018-12-17"
--------------------------------------------------------------------------------
よく "--" で区切られれていますが、RFC 3676 的には最後に半角スペースを加えた "-- " が正しいです。sig-dashes と呼ぶらしいです。
https://www.ietf.org/rfc/rfc3676.txt
> There is a long-standing convention in Usenet news which also commonly appears in Internet mail of using "-- " as the separator line between the body and the signature of a message. When generating a Format=Flowed message containing a Usenet-style separator before the signature, the separator line is sent as-is. This is a special case; an (optionally quoted or quoted and stuffed) line consisting of DASH DASH SP is neither fixed nor flowed.
"-- " 以降に署名を書くと、メーラーは気を利かせて "-- " 以降を引用しません。
↓ Gmail の場合は、以下の設定を有効にする必要があります。

Usenet は古のネットニュースに似たものらしいです。古の慣習が RFC に改めて記載されたようです。と言っても、2004 年の RFC ですが。
Format=Flowed は {{< post "2009-03-14-1" >}} で説明したことがあります。
--------------------------------------------------------------------------------
title: "Heroku と Redash は相性が良いのでは?という話"
date: "2018-12-17"
--------------------------------------------------------------------------------

これは [Redash Advent Calendar 2018](https://adventar.org/calendars/3299) の 17 日目の記事です。
16 日目は [@mazamachi](https://adventar.org/users/19393) さんの『kubernetess の redash か黒魔術』ですが、まだ投稿されていないようですね。今回の記事にも関連するので期待してます。
1 日目の『[2018年12月現在における Redash のはじめかた](http://ariarijp.hatenablog.com/entry/2018/12/01/165347)』を拝見しました。実際問題、どこに立てれば良いか、悩む方もいらっしゃるのではないでしょうか。今回はその点をまとめていきます。
## Redash をどこに立てれば良いか?
身も蓋もありませんが、ご自身が一番慣れた Docker の PaaS 上で動かすのが良いと思います。
AWS EC2 や GCE などの、非 Docker 環境は運用負荷がそれなりに発生するため、避けたほうが良いでしょう。アップグレードでハマったり、ストレージ使用量 100% になるのはあるあるです。
↓ 公式の [How to Upgrade](https://redash.io/help/open-source/admin-guide/how-to-upgrade) はいつの頃からか、非 Docker 環境でのアップグレード方法が "legacy guide" になってました。公式でも Docker 推しのようです。
> This instructions are for those who use our new Docker based instance. If you use our older instances (or used the old bootstrap script), check the [legacy guide](https://redash.io/help/open-source/admin-guide/how-to-upgrade-legacy).
業務では先月、Redash を本番環境と同じ Heroku に立てました。予想以上に簡単かつ安定して動いています。この記事では、Redash on Heroku のメリットをデメリット含めて紹介します。
## メリット1: 簡単に立てられる
{{< github_repo "willnet/redash-on-heroku" >}}
README.md の通りにセットアップすれば、10 分程度で Redash を起動できるのではないでしょうか。
[先日 heroku.yml に対応した PR がマージされた](https://github.com/willnet/redash-on-heroku/pull/3)ため、セットアップがより簡単になりました。git push でコンテナを起動できるのは便利です。
ちなみに私は Redash のバージョンを固定するため、Fork 版を使っています。
- ブランチ: https://github.com/feedforce/redash-on-heroku/tree/ecbooster
- 差分: https://github.com/willnet/redash-on-heroku/compare/master...feedforce:ecbooster
5.0.2.b5486 の場合、5.0.2 がバージョンで、[b5486 はビルド番号](https://github.com/getredash/redash/blob/v5.0.2/.circleci/docker_tag#L3)です。ビルド番号は気にしなくて良いと思います。Docker Image のタグは https://hub.docker.com/r/redash/redash/tags で確認できます。
## メリット2: 毎日再起動される
Heroku の Dyno はだいたい 24 時間に 1 回、自動的に再起動され、Dyno が差し替わります。
[Dynos and the Dyno Manager > Automatic dyno restarts](https://devcenter.heroku.com/articles/dynos#automatic-dyno-restarts)
仮に Redash にメモリリークのバグがあったとしても、次の日にはリセットされます。本番環境と違って Redash はそれなりに動けば良いため、地味にメリットだと思います。
本番環境に加えて Redash まで監視してアラートの通知が来るのは、ちょっと運用負荷が高いと思うので、とりあえずリセットされるのはうれしいですね。
## メリット3: クエリが詰まっても安心?
Redash はたまにクエリが詰まることがあり、再起動が必要になることがあるそうです。
3 日目の塚田さんの記事『[redashの導入、運用で得た知見、改善まとめ](https://tsukada.sumito.jp/2018/12/03/redash-operation/)』で言及されています。
ですが、メモリ要因の詰まりであれば、Redash on Heroku では何もする必要はないかもしれません(今のところ手動で再起動したことはありません)。
Heroku ではメモリが Dyno の上限を超えてスワップし始めると、R14 Error (Memory quota exceeded) が発生します。例えば Hobby Dyno のメモリ上限は 512MB です。
さらにスワップが増え、メモリ上限の 2 倍を超えると R15 Error (Memory quota vastly exceeded) が発生し、Dyno は強制再起動されます。
[Dynos and the Dyno Manager > Memory behavior](https://devcenter.heroku.com/articles/dynos#memory-behavior)
エンジニアが手動で再起動しなくて良いのは、運用面で大きなメリットです。もちろん頻発する場合は、Dyno type を上げたほうが良いと思います。
ちなみに、エラーや Dyno の再起動の様子は Heroku のダッシュボードで確認できます。以下は例です。もちろん Heroku のログでも確認できます。

## メリット4: DB のバックアップ
[Heroku Postgres Add-on](https://elements.heroku.com/addons/heroku-postgresql) は Free 含めて全てのプランで自動/手動バックアップ可能です。
事故が起きた場合に役立つでしょう。Redash のアップグレード前の手動バックアップは忘れずに。
## 割と致命的なデメリット
データソースとして使いたい MySQL や PostgreSQL のエンドポイントがインターネットに露出していない場合、Redash on Heroku を採用することは出来ないでしょう。ECS や GKE など、当該プラットフォームの Docker サービスを使いましょう。
## 参考: Dyno type
業務で使う場合は、Hobby ($7/mo) 以上が良いでしょう。もちろん、試しに立てるだけなら Free で十分です。
Free と Hobby のメモリサイズは同じ 512MB ですが、Hobby 以上であれば Sleep がないことと、ダッシュボードで Metrics を見られるからです。結果的に運用時間の短縮になるでしょう。
参考: [Dyno Types|Heroku Dev Center](https://devcenter.heroku.com/articles/dyno-types))
## 参考: Add-on のプラン
Heroku Postgres Add-on のプランは Hobby Basic ($9/mo) 以上がほぼ必須です。
Hobby Dev ($0/mo) だと Row Limit が 10,000 であるためです。Redash は events Table にアクセスログっぽいものを記録するようで、一週間も経たないうちにプランを上げるハメになりました...。
[ボタン一発で Hobby Dev から Hobby Basic にアップグレードすることは出来ない](https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases#upgrading-with-pg-copy)ため、最初から Hobby Basic で始めることをオススメします。Hobby Basic だと Row Limit は 10,000,000 なので、しばらくは大丈夫でしょう。
Redis Cloud と SendGrid Add-on は無料プランで十分だと思います。
## まとめ
Redash on Heroku のメリットとデメリットを紹介しました。運用が非常に楽です。一度試してみてください。
明日の [Redash Advent Calendar 2018](https://adventar.org/calendars/3299) は [@Udomomo](https://adventar.org/users/19514) さんが Redash CLI について書くそうです。Redash CLI は使ったことがないので、今から楽しみです。
--------------------------------------------------------------------------------
title: "BitBar の Heroku plugin はいいぞ"
date: "2018-12-13"
--------------------------------------------------------------------------------
この記事は [heroku Advent Calendar 2018](https://qiita.com/advent-calendar/2018/heroku) の 13 日目の記事です。
12 日目もわたくしマスタカの当番で、内容は『[Heroku の Preboot 機能を深掘りした](https://developer.feedforce.jp/entry/2018/12/12/120000)』でした。その気になればドキュメント以上のことを探れることは、Heroku のメリットだと感じています。
今日は Heroku の BitBar plugin を紹介します。**macOS 限定です。**
## BitBar とは
[BitBar - Put anything in your Mac OS X menu bar](https://getbitbar.com/)
macOS のメニューバーにこんなものを置けるツールです。例として [Homebrew Updates plugin](https://getbitbar.com/plugins/Dev/Homebrew/brew-updates.1h.sh) を表示しています。

標準出力を吐きさえすれば、シェルスクリプトでも Ruby でも言語を問わないのが気楽です。
↓ ちょっとだけ変更しています。
```
--- brew-updates.1h.sh.orig 2018-12-11 23:42:41.000000000 +0900
+++ brew-updates.1h.sh 2018-12-11 23:42:25.000000000 +0900
@@ -12,13 +12,13 @@
/usr/local/bin/brew update > /dev/null || exit_with_error;
PINNED=$(/usr/local/bin/brew list --pinned);
-OUTDATED=$(/usr/local/bin/brew outdated --quiet);
+OUTDATED=$(/usr/local/bin/brew outdated --verbose);
UPDATES=$(comm -13 <(for X in "${PINNED[@]}"; do echo "${X}"; done) <(for X in "${OUTDATED[@]}"; do echo "${X}"; done))
UPDATE_COUNT=$(echo "$UPDATES" | grep -c '[^[:space:]]');
-echo "↑$UPDATE_COUNT | dropdown=false"
+echo "🍺$UPDATE_COUNT | dropdown=false"
echo "---";
if [ -n "$UPDATES" ]; then
echo "Upgrade all | bash=/usr/local/bin/brew param1=upgrade terminal=false refresh=true"
```
## [Heroku plugin](https://getbitbar.com/plugins/Dev/Hosting/Heroku/heroku.1m.rb)
Heroku の異常に緩く気づける plugin です。https://status.heroku.com/ と同じ内容を API で取得しています。

## [Heroku apps:errors plugin](https://getbitbar.com/plugins/Dev/Hosting/Heroku/herokuappserrors.1h.rb)
任意の Heroku App のエラーが分かる plugin です。この例では H27 Error (Client Request Interrupted) が直近 24 時間に 7 回発生しています。

最新の [Heroku Error Codes](https://devcenter.heroku.com/articles/error-codes) がなかったので、[PR](https://github.com/matryer/bitbar-plugins/pull/1136) 作ったらすぐにマージされました。
スクリプトを見ると分かりますが、'$ heroku apps:errors' で App のエラーを取得しています。CLI でも取得できたのですね。
↓ app は必ず変更する必要があります。あと、メニューバーは狭いので、文字数を減らしています。BitBar plugin は緩く変更できる点が気楽です。
```
--- herokuappserrors.1h.rb.orig 2018-12-11 23:36:27.000000000 +0900
+++ herokuappserrors.1h.rb 2018-12-11 23:36:10.000000000 +0900
@@ -14,7 +14,7 @@
HEROKU_CMD="/usr/local/bin/heroku"
# Configuration options
-app = "appname" # Which app?
+app = "ecbooster" # Which app?
hours = 24 # how many hours should the error window contain?
@@ -78,7 +78,7 @@
end
end
-puts "#{total} #{app} errors"
+puts "#{total} errs"
puts "---"
puts "In the last #{hours} hours"
puts copy
```
複数の Heroku App を確認したい時は、コピーを作ってプラグインフォルダに置けばよいでしょう。
## 他に使っている plugin
- [Emacs Package Updates](https://getbitbar.com/plugins/Dev/Emacs/emacs-package-updates.1d.sh)
- 拙作の Emacs のパッケージ更新が分かる plugin です。無茶してます
- [GitHub status](https://getbitbar.com/plugins/Dev/GitHub/github_status.10m.py)
- GitHub の異常にすぐ気づける plugin です。https://status.github.com/ と同じ内容を API で取得しています
## まとめ
BitBar の Heroku plugin を紹介しました。Heroku のエラーに緩く気づける点が気に入りました。Heroku Error Codes への関心も高まりました。
明日の [heroku Advent Calendar 2018](https://qiita.com/advent-calendar/2018/heroku) の当番は [@matsuoshi](https://qiita.com/matsuoshi) さんです。どんな内容でしょうかね?
--------------------------------------------------------------------------------
title: "ジム通いと食生活改善を5ヶ月続けたので中間報告をする"
date: "2018-12-07"
--------------------------------------------------------------------------------
ゴホゴホ...この記事は [feedforce Advent Calendar 2018](https://adventar.org/calendars/3235) の 7 日目の記事です。健康的な記事を書くつもりが、月曜日から水曜日まで寝込んでいました(白目)。
6 日目はふねさんの『[リモート勤務が出来るようになったので煮込みがはかどる話](https://funesannofune.hatenablog.com/entry/2018/12/06/003439)』でした。
煮込み料理( ・∀・)イイ!!ですね。無職時代に、カレーを作りながら採用面接向けの課題をやっていたことを思い出しました。(ToT)
そんな私の記事は {{< post "2016-12-14-1" >}} と {{< post "2017-12-19-1" >}} に引き続き、またまた健康・生活に関する記事です。40 を超えると、健康の話しかしませんよね?
## さっそく中間報告
トレーナー曰く「今のところ順調に筋肉量が増え、体脂肪率が減っている」とのこと。さすがに CM みたいに極端には結果は出ないですね。初期の体脂肪率が 31.4% とかはおかしいので機械の故障でしょう...。

※ ジムで InBody を使っての計測
自宅では 2014 年から Withings の体重計で毎朝測っています。

※ {{< amazon_link asin="B00GRP609C" title="Withings Smart Body Analyzer" >}} での計測
③の傾斜角が今回の成果になります。2kg 程度ですが、私の身長は 161cm ほどなので、これでも体つきに変化が出ています。筋肉量を増やしつつ、体重が減っていますからね。
①は朝食を MCT オイル&バター&コーヒーにしていた頃です。筋トレはしていません。
②は一週間でこの変化です。一週間熱が出続けて寝込んだらこうなりました。出社したら痩せたと言われました。
どちらも見事にリバウンドしていますね...。
## なぜまたジムに通い始めたか
週に 2〜3 回、晩酌する習慣がついてしまい、人生最大の体重と体脂肪率になったからです。
実は 2 年前まで近所のジムに通っていました。あまり合わずに 3 ヶ月ほどで辞めた後、近所の[エニタイムフィットネス](https://www.anytimefitness.co.jp/)に行こうと思い 2 年が経ってしまいました。
これ以上延ばすのはまずいと思い、申し込んだのが {{< post "2018-06-30-1" >}} というわけです。
## ジムに行く頻度と内容
週 3 回目標で、最低週 2 回で続けています。もう 6 ヶ月目です。雨の日も風の日も台風の日も通います。何も考えずに通うことが重要です。「一度決めたことを忠実に繰り返してしまう」という私の性格に大変助かっています。
週 3 回のうちの 1 回はパーソナルトレーニングをお願いしていて、BIG3(ベンチプレス、スクワット、デッドリフト)を中心に筋力アップを図っています。
パーソナルトレーニングというとお値段が気になりますが、10 回券だと 1 回あたり¥4,665 なので、週イチでマッサージに行っていると思うことにしました。
{{< post "2011-03-05-1" >}} の頃に我流でやっていた時は、効果はあまりなかったことと、マシンで腕を痛めて病院に通ったこともあったので、今回はプロの力を借りることにしました。
他の 2 回はセルフトレーニングです。火曜日は上半身、木曜日は下半身をメインといった形で、交互にトレーニングしています。
上半身の日は腹筋ローラー(15 回 x 3 セット、キツイ)をメインにして、他はチェストプレスやラットプルダウンなどの上半身用のマシンをほぼ全部やります。チンニング(懸垂)とディップがお気に入りです。

下半身の日はブルガリアンスクワット(左右 15 回 x 3 セット、めっちゃキツイ)をメインにして、他はレッグプレスやレッグカールなどをやります。

まだまだ初心者なので、一人で BIG3 はやっていませんし、ブルガリアンも自重だけでやっています。
トレーナー曰く「筋肉量を増やしたほうが(ダイエットが)成功する確率が高い」とのことなので、今は筋トレだけやっています。有酸素運動を組み合わせると効果的なのでしょうが、1 時間も筋トレすると割とクタクタで...。
代わりに駅の階段を一段抜かしで上っています。以前と比べて上りやすくなったことを実感しています。
## 食生活の改善
以前は朝食はコーヒー、昼食はコンビニやうどん、夕食は定食やラーメンなどでした。
トレーナーの指導の元、夜の炭水化物を朝に移動しました。全体的にも炭水化物を減らし、代わりにタンパク質を増やしました。低炭水化物ダイエットはしていません。
記録するのが好きなので、[MyfitnessPal](https://itunes.apple.com/jp/app/myfitnesspal/id341232718) でせっせとカロリー計算しています。ただ最近は飽きてきました...。
朝はだいたいこんな感じです。トレーナー曰く、果物も付けると良いそうです。

昼はコンビニで大きめのサラダ、ゆで卵、おにぎり1個が多いです。ややパターンに飽きています。うどんは止めました。
夜が難しいです。
ジムの日は、行く前にバナナ食べて、帰ったらサラダチキン&野菜とかで問題ありません。
それ以外の日が難しいです。野菜炒めやトマトソースを作ったりしますが、私はあまり料理のレパートリーがありません。
[マッスルデリ](https://muscledeli.co.jp/)、[BASE PASTA](https://basefood.co.jp/)、{{< amazon_link asin="B07DS31SJD" title="MRP" >}} などを試した感じ、MRP を補助的に使って BASE PASTA を中心にしようと思っています。トマトソース好きですし。
MRP は栄養的には問題ありませんが、顎を使わないことが問題です。個人的に週 2 回までと決めています。
マッスルデリはお値段の問題はありますが、バランスよく解凍することが難しいことと、冷凍庫を専有すること、受け取りに宅配ボックスを使えないことが課題で、今のところリピートの予定はありません。
## 息抜き
とは言え、毎日こんな生活をしているわけではなく、土曜日は以前と同じようにビールや焼き鳥など、あまり気にせず飲み食いしています。
平日も 1 日くらいは、ビールやチューハイを飲むことはあります。でも 2 本が限度かな。
## 今後の予定
来年の 6 月までに理想の体型にして、その後は維持するだけにしたいです。
頻度も週 3 回を 2 回に減らしたいです。ジムに行くとその日は何も出来ないので、ジム以外のこと、仕事のための勉強や息抜きに時間を使いたい気持ちです。
明日の [feedforce Advent Calendar 2018](https://adventar.org/calendars/3235) は kasei_san が「なにか書きますー」とのことです。お楽しみに!

※ 頑張るおじさんの図
--------------------------------------------------------------------------------
title: "Heroku Meetup #23 "Heroku Dynamite!!" で話してきた #herokujp"
date: "2018-11-28"
--------------------------------------------------------------------------------

https://herokujp.doorkeeper.jp/events/82754
最近業務で Heroku 周りのことを一手に引き受けています。社内に本番環境での知見はあまりないので、参加してきました。
参加は初なんですが、前回の記事 {{< post "2018-11-21-1" >}} を Slack の HerokuJP User Group にシェアしたら成り行きで話すことに。LT 以外で外で話すのは初でしたが、良い意味でこじんまりした Meetup で、割とリラックスして話せましたね。
会社の勉強会だと 20 人くらいいるので、良い訓練になっていたのかも。
## アプリケーションエンジニアから見た The Twelve-Factor App by {{< twitter "kimihom" >}}
{{< speakerdeck "81bf3e820c9243d8a12c0567b5085380" >}}
[The Twelve-Factor App](https://12factor.net/ja/) は以前読んだことがあったけど、もう一度確認しようと思いました。
config/environments/staging.rb 作ってしまうとか、忘れてますね...。中身は require_relative './production.rb' にしてますがね。
## 先々週 GA になった heroku.yml を使った Docker Deploy の紹介 by {{< twitter "masutaka" >}}
{{< speakerdeck "5c044a10a5ba4a2e8251e872218d5901" >}}
前述のとおり、{{< post "2018-11-21-1" >}} のプレゼン版です。
プレゼン用に ↓ このリポジトリを作りました。README.md に沿って試すと、とっても簡単に Heroku の Docker 周りを試せます。興味ある方は是非どうぞ。
{{< github_repo "masutaka/heroku-docker-trial" >}}
## 正しく理解する Heroku Flow by {{< twitter "sho7650" >}}
ちょうど Heroku CI と Promotion は知りたかったので、タイミングが良かったです。
Promote で引き継ぐのは Slug のみで、環境変数は引き継がないそうなので、うちのチームのデプロイ高速化と安全性の向上に使えると思いました。
## 感想
質問タイムや懇親会などで、知りたかったことやググっても分からないことなど(※)を聞け、近年稀に見る有意義な Meetup でした。やっぱり、業務と直結した課題と 1:1 の Meetup は捗ります。
※ [Private Spaces](https://jp.heroku.com/private-spaces) のお値段だとか、US, EU に続いて Tokyo Region 来ないの?とか、Docker on Heroku 使うと、セキュリティパッチやバージョンアップなどユーザが考えることが増える側面もあるとか。
Heroku は深く学ぼうとするとあまり情報がありません。User Group の皆さんには大変助けて頂きました。
もし同じ境遇の人がいたら、HerokuJP User Group の Slack に参加すると良いかも知れません。[この URL から参加できますよ。](https://join.slack.com/t/herokujp-ug/shared_invite/enQtMzI3MzE3Nzk5OTIzLWZjMDU4ZjVmNGRhODkxODQ4MTJkZjU2MjdkZTU3ZjMyYmM2YzE0NDM4NDZlODEyZGQ4YjUwNTVkOTA2Mjg4Yzg)
{{< tweet user="masutaka" id="1067384638140669953" >}}
[ [Meetup 当日のツイート](https://twitter.com/search?f=tweets&q=%23herokujp%20since%3A2018-11-27_00%3A00%3A00_JST%20until%3A2018-11-27_23%3A59%3A59_JST&src=typd) ]
**追記(2019-07-29):**
[Heroku Meetup #25 でも話してきました。](https://developer.feedforce.jp/entry/2019/07/29/140000)
--------------------------------------------------------------------------------
title: "先週 GA になった、heroku.yml を使った Docker Deploy を試した"
date: "2018-11-21"
--------------------------------------------------------------------------------

先週 Building Docker Images with heroku.yml が GA になってました。
[Building Docker Images with heroku.yml Is Generally Available](https://blog.heroku.com/build-docker-images-heroku-yml)
heroku.yml は使ったことがなく、最近 Redash を Docker on Heroku で
立て、モチベーションが上がっているので、早速試してみました。
今までの方法と比較しながら、気づいたことを中心にまとめていきます。
## [Container Registry & Runtime (Docker Deploys)](https://devcenter.heroku.com/articles/container-registry-and-runtime)
今まで Heroku で Docker を使うときは、このようにデプロイしていました。
```
$ heroku container:push web # (1)
$ heroku container:release web # (2)
```
(1) でローカルで docker build して、Heroku の Docker registry に
push します。
(2) で push した Docker Image をデプロイします。
heroku への git push は不要でした。ローカルで docker build するの
で、ビルド環境による差異はゼロではないと思います。
https://github.com/masutaka/redash-on-heroku/tree/trial を使うと、
この方法で Redash を立てられます。
## [Building Docker Images with heroku.yml](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml)
今回 GA になったのがこちらです。
heroku.yml が必須となっており、git push すると、Heroku 側で docker
build と、Heroku の Docker registry への push をしてくれます。
```
$ git push heroku master
```
Activity にも記録されます。

https://github.com/masutaka/redash-on-heroku/tree/trial-heroku-yml
を使うと、この方法で Redash を立てられます。
次に heroku.yml の各 section を見ていきます。
### setup section
setup section はまだベータで、beta 版の Heroku CLI と manifest
plugin が必要です。
```
$ heroku update beta
$ heroku plugins:install @heroku-cli/plugin-manifest
```
あとで stable 版に戻すことも出来ます。
```
$ heroku update stable
$ heroku plugins:remove manifest
```
setup section は create 時に一度だけ参照されました。
--manifest オプションも必要でした。
```
$ heroku create your-app-name --manifest
```
setup section は省略可能で、今までのように heroku addons:create や
heroku config:set でも代用できます。[app.json](https://devcenter.heroku.com/articles/app-json-schema) と似ています。
### build section
build section はおそらく必須です。
今回は 2 つの Dyno に別々の Dockerfile を指定しました。
```
build:
docker:
web: Dockerfile.web
worker: Dockerfile.worker
```
この書き方が最小なのかな。
```
build:
docker:
web: Dockerfile
```
### release section
今までの [Procfile](https://devcenter.heroku.com/articles/procfile) の process type `` に相当します。
今回は使いませんでした。
### run section
今までの Procfile の process type `` 以外に相当します。
run section がなければ Dockerfile の CMD が使われます。今回は CMD
を使ったので、run section は使いませんでした。
### app.json と Procfile
app.json はまだ Review apps 用に必要なようですが、今後は
heroku.yml に移行していくのでしょう。
Procfile は run section に取って代わられたようです。
※ いずれも Docker on Heroku の話です。
## heroku.yml への移行
今までの heroku container コマンドから heroku.yml の移行は簡単です。
手元で試したところ、heroku.yml を git commit して、git push heroku
master するだけでした。
## まとめ
heroku.yml を使った Docker Deploy を試しました。Heroku 上で Docker
build されるのが良いと言うか、普通になりました。
Review Apps にも対応したので、移行を検討していきます。
--------------------------------------------------------------------------------
title: "Heroku CLI 用の zsh 設定は不要だった件"
date: "2018-10-28"
--------------------------------------------------------------------------------
タイトルは少し端折っていて、正確には ~/.zshrc に以下の設定が必要です。
```
# $FPATH 以下にある補完コレクションを使う。
autoload -Uz compinit; compinit -u
```
これは Heroku CLI 固有の設定ではありません。ls や git などにも適用
される補完を有効にする設定です。
macOS High Sierra 付属の zsh の $FPATH デフォルト値です。
```
$ echo $FPATH | tr ':' '\n'
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.3/functions
```
このように補完が効きます。App の補完はうれしい。

## ここに至った経緯 1/2
Heroku CLI は $ brew install heroku でインストールしており、
/usr/local/share/zsh/site-functions/_heroku があります。
そのため、初めはこんな設定をしていました。
```
FPATH=/usr/local/share/zsh/site-functions:$FPATH
```
でも前述したように /usr/local/share/zsh/site-functions は $FPATH
のデフォルト値に含まれているので不要でした。削除。
## ここに至った経緯 2/2
別件で $ brew install heroku は obsolete で、
現在は $ brew install heroku/brew/heroku だと知りました。
```
$ heroku releases --app aqueous-reaches-70470
Warning: Unsupported install. Install heroku with `brew install heroku/brew/heroku`
=== aqueous-reaches-70470 Releases - Current: v3
v3 Deploy masutaka@example.com 2018/10/27 12:01:49 +0900 (~ 1m ago)
v2 Enable Logplex masutaka@example.com 2018/10/27 11:49:44 +0900 (~ 13m ago)
v1 Initial release masutaka@example.com 2018/10/27 11:49:43 +0900 (~ 13m ago)
```
Heroku CLI をインストールし直したら、補完設定が表示されました。
```
$ brew uninstall heroku --force
$ brew install heroku/brew/heroku
(snip)
==> heroku
To use the Heroku CLI's autocomplete --
Via homebrew's shell completion:
1) Follow homebrew's install instructions https://docs.brew.sh/Shell-Completion
NOTE: For zsh, as the instructions mention, be sure compinit is autoloaded
and called, either explicitly or via a framework like oh-my-zsh.
2) Then run
$ heroku autocomplete --refresh-cache
OR
Use our standalone setup:
1) Run and follow the install steps:
$ heroku autocomplete
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
zsh completions have been installed to:
/usr/local/share/zsh/site-functions
```
OR の前に書かれていることは、$FPATH を設定して
$ heroku autocomplete --refresh-cache しろとのこと。
~/.zcompdump と ~/Library/Caches/heroku 以下が更新されたようです。
~/Library/Caches/heroku 以下には App 名のキャッシュも含まれている
けど、このコマンドを実行しないと更新されないのかな。うーん。
OR の後に書かれていることもやってみました。
```
$ heroku autocomplete
Building the autocomplete cache... done
Setup Instructions for HEROKU CLI Autocomplete ---
1) Add the autocomplete env var to your zsh profile and source it
$ printf "$(heroku autocomplete:script zsh)" >> ~/.zshrc; source ~/.zshrc
NOTE: After sourcing, you can run `$ compaudit -D` to ensure no permissions conflicts are present
2) Test it out, e.g.:
$ heroku # Command completion
$ heroku apps:info -- # Flag completion
$ heroku apps:info --app= # Flag option completion
Visit the autocomplete Dev Center doc at https://devcenter.heroku.com/articles/heroku-cli-autocomplete
Enjoy!
```
printf "$(heroku autocomplete:script zsh)" >> ~/.zshrc したら、
~/.zshrc に以下が書き込まれました。
```
# heroku autocomplete setup
HEROKU_AC_ZSH_SETUP_PATH=/Users/masutaka/Library/Caches/heroku/autocomplete/zsh_setup && test -f $HEROKU_AC_ZSH_SETUP_PATH && source $HEROKU_AC_ZSH_SETUP_PATH;
```
先ほどの補完とほぼ同じで、違いは '...' が表示されることくらいです。

面倒ですが、以下について調べてみました。
(1) /Users/masutaka/Library/Caches/heroku/autocomplete/zsh_setup の仕組み
$ heroku autocomplete がこのファイルを使うように誘導する。
(2) /usr/local/share/zsh/site-functions/_heroku の仕組み
$ brew install heroku/brew/heroku によって作られる。
## (1) /Users/masutaka/Library/Caches/heroku/autocomplete/zsh_setup の仕組み
TAB キーに関数を割り当てつつ、シェル変数の設定をしています。
autoload -Uz compinit; compinit -u もやってくれます。
{{< gist "masutaka" "1f17b9895f1c4e358b56e609a95dd74e" "0_zsh_setup.zsh" >}}
/usr/local/Cellar/heroku/7.18.3/libexec/node_modules/@heroku-cli/plugin-autocomplete/autocomplete/zsh は
ディレクトリで、_heroku というファイルがあります。
関数 _heroku を定義して実行するだけのようです。
{{< gist "masutaka" "1f17b9895f1c4e358b56e609a95dd74e" "1_heroku.zsh" >}}
## (2) /usr/local/share/zsh/site-functions/_heroku の仕組み
シェル変数を設定し、関数 _heroku を定義して実行しています。
{{< gist "masutaka" "1f17b9895f1c4e358b56e609a95dd74e" "2_heroku.zsh" >}}
## (1) と (2) の違い
ほぼ同じでした。(1) は TAB キーに関数 expand-or-complete-with-dots
を割り当てる点だけが違います。この関数は補完時に '...' を表示するだけです。
測定はしていませんが、(1) は autoload -Uz compinit; compinit; も
実行するため、(2) より若干 zsh の起動が遅そうです。
zsh の起動はチリツモで遅くなるため、(1) を使う必要性は少なさそうです。
## おまけ
参考までに、私の ~/.zshrc を貼っておきます。
https://github.com/masutaka/dotfiles-public/blob/master/.zshrc
[prezto](https://github.com/sorin-ionescu/prezto) や [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) などの zsh framework は使っていません。
--------------------------------------------------------------------------------
title: "launchd を使って毎日深夜にだけ Time Machine を実行させる"
date: "2018-10-17"
--------------------------------------------------------------------------------
macOS High Sierra でのお話。
作業中に Tima Machine が動き出すと、macOS が重くなったり固まったり
するので、長年プチイライラしていました。
[TimeMachineScheduler](http://www.klieme.com/TimeMachineScheduler.html) というアプリを使ったら、当初は調子が良かった
のですが、最近はうまく実行してくれません。なぜだ...。
AppleScript + launchd で定期実行出来ないかな?とふと思い立ちました。
調べたら AppleScript を使わずとも /usr/bin/tmutil がありました。
Time Machine CLI です。'$ man tmutil' で詳しいヘルプを参照できます。
こいつを launchd 使って定期実行したらうまくいきました。ちなみに
macOS では cron は非奨励で、代わりに launchd が奨励されています。
## 作成した scheduled-timemachine.plist
```
Label
net.masutaka.scheduled-timemachine
ProgramArguments
sh
-c
date; sudo tmutil disable && pmset -g ps | grep -q 'AC Power' && tmutil startbackup -b; echo
StandardOutPath
/Users/masutaka/.Trash/scheduled-timemachine.log
StandardErrorPath
/Users/masutaka/.Trash/scheduled-timemachine-err.log
StartCalendarInterval
Hour
3
Minute
00
```
※ [GitHub に最新のファイルが公開されています。](https://github.com/masutaka/dotfiles-public/blob/master/services/scheduled-timemachine.plist)
- [launchd を使ったスクリプトの管理 - Apple サポート](https://support.apple.com/ja-jp/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/2.8/mac/10.13)
- [特定の時間にシェルスクリプトを実行する - Apple サポート](https://support.apple.com/ja-jp/guide/terminal/apdd556274b-9cc9-4764-bba8-87610a745747/2.8/mac/10.13)
## 解説
<sudo tmutil disable>
「バックアップを自動作成」は ON にする必要はないため、このコマンド
で OFF にしています。man にも書かれていますが、root 権限が必要なの
で、sudo で実行しています。

<pmset -g ps | grep -q 'AC Power'>
このコマンドでバッテリー利用時の Time Machine バックアップを避けて
います。他に良いやり方があるか?や、そもそも Time Machine が良い感
じに判断してくれる?などは未検証です。
```
# AC アダプター(給電)利用中
$ pmset -g ps
Now drawing from 'AC Power'
-InternalBattery-0 (id=4980835) 100%; charged; 0:00 remaining present: true
# バッテリー利用中
$ pmset -g ps
Now drawing from 'Battery Power'
-InternalBattery-0 (id=4980835) 100%; discharging; (no estimate) present: true
```
<tmutil startbackup -b>
-b は前回のバックアップが終わっていなかったら、待つオプションです。
tmutil startbackup は root 権限不要です。
## 使い方
このディレクトリにコピーします。シンボリックリンクでも良いです。
```
$ cd ~/Library/LaunchAgents
$ cp /path/to/scheduled-timemachine.plist .
```
サービスを登録します。
```
$ launchctl load scheduled-timemachine.plist
```
サービスを削除します。
```
$ launchctl unload scheduled-timemachine.plist
```
scheduled-timemachine.plist を変更した場合は一旦削除してから登録す
る必要があります。
## まとめ
launchd を使って Time Machine を実行することで、作業中のストレスを
減らせました。
macOS デフォルトの機能を使ったので、[TimeMachineScheduler](http://www.klieme.com/TimeMachineScheduler.html) も不要に
なりました。
--------------------------------------------------------------------------------
title: "Bash v3 以下でも set -u 時に変数が定義されてるか確認する方法"
date: "2018-10-15"
--------------------------------------------------------------------------------
以下のように、変数への値がセットされているかで分岐するシェルスクリプトがあったとします。このスクリプトは正常に動作します。
```sh
#!/bin/sh
if [ -n "$CIRCLE_PULL_REQUEST" ]; then
echo '$CIRCLE_PULL_REQUEST is defined.'
else
echo '$CIRCLE_PULL_REQUEST is NOT defined.'
fi
```
堅牢なシェルスクリプトを書く時は `#!/bin/sh` を `#!/bin/sh -u` にすることが多いです。typo 等による意図しない変数の利用を防いでくれます。
今回はこれがコンフリクトし、以下のようなエラーになります。
```
$ ./v.sh
./v.sh: line 3: CIRCLE_PULL_REQUEST: unbound variable
```
## 対策方法
[set -uしてるときに変数が定義されてるかチェックする - Qiita](https://qiita.com/tadsan/items/0109d651780844acce09)
残念ながら macOS High Sierra では上記の方法は使えませんでした。
```
$ ./v.bash
./v.bash: line 3: conditional binary operator expected
$ which -a bash
/bin/bash
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.
```
v.bash の中身です。
```bash
#!/bin/bash -eu
if [[ -v CIRCLE_PULL_REQUEST ]]; then
echo 'CIRCLE_PULL_REQUEST is defined.'
else
echo 'CIRCLE_PULL_REQUEST is NOT defined.'
fi
```
手元の Linux では使えました。Bash は v4.3.11 でした。
```
$ ./v.bash
CIRCLE_PULL_REQUEST is NOT defined.
$ CIRCLE_PULL_REQUEST=123 ./v.bash
CIRCLE_PULL_REQUEST is defined.
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
Bourne Shell から使えるデフォルト値記述なら、Bash v3 系でも希望の動作になりました。
```sh
#!/bin/sh -eu
if [ "${CIRCLE_PULL_REQUEST:-unknown}" != unknown ]; then
echo 'CIRCLE_PULL_REQUEST is defined.'
else
echo 'CIRCLE_PULL_REQUEST is NOT defined.'
fi
```
CIRCLE_PULL_REQUEST が未定義なら、左辺は "unknown" になります。この変数には整数の文字列しか入らないという前提に依存しています。つらい。
結果。
```
$ ./d.sh
CIRCLE_PULL_REQUEST is NOT defined.
$ CIRCLE_PULL_REQUEST=123 ./d.sh
CIRCLE_PULL_REQUEST is defined.
```
シェバンを /bin/sh に出来たので、自己満足にはなりました。
by なるべく Bourne Shell 記法で書きたい奴
※ macOS High Sierra では sh の実体は bash です。
```
$ which -a sh
/bin/sh
$ ls -alF /bin/sh
-r-xr-xr-x 1 root wheel 618512 Oct 26 2017 /bin/sh*
$ sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.
```
## 蛇足
-e も合わせて使うことが多いです。→ '#!/bin/sh -eu'
シェルスクリプトの途中で exit code が 0 以外のプロセスがあれば、即座に停止してくれます。
さらに蛇足ですが、シェバンにセットすると処理系によっては解釈されないらしい(Windows?)ので、
```sh
#!/bin/sh
set -eu
```
などと、set を使うとポータビリティの高いシェルスクリプトになります。面倒なので私はシェバンに書いてしまいますが...。
**追記(2018-10-22):**
前提が説明不足だったので、全体的に補完しました。
--------------------------------------------------------------------------------
title: "<ネタバレなし>オクトパストラベラーを完全にクリアーした"
date: "2018-09-24"
--------------------------------------------------------------------------------

http://www.jp.square-enix.com/octopathtraveler/
135 時間で完全にクリアーしました。ネタバレ回避のために「完全に」の
詳細は書きません。
最後はこんな状態でした。
・主人公はプリムロゼ
・レベルは全員 76(最後なぜか頑張ってプリムロゼに合わせた)
・アビリティは全部覚えたキャラもいるし、もう少しのキャラもいる
・全キャラのメインストーリーは全部クリア
・サブストーリーも全部クリア
おっさんホイホイのゲームには以前『レジェンド オブ レガシー』に痛い
目にあったので警戒はしてましたが、プロデューサーがブレイブリーデフォ
ルトの浅野さんということで、期待を込めて購入しました。
結果的に大正解。久々に 100 時間超えて且つ、クリアー出来たゲームと
なりました。Switch で初めてクリアーできたよ。ゼルダもゼノブレイド
2もクリアーしてない(涙)
自分に合った理由を考えると、こんな感じです。
・スキルにある程度制限がある
・ストーリーが複雑でない
・ドット絵による脳内補完
・極端に難しくも易しくもない難易度
バトルシステムがなかなか良くて、それほど多くのスキルや自由度がない
中で、どのように強敵を撃破するか考えるのはなかなか楽しかったです。
私が元組み込みエンジニアというのも関係するのかな?
そういう意味では、ブレイブリーデフォルトは少々持て余してました。
(だいぶ好きなゲームですがね。Switch に移植して欲しい!)
ストーリーが良い意味でチープだったのも良かったです。最近はあまりに
複雑だと覚えられない...。ドット絵なので、「実際はこうかな?」と脳
内補完するので問題ないです。小説のよう。
難易度もちょうど良かったですね。強い武器防具を[リセマラ](http://dic.nicovideo.jp/a/%E3%83%AA%E3%82%BB%E3%83%9E%E3%83%A9)で盗ったりし
ましたが、それでもだいぶ苦労させられました。サブストーリーで油断し
てたら、あっさり全滅されられたりもしたなあ...。
攻略サイトを見たのは終盤の終盤。見なくても割といけました。
一方で UI はあまり洗練されていませんでした。
・Y ボタンのヘルプがうざい。よりによって真下のメニューが見えない
・← →で画面スクロールできることがどこにも書かれていない(終盤で知った・・・)
・イベントでボタンポチポチ必要。自動進行なし
・他多数
MVP(Minimum Viable Product)的に作ったのだと、良い方向に解釈して
います。
ブレイブリーデフォルトは 3 が出たとして、ストーリーのつなぎ方が難
しいと思います。でもオクトパストラベラーはシステムだけ揃えてストー
リーは別にすれば良いと思うので、そういう意味では現段階では展開はや
りやすそう。期待しています。
オクトパストラベラーにはだいぶ時間を割いたので、しばらくゲームから
は離れる予定です。次はどんなゲームをやるのだろう?
OCTOPATH は造語で、各キャラの頭文字を取ったものでもあります。地図
上でオフィーリアから時計回りの順。
{{< tweet user="masutaka" id="1042063232616165376" >}}
ネタバレですが、他にも面白い逸話がいくつかありました。クリア後に見
ると良いと思います。
{{< youtube "upt-1n0ixXQ" >}}
サントラも(iTunes で)買ったよ。これもオフィーリアからの順になっ
てる。ボスバトル2が厨二的に神。同じ程度で最後のバトルも神。
※ 安全のためにまだクリアしてない人は見ないほうが良いと思います。
{{< amazon asin="B07C53MXBW" title="OCTOPATH TRAVELER Original Soundtrack" >}}
{{< amazon asin="B07BBMRD77" title="オクトパストラベラー - Switch" >}}
{{< amazon asin="B01NCXFWIZ" title="Nintendo Switch 本体 (ニンテンドースイッチ) 【Joy-Con (L) ネオンブルー/ (R) ネオンレッド】" >}}
--------------------------------------------------------------------------------
title: "家電操作を IRKit から Nature Remo に変えた #natureremo"
date: "2018-08-19"
--------------------------------------------------------------------------------
https://rebuild.fm/209/ を聞いたら、なんとなく購買意欲が湧いて買ってしまいました。[会社の MVP 賞](https://developer.feedforce.jp/entry/2018/06/15/130000)で頂いた Amazon ギフト券のそこそこ有意義な使いみちを探していたという事情もあります。
[IRKit](http://getirkit.com/) は {{< post "2015-12-19-1" >}} から便利に使っていて、[Nature Remo](https://nature.global/) が出たことも知っていましたが、IRKit の 2 倍の値段は高いなーと見送っていました。
結果的に非常に満足しています。せっかくなので少し前に出た Nature Remo mini ではなく、Nature Remo を買いました。
※ Nature Remo mini は主にセンサーが省かれた廉価版です。 https://nature.global/ の下の方に Nature Remo との比較があります。
¥14,040 の価値があったかはまだ微妙ですが、今後アップデートしていくそうなので、期待してます。
それにしても typester さんが Nature, Inc. の CTO になっていたのは知らなかった。
## 使い方
エアコン、テレビ、照明に対して、こんな使い方をしています。
### Google Home mini 経由での操作例
「ねぇ Google、冷房を 25℃ にして(Google Home mini → Nature Remo)」
「ねぇ Google、明かり付けて(Google Home mini → Nature Remo)」
「ねぇ Google、おはよう(Google Home mini → IFTTT → Nature Remo)」
→ テレビと照明がつく。最近追加されたシーンを使って、一つのトリガーから複数の操作をしている。
### iPhone の Remo アプリで操作
このように設定しました。テレビのボタン登録は頑張りました。IRKit の時と比べるとだいぶ楽です。
  
### 位置情報や時間をトリガーに操作
「自宅 500m 以内に近づいたら、エアコンを付ける」
位置情報を使ったトリガーは IRKit の時はだいぶ頑張る必要があり、そこまでモチベーションがなかったので設定していませんでした。試しに設定したところ、帰宅前に付け忘れることがなくなり、だいぶ便利です(通知されるので付いたことは気づくことができます)。消す操作も自動化できますが、500m 付近をウロウロしている時に付いたり消えたりしても微妙なので、今は付ける操作だけ登録してます。
「AM 0:00 に照明を省エネにする」
早く寝るため。早く寝れているとは言っていない...。
## 所感
やはり IRKit と比べて、エアコンのリモコンがプリセットされているのが良いです。現在稼働中かどうかや、気温や湿度も分かるのは安心できます。
テレビもそのうち対応されるのかな。今はテレビが消えた状態で「ねぇ Google、テレビを消して」と言うと付いてしまうので。新しいエアコンが出るたびに、リモコンだけを購入して人力で対応しているそうなので、テレビも対応となるとだいぶ大変そうですが...。
試しにテレビ、エアコン、照明のリモコンを全部しまって生活してます。正直、リモコンのほうが便利なときもありますが、机の上がごちゃごちゃしなくなったのは良いです。
IRKit で必要だった Web API が使えなくなり、エンジニアでなくても設定が簡単になったのも良いです。反面、細かいことが出来なくなりましたが、Google Home mini や IFTTT から必要な操作ができるので、今のところ困っていません。
単一の操作であれば、IFTTT が不要になったのも良いです。時間をトリガーにした連携も Nature Remo で完結できます。Google Home mini からの操作も IFTTT を介さないので、反応が早くなりましたし、変な不安定さもなくなりました。
Google Home mini 連携は少し分かりづらかったです。重要なのは https://nature.global/jp/faq/032 とアイコンを揃えることみたいです。ボタンの名前はなんでも良かったです。各家電の名前は Google Home mini との会話で使います。例: 「ねぇ Google、テレビ付けて」
参考: [スマートスピーカー連携 — Nature](https://nature.global/jp/smart-speaker/)
## まとめ
Nature Remo は予想以上に良いガジェットでした。
特に Google Home mini や Amazon Alexa をお持ちの方はオススメです。結構持て余しているのではないでしょうか?(私は Google Home mini を Nature Remo にしか使っていない...)
あ、Nature Remo mini が当たるキャンペーンを 2018/8/31 までやっているみたいですよ。
{{< tweet user="NatureIncGlobal" id="1029312760515969024" >}}
設置(?)した様子。付属の粘着テープで壁に貼り付けたが、数日後剥がれてしまった...。

{{< amazon asin="B06XCQFP96" title="Nature Remo" >}}
{{< amazon asin="B07CWNLHJ8" title="スマートリモコン Nature Remo mini【Amazon Echo/Google Home対応】" >}}
--------------------------------------------------------------------------------
title: "Ruby でライブラリがシステムに存在しているかどうかをチェックする"
date: "2018-07-31"
--------------------------------------------------------------------------------
```
require 'mkmf'
have_library('pq')
checking for main() in -lpq... yes
=> true
```
[mkmf.rb を読んだところ、C++ のコードを生成してチェックしていた。](https://github.com/ruby/ruby/blob/v2_5_1/lib/mkmf.rb#L741-L797)
[Kernel.have_library のコードはこちら。](https://github.com/ruby/ruby/blob/v2_5_1/lib/mkmf.rb#L986-L1012)
カレントディレクトリに mkmf.log が作られるが、これを防止するには
以下で良いみたいだ。
```
MakeMakefile::Logging::logfile('/dev/null')
```
ネット上には以下のコードがあったが、mkmf.rb を読んだら上でいけた。
```
MakeMakefile::Logging::logfile('/dev/null')
module MakeMakefile
module Logging
@logfile = '/dev/null'
end
end
```
参考情報
[instance method Kernel#have_library (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/2.5.0/method/Kernel/i/have_library.html)
[Module: MakeMakefile (Ruby 2.5.0)](http://ruby-doc.org/stdlib-2.5.0/libdoc/mkmf/rdoc/MakeMakefile.html)
--------------------------------------------------------------------------------
title: "エニタイムフィットネスに通うことにした"
date: "2018-06-30"
--------------------------------------------------------------------------------
最近、人生最高の体重を記録し、腹の肉もヤバく、駅の階段の上りで軽く
息切れがする。危機感を覚えているので、ジムに通うことにした。
選んだのは自宅からまあまあ近い[エニタイムフィットネス](https://www.anytimefitness.co.jp/)。
近いと行っても徒歩 10 分弱なので、個人的にはやや遠い部類。
数年前に通っていた{{< tag "クイックシェイプ" >}}は徒歩 3 分だったので、毎日通え
ていた。近さ重要。
ジムに通うのは実に 2 年 4 ヶ月ぶり。近所にもっと近いジムがあるんだ
けど、なんだか合わなくて半年ももたなかった。その前は会社の人と週一
でコナミに通っていたけど、会社の引っ越しで遠くなって行くのを止めて
しまった。
今までジムに通ってダイエットに成功したことがないので、今回はパーソ
ナルトレーニングをお願いした。以前筋トレを適当にやっていたら、筋を
痛めて病院に通うハメになったので、その防止も兼ねて。
とりあえず 5 回分で¥25,920。1 回 1 時間。週一でお願いする予定。
エニタイムの基本料金は月額¥6,998。会社で¥4,000の補助が出るような
ので、実質¥2,998かな。新三河島店は土足 OK なのはうれしい。
結果を出せるように頑張ります。
--------------------------------------------------------------------------------
title: "Rails4 と Rails5 とでの eager_load_paths の違い"
date: "2018-05-26"
--------------------------------------------------------------------------------
Rails4 と Rails5 とで eager_load_paths の内容に差異があることを知
りました。
Rails5 では app 以下の全ての concerns ディレクトリや channels ディ
レクトリが追加されています。
以下、Rails4 と Rails5 とで実装箇所を追ってみました。
## Rails-4.2.10
eager_load_paths を返すメソッド
[Rails::Engine::Configuration#eager_load_paths](https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails/engine/configuration.rb#L78-L80)
↓
eager_load_paths の構築開始。Rails5 と違いあり
[Rails::Engine::Configuration#paths](https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails/engine/configuration.rb#L38-L72)
↓
[Rails::Paths::Root#add](https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails/paths.rb#L58-L61)
↓
[Rails::Paths::Path#initialize](https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails/paths.rb#L114-L124)
↓
[Rails::Paths::Path#eager_load!](https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails/paths.rb#L143-L145)
ここまでで eager_load_paths の構築完了
↓
[Rails::Paths::Root#eager_load](https://github.com/rails/rails/blob/v4.2.10/railties/lib/rails/paths.rb#L87-L89)
結果を返す
## Rails-5.2.0
eager_load_paths を返すメソッド
[Rails::Engine::Configuration#eager_load_paths](https://github.com/rails/rails/blob/v5.2.0/railties/lib/rails/engine/configuration.rb#L75-L77)
↓
eager_load_paths の構築開始。Rails4 と違いあり
[Rails::Engine::Configuration#paths](https://github.com/rails/rails/blob/v5.2.0/railties/lib/rails/engine/configuration.rb#L37-L69)
↓
[Rails::Paths::Root#add](https://github.com/rails/rails/blob/v5.2.0/railties/lib/rails/paths.rb#L59-L62)
↓
[Rails::Paths::Path#initialize](https://github.com/rails/rails/blob/v5.2.0/railties/lib/rails/paths.rb#L115-L125)
↓
[Rails::Paths::Path#eager_load!](https://github.com/rails/rails/blob/v5.2.0/railties/lib/rails/paths.rb#L148-L150)
ここまでで eager_load_paths の構築完了
↓
[Rails::Paths::Root#eager_load](https://github.com/rails/rails/blob/v5.2.0/railties/lib/rails/paths.rb#L87-L89)
結果を返す
## まとめ
Rails の eager_load_paths を調べました。app 以下が再帰的に追加され
るだけかと思ってましたが、調べたら凝ったことをしていました。config
以下も追加されるのも、なるほど...といった感じでした。
なお、eager_load は本番環境では通常有効にしないので、以上は開発環
境の話です。
念のためですが、現在の Rails は autoload_paths は非奨励ですので、
ご注意を。
参考情報:
- [マルチスレッド環境下での「RuntimeError: Circular dependency detected while autoloading constant xxxx」を解消した話 - Qiita](https://qiita.com/tjnet/items/cecf9eae6e34a057e4d8)
- [Rails5: production環境でのAutoloadの廃止 - Qiita](https://qiita.com/joooee0000/items/3ab0f3d791e0d0beb639)
--------------------------------------------------------------------------------
title: "Ruby で FTPS 接続する方法"
date: "2018-05-26"
--------------------------------------------------------------------------------
まずは情報の整理から。
|種類|暗号化なし|暗号化あり
|---|---|---
|HTTP|HTTP|HTTPS
|FTP|FTP|FTPS
混乱しやすいが、SFTP は SSH を使って暗号化・認証を行うプロトコルで FTPS とは別。
* HTTP のセキュア版が HTTPS
* FTP のセキュア版が FTPS
と覚えると良いだろう。
## サンプルコード
FTP の SaaS である [BrickFTP](https://brickftp.com) にアカウントを作った。
`Net::FTP` で接続可能。以下は FTPS 接続し、PWD を発行する Ruby コード。password はマスクしている。
```ruby
#!/usr/bin/env ruby
require 'net/ftp'
ftps = Net::FTP.new(
'masutaka.brickftp.com',
ssl: true,
username: 'masutaka@example.com',
password: '********',
debug_mode: true,
)
puts ftps.pwd
```
結果。
```
connect: masutaka.brickftp.com, 21
get: 220 Service ready for new user.
put: AUTH TLS
get: 234 Command AUTH okay; starting TLS connection.
put: PBSZ 0
get: 200 Command PBSZ okay.
put: PROT P
get: 200 Command PROT okay.
put: USER masutaka@example.com
get: 331 User name okay, need password for masutaka@example.com.
put: PASS ********************************
get: 230 User logged in, proceed.
put: TYPE I
get: 200 Command TYPE okay.
put: PWD
get: 257 "/" is current directory.
/
```
`ssl: true` を外せば、FTP 接続になる。BrickFTP の管理画面から、SSL 必須という設定を OFF にする必要はある。
## 補足
Ruby-2.4.0 から Net::FTP.new で :ssl オプションがサポートされた。
→ [当該 commit](https://github.com/ruby/ruby/commit/eb8c73adbccb1b87269f78c300ea08ffd08e44c4)
Ruby-2.3 まではサポートされてなかったため、[double-bag-ftps gem](https://github.com/bnix/double-bag-ftps) などを使う必要があったらしい。
[`:ssl` オプションのパース処理はここ](https://github.com/ruby/ruby/blob/v2_5_1/lib/net/ftp.rb#L223-L229)。true の代わりにハッシュを渡せば、SSL 関連の任意のパラメータを設定可能。
[SSLContext#set_params のマニュアル](https://docs.ruby-lang.org/ja/2.5.0/class/OpenSSL=3a=3aSSL=3a=3aSSLContext.html#I_SET_PARAMS)に利用可能なパラメータが書いてある。
## 関連
* [class Net::FTP (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/2.5.0/class/Net=3a=3aFTP.html)
* [SSLContext#set_params のコード](https://github.com/ruby/ruby/blob/v2_5_1/ext/openssl/lib/openssl/ssl.rb#L125-L147)
--------------------------------------------------------------------------------
title: "AirMac Extreme から Buffalo のルータに変えたらインターネット速度が 45 倍以上になった"
date: "2018-04-30"
--------------------------------------------------------------------------------
TL;DR プロバイダは @nifty、ルータを交換しただけでプロバイダとの契約は結果的に変える必要なかった。あと、デメリットもあるよ。
## Before
先月までとにかく遅かったです。Download が 1 Mbps の時もありました...。
{{< tweet user="masutaka" id="908313033100763137" >}}
[AirMac Extreme](https://www.apple.com/jp/airmac-extreme/) を使ってました。Time Machine 便利ですからね。
{{< amazon asin="B00DCM55A8" title="APPLE AirMac Extreme ME918J/A" >}}
## After
めちゃめちゃ速くなりました。ほぼ 100 Mbps 以上をキープしています。
{{< tweet user="masutaka" id="980817322284785666" >}}
BUFFALO の [WXR-1901DHP3](http://buffalo.jp/product/wireless-lan/ap/wxr-1901dhp3/) を購入し、手順通りにセットアップしただけです(※)。
{{< amazon asin="B06VVHPHKM" title="BUFFALO WiFi 無線LAN ルーター WXR-1901DHP3 11ac 1300+600Mbps 4LDK 3階建向け 【iPhone8/X対応】" >}}
セットアップの時に @nifty の ID とパスワードを聞かれなかったのに、インターネットに接続できてしまったのは気になりました。
※ 実際は後述の「soplog(そぷログ)」の記事と同じように「IPv6接続オプション」を解約して「v6プラス」を契約しました。でも、@nifty との契約は元の「IPv6接続オプション」に戻ってしまいました。この辺理解不能。
## なぜ速くなったのか?
BUFFALO のルータに変えたことで、v6プラス接続を使えるようになり、プロバイダが変わったためのようです。
AirMac Extreme でこれが出来なかったのは、v6プラス接続(IPv6 IPoE + IPv4 over IPv6 ?)は国際基準ではないからだそう。
http://ipv6-test.com/ によると以前は Infoweb でした。

現在は JPNE に変わっています。

※ 以前が Infoweb だったのは、私が Infoweb から @nifty への移行組だからだと思います。
正直、プロバイダが変わってしまっては、えぇ...という感想しか持てません。でも、Infoweb だとこれから話す IPv6 IPoE で接続することが出来ないため、JPNE に切り替わるみたいです。
以下の記事が大変詳しいです(アフィリエイトっぽくて怪しいけど詳しいは詳しい)。
[IPv6対応で速くなる?「IPv6 IPoE + IPv4 over IPv6 接続サービス」って何者?【v6プラス/IPv6高速ハイブリッド IPv6 IPoE + IPv4/transix】](http://xn--54qx9kpt2b.tokyo/about_IPv6_IPoE/IPv6_IPoE_IPv4.html)
接続方法はおそらく、このように変わりました。
* 以前: IPv4 PPPoE
* 現在: IPv6 IPoE + IPv4 over IPv6
昔のメールを検索したら、どうやらうちは「フレッツ光ネクスト」のようです。契約直後から何もしなくても IPv6 アドレスが割り当てられるそうで、それを認証情報として使うため、@nifty の認証情報は要らないみたいです(そうなのか)。
## デメリット1
Time Machine が使えなくなりました。
以前は AirMac Extreme に USB HDD を繋いで、Time Machine のディスクとして使えていました。HDD は「MacOS 拡張(ジャーナリング)」でフォーマットしていました。
でも BUFFALO WXR-1901DHP3 は Fat32 か XFS でフォーマットした HDD しか認識しないため、出来ません。Time Machine は「MacOS 拡張(ジャーナリング)」でフォーマットした HDD である必要があるみたいです。
しかたがないので、こちらを購入しました。
{{< amazon asin="B00YCAO2J4" title="BUFFALO リンクステーション スマホ・タブレットで使える ネットワークHDD(NAS) 2TB LS210D0201C" >}}
{{< wikipedia word="Apple_Filing_Protocol" text="AFS" >}} を有効にすることで、Time Machine のディスクとして使うことが出来ます。
## デメリット2
オンラインゲームが出来なくなった可能性があります。
PS4 の「設定→ネットワーク→インターネット接続を診断する」に進むと、NAT タイプが「失敗」になり、時間内にサーバーに接続できなかった旨のエラーメッセージが表示されます。
以前は NAT2 だった気がします。
今は困っていませんが、これ結構大きな問題ですね...。
## 参考になったサイト
:link: [IPv4からIPv6もといv6プラスへ回線を変更した話|soplog(そぷログ)](http://soplog.skr.jp/web/ipv4-goodbye.html)
私と同じ @nifty で変更した話です。この記事を見て、WXR-1901DHP3 を購入しました。しかしなぜこの方は IPv6 接続できているのか...。
私もこの方と同じように「v6プラス」を契約するために「IPv6接続オプション」を解約して「v6プラス」を契約しました。私も「IPv6接続オプション」のみの契約になりました。
ルータが届いてすぐに接続した時、十分速かったので、多分私は何もしなくてよかったと思う。
一体私は何を言っているのか...。
:link: [自宅のインターネット回線をIPv6 IPoE + IPv4 over IPv6化して通信速度のボトルネックを解消する - 酔人日月抄](http://blog.hisway306.jp/entry/2017/12/29/140000)
この方は BIGLOBE を使っている。
:link: [IPv6接続で高速化した話 - WXR-1900DHP3とAirMacTimeCapsule利用に。](http://sotolog.com/mac/ipv6-wxr-1900dhp3/)
この方は So-net。WXR-1900DHP3(※)はルータ機能と有線のみ、Time Capsule を Time Machine と無線 LAN アクセスポイントに使っている。
※ WXR-1901DHP3 との違いは型番だけみたいです。
:link: [てくろぐ: 【試してみた】IPv6「ネイティブ接続」](http://techlog.iij.ad.jp/archives/210)
IIJ のエンジニアによる公式 blog です。v6プラス(IPv6 IPoE)で認証が要らない理由が説明されています。
:link: [IPv6接続オプションのご案内 : @nifty](http://csoption.nifty.com/ipv6/option/)
:link: [v6プラスのご案内 : @nifty](http://csoption.nifty.com/ipv6/)
それぞれ、一番下の「お申し込み状況の確認・解除」から現在の契約情報が分かる。この辺の分かりづらさは、前述の soplog(そぷログ) が詳しい。
v6プラスは「未契約」と出ているのに、「お申込み」をクリックすると「v6プラスをすでにご利用中の方は、お申し込みいただくことができません。」というエラーになるとか、本当意味不明。
:link: [IPv4/IPv6接続判定ツール](http://kiriwake.jpne.co.jp/)
[BIGLOBE にも同じものがある](http://ipv6check.biglobe.ne.jp/)。なんで?
:link: [IPv6通信にNDプロキシを指定すると安全になるとはどういうことか - Qiita](https://qiita.com/sumomoneko/items/fa56737f97beff3566f3)
IPv6 パススルー危険という記事。ググると、IPv6 パススルーにしたという記事が良くヒットする。
今回は Buffalo のルータに任せたら勝手に「NDプロキシ」になった。
## まとめ
* 結果的にルータを変えただけで、インターネットが速くなった
* それなりの出費が発生した
* オンラインゲームが出来ないのは今後大きな問題になるかも
こんな難しいの、普通の人絶対無理でしょ...。
## その他
この 1 ヶ月で 2 回ほど、朝起きたらネットに繋がらなくなっていました。最近は発生していないので、しばらく様子を見ます。
WXR-1901DHP3 に HDD を繋いでいた時に USB 3.0 を有効にしていたからかも?
ヘルプによると
> USB3.0で動作させると、USB3.0の高周波ノイズの影響で電波が干渉し、2.4 GHz(11b/g/n)が繋がりにくくなることがあります。
とのこと。
全体的に「だそう」ばかりで申し訳ない。
**追記(2018-09-24):**
USB 3.0 を無効にしても同じだった。同じ頻度で突然繋がらなくなり、電源 OFF/ON を余儀なくされる。人に勧められるルータではないな。
**追記(2019-04-25):**
[Amazon のレビュー](https://www.amazon.co.jp/product-reviews/B06VVHPHKM/)が荒れている...。私もとうとう我慢できなくなって、I-A DATA のルータに買い替えました。4/1 に買ってそろそろ一ヶ月。快適です。
{{< amazon asin="B07FTS23J3" title="I-O DATA WiFi 無線LAN ルーター ac2000 1733+300Mbps IPv6 フィルタリング デュアルバンド 3階建/4LDK/返金保証 WN-AX2033GR2/E" >}}
--------------------------------------------------------------------------------
title: "Twitter クライアントを Tweetbot に変えた"
date: "2018-03-23"
--------------------------------------------------------------------------------

今更ですが、Twitter クライアントを[公式](https://twitter.com/)から [Tweetbot](https://tapbots.com/tweetbot/mac/) に変更しました。
デフォルト厨なので、今までは頑張って Chrome で Twitter を見てました。
こんな理由からです。
- 未読位置を覚えているのがしんどい
- 未読位置まで移動するのがしんどい
- 溜まった未読位置から読むのに Chrome だと重すぎるので Firefox 開くのがしんどい
iOS 版も[公式アプリ](https://itunes.apple.com/jp/app/twitter/id333903271?mt=8)から [Tweetbot](https://tapbots.com/tweetbot/) に変更しました。
iCloud を使って、未読位置を macOS と iOS で同期してくれるのが大変
ありがたいです。公式アプリはスリープから復帰すると、リストから強制
的にホームに戻ってしまうのが最悪でした。
未読管理はどこまで正確なのかは少し気になります。
ストリーミング機能もだいぶ良いですね。[twittering-mode](https://www.emacswiki.org/emacs/TwitteringMode-ja) で便利だった
イメージがあります。
Twitter が以前サードパーティの締め出しをした時、各 Tweet のクライ
アント名が分からなくなりましたが、Tweetbot では表示されていました。
API からはまだ取れたのですね。
逆に公式のほうが良かった点も挙げておきます。
- IFTTT などの短縮 URL を展開されてサマリを表示してくれる
- 各 Tweet の詳細を見ないで Like 数 Retweet 数が分かる
- 投票?そんなのありましたっけ?
iOS 版は特に良かったことはないような。
Android は Twitter の使用頻度が低いので、公式アプリを入れています。
今までの Twitter クライアントの変遷はこんな感じです。
TwitterFox → twittering-mode → [Hootsuite](https://hootsuite.com/ja/) → twitter.com → Tweetbot
--------------------------------------------------------------------------------
title: "『ジョイ・インク 役職も部署もない全員主役のマネジメント』を読んだ"
date: "2018-03-19"
--------------------------------------------------------------------------------
{{< amazon asin="B01N12YJO4" title="ジョイ・インク 役職も部署もない全員主役のマネジメント" >}}
会社の若者がオススメしていたので、サラッと読んでみた。
つもりが、一ヶ月近くかかってしまった...。
ペアプロを始めとした XP(エクストリーム・プログラミング)を体現し
ている[メンローイノベーションズ](http://menloinnovations.com/)のお話。著者は CEO の Richard
Sheridan 氏。
[ソニックガーデン](https://www.sonicgarden.jp/)みたいな受託の会社なのかな?臓器移植情報システムや
ディーゼルエンジンの分析システム(?)など、内容は多岐にわたってい
るみたい。
とにかくアナログアナログアナログと言った感じで、デジタルツールはエ
ディタしかないのでは?という感想さえ覚えた。
本の中では Slack や GitHub の話は一切出てこない。メールやチャット
は使っていないっぽくて、全部口頭(本書では「高速音声技術」と名付け
ている)らしい。GitHub も使ってないのかな。VCS は何使っているんだ
ろう?
https://github.com/menloinnovations を見つけたが、リポジトリはなかった。
まあでも原著は 2013 年に出版されたらしいから、だいぶ変わったでしょ?
と思ったけど、今もだいたい同じみたい。マジか。
[ジョイ・インク (Joy, inc.) のメンローイノベーションズに行ってきた - kawaguti’s diary](http://kawaguti.hateblo.jp/entry/2017/08/15/095840)
ペアプロを毎日やるって、どういうメンタルなんだろう? 私はチームが
出来たての頃はコミュニケーションのために意識してペアプロをやるけど、
その後はほぼやらないなー。めっちゃ疲れるんだよね...。
ペアプロやっているとチャットを見る時間はなくなりがちだから、逆に相
性が良いのだろうか。アラートやデプロイ通知とかどうしているんだろう?
はぇ〜という感想しかなくて、正直参考にならなかった。
たぶん、ビジネスモデルとセットで考えないと、とてもじゃないけど同じ
ことは出来ないと思う。
ただ、スキルより文化を重視する点は大いに賛同した。採用面接はするこ
ともされたこともあるけど、スキルを重視しがちなんだよね。でも本当に
大事なのは会社の文化と合うかどうか。でもそこに全振りは強いな...。
国内で同じもしくは、似たことをやっている会社はあるのかしら?
以下、読書メモ。Kindle なのでページ番号じゃなくてロケーション番号。
> L921
> ケアリーは、自分はソフトウェアプログラマーだと言った。
分かる。私も Rubyist などと言わないようにしている。
> L1001
> メンローに来て日の浅いメンバーは、一日八時間仕事すると疲れ切ってしまう。
デスヨネー。最近はソロプロ(?)してても疲れ切っているけど。
> L1070
> 知識の塔が辞めるとなったとき、何十年もの知識の蓄積を最後の二週間で
> 少しでも引き継ごうとして、必死になる様子がよく見られる。
分かる。ことソフトウェアに関しては、引き継ぎ作業が発生する時点で、
何かがおかしい可能性はあると思う。
> L1187
> デイリースタンドアップはたいてい十三分以内に完了する。参加者が五十〜
> 六十人いるにもかかわらずだ。
全然わからないw
> L1302
> 数年前、昼食のあとから終業までの時間が、休憩なしでやるには長すぎる
> と感じたチームがいた。そこでチームは休憩を入れることにした。
ハードすぎやしませんか...?急に休みたくなることないのかな?
ペアプロやる時は 30 分に一度くらい休憩を入れないと無理だった。たま
に入れ忘れて疲れ切る。ああ、もしかしてドライバーとナビゲーターの役
割はそれほど頻繁に変えないのかな?
> L1460
> 「進み具合はどう?何やっているの?」などと聞いてきて仕事の邪魔をす
> るやつはいない。僕たちにそんな奴は必要ない。
そう。これは危険キーワード。
> L1482
> ペアがストーリーカードの作業を始めると、ペアの名前が書かれた列にあ
> るストーリーカードに、黄色のドットシールを貼る。
とにかくアナログ。物理。
> L1665
> (前略)職務経歴書は、何よりも大事である文化的マッチにはほとんど
> 関係がない。だから僕たちはたいして読もうともしない。
振り切ってますなー。
> L2406
> メンローでのリーダーシップは肩書きや地位にもとづくものではないんだ。
ほんこれ。
> L2892
> プロジェクトマネージャーをペアで続けるよう計画しています。
プロジェクトマネージャーもペア!
> L2919
> メンローを辞めたいと思ったら、いつでも転職先を探す手助けをするよと
> 周知するんだ。
これはすごい...。
> L2434
> 僕が知る最悪の文化は、誰も会社を止めない文化だ。低い離職率は健全な
> 文化の証ではない。
言い切った!
> L2959
> 遠隔地勤務を避けるのと同じ理由で、僕たちは一拠点で一つの部屋の会社
> にしている。
おー、リモートワークやってないんだ!
> L2976
> 僕はただ、遠隔地勤務を僕たちのプラクティスの一部にする方法について、
> 僕に残された日々の一部を費やさないというだけだ。
なるほど。そういう意見なのね
--------------------------------------------------------------------------------
title: "JAWS DAYS 2018 に行ってきた #jawsdays #jawsdays2018"
date: "2018-03-11"
--------------------------------------------------------------------------------

https://jawsdays2018.jaws-ug.jp
去年 {{< post "2017-03-12-1" >}} に引き続き、2回目の参加です。去年はなかった機
械学習のセッションが目立ちました。IoT のセッションも増えてました。
以下、自分用のメモです。
## [[DeepDive] コンテナでウェイウェイ(仮)](https://jawsdays2018.jaws-ug.jp/session/756/)
西谷さんが基本的なお話をして、Calvin さんが大規模事例を紹介、とい
う流れだった。
### by 西谷圭介さん
TODO: 資料が公開されたらここに貼る
西谷圭介さん/アマゾン ウェブ サービス ジャパン株式会社 技術統括本部 シニアソリューションアーキテクト
ECS と Fargate の基本的なお話。
今までの稼働実績を元に数ヶ月前に ECS と Fargate の SLA が 99.99%
に引き上げられたらしい。
これか。
[Amazon Compute サービスレベルアグリーメントを Amazon ECS および AWS Fargate に拡張](https://aws.amazon.com/jp/about-aws/whats-new/2017/12/amazon-compute-service-level-agreement-extended-to-amazon-ecs-and-aws-fargate/)
### by Calvin French-Owen さん
TODO: 資料が公開されたらここに貼る
Calvin French-Owen さん/米国 segment.io社, CTO and Co-Founder
segment.io 社の事例。そうとう規模が大きいらしい。
ちょっと前だけど TechCrunch の記事見つけた。
[複数(20あまり)のアクセス分析サービスのAPIを簡単に呼び出せるSegment.io|TechCrunch Japan](https://jp.techcrunch.com/2013/01/26/20130125yc-backed-segment-io-lets-developers-integrate-with-multiple-analytics-providers-in-hours-not-weeks/)
CPU や Memory Utilization によって Auto Scale Out/In する設定にし
てた。
監視はやはり Datadog だった。
## [「AWS Technical Evangelists Special talk session -スペシャルトークセッション AWSとユーザーコミュニティが生み出すNo borderな未来-」](https://jawsdays2018.jaws-ug.jp/session/1002/)
オススメとのこと。
[AWS Well-Architected – 安全で効率的なクラウド対応アプリケーション](https://aws.amazon.com/jp/architecture/well-architected/)
後日、書き起こし記事が公開された。
[【JAWS DAYS 2018】Technical Evangelist パネルセッション書き起こし|Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/jaws-days-2018-technical-evangelist/)
## [P3インスタンスではじめるDeep Learningと画像レコメンド](https://jawsdays2018.jaws-ug.jp/session/782/)
{{< speakerdeck "418b6143905c421ab72ce9e5b93f1256" >}}
河居 寛樹さん/株式会社DMM.comラボ ビッグデータ部 レコメンドチーム
杉 美帆さん/株式会社DMM.comラボ ビッグデータ部 レコメンドチーム
機械学習を使って、dmm.com の各商品ページのレコメンドを実装したお話。
- 以前: 似ているパッケージ画像の商品をレコメンド
- 現在: 絵のタッチによるレコメンド
どのイラストレーターに似ているかスコア(特徴量)を出力するとのこと。
docker ではなく [nvidia-docker](https://github.com/NVIDIA/nvidia-docker) を使うことで、機械学習用の環境を簡単
にセットアップできるらしい。
インフラ構成はそこまで難しくなくて、S3 に学習用データをアップロー
ドして、P3 インスタンスで処理している。
都度 S3 からダウンロードするのは無駄なので、EC2 インスタンス間のデー
タ共有に EFS を利用。Tokyo には来ていないので、海外リージョンで使っ
ている。
{{< tweet user="masutaka" id="972345745717080064" >}}
## [IoT時代におけるデバイスのファームウェアとクラウドのいい関係](https://jawsdays2018.jaws-ug.jp/session/988/)
{{< slideshare "is1JwAuZRsOqYL" >}}
松下 享平さん/株式会社ソラコム
先月は IoT 的なものをいじっていた {{< post "2018-02-12-1" >}} ので、なんとなく
聞いてみた。
[AWS Greengrass](https://aws.amazon.com/jp/greengrass/) 使うと、Lambda にデプロイした関数をローカル(IoT)
で動かせられるらしい。ローカル環境に GGC (Greengrass Core) をイン
ストールすることで、Lambda 関数の実行やデプロイが出来る。
ファームウェアの実装は C や C++ を使うことが多いけど、Greengrass
を使うことで Lambda で使える言語で実装が可能。
Python 等で書いた Lambda 関数から IoT 内の /dev/hoge にアクセスす
ることも可能。名前をつける必要はあるらしい。
Greengrass を使うことで何百台とかの IoT 機器にデプロイ出来るのも大
きなメリット。
いきなり Raspberry Pi とかで試す必要はなくて、今回のように
VirtualBox の Ubuntu で試すことが出来る。
Greengrass の罠としては、GGC が要求するスペックは IoT にしては割と
高いこと(CPU 1GHz, Memory 128 MB)。
満たせない場合は [Amazon FreeRTOS](https://aws.amazon.com/jp/freertos/) という選択肢があるが、正直人類に
早すぎるとのこと。なんとなく分かる。
Prota Pi の自動アップデート機能はどんな実装なんだろう?
{{< tweet user="masutaka" id="972355414800019456" >}}
## [Reusable serverless components accross Projects via Terraform](https://jawsdays2018.jaws-ug.jp/session/804/)
{{< slideshare "wrvsVW81dgoWbp" >}}
David Przybilla さん/[HDE](https://hde.co.jp/)
結構複雑な Terraform のモジュール構成と、CI で terraform plan して
結果を Slack 通知、Approve すると apply される仕組みの紹介。
{{< tweet user="masutaka" id="972369110834151424" >}}
## [LambdaとStepFunctionsを使った新しい負荷試験のカタチ](https://jawsdays2018.jaws-ug.jp/session/809/)
{{< speakerdeck "01c3d4b2311e45f1a88a3f2d17091f75" >}}
内海恵介さん/株式会社HAROiD リードエンジニア
AWS Lambda と [AWS StepFunctions](https://aws.amazon.com/jp/step-functions/) を使って負荷試験をしているお話。
ググったらこちらの記事がヒットした。
[StepFunctions で動的なワークフローを構築してお手軽負荷試験](https://techblog.haroid.io/dynamic-stepfunctions/)
負荷試験はやったことないけど、以前 Software Design で連載された
『クラウド時代のWebサービス負荷試験再入門』{{< post "2017-01-03-1" >}} によると、
攻撃元のサーバの調達など大変なことが多いみたい。
StepFunctions の使い方としては異例らしいが、自分としては理にかなっ
ているような気はした。
[HAROiD](https://www.haroid.com/) はテレビの投票サービスを提供している会社で、何時何分何秒だ
けにスパイクするなど、Web サービスとは全く違うらしい。しかも障害が
放送事故に直結するから、負荷試験が超大事とのこと。
セッションでは非公開で実際の番組や CM の紹介もしてくれた。
ちなみにテレビで使われる文字コードは EUC-JP らしく、StepFunctions
で変換しているとのこと。
今回実装した千手観音という内製ツールは OSS 化の予定があるというか
手伝ってくれる人を募集中とのこと。
## 付録
- [JAWS DAYS 2018 スライドまとめ - Qiita](https://qiita.com/DaisukeChiba/items/5e433c51c1ebb8ab97f2)
[ {{< tweets_on_the_day text="勉強会当日のツイート" day="2018-03-10" >}} ]
--------------------------------------------------------------------------------
title: "Raspberry Pi Zero W を Prota Pi 化する方法まとめ"
date: "2018-02-12"
--------------------------------------------------------------------------------
会社の留守電を自動的にセットする方法を考えていました。
ちょっと調べたら、[MicroBot Push](https://prota.info/microbot/push2/) というものを発見。

用途の割に $49.99 は高価ですが、興味もあり購入しました。
iOS アプリ [MicroBot](https://itunes.apple.com/us/app/microbot-push/id1094635156?mt=8) を使い、Bluetooth 経由でボタンを押すことが出来
ました。
{{< youtube "0Aqod-fAY5Q" >}}
この方法だと連携した iPhone を常に会社に置く必要がありますが、
[Prota S](https://prota.info/prota/s/) というハブがあればそれを回避できるとのこと。

しかし、$89.99 はいくらなんでもこの用途にはお高い...。
ここで登場するのが Raspberry Pi。[公式の情報](https://prota.info/prota/pi/)によると、Raspberry Pi
B, B+, 2, 3 を使って、Prota S 相当の Prota Pi を作れるらしい。
私が Raspberry Pi を買ったのははるか昔の 2013 年 11 月。
{{< post "2013-12-05-1" >}} という記事も書いていました。{{< wikipedia word="Raspberry_Pi" text="Wikipedia" >}} の情報も照ら
し合わせると、どうやら Model B のようです。ただし、Prota OS デフォ
ルトで使える Wifi と Bluetooth のドングルが必要。
心が折れそうになりましたが、たまたま職場の同僚が [Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/) を貸してく
れたため、これでチャレンジすることに。Zero W は $10 とお安い上に、
Wifi と Bluetooth も搭載されている、嘘みたいな機種です。

Zero W で Prota OS 動くよーという公式の記事を見つけました。もうや
るしかない。
[Prota OS is now available for Raspberry Pi Zero W! – Naran – Medium](https://medium.com/@naran/prota-os-is-now-available-for-raspberry-pi-zero-w-a19bd6b46276)
## 1. microSD カードに Prota OS を焼く
こちらの記事を参考にしました。
[Raspberry PiにProta Piをインストールしてボタンを押下する度にSlackに通知を送る。|ガジェシス](http://gadget-system.com/raspberry-pi/prota-switch)
ハマリポイント
・4GB の microSD カードでは Prota OS は起動しなかった。16GB なら起動出来た。[この記事](http://www.instructables.com/id/Cheapest-Smart-Home-for-38/)に **make sure to use a 16GB card** と書いてあったことで気づけた。次に書くように Prota はヘッドレス OS なので、そもそも「起動した」という判断が難しい...
・Prota はヘッドレス OS なので、HDMI に繋げても意味がない。キーボードも使えない。全ての操作はアプリ [Prota Space](https://itunes.apple.com/jp/app/prota-space/id1098630800?mt=8) から行う。セットアップ時にロゴが出てくるので騙された。何時間も待っていたよ...
・Prota Pi をネットワークに接続する時 AP モードになるそうだが、Zero W の LED は赤青に点滅しない。Prota S の話らしい
ハマっている様子。
{{< tweet user="masutaka" id="961981166088732673" >}}
{{< tweet user="masutaka" id="961986779204042752" >}}
SD カードアダプタの書込禁止のツメは UnLock しておきます。久しぶり
に使ったので、ツメがあること自体忘れていた...。
[Raspberry Pi 公式サイトに microSD カードへの焼き方が書かれている](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)の
で、参考にします。
macOS の場合は diskutil コマンドで microSD のデバイス情報が分かり
ます。以下の例だと /dev/disk2 です。これを間違えると、システム領域
や外付け HDD 等のデータを破壊することになるため、絶対に間違えては
いけません。
```
$ diskutil list
(snip)
/dev/disk2 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.5 GB disk2
1: Windows_FAT_32 boot 58.7 MB disk2s1
2: Linux 15.4 GB disk2s2
```
microSD カードに Prota OS を焼くために、マウントを外します。{N} は
上記の場合、2 です。
```
$ sudo diskutil unmountDisk /dev/disk{N}
```
dd コマンドで焼いていきます。bs オプションは[この記事](https://qiita.com/wf9a5m75/items/6bfea7a2b8c9658ce4fc)を参考にして、
最適値をセットすると良いかもしれません。私の環境では 64MB が最適値
みたいでした。
protapi_official_0_21_17112817.img は[公式サイト](https://prota.info/prota/pi/)からダウンロードし
た prota_pi.zip を解凍したものです。
```
$ sudo dd bs=64m if=protapi_official_0_21_17112817.img of=/dev/disk{N} conv=sync
```
dd が終わるとまたマウントされていました。取り外すために、マウント
を外します。
```
$ sudo diskutil unmountDisk /dev/disk{N}
```
Raspberry Pi Zero W に microSD カードを装着し、microUSB 経由で通電
すると、Prota Space アプリに Prota Pi を追加できます。

4GB の microSD カードでは、ここにどうしても進めず、大いに悩みまし
た。microSD カードは 16GB を使って下さい。
Wi-Fi に Prota-XXXX が見えて接続しても、追加完了までに 5 分程度か
かります。応答がないと思わずに、辛抱して待つ必要があります。
## 2. Prota Pi に MicroBot Push を追加
ハマリポイント
・前述の MicroBot アプリに MicroBot Push を登録していたら解除すること。解除しないと Prota Pi からの認証に失敗し、MicroBot Push を追加できない
ハマりました...。
{{< tweet user="masutaka" id="962552648938356736" >}}
## 無事成功!!
IFTTT をトリガーとして、Prota Pi 経由で Microbot Push を動かすこと
が出来ました。
{{< youtube "NOH-6dnGabs" >}}
この他に、ボタンが押されたら Slack にポストや、その逆も出来ました。
他にも [Alexa や Hue、Slack、Webhook などと連携できる](https://microbot.is/integrations/#)みたいです。
ネットに繋げると出来ることが増えますね。
{{< amazon asin="B06Y2V62KV" title="Naran マイクロボットプッシュ(2nd Generation) - ボタンを押してくれる超小型指ロボット" >}}
--------------------------------------------------------------------------------
title: "中華製スマートウォッチ Amazfit Bip を使い始めて 10 日ほど経った"
date: "2018-01-28"
--------------------------------------------------------------------------------
安くてダサすぎない CASIO の腕時計 {{< post "2016-09-19-1" >}} を使い始めて 1 年半弱。
悪くはなかったのですが、時々モードボタンが押されてしまい、画面がストップウォッチになっていることがストレスでした(時間を確認しようとして、あぁ...となる)。
https://rebuild.fm/196/ で宮川さんが Amazfit Bip という中華製スマートウォッチを絶賛していた(01:09:33 〜)ので、正月の帰省中にポチッと購入しました。
※ Amazfit という名前ですが、Amazon とも Fitbit とも関係ないです...。
10 日ほど使った結果、大変満足しています。私が {{< post "2016-09-19-1" >}} に書いた要望がほぼ満たされていました。

:link: [English Version Huami Amazfit Smartwatch Youth Edition](https://www.geekbuying.com/item/English-Version-Huami-Amazfit-Smartwatch-Youth-Edition-382249.html)
上記 geekbuying のサイトから PayPal で購入しました(さすがにクレジットカード登録はためらわれた)。PayPal には予め英語の住所も登録しておきましょう。でないと、私のように geekbuying から問い合わせが来てしまいます。
## 良いところ
- 画面は常時 ON。時計なのでこれ大事。右側のボタンを押すとタッチで操作できるようになる
- 安い。$59.99 で買えた。$125.99 だけど、今のところ常に 52% OFF の $59.99
- 送料無料。2018/1/2 に注文して 2018/1/17 に届いた
- バッテリーがめっちゃもつ。公称 45 日
- 悪くない外観。Apple Watch 的な見た目で Pebble 的な UI
- 防水(IP68)
- iPhone からの通知を全部受け取れる(デフォルト OFF)
- 常に心拍数を計測できる(デフォルト OFF)
- 自動的にスリープトラッキングしてくれる(デフォルト OFF)
- 1 時間ごとに立ち上がるように促される(デフォルト OFF)
[公式 iOS アプリ Mi Fit](https://itunes.apple.com/jp/app/mi-fit/id938688461) を使うと、すべての機能を ON に出来ます。
> Watch mode: About 4 Months
> Running mode: About 45 days
> GPS+running mode: About 22 hours
前述の geekbuying のページによると、バッテリー公称値は上記のとおりでした。機能を OFF にしたままだとバッテリーは 4 ヶ月もつみたいです。
防水の IP68 というのは、{{< wikipedia word="電気機械器具の外郭による保護等級" text="Wikipedia" >}} によると 6 が「粉塵が中に入らない(耐塵形)」を示し、8 が「継続的に水没しても内部に浸水することがない(水中形)」を示すそうです。
参考:
- [iPhoneやXperiaの防水・防塵性能「IP67」「IP65/IP68」ってどんな意味? – こまめブログ](http://little-beans.net/exposition/xperia-z3-ip65ip68/)
- [IP規格・防水保護構造及び保護等級](http://www.avccorp-jpn.co.jp/technicalguide/pdf/IP_2014.pdf)
## 悪いところ
- 公式 iOS アプリと初回 Sync するまでは中国語で、分からん...ってなる
- 公式 iOS アプリがやや分かりづらく、サードパーティアプリなど使わずにすべての機能を有効に出来ることに気づくのに時間がかかった
- 公式 iOS アプリを使った Sync にやや時間がかかる。バッテリーも結構使うかも
- 充電ドックへの装着は強い力が必要
- Apple Watch と比較すると全体的にチープ(仕方ない)
- いろいろ情報を抜かれそうな不安はある(偏見)
## まとめ
悪いところは挙げましたが、非常に満足しています。
今回がスマートウォッチ初体験です。改めて同僚の Apple Watch を見せてもらったところ、高級感がすごいのでちょっとだけ羨ましかったです。値段とバッテリーがアレなのと、画面が常時 ON ではないので、今のところ買うことはないと思いますが。
## 他の方の記事
[コスパ&電池持ちが最強なAmazfit Bipの実機レビュー|Till0196のぼーびろく](https://till0196.com/post697)
→ 開封の儀やレビューが丁寧。
[Xiaomi AmazFit Bip スマートウォッチ開封 & ファーストインプレッション](https://himagadmi.com/2017/09/04/post-6471/)
→ こちらも丁寧。さらにファームを日本語化したり、フェイスを自作したり、Google+ のコミュニティを作ったりしている。
**追記(2019-04-13):**
Amazon でも売り始めたようでした。¥7,999 と値段もそれほど変わりません。
{{< amazon asin="B07HG6LT8T" title="Amazfit Bip スマートウォッチ スマートブレスレット 1.28インチ 時計 心拍計 歩数計 IP68防水防塵 日本語アプリ Bluetooth接続 着信電話通知/Twitter/WhatsApp/Line通知/座りリマインダー (グリーン)" >}}
--------------------------------------------------------------------------------
title: "GitHub の通知はこうやって読んでる"
date: "2018-01-16"
--------------------------------------------------------------------------------
{{< hatenablog title="GitHub の通知を見直す - @kyanny's blog" url="https://blog.kyanny.me/entry/2018/01/12/010723" >}}
> さて、では通知をどうやって読むか?だが、原点にかえって GitHub の Notifications ページで頑張ってみたい。
私も何年も GitHub の Notifications ページをメインにしている。mention には絶対気づくし、周辺の情報もきちんと取捨選択が出来ていると思う。
## GitHub の Notifications ページ
> Notifications の良いところは、イシューや Pull Request の件名が一覧表示されるので、件名で仕分けできそうな点だ。
そうなんですよね。実はだいぶ使いやすいです。
まずは https://github.com/notifications を訪れて Participating をクリックし、自分宛ての mention を読む。初めから Participating を訪れても良いかもしれない。
その後に Unread をクリック。自分のチームや興味あるリポジトリの通知は、ブラウザのタブで開いて全部読む。その他のリポジトリの通知はタイトルやユーザだけ見て興味あれば別タブで表示、なければ Mark as read。リポジトリ単位で Mark as read することも多い。
## Watch リポジトリはしっかりメンテナンス
そういう意味では、Watch リポジトリはしっかりメンテナンスしている。会社のリポジトリは 80% くらいは Watch して、通知が多すぎるやつとかは Unwatch している。
ただ、GitHub 公式だと https://github.com/watching で Unwatch しか出来ない。
仕方がないので、以前 [GitHub Organization Watcher](https://github-organization-watcher.herokuapp.com) を作った。これは所属 Organization 単位でまとめて Unwatch/Watch/Ignore 出来るやつ。作りこんでなくてダサいけど、結構便利。
{{< github_repo "masutaka/github-organization-watcher" >}}
これでだいぶ捗った。
## Trailer.app
リアルタイムな通知は [Trailer.app](https://ptsochantaris.github.io/trailer/) でゆるく受け取っている。あくまで通知メイン。
PR/Issue menu は参考程度に使っている。チームに関係するリポジトリだけを表示。
--------------------------------------------------------------------------------
title: "2017 年にお金を払った購読型サービス"
date: "2018-01-03"
--------------------------------------------------------------------------------
{{< twitter "r7kamura" >}} さんの次の記事が良いと思ったので、暇つぶしがてら私も振り
返ってみた。
[2017 年にお金を払った購読型サービス – r7kamura – Medium](https://medium.com/@r7kamura/2017-%E5%B9%B4%E3%81%AB%E3%81%8A%E9%87%91%E3%82%92%E6%89%95%E3%81%A3%E3%81%9F%E8%B3%BC%E8%AA%AD%E5%9E%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-d3d7673d33b9)
## 継続しているもの
### GitHub
年額 $84。明らかに一年以上使うため、以前月払い($7)から年払いに変
更した。でもよく見たら値段変わらない...。次回更新の時に月払いに変えよう...。
### Amazon プライム
年額 3,900 円。Amazon MastarCard ゴールドカードを作れば無料になっ
たのか。そういえばそうだった気が。
### iCloud ストレージ
月額 130 円。50 GB プラン。
以前使っていた iPhone 6s では、どうしても Mac に完全バックアップで
きなかったので契約。その後 iPhone X にして {{< post "2017-11-18-1" >}} この問題
は発生しなくなったが、安いし、写真の iCloud バックアップは便利なの
で、そのまま契約している。
### Overcast
年額 1,000 円。iOS アプリ。以前は買いきりだったけど、年課金になっ
た。ほぼ『[Rebuild](https://rebuild.fm/)』と『[のぼりーさんのクラウドインフラ](https://cloudinfra.audio/)』のためだけ
に購読している。Overcast 使うと、SMART SPEED で違和感なく高速に聴
けるので便利。
### Inoreader
年額 $29.99。Plus プランを購読している。下の Starter プラン(年額
$14.99)でも良さそうだけど、以下の機能のリミットを外すために Plus
プランにしたっぽい。
- 自動 OPML バックアップ有効化
- Twitter フィードの数(1 → 30)
参考: https://www.inoreader.com/upgrade (要ログイン)
とは言え、Starter プランでも良い気がしてきた。次回更新時に下げよう。
少し前にキャンペーンやっていたので、同じ値段で 1 年半分購入できた。
{{< tweet user="masutaka" id="935125417706504192" >}}
ちなみに今もやってる。
{{< tweet user="masutaka" id="948433608569745408" >}}
以前は無料で Feedly 使っていたけど、Inoreader は GitHub の Private
フィードをフィルターできたり(※)、自分のリポジトリに Star が付い
た時に、Pushover で通知出来るので乗り換えた。巡回間隔を 120 分から
10 分に出来る Boost 機能もなんとなく使っている。
※ 会社のリポジトリは Watch したいけど、Private フィードには出して
欲しくない
フィードは macOS 上で [Reeder](http://reederapp.com/) 使って読んでる。
### Netflix
月額 702 円。あまり使ってないな...。月によるけど。
### さくらインターネット
さくらのVPSが年額 16,745 円、ドメインが年額 1,852 円。このブログの
維持費。
以前はミドルウェアをよくドッグフーディングしていたが、最近はそうで
もない。それに td-agent や elasticsearch を止めて、nginx しか動い
ていないので割高。次の更新までに乗り換えたいところ。
### GCP
td-agent 止めて BigQuery も使わなくなったので、今はゼロ。以前は月
額 $1 前後かかっていた。
### AWS
月額 $1 未満。過去の PC バックアップを Glacier に保存している程度。
不定期で技術調査する時は $1 を超えるときもある。
## 解約したもの
### Kindle Unlimited
月額 980 円。ダラダラと購読していたけど、10 月くらいに解約した。
そんなことより早く積読を処理せねば...。
### Atok Passport
月額 476 円 → 286 円と変遷。11 月から購読してただけ。
{{< post "2013-09-09-1" >}} に解約して二度目の復帰ならず。やっぱり Google 日本
語入力のほうが良かった。
{{< tweet user="masutaka" id="947077157439680512" >}}
### Spotify
月額 980 円。3 ヶ月くらい購読したけど、利用頻度が下がったので解約。
### マネーフォワード
月額 500 円。こうして振り返ると、値段相応の使い方(※[プレミアムサー
ビス機能比較表](https://moneyforward.com/pages/premium_features))をしていないことに気がついたので、さっき解約した。
## 雑感
都度考えて購読しているつもりだが、こうして並べると多かった。まさに
チリツモ。年に一回程度の振り返りは継続していく。リマインダーにセッ
トした。
考えすぎると「購読型サービス」の定義が難しい。CaSy {{< post "2015-12-27-1" >}}
は 2 年継続しているけど、物理だから除外しようだとか、プロバイダは
物理ではないから含めるべきか?とか(結局含めなかった)。
--------------------------------------------------------------------------------
title: "『Goならわかるシステムプログラミング』を読んだ"
date: "2017-12-31"
--------------------------------------------------------------------------------
{{< amazon asin="4908686033" title="Goならわかるシステムプログラミング" >}}
11 月から『Real World HTTP』{{< post "2017-11-28-1" >}} と同時に読んでいたのに、
読み終わったのが今日になってしまった。意外とボリュームあったのと、
あと少しで読み終えられたのに油断して読み進めなかったせい。
> 本書のもとになった ASCII.jp のウェブ連載では、この書籍(※)の内容
> とかぶらないように、実用性よりも低レベルの説明にフォーカスしたとい
> うのが実態です。
>
> ※『Real World HTTP』
P332 にこう書かれているように、『Real World HTTP』と一部内容が被る
ものの、低レイヤの話が大部分を占める。
一応私は組み込みエンジニア時代に open(3), ioctl(3), close(3) 等を
使ったデバイスドライバを書いたことがあるので(VxWorks だけど)、
ある程度想像力を働かせて読むことが出来た。
先の引用に書かれているとおり実用性は考慮されていないので、それを期
待すると期待はずれに終わると思う。あくまでエンジニアとしての知識を
深めるための技術書かと。
「第17章 Go言語とコンテナ」は面白そうだったので、あとで写経するかも。
以下、個人的なメモ。
> P98
>
> 最近では、RESTful の究極形態(第4形態)として位置づけられる
> HATEOAS という考え方も広まりつつあります。
> (中略)
> HATEOAS の原則に従った API を採用しているウェブサービスとしては
> GitHub があります。
『Web API: The Good Parts』{{< post "2015-04-09-2" >}} に書いてあったようだけ
ど頭に入ってなかった。Go言語は関係ない。
> P285
>
> Go言語の場合、ヒープに置くかスタックに置くかは、コンパイラが自動的
> に判断します。new で作っても、その関数内でしか利用されなければスタッ
> クに確保されます。ローカル変数として宣言しても、そのポインタを他の
> 関数に渡したり、関数の返り値として返すような場合にはヒープに置かれ
> ます。そのためGo言語では、「ローカル変数のポインタを関数の返り値と
> して返すと、呼んだ側からアクセスしに行ったときにはもうスタックのフ
> レームが巻き戻されて無効なメモリになっており、実行時エラーで落ちる」
> (中略)という C/C++ で起きるような問題は置きません。
> Go言語で、メモリがスタックとヒープのどちらに確保されているかを知り
> たい場合は、ビルド時に -gcflags -m を渡します。
C言語覚えたての頃、何度もハマったなあ...。
Go言語はコンパイラがだいぶ賢いね。その代償としてC言語よりはコンパ
イル時間が長いのだと思う。でも遅くないよね。
『スターティングGo言語』{{< post "2017-10-30-1" >}} にも書いてあったかもしれな
いけど、ここまではっきり書かれていなかったかも?
--------------------------------------------------------------------------------
title: "これまで試したダイエット7つを紹介する(※全部失敗)"
date: "2017-12-19"
--------------------------------------------------------------------------------
この記事は [feedforce Advent Calendar 2017](http://www.adventar.org/calendars/2155) の 19 日目の記事です。
18 日目はなべはるさんの『[ITベンチャー企業の人事が使っている SaaS
10選!](http://workplus.feedforce.jp/entry/2017/12/18/151932)』でした。なべはるさんは一日に食べるアイスと同じくらい SaaS
を活用していてすごいと思います!
昨年 {{< post "2016-12-14-1" >}} に引き続き、今年も生活に関する記事です。ダイエッ
トは皆さん興味があると思うので、とても有用な情報かと思います。
実際試して、結果的に全部失敗しています。この記事をアンチパターンと
して試せば、成功するのではないでしょうか?(えぇ..)
## 1. ヘルシア緑茶を 3 ヶ月間飲み続ける
川崎の平間に住んでいた頃なので、2004 年秋頃だと思います。
経緯は忘れましたが、ヘルシア緑茶を毎日 1 本、3 ヶ月間飲み続けまし
た。毎日バラで買うのは大変なので、近所の酒屋での箱買いです。
「ヘルシア緑茶飲んでいるからへーきへーき」と食事制限はしませんでした。
★結果: 何も変わらず。むしろ増えた記憶が。ヘルシア緑茶のようにほろ
苦い思い出です。
{{< amazon asin="B00B7W4K2O" title="[トクホ]ヘルシア 緑茶 350ml×24本" >}}
## 2. ジムに毎日通う
時は流れ、2010 年 9 月。それまで全く運動をしていなかったのに、急に
近所のジムに通い始めました。今は無きクイックシェイプというジムです。
最初の何ヶ月かは本当に毎日通っていて、行かないのはジムが休みの金曜
日と、たまの飲み会の日くらいでした。
これらの記事に意識高くまとまっています。
{{< post "2011-03-05-1" >}} {{< post "2011-03-05-2" >}} {{< post "2011-03-05-3" >}}
今でもなぜあそこまでやる気があったのか分かりません。
★結果: 意識が高くなりすぎて、新卒から 11 年在籍した会社を退職
{{< post "2011-04-22-1" >}}。スタートアップで社員第一号として働き始める。
ダイエットには失敗。
西明石に引っ越した 2011 年 4 月末まで、7 ヶ月間通いました。
## 3. 野々池貯水池でウォーキング
一階のダイニングキッチンがオフィス、二階の各部屋に若者と住んでいた
この家の近所には、ジムなんて便利なものはありません。あるのは田んぼ
くらいでした。
自転車でいけるくらいの距離に野々池貯水池があり、老若男女がジョギン
グやウォーキング、犬の散歩などをしていました。
当時は週に何度か通って、ウォーキングを 2〜3 周してました。一周 2km
だったかな?(当時は走るのが好きではなかった)
貯水池から見える山並みがきれいでした。写真を撮らなかったことが悔や
まれます。
★結果: 山並みに気を取られてダイエット失敗。
## 4. またジムに通う
西明石には 1 年ちょっと住んだあと、東京の下高井戸に戻ってきました。
ここにもなんとクイックシェイプの店舗がありました。
もうすぐに入会しましたね。当時の記事 {{< post "2012-07-29-1" >}} もテンション高
めです。
初めは意識が高かったのですが(カテゴリ:{{< tag "クイックシェイプ" >}})、徐々に
なんとなく低くなり頻度も減りました。
今思えば、パーソナルトレーニングとか使えば良かったです。
★結果: ジムに通う頻度が落ち、ダイエット失敗。
[全店舗が閉店](http://naokobanno.com/?day=20140709)する 2014 年 8 月まで、丸二年通いました。
## 5. 完全無欠コーヒーを毎朝飲む
社内でこの本が流行っていたので、勢いで読んで始めました。今回こそ成
功すると確信しましたね。
{{< amazon asin="B015S5545W" title="シリコンバレー式 自分を変える最強の食事" >}}
毎朝少し早く起きてドリップコーヒーを入れ、そこに大さじ2杯の MCT
オイルを入れます。あとは100均で買ったカプチーノ用ミキサーを使い、
こぼれないように慎重にかき混ぜれば出来上がりです。
{{< amazon asin="B013MW3B4Y" title="仙台勝山館 MCTオイル 360g" >}}
★結果: 午後にお腹が緩くなる原因がこれだと分かり、ダイエット中止。
なんだろう?なんだろう?と思っていましたが、試しに止めたら症状が治
まりました。体質的に合わなかったのでしょう...。社長はダイエットに
成功したようです。
当時の体重の推移を見ると、緩やかに下がっていたようにも見えます。

## 6. 舌回し運動を朝昼晩続ける
[カオスちゃんねる : 舌回し運動2ヶ月続けたらwwwwwwwwwwww](http://chaos2ch.com/archives/4242452.html)
・お肌すべすべ
・二重あご解消
・ほうれい線なくなる
とのことなので、今度も飛びついて試しました。ほうれい線はまだないけ
ど。朝昼夜と習慣づけするのが大変でした。
朝は家を出たらグリングリン。左右 20 回ずつです。ゆっくり回すことが
重要です。だいぶ顎が疲れます。
昼もご飯を買いに会社を出たらグリングリン。夜も退社したらグリングリ
ン。習慣になると忘れることはありません。不審者と勘違いされないよう
に、細心の注意を払いました。
裏技として、起きてすぐグリングリンすると眠気が完全に消えます。これ
はすごい。
★結果: 軽度の顎関節症になり無事死亡。試したのは 3 ヶ月弱でしたが、
変化なしです。滑舌も良くならなかった。
先々週から右顎関節が痛みだし、ご飯を食べる時にだいぶ痛みました。今
もあくびをすると痛むので、安心できません。タイミングよく行った歯医
者で適切にマッサージをすることを勧められました(顎関節症は歯医者か
口腔外科なんですね)。舌回し運動のことは言えていません。
## 7. エゴマオイルを毎日 5ml 摂取する
テレビで芸人がダイエットに成功していたため、今回も思考停止しながら
近所のスーパーで購入しました。
{{< amazon asin="B00455FH7W" title="紅花 荏胡麻油" >}}
完全無欠コーヒーで使った MCT オイルは味にクセがありましたが、エゴ
マオイルは問題ありません。
味噌汁に入れても、唐揚げにかけても良いです。なんだったらそのまま飲
むことも出来ます。継続はしやすいと思います。
★結果: 始めて 20 日ほど経ったが、今のところ特に変わりなし。まだ一
瓶空けてないから...。
## まとめ
家からちょっと歩いたところに 24H のジムがあるから通おうかな...。
明日の [feedforce Advent Calendar 2017](http://www.adventar.org/calendars/2155) は山ガール、優さんです。お楽
しみに!
--------------------------------------------------------------------------------
title: "『Real World HTTP』を読んだ"
date: "2017-11-28"
--------------------------------------------------------------------------------
{{< amazon asin="4873118042" title="Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術" >}}
HTTP の仕様を歴史から紐解く良書でした。
HTTP/0.9(!) から始まり、1.0, 1.1, 2、そしてセキュリティと網羅的に学ぶことが出来ます。個人的には HTTP/2 を雰囲気でしか理解していませんでしたが、分かった気になれた気がします。
↓ まえがき v から引用。
> 本書では次の二冊の間におさまる本として書いてきました。
>
> ・『Web API: The Good Parts』(オライリー・ジャパン 刊、水野貴明 著)
> ・『ハイパフォーマンスブラウザネットワーキング』(オライリー・ジャパン 刊、Ilya Grigorik 著)
これにピンときたら、読んだ方が良いと思います。『Web API: The Good Parts』は {{< post "2015-04-09-2" >}} に読みました。読み終わった後、何度も参照することとなった、とても良い本です。
一点、サンプルコードが Go 言語なので、好き嫌いは分かれるかもしれません。
それについて私は問題なかったのですが、『{{< amazon_link asin="4908686033" title="Goならわかるシステムプログラミング" >}}』と平行して読んでいたので、割と混乱しました(笑)。両方とも Go 言語で、内容が似た章もあり、作者さんも同じ渋川よしきさんです。
渋川よしきさん、どれほどの知識量なんや...。
以下、自分用のメモ。
P47
> ・プロクシ:通信内容を理解する。必要に応じてコンテンツを改変したり、
> サーバーの代わりに応答したりする
> ・ゲートウェイ:通信内容をそのまま転送する。内容の改変も許さない。
> クライアントからは途中に存在することを気づかれてはならない
P58
> 表2-3 スキーマの組み合わせとリファラーの有無
|アクセス元|アクセス先|送信するかどうか?
|---|---|---
|HTTPS|HTTPS|する
|HTTPS|HTTP|しない
|HTTP|HTTPS|する
|HTTP|HTTP|する
P92
> curl コマンドは複数のリクエストを並べて書くことで、Keep-Alive を使っ
> て複数のリクエストを続けて送ります。
> $ curl -v http://www.google.com http://www.google.com
P147
> (省略)Git では、転送用プロトコルとして SSH と HTTPS の2種類をサ
> ポートしています。実はこの HTTPS の中では WebDAV を使っています。
> SSH は暗号化した通信経路を使いますが、その中の通信はオリジナルの
> Git プロトコルを使っています。HTTPS であれば、どの WebDAV サーバー
> を使ってもホストできるため、セットアップが簡単というメリットがあり
> ますが、差分だけの転送が行える Git プロトコルのほうが通信速度はす
> ぐれています。
--------------------------------------------------------------------------------
title: "iPhone X 64GB SIM フリー版を買って一週間経った"
date: "2017-11-18"
--------------------------------------------------------------------------------
{{< post "2013-10-14-1" >}} に {{< wikipedia word="IPhone_5s" text="iPhone 5s" >}} 64GB、{{< post "2015-09-29-1" >}} に {{< wikipedia word="IPhone_6s" text="iPhone 6s" >}} 64GB、という流れで {{< wikipedia word="IPhone_X" text="iPhone X" >}} 64GB を購入しました(iPhone 4 と iPhone 4s も買ったけど記事を書いてなかった)。値段は忘却の彼方です...。
{{< tweet user="masutaka" id="929179060491522048" >}}
## 予約から入手まで
今回初めて予約開始日に予約しました。{{< post "2017-02-25-1" >}} に au から IIJmio に乗り換えたので、初めての物理店舗を介さずの購入です。
10/27(金)16:01 と同時に https://www.apple.com/jp/ にアクセスして予約成功。ストアを表示できるまで、5~10 分ほどかかりました。
自宅に届いたのは 11/11(土)の 11:00 過ぎ。予約時には「出荷は 2~3 週間」と出ていたので、予想より少し早かったです。そもそも予約前は年内に届くとは思っていなかったので、大満足です。
## セットアップ
SIM カードを別の機種に入れ替えるのは初めてだったので、内心ドキドキでした。
ですが、誘導されるがままに進めると、iPhone 6s と Bluetooth で繋いでからの最新の iCloud バックアップ作成から、iPhone X への復元など、必要なことを全部やってくれました。
事前に iCloud バックアップは済ませていましたが、念のためまたバックアップしました(あるある)。
Music や Movie は iTunes から同期しました。
今回は iTunes を使った完全バックアップからの復元は使いませんでした。この iPhone 6s はなぜか完全バックアップできず、途中でエラーになってしまうからです。
以前は Mac も iPhone も容量が足りてるのに容量が足りないエラー、今回は読み込みに失敗したエラーでした。謎です。他の Mac への完全バックアップも失敗したことと、あとで iPhone X の完全バックアップを試したら成功したので、この iPhone 6s 固有の問題だったんだと思います。
## 少しハマったこと
セットアップ完了して通話も問題なかったので外出したところ、ネットに繋がらず自宅に戻る羽目になりました。
Wifi に接続して IIJmio の構成プロファイルをインストールする必要があります。電話だけでなく、Wifi を切った状態での確認が必要でした。
## 使った感想
### Face ID
めっちゃ便利です。指紋認証にストレスを感じていたけど、ホームボタンを押すこともストレスだったことに気付かされました。
スワイプだけで「ロック解除」「ホームに戻る」「アプリ切り替え」が出来るのは本当に楽です。他の iPhone もそうすれば良いのに。
メガネのありなしは影響しませんが、横向きで寝ている体勢では解除できませんでした。
Face ID は失敗したあとのパスコードでのロック解除に成功すると、機械学習で Face ID を更新するそうです。どんどん賢くなっていくのかもしれません。
Face ID がないとロック画面上で通知の詳細が出ないのも良いです。顔を向けると詳細が表示されます。
### 有機 EL 液晶
滑らかな質感だと思いました。今までと違って、表示した状態でも黒いピクセルはバッテリーを消費しないそうです。へぇ。
### Apple Pay
iPhone 6s からの乗り換えなので、今回が Apple Pay デビューです。
今まで Pasmo カードを {{< amazon_link asin="B00C0VL0CO" title="Sinji Pouch Basic 2" >}} で iPhone に装着し、iD カードを財布に入れてましたが、ようやく iPhone に一本化できました。
と言いたいところでしたが、まだ Pasmo は iPhone に対応していないので、今回 Suica に変えました。
会社まで 4 駅と近いことが幸いしました。定期券を止めてもそれほど料金が変わらないため。
あと、よく調べずに物理 Suica を買ってしまいましたが、モバイル Suica から購入すれば必要なかったみたいです。
Visa もまだ対応していないので、Apple Pay 経由で Suica を購入することは出来ないみたいです。
## 課題
裸の iPhone X は、iPhone 6s + Sinji Pouch と比べると滑りやすいため、非常に怖いです(Sinji Pouch はザラザラしていたので、落とす心配がそれほどなかった)。
でも、¥22,800 の AppleCare+ に入れば画面損傷の修理は最大 2 回まで ¥3,400。入らなければ ¥31,800。
と考えると、入る必要は全くないか。
あと、カメラのレンズむき出し問題があります。iPhone 6s の時は Sinji Pouch を付けていたので、その厚みで自然と接地しませんでした。
今はレンズに傷が付かないように、自宅でも会社でもメガネ拭きの上に置いてます。いつまで続くかな...?
## 落ち穂拾い
Health Mate は歩数計の連携がなぜか切れたので、アクティベートし直しました。iPhone 6s で上った回数が記録されてなかったのは、そういうものだったのかしら?
ホームボタンで出来た操作はほぼ全部出来ますが、メモリクリア(※)は出来ません。でもそもそも非奨励だったみたいです。気にしないことにします。
* [iPhoneの強制リセットによるメモリクリアはApple非推奨、無反応時の「最後の手段」として案内|携帯総合研究所](http://mobilelaby.com/blog-entry-iphone-not-recommend-force-reset-for-memory-clear.html)
* [iPhone Xのメモリ解放のやり方を教えて下さい。iPhone 8までは電源を... - Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14181915224)
※「スライドで電源オフ」が表示されるまで電源ボタンを長押したあと、電源ボタンから指を離し、ホーム画面に戻るまでホームボタンを長押し
## まとめ
iPhone 6s から iPhone X に乗り換えて非常に満足しました。
ただ、スマフォにしては非常に高い買い物です。今後の iPhone はこれ以上高くならないことを祈ります...。
--------------------------------------------------------------------------------
title: "golang.tokyo #10 x WomenWhoGoTokyo に行ってきた #golangtokyo"
date: "2017-11-16"
--------------------------------------------------------------------------------
[golang.tokyo #10 x WomenWhoGoTokyo](https://golangtokyo.connpass.com/event/70162/)
[golang.tokyo #2](https://golangtokyo.connpass.com/event/44807/) 以来、久々に参加してきました。運営の皆様、ありがと
うございました。
MacBook Air を持っていくのが面倒になったので、リュウドの折りたたみ
キーボード {{< post "2010-11-15-1" >}} を引っ張り出して持っていたけど、机がなく
使うのは断念。でもその分、聞くことに集中できた気はする。
## テキスト審査 in Pairs
※ TODO: 資料が公開されたらここに貼る
後藤勝哉さん/株式会社エウレカ
後藤さんが高熱のため、同じエウレカの森川さんが代わりに発表。
業者などの悪徳ユーザを、サインアップやマッチング成立後にどのように
除外しているかのお話。
[kagome](https://github.com/ikawaha/kagome) という形態素解析ライブラリを使った [go-jp-text-ripper](https://github.com/evalphobia/go-jp-text-ripper) を使っ
てワードフィルタリングしている。go-jp-text-ripper の作者は、今回代
理で発表している森川さん!
Kuromoji も使っていたんだっけかな。忘れた。他に正規表現や機械学習
も使っていて、相当泥臭い。
3か月でフィルタリングルールは使えなくなる。イタチごっこ。
怪しいものは通さない。Slack で CS に通知して、最終的には人間が確認
する。
現在はエンジニアも運用に関わっているとのこと。気になったので質問し
てみた。
## inerfaceとの付き合い
{{< speakerdeck "f5d4bbf3c0af434b8a585a55ca364684" >}}
micchieさん/WomenWhoGoTokyo
私は inerface は理解したつもりではいますが、実践で使ってないので、
多分まだ理解できていないでしょう...。
こういう使い捨てスクリプトはつい慣れた言語を使ってしまう。micchie
さんの場合、PHP じゃなくて golang を使ったのはどういう意識だったの
かな。
## メルカリ カウルのマスタデータの更新
{{< slideshare "fhu2YVerF6VdXv" >}}
tenntennさん/株式会社ソウゾウ
GCS 上の 50MB の TSV ファイルを分割しながら(行単位ではない!)、
RDS に入れていくお話。
Transfer の実装は気が狂いそうになるらしい。バイト列の処理はそこそ
こ出来るつもりだけど、まだ来てないから待つとかは嫌だな...。
質疑応答の時に「ファイルサイズは GB 単位なので違いますが」という前
置きをした上で、弊社の GCS 上の CSV ファイルを BigQuery が読んで変
換しているという事例は紹介した。
## LT
## Ruby エンジニアが Web フレームワークでアプリを作った話(だったような)
※ TODO: 資料が公開されたらここに貼る
{{< twitter "hoshitocat" >}} さん
グノシーでは全て Web フレームワークは [kami](https://github.com/guregu/kami) を使っているらしい。
軽量らしい。作者の方が以前働いていたそうで。
今回は標準パッケージのみで実装した。golang はこれが出来るのが良い。
やっていかねばという気持ちになった。
### 高精度名寄せシステムを支える テキスト処理 (の、ほんのさわり)
{{< speakerdeck "66ca0a2712e84c9da9a62d59f2b09800" >}}
{{< twitter "dproject21" >}} さん
オープンデータを golang で名寄せのためのデータクレンジングしている
お仕事をしているらしい。golang を始めてまだ 5 ヶ月だったかな。すごい。
strings パッケージでの日本語処理は罠が多い。とにかく rune 対応であ
ることを確認すること。オープンソースでも同じ。なければ関数を作る。
正規表現も遅い罠があるので、できるだけ unicode パッケージ等で代用
する。これも全角の1が IsDisit で true 判定される罠があった(ので
関数を作った)。
[gotests](https://github.com/cweill/gotests) を使うと table driven tests の雛形を作れると、質疑応答で紹
介があった。
--------------------------------------------------------------------------------
title: "『PromiseとAsync-Awaitまとめ(Emacsで)』という LT をした"
date: "2017-11-12"
--------------------------------------------------------------------------------
{{< hatenablog title="FFLT開催しました! - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2017/11/11/205600" >}}
社内で久しぶりに LT 大会が開かれたので、私も発表しました。
{{< speakerdeck "f284939d236a4ff3bb26e6a1fec1e077" >}}
ちなみにお題をこれに決めたきっかけは、{{< post "2017-10-21-1" >}} で [async.el](https://github.com/jwiegley/emacs-async)
を調べた時に [promise.el](https://github.com/chuntaro/emacs-promise) と [async-await.el](https://github.com/chuntaro/emacs-async-await) の存在を知ったからです。
予定通り(?)デモの途中で時間オーバーになったので、それぞれ解説して
いきます。
## 解説
まずは同期処理から。2 行目で call-process が子プロセスとして sh が、
孫プロセスとして sleep が起動した後、Message Box がポップアップし
ます。同期処理なので call-process の間 Emacs は固まります。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "00sync.el" >}}
start-process で非同期処理にしました。Emacs は固まらなくなりました
が、コード量は増えてしまいました。let ではなく setq 使っているのは、
発表での説明簡略化のためです。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "01start-process.el" >}}
lambda で関数を減らしました。場合によってはアリです。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "02start-process.el" >}}
make-process を使ってみました。動作は変わりませんが、こちらの方が
分かりやすいかもしれません。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "03make-process.el" >}}
これも lambda で関数を減らすことは出来ます。ただ、同期処理と比べる
と相変わらずコード量が多いです。非同期処理にしたいだけなのに。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "04make-process.el" >}}
ここで promise.el の登場です。ビルトインライブラリではないので、
package.el 等でインストールします。
Promise に馴染みのある人であれば、読みやすいコードなのかもしれません。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "05promise.el" >}}
8 行目でゼロ除算エラーを発生させました。promise-catch によって無事
catch されます。エラーの有無に関わらずその後 done は通ります。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "06promise.el" >}}
次は async-await.el の登場です。これもビルトインライブラリではあり
ません。
同期処理のコードとほぼ同じように書くことが出来ました。これはすごい。
defun を async-defun にして、call-process を (await
(promise:make-process... に変えただけです。関数定義さえも自分で定
義できる Lisp は、相変わらず柔軟性ありすぎです。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "07async-await.el" >}}
エラー処理は今までの Emacs Lisp と同じように書けます。9 行目でゼロ
除算エラーが発生しますが、11 行目で捕捉することが出来ます。
{{< gist "masutaka" "9365590357e5899876da5f869bc22325" "08async-await.el" >}}
## 所感
資料の「所感」からの引用です。
・以前よりも非同期処理の面倒臭さは少なくなったと感じた
・シンタックスを定義できる言語は、表現の自由度が高まる
・Lispはデータも関数も全部S式で表現できる。美しい
## おまけ
資料の「Special Thanks」への補足です。
今回コードのシンタックスハイライトに使った [highlight](http://www.andre-simon.de/doku/highlight/en/highlight.html) が超便利でした。
"$ highlight -O rtf hoge.rb | pbcopy" して Keynote にコピペするだ
けで、ハイライトされたコードをコピペ出来ます。"$ brew install
highlight" でインストール可能です。
あと、今回もフォントはデフォルトから変更しました。
こちらの記事の実践になります。ありがとうございます。
[個人的な Keynote ベストプラクティス 2017 - kakakakakku blog](http://kakakakakku.hatenablog.com/entry/2017/05/30/092247)
## LT の感想
付箋紙で感想を頂きました。ありがたいことです。

--------------------------------------------------------------------------------
title: "RSpec 3.5 から shared_context の使い方が少し変わっていた"
date: "2017-11-10"
--------------------------------------------------------------------------------
RSpec 3.5 から `shared_context` のメタデータの使い方に変更があったのでメモ。
このようなテストがあったとします。
```ruby
context 'given login' do
let(:user) { create(:user) }
before { signin_as user }
...
end
```
`shared_context` を使うと、このように書くことが出来ます。同じ `context` を複数で使いたい場合に便利です。
```ruby
shared_context 'User signin' do
let(:user) { create(:user) }
before { signin_as user }
end
context 'given login' do
include_context 'User signin'
...
end
```
RSpec 3.4 までは、メタデータを使ってこのように省略することが出来ました。
```ruby
shared_context 'User signin', :signin do
let(:user) { create(:user) }
before { signin_as user }
end
context 'given login', :signin do
...
end
```
でも、RSpec 3.5 から上の書き方では Include されません。このように書く必要があります。
```ruby
shared_context 'User signin' do
let(:user) { create(:user) }
before { signin_as user }
end
context 'given login', :signin do
...
end
RSpec.configure do |config|
config.include_context 'User signin', :signin
end
```
RSpec 3.5 から、セットアップ時に以下の設定が追加されたためです。
```ruby
RSpec.configure do |config|
config.shared_context_metadata_behavior = :apply_to_host_groups
end
```
RSpec 3.4 以前から使っていれば、この設定は存在しないので、設定値はデフォルトの `:trigger_inclusion` になります。RSpec 4 でこの挙動は廃止されるそうです。
参考:
* [RSpec 3.5 has been released!](http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/)
* [shared context - Example groups - RSpec Core - RSpec - Relish](https://relishapp.com/rspec/rspec-core/v/3-5/docs/example-groups/shared-context)
--------------------------------------------------------------------------------
title: "S3 の public バケットで特定パス以下を IP アドレス制限する"
date: "2017-11-10"
--------------------------------------------------------------------------------
全体を Allow したあとに、制限したいパスに対して Deny を追加すれば
可能。
例えば以下の場合。
https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/*
→ インターネットに全公開
https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/*
→ IP アドレス AAA.BBB.CCC.DDD からのアクセスのみ許可
このようなポリシーになる。
```
{
"Id": "Policy1234567890",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt0123456789",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::masutaka-hoge/*",
"Principal": "*"
},
{
"Sid": "Stmt9876543210",
"Action": [
"s3:GetObject"
],
"Effect": "Deny",
"Resource": "arn:aws:s3:::masutaka-hoge/bbb/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "AAA.BBB.CCC.DDD"
}
},
"Principal": "*"
}
]
}
```
S3 の Console の Bucket の Permissions → Bucket Policy で上記ポリ
シーを設定する。
ポリシーはそこから辿れる [AWS Policy Generator](http://awspolicygen.s3.amazonaws.com/policygen.html) から作成する。

## 結果
インターネットの任意のホストからのアクセス。
```
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/aaa.txt
aaa
aaa
aaa
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/bbb.txt
AccessDenied
Access Denied5B876BEDB07E4200jr8SuXmK87eoccoKG6fuC1KZTjtXRdDF3A13sNv419efcOMGKih0wcBKl+cWj0IzV+jwRQ1xEsA=%
```
IP アドレス AAA.BBB.CCC.DDD からのアクセス
```
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/aaa.txt
aaa
aaa
aaa
$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/bbb.txt
bbb
bbb
bbb
```
## 所感
個人的には気持ち悪い運用だと思う。間違えた場合に気づくことが難しく、
監視もやりづらいので、積極的には関わりたくはない。
参考にした記事: [S3 IP制限|cloudpack.media](https://cloudpack.media/18475)
--------------------------------------------------------------------------------
title: "『オブジェクト指向設計実践ガイド』読書会での感想メモ"
date: "2017-11-01"
--------------------------------------------------------------------------------
6/1 から 8/24 まで、フィードフォース社内で『オブジェクト指向設計実
践ガイド』の読書会を主催しました。
{{< tweet user="masutaka" id="900666563027623936" >}}
↑ これはブログ記事に使うための先行 Tweet でした。やっと使えたw
都度メモを取って会社の Slack channel に書いていたのですが、公開の
タイミングを逃して後悔していました。そんな折、kano-e さんが会社の
新生開発者ブログに記事をポスト。
{{< hatenablog title="『オブジェクト指向設計実践ガイド』を読んで - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2017/10/27/183338" >}}
空気を読まずに私もポストします。個人ブログに。本当に五月雨式のメモ
で自分向けです。
## 第1章 オブジェクト指向設計
まだ意識が高まっておらず、感想を書いていなかった。プロローグ的な章。
## 第2章 単一責任のクラスを設計する
これらが当たり前に出来るスキルが必要だと思った。
- 健康的な書き方をほかのプログラマーに促進するコードを書く
- atter_reader 等を介して、複雑か簡単かどうかさえも見せないように
隠蔽する
- リファクタリングでメソッドへの切り出しをすることで、クラスの責務
を明確にする
- 決断を先延ばしにする
## 第3章 依存関係を管理する
- {{< wikipedia word="依存性の注入" text="DI" >}} 初登場!!
- 第3章は P19 の『オブジェクト指向設計とは、「依存関係を管理する
こと」です。』を具体的に説明した章
- とにかく依存関係を減らすことが重要
- DI
- メソッドでキーワード引数を使うことで、パラメータの順序依存をなくす
- ファクトリパターンを使った外部インターフェイスのラッピング
- あまりに複雑だと、ラッピングしすぎないほうが良いことも
- 自身より変更しないものに依存しなさい
- Ruby にはインターフェイスがないので、エンジニアのスキルがな
いと振る舞いに気づかないことも
- 本質的に抽象はより安定
- Jpeg, Png, Gif などより、Image といった抽象度を高めたオブジェ
クトのほうが変更されづらい
## 第4章 柔軟なインターフェイスをつくる
◆ P102 の図は少し煙に巻かれた気がした
- "#prepare_trip" に self を渡す発想はなかった
- でも、self には ".bicycles" という振る舞いが必要だから、bicycles
をそのまま渡せば良いのでは?
- CarMechanic class とか登場したら、 ".cars" という振る舞いを持つ
オブジェクトを渡さないといけないし
- この例では P104 にもある「手放しの信頼」を醸し出すことが目的だっ
たのかな
◆ P111 デメテルの法則
- デメテルの法則はドットの数だけではなく、中間オブジェクトの型も考
慮に入れる
- 前回 {{< post "2016-09-22-1" >}} 読んだ時に見逃してた
- もっとも、そんなに単純な話でもなくて「パブリックインターフェイス
が欠けている可能性」を考慮に入れた視点が必要
◆ 身も蓋もないし、よく聞く話だけど、完璧なアプリケーションなど作れ
ない。それを追求し続けることが一番重要
- ここで言う「完璧なアプリケーション」はこの本の場合、「依存関係が
完璧に管理されたアプリケーション」なんだと思う
## 第5章 ダックタイピングでコストを削減する
> P128
>
> 具象的なコードは、理解はかんたんですが、拡張にはコストが伴います。
> 抽象的なコードは、最初のわかりにくさは増すかもしれませんが、一度理
> 解してしまえば、はるかに変更しやすいのです。
> (中略)
> オブジェクトクラスについての不明瞭さを大目に見るという能力は、自身
> を持った設計者であることを証明します。
ここが一番自分に刺さった。そう、具象的なコードは理解がかんたんなの
で、初心者はこっちが分かりやすいと惑わされてしまうのです。
今関わっているサービスがそんなコード。たしかに読めば何をしているか
分かる。でも具象的すぎて自分のスタックが溢れる。あと、変更が大変。
変更が大変。少しの変更にものすごく時間がかかる。
> P133
> 賢くダックを選ぶ
"kind_of?" や "responds_to?" を使うことは必ずしも悪ではない。例に
出ているように、active_record ではそのようなコードがある。
しかし、 "kind_of?" などで確認されているクラスの安定性が違う。これ
は P80 の「自身より変更されないものに依存しなさい」と繋がる。
ダックタイピングは必ずしも初めから必要ない。必要な時期が来たら、ダッ
クを感じ取って、適切にリファクタリングされれば良いと思う。もちろん、
影響が少ない小さなモジュールなどは、初めから意識しても構わない。
## 第6章 継承によって振る舞いを獲得する
◆継承が効果を発揮すること
> P153
>
> ① モデル化しているオブジェクトが一般ー特殊の関係をしっかり持っていること
> ② 正しいコーディングテクニックを使っていること
①は P159 の「すべてを下げてその中のいくつかを引き上げる」戦略によっ
て、解決できます。
②は例えば P172 の post_initialize を初めとしたフックメッセージを使
うことです。このテクニックにより、継承を使ってもサブクラスを疎結合
に出来ます。サブクラスは親のアルゴリズムを知らなくて良くなりますし、
いつ誰が当該処理をするかも知る必要がなくなります。**継承で super を
使うのは最後の手段にする**ことが重要だと思います。super を使うことは、
事実上親のアルゴリズムを知ってしまっているという宣言になります。
◆雑感
何も考えずに継承を使うと、依存度の高いプログラムが出来上がる。そも
そも継承の例で安易に super 使いすぎ。洗脳っぽくなっているかも。
## 第7章 モジュールでロールの振る舞いを共有する
この章でモジュールが登場したことで、継承とどちらを使うか選択肢が増えた。
その中で P201 の「契約を守る」が重要らしい。
> P202 契約を守ると、おのずとリスコフの置換原則に従っていることになります。
調べてみると「契約プログラミング」というものがあるらしい。
> {{< wikipedia "リスコフの置換原則" >}}
>
> - 事前条件を派生型で強めることはできない。つまり、上位の型よりも強
> い事前条件を持つ派生型を作ることはできない。
> - 事後条件を派生型で弱めることはできない。つまり、上位の型よりも弱
> い事後条件を持つ派生型を作ることはできない。
>
> さらに、この原則によれば、派生型のメソッドが発生する例外は、上位の
> 型のメソッドが発生する例外の派生型か、上位のメソッドの例外と同じも
> のでなければならない。共変性と反変性も参照。
このような契約を結ぶことで、制約は生まれるが、変更に強いコードを手
に入れることが出来るのだと思う。
でもこれ、結構きつくない?
とは言え、モジュールや継承を使ってコードを最適化するのは、具象クラ
スが 3 つ現れたときが目安(第6章 最終ページ P178)。
始めは「StringUtilsに文字列が空かどうかを聞く(P187)」実装になる
かもしれない。でもその文字列がまだ一種類だけだったら、まだ最適化は
早いと思う。
## 第8章 コンポジションでオブジェクトを組み合わせる
この章はだいぶ難しかった。継承や委譲など、もろもろまとめにかかって
いる。
一言で書くと「P175 の継承を使った実装をコンポジットされた実装にリ
ファクタリングしたら(P225)、めっちゃシンプルになった!」になるが、
周辺の説明が難しい。
実際に直面した時、うっかり継承を使ってしまいそう。
ただ、継承とそれについては、P233 に簡潔にまとめられている。簡潔す
ぎるけど!
> - 継承とは、特殊化です
> - 継承が最も適しているのは、過去のコードの大部分を使いつつ、新たな
> コードの追加が比較的少量のときに、既存のクラスに機能を追加する場合
> です
> - 振る舞いが、それを構成するパーツの総和を上回るなら、コンポジショ
> ンを使いましょう
継承はリスコフの置換原則に当てはめられるように、親と子が置換可能で
なければいけない。しかし実際はそうでないケースにも継承が使われてい
る。そもそも継承はコストが高いけど、代わりの手段としてコンポジット
があるよ!ということ。
個人的には広義の委譲がコンポジットで、狭義の委譲が Ruby の
"Forwardable"、ActiveSupport の "delegate" かなと思いました。
あまり賛同は得られなかったので、頭が回ってなかったかもしれない。
P226 で配列の配列をデータとして扱っているやつ、以前書いた gem で似
たデータ構造を考えた時は、YAML にしたら良い感じで使えました。敢え
て "gist_id:" とか "filename:" とか付けてないのがポイント。
https://github.com/masutaka/gist_updater/blob/v0.4.3/gist_updater.yml.example
この gem 自体は、まだ私の修行が足りなくて、依存度を低く出来ていな
い実装あり。
今回は単純なデータ構造だったけど、階層の深い Hash を OpenStruct に
するには、こんなテクニックがありました。
```
$ irb -r ostruct -r json
irb(main):001:0> h = {hoge: {fuga: 2}}
=> {:hoge=>{:fuga=>2}}
irb(main):002:0> d = JSON.parse(h.to_json, object_class: OpenStruct)
=> #>
irb(main):003:0> d.hoge
=> #
irb(main):004:0> d.hoge.fuga
=> 2
```
{{< hatenablog title="ネストしたHashからOpenStructを作る - 世界中の羊をかき集めて" url="https://shepherdmaster.hateblo.jp/entry/2016/11/03/225957" >}}
OpenStruct は存在しないメンバにアクセスすると、nil が返っちゃうね。
例外にしてくれない。
そういう意味では Hash に対する優位性は、メッセージを介したやり取り
にできるだけか。
## 第9章 費用対効果の高いテストを設計する
とうとう最終章。ボリュームは最大だったが、注意深く読むと「ダックタ
イプをどうテストするか?」の解決に向かい続けており、読みづらさはな
かった。
ネタバレ(?)すると、P263 で放り投げられた問題はその後 P270 → P276
と進むことで解決される。
DI(依存性を注入)する実装を書いた時、テストで本物のオブジェクトを
注入するとコストが高くなる。これを回避するため、RSpec では double
を使うが、この double オブジェクト自体にもインターフェイスのテスト
が必要と、この本には書いてある。
本では MiniTest だが、RSpec で書くとこんな感じ。
- [Wheel class 自身のテスト](https://github.com/squaresurf/poodr_rspec/blob/master/spec/poodr_rspec/wheel_spec.rb#L8-L10)
- ["shared_examples 'a diameterizable interface'"](https://github.com/squaresurf/poodr_rspec/blob/master/spec/support/shared_examples/a_diameterizable_interface.rb)
- [Wheel class を使う Gear class のテスト](https://github.com/squaresurf/poodr_rspec/blob/master/spec/poodr_rspec/gear_spec.rb#L17-L19)
- "shared_examples 'a diameterizable interface'"
驚くべきは自分で作った double に対してもインターフェイスのテストを
していること。でもこうすることで、依存性を最小限にしつつ、インター
フェイスを変えた場合に必要な箇所のテストが落ちてくれる。
普通はこんなことしないので、この前提がないチームでこんな PR が作ら
れると、だいぶ議論になりそうでツライみたいな話はしました。
他、私が投げかけた疑問は P269 のコード。こんな private method のテ
スト(@observer が changed を呼んでいるか?)みたいなことは必要な
のか?
答えはやっぱり必要で、テスト対象が副作用を持つ/持たないで判断が大
きく分かれる。副作用がなければ当然必要なく、I/O のみテストすれば良
い。DB の更新など、副作用がある場合はこのようなテストが必要になる
こともある。
本では副作用のないメッセージを「クエリ」、副作用があるメッセージを
「コマンド」と命名している。
## 近況
{{< post "2016-09-22-1" >}} と今回の読書会を経て、自分の実装がガラッと変わった
と感じています。設計に小うるさくなったのは認める。
割とあっさり class を作って責務を分けますし、(この本の話からは外
れますが)場合によっては module_function で module を関数の集合体
にすることもあります。
ただ、最近学習している golang は OOP ではないので、習得した知識が
そのまま使えず、やるせなさを感じることも。
頑張ります。
{{< amazon asin="477418361X" title="オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方" >}}
いつかまた読み返すと思います。
--------------------------------------------------------------------------------
title: "『スターティングGo言語』を読んだ"
date: "2017-10-30"
--------------------------------------------------------------------------------
大変良い本でした。Kindle 版を購入しました。
{{< amazon asin="B01FH3KRTI" title="スターティングGo言語" >}}
1 年前に買って積んでいたのは勿体なかったですが、最近ようやく
golang と向き合うようになったので、致し方なしか。
対応バージョンは 1.6 で最新の 1.9 より古いですが、golang は後方互
換性は保たれているので、あまり問題ないかと。
型や構文、よく使われるパッケージの説明など、網羅的に書いてあります。
ネット上の情報をつまむくらいなら、この本で学んだほうが良いと思いま
すよ...。> 過去の自分
## 一番良かったところ
私は元々組み込みエンジニアで、clang に馴染みがあります。そういう意
味では、golang は馴染みやすくはあるのですが、ポインタまわりがどう
もしっくり来ませんでした。
この本を読んで、その辺りを理解できて大変良かったです。
・(*p)[i] の省略が p[i] であるなど、ポインタ記法を省略できる
・参照型(スライス、マップ、チャネル)はポインタを取り扱う型である
・配列は値、スライスは参照型。性質は 180 度異なる
・配列は値であるため、代入ではすべての要素のコピー(clang だとポイ
ンタの代入)
・同じ理由で、関数の引数に渡すとコピーが作られ渡される
中でも、見た目が似ている配列とスライスが裏では全く違うことを知り、
腑に落ちました。
{{< tweet user="masutaka" id="924167559355568129" >}}
string 型は参照型ではありませんが、Immutable なポインタのような不
思議な振る舞いをします(clang だとほぼポインタ)。
・string 型は内部的に「文字列の実体へのポインタ」と「文字列のバイ
ト長」によって構成
・string 型の値を、変数への再代入や関数の引数として使った場合であっ
ても、文字列の実体が別のメモリ領域にコピーされることはない
何が値で何がポインタかを理解することは、プログラムのパフォーマンス
と大きく関係してくるので、今後もより理解を深めていきます。
## 雑多なメモ
・iota 知らなかった
・パッケージを別名で import した時、alias ではなく上書きになる
・文字列を range で for loop すると、byte ごとではなく、UTF-8 でエ
ンコードされた文字列のコードポイントごとに反復される
・予約語 fallthrough のこと忘れてた
・goroutine はスレッドよりも小さい処理単位である
・2 番目の変数名を ok とする → golang における一種のイディオム
・スライスの容量が足りなくなると、倍増して拡張する(場合による)
・メソッドはレシーバーを第1引数として取る単なる関数にすぎない
・fmt.Printf の %T は任意の型。reflect.TypeOf() 使ってたよ...
・GODEBUG 変数の説明は有益だった
・Example によるコードの実行と検証
## 今後の予定
次は『[Goならわかるシステムプログラミング](https://www.lambdanote.com/collections/go)』を読んでいきます。
--------------------------------------------------------------------------------
title: "github-nippou を golang で書き換えて v4.0.1 リリースしてました"
date: "2017-10-22"
--------------------------------------------------------------------------------
{{< hatenablog title="github-nippou という gem を golang で書き直したという発表をした - Feedforce Developer Blog" url="https://developer.feedforce.jp/entry/2017/10/16/150000" >}}
こちらのブログではアナウンスしてなかったので。
v4.0.0 のリリースノートになります。
https://github.com/masutaka/github-nippou/releases/tag/v4.0.0
その後 v4.0.1 も出しました。
https://github.com/masutaka/github-nippou/releases/tag/v4.0.1
体感として速くなったことと、Homebrew のエコシステムに乗れたことが、
自分としてもメリットに感じています。
リファクタリングしないと...。
--------------------------------------------------------------------------------
title: "async.el 使ったら helm-github-stars.el を変更せずに非同期化できた"
date: "2017-10-21"
--------------------------------------------------------------------------------
{{< github_repo "Sliim/helm-github-stars" >}}
helm-github-stars.el という便利な Emacs Lisp ツールがあります。
「自分がつけた GitHub の Star」や「自分または Organization 所有の
リポジトリ」等を Helm interface で操作できます。
「Star 付けたリポジトリがあったけど、なんて名前だったかなー」
なんて時に、素早く検索してブラウザで開けたりします。便利です。
## 課題
helm-github-stars.el は便利なのですが、キャッシュファイル
(~/.emacs.d/hgs-cache)を作る [hgs/generate-cache-file()](https://github.com/Sliim/helm-github-stars/blob/1.3.2/helm-github-stars.el#L252-L288) は
同期処理関数です。Emacs built-in の url-retrieve-synchronously()
を使っています。
うっかり M-x helm-github-stars すると、数十秒待たされます。辛いです。
※ helm-github-stars-refetch-time を設定に基づき、
M-x helm-github-stars のタイミングでキャッシュファイルが更新されます。
そういうわけで、最近は当該キーバインドをコメントアウトしている状態
でした。
つい先日の木曜日。重い腰を上げて、非同期処理版の
hgs/generate-cache-file() を作ろうとしました。でも、Star と Repo
両方の API を呼ぶ必要があり、なかなかに複雑です。コーディングが進
みません。
そんな中見つけたのが [async.el](https://github.com/jwiegley/emacs-async) でした。
## async.el
{{< github_repo "jwiegley/emacs-async" >}}
今回使ったのは、async.el に含まれる [async-start()](https://github.com/jwiegley/emacs-async#async-start) です。
> async-start START-FUNC FINISH-FUNC
- START-FUNC は子プロセスの Emacs で実行される
- FINISH-FUNC は現在の Emacs で実行される
上記のとおり、このライブラリはなんと **Emacs の子プロセスとして、も
うひとつ Emacs を起動**し、そこで非同期処理をして結果を返してくれま
す。変態です。
子プロセスの Emacs は -Q オプションで高速に起動され、START-FUNC の
終了とともに終了します。

ご存知の方も多いと思いますが、Emacs で非同期処理を実現するためには、
TCP コネクションを開くか、外部コマンドを起動しなくてはいけません。
ただ、外部コマンドの種類に制限はないので、Emacs に S 式を渡して処
理させたというわけです。天才か。
コード自体はそこまで凝ったことはしていません。[子プロセスとして
Emacs を起動する](https://github.com/jwiegley/emacs-async/blob/v1.9.2/async.el#L286-L300)以外は [start-process() を使った普通の非同期処理](https://github.com/jwiegley/emacs-async/blob/v1.9.2/async.el#L217-L232)です。
ですが、このようなシンタックスとして定義されていると、非同期処理を
感じさせません。Lisp 処理系の真骨頂ですね。
## 変更前
async.el で非同期化する前のコードです。
~/.emacs.d/hgs-cache を作ってから 0.5 日経った後に
M-x helm-github-stars すると、そのタイミングで同期処理が実行されます。
私の場合だと 20 秒ほど待たされます。
{{< gist "masutaka" "82159e0ddc3387334b4a58364f9a83dc" "00before.el" >}}
※ my-lisp-load() は {{< post "2016-05-06-2" >}} で解説しています。
## 変更後
async.el で非同期化したコードです。
Emacs を起動すると、
my-helm-github-stars-async-generate-cache-file() が
Emacs Timer に登録されつつ、初回の実行をします。
このコードだと、この後 1 時間ごとに非同期(バックグラウンド)で実
行されます。
{{< gist "masutaka" "82159e0ddc3387334b4a58364f9a83dc" "01after.el" >}}
my-helm-github-stars-async-generate-cache-file() は async-start()
を呼ぶだけの関数です。
START-FUNC では、まず load-path を通すために、package 関連の処理を
します。
次に helm-github-stars-token を設定するために、my-lisp-load() の
S 式を評価してから、この Lambda 式を評価しています。
※ (lambda ...) の前のバッククォートと (my-lisp-load ...) の前のカ
ンマがセットです。
[async-inject-variables()](https://github.com/jwiegley/emacs-async#async-inject-variables) を使っても良かったのですが、
helm-github-stars-token は現在の Emacs では nil で良いため、
この形に落ち着きました。
FINISH-FUNC は `*Messages*` バッファにこんなログを出すだけです。
> [GH] Success to GET my GitHub Stars and Repos (28.2sec) at 2017-10-21 00:33:14.
## まとめ
async.el を使って、helm-github-stars.el に変更を加えることなく、
非同期化しました。
-Q で起動しているとは言え、Emacs は大きなプロセスですので、インター
バルの短かすぎる処理は避けたほうが良いと思います。
今回の GitHub 関連の情報は、「自分のはてブ」や「自分の Qiita:Team
のストック」とともに helm-my-bookmark() という関数で横串検索してい
ます。詳しい設定は[私の init.el](https://gist.github.com/masutaka/8177244) をどうぞ。
**追記(2017-12-30):**
Issue で紹介してみました(無謀奴)。
https://github.com/Sliim/helm-github-stars/issues/23
--------------------------------------------------------------------------------
title: "golang の並列処理を Ruby と比較しながら学ぶ"
date: "2017-10-15"
--------------------------------------------------------------------------------
一ヶ月ほど前に社内のインフラ共有会でタイトルの話をしました。記録の
ために記事を書いておきます。
[Gist に置いてある](https://gist.github.com/masutaka/c0a4234a5264c89655c40adcf7c27cb2)ので、コードは git clone で取得可能です。
```
$ git clone https://gist.github.com/c0a4234a5264c89655c40adcf7c27cb2.git
```
## Ruby
例えば Ruby で 30 個の処理をするコードがあったとします。こんな素朴
なコードです。それぞれ 3 秒かかる処理が 30 あるので、とても遅いです。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "serial.rb" >}}
Thread を使って 5 並列にしました。明らかに速くなりました。
ついでにそれぞれの結果(というほどのものではありませんが)を
results に代入し、最後にまとめて表示しました。
results は共有リソースになるので、[Thread::Mutex#synchronize](https://docs.ruby-lang.org/ja/2.4.0/method/Thread=3a=3aMutex/i/synchronize.html) でロッ
クをかけて安全に書き込んでいます。ロックをかけないと results に同
時に書き込まれるケースを救うことが出来ません。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v1.rb" >}}
[parallel gem](https://rubygems.org/gems/parallel) を使うと、ずいぶんとすっきり書くことが出来ます。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v2.rb" >}}
## golang
直列処理に関しては、Ruby と同様に素朴です。goroutineNum(あとで説
明します)は常に 1 です。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "serial.go" >}}
何も考えずに heavyProcess() を goroutine で動かします。19 行目に
"go " を追加しただけです。驚いたことに何も表示されずに終了します。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v1.go" >}}
実は何も表示されなかったのは、goroutine の終了を待たずに main() が
終了してしまったためです。シェルのバックグラウンド実行(&)とよく
似ていると思いました。
今度は [sync](https://golang.org/pkg/sync/) パッケージを使って、goroutine の終了を待ちましたが、
今回も何も表示されません。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v2.go" >}}
これは heavyProcess() の終了を待たずに WaitGroup.Done しているからです。
sync.WaitGroup.Done() も含めた処理を goroutine で実行すると(23-26
行目)、出力されます。ただしこの時点では 30 並列です。goroutineNum
は最大 31 です。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v3.go" >}}
defer を使ってリファクタリングしました。23 行目の無名関数の最後で
必ず WaitGroup.Done を実行してくれることが明示&保証されました。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v4.go" >}}
5 並列にしました。サイズ 5 で int 型の channel を作り、同時実行数
を制限しました。変数 semaphore には 1 が書き込まれ、heavyProcess()
が終わったら、出ていきます。
実行すると、goroutineNum が最大 31 なのは変わりませんが、徐々に減っ
ていくのがわかると思います。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v5.go" >}}
少し脱線して並列数を CPU コア数にしました。通常はこれで良いと思い
ますが、Web API へのアクセス等、CPU パワーを使わない処理であれば、
もっと増やして良いと思います。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v5b.go" >}}
parallels_v1.rb と同じように、結果を最後にまとめて表示します。
sync.Mutex でロック用の変数を作り、34~36 行目でロックをかけながら
results に書き込んでいます。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v6.go" >}}
少しリファクタリングして、semaphore に詰める値を 1 から i に変えま
した。少し自信がありませんが...。
{{< gist "masutaka" "c0a4234a5264c89655c40adcf7c27cb2" "parallels_v7.go" >}}
## 考察など
### goroutine とは
何か処理を "go" で括れば、main() とは別のスレッド(という表現で良
いか分からない)で動作すると理解しました。シェルのバックグラウンド
実行とよく似ていますし、これ自体はシンプルだと思います。
そのままだと main() が先に終わってしまうので、sync.WaitGroup など
で待つ必要があります。
ちなみに sync.WaitGroup を使わずに channel で同じことができます。
でも、私は読みやすさの点から sync.WaitGroup を使うほうが好きです。
### Ruby と golang の並列処理の違い
今回の Ruby と golang のコードを実行すると、Ruby は並列数分の処理
が全部終わってから次に進み、golang は並列処理のうち 1 つでも終わる
と、次の処理が並列処理に加わります。
擬音にすると、Ruby は「ガッガッガッガッ」で、golang は「スルスルス
ルスル」です。分かるかな?
### main() も goroutine
実は main() 自体も goroutine で動いているようです。例えば以下の変
更を加えて"$ GOTRACEBACK=2 go run parallels_v7.go" を実行すると、
なんとなく分かります。
```
diff --git a/parallels_v7.go b/parallels_v7.go
index f17339a..d34b0b1 100644
--- a/parallels_v7.go
+++ b/parallels_v7.go
@@ -33,6 +33,7 @@ func main() {
mu.Lock()
defer mu.Unlock()
results = append(results, <-semaphore) // Is this safe?
+ select {}
}(i)
}
wg.Wait()
```
参考: [Go の並行処理 - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/20130414/1365960707)
--------------------------------------------------------------------------------
title: "『応仁の乱』を読んだ"
date: "2017-09-24"
--------------------------------------------------------------------------------
少し前に読み終えました。読むのに3ヶ月以上かかったり、登場人物多す
ぎで且つ、姓を省略されることが多いため、間違った知識もあるかもしれ
ないけど一応メモ。
原因は将軍家の後継者争いとか言われているが、実際はもっとぐちゃぐ
ちゃ。
将軍(幕府)が強権を発動して収束させてもいないし、対処も間違ってい
たり中途半端だったりで、カオスがカオスを呼んでいく。結果、10 年を
超える大乱になった。
今でもこんな話があるとかないとか。
[京都の人が“先の戦争”というとき、応仁の乱を指すというのは本当ですか? ... - Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112315206)
戦国時代後期を多少知っているくらいの知識だと、応仁の乱に出てくる武
将(家)は知らない人だらけなのも分かった。細川氏くらいしか馴染みが
ない。あと、畠山氏は影薄くなりすぎ。
1. 守護は京都在住を義務付けられていたため、地方は守護代にお任せ
2. 応仁の乱が勃発し対応に追われる。消耗&疲弊しまくり
5. 乱が終わる頃には守護代に国を乗っ取られる。その他のケースもあるらしい
という流れらしい。そういえば織田氏の元の主人は斯波氏であった。
また読んで理解を深めたいところだが、登場人物の相関図なしに読む気に
はならない。。。
{{< amazon asin="412102401X" title="応仁の乱 - 戦国時代を生んだ大乱 (中公新書)" >}}
--------------------------------------------------------------------------------
title: "ZenHub と GitHub の Issue/PR URL をトグルするブックマークレットを作った"
date: "2017-08-31"
--------------------------------------------------------------------------------
[Using ZenHub on web and mobile devices](https://www.zenhub.com/blog/zenhub-now-available-for-web-and-mobile-devices/)
先日 [ZenHub](https://www.zenhub.com/) の Web app 版 https://app.zenhub.com がリリースされま
した。機能はほとんど同じですが、例えば milestone を close 出来るの
は Web app 版だけだったり、細かな違いはあります。
[Chrome extension 版](https://chrome.google.com/webstore/detail/zenhub-for-github/ogcgkffhplmphkaahpmffcafajaocjbd)と違って、動作が軽快っぽいので使おうとしました
が、PR や Issue のページも彼らで作り込んでしまい、正直それは使いた
くない。
そこでブックマークレットを作ってみました。このようにトグルします。
https://github.com/masutaka/github-nippou/issues/59
↓↑
https://app.zenhub.com/workspace/o/masutaka/github-nippou/issues/59
私はブラウザのブックマークに "zen<=>git" という名前で登録しました。
```
javascript:if (location.href.match("app.zenhub.com/workspace/o")) { location.href=location.href.replace("app.zenhub.com/workspace/o" , "github.com") } else { location.href=location.href.replace("github.com", "app.zenhub.com/workspace/o" ).replace("pull", "issues") }
```
ブックマークレット便利!
--------------------------------------------------------------------------------
title: "github-nippou v3.0.0 released"
date: "2017-08-07"
--------------------------------------------------------------------------------
{{< github_repo "masutaka/github-nippou" >}}
v3.0.0 から出力フォーマットをカスタマイズ出来るようになりました。
{{< github_user "ryz310" >}} に大感謝です!
リリースノートは以下をどうぞ。
https://github.com/masutaka/github-nippou/releases/tag/v3.0.0
新しいサブコマンド init を実行すると、[デフォルト設定](https://github.com/masutaka/github-nippou/blob/v3.0.0/config/settings.yml)から新しい
Gist を作り、その後はその設定が参照されます。
参考までに[私の設定はこちら](https://gist.github.com/masutaka/60b0d60372ccba445d9bbdf47d9ced4f)です。subject を h3 から h4 に変えている
のと、GitHub ユーザ名をリンクにしています。
副作用として v2 と同じフォーマットでは出力できなくなりました。
ご不便をおかけしたらすみません。
他の機能としては以下になります。
・新しいサブコマンド open-settings
前述の Gist URL をデフォルトブラウザで開きます。設定していなければ、
デフォルトの GitHub URL を開きます。
・Docker サポート
依存 Gem が増えてきたので、[Dockerize](https://hub.docker.com/r/masutaka/github-nippou/) してみました。ラッパースクリ
プト [docker-github-nippou](https://github.com/masutaka/github-nippou/blob/v3.0.0/bin/docker-github-nippou) を介して使うと良いです。ただし、[Launchy](https://github.com/copiousfreetime/launchy)
を使う関係で、サブコマンド open-settings は使えません。
--------------------------------------------------------------------------------
title: "『サーバーレスシングルページアプリケーション』を読んだ"
date: "2017-08-02"
--------------------------------------------------------------------------------
{{< post "2017-07-05-1" >}} のあとすぐ読み始めたので、およそ一ヶ月。長い旅であっ
た...。
きっかけは {{< post "2017-03-12-1" >}} の JAWS DAYS 2017 での吉田さんのセッショ
ン。今まで Lambda, DynamoDB, Cognito のどれも、つまみ食いしかして
来なかったので「これだ!」と思い予約注文しました。
あわよくば、[年始の Vue.js](http://tech.feedforce.jp/vue-elasticsearch.html) 以降停止していた JS をやり始められたら良
いかなと。
1章からいきなり S3 にデプロイし始めて、胸が熱くなるのを感じました。
2章のルータ関数や3章のテンプレートなど、jQuery でもわりときれい
に書けるんだなと感心しました。
※ 「はじめに」のページ xii にはこの本で React や Angular を選択し
なかった理由が書いてあります。
ただ、その後の4章から雲行きが怪しくなりました。非同期プログラミン
グに慣れていないので、その function がいつ実行されるのか分からない
箇所が多々。
弊社の尖りまくったフロントエンドエンジニアに聞こうにも、
jQuery.Deferred の質問はなんとなくためらわれ...。
読み終わって、残念ながら Lambda, API Gateway, DynamoDB, Cognito を
ふんわり触ったくらいしか印象が残りませんでした。期待値が大きすぎた
感があります。
## 私に刺さらなかった理由
理由を考えてみました。
・JS が難しい
JS というよりも jQuery を使った非同期プログラミングが、かもしれま
せん。普段書かないコードなので、理解が困難でした。
・独自フレームワーク sspa
[実体はシェルスクリプト](https://github.com/benrady/learnjs/blob/master/sspa)ですが。悪い意味でブラックボックスになってお
り、読後に「これを使って SPA 作るぞ!」という気持ちにはなれません
でした。吉田さんの {{< post "2017-03-12-1" >}} のセッションでは [SAM](https://github.com/awslabs/serverless-application-model) 推しだった
ので、当然使われるだろうという目論見も外れました。
・日本語が読みづらい
どことなく読みづらく、jQuery.Deferred 以外の話でも読み進めるのに時
間がかかりました。
## ターゲット層は誰だったか?
私のようなインフラ&バックエンドエンジニアではなく、AWS で SPA を
作りたいフロントエンドエンジニアだったのかなあ?と思いました。だと
しても jQuery は毛嫌いされそうなので、いろいろ謎です。
AWS をあまり使ったことがなくて、SPA に興味ある方には良いかもしれま
せん。
## これから読む方へ
写経はオススメしません。「はじめに」のページ xix から辿れる [Source
Code](https://pragprog.com/titles/brapps/source_code) をダウンロードして、理解しながらコピペしたほうが良いと思いま
す。Git で差分を確認しながら。
本だと、P97 navbar-padding-lg の CSS が書かれておらず時間を使って
しまったり、途中からテストが省略されるためです。そういえば Jasmine
って今もよく使われているのかな?
そういえば本にも書かれている learnjs/7100/public/app.js の 7100 な
どの数字に意味があったのか気になる...。特に連番でもなかったし。
でも、それぞれディレクトリが分かれているので、コピペし易かったです。
良いと思いました。
{{< amazon asin="4873118069" title="サーバーレスシングルページアプリケーション ―S3、AWS Lambda、API Gateway、DynamoDB、Cognitoで構築するスケーラブルなWebサービス" >}}
--------------------------------------------------------------------------------
title: "emacs-helm の標準添付から外された helm-elscreen を Melpa に追加した"
date: "2017-07-10"
--------------------------------------------------------------------------------
{{< github_repo "emacs-helm/helm-elscreen" >}}
[emacs-helm/helm@6193cc4](https://github.com/emacs-helm/helm/commit/6193cc4) によって、helm-elscreen.el が
https://github.com/emacs-helm/helm-elscreen に切り出されていました。
Elscreen のタブをまとめて閉じるのに重宝しており、若干不便な毎日を
送っていたので、この度エイヤッと Melpa パッケージを作りました。
## 作成記録
初め、https://github.com/melpa/melpa に PR を作ろうとしたら、
[PULL_REQUEST_TEMPLATE.md](https://github.com/melpa/melpa/blob/dfe42a7/.github/PULL_REQUEST_TEMPLATE.md) に Checklist がありました。
これを満たすために、helm-elscreen に PR 作成。
https://github.com/emacs-helm/helm-elscreen/pull/1
無事マージされたので、Melpa にパッケージ追加の PR 作成。
https://github.com/melpa/melpa/pull/4828
そこで指摘項目があったので、さらに helm-elscreen を修正。
https://github.com/emacs-helm/helm-elscreen/pull/2
さらに指摘項目があり、helm-elscreen に PR 作ったけど、結果的に要ら
なくなったやつ。
https://github.com/emacs-helm/helm-elscreen/pull/3
melpa.org 作者の {{< github_user "purcell" >}} さんは、昔から丁寧にレビューをしてくれま
す。本当にありがたいです。パッケージのコードまでレビューするのは、
ものすごく大変だと思う...。
ただ、多くの PR が作られ、レビューのコストが相当高いせいか、以前は
なかった PULL_REQUEST_TEMPLATE.md や [CONTRIBUTING.md](https://github.com/melpa/melpa/blob/dfe42a7/CONTRIBUTING.md) が出来ており、
割りと大変でした。いやあ、大変だった...。(自分のパッケージだった
ら、大変じゃないです)
emacs-helm と melpa.org のハッカーとのやり取りは流石に緊張します。
先ほどパッケージが出来ました。お楽しみ下さい。
https://melpa.org/#/helm-elscreen
## おまけ
今確認したら、[今回で 9 個目のパッケージ](https://github.com/melpa/melpa/pulls?utf8=%E2%9C%93&q=author%3Amasutaka%20)でした。思っていたより多い。
うち、私の作ったパッケージ(*)が 5 個。
- {{< melpa "helm-hatena-bookmark" >}} (*)
- {{< melpa "elscreen-mew" >}} (*)
- {{< melpa "historyf" >}}
- {{< melpa "clmemo" >}}
- {{< melpa "blgrep" >}}
- {{< melpa "helm-ghq" >}} (*)
- {{< melpa "helm-bundle-show" >}} (*)
- {{< melpa "helm-qiita" >}} (*)
- {{< melpa "helm-elscreen" >}}
--------------------------------------------------------------------------------
title: "WEB+DB PRESS Vol.99の「実践Kubernetes」の第4章でつまづいたメモ #wdpress"
date: "2017-07-05"
--------------------------------------------------------------------------------
先月からなぜか Kubernetes の素振りをしています。
職場の若者が先日発売された『WEB+DB PRESS Vol.99』の牧さんの記事、
「実践Kubernetes」をオススメしていたので、流れで実際に動かしてみま
した。
この記事は先週の『Kubernetes Meetup Tokyo #5』{{< post "2017-06-29-1" >}} でも
オススメされていました。
{{< amazon asin="4774189871" title="WEB+DB PRESS Vol.99" >}}
第4章で実際に GKE を使うことになるのですが、記事に書いてあるコマ
ンドや設定はそのままでは動かず、大変難儀しました。誰かの役に立つか
もしれないので、人知れずメモしておきます。
## 注意点
私は Kubernetes(以下 k8s)を使い始めたばかりです。
今回の件が、記事で使われているバージョン(1.6.1)と、現在 GKE で使
えるバージョン(1.6.6)の違いによるものなのか、本当に記事が間違っ
ているのか分かっていません。
どちらにせよ、網羅的に k8s を解説してくれたことには大変感謝してい
ます。おかげさまで、さあ使ってみよう!という気になりました。
記事のサンプルコードや YAML は[サポートサイト](http://gihyo.jp/magazine/wdpress/archive/2017/vol99/support)からダウンロード出来ま
す。typo でつまづくのももったいないので、こちらを使うのが良いかも
しれません。特に今回は YAML が改ページで区切られている箇所があり、
手打ちは難易度高かったです。← あとからサンプルコードの存在を知奴
## つまづいたメモ
それでは順番に記載していきます。
### P94「Podの定義」
記事では $PROJECT_ID がそのまま書かれていましたが、実際は展開する
必要がありました。注意書きを書いたり、`{{PROJECT_ID}}` などと環境変
数とは別のフォーマットを使ったほうが良かったかもしれません。
直前の cloudbuild.yaml では $PROJECT_ID の展開は必要ないため、気づ
くのに時間がかかりました。最終的には $ kubectl get pods で確認でき
る STATUS が InvalidImageName になっており、気づきました。
```
--- ../WDB99-toku3-k8s/WDB99-toku3-k8s/pod.yaml 2017-05-09 17:03:05.000000000 +0900
+++ pod.yaml 2017-07-04 23:27:21.000000000 +0900
@@ -4,6 +4,7 @@
name: hello-world
spec:
containers:
- - image: asia.gcr.io/$PROJECT_ID/wdpress/hello-world
+ # $PROJECT_ID は展開する必要があった
+ - image: asia.gcr.io/wdpress-123456/wdpress/hello-world
imagePullPolicy: Always
name: hello-world
```
あと、P95 でマニフェストファイル(pod.yaml)を作成せずにコマンドラ
インで Pod を作成する同等の例が書かれていますが、pod ではなく
deployment が作成されるようなので、ちょっと違うのかな?と思いました。
```
$ kubectl run hello-world --image=asia.gcr.io/$PROJECT_ID/wdpress/hello-world --port=8080
deployment "hello-world" created
```
実際、この後に紹介される
$ kubectl delete pods hello-world
では削除できず、
$ kubectl delete deployments hello-world
で削除できました。
### P95「Pod の状態確認」
$ kubectl get pods -l name=hello-world
で確認していますが、No resources found. が返ってしまいました。
$ kubectl get pods
でないと確認できませんでした。
またこの時点での Pod は 1 つだと思いますが、記事では 3 つ表示され
ており、どこか間違っているのか考え込んでしまいました。
何度も試すうちに、1 つが正解だろうという結論に至りました。
蛇足になりますが、このあとの「Podへのアクセス設定」の $POD_NAME は
この時点では hello-world の方が分かりやすいと思います。
### P95「設定の適用」
P96 の $ kubectl create -f pod-configmap.yaml を実行したところ、
> The Pod "" is invalid: metadata.name: Required value: name or generateName is required
というエラーになってしまいました。
試行錯誤して、以下の修正に落ち着きました。
```
--- ../WDB99-toku3-k8s/WDB99-toku3-k8s/pod-configmap.yaml 2017-05-09 17:03:05.000000000 +0900
+++ pod-configmap.yaml 2017-07-04 23:58:45.000000000 +0900
@@ -1,11 +1,11 @@
apiVersion: v1
kind: Pod
metadata:
- labels:
- name: hello-world
+ name: hello-world
spec:
containers:
- - image: asia.gcr.io/$PROJECT_ID/wdpress/hello-world
+ # $PROJECT_ID は展開する必要があった
+ - image: asia.gcr.io/wdpress-123456/wdpress/hello-world
imagePullPolicy: Always
name: hello-world
env:
```
$PROJECT_ID の展開が必要な点は pod.yaml と同じです。これ以降登場す
る YAML ファイルは全て展開が必要でした。
あと、$ kubectl create -f pod-configmap.yaml の前に
$ kubectl create -f configmap.yaml が必要でした。
(順番は後でも大丈夫かも。)
ConfigMap の削除は
$ kubectl delete configmaps hello-world-config
で良いみたいでした。
### P96「ReplicaSetを使ったデプロイ」
右上の $ kubectl delete pods -l $POD_NAME は
No resources found が返ってきてしまいました。
-l は要らないみたいです。
### P96「Deploymentを使ったデプロイ」
P97 で "kubectl update で変更を適用してみましょう"
とありましたが、以下のエラーが返ってきました。
```
$ kubectl update
W0705 00:16:04.340422 28610 cmd.go:361] update is DEPRECATED and will be removed in a future version. Use replace instead.
error: Must specify --filename to replace
See 'kubectl replace -h' for help and examples.
```
こちらで良いみたいです。
```
$ kubectl replace -f deployment.yaml
deployment "hello-world" replaced
```
### P97「IngressによるHTTP Load Balancerの作成」
P98 で "前述のServiceの定義からLoadBalancerの行を削除しましょう"
と書いてあります。$ kubectl replace -f service.yaml についても
書いたほうが親切だと思いました。
kubectl replace しなくても Ingress 経由でのアクセスは出来るので、
ちょっと細かいかもしれません。
## 最後に
WEB+DB PRESS Vol.99の「実践Kubernetes」の第4章を実際に試してみて、
私がつまづいた箇所をまとめました。
初心者はまだ情報の拠り所がないため、サンプルコードが動かないと、心
が折れてしまうかもしれません。私も今回一度折れました。
この記事を書くために第4章を何度も試し、結果的に kubectl に慣れて
きました。今回はサンプルコードが動かなくて良かったのかなw
Kubernetes はアップデートが早く、記事と現在の整合性を取るのが難し
そうです。そんな中、記事を書いて下さった牧さんにお礼申し上げます。
--------------------------------------------------------------------------------
title: "Kubernetes Meetup Tokyo #5 に行ってきた #k8sjp"
date: "2017-06-29"
--------------------------------------------------------------------------------
[Kubernetes Meetup Tokyo #5 - connpass](https://k8sjp.connpass.com/event/56945/)
今回はこれに尽きました。GKE ちょっと触っただけでの参加は時期尚早だった。
{{< tweet user="masutaka" id="879662724183072768" >}}
{{< youtube "pgmAw5nUSGA" >}}
ありがたいことに、全体の動画が公開されています。
## [WIP] 運用しているサービスをKubernetes化するかどうか考える
by {{< twitter "r_takaishi" >}}
{{< speakerdeck "7ab74ce10f42429988eb517883c230a6" >}}
GMO ペパボの [minne](https://minne.com/) のお話。高石さんお久しぶりです。
- Private Cloud の OpenStack 上に VM インスタンスが 100 台稼働中
- 1 回のデプロイに 25 分、1 台のスケールに 10 分。遅い
- コンテナ化したアプリを Kubernetes 上に載せてみた(検証中)
- デプロイは 10 分に、スケールは 4 分に短縮
Kubernetes 化により技術的課題が解決できそうで、素晴らしいと思った。
今後の動きが気になる。
## Using Kubernetes in Production
by {{< twitter "koudaiii" >}}
{{< speakerdeck "7157df6a2bc74b92ae88e91c1901e42c" >}}
AWS の kops 上で Kubernetes を動かして、もう 1 年になるらしい。
ECS 使わなかったのは、相当早くからコンテナ化に取り組んだからかな?
cron は Kubernetes の ScheduledJob を使っているらしい。Job は失敗
すると、自動で Retry するため、冪等性を保つ Job が必要とのこと。
牧さんは ScheduledJob は使っていないとのこと。参考にならないけどw
{{< tweet user="lestrrat" id="879655124431273984" >}}
弊社には ECS 上に構築されたバッチシステムがあるけど、気軽に構築で
きるものではないよなあ。まだまだ運用コスト高いし。最近東京リージョ
ンに来た AWS Batch や、最近リリースされた ECS の Scheduled Tasks
の事例がそろそろ出ても良い気がするけど。
Wantedly は Kubernetes を管理するための小さなツールを数多く作って
いるそう。過去に巨大な Capistrano のリポジトリを作った反省かららしい。
ある意味理解はしやすいと思うけど、あまりに多いと混乱しないのかな?
## CoreOS Fest 2017 Recap
by {{< twitter "hiyosi" >}}, {{< twitter "superbrothers" >}}
{{< speakerdeck "82b853d6769a4d5e884cf6942852fadb" >}}
CoreOS, Inc のカンファレンスレポート。この辺から付いて行けなくなっ
た...。
## LT 大会
### kubectl apply の仕組み by tkusumi
{{< speakerdeck "fc785fb91f774b6ab80ff4db4c307e66" >}}
### Selenium Grid on Kubernetes by mumoshu
※ TODO: 資料が公開されたらここに貼る
BrowserStack とかは大人の事情で使えないので、自前で E2E 環境を構築
したお話。強い...。
### Kubernetes The Hard Wayの紹介 by ktateish
{{< speakerdeck "e05638a0da9847b68a0abfebb7e2b823" >}}
ゼロから Kubernetes クラスタを構築するススメ。
### Terraform & Kubernetes by literalice
※ TODO: 資料が公開されたらここに貼る
### Kubernetes の歩き方 by ladicle
{{< speakerdeck "0a5aaf08711c418491d3ba156fb39d8e" >}}
kubeadm は個人で運用するには良いらしい。リポジトリはどこだろう?
https://github.com/kubernetes/kubeadm だと思ったら、ドキュメントし
かなかった。
ブログ記事も書いてくださっていた。
[第2回 Kubernetesの歩き方](https://ladicle.github.io/post/k8s2/)
## 感想
全体的にインフラエンジニアが多くて、Kubernetes に集中している雰囲
気だった。Kubernetes は関連ツールも多いし、Rails やりながらとかは
自分は無理。深く突き詰められる環境が必要だと思った。
とは言え、このブログのコンテナ化はやりたいと思っているので、どうに
か Kubernetes 使えないかなー。
自分用メモ: {{< tweets_on_the_day text="勉強会当日のツイート" day="2017-06-27" >}}
--------------------------------------------------------------------------------
title: "『プログラマのためのGoogle Cloud Platform入門』を読んだ"
date: "2017-06-26"
--------------------------------------------------------------------------------
このブログはさくらの VPS 上で動いているのですが、ちょっと飽きてきたので、GKE (Google Container Engine) にでも移動しようかしら、というモチベーションで読みました(料金が見合わない気はしているが...)。
あと、GCP (Google Cloud Platform) の本自体が珍しく、あわよくば自分のスキルを高められるかなとも思いました。今まで BigQuery と GCE (Google Compute Engine) を少々しか使ったことしかないため。
結論から書くと、GCP の初心者向けには良い本だと思いました。ただ、割りと初心者向けに書いてあるので、私のように AWS を業務で使っているエンジニアには冗長な記述もありました。IP アドレスの説明とか。
まあでも、話の流れとしては不自然ではないので、さらりと流せば良いと思います。
全体的にこのような構成になっています。完全な目次は[公式サイト](http://www.shoeisha.co.jp/book/detail/9784798137148)をどうぞ。
* 1章 GCP 自体の説明
* 2章 GCE, Cloud SQL, Cloud Storage を使ったサンプルアプリケーションをデプロイ
* 3章 Cloud Load Balancing を使ってマルチリージョンにデプロイ
* 4章 五目並べゲームを GKE 上にデプロイ
* 5章 機械学習を用いた GAE (Google App Engine) アプリケーションのデプロイ等
* 付録 Stackdriver を使った監視やロギング、Cloud IAM の説明、GCP の最新情報の入手
※ 2章のサンプルアプリは付録Aでも使うので、GCE や SQL インスタンスは削除せず、STOP にしておいたほうが良いと思います。
全部動かしてみましたが、正直 GKE はまだ理解できていません。手動でクラスタを作ってコンテナを動かすための VM が起動したら、kubectl でデプロイすればコンテナが起動してしまいます。Google が良しなにやってくれる感がすごい...。
機械学習は書かれたとおりにやっただけで、何も理解できませんでした。今回が初だからまあいいかあ...。Cloud Machine Learning Engine から間接的に TensorFlow も使えましたし。
あと、Google Cloud Vision API すごい。
{{< tweet user="masutaka" id="878968149089042433" >}}
P256 のフリーハンドでの数字入力が、なぜか出来ませんでした。私だけなのかなあ?
全体としては、図なども交えて初心者向けに丁寧に書かれているので、GCP に興味があれば、是非読んでみると良いと思いました。
{{< amazon asin="4798137146" title="プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで" >}}
--------------------------------------------------------------------------------
title: "AWS Summit Tokyo 2017 に行ってきた #AWSSummit"
date: "2017-06-02"
--------------------------------------------------------------------------------

Day2 だけですが、今年も [AWS Summit Tokyo](http://www.awssummit.tokyo) に行ってきました。
{{< post "2014-07-19-1" >}} から始まり、{{< post "2015-06-07-1" >}} {{< post "2016-06-04-1" >}} と、
今年で 4 回目の参加になります。
今回は過去最高の規模なのか、品川プリンスホテルの会場も増えてました。
グランドプリンスホテルからの移動時間は 10 分ほど。人によっては移動
が大変だったみたいです。暑かったですし。
私は聞きたいのがほとんど AWS Dev Day のセッションだったので、午後
は全部品川プリンスホテルに引き篭もっていました。
全てのセッションの動画や資料はこちらをどうぞ。
[AWS Summit Tokyo 2017 開催レポート - 基調講演・特別講演 動画・資料一覧|AWS](https://aws.amazon.com/jp/summit2017-report/)
## [Day2 基調講演(キーノート)](http://www.awssummit.tokyo/summit/index.html#D2K)
{{< youtube "VqJ9H3jNs4Y" >}}
[資料ダウンロード](https://d0.awsstatic.com/events/jp/2017/summit/slide/D2K.pdf)
オープニングが例年のDJ田中氏から、三味線からのエレキギター&バイオ
リンとのセッションに変わりました。DJ田中氏は Day3,4 ?
目立っていたのは先日ニュースにもなった、三菱東京UFJ銀行の事例。つ
いに日本の銀行も AWS 上で動き始めました。とは言え、これから上り調
子か!と思わせてからのスピーカーの村林氏の今週末退任という流れには、
さすがに会場がザワッとしていましたw
去年との違いは Machine Learning 推しかなあ。
全体的に例年よりも RDS, Lambda など具体的な用語が多いキーノートだっ
た気がします。そうできる状況になってきたのでしょう。
あとは Amazon Lightsail 東京リージョンの発表や、大阪ローカルリージョ
ンの来年開設など軽めの発表でした。
詳細なレポートはクラスメソッドさんの記事をどうぞ。
[【レポート】AWS Summit Tokyo 2017:Day2 基調講演(キーノート) #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws-summit-tokyo-2017-report-day2-keynote/)
## [ナビタイムサービスにおける、Amazon ECS を活用したシステム移行 ~『乗換NAVITIME』での移行事例 ~](http://www.awssummit.tokyo/summit/index.html#D2T6-1)
[資料ダウンロード](https://d0.awsstatic.com/events/jp/2017/summit/slide/D2T6-1.pdf)
3 月に ECS にズビっと移行したお話。CPU 負荷をトリガーに自動でスケー
ルアウトする。スケールインはこれからみたい。
## [〜マイクロサービスを設計する全ての開発者に送る〜クラウド時代のマイクロサービス設計徹底解説!](http://www.awssummit.tokyo/devday/index.html#D2T8-2)
{{< youtube "Zf-DW_u_B40" >}}
[資料ダウンロード](https://d0.awsstatic.com/events/jp/2017/summit/devday/D2T8-2.pdf)
ご本人も始めに言った通り、だいぶ駆け足でした。
- サービス観点で分割。利用者の観点で
- 疎結合化を受け入れる(運用でカバー) → Amazon ですら不整合発生 → 300円クーポン
- 最近は URL ではなくて、HTTP ヘッダで API のバージョニングをするらしい。そうなの?
- マイクロサービスにおける可用性 → 障害が発生しないようにするではない → 復元力を高める
- 何人かは障害に遭遇している。「全体としてだいたい動く」
マイクロサービスでの設計のキモは、非同期による不整合を受け入れるこ
とだそうです。あの Amazon でさえもそれを受け入れ、技術ではなく 300
円クーポンという「運用でカバー」をしていることを強調していました。
{{< post "2017-03-12-1" >}} の JAWS DAYS 2017 では運用でカバーが出来ないという
話があったけど、真相は如何に...。
モノリシックサービスだと「1 リクエストも 5xx を出さないように頑
張る」と思いますが、マイクロサービスにおいては「スケールを手に入れる
代わりに、全体としてだいたい動くように頑張る」らしいです。
まだ実装も運用もしたことがないので、なるほどという感想しかありません...。
チーム体制として「コンウェイの法則」を挙げていたのが印象的でした。
インフラチームが横断的に複数の開発チームと関わるのではなく、開発チー
ムで上から下まで面倒を見るアレです。
詳細なレポートはクラスメソッドさんの記事をどうぞ。
[【レポート】AWS Summit Tokyo 2017:〜マイクロサービスを設計する全ての開発者に送る〜クラウド時代のマイクロサービス設計徹底解説! #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws-summit-2017-report-dev-day-d2t8-2/)
スピーカーの鈴木氏ご本人の記事で補足ありました。
[マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017 - arclamp](http://arclamp.hatenablog.com/entry/2017/06/01/104449)
## [[ABEJA] IoT / Bigdata / AI 時代におけるスケーラブルな Deep Learning 実行基盤と応用](http://www.awssummit.tokyo/devday/index.html#D2T8-3)
{{< youtube "GqKaG_Coah0" >}}
ABEJA という Deep Learning のスタートアップのお話。
- カメラのデータを解析
- [chalice](https://github.com/awslabs/chalice) よいとのこと。Serverless Framework + Application?
- ECS 使ってる
- GPU インスタンスで起動すれば、Docker から GPU を扱うことも可能
- GPU はコア数が多く並列計算が得意。ディープラーニングは GPU が得意な行列演算が多い
- IoT Device → API Gateway → Kinesis → Lambda → S3
- Annotation(Person) → ALB → ECS → S3
Python 推し。Lambda が 3.6 に対応して喜んでいた。
https://rebuild.fm/ で聴いたような環境を使っていた。どのセッション
も ECS 出てきている。
## [[JapanTaxi] Athena 指向アナリティクス 〜真面目に手を抜き価値を得よ〜](http://www.awssummit.tokyo/devday/index.html#D2T8-4)
{{< youtube "mgou5T3A_VU" >}}
[資料ダウンロード](https://d0.awsstatic.com/events/jp/2017/summit/devday/D2T8-4.pdf)
外注だったアプリを内製にリニューアル。主に Beanstalk で構築。
fluentd で S3 に保存。わりと普通。
セッションでは触れられていなかったけど、S3 → Athena がリージョンを
跨ぐと、Data Transfer 料金がバカにならないので要注意です。
{{< tweet user="masutaka" id="869808685924573185" >}}
こういうのが必要。
{{< tweet user="masutaka" id="828118808522919936" >}}
下手したらこのようになります。私も会社で 3 万円ほど溶かしました。
この方は 170 万円...。
{{< tweet user="masutaka" id="848870824337580033" >}}
そういう理由もあってまだ本気で使ってないけど、ログフォーマットは
LTSV でもいけるみたいです。
{{< tweet user="k1LoW" id="869812311841619968" >}}
詳細なレポートはクラスメソッドさんの記事をどうぞ。
[【レポート】AWS Summit Tokyo 2017:[JapanTaxi] Athena 指向アナリティクス 〜真面目に手を抜き価値を得よ〜 #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws/japan-taxi-athena-analytics/)
**追記(2017-07-01):**
[ついに Athena が東京リージョンに来ました。](https://aws.amazon.com/jp/about-aws/whats-new/2017/06/amazon-athena-is-now-available-in-asia-pacific-singapore-and-asia-pacific-tokyo/)Data Transfer 料金の心配は少なくなりました。
## [【ライブ コーディングも実施】Amazon Pay の仕組みと実装方法](http://www.awssummit.tokyo/devday/index.html#D2T7-5)
{{< youtube "kuETmAYoc9g" >}}
[資料ダウンロード](https://d0.awsstatic.com/events/jp/2017/summit/devday/D2T7-5.pdf)
結構良かった。
- バックエンドは API Gateway + Lambda + DynamoDB で構築
- ELB + EC2 + DynamoDB は考えることが多いので不採用
- 最後にフロントエンド側のライブコーディング。まあ簡単ね
{{< tweet user="masutaka" id="869816128507265024" >}}
## [Amazon ECS の進化、DevOps と Microservices の実践](http://www.awssummit.tokyo/devday/index.html#D2T7-6)
{{< youtube "NuT0nRLoN6Q" >}}
- まだ ECS 使ったことない人向けのセッション
- Microservices は実装よりの導入事例。デプロイは [ecs-deploy](https://github.com/silinternational/ecs-deploy) 簡単で便利とのこと。
--------------------------------------------------------------------------------
title: "GitHub Organization をメンテナンスするスクリプトを作った"
date: "2017-05-28"
--------------------------------------------------------------------------------
成り行きで会社の GitHub Organization の管理者業をしています。
Organization 配下のリポジトリやユーザが増えてきて、気にかけるのが
大変になってきたので、メンテナンス用の Ruby スクリプトを作りました。
{{< github_repo "feedforce/github-org-notice" >}}
## permission.rb
指定した Team パーミッションが付与されていないリポジトリを検索し、
Slack 通知する。実行しない曜日を設定可能。
## tfa.rb
2FA を無効にしているユーザを検索し、Slack 通知する。無視ユーザや実
行しない曜日を設定可能。
こういった GitHub Organization の管理は、皆さんどうしているのだろう?
--------------------------------------------------------------------------------
title: "Docker ではないコンテナ systemd-nspawn を使ってみた"
date: "2017-04-29"
--------------------------------------------------------------------------------
先日、増田の記事を読みました。
* [Docker盲信してる皆様へ](http://anond.hatelabo.jp/20170309040708)
* [dockerやめてどうしたか?](http://anond.hatelabo.jp/20170422000230)
systemd-nspawn を全く知らない自分に腹が立ったので、使ってみました。
## ホスト OS を Arch Linux にして試す
何も知識がないので、ググってヒットしたこちらから開始。
[[Arch Linux] systemd-nspawnで軽量コンテナを建てよう! - Qiita](http://qiita.com/Aruneko/items/ddf4581ab33d658854c4)
ホストの Arch Linux は Vagrant で用意しました。Arch Linux は初めて使ったし、名前も知らなかったというレベルです。
```console
$ vagrant init terrywang/archlinux
```
あとは記事のとおりに さまざまなディストリのコンテナを試していきました。
Arch Linux
→ 一番簡単だったが、インターネットに繋げられず
Debian
→ debootstrap が 404 でインストールできず断念
CentOS
→ dnf のインストールで挫折。
と、ひととおり試してこの記事はむしろ Arch Linux スゲー記事ということに気づきました・・・!
## ホスト OS を CentOS 7 にして試す
初心(?)に返って、仕事でも使っている CentOS 7 で再挑戦。
こちらの記事は簡単でした。Vagrant で出来たし、何もせずともコンテナからインターネットを参照できました。
[Cent OS7でsystemd-nrespownで軽量コンテナを作成する](http://tech.gowest.co.jp/centos7-systemd-nrespown-300.html)
macOS の方はたぶん、この通りにやると systemd-nspawn を体験できると思います。
```console
$ vagrant init bento/centos-7.3
$ vagrant up
$ vagrant ssh
# コンテナを /srv/mycontainer に作成
$ sudo yum -y --releasever=7 --nogpg --installroot=/srv/mycontainer --disablerepo='*' \
--enablerepo=base install systemd passwd yum vim-minimal
# コンテナの root ユーザにパスワードを設定する。次のデーモンモードでログインするため
$ sudo systemd-nspawn -D /srv/mycontainer
-bash-4.2# passwd
(snip)
-bash-4.2# exit
# コンテナをデーモンモードで起動(CUI な Linux のログインに遷移)
$ sudo systemd-nspawn -bD /srv/mycontainer
```
CentOS 7 上で CentOS 7 のコンテナを起動した様子です。一瞬で起動できますし、ログインすればコンテナということを忘れてしまいそうです。

yum の --installroot オプションは初めて使いました。
インストールしているパッケージは systemd, passwd, yum, vim-minimal だけ。このなかの systemd がすごい()のだと思いました。
今回は Linux kernel をインストールしないため、コンテナはホストの Linux kernel を使うそうです。
インストール先である /srv/mycontainer の様子です。うん、見覚えがあるw
```console
[vagrant@localhost ~]$ ls -alF /srv/mycontainer
total 24
dr-xr-xr-x. 17 root root 4096 Apr 29 05:07 ./
drwxr-xr-x. 3 root root 24 Apr 29 05:29 ../
lrwxrwxrwx. 1 root root 7 Apr 29 05:07 bin -> usr/bin/
dr-xr-xr-x. 2 root root 6 Nov 5 15:38 boot/
drwxr-xr-x. 2 root root 17 Apr 29 05:07 dev/
drwxr-xr-x. 47 root root 4096 Apr 29 05:08 etc/
drwxr-xr-x. 2 root root 6 Nov 5 15:38 home/
lrwxrwxrwx. 1 root root 7 Apr 29 05:07 lib -> usr/lib/
lrwxrwxrwx. 1 root root 9 Apr 29 05:07 lib64 -> usr/lib64/
drwxr-xr-x. 2 root root 6 Nov 5 15:38 media/
drwxr-xr-x. 2 root root 6 Nov 5 15:38 mnt/
drwxr-xr-x. 2 root root 6 Nov 5 15:38 opt/
dr-xr-xr-x. 2 root root 6 Nov 5 15:38 proc/
dr-xr-x---. 2 root root 26 Apr 29 05:08 root/
drwxr-xr-x. 11 root root 4096 Apr 29 05:07 run/
lrwxrwxrwx. 1 root root 8 Apr 29 05:07 sbin -> usr/sbin/
drwxr-xr-x. 2 root root 6 Nov 5 15:38 srv/
dr-xr-xr-x. 2 root root 6 Nov 5 15:38 sys/
drwxrwxrwt. 7 root root 88 Apr 29 05:07 tmp/
drwxr-xr-x. 13 root root 4096 Apr 29 05:07 usr/
drwxr-xr-x. 18 root root 4096 Apr 29 05:08 var/
```
`$ curl http://example.com` とかで、コンテナからインターネットを参照できることも確認できました。
コンテナを停止したい時は、コンテナログイン中に poweroff や `shutdown -h now` コマンドを実行します。
あと、記事のとおり、コンテナをホスト側の systemd のサービスとして起動することも出来ました。
```console
$ sudo sh -c "printf '[Service]\nExecStart=/usr/bin/systemd-nspawn -bD /srv/mycontainer\n' > /etc/systemd/system/mycontainer.service"
$ cat /etc/systemd/system/mycontainer.service
[Service]
ExecStart=/usr/bin/systemd-nspawn -bD /srv/mycontainer
$ sudo systemctl daemon-reload
$ systemctl status mycontainer
● mycontainer.service
Loaded: loaded (/etc/systemd/system/mycontainer.service; static; vendor preset: disabled)
Active: inactive (dead)
$ sudo systemctl start mycontainer
$ systemctl status mycontainer
● mycontainer.service
Loaded: loaded (/etc/systemd/system/mycontainer.service; static; vendor preset: disabled)
Active: active (running) since Sat 2017-04-29 05:23:38 UTC; 1s ago
Main PID: 11551 (systemd-nspawn)
CGroup: /system.slice/mycontainer.service
└─11551 /usr/bin/systemd-nspawn -bD /srv/mycontainer
```
## 感想
* ホストとコンテナが同一 OS なら簡単そう
* ファイルシステムはそのまんまホスト上にあるので、いろいろ気楽。増田が Ansible でセットアップしたのも頷ける
* コンテナはホストの Linux Kernel を使うことしか出来ない
* ネットワークまわりはまだ良くわからない
* Dockerfile が配布されていないケースで、社内サーバとかに使うのは良いかも
* どのように Production に載せるかは全く想像がついていない
* Production が Docker でないのであれば、開発環境を systemd-nspawn にするのはありかもしれない。ただし、要 Linux
**追記(2017-04-30):**
[コンテナはホストの Linux Kernel しか使えない](http://b.hatena.ne.jp/entry/334300671/comment/mapk0y)そうです。訂正しました。
--------------------------------------------------------------------------------
title: "CircleCI 2.0 で capistrano デプロイしてみた"
date: "2017-04-16"
--------------------------------------------------------------------------------
このブログは GitHub で管理しており、master に commit が追加される
と、CircleCI が capistrano を使ってデプロイします。
{{< post "2017-04-13-1" >}} でテストを CircleCI 2.0 で動かしたので、デプロイも
試してみました。
最終的な circle.yml とデプロイスクリプトはこちらになりました。
{{< gist "masutaka" "049178f0ab55baba8ce6b4e12e42fba8" >}}
基本的に "add_ssh_keys" と "deploy" step 以外は {{< post "2017-04-13-1" >}} と
同じです。ハマりそうなところだけ記載していきます。
## ハマりそうなところ
[Deployments - CircleCI](https://circleci.com/docs/2.0/deployments/) のとおり、"deploy" step があればデプロイ出来ます。
ただ capistrano で GitHub の private repository をデプロイする場合、
最低 2 つは SSH Key が必要になると思います。
(1) 本番サーバ(masutaka.net)への SSH ログイン
(2) SSH ログイン後に GitHub に SSH アクセス
これらの設定方法を説明していきます。
デバッグは CircleCI の各ジョブの Rebuild with SSH から、実際に本番
サーバに ssh ログインできるか確認していくと、分かりやすいと思います。
### (1) 本番サーバ(masutaka.net)への SSH ログイン
(1) の SSH Key をコンテナに注入するのが ["add_ssh_keys" step](https://circleci.com/docs/2.0/configuration-reference/#addsshkeys) です。
私は ssh-keygen で作った秘密鍵は以下のように登録し、対応する公開鍵
は本番サーバの ~/.ssh/authorized_keys に記載しています。

例: https://circleci.com/gh/masutaka/masutaka.net/edit#ssh
[circle.yml で "add_ssh_keys" step を追加する](https://gist.github.com/masutaka/049178f0ab55baba8ce6b4e12e42fba8/44812fb358119bcb839bd462b5ad2920cb1f907c#file-circle-yml-L32-L36)ことで、コンテナの
~/.ssh/config がこのように設定されます。
```
Host masutaka.net
IdentitiesOnly yes
IdentityFile /root/.ssh/id_rsa_437fb2...
```
masutaka ユーザとしてデプロイするために、[さらに ~/.ssh/config に追
記しました。](https://gist.github.com/masutaka/049178f0ab55baba8ce6b4e12e42fba8/44812fb358119bcb839bd462b5ad2920cb1f907c#file-deploy-circleci-sh-L3-L6)
最終的な ~/.ssh/config は以下になります。"ForwardAgent yes" は後述
します。
```
Host masutaka.net
IdentitiesOnly yes
IdentityFile /root/.ssh/id_rsa_437fb2...
User masutaka
ForwardAgent yes
```
Rebuild with SSH してコンテナに SSH ログインした後、
"$ ssh masutaka.net" 出来るようになりました。
### (2) SSH ログイン後に GitHub に SSH アクセス
(2) の SSH Key はなにもしなくてもコンテナにあると思います。
Preferred にチェックが付いている SSH Key の秘密鍵が ~/.ssh/id_rsa
として存在していました。

例: https://circleci.com/gh/masutaka/masutaka.net/edit#checkout
余談ですが、~/.ssh/authorized_keys の fingerprint は[このような関数](https://gist.github.com/masutaka/9287575/855b897801e444a607a60f9641a8ce5ed3eb9079#file-zshrc-L294-L316)
で確認すると良いと思います。
[ssh-agent を起動させ、ssh-add する](https://gist.github.com/masutaka/049178f0ab55baba8ce6b4e12e42fba8/44812fb358119bcb839bd462b5ad2920cb1f907c#file-deploy-circleci-sh-L8-L11)ことでメモリ上に ~/.ssh/id_rsa
がキャッシュされます。さらに前述の "ForwardAgent yes" の設定により、
本番サーバに SSH ログインした時に GitHub の Permission が存在する
状態になります。
"$ ssh masutaka.net" 後に、適当な GitHub の private repository を
git clone 出来るようになりました。これでデプロイも出来ると思います。
## まとめ
capistrano で GitHub の private repository をデプロイするためには、
2 つの SSH Key が必要でした。設定方法は微妙に異なります。
--------------------------------------------------------------------------------
title: "CircleCI 2.0 をローカルで実行できる circleci コマンドとは何者か"
date: "2017-04-15"
--------------------------------------------------------------------------------

先日の {{< post "2017-04-13-1" >}} で気になったので調べてみました。
初めに結論から。
circleci コマンド(シェルスクリプト。macOS 等で実行可能)
└ docker run circleci/picard
└ /usr/bin/circleci (https://github.com/circleci/build-agent)
・circleci コマンドは build-agent というコマンドを Dockerize した
シェルスクリプト。
・build-agent は golang 製のツールで、/usr/bin/circleci としてコン
テナ内に存在する。おそらく private repository
https://github.com/circleci/build-agent で開発されている。
・Docker Image は https://hub.docker.com/r/circleci/picard/ だが、
Dockerfile は公開されていない。Alpine Linux ベースのようだ。
・この Docker Image には docker コマンドは存在しない。
/usr/bin/circleci が Docker Hub の API を使って、docker pull 相当
のことなどを実行するようだ。
## 調査過程や詳細など
[Running Jobs Locally - CircleCI](https://circleci.com/docs/2.0/local-jobs/) に書いてある方法で
https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci
が /usr/local/bin にインストールされる。
これは [circleci/picard](https://hub.docker.com/r/circleci/picard/) を docker run するだけのラッパーシェルスク
リプト。ただ、circleci/picard の Dockerfile は公開されておらず、何
者なのかは分からない。
```
--- circleci.orig 2017-04-15 18:57:50.000000000 +0900
+++ circleci 2017-04-15 18:57:54.000000000 +0900
@@ -138,4 +138,4 @@
-v ~/.circleci/:/root/.circleci \
--workdir $(pwd) \
$picard_image \
- circleci "$@"
+ sh
```
適当に書き換えて、circleci コマンドを実行すればコンテナの中に入る
ことが出来る。
```
/Users/masutaka # which apk
/sbin/apk
```
apk コマンドがあることから、circleci/picard は Alpine Linux ベース
のようだ。
```
/Users/masutaka # which circleci
/usr/bin/circleci
```
また、前述の Diff から分かるように、コンテナの中に circleci コマン
ドがあるようだ。あった。
```
/Users/masutaka # apk add --no-cache file
(snip)
/Users/masutaka # file /usr/bin/circleci
/usr/bin/circleci: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
```
file コマンドをインストールしつつ、circleci コマンドを調べてみる。
ELF ということから、golang で書かれているのかなあ?と予想した。
まさか clang ではないと思うし。
```
/Users/masutaka # ldd /usr/bin/circleci
ldd: /usr/bin/circleci: Not a valid dynamic program
```
要求する .so (shared object) はないようだ。
```
/Users/masutaka # apk add --no-cache binutils
```
objdump や strings コマンドを使うために、binutils をインストールする。
```
/Users/masutaka # objdump -x /usr/bin/circleci > hoge
```
macOS 側の ~/hoge にこのバイナリのヘッダ情報が書き込まれる。
リバースエンジニアリングになるので公開は差し控えるが、知らない人で
も golang と書かれたツールだと分かるくらいの情報が手に入る。
リポジトリは https://github.com/circleci/build-agent のようだ。
ただし参照は不可。private repository だと思う。
あと、このコンテナには docker コマンドは存在しない。
https://github.com/docker/docker を import して、Docker Hub の API
を使っているようだ。他にも import しているライブラリは多数あった。
--------------------------------------------------------------------------------
title: "Rails リポジトリに CircleCI 2.0 を導入した"
date: "2017-04-13"
--------------------------------------------------------------------------------

先日素振りがてら、個人の小さな Rails リポジトリを Dockerize しました。
https://github.com/masutaka/github-organization-watcher/pull/45
現在クローズドβの CircleCI 2.0 は Docker 前提らしいので、これも素
振りがてら移行してみました。
https://github.com/masutaka/github-organization-watcher/pull/48
CircleCI 2.0 はここから申請すれば、すぐ使えるようです。
https://circleci.com/beta-access/#request-access
## 移行前の印象
(1) 1.0 では宜しくやってくれたけど、2.0 は circle.yml に全部書く必
要があるみたい。面倒そう。
(2) とは言え、Dockerfile や docker-compose.yml があるし、ちょっと
やれば動くだろう。
(3) Alpine Linux の Docker Image 使えば、1.0 よりは速くなるのかな。
## 移行後の感想
(1) 予想に違わない面倒くささ・・・! オートマがマニュアルになった感じ。
(2) 使えませんでした /(^o^)\ 参考にはなったけど。
(3) 速い・・・!!!(移行前: [01:38](https://circleci.com/gh/masutaka/github-organization-watcher/157)、移行後: [00:30](https://circleci.com/gh/masutaka/github-organization-watcher/172))
両方ともキャッシュあり状態です。Alpine Linux もそうかもしれないけ
ど、とにかくキャッシュのリストアが速かったです(後述)。あと、
CircleCI のビルドが全体的に高速です。
## circle.yml
circle.yml は 1.0 から 2.0 に移行して、このようになりました。同じ
ディレクトリにある Dockerfile や docker-compose.yml は使っていません。
https://github.com/masutaka/github-organization-watcher/pull/48/files
docker-compose を使うことも出来るそうなので、あとで試すかも。
[Using docker-compose - CircleCI](https://circleci.com/docs/2.0/docker-compose/)
## 実装の流れ
2.0 はローカルで circleci コマンドが使えるので、インストールします。
[Running Jobs Locally - CircleCI](https://circleci.com/docs/2.0/local-jobs/)
circleci コマンドはこの Docker イメージのラッパースクリプトでした。
Dockerfile は公開されていないようです。
https://hub.docker.com/r/circleci/picard/
checkout や restore_cache など、一部の命令はスキップされますが、
だいたい同じように動きます。
この辺を参考にしながら、実装していきました。
https://circleci.com/docs/2.0/
https://circleci.com/docs/2.0/language-ruby/
ローカルで試していた時は "apk add" が遅くて、[Docker Hub](https://hub.docker.com/) に CI 専用
のイメージを置いて使ってましたが、CircleCI 上だと気にならないくら
いの速さだったので、今は [ruby:2.4.0-alpine](https://hub.docker.com/r/library/ruby/tags/2.4.0-alpine/) をそのまま使っています。
## ハマったところ
> Downloading cache archive...
> Unarchiving cache...
> Error untarring cache: exit status 1
[restore_cache で↑これが発生して](https://circleci.com/gh/masutaka/github-organization-watcher/169)ハマりました。
どうやら、[Alpine Linux だと、tar と gzip がなくて失敗するそう](https://discuss.circleci.com/t/does-clear-cache-work-for-2-0/10965/13)です。
インストールしましょう。
ここに必要なコマンドが書いてありました。はい、マニュアル読め奴ですね。
[Building Custom Images for Docker Executor - CircleCI](https://circleci.com/docs/2.0/custom-images/#required-tools)
キャッシュはこの辺りが参考になりました。ありがとうございます。
- [Caching in CircleCI - CircleCI](https://circleci.com/docs/2.0/caching/)
- [CircleCI 2.0に移行して新機能を活用したらCIの実行時間が半分になった話 - クラウドワークス エンジニアブログ](http://engineer.crowdworks.jp/entry/2017/04/04/202719)
## すごいと思ったところ1
circle.yml にはこのように指定しました。
```
docker:
- image: ruby:2.4.0-alpine
environment:
RDB_URL_BASE: postgres://postgres:@localhost
- image: postgres:9.5-alpine
```
起動されたコンテナには Ruby が入っており、PostgreSQL も起動してい
るように見え、どうやっているんだろうと思っていたら、
> [Choosing an Executor Type - CircleCI](https://circleci.com/docs/2.0/executor-types/#multiple-images)
>
> It’s also possible to specify multiple images. When you do this,
> all containers will run in a common network. Every exposed port
> will be available on localhost from a [primary container](https://circleci.com/docs/2.0/glossary/#primary-container).
> (snip)
> In a multi-image configuration job, steps are executed in the
> first container listed (main container).
最初に書いたイメージがプライマリとして起動されるようです。Every
exposed port ... とか書いてあるので、PostgreSQL も起動しているよう
に見えたのは気のせいだったのかな...?
## すごいと思ったところ2
キャッシュした /usr/local/bundle のリストアがめっちゃ速いです。
Restore bundler cache のところ見ると、たったの 2 秒です。
https://circleci.com/gh/masutaka/github-organization-watcher/172
## まとめ
- CircleCI 2.0 は高速だった
- circle.yml に全部書く必要があるのは面倒
- Dockerize の次にやるには良いお題
**追記(2017-04-14):**
Docker イメージもキャッシュさせてみました。
https://github.com/masutaka/github-organization-watcher/pull/49
このリポジトリだと高速化の恩恵はありませんでしたが、高速化のために
CI 用の Docker イメージを用意するくらいになると効果あると思います。
**追記(2017-04-16):**
> Warning: Either git or ssh (required by git to clone through SSH) is
> not installed in the image. Falling back to CircleCI's native git
> client but this is still an experiment feature. We highly recommend
> using an image that has official git and ssh installed.
checkout step で上記 Warning が出ていたので、修正しました。
https://github.com/masutaka/github-organization-watcher/pull/52
Required tools である git と ssh client をインストールすることで、
いい感じのシェルスクリプトが使われるようです(詳細は上記 PR 参照)。
--------------------------------------------------------------------------------
title: "PS4 Pro と LG の 4K テレビ 43UH6500 で nasne は使えるのか?"
date: "2017-04-08"
--------------------------------------------------------------------------------
**追記(2017-11-12):**
4K のままで使えるようになりました。torne のアップデートはなかった気がするので、PS4 のシステムアップデートで直ったのかもしれません。
---
LG の 4K テレビ [43UH6500](http://www.lg.com/jp/tv/lg-43UH6500) と PS4 Pro の組み合わせで、nasne は使える
のか、ドンピシャの情報がなかったので、ここに書き留めておきます。
結論から書くと、PS4 Pro の設定を 2K にすれば使えました...。(涙)
普通に使おうとすると、torne から戻った時に画面全体が暗転もしくは紫
色になります。復帰するには、電源ボタン長押しで一度スタンバイにする
しかありません。
※ [nasne](http://www.jp.playstation.com/nasne/) はハードウェア、[torne](http://www.jp.playstation.com/nasne/apps/torne/) はソフトウェアの名前です。torne は
PS4 や iOS や Android 等で動作するソフトウェアです。torne を介して
nasne でテレビ番組を録画したり、視聴したりできます。
## バージョン情報
| |
|---|---
|LG 43UH6500 システムソフトウェア|04.30.45
|PS4 Pro システムソフトウェア|4.50
|nasne システムソフトウェア|2.57
|torne|1.21
## PS4 Pro を買ってしまった
先日、[前世代の PS4 (CUH-1200AB02)](http://www.jp.playstation.com/ps4/hardware/cuh1200ab02.html) を [PS4 Pro (CUH-7000BB01)](http://www.jp.playstation.com/ps4/hardware/cuh7000bb01.html) に買い
替えました。Amazon の料金が定価に戻っていたからつい...(震え
一番の心配は、今回の組み合わせで nasne が使えるかどうかでした。
えいやっと購入したところ、問題がありました...。
今は 4K のゲームはしていないので、仕方なく PS4 Pro を 2K で動作さ
せ、問題を回避しています。
FF14 の拡張パッケージ第2弾(パッチ 4.0)『[紅蓮のリベレーター](http://jp.finalfantasyxiv.com/stormblood/)』は
4K 対応するらしいです。それまでに torne が 4K 対応してくれないだろ
うか...。
## PS4 Pro の設定を 2K に変更
前述の問題を回避するために、PS4 Pro からの出力を 2K に変更します。
設定 → サウンドとスクリーン → 映像出力設定 → 解像度
と進み、「1080p」に変更します。
「2160p - YUV420」から「2160p - RGB」にすれば回避できるという情報
がありましたが、残念ながら私の環境ではダメでした。
[PS4 pro でtorneが使えない?: Miya^2’s blog](http://miya-2.cocolog-nifty.com/blog/2016/11/ps4-pro-torne-6.html)
## torne が 4K 対応したら
将来のために、ここにメモしておきます。
### LG 43UH6500 の当該 HDMI を HDR に変更
テレビのリモコンから
設定 → 詳細設定 → 機器設定 → HDMI 4K ディープカラー
と進み、PS4 Pro と繋がった HDMI をオンにします。
これでテレビ側は後述する「2160p - RGB」に対応します。これは {{< wikipedia word="ハイダイナミックレンジ合成" text="HDR" >}} の
ことらしいです。
### PS4 Pro の設定を 4K RGB に変更
設定 → サウンドとスクリーン → 映像出力設定 → 映像出力情報
と進み、解像度とカラーフォーマットが「2160p - RGB」相当であること
を確認します。
| |
|---|---
|解像度|3840 x 2160 - 60 Hz
|カラーフォーマット|RGB
|テレビのHDR|2K/4K対応
|HDCP|2.2
前述の LG 43UH6500 の設定をしていないと、カラーフォーマットが
YUV420 になっていると思います。
## 「2160p - YUV420」や「2160p - RGB」とは
2160p は 4K のことです。2K だと 1080p になります。
2K では HDMI 帯域幅に余裕があるため、色情報を間引かずそのまま表示
していたとのこと。
4K で同じことをやると HDMI 帯域幅が不足することがあり、この場合は
色情報を間引くそう。これが「2160p - YUV420」。
テレビや HDMI ケーブルの性能が十分の場合、間引く必要がない。これが
の「2160p - RGB」。
「2160p - RGB」を YUV 表記するとしたら、「2160p - YUV444」になるら
しいです。
↓ だいぶ勉強になりました。
[価格.com - 『映像出力』 SONY プレイステーション4 Pro HDD 1TB ジェット・ブラック CUH-7000BB01 のクチコミ掲示板](http://bbs.kakaku.com/bbs/K0000906668/SortID=20400335/)
{{< amazon asin="B01F1LKM3M" title="LGエレクトロニクス 43V型 4K 液晶テレビ UH6500シリーズ HDR対応 IPS4Kパネル スリムボディ Wi-Fi内蔵 43UH6500" >}}
{{< amazon asin="B01LRHPUZ4" title="PlayStation 4 Pro ジェット・ブラック 1TB (CUH-7000BB01)" >}}
{{< amazon asin="B01MYNESFA" title="nasne 1TBモデル (CUHJ-15004)" >}}
※ こちらの nasne の型番は CUHJ-15004 です。私が持っている nasne は
{{< amazon_link asin="B00UBS2OIC" title="CECH-ZNR2J01" >}} ですが、[全く違いはない](https://www.amazon.co.jp/forum/-/Tx22V5GZC0N8EFF/ref=ask_dp_dpmw_al_hza?asin=B01MYNESFA)とのこと。
--------------------------------------------------------------------------------
title: "オムロンの低周波治療器が肩こりにだいぶ効く"
date: "2017-04-02"
--------------------------------------------------------------------------------
{{< figure src="/images/omron-device-s.jpg" link="/images/omron-device.jpg" target="_blank" rel="noopener" alt="購入したオムロンの低周波治療器" >}}
私は季節の変わり目に首や肩甲骨の周りが非常に凝ります。あと飲みすぎた次の日も...。
先々週くらいにヤバイ兆候を感じたので、Amazon のほしい物リストに登録していたこちらを速攻でポチッと。
この手の機器は初めて買ったのですが、時代の進化を感じます。
もみ方を「たたく」にして強さを8に設定すると、叩かれているのと変わりありません。やりながらキーボードを打つのは非常に困難・・・!
肩以外にも「関節」「腕」「足裏」「ふくろはぎ」「腰」に対応しています。もみ方も「たたく」「もむ」「おす」「さする」があります。
単4電池 x2 で動くのには驚愕。2 つバンドルされている点も親切。
欠点があるとしたら、服を着ている時は粘着パッドを付けづらいことでしょうか。
マッサージに行くことを考えたらだいぶ割安ですし、オススメです。
{{< amazon asin="B01GZU9YDC" title="オムロン 低周波治療器 エレパルス HV-F128-J3" >}}
{{< amazon asin="B00CWNMW1S" title="Amazonベーシック 充電式ニッケル水素電池 単4形4個パック (最小容量750mAh、約1000回使用可能)" >}}
--------------------------------------------------------------------------------
title: "ローカル環境を出来るだけ Dockerize した"
date: "2017-03-21"
--------------------------------------------------------------------------------
ローカルに nginx や mysql が起動していたり、gem install のためだけ
に cmake や icu4c を brew install するのは嫌になったので、三連休で
出来るだけ Dockerize しました。仕事の素振りも兼ねています。
## nginx
このブログの記事を書く時のプレビューや、雑多な html ファイルの表示
に使っています。
今まで $ brew install nginx して、nginx.conf も別途管理していまし
たが、以下のような雑な docker-compose.yml で、雑にマウントするだけ
で良くなりました。
```
version: '3'
services:
nginx:
image: nginx:alpine
ports:
- 8080:80
volumes:
- /Users/masutaka/Sites:/usr/share/nginx/html
restart: on-failure:10
```
- Snow Leopard からの流れで、雑多な html は ~/Sites に置いています。
- $ docker-compose up -d しておけば、macOS を再起動しても nginx が
起動してくれます。
- ほかにグローバルに必要な service が増えたら追加していきます。
## mysql
MySQL を使う Rails アプリケーションがあったので、とりあえず
Dockerize しました。
```
version: '3'
services:
mysql:
image: mysql:5.7
ports:
- 13306:3306
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
```
config/database.yml に書く development.url は
mysql2://root:@127.0.0.1:13306/development とすれば接続できます。
mysql2://root:@localhost:13306/development だと Rails は TCP では
なく UNIX Socket で接続しようとし、失敗してしまいます。
あと、Rails も同時に Dockerize しないと、mysql2 gem のインストール
で libmysql.*.dylib を要求され、brew install mysql することになる
ので注意。今回は Rails アプリの Dockerize は着手できませんでした。
brew の mysql は削除したので、クライアントは [MySQL Workbench](https://www-jp.mysql.com/products/workbench/) を使
うことにしました。brew cask install mysqlworkbench でインストール
出来ます。
## postgresql
PostgreSQL を使う Rails アプリケーションもあったので移行しました。
MySQL とさほど違いはありません。
```
version: '3'
services:
postgresql:
image: postgres:9.5-alpine
ports:
- 15432:5432
```
クライアントは [PSequel](http://www.psequel.com/) を使うことにしました。brew cask install
psequel でインストール出来ます。
あれ、https://www.psequel.com/ は SSL 証明書が不正だ...。*.herokuapp.com の
証明書を参照している。
## octodown
{{< github_repo "masutaka/docker-octodown" >}}
今回一番の難関でした。結論から書くと、完全な Dockerize は失敗しました。
GitHub markdown のプレビューには {{< post "2015-04-05-1" >}} に紹介した Emacs
から [octodown](https://rubygems.org/gems/octodown) を呼ぶ方法を使っています。
octodown はご覧のとおり依存関係が強烈で、brew install cmake icu4c
が必要なだけでなく、nokogiri や eventmachine など、ネイティブ拡張
を含む gem がゴリゴリとインストールされます。
{{< figure src="/images/octodown-dependencies.png" link="/images/octodown-dependencies.png" target="_blank" rel="noopener" alt="画像" >}}
※ この画像は bundle viz で作りました。brew install graphviz が必要
で、ゴリゴリと依存パッケージがインストールされるので、これも
Dockerize しないと...(連鎖
見よう見真似で Dockerize を終えられたかに見えましたが、最後に罠が
ありました。
octodown は引数に markdown ファイルを渡すと、html をレンダリングし
た後にブラウザで開いてくれます。この時 [launchy](https://rubygems.org/gems/launchy) が使われます。
しかし、octodown は Docker の中にあるので、ブラウザで開くことが出
来ず、エラーになります。
似たような悩みの Issue はありました。
https://github.com/copiousfreetime/launchy/issues/108
あと、今回初めて知ったのですが、octodown は LiveReload という素晴
らしい機能があります。こちらもうまくいきませんでした。Docker のポー
トフォワードを有効にしても、その前でエラーが発生してしまいます。
仕方がないので、今は gem install launchy で凌いでます。[ここがダサ
い回避策](https://github.com/masutaka/docker-octodown/blob/8e26c2ebf604f17d22df9d100fb09951434cf895/bin/octodown#L55-L56)です。どうにかならないかなあ。
launchy の依存関係は軽いので、octodown をインストールせずに済んだ
のは良かったです。
{{< figure src="/images/launchy-dependencies.png" link="/images/launchy-dependencies.png" target="_blank" rel="noopener" alt="画像" >}}
## qiita-markdown-cli
{{< github_repo "masutaka/docker-qiita-markdown-cli" >}}
こちらはあっさり成功。
qiita-markdown-cli が動かなくなっていたので、[workaround](https://github.com/masutaka/docker-qiita-markdown-cli/blob/0ba7edd8a15495a9b77625c7164378816a8b74bb/Dockerfile#L10-L15) を考えたり、
[PR を作ったり](https://github.com/KOBA789/qiita-markdown-cli/pull/2)したくらいです。
Qiita markdown のプレビューには {{< post "2016-01-15-1" >}} に紹介した Emacs か
ら [qiita-markdown-cli](https://rubygems.org/gems/octodown) を呼ぶ方法を使っています。
--------------------------------------------------------------------------------
title: "JAWS UG 2017 に行ってきた #jawsdays"
date: "2017-03-12"
--------------------------------------------------------------------------------

http://jawsdays2017.jaws-ug.jp
AWS 歴 3 年にして初参加。AWS Summit 派だから...(震え
主にサーバレスやコンテナまわりを聞いてた。
以下、スライドを見て思い出したことなどのメモ。登壇者の方の敬称は略
でございます。
## [新訳 とあるアーキテクトのクラウドデザインパターン目録](http://jawsdays2017.jaws-ug.jp/session/1998/)
{{< slideshare "kRvxdoxDhMOaRU" >}}
登壇者: 山﨑奈緒美
{{< slideshare "jEdx07TekRRqxg" >}}
登壇者: 神希嘉
{{< slideshare "9UANJPSlAi9XcJ" >}}
登壇者: 金平晃尚
サーバレスやマイクロサービスの基本的でためになるお話。オンプレから
クラウドに移行するモチベーションは理解できるけど、サーバレスはどん
ななんでしょうかね?まだ解釈できていない。コンテナ化は分かるんだけど。
## [ひとりでも怖くない!コミュニティの広げ方](http://jawsdays2017.jaws-ug.jp/session/1932/)
{{< speakerdeck "78629e45f0404ab79eab9190abdf51e6" >}}
登壇者: 小深田あゆみ
懇親会でなんとか1人2人に話しかけることは出来るけど、そのまま話し
込んでしまうんだよなあ。切り上げ時が分からない。
## [サーバーレスでシステムを開発する時に大切な事](http://jawsdays2017.jaws-ug.jp/session/2005/)
{{< slideshare "qMSfcT8HMKyBI" >}}
登壇者: 比企宏之
[MBS動画イズム444](https://dougaizm444.mbs.jp/)という動画配信サービスをサーバレスで実装したお話。
裏側にサイボウズの [Kintone](https://kintone.cybozu.com/) という CMS を置いて、表側をサーバレスで
実装したとのこと。要件定義から実装まで 3 ヶ月。
とにかく設計が大事ということを強調していた。
P6. 結合先(AWS)は信じない。Lambda が複数回発火することは知ってい
たけど、発火しないこともあるとのこと。アプリケーションレベルでそれ
を考慮した設計にしているとのこと。S3 のファイルを Lambda で処理し
たら別のバケットに移動するとか。残っていたら発火してないので、定期
的に回収する。
P9. EC2 だとシステムが落ちると API も全部が落ちるが、サーバレスだ
と一部の API が落ちることはあり得る。非同期処理を同調させる、分散
アーキテクチャを考える必要がある。
P11. サーバレスを採用すると、運用でカバーが出来なくなり、全部開発
メンバーに返ってくる。(DevOps しかやったことがないので、その辺り
の感覚はよく分からないけど。)
P15. できるだけ Lambda を使わないように設計。例えば有料会員以外は
CloudFront と S3 のみでサイト表示させたり、フロントエンドでできる
動作はフロントエンドで対応。
P20. Lambda を使って、マルチリージョン(世界三箇所)でのモニタリン
グ。本番環境への監視はもちろん、それぞれも監視しあっているらしい。
P21. Lambda の実行回数制限を狙った不正アクセスへの防御。MBS動画イ
ズム444では 1 分間に同じユーザが大量アクセスすることはない。その場
合は当該 IP アドレスをブロック。
質問タイムで、開発環境や結合テストをどうしたのか聞いた。本番のほか
に、ステージング、開発環境全て作ったとのこと。開発期間が短いことも
あり、CI などのテスト環境は準備できなかったらしい。
知見の塊のような発表だった。次の『サーバレスの今と未来』で吉田さん
が言ってたけど、こういう事例がいくつも出てくると助かる。
## [サーバレスの今と未来](http://jawsdays2017.jaws-ug.jp/session/1377/)
{{< slideshare "JMLa47ts6Xwidy" >}}
登壇者: 吉田真吾
去年開催された [ServerlessConf Tokyo](http://tokyo.serverlessconf.io/) の主催者の方。サーバレスやって
みるかという気分になった。
P18. [Serverless Framework](https://serverless.com/) が人気だけど、DynamoDB や API Gateway と
の親和性を考えると [AWS Serverless Application Model (SAM)](https://github.com/awslabs/serverless-application-model) がオスス
メらしい。SAM はサーバーレスアプリケーション全体を CloudFormation
テンプレートで管理できる。
Serverless Framework だと、DynamoDB のテーブル定義が出来ないの?
よく分からない。
P22. [Commercial Search](https://www.commercialsearch.com/) というサービス。ビジネスロジックは
TypeScript のみ。サーバレスにしたおかげで、開発時間の多くをビジネ
スロジックに割くことが出来たらしい。
P34~ JS + Cognito + Lambda + DynamoDB によるサーバレスアプリケーショ
ンのサンプル。Lambda を使っているのは、フロントエンドから直接
DynamoDB を読み書きすると、不正なクエリ実行などを許してしまうため。
P47. {{< amazon_link asin="B01KGKR6LO" title="Serverless Single Page Apps" >}}. ↑のアプリを読み進めるだけで
作成できる Step by Step ガイド。翻訳版を準備中だが、日本語訳がイマ
イチなので、レビューしてくれる人を募集中とのこと。
{{< tweet user="nakayama_san" id="840438688517521409" >}}
すごい。
## [コンテナに挫折したあなたへ](http://jawsdays2017.jaws-ug.jp/session/1659/)
{{< speakerdeck "e834e63027cb43d090cbdd3c8533863b" >}}
登壇者: 原康紘
私のための発表か。
開発環境からコンテナ化を進めようとしているが、優先度の高い作業に忙
殺されて、進捗が全くないありさま...。
Rails を始めとして、上から下まで分かる方のようで、腑に落ちる具体例
が多かった印象。
(EC2)インスタンスではなく、クラスターで管理するイメージはついた。
後はやるだけ・・・!
## [AWSデータベースアップデート 2017](http://jawsdays2017.jaws-ug.jp/session/1220/)
TODO: 資料が公開されたらここに貼る
登壇者: 星野豊
来週、RDS のマイナーアップデート作業が控えているので、正座して聞い
た。しかしそのアップデートの話ではなかった(当たり前)。
Aurora 推しに時間を割いた印象。たしかに魅力的ではある。早く移行し
たい。
MySQL を Fork し、Aurora としての実装を進めつつ、MySQL の変更もマー
ジしていく AWS のパワーすごい。
途中、Aurora のパフォーマンスすげーというグラフがあったが、よく見
たらインスタンスタイプを上げれば(札束を用意すれば)MySQL や
PostgreSQL と比べて、どんどん上がるというグラフだった。
--------------------------------------------------------------------------------
title: "DynamoDB で TTL が実装されたので、Rails4 から使ってみた"
date: "2017-03-02"
--------------------------------------------------------------------------------
先日、ついに DynamoDB に TTL が実装されました。
[新機能 – TTL(Time to Live)機能を利用したDynamoDBアイテムの管理について|Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/new-manage-dynamodb-items-using-time-to-live-ttl/)
仕事では Rails4 のセッションストアに ElastiCache for Redis を使っ
ているのですが、{{< post "2016-10-24-1" >}} に書いたとおり、スケールが辛いです。
作業自体もそうですし、ElastiCache for Redis はスケールアップのみで
スケールアウトが出来ません。CPU パワーじゃなくてストレージが欲しい
のじゃ...。
DynamoDB はインスタンスの管理が不要なため、もし移行出来たらとって
もうれしいです。お値段も ElastiCache よりずっと安そうです。
https://aws.amazon.com/jp/dynamodb/pricing/
いろんな期待を込めて、ちょっと触ってみました。
## 準備
こちらの記事を参考にして、Rails4 のセッションストアを DynamoDB に
します。
[Rails4 でセッションストアに DynamoDB を使う | Developers.IO](http://dev.classmethod.jp/cloud/aws/rails4-dynamodb-sessionstore/)
2013年11月05日と古めの記事ですが、現在も動くことを確認しました。
当時はまだ TTL が実装されていないので、
> $ bundle exec rake db:sessions:cleanup
で期限切れのデータを削除する方式です。
なぜか migration ファイルに拡張子 .rb が付かず、db:migrate で
DynamoDB のテーブルが作られませんでした。適当にリネームして下さい。
## DynamoDB に expired_at を追加
DynamoDB で expired_at フィールドを追加する修正をしてみました。
動けば良いレベルです。
https://github.com/aws/aws-sessionstore-dynamodb-ruby/compare/master...masutaka:expired_at?expand=1
こいつを元の gem の代わりに指定します。
```
gem 'aws-sessionstore-dynamodb'
↓
gem 'aws-sessionstore-dynamodb', github: 'masutaka/aws-sessionstore-dynamodb-ruby', branch: 'expired_at'
```
すでに config/sessionstore/dynamodb.yml が作られていると思うので、
max_stale を設定します。今回は動作確認のため 60 にしました。単位は
秒です。
> max_stale: 60
すでに DynamoDB に sessions Table が出来ていると思うので、今回追加
した expired_at フィールドに TTL を設定します。

あとは Rails を動かしてログインとかすれば、expired_at 付きのセッショ
ンが作られていると思います。

このアイテムは expired_at から 30 分程度で削除されました。
> TTL管理が有効になると(1回のAPI呼び出しで両方の操作が処理されます)、
> DynamoDBは期限切れのアイテムを見つけて削除します。 この処理は、自
> 動的かつバックグラウンドで行われ、テーブルへの読み取りまたは書き込
> みトラフィックには影響しません。
初めの AWS のブログに書かれているように、expired_at ピッタリで削除
されるわけではないようです。この辺は Redis も似た動作だったような。
いずれにせよ、セッションストアとしては十分な動作だと思います。
## 心配なこと
- aws-sessionstore-dynamodb gem の aws-sdk は v1 です。
[v2 にしたいとは思っているようです。](https://github.com/aws/aws-sessionstore-dynamodb-ruby/issues/7#issuecomment-270953691)
- そもそも DynamoDB をセッションストアにして、本当に大丈夫かな?
速度面、コスト面など、調べる必要があります。
- 開発環境はどうしようか。開発者ごとに DynamoDB の Table を作れば
良いかもしれません。工夫が必要そう。
**追記(2017-03-03):**
[DynamoDB のダウンロード可能バージョン](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html)を教えてもらいました。開発環
境はこれを使えば良さそうです。
--------------------------------------------------------------------------------
title: "git-hyper-blame のセットアップ方法と使い方"
date: "2017-02-26"
--------------------------------------------------------------------------------
任意のコミットを無視して git blame してくれるやつ。いわゆるメガコ
ミットを無視した blame をしたいときに使える。
なぜかセットアップにひどくハマったのでメモ。
## セットアップ方法
1. git clone してくる
> $ git clone https://github.com/google/proto-quic.git
2. 以下のように、パスの通ったディレクトリに git-hyper-blame という
名前のシンボリックリンクを作る。git のサブコマンド hyper-blame が
利用可能になる
> $ ln -s ~/src/github.com/google/proto-quic/depot_tools/git_hyper_blame.py ~/bin/git-hyper-blame
※ Python は macOS Sierra 付属の /usr/bin/python (Python 2.7.10) で
動きます。pip install とかも不要です。
## 使い方
普通の blame はこちら。
```
$ git blame Gemfile
99d5ce00 (Takashi Masuda 2016-08-26 23:06:50 +0900 1) # frozen_string_literal: true
99d5ce00 (Takashi Masuda 2016-08-26 23:06:50 +0900 2)
^1039771 (Takashi Masuda 2016-07-16 13:28:00 +0900 3) source 'https://rubygems.org'
^1039771 (Takashi Masuda 2016-07-16 13:28:00 +0900 4)
d1213a45 (Takashi Masuda 2016-12-31 13:50:21 +0900 5) ruby '2.4.0'
^1039771 (Takashi Masuda 2016-07-16 13:28:00 +0900 6)
```
hyper-blame で d1213a45 を除外してみる。5 行目が変わった。
```
$ git hyper-blame -i d1213a45 Gemfile
99d5ce00 (Takashi Masuda 2016-08-26 23:06:50 +0900 1) # frozen_string_literal: true
99d5ce00 (Takashi Masuda 2016-08-26 23:06:50 +0900 2)
1039771a (Takashi Masuda 2016-07-16 13:28:00 +0900 3) source 'https://rubygems.org'
1039771a (Takashi Masuda 2016-07-16 13:28:00 +0900 4)
3f3219d1 (Takashi Masuda 2016-11-23 18:50:22 +0900 5*) ruby '2.4.0'
1039771a (Takashi Masuda 2016-07-16 13:28:00 +0900 6)
```
.git-blame-ignore-revs というファイルに、除外したい commit を列挙
しても同じ効果が得られる。
```
$ echo d1213a45 > .git-blame-ignore-revs
$ git hyper-blame Gemfile
99d5ce00 (Takashi Masuda 2016-08-26 23:06:50 +0900 1) # frozen_string_literal: true
99d5ce00 (Takashi Masuda 2016-08-26 23:06:50 +0900 2)
1039771a (Takashi Masuda 2016-07-16 13:28:00 +0900 3) source 'https://rubygems.org'
1039771a (Takashi Masuda 2016-07-16 13:28:00 +0900 4)
3f3219d1 (Takashi Masuda 2016-11-23 18:50:22 +0900 5*) ruby '2.4.0'
1039771a (Takashi Masuda 2016-07-16 13:28:00 +0900 6)
```
See also [git-hyper-blame(1)](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/git-hyper-blame.html)
--------------------------------------------------------------------------------
title: "18 年 4 カ月使った au を解約して IIJmio に乗り換えた"
date: "2017-02-25"
--------------------------------------------------------------------------------
IDO 時代も含めると 1998 年 10 月 から au 一筋で使ってきましたが、先程格安 MVNO の [IIJmio](https://www.iijmio.jp) に乗り換えました。
やっぱり料金が高すぎですからね...。こんなに長期間使っているのに、まったく減らないってどういうことなの。
移行後の月額料金はご覧のとおり、めっちゃ安くなりました。
移行前: 5,128 円(税込)
移行後: 1,728 円(税込)
※ 移行前は iPhone の分割代金を除外しています。含めると 7,823 円です。
※ 通話はほとんどせず、データ通信も毎月 3GB 未満です。
やってみたら案外簡単で、全部自宅で済ませることが出来ました。
以下、今回のまとめです。
## 1. SIM ロック解除
au の iPhone6s は、購入後 180 日経てば SIM フリーにできるそうです。
私は去年の 5 月に解除しました。au ショップに行かずとも、自宅で SIM フリーにできます。
なにか重要なこと言ってた。3,000 円ってマジか。
{{< tweet user="masutaka" id="731362026841243648" >}}
au はここから可否判定できます。条件も書いてあります。
https://au-cs0.kddi.com/au-support/sui/SUI001W001/SUI0010001BL.do
こんな仕組みらしいです。
{{< tweet user="masutaka" id="731362287403991040" >}}
## 2. 更新月の確認
去年後半は若干出費がかさんだので、今回は違約金を払わない方法を採用しました。キャリアに問い合わせて確認します。
丁寧なことに IIJmio のサイトに各キャリアの問い合わせ先が書いてあります。
https://www.iijmio.jp/hdd/miofone/mnp.jsp
au は 157 でも大丈夫でした。
https://www.au.com/support/inquiry/mobile/general/
私の場合の違約金は 10,260 円(税込)で、発生しないのは更新月とその翌月でした。
https://www.au.com/support/faq/view.k1203210002/
更新月に合わせて、溜まったポイントを au WALLET カードにチャージして出来るだけ使い切りました。
## 3. MNP 予約番号を発行する
タイミングを見計らって、MNP 予約番号を発行しました。
au は解約時に、基本料金は日割りしてくれますが、データ定額5などの通信料はしてくれません。
:link: https://www.au.com/mobile/charge/basic-charge/data-teigaku/
> 月の途中でのご解約などの場合、日割とならず満額がかかります。
また、MNP 予約番号には有効期限(今回は 2 週間)があります。
以上を考慮して、今回は 2/19(日)に MNP 予約番号を発行しました。前述のキャリアの問い合わせ先から予約番号を発行できます。
さまざまな提案をして引き止めをして来るかもしれませんが、**強い意志を持って**発行して下さい。
予約番号を発行しても、使わなければキャリアとの契約は継続されます。とにかく発行することが重要です。
## 4. IIJmio のサイトで申し込む
MNP 予約番号が発行されたら、前述の IIJmio のサイトから申し込みます。これはタイミングを計る必要はありません。
https://www.iijmio.jp/hdd/miofone/mnp.jsp
本人確認書類も必要です。iPhone ユーザは [Genius Scan](https://itunes.apple.com/jp/app/genius-scan-pdf-scanner/id377672876) を使うときれいに pdf 化できますよ。
ミニマムスタートプラン&通話定額オプションなしを申し込みました。SIM 1 枚、回線 docomo、月 3GB です。
[料金・仕様|タイプD|IIJmio](https://www.iijmio.jp/hdd/spec/typed.jsp) の「音声通話機能付きSIM(みおふぉん)」になります。
基本料 900 円 + 通話と SMS 700 円 = 月額 1,728 円(税込)
[1 回の通話が 3 分または 5 分以内なら無料の通話定額オプション](https://www.iijmio.jp/hdd/voicefree/)がありましたが、必要なさそうなので見送りました。
最初は回線を au にする気マンマンでしたが、[この記事](http://k-tai.watch.impress.co.jp/docs/column/mca/1043821.html)を見て docomo にしました。初 docomo です。ちょっとワクワク。
3 日後に SIM カードが届きました。
**追記(2017-02-26):**
Amazon でこちらを購入すれば初期手数料を約 2,800 円抑えられました。
{{< amazon asin="B00J8B7WWG" title="IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043" >}}
[IIJmio のサイトで申し込む時に、記載されているエントリーコードを使うと安くなるようです。](http://www.daipanman.com/entry/2016/09/26/211515#2-AmazonでSIMパッケージを買う)見た記憶はありましたが、その時はよく分からずスルーしてしまいました...。
12 ヶ月間 2GB 増量のパックも出てました。こちらは初期手数料を約 2,500 円抑えられます。
{{< amazon asin="B014GZEPZA" title="IIJmio みおふぉん SIMカード 音声通話パック ( バンドルクーポンキャンペーン中 2GB増量×12ヵ月間 ) FFP【Amazon.co.jp 限定】" >}}
## 5. MVNO 開通
同封の冊子に従って、開通手続きをします。
きれいに書くと、こんな流れになります。
1. 機械応答の IIJmio オンデマンド開通センターに電話し、対象の電話番号や新しい SIM 番号の下 4 桁を入力する
2. 数時間(今回は 50 分だった)待つと au のアンテナが NO SERVICE に変わるので、SIM を差し替える。IIJmio からのメールでも開通を知ることが出来る
3. 端末を再起動する
4. APN 構成プロファイルをインストールする
5. 電話代が半額になる『[みおふぉんダイアルアプリ](https://itunes.apple.com/jp/app/miofondaiaruapuri/id979168845)』と、いい感じにクーポンを使ってくれる『[IIJmioクーポンスイッチ](https://itunes.apple.com/jp/app/iijmio%E3%82%AF%E3%83%BC%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81/id629809928)』アプリをインストールする
実際は勢いあまって、最初に SIM を差し替えてしまい、電話するために戻したりしました...。
あと、開通前に、キャリアメールアドレスから何人かにメアド変更のお知らせをしました。家族と高校時代の友人にしか使っていなかった。
## 感想
思っていたより手続自体は簡単でしたが、そのための準備が面倒くさかったです。
まだ初日で使用感とか分かりませんが、まわりの評判を聞くと問題なさそうです。キャリアのメールアドレスを捨てることも出来、気分的もすっきりです。
親が iPhone を使いたがっていたけど、ガラケーを SIM フリー iPhone に移行させられるかな。難易度高い。
## 紹介コード
[この URL](https://www.iijmio.jp/campaign/mgm/invite/?id=238178399405311&sns=0) から登録すると、あなたも私もデータ量が 2 ヶ月間 10% 増えるそうです。よろしければどうぞ。紹介コード自体は以下になります。
> 238 1783 9940 5311
紹介した人への特典も 500 円割引とかいろいろあるらしいので、IIJmio 始めたら、みなさんも紹介すると良いと思います。
[お友達紹介キャンペーン|IIJmio](https://www.iijmio.jp/campaign/mgm/member/)
--------------------------------------------------------------------------------
title: "第18回Elasticsearch勉強会に参加してきた #elasticsearchjp"
date: "2017-02-21"
--------------------------------------------------------------------------------
[第18回elasticsearch勉強会|Meetup](https://www.meetup.com/Tokyo-Elastic-Fantastics/events/237511494/)
前々回 {{< post "2016-06-28-1" >}} に続いて、2 回目の参加です。今回は先週社内勉
強会で発表したばかりだったので、熱量高めでした。いや、むしろ燃え尽
きていたかも...。
[自分のブログに Elasticsearch + Vue.js で検索機能を付けたという発表をした|feedforce Engineers' blog](http://tech.feedforce.jp/vue-elasticsearch.html)
※ このブログ右上の検索ボックスのお話です
## What's new Elastic Stack 5.2
{{< speakerdeck "6444aea4e2014f84a942ee8cb2dcb72c" >}}
Elastic 社の Jun Ohtani さん
Elasticsearch 5.1 ~
- Cancel long-running "Search" task by the task management API
Elasticsearch 5.2 ~
- Index and search numeric and data ranges
- Keyword field with Normalizer
- Can break terms down into partitions
ちょうど今回 5.1 の検索を使ったのでタイムリーでした。大文字小文字
を区別させない検索に Keyword field with Normalizer が使えそうです。
Metricbeats は zabbix-agent の Elasticsearch 版みたいなやつらしい。
Elastic Cloud で使われているのかしら?(よく分かっていない)
5.1 から JSON in JSON をパースできるらしい。
## pairs での Elasticsearch
TODO: 資料が公開されたらここに貼る
株式会社エウレカの小島広樹さん
フロントエンドは Angular.js + TypeScript、バックエンドは golang、
DB は MySQL とのこと。
去年初めに PHP から golang にリプレイスした時に、MySQL での全文検
索が遅すぎて、Elasticsearch を導入したらしい。
インフラ担当が昔使っていて、小島さんは使っていなかったらしい。それ
で1人月かからないくらいで導入ってマジか。
負荷対策に力を入れているそう。1000 queries/sec に対して、1query あ
たり 100msec 切るようにチューニングしたとのこと。
## Retty の Elasticsearchの使い方
TODO: 資料が公開されたらここに貼る
Retty 株式会社の李晟圭(イ・ソンギュ)さん
(Kibana の)ダッシュボード 30 個、Visualize 200 個とはすごい。
3 nodes, 2 shards, 2 replicas
20gb, 20,000,000 records(documents) / node
とのこと。
辞書は kuromoji-neologd に自然言語処理で出した単語を追加して運用し
ているそう。
## Elasticsearch 5.2 と Java Client で戯れる
{{< slideshare "zp6zR26N9TwdnX" >}}
ヤフー株式会社の森谷大輔さん
Elasticsearch には(Web API ではなく)Java API があり、Java Client
で直接通信できるらしい。9300 番ポート。
今回は前処理でいろいろやりたかったので、Logstash や Beat を使わず
に Java Client を使ったとのこと。
hasFailures() が false を返すことが Success と気づくまでに 2 時間
費やしたらしい。これはつらい。
## Amazon Elasticsearch Service を使ってコンテンツ検索を速くした話
TODO: 資料が公開されたらここに貼る
株式会社ヒトメディアの中村真一郎 さん
Mroonga で構築された、結構大変なことになっていたシステムを Amazon
Elasticsearch Service (AES) で速くしたお話。入社直後だったり、いろ
いろ分からないことだらけで大変だったとのこと。
帰り際に、遅かったのは Mroonga のせいではなくて、元の実装が原因だっ
たとか少し話しました。ですよねー。
Elastic Cloud じゃなくて AES を使ったのは、チーム的に(?) AWS で統
一したい意向があったとのこと。
個人的には AES はアップデート大変だし、VPC 対応されてないし、上記
のような事情を除けば選択するメリットは少ないように思いました。
## その他 思ったことなど
{{< tweet user="masutaka" id="833688190733078533" >}}
{{< tweet user="masutaka" id="833688463778025473" >}}
{{< tweet user="masutaka" id="833689350055489536" >}}
{{< twitter "johtani" >}} はじめとした主催者の皆様、ありがとうございました。
自分用メモ: {{< tweets_on_the_day text="勉強会当日のツイート" day="2017-02-20" >}}
**追記(2017-02-22):**
他の方の参加記事
[第18回Elasticsearch勉強会に参加してきました #elasticsearch - まめログ](http://mamelog.hatenablog.jp/entry/2017/02/21/000623)
--------------------------------------------------------------------------------
title: "同じ Ajax 処理を Vue.js と jQuery で書いてみた"
date: "2017-01-27"
--------------------------------------------------------------------------------
最近 [Vue.js](https://jp.vuejs.org/) で、ようやくリアクティブプラグラミングに入門できました。
会社で毎週金曜日に開催されている、インフラ共有会(!)で Vue.js と
jQuery の違いを紹介しました。メモがてら、貼り付けておきます。
順番的には Vue.js で書いたものを jQuery で書き起こしました。
## jQuery + Ajax
- JS が HTML を生成したり、HTML の DOM 構造を知る必要があり、変更
に弱い
- HTML コードを見ても、ol タグの中身が空っぽで、これから何が入るの
か不明。JS も読む必要がある
{{< gist "masutaka" "2e907d48b0fd26b1008d2ff13e1c0a9a" >}}
## Vue.js + Ajax
- JS はほぼ関数定義に特化している。HTML の DOM 構造も知らなくて良い
- HTML コードを読めば、どんなレンダリングがされるか想像がつく。v-
から始まる、データ&モデルバインディング等があるが、無視して読むこ
とも可能
{{< gist "masutaka" "a0a2156af71575c3caa87be8c6047aca" >}}
--------------------------------------------------------------------------------
title: "完全に闇に落ちていた StartSSL に ¥3,603 課金してしまったお話"
date: "2017-01-10"
--------------------------------------------------------------------------------
このサイトは 10 ヶ月ほど前の {{< post "2016-03-15-1" >}} に http2 対応したタイ
ミングで SSL 証明書を取得しました。
当時すでに [Let's Encrypt](https://letsencrypt.org/) が使われ始めていましたが、Chef の構成管理
が面倒そうなのと、1 年に 1 回の更新なら手間でもないだろうというこ
とで、[StartSSL](https://www.startssl.com/) で SSL 証明書を取得しました(自身初の経験)。
今回はサブドメインを 1 つ追加するために、StartSSL の管理画面から
SSL 証明書を作成し差し替えたのですが、どうもうまくいかない。Chrome
だと NET::ERR_CERT_REVOKED というエラーになってしまう。

macOS の curl だと Invalid certificate chain になるけど、Linux の
curl は問題なかったり、macOS も Firefox ではエラーにならなかったり、
法則性が見いだせませんでした。
仕方がないので、サーバ側の問題とは認識しつつも、切り分けのために
macOS の Keychain Access の StartSSL っぽい Certificate を削除した
が現象変わらず。
私の SSL 証明書への耐性が少ないこともあり、「以前の証明書と干渉し
ているのかな?」と仮説を立て、StartSSL で作った以前の SSL 証明書を
Revoke してみました。
ただ、StartSSL は Class1 の SSL 証明書であっても手数料が必要です。
> https://www.startssl.com/Support?v=25#72
>
> 72.) I made a mistake, can I get my certificate revoked?
> Revocations carry a handling fee of currently US$ 9.90. (snip)
切り分けのためにはまあいいかと、奮発して(!) 3 つの SSL 証明書を
Revoke しました。日本円にして ¥3,603 。今にして思えば嗚呼...。
12:52 に申請して、23:16 に無事 Revoke されました。やったー!
あれ、まだ直らない・・・?
{{< tweet user="masutaka" id="818463622460383232" >}}
お、なんだろう?
{{< tweet user="hoppiestar" id="818488121725550593" >}}
ババーン!
[中国の認証局が不正な証明書、主要ブラウザが無効化を通告 - ITmedia エンタープライズ](http://www.itmedia.co.jp/enterprise/articles/1611/02/news082.html)
> 中国の認証局WoSignと傘下のWoSignが不正な証明書を発行していたことが
> 分かったとして、米MozillaやGoogle、AppleがそれぞれのWebブラウザで
> 両社の証明書を信頼できない証明書として扱うと表明した。
>
> Googleは10月31日のブログで、Chrome 56(2017年1月にリリース予定)以
> 降のバージョンではWoSignとStartComが10月21日以降に発行した証明書を
> 信頼できる証明書として扱わないと表明した。
えぇ...。(このニュースに気づかなかった自分にも困惑)
> それより前に発効された証明書については当面の間、条件付きで信頼する
> が、そうした例外は両社の証明書を使っているWebサイトに対して信頼で
> きる別の認証局への移行を促すための措置だとした。
>
> MozillaのFirefoxでもWoSignとStartComが10月21日以降に発行した証明書
> について、Firefox 51(現在aurora版、安定版は2017年1月24日リリース
> 予定)以降のバージョンで無効とする。
{{< tweet user="masutaka" id="818489833622368256" >}}
> Mozillaなどは認証局に対して2016年1月1日までにSHA-1を使ったSSL証明
> 書の発行を中止するよう求めていたが、WoSignはこの措置を免れる目的で、
> 証明書に実際よりも前の日付を入れていたことが分かったという。
>
> さらに、WoSignは別の認証局のStartComを買収していたにもかかわらず、
> その事実を公表しなかったとMozillaは指摘した。Googleもこの買収につ
> いて「WoSignとStartComは証拠を突き付けられると、買収および両社の関
> 係についてブラウザコミュニティをあざむこうと画策した」と批判している。
はあ?完全に真っ黒でないですかい!なぜ自滅の道に...。
ニュースを知らなかったとはいえ、まさか SSL 証明書の発行元が原因だっ
たとは...。私の切り分け能力もまだまだのようです。
今は取り急ぎ発行した Let's Encrypt の証明書で、このサーバの https
は動いています。
無料の SSL 証明書は Let's Encrypt 一択なんですかね? 粛々と正式対
応を進めていきます...。
最後に。
WoSign と StartSSL は◯ねや! ログインしてもそれが一切分からない
StartSSL は特に。
StartSSL の管理画面は SSL 証明書でログインするのがカッコよくて、好
きだったんだけどなあ...。
こんなことにお金を使ってしまった自分に遺憾の意を表明します。
**追記(2017-12-02):**
2017-11-16 に今年いっぱいで新規証明書の発行を停止、2018 年から 2
年間は証明書の検証サービスのみ提供、2020 年からは全ての証明書が失
効すると発表されていました。まだ発行しているのか...。
・[Termination of StartCom business - StartSSL™ Certificates & Public Key Infrastructure](https://www.startcomca.com/index/News/newDetail?date=20171116)
・{{< wikipedia "StartCom_Certification_Authority" >}}
--------------------------------------------------------------------------------
title: "Software Design を 13 ヶ月分まとめ読みした"
date: "2017-01-03"
--------------------------------------------------------------------------------
11 月初旬から 2 ヶ月近く、ようやく本日新幹線の中で読み切りました。
業務で 1 サーバあたりの許容 http リクエスト数を調べる必要があったのが発端でした。2015年12月号から 4 回に渡って連載された『クラウド時代のWebサービス負荷試験再入門』に感謝です。ELB の後ろの App サーバを何台置くとか、みんなどうやって決めているのですかね?
- [Software Design 2015年12月号|技術評論社](http://gihyo.jp/magazine/SD/archive/2015/201512)
- [Software Design 2016年1月号|技術評論社](http://gihyo.jp/magazine/SD/archive/2016/201601)
- [Software Design 2016年2月号|技術評論社](http://gihyo.jp/magazine/SD/archive/2016/201602)
- [Software Design 2016年3月号|技術評論社](http://gihyo.jp/magazine/SD/archive/2016/201603)
この記事だけ読むのも勿体ないので、できるだけ全部の記事も読んでました。そしたら「最新号までいけるんじゃないか?」という気になり、結果的に2016年12号分まで読み切ることができました。意識を高く保つのが大変でしたが、読んで良かったです。
読んで実感したのは、普段 Web の記事や技術書を読んでいると、どうしても自分というフィルターがかかるということ。
雑誌だと、あまり興味なかったり掘り下げていない分野も目に飛び込んでくるので、良い補完になりました。Software Design は DB の連載が多いので、苦手意識のある自分には良い学習になりました。
あと大きな声で言えませんが、[2016年7月号](http://gihyo.jp/magazine/SD/archive/2016/201607)の『正規表現入門』が役に立ちました。".*?" の最小マッチを今さら知っただなんて誰にも言えない...。
号を進めていくと、雑誌の構成がわかってくるので、読むスピードがちょっとだけ早くなった気がします。
## これからの予定
- 出たらすぐに読む
- 最新号([2017年1月号](http://gihyo.jp/magazine/SD/archive/2017/201701))も読む
- 早くしないと2017年2月号が出てしまう...
- [WEB+DB PRESS](http://gihyo.jp/magazine/wdpress) も 2016 年分から最新号まで読む
- 隔月発売だから助かります(あかん
{{< amazon asin="B01MFBDOTV" title="ソフトウェアデザイン 2017年 01 月号 [雑誌]" >}}
--------------------------------------------------------------------------------
title: "任意の Ruby オブジェクトを YAML として書く"
date: "2016-12-19"
--------------------------------------------------------------------------------
実際使うことはないだろうがメモ。
```
hoge:
!ruby/object:ActiveSupport::Duration
value: 7776000
parts:
- - :months
- 3
```
## 結果
hoge を取り出すと、ActiveSupport::Duration としての 3 months が
格納されている。
```
$ irb -r active_support/time -r yaml -r erb
irb(main):001:0> YAML.load(ERB.new(IO.read('hoge.yml')).result)
=> {"hoge"=>3 months}
irb(main):002:0> YAML.load(ERB.new(IO.read('hoge.yml')).result)['hoge']
=> 3 months
irb(main):003:0> YAML.load(ERB.new(IO.read('hoge.yml')).result)['hoge'].class
=> ActiveSupport::Duration
```
## 求め方
```
irb(main):007:0> print YAML.dump(3.months)
--- !ruby/object:ActiveSupport::Duration
value: 7776000
parts:
- - :months
- 3
=> nil
```
## 参考情報
- [library yaml (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/2.3.0/library/yaml.html)
- [Rubyist Magazine - プログラマーのための YAML 入門 (中級編)](http://magazine.rubyist.net/?0010-YAML)
--------------------------------------------------------------------------------
title: "Ruby の $ERROR_INFO などの特殊変数は require 'English' が必要だったのか"
date: "2016-12-19"
--------------------------------------------------------------------------------
先日会社の tech channel で話題になったのでメモ。Rubiest の方々にとっ
ては常識なんですかね...?
```
$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15]
$ ruby -e 'raise "aaa" rescue p $!'
#
$ ruby -e 'raise "aaa" rescue p $ERROR_INFO'
nil
$ ruby -r English -e 'raise "aaa" rescue p $ERROR_INFO'
#
```
Ruby はグローバル変数の初期値が nil なのがたちが悪い。個人的にはも
う $ERROR_INFO とかは使わないと思う。
> C: Prefer $ERROR_INFO from the stdlib 'English' module over $!.
RuboCop 先生がこのようにお怒りだったので、出来るだけ長い変数名を使
うようにしていましたが、行間を読む必要があったみたいです。
=> require 'English' も必要。
関連情報
- [library English (Ruby 2.3.0)](https://docs.ruby-lang.org/ja/latest/library/English.html)
- https://github.com/bbatsov/rubocop/issues/1747#issuecomment-164329831
> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/9271
>
> まつもと ゆきひろです
>
> In message "[ruby-dev:9270] Re: bang method returns string always"
> on 00/02/23, GOTO Kentaro writes:
>
> |>$~などの記号でない代替が必要だろうとは昔から思ってるんです。
> |
> |English.rb を組み込みにするのはどうですか??
>
> 記号変数の撲滅と言う観点では前進ですが、$の削減と言う観点か
> らは前進じゃないんですよねえ。
そういえば、まつもとさんは長い変数名が好きではないと、rebuild.fm
の [155](https://rebuild.fm/155/) か [158](https://rebuild.fm/158/) で話してました。
> http://perldoc.jp/docs/perl/5.20.1/perlvar.pod
>
> 以下の名前は Perl では特別な意味を持ちます。 記号的な名前の多くは記憶法があるか、シェルでの類推が可能です。 それでも長い名前を使用したい場合には
>
> use English;
>
> とプログラムの最初に書いてください。
Perl 由来らしい。
関係ないけど Perl(真珠)は Shell(殻)に対応(?)していたのですね。
--------------------------------------------------------------------------------
title: "不惑の年に風呂の良さを知った"
date: "2016-12-14"
--------------------------------------------------------------------------------
この記事は [feedforce Advent Calendar 2016](http://www.adventar.org/calendars/1427) の 14 日目の記事です。
13 日目はハッシーの『[フィードフォースでの映像制作について](http://lineblog.me/hszmtmhr/archives/70668.html)』でした。
彼らがつい二週間前にリリース(?)したシンゴジラのパロディムービーは、
密かに今までで一番のお気に入りです。社内限定で今までのムービー見ら
れないかなー。
さて、私も表題の年齢になり、季節の変わり目はひどい肩こりや頭痛に悩
まされる日が出てきました。普段は気になりませんが、この時だけはたま
らず整体に行きます。あまりにひどいと寝込んでしまうことも。
とは言え、昔から体だけは丈夫で、体調が悪くなることはそうそうありま
せん。寝込むのは年に一度くらい。あと二日酔い。二日酔いツライ。
ただ、体が冷えるとあっさり風邪を引くことが分かってきたので、会社で
は毛布モドキを被り、家では{{< amazon_link asin="B0140EYWW8" title="着ぐるみモドキ" >}}を履き、だいぶ気を付けてい
ます。
10 月のあの日もそうでした。急に気温が下がり、肩がこり、こりゃ風邪
引くかなーと思っていたところ、何の気なしに湯船にお湯を張り風呂に入
りました。1年前に引っ越してから初めての風呂です(汚くはない)。
そしたらびっくり。肩こりがすーっと消え、体もポカポカです。その日を
境に、週に何度か風呂に入る日が始まりました。
## どのようにして風呂に入るか
詳しく説明させて頂きます。
何はなくともまずは掃除です。今の部屋に引っ越してから、[CaSy](https://casy.co.jp/) に月一
で来てもらっている {{< post "2015-12-27-1" >}} ので、基本的にはきれいです。でも
入る前の掃除はもちろんします。
掃除が終わったらお湯を溜めます。10 月だと 44 度、今だったら 45 度
くらいを 10 分ですね。私は昔から熱い風呂は好きではないのですが、風
呂の蓋は買ってないので設定温度は熱めです。
未だにお湯張りタイマーの使い方が分かりません。一度、90 リットルの
つもりが、90 度のお湯を溜めてしまい、泣きながら水で薄め続けました。
お湯が溜まったら速やかに風呂に入ります。iPhone をドアの外に置き、
静かな音楽をかけます。給水用のお茶や水も置きます。間違ってもついで
の洗濯は止めましょう。静かな音楽が台無しです。
軽くお湯で体を流し、湯船にゆっくりと浸かります。歯磨きをするのも良
いでしょう。
適度に暖まったら体を洗います。朝の忙しい時間ではないので、ゆっくり
出来るのが良いですね。洗い終わったらまた湯船に浸かります。この辺で
給水するのも良いでしょう。
次は頭を洗います。最近は意識高いので、3日に一度はこちらで皮脂をズ
ビっと落としています。リンスやコンディショナー必須。
{{< amazon asin="B002TEXCGO" title="コラージュフルフル ネクストシャンプー すっきりさらさらタイプ 400mL (医薬部外品)" >}}
それ以外はこちらを使っています。逆に皮脂を落としすぎないシャンプー
です。リンスやコンディショナー不要です。前々職の先輩に教えてもらい
ました。
{{< amazon asin="B0093GJV3O" title="アジュバン RE:エミサリーシャンプー レフィル 700ml" >}}
どちらも安くないですが、一日あたりに換算すると大したことないので、
ここ数年使っています。
顔を洗いつつ髭を剃ったら、最後の湯船です。風呂で髭を剃る人って、ど
のくらいいるのですかね?
出る時に潔くお湯を捨てます。以前は洗濯に使っていましたが、水道代が
変わらないことに気づいたので、[ふろ水ポンプはジモティーで譲ってしま
いました](http://jmty.jp/tokyo/sale-ele/article-17d8d)。全部流れたら、シャワーで髪の毛など流しておきます。
今の時期、このまま外の空気にあたると気持ち良いですが、冷え過ぎは禁
物です。
## まとめ
- 風呂に入るだけでこれだけライフチェンジングとは!
- 同じ悩みを抱えている人がいたら、是非試してみて下さい
- これから風呂に入ります
## 付録: マスタカの風呂年表
ここ数年、いかに湯船に浸かっていなかったか、年表にしてまとめておき
ます(誰得や...)。
|期間|頻度|環境|場所
|---|---|---|---
|1976.01 〜 1994.03|毎日|一軒家、風呂トイレ別|浜松市(実家)
|1994.04 〜 2000.03|ゼロ|1DK、風呂トイレ一緒|宇都宮市
|2000.04 〜 2004.07|ほぼゼロ|1K、風呂トイレ別|大田区
|2004.08 〜 2005.04|時々| 2DK、風呂トイレ別、追い焚き機能付き|川崎市
|2005.05 〜 2011.04|時々|2K、風呂トイレ別|川崎市
|2011.05 〜 2012.07|完全にゼロ|ほぼ一軒家をルームシェア、風呂トイレ別、追い焚き機能付き|神戸市
|2012.07 〜 2015.11|完全にゼロ|2LDK をルームシェア、風呂トイレ別、追い焚き機能付き|世田谷区
|2015.11 〜|数日に一度|1K 、風呂トイレ別|荒川区
明日のアドベントカレンダーは誰もいな...と思ったら、ヨースケベーさ
んが入って下さっていた!お題はどれにするのかな?お楽しみに。
--------------------------------------------------------------------------------
title: "bundle install で Your Gemfile.lock is corrupt. と怒られる件"
date: "2016-12-10"
--------------------------------------------------------------------------------
個人のいくつかのリポジトリで bundle install できないことがあり、困っていました。
```console
$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 11.3.0
Using concurrent-ruby 1.0.2
Using i18n 0.7.0
Using thread_safe 0.3.5
Using net-ssh 3.2.0
Installing minitest 5.10.1
Your Gemfile.lock is corrupt. The following gem is missing from the DEPENDENCIES section: 'ffi'
```
{{< tweet user="masutaka" id="801366903038021633" >}}
~~結論から言うと `$ bundle install --without development` で回避できました(当該リポジトリでは development group は使っていなかった)。~~
[訂正] 今回は Gemfile に `gem 'ffi'` を追加して回避できました。bundler は最新の v1.13.6 です。
情報にまとまりがなくて調べていくのが大変でした。[1.10.6 に戻すと回避できる](https://github.com/bundler/bundler/issues/4467#issuecomment-230549012)という情報もあったけど、さすがに古すぎだし...。
まだ根本解決はしていないようです。
[Bundle install --deployment fails with Gemfile.lock is corrupt · Issue #5044 · bundler/bundler](https://github.com/bundler/bundler/issues/5044)
**追記(2016-12-10):**
全然違っていたので、直しました。
今回のケースでは Gemfile に `gem 'pushover'` が書かれており、この行をコメントアウトすると再現しないことがわかりました。
さらに調べると pushover の依存でインストールされる sys-proctable を Gemfile に追加するだけで再現することがわかりました。
[sys-proctable は require 'ffi' しています。](https://github.com/djberg96/sys-proctable/search?utf8=%E2%9C%93&q=ffi)試しに Gemfile に `gem 'ffi'` を追加したら回避できたというわけです。
あとで分かるように Gemfile にはこのように書きました。
```Gemfile
gem 'ffi' # workaround https://masutaka.net/chalow/2016-12-10-1.html
```
もう少し調べてみると、sys-proctable を最新の 1.1.3 から 0.9.9 に落としたら、再現しなくなることがわかりました。
1.1.0 から OSX は C Extention から [ffi](https://github.com/ffi/ffi) への依存に変更されたようです。ffi は Ruby から C の関数を呼べる Gem のようです。
https://github.com/djberg96/sys-proctable/compare/sys-proctable-0.9.9...sys-proctable-1.1.0
Rakefile で `spec.add_dependency('ffi')` を追加しているので、大丈夫なはずが、bundler の不具合で依存がうまくいかないのかもしれません。
--------------------------------------------------------------------------------
title: "yaml_vault が AWS での Rails 環境変数つらい問題を解決したと思う"
date: "2016-11-05"
--------------------------------------------------------------------------------
※ 弊社 [feedforce](https://www.feedforce.jp/) で毎週行っている、インフラ共有会を元にした記事で
す。AWS で Rails を使っている方を想定していますが、数人規模のチー
ムを意識した内容になっています。
こちらの記事で [yaml_vault](https://github.com/joker1007/yaml_vault) を知ったので、実際に試してみました。
[yaml_vault+KMSでRailsアプリのconfig/secrets.ymlを暗号化してgitにコミットして管理する - Qiita](http://qiita.com/minamijoyo/items/9653af0b737da87b91c6)
## 環境変数つらい
SaaS の API Key などの秘匿情報をコードに埋め込まないために、Rails
で [dotenv](https://github.com/bkeepers/dotenv) を使っている方も多いかと思います。
しかし、[README.md にあるように](https://github.com/bkeepers/dotenv#multiple-rails-environments)作者の {{< github_user "bkeepers" >}} さんは production
での利用は奨励していません。
```
dotenv was originally created to load configuration variables into
`ENV` in *development*. There are typically better ways to manage
configuration in production environments - such as
`/etc/environment` managed by [[Puppet|https://github.com/puppetlabs/puppet]] or [[Chef|https://github.com/chef/chef]], `heroku config`, etc.
```
とは言え、/etc/environment を [Chef の Encrypted Data Bag](https://docs.chef.io/data_bags.html#encrypt-a-data-bag-item) 等で構成
管理するのも管理レイヤーが違うためモヤモヤします。それに、稼働中の
プロセスの環境変数が書き換わったか確認するのは、なかなか面倒です。
以上の問題を yaml_vault が解決してくれました。{{< github_user "joker1007" >}} さんに感謝!
{{< github_repo "joker1007/yaml_vault" >}}
## 運用例
例えばこんな config/secrets.yml があったとします。development と
test は隠す必要がないためベタ書きですが、staging と production は
環境変数で設定しています。
```
development:
secret_key_base: c4eeb5e80b2fbcc568efc7b8c2587a274330dfd7ce6b023d7049d61f682fcef88b7c9106b27bb7aa8d3750ea0a64008f94508ac45feaffc1ace638fa2a4c14ca
test:
secret_key_base: 1d7a7dc6e551abe00bd1f8aa87f43cec198bcd0689a812d74c5344da9af89a965f29a4e00420c565a6f5b0908bde523ad08f6594f2878c44fc3321bf53b33f87
staging:
secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
bugsnag_api_key: <%= ENV['BUGSNAG_API_KEY'] %>
production:
secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
bugsnag_api_key: <%= ENV['BUGSNAG_API_KEY'] %>
```
一旦、ベタ書きにします。
```
development:
secret_key_base: c4eeb5e80b2fbcc568efc7b8c2587a274330dfd7ce6b023d7049d61f682fcef88b7c9106b27bb7aa8d3750ea0a64008f94508ac45feaffc1ace638fa2a4c14ca
test:
secret_key_base: 1d7a7dc6e551abe00bd1f8aa87f43cec198bcd0689a812d74c5344da9af89a965f29a4e00420c565a6f5b0908bde523ad08f6594f2878c44fc3321bf53b33f87
staging:
secret_key_base: 955ea7c99a3069837ef818b1b962ced42a6c4d6d80d0537103a2b4c5cb9e0d1b0ea0bc32d772e1334c284d93787558564fcec2f8fbe7e4334dea6234b2ee27b1
bugsnag_api_key: 0123456789
production:
secret_key_base: 3fbeb3a538327484033ceaabc6454ed5a8d7dee9d5875b5b6b4c3cffc4bb461c13783ab9dd6a0cd78be310882649d116fb2b1276a9c324faa86ade594b69acb2
bugsnag_api_key: 0123456789
```
以下のコマンドを実行します。
```
$ bundle exec yaml_vault encrypt config/secrets.yml \
-o config/encrypted_secrets.yml -k production,staging \
--cryptor=aws-kms --aws-kms-key-id=alias/hoge-rails
```
暗号化された config/encrypted_secrets.yml が作られます。
```
---
development:
secret_key_base: c4eeb5e80b2fbcc568efc7b8c2587a274330dfd7ce6b023d7049d61f682fcef88b7c9106b27bb7aa8d3750ea0a64008f94508ac45feaffc1ace638fa2a4c14ca
test:
secret_key_base: 1d7a7dc6e551abe00bd1f8aa87f43cec198bcd0689a812d74c5344da9af89a965f29a4e00420c565a6f5b0908bde523ad08f6594f2878c44fc3321bf53b33f87
staging:
secret_key_base: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAOwwgekGCSqGSIb3DQEHBqCB2zCB2AIBADCB0gYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAy3dSJNIu/qCeKnZpsCARCAgaRAnkrMBvl9uUHOIawv5JkjH7BhGQluET8XVzVfar6md9GC9x3WF55kW7+ZGeY5Y5I+LtLiOaghH/2rZfIw/bIdjU1nkflnGyQpTnD97sbqIzr6OcFLUH5lLv4WXkTk07hlzLERg9sSQ6rGUMgUCtWyP1cwKyb/2C3rl4DpZu9+gCwKU4hCGFeYUWEFV/MQ9dO/0RbetVUw/WZ+G3ySnB9AVqOVMA==
bugsnag_api_key: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAHEwbwYJKoZIhvcNAQcGoGIwYAIBADBbBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMm0fS5bpOEx/elwkgIBEIAuCsJ365ViKogCNKFsrQmr5yh8KYgkWWulSFcAmGnf+y97/ZudS3JqDK7QbXSzTw==
production:
secret_key_base: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAOwwgekGCSqGSIb3DQEHBqCB2zCB2AIBADCB0gYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxMSH3wGwI9iMEm/foCARCAgaTzl9w/NXy3bGSlmlilQffQkofaUNmG/eODW7cRoRlCEyYTSp5yZk0eLcLO6SU8AqC3lM5AfJyGtFY4/oXjQwVub3z/33ud/A9UKiEBXEHEODm0/kd4eldkLdna/e2st74XG5qsO9t7pmKlcKFPzZGG1x9rNetyuJGOmvEvz9ZpAyC2obYCl3itrVGlsrElX7VTYqVPLON/PwWSXdq+79zL4j6rzQ==
bugsnag_api_key: AQECAHi181o2hUvlZ9UTXBtv1MzPPujmGDFezmSybnYV90TnAwAAAHEwbwYJKoZIhvcNAQcGoGIwYAIBADBbBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDBtD3T8V6xkOq9bdsQIBEIAu8s0QcAsrULVMdgdycg5u4rU02seGa1sszDBxxXnKQ3KoQPUB0HGcGNksZUFqlw==
```
※ この例では $AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY,
$AWS_DEFAULT_REGION を [direnv](https://github.com/direnv/direnv) で設定しています。設定しない場合はそ
れぞれ --aws-access-key-id, --aws-secret-access-key, --aws-region
オプションが必要です。
今後は、作成された config/encrypted_secrets.yml を git で管理して
いきます。config/secrets.yml は git 管理下から外し、.gitignore に
追加しておきます。
以下のコマンドをデプロイ時の hook に仕掛ければ、Production と
Staging の Rails は環境変数を使うことなく config/secrets.yml を
参照することが出来ます。
```
$ bundle exec yaml_vault decrypt config/encrypted_secrets.yml \
-o config/secrets.yml -k production,staging \
--cryptor=aws-kms --aws-kms-key-id=alias/hoge-rails
```
※ EC2 インスタンスに IAM Role を付けることを忘れないようにしましょ
う。でないと、$AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY,
$AWS_DEFAULT_REGION の設定が必要になり、本末転倒です。
この例では Development と Test 環境は単純コピーで良いです。
> $ cp config/encrypted_secrets.yml config/secrets.yml
## 事前準備
Gemfile に以下を追記し、bundle install しておきます。
```
group :development do
gem 'yaml_vault'
end
```
AWS IAM のコンソールから KMS の Encryption Key を作成します。
Region は前述の $AWS_DEFAULT_REGION と合わせておきます。
https://console.aws.amazon.com/iam/home#encryptionKeys
今回は hoge-rails という alias の Encryption Key を作りました。
[最初に紹介した記事](http://qiita.com/minamijoyo/items/9653af0b737da87b91c6)では IAM Group が使える Encryption Key にしてい
ますが、数人規模のチームなら専用の IAM User を作っても良いかもしれ
ません。
あと、サーバではなくアプリが必要とするリソースなので、Terraform で
管理するかは議論の余地があると思います。
事前準備はこれだけでした・・・!
**追記(2016-12-02):**
https://github.com/joker1007/yaml_vault/pull/6 がマージされたので、
Gemfile の記述をアップデートしました。
--------------------------------------------------------------------------------
title: "ZenPad 3S 10 (Z500M) から始まる廃人生活"
date: "2016-11-01"
--------------------------------------------------------------------------------
8月に発表を知り、日本での発売を心待ちにして2ヶ月。10/19(水)にようやく日本で予約が始まりました。
{{< tweet user="masutaka" id="788752692638126081" >}}
速攻で予約し、同じ週の 10/22(土)にゲット出来ました。

[ZenPad 3S 10 (Z500M) シルバー](https://www.asus.com/jp/Tablets/ASUS-ZenPad-3S-10-Z500M/)
タブレットは親に iPad を買った時に一瞬所持したことはありますが、自分用を持つのは今回が初めてです。いやあ、タブレットいいですね(完全に時代から取り残されている人)。
さて、こんな理由から最近タブレットへの物欲が高まっていました。
- Kindle Paperwhite に不満を感じ始めていた
- ボリュームある技術書読むのが辛い
- Kindle がなかったらもっと読めていなかったけど
- マンガを読むのには全く適していない
- 描画が遅い
- 見開きページを見るためには手動で回転が必要
- カラーページも見られないので Kindle for Mac で見てた
- とは言え、Kindle Paperwhite は小説読むのにはすごく良いと思う
- MacBook Air を布団に持ち込んで、Netflix とか見てた
- テレビで見る時は PS4 使ってる。これは結構良い
- 実家に帰った時などの暇つぶし
- iPhone だと小さすぎるし、MacBook Air だと大げさだと思っていた
- 本を読むのも Kindle では捗らず
- 狭い居酒屋だと、MacBook Air をバーン開いて飲むのが憚られる
- 最近は家飲みばかりになったけど
正直今まで ASUS はネットブックかつ安物というイメージが強く、眼中にありませんでした。Lenobo はセキュリティ的に危なくて論外です。
でも iPad 以外のタブレットを調べていくと、ASUS 良いのでは?と考えが変わっていきました。Z500M が発表されたタイミングも良かったです。
iPad を選ばなかったのは、こんな理由からです。
- [9.7inch の iPad Pro](https://support.apple.com/kb/SP739?locale=ja_JP) は今回の用途では高すぎる
- 買うことになるであろう 128GB は ¥78,624
- 対する Z500M は ¥42,984
- 前世代の [Z300M](https://www.asus.com/jp/Tablets/ASUS-ZenPad-10-Z300M/) は ¥26,050 なので、想定より ¥5,000 ほど
高かったけど...
- iOS に飽きてきた
- 職業柄 Android には一度触れておきたかった
一週間経って、使い勝手は iPad とほぼ変わりないと感じました。もちろんある意味 ASUS と Google との協業なので、一貫性のなさは感じます。でも個々のアプリが頑張っているせいか、すごくおかしいとは感じませんでした。
Netflix は [Smart Lock for Passwords](https://developers.google.com/identity/smartlock-passwords/android/) に対応しているのか、パスワードの入力なしに気持ち良くログイン出来ました。
Instagram はただ画面が大きいだけで、これほどユーザ体験が変わるのかと驚きました。アカウントによっては荒い画像を投稿していて、誤魔化しがバレてしまっています。
以下、リンク集と感想などです。
---
{{< amazon asin="B01MEHLOHD" title="エイスース ASUS ZenPad 3S 10 スチールブラック Z500M-BK32S4" >}}
色はシルバーのほかにスチールブラックがあります。
---
{{< amazon asin="B0083KWD9U" title="kwmobile スリム スリーブ タブレットカバー 9-10 Tablet 用 カバー 保護 ケースMailデザイン 茶色 - 対応:Apple, Samsung, Lenovo, Asus, Huawei, Amazon, Acer, Microsoft, Sony, LG" >}}
レザーケースです。外への持ち出し用に買いました。[Amazon のレビューに書いた](https://www.amazon.co.jp/review/RTZGJISDA1MA9)とおり、¥1,760 とは思えない高級感です。
当初は [iPad のような磁石で付くカバー](http://www.apple.com/jp/shop/product/MNNC2FE/A/97%E3%82%A4%E3%83%B3%E3%83%81ipad-pro%E7%94%A8smart-cover-%E3%82%B3%E3%82%B3%E3%82%A2?fnode=9a)を探していましたが、どれもイマイチでした。
実際の用途は
1. 外に持ち出すときの傷防止
2. ちょっと斜めに置いて使う
なので、1 を重視してこのレザーケースにしました。2 はメガネケースとか使えば良いと思った(えっ
---
{{< amazon asin="B0036CC0CA" title="メタルブックレスト オレンジ[DB016]" >}}
家で本を読む時は、以前買ったこれも使う予定です。岡山では百均で売っているらしい...。
---
{{< amazon asin="B009PHQIXW" title="オウルテック 新しいiPad/Nexus7対応タブレットPC対応フレキシブルマウントアームスタンド シルバー OWL-MAFA03" >}}
今回の主役にやるはずだった廃人グッズです。寝ながら Netflix とか見るのに良いです。
でも高さ的に布団との相性はイマイチ。あと、使用例のとおりでは Z500M はアームで固定できないです。だいぶ試行錯誤しました。[Amazon のレビューに画像を貼った](https://www.amazon.co.jp/review/R3GYVW3OJQSZDC/)ので、参考にどうぞ。
---
{{< amazon asin="B01I1CBH8W" title="エイスース 10.1型タブレットパソコン ZenPad 10 Wi-Fiモデル (ホワイト) Z300M-WH16" >}}
Z500M が高いという方は前世代の Z300M も検討の余地があるかも。安いし Android 6.0 だし。公式サイトへのリンク貼っておきますね。
- [ZenPad 10 (Z300M)](https://www.asus.com/jp/Tablets/ASUS-ZenPad-10-Z300M/)
- [ZenPad 3S 10 (Z500M)](https://www.asus.com/jp/Tablets/ASUS-ZenPad-3S-10-Z500M/)
**追記(2016-11-03):**
Amazon のレビューが公開されたので、リンクを追加しました。
--------------------------------------------------------------------------------
title: "今さらながら Knife-Zero を使ってみた"
date: "2016-10-30"
--------------------------------------------------------------------------------
個人と仕事のサーバはどちらも Knife-Solo で構成管理しています。
Chef がバージョンアップしたら、私はなるべく knife solo prepare し
ていますが、このコマンドは単純実行すると、サーバの台数に比例して時
間がかかります。
Knife-Zero でそれを解決できるのかなと思い、[Getting Started](http://knife-zero.github.io/20_getting_started-ja/) してみ
ました。
{{< github_repo "masutaka/my_chef_repo" >}}
## 結論
代替にはならない。knife zero bootstrap も knife solo prepare と同
様、Chef をインストールするのは同じ。
> [Home(ja) · Knife-Zero](http://knife-zero.github.io/ja/)
>
> まずKnife-Zeroは[Knife-Solo](http://matschaffer.github.io/knife-solo/)の乗り換え先ではありません。
仰る通りでした。
## 勘違い
{{< tweet user="masutaka" id="752409419003027456" >}}
勘違いみたいですね。誰もツッコんでくれなかった...。( ;∀;)
Knife-Solo は chef-solo gem ではなく chef-zero gem と依存関係があ
るから、ずっと使えると思っていたけど、大きな勘違いだった。
そもそも chef-solo gem は存在しない。chef gem に含まれる chef-solo
コマンドが存在するだけ。
Knife-Solo は chef-solo コマンドを使って Cook する。chef-solo コマ
ンドはいずれ引退するので、いずれかに乗り換えが必要。
で良いよね?(まだ不安)
## 今後の予定
- 個人サーバは素振りも兼ねて Knife-Zero に移行する
- 静的サイトなので Docker 化しても良いけど、このサーバは仕事の
素振りも兼ねているので...
- 仕事で使っているサーバも徐々に移行する
- Docker 化出来るほど、今時の構成じゃないんじゃあ!(叫び)
## メモ
Knife-Zero は Knife-Solo よりも Chef のレールに乗っている点が心地
よかった。Chef Server 構築するならどっぷり使っても良いかもね。
knife.rb は .chef/knife.rb でも良い。
[Misoca の記事](http://tech.misoca.jp/?page=1464921000)にあった、Vagrant の中に古い Chef が入っていてホワイ
トリストが有効にならない件は、相当ハマった。そんなわけないじゃんと、
確認せずに進めていたら ubuntu/trusty64 20161020.0.7 に chef
11.8.2-2 と chef-zero 2.0.1-1 が入っていたという...。
関係ないようで関係あるけど『[のぼりーさんのクラウドインフラPodcast](https://cloudinfra.audio/)』
は少し前から聞き始めました。しかしなかなか消化できん...。
--------------------------------------------------------------------------------
title: "最近使っている、仕事のタスク管理"
date: "2016-10-26"
--------------------------------------------------------------------------------
以前、一日のタスク管理に[タスクシュート](http://cyblog.biz/pro/taskchute2/)を試した。
{{< tweet user="masutaka" id="614109677941469184" >}}
結局、息が詰まる気がして止めてしまったけど、このタスクシュートを意
識した今のタスク管理はなかなか自分に合っている。
{{< tweet user="masutaka" id="639606993280327680" >}}
タスクシュートの特長である「予定より遅れているから、これでは間に合
わないな」という感覚を緩く知ることが出来ている。
## 一日のタスク管理
- 前の日の日報で「翌営業日にやること」を書く
- ミーティング含めて、全てのタスクを順番に書き、午前と午後に分ける
- 午前に全て終わってなければ焦るので、タスクを減らすか、実装を軽めにする
- 予定より早く終わりそうなら、次のタスクかちょっとした改善タスクをやる
```
# 翌営業日にやること
## 午前
1. 朝会
1. 日報の草稿を書く
1. xxxx 運用作業
1. GitHub PR のレビュー
1. yyyy を実装する
## 午後
1. zzzz を実装する
1. 日報を書く
```
※ 実際に使っている markdown をマスキングしたものです
## 週のタスク管理
- 毎週の開発ミーティングで、次のイテレーションにやるタスクを決めて、
日報の「今回のイテレーション」に書く
- イテレーション終わりに近づいても、チェックが付いていないタスクが
多いと焦るので、タスクを減らすか、実装を軽めにする
- 予定より早く終わりそうなら、バックログにある次のタスクか改善タス
クをやる
```
### 今回のイテレーション(10/21 金 〜 10/27 木、3.5 営業日)
- [ ] xxxx を Slack に通知する
- [ ] yyyy を調査する
- [ ] ElastiCache のメンテナンスウィンドウに立ち会う(10/22 土 AM 3:00)
- [ ] zzzz を実装する
```
**追記(2018-12-08):**
「週のタスク管理」は今はやっていません。「一日のタスク管理」は継続しています。
--------------------------------------------------------------------------------
title: "ElastiCache for Redis のスケールアップメモ"
date: "2016-10-24"
--------------------------------------------------------------------------------
先週 AWS ElastiCache for Redis を cache.m3.medium から
cache.m4.large にスケールアップしました。今後のためにメモを残して
おきます。
## 背景
cache.m3.medium を Multi-AZ + Replica 1 台構成で運用していた。主な
用途は Rails4 の Session Store サーバとして。
BytesUsedForCache が cache.m3.medium のメモリ 2.78 GiB を超え、
Evictions が発生し始めたため、cache.m4.large にスケールアップした。
## タイムライン
メンテナンスウィンドウをセットした AM 3:00 になるとすぐに、当該ク
ラスターの Status が modifying になった。
AM 3:07 に Rails から接続できなくなり、Primary の CPUUtilization
が 60% 〜 90% で推移。Replica は普段通り。
AM 4:16 にようやく復帰。Multi-AZ 構成で冗長性が担保されているため、
データは消失しない。
## 感想
> [よくある質問 - Amazon ElastiCache|AWS](https://aws.amazon.com/jp/elasticache/faqs/)
>
> Q: 大きいノードタイプにスケールアップするにはどうすればよいですか?
>
> (省略)スケールアッププロセスは、既存のデータをベストエフォートで
> 保持するように設計されており、Redis レプリケーションに成功する必要
> があります。詳細については、[こちら](http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/BestPractices.html#BestPractices.BGSAVE)をご覧ください。
以前テストした時は、BytesUsedForCache が少ないインスタンスで試した
ため、ダウンタイムは数分であった。
長くても 30 分あれば終わると思っていたが、1 時間 9 分と想定以上か
かった。
また、Multi-AZ に期待しすぎていた節もあった。ElastiCache for Redis
の Multi-AZ は「冗長化」と「スケールアップや再起動をしてもデータが
全消失しない」程度に考えたほうが良さそう。
前述の「こちら」からの引用。
> [Redis スナップショットを作成するための十分なメモリがあることの確認](http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/BestPractices.html#BestPractices.BGSAVE)
>
> バージョン 2.8.22 以降の Redis のスナップショットと同期
>
> Redis 2.8.22 で分岐なしの保存プロセスが導入されました。これにより、
> 同期および保存中にスワップを使用することなく、アプリケーションによ
> り多くのメモリを割り当てて使用することができます。
今回のエンジンバージョンは 2.8.19。2.8.22 以上にしていれば、復帰時
間を早められたかもしれない。ただ、2.8.22 以上にする場合もダウンタ
イムは発生してしまう。
## 監視
CPUUtilization、BytesUsedForCache、Evictions あたりを監視すれば良
いことは分かっていたが、BytesUsedForCache は 2.78 GiB のうち、どこ
まで使えるか分からなかった。
今回の件で『[使用できるキャッシュノードの種類](https://aws.amazon.com/jp/elasticache/pricing/)』に書かれたメモリサイ
ズを Redis にほぼそのまま使えることが分かった。残り 300 MiB とかに
なったら Warning 飛ばすとかで良さそう。
Evictions は通常 0 なので、0 より大きくなったら Warning で良い。
CPUUtilization は 98% 以上で Critical とかにした。
※ 今回の ElastiCache for Redis の用途はほぼ Session Store サーバな
ので、監視は緩め。
## おまけ1
ElastiCache for Redis は Primary と Replica で Multi-AZ を構成する。
RDS は Primary 単体で Multi-AZ を構成できるので、知らないと勘違いする。
よって、料金は Primary + Replica x N しかかからない。Primary と
Replica は別々の Availability Zone にした方が良い。
参考: [よくある質問 - Amazon ElastiCache|AWS](https://aws.amazon.com/jp/elasticache/faqs/)
## おまけ2
ElastiCache for Redis を使う以上、ダウンタイムを避けるのは難しそう。
DynamoDB を使うのはどうだろう?(以前この記事を見て試したことがある)
[Rails4 でセッションストアに DynamoDB を使う | Developers.IO](http://dev.classmethod.jp/cloud/aws/rails4-dynamodb-sessionstore/)
DynamoDB ではインスタンスを立ち上げるわけではないので、メンテナン
スウィンドウからは逃れられる。スケールも考えなくて良い。
ただ、Session Store として使う場合、有効期限切れのレコードを消すの
が大変そう。ずっと持っていてもコストの無駄だし。
[DynamoDBで有効期限切れのレコードを削除する - Qiita](http://qiita.com/rana_kualu/items/68240ba5cd196789323f)
DynamoDB は Session Store に使うにはオーバースペックかも。
--------------------------------------------------------------------------------
title: "Slack API で mention 付き User Group を作る方法"
date: "2016-10-19"
--------------------------------------------------------------------------------
Slack には任意のグループを作ることが出来る、User Groups という機能がある。
[User Groups – Slack Help Center](https://get.slack.help/hc/en-us/articles/212906697-User-Groups)
チャットで使う時は `@happy-peeps` などで普通に mention を飛ばせるが、API を経由する時は特殊な書き方が必要になる。
[Basic message formatting > Variables|Slack](https://api.slack.com/docs/message-formatting#variables)
端的に書くと `` という書式が必要。
例えば `S012345` という ID の `@happy-peeps` User Group の場合は `` で良い。
ID が曲者で以下の手順で取得できる。
1. https://api.slack.com/docs/oauth-test-tokens からテスト用のトークンを取得
2. https://api.slack.com/methods/usergroups.list/test から当該 API のテストリクエストを行う。各グループの id フィールドがそれ
※ [Mackerel](https://mackerel.io/) の Slack 通知がうまくいかなくて、右上から質問して分かりました。thx! {{< twitter "a_know" >}}
**追記(2017-02-07):**
同様にリンク付き channel(例: #general)を作る方法もだいたい同じでした。
[Basic message formatting > Linking to channels and users|Slack](https://api.slack.com/docs/message-formatting#linking_to_channels_and_users)
例えば `#general` の Channel ID が `C024BE7LR` の場合は `<#C024BE7LR|general>` になります。
Channel ID は https://api.slack.com/methods/channels.list/test のテストリクエストで取得することが出来ます。
--------------------------------------------------------------------------------
title: "Go で Mackerel の Fastly billing plugin を作った"
date: "2016-10-16"
--------------------------------------------------------------------------------
弊社の {{< github_user "tjinjin" >}} が作った [mackerel-plugin-aws-billing](https://github.com/tjinjin/mackerel-plugin-aws-billing) は導入は簡単
だし、AWS 料金の推移が気軽に見られるので、Fastly 版を作ってみました。
{{< github_repo "masutaka/mackerel-plugin-fastly-billing" >}}
[Fastly](https://www.fastly.com/) は少し前から会社で使い始めています。なかなか便利で、CDN な
のに一瞬でキャッシュを消せるのもさることながら、料金含めた全てのメ
トリクスがリアルタイムで見られるのがすごいですね。今のところ、超安
定稼働しています。
さて、今回作った mackerel-plugin-fastly-billing は [Fastly の
Billing API](https://docs.fastly.com/api/account#billing_bd3ea2cbea58ddbb82bbde0c1981fd8b) を叩いて、その月の現在の料金を取ってくるシンプルな
plugin です。curl 的には例えば以下になります。
```
$ curl -s -H "Fastly-Key: " \
https://api.fastly.com/billing/year/2016/month/10 | jq .total.cost
```
先日、[mackerel-plugin-delayed-job-count](https://github.com/masutaka/mackerel-plugin-delayed-job-count) も作ったのですが、
[Go で Mackerel の delayed_job plugin を作った|feedforce Engineers' blog](http://tech.feedforce.jp/mackerel-go-plugin-delayed-job.html)
今回は少しパワーアップしております。delayed_job も追随しよう...。
## 書き方を少し変えた
main() を先頭に書きました。持論ですが、コードは上から下に流れるよ
うに書くと読みやすいと思います。
最初の会社で C を書いていた頃は、特にそのようにしていましたが、LL
だとそう書けないことがあるので、最近は自重していました。Go はコン
パイル型言語で C にも似ているので、以前の書き方にしてみました。
外部変数を使うのも止めました。
## PluginWithPrefix interface で実装した
[以前の Plugin interface と違う点は MetricKeyPrefix() が増えた](https://github.com/mackerelio/go-mackerel-plugin-helper/blob/1d057c3c772e668191f9208e40ed67890976e294/mackerel-plugin.go#L36-L46)こと
です。[7/6 に実装されている](https://github.com/mackerelio/go-mackerel-plugin-helper/pull/15)ので、むしろなぜ前回使わなかったのか、
という話もあります...。
MetricKeyPrefix() は mackerel-agent.conf でメトリクス名のコンフリ
クトを避けるために、CLI オプション -metric-key-prefix とともに実装
が奨励されています。
詳しくは [README.md](https://github.com/mackerelio/go-mackerel-plugin-helper/blob/master/README.md) や以下の PR をどうぞ。
https://github.com/mackerelio/go-mackerel-plugin-helper/pull/15
※ この時の名前はまだ GetMetricKeyPrefix() です。
## テストを書いた
おかげで少し堅牢な実装にすることが出来ました。[CI も始めました。](https://circleci.com/gh/masutaka/mackerel-plugin-fastly-billing)
## Makefile を作った
何年ぶりだろう...?
現在は GitHub へのリリースの手間軽減のために、linux/amd64 用のバイ
ナリをビルドして、sha256 checksum を出力するだけです。まだ(?)自動
化はしていません。
## 終わりに
Mackerel plugin は Go の素振りをするのにちょうどよいサイズで、大変
気に入っています。なにかネタがあれば、積極的に作っていく予定です。
--------------------------------------------------------------------------------
title: "compare_linker v1.3.0 をリリースした"
date: "2016-10-09"
--------------------------------------------------------------------------------
{{< ruby_gems "compare_linker" >}}
仕事やプライベートで、毎週自動 bundle update していますが、Gem によっては GitHub の compare Link を作れませんでした。
人間が手動でリンクを作ってコメントするのが無駄な作業で、なんだか申し訳なかったので修正してみました。これで GitHub に Git のタグがない Gem 以外は救えるようになったはず。
出力フォーマットもシンプルになっています。
[circle.yml とかで circleci-bundle-update-pr をインストール](https://github.com/masutaka/circleci-bundle-update-pr#configure-circleyml)していれば、自動的に v1.3.0 の compare_linker が使われます。
{{< twitter "kyanny" >}} さんが作った頃のフォーマット

v1.30 のフォーマット

変更内容は[リリースノート](https://github.com/masutaka/compare_linker/releases/tag/v1.3.0)に書いてあるとおりです。こんな変更をしました。
- RubyGems の API から GitHub の URL が分からない Gem は [data/rubygems.yml](https://github.com/masutaka/compare_linker/blob/v1.3.0/data/rubygems.yml) に GitHub のリポジトリ情報を書くことで回避
- 例: https://rubygems.org/gems/capistrano
- Git の Tag が多すぎて、GitHub compare Link の生成に失敗することがあった件を修正
- 例: https://github.com/newrelic/rpm/releases
- Git の Tag 名に gem 名が含まれていて、GitHub compare Link の生成に失敗する gem を救済。(なぜ `$ rake release` でリリースしないのだろう?)
- 例: https://github.com/djberg96/sys-proctable/tags
compare Link を作れない Gem があれば、[PR](https://github.com/masutaka/compare_linker/pulls) や [Issue](https://github.com/masutaka/compare_linker/issues) など頂ければと思います。
P.S.
Gem の責務が増えちゃったなあ。仕方ないけど。
--------------------------------------------------------------------------------
title: "ローカルとGistを同期する gist_updater gem を作った"
date: "2016-09-29"
--------------------------------------------------------------------------------
必要に迫られて Ruby のスクリプトを作ったら、汎用化できたので
Gem にしてみました。
{{< ruby_gems "gist_updater" >}}
## 何ができるか?
このような YAML ファイルを用意し、gist_updater コマンドを実行する
と、ローカルの .emacs.d/init.el によって
https://gist.github.com/masutaka/8177244 がアップデートされます。
```
-
- 8177244
- .emacs.d/init.el
```
Gist は差分がなくても、更新するとリビジョンが増えてしまいますが、
gist_updater は差分がなければアップデートしません。
複数の Gist をアップデート対象にすることも出来ますし、1つの Gist
の複数ファイルにも対応しています。YAML なのでコメントも書けますね。
```
-
# https://gist.github.com/masutaka/8177244
- 8177244
- .emacs.d/init.el
-
# https://gist.github.com/masutaka/f7ce8b3c71e995c20e48
- f7ce8b3c71e995c20e48
- circle.yml
- tasks/pushover.rake
```
ライブラリとして使うことも出来ます。詳しくは GitHub の README.md
をご覧ください。
{{< github_repo "masutaka/gist_updater" >}}
## なぜ作ったか?
私はいわゆる dotfiles を GitHub に置いていますが、諸般の事情により
それは private repository です。ただ、たまに人に見せたいことがある
ので、一部のファイルを Gist に置いています。
[~/.emacs.d/init.el](https://gist.github.com/masutaka/8177244)
[~/.zshenv](https://gist.github.com/masutaka/9287567)
[~/.zshrc](https://gist.github.com/masutaka/9287575)
[~/bin/my-brew-bundle](https://gist.github.com/masutaka/9642146)
※ https://masutaka.net からリンクを張っています。
今まではまめに**手動で** Gist を更新していましたが、さすがに時間のムダ
だと思ったので、gist_updater を作りました。
現在は GitHub に push すると CircleCI が走り、必要に応じて Gist が
自動アップデートされます。
## 雑感とか
タイミングよく『{{< amazon_link asin="477418361X" title="オブジェクト指向設計実践ガイド" >}}』を読んだ
{{< post "2016-09-22-1" >}} 直後で良かったです。単一責任のクラスや DI などを意
識して設計しました。ただしテストはありません(キリッ
[rubocop](http://batsov.com/rubocop/) 先生にはだいぶ助けられました。長いメソッドは設計が間違って
いる啓示だと思い、メソッドやクラスを分けて短くしました。でもまだ全
然だと思う...。
学びがあった gem でした。
**追記(2016-10-08):**
[全クラスのテストを追加しました。](https://github.com/masutaka/gist_updater/tree/v0.4.3/spec/gist_updater)意識して普段と違うテストにしたけど、
これで良いのだろうか...。
--------------------------------------------------------------------------------
title: "『みんなのGo言語』を読んだ"
date: "2016-09-25"
--------------------------------------------------------------------------------
話題になっていたので、読んでみました。
{{< amazon asin="477418392X" title="みんなのGo言語【現場で使える実践テクニック】" >}}
{{< post "2015-02-11-1" >}} で Go を学んだ私ですが、その後あまり使っていなかったので、情報をアップデートできて良かったです。
特に第1章の開発環境のあたり。[goimports](https://godoc.org/golang.org/x/tools/cmd/goimports) の import 自動挿入は良いですね。早速 go get して init.el に以下を設定しました(go-mode.el は導入済み)。
```elisp
(setq gofmt-command "goimports")
```
第6章のテストも即戦力になりそうです。
以下は読んでメモった箇所を中心にしたまとめです。
## 全体を通して感じたこと
Go の文法が多少分かる方向けの本だと思います。P.19 にも書いてある「[A Tour of Go](https://tour.golang.org/)」などをやった後に読むと効果的だと思います。
ただ、世間でオススメされている「A Tour of Go」ですが、私はチュートリアルとしては難しいと思います。半分くらいから Go よりアルゴリズムのチュートリアルっぽくなってくるので。
個人的には {{< post "2015-02-11-1" >}} で紹介した『{{< amazon_link asin="4774166278" title="WEB+DB PRESS Vol.82" >}}』の「はじめてのGO」がオススメです。
## 残念だったこと
動かないコードがあったのは残念でした。
例えば第5章 reflect の P.108 です。コードを書いて動かすと、
```
package main
import (
"fmt"
"reflect"
)
type Point struct {
X int
Y int
}
func main() {
p := &Point{X: 10, Y: 5}
rv := reflect.ValueOf(p)
fmt.Printf("rv.Type = %v\n", rv.Type())
fmt.Printf("rv.Kind = %v\n", rv.Kind())
fmt.Printf("rv.Interface = %v\n", rv.Interface())
xv := rv.Field(0) // (1)
fmt.Printf("xv = %d\n", xv.Int())
xv.SetInt(100) // (2)
fmt.Printf("xv (after SetInt) = %d\n", xv.Int())
}
```
(1) で panic を起こしてしまいます。
```
rv.Type = *main.Point
rv.Kind = ptr
rv.Interface = &{10 5}
panic: reflect: call of reflect.Value.Field on ptr Value
```
"p := Point{X: 10, Y: 5}" に変えても (2) で panic が起きます。
```
rv.Type = main.Point
rv.Kind = struct
rv.Interface = {10 5}
xv = 10
panic: reflect: reflect.Value.SetInt using unaddressable value
```
P.115 の最初のコードも動きませんでした。
```
package main
import "reflect"
type Point struct {
X int
Y int
}
func main() {
p := Point{X: 10, Y: 5}
rv := reflect.ValueOf(&p)
if f := rv.Field(0); f.CanSet() {
f.SetInt(100)
}
}
```
> panic: reflect: call of reflect.Value.Field on ptr Value
1.6 なら動くのかしら...? 1.7 は 8/15 に出たばかりだし。
```
$ go version
go version go1.7.1 darwin/amd64
```
## 少し残念だったこと
読んでいて誤植が多いなと思いました。査読に時間を割けなかったのですかね?
[サポートページ](http://gihyo.jp/book/2016/978-4-7741-8392-3/support)に挙げられているもの以外には、以下を見つけました。
P.115
(誤) いったいどいうことでしょう。
(正) いったいどういうことでしょう。
P.134
(誤) reflectパッケージについては第2章をご覧ください。
(正) reflectパッケージについては第5章をご覧ください。
正誤表自体の間違いも見つけました。
reflect.SelectCase のページは P.97 ではなく P.117 ですね。
--------------------------------------------------------------------------------
title: "『オブジェクト指向設計実践ガイド』を読んだ"
date: "2016-09-22"
--------------------------------------------------------------------------------
本当に良い本でした。読んで良かった。初心者を中心に中級者にも刺さる
本だと思います。輪読などして、チームで読むとオブジェクト指向設計の
そもそもの話をしなくて良さそうです。
{{< amazon asin="477418361X" title="オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方" >}}
難しい話が易しく説明されており「あ、そうだったのか」と思うことが度々
でした。ボリュームも全9章とコンパクトで、1日1章読むのに丁度よかっ
たです。
読んでメモった箇所を中心にまとめていきます。
## 第2章 単一責任のクラスを設計する
インスタンス変数へのアクセス方法を誤解していました。
> P46
> 変数はそれらを定義しているクラスからでさえも隠蔽しましょう
今まで他のクラスから隠蔽する時は、直接 @hoge などにアクセスしてい
ましたが、中からも attr_reader などで隠蔽する必要があるそうです。
「データではなく、振る舞いに依存する」ためだそうです。
メモ化などでこうした手法は使っていたけど、単純な参照も隠蔽する必要
があるのですね...。
ただ、中からしか使わない変数も単純な attr_reader を使っていたのは、
納得いかなかったです。こうして外から隠蔽する必要はないでしょうか?
```
class Hoge
attr_reader :hoge # 外からも参照される
#...
private
attr_reader :hogehoge # 中からしか参照されない
#...
end
```
## 第3章 依存関係を管理する
「依存オブジェクトの注入(DI)」を中心に疎結合なコードの書き方がま
とまった章です。
DI は正直今までピンと来ていませんでしたが、この章を読んで完璧に理
解しました。10 年前から使っていました...。
{{< tweet user="masutaka" id="775320720943362049" >}}
数日経ってもまだ何か言ってる。
{{< tweet user="masutaka" id="776795923296858112" >}}
{{< tweet user="masutaka" id="776796529361231872" >}}
> P80
> 自身より変更されないものに依存しなさい
この章はこれに尽きると思います。
## 第4章 柔軟なインターフェイスを作る
> P104
> 仮にオブジェクトが人間だとして、自身の関係を説明できるとしましょ
> う。すると、図4.5では、Trip は Mechanic に「私は自分が何を望んでい
> るかを知っているし、あなたがそれをどのようにやるかも知っているよ」
> と伝えているはずです。(中略)
> **この手放しの信頼が、オブジェクト指向設計の要です。**これによって、
> オブジェクトは自身をコンテキストに縛り付けることなく、共同作業でき
> るようになります。また、これは成長し、変化することが期待されるアプ
> リケーションには必要不可欠です。
> (太字は引用者によるもの)
これを読んで、なぜかアジャイルについて腑に落ちました。理解するのに
何年かかっているんだよ...。
※ アジャイルはオブジェクト指向を人に置き換えたもの
## 第6章 継承によって振る舞いを獲得する
業務でサブクラスが super にメッセージを送るコードを頻繁に見かけま
す。P172 にこのリファクタリング方法が書かれていました。
やり方は簡単で、post_initialize のようなフックメッセージを用意する
だけ。そうすることで、サブクラスは必ず super を呼ぶ責任から逃れら
れます。「いつ」初期化が行われるか知らなくてよいのは大きい。結合度
の低減です。
最近は継承をなるべく使わず、委譲を使うことを意識していますが、継承
もちょっとしたテクニックで結合度を減らせることを学びました。
## 第7章 モジュールでロールの振る舞いを共有する
P202 に「リスコフの置換原則(LSP)」が書かれていました。
> システムが正常であるためには、派生型は、上位型と置換可能でなけれ
> ばならない
正直知らなかったのですが、これに限らずこの本には法則がいくつか出て
くるので、そもそもの知識として身に付けたいと思います。
## 第8章 コンポジションでオブジェクトを組み合わせる
> P231
> したがって、継承では、「自分が間違っているとき、何が起こるだろう」
> という問いかけが特別に重要な意味を帯びてきます。
さきほどの super の話もそうですが、継承はただでさえ強い結合なので、
修正の影響を少しでも減らさなくてはいけません。
## 第9章 費用対効果の高いテストを設計する
テストには多少自信があったのですが、この章を最初読んだ時、少々落ち
込みました。
P260 のようにスタブ前提のテストが奨励されており、今までの私の書き
方とはある意味真逆だったからです。
> P261
> アプリケーションがはっきりと間違っているにもかかわらず、テストはの
> んきに、すべてうまくいっていると報告します。このような世界をつくっ
> てしまう可能性があるゆえに、スタブ(とモック)はテストを脆くすると
> 警告する人がいるのです。
わたしです。^o^
でも読んでいて、DI などで疎に設計されたアプリケーション前提なのか
も?と思い直しました。密結合で使うのはなかなか危険かも。
とは言え、今後は少し考えを切り替えようと思いました。
以下は雑多な疑問や感想。
P272 では危険を承知でテストを書く前にリファクタリングをしているけ
ど、やらないほうが良いと思いました。
P279 はスタブ前提でも壊れづらいテストの書き方です。テストの
respond_to ってこういう時に使うのね。private メソッドを呼んでいる
かのテストは見たことがある...。
P290 では抽象スーパークラスもテストをしていました。私は今まで書か
ないようにしていましたが、前述の「リスコフの置換原則」に沿った設計
をしていれば、テスト可能という話です。
この章のテストは MiniTest で書かれているので、RSpec で書いてみよう
としましたが、[GitHub にいくつかあった](https://github.com/search?utf8=%E2%9C%93&q=poodr+rspec&type=Repositories&ref=searchresults)のでそれを読んで満足しました。
--------------------------------------------------------------------------------
title: "安くてダサすぎない腕時計を買った"
date: "2016-09-19"
--------------------------------------------------------------------------------
今日アキバに [ASUS のタブレット](https://www.asus.com/jp/Tablets/ASUS-ZenPad-10-Z300M/)を見に行ったついでに、腕時計も見ていてらふらっと買ってしまいました。
ここ何年か腕時計を身に付けていませんでしたが、私は結構時間を気にして iPhone を見てしまうのですよね。都度ケツポケから出すのも面倒になったので、こんなのを探していました。
- 日付も分かるデジタル
- 見やすくて軽くてダサすぎない程度のデザイン。ちょっと違うけど [Pebble Time Round](https://www.pebble.com/buy-pebble-time-round-smartwatch) っぽいやつ
- 充電はしたくない。数日しか持たないバッテリーは論外
- 歩数や心拍数は測らなくて良い。iPhone との連携も不要
- 置いたときに転がらず、時刻を確認できればうれしい
- 値段は ¥5,000 未満
案外なくてここ半年ほど探していましたが、この度購入する運びとなりました。
{{< amazon asin="B000JQA0CI" title="[カシオ]CASIO 腕時計 PHYS LAP MEMORY 60 国内メーカー1年保証つき STR-300J-2AJF" >}}
置いた時に転がらないというのは、こういうことです。はい、細かい奴ですね。試着した時に正直確認し忘れていましたが、うまく自立して良かったです。

帰って Amazon を見ていたら、逆輸入版で ¥2,732 のやつを発見。ちょっと後悔したけどまあいいか。
{{< amazon asin="B0006IEWWI" title="[カシオ]CASIO 腕時計 PHYS フィズ ランナーウォッチ LAP MEMORY60 TOUGH BATTERY10 STR-300C-1V ブラック[逆輸入]" >}}
--------------------------------------------------------------------------------
title: "Emacs-25.1 にアップデートした"
date: "2016-09-18"
--------------------------------------------------------------------------------
本日 Emacs-25.1 がリリースされていました。
{{< tweet user="newsycombinator" id="777251015284449281" >}}
いつもであれば、{{< post "2015-04-12-1" >}} のように Mac port パッチを当てます
が、[Emacs 25 からほとんどの機能が本体にマージされるという話](http://lists.nongnu.org/archive/html/mule-ja/2015-12/msg00000.html)があっ
たので、パッチを当てずにアップデートしてみました。
ちなみに私が Mac port パッチを当てていたのは、Emacs が頻繁に強制終
了していたからです。素の Emacs が安定していれば、今後もパッチを当
てないと思います。
すでに Emacs-25.1 対応の Mac port パッチは出ています。早い...。
ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-25.1-mac-6.0.tar.gz
素晴らしいことに、[Homebrew も速攻対応されており](https://github.com/caskroom/homebrew-cask/pull/24587)
`$ brew cask install emacs` でインストール出来ます。
## アップデート時のエラーや警告対応
init.el がエラーになったのは、1 の php-mode だけでした。
参考までに修正後の init.el はこちらです。
https://gist.github.com/masutaka/8177244/8d4e0d1364b401d65480d52e00555820a7a1d0df
### 1. (require 'php-mode) が謎のエラーを吐く
バイトコンパイル要因のエラーっぽかったので、Emacs-25.1 でパッケー
ジを再インストールしたら直りました。
### 2. init.el に custom-set-variables の設定がべた書きされる
どうやら新設された変数 package-selected-packages にインストールし
たパッケージ名を保持するようになった影響のようです。
抑制方法が分からなかったので、custom-set-variables の書き出し先を
~/.emacs.d/custom.el に変更しました。
```elisp
;; Avoid to write `package-selected-packages` in init.el
(load (setq custom-file (expand-file-name "custom.el" user-emacs-directory)))
```
こちらの記事を参考にしました。
["package-selected-packages" always appear after upgrading to 25.0 rc1 : emacs](https://www.reddit.com/r/emacs/comments/4x655n/packageselectedpackages_always_appear_after/)
### 3. ElScreen の非アクティブタブの色が変わる
これは Emacs-25.1 とは関係なく、Mac port パッチを当てなかった影響
でした。せっかくなので PR 出しておきました。
https://github.com/knu/elscreen/pull/21
### 4. flet の Obsolete warning
> ‘flet’ is an obsolete macro (as of 24.3); use either ‘cl-flet’ or ‘cl-letf’.
起動時にこんな warning が出ました。すでに Emacs-24.3 で obsolete
になっていたようなので、warning が大げさになったのでしょうか。
init.el で flet 使っている箇所があったので、cl-letf を使うように修
正しました。
```elisp
;; 修正前
(flet ((message (format-string &rest args)
(eval `(format ,format-string ,@args))))
...
;; 修正後
(cl-letf (((symbol-function 'message)
(lambda (format-string &rest args)
(eval `(format ,format-string ,@args)))))
...
```
単純な関数名置換ではうまく行かず、少々難儀しました。cl-flet では期
待する動作はしませんでした。
こちらの記事が大変参考になりました。
[Understanding letf and how it replaces flet · Endless Parentheses](http://endlessparentheses.com/understanding-letf-and-how-it-replaces-flet.html)
## アップデート内容
日本語記事出てました。
[【速報】「Emacs 25.1」がリリース – ネイティブウィジェットをEmacsバッファに埋め込めるXwidgets機能がサポートされる](http://www.softantenna.com/wp/software/emacs-25-1-released/)
正直 Xwidgets 機能なんてどうでも良いので、もっとテキストエディタと
しての使い勝手を高めて欲しいですね...。未だにタブ機能がネイティブ
でサポートされてないのは時代遅れだと思います。
(最後に愚痴っぽくなってしまったw)
以下は個人的に良いと思った変更点です。
{{< tweet user="masutaka" id="777343035080257536" >}}
{{< tweet user="masutaka" id="777345926801207297" >}}
{{< tweet user="masutaka" id="777349440667475968" >}}
## 追加情報
当日 {{< twitter "takaxp" >}} さんからこんな情報が。
{{< tweet user="takaxp" id="777492112258445313" >}}
さらに次の日にこんな情報も。
{{< tweet user="takaxp" id="777748015486427136" >}}
mac-auto-ascii-mode のバグ {{< post "2015-01-04-1" >}} も直っていたので、Mac
port パッチを当てた Emacs に戻ってきました。ところが、、
{{< tweet user="masutaka" id="777783520018124800" >}}
自分でビルドすれば良いのですが、最近意識が低くなっているので、
https://github.com/railwaycat/homebrew-emacsmacport を使わせて
頂きました。
> $ brew cask install railwaycat/emacsmacport/emacs-mac
{{< twitter "watson1978" >}} さんから、モダンな(?)アイコンのバイナリを教えて頂きま
した。
{{< tweet user="watson1978" id="777787419777130497" >}}
--------------------------------------------------------------------------------
title: "『SQLアンチパターン』を読んだ"
date: "2016-08-17"
--------------------------------------------------------------------------------
SQL との接点は Rails を使う時くらいで、Explain でテンポラリテーブ
ルが作られるようなクエリを極力発行しない注意くらいしかしておらず、
危機感があったので読んでみました。あ、監訳者の {{< twitter "t_wada" >}} さんのツイ
ートにももちろん影響されました。
実は 3 月には手に入れていたのですが、ずっと積読していて読み始めた
のが先月からだったという...。とは言え、各章が 10 ページほどで収まっ
ているので、なるべく毎日 2 章読むようにしたら、20 日ほどで読み終え
ることが出来ました。
第 1 章は名前はさておき知っている人も多いジェイウォーク(信号無視)。
VARCHAR 型にカンマ区切りのテキストを入れてしまうアレです。さすがに
私も知っているので、ニヤリとしたのを覚えています。出だしのアンチパ
ターンとしては難易度低目で良かったです。
読む前は上記のようなテーブル設計(本書ではデータベース論理設計とあ
る)のアンチパターンがほとんどかと思っていましたが、クエリのアンチ
パターンにも言及していたのが意外でした。そりゃそうか。
|||
|---|---|
|データベース論理設計のアンチパターン|全 8 章
|データベース物理設計のアンチパターン|全 4 章
|クエリのアンチパターン|全 6 章
|アプリケーション開発のアンチパターン|全 7 章
|付録: 正規化のルール|全 1 章
個人的には Rails が所々で言及されていたのが助かりました。ポリモー
フィック関連の使用はアンチパターンではあるが、Rails のような成熟し
た実績あるフレームワークを選べばその限りではないとか。なるほど。
私にとって少しタイムリーだった第 21 章の UUID は [MySQL と Rails5
の組み合わせでは使えず](http://guides.rubyonrails.org/v5.0/active_record_postgresql.html)。残念...。
以上、思ったことをつらつらと書いてみました。読んで良かった。
{{< amazon asin="4873115892" title="SQLアンチパターン" >}}
--------------------------------------------------------------------------------
title: "DeNA の遺伝子検査サービス MYCODE を試してみた"
date: "2016-07-30"
--------------------------------------------------------------------------------
以前 [DeNA](http://dena.com/) が遺伝子検査サービスを始めると話題になった [MYCODE](https://mycode.jp/) がキャ
ンペーンをやっていたので試してみました。
{{< tweet user="masutaka" id="750667977100369920" >}}
今回試したのは『[ヘルスケア](https://mycode.jp/plans/health-care.html)』というパッケージ。通常 ¥29,800 のとこ
ろ、キャンペーンが使えたので 40% OFF の ¥17,800 でした。
やり方は簡単で、送られてくる容器に唾液を入れて郵送するだけ。3週間
くらいで結果が Web 上から確認できました。
{{< tweet user="masutaka" id="759254221992652800" >}}
ディスカバリーという、祖先のルーツを教えてくれるオプションも試して
みました。
{{< tweet user="masutaka" id="759259588348837889" >}}
[こちらのリンク](https://mycode.jp/invitation-health-support.html?campaign_code=10b4-84cf-f2c3&src=invitation-health-support_Twitter)から紹介コード「10b4-84cf-f2c3」を使って頂けると、
東京都、神奈川県に在住・在勤・在学の20歳以上の方限定で 40% OFF に
なります。興味ある方はお試し下さいませ。
--------------------------------------------------------------------------------
title: "『Atom実践入門』を読んだ"
date: "2016-07-20"
--------------------------------------------------------------------------------
著者の {{< twitter "tomoyaton" >}} さんから献本頂きました。ありがとうございます。
本書を読んでまず思ったことは「良い時代になったなあ」です。
私は 2000 年から Emacs を愛用しており、20 代の頃、多大な時間を使っ
て Emacs をカスタマイズしてきました。そこで習得した Elisp はプログ
ラマーとしての私に幅を持たせてくれましたが、実務でそのまま使える技
術ではありませんでした。
でも今は Atom があります。使い込めば JS や HTML/CSS を始めとした、
実務で即使える、最新の Web 技術を習得できます。
本書では第6章からがその本領発揮で、Chrome Developer Tools の使い
方に始まり、180 ページ目では Shadow DOM と Custom Elements まで解
説しています。
今は時間とか優先度とかの兼ね合いで乗り換えない予定ですが、隠居して
時間ができたら乗り換えるかも?
## Atom をインストール
そうこう言いつつも、本書を読みながら久々に Atom をインストールして
みました。
Emacs と違って、ネイティブにサポートしている機能がいくつも見つかり
ます。
- Atom にはタブがありますが、Emacs には未だにありません。Elscreen
等を自分でインストールする必要がある上に、タブは 10 個までしか使え
ません。
- Atom は Git を標準でサポートしていますが、Emacs は vc.el という
不完全な形のサポートです。私は Magit に挫折して egg.el を使ってい
ますが、結構バギーです。
- Atom は markdown 等のリアルタイムプレビューをサポートしています
が、Emacs はしていません。{{< post "2015-04-05-1" >}} のような涙ぐましい設定を
しています。
## エディタ初心者も Emacs ユーザも安心な第3章
第3章は「筆者が最も注力した」と書かれているとおり、これから Atom
を使おうとする人に良さそうです。
Emacs ユーザにとって面白いのは、そこかしこに Emacs の風味を感じら
れるところ。脳内で Emacs のキーバインドと照らし合わせながら、ざっ
と読むことが出来ました。
『{{< amazon_link asin="4774150029" title="Emacs実践入門" >}}』の先に本書があるからなんでしょうね。
## 誤植
残念ながら見つけてしまいましたので、ここに記載しておきます。後者は
誤植ではないかも?
P104
(誤) 動作がわかりにくいかもれないので
(正) 動作がわかりにくいかもしれないので
P143
(誤) 少しばかりテンション下がります。
(正) 少しばかりテンションが下がります。
## 自分用メモ
- Command Palette: Toggle (cmd-shift-p)
Emacs の M-x に相当。
- Key Bining Resolver: Toggle (cmd-.)
Emacs の F1-k に相当。Atom はキーに対応する関数(?)をリアルタイムに
表示する。
{{< amazon asin="4774182702" title="Atom実践入門──進化し続けるハッカブルなエディタ (WEB+DB PRESS plus)" >}}
--------------------------------------------------------------------------------
title: "第16回Elasticsearch勉強会に参加してきた #elasticsearchjp"
date: "2016-06-28"
--------------------------------------------------------------------------------
[Elasticsearch](https://www.elastic.co/jp/products/elasticsearch) は {{< post "2014-12-14-1" >}} から個人で使っています。[会社によう
やく導入できた](http://tech.feedforce.jp/introduce-elasticsearch-kibana.html)こともあり、今月は自分にとって Elasticsearch 一色でした。
- GrowthForecast のデータを Elasticsearch にインポートした {{< post "2016-06-13-1" >}}
- 1.7 から 2.3 にバージョンアップしたらハマってフォーラムで質問した [2016/06/14](https://discuss.elastic.co/t/elasticsearch-1-7-5-2-3-3-kibana/52742)
- Kibana-4.5 がメモリをバカ食いするので調べて対策した {{< post "2016-06-26-1" >}}
ちょうどよいタイミングで勉強会の案内を見つけたため、月の締めとして
初参加してきました。
[第16回elasticsearch勉強会 #elasticsearch #elasticsearchjp - elasticsearch勉強会|Doorkeeper](https://elasticsearch.doorkeeper.jp/events/46539)
当日の朝、60 人くらいキャンセル待ちだったので諦めていたのですよ。
でも、あれよあれよという間に参加可能に・・・!
{{< twitter "johtani" >}} はじめとした主催者の皆様、ありがとうございました。
## LogstashとElasticsearchで作るEnterprise Search Platform
{{< speakerdeck "ba059edb7fd746da9445e377040fce85" >}}
Elastic 社の Kosho Owa 氏による発表。
samba 上のドキュメントの変更を vfs_full_audit でシステムログに記録。
必要なログを Logstash から Elasticsearch に送ることで検索インデッ
クス更新のトリガーとしているというお話。
残念ながら Logstash は使ったことはありませんが、ちょっとだけ興味持
ちました。
output で curl とかを eval するのはスケールしないとのこと。その代
わりの方法で filter で ruby を使っていたので、質問タイムで毎回
fork しないか聞いたらしないとのこと。
あとで大谷さんが調べてくれたのがこちら。ありがとうございます。
>[第16回Elasticsearch勉強会を開催しました。 #elasticsearchjp - @johtaniの日記 2nd](http://blog.johtani.info/blog/2016/06/28/16th-elasticsearch-meetup/)
>
>Logstashの[filter-ruby](https://github.com/logstash-plugins/logstash-filter-ruby/blob/master/lib/logstash/filters/ruby.rb)はここで、evalしてcallしてるから、特にforkとかしてないかと。
質問した時はすごい!と思ったのだけれど、よく考えたら Logstash は
ruby(JRuby)で書かれていたのだった...。
fluentd も ruby だからね...。
{{< tweet user="repeatedly" id="747403445468946432" >}}
## 企業・業界情報プラットフォームSPEEDAにおけるElasticsearchの活用
{{< slideshare "us4TQaKHDh0q9z" >}}
[NEWS PICKS](https://newspicks.com/) で有名な株式会社ユーザベースの北内啓氏による発表。
北内氏はなんとあの [ChaSen](http://chasen-legacy.osdn.jp/) の元開発者の方。[Namazu](http://www.namazu.org/index.html.ja) のわかち書きを
[KAKASI](http://kakasi.namazu.org/index.html.ja) にするか、Chasen にするか悩みましたよね?
さてその [SPEEDA](https://www.uzabase.com/speeda/) は MySQL で全文検索していた頃は待たされて辛かった
けど、Elasticsearch にしたらヒャッハーと解決したらしい。
20 ノードくらいで運用していて、各企業データが 1 ドキュメントに収め
られているとのこと。最大約 40MB、そして約 11 万フィールド!これで
問題なく動作するというのだから、Elasticsearch 恐ろしい子!
NEWS PICKS でも Elasticsearch は導入していて、例えば『日本 化粧品
売上高』で検索すると、ピンポイントでグラフが表示される実装をしてい
るとのこと。
## Elasticsearchベースの全文検索システムFess
{{< slideshare "iXpoLBpwGQH3R" >}}
株式会社エヌツーエスエムの菅谷信介氏による発表。
Elasticsearch を検索エンジンとして組み込んだ [Fess](http://fess.codelibs.org/ja/) のお話。権限情報
を filter クエリーで絞り込めば、権限がないドキュメントを検索結果に
表示させずにすむのか。なるほど。
## LT: ElasticsearchとGCPのネットワークでハマった話
{{< speakerdeck "94deb53d7aeb45ef8c8fe83421b4dbf6" >}}
株式会社サイバーエージェントの平田大地({{< twitter "daichild" >}})氏による、GCP
のバッドノウハウのお話。
不具合をとことんまで調べていく熱い話でした。こういうの好き。
## LT: スクリプトフィールドで作るランキングみたいな何か
{{< speakerdeck "95f8a3be504340a691c5a4721827f0d6" >}}
iwag さんによる Elasticsearch のスクリプトは遅いけど(・∀・)イイ!!と
いうお話。
検索速度を比較すると、
フィールド : プラグイン : スクリプト = 1 : 6 : 16
らしい。
フィールドにある JSON っぽい文字列から要素を取り出せないか今月調べ
てましたが、そもそもだいぶ制限がありますよね。
そんなスクリプトだけどニコ動のランキングくらいなら、簡単に作れるよ
というお話でした。
勉強会全体的に Elasticsearch は力技でなんとかなる印象を受けました。
とは言え、基本に忠実にはありたいものです。
## 懇親会
ビール&ピザパーティでした。以前発表したことがある方と話し込んでい
ました。[ホスティングサービスの Elasticsearch](https://www.elastic.co/cloud) 試してみよー。
--------------------------------------------------------------------------------
title: "Kibana-4.5 のメモリ使用量が増え続ける件への対処方法と結果"
date: "2016-06-26"
--------------------------------------------------------------------------------
先日 [Elasticsearch](https://www.elastic.co/products/elasticsearch) を 1.7.5 から 2.3.3 に、[Kibana](https://www.elastic.co/products/kibana) を 4.1.2 から
4.5.1 にアップデートしました。
[アップデート自体はそれなりにハマったものの、なんとか対処できました。](https://discuss.elastic.co/t/elasticsearch-1-7-5-2-3-3-kibana/52742)
ただ、Kibana のメモリ使用量が増え続け、さながらメモリリークのよう
でした。
こちらの記事の方法で解決できたので、結果とともに記録します。
[ver4.2以降のkibanaが突然死する問題について - mnatsu31’s blog](http://mnatsu31.hatenablog.com/entry/2015/12/14/154427)
## 環境
OS: Ubuntu-14.04 LTS
Memory: 2GB
Elasticsearch: 2.3.3
Kibana: 4.5.1
※ Elasticsearch と Kibana はともに公式パッケージを使用。
- [Repositories|Elasticsearch Reference [2.3]|Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/2.3/setup-repositories.html)
- [Getting Kibana Up and Running|Kibana User Guide [4.5]|Elastic](https://www.elastic.co/guide/en/kibana/4.5/setup.html)
## 対処方法
/etc/init.d/kibana を以下のように変更し、"$ service kibana
restart" しました。本当はこのファイルは構成管理したくないのですがね...。
```
--- /etc/init.d/kibana_orig 2016-06-25 13:03:43.000000000 +0900
+++ /etc/init.d/kibana 2016-06-26 10:13:28.000000000 +0900
@@ -18,6 +18,9 @@
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
+NODE_OPTIONS="--max-old-space-size=256"
+export NODE_OPTIONS
+
name=kibana
program=/opt/kibana/bin/kibana
args=''
```
前述の記事によると Kibana (というか Node.js)は 1.5GB を超えるま
でメモリを確保し続けるそうです(一次情報は見つけられなかった)。
私の環境ではスワップアウトし続け、New Relic や Mackerel からアラー
トが飛び続けました...。
## 対応前
緑色の Node.js のプロセスのメモリ使用量が増えていくのが分かると思
います。赤の縦線は New Relic のアラート期間です。

java(Elasticsearch のプロセス)のメモリ使用量が減っているのが興味
深いところです。[Elasticsearch はシステムメモリの半分を使う](https://github.com/elastic/elasticsearch/blob/v2.3.3/distribution/src/main/resources/config/elasticsearch.yml#L45-L46)ようなの
で。
## 対応後
橙色の Node.js プロセスのメモリ使用量が増え続けなくなりました。

拡大すると一目瞭然。"--max-old-space-size=256" だと 260〜270MB 程
度で GC されるようです。

--------------------------------------------------------------------------------
title: "Ruby の構文をトークンに切り分ける"
date: "2016-06-22"
--------------------------------------------------------------------------------
個人的なメモ
```
[1] pry(main)> Ripper.lex(':manage/home')
=> [[[1, 0], :on_symbeg, ":"], [[1, 1], :on_ident, "manage"],
[[1, 7], :on_op, "/"], [[1, 8], :on_ident, "home"]]
```
":" → シンボルの開始
"manage" → 識別子(identifier)
"/" → 演算子(operator)
"home" → 識別子
[class Ripper (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/Ripper.html)
--------------------------------------------------------------------------------
title: "BitBar の Emacs プラグインにエラー処理を追加した"
date: "2016-06-21"
--------------------------------------------------------------------------------

たまに https://melpa.org のレスポンスが悪いせいか、~/.emacs.d/elpa/archives/melpa/archive-contents が壊れるので、エラー処理を追加しました。
壊れた時はこのファイルの最後がこのようになります。
```elisp
;; 壊れてない時
(:keywords "convenience" "window-management"))]))
;; 壊れた時はこの辺に nil が入る
(:keywords "convenience" "window-management"))])nil)
```
壊れていたら最大 3 回リトライして修復を試みます。それでも壊れていたら仕方ないということで。
1 週間くらい使っていて大丈夫そうだったので、PR 出して本日マージされました。
https://github.com/matryer/bitbar-plugins/pull/444
公式サイトからインストールできます。
https://getbitbar.com/plugins/Dev/Emacs/emacs-package-updates.1d.sh
--------------------------------------------------------------------------------
title: "fluent-logger-ruby が堅牢だった件"
date: "2016-06-13"
--------------------------------------------------------------------------------
{{< post "2016-06-13-1" >}} にも書いたとおり、こちらの PR で [fluent-logger-ruby](https://github.com/fluent/fluent-logger-ruby)
を導入しました。
[fluentd にも POST する by masutaka · Pull Request #40 · masutaka/masutaka-metrics](https://github.com/masutaka/masutaka-metrics/pull/40)
その時に、こんな問題に気づきました。
{{< tweet user="masutaka" id="741918782407344128" >}}
結論から言うと、Wrapper を作る必要はありません([一度作ってしまった
けど...](https://github.com/masutaka/masutaka-metrics/pull/40/commits/edaca246a705c5e447e50f453609ef8f3145c032))。fluent-logger-ruby がいい感じに処理してくれます。
fluent-logger-ruby の基本的な使い方は、プログラム開始時に #new し
てインスタンスを保持し、あとは必要な時に #post を呼ぶだけです。
```
class Masutaka
def initialize
@fluent_logger = ::Fluent::Logger::FluentLogger.new
end
def hoge
metrics = { 'field1' => 'hogehoge' }
@fluent_logger.post('masutaka.metrics', metrics)
end
end
```
プログラム稼働中に fluentd が restart または reload すると、
fluentd との接続は切れてしまいます。#post も false を返し送信して
くれません。でも、あまり気にする必要はありません。
なぜ気にする必要がないか、パターンをまとめました。登場するメソッド
は全て [Fluent::Logger::FluentLogger class](https://github.com/fluent/fluent-logger-ruby/blob/v0.5.1/lib/fluent/logger/fluent_logger.rb) にあります。
## プログラム稼働中に fluentd を再起動する
1. プログラムが起動し、fluent-logger が new される
2. fluentd が reload または restart される
3. 直後に #post が呼ばれても、fluentd と通信ができず false を返す
4. 再度 #post が呼ばれると、↑ここで送れなかったデータとともに fluentd に送信し、true を返す
コードはこちらになります(※)。
https://github.com/fluent/fluent-logger-ruby/blob/v0.5.1/lib/fluent/logger/fluent_logger.rb#L152-L181
fluent-logger は常にデータを @pending に入れて、fluentd に送信しま
す。失敗しても @pending は破棄されず、次回の #post に持ち越されます。
失敗したタイミングでコネクションを閉じる(@con.close)ため、次回
#send_data のこの条件に入り、fluentd と再接続されるという仕組みです。
https://github.com/fluent/fluent-logger-ruby/blob/v0.5.1/lib/fluent/logger/fluent_logger.rb#L185-L187
※ [Monitor#synchronize](http://docs.ruby-lang.org/ja/2.3.0/library/monitor.html) で括ってあるので、マルチスレッドで同時実行
されないことも保証されてますね。
## @pending にデータがある状態でプログラムを正常停止する
プログラム停止時に #close が実行されることが保証されているため、こ
ちらのケースも問題ありません。
https://github.com/fluent/fluent-logger-ruby/blob/v0.5.1/lib/fluent/logger/fluent_logger.rb#L88
[Kernel.#at_exit](http://docs.ruby-lang.org/ja/2.3.0/method/Kernel/m/at_exit.html) は Ruby の組み込みメソッドです。正常終了時にブロッ
クが評価されます。
## @pending にデータがある状態でプログラムを異常停止する
kill -9 などで異常停止したケースでは救えません。Kernel.#at_exit と
しても、UNIX プログラムとしても正しい動作です。
## まとめ
これから fluent-logger-ruby をバリバリ使っていきます!
--------------------------------------------------------------------------------
title: "GrowthForecast のデータを Elasticsearch にインポートした"
date: "2016-06-13"
--------------------------------------------------------------------------------
そもそもこんな理由で、インポートしました。
- このサーバで Elasticsearch + Kibana と GrowthForecast を両方稼働するのはリソースの無駄
- GrowthForecast は私の環境では {{< post "2014-09-23-2" >}} という問題がある
インポートする方法はこちらの Issue にまとめました。
[GrowthForecastのデータをelasticsearchにインポートする方法を調べる · Issue #4 · masutaka/masutaka-metrics](https://github.com/masutaka/masutaka-metrics/issues/4)
[Elasticsearch の Bulk API](https://www.elastic.co/guide/en/elasticsearch/reference/1.7/docs-bulk.html) で比較的簡単にインポートすることが出来ま
した。少しクセがあり苦戦した経緯は上の Issue に書いてあります。
インポートしたデータ量はたったの 600 レコード程度です。データの内
容としてはこのブログの Feedly, Hatena::Bookmark, Live Dwango
Reader の購読者数やブックマーク数をグラフ化しています。
POST しているのは自作の [masutaka-metrics](https://github.com/masutaka/masutaka-metrics) です。今は GrowthForecast
と fluentd 両方に POST していますが、そのうち fluentd だけにします。
今回 fluent-logger gem を導入しました。
[fluentd にも POST する by masutaka · Pull Request #40 · masutaka/masutaka-metrics](https://github.com/masutaka/masutaka-metrics/pull/40)
いろいろあった話は次回に書くとして、簡単に fluentd に任意のデータ
を投げられるので便利ですね。仕事でも使う予定。
fluentd の設定は以下を追加しました。ありきたりの設定です。
```
@type elasticsearch
host localhost
port 9200
logstash_format true
logstash_prefix blog-subscribers
logstash_dateformat %Y.%m
type_name social-service
flush_interval 1s
```
blog-subscribers-2016.01, blog-subscribers-2016.02,.. といった感じ
に月ごとに index が増えていきます。type は適当に social-service と
しました。ちなみに index と type は RDB では database と table に
相当します。
以下はグラフイメージです。GrowthForecast の表示期間は最大 1 年です
が、Kibana は上限なし?これは少しうれしい誤算。
## GrowthForecast

## Kibana

--------------------------------------------------------------------------------
title: "Bugsnag に metadata を送る方法"
date: "2016-06-07"
--------------------------------------------------------------------------------
[Bugsnag](https://bugsnag.com) に metadata を送ることが出来るので、ここにもメモします。
```
# どこかに定義
class MasutakaError < StandardError
include Bugsnag::MetaData
end
# それぞれの例外クラスは StandardError の代わりに MasutakaError を継承する
class SummarizedResultBlankError < MasutakaError; end
class SizeZeroError < MasutakaError; end
exception = SummarizedResultBlankError.new("It broke!")
exception.bugsnag_meta_data = {
user_info: {
name: 'masutaka'
}
}
Bugsnag.notify(exception)
```

ドキュメントはこちら。
https://github.com/bugsnag/bugsnag-ruby/blob/v4.1.0/docs/Notification%20Options.md#exception-mixin
**追記(2016-06-08):**
職場の同僚から Bugsnag.notify に直接渡せると教えてもらいました。
https://github.com/bugsnag/bugsnag-ruby/blob/v4.1.0/spec/notification_spec.rb#L118-L148
以下のように書きかえられます。初めに挙げた方法と同じ metadata を設
定したら、こちらが優先されます。
```
class SummarizedResultBlankError < StandardError; end
class SizeZeroError < StandardError; end
Bugsnag.notify(
SummarizedResultBlankError.new("It broke!"),
user_info: { name: 'masutaka' }
)
```
--------------------------------------------------------------------------------
title: "AWS Summit Tokyo 2016 に行ってきた #AWSSummit"
date: "2016-06-04"
--------------------------------------------------------------------------------

{{< post "2014-07-19-1" >}} と {{< post "2015-06-07-1" >}} に引き続き、今年も [AWS Summit
Tokyo](http://www.awssummit.tokyo) に行ってきました。
今回は会社の期末かつキックオフがあった関係で 2 日目のみの参加。通
常業務だったら無理していったのですがね。濃いセッションは 3 日目が
多かっただけに少し残念。
全てのセッションの動画や資料はこちらをどうぞ。
[AWS Summit Tokyo 2016 開催レポート|AWS](https://aws.amazon.com/jp/summit2016-report/)
## Day2 キーノート
{{< youtube "JhN2ewhf3tQ" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2016/2Keynote.pdf)
今年も AWS 日本法人社長の長崎氏によるキーノート。
ゲストスピーカーの日本電産 佐藤氏のプレゼンは予想に反して(失礼)
面白かった。氏の Everything goes to Cloud! という掛け声の下、現在
は社内サーバゼロとのこと。[この規模](http://www.nidec.com/ja-JP/corporate/about/outline/)でそれはすごいぞ・・・!
{{< tweet user="MitsuhiroIriya" id="738196535876288514" >}}
## ランチタイム
やったー!寿司だー!
{{< tweet user="masutaka" id="738207302659002368" >}}
ランチセッションだとこちらのようでした。
{{< tweet user="ikehaya" id="738208122553016320" >}}
こちらはブートキャンプに参加した方向けのようです。
{{< tweet user="syamncat" id="738208524828704769" >}}
3 日目のランチはランチセッションと同じだったみたいですね。
http://twitter.com/cross_black777/status/738569728965283842
お金を払うのは厭わないので、選択肢が増えて欲しいなあ。例年は夕方に
なると腹ペコになるので、今回は[クリーム玄米ブラン](http://www.asahi-fh.com/balance_up/cgb/)を持って行きました。
そういえば食べた後に、[New Relic](https://newrelic.com/) や [Datadog](https://www.datadoghq.com/) のブースで話を聞いてま
した。Datadog の人は名物おじさんっぽい人で、20 分くらいかけて説明
してくれました(次のセッション遅れたw)。サーバ 100 台くらいは管理
したい。
## クラウドとマイクロサービスによる音声操作の新時代 - Amazon Echo & Alexa (同時通訳)
{{< youtube "SQn1yj5jyg8" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2016/2Dev-01.pdf)
- Amazon Echo(ハードウェア) から Alexa を使うことで音声操作が出来る
- Alexa はラズパイとかも使える
- Alexa にスキルを追加
- デベロッパーはスキルを開発することが出来る
- Echo <-> Alexa <-> Lambda <-> API Gateway などと相互にやり取り
- Alexa は音声データと文字の相互変換サービスかな
- Lambda Function を自動生成してくれる
Echo 云々より、Siri をもっと使おうかなー。使うかな? iOS の言語を
日本語に戻さないと日本語を入力できない。
もっと内容を知りたい方はクラスメソッドさんの記事をどうぞ。
[[レポート] クラウドとマイクロサービスによる音声操作の新時代 - Amazon Echo & Alexa #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws/report-on-new-era-with-voice-operating-by-cloud-and-microservice-amazon-echo-and-alexa/)
Amazon Echo 自体の記事もありました。
[AWS Lambdaを使ってAmazon Echoに機能追加してみた | Developers.IO](http://dev.classmethod.jp/etc/alexa-skill-with-lambda-sample/)
## サーバーレスで構築する、マイクロサービスの未来形 (同時通訳)
{{< youtube "FRxlEBzAa3o" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2016/2Dev-02.pdf)
Lambda と API Gateway のゼネラルマネージャーである Tim Wagner 氏に
よる Lambda の紹介とかベストプラクティスの話。初心者向けでした。
こちらもクラスメソッドさんが記事を
[[レポート] サーバーレスで構築する、マイクロサービスの未来形 #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws/aws-summit-tokyo-2016-devcon-ha1420/)
## 【パネルディスカッション】Slack, Qiita, GitHub 利用者 & 提供者の視点で見る、クラウドとツールの使いどころ
{{< youtube "on4jYdJnfpc" >}}
去年の秋まで AWS Japan に在籍していた吉羽さん進行による、岩瀬さん
(NTTコミュニケーションズ)、髙橋さん(Qiita)、藤田さん(GitHub
Japan)による座談会。
岩瀬さんの「ツール導入は心が折れてからが勝負ですね」が心に残りまし
た。私には無理だw
こちらもクラスメソッドさんが
[[レポート] 【パネルディスカッション】Slack, Qiita, GitHub 利用者 & 提供者の視点で見る、クラウドとツールの使いどころ #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws/awssummit-tools/)
## 【パネルディスカッション】サーバーレスの波はホンモノか? 最前線の開発者に聞くコードでサービスの全てを提供する方法
※ TODO: 資料やビデオが公開されたらここに貼る
サーバレスにするために設計したのではなく、気づいたらなっていたとの
こと。そりゃそうですね。
こちらもクラスメソッドさ
[[レポート] 【パネルディスカッション】サーバーレスの波はホンモノか? 最前線の開発者に聞くコードでサービスの全てを提供する方法 #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws/aws-summit-tokyo-2016-devcon-ha1620/)
## SaaS on AWS アーキテクチャと 7 つのベストプラクティス
{{< youtube "TFMBOOkWD9Y" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2016/2E-06.pdf)
Developers Conference が終わってしまったのでこちらに。オンプレの方
向けのセッションで、私にはミスマッチでした。
ほぼマネージドサービスにしたら、サーバー起因のトラブルはゼロだった
とのこと。私の拙い経験だと、EC2 以外では RDS と ElastiCache が不穏
な動きをしたことがありました。勝手に再起動とか、動作不安定とか。
## 【ナイトイベント】IoT Developers’ Night powered by Intel
※ TODO: 資料やビデオが公開されたらここに貼る
これらの料理はすぐになくなりました・・・!
{{< tweet user="masutaka" id="738306798793297926" >}}
会場の様子です。
{{< tweet user="masutaka" id="738327602331590656" >}}
--------------------------------------------------------------------------------
title: "init.el にパスワードやアクセストークンを書かずに済む方法"
date: "2016-05-06"
--------------------------------------------------------------------------------
{{< post "2016-05-06-1" >}} で init.el にアクセストークンを設定するという話をし
たので。
最近は dotfiles を GitHub に公開する方も増えているかと思います。
init.el にパスワードやアクセストークンを書いたのを忘れて、GitHub
の公開リポジトリに push すると悲惨なことになりますよね。
そこで、こんな方法はいかがでしょう?
こんな関数を init.el に書いておきます。
{{< gist "masutaka" "919aed23017779bf5a7155a08d730d75" >}}
こんな設定をしたければ、、
```elisp
(setq helm-qiita-access-token "1234abcd....")
```
init.el にはこのように書きます。
```elisp
(setq helm-qiita-access-token (my-lisp-load "helm-qiita-access-token"))
```
あとは ~/.emacs.d/spec/helm-qiita-access-token を作成し、
```elisp
"1234abcd...."
```
とだけ書いておきます。ダブルクオーテーションも必要です。もちろん
~/.emacs.d/spec は .gitignore に追加します。
read() で読み込んでいるので、S式であればなんでも書けます。もちろん
コメントも OK。
実はこれ、[mew-lisp-load()](https://github.com/kazu-yamamoto/Mew/blob/v6.7/mew-func.el#L1311-L1323) の簡易版です。昔よく [Mew のソース](https://github.com/kazu-yamamoto/Mew)を読ん
でいて、こりゃ使えそうだということで、結構前に拝借致しました。
--------------------------------------------------------------------------------
title: "Qiita や Qiita:Team のストックを Emacs から開ける helm-qiita.el を作った"
date: "2016-05-06"
--------------------------------------------------------------------------------
休み前に職場の同僚と話していて脈絡なく閃いたので、ズビっと作ってみ
ました。
{{< github_repo "masutaka/emacs-helm-qiita" >}}
こんな感じに、[Qiita](https://qiita.com/) や [Qiita:Team](https://teams.qiita.com/) のストックを Helm Interface 上で
絞り込んで、ブラウザで開くことが出来ます。

[MELPAにも取り込まれた](https://github.com/melpa/melpa/pull/3840)ので、M-x package-install helm-qiita でイン
ストールできます。
## 設定方法
[README.md に書いたとおり](https://github.com/masutaka/emacs-helm-qiita/blob/master/README.md#setup)、このような設定をすると使えます。
```elisp
(setq helm-qiita-username "Your Qiita Account")
(setq helm-qiita-organization "Your Organization") ;; optional
(setq helm-qiita-access-token "Your Access Token")
(helm-qiita-initialize)
```
Organization は https://feedforce.qiita.com/ の場合は "feedforce"
を設定して下さい。指定しなければ(nil なら)、https://qiita.com/
になります。
Access Token は https://qiita.com/settings/applications から作れま
す。read_qiita または read_qiita_team のスコープを付けて下さい。
デフォルトでは 1 時間に 1 回、Emacs の Timer から非同期で [Qiita
API](https://qiita.com/api/v2/docs) を叩いて ~/.emacs.d/helm-qiita を更新します。helm-qiita.el は
このファイルを参照するというわけです。
⌘-q に割り当ててみました。いや〜、こりゃ便利だわ...。
```elisp
(define-key global-map (kbd "s-q") 'helm-qiita)
```
## 開発のこととか
Qiita:Team のストックはそこそこメンテナンスしているわりに、見に行
くのに一手間かかるので、あまり使っていませんでした。これで相当ストッ
クが捗ります。
Qiita のストックは実は使ってなくて、はてブを自作の
[helm-hatena-bookmark.el](https://github.com/masutaka/emacs-helm-hatena-bookmark) と共に使っています。helm-qiita.el はこれを
元に作りました。面倒だったのが、Qiita API の pagination。
[公式の Qiita gem を見たらゴリッとパースしていた](https://github.com/increments/qiita-rb/blob/v1.3.2/lib/qiita/response.rb#L86-L89)ので、そういうもの
かと思い[私も elisp で頑張ってみました。](https://github.com/masutaka/emacs-helm-qiita/blob/0.0.2/helm-qiita.el#L209-L220)
今のところ Qiita と Qiita:Team のストックを両方参照することは出来
ませんが、要望があれば対応するかもしれません。もちろん Pull
Request 大歓迎です。
{{< tweet user="masutaka" id="727546817856987136" >}}
--------------------------------------------------------------------------------
title: "社内勉強会で github-nippou v2.0.0 をライブリリースした"
date: "2016-04-09"
--------------------------------------------------------------------------------
{{< post "2016-03-23-1" >}} に予告したとおり、今回は破壊的変更をしました。
https://github.com/masutaka/github-nippou/releases/tag/v2.0.0
- 改良
- --all と --num オプションを削除
- 代わりに --since-date と --until-date を追加
- デバッグオプション --debug を追加
- サブコマンド version を追加
- パフォーマンスの改善
- バグ修正
- Issue や Pull request 発生時ではなく、現在のタイトルを使用
- 同じく現在のステータスを使用
- その他
- ソースコードのリファクタリング
github-nippou は引数を付けなければ、今日の GitHub の活動から日報用
のリンクを生成します。今回の v2.0.0 から --since-date や
--until-date を付けることで、GitHub の活動を柔軟に取って来れるよう
になりました。
[GitHub Events API の仕様](https://developer.github.com/v3/activity/events/)限界である 90 日前からも取得できます。ただ
し同仕様で最大数が 300 という制限があります。
パフォーマンスも改善したので、上のような激しい使い方も可能です。
内部的には最大 5 並列で動作します。
並列数を指定するオプションは作りませんでした。並列数を意識すべきは
私であって、ユーザではないからです。ですが、開発用と設定厨の方向け
に[環境変数や git config で設定する方法](https://github.com/masutaka/github-nippou/blob/v2.0.0/lib/github/nippou/commands.rb#L124-L127)はあります。ご自由にどうぞ。
という話を社内勉強会で発表して、その場で [v2.0.0 を RubyGems.org に
リリース](https://rubygems.org/gems/github-nippou/versions/2.0.0)しました。
{{< speakerdeck "bae5896a9b6d4d59a202c0953211b2ae" >}}
Speaker Deck は URL がクリッカブルでないので、スライドに出てきた
URL を貼っておきますね。
http://kitak.hatenablog.jp/entry/2014/04/22/013849
https://rubygems.org/gems/github-nippou/versions/0.0.1
https://github.com/masutaka/github-nippou/commit/4f408a6d
https://github.com/octokit/octokit.rb
https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user
https://developer.github.com/v3/activity/events/
https://developer.github.com/v3/activity/events/types/
https://github.com/grosser/parallel
SlideShare は別の問題が...。
[KeynoteのスライドをSlideShareにアップロードすると日本語が表示されない問題 - Qiita](http://qiita.com/yasulab/items/49511c27179be454d568)
[アップロードはしてみた](http://www.slideshare.net/masutaka/ss-60651066)ものの、やはり...。
--------------------------------------------------------------------------------
title: "GitHub の pull request commit URL から以前の commit URL に移動するブックマークレット"
date: "2016-04-08"
--------------------------------------------------------------------------------
GitHub が1ヶ月ほど前にリリースした、[More code review tools](https://github.com/blog/2123-more-code-review-tools) は全般
的に気に入っていません。
- 変更されたファイル一覧が分かりづらくなった
- commit 単位でのコメントがしづらくなった
とくに後者は、ブラウザのアドレスバーでこのようにいじって凌いでいました...。
https://github.com/masutaka/hoge-repository/pull/128/commits/12345678...
↓
https://github.com/masutaka/hoge-repository/commit/12345678...
これではあんまりなので、こんなブックマークレットを作り
"to commit URL" という名前のブックマークにしました。
> javascript:location.href=location.href.replace(/\/pull\/\d+\/commits\// , "/commit/")
ひとまずこれで凌げそうです。そもそもなぜコメントできるようにしてな
いのですかね?
--------------------------------------------------------------------------------
title: "BitBar の Emacs と GitHub のプラグインを少し便利にした"
date: "2016-03-30"
--------------------------------------------------------------------------------
それぞれ以下の Pull Request です。
- [[Emacs Package Updates] Add error handler by masutaka · Pull Request #357 · matryer/bitbar-plugins](https://github.com/matryer/bitbar-plugins/pull/357)
- [[GitHub status] Add link to official github status by masutaka · Pull Request #356 · matryer/bitbar-plugins](https://github.com/matryer/bitbar-plugins/pull/356)
## [Emacs Package Updates plugin](https://getbitbar.com/plugins/Dev/Emacs/emacs-package-updates.1d.sh)
Emacs が見つからないとか、パッケージを更新できないなど、エラーが発生した時はいつもの Gnu(ヌー)さんの横に err と表示されます。

パット見、牛に見えますが、れっきとしたヌーです。多分。
パッケージを更新できないのは 100% これなんですよね。本当に謎。ネットに繋がらないだけだったら、エラーにはなりません。
{{< tweet user="masutaka" id="711555411812294658" >}}
## [GitHub status plugin](https://getbitbar.com/plugins/Dev/GitHub/github_status.10m.py)
"Everything operating normally." をクリッカブルにしました。GitHub に障害があったら https://status.github.com/ を見に行きたくなりますよね?

--------------------------------------------------------------------------------
title: "github-nippou v1.2.0 released"
date: "2016-03-23"
--------------------------------------------------------------------------------
https://github.com/masutaka/github-nippou/releases/tag/v1.2.0
- 改良
- URL でソートしたリストを出力
- Issue や PR がクローズされていたら、**closed!** を付加
v2.0.0 では {{< post "2016-03-21-1" >}} に追加した -a, -n オプションが早くもな
くなる予定です・・・!
--------------------------------------------------------------------------------
title: "BitBar の Emacs Package Updates プラグイン作って、本家にマージされた"
date: "2016-03-22"
--------------------------------------------------------------------------------

[Rebuild の Aftershow 132](https://rebuild.fm/132a/) で紹介された [BitBar](https://getbitbar.com/) を使い始めました。
[Homebrew のアップデート可能数](https://getbitbar.com/plugins/Dev/Homebrew/brew-updates.1h.sh)や、[GitHub のステータス](https://getbitbar.com/plugins/Dev/GitHub/github_status.10m.py)を表示させています。宮川さんがやっている、現在のタスクを OSX のメニューバーに表示というやつも試しています。
で、Emacs の Package アップデート可能数も出したかったので、[本家に PR だして無事マージされました](https://github.com/matryer/bitbar-plugins/pull/335)。
こんな感じに表示されます。

Plugin のページからインストール出来ます。ポーリング間隔や Emacs の場所は適宜変えて下さい。
[Emacs Package Updates on BitBar - Put anything in your Mac OS X menu bar](https://getbitbar.com/plugins/Dev/Emacs/emacs-package-updates.1d.sh)
エラー処理が甘いので、あとで直すかも。本当はシェルスクリプトじゃなくて、Emacs Lisp スクリプトにしたかったのですが、標準出力の捨て方が分からず一旦断念しました。
おまけ
{{< tweet user="masutaka" id="711861867598077953" >}}
--------------------------------------------------------------------------------
title: "github-nippou v1.1.0 and v1.1.1 released"
date: "2016-03-21"
--------------------------------------------------------------------------------
https://github.com/masutaka/github-nippou/releases/tag/v1.1.0
https://github.com/masutaka/github-nippou/releases/tag/v1.1.1
-a オプションを追加しました。今日より前のイベントも(存在すれば)
標準出力に出力します。日報書き忘れの時などにご利用下さい。
-n オプションも追加しました。たまに、作成した PR の取りこぼしがあ
ったのはこのせいでした。以前 [Issue 作って](https://github.com/masutaka/github-nippou/issues/19)忘れてました。
> [Events|GitHub Developer Guide](https://developer.github.com/v3/activity/events/)
>
> Events support [pagination](https://developer.github.com/v3/#pagination), however the per_page option is
> unsupported. The fixed page size is 30 items. Fetching up to ten
> pages is supported, for a total of 300 events.
Octokit::Client::Events#user_events が使う
"GET /users/:username/events" は pagination をサポートしており、
デフォルトでは 30 イベントしか返さないからです。
デフォルトを 50 にして且つ、オプションで指定可能にしました。10 の
倍数を指定して下さい。上限は 300 です。
あとは "<" と ">" をエスケープしたり、使用する Gem のバージョンの
縛りをなくしてみたり。
今回初めて [Thor](http://whatisthor.com/) を使いました。[お手軽にコマンドラインオプションや
ヘルプを実装できる](https://github.com/masutaka/github-nippou/pull/37/files?w=)ので、良い感じですね。
--------------------------------------------------------------------------------
title: "このサイトを http2 対応した"
date: "2016-03-15"
--------------------------------------------------------------------------------
今まで http だったこのサイトを http2 対応しました。
静的ファイルもそうですが、このサイトで動いている [kibana](https://www.elastic.co/products/kibana) が体感で速くなった気がします(計測すればよかった)。
SSL 証明書は最近流行りの [Let's Encrypt](https://letsencrypt.org/) ではなくて、温かみのある [StartSSL](https://www.startssl.com/) で取得しました。パスワードではなく、証明書でのログインがいいですね。
どちらも無料で取得できます。前者はコマンドラインから取得できるが構成管理難しめ、後者はサイト上から手作業で取得が必要だが構成管理は容易、というおおざっぱな違いがあります。
今回学んだことは **「出来るだけ https 対応してから http2 対応すべし」** でした。雑に http2 にしたら `403 Forbidden` や、Chrome で `ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY` が発生しハマりました。
あとは **「早く寝ろ」** でしょうか。日曜日の後半は完全に頭が働いていませんでした...。
nginx の設定では主に以下を学びました。
- `ssl_session_cache`
- 高速化のため、セッションキャッシュを設定する
- `ssl_ciphers`
- より安全にするため、暗号化スイートを明示的に設定する
- `ssl_dhparam`
- より安全にするため、DH パラメータファイルを指定する
- `add_header Strict-Transport-Security`
- より安全にするため、HSTS を用いて常に HTTPS 通信を行う
- **H**TTP **S**trict **T**ransport **S**ecurity
以下、作業メモです。
## 2016-03-13(日)
1. [金曜日の社内勉強会で http2 の話](http://www.slideshare.net/tmd45/http2-in-nginx)を聞いたこともあり、16:00 頃突然 masutaka.net http2 化の意欲が湧いてきた。この時点ではすぐ出来るだろと思っていた
2. Chef での構成管理がしやすそうな StartSSL で Class 1 の証明書を取得した。必要な CSR(Certificate Signing Request)はほぼ指示通りの以下のコマンドで作成した
```console
$ openssl req -new -nodes -newkey rsa:2048 -keyout yourname.key -out yourname.csr
```
3. ドメイン認証のために whois に登録したメールアドレスを受取可能にする必要があると気づき、masutaka.net に Postfix をインストールした
4. 25 番ポートを開けないとメールが受け取れないことに気づき、開けた
5. StartSSL から何度 Verification メールを送っても受信できず、`$ tail -f /var/log/mail.log` をずっと眺めてた
6. ふと、StartSSL にアクセスし直し再送したら、あっさり受信...
7. この辺で迷走。SMTP relay をやりたくなり試行錯誤。結局諦めた
8. 443 番ポートを開け、一気に http2 にするも `403 Forbidden` や Chrome だけで `ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY` が発生したりの大混乱
* [Mozilla SSL Configuration Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) を参考にはしていた
9. なんとか SSL 化は成功。Chrome からは『接続は古い暗号スイートにより暗号化されています』と言われていたが、AM2:00 になってしまったので就寝
## 2016-03-14(月)
1. 会社の同僚から http2 で Chrome に怒られるのは `ssl_ciphers` (長いやつ)を設定してないからかもとのアドバイス。[Qualys SSL Labs の SSL Server Test](https://www.ssllabs.com/ssltest/index.html) も教えてもらった。この時点でのスコアは B
2. 会社に置いていた『{{< amazon_link asin="4774178667" title="nginx実践入門" >}}』もゲットして帰宅
3. Mozilla SSL Configuration Generator の設定を『nginx実践入門』と照らしあわせて、1つずつ設定。`ssl_ciphers` を設定したら B から A になり、`ssl_dhparam` を設定したら A が A+ になった
* `ssl_dhparam` ファイルは以下のコマンドで作成した。作成には数分かかった。
```console
$ openssl dhparam 2048 -out dhparam.pem
```
:link: https://www.ssllabs.com/ssltest/analyze.html?d=masutaka.net

4. https から http2 へは nginx の設定を以下に変更してあっさり終了
```nginx
listen 443 ssl;
↓
listen 443 ssl http2;
```
※ nginx は Ubuntu の PPA で 1.9 系を使っていたため、http_v2_module が含まれていた。
5. Chrome 先生からご指摘を受けているので、このブログで http のリソースを使っている箇所を出来るだけ https に変更。『このブログのはてなブックマーク数』と『Amazon の商品リンク』は出来ず。後日考えることに
{{< amazon asin="4774178667" title="nginx実践入門" >}}
--------------------------------------------------------------------------------
title: "Chrome 拡張 Tweets Favicon Badges に要望出したら 29 分で対応された"
date: "2016-02-28"
--------------------------------------------------------------------------------
最近はなるべくデフォルトのツールを選択するようにしていて、OSX で
Twitter を見るときはブラウザで https://twitter.com/ を見ています。
私はホームと複数のリストをタブで開いていますが、問題になるのがその
幅。3つとなると結構邪魔です。
じゃあと「タブを固定」すると新着ツイートが分からなくなってしまいます。
そこで見つけたのが [Chrome 拡張の Tweets Favicon Badges](https://chrome.google.com/webstore/detail/tweets-favicon-badges/hmjfchbkcibbjgkbghogkobbglkpjlgn)。このように
favicon にバッジを付けてくれます。

ただ、リストの favicon にはバッジが付かなかったので、要望を出した
ら 29 分で対応して下さいました。感謝!
[Showing a badge of list pages · Issue #1 · yurtaev/extension-tweets-favicon-badges](https://github.com/yurtaev/extension-tweets-favicon-badges/issues/1)
似た Chrome 拡張に [Favicon Badges](https://chrome.google.com/webstore/detail/favicon-badges/fjnaohmeicdkcipkhddeaibfhmbobbfm) もありました。こちらは
twitter.com 以外の favicon にも付けてくれるようです。バッジが見づ
らいのと全サイトの Read 権限を与える必要があるので、今回は見送りま
した。
--------------------------------------------------------------------------------
title: "PLANTRONICS Bluetooth ヘッドセットの電源が付かなくなった件"
date: "2016-02-11"
--------------------------------------------------------------------------------
一昨日ジムから帰ってきてから、気づかないうちに iPhone と接続し、勝手にリダイアルを始めるようになりました...。
しばらくいじっていたら電源が付かなくなり、どうにもならない状態に。充電はできるけど一瞬でバッテリーが消費されるような動き。
充電直後は電源が付くので公式のこちらの方法でリセットしたところ、まだ 20 分くらいですが、使えるようになりました。
[BackBeat GO トラブルシューティング : ボタンが応答しない](http://www.plantronics.com/jp/support/kb/detail.jsp?vfurl=/articles/ja/Troubleshooting/BackBeat-GO-Unresponsive-Buttons&c=All&lang=ja®ion=jp)
またおかしくなったら[サポート](http://www.plantronics.com//jp/support/)に連絡してみよう。
Bluetooth イヤホンにしては ¥5,000 ちょっとと割安だし、性能も申し分ないのでオススメです。
{{< amazon asin="B00EXY1RS8" title="【国内正規品】 PLANTRONICS Bluetooth ワイヤレスヘッドセット(ステレオイヤホンタイプ) BackBeat GO2 Black BACKBEATGO2-B" >}}
最近ジムでランニングしながら、ゼノブレイドとか FF13 の戦闘音楽聞くのがマイブームなので、こちらも気になっている。
上の BackBeat GO は汗に強いわけではないのと、カナル型なので走った時の振動が耳に伝わりやすいという理由もあるけどね。
{{< amazon asin="B00LIZD8N2" title="【国内正規品】 PLANTRONICS Bluetooth スポーツ用ワイヤレスヘッドセット(ステレオイヤホンタイプ) BackBeat Fit Blue BACKBEATFIT-BL" >}}
P.S.
スタビライザー(変なフック)の使い方が未だに全然わからないんですけどw
[スタビライザー(イヤフォン)の使い方 - オーディオ|【OKWAVE】](http://okwave.jp/qa/q8800568.html)
--------------------------------------------------------------------------------
title: "yard doc コマンドの -o オプション以外で出力ディレクトリを変更する考察"
date: "2016-01-31"
--------------------------------------------------------------------------------
結論から言うとできませんでした。-o オプションが必須です。
以下、調査結果のメモ。
`$ bundle exec yard doc` したら、doc ディレクトリではなく hoge ディ
レクトリにドキュメントファイルを作りたかったんです。
でも設定ファイルやモンキーパッチではどうにもなりませんでした。
Pull Request 出すしかないけど、そこまでして変えたいわけじゃないか
らなあ...。
## -o オプション指定した場合のフロー
`$ yard doc -o hoge` すると、options.serializer.basepath に 'hoge'
が入る。
https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/cli/yardoc.rb#L652-L655
```
opts.on('-o', '--output-dir PATH',
'The output directory. (defaults to ./doc)') do |dir|
options.serializer.basepath = dir
end
```
options.serializer は YARD::Serializers::FileSystemSerializer
class のインスタンスで、basepath の setter は以下のように定義され
ている。
https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/serializers/file_system_serializer.rb#L9-L11
```
def basepath=(value)
@basepath = options[:basepath] = value
end
```
@basepath はその後、同 class 内の #serialize で参照される。
## -o オプション指定しない場合のフロー
前述のフローには入らないので
YARD::Serializers::FileSystemSerializer#basepath は nil のままになる。
どうにかして 'hoge' を代入したい。
#new でも代入していることを発見。
https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/serializers/file_system_serializer.rb#L27-L31
```
def initialize(opts = {})
super
@basepath = (options[:basepath] || 'doc').to_s
@extension = (options.has_key?(:extension) ? options[:extension] : 'html').to_s
end
```
options は継承元の YARD::Serializers::Base で以下のように初期化さ
れている。opts に { basepath: 'hoge' } などを渡せれば良さそう。
https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/serializers/base.rb#L27-L29
```
def initialize(opts = {})
@options = SymbolHash.new(false).update(opts)
end
```
残念。その余地はありませんでした。
https://github.com/lsegal/yard/blob/v0.8.7.6/lib/yard/cli/yardoc.rb#L20
```
default_attr :serializer, lambda { Serializers::FileSystemSerializer.new }
```
## まとめ
- 以上のとおりなので、~/.yard/config で設定してどうにかなるものではない
- モンキーパッチを書こうにも、Rails みたいな initializer ファイルはない
- 現在の master も特に実装変わってない
--------------------------------------------------------------------------------
title: "Qiita の markdown を Emacs からプレビューする"
date: "2016-01-15"
--------------------------------------------------------------------------------
{{< post "2015-04-05-1" >}} の Qiita 版です。雑です。
init.el にこんなのを定義します。
```elisp
(defun qiitadown ()
(interactive)
(shell-command (format "qiitadown.sh %s" (buffer-file-name))))
(with-eval-after-load "markdown-mode"
(define-key markdown-mode-map (kbd "C-c C-c C-q") 'qiitadown))
```
パスの通ったディレクトリに以下のシェルスクリプトをパーミッション
755 とかで置きます。
{{< gist "masutaka" "514514773a07fda1d221" >}}
あと、qmc コマンドが必要です。Prepare に書いてあるように
qiita-markdown-cli gem もインストールして下さい。
markdown ファイルを開いて、C-c C-c C-q すれば Chrome とかでプレビュー
が見られます。
--------------------------------------------------------------------------------
title: "できるだけ人感センサー付きLED照明に変えてみた"
date: "2016-01-10"
--------------------------------------------------------------------------------
[日頃からおすすめしている2015年に買ってよかったもの|Act as Professional](https://hiroki.jp/recommend-goods-in-2015)
引っ越してから、トイレの照明を消し忘れたり、出かけようと靴を履いた
らキッチンの照明を消し忘れて靴をまた脱ぐ、ということがよくあったの
で、私もえいやっと変えてしまいました。
照明の消し忘れはないか、照明のスイッチはどこかなど、考える必要が減
り良い感じです。
{{< amazon asin="B00940J9OK" title="アイリスオーヤマ LED電球 人感センサー付 小形電球タイプ 3.9W(全光束:300 lm/昼白色相当)【斜め取付け専用】IRIS LDA4N-H-E17SH" >}}
## 電球のサイズ
Amazon で買うにあたり、まずサイズを調べました。
[電球の口金サイズの種類、測り方を徹底解説。電球買いに行く前にチェックすべし!|Only1 Press](http://news.only-1-led.com/bulb-size-explanation)
しかし、うちの電球にはサイズが書いてない・・・!
仕方がないので、ものさしで測り E17 だとあたりを付けて、1 つだけ買
いました。幸運にも合ってました。
## 垂直か斜めか
人感センサーなしと比べて、ここが一番注意すべきポイントかもしれません。
電球を垂直に取り付けるタイプか、斜めに取り付けるタイプかで、センサー
の位置が変わってきます。間違えると照明が付かず悲惨なことになるので、
一度電球を取り外すなどして、しっかり確認する必要があります。
こちらは垂直式。形状からして全然違います。
{{< amazon asin="B00940HRLW" title="アイリスオーヤマ LED電球 人感センサー付 垂直 昼白色 LDA4N-H-E17SV 300lm" >}}
## 照明の色
元の電球と同じ電球色を探したのですが、同じアイリスオーヤマの商品で
は値段が 2 倍くらい違いました。
- {{< amazon_link asin="B00940J9OK" title="昼白色" >}}: ¥1,779
- {{< amazon_link asin="B006IHKRDY" title="電球色" >}}: ¥3,400
メーカーのウェブサイトを見たら、本来法人向けの商品のようで、公式の
[アイリスプラザ](http://www.irisplaza.co.jp/)では売っておらず。両方とも定価が ¥4,500 でした。
- [LDA4N-H-E17SH LED電球 一般電球タイプ 斜め取付人感センサー付 昼白色相当](https://www.irisohyama.co.jp/led/houjin/download/item.asp?CD=558716)
- [LDA3L-H-E17SH LED電球 一般電球タイプ 斜め取付人感センサー付 電球色相当](https://www.irisohyama.co.jp/led/houjin/download/item.asp?CD=558715)
どうやら昼白色タイプだけが Amazon だけで ¥1,779 という、おそらく
激安価格で売られている状況のようでした。
直感で今が買いだ!と判断し、ズビっと 5 つ(※)購入するに至りました。
しめて ¥8,895 なり。ギリギリで良い買い物をしたと信じましょう。
※ 玄関x1、キッチンx2、洗濯機置き場x1、トイレx1
LED電球は湿気に弱いようなので、風呂場には付けないほうが良いと思い
ます。
--------------------------------------------------------------------------------
title: "『武士の家計簿』は落ち着いた良い映画だった"
date: "2016-01-07"
--------------------------------------------------------------------------------
え、家計簿付けてなかったの?
というのがツッコミどころ。
当時の武士はそんなもんだったのかな?
とは言え、全体的な雰囲気は好き。
若い頃にそろばんにのめり込む猪山直之を見て、今の時代だったらどんな
職業に就いていたのかなと思った。
普段の暮らしから見た、幕末の混乱も興味深かった。
> [武士の家計簿の猪山家は、今も続いているんでしょうか? - Yahoo!知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1353251963)
>
> しかし、家宝ともいえよう家計簿を含む文書類が古本屋で売りに出されて
> いたということから推測すると、猪山家はもはやまともな形では存続して
> いないのではないかと思われます。
諸行無常ですね...。
Amazon プライム・ビデオにありました。
{{< amazon asin="B00FIWTXN0" title="武士の家計簿" >}}
DVD 版はこちら。
{{< amazon asin="B004Q9UCAE" title="武士の家計簿(初回限定生産2枚組) [DVD]" >}}
--------------------------------------------------------------------------------
title: "El Capitan で eventmachine や puma のビルドが通らないアレへの対策と解説"
date: "2016-01-01"
--------------------------------------------------------------------------------
El Capitan から openssl のヘッダファイルが削除されました。ヽ(`Д´)ノプンプン
Homebrew をお使いの方は、eventmachine や puma をインストールしよう
とすると、こんなエラーが発生すると思います。(発生しない方は、すで
に後述のコマンドを実行しているのだと思います。)
```
make "DESTDIR=" clean
make "DESTDIR="
compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include
^
1 error generated.
make: *** [binder.o] Error 1
make failed, exit code 2
```
## 対策方法
このコマンドを実行するだけです。
```
$ brew link openssl --force
```
/usr/local/include や /usr/local/lib に openssl へのシンボリックリ
ンクが作られ、gem install 可能になります。
Homebrew の openssl がリンクされていますね!
```
$ otool -L ~/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/eventmachine-1.0.8/ext/rubyeventmachine.bundle
/Users/masutaka/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/eventmachine-1.0.8/ext/rubyeventmachine.bundle:
/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
```
[openssl の Formula は keg_only なので](https://github.com/Homebrew/homebrew/blob/3c5a85506ba50d67803a759b71f1d87d26ce1c29/Library/Formula/openssl.rb#L15-L16)、インストールしただけではシ
ンボリックリンクが作られないようです。
keg_only の説明は公式のマニュアルにありました。
> [How to build software outside Homebrew with Homebrew keg-only dependencies. - Homebrew/homebrew](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/How-to-build-software-outside-Homebrew-with-Homebrew-keg-only-dependencies.md)
>
> That’s because Homebrew keeps it locked away in its prefix,
> accessible only via its opt directory. keg_only = Not symlinked
> into the $PATH by default.
ネット上には他のやり方もありましたが、面倒だったり間違っていたりし
たので、ここにまとめておきます。
## --with-opt-dir を指定する方法
[Need to specify `--with-opt-dir` on OSX 10.11 El Capitan. · Issue #718 · puma/puma](https://github.com/puma/puma/issues/718)
間違ってはいませんが、gem install のたびに指定する必要があり面倒だと思います。
```
$ gem install eventmachine -- --with-opt-dir=$(brew --prefix openssl)
```
rbenv-default-gems plugin {{< post "2014-10-28-1" >}} にはこのオプションを渡せ
ないので、手動で gem install することになります。
bundle install の時は ~/.bundle/config に以下を追加します。これも
gem ごとに追加する必要があります。
```
BUNDLE_BUILD__EVENTMACHINE: "--with-opt-dir=/usr/local/opt/openssl"
```
## --with-cppflags を指定する方法
[ruby - gem eventmachine fatal error: 'openssl/ssl.h' file not found - Stack Overflow](http://stackoverflow.com/questions/30818391/gem-eventmachine-fatal-error-openssl-ssl-h-file-not-found)
このオプションだけだと、
・ヘッダファイルは Homebrew の openssl を参照し、
・ライブラリはシステムの openssl とリンクしてしまいます。
--with-ldflags=-L$(brew --prefix openssl)/lib も指定しないと、
おかしなことになると思います。
**追記(2017-01-26):**
現在の Homebrew は brew link 出来なくなっていました。
```
$ brew link openssl --force
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
```
仕方がないので、bundle config で回避します。
```
$ bundle config build.puma --with-opt-dir=/usr/local/opt/openssl
```
--------------------------------------------------------------------------------
title: "東京の単身引越しは『ケーエー引越センター』最強説"
date: "2015-12-29"
--------------------------------------------------------------------------------
http://ka-center.jp/

最近の記事のカテゴリは {{< tag "Life" >}} ばかりです。このブログは一体どこに向かうのでしょう...?
さて、{{< post "2015-12-14-1" >}} にも書いたとおり、先月 20 日に荒川区に引越しました。使ったのは『[ケーエー引越センター](http://ka-center.jp/)』です。
これまで 7 回の引越しをしてきましたが、その中でも東京の単身引越しはここが一番だと思いました。2 万円を切る価格で、質も悪くない、むしろ非常に良い。
他に良い点を上げると、
- 見積もり前は電話が一切かかってこない
- 個人的に最も評価しています
- 訪問見積もりがない
- こちらからかけたフリーダイヤルで見積もってもらいます
- ダンボール代もオプション
- 頑張ればさらに 3,000 円前後安く出来た
- まっとうな手段で低価格を実現しているようにみえる
- [費用を抑えても高い品質で引越しができるケーエー引越センターの秘密](http://ka-center.jp/himitsu/)
- 作業が早くて丁寧
## 引越しの概要
【日時】
2015年11月20日(金曜日・作業開始時間 12:00頃~)
【荷物量】
単身・1人暮らし用程度の荷物量(やや多め)
【お部屋】
アパート(2LDK)→ マンション(1K)
【移動距離】
21.7km(世田谷区 → 荒川区)
【付属サービス】
家電設置サービス(洗濯機のみ)
【料金】
19,560円
## 見積もりまで
平日の夜 0:00 過ぎに、某大手とケーエー引越センター(以下ケーエー)のサイト上で見積もり依頼をしました。
某大手は今電話してよいか SMS で確認が来ました。OK したら、すぐに電話が。この時点では値段はわからず。訪問見積もりの日が決まりました。
ケーエーはメールで自動見積もり表が送られてきました。¥13,750 と書いてあります。安すぎる...。半分不安。
某大手には(シフトは組んでいるのでしょうけど)闇を感じました。{{< post "2012-07-03-1" >}} という状況なのでどこも同じだと思いますがね。
ケーエーは人間ではなく機械に働かせており、日々自動化を考えているエンジニアとしては少し胸が熱くなりました。労働集約型でないのが良いのです。
## 見積もり当日
最初に某大手の訪問見積もりを受け、その後ケーエーに電話見積もりをすることにしました。
ところが約束の時間 13:00 を過ぎても来ません。数分待っていたら電話が来ました。どうやら少し遅れるとのこと。どのくらいだろう?などと思っていたら、急に見積もりが始まったッーー!!
(まさかうちに来るのが面倒なのか...?)
話していたら、4 万円だったのが、3 万 4 千円まで下がりました。まだ何も見ていないのに...。
この時点ではこの値段でも良いかと思いましたが、ケーエーの電話見積もりもやりたかったので(あの低価格ですから)、あとで連絡すると伝えました。
電話の前にお茶を入れていたら着信が。
またさっきの某大手の営業だー!
仕方なく出ましたよ。
これから電話するケーエーの話になり、「そんなところは知らない、バイトが雑に荷物を扱うに決まっている」と悪口が始まりました。よく分からないけど腹が立ちました。
そしてなぜか値段は 2 万 5 千円まで下がりました...。(まだ何も..
あとで連絡すると伝え、気を取り直してケーエーに電話。女性が応対し、(おそらく)マニュアルどおりに見積もりが始まりました。
家電や家具の寸法は細かく聞かれました。そのたびに慌ててメジャーを手に寸法を測りました。
結果、1 万 9 千円くらいとのことで、ケーエーに決めようと思いました。
(あまりの安さに「本当に大丈夫なんですか?」というアホな質問をしたことは秘密です。。。)
ちなみにエアコンの廃棄は 1 万円かかるとのことです。そういう人は {{< post "2015-12-14-1" >}} の青雲電機にお願いすると良いと思います。私の場合は税込みで ¥3,024 でした。
「いやー、安く済んで良かった良かった」とお茶を飲んでいたらインターホンが。
出てみると白髪頭の目付きの鋭いおじさま。さっきの某大手の営業とのこと・・・!
(来るなんて聞いてないぞ...)
とりま玄関のドアを少し開けながら話が始まりました。手が疲れました...。
もうケーエーに決めていたし、雑で強引な営業にも腹が立っていたので、特に話は進まず。
そのうちにやけになったのか 1 万円まで値下げになりました。(まだn...
もうわけが分からないので、お引き取り願いました。タダでも頼みたくありません。そういえば名前も聞いてない...。
あまりの酷さに震えました。
## 引越し当日
前もって不要品を処分していた {{< post "2015-12-14-1" >}} おかげで、梱包は正味一日で完了。準備万端です。
14:00 まで時間があったので、近所の[コッカ食堂](http://tabelog.com/tokyo/A1318/A131813/13150441/)に最後のランチに。
道中電話があり、もう来れそうとのこと。12:50 に来てくれと伝えて手早くランチを済ませました。
帰宅後すぐの 12:20 頃にケーエーの方々が到着。こちらとしては問題ないので搬出開始。30 分ほどで終了。早い!
ブレーカーを落とし、鍵を郵便受けに入れて、アパートを後にしました。
新居には 14:00 過ぎに到着。ケーエーの方々は既に来ていました。搬入は瞬く間に完了。もちろん壊れたものはありませんでした。
ケーエーの方々は終始笑顔でキビキビしており、好感を持てました。
非常に満足して、アンケートのハガキも絶対書くと伝えたところ、(その方の)名前を書いてもらえると非常に励みになるとのこと。もちろん書いて後日出しましたよ。
## 総評
最初にも書いたとおり、見積もり前に一度も電話連絡をしてこなかったのは、一番評価しています。電話は本当に嫌い。
無駄なサービスが一切ないことも良いです。訪問見積もりがない、ダンボールもオプションで料金がかかる、作業時間帯の指定でさえも料金がかかる等。
値段も安く、作業員の方も感じが良かったので、もう最強でしょう...。
¥2,000 のクーポンを 2 枚頂きましたが、会社の人にあげてしまいました。この熱い気持ちが伝わると良いな。
## P.S.
価格.comに書いた下のレビューを転載するくらいのつもりが、当時のメモも見ながら書いているうちに気分が乗ってきて、完全に書き下ろしになりましたw
http://kakaku.com/hikkoshi/vender.asp?venderid=00000000156&pageno=7#report14386
※ この URL はレビューが増えるとページが変わってしまいます。上記でアクセスできなければ、pageno=3 を pageno=4 とかに変えてみてください。
--------------------------------------------------------------------------------
title: "月一で家事代行サービス CaSy(カジー)を使うことにした"
date: "2015-12-27"
--------------------------------------------------------------------------------
以前から興味があった家事代行サービス CaSy(カジー)を昨日利用しました。
[家事代行サービスを東京でお探しなら1時間2,190円のCaSy](https://casy.co.jp/invite/HgmTP)
かなり満足したので、さっそく来月から 4 週に 1 回の定期予約をしました。鍵のお預けサービスも使うので、帰宅したら勝手にきれいになっている感じです。
## 料金
今回は初めてということもあり、約束の時間に立ち会ってすぐ近所のガストに退散。終わる少し前に帰宅しました。
そんな初回の内訳は以下のとおり。
* 時間: 2時間
* 料金: 5,020円
* 内訳: 2,500円/時間 × 2時間 + 交通費700円 + 消費税320円 - クーポン1,000円
定期予約はこのようにしました。
* 頻度: 4週間に1回
* 時間: 2時間
* 料金: 6,842円
* 内訳: 2,390円/時間 × 2時間 + 交通費700円 + 消費税382円 + 鍵預かり980円
以前、たしか住友不動産系の家事代行サービス使ったことありますが、その時は単発で 20,000 円くらいかかりました。それでもダスキンに比べたら相当安かったです。
:link: [家事代行業界最安値! 「CaSy」の実力は?|ホリプロ保育園DUAL出張所|日経DUAL](http://dual.nikkei.co.jp/article.aspx?id=4958)
> 胡桃沢さん:うちでは、若いエンジニアがオリジナルのデータベースを作っているんです。このデータベースを使って、お客様と家事スタッフとをマッチングさせることで、コストダウンを実現しています。
トノコト。応援していきます!
komagata さんのブログで知りました。クーポンも利用しました。ありがとうございます!
[家事の自動化はルンバよりCaSyが良い - komagataのブログ](http://docs.komagata.org/5292)
**追記(2015-12-31):**
> 住友不動産系の家事代行サービス
当時のツイートを発見。
{{< tweet user="masutaka" id="16057903493" >}}
## 匠の技
以下、匠の技になります。
余ったハンガーで、キッチンペーパーが使いやすくなりました。ドライヤーのコードもまとめられました。

調味料や箸は引き出しに収納されました。

キッチンクリップはペットボトルの底で作られた容器に収まりました。

引っ越ししてまだ1ヶ月しか経ってないのと、1K ということもあり、2 時間だと時間が余ってしまうようでした。とはいえ、2 時間がミニマムなので仕方がない。
## クーポンコード
こちらのクーポンコードを使って会員登録すると、あなたも私も 1,000 円引きになります。是非お願いします!
```
HgmTP
```
--------------------------------------------------------------------------------
title: "各記事の最後に『当日のツイート』へのリンクを追加した"
date: "2015-12-23"
--------------------------------------------------------------------------------
このブログを読んでいると、**その日マスタカがどんなツイートをしていたか気になりますよね?**
そういうわけで各記事の最後に『当日のツイート』へのリンクを追加しました。

## Twitter『高度な検索』の問題点
そもそも Twitter には高度な検索という機能があり、ユーザ名や日付などを指定して検索することが出来ます。
[高度な検索の使い方|Twitterヘルプセンター](https://support.twitter.com/articles/249059)
こちらがそのページです。
[Twitterの高度な検索](https://twitter.com/search-advanced)
しかし、ここでユーザ名と日付を指定しても、うまくその日のツイートを検索することが出来ませんでした。
```
# 何も検索されない
from:masutaka since:2015-12-23 until:2015-12-23
# 22 日と 23 日のツイートがよく分からない感じで混ざってしまう
from:masutaka since:2015-12-22 until:2015-12-23
```
## 日付を指定してツイートを検索する
調べていたところ、こちらの記事を見つけました。
[ツイッターの時間指定検索方法 - さまざまなめりっと](http://blog.livedoor.jp/manamerit/archives/65701143.html)
こちらの記事にあるように since と until 演算子には時間とタイムゾーンを指定することが出来ました。
これを利用すれば任意の日のツイートを絞り込むことが出来るようです。
```
# 2015-12-23 のマスタカのツイートを絞り込む
from:masutaka since:2015-12-23_00:00:00_JST until:2015-12-23_23:59:59_JST
```
ややクセのある仕様でした。
- タイムゾーンを指定しないと、UTC で検索される
- タイムゾーンを指定する場合、日付と時間の指定も必要
- 日付とタイムゾーンの組み合わせ(例: since:2015-12-23_JST)ではうまく検索されない
## 微調整
普通に検索すると、『トップ』に飛んでしまうため『ライブ』へのリンクになるように URL パラメータ "f=tweets" を付けています。

最終的なリンクはこちらになりました。
```
# 2015-12-23 当日のツイート
https://twitter.com/search?f=tweets&vertical=default&q=from%3Amasutaka%20since%3A2015-12-23_00%3A00%3A00_JST%20until%3A2015-12-23_23%3A59%3A59_JST&src=typd
```
## おまけ: 公式の検索ウィジェット
[ウィジェットの設定 - twitter.com](https://twitter.com/settings/widgets/new/search)
試してみましたが、全部の記事に表示されるのはウザかったので採用しませんでした。
--------------------------------------------------------------------------------
title: "iPhone から家電を操作できる IRKit が便利だった #rebuildfm"
date: "2015-12-19"
--------------------------------------------------------------------------------

[IRKit - Open Source WiFi Connected Infrared Remote Controller](http://getirkit.com/)
{{< twitter "miyagawa" >}} さんのタイムラインに何度も出ていたので、RubyKaigi {{< post "2015-12-13-1" >}} 中に衝動的に買ってしまいました。
しかし、[Episode 120](https://rebuild.fm/120/) を聞く前に買ったので、クーポンコードをスルーしてしまったという...。[Episode 30](https://rebuild.fm/30/) でも触れられたみたいですね。
設定は簡単で 10 分くらいで使えるようになりました。カーテンレールの上に設置しました。この位置だと反応が良いです。

LED が眩しすぎて気になる方は、こちらの記事をどうぞ。この位置だと、それほど気になりませんでした。
[エアコンと扇風機を完全自動でON/OFF 暑くて寝れない寝室とはおさらばだ!|Act as Professional](https://hiroki.jp/irkit-aircon-hack)
今のところ、まだ軽い使い方です。
- [公式 iOS アプリ IRKit シンプルリモコン](https://itunes.apple.com/app/apple-store/id778790928)を使用
- 照明はボタンを全部登録(全灯, 省エネ, 常夜灯, 消灯)
- エアコンは ON/OFF のみ
- テレビは ON/OFF, 音量UP/DOWN, NHK のみ

{{< tweet user="masutaka" id="675686500210634752" >}}
寝る時に照明のリモコンがなくて、布団から這い出す事態がなくなりました。起きたら、寝たまま照明とエアコンとテレビを付けています。この辺は連動させたい。
[公式サイト](http://getirkit.com/)を見ると、iOS SDK が公開されており、IRKit 自体にも HTTP サーバが立っているのでプログラマルな使い方ができるようです。
外からも操作できるので、夏は帰る前にエアコンを付けられます。絶対便利。
{{< amazon asin="B00H91KK26" title="IRKit - iPhone,iPadを使って外出先からエアコン等の家電を操作できる学習リモコン" >}}
--------------------------------------------------------------------------------
title: "引っ越しで買って良かったものランキング"
date: "2015-12-15"
--------------------------------------------------------------------------------
捨てるものあれば買うものもまたあり。ということで、前回 {{< post "2015-12-14-1" >}} の続きです。
今回の引っ越しで買って良かったものをランキング形式でお届けします。
立て続けに Amazon を使うことが確実だったので、遅ればせながらついにAmazon のプライム会員になりました。Amazon ばかり使って、他の EC サイトに申し訳ないです。
引っ越して宅配ボックスも手に入れたので、いろいろ最強です。
## 第9位:すのこ型除湿マット
これは失敗。[このサイト](http://kagu-note.com/drainboard-bed-4173)で知って購入しましたが、朝起きてマットの下を確認するとフローリングが濡れています。使う意味を感じられません。¥6,500 はもったいなかった。
Amazon のレビューも見ましたが、なぜか「すごく良いはず」という先入観を消せないまま買ってしまいました。
唯一良いことは「すのこ」と比べて場所を取らないことでしょうか...。
カビの生えづらさでは「すのこ」の方が優れていますが、フローリングを傷つけますし、場所をとるのですよね。
{{< amazon asin="B00LSG17Q6" title="帝人 すのこ ダブルインパクト 除湿 マット 100×205cm" >}}
## 第8位:カーテンのふさかけ
賃貸マンションなので、跡が残らないカーテンのふさかけを探していました。¥253 と安かった。
こういうの、引っ越し直後に近所で探すと意外に見つけられないのですよね。
{{< amazon asin="B003OCPUYC" title="3M コマンド フック カーテンふさかけ アイボリー 2個 CM19-CIN" >}}
## 第7位:突っ張り棒
洗濯機の上の空間を有効利用するために買いました。なかなか力強い作りです。¥847 はお買い得すぎました。
{{< amazon asin="B000J36AFC" title="トンボ 超強力伸縮ポール ホワイト (68~104cm 耐荷重60~30kg) P-104" >}}
## 第6位:Apple USB Super Drive
{{< post "2015-12-14-1" >}} で手放した[存在感のある外付けDVDドライブ](https://jmty.jp/tokyo/sale-pcp/article-16sjx)が場所を取りすぎるので、ついに購入しました。
他にもスリムなドライブはありましたが、考えるのが面倒になりつい...。
amazon.co.jp より apple.jp のほうが少しお得でした(前者¥10,850、後者¥10,260)。それにしてもお高い。
{{< amazon asin="B008AL9VXI" title="Apple USB Super Drive MD564ZM/A" >}}
## 第5位:マットレス
引っ越してしばらくマットレスなしの布団だけで寝ていたところ、体中が痛い!マッサージに行くハメになりました...。
購入してすぐに痛みが解消。厚みは 4cm ほどしかありませんが、全然違います。もしかして9位のすのこ型除湿マットとの相乗効果?お値段も¥3,072 とお手頃でした。
{{< amazon asin="B00NW91IMA" title="アイリスオーヤマ バランスマットレス シングル MTRB-S" >}}
## 第4位:羽根布団7点セット
布団を新調したかったので、全部入りでお値段も手頃で評判も良さそうなこちらに。適当な枕だと思ったら、なぜか私に合って毎日ぐっすりです。
掛け布団もこんなに薄くて大丈夫かな?と思いましたが、今のところ毛布なしで眠れています。当時のお値段は ¥9,800 でした。ただネイビーは色が濃すぎたかも。
{{< amazon asin="B00NHMEQ1M" title="新生活応援セット ホワイトダックダウン&フェザー 羽根掛布団 7点フルセット シングル ネイビー" >}}
## 第3位:チェスト
{{< post "2015-12-14-1" >}} で手放した[押入れチェスト](https://jmty.jp/tokyo/sale-fur/article-157ep)の後釜です。
今の部屋のクローゼットには入れられないので、外に出しても貧相でないデザインかつ、次の引っ越しで手放しても惜しくないお値段のものを購入しました(¥5,445)。
{{< amazon asin="B0162B4Z6U" title="【Amazon.co.jp限定】 アイリスオーヤマ チェスト 木天板 小引き付き5段 CN-527" >}}
## 第2位:IRKit
スマフォやタブレットから、リモコン付きの家電を操作できるアイテムです。¥7,700 なり。
前はルームシェアしていた関係で、自分の部屋にはエアコンのリモコンしかありませんでした。今はテレビと照明のリモコンもあるので、購入したところ大正解。
枕元には必ず iPhone があるので、寝ようとして照明のリモコンがなくてまた起きることがなくなりました。目覚ましが鳴ったら、照明とエアコンとテレビを全部連動して付けたいです。
カーテンレールの上に設置した様子。この位置だと眩しいと悪評の LED の光は気になりませんでした。

**追記(2015-12-29):**
{{< post "2015-12-19-1" >}} にもう少し詳しく書きました。
{{< amazon asin="B00H91KK26" title="IRKit - iPhone,iPadを使って外出先からエアコン等の家電を操作できる学習リモコン" >}}
## 第1位:ドライペット 除湿剤 ふとん快適シート
1位がまさかの除湿剤!
9位の「すのこ型除湿マット」で解決できなかった湿気をほぼ一掃できました。お値段もお手頃の ¥973 です。
4位の「羽根布団」と5位の「マットレス」の間に敷いて使っています。
毎日布団を片付けてフローリングの湿気を拭く手間がなくなりました。今は数日に一度布団を片付ける程度です。
Amazon のレビューでは小さいので2枚買ったほうが良いようなことが書いてありましたが、最初は1枚で十分だと思います。あとで買えばいいし。
{{< amazon asin="B00MTHTTKY" title="ドライペット 除湿剤 ふとん快適シート くりかえし再生タイプ 1シート入" >}}
--------------------------------------------------------------------------------
title: "引っ越しで捨てたものと譲ったもの"
date: "2015-12-14"
--------------------------------------------------------------------------------
{{< post "2015-11-30-1" >}} の記事でお気づきかもしれませんが(?)、先月 20 日に 3 年 4 ヶ月住んだ世田谷区から荒川区に引っ越しました。引っ越しはかれこれ 7 回目です。
この記事は引越し前後に捨てた粗大ごみと、[ジモティー](http://jmty.jp)で譲ったものリストです。誰得なんでしょうか?
## 粗大ゴミとして捨てたもの
- 灯油用ポリタンク x 2
- 扇風機
- ダイニングテーブル
- 二人掛けソファー
- 応接用一人掛け椅子
- PC 用椅子 x 2
- 丸椅子
- 掛け布団 x 2
- 敷き布団 x 3
- マットレス
- 自転車
- 照明器具 x 3
- エアコン
捨てたものがやたら多いのは、前職の[ラングリッチ](http://www.langrich.com/)のオフィスが明石にあった頃の家具が一部引き継がれたのと、{{< twitter "tomoyaton" >}} とルームシェアしていたからです。
ここに写っているテーブルや椅子です。
[生ハムの原木がある、ギークハウス神戸(明石)はじめました。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20110520/1305908668)
エアコンは壊れて暖房しか付かなくなったので、取り外しと引き取りを青雲電機にお願いしました。いいおっちゃんが来てくれました。
穴のパテ埋めも込みで ¥3,024(税込み) でした。めっちゃ安い!引っ越し屋とかに頼むと ¥10,000 くらいすると思います。
そんな青雲電機のサイトがこちら。
[だまされてはいけない!エアコン工事の取外し取付け代金](http://seiun-d.com/)
タイトルに会社名を入れるとか、もう少し怪しくないサイトにしたほうがよいのでは...?もったいない。
## 譲ったもの
- [三菱電機 22W型 ノングレア液晶 [無料]](https://jmty.jp/tokyo/sale-pcp/article-1564k)
- [押入れチェスト(74cm x 71cm x 59cm)](https://jmty.jp/tokyo/sale-fur/article-157ep)
- [スリッパラック](https://jmty.jp/tokyo/sale-fur/article-15e9a)
- [木製の丸椅子](https://jmty.jp/tokyo/sale-fur/article-15evs)
- [直方体のクッション(2個)](https://jmty.jp/tokyo/sale-fur/article-15f0c)
- [ふとん乾燥機(シングルサイズ)](https://jmty.jp/tokyo/sale-ele/article-15fm5)
- [ダブルサイズの布団用すのこ](https://jmty.jp/tokyo/sale-fur/article-15fqs)
- [照明器具(カサのみ、直径55cm)](https://jmty.jp/tokyo/sale-fur/article-15ftt)
- [照明器具(直径40cm)](https://jmty.jp/tokyo/sale-fur/article-15fug)
- [都市ガス用ガステーブル](https://jmty.jp/tokyo/sale-hom/article-15jm0)
- [高さのあるハンガーラック](https://jmty.jp/tokyo/sale-fur/article-16is1)
- [木製のスタンドミラー](https://jmty.jp/tokyo/sale-fur/article-16is9)
- [存在感のある外付けDVDドライブ](https://jmty.jp/tokyo/sale-pcp/article-16sjx)
- [見やすい掛け時計](https://jmty.jp/tokyo/sale-fur/article-16skk)
- [SHARP ふろ水ポンプセット(ホースの長さ4m) 210 396 0102](https://jmty.jp/tokyo/sale-ele/article-17d8d)
{{< post "2014-05-31-1" >}} でも書いたジモティが大活躍でした。早ければ 30 分くらいで決まります。
以下を心がけました。この辺は数をこなすと分かってくると思います。
- 0 円にすること
- 変な価格交渉をされて面倒
- 粗大ゴミ処理代が浮いたと思えば良い
- 今回価格をつけたのはガステーブルのみ
- たまにお礼のお菓子とか頂けます
- サイズをきっちり測ること
- できるだけピカピカにしてお渡しすること
- 郵送はしないと毎回はっきり書くこと
- 郵送をしたくないためにジモティーを使っている
- 完全に決まってから住所を教えること
--------------------------------------------------------------------------------
title: "RubyKaigi 2015 に行ってきた #rubykaigi"
date: "2015-12-13"
--------------------------------------------------------------------------------

http://rubykaigi.org/2015
12/11(金)から始まった RubyKaigi 2015 に 3 日間参加してきました。
1 日目は自宅を出た時は小雨で、東銀座駅に着いたら暴風雨、
会場に着いたら快晴と、汐留とはなんとハードな場所かと疲労困憊
汗ダラダラで始まりました。
以下、自分用のメモです。
## [Keynote](http://rubykaigi.org/2015/presentations/matz) by {{< twitter "yukihiro_matz" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
- Did-you-mean 機能
- 間違えたら提示してくれる機能
- Enumerable#grep_v
- Hash#dig は便利そう
- frozen-string-literal: true とコメントを書くと、文字列が freeze される
- &. Lonely operator
- && の圧縮だそう。なるほど今理解した。
- https://github.com/matz/streem の話
```
foo = nil
foo && foo.size
=> nil
foo = "aaa"
foo && foo.size
=> 3
# 上記を &. で書き換えると
foo = nil
foo&.size
=> nil
foo = "aaa"
foo&.size
=> 3
```
## [Compiling Ruby scripts](http://rubykaigi.org/2015/presentations/ko1) by {{< github_user "ko1" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
## [Saving people from typos](http://rubykaigi.org/2015/presentations/yuki24) by {{< twitter "yuki24" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
- did_you_mean gem の作者
- 最近 Ruby commiter になった
- Distance という概念
- necessary
{{< tweet user="masutaka" id="675184850916286466" >}}
## [Time flies like an arrow; Fruit flies like a banana: Parsers for Great Good](http://rubykaigi.org/2015/presentations/SoManyHs) by {{< twitter "SoManyHs" >}}
{{< speakerdeck "b15d8040d3a0452bb43a81e1d76988c6" >}}
## [Fast Metaprogramming with Truffle](http://rubykaigi.org/2015/presentations/nirvdrum) by {{< twitter "nirvdrum" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
- メタプロは遅いけど、JRuby+Truffle でメソッド呼び出しの時のキャッシュをうまく取れば大丈夫ってことかな?
- JRuby 使う予定ないから、こんな感想しか出てこない...
## [Introducing the Crystal Programming Language](http://rubykaigi.org/2015/presentations/leinweber) by {{< twitter "leinweber" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
ここから 2 日目 8×--------------
## [The history of testing framework in Ruby](http://rubykaigi.org/2015/presentations/kou) by {{< twitter "ktou" >}}
{{< rabbit_slideshow "https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2015/" "The history of testing framework in Ruby" >}}
- Ruby 本体に使われているテストフレームワークの歴史と、実際の使用例
- 何かを比較するときは、横より縦に並べたほうが比較しやすい。なるほど
## [Turbo Rails with Rust](http://rubykaigi.org/2015/presentations/wycats_chancancode) by {{< twitter "wycats" >}} and {{< twitter "chancancode" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
- 英語速すぎて分からず
- C 拡張を Rust 拡張に変えたら、速く簡潔なコードになった話だったのかな
- libcruby を使うことで、.trb に inline Rust も出来るみたい
## [Data Analytics Service Company and Its Ruby Usage](http://rubykaigi.org/2015/presentations/tagomoris) by {{< twitter "tagomoris" >}}
{{< slideshare "9o4tgQTdvUuc2s" >}}
Treasure Data を構成するワーカーのお話。OSS になっている。
- https://github.com/treasure-data/perfectsched
- https://github.com/treasure-data/perfectqueue
複雑な条件のテストをするために Ruby のメタプロが非常に役立っており、
当面は他の言語に乗り換えることはなさそうとのこと。
{{< tweet user="zdavatz" id="675541448142401537" >}}
## [EN The future of Ruby is in motion!](http://rubykaigi.org/2015/presentations/lrz) by {{< twitter "lrz" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
デモ良かった。
{{< tweet user="MintoAoyama" id="675552172222734336" >}}
## [Ruby meets Go](http://rubykaigi.org/2015/presentations/mmasaki) by {{< twitter "_mmasaki" >}}
{{< slideshare "irkWnGmQRFvzmw" >}}
- Ruby の拡張ライブラリを GO で書くテクニックを紹介
- cgo を使えば GO から C の関数を呼べる
- cgo は GO に標準で含まれているみたい。"$ go tool cgo ..." で使えた
- C と GO の相互変換
- コメントに C のコードを書く
- ffi gem や標準の fiddle を使って、Ruby から GO の関数を呼び出す
- cgo には C の世界と GO の世界があるので注意
- コピーが 2 回発生しないように、怪しいコードを書かないといけない
- GOSTRING_PTR を作ると便利
- Ruby の GC のタイミングで、GO 側も GC するテクニック
- GO 拡張を含んだ Gem を作るテクニック
## [Building CLI Apps for Everyone](http://rubykaigi.org/2015/presentations/hone02_zzak) by {{< twitter "hone02" >}} and {{< twitter "_zzak" >}}
{{< speakerdeck "d31b909283f04735a77eb660bb822bcf" >}}
- mruby-cli を作って、CLI ツールを高速化した話
- https://github.com/hone/mruby-cli
- クロスコンパイルするので、各 OS ごとにバイナリが出来る。GO っぽい
- C や GO、Rust よりも、mruby で拡張ライブラリを作れば複数言語を覚えずに済む?
- docker-compose 使ってクロスコンパイルしている。テストも
## [making robot with mruby](http://rubykaigi.org/2015/presentations/yurie) by {{< github_user "yurie" >}}
{{< slideshare "5W7MNBxKpGn2qu" >}}
- Raspberry Pi 上で mruby を動かして、倒立振子のロボットを付くた話
- ラズパイの面白い使い方。やってみるのも面白そう
## [Lightning Talks](http://rubykaigi.org/2015/presentations/lt)
### https://www.deppbot.com の人がトップバッター!
- そういえば前日に http://tachikoma.io/ の {{< twitter "sanemat" >}} さんと話した
- 「マスタカさんとは compare_linker について話したかったんですよ!」と言われてビビったw
### Rails の国際化
- Rails3 から h が必要なくなったので、t とか l も必要なくしてみたという話
- 大学 4 年生だそうで将来有望だ
### GO のテストを Ruby に移植した話。GO 好きには良いかも?
- https://rubygems.org/gems/rgot
ここから 3 日目 8×--------------
## [Ruby Committers vs the World](http://rubykaigi.org/2015/presentations/committers) by Ruby committers
RubyGems は CRuby と RubyGems で別々に commit を重ねているのか。
知らなかった。今まではマージが 1 年に 1 回で辛かったけど、頑張って
今は 1 ヶ月に 1 回マージしているそう。
## [It's dangerous to GC alone. Take this!](http://rubykaigi.org/2015/presentations/youngrw_CraigLehmann) by {{< github_user "youngrw" >}} and {{< twitter "CraigLehmann" >}}
{{< slideshare "PjmRK5VF1QDPr" >}}
これが IBM が MRI の高速化に協力する一つの形なのかな?
OMR はさまざまな言語で動作するランタイムライブラリ。
OMR の malloc に置き換えれば、GC を並列実行して高速化するとのこと。
簡単に置き換えられるものなのかな?
docker pull して試せるらしい。
https://github.com/rubyomr-preview/rubyomr-preview
## [Refinements - the Worst Feature You Ever Loved](http://rubykaigi.org/2015/presentations/nusco) by {{< github_user "nusco" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
- Global is OK
- しかしセキュリティやパフォーマンスリスクがある
- 突然の lexical scope
- 全部は解決しないが、セキュリティやパフォーマンスの問題は解決できる
- http://togetter.com/li/912136
## [Discussion on Thread between version 1.8.6 and 2.2.3](http://rubykaigi.org/2015/presentations/emorima) by {{< github_user "emorima" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
異常時には Thread#status が取れない事象が発生
{{< tweet user="kokuyouwind" id="675908984633561088" >}}
全部プロセスにしてはダメなんだろうかと、素人的な疑問を持った。
## [Plugin-based software design with Ruby and RubyGems](http://rubykaigi.org/2015/presentations/frsyuki) by {{< twitter "frsyuki" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
## [Let's make a functional language!](http://rubykaigi.org/2015/presentations/yhara) by {{< twitter "yhara" >}}
{{< speakerdeck "6f304d56b9604efb931d5f5e0b0c1a2f" >}}
- JavaScript のような OreScript を作った
- racc gem で比較的簡単に木構造にできる
- 木構造を使うのは言語処理系では比較的ポピュラー
- 型チェックするために型を書きたくない
- OreScript は型チェックをするために型推論をする
- 型推論で矛盾が出たら型チェックを通っていないということらしい
- https://github.com/yhara/rk2015orescript
## [Beyond Saas: Building for Enterprise](http://rubykaigi.org/2015/presentations/joshk) by {{< github_user "joshk" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
## [Keynote](http://rubykaigi.org/2015/presentations/evanphx) by {{< twitter "evanphx" >}}
※ TODO: 資料やビデオが公開されたらここに貼る
## 終わりに
最後は体力の限界に近づいてきたので、Hall B に退散しました。
座れる休憩スペースがあれば助かりましたが、なかなか難しいですよね。
RubyKaigi は 2011 年 {{< post "2011-07-21-1" >}} 以来ですが、やはり 3 日間は参
加するだけでもハードです...。
運営の方、ありがとうございました!
--------------------------------------------------------------------------------
title: "『良い不動産屋を見つけるメソッド』で良い物件に引っ越せた"
date: "2015-11-30"
--------------------------------------------------------------------------------
[効率的な賃貸物件の探し方|nanapi [ナナピ]](https://nanapi.jp/286/)
└[良い物件ではなく良い不動産屋を探した - $shibayu36->blog;](http://blog.shibayu36.org/entry/2014/07/17/082617)
今まで足掛け 4 年ほどルームシェアしてましたが、ちょうど引っ越しのタイミングが合ったのでこちらを実践してみました。結果として大正解。賃貸は 7 軒目ですけど、一番当たりでした。
nanapi の記事に沿うような形で書いていきます。
## STEP1:WEB で家賃の相場を知る
私は [HOME'S](http://www.homes.co.jp/) とかでダラダラ探しました。探し始めるまでがハードルが高くて、だいぶ時間がかかってしまいました。
## STEP2:自分の希望条件をまとめる
これは問題なし。なぜなら過去に書いた引っ越しの希望条件が、Dropbox に保存してあるから。← A 型奴ー
少々バージョンアップするだけで済みました。ちなみにこんなのです。改めて見ると、必須はほぼ叶えられてますね。(でもこのくらいの必須は普通だよな...。)
### 必須
- 家賃 X 万円まで
- 7 畳以上
- 居間・キッチン別
- 風呂・トイレ別
- 2 口ガスコンロ
- 室内洗濯機置き場
- 駅まで 5 分以内
- コンビニやスーパーが近い
- まわりが静か
- 布団が干せる
- 家賃は銀行振り込み
- インターネットが快適
- 収納が狭くない
### あったらうれしい
- 2 階以上
- 保証人不要
- 宅配ボックス
- 雨戸
- 居間にガスコンセントまたは床暖房
- ガスファンヒーター(都市ガス、12or13A)
- ベランダ
- エアコン
- 浴室乾燥機
- 独立洗面台
- インターホン
- 風呂の追い炊き機能がある
- ゴミをいつでも(もしくは前日の夜に)出せる
- 大家が近くに住んでいない
- 服をある程度掛けられるクローゼット
### 注意すべき点
- 内見の日はメジャーを持っていく
- au の電波が入るか
- 壁や床の厚さ(隣の TV の音が聞こえない程度の厚さ)
- 風呂のシャワーの位置
## STEP3:不動産屋を選ぶ
私の場合は [HOME'S の不動産屋検索](http://www.homes.co.jp/realtor/)で探して、20 社に連絡しました。
この「連絡」が少々厄介で、メールアドレスを公開しているところが 2社しかなく、残りは問い合わせフォームのみ。このフォームも使いづらいものが多く疲れました。どうやっても Validation に引っかかり、送信できないところが 1 つありました。
電話番号しか公開していない不動産屋はこの時点で対象外。
メールで送った内容はこんな感じです。「必須」や「あればうれしい」は少々抑えました。
```
○○ 様
増田と申します。
以下の条件で物件を探しています。
条件に合う物件がございましたら、メールの添付ファイルにてデータを送ってください。
もし御社から良い情報を頂けましたら、その後伺わせて頂きたいと考えております。
◆最寄り駅
会社がBBB駅にあるので、近くて通いやすい場所を探しています。
BBBから 2 駅くらいが希望です。例えばCCC線のDDD。
EEE線は駅から遠そうなので、考えていません。
1. DDD
2. FFF
3. GGG
4. HHH
◆必須
- 家賃 X 万円まで
- 7 畳以上
- 風呂・トイレ別
- 2 口ガスコンロ
- 室内洗濯機置き場
- 駅まで 5 分以内
- コンビニやスーパーが近い
- まわりが静か
◆あればうれしい
- 2 階以上
- 保証人不要
- 宅配ボックス
- 雨戸
- 居間にガスコンセント
- ベランダ
- エアコン
- 浴室乾燥機
- 独立洗面台
```
次の日にほぼ全てから返信がありましたが、電話番号は書かなかったので心の平穏を保つことが出来ました。もし書いてしまったら、{{< post "2012-07-03-1" >}} のような事態になると思われます。
ここで「まずは一度来てください」しか書いてなかったり、必須に合わない物件や謎物件を勧めてくる不動産屋は対象外に。
1 社だけ {{< twitter "shiba_yu36" >}} さんの記事にあった、『リストの一軒一軒に、なぜこれをおすすめしたのかというポイントが書いてある』担当の方がいらっしゃいました。
そこで、本当にきちんと会話のキャッチボールが出来る方か確かめるために(失礼だけど必要)、いくつか質問メールをして問題ないことを確認し、翌々日に店舗に行くことに決めました。この間 2 日。
他も 2〜3 社に返信していましたが、気乗りしなくなったので、なんとなくフェードアウト。
店舗に行く前日に、ほかの不動産屋から来た物件を全部見て、気になった物件をネット上の URL とともに送っておきました。
## STEP4:良い物件を見つける
当日は内見をする可能性が高いので、メジャーとボールペンを持って行きました。
あとは冷蔵庫やチェストなど大きな家電や家具のサイズを測っておくと、内見のタイミングで判断の助けになるので、そうしました。
いざ、担当の方と話してみると、紹介された物件がすでに決まってしまったり、さらによい物件もなかったりして、なぜか私も持参した MacBook Air で物件を調べていました(別な不動産屋も行かないとダメかな?と思ったりもした)。
この時点ではすごく良い物件が 1 つ、良い物件が 2〜3、うーんという物件がいくつか。
最終的に 5 つの物件に絞り、担当の方と内見に行きました。今まで 6 つの賃貸に住んできたので物件は見ればそれなりに分かりますが、一般常識(洗濯機のサイズは規格で決まっているだとか)や、周辺環境の話(人気のある土地なので、物件のショボさのわりに家賃が高いとか)を聞けたのは良かったです。
## STEP5:良い物件が見つかったら
最終的に「すごく良い物件」がやはりすごく良かったので、その場で決めました。
この物件が他の不動産屋が送ってきたものだったことに、担当の方から言われて気づきました。でも、今回は良い不動産屋を探すことを主眼においていたので、それで良いです。
申込金(後に仲介手数料になる)を払った後、価格交渉をお願いしました。礼金を下げたり、家賃発生日を出来るだけ後にできないか、鍵交換はなしに出来ないか等。
結果的に家賃発生日を半月ほど延ばすに留まりました。礼金は論外として、鍵交換は今も納得出来ない...。
鍵交換の現実はこのようです。
{{< tweet user="masutaka" id="654316473842692096" >}}
ガイドラインはこちら。
{{< tweet user="masutaka" id="654316027245817856" >}}
他、消毒費用はオプションだったので、付けませんでした。
保証会社の審査にも通ったので、あとは契約→入金の流れかと思いきや、先に初期費用全額払って欲しいとのこと。この時点で契約書はなにもなし。保証会社からの電話での説明のみ。
ググってみると業界の慣習とのこと。とは言え、さすがに不安と不信感を覚えたので、クレームメールを出しました。お詫びメールを確認後、入金。
面倒な客でしょうけど、こちらとしても筋は通しておきたかった。
保証会社では、担当の方が丁寧かつ親切に説明してくれ、納得して契約の印鑑を押すことが出来ました。
## 1週間ちょっと住んでみて
静かだし、部屋はきれいでそこそこ広いし、マンション入り口にはオートロックや宅配ボックスがあるし、周りにコンビニやスーパーもあるし、駅まで徒歩 4 分だし、会社にも近いし、非常に満足しています。
## 感想
今回は条件に合う物件が少なかったのか、運要素が高かったと思います。私の条件が厳しいのかなあ?
次回もうまくいくか分かりませんが、勘で不動産屋に飛び込むのは怖くてもう出来ないので、次回もこうすると思います。
--------------------------------------------------------------------------------
title: "OpenID Summit Tokyo 2015 に行ってきた #openid_tokyo"
date: "2015-11-13"
--------------------------------------------------------------------------------

[OpenID Summit Tokyo 2015](http://www.openid.or.jp/summit/2015/)
一応、ID 業界の片隅に生息しているので行ってきました。会社から歩い
て 10 分くらいだったし。
最新の動向をキャッチアップ出来て有意義なイベントでした。気になるセッ
ションだけ聞こうと思ってましたが、結局ほぼ最後まで聞いてました。
同時通訳は助かりました。運営の皆さん、ありがとうございました。
※ メモが少ないセッションは、疲れていたか、メモを取るリズムが掴め
なかったからです。
## アイデンティティ・オーバービュー
崎村 夏彦 — OpenID Foundation 理事長
楠 正憲 — OpenIDファウンデーション・ジャパン 代表理事
※ TODO: 資料が公開されたらここに貼る
前回は 2011 年とのこと。毎年やっているのかと思いました。
## IoT時代の認証技術
[増井俊之 — 慶應義塾大学 環境情報学部 教授](http://www.openid.or.jp/summit/2015/speakers.html#speaker_masui)
{{< slideshare "KbWq0ygTUDL4ZB" >}}
資料置き場: http://gyump.com/OpenID/
初めて増井さんのセッションを聞いたかも。さすがの増井節。私が増井さ
んを認識したのはもちろん [dmacro.el](http://www.pitecan.com/papers/JSSSTDmacro/dmacro.el) や [keisen.el](http://www.pitecan.com/Keisen/keisen.el) が最初。keisen.el
は今もたまに使います。てか、Emacs-24.5 でも動くのはすごい!
- 個人の秘密情報は認証に使えるはず
- Suica履歴、ログイン履歴、etc
- トイレに何回行ったかとかw
## Clouds + ID ~ クラウドビジネスにおけるIDの現在と今後 ~
[藤井 彰人 — KDDI株式会社 ソリューション事業企画本部クラウドサービス企画部 部長](http://www.openid.or.jp/summit/2015/speakers.html#speaker_fujii)
※ TODO: 資料が公開されたらここに貼る
Sun -> Google -> KDDI
## ランチタイム
会社に戻ろうとしましたが、意外に時間がなかったのでやっぱり止めて、
[タリーズコーヒー](http://tabelog.com/tokyo/A1309/A130905/13180593/)で済ませました。で、道に迷いました。
## [1b] OpenID Foundation Overview
[Don Thibeau — OpenID Foundation / Open Identity Exchange (OIX)](http://www.openid.or.jp/summit/2015/speakers.html#speaker_don-thibeau)
※ TODO: 資料が公開されたらここに貼る
## [2b] OpenID Connect
[John Bradley — Ping Identity / OpenID Foundation](http://www.openid.or.jp/summit/2015/speakers.html#speaker_john-bradley)
※ TODO: 資料が公開されたらここに貼る
OpenID 2.0 から OpenID Connect に移っている
OAuth 2.0 Form
## [3b] Certification
[Michael B. Jones — Microsoft / OpenID Foundation](http://www.openid.or.jp/summit/2015/speakers.html#speaker_michael-b-jones)
※ TODO: 資料が公開されたらここに貼る
- 5つのプロファイルがある
- 第三者機関ではなく、自分自身でテストし認定することが出来る
- テスト結果を OpenID Foundation に送り、認定されれば取得できる
- 全てのログを取り、結果とともに公開することになる
- どのプロファイルを使うかを自分で決める
- どのプロファイルに照らして、Certification を取得したか分かる
- http://openid.net/certification/
- テストサイト
- https://op.certification.openid.net:60000/
- エンドポイントを入力すると、半自動でテスト出来るらしい
## [4b] Providing Transparency and Enabling Interoperability Through Registration: New Opportunities in Online Identity
[Don Thibeau — OpenID Foundation / Open Identity Exchange (OIX)](http://www.openid.or.jp/summit/2015/speakers.html#speaker_don-thibeau)
※ TODO: 資料が公開されたらここに貼る
## [5b] RISC and IGov
[John Bradley — Ping Identity / OpenID Foundation](http://www.openid.or.jp/summit/2015/speakers.html#speaker_john-bradley)
※ TODO: 資料が公開されたらここに貼る
- セキュリティの話
- iGov
## [6b] Securing Sign-in on Mobile: Best Practices for Native Apps
[William Denniss — Google](http://www.openid.or.jp/summit/2015/speakers.html#williamdenniss)
※ TODO: 資料が公開されたらここに貼る
- Google の人
- WebView vs In-app Browser tabs の比較
- WebView
- セキュリティが欠落している
- Third Party の SDK に問題があることも(例: マクドナルド)
- SSO(Single Sign-on)を実現できていない
- OAuth 2.0 for Native Apps - Best Pracice
- https:// (← TODO: 資料が公開されたら埋める)
- 使ってみようかな
## [7b] FIDO 2.0
[Anthony Nadalin — Microsoft](http://www.openid.or.jp/summit/2015/speakers.html#speaker_tony)
※ TODO: 資料が公開されたらここに貼る
- ミッション
- オンラインでの認証方法を変革する
- パスワードをなくす
- 仕様のみ策定、実装は各企業
- 2 つの仕様を提供
- UAF: Universal Authentication Framework
- FIDO 対応のデバイスを用いてパスワードを使わずに行う認証
- U2F: Universal Second Factor
- 現在の 2 段階認証の技術を進化させた認証
- プラットフォーム(Web, OS)に組み込まれることを望んでいる
- 今は Win95/MacOS の頃の TCP/IP に似ている(当時は OS に含まれていなかった)
- W3C も関心を持っているそう
- FIDO 2.0 は標準化作業中
- UAF, U2F も使えるように考慮している
## [8b] OAuth.next
[John Bradley — Ping Identity / OpenID Foundation](http://www.openid.or.jp/summit/2015/speakers.html#speaker_john-bradley)
※ TODO: 資料が公開されたらここに貼る
- OAuth Proof-of-Possession(PoP) Specs
- Bearer の代わりに PoP token を使う
- OAuth Token Exchange
- General token exchange capability for OAuth
- 例えばホテルでパスポートを見せる → パスポートが Token
- OpenID Connect Logout
- 空いた時間で JWT や JWS、JWK の説明とか
## [9b] OAuth 2.0 - Web Messaging Response Mode
[山口 徹 — 株式会社ディー・エヌ・エー](http://www.openid.or.jp/summit/2015/speakers.html#speaker_yamaguti-toru)
{{< slideshare "CfffLbekAIEnrM" >}}
- 新しいドラフトというか、DeNA のオレオレ仕様?でもおもしろいと思った
- SPA(Sinble Page Application) に向いたフロー
- response_type=code の代わりに response_type=form_post を指定
- OAuth の redirect の代わりに Form Post を使う
- Hybrid Flow もある
- response_type に複数の値をスペース区切りで
## そういえば
私、ずいぶん昔に http://openid.ne.jp/ で OpenID を取得したのですよね。
でもこれ、OpenID Foundation( http://openid.net/ )とは関係があり
ませんでした。
2006 年に株式会社アセントネットワークスが http://www.openid.ne.jp/
で OpenID 発行サービスを始めたようですが、今は引っ越し業者比較サイ
トになっています。。

以下 http://www.asp-navi.jp/asp_service/594/index.html より引用
> 最近話題になっている「openID]の発行・認証システムの構築をいたします。
> openIDについては2006年より「openID.ne.jp」という、
> openID発行サイトを開設しております。
>
> 運営会社: 株式会社アセントネットワークス
> サービス名: openID.ne.jp(オープンアイディー ドット エヌイー ドット ジェーピー)
> サービスURL: http://www.openid.ne.jp/
OpenIDファウンデーション・ジャパン( http://www.openid.or.jp/ )が
出来たのは、その後の 2008 年のようです。
--------------------------------------------------------------------------------
title: "コマンドラインで URL encode するやつ"
date: "2015-10-21"
--------------------------------------------------------------------------------
{{< post "2015-07-28-2" >}} のコマンドライン版。
```
function urlencode() {
echo $(php -r "echo rawurlencode('$1');")
}
function urldecode() {
echo $(php -r "echo rawurldecode('$1');")
}
urlencode "http://masutaka.net/"
=> http%3A%2F%2Fmasutaka.net%2F
urldecode "http%3A%2F%2Fmasutaka.net%2F"
=> http://masutaka.net/
```
PHP 便利!
--------------------------------------------------------------------------------
title: "継続的 bundle update サービス deppbot を使ってみた"
date: "2015-10-04"
--------------------------------------------------------------------------------
昨日話題になっていた https://www.deppbot.com と、
拙作のツール ci-build-trigger {{< post "2015-07-28-1" >}} を比較してみました。
タイミングよく、Gem のアップデートがあってよかったです。
## 私のツールが作った Pull request
https://github.com/masutaka/masutaka-metrics/pull/19

## deppbot が作った Pull request
https://github.com/masutaka/masutaka-metrics/pull/20

## 良くなったこと
- アップデートされた Gem の情報が Pull request の description にまとまってすっきりした
- compare_linker では取得できないことがあった、リポジトリや Diff へのリンクが完璧に取得できている
- CHANGELOG へのリンクもある
## 悪くなったこと
- 機能面では特にない
- デフォルトで Private リポジトリにアクセスされるのが少し心配
## 仕様など
▼必要な GitHub のパーミッション
- Access user email addresses (read-only)
- Access private repositories
[FAQ のページ](https://www.deppbot.com/faq)で
However, we will **ONLY** access a repository after you Subscribe it on your Dashboard.
と強調しているので、大丈夫じゃないかなあ。
http://tachikoma.io/ と違って、当該リポジトリに直接ブランチを作っ
て Pull request を出します。フォークされません。
彼らのサーバに git clone されるが、bundle lock --update したら
the repository **WILL BE DELETED IMMEDIATELY** from our server.
とのこと。
当たり前だけど、セキュリティはだいぶ意識しているみたい。
▼ドキュメント
https://www.deppbot.com/docs
- Base Branch は変えられる
- アップデートの頻度は 1day, 3days, 5days, 1week, 2weeks から選べる
- Bitbucket 上の Gem もアップデートできるらしい
▼FAQ
https://www.deppbot.com/faq
- サポートしているのは bundle update のみ
▼料金体系
https://www.deppbot.com/pricing
- Public リポジトリは無料
- Private リポジトリは $5/month から
- 14 日間の試用期間あり
## 今後の予定
個人の Public リポジトリは移行していきます。
Private リポジトリは考え中。
## おまけ
{{< tweet user="masutaka" id="650323534359564289" >}}
--------------------------------------------------------------------------------
title: "結局 package.el に戻ってきた"
date: "2015-10-03"
--------------------------------------------------------------------------------
{{< post "2014-11-03-1" >}} に package.el から Cask に乗り換え、
{{< post "2015-06-17-1" >}} に Cask から El-Get に乗り換えましたが、
結局 package.el に戻ってきました。
理由は M-x el-get-update(-all) の更新がうまくいかず、エラーにな
り、~/.emacs.d/el-get や ~/.emacs.d/elpa を全削除して入れなおすこ
とがよくあったからです。最近は面倒になりアップデートもしなくなりま
した...。
package.el でインストールするパッケージも init.el に書いてしまえば、
何をインストールしたか分かります。なにより Emacs デフォルトの機能
なので安心感があります(私はライトなデフォルト厨)。
バージョンロック出来ない問題は、アップデート前に ~/.emacs.d/elpa
をバックアップすれば良いでしょう...。Time Machine もありますし...。
変更前と後の init.el はこちら。
◆変更前
```elisp
;; See http://d.hatena.ne.jp/tarao/20150221/1424518030
(add-to-list 'load-path (locate-user-emacs-file "el-get/el-get"))
(unless (require 'el-get nil 'noerror)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.githubusercontent.com/dimitri/el-get/master/el-get-install.el")
(goto-char (point-max))
(eval-print-last-sexp)))
;; lock the pacakge versions
(el-get-bundle tarao/el-get-lock)
(el-get-lock)
(el-get-bundle ajtulloch/mkdown.el :name mkdown)
(el-get-bundle ataka/blgrep)
(el-get-bundle ataka/clmemo)
(el-get-bundle auto-complete)
(el-get-bundle coffee-mode)
(el-get-bundle dockerfile-mode)
(el-get-bundle elpa:eldoc-extension)
(el-get-bundle elpa:git-dwim)
(el-get-bundle elpa:hl-line+)
(el-get-bundle elpa:sequential-command)
(el-get-bundle elscreen)
(el-get-bundle flycheck/flycheck :depends (dash pkg-info let-alist cl-lib))
(el-get-bundle go-autocomplete)
(el-get-bundle go-eldoc)
(el-get-bundle go-mode)
(el-get-bundle haml-mode)
(el-get-bundle helm)
(el-get-bundle helm-descbinds)
(el-get-bundle helm-ghq)
(el-get-bundle helm-migemo)
(el-get-bundle highlight-symbol)
(el-get-bundle keyfreq)
(el-get-bundle markdown-mode)
(el-get-bundle masutaka/egg :branch "freeze-time")
(el-get-bundle masutaka/emacs-helm-bundle-show :name helm-bundle-show)
(el-get-bundle masutaka/emacs-helm-hatena-bookmark :name helm-hatena-bookmark)
(el-get-bundle migemo)
(el-get-bundle mori-dev/scratch-log)
(el-get-bundle navi2ch)
(el-get-bundle nginx-mode)
(el-get-bundle open-junk-file)
(el-get-bundle org-tree-slide)
(el-get-bundle osener/github-browse-file)
(el-get-bundle php-mode)
(el-get-bundle quickrun)
(el-get-bundle rspec-mode)
(el-get-bundle savekill)
(el-get-bundle terraform-mode)
(el-get-bundle web-mode)
(el-get-bundle wgrep)
(el-get-bundle yaml-mode)
```
◆変更後
```elisp
(require 'package)
;; Emacs JP を始めとして、package-archives の後ろに追加する例が多いので従った。
;; http://emacs-jp.github.io/packages/package-management/package-el.html
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
;; init.el で package-install() せず、M-x package-list-packages から
;; インストールする場合、これらは不要。package-install() が良しなに
;; 初期化してくれるため。
(package-initialize)
(package-refresh-contents)
;; すでにインストール済みかを package-installed-p() でチェックする
;; 必要はない。package-install() から呼ばれる
;; package-compute-transaction() でチェックしているため。
(package-install 'mkdown)
(package-install 'coffee-mode)
(package-install 'blgrep)
(package-install 'clmemo)
(package-install 'auto-complete)
(package-install 'coffee-mode)
(package-install 'dockerfile-mode)
(package-install 'eldoc-extension)
(package-install 'git-dwim)
(package-install 'hl-line+)
(package-install 'sequential-command)
(package-install 'elscreen)
(package-install 'flycheck)
(package-install 'go-autocomplete)
(package-install 'go-eldoc)
(package-install 'go-mode)
(package-install 'haml-mode)
(package-install 'helm)
(package-install 'helm-descbinds)
(package-install 'helm-ghq)
(package-install 'helm-migemo)
(package-install 'highlight-symbol)
(package-install 'keyfreq)
(package-install 'markdown-mode)
(package-install 'egg)
(package-install 'helm-bundle-show)
(package-install 'helm-hatena-bookmark)
(package-install 'migemo)
(package-install 'scratch-log)
(package-install 'navi2ch)
(package-install 'nginx-mode)
(package-install 'open-junk-file)
(package-install 'org-tree-slide)
(package-install 'github-browse-file)
(package-install 'php-mode)
(package-install 'quickrun)
(package-install 'rspec-mode)
(package-install 'savekill)
(package-install 'terraform-mode)
(package-install 'web-mode)
(package-install 'wgrep)
(package-install 'yaml-mode)
```
ほとんど同じものが入りますが、egg だけソースが変わっています。
新しいバージョンの egg が気に入らなかったので、
https://github.com/masutaka/egg/tree/freeze-time を使っていました
が、これだけ git submodule 使うのも気持ち悪いので、諦めて [MELPA
の egg](https://melpa.org/#/egg) を使うことにしました。
私の init.el です。都度更新されます。[ホーム](http://masutaka.net/)からも辿れます。
https://gist.github.com/masutaka/8177244
--------------------------------------------------------------------------------
title: "iPhone 6s 64GB を購入して、au のプランも変更した"
date: "2015-09-29"
--------------------------------------------------------------------------------
{{< post "2013-10-14-1" >}} に {{< wikipedia word="IPhone_5s" text="iPhone 5s" >}} 64GB を購入してもうすぐ 2 年。少しフライングですが、{{< wikipedia word="IPhone_6s" text="iPhone 6s" >}} 64GB を購入しました。
## 使用感
指紋認証がとにかく速く正確です。ミスするのが難しいほど。センサーの向上でしょうか?それとも CPU が A7 から A9 に上がったから?
目玉の 3D Touch はデフォルトのアプリのいくつかと、Twitter アプリで使えました。Live Photos も面白いですね。
画面も大きくなりました。このサイズまでなら大丈夫そうです。
細かいところでは、パスコードが 4 文字から 6 文字に増えてました。ハードと関係があるんだ...?
ケースは付けずに Sinji Pouch Basic 2 に下記の 2 枚を入れて使ってます。
- Pasmo(定期)
- エラー防止シート
{{< amazon asin="B00H448B56" title="ステッカーブルポケット Sinji Pouch Basic 2(シンジポーチベーシック2)(ベージュ) エラー防止シート付き" >}}
See also [iPhoneにカードを入れるポケットが増える「Sinji Pouch Basic 2」を購入|Act as Professional](https://hiroki.jp/sinji-pouch-basic2)
## プランを変更
「LTE プラン(¥1,008) + LTE フラット(7GB)(¥6,156) = ¥7,164」を「電話カケ放題プランS(¥1,836) + データ定額5(5GB)(¥5,400) = ¥7,236」に変更しました。
前者は通話料 40円/分で、後者は 1 回の通話が 5 分以内なら無料、超えると 40円/分です。
微妙に高くなったように見えますが、通話は少なくなったとは言え、月 10 分前後はしているのでやや得です。5 分以内であれば無料なので、心理的負担も減るかなと。
データ通信量は 7GB から 5GB に減ってますが、3GB 前後しか使わないので問題なしです。データ定額5契約後 1 年間は 6GB ですし、途中でプランを変えることも出来ますからね。
## 月々の料金
このようになりそうです。なんとか許容範囲かな?
| | |
|---|---:|---
|電話カケ放題プランS|+¥1,836|1 回の通話が 5 分以内なら無料
|データ定額5(5GB)|+¥5,400|最初の 1 年は 6GB まで使える
|LTE NET|+¥324|
|テザリング|+¥540|前回契約時から 2 年経ち、無料期間が終了した
|iPhone6s本体|+¥2,695|iPhone6s 本体の値段(※1)を 24 ヶ月で割った
|au スマートバリュー|-¥934|
|毎月割|-¥2,435|
|**合計**|**¥7,426**|
※1 本体¥97,080 - iPhone5s下取り¥21,600 - 割引クーポン¥10,800 = ¥64,680
See also [料金シミュレーター|iPhone 6s / iPhone 6s Plus|iPhone|au](http://www.au.kddi.com/iphone/ryokin/charges-simulator/)
--------------------------------------------------------------------------------
title: "Swift 2.0 で自分のクラス名を表示する方法"
date: "2015-09-26"
--------------------------------------------------------------------------------
[The Swift Programming Language (Swift 2.1): A Swift Tour](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1) やってる
```
"hoge".dynamicType
=> String.Type
String("hoge".dynamicType)
=> "String"
1.dynamicType
=> Int.Type
String(1.dynamicType)
=> "Int"
class Hoge {
}
var hoge = Hoge()
hoge.dynamicType
=> Hoge.type
String(hoge.dynamicType)
=> "Hoge"
```
参考になったけど、Swift 2.0 では結構使えなくなっていた
[Swiftで自分のクラス名を表示する方法 - Qiita](http://qiita.com/satomikko94/items/3623f8d56e17513579d6)
--------------------------------------------------------------------------------
title: "『るろうに剣心』の映画版が案外良かった"
date: "2015-09-23"
--------------------------------------------------------------------------------
今さらですが、3本全部見ました。シナリオはアレですが、配役や全体の
雰囲気が良かったです。
緋村剣心 - 佐藤健
相楽左之助 - 青木崇高
四乃森蒼紫 - 伊勢谷友介
謎の男 - 福山雅治
斎藤一 - 江口洋介
志々雄真実 - 藤原竜也
龍馬伝と随分似てるなあと思ったら、監督が同じ大友啓史さん。ある意味
確信犯だったのですね。
佐藤さんは龍馬伝での人斬り以蔵からの転身(?)。個人的には江口さんが
ツボで、福山さんは意外性があって◯でした。
アクションも昔の映画に比べて、素晴らしく良かった。
{{< amazon asin="B009SGAKLQ" title="るろうに剣心" >}}
{{< amazon asin="B00O52G2IS" title="るろうに剣心 京都大火編" >}}
{{< amazon asin="B00PPY61JU" title="るろうに剣心 伝説の最期編" >}}
--------------------------------------------------------------------------------
title: "「この記事に言及しているこのブログ内の記事」一覧を表示するようにしました"
date: "2015-09-23"
--------------------------------------------------------------------------------
こちらのパクリです。
[「この記事に言及しているこのブログ内の記事」一覧を表示するようにしました - たつをの ChangeLog](http://chalow.net/2009-04-12-1.html)
修正前

修正後

ずっとやろうとしていて、今日やっとやる気になりました。パールツライデス
chalow スクリプトがまた秘伝のタレ化してしまった...。
--------------------------------------------------------------------------------
title: "『現役プロダクトマネージャーが語る、日本企業におけるプロダクトマネージャーの課題と今後の展望 ~プロダクトオーナーシップ勉強会~』に参加した #postudy"
date: "2015-09-06"
--------------------------------------------------------------------------------
[[ITビジネスセミナー] 現役プロダクトマネージャーが語る、日本企業におけるプロダクトマネージャーの課題と今後の展望 - POStudy ~プロダクトオーナーシップ勉強会~](https://postudy.doorkeeper.jp/events/30325)
最近よく話題になる、プロダクトマネージャーについて集中して学習する
良い機会と思い、行って来ました。
関さん始め、運営された皆さん、ありがとうございました。期待通りの勉
強会でした。
以下、気になった点の箇条書きです。普段あまり行かない類の勉強会なの
で、量多めです。
## 1. 【基調講演】プロダクトマネージャーとは
{{< slideshare "F8gpVTms4zsE6m" >}}
関 満徳氏 POStudy ~プロダクトオーナーシップ勉強会~ 主宰
- プロダクト全体に責任をもっている
- プロジェクトマネージャーとプロダクトマネージャーの責務は PMBOK に定義されている
- プロジェクトマネージャーは 10 個
- プロダクトマネージャーは 2 個のみ
- プロダクトマネジメント
- 顧客(市場)マネジメント
- 起業家とプロダクトマネージャーの違い
- 資金調達が必要ない
- それ以外はだいたい同じ
- 必要な 7 つのスキルがある
- 執行役員以上が担う
- もしくは執行役員以上から期間限定で任命
- ラピッドプロトタイピング
- プロトタイプを作ったら、関係者ではなく実際のユーザでテスト
- マネジメントとリーダーは違うので、同じ人だったら意識して帽子を脱ぎ変える必要がある
- 前者は製品を対象とし、チームを対象とする
- "目標を与えれば人は動く"
## 2. 【キーセッション】個人と組織からもう一度考えるプロダクトマネジャー
{{< slideshare "pLnxhP3eiCIUtU" >}}
新井 宏征氏 株式会社スタイリッシュ・アイデア 代表取締役
- 『{{< amazon_link asin="4798111929" title="プロダクトマネジャーの教科書" >}}』の訳者の方
- 「プロダクト」=「製品」ではない
- プロダクトとは、顧客のニーズや欲求を満たすベネフィットの集合である
- まあそうだよね
- ドライな目標(MBO)と想いのマネジメント(MBB)の両輪を回すことが組織にとって必要
- MBO: Management By Objectives
- MBB: Management By Belief
- "組織が急速に成長しているときには、絶え間ないコミュニケーションと強い一体感が何にもまして重要だ"
- V2MOM でビジョン主導型マネジメント
- V2MOM (Vision, Values, Methods, Obstacles, Measures)
- 作成する際にはボトムアップで社員からの声を集めている
- 「社長目線で考えろ」と精神論を言うのではなく、V2MOM のようなフレームワークをトップも社員も使うことが重要
## 3. 【キーセッション】プロダクトマネージャーに求められるスキルとマインドセットとは
{{< slideshare "mZ8FHXjmgxRoA7" >}}
丹野 瑞紀氏 株式会社ビズリーチ キャリアカンパニー サービス企画本部 本部長
- プロダクトマネジメントなかったら話
- CS部門、営業部門、社長から「この機能が必要」→ 優先度全て S !!!
- 電通 古川裕也氏
- 「クリエイティブディレクションの4つの仕事」で「全て最優先を解決する」
- システム思考で問題を明らかにして、
- プロダクトマネージャーは mini CEO
- これは聞いたことある
- 会社が倒産したら CEO の責任
- 同じようにプロダクトについての一切の責任を負う
- ただし権限はない
- 共感で人を動かす
- プロダクトマネージャーになるには
- プロダクトマネジメントについて学ぶ
- プロダクトマネージャーのように振る舞う
- 個人でサイドプロジェクトを始める
- ノンエンジニアは仲間を見つける方法もあるが、自分で手を動かすことをオススメする
## 4. 【キーセッション】シリコンバレーTech企業でのプロダクトマネージャー業務とは?
{{< slideshare "352tjdAaVXJ2wC" >}}
柳川 純二氏 株式会社シマンテック ノートン統括事業本部 プリンシパルプロダクトマネージャー
- アップルではプロダクトマネージャーは人気度(≒給与)4 位
- ちなみに 1 位はアートディレクター
- スタートアップがアーリーステージから抜け始めた頃にプロダクトマネージャーが必要になってくる
- 弊社がそれ、もしくはそのちょっと先
- シマンテックのプロダクトマネージャーには CorePM と PartnerPM の 2 種類ある
- PartnerPM は Norton 製品全般をパートナー企業向けに展開するため、社内外のステークホルダーの要求仕様を整理、優先順位付け、開発チームへのフィードバックを実施
- シマンテックではこちらもプロダクトマネージャー。よく聞くプロダクトマネージャーは CorePM と呼ぶ
- BtoB や BtoBtoC のサービスを提供する企業では(PartnerPM が)多く見られる
- 弊社でも当てはめられるのでは
- CorePM と PartnerPM を明確にすることが必要では?
- PartnerPM はセールスエンジニアとタッグでお客さんのところに行くらしい
- セールスエンジニアはアカウント(担当の会社)を持つが、PartnerPM は地域全般を担当する
- 優先順位付けモデルを使って、優先順位付け
{{< tweet user="masutaka" id="640422663513440256" >}}
## 5. 【パネルディスカッション】日本企業におけるプロダクトマネージャーの課題と今後の展望
上記 4 名の方で。参加者からの質問も交えつつ。
- プロダクトマネージャーの育成
- リーダーシップを発揮する
- 素振りをする
- 世の中のプレスリリースを読んで、いろいろ仮説を立てて検証するとか
- なぜこの機能を先に出したのかとか
- 自分で画面設計をしてみる
途中、ノンエンジニアはプロダクトマネージャーになれるのか?というア
ンケートの解答の話が出たので、それに絡めて質問してみました。
Q. エンジニアからプロダクトマネージャーになる時に、コードが書く時
間がなくなり、自分のキャリアプランが変わることに悩みはなかったか?
直接的な Answer はこんな感じでした。
- 戻ることも出来る
- 特に悩まなかった
- とにかくユーザの問題を解決したかった(←うろ覚え)
派生してこんな話にもなりました。
- コミュニケーション力は少なくてもよい。ファシリテーション力やリーダーシップは必要
- 人に興味を持ちましょう。ビジネスに興味を持ちましょう
- アメリカでは、どのくらい儲かるか考えてコードを書くエンジニアが多い
最後の「どのくらい儲かるか考えて」は、それが良くも悪くも日本なんだ
なあと思いました。
あと、プロダクトマネージャーは誰も拾わないボールを拾うことが求めら
れる、という話も出ました。
私は誰も拾わない技術的なボールも拾うようにしていますが、全職種にま
たがるボールは拾えないなあ...などと言った気がします。
{{< tweet user="masutaka" id="640389459188420608" >}}
とは言え、マクロ的な視点で自分の職責を俯瞰することは大事なので、そ
こは常に意識していきます。
**追記(2015-09-07):**
[Togetter まとめはこちら。](http://togetter.com/li/870276)
**追記(2015-09-09):**
[資料が公開されたので](http://fullvirtue.com/pdm20150906/)追加しました。
--------------------------------------------------------------------------------
title: "knife-solo v0.5.0 から --forward-agent オプションが必要かも"
date: "2015-08-30"
--------------------------------------------------------------------------------
knife-solo v0.5.0 から --forward-agent オプションを付けないと、
Cook に失敗するケースがありました。
例えばこのように指定します。
bundle exec knife solo cook ci-docker
↓
bundle exec knife solo cook ci-docker --forward-agent
変更があったのはこちらの PR
https://github.com/matschaffer/knife-solo/pull/394
knife-solo では sudo が使われますが、v0.5.0 から --forward-agent
オプションを付けた場合だけ -E オプションが付くように変更されました。
sudo の -E オプションはこのようなものだそうです。
```
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve
their existing environment variables. The security policy may
return an error if the user does not have permission to preserve
the environment.
http://www.sudo.ws/man/1.8.12/sudo.man.html
```
{{< post "2015-08-30-1" >}} のケースだと、Docker の中で sudo chef-solo を実行し
ますが、その時の環境変数を引き継ぐようですね。ただ、chef-solo を実
行するユーザは root なので、そもそも sudo する意味がありません。こ
の辺り最適化できるのかな?
--forward-agent オプションが必要ないケースもあるようで、私の場合は
openjdk-7-jdk パッケージをインストール中に以下のエラーになりました。
go や nginx パッケージのインストールでは問題なし。なぜかは分かりま
せんでした...。
```
Creating fuse device...
makedev fuse c 10 229 root root 0660: failed
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
Extracting templates from packages: 100%
mknod: ‘fuse-’: Operation not permitted
chown: cannot access ‘/dev/fuse’: No such file or directory
dpkg: error processing package fuse (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
```
**追記(2015-08-30):**
切り分け調査にすごく時間がかかったことを申し添えておきます。

**追記(2015-09-06):**
v0.5.0 にはもうひとつハマりポイントがありました。ご注意下さい。
[knife-soloをアップデートしたらdockerを使ったサーバCIに失敗した - とある元SEの学習日記](http://cross-black777.hatenablog.com/entry/2015/09/05/171339)
--------------------------------------------------------------------------------
title: "サーバの CI を EC2 から Docker に変更したけどモヤモヤ"
date: "2015-08-30"
--------------------------------------------------------------------------------
サーバの CI ってどうするのが良いのでしょうね。現状やむを得ず行って
いますが、やり過ぎ感も否めないです。
{{< post "2014-09-14-1" >}} に Wercker+Vagrant+EC2 の組み合わせでこのサーバの
CI を始めてから、{{< post "2015-02-08-2" >}} に CircleCI+Vagrant+EC2 に変更しま
した。そして今回、CircleCI+Docker に変更しました。
理由は EC2 を使うのは大げさだと思い始めたからです。CI 時間の短縮を
期待しましたが、ほとんど変わりませんでした。結果的に、時々 EC2 イ
ンスタンスを起動するのに 30 分以上かかり、CircleCI のタイムアウト
時間を超える問題は解決出来ましたが。
Docker 入門できて自己満足は得られたのですが、Docker の使い方ではな
いなあというのが正直な感想です。
Docker を使ってサーバの CI をするためには、openssh-server をインス
トールする必要があります。そもそも Docker は一度インスタンスを作っ
たら変更を加えるべきではないため、Docker を起動してから knife-solo
で変更を加えるのは誤った使い方です。
このブログのサーバ(さくらの VPS)には nginx や td-agent、
elasticsearch などがごちゃごちゃと入ってますが、同じ環境を Docker
で作るのもおかしな話です。Docker は 1 サーバ 1 責務だと思うので、
例えば nginx だけをインストールする使い方が正しい気がします。
そういう意味で無理して CI しているなあと、モヤモヤしているところです。
修正内容はこちらです。末尾に解説を記載しました。
{{< gist "masutaka" "91a3f64d10ea6b383cd4" >}}
## ./script/bootstrap-docker.sh
このスクリプトは CircleCI の dependencies.pre で実行されます。
Docker に必要な環境がセットアップされます。
初回はキャッシュした Docker archive($HOME/cache/ubuntu.tar.gz)が
存在しないため、新規作成します。docker save 時に圧縮しているのは
CircleCI の容量削減のためです。400MB から 140MB 程度に削減出来まし
た。CI が速くなるかと思いましたが、そうでもありませんでした。
次回以降 Dockerfile を変更していなければ、キャッシュが使われます。
この判断に使われるのが、初回に作った $HOME/cache/Dockerfile.digest
です。docker load には圧縮した tar ball をそのまま読み込ませている
のがポイントです。[マニュアル](https://docs.docker.com/reference/builder/)によると bzip2, xz 形式でも良いらしい
です。
$HOME/.ssh/config に設定を追加することで、"$ ssh ci-coker" で
Docker にログイン可能にしています。
## Dockerfile
https://docs.docker.com/examples/running_ssh_service/ を
参考に作りました。
knife-solo や chef-solo で必要最低限のパッケージである curl,
openssh-server, rsync をインストールしています。
/root/.ssh/authorized_keys は ssh-keygen コマンドで作った公開鍵で
す。対応する秘密鍵は CircleCI の
https://circleci.com/gh/masutaka/server-masutaka.net/edit#ssh に
登録しました。
Chef Client も https://docs.chef.io/install_omnibus.html の方法で
インストールしています。バージョンを指定しているのは、Gemfile.lock
の chef とバージョンを合わせやすくするためです。今後、自動 bundle
update の時に Dockerfile も自動更新させる予定です。
Docker の中で DOCKER_IN_CIRCLECI という自前の環境変数を有効にして
います。Docker の CI でどうしてもレシピの動作を変える必要があった
からです(モヤモヤ)。openjdk-7-jdk パッケージのインストール、ufw
の設定で使われているのが分かると思います。
## circle.yml
Cook の後に以下の workaround を追加しました。
> ssh ci-docker "/etc/init.d/mongodb start && /etc/init.d/td-agent start"
Cook で mongodb が起動せず、それに引きずられて td-agent も起動しな
いためです。Docker の制約だそうですが、mackerel-agent や nginx は
起動したのでその辺り謎です。
## /etc/hostname
Cook で変更できなかったため、"atomic_update false" を追加しました。
ファイルロックがかかっていたと思います(うろ覚え)。
Thanks a lot!
[CircleCI + DockerでサーバCI始めました|feedforce Engineers' blog](http://tech.feedforce.jp/serverci-by-docker.html)
**追記(2015-09-21):**
`$ update-locale --reset LANG=ja_JP.UTF-8` で以下のエラーが出るよ
うになったので、EC2 に戻してしまいました。{{< post "2015-08-30-2" >}} も影響は
Docker のみでした。やはり Docker とサーバの CI は合わないと思いました。
> STDERR: *** update-locale: Error: invalid locale settings: LANG=ja_JP.UTF-8
--------------------------------------------------------------------------------
title: "OpenID TechNight Vol.13 に行ってきた #openid #technight"
date: "2015-08-27"
--------------------------------------------------------------------------------

[OpenID TechNight Vol.13 - ID連携入門](https://openid.doorkeeper.jp/events/29487)
運良く会社枠で行くことが出来ました。業務的にど真ん中なのに
OAuth1&2 しか使ってなかったという。。。
## 1. ID連携概要 by {{< twitter "nov" >}}
{{< slideshare "Lw5OsZp5n6qwXb" >}}
初心者向けセッションでした。GREE の方。
弊社で言うと、新卒の営業が聞くとうれしい内容だったかも。
- ENTITY と IDENTITY
- ENTITY は実体
- IDENTITY PROFFING
- 本人確認
- 用語解説
- IDP: Identity Provider
- Facebook, Twitter,...
- RP: Relying Party
- Disqus とか
- 高度なセキュリティ対策
- "セキュリティ専任スタッフを100人以下しか雇えないようなサービスにパスワード預けるなんてバカげてる"
- Eric Sachs, Google
- エンタープライズ分野では属性連携開始してからも、部署とかを更新し続けないといけないらしい
## 2. ID連携のあるとき~,ないとき~ #エンプラ編 by {{< twitter "paoneJP" >}}
{{< slideshare "ALqBhU9SxPpn71" >}}
エンタープライズで ID 連携するメリットのお話。オージス総研の方。
エンプラ系は大変だなあ。
- SAML
- エンタープライズ分野でよく使われている認証方式らしい
- Office 365, Salesforce, cybozu.com,...
- XML でやりとりされているらしい。つらい
- M&A などのシステム統合でも ID 連携を使うと迅速に実現できるとのこと
- 実際は間違いなく大変だろうけど
- ID 連携にはフェデレーション(オンライン)とプロビジョニング(バッチ)が必要
## 3. コンシューマ領域におけるID連携のユースケースとライブラリ紹介(OAuth編) by {{< twitter "ritou" >}}
{{< speakerdeck "4c3edbcd808d4c64aa5ea41c9de6b407" >}}
{{< tweet user="masutaka" id="636489729744236544" >}}
↑でした。mixi の方。
- 海外と日本では利用プロバイダの比率が違う
- 海外は Facebook(Janrain の調査だったかな?)
- [日本は Yahoo! Japan がダントツ(フィードフォースの調査)](https://www.feedforce.jp/release/4979/)
- ソーシャルログイン as a Service
- Janrain を例に
- ライブラリ
- OmniAuth とか
- 安全な実装になっていないケースも?
- OAuth2 ライブラリ
- 元気があればなんでもできる!
## 4. OpenID Connect 入門 〜コンシューマー領域におけるID連携のトレンド〜 by {{< twitter "kura_lab" >}}
{{< slideshare "DAgcEe0YyhsunB" >}}
Yahoo! Japan の方。個人的に一番収穫のあったセッションだった。
OpenID Connect の知見を得た。
- OpenID Connect の特徴
- OAuth2.0 をベースに拡張
- 認証も認可も
- さらに属性取得機能も
- ID 連携のトレンド
- OAuth2.0 と比較
- ID トークンは JWT
- UserInfo も定義されているのは大きな違い
- 例: sub(ユーザー識別子)
- ID 厨は eyJ という文字列を見つけるとテンションが上がる!?
- 下記ツイート参照
- "{" を Base64 エンコードすると eyJ になるから
- JWT と書いて jot(ジョット)と発音するらしい
- ID 厨としては知っておいて欲しい
{{< tweet user="ritou" id="630665190392999936" >}}
懇親会は参加しなかった。営業の人と来ればよかった。
**追記(2015-09-09):**
[資料が公開されていたので](https://openid.doorkeeper.jp/events/29487)追加しました。
--------------------------------------------------------------------------------
title: "Ruby の定数や Object.freeze の理解が曖昧だったのでメモ"
date: "2015-07-29"
--------------------------------------------------------------------------------
◆定数には再代入可能(怒られるけど)。
```
irb(main):001:0> HOGE = 'abc'
=> "abc"
irb(main):002:0> HOGE = 'xyz'
(irb):2: warning: already initialized constant HOGE
(irb):1: warning: previous definition of HOGE was here
=> "xyz"
irb(main):003:0> HOGE
=> "xyz"
```
◆書き換えは普通にできる。怒られない。
```
$ irb
irb(main):001:0> HOGE = 'abc'
=> "abc"
irb(main):002:0> HOGE[0] = 'x'
=> "x"
irb(main):003:0> HOGE
=> "xbc"
```
◆freeze すれば、書き換えできなくなる。
```
$ irb
irb(main):001:0> HOGE = 'abc'.freeze
=> "abc"
irb(main):002:0> HOGE[0] = 'x'
RuntimeError: can't modify frozen String
from (irb):2:in `[]='
from (irb):2
from /Users/masutaka/.rbenv/versions/2.1.6/bin/irb:11:in `'
irb(main):003:0> HOGE
=> "abc"
```
◆ただし、再代入は可能。
```
$ irb
irb(main):001:0> HOGE = 'abc'.freeze
=> "abc"
irb(main):002:0> HOGE = 'xyz'
(irb):2: warning: already initialized constant HOGE
(irb):1: warning: previous definition of HOGE was here
=> "xyz"
irb(main):003:0> HOGE
=> "xyz"
```
C言語のポインタを想像すると、素直な挙動だと思った。
--------------------------------------------------------------------------------
title: "Emacs で URL encode するやつ"
date: "2015-07-28"
--------------------------------------------------------------------------------
```elisp
(require 'url-util)
(url-hexify-string "http://masutaka.net/")
=> "http%3A%2F%2Fmasutaka.net%2F"
(url-unhex-string "http%3A%2F%2Fmasutaka.net%2F")
=> "http://masutaka.net/"
```
--------------------------------------------------------------------------------
title: "【保存版】自前で継続的 bundle update を導入する方法"
date: "2015-07-28"
--------------------------------------------------------------------------------
俺得な保存版記事です。設定するたびにやり方を思い出すのが面倒になり。
## 1. CircleCI の設定
[GitHub の Personal access tokens](https://github.com/settings/tokens) のページで token を作成し、CircleCI の Project Setting -> Environment variables に GITHUB_ACCESS_TOKEN という名前で追加します。
CircleCI の URL は以下になります。
`https://circleci.com/gh/{ユーザ名}/{リポジトリ名}/edit#env-vars`
## 2. circle.yml の変更
このように circle.yml の deployment section を変更します。
https://github.com/masutaka/masutaka-29hours/commit/0ba9ef03348568baaa5cf271d4f6e41305f8fdfe
環境変数 BUNDLE_UPDATE が指定されていたら、circleci-bundle-update-pr gem をインストールして、同コマンドを実行しています。この環境変数は後述するトリガーが設定してきます。
circleci-bundle-update-pr コマンドでは以下が実行されます。
1. bundle update を実行する
2. Gemfile.lock に差分があれば、git commit し、GitHub のリモートブランチに git push する
3. GitHub の Pull Request を作成する
4. アップデートした Gem の差分へのリンクをコメントとして POST する
bundler もアップデートしているのは、1.10.0 から Gemfile.lock に追記される BUNDLED WITH 対策のためです。
[Ruby - BUNDLED WITH で Gemfile.lock が更新されてしまう件 - Qiita](http://qiita.com/suu_g/items/2b1630b8015d51c5292e)
bundler のアップデートに気づけるので、ローカルの bundler をアップデートしようかという気持ちになります。
## 3. トリガーの作成
最後に Heroku にトリガーアプリをデプロイします。やり方は簡単。
https://github.com/masutaka/ci-build-trigger の Heroku ボタンをクリックするだけ。説明の通りに設定すれば迷わないはず。
## 現在の Heroku Scheduler の設定
そこそこ増えてきました。複数リポジトリを指定できるようなツールを作ろうかしら...。
| Schedule | Repository
|---|---
|Fri 08:00 UTC|[awesome-github-feed](https://github.com/masutaka/awesome-github-feed)
|Fri 08:30 UTC|[masutaka-29hours](https://github.com/masutaka/masutaka-29hours)
|Fri 09:00 UTC|[masutaka-metrics](https://github.com/masutaka/masutaka-metrics)
|Fri 09:30 UTC|[masutaka.net](https://github.com/masutaka/masutaka.net)
|Fri 10:00 UTC|[server-masutaka.net](https://github.com/masutaka/server-masutaka.net)
※ 業務でもいくつかのリポジトリで設定してます。
## こんな Pull Request が作られる

CircleCI をお使いの皆さんは CI も設定済みでしょうから、この Pull Request の作成をトリガーにして、当然 CI も実行されます。
テストが通ったことを表す緑の✓をクリックすれば、CircleCI の当該ページにジャンプします。warning や deprecated message が増えていないかを必ず確認します。
## なぜ継続的に bundle update するのか
継続してサービスを運用し続けるためには、使っている Gem をアップデートし続ける必要があります。
Gem が古いとセキュリティアップデートができなくなったり、使っているサービスの仕様変更に置いて行かれる可能性があります。
これは始めてから気づいたことですが、自分が使っている Gem の変更をキャッチアップしやすくなりました。半年に一回のアップデートでは変更点が膨大になりますが、週に一度ならそれほどでもありません。
## 他の方法
http://tachikoma.io/ はもっとお手軽です。
ただし、現在はアップデートした Gem の差分へのリンクは分かりません。時間や曜日を指定することも出来ないと思います。
## あとがき
以下の記事をまとめてスリムにしたのがこの記事です。
- CircleCI を使って bundle update を定期実行する Heroku アプリを作った {{< post "2015-01-25-1" >}}
- 継続的 bundle update を簡単に導入できる Gem を作った {{< post "2015-03-03-1" >}}
間違いなどあれば、下のコメント欄か {{< twitter "masutaka" >}} までお知らせください。
## 追記(2015-08-29):
YAPC::Asia Tokyo 2015 のセッションで紹介されました。ありがとうございます。
10:40 からです。
{{< youtube id="WsXCWg3mAFg" title="esa.io - 趣味から育てたWebサービスで生きていく / Atsuo Fukaya" start="640" >}}
資料はこちら。25 ページ目です。
[esa.io - 趣味から育てたWebサービスで生きていく // Speaker Deck](https://speakerdeck.com/fukayatsu/esa-dot-io-qu-wei-karayu-tetawebsabisudesheng-kiteiku)
## 追記(2015-12-23):
{{< twitter "ppworks" >}} さんがより分かりやすいまとめ記事を書いて下さいました。ありがとうございます!
[Circle CIでbundle updateのPull Request作成を自動化する手順 - pblog](http://ppworks.hatenablog.jp/entry/2015/12/23/214644)
## 追記(2016-10-10):
今後はこちらの README.md をメンテナンスしていきます。
{{< github_repo "masutaka/circleci-bundle-update-pr" >}}
--------------------------------------------------------------------------------
title: "Chef で nginx の reload が出来なくなっていたので対策した"
date: "2015-07-26"
--------------------------------------------------------------------------------
Ubuntu 14.04 LTS + nginx 1.9.3 の環境で、knife solo 経由での nginx
reload が出来なくなっていました(Chef のバージョンは 12.4.1)。
サーバの CI では nginx start のみが実行され、nginx restart は実行
されないため、気づけなかったようです。
レシピは至って普通。
```
service 'nginx' do
action [:enable, :start]
supports status: true, restart: true, reload: true
end
template '/etc/nginx/sites-available/masutaka.net' do
notifies :reload, 'service[nginx]'
end
```
/var/chef/cache/chef-stacktrace.out にはこんなエラーが。
```
Generated at 2015-07-26 01:10:55 +0900
---- Begin output of /sbin/reload nginx ----
STDOUT:
STDERR: reload: Job is not running: nginx
---- End output of /sbin/reload nginx ----
Ran /sbin/reload nginx returned 1
```
実際、そうなりました。よく分かりません。
```
$ sudo /sbin/reload nginx; echo $?
reload: Job is not running: nginx
1
```
/etc/init.d/nginx reload はできるので、レシピをこのように変更して
解決出来ました。
```
service 'nginx' do
provider Chef::Provider::Service::Debian
action [:enable, :start]
supports status: true, restart: true, reload: true
end
```
/sbin/reload nginx が使われていたということは、
[Chef::Provider::Service::Upstart](https://github.com/chef/chef/blob/12.4.1/lib/chef/provider/service/upstart.rb) が選択されていたのかな。
[Chef::Provider::Service::Debian](https://github.com/chef/chef/blob/12.4.1/lib/chef/provider/service/debian.rb) については
[Chef::Provider::Service::Init](https://github.com/chef/chef/blob/12.4.1/lib/chef/provider/service/init.rb) を継承し、/usr/sbin/update-rc.d 系の
コマンドを使うことまでは分かりましたが、その辺無知なのでよく分かり
ません。
Chef::Provider::Service はいろいろあるみたいです。
https://github.com/chef/chef/tree/12.4.1/lib/chef/provider/service
--------------------------------------------------------------------------------
title: "29hours を Heroku からさくらの VPS に引っ越した"
date: "2015-07-25"
--------------------------------------------------------------------------------
[Heroku の料金体系が変わり](https://blog.heroku.com/archives/2015/5/7/new-dyno-types-public-beta)、24 時間動かし続けるためには課金()が必要
になりました。Traditional dyno はそのうち使えなくなるそうです。
昨日のアルコールが少し残る今日の午後、なんとなくやる気になったので、
{{< post "2013-04-14-2" >}} から Heroku で動かしていた [29hours](https://github.com/june29/29hours) をさくらの VPS
に引越しました。このブログと同じサーバです。
※ サービス料を支払いたくないわけではないです。年間 ¥16,745 支払っ
ているさくらの VPS があるのにもったいないと思い。
Heroku の時は https://github.com/june29/29hours を変更せずに git
push すればデプロイできました。でもさくらの VPS には当然そんな機能
はないため、またまた Capistrano で頑張りました。つらい。
作ったリポジトリがこちらです。
{{< github_repo "masutaka/masutaka-29hours" >}}
https://github.com/june29/29hours を git submodule として追加した
ため、デプロイを少々工夫する必要がありました。
- [submodule を clone するために capistrano-git-submodule-strategy
を使った](https://github.com/masutaka/masutaka-29hours/commit/2f5756e26c1ac94f02af3a55b42aa03e9341a377)
- [一階層下のディレクトリで bundle install するために
capistrano-bundler の設定を変更した](https://github.com/masutaka/masutaka-29hours/commit/488ebafa71d8cd17bdead49f3688849946c347f6)
- settings.yml を Dropbox から取得した。[CircleCI のビルドが公開さ
れているため](https://circleci.com/gh/masutaka/masutaka-29hours)、[URL がバレないように Capistrano の capture を使った](https://github.com/masutaka/masutaka-29hours/blob/6ca149c494eb1a5598c42f7356ce2497f53d80c4/config/deploy.rb#L46)
- [デプロイ時に 29hours を再起動するための cap task を書いた](https://github.com/masutaka/masutaka-29hours/commit/06b35bdd97acdcba540a7dbc0170b9c8b9522523)
29hours は Procfile を持っているので、最後の cap task で [foreman](https://rubygems.org/gems/foreman)
を使う方法も考えましたが、foreman の良さげなインストール場所を思い
つけなかったので、今回の方法に落ち着きました。
理由1: 構成管理していない rbenv の ruby を使っているので、gem
install ではあまりインストールしたくなかった。
理由2: 29hours のリポジトリを submodule として使っているので、
[masutaka-29hours](https://github.com/masutaka/masutaka-29hours) 直下の Gemfile に追加する必要があるが、デプロイで
bundle install を 2 回行う必要があり面倒になった。
capistrano-29hours の需要あります?
--------------------------------------------------------------------------------
title: "helm-bundle-show.elからRubyGems.orgのページに飛べるようにした"
date: "2015-07-13"
--------------------------------------------------------------------------------
{{< github_repo "masutaka/emacs-helm-bundle-show" >}}
{{< post "2015-04-13-1" >}} の機能追加。
絞り込んでからの キーで、RubyGems.org のページに飛べるように
しました(下記デモ画像中 [f4] )。例えば https://rubygems.org/gems/rails です。
URL をコピーするだけも可能です(下記デモ画像中 [f5] )。

--------------------------------------------------------------------------------
title: "AWSリザーブドインスタンス購入時の注意まとめ"
date: "2015-07-08"
--------------------------------------------------------------------------------
自戒を込めて...。
## EC2
> http://aws.amazon.com/jp/ec2/purchasing-options/reserved-instances/getting-started/
>
> 1. Modifying a Reserved Instance
>
> You can request to move your Reserved Instance to another Availability Zone within the same region, change its Network Platform, or, for Linux/UNIX RIs, modify the instance size of your reservation to another size of the same instance type at no additional cost. (Certain conditions apply.)
>
> 2. Sell Reserved Instances on the AWS Reserved Instance Marketplace
>
> The Reserved Instance Marketplace provides you with the opportunity to sell Reserved Instances if your needs change (i.e. want to move instances to a new AWS Region, change to a new instance type, or sell capacity for projects that end before your Reserved Instance term expires).
1. リザーブドインスタンスの変更
- 同一リージョンの他のアベイラビリティゾーンに移行可能
- ネットワークプラットフォーム(?)を変更可能
- Linux/UNIX RIs であれば、同一インスタンスファミリー内の別のタイプに変更可能
- See also http://qiita.com/rika-sakuma/items/fba3b526e297465bcc77
2. マーケットプレイスでの売却
- http://dev.classmethod.jp/cloud/aws/jawsdays2014-16/ によるとアメリカの口座が必要みたいです。
制約はありますが、変更は可能なようです。
売却はハードル高すぎです。
## RDS
> http://aws.amazon.com/jp/rds/reserved-instances/
>
> * リージョン、DB エンジン、DB インスタンスクラス、デプロイメントタイプ、および期間を、購入時に選択する必要があります。これらを後で変更することはできません。
> * リザーブド DB インスタンスは最大 20 個まで購入できます。これ以上のリザーブドインスタンスが必要な場合は、こちらのフォームに必要事項を入力のうえご送信ください。
> * 予約金の払い戻しはできません。
変更不可なので、慎重に購入する必要があります。
## ElastiCache
> http://aws.amazon.com/jp/elasticache/reserved-cache-nodes/
>
> * 購入時に、リージョン、キャッシュノードクラス、期間の長さを選択する必要があります。これらは後で変更することはできません。
> * リザーブドキャッシュノードは最大 20 個まで購入できます。それ以上のリザーブドキャッシュノードが必要な場合は、ここにあるフォームにご記入ください。
> * 予約金はお支払い戻しできません。
こちらも変更不可。
**追記(2015-07-11):**
AWS では複数アカウントの料金を一括で支払うことができます。そこに属
していれば RDS や ElastiCache のリザーブドインスタンスを共有できる
かもしれないです。今回、インスタンスはそのままで良くなったので、本
当に出来るかは分かりませんでしたが。
--------------------------------------------------------------------------------
title: "ドッグフーディングを始めてみた"
date: "2015-07-02"
--------------------------------------------------------------------------------
赤枠が[ソーシャルPLUS](https://socialplus.jp/)のコメントウィジェット。全然違和感がない。
今までその下にある [Zenback](http://zenback.jp/) の Facebook コメントフォームを有効にし
てましたが、使われませんし飽きてきました。ちなみにその前は [DISQUS](http://disqus.com/)
で{{< post "2010-05-03-1" >}}、その前は[くっつきBBS](http://nais.to/~yto/tools/kuttukibbs/)でした{{< post "2008-09-29-1" >}}。

まだ Twitter ログインにしか対応していませんが、これから各種ソーシャ
ルログインに対応していくかも?
本当はメイン機能であるログインと繋ぎ込みをしたり、他のウィジェット
(アクションボタン、シェアウィジェット、プロバイダーボタンバー、ア
クティビティウィジェット等)もフルで使いたかったのですが、このブロ
グが静的サイトということもあり面倒になって止めました。
--------------------------------------------------------------------------------
title: "自前でufwのレシピとserverspecのテストを書いた"
date: "2015-06-29"
--------------------------------------------------------------------------------
ufw = Uncomplicated FireWall です。
レシピはこんなのを作りました。opscode のレシピとか使うと、何設定し
ているか分からず結局全部読むことになるので自前で書いてます。
```
execute 'ufw reload' do
action :nothing
end
execute 'ufw default deny' do
not_if 'ufw status verbose | fgrep "Default: deny (incoming)"'
notifies :run, 'execute[ufw reload]'
end
execute 'ufw allow http' do
not_if 'ufw status | egrep "^80 +ALLOW"'
notifies :run, 'execute[ufw reload]'
end
execute 'ufw allow ssh' do
not_if 'ufw status | egrep "^22 +ALLOW"'
notifies :run, 'execute[ufw reload]'
end
execute 'ufw enable' do
command 'yes | ufw enable'
not_if 'ufw status | fgrep "Status: active"'
end
```
serverspec はだいたいこんな感じです。
```
describe package 'ufw' do
it { should be_installed }
end
describe service 'ufw' do
it { should be_enabled }
it { should be_running }
end
# serverspec では `$ telnet masutaka.net 80` 相当のテストは
# 出来ないため、`$ ufw status verbose` の出力結果をテストする。
describe command 'ufw status verbose' do
its(:stdout) { should include 'Status: active' }
its(:stdout) { should include 'Default: deny (incoming), allow (outgoing), disabled (routed)' }
describe 'ssh' do
its(:stdout) { should contain %r(^22 +ALLOW IN +Anywhere) }
end
describe 'http' do
its(:stdout) { should contain %r(^80 +ALLOW IN +Anywhere) }
end
end
```
ufw は初めから入って稼働していると思うので、package と service の
テストはお好みで。
私の理解が間違ってなければ serverspec は中からテストするので、ufw
でポートを閉じた場合の振る舞いのテストは出来ないと思います。
例: `$ telnet masutaka.net 80` が繋がるか?
振る舞いのテストが出来ないのは不本意ですが、ないよりマシなのでこの
テストにしました。
例えば以下のテストは `$ ufw allow http` のテストではなく、http サー
バが稼働しているかのテストです。http サーバを停止するとテストが通
らなくなります。
```
describe port 80 do
it { should be_listening }
end
```
ググると勘違いしている記事が多いので、間違えないようにしましょう。
--------------------------------------------------------------------------------
title: "El-Get を多少理解できた気がする"
date: "2015-06-17"
--------------------------------------------------------------------------------
[Cask](https://github.com/cask/cask) から [El-Get](https://github.com/dimitri/el-get) に移行したのが先月。
(ちなみに Homebrew の Cask は Emacs の Cask を参考にしたらしいです。)
{{< tweet user="masutaka" id="599926116451688448" >}}
el-get-update とかで頻繁にエラーになるので、調べ始めて文句を言って
いるところ(愚かな奴めw)。
{{< tweet user="masutaka" id="610787373027188736" >}}
{{< tweet user="masutaka" id="610808017030746112" >}}
結果、ようやく El-Get を理解できた気がする。
[MELPA](https://github.com/milkypostman/melpa) と同様、自前でレシピを持っているので、基本それを使えば良い。
El-Get は 2015/6/17 現在 [1491 レシピ](https://github.com/dimitri/el-get/tree/master/recipes)持っている。
対する [MELPA](https://melpa.org) は [2538 レシピ](https://github.com/milkypostman/melpa/tree/master/recipes)。これは El-Get にとって脅威ではなく、
むしろメリット。なぜなら、El-Get は自前で持っていないレシピは
MELPA のレシピを使うから(後述)。
## El-Get のレシピがあるパッケージ
こう書けば良い。el-get-bundle を使わない方法は調べていない。
```elisp
(el-get-bundle helm)
```
## El-Get のレシピがなく、Git リポジトリがあるパッケージ
el-get-bundle を使う以上、なるべく Git とかの VCS を source にした
ほうが良い(バージョンをロックできるのは VCS を使った時だけだから)。
MELPA から GitHub のリポジトリが見つかったら、このように書けば良い。
```elisp
(el-get-bundle mori-dev/scratch-log)
```
ブランチを指定したければ :branch で指定する。ブランチ名は文字列で
ある必要がある。
```elisp
(el-get-bundle masutaka/egg :branch "freeze-time")
```
依存関係を付けたければ :depends で指定する。
```elisp
(el-get-bundle flycheck/flycheck :depends (dash pkg-info let-alist cl-lib))
```
素の Git だったらこのように書く。
```elisp
(el-get-bundle :type git :url "git://jblevins.org/git/markdown-mode.git")
```
## El-Get のレシピがなく、Git リポジトリもないパッケージ
MELPA を見に行くようだ。接頭詞 elpa: を付けることで明示することも
可能。
```elisp
(el-get-bundle elpa:eldoc-extension)
```
## その他
私の init.el です。都度更新されます。[ホーム](http://masutaka.net/)からも辿れます。
https://gist.github.com/masutaka/8177244
elscreen のレシピに未だに apel の依存が付いていたので、PR 出しました。
https://github.com/dimitri/el-get/pull/2192
--------------------------------------------------------------------------------
title: "AWS Summit Tokyo 2015 に行ってきた #AWSSummit"
date: "2015-06-07"
--------------------------------------------------------------------------------

去年 {{< post "2014-07-19-1" >}} に引き続き、[AWS Summit Tokyo](http://www.awssummit.tokyo) に行って参りました。今年も 2 日目だけ。
今年は開発者向けの「デベロッパーカンファレンス(DevCon)」がメインセッションとは別にあったので、主にそっちを聴いてました。
全てのセッションの動画や資料はこちらをどうぞ。
[AWS Summit Tokyo 2015 開催レポート|AWS](https://aws.amazon.com/jp/summit2015-report/)
## [Day2 キーノート](http://www.awssummit.tokyo/session.html#KEY-04)
{{< youtube "JDyYQPVVx5M" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2015/docs/KEY-04-Tokyo-Summit-2015.pdf)
AWS のサービスや事例の紹介。モバイルや IoT 時代に向けて、脱 EC2 を意識した話が多かった気が。
## 昼休み

炭水化物は十分だったけど量が少なかった。売店とかないのでこれで凌ぐしかない感じだった。
[Amazon Machine Learning のセッション](http://www.awssummit.tokyo/devcon.html#Dev-03s)を聴きながら食べようかと思いましたが、人多杉で断念。[実践 GitHub Flow](http://www.awssummit.tokyo/devcon.html#Dev-03d) の同時上映の会場が空いていたのでそこで。レシーバーを借り忘れたので、音声なしで。
## [開発生産性を上げるためのデプロイ戦略](http://www.awssummit.tokyo/devcon.html#Dev-04d)
吉羽 龍太郎(アマゾン データ サービス ジャパン株式会社 プロフェッショナルサービス本部 部長)
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2015/docs/Dev-04d-Tokyo-Summit-2015.pdf)
デプロイに何時間もかかって困っている方向けのセッションだったので、ちょっと選択を誤った。ただ、吉羽さんの話を聴くのは初めてだったので、それはそれで良かった。
会場内に1時間以内にデプロイ出来る人少なかった。
クロスファンクショナルチームを意識する。メンバーごとのスキルセットのマトリクス作るのは良いかも。HTML5 とか Rails とか fluentd とか。
デプロイツールのデプロイ問題の話もあった。
開発者のローカル環境からデプロイすると、最新の master ブランチでなかったりして、デプロイツールのバージョンが古いことがある。やはり、CI ツールからデプロイするのが現在のベストプラクティスっぽい。穴あけるのが面倒だなあ...。
## [なぜクックパッドは開発しやすいのか](http://www.awssummit.tokyo/devcon.html#Dev-05d)
成田 一生(クックパッド株式会社 インフラストラクチャー部 部長)
{{< speakerdeck "7c89b6cd710244a9a6a433382e9bde9f" >}}
chanko がロールごとの機能の ON/OFF する Gem だったのね。クックパッドのスタッフだけに先行してリリースするとか。
## [AWS セキュアデザイン (IAM)](http://www.awssummit.tokyo/session.html#TA-10)
瀧澤 与一(アマゾン データ サービス ジャパン株式会社 ソリューションアーキテクト)
{{< youtube "CI_29TRcBeA" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2015/docs/TA-10-Tokyo-Summit-2015.pdf)
前半は AWS 責任共有モデルの話、後半は IAM の話だった。
資料にいろいろ書いてあったので、それを見ればよさそう。以下は書き散らかしたメモ。
- AWS は定期的に監査を受けている
- 金融機関向けセキュリティリファレンスあり
- [ホワイトペーパーを誰でもダウンロード可能](http://d0.awsstatic.com/whitepapers/Security/AWS%20Security%20Whitepaper.pdf)
- AWS マーケットプレイスにセキュリティツールあり。KMS 良いそう
- IAM ベストプラクティスがある。守れていない項目があったので、あとで確認しよう
- Active Directory 連携は使わないので聞き流した
- EC2 には IAM ロールは是非使ってね
- 新機能 IAM Policy Validator や Simulator ある
- IAM 認証情報レポートあり
- アクセスキーは 2 つまで設定可能
## [Amazon CloudFront から Edge Services へ ~CDN を再定義する AWS の新たな取り組み~](http://www.awssummit.tokyo/session.html#TE-09)
Prasad Kalyanaraman (VP, AWS Edge Services, CloudFront, Amazon Web Services, Inc.)
{{< youtube "xzvp9UY5-_A" >}}
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2015/docs/TE-09-Tokyo-Summit-2015.pdf)
Edge Services とは CloudFront と Route53(とあと一つあった気が..)のことを指すらしい。なかなか良いセッションだった。
ざっくり言うと、既存プロバイダーと比べて AWS がどれだけすごいかをオブラートに包みつつ、紳士的に話すという内容だった。
実は AWS で DDoS 対策はしているが、お客様に価値を提供するものではないので、今までアナウンスしてなかったとのこと。
GitHub で今年 3 月、史上最大の DDos 攻撃があったけど、あれはなぜ防御できなかったんだろう?
**追記(2017-02-16):**
クラスメソッドさんの記事
[[レポート]Amazon CloudFront から Edge Services へ ~CDN を再定義する AWS の新たな取り組み~ #AWSSummit | Developers.IO](http://dev.classmethod.jp/cloud/aws/awssummit-tokyo-2015-te-09/)
## [Amazonのソフトウェア開発 - Our Leadership Principles-](http://www.awssummit.tokyo/devcon.html#Dev-08d)
堀 剛(Development Manager, Amazon Web Services, Inc.)
※ TODO: 資料やビデオが公開されたらここに貼る
中の人による Amazon のソフトウェア開発の話。直接聴いたのは初めてだったので面白かった。取り入れられるものは取り入れたい。
- 開発・運用・採用活動 全部やる。
- 全員がリーダーとしての自覚を持って行動する
- Press Release に対して FAQ を出して行って(PR/FAQ)、納得行くまでやる
- プライオリティがつけやすいとのこと。お客様が中心
- 他のセッションでもそうだったけど、常にお客様が中心
- オーナーシップ超大事。長期的にお客様が喜んで頂けるかを考える
- Dive Deep(熟考とか)
- 使用例「あれ、もっとそれ Dive Deep しないとだめなんじゃないの?」
- 安易に妥協しない
- 自分の意見と違っていても、決定には全面的にコミットメントする
**追記(2016-12-28):**
関連サイトを見つけました。
[求める人物像|Amazonでは、全員がリーダー](http://amazon-jp-newgrads.com/recruitment-info/ideal-candidate)
## [【ナイトイベント】JAWS-UG 勉強会 in AWS Summit Tokyo 2015](http://www.awssummit.tokyo/session.html#NE-02)
こちらは去年。

こちらは今年。ポテチが増えましたね。

## 運営全般で思ったこと
- 空調はちょうど良かったと思います
- 通訳レシーバーはありがたかったです
- ノベリティは荷物にならない程度の量で良かったです
- ネットは時々繋がらなくなり、PC の Wifi 設定の OFF/ON で直してました
- 事前登録の確認方法が不明確で、機能していませんでした
--------------------------------------------------------------------------------
title: "『ブレイブリーセカンド』は想像の斜め上を行くRPGだった。オススメ(ネタバレなし)"
date: "2015-05-23"
--------------------------------------------------------------------------------

前作のブレイブリーデフォルトがかなり良かった {{< post "2013-12-30-2" >}} ので、
4ヶ月も前から予約して、昨日ようやくクリアしました。
いろいろあって、103時間もかけてしまいましたが、後悔はしていない...。
本作はブレイブリーシリーズの二作目にあたります。
一作目が『[ブレイブリーデフォルト フライングフェアリー](http://www.square-enix.co.jp/bdff/)』で、その改
良版が『[ブレイブリーデフォルト フォーザ・シークウェル](http://www.jp.square-enix.com/bdfts/)』になります。
分かりづらいので注意。
ブレイブリーシリーズが初めての方は、
1. 『[ブレイブリーデフォルト フォーザ・シークウェル](http://www.jp.square-enix.com/bdfts/)』
2. 『[ブレイブリーセカンド](http://www.jp.square-enix.com/second/)』
の順にプレイすると、よろしいかと思います。
システムは今回も改良されています。例えばブレイブやデフォルトの重ね
がけが十字キーで簡単に入力できるようになってました。便利。
ジョブはメインシナリオにおいては、今までの使い回しは「すっぴん」を
除きひとつもなく、新たに作られたものだけ。新ジョブはクセがあるもの
ばかりでしたが、魔法系のジョブは新しいほうを使うことが多かったかな。
意外なジョブが終盤役に立ったり...。
ストーリーは以下のとおり。プレイ中「マジか!」と声が出ることが何度
もありました。
{{< tweet user="masutaka" id="600321222274994178" >}}
ダンジョンは前作と比べて立体的で複雑になりましたが、サブシナリオは
前作の使い回しが多く、ゲップが出たのは残念なところ。
とは言え、製作者の方はそれこそ四六時中ブレイブリーセカンドのことを
考えていたんだろうなあと感じる箇所が多々あり、心地よくプレイ出来ま
した。実際、[プロデューサーの浅野智也氏は髪を 1 年間切れていなかった](http://www.famitsu.com/news/201505/18078811.html)
とのことw
サントラも買いました。いつもはクリアーしてから買いますが、今回は待
ちきれず発売日とほぼ同時に iTunes で。ネタバレ感があるので注意です。
{{< amazon asin="B00VJ8ZT3A" title="BRAVELY SECOND END LAYER Original Soundtrack" >}}
そういうわけで超オススメな RPG です!
{{< amazon asin="B00QPOG7JS" title="ブレイブリーセカンド" >}}
前作は先にプレイしたほうが良いです!
{{< amazon asin="B00EVN4T40" title="ブレイブリーデフォルト フォーザ・シークウェル" >}}
--------------------------------------------------------------------------------
title: "6年ぶりにこのブログをリニューアルした"
date: "2015-05-06"
--------------------------------------------------------------------------------
多分、{{< post "2009-02-21-1" >}}以来。
いやあ、ずっとデザインは直さなくちゃと思ってたんですよ。しかし、まさかこのGWに直すことになるとは。

今までは[tdiary](http://www.tdiary.org/)のkaeruテーマを使わせて頂いていました。分からないなりに継ぎ足していったところ、スマホ時代に反したデザインになっていると自覚。味があったといえばありましたが。
そこでGWの初めに[たつをさんの記事](http://chalow.net/2015-03-07-2.html)を見ながらスマホ対応をしたんですが、元がアレなのでサイドバーを引っ込めるくらいしか出来ず。
GWも終盤の昨日の午後、天からイベントが降ってきたので、一気にリニューアルしてしまいました。うん、12時間くらい。
PagerやPaginationは分かりやすくしたつもり。どうでしょう?
テーマは、みんな大好きBootstrapをベースにいい感じのテーマが集まっている https://bootswatch.com/ の[Yeti](https://bootswatch.com/yeti/)を使わせて頂きました。
時間がかかったのは、ある程度形にするまでと、カテゴリページのPaginationをいい感じにするため、[chalowのソース](https://github.com/masutaka/chalow/blob/master/chalow)に修正を入れたところ。
{{< tweet user="masutaka" id="595552038076846081" >}}
chalowのソースをいじるのは今回が初めてではありませんが、Perlは未だに分かりません。。
もう一つは、使うべきcssがよく分からなかったこと。
というのも、初めは各テーマのソースを参考にしていたので、 https://github.com/thomaspark/bootswatch をgit cloneして実装を進めていました。
```html
```
いざ調べてみたらこれで良いっぽい。しかしデザインが変わる。。
```html
```
https://bootswatch.com/ は彼ら自身のデザインをカスタマイズしていたことに、しばらくして気づきました。。
{{< tweet user="masutaka" id="595866754200440832" >}}
http://validator.w3.org/ にもお世話になりました。
tdiaryのテーマよ、今までありがとう!
--------------------------------------------------------------------------------
title: "LINE DEVELOPER DAY_2015 Tokyoに行ってきた #linedevday"
date: "2015-05-02"
--------------------------------------------------------------------------------
イベントがあったのが火曜日(4/28)で今日が土曜日(5/2)。寝かせすぎて
発酵するところでした。
[LINE DEVELOPER DAY_2015 Tokyo](http://linedevday.linecorp.com/jp/2015/)
社内のSlackで知り、ノリで応募したら当選してしまいました。社内で4人
応募して全員当選していたので、早い順だったんですかね!?しかし、実
際に行った(もしくは行けた)のは私だけだったという。。
会場に入ってまず思ったのが、寒い!
{{< tweet user="masutaka" id="592861684735287296" >}}
[ハッシュタグにもなっていたようで。](http://togetter.com/li/813955)
お金がかかっておるとも感じました。会場の設備は安っぽくなくて、机や
椅子のキャパシティも十分。ドリンクは飲み放題、クッキーも自由、LINE
グッズのおみやげあり(荷物になるので個人的には不要だったが)。ランチ
の軽食と懇親会(行かなかった)も無料。リクルーティング目的というのも
頷けます。
午前中は4月にCEOになった出澤さんや、CTOの朴さんによる、LINEの概要
や文化のお話でした。午後は会場が2つに別れ、より掘り下げたセッショ
ンが始まりました。
以下は午前中のメモ。
途中、画像へのリンクは
[LINEが開発体制、グローバル対応の秘策、サービス基盤の変遷を解説 - ケータイ Watch](http://k-tai.impress.co.jp/docs/news/20150428_700061.html)
を使わせて頂きました。むしろこちらを見たほうが良いかと。
## A-1 オープニング 代表取締役社長 CEO 出澤 剛
{{< youtube "QWBVp-p8ek4" >}}
## A-2 LINE Global Culture by 上級執行役員 CTO 朴イビン
{{< youtube "TFB4Go7sLsM" >}}
- 開発者が国をまたいでプロジェクトを立ち上げる。跨がない場合もある
- リモートコラボレーション
- Trust and Respect
- マネージャーの役割は働きやすい環境を作ることだけ。評価は他のエンジニアから
## A-3 LINE Messenger for the World by 上級執行役員 サービス開発担当 池邉智洋
{{< youtube "0EErIaZaCV4" >}}
- エンジニアがLINE遠征隊として、実際に現地に赴く
- 現地の人と同じプリペイド携帯を手に入れるところから始める
- エスカレーターを上下したり、地下鉄や飛行機とかの移動中のテストをしたり
- 日本は回線が太いので、あまり対策はしていないそう
- 回線が細い地域は画像のサイズを小さくするなど、パフォーマンスチューニングしている
- あとは、ユーザーがメッセージを送ろうかなとする前に、データをサーバに送ってUXを向上させるとか
## A-4 LINE Platform Development Chronicle by Tom.T
{{< youtube "ER6QQAia36s" >}}
スライド資料はこちら → [LINE Platform Development Chronicle](http://www.slideshare.net/linecorp/a-4-47983116)
- 2011年6月にリリース。開発期間は2ヶ月。初めは文字や絵文字を送れる程度で、スタンプはなし
- [最初は非常にシンプルな構成](http://k-tai.impress.co.jp/img/ktw/docs/700/061/html/ldc061.jpg.html)
- [ポーリング→Pushの遅延、無駄なrequest-response](http://k-tai.impress.co.jp/img/ktw/docs/700/061/html/ldc064.jpg.html)
- [long polling](http://k-tai.impress.co.jp/img/ktw/docs/700/061/html/ldc065.jpg.html)を行うために、[ApacheをNginx+拡張モジュールに置き換えた](http://k-tai.impress.co.jp/img/ktw/docs/700/061/html/ldc066.jpg.html)
- [セグフォ地獄から脱却するためにさらにErlangに置き換えた](http://k-tai.impress.co.jp/img/ktw/docs/700/061/html/ldc071.jpg.html)
- Monolithicをmicro serviceに置き換えることで、新しい人が入ってもすぐ開発できるようにした
- 組織図や会社をまたぐアドホックなチームを構成
- 短期間でイテレーションを回し、終わったら縮小または解散
- http://togetter.com/li/813977
ランチはおにぎりかサンドイッチを選べました。サンドイッチにすれば良
かったと後悔。
{{< tweet user="masutaka" id="592897112200847362" >}}
以下が午後。メモが少なくなってきました。
## A-5 HBaseとRedisを使った100億超/日 メッセージを処理するLINEのストレージ by Shunsuke.N
{{< youtube "1XPrNfZFJOU" >}}
スライド資料はこちら → [HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ](http://www.slideshare.net/linecorp/a-5-47983106)
- RedisとHBaseはzookeeperで管理
- RedHand(Redis monitoring tool)
- データセンターも当然自前
- 監視ツールも自前なようで、Bootstrap的な画面が多かった
- http://togetter.com/li/814003
## B-3 グローバルなネットワーク環境と複数OSに対応するためのLINE Game Client Platform 開発戦略 by Heejun.K
{{< youtube "6nWRB5Qmdws" >}}
スライド資料はこちら → [グローバルなネットワーク環境と複数OSに対応するための LINE Game Client Platform 開発戦略](http://www.slideshare.net/linecorp/b-3-47983062)
- 事例が多かった
- 3G環境でのWarmUp処理。4Gとかで通信環境が良ければ問題ない
- http://togetter.com/li/814014
## B-4 テレビ東京 meets LINE ビジネスコネクト by 佐藤暢晃
{{< youtube "gvzBoMZkbCU" >}}
スライド資料はこちら → [テレビ東京 meets LINE ビジネスコネクト](http://www.slideshare.net/linecorp/b-4-47983051)
- 敢えてビジネスよりのセッションを選択。なかなか面白かった
- 佐藤暢晃さんは今回唯一のゲスト。テレビ東京コミュニケーションズの方
- 技術的な単語がポンポン出てきてやりおる..と思ったら、シニアマネージャー兼エンジニアとのこと
- オファーから放送まではたったの6週間
- 1100万/75minスタンプ
- テレビでの失敗はやり直しできないため、サーバを25台(?)とか準備したが、結果的に2台でも大丈夫だった
- 逆にLINE側の負荷が高く、スタンプの処理に5時間ほどかかった。これはLINEは初めての経験
- LINEビジネスコネクトのドキュメントは英語だけで、クローズドなAPIなので当然ググれもしなかった
- LINEビジネスコネクトは1リクエストに複数(30とか)含められるそう
- Serf: 100台でも2秒ほどで浸透
## B-5 ビッグデータを活用するための分析プラットフォーム 〜データ集計した先に求められる分析技術〜 by Taiichi.H
{{< youtube "jHK-OkrzjpQ" >}}
スライド資料はこちら → [ビッグデータを活用するための分析プラットフォーム 〜データ集計した先に求められる分析技術〜](http://www.slideshare.net/linecorp/b-5-47983050)
- 集約、可視化、分析。自分も思っていたことを明言してくれた
- KPIが増えると忙しくなって見なくなるから、KPIを通知してくれるKPIモニタリングシステムを開発中
- そのKPIモニタリングシステムは異常があると通知。Spark + Kafkaで絶賛開発中。もう少しで運用開始
- http://togetter.com/li/814047
## B-6 ベイズ推定とDeep Learningを使用したレコメンドエンジン開発 by Jun.N
{{< youtube "TbT3teQNNVU" >}}
スライド資料はこちら → [ベイズ推定とDeep Learningを使用したレコメンドエンジン開発](http://www.slideshare.net/linecorp/b-6-47983042)
- スタンプ多すぎてレコメンドできない問題を解決するお話
- 数式多め
- 実装はHiveとMongoDB
- アイテムの類似性を軸としたレコメンデーション
- コールドスタート問題(新規スタンプ、新規ユーザ)は画像の類似度に基づくレコメンデーションで解決
## A-10 座談会 by スピーカーのみなさん
- ゆるゆるふわふわな座談会でした
途中思ったこと。舞台裏を知りたかった(野次馬根性です)。
{{< tweet user="masutaka" id="592942043883671552" >}}
丸1日のイベントでしたが、運営がしっかりしていたせいか疲労感は少な
かったと思います。個人的には満足できたイベントでした。
**追記(2015-05-17):**
動画とスライド資料をこの記事にもマージしました。
[LINE DEVELOPER DAY 2015 Tokyo 動画と資料を公開 « LINE Engineers' Blog](http://developers.linecorp.com/blog/ja/?p=3523)
--------------------------------------------------------------------------------
title: "helm-hatena-bookmark.el に神対応を入れた"
date: "2015-04-19"
--------------------------------------------------------------------------------
はてブを使っている Emacs ユーザに朗報です!
今まで ~/.hatenabookmark を作るために http://coderepos.org/share/browser/lang/shellscript/misc/anything-hatena-bookmark-get-dump を手動実行したり crontab に登録する必要がありましたが、この度不要になりました。
~/.emacs.d/init.el に以下の設定をするだけで ~/.hatenabookmark を自動更新してくれます。デフォルトでは1時間に1回更新します。
```elisp
(setq helm-hatena-bookmark:username "Your Hatena Account")
(helm-hatena-bookmark:initialize)
```
使用方法は今までどおり M-x helm-hatena-bookmark です。私は `⌘-b` に割り当てています。
```elisp
(define-key global-map (kbd "s-b") 'helm-hatena-bookmark)
```
すでに MELPA にもリリースされているので、M-x package-install helm-hatena-bookmark でインストールできます。
あと、これとは別に[コマンド実行したらすぐ一覧を出す](https://github.com/masutaka/emacs-helm-hatena-bookmark/commit/82f36f84800fa1a9a2710296ab95004890ed5303)ようにしました。

今まで不便だと感じつつ使っていて、あ、自分が作ったツールだから直せばいいのか!と気づきましたw
あまりユーザはいないようなので、カスタマイズ可能にはせず、ばっさり切り捨てました。必要なら変更しますので Issue や Pull request などお願いします。
{{< github_repo "masutaka/emacs-helm-hatena-bookmark" >}}
~/.hatenabookmark の作成は今までのシェルスクリプトとほぼ同じです。
内部で curl を start-process で非同期実行し、sentinel で終了通知が来たら GNU sed で置換しています。高速化のために外部コマンドを使うことにしました。
私のはてブ数 6030 の場合、curl が約 30 秒、sed が約 0.5 秒でした。sed での call-process-region が速いのが意外でした。curl は非同期で動くので、60 秒とかに増えても気にならないと思います。
sed の特殊な文法を使っているので、OSX の sed では使えません(見つからないと `(helm-hatena-bookmark:initialize)` がエラーで止まります)。
brew 等で GNU sed をインストールしてください。
```console
$ brew install gnu-sed
```
良い実装が出来て満足。
--------------------------------------------------------------------------------
title: "helm-bundle-show.elを作ったら、またEmacsから離れられなくなった"
date: "2015-04-13"
--------------------------------------------------------------------------------
[bundleしてるgemにcdする。pecoで絞り込みつつ - Qiita](http://qiita.com/hoshino/items/d2f7fe223d0b37214408)
Emacsでも同じことがやりたかったので、helm-bundle-show.elを作りまし
た。絶対誰か作っているだろ!と思って探したけどありませんでした。
{{< github_repo "masutaka/emacs-helm-bundle-show" >}}

[MELPAにも取り込まれた](https://github.com/milkypostman/melpa/pull/2671)ので、M-x package-install helm-bundle-showで
インストールできます。
私は "C-x y" に割り当てました。便利!
```elisp
(define-key ctl-x-map (kbd "y") 'helm-bundle-show)
```
パッケージ名をhelm-bundlerにするか、helm-bundle-showにするか悩みま
した。helm-bundlerだと責務が大きくなりそうなので、helm-bundle-show
にしました。
ちなみにzshの関数はこんなのを作りました。awkでprint以外使ったの初
めてかも。
```
function peco_bundle_show() {
local selected_dir=$(bundle show | awk 'NR>1 {print $2}' | peco | xargs bundle show)
if [ -n "$selected_dir" ]; then
BUFFER="cd ${selected_dir}"
zle accept-line
fi
zle clear-screen
}
zle -N peco_bundle_show
bindkey '^xy' peco_bundle_show
```
--------------------------------------------------------------------------------
title: "Emacs-24.5 on OSX Yosemiteのビルド手順詳細"
date: "2015-04-12"
--------------------------------------------------------------------------------
[Emacs-24.5がリリースされたので](http://thread.gmane.org/gmane.emacs.devel/185268)、さっそくビルドしました。
{{< post "2014-10-25-1" >}}の手順と同じです。
/usr/includeがないとビルドに失敗するので、
`$ xcode-select --install`でCommand Line Toolsをインストールしてからね。
```
$ curl -LO http://ftp.gnu.org/pub/gnu/emacs/emacs-24.5.tar.xz
$ curl -LO ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-24.5-mac-5.9.tar.gz
$ tar xfJ emacs-24.5.tar.xz
$ tar xfz emacs-24.5-mac-5.9.tar.gz
$ cd emacs-24.5
$ patch -p 1 < ../emacs-24.5-mac-5.9/patch-mac
$ cp -r ../emacs-24.5-mac-5.9/mac mac
$ cp ../emacs-24.5-mac-5.9/src/* src
$ cp ../emacs-24.5-mac-5.9/lisp/term/mac-win.el lisp/term
$ \cp nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns mac/Emacs.app/Contents/Resources/Emacs.icns
$ ./configure --prefix=$HOME/opt/emacs-24.5 --with-mac --without-x
$ make
$ make GZIP_PROG='' install # *.elを圧縮したくないので
$ cp -r mac/Emacs.app ~/Applications
```
emacs-mac patchの配布元は従来通り
ftp://ftp.math.s.chiba-u.ac.jp/emacs/ ですが、
公式のGitリポジトリが出来ました。
http://www.math.s.chiba-u.ac.jp/~mituharu/emacs-mac.git
これにより非公式に配布していた
https://github.com/railwaycat/emacs-mac-port が
その役目を終えました。お疲れ様でした。
参考記事: {{< post id="2015-01-04-1" title="OSXのEmacsにインラインパッチなんていらなかったんや..." >}}
**追記(2015-04-13):**
emacs-mac patch当ててると⌘-Ctrl-dで辞書引くショートカットキー使え
るのね。

**追記(2015-05-24):**
emacs-24.5-mac-5.8パッチが出ていたので、記事を書き換えました。
**追記(2015-08-09):**
emacs-24.5-mac-5.9パッチが出ていたので、記事を書き換えました。
mac-application-stateという新しい関数が追加されたほか、バグ修正が
されています。
--------------------------------------------------------------------------------
title: "『Web API: The Good Parts』を読んだ"
date: "2015-04-09"
--------------------------------------------------------------------------------
{{< amazon asin="4873116864" title="Web API: The Good Parts" >}}
200ページの中によくまとまってました。後半は密度濃かったです。
- 4章のHTTP Statusでの筆者の見解が良かった。ぶっちゃけ何使えばよいのよ的な
- GitHubやTwitter、Facebookなど事例が豊富
- セキュリティ対策が詳しい
最近はバックエンドはクローズドなAPIを提供し、フロントエンドを別途
実装するパターンが増えているので、APIを実装する機会も増えてきまし
た。そういう意味でも読んで良かったなあと思いました。
--------------------------------------------------------------------------------
title: "『夕凪の街 桜の国』が漫画も映画版も素晴らしかった"
date: "2015-04-09"
--------------------------------------------------------------------------------
ちょっと前にKindleで漫画を読んで感動したので、DVDで映画版も見てみた。
{{< tweet user="masutaka" id="551539176319881216" >}}
映画版が漫画をうまく補完していて、なんというか見入ってしまった。
たいがい原作から映画が作られるパターンはがっかりする。それで後で映
像化に意味があっただとか、こういう解釈もありだとか理由をつけて自分
を納得させるんだけど、今回は全くそれがなかった。
キャスティングも良かった。
{{< wikipedia word="麻生久美子" text="麻生久美子" >}}さんと{{< wikipedia word="田中麗奈" text="田中麗奈" >}}さんがイメージにピッタリで感心してしまった。
{{< wikipedia word="中越典子" text="中越典子" >}}さんもフワフワした感じが合っていた。{{< wikipedia word="堺正章" text="堺正章" >}}さんはミスキャス
トだったけど頑張っていた(何様?)w
残念だったのは子役または青年と、大人の役者が似てなさすぎが多かった
こと。逆に太田京花役の{{< wikipedia word="小池里奈" text="小池里奈" >}}さんと{{< wikipedia word="粟田麗" text="粟田麗" >}}さんは、似すぎてて気付か
なかった。あとで調べて気づいた。マジか。
エキストラの動きがなんかぎこちなかったのも気になった。
でもまあそれくらい。いい映画です。また見よう。
P.S.
麻生さんいいですね〜
なにげにこのブログでも『モテキ』の{{< post "2013-01-27-1" >}}で褒めてるw
{{< amazon asin="4575297445" title="夕凪の街 桜の国 (アクションコミックス)" >}}
{{< amazon asin="B0012BLS02" title="夕凪の街 桜の国 [DVD]" >}}
--------------------------------------------------------------------------------
title: "GitHub markdown previewer octodownをEmacsから使う"
date: "2015-04-05"
--------------------------------------------------------------------------------
今までレンダリング結果を確認するために、適当なGitHubのリポジトリの
README.mdを開いて編集して確認。ということをやっておりました。。
[GitHubのREADMEをローカルで確認する。octodownをインストール。 - 気の向くままに書き綴る](http://koudaiii.hatenablog.com/entry/2015/02/01/201825)
2ヶ月前のこちらの記事が気になっていたので、ズビっと設定してみました。
予め、[markdown-mode](https://melpa.org/#/markdown-mode)をpackage.el等からインストールしておきます。
あとは前述の記事を参考にoctodownコマンドをインストールし、以下
を~/.emacs.d/init.elに追加すればOKです。
```elisp
(defun octodown ()
(interactive)
(shell-command (format "octodown %s" (buffer-file-name))))
(with-eval-after-load "markdown-mode"
(define-key markdown-mode-map (kbd "C-c C-c C-c") 'octodown))
```
markdownファイルを開いて、C-c C-c C-cすればChromeとかに開いてくれます。
またEmacsが便利になってしまった。。。
--------------------------------------------------------------------------------
title: "通知サービスPushoverがなかなか便利"
date: "2015-03-08"
--------------------------------------------------------------------------------
{{< figure src="/images/pushover-logo.png" link="https://pushover.net/" target="_blank" rel="noopener" alt="画像" >}}
何年も前から[im.kayac.com](http://im.kayac.com/)を使ってきましたが、時々通知が来なくなるの
で(アプリを再起動すれば直る)、[Pushover](https://pushover.net/)に乗り換えました。1ヶ月ほど
使っていますが、なかなか良いです。
※ [im.kayac.comは2009年11月18日以来更新がないようです。](https://itunes.apple.com/jp/app/im.kayac.com-free-edition/id336129317)
iPhoneアプリの画面はこのような感じです。

CircleCIは後述のGemで通知しています。
TwitterはHerokuで動かしている29hours{{< post "2013-04-14-2" >}}経由で通知してい
ます。29hoursはデフォルトでPushoverに対応しているので、
settings.ymlを変更しただけです。
im.kayac.comに出来ることはひととおり出来ました。さらに以下の機能があります。
- プライオリティ(low,normal,high,emergency)を指定できる
- emergencyの時は、Acknowledgeするまで60秒ごと24時間通知し続けることも可能
- 通知しない時間帯を指定できる
- 通知ごとにサウンドを切り替えられる
- デバイス(iPhone,Android,Desktop)を登録でき、指定したデバイスのみに通知可能
- グループやユーザを登録でき、通知先に指定可能
- 利用状況をグラフで確認できる
唯一、Tiarraからの通知はできなくなりましたが、最近IRCは使ってない
ので割り切りました。
アプリは無料で5日間制限なく使えます。それ以降は1度だけ500円支払え
ば同様に使えます。Desktop版はさらに$4.99 USDの課金が発生します。
Gemもあるので、結構お手軽に使えました。
{{< ruby_gems "pushover" >}}
## このブログの記事がデプロイされた時に結果を通知するCapistranoのタスク
{{< post "2015-01-15-1" >}}の改良版にあたります。
このブログはGitHubで管理していて、masterにcommitすると、CircleCIが
自動でデプロイします。その結果を通知してくれるCapistranoのタスクに
なります。
{{< gist "masutaka" "15aae08bc5ea071ac450" >}}

## このサーバのCook&serverspecの結果を通知するcircle.ymlの設定とRakeタスク
{{< post "2015-02-08-2" >}}の改良版にあたります。
このサーバのChefレシピもGitHubで管理していて、masterにcommitすると、
CircleCIがmasutaka.netをCookした後Serverspecを自動実行します。その
結果を通知してくれるRakeタスクと、呼び元のcircle.ymlになります。
{{< gist "masutaka" "f7ce8b3c71e995c20e48" >}}

## 最後に注意事項
アプリをインストールするとUser Keyが作られますが、これは使わないほ
うが良さそうです。作り直し出来ないようなので、漏洩した時面倒な自体
になりそうです。グループを作り自分を所属させ、Group Keyを使うと良
いと思います。
--------------------------------------------------------------------------------
title: "継続的 bundle update を簡単に導入できる Gem を作った"
date: "2015-03-03"
--------------------------------------------------------------------------------
## Gem を作った
{{< post "2015-01-25-1" >}}のバージョンアップ。
個人、会社含めて、複数リポジトリで継続的 bundle update を始めて一ヶ月。汎用コードを Gem に外出ししました。
{{< ruby_gems "circleci-bundle-update-pr" >}}
circle.yml で完結できるのでなかなか良さげです。ただし {{< post "2015-01-25-1" >}} のスクリプト部分を Gem 化しただけで、テストもなく、名前が安直です。でもとりあえず動いています。
変更前後をご覧になると分かりますが、deployment で circleci-bundle-update-pr を呼ぶだけで良くなりました。
- 変更前
- https://gist.github.com/masutaka/d9bf91e22567753fe76b
- 変更後
- https://gist.github.com/masutaka/8a01fe50e3917ca0b6d8
[compare_linker](https://rubygems.org/gems/compare_linker) とも依存を付けたので、できるだけ diff へのリンクを貼ってくれます。

トリガーは {{< post "2015-01-25-1" >}} で紹介した ci-build-trigger をどうぞ。Heroku ボタンで簡単に設置できます。
{{< github_repo "masutaka/ci-build-trigger" >}}
継続的 bundle update を始めて良いことだらけです。まずは小さなプロジェクトから始めてみてはいかがでしょうか?
- 一週間でもそこそこ更新があることが分かる
- でもそんなに多くないから、気になった Gem の diff は読む気になる
- 思っていたよりテスト通らない。でも小さいからすぐ直せる
- 無意識だった bundle update しなくちゃという心理的負担がなくなった
## おまけ1
[circleci-bundle-update-pr で compare_linker を使う](https://github.com/masutaka/circleci-bundle-update-pr/blob/2ed780701f6542fe565e1d2035049856e2e517ed/lib/circleci/bundle/update/pr.rb#L47-L59)ため、{{< twitter "kyanny" >}} さんから compare_linker のリリース許可を頂きました。[kyanny/compare_linker#31](https://github.com/kyanny/compare_linker/issues/31) にそのやりとりが残されています。
※ gemspec で依存を付ける Gem の source は github や git が使えなかったのですね。今回初めて知りました。よく考えれば当たり前か。
## おまけ2
circle.yml で test.override の途中などで抜けたいときは return でなくて、exit します。サーバの CI ではもっとロジックが多くて、以下のようなコードがたくさん並びます。ださいけど今は仕方がない。
```yaml
override:
- |
if [ -n "${BUNDLE_UPDATE}" ]; then
exit 0
fi
bundle exec rake spec:ec2
```
## 追記(2015-08-29):
保存版の記事 {{< post "2015-07-28-1" >}} を書きました。
--------------------------------------------------------------------------------
title: "『Webエンジニアが知っておきたいインフラの基本』を読んだ"
date: "2015-03-02"
--------------------------------------------------------------------------------
{{< amazon asin="4839953554" title="Webエンジニアが知っておきたいインフラの基本" >}}
長らく会社で借りていた本を読了した。
インフラエンジニアの教本にはもちろん、アプリエンジニアもためになる
内容。
> 休憩を勧めても「大丈夫」「休憩不要」と言うことがありますが、それ
> こそがもう大丈夫ではなくなっているサインなので無理やり休憩を取ら
> せましょう。
大障害時のこの心構えはあるあるだけど、本に書いてあることは素晴らしい。
最終章は筆者曰く「本章に書いてあることがひと通り実践できるようにな
れば、チューニング大会でも確実に上位を狙えますよ」とのこと。
--------------------------------------------------------------------------------
title: "WEB+DB PRESS Vol.82の「はじめてのGO」を実際に書いて動かした"
date: "2015-02-11"
--------------------------------------------------------------------------------
[WEB+DB PRESS Vol.82|技術評論社](http://gihyo.jp/magazine/wdpress/archive/2014/vol82)
記事は非常にわかりやすく、[A Tour of Go](http://go-tour-jp.appspot.com)の途中で挫折した私でも大丈夫でした。GOとCは結構似ているので、C経験者にもオススメです。
GOは必要最小限の機能しか用意されていない点が好きです。~~最近Rubyの高機能さにゲップが出るので。~~ ちょっとGOで何か作ってみようかな。
そういえば一度この記事のコードも試したのですよね。良い復習になりました。
[「今日から始める Go言語 と appengine」というテーマで社内勉強会をしました|feedforce Engineers' blog](http://tech.feedforce.jp/start-go-and-appengine.html)
Emacsの開発環境は「[Goプログラミングの環境構築 - Emacs JP](http://emacs-jp.github.io/programming/golang.html)」を参考にgo-mode, go-autocomplete, go-eldocを入れたところ、非常に快適になりました。機能としてはIDEと遜色ないんじゃないかな?
- C-c C-aでパッケージのimport文を簡単に追加できる。補完も効く
- importしたパッケージに含まれる関数名の動的補完
- 補完した関数の型情報をミニバッファに表示
- M-.でfmt.Println等の組み込み関数の定義元にジャンプ
- ファイルの保存時に、自動的にgofmtコマンドで整形
加えて、open-junk-fileで書き捨てのファイルを作ってコードを書き、quickrunで即時実行する感じで進めていきました(意外にボリュームがあり、時間はかかりましたが..)。
init.elはこんな設定にしました。タブ幅はEmacsデフォルトの8だと見づらいので4に変更。
```elisp
(with-eval-after-load "go-mode"
(require 'go-autocomplete)
(defun go-mode-hook-func ()
(setq tab-width 4)
(go-eldoc-setup))
(add-hook 'go-mode-hook 'go-mode-hook-func)
(define-key go-mode-map (kbd "M-.") 'godef-jump)
(define-key go-mode-map (kbd "M-,") 'pop-tag-mark))
(add-hook 'before-save-hook 'gofmt-before-save)
```
GO++
{{< amazon asin="4774166278" title="WEB+DB PRESS Vol.82" >}}
--------------------------------------------------------------------------------
title: "サーバのCIをWerckerからCircleCIに移行した"
date: "2015-02-08"
--------------------------------------------------------------------------------
{{< figure src="/images/circleci-logo.png" link="https://circleci.com/" target="_blank" rel="noopener" alt="画像" >}}
{{< post "2014-01-09-1" >}}からWerckerを使い始めて1年とちょっと。このたび
CircleCIに移行しました。理由は以下のとおり。
- 会社のJenkinsが壊れてCircleCIを使い始めた。2つ覚えているのが面倒
- {{< post "2015-01-25-1" >}}の継続的bundle updateをやりたい(WerckerはAPIがないっぽい)
- {{< post "2014-01-09-1" >}}当時と違いCircleCIは1コンテナまで無料になった
Werckerは自分のBoxを簡単に作れたのが良かったんですけどね。
([masutaka/wercker-box-rvm-vagrant-aws](https://github.com/masutaka/wercker-box-rvm-vagrant-aws)の更新は停止します。)
特殊なことはしていないので、Vagrantfileとcircle.ymlを晒すだけにし
ておきます。
{{< gist "masutaka" "2adfc24c8c220be292ea" >}}
CircleCIはコンテナにsshログイン出来るのは良いけど、EC2インスタンス
が起動されてそのままになるような。。。さっさとDockerに移行しないと。
--------------------------------------------------------------------------------
title: "bundle updateを定期実行した時、更新されたGemのDiffも分かるようにした"
date: "2015-02-08"
--------------------------------------------------------------------------------
[feedforce/tech.feedforce.jp#55](https://github.com/feedforce/tech.feedforce.jp/pull/55)で、[tachikoma.io](http://tachikoma.io/)の中の人とこんなやりとりが。
{{< figure src="/images/tachikoma-compare-linker.png" link="https://github.com/feedforce/tech.feedforce.jp/pull/55#issuecomment-73000823" target="_blank" rel="noopener" alt="画像" >}}
早速{{< post "2015-01-25-1" >}}に実装した継続的bundle updateで、compare linker
を使ってみました(残念ながらこの例ではdiffはGitHubのリンクになりませんでした)。

{{< post "2015-01-25-1" >}}のGemfileとcreate_pull_request.rbを以下に置換すればOKです。
{{< gist "masutaka" "fb52ffbc608267abc2a5" >}}
See also
[Speaker としての #rubykaigi 2014 を終えて - @kyanny's blog](http://blog.kyanny.me/entry/2014/09/22/132359)
P.S.
何か理由があってrubygems.orgにアップロードされてないのかな?
--------------------------------------------------------------------------------
title: "CircleCI を使って bundle update を定期実行する Heroku アプリを作った"
date: "2015-01-25"
--------------------------------------------------------------------------------
[CircleCIを使ってbundle updateを定期実行する - Qiita](http://qiita.com/yuku_t/items/0f8e48771822420d3ffa)
こちらの「1. CircleCIを起動する」のシェルスクリプトを Ruby スクリプトにしてみました。Heroku ボタンで簡単に設置できます。
{{< github_repo "masutaka/ci-build-trigger" >}}
## ci-build-trigger の解説
やっていることは単純で、build_parameters に `{BUNDLE_UPDATE: true}` を指定して、CircleCI のビルドを実行しているだけです。BUNDLE_UPDATE は後述する circle.yml で参照します。
Heroku ボタンをクリックしたら、App Name や Env を設定してください。
CIRCLECI_TOKEN Env は、CircleCI の Project Settings -> API Permissions から Scope が all な token を作成します。
EXEC_DAYS Env は実行する曜日です。Heroku Scheduler は実行間隔を「Daily」「Hourly」「Every 10 minutes」からしか選べません。さすがに毎日の bundle update は必要ないので、「Daily」を選択しつつスクリプトの中でこの環境変数を参照するようにしました。
カンマ区切りで 1 つまたは複数の曜日を指定することが出来ます。指定がなければ毎日 CircleCI をビルドします。
> Sun
> Mon,Wed,Fri
あとは Heroku Scheduler を設定するだけで、CircleCI のビルドを自動実行できます。
## CircleCIの設定
前述の記事に書いてあるとおりですが、circle.yml の中で、BUNDLE_UPDATE が true の時だけ処理が切り替わるようにしました。
{{< post "2015-01-15-1" >}} の circle.yml はこのように変わりました。
{{< gist "masutaka" "d9bf91e22567753fe76b" >}}
※ circle.yml の pre, override, post はよく忘れるので、リンクを張っておきます。
https://circleci.com/docs/configuration
あとは[ここで GitHub の token を作成](https://github.com/settings/tokens)し、CircleCI の Project Setting -> Environment variables に GITHUB_ACCESS_TOKEN という名前で追加するだけです。
## まとめ
CircleCI を起動する Ruby スクリプトを作成し、Heroku Button でインストール可能にしました。bundle update が必要な数だけ Heroku アプリを作成し、必要なくなったら捨てれば良いので、メンテナンスコストが少なく済みます。
## 追記(2015-01-25):
https://github.com/masutaka/ci-build-trigger 自体の bundle update は http://tachikoma.io を使うことにしました。外部サービス使えたら使うに越したことはないですよね。
--------------------------------------------------------------------------------
title: "GitHubにpushしたらCircleCIが自動デプロイしてim.kayacに通知する"
date: "2015-01-15"
--------------------------------------------------------------------------------
{{< figure src="/images/circleci-logo.png" link="https://circleci.com/" target="_blank" rel="noopener" alt="画像" >}}
{{< post "2015-01-13-1" >}}でデプロイ時に[chalow](http://chalow.org/)が実行されるようになったので、
GitHubへのPushをトリガーにして自動デプロイを実装してみました。
文字で分かりづらいですが、よくある自動デプロイと同じです。(chalow
でここまでやっている人はいるのかな?)
1. GitHubのmasterへのマージをトリガーにして、CircleCIが自動デプロイ開始
2. CircleCIがGitHubの最新のソースを取得(a)
3. テスト実行(chalowを実行するだけ)
4. capistranoでデプロイ開始。masutaka.netにsshでログインする(b)
5. masutaka.netの中でGitHubの最新のソースを取得(c)
6. index.html等、静的コンテンツを配置
7. chalowを実行して/chalow以下の静的コンテンツを配置
8. IRC -> tiarra(-> Auto::Im) -> im.kayacという流れで手元のiPhoneに通知
sshの鍵が3つ必要でした
(a) CircleCIとGitHub連携時に自動生成される
(b) CircleCIのProject settings -> Permissions -> Checkout SSH keysから生成する。(a)もここで確認可能
(c) ローカルでssh-keygenコマンドを実行して生成して、Project settings -> Permissions -> SSH Permissionsに登録
(c)は普段使っているsshの鍵でも動きますが、CircleCIに秘密鍵を渡した
くなかったので、新規に作りました。
circle.ymlとその中で使われるシェルスクリプトはこんな感じです。
YAMLだけで書けないのかな。。
{{< gist "masutaka" "6ad697b7ffb2fcf960c4" >}}
8はCircleCIのIRC連携です(Project setting -> Notifications -> Chat Notifications)。
適当なUsernameを入れないとエラーになってしまいました。

iPhoneのim.kayac.comへの通知はこんな感じ。

LimeChatにはこのように通知されます。

--------------------------------------------------------------------------------
title: "このブログをデプロイする時にchalowも実行するようにした"
date: "2015-01-13"
--------------------------------------------------------------------------------
{{< post "2014-05-03-1" >}}のバージョンアップ。
http://masutaka.net はcapistranoでデプロイしてますが、
http://masutaka.net/chalow はchalow+rsyncを実行する
mkchalow{{< post "2009-06-14-3" >}}というコマンドでアップロードしてました。
ローカルのChangeLogメモをchalowで変換しrsyncするので、自分の
MacBook Airと会社のMac miniの複数環境でブログを書くと、過去記事が
消える可能性が出てきます。
そういうのを気をつけるのが面倒なので、capistranoでのデプロイ時に
chalowコマンドも実行するようにしました。
以下はcapistranoの設定ファイルです。melodyはVagrantのVMです。
{{< gist "masutaka" "d2b4d80deda49fdfb9eb" >}}
{{< post "2009-06-14-3" >}}に作ったEmacsのmkchalow()もcap-deploy()として
新たに生まれ変わりました。ChangeLogメモを開いた状態でC-cC-cすると
デプロイ出来ます。
{{< gist "masutaka" "e284b1ff5d1df7529d83" >}}
default-directoryの最後に/(slash)を付けないと、実行ディレクトリ
が~/src/github.com/masutakaになる問題にハマりました。
[start-process()でencode_current_directory()からカレントディレクト
リを求めており](http://git.savannah.gnu.org/cgit/emacs.git/tree/src/process.c?h=emacs-24&id=83bad90efe943e7c88431b7a71bc1d5cf1304c92#n1421)、その中で[Funhandled_file_name_directory()を使ってい
る](http://git.savannah.gnu.org/cgit/emacs.git/tree/src/callproc.c?h=emacs-24&id=83bad90efe943e7c88431b7a71bc1d5cf1304c92#n144)ためのようです。
Funhandled_file_name_directory()はelispのfile-name-directory()と等
価です。
UNIX上のEmacsではディレクトリ名の最後には/(slash)を付けたほうが良
いかもしれません。
> http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Expansion.html
>
> The value is always a string ending with a slash.
>
> default-directory
> ⇒ "/user/lewis/manual/"
--------------------------------------------------------------------------------
title: "WERCKER-BOX-RVM-VAGRANT-AWS v1.2.0 released"
date: "2015-01-11"
--------------------------------------------------------------------------------
[WERCKER-BOX-RVM-VAGRANT-AWS - wercker](https://app.wercker.com/#applications/5416b50b0e62dfcb48002254/tab/details)
Vagrant-1.7.2に対応しました。
[Vagrant-1.7.1で必要になったworkaroundを削除出来ました。](https://github.com/masutaka/wercker-box-rvm-vagrant-aws/commit/adc80b34d80732d476b26642331da83d209724e2)
[CHANGELOG](https://github.com/mitchellh/vagrant/blob/master/CHANGELOG.md#172-january-6-2015)のこれが相当するのかな
> installer: SSL cert bundle contains 1024-bit keys, fixing SSL verification for a lot of sites.
会社のJenkinsマシンに入れているVagrantもバージョンアップしよう。
--------------------------------------------------------------------------------
title: "Herokuにberkshelf-apiサーバを立ててみた"
date: "2015-01-11"
--------------------------------------------------------------------------------
前回{{< post "2015-01-09-1" >}}はBerksfileにGitリポジトリを直接書きましたが、レ
シピの依存関係の解決ができませんでした。
berkshelf-apiサーバを立てるとその問題が解消されるようなので、
Herokuにberkshelf-apiサーバを立てて検証してみました。
[適当なOrganizationを作り](https://github.com/doramichan)
>$ berks cookbook git .
などで作ったcookbookを用意します。gitのtagを振る必要がある点は注意です。
https://github.com/doramichan/git/releases
https://github.com/doramichan/hub/releases
berksコマンドは
>$ gem install berkshelf
などでインストールできます。
[hubレシピはgitレシピに依存させた](https://github.com/doramichan/hub/blob/master/metadata.rb)ため、Berksfileに
>cookbook 'hub'
と書けばgitレシピもインストールされるはずです。
※適当なレシピなので動作は保証しません。
次にapiサーバを用意します。[Heroku stackがcedar-14だと動かなかった](https://github.com/berkshelf/api.berkshelf.com/pull/4)
のでcedarに変更しています。LD_LIBRARY_PATHの追加は[README.md](https://github.com/berkshelf/api.berkshelf.com/blob/master/README.md)の説明
のとおりです。
```
$ git clone git@github.com:berkshelf/api.berkshelf.com.git
$ cd api.berkshelf.com
$ heroku create -s cedar masutaka-api-berkshelf
$ heroku config:add LD_LIBRARY_PATH=/app/vendor/libarchive-3.1/lib
$ git push heroku master
```
続けてconfig.jsonを追加し、先ほどのdoramichan Organizationを参照さ
せます。
```
{
"endpoints": [
{
"type": "github",
"options": {
"organization": "doramichan",
"access_token": "YOUR GITHUB ACCESS TOKEN",
"api_endpoint": "https://api.github.com",
"web_endpoint": "https://github.com",
"ssl_verify": true
}
}
],
"build_interval": 180.0
}
```
access_tokenは[GitHubのSettings->Applications](https://github.com/settings/applications)から作成したものを指定
します。
build_intervalを指定しているのはデフォルトが5秒でend_point(GitHub)
にアクセスしに行く鬼畜仕様だったためです。180秒に変更しました。
Procfileも修正しcommit、`$ git push heroku master`します。
```
web: bundle exec berks-api -p $PORT -c config.json
```
なんか取れたっぽい!
```
$ curl https://masutaka-api-berkshelf.herokuapp.com/universe | jq .
{
"git": {
"0.1.0": {
"endpoint_priority": 0,
"platforms": {},
"dependencies": {},
"location_type": "github",
"location_path": "https://github.com/doramichan/git"
}
},
"hub": {
"0.2.0": {
"endpoint_priority": 0,
"platforms": {},
"dependencies": {
"git": ">= 0.1.0"
},
"location_type": "github",
"location_path": "https://github.com/doramichan/hub"
},
"0.1.0": {
"endpoint_priority": 0,
"platforms": {},
"dependencies": {
"git": ">= 0.0.0"
},
"location_type": "github",
"location_path": "https://github.com/doramichan/hub"
}
}
}
```
ではBerkshelfを使ってcookbookをインストールしてみましょう。まずは
Gemfileを作成し、`$ bundle install --path vendor/bundle`などで
berkshelfをインストールします。
```
source 'http://rubygems.org/'
ruby '2.2.0'
gem 'berkshelf'
```
次にBerksfileを作成しhubレシピを指定します。前述のとおりgitレシピ
に依存するように作ったため、gitレシピもインストールされるはずです。
```
source 'https://masutaka-api-berkshelf.herokuapp.com'
cookbook 'hub'
```
`$ berks vendor vendor/cookbooks`で無事インストールされました。
```
vendor/cookbooks
├── git
│ ├── Berksfile
│ ├── Gemfile
│ ├── LICENSE
│ ├── README.md
│ ├── Thorfile
│ ├── chefignore
│ ├── metadata.json
│ └── recipes
│ └── default.rb
└── hub
├── Berksfile
├── Gemfile
├── LICENSE
├── README.md
├── Thorfile
├── chefignore
├── metadata.json
└── recipes
└── default.rb
```
chef-soloの場合.chef/knife.rbを以下のように変更すれば
vendor/cookbooks以下のレシピを参照できます。
> cookbook_path ["cookbooks", "site-cookbooks"]
> ↓
> cookbook_path ["cookbooks", "site-cookbooks", "vendor/cookbooks"]
◆解決できたこと
- 前回{{< post "2015-01-09-1" >}}レシピの依存関係を見てくれなかった問題
◆まだ困っていること
- レシピをGitHubのOrganization直下に置く必要があるため、private
repositoryの運用は現実的でない
- berkshelf-apiサーバに認証を付けられるかは調べていない
- cedar-14でも動くようにしないと
◆参考にした記事
[chef - berkshelf-apiで自前のcookbookサーバを立てる - Qiita](http://qiita.com/cazador/items/8d05016c31a48e9c6b0f)
[github:eで管理しているChefのクックブックを、Berkshelf APIサーバーを立てていい感じに依存解決する方法 - (ひ)メモ](http://d.hatena.ne.jp/hirose31/20140714/1405307755)
--------------------------------------------------------------------------------
title: "あるGitリポジトリのサブディレクトリにあるChefレシピを1つだけ取り込む方法"
date: "2015-01-09"
--------------------------------------------------------------------------------
Chef-solo(Knife-solo)とBerkshelfの話。
Berksfileに例えばこうやって書けば使えた。これは有能!
relってサブディレクトリのことだったのか。Gemfileで使ったことなかった。
> cookbook 'nginx', git: 'git@github.com:masutaka/cookbooks.git', rel: 'nginx'
`$ bundle exec berks vendor vendor/cookbooks`を実行すると、
vendor/cookbooks/nginxにインストールされる。
.chef/knife.rbを以下のように変更すると、インストールしたnginxレシ
ピをnodeやroleから参照できる。ちなみにcookbook_pathは後ろから先に
参照される。$PATHの逆。
> cookbook_path ["cookbooks", "site-cookbooks"]
> ↓
> cookbook_path ["cookbooks", "site-cookbooks", "vendor/cookbooks"]
※ .gitignoreに/vendor/cookbooksの追加も忘れずに。
private repositoryの時はこの書式は使えなかった。やり方はあるかもし
れない。
> cookbook 'nginx', github: 'masutaka/cookbooks', rel: 'nginx'
今までは https://github.com/masutaka/cookbooks とかをGitのsub
moduleとしてガッツリ指定していたため、追随するのが大変だった。
cookbooksを変更する人も気を使ったし。
この辺の話に関連する。
[JenkinsでサーバのCIを始めました|feedforce Engineers' blog](http://tech.feedforce.jp/jenkins-server-ci.html)
Berksfileの書き方は公式ドキュメントに書いてある。
http://berkshelf.com/
追記:
依存関係(metadata.rbのdepends)は見てくれなかった。そりゃそうか。
継続調査。
--------------------------------------------------------------------------------
title: "OSXのEmacsにインラインパッチなんていらなかったんや..."
date: "2015-01-04"
--------------------------------------------------------------------------------
今更ながら年末のEmacs Advent Calendarを読んでいたら、「[Emacs Lispの汎変数(とその他) - Qiita](http://qiita.com/kawabata@github/items/9a1a1e211c57a56578d8)」にさらりとmac-auto-ascii-modeの紹介が。
> また、新機能 mac-auto-ascii-mode を有効にすると、ミニバッファにカーソルを移動する際、自動的に英語モードになります。これで日本語入力モードでうっかり M-x shell と入力しようとして M-x しぇっl になるような悲惨な事故をなくすことができます。
[2014-11-21のemacs-devel](http://lists.gnu.org/archive/html/emacs-devel/2014-11/msg01719.html)でアナウンスされていました。
> *** New global minor mode `mac-auto-ascii-mode' for Mac OS X 10.5 and
> later. If enabled, it automatically selects the most-recently-used
> ASCII-capable keyboard input source on some occasions: after prefix
> key (bound in the global keymap) press such as C-x and M-g, and at the
> start of minibuffer input.
> Note: Strictly speaking, its implementation has a timing issue: the
> Lisp event queue may already have some input events that have been
> processed by some previous keyboard input source but yet to be
> processed by the Lisp interpreter.
{{< post "2014-10-25-1" >}}を書いた時はemacs-24.4-mac-5.0.tar.gzだったので、当時ビルドした方はリビルドが必要です。{{< post "2014-10-25-1" >}}の手順は5.2にアップデート済みです。
以下を設定するだけです。
```elisp
(mac-auto-ascii-mode 1)
```
IMEの入力モードを変えることなく、M-x出来ているのが分かるかと思います。少し分かりづらいかな?

残念なのが、ミニバッファから戻ると入力モードがUS固定になること。mac-input-source()とminibuffer-exit-hookあたりで出来るかと思いましたが、うまくいきませんでした。
**追記(2017-01-17):**
{{< twitter "takaxp" >}} さんの記事『[Emacs 25.1 を EMP版で快適に使う - Qiita](http://qiita.com/takaxp/items/a86ee2aacb27c7c3a902)』の "mac-auto-ascii-mode を使うと ASCII固定になる" で回避できました!
同じ記事にあった、入力モードに応じたカーソルの色変更の設定も自分好みに変えつつ追加。
```elisp
(defun mac-selected-keyboard-input-source-change-hook-func ()
;; 入力モードが英語の時はカーソルの色をfirebrickに、日本語の時はblackにする
(set-cursor-color (if (string-match "\\.US$" (mac-input-source))
"firebrick" "black")))
(add-hook 'mac-selected-keyboard-input-source-change-hook
'mac-selected-keyboard-input-source-change-hook-func)
```
hook名が間違っていたので、[編集リクエストを送信済みです。](http://qiita.com/kawabata@github/items/9a1a1e211c57a56578d8/patches/7829)
(誤) selected-keyboard-input-source-change-hook
(正) mac-selected-keyboard-input-source-change-hook
P.S.
このためだけにemacs-develを購読するのもなあ。。
**追記(2015-05-24):**
mac-auto-ascii-modeを有効にすると、C-uが変になることが分かったので私は設定を削除しました。C-u C-cやC-u C-xすると、C-cやC-xに変わってしまう(ミニバッファから分かる)。
**追記(2016-11-24):**
emacs-mac-6.1 パッチでは直っているので、今は mac-auto-ascii-mode を有効にしています。
--------------------------------------------------------------------------------
title: "WERCKER-BOX-RVM-VAGRANT-AWS v1.1.1 released"
date: "2015-01-01"
--------------------------------------------------------------------------------
[WERCKER-BOX-RVM-VAGRANT-AWS - wercker](https://app.wercker.com/#applications/5416b50b0e62dfcb48002254/tab/details)
Ruby-2.2.0に対応しました。
このPRがマージされるのを待ってました。
https://github.com/wercker/box-rvm/pull/9
--------------------------------------------------------------------------------
title: "WERCKER-BOX-RVM-VAGRANT-AWS v1.0.2 released"
date: "2014-12-24"
--------------------------------------------------------------------------------
[WERCKER-BOX-RVM-VAGRANT-AWS - wercker](https://app.wercker.com/#applications/5416b50b0e62dfcb48002254/tab/details)
Vagrantを最新の1.7.1にしました。
メジャーバージョンも思い切って'1'に上げました。
今のvagrant-aws(v0.6.0)とUbuntu-12.04の組み合わせだとvagrant
(up|destroy)に失敗しますが、うまく対策出来たのでリリース&アナウン
スすることにしました。
'1.0.0'で対策なし、'1.0.1'で間違ったworkaroundを追加、'1.0.2'で修
正したので無駄にバージョンが上がっています。
- [こうしたらうまくいったよコメント](https://github.com/mitchellh/vagrant-aws/issues/327#issuecomment-67313102)
- [実際に対策した修正](https://github.com/masutaka/wercker-box-rvm-vagrant-aws/blob/0da97cd07f6dcb194d95c1bdaf67022626b710b2/wercker-box.yml#L20)
P.S.
werckerでvagrant-awsを含むBoxは自分の含めて2つしかないけど、EC2使っ
たサーバのCIって需要少ないのかな?不思議。
--------------------------------------------------------------------------------
title: "github-nippou v0.1.1 released"
date: "2014-12-18"
--------------------------------------------------------------------------------
https://rubygems.org/gems/github-nippou/versions/0.1.1
イベントを取得できない問題を修正しました。
今までIssuesEvent, IssueCommentEvent, PullRequestEventを表示してい
ましたが、PullRequestReviewCommentEventを読み捨てていたのが原因。
(動けば良いレベルで作っているので。。)
あとはCommitCommentEventに対応できれば完璧な日報が書けそうですが、
どのように表示しようか悩み中。
https://github.com/masutaka/github-nippou/issues/1 にグダグダ書い
ています。
職場の同僚がさっそく使ってくれてうれしい限り。
--------------------------------------------------------------------------------
title: "nginxのアクセスログをFluentd経由でelasticsearchとBigQueryに送り始めた"
date: "2014-12-14"
--------------------------------------------------------------------------------
masutaka.netのnginxアクセスログはmongodbとGrowthForecastに送ってます。
- {{< post "2013-07-14-1" >}} nginxのアクセスログをFluentd経由でMongoDBに保存してみた
- {{< post "2013-08-15-1" >}} nginxのアクセスログをFluentd経由でGrowthForecastのグラフにしてみた
今回、elasticsearchとBigQueryにも送り始めました。個人での必要性は
全くなく、単にelasticsearchとBigQueryを知っておきたかったからです。
## [elasticsearch](http://www.elasticsearch.org/overview/elasticsearch)
{{< figure src="/images/kibana-s.png" link="/images/kibana.png" target="_blank" rel="noopener" alt="画像" >}}
http://kibana.masutaka.net/ から[kibana](http://www.elasticsearch.org/overview/kibana/)経由で検索出来るようにしてい
ます(要Basic認証)。kibanaは評判が良かったので期待してたんですが、
使いづらいです。学習が必要そうです。。
### インストールの概要
elasticsearchはopenjdk-7-jdkのインストールと、[公式のインストール方
法](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-repositories.html)をそのままChefのレシピにしました。
kibanaは/var/www以下に[公式のtar ball](http://www.elasticsearch.org/overview/elkdownloads/)を展開して、nginxの静的コンテ
ンツの設定を追加しました。
### ハマりどころ
特になく、jdk, elasticsearch, kibana, nginxのレシピを良い感じに組
み立てるのに時間を使いました。
## [Google BigQuery](https://cloud.google.com/bigquery/?hl=ja)
{{< figure src="/images/bigquery-s.png" link="/images/bigquery.png" target="_blank" rel="noopener" alt="画像" >}}
SQLなのでelasticsearchより取っ付きやすいのが良いです。
あ、Row=4はアカンやつや
### インストールの概要
[fluent-plugin-bigqueryのREADME.md](https://github.com/kaizenplatform/fluent-plugin-bigquery)を読みつつ、以下の記事そのままで
できました。ありがとうございます。
[FluentdでGoogle BigQueryにログを挿入してクエリを実行する - Qiita](http://qiita.com/harukasan/items/0e0da49c65839e9517c4)
projectはウェブ上から作り、dataset(db)とtableはGoogle Cloud SDK付
属のbqコマンドで作りました。google-cloud-sdkはbrew caskでインストー
ルできます。
>$ bq mk masutakanet:nginx
>$ bq mk -t masutakanet:nginx.access bigquery-nginx.json
td-agent.confはこのようになりました。
```
type copy
type mongo
(省略)
type elasticsearch
(省略)
type growthforecast
(省略)
type bigquery
method insert
auth_method private_key
email XXXXXXXX@developer.gserviceaccount.com
private_key_path /etc/td-agent/conf.d/masutakanet-YYYYYYYY.p12
project masutakanet
dataset nginx
table access
time_format %s
time_field time
schema_path /etc/td-agent/conf.d/bigquery-nginx.json
```
bigquery-nginx.jsonはこんな感じ。nginxのアクセスログと対応させます。
```
[
{
"name": "time",
"type": "INTEGER"
},
{
"name": "host",
"type": "STRING"
},
{
"name": "forwardedfor",
"type": "STRING"
},
{
"name": "req",
"type": "STRING"
},
{
"name": "status",
"type": "INTEGER"
},
{
"name": "size",
"type": "INTEGER"
},
{
"name": "referer",
"type": "STRING"
},
{
"name": "ua",
"type": "STRING"
},
{
"name": "reqtime",
"type": "FLOAT"
},
{
"name": "vhost",
"type": "STRING"
}
]
```
### ハマりどころ
Google Cloud Platformに慣れなくてハマりました。
### 今回は諦めたこと
今までのmongodbのレコードを[mongobq](http://qiita.com/hakobera/items/3ce72f81c2ba999bc6cf)でBigQueryに送りたかったのですが、
以下のエラーが出てしまい断念しました。またトライするかも。
```
$ mongobq --database fluent --collection nginx --project masutakanet \
--dataset nginx --table access --keyfile masutakanet-ZZZZZZZZ.json \
--schema bigquery-nginx.json --bucket masutaka-mongobq --autoclean
Import 'nginx' collection into 'masutakanet:nginx.access'
Connecting to mongodb://localhost:27017/fluent
Check bucket 'masutaka-mongobq' ... Error: Access Not Configured. The API is not enabled for your project, or there is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions. Please use the Google Developers Console to update your configuration.
at handleResp (/home/masutaka/.nvm/v0.10.33/lib/node_modules/mongobq/node_modules/gcloud/lib/common/util.js:176:14)
at Request._callback (/home/masutaka/.nvm/v0.10.33/lib/node_modules/mongobq/node_modules/gcloud/lib/common/util.js:382:11)
at Request.self.callback (/home/masutaka/.nvm/v0.10.33/lib/node_modules/mongobq/node_modules/gcloud/node_modules/request/request.js:373:22)
at Request.emit (events.js:98:17)
at Request. (/home/masutaka/.nvm/v0.10.33/lib/node_modules/mongobq/node_modules/gcloud/node_modules/request/request.js:1318:14)
at Request.emit (events.js:117:20)
at IncomingMessage. (/home/masutaka/.nvm/v0.10.33/lib/node_modules/mongobq/node_modules/gcloud/node_modules/request/request.js:1266:12)
at IncomingMessage.emit (events.js:117:20)
at _stream_readable.js:943:16
at process._tickCallback (node.js:419:13)
```
**追記(2014-12-25):**
[fluent-plugin-bigquery v0.2.6がリリースされたので](https://github.com/kaizenplatform/fluent-plugin-bigquery/releases/tag/v0.2.6)、「ハマりどころ」
からretriable gem v1.4.1を先にインストールする云々のworkaroundを削
除しました。
--------------------------------------------------------------------------------
title: "emacs-helm-ghq v1.4.1 released"
date: "2014-12-13"
--------------------------------------------------------------------------------
https://github.com/masutaka/emacs-helm-ghq/releases/tag/1.4.1
最新のHelmでは[e000b84](https://github.com/emacs-helm/helm/commit/e000b84f3f95dc8c1ecc245cde011e845c20d594)でhelm-files-match-only-basenameが削除され、
helm-source-ghqが使えなくなったので修正しました。
https://github.com/masutaka/emacs-helm-ghq/pull/6
https://github.com/masutaka/emacs-helm-ghq/pull/7
削除された関数をただ復活させただけという。。。
最近のEmacsはdefclassなんてあるんだ。なるほど分からん。
むしろ、(helm-get-actions-from-type helm-source-locate)がnilを返し
て、何もactionが発動しないのにハマりました。結果的にDRYに書けたの
でよかったのかな。
@yuutayamadaさんありがとうございました。
--------------------------------------------------------------------------------
title: "markdownの目次を自動生成する方法はこれかな?"
date: "2014-12-12"
--------------------------------------------------------------------------------
http://stackoverflow.com/a/27045099
```
$ npm install -g coryfklein/doctoc
$ rehash # for zsh
$ doctoc README.md
```
README.mdに自動挿入される。修正せずそのまま使えば良いと思う。
ちなみにNode.jsのインストールはnvmでやると良いと思う。
nvmのインストール
```
$ brew install nvm
```
~/.zshenvに以下を追加
```
export NVM_DIR=$HOME/.nvm
source $(brew --prefix nvm)/nvm.sh
```
Node.jsのインストール
```
$ nvm install v0.10.33
$ nvm alias default v0.10.33
```
--------------------------------------------------------------------------------
title: "会社の技術ブログを書きました(3回目)"
date: "2014-12-11"
--------------------------------------------------------------------------------
{{< post "2014-10-20-1" >}}に引き続き、会社の技術ブログを書きました。
[Vagrantで簡単に作れる!!RubyやKyotoTycoonのrpmたち|feedforce Engineers' blog](http://tech.feedforce.jp/vagrant-rpm.html)
CentOSを本番環境で使っている方は、Rubyのバージョンアップはどうして
いるんですかね?
rbenvを使っているところもあるのかな。記事にも書いたけど、それだと
サーバのCIは使いものにならないけど。
最近はサーバのCIやDockerのおかげか、低レイヤーな技術が見直されてい
る気がします。前者は今回のrpm、後者はシェルスクリプト。
個人的には地味な技術は好きなのでちょっとうれしい。
--------------------------------------------------------------------------------
title: "いつも日報書くときに使っているスクリプトをGem化した"
date: "2014-12-07"
--------------------------------------------------------------------------------
[Githubで今日なにをしたか、調べるスクリプトを書いた - きたけーTechブログ](http://kitak.hatenablog.jp/entry/2014/04/22/013849)
こちらのスクリプトを自分用に変更して使ってましたが、gem化してない
のが気持ち悪かったので、この度公開しました。
{{< ruby_gems "github-nippou" >}}
◆インストール方法
```$ gem install github-nippou```
◆説明
実行するとmarkdown形式で出力されるので、Qiita:Teamにペタっと貼っています。
```
$ github-nippou
* [Fix 勤怠1ヶ月前から今日までcsvで - blockgiven/ruboty-kintai](https://github.com/blockgiven/ruboty-kintai/pull/1) by masutaka
```
あらかじめ、GitHubのアカウントとトークンを設定する必要があります。
トークンは https://github.com/settings/tokens/new から作れます。
```
$ git config --global github-nippou.user [Your GitHub account]
$ git config --global github-nippou.token [Your GitHub access token]
```
それぞれ、環境変数のGITHUB_NIPPOU_USERとGITHUB_NIPPOU_ACCESS_TOKEN
でも設定可能です。
◆バグ
時々PullRequestやIssueに漏れがありますが、未調査です。
◆注意事項
初めて作ったgemですが、だいぶひどいソースです。テストも書いてないです。
フォーマットは変えられません。
--------------------------------------------------------------------------------
title: "『X'mas Collections music from BRAVELY DEFAULT』がめっちゃいい"
date: "2014-12-03"
--------------------------------------------------------------------------------
{{< figure src="/images/bdff-xmascd.png" link="http://www.square-enix.co.jp/music/sem/page/bdff/xmascd/" target="_blank" rel="noopener" alt="画像" >}}
{{< tweet user="masutaka" id="536521976639021056" >}}
もう何十回も聴きましたが、めっちゃ良いです。仕事中はエンドレスでか
けてますし、今も聴いてます。あとは寝る前と起きた時。
中でも『永遠の刹那』がすごい変わり様で壮大な曲になっています。
- [Original (Disc1 Track02)](http://www.square-enix.co.jp/music/sem/page/bdff/ost/#!/tracklist)
- [X'mas Collections (Trask04)](http://www.square-enix.co.jp/music/sem/page/bdff/xmascd/)
もう別の曲になっていて、初め分かりませんでした。
逆にTrack12の『追憶は郷愁の調べ』はなぜこのアレンジにしたんでしょ
う?違和感ありまくりです。
にしてもいいサントラだなー
[ブレイブリーセカンド](http://www.jp.square-enix.com/second/)もそろそろ出るのかな。楽しみです。あ、その前に
[レジェンドオブレガシー](http://www.cs.furyu.jp/legendoflegacy/)が出ますね。[Newニンテンドー3DS](http://www.nintendo.co.jp/3ds/new/)も合わせて買わ
ないと。。。
{{< amazon asin="B00N23RHPI" title="X'mas Collections music from BRAVELY DEFAULT" >}}
{{< amazon asin="B008OJ7SOU" title="ブレイブリーデフォルト フライング・フェアリー オリジナル・サウンドトラック" >}}
--------------------------------------------------------------------------------
title: "package.elでインストールしたパッケージをCaskで管理することにした"
date: "2014-11-03"
--------------------------------------------------------------------------------
今まで
「package.elでインストールしたパッケージはGitリポジトリに丸ごとcommit」
という豪快な管理をしていました。
アップデートで不具合があってもすぐ戻せるという利点はあったものの、
- Gitリポジトリが肥大化する
- なんか頭悪い
という問題がありました。
ちょっと前から[Cask](https://github.com/cask/cask)で管理するのが流行っています。
- [Cask - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20140424/1398318293)
- [package.elから Caskに切り替えました - Life is very short](http://d.hatena.ne.jp/syohex/20140424/1398310931)
brewでインストールすると依存でEmacsが入るのでNG。
> $ curl -fsSkL https://raw.github.com/cask/cask/master/go | python
こちらでのインストールは単純に~/.caskにgit cloneするだけでしたので、
Caskに移行しました。
Gitで管理していたとはいえ、インストールされたパッケージが直接イン
ストールしたのか、依存で入ったのか、使わなくなって残っているだけな
のかの確認がめっちゃ大変でした。2時間くらいかかった。。
RubyのbundlerのようにCask.lock的なファイルがあればベストでしたが、
Time Machine使い始めたし{{< post "2014-09-10-1" >}}、まあいいかなと。
こちらが私のCaskファイル。http://masutaka.net/ からも辿れます。
{{< gist "masutaka" "b7b2fd4b54df9f2c2bca" >}}
今回の件で{{< post "2014-10-25-1" >}}の方法でEmacsをビルドすると、/usr/local
以下にEmacsがインストールされることに気づきました。。
一旦/usr/local/bin/emacsをリネームしました。
**追記(2014-11-03):**
{{< post "2014-10-25-1" >}}のビルド手順を変更しました。
--------------------------------------------------------------------------------
title: "Slackを使っている時、⌘-wでウィンドウを閉じないようにした"
date: "2014-11-02"
--------------------------------------------------------------------------------
Slackでうっかり⌘-wするとウィンドウが閉じてしまい、Slackを再起動し
ないと復旧できないですよね?(隣の席の同僚はそうではなった。私だけ?)
そういうわけで[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)(旧名KeyRemap4MacBook)で、⌘-wを無視する設定
を書きました。
追加後の~/Library/Application Support/Karabiner/private.xmlはこちら。
"Disable Command-w in Slack"というitemを追加しました。
{{< gist "masutaka" "aeffc01a60b248785a51" >}}
最初の"For Slack ALT+N=move next channel, ALT+P=move previous
channel"はMaedaさんのブログで紹介されていたやつです。便利。
[Slackのチャンネル移動をキーボードで簡単に出来るようKarabinerのprivate.xmlを書いた - Glide Note - グライドノート](http://blog.glidenote.com/blog/2014/08/06/custom-keybind-for-slack/)
というかなんで⌘-wが有効なんだ。。。
See also [private.xml Reference Manual](https://pqrs.org/osx/karabiner/xml.html)
**追記(2020-03-21):**
⌘-1 で元に戻せるので設定を削除しました。というか、デフォルト厨なので
Karabiner 自体使わなくなりました。
--------------------------------------------------------------------------------
title: "MELPAのバッジを付けてMELPA Stableを知るなど"
date: "2014-11-02"
--------------------------------------------------------------------------------
[MELPA badge - Life is very short](http://d.hatena.ne.jp/syohex/20141102/1414901415)
私も以下のMELPAのパッケージを持っているので、付けてみました。
https://github.com/masutaka/emacs-helm-ghq
https://github.com/masutaka/elscreen-mew
https://github.com/masutaka/emacs-helm-hatena-bookmark
こんなのです。
{{< figure src="https://melpa.org/packages/helm-ghq-badge.svg" link="https://melpa.org/#/helm-ghq" target="_blank" rel="noopener" alt="画像" >}} {{< figure src="https://stable.melpa.org/packages/helm-ghq-badge.svg" link="https://stable.melpa.org/#/helm-ghq" target="_blank" rel="noopener" alt="画像" >}}
ただ、elscreen-mewとemacs-helm-hatena-bookmarkはMELPA Stableのバッ
ジが表示されませんでした。(というか、MELPA Stableなんて出来てたんや。。)
[melpaのREADME](https://github.com/milkypostman/melpa/blob/master/README.md#stable-packages)によると、version-to-list()と互換性のあるバージョン文
字列をgitやhgのタグに付けるだけでStableとして扱われるそう。"1.0.0"
とかですね。prefixに'v', 'v.', 'v-'を付けてもOK
version-to-list()はこんな動作です。subr.elに定義されていました。
知らなかった。
```elisp
(version-to-list "1.0.0")
=> (1 0 0)
(version-to-list "1.0.0pre2")
=> (1 0 0 -1 2)
```
emacs-helm-ghqはたまたまタグを付けていたので、Stableバージョンがあ
ると扱われたみたいです。
https://github.com/masutaka/emacs-helm-ghq/tags
他の2つもタグをふったらしばらくしてStableに上がりました。
https://stable.melpa.org/#/elscreen-mew
https://stable.melpa.org/#/helm-hatena-bookmark
--------------------------------------------------------------------------------
title: "WERCKER-BOX-RVM-VAGRANT-AWSをRuby-2.1.4対応させた"
date: "2014-11-01"
--------------------------------------------------------------------------------
[WERCKER-BOX-RVM-VAGRANT-AWS - wercker](https://app.wercker.com/#applications/5416b50b0e62dfcb48002254/tab/details)
[Ruby 2.1.4がリリースされたので。](https://www.ruby-lang.org/ja/news/2014/10/27/ruby-2-1-4-released/)
とは言え、こいつが使っている[BOX-RVMのバージョンを上げて](https://github.com/masutaka/wercker-box-rvm-vagrant-aws/commit/20c607110b4ea4dc9ec47eaab8b3330cd0d8ace0)デプロイし
ただけです。
WerckerはDockerに似たBOXを使用するので、継承元のBOXが更新されたら
デプロイし直す必要があります。
Wercker上でAWSを使ったサーバのCIする方法は{{< post "2014-09-14-1" >}}、
WERCKER-BOX-RVM-VAGRANT-AWS自体の説明は{{< post "2014-09-15-1" >}}をどうぞ。
--------------------------------------------------------------------------------
title: "MySQLは出力先が標準出力かファイルかによって内容を変える"
date: "2014-10-31"
--------------------------------------------------------------------------------
こちらのブログの受け売りになりますが、タイトルのとおりです。
[MySQL の結果を csv 形式で標準出力させたい - BOOLEANLABEL](http://d.hatena.ne.jp/fd0/20090801/p1)
```shell-session
# 標準出力への出力と
$ mysql -u root mysql -e 'select count(*) from user'
+----------+
| count(*) |
+----------+
| 6 |
+----------+
# ファイルへの出力は異なります。
$ mysql -u root mysql -e 'select count(*) from user' > /tmp/hoge && cat /tmp/hoge
count(*)
6
```
isatty(3)で判定しているそうです。
```c
/* mysql-5.6.21/client/mysql.ccの1233行目 */
if (!isatty(0) || !isatty(1))
{
status.batch=1; opt_silent=1;
ignore_errors=0;
}
else
status.add_to_history=1;
```
実際に使ってみました。
```c
/* test.c */
#include
#include
int
main(int argc, char **argv)
{
/* 標準出力のファイルディスクリプタは1固定 */
if(isatty(1)) {
printf("貴様!標準出力だな!\n");
}
else {
printf("貴様!ファイル出力だな!\n");
}
return 0;
}
```
コンパイル&実行
```shell-session
$ gcc test.c
$ ./a.out
貴様!標準出力だな!
$ ./a.out > /tmp/huga && cat /tmp/huga
貴様!ファイル出力だな!
```
へぇ〜
--------------------------------------------------------------------------------
title: "rbenv installの時に指定したgemを入れてくれるrbenv-default-gemsが便利"
date: "2014-10-28"
--------------------------------------------------------------------------------
[Ruby 2.1.4 リリース](https://www.ruby-lang.org/ja/news/2014/10/27/ruby-2-1-4-released/)
早速インストールしたところ、同僚から[rbenv-default-gems](https://github.com/sstephenson/rbenv-default-gems)を教えてもら
いました。rbenv pluginです。
インストールは簡単。git cloneして、
> $ git clone git@github.com:sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems
~/.rbenv/default-gemsを作るだけです。
```
$ cat ~/.rbenv/default-gems
gem-src
bundler
ghn
puppet-lint
html2haml
octokit
git-pr-release
gem-search
sass
github_scouter
```
rbenv install時に上のgemが自動的にインストールされます。
```
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.4
Downloading ruby-2.1.4.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/bf9952cdeb3a0c6a5a27745c9b4c0e5e264e92b669b2b08efb363f5156549204
Installing ruby-2.1.4...
Installed ruby-2.1.4 to /Users/masutaka/.rbenv/versions/2.1.4
Fetching: gem-src-0.6.3.gem (100%) # <= ここから
...
```
See also [Rbenv-default-gemsを試してみた - akadama](http://chiastolite.github.io/blog/2013/02/08/try-rbenv-default-gems/)
--------------------------------------------------------------------------------
title: "ローカルの静的コンテンツをHerokuに置き始めた"
date: "2014-10-25"
--------------------------------------------------------------------------------
他の人に見せたくない静的コンテンツは、ローカルのnginx経由で見られ
るようにしていたんだけど、いろいろ面倒になってきたのでHerokuに置き
始めた。
やり方は簡単で、以下のリポジトリのHerokuボタンを押すだけ。
[masutaka/heroku-static-contents](https://github.com/masutaka/heroku-static-contents)
public以下に.htmlとかをcommitして、git push heroku masterすればOK。
BASIC認証も使えて便利。
--------------------------------------------------------------------------------
title: "Emacs-24.4 on OSX Yosemiteのビルド手順詳細"
date: "2014-10-25"
--------------------------------------------------------------------------------
なんとかビルド出来ました。こりゃEmacs人口が減るわけだ。。
Emacs-24.3の頃からクラッシュする問題に悩まされていたんです。
{{< tweet user="masutaka" id="525259312571383808" >}}
そんな中見つけたのが[Mew-jaのこの情報](https://groups.google.com/d/msg/mew-ja/G54GV5A1F5E/OEIkRaOm_IwJ)。
> 素の Emacs は、Mac では不安定です。山本さんのパッチを当てて使うと、ほ
> とんど落ちなくなります。
>
> ftp://ftp.math.s.chiba-u.ac.jp/emacs/
>
> --かず
そこで今回からこのパッチ(experimental/hackers-onlyパッチ)を使うことにしました。
[Emacs24 のインストールと新機能 : 紹介マニア](http://sakito.jp/emacs/emacs24.html#experimental-hackers-only)
インラインパッチ(IMEパッチ)は当たらなくなるので、ac-mozc.el +
mozc_emacs_helperを使うことにしました。というかインラインパッチの
最新はどこに。。(2015-01-04追記: もういらないみたいです。→ {{< post "2015-01-04-1" >}})
[mozc-emacs-helperをインストールするhomebrewを書いた|Act as Professional](https://hiroki.jp/mozc-emacs-helper)
最終的なビルド手順はこちら。前述の紹介マニアのやり方ほぼそのままです。
デフォルトでは/usr/local以下に一部インストールされてしまうので、
configureに--prefixオプションを指定し、~/opt以下に変更しています。
この辺はご自由に。パッチなしのビルドではなぜ必要ないかは調べていません。
```
$ curl -LO http://ftp.gnu.org/pub/gnu/emacs/emacs-24.4.tar.xz
$ curl -LO ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-24.4-mac-5.2.tar.gz
$ tar xfJ emacs-24.4.tar.xz
$ tar xfz emacs-24.4-mac-5.2.tar.gz
$ cd emacs-24.4
$ patch -p 0 < ../emacs-24.4-mac-5.2/patch-mac
$ cp -r ../emacs-24.4-mac-5.2/mac mac
$ cp ../emacs-24.4-mac-5.2/src/* src
$ cp ../emacs-24.4-mac-5.2/lisp/term/mac-win.el lisp/term
$ cp nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns mac/Emacs.app/Contents/Resources/Emacs.icns
$ ./configure --prefix=$HOME/opt/emacs-24.4 --with-mac --without-x
$ make
$ make GZIP_PROG='' install # *.elを圧縮したくないので
$ cp -r mac/Emacs.app ~/Applications
```
※ この手順だとemacsclientやetagsは~/opt/emacs-24.4/bin以下にイン
ストールされます。適宜ご利用ください。
⌘キーとOptionキーが入れ替わってしまったので、下記設定を追加しました。
```elisp
(setq mac-command-modifier 'super)
(setq mac-option-modifier 'meta)
```
あと、libxml2絡みで無駄にハマったので、以下に残しておきます。
## libxml2がらみでコンパイルエラーが発生
Homebrewでpkg-configを入れていると、configureがlibxml2のCFLAGSの判
別に失敗し、コンパイルエラーが発生する。
```
gcc -c -Demacs -I. -I. -I../lib -I./../lib -fconstant-cfstrings -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/local/Cellar/imagemagick/6.8.9-8/include/ImageMagick-6 -I/usr/include/libxml2 -MMD -MF deps/xml.d -MP -Wno-switch -Wno-tautological-constant-out-of-range-compare -Wno-pointer-sign -g3 -O2 xml.c
xml.c:23:10: fatal error: 'libxml/tree.h' file not found
#include
^
1 error generated.
make[1]: *** [xml.o] Error 1
make: *** [src] Error 2
```
configureの14922行目のこの行が原因。
```
LIBXML2_CFLAGS=`"$PKG_CONFIG" --cflags "libxml-2.0 > 2.6.17" 2>&5` &&
```
おまえか!
```
$ pkg-config --cflags "libxml-2.0 > 2.6.17"
-I/usr/include/libxml2
# => 存在しないディレクトリ
```
configure前に適切なCFLAGSをセットするか、configureに--without-xml2
オプションを付ければ良い。
今回は前者を採用した。libxml2は使いたかったので。
```
export CFLAGS=`xml2-config --cflags`
# => -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libxml2がセットされる
```
[bug-gnu-emacs 18779](https://lists.gnu.org/archive/html/bug-gnu-emacs/2014-10/msg00894.html)では
> ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include /usr/include
していたが、Yosemiteで/usr/includeが存在してよいかは分からない。
ここまで書いてこんな記事を見つけた。
[Mavericksにしたら/usr/includeが消失していた件 - とあるぼっちの生存報告](http://bocchies.hatenablog.com/entry/2013/10/29/003410)
あれ、Mavericksもそうだったん?
`xcode-select --install`って今も必要なのかな?やってみるか。
/usr/includeが出来ました!/(^o^)\
結論: `xcode-select --install`していればハマらなかった。
**追記(2014-11-03):**
configureに--prefixオプションを指定しないと、一部/usr/local以下に
インストールされてしまうので修正しました。
**追記(2014-12-30):**
experimental/hackers-onlyパッチが5.2に更新されていたので、手順をアッ
プデートしました。
あと、experimental/hackers-onlyパッチを当てると、emacsclientがなく
なるのは間違いでした。今回の手順だと~/opt/emacs-24.4/bin以下にイン
ストールされるので、こちらも修正しました。
--------------------------------------------------------------------------------
title: "会社の技術ブログを書きました(2回目)"
date: "2014-10-20"
--------------------------------------------------------------------------------
{{< post "2014-08-09-1" >}}に引き続き、会社の技術ブログを書きました。
[JenkinsでサーバのCIを始めました|feedforce Engineers' blog](http://tech.feedforce.jp/jenkins-server-ci.html)
ネタ的には新しくはないのですが、フィードフォースのエンジニアが今今
どんなことをしているかを伝えたくて書きました。
こういう記事を投稿し続けていけば、興味あるエンジニアの目に止まるん
じゃないかと。
弊社は最近採用に力を入れています。
結構気軽に会いにいけるので、興味ある方はどうぞ☆
- [フィードフォースは「会いにいける!」ベンチャーです!(社長指名可) - 株式会社フィードフォースの求人 - Wantedly](https://www.wantedly.com/projects/10735)
- [Rubyで開発したいエンジニアをウォンテッド!(土日面談/スカイプ面談可) - 株式会社フィードフォースの求人 - Wantedly](https://www.wantedly.com/projects/8218)
- [【株式会社フィードフォースの求人】 【自社サービス開発/新規事業立ち上げ/残業10H以内/土日面談可】Webエンジニア - Forkwell Jobs](https://jobs.forkwell.com/feedforce/jobs/54)
--------------------------------------------------------------------------------
title: "Werckerのデプロイボタンはなんだかんだ言って便利だった"
date: "2014-10-04"
--------------------------------------------------------------------------------
{{< post "2014-09-14-1" >}}に書いたとおり、このmasutaka.netではサーバのCIをして
います。
今までテストが通ってから、手動でCook+Serverspecして不便に感じてませ
んでしたが、試しにWerckerのデプロイ設定をしてみたら、案外便利でよく
使っています。

wercker.ymlはこんな感じです。
{{< gist "masutaka" "7b333ac43663a9082ea9" >}}
管理画面からDeploy targetを作る必要があります。ちょっと管理画面が古
いですが、こちらを参考にしてください。
[wercker + Capistrano で自動デプロイ - milk1000cc's blog](http://milk1000cc.hatenablog.com/entry/20131130/1385810747)
私はTarget nameをProductionにして、SSH keysで作った鍵を
$WERCKER_SSH_KEY_PRIVATEという名前でwercker.ymlから参照できるように
しました。
ブラウザからWerckerのサイトに行くのが面倒だけど、個人でChatOpsやっ
てもなあ...。とはいえ、やるかもしれませんが。
--------------------------------------------------------------------------------
title: "『ベヨネッタ2』がやってきた!"
date: "2014-09-23"
--------------------------------------------------------------------------------

ちょっとやってみた感じ、良い意味で1のシステムが使いまわされています(けっこう同じw)。前作をやった人は違和感ないでしょう。
ベヨネッタ特有の「連打しない」「回避重要」にも慣れてきました。下手くそですけどね!
{{< amazon asin="B009AP2VBW" title="ベヨネッタ2 (Wii U版「ベヨネッタ」のゲームディスク同梱)" >}}
あ、同封の1は無駄に任天堂色がついており、なかなか良さげです。ご覧のとおりのピー◯姫になります。

んで、Wii Uはベヨネッタ2のために買いました。ドラクエ7のために3DSを買った{{< post "2013-02-16-1" >}}以来です。ちなみにPS3はデビルメイクライ4。
それにしても、Wii Uの予想以上の性能の良さにビックリ。全くストレスなく動きます。ベヨネッタ出たての頃、PS3はローディングがめちゃめちゃ遅かったのに(その後のアップデートでましになった)。
コントローラにも画面があるし、ここまでの性能必要なのかしら?w
{{< amazon asin="B009K1EDTY" title="Wii U ベーシックセット (WUP-S-WAAA)" >}}
[Wii U本体縦置きスタンド](http://onlineshop.nintendo.co.jp/shop/item_detail?item_id=915092)も買いました。送料込みで500円と安かったので。
※今回は柴田さんの記事でよし買おう!と思いました。
- [Wii U を買った - HsbtDiary(2014-08-31)](http://www.hsbt.org/diary/20140831.html)
- [Wii U の縦置き台を買った - HsbtDiary(2014-09-11)](http://www.hsbt.org/diary/20140911.html#p01)
P.S.
序盤にジェット機の上で戦うやつ、{{< wikipedia word="Kunoichi_-忍-" text="Kunoichi" >}}のオマージュ?と思いました。両方とも{{< wikipedia word="田中敦子_(声優)" text="田中敦子" >}}さんだし、キャラ被っているし。どうなんでしょう?
--------------------------------------------------------------------------------
title: "GrowthForecastがsegmentation faultで落ちるのでrelocatable-perlを使い始めた件"
date: "2014-09-23"
--------------------------------------------------------------------------------
こちらも前回{{< post "2014-09-23-1" >}}に引き続き、さくらのVPS上のUbuntu 14.04の話です。
今までのUbuntu 12.04 32bitでは[GrowthForecast](http://kazeburo.github.io/GrowthForecast/index.ja.html)は問題なく動いていたのに、Ubuntu 14.04 64bitにしたらなぜか動かなくなりました。。
Perlはplenvでインストールした5.20.0と5.20.1で確認。GrowthForecastは最新。
```
$ carton exec -- perl growthforecast.pl --data-dir . --enable-float-number &
zsh: segmentation fault carton exec growthforecast.pl --data-dir . --enable-float-number
(エラーメッセージはメモしてなかったので適当)
```
ググってみたらこちらを発見。
https://github.com/shoichikaji/relocatable-perl-growthforecast
って、YAPC{{< post "2014-08-31-1" >}}のLTで発表されていたKajiさんじゃないですか。
[リロケータブル Perl - skaji'sblog](http://ks0608.hatenablog.com/entry/2014/07/06/170328)にも紹介記事があります。
ひとことで言うと「ツールのためにPerlインストールのだるいので、再配置可能なPerlにしてツールと一緒に配布しちゃえばいいんじゃね?」というやつです。
トラブル続きで意識が低くなっているので、リリース版をそのまま使用。
```
$ mkdir ~/growthforecast && cd $_
$ wget https://github.com/shoichikaji/relocatable-perl-growthforecast/releases/download/0.23/growthforecast-0.83-x86_64-linux.tar.gz
$ tar xzf growthforecast-0.83-x86_64-linux.tar.gz
$ ./growthforecast-0.83-x86_64-linux/bin/growthforecast.pl --data-dir . --enable-float-number &
```
動いた! http://masutaka.net:5125
しかし、、
{{< tweet user="masutaka" id="514027124291014656" >}}
しかも、fluentdとcron経由でのPOSTがうまくいっていない。Raspberry PIからのPOSTは大丈夫なのに。。もう疲れたのでベヨネッタやる。
--------------------------------------------------------------------------------
title: "さくらのVPSでCookがダンマリになる件を回避した"
date: "2014-09-23"
--------------------------------------------------------------------------------
{{< post "2013-05-19-1" >}}にインストールしたUbuntu 12.04はうっかり32bit版でした。。仕方がないのでUbuntu 14.04へのアップグレードがてら、クリーンインストールすることにしました。
管理画面からポチポチしてOSのインストールは完了。CookはあらかじめVirtualBoxとEC2で確認していたので万全です(キリッ
と思いきや、いつまでたってもRecipeが処理されません...。
```
$ knife solo cook masutaka.net
Running Chef on masutaka.net...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.16.2
(ここでダンマリ)
```
これまた仕方がないので、サーバ側の/opt/chef/embedded/lib/ruby/gems/1.9.1/gems以下をprintfデバッグ(というかpデバッグか)で調べたところ、Chefがサーバ情報を取得するときに使うOhaiのGCEプラグインから返ってこないことがわかりました。GCEとはGoogle Compute Engineです。なんでChefが?
で、結論から言うと、GCEプラグインをOFFにしたら解決しました。
knife solo prepareのあとに/opt/chefが作られるので、/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/ohai-7.4.0/lib/ohai/config.rbを以下のように修正。あとはknife solo cookするだけです。knife solo bootstrapは出来ないことになります。
> default :disabled_plugins, []
> ↓
> default :disabled_plugins, [:GCE]
knife soloはchef-soloをリモートから実行するコマンドで、
> /opt/chef/embedded/bin/ruby /usr/bin/chef-solo -c /home/masutaka/chef-solo/solo.rb -j /home/masutaka/chef-solo/dna.json
のようなchef-soloコマンドを実行します。root権限だったかな?
この/home/masutaka/chef-solo/solo.rbに
> Ohai::Config[:disabled_plugins] = [:GCE]
を書き、前述のchef-soloコマンドを実行すれば/opt/chef以下を修正する必要はありませんが、残念ながらこのファイルはknife solo cook時に自動生成されます。
ローカルの.chef/knife.rbに書いても無視されました。残念。そういうわけで、今はprepareをした後はサーバにログインしてファイルを書き換え、そのあとにcookというイマイチなことをしています。
ではなぜ、さくらのVPSだけダンマリになるのか?
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/ohai-7.4.0/lib/ohai/mixin/gce_metadata.rbのここに違いがありました。
```
def can_metadata_connect?(addr, port, timeout=2)
t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
saddr = Socket.pack_sockaddr_in(port, addr)
# さくらはこの行に来る。
connected = false
```
portは80、addrはmetadata.google.internalです。
さくら以外はおそらくSocket.pack_sockaddr_inで例外が発生して、それ以降処理されないのでしょう。さくらはそれ以降処理され、無限ループに入り込んでしまいます。
irbでも再現出来ました。さくら以外は例外が発生しています。さくらは壊れた文字列が返ってきます。
```
# さくら以外(Cookできる)
$ irb -r socket
irb(main):001:0> Socket.pack_sockaddr_in(80, 'metadata.google.internal')
SocketError: getaddrinfo: nodename nor servname provided, or not known
from (irb):1:in `pack_sockaddr_in'
from (irb):1
from /Users/masutaka/.rbenv/versions/2.1.2/bin/irb:11:in `'
# さくら(Cookでダンマリ)
$ irb -r socket
irb(main):001:0> Socket.pack_sockaddr_in(80, 'metadata.google.internal')
=> "\x02\x00\x00PE\xAC\xC9\xD0\x00\x00\x00\x00\x00\x00\x00\x00"
irb(main):002:0> require 'nkf'
irb(main):003:0> NKF.nkf('-w8', Socket.pack_sockaddr_in(80, 'metadata.google.internal'))
=> "\u0002\u0000\u0000PEャノミ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
```
pingでも違いあり。
```
# さくら以外(Cookできる)
$ ping metadata.google.internal
ping: cannot resolve metadata.google.internal: Unknown host
# さくら(Cookでダンマリ)
$ ping metadata.google.internal
PING metadata.google.internal.net (69.172.201.208) 56(84) bytes of data.
```
さくらのDNSサーバはさくら奨励の133.242.0.3と133.242.0.4を指定。[Google Public DNS](https://developers.google.com/speed/public-dns/)(8.8.8.8と8.8.4.4)に変えても変わらず。
ここで調査は行き詰まり。cookが面倒になってしまったのは残念。
ブラジルの人も困っていました。
[GCE Plugin infinite loop · Issue #382 · opscode/ohai](https://github.com/opscode/ohai/issues/382)
**追記(2016-07-19):**
職場の同僚が EC2 で同じ現象でハマっていて、この記事の方法で回避できたそうです。
--------------------------------------------------------------------------------
title: "WerckerでRVMとVagrantのBoxを作った"
date: "2014-09-15"
--------------------------------------------------------------------------------
{{< figure src="/images/wercker-logo.png" link="http://wercker.com/" target="_blank" rel="noopener" alt="画像" >}}
昨日{{< post "2014-09-14-1" >}}の記事より。
> wercker.ymlも毎回Vagrantをインストールして、vagrant upするという無
> 駄なことをしているので、Docker使って時短させるかもしれない。
この場合Dockerは間違い。Wercker的にはBox使うのが正解なので作ってみ
ました。(このくらいのBoxはあるかと思ったらなかったのが意外でした。)
{{< github_repo "masutaka/wercker-box-rvm-vagrant-aws" >}}
以下のようにinheritsを使うと、任意のBoxを継承できるみたいです。
[ちょっと前までwercker.ymlに複数書けばそうなるかと思ってました。](https://github.com/masutaka/server-masutaka.net/commit/0618ea36a769b7c36fcf5db8efe4f01c54dc24f5)
> inherits: wercker/rvm@2.0.1
実コードはスクリプトのベタ書きだけです。
```
script: |
VAGRANT_VERSION=1.6.5
wget https://dl.bintray.com/mitchellh/vagrant/vagrant_${VAGRANT_VERSION}_x86_64.deb
sudo dpkg -i vagrant_${VAGRANT_VERSION}_x86_64.deb
vagrant plugin install vagrant-aws unf
```
あとはWerckerの管理画面からGitHubのリポジトリを登録し、Wercker
directoryにデプロイすれば使えます。Public Appにすることをお忘れなく。
wercker.ymlはこのようになりました。[昨日](https://gist.github.com/masutaka/e134585792231c9ae074#file-wercker-yml)と比べるとBoxがwercker/rvmか
らmasutaka/rvm-vagrant-awsに変わったことと、vagrantやvagrant-awsプ
ラグインをインストールしてないのが分かると思います。
{{< gist "masutaka" "f05071a069f0251d2b0a" >}}
Boxの作り方自体はこちらが参考になると思います。
[werckerで自分のBOXを作ってみた - 紺屋高尾](http://kouyatakao.hatenablog.com/entry/2014/03/16/133605)
11分33秒かかっていたテストが10分46秒に短縮されました!
って、あれ、あんまり変わってない。。
パフォーマンス云々より、Dockerっぽく改善できたので良しとします。
今度はEC2使わずにWerckerでDocker立ち上げてCIしたいなあ。
--------------------------------------------------------------------------------
title: "Wercker + Vagrant + AWS + serverspecでChefのレシピをCIする"
date: "2014-09-14"
--------------------------------------------------------------------------------
{{< figure src="/images/wercker-logo.png" link="http://wercker.com/" target="_blank" rel="noopener" alt="画像" >}}
{{< post "2014-01-09-1" >}}からmasutaka.netのCIを開始したが、残念ながら
masutaka.netに直接serverspecする、なんちゃってCIだった。
masutaka.netにcookしてからPRを出して、WerckerにCIさせていた。
WerckerとAWSを連携させて、テストのたびにサーバをまっさらな状態から
作り、終わったら破棄することが可能になったので、ここに記録しておく。
去年くらいに話題になったこの辺の話。
[Vagrant + Chef Solo + serverspec + Jenkins でサーバー構築を CI - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20130520/1369054828)
[naoya/circleci-serverspec](https://github.com/naoya/circleci-serverspec)
なんで今までやらなかったかというと、cookが一発で通らないレシピになっ
ていたから。。気づいてはいたんだけど、本番サーバのテストが通りさえ
すればよかったし。。。
[インフラ系技術の流れ - Gosuke Miyashita](http://mizzy.org/blog/2013/10/29/1/)
こちらの記事でいうところの、Orchestrationの仕事までChefにやらせてい
たのが敗因。GitHubのprivateリポジトリにおいてあるdotfilesや、
growthforecast、tiarra、mobircまでもChefにインストールさせていた。
ユーザmasutakaに依存しないレシピに変更して、手元の
Vagrant+VirtualBoxで一発でspecが通るまでがステップ1。
次に手元のVagrant+AWSで同じことが出来るまでがステップ2。
これをWercker上で実行できるようにwercker.ymlを書き換えたのがステッ
プ3。
最終的なVagrantfileとwercker.ymlは以下のとおり。
{{< gist "masutaka" "e134585792231c9ae074" >}}
いくつかハマったけど、凡ミスだったので特には触れない。上の設定に従
えば同じことは出来るはず。(CircleCIだと各インスタンスにssh出来るの
で、調査は早かったんだろうと夢想。)
でも一点だけad hocな対応をしていて、plenvやrbenvを使ったPerl/Rubyの
インストールはビルド済みのtar ballを展開するだけに変更した。
Werckerはビルドが5分間止まると失敗だと見なすから。ビルド全体の時間
は25分までOK。
そもそもImmutable Infrastructure的にplenvやrbenvを使うのはどうなの?
という節もあって、そこは今後変えるかもしれない。
wercker.ymlも毎回Vagrantをインストールして、vagrant upするという無
駄なことをしているので、Docker使って時短させるかもしれない。
とりあえずCI出来るようになったので、今回はこれで良しとする。
--------------------------------------------------------------------------------
title: "Time Machineはじめました"
date: "2014-09-10"
--------------------------------------------------------------------------------
やっと自分のMacBookAirでもTime Machine始めました。
{{< amazon asin="B00D1I2EMA" title="WD ポータブルHDD My Passport for Mac 1TB 3年保証 USB 3.0 Time Machine対応 WDBLUZ0010BSL-JESN" >}}
もう21世紀なんです。cronでバックアップスクリプト動かしている場合じゃないんです!
写真だと大きく見えてしまいますね。縦はiPhone5sより小さなHDDです。

1TB, 2TB, 500GBがあります。1TBを買いました。
AirMacに繋げて自動にしようかと思いましたが、直接つないで試したら遅くなかったしルームシェアだし、とりあえず必要なときに手動でバックアップすることにしました(あれ)。
MacBookAirは120GB程度使っていて、初回は2時間ほどかかりました。差分バックアップは優秀で5分程度です。さすがOSが面倒みていると違います。[pdumpfs](http://0xcc.net/pdumpfs/)とか使って頑張っていた頃とは違いますね。pdumpfsには大変お世話になりましたが。
日曜日にたつをさんのアフィリンクからポチッとして、昨日火曜日に最寄りのローソンで受け取りました。
[「My Passport for Mac」で MacBook Air のバックアップをようやくスタート!](http://chalow.net/2013-10-17-2.html)
--------------------------------------------------------------------------------
title: "大腸カメラ飲んだ ٩(๑❛ᴗ❛๑)۶"
date: "2014-09-08"
--------------------------------------------------------------------------------
:warning: 内容が内容ですので、閲覧注意で。
健康診断で潜血が見つかったので飲んで(?)来た。会社の1Q飲み会(焼き肉)に行けなかったのはこういう訳。
前日の金曜日は21:00までに食事。消化の良い物を少量。野菜ダメとのこと。セブンのぶっかけうどんを食べた。あとなぜかレアチーズ大福。うまかった。炭水化物\(^o^)/
[【コンビニスイーツ】セブンイレブンのレアチーズ大福が美味しすぎてやばい - NAVER まとめ](http://matome.naver.jp/odai/2140637459524681501)
{{< figure src="/images/muben.jpg" link="http://ja.wikipedia.org/wiki/%E7%B5%8C%E5%8F%A3%E8%85%B8%E7%AE%A1%E6%B4%97%E6%B5%84%E5%89%A4" target="_blank" rel="noopener" alt="画像" >}}
8:00に起きて8:15くらいから飲み始めた。2時間で2L飲めとの注意書きが。水に溶かすと色は透明。レモン味と塩味で案外飲みやすかった。バリウムを想像してた。最初の一杯は15分くらいかけてゆっくり飲めとのこと。そうした。
説明書きどおり、1L飲んだくらいで固形物と水分が出て、あとは水分。残り500mlくらいから少し辛くなってきた。主に味が。
肛門から小便のようなものが出る感じは不思議。10年くらい前に2週間ほどウィルス性の下痢になったときは脂汗がすごかったが、今回はそんなことない。むしろ気持ちよくシャーっと出せた。徐々に透明になっていき、最後は黄色みがかった透明に。胆汁由来の色らしい。これでOKなはず。
ネット見ながらだらだら飲んでたら2時間オーバー。2時間15分くらいかな。水分はずっと取ってよし。むしろ脱水症状を抑えるために積極的に取るべしとのこと。シャワー浴びて病院にGO。お腹が安定しなくてちょっとギリギリだった。
14:05頃阿佐ヶ谷駅着。新宿から総武線に乗ったら、電車が中野で引き返して困惑した。
14:10[河北総合病院](http://www.kawakita.or.jp/)着。受付後、内視鏡室で再度受付。大便の写真一覧を見せられて、一番薄いやつを選んだ。OK。
そのあと着替え。上は浴衣ぽいやつ、下は使い捨てズボン。お尻の部分に縦の切れ目がある。テレビ見ながら待つ。長い。
15:00前から検査開始。ベッドに横たわったあと、注意事項の説明あり。仮にポリープが見つかって切除する場合は1週間ほど食事制限があるとか、帰りは車も自転車もダメだとか。直後に別の先生から同じことをまた言われて???になった。
(たぶん)ぼーっとする注射を打つ。そのあとすぐ始まったので、麻酔ではなかったと思う。腸の運動を抑制するやつかと。
問診もするかと思ってたところで急に始まった。横向きで自分の腸内が映ったモニターを見ることが出来る。なかなかきれい。
往路はモニターを見る余裕があったが、復路は時々奥に戻る時があって、それがきつかった。痛いわけではないのだけど。この時先生が写真を撮ってた気が。
終わると1時間ほど休憩スペースに。カーテンに仕切られた半個室の部屋。お腹が張ってガスを出すことしか考えてなかった。頭がボーっとしていた。
着替えてトイレに行ってガスをたくさん出して終わり。今日は消化の良い物にして下さいとのこと。明日からはいつもどおりでOK。週末の社内飲みに参加できそうで安心。
阿佐ヶ谷の飲み屋に行こうかと思ってたけど断念&残念。そういう体調&気分でもなかったし。
結局[阿佐ヶ谷のはなまるうどん](http://tabelog.com/tokyo/A1319/A131905/13027100/)へ。帰って軽くシャワー浴びて22:00まで寝てた。
明けて月曜日。結果を聞くために再度訪問。写真を一緒に見ながら「きれいな粘膜ですね」と言われた(๑′ᴗ'๑)エヘヘღ もちろん異常なし。結果を紹介元(大久保検診センター)に送ってくれるとのこと。そういうきまりらしい。
土曜日に見つけて気になった[ミートソース専門店](http://tabelog.com/tokyo/A1319/A131905/13043528/)があったので、食べてから出社した。パスタ屋なのにジャンクで良かった。近所にあったら通っちゃいそう。

<感想>
最近便秘気味の割に案外入っていなかった。出しても体重にあまり変わりなし。全部出せばお腹が引っ込むと思っていた。このお腹の張りはなんだろう。。自分の大腸きれい。
--------------------------------------------------------------------------------
title: "ghqとcdrの出力を一緒にpecoに食わせたら捗った"
date: "2014-09-06"
--------------------------------------------------------------------------------
最近はghq+pecoでリポジトリのあるディレクトリ、cdr+pecoで最近訪れた
ディレクトリに簡単に移動できて、非常に捗っている。
ghq+pecoとcdr+pecoはそれぞれ以下の記事が詳しい。
- [ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts](http://blog.kentarok.org/entry/2014/06/03/135300)
- [pecoを使い始めた - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2014/06/27/223538)
ただ、ghq+pecoはC-x C-y、cdr+pecoはC-x bと、当然別々のキーになるの
で、どっちを使うか考えたり間違えたりするのでモヤモヤしていた。
Emacsは自作の[helm-ghq.el](https://github.com/masutaka/emacs-helm-ghq)で同じ操作感にしていたので、同じモヤモヤだっ
たが、[最近来たPull Request](https://github.com/masutaka/emacs-helm-ghq/pull/4)を取り込んでからは改善。
C-x b (helm-for-files)でghqの出力も出すことでキーバインドを1つに集
約できた。C-x C-yのキーバインドは削除。
C-x bでこのような一覧が表示されて、絞り込む感じ。
- ghq list --full-pathの出力
- 現在開いているバッファ
- 最近開いたファイル
- カレントディレクトリにあるファイルやディレクトリ
複数のソースを出力していても、混乱しないどころか便利に使えたので、
zshも同じでいいじゃんと思い、変更した関数がこれ。(リファクタリング出来そう...)
{{< gist "masutaka" "3c82d4cb8f0cf900b573" >}}
ghqとcdrの両方の出力が候補に出ているのが分かると思う。

C-x bだけでghqとcdrを呼び出せるし、Emacsと操作が同じだし、非常に満
足行く設定になった。
IFSをいじっているのは、スペースを含むディレクトリも適切に処理するた
め。デリミタを改行だけにしている。
awkの処理はソートなしの重複削除。なんでこれで出来るのか全く分からな
いけど。。
{{< tweet user="shirayu" id="15783885031870464" >}}
**追記(2014-10-07):**
`local selected_dir=...`の前で、以下のmy-compact-chpwd-recent-dirs
を呼ぶときれいな一覧になります。
[zshの機能のみで既に存在しないディレクトリをcdrのリストから削除する - @znz blog](http://blog.n-z.jp/blog/2014-07-25-compact-chpwd-recent-dirs.html)
--------------------------------------------------------------------------------
title: "YAPC::Asia Tokyo 2014に参加してきた #yapcasia"
date: "2014-08-31"
--------------------------------------------------------------------------------
{{< figure src="/images/yapc2014-logo.png" link="http://yapcasia.org/2014/" target="_blank" rel="noopener" alt="画像" >}}
去年{{< post "2013-09-29-1" >}}に引き続き、今年も参加してきました。
YAPCはバラエティがあり、Perl以外の情報も多いので好きです。
まさにYet Another Programming Conference
よく考えたらこのブログもPerlで生成しているので{{< post "2007-07-01-1" >}}、Perl
との関わりはゼロではなかった。
参加者が過去最大ということもあり座れないことが多々ありました。YAPC
ではおなじみの光景みたいですが、この辺改善されると良いですね。Wifi
とか運営とかは素晴らしかったです。
以下、参加したトークへのメモ。
## [インフラエンジニア(狭義)は死んだ](http://yapcasia.org/2014/talk/show/df196eac-fb65-11e3-b7e8-e4a96aeab6a4)
(スライドがアップされたらここに貼る)
問題を解決するためには自分の肩書きに縛られないほうが良いよという話。
まあそうだよね。そういう意味で私は、「Rubyエンジニア」とか「PHPエン
ジニア」とか名乗らないようにしている。最近は「ソフトウェアエンジニ
ア」か「カレー大好き!」かな(えっ
## [Go For Perl Mongers](http://yapcasia.org/2014/talk/show/2276d7b2-eba7-11e3-bd6d-c7a06aeab6a4)
[スライドはこちら](http://go-talks.appspot.com/github.com/lestrrat/go-slides/2014-yapcasia-go-for-perl-mongers/main.slide#1)
pecoの牧さんによるGOを書き始めた人向けのトーク。GOはチュートリアル
を半分くらいやった程度なので、途中から付いて行けなかったorz
- 例外などない
- オブジェクト指向など忘れてしまえ
- fmtは「ふむと」と読む
- GOは継承ではなく委譲
## [JSON SchemaとAPIテスト](http://yapcasia.org/2014/talk/show/4d4a9af6-02d0-11e4-9357-07b16aeab6a4)
(スライドがアップされたらここに貼る)
良さそう。JSON Schema知らなかったので、あとで最新の
WebDBPress(Vol. 82)のWEB APIデザイン鉄則読む。
## [作られては消えていく、泡のように儚いクラスタの運用話](http://yapcasia.org/2014/talk/show/9e3ced48-027f-11e4-9357-07b16aeab6a4)
{{< slideshare "ml3ynGTOKLOyiK" >}}
テレビと連携するサービスの話。案件ごとにぐわーっとスケールさせて、
終わったら全部削除とか。期末とか年末はやっぱり忙しいそう。Rakeタス
クでいろいろ出来るようにしていた。
あと、PanisherというNodeJS製ベンチマーククラスタ使って、想定される
シナリオを作って対策し、負荷が原因のトラブルはほぼゼロになったとの
こと。良さそう。
## [Git を使ったツール開発](http://yapcasia.org/2014/talk/show/a88619fc-034a-11e4-9357-07b16aeab6a4)
{{< speakerdeck "2ddcc7c0116f0132713266e2202859ae" >}}
ghqは自作の[emacs-helm-ghq](https://github.com/masutaka/emacs-helm-ghq)で毎日使っていて、GitHub Kaigiでも紹介され
たgit-pr-releaseは業務で毎週使っているので、聴いてみたかったトーク。
Gitコマンドの濃い話も聞けました。このトークも超満員で地べたに座って
いたので、上半分しかスライドが見えなかったけどorz
git-browse-remote、以前試したことあったみたい。emacsから使えたら便
利そうです。
## [コマンドラインツールについて語るときに僕の語ること](http://yapcasia.org/2014/talk/show/b49cc53a-027b-11e4-9357-07b16aeab6a4)
{{< speakerdeck "be2e75b011500132bed77eaf0ae1314a" >}}
力強くて熱いトークだった。最近のCLIツール界隈も熱いですね。
自分でCLIツール作ると、なんとなくシェルスクリプトになってしまうので、
GOとかRuby(Gem)とかで作るようにしたい。cli-init使ってみたけど良さげ
でした。
## [DeNAが歩んだデプロイ自動化への道](http://yapcasia.org/2014/talk/show/fb55d99c-fde1-11e3-b7e8-e4a96aeab6a4)
(スライドがアップされたらここに貼る)
誰もが通る道ですね。DeNAの具体的な話が聞けて参考になった。
## [ウェッブエンジニアのローレベルプログラミング](http://yapcasia.org/2014/talk/show/aed8a03c-ebac-11e3-bd6d-c7a06aeab6a4)
[スライドはこちら](https://docs.google.com/presentation/d/1eyawDBqXlUSS40kVEGYMP79c3xhyNX_VbTJ68ziLJSM/edit#slide=id.p)
うちのRaspberry PI、最近買った体重計に温度測定の仕事奪われているの
で、こんなのやってみようかな(ハードル高め
## [How's startup life? - working as CTO in Japan](http://yapcasia.org/2014/talk/show/6687aaca-034a-11e4-9357-07b16aeab6a4)
(スライドがアップされたらここに貼る)
ラングリッチにジョインした頃を思い出し、懐かしい気分になりました。
## [開発合宿!!!!](http://yapcasia.org/2014/talk/show/4d0289d0-034a-11e4-9357-07b16aeab6a4)
{{< speakerdeck "eeec3ad011bb0132c86d02e2e0c65448" >}}
こちらも懐かしいです。和室で開発合宿は腰に来ますよねw
★ここから2日目
## [Dockerで遊んでみよっかー](http://yapcasia.org/2014/talk/show/97cc7bbc-ef25-11e3-b7e8-e4a96aeab6a4)
{{< slideshare "y0L3r2dK85XKqX" >}}
丁寧なスライドなので、これをなぞれば手軽にDocker試せそうです。
## [Google BigQuery で DWH 構築](http://yapcasia.org/2014/talk/show/2eb3bf9e-fe54-11e3-b7e8-e4a96aeab6a4)
{{< speakerdeck "5c680810121d0132c86f02e2e0c65448" >}}
120億レコードを5秒でフルスキャン(インデックスなし)はやはりすごい。
nginxとアプリログの置き場所、Google BigQueryにしようか、Amazon
RedShiftにしようか悩み中。試すこともできていないんですが。。
## [モバイルアプリとAPIのありかたを考える2014](http://yapcasia.org/2014/talk/show/77109da0-00b8-11e4-b7e8-e4a96aeab6a4)
{{< speakerdeck "471ed790133201320887465724abaa59" >}}
MBaaS(Parse)を使ったiOSアプリの話。Dropbox Datastore APIも良いとの
こと。チラシルでJSON-RPC 2.0 batch使っているらしい。
RPCって最近聞かなかったけど、モバイルが重要になってきてまた盛り返し
ているのだろうか。
## [OAuth/OpenID Connectを用いてID連携を実装するときに気を付けること](http://yapcasia.org/2014/talk/show/cc57f3ca-01b8-11e4-b7e8-e4a96aeab6a4)
{{< speakerdeck "c8f0f10012420132ea3636ee7b6c2ab8" >}}
ソーシャルログインのセキュリティの話。
## [趣味開発のためのクラウド/VPS活用術](http://yapcasia.org/2014/talk/show/adfd5cb8-01c1-11e4-9357-07b16aeab6a4)
{{< speakerdeck "36c6ae8012470132c86d02e2e0c65448" >}}
サーバ立てまくるいい話でした。
[VULTR、東京リージョンあるし安いし、良いみたいです。](http://uzulla.hateblo.jp/entry/2014/03/06/141243)
## [キーノート](http://yapcasia.org/2014/talk/show/4c1b9652-0c86-11e4-aec0-ad686aeab6a4)
(スライドがアップされたらここに貼る)
@typesterさんによる壮大な自己紹介。いい話だった。
一度の人生楽しまなきゃ損!
できているかな。。
--------------------------------------------------------------------------------
title: "QuickSilverからLaunchBar+Snapに乗り換えた"
date: "2014-08-24"
--------------------------------------------------------------------------------
{{< figure src="/images/launchbar-logo.png" link="http://www.obdev.at/products/launchbar/index.html" target="_blank" rel="noopener" alt="画像" >}}{{< figure src="/images/snap-logo.png" link="https://itunes.apple.com/jp/app/snap/id418073146" target="_blank" rel="noopener" alt="画像" >}}
OSXのランチャーの話。
日本語入力ONの時に[QuickSilver](http://qsapp.com/)を使うと、「emacs」と打つつもりが
「えまcs」になります。しかたがないのでQuickSilverを一度終了して
日本語入力OFF、もう一度「emacs」と打っていました。憂鬱です。
職場の同僚に聞いたところ、[LaunchBar](http://www.obdev.at/products/launchbar/index.html)は自動で日本語入力OFFにしてくれ
るそうなので、早速乗り換えました。クリックボード履歴の機能も付いて
いたので、[ClipMenu](http://www.clipmenu.com/ja/)も要らなくなるかも。
QuickSilverのHotKeyも使っていたので、同じく紹介された[Snap](https://itunes.apple.com/jp/app/snap/id418073146)をインストール。
ちょっとハマったのが、Symbolic linkのApplicationがLaunchBarの検索対
象にならないことでした。brew caskを使っているので、そういうのが出来
てしまうのですよね。
["Use OS X LaunchServices database"をOFFにすれば検索対象になりました。](http://www.obdev.at/products/launchbar5/faq.html)
DockのLaunchBarをクリックし、メニューバーを表示。
Index -> Show Index に進みます。
あとは"Use OS X LaunchServices database"をOFFにするだけです。

この画像見るとわかりますが、iTunesで任意の曲を再生とかのIndexは削除
しました。純粋にランチャーとしてしか使わないので。
**追記(2014-12-04):**
Snapはショートカットキーを複数回打つと、カレントと当該アプリがトグ
ルするのがツライので、これだけのためにQuickSilver入れなおしました。
--------------------------------------------------------------------------------
title: "10代の自分に教えたかった歯のメンテナンス方法これだけ"
date: "2014-08-10"
--------------------------------------------------------------------------------
歯間ブラシは絶対使え。
{{< amazon asin="B006QHOKMU" title="歯間ブラシ Sサイズ 15本" >}}
私は歯並びは良い方で、親知らずもありません。でも、高2の時に銀歯が8本くらい一気に増えてしまいました。
そんな10代の自分に送る鎮魂記事。もっと早くから使っていれば。。
## 超重要な歯間ブラシ
使い始めてから慢性的な歯茎の腫れが引き、出血もなくなり、虫歯になりづらくなりました。3年くらい継続しています。
お世話になった歯医者さんがこちら。神戸に住んでいた時に通いました。
[神戸市西区の予防歯科なら「たかし歯科」](http://www.takashishika.com/)
そもそも初めは歯茎の腫れがひどく、歯間ブラシが全く通りませんでした。歯石を取ってもらって、細いブラシが通る歯から開始。
重要なのは歯間ブラシがきちんとブラシになっていることです。プラスチックの歯間ブラシは止めましょう。
毎日寝る前に使っていて、結構取れます。使う前はこれが腫れや虫歯の原因になっていたんだなあと。。。
はじめは面倒でしたが、習慣化してからは使わないと気持ち悪くなりました。
## 日々のメンテナンス
まあ、メンテナンスと言っても、そんなに気合入れていません。歯磨きと歯間ブラシは寝る前だけです。
起きているときは唾液の殺菌作用が効くため、それほど神経質にならなくても良いみたい。
そういえば昔は食べて3分以内に磨くように言われましたが、今は30分おいた方が良いみたいですね。食べた直後は口の中が酸性になっており、歯が柔らかくなっているためだそう。
歯茎と歯を痛めたくないので、歯ブラシは柔らかめ、デンタルペーストは研磨剤のないタイプを使っています。
{{< amazon asin="B00CI210FW" title="トゥーススマイル 薬用デンタルペースト" >}}
寝るときはナイトガードを使います。
私は寝るときに歯を食いしばるらしく、歯茎が少し減ってきたので、寝る前はナイトガードをしています。歯医者さんで5000円で作れます。

ナイトガードにはハードタイプとソフトタイプがありますが、ハードタイプを作りましょう。
東京に戻った後に壊れたので、近所の歯医者で作ってもらったんですが、これがソフトタイプでおまけにサイズが合わない。今思えばやる気のない歯医者だったなあ。。。
近所の別の歯医者さんで作ってもらったナイトガードが上の写真です。調子は上々。定期健診もここでしています。
[宮内デンタルクリニック](http://www.miyauchidental.com/)
良い歯医者さんを見つけるのは難しいですね。
朝はリステリンでグチュグチュ。
{{< amazon asin="B002E1AWQK" title="薬用LISTERINE(リステリン) クールミント 1000mL (医薬部外品)" >}}
## 3ヶ月に1度の定期健診
3ヶ月に1度、歯医者で歯石を取ってもらいます。最近は色素沈着しやすいので、クリーニングもしてもらいます。ホワイトニングはしていません。
歯医者からはハガキでお知らせが来て、電話で予約するんですが、せめてメールで通知、ウェブから予約にならないのかなあ。
と思い、以前聞いてみたらメールでお知らせはできないとのこと。不便。。
## まとめ
いろいろ書きましたが、早く再生医療が使えるようになって欲しいですね。メンテナンスは面倒ですから。
--------------------------------------------------------------------------------
title: "『パーフェクトRuby on Rails』のサンプルアプリにHerokuボタンを付けてみた"
date: "2014-08-09"
--------------------------------------------------------------------------------
{{< figure src="/images/heroku-logo-light-300x100.png" link="https://www.heroku.com/" target="_blank" rel="noopener" alt="画像" >}}
Herokuボタンがリリースされました。
[Heroku|Introducing Heroku Button](https://blog.heroku.com/archives/2014/8/7/heroku-button)
詳しくはnaoyaさんの記事をどうぞ。
[Deploy to Heroku / Webアプリケーションのポータビリティ再び - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20140809/1407556488)
ざっくり言うと、これだけでGitHubの任意のブランチをHerokuにデプロイ出来ます。
- GitHubにHerokuで動くコードを置く
- 上記リポジトリのrootにapp.jsonを追加する
- README.mdにHerokuボタンを追加する
もちろんHerokuアカウントは必要です。
## 試してみた
試しに{{< post "2014-07-10-1" >}}で写経した、『パーフェクトRuby on Rails』の
サンプルアプリにHerokuボタンを付けてみました。
{{< github_repo "masutaka/awesome-events" >}}
デプロイすると、このような自動生成されたURLが割り当てられます。
http://blooming-reef-2288.herokuapp.com/
blooming-reef-2288の部分は自分で指定することも出来ます。

アプリケーションを実行するために環境変数やマイグレーションが必要で
あれば、app.jsonに指定します。
https://github.com/masutaka/awesome-events/blob/master/app.json
## 任意のブランチもデプロイ出来る
特筆すべきは、任意のブランチをHerokuにデプロイ出来ることです。
以下のhogehogeブランチのHerokuボタンをクリックすると、左上のタイト
ルがHogeHogeになります。
https://github.com/masutaka/awesome-events/tree/hogehoge
CIにhookすれば、テストが成功したら自動でHerokuにデプロイも出来そう
です。
今までは、他の開発者やテスターに動く環境を提供するためには、
[Quipperのように](http://blog.madoro.org/mn/95)自力でなんとかする必要がありましたが、もうそんなこと
ありません。これは本当にすごい!!
privateリポジトリは未対応なようなので、仕事のリポジトリにはまだ使え
ませんが...。
## 任意の場所にHerokuボタンを設置
こちらをクリックしてもデプロイすることが出来ます。
{{< figure src="https://www.herokucdn.com/deploy/button.png" link="https://heroku.com/deploy?template=https://github.com/masutaka/awesome-events" target="_blank" rel="noopener" alt="画像" >}}
このようにGitHub以外に設置する場合は、URLパラメータを指定する必要が
あります。
https://heroku.com/deploy?template=https://github.com/masutaka/awesome-events
ブランチも指定できます。
https://heroku.com/deploy?template=https://github.com/masutaka/awesome-events/tree/hogehoge
## ヘルプ
Herokuボタンについて詳しくはヘルプをどうぞ
[Creating a 'Deploy to Heroku' Button|Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-button)
{{< amazon asin="4774165166" title="パーフェクト Ruby on Rails" >}}
--------------------------------------------------------------------------------
title: "初めて会社の技術ブログを書きました"
date: "2014-08-09"
--------------------------------------------------------------------------------
[アジャイル開発で便利だったホワイトボードなどまとめ|feedforce Engineers' blog](http://tech.feedforce.jp/agile_whiteboards.html)
先週の話ですが。
3月に入社して早5ヶ月。
何度か書く書く詐欺してましたが、ようやく書きました。
特に奇をてらったわけではなく、自分が興味あることをまとめただけ。
このブログも同じです。
良い記事が書けると、何度も読み返したくなりますね。
自分が一番の読者です。
次回は技術の話を書く。
--------------------------------------------------------------------------------
title: "こんな方法で漫画を読み忘れないようにしてる"
date: "2014-07-29"
--------------------------------------------------------------------------------
会社の人とこんな話をしていて、我ながら無駄にシステマチックだなと思っ
たので、記事にして晒します。
私は特にガチなヲタではなくて、普通に漫画読むくらいの人です。ダイの
大冒険とかジョジョとかテラフォーマーズとか、あと格闘漫画系をよく読
みます。
ツールは[RTM](https://www.rememberthemilk.com)と[ブックオフオンライン](http://www.bookoffonline.co.jp/)を使っています。
毎週買っている週刊誌はヤングジャンプ(以下ヤンジャン)だけで、
RTM「1雑用」タブの毎週木曜日に登録している。これで忘れない。完璧。

ヤンジャン以外に読んでいるのは、「はじめの一歩」「刃牙道」「ジョジョ
リオン」「ヒストリエ」くらい。
これらはブックオフオンラインのデマチメールに登録していて、新刊が出
たらメールで通知が来るようになっている。通知が来たらRTM「5漫画」タ
ブに登録して、3ヶ月に1回とかのタイミングで漫喫でまとめて読む。完璧。

↑巻数が書かれてない漫画は、読んだことなくてあとで読もうと思った本。
こんなの公開してどうするんや。。
他に良い方法があれば教えて下さい。
**追記(2014-08-01):**
どの巻まで読んだかはメモアプリに記録してます。って更新し忘れてる。。

--------------------------------------------------------------------------------
title: "AWS Summit Tokyo 2014に行ってきた #awssummit"
date: "2014-07-19"
--------------------------------------------------------------------------------
{{< figure src="/images/aws-logo.png" link="http://www.awssummittokyo.com/" target="_blank" rel="noopener" alt="画像" >}}
仕事の都合で、2日目だけ行ってきました。天気は曇りでジメジメ。品川駅からほど近い場所でしたが、歩くには暑い日でした。
全てのセッションの動画や資料はこちらをどうぞ。
[AWS Summit Tokyo 2014 開催レポート|AWS](https://aws.amazon.com/jp/summit2014-report/)
## [オープニング](http://www.awssummittokyo.com/session.html#dj)

DJ田中氏による派手なオープニング。
## [Day2 基調講演 ~Deep Dive to Enterprise~](http://www.awssummittokyo.com/session.html#key2)
{{< youtube "FbmSCqOrV4g" >}}
アマゾン データ サービス ジャパンの社長がAWSを紹介。内容としては、アジリティ(機敏性)重要なのでAWS使うと捗るとかの話。
ガリバー、積水化学、ローソンの講演もありました。大企業もどんどんAWSに移行しています。
[ニュース - ローソンや日通がAWSへ全面移行、AWS Summitで明らかに:ITpro](http://itpro.nikkeibp.co.jp/atcl/news/14/071800143/)

あと、堀内氏からAWSのマネジメントコンソールが日本語化されるとの発表もありました。うーん、使うのかな?
## [静岡県のGISはなぜAWSを使ったのか](http://www.awssummittokyo.com/session.html#gv2)
スピーカーの杉本さんが熱かった!
数々の困難にもめげず、静岡県庁にAWSを導入したお話。一度は理不尽な理由で却下されたけど、3.11を境にクラウド化が一気に進んだそう。
エンジニアの採用どうやってるんだろ?
## [AWS上のシステムはこう作る!InfrastructureAsCode/ImmutableInfrastructureを実践した構築自動化とHinemosで実現するクラウド運用自動化](http://www.awssummittokyo.com/session.html#ea7)
{{< youtube "8WlWNmnub4U" >}}
Chef+Serverspecと、監視ツールHinemosのお話。SI業界にも同じ波は来ているんだなあと。
## [モバイルゲームの全世界オンライン対戦を実現する方法を考察する](http://www.awssummittokyo.com/session.html#me8)
モバイルゲームで実際に使われている構成の話。レベル高い。
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2014/ME-08.pdf)
## [Amazon DynamoDB テーブル設計と実践 Tips](http://www.awssummittokyo.com/session.html#ta10)
{{< youtube "1qMBI9_pnO4" >}}
NoSQLなDynamoDBの話。
Conditional Write使ったオンライン対戦ゲームの話が面白かった。
条件をHPが0より大きい時に設定。数十人同時にボスを攻撃しHPを減らしつつ、最後に攻撃した人カラム(last_attackerだっけ?)にも書き込み。HPがマイナスになると書き込みに失敗することを利用し、戦闘を終了させる。
同じことをMySQLでやるとLockとか考えなくちゃいけないので大変。
ちょっとバグっていたけど、デモを体験できた。
http://bit.ly/dynamoquest
ログ収集のためにRDS使う場合は、DynamoDB使ったほうが良いかも。RedShiftで分析もできるし。
[資料ダウンロード](http://media.amazonwebservices.com/jp/summit2014/TA-10.pdf)
## [【パネルディスカッション】 クラウドで実現する次世代マーケティングとは?](http://www.awssummittokyo.com/session.html#ea10)
{{< youtube "1psFONLdsRU" >}}
すかいらーく、良品計画(無印良品)、スシローのパネルディスカッション。
無印、顧客時間重視。顧客の能動性を重視。
無印、オンプレだと初期費用2000万かかるところ、AWS使って数百万。月額も30万とか。
スシロー、皿にICタグ。位置情報を取得。年10億データだったかな?クラスメソッドと組んでスシデータをAWSへ。Amazon Kinesis使う。
スシロー、AWS導入検討の時に、10億のデータを経営陣や店長の目の前で処理して見せたのが効果的だったとのこと。皮膚感覚で認識している通りのデータを出したり、見落としていたデータを出したり。
新しいことをやるメリットと、やらないことのデメリットの天秤にかけると、やらない理由はないとかの話も。
すかいらーく、無印とスシローもSEOはやってないとのこと。認知度が十分なのと業種的にあまり意味ないからか。店舗登録くらいはやってるそう。
## [【ナイトイベント】JAWS-UG 勉強会 in AWS Summit Tokyo 2014](http://www.awssummittokyo.com/session.html#ne1)
LTのレベルが異常に高かった。

--------------------------------------------------------------------------------
title: "『パーフェクトRuby on Rails』を全部読んで写経してHerokuにデプロイした"
date: "2014-07-10"
--------------------------------------------------------------------------------
{{< amazon asin="4774165166" title="パーフェクト Ruby on Rails" >}}
先月からRailsをガッツリ使うプロジェクトに入ったので、結構気合い入れて
読みましたよ。
Railsはそこそこ分かっているつもりですが、ネットの知識のみでまとまっ
た学習をしたことがなかったので、タイミングの良い発売でうれしかった
です。なんて運がよいのだろう。
『パーフェクト Ruby on Rails』と名乗るだけあって、基本的なことは網
羅していたと思います。後半はRackとかRailtieとかの濃い話題になって、
ちょっとしんどかったです。
まずはひととおり読んで気になったところを付箋。
次に6章を理解しながらひたすら写経。erbはタイプが辛かったのでhamlに
変換しながら。写経なんていつ依頼だろう?本だと前のコードとのdiffが
分からなかったのが辛かったです。
ransackは6章の著者、[前島さんの記事](http://willnet.in/85)で知った程度で、使ったのは初めて
です。簡単に検索フォーム作れてよいですね。
テストは普段から書いているので7章は写経しませんでしたが、
poltergeistが気になりました。capybara-webkit入れることあれば、
代わりに使ってみようかな。
せっかくなので、写経結果をHerokuにデプロイしました。誰でもイベント
を登録できます。
http://masutaka-awesome-events.herokuapp.com/
以下メモ。
```
$ heroku apps:create masutaka-awesome-events
$ heroku addons:add heroku-postgresql --app masutaka-awesome-events
$ heroku run rake db:migrate --app masutaka-awesome-events
$ heroku restart --app masutaka-awesome-events
$ heroku config:add TWITTER_CONSUMER_KEY=
$ heroku config:add TWITTER_CONSUMER_SECRET=
```
P.S.
写経してからこの記事に気づきました...。後悔はしていない。
[パーフェクト Ruby on Rails のサンプルアプリケーションを Github 上で公開しました - willnet.in](http://willnet.in/124)
--------------------------------------------------------------------------------
title: "Railsでapp以下の変更をSpringが検知しない問題を解決した(?)"
date: "2014-07-06"
--------------------------------------------------------------------------------
最近また[Spring](https://github.com/rails/spring)を使い始めたんですが、相変わらずモデルやコントローラ
を変更してもSpringは検知しませんよね?みんなどうしているんだろう?
[files in the app directory are not being watched · Issue #115 · rails/spring](https://github.com/rails/spring/issues/115)
このIssueによると、そもそもRailsのリロードはコストが高いため、
Springはリロードが必要ない設計にしているそう。
うーん、、、とは言ったものの実際問題、モデルのメソッドを修正した後
テストを走らせても、変なエラーが出て、手動でリロードさせると直ると
いうことが多々あります。
ちなみに手動リロードはtouch config/application.rbでイケます。thx!
{{< tweet user="jnchito" id="483822369916870656" >}}
[Zeus](https://github.com/burke/zeus)を使ってた頃はとても快適だったので、Zeusに戻る準備までし始めま
したが、[READMEのWatching files and directories](https://github.com/rails/spring#watching-files-and-directories)やソースを読んで、
自動リロードさせる方法を見つけました。
config/spring.rbを作って、以下を書けばOKです。
```
Spring.watch 'app'
```
他にもwatchしたいディレクトリやファイルがあればこのように書きます。
```
Spring.watch 'app', 'lib'
```
◆適用前
```
$ bundle exec spring status
Spring is running:
56071 spring server | awesome_events | started 25 secs ago
56072 spring app | awesome_events | started 25 secs ago | development mode
$ touch app/models/user.rb
$ bundle exec spring status
Spring is running:
56071 spring server | awesome_events | started 1 min ago
56072 spring app | awesome_events | started 1 min ago | development mode ★変化なし
```
◆適用後
```
$ bundle exec spring status
Spring is running:
56330 spring server | awesome_events | started 33 secs ago
56331 spring app | awesome_events | started 33 secs ago | development mode
$ touch app/models/user.rb
$ bundle exec spring status
Spring is running:
56330 spring server | awesome_events | started 41 secs ago
56429 spring app | awesome_events | started 2 secs ago | development mode ★リロードされたYO!!
```
皆さんはどうしているのか、知りたいところです。
## おまけ1
spec/helper.rbでFactoryGirl.reloadを追加するという記事がいくつかあ
りましたが、FactoryGirlが対応したため不要なようです。
[Should I `Spring.watch "spec/factories"`? · Issue #270 · rails/spring](https://github.com/rails/spring/issues/270)
Ex. [Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring[NEW!] - Qiita](http://qiita.com/unosk/items/c2e2bbc31d97e92803dc)
## おまけ2
Springは0.2秒間隔でポーリングしています。もし動作が重い場合は以下を
試すと良いかもしれません。
その1 ポーリング間隔を開ける
```
# config/spring.rb
Spring.watch_interval = 0.5
```
その2 ポーリングメソッドを:pollingから:listenに変える
```
# Gemfile
gem 'listen', '~> 1.0', group: :development
# config/spring.rb
Spring.watch_method = :listen
```
SpringのREADME.mdによるとlisten gemは1.0系の必要があるみたいです。
See also [lib/spring/watcher.rb](https://github.com/rails/spring/blob/master/lib/spring/watcher.rb)
--------------------------------------------------------------------------------
title: "helm-ghq.elを作ってGO WAYに乗った"
date: "2014-06-22"
--------------------------------------------------------------------------------
先日percolをインストールしたばかりですが{{< post "2014-06-20-1" >}}、[peco](https://github.com/peco/peco)も気に
なっていたのでインストールしました。
後発なだけあって動作が速い!Ctrl-rで検索条件を
IgnoreCase/CaseSensitive/Regexpと変えられるのもお手軽でよいです。
ちなみにデフォルトのキーバインドは[keymap.go#L464](https://github.com/peco/peco/blob/master/keymap.go#L464)付近を見ると分かる
と思います。
あんちぽさんの記事によると、[ghq](https://github.com/motemen/ghq)も良さそうなのでこちらもインストール。
[ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts](http://blog.kentarok.org/entry/2014/06/03/135300)
{{< tweet user="masutaka" id="480650043004026880" >}}
結局私もあんちぽさんと同じ設定にしました..。
\~/.zshenvに`export GOPATH=$HOME`を追加し、\~/.gitconfigに以下を追加。
```
[ghq]
root = ~/src
```
以下を~/.zshrcに追加して、Ctrl-x Ctrl-yでpeco経由のghqを使えるよう
にしました。
```
function ghq_look() {
local selected_dir=$(ghq list --full-path | peco --query "$LBUFFER")
if [ -n "$selected_dir" ]; then
BUFFER="cd ${selected_dir}"
zle accept-line
fi
zle clear-screen
}
zle -N ghq_look
bindkey '^x^y' ghq_look
```
ターミナルは移動が楽になりましたが、Emacs上では移動が大変。。仕方が
ないので、Emacsからghqを使えるhelm-ghq.elを作りました。
{{< github_repo "masutaka/emacs-helm-ghq" >}}
使い方は簡単。M-x helm-ghqするだけです。Ctrl-zでちら見も出来ます。

インストールも簡単。Emacs24以上であればM-x list-packagesからインス
トールできます。
P.S.
[helm-ag.el](https://github.com/syohex/emacs-helm-ag)を大いに参考にさせて頂きました。{{< twitter "syohex" >}}さん、ありがとうございます。
久しぶりにelisp書いたー。
**追記(2014-06-23):**
MELPAからインストールできるようになったので、記事を修正しました。
--------------------------------------------------------------------------------
title: "pyenvとpercolをインストールした"
date: "2014-06-20"
--------------------------------------------------------------------------------
数年前にRTMに入れたままになってましたが、ようやくpercolをインストー
ルしました。zshでhelmっぽい履歴検索をやりたかったためです。
https://github.com/mooz/percol
※ 最近の毎週木曜日は、会社の人ともくもくしています。
作者はあの[KeySnail](https://github.com/mooz/keysnail/wiki/keysnail-japanese)のmoozさん。2年くらい前にお会いしましたが、お元気
でしょうか。
README.mdに書いてあったHOMEにインストールする方法だと、以下のエラー
が出て使えませんでした。Python力ゼロなので分かりません。
```
$ ps aux | percol
Traceback (most recent call last):
File "/Users/masutaka/.local/bin/percol", line 29, in
from percol.cli import main
ImportError: No module named percol.cli
```
試しにpyenvでPythonをインストールし、そこにpipでpercolをインストー
ルすることにしました。
pyenvはbrewでインストールできます。python-build的なものやpipも同時
に入るので楽ちん。
最新のPython2系とpercolはこんな感じでインストールできます。
```
$ pyenv install 2.7.7
$ pyenv global 2.7.7 && pyenv rehash && rehash
$ pip install percol
$ pyenv rehash && rehash
```
percolの設定ファイルは~/.percol.d/rc.pyです。色を自分好みに、キーバ
インドをREADME.mdに書いてあったEmacs風にしました。
```
percol.view.PROMPT = ur"QUERY> %q"
percol.view.CANDIDATES_LINE_BASIC = ("black", "on_white")
percol.view.CANDIDATES_LINE_SELECTED = ("black", "on_green", "underline")
percol.view.CANDIDATES_LINE_MARKED = ("black", "on_cyan")
percol.view.CANDIDATES_LINE_QUERY = ("red", "bold")
# Emacs like
percol.import_keymap({
"C-h" : lambda percol: percol.command.delete_backward_char(),
"C-d" : lambda percol: percol.command.delete_forward_char(),
"C-k" : lambda percol: percol.command.kill_end_of_line(),
"C-y" : lambda percol: percol.command.yank(),
"C-t" : lambda percol: percol.command.transpose_chars(),
"C-a" : lambda percol: percol.command.beginning_of_line(),
"C-e" : lambda percol: percol.command.end_of_line(),
"C-b" : lambda percol: percol.command.backward_char(),
"C-f" : lambda percol: percol.command.forward_char(),
"M-f" : lambda percol: percol.command.forward_word(),
"M-b" : lambda percol: percol.command.backward_word(),
"M-d" : lambda percol: percol.command.delete_forward_word(),
"M-h" : lambda percol: percol.command.delete_backward_word(),
"C-n" : lambda percol: percol.command.select_next(),
"C-p" : lambda percol: percol.command.select_previous(),
"C-v" : lambda percol: percol.command.select_next_page(),
"M-v" : lambda percol: percol.command.select_previous_page(),
"M-<" : lambda percol: percol.command.select_top(),
"M->" : lambda percol: percol.command.select_bottom(),
"C-m" : lambda percol: percol.finish(),
"C-j" : lambda percol: percol.finish(),
"C-g" : lambda percol: percol.cancel(),
})
```
~/.zshrcもREADME.mdとほぼ同じ。[最近hirocaster氏が紹介した、ghnとの
連携](https://hiroki.jp/percol-ghn)も追加。でもghnはだいぶもたつく感じ。
```
function exists { type $1 > /dev/null }
if exists percol; then
function percol_select_history() {
local tac
exists gtac && tac="gtac" || { exists tac && tac="tac" || { tac="tail -r" } }
BUFFER=$(fc -l -n 1 | eval $tac | percol --query "$LBUFFER")
CURSOR=$#BUFFER # move cursor
zle -R -c # refresh
}
zle -N percol_select_history
bindkey '^R' percol_select_history
function ghn_open() {
local url=$(ghn list | percol --query "$LBUFFER")
if [ -n "$url" ]; then
open ${url}
fi
}
zle -N ghn_open
bindkey '^xgo' ghn_open
fi
```
しばらく使ってみます。
--------------------------------------------------------------------------------
title: "会社でルーキー賞に選ばれた"
date: "2014-06-13"
--------------------------------------------------------------------------------
{{< figure src="/images/rookie-s.jpg" link="/images/rookie.jpg" target="_blank" rel="noopener" alt="画像" >}}
3月に入社し{{< post "2014-03-09-1" >}}、先月が弊社[フィードフォース](http://www.feedforce.jp/)の期の終わりで
した。そして今日が納会(※)。運良く、ルーキー賞(の1人)に選ばれました。
※ 納会が年末以外にもあることにビックリ。
何度かお話しましたが、私の能力が云々という話では全くなくて、単純に
タイミングが良かっただけだと感じています。
納会を企画したイベントチーム、ならびに私を選んで頂いた方、業務でお
世話になった方、その他もろもろありがとうございました。
組み込み業界から前職[ラングリッチ](http://langrich.com/)に飛び込んだ時{{< post "2011-04-22-1" >}}、意外
にも今までの経験がちょいちょい役に立ちました。
今のフィードフォースでは、あの時以上にタイミングよく、皆さんのお役
に立てたようで嬉しいです。自分の成長と会社の成長が、いい感じに重なっ
たというか。
役に立ったと思われるのは以下のとおり。
・アジャイル開発の経験
・チームビルディング
・GitHub的ななにか
・Rails&Rspec全般
・Chef&Serverspec全般
・ELF的な知識
地固めが出来たので、これからはより技術的なことに挑戦していきます。
ぶっちゃけ、そちらに関しては他の開発者の方のほうが詳しいので、その
辺は教えを請いつつ学びつつ、チームの力を伸ばしていくことに集中します。
私個人も成長しますが、チーム力を高めたほうがなにかと早いので。
今後ともよろしくお願いします。
--------------------------------------------------------------------------------
title: "アジャイル開発を経験して『アジャイルサムライ』を再読した"
date: "2014-06-08"
--------------------------------------------------------------------------------
{{< amazon asin="4274068560" title="アジャイルサムライ-達人開発者への道-" >}}
{{< post "2013-01-10-1" >}}から約1年半。アジャイル開発をそこそこ経験したので、再読しました。
気になったところをざっと引用。
> P70
> 弟子: もしも、そうした方々にインセプションデッキを作るための時間を割いてもらえないとか、質問にも答えられないほど忙しい場合、私はどうすべきでしょうか?
>
> センセイ: まずはそのことを喜ぶがよい。なぜならお前はプロジェクトの最初の重大なリスクを発見したのだから。
難しい問題だよね。
> P94
> プロジェクトの今の段階で、誰が決断を下すのかということを確認しておけば、後で起きることになるであろうさまざまな混乱を防ぐことが出来る。
重要。
> P131
> 「相対サイズで見積もる」というシンプルな原則がアジャイルな見積りと計画づくりの真髄だ。
無意識にやってて忘れてたけど、改めて認識。
> P161
> 個人の生産性を測るのは、プロジェクトマネジメントのダークサイドへの道だ。個人の生産性を測ると、バグと手戻りと思い違いが増える。一方、強調しようとかスキルを伸ばそうとか知見を共有しようとかいった態度は薄れていく。各人がなんとしてでも自分自身の生産性を確保しようと躍起になるからだ。
ケースバイケースだけど、そういう傾向にはなりやすくなると思う。
> P170
> プロジェクトが既に始まっているのなら、インセプションデッキのすべての課題をこなす必要はないかもしれないが、少なくとも次の5つの質問にはチーム全員が答えられなきゃまずい。
>
> * このプロジェクトにいるのはなぜ?
> * 成し遂げようとしていることは何?
> * 顧客は誰?
> * 解決すべき主要な課題は何?
> * 最終決断を下すのは誰?
このへんは使えそう
> P214
> つまり私からのアドバイスはこうだ。毎日、チームのみんなに「今日、私はこれをやります」とコミットメントを表明するんだ。これを続けていけば、自分でもびっくりするぐらい実際に仕事をやり遂げられるようになっていくはずだ。
これは明日からやる。
> P216
> アジャイルサムライには、ストーリーが半分終わったとか、4分の3終わらせたとか、8割完了したなどいったことは無いのだ。ストーリーは完了したか、していないか。そのどちらかだ。
そうね。
> P291
> アジャイルソフトウェア開発宣言
>
> プロセスやツールよりも個人と対話を、
> 包括的なドキュメントよりも動くソフトウェアを、
> 契約交渉よりも顧客との協調を、
> 計画に従うことよりも変化への対応を、
改めて。
--------------------------------------------------------------------------------
title: "予備知識なしでChromecast買った結果www"
date: "2014-05-31"
--------------------------------------------------------------------------------

結構面白かった
ビッグウェーブに乗る感じで勢いで買った。後悔はしていない。
{{< tweet user="masutaka" id="471307027848134656" >}}
これはiPhone5sのAirPlay使って、MacBookProにiPhoneの画面を表示させ、その画面をChrome拡張のGoogle Cast使ってテレビに表示させてるところ。

これはさらにもう一台のiPhone5sを接続したところ。鏡みたいになって面白い。

YouTubeはウェブ、iPhoneアプリ、ニンテンドー3DSのアプリ、どれでもChromecast繋いだテレビやモニターに表示させられる。もちろん音声も。
上の画像のテレビはスマートTVなのであまり意味ないけど、ただのモニターがスマートTVになるのはまあ面白い。
ニンテンドー3DSの画面を表示させられたらマジ神だったけど、さすがに無理だった。
Chromecastがあればケーブルが要らないので、プレゼンの時は便利かなーと思いました。ネタになりそうなので、しばらく持ち歩くことにします。お声がけくださいませ。
{{< amazon asin="B00KGVN140" title="Chromecast" >}}
See also
[Chromecastが日本発売、何に使えるの?オススメアプリは? 【@maskin】 : TechWave](http://techwave.jp/archives/chromecast_japan.html)
[404 Blog Not Found:来た、観た、呆れた - 品評 - Google Chromecast](http://blog.livedoor.jp/dankogai/archives/51921776.html)
--------------------------------------------------------------------------------
title: "ジモティー使ったら、不要品欲しい人が即効決まった!"
date: "2014-05-31"
--------------------------------------------------------------------------------
今週日曜日の深夜に[ジモティー](http://jmty.jp)で不要品欲しい人を募集したら、速攻決まって本日お渡し出来たので、メモがてらご紹介します。
{{< tweet user="masutaka" id="470607355848441857" >}}
{{< tweet user="masutaka" id="470609481865658368" >}}
{{< tweet user="masutaka" id="470610760885084160" >}}
## お品物1: [寝るときに涼しいエアコンマットあげます](http://jmty.jp/tokyo/sale-ele/article-mwy0)
最寄り駅まで取りに来て頂ける方を0円で募集した。
AM1:41に投稿した直後に6件(1:46, 1:52, 1:52, 1:52, 1:54, 2:01)メールが来た。掲載時に電話番号を書いてたので、1:57に1件電話も来た。電話の方にお譲りすることにして、すぐ受付終了させた。
## お品物2: [DELL Inspiron 530s&ワイヤレスキーボード&ワイヤレスマウス](http://jmty.jp/tokyo/sale-pcp/article-mwy4)
モニターなし、DVD-ROMドライブは壊れてる。家に取りに来て頂ける方を0円で募集した。
AM1:51に投稿した直後に4件(1:55, 2:00, 2:01, 2:05)問い合わせが来たので、一番早かった方にお譲りすることにして、すぐ受付終了させた。
## 雑感
ジモティーはあくまで掲示板サービスとのこと。リスクを理解して使えば、良いサービスだと思います。
> http://jmty.jp/about/fraud
>
> ※ジモティーはあくまでも個人間での情報のやりとりを可能とする掲示板であり、弊社はあくまでもその運営のみを行っております。そのため、取引の相手方とのやり取りの仲介、返金の手続、保証といった対応は一切行っておりません。
家に取りに来てくれるのが大変ありがたいです。ヤフオクは梱包が面倒なイメージがあって、一度も使ったことない。。
--------------------------------------------------------------------------------
title: "ペアプロの話とOSXのsayコマンドや通知センターを使ったタイマーの話"
date: "2014-05-26"
--------------------------------------------------------------------------------
弊社[フィードフォース](http://www.feedforce.jp)の[Qiita:Team](https://teams.qiita.com/)にも書いたのですが、一般的な話なのでこちらにも加筆しつつ紹介します。(書いてたら全面改訂になってしまったw)
## sayコマンドを使ったタイマー
なんだかんだ言って、サウンドが一番気づきやすいです。サウンドが使える環境の方どうぞ。
前職[ラングリッチ](http://langrich.com)の時に使っていたのはズバリこれ。開始の「はじめるでやんす」で始まり、4分50秒から終了予告、最後は「おわったでやんす」。
>$ say 'はじめるでやんす' ; sleep 290 ; say '10秒前'; sleep 5; say '5秒前'; sleep 5; say 'おわったでやんす'
上のように日本語でサウンドを出すときは、「システム環境設定」→「音声入力と読み上げ」からKyokoさんやOtoyaさんの声を追加します。

## 通知センターを使ったタイマー
terminal-notifierをインストール
>$ brew install terminal-notifier
4分50秒から終了予告、5分で「時間ですよ!」。これは今日作りました。
>$ sleep 290; terminal-notifier -message 'あと10秒'; sleep 5; terminal-notifier -message '5秒'; sleep 2; terminal-notifier -message '3'; sleep 1; terminal-notifier -message '2'; sleep 1; terminal-notifier -message '1'; sleep 1; terminal-notifier -message '時間ですよ!'
ワンライナーなのが結構大事です。シェルの履歴は1,000,000件くらいは残しとくと思うので、C-rで簡単に探せます。{{< post "2014-05-18-2" >}}も御覧ください。
## ペアプロの話
ペアプロは前職ラングリッチの時から本格的にやり始めて、効果を実感できています。メンバー間の認識合わせやチーム全体の底上げに、これほど効果のある方法を私は知りません。
なんでこんな実装をするの?と問い詰めたくなったり、なんでこんなことも知らないの?とイライラすることがあれば、ペアプロが効果がある可能性があります。
ペアプロにも流儀があるようですが、私は以下の方法をオススメしています。
・同じPCを使う
・前述のタイマーを使って5分きっかりで交代する
・3セットくらいやったら休憩する
同じPCを使うのは一瞬で交代するためです。以前は使い慣れた自分の環境を使いたいがために、テンポラリコミットをしてgit pushとgit pullしてましたが、10秒くらいはかかってしまいます。同じPCだったら一瞬です。ペアプロはテンポが大事だったりするので、これは重要です。
5分きっかりで交代するのは、上下関係を作らないためと、考え続けるためです。よくあるのは先輩がナビを、後輩がタイピングを務めるパターンでしょう。先輩は思い通りにならない後輩に、後輩は口だけの先輩にイライラするかもしれません。
休憩を入れるのはこのペアプロが本当に疲れるからです。5分で強制的に交代するので、ちょっと考えるのを止めているとタイピングになった時に、なにやったらよいか分かりません。なので、2人ともずっと考えています。本当に疲れます。丸一日ペアプロしたら、とてもじゃないけど残業なんて出来ません。
最後にペアプロとは切っても切れないエディタの話をします。
私は15年来のEmacsユーザですが、最近のペアプロでは主にvimを使っています。相方がvimユーザかつGitHubとGitの学習も込みだったので、Emacsまで使ってもらうは負担だと思ったからですが、私のvim力がちょっとだけ上がるという思わぬ副作用があって嬉しかったです。
Emacserは変態的な設定をする人が多いので、Emacserから見てもEmacsは避けるべきかもしれません(半分冗談ですw)。他の文化を知る良い機会なので、EmacserはむしろEmacsを捨ててVimやSublime Text、Atom、RubyMineなどを積極的に使ったほうが良いかも。
ペアプロでは「謙虚(Humility)」「尊敬(Respect)」「信頼(Trust)」が一層大事になると思います。人間はみんな考えることが違います。今後もHRTの精神を大事にしていきたいです。
{{< amazon asin="4873116309" title="Team Geek" >}}
--------------------------------------------------------------------------------
title: "zshの履歴検索は↑やC-rだけじゃないよM-pもあるよ&履歴マニアの話"
date: "2014-05-18"
--------------------------------------------------------------------------------
少し前にこちらの記事が話題になりました。
[naoya_itoの火を噴いたシェルtips - Togetterまとめ](http://togetter.com/li/652438)
[rebuild.fmのEpisode41](https://rebuild.fm/41/)でも言及されていた気がします。
弊社[フィードフォース](http://www.feedforce.jp)でも、ペアプロの時にこういった話をすることはあります。ただ、C-rやC-uは知られていても、M-pはあまり知られていない雰囲気でしたのでまとめました。
## はじめに
M-pやM-nは、Escapeを押して離してpまたはnです。
OSXのターミナルをお使いの方は以下を設定すると、option-pまたはoption-nが使えます。それ以外の環境ではAltが使えるかもしれません。

## デフォルトの動作を知る
デフォルトのM-pとM-nには、それぞれhistory-search-backwardとhistory-search-forwardが割り当てられています。
敢えて設定を書くとこんな感じです。
```
bindkey "^[p" history-search-backward
bindkey "^[n" history-search-forward
```
"git re"のあとにM-pを続けて打つ様子。"git"にマッチした履歴が現れます。M-nすると戻ってきます。

## 既存の関数をキーに割り当てる
以下の設定をすると、マッチする履歴が変わります。
```
bindkey "^[p" history-beginning-search-backward
bindkey "^[n" history-beginning-search-forward
```
設定場所は~/.zshrcが適切でしょう。{{< post "2002-05-14-1" >}}
"git re"のあとにM-pを続けて打つ様子。今度は"git re"から始まる履歴にマッチします。こちらの方が直感的だと思います。

期待する履歴が現れたらReturnキーで確定して下さい。C-eで行末に移動したくなりますが不要です。
## もう少しカスタマイズ
以下の設定をすると、ヒット後のカーソル位置が変わります。
```
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[p" history-beginning-search-backward-end
bindkey "^[n" history-beginning-search-forward-end
```
"git re"から始まる履歴にマッチするのは変わりませんが、カーソル位置が行末になります。

期待した履歴が現れたらReturnキーで確定してください。カーソル位置が行末なので、こちらの方が自然に感じるかもしれません。Emacsのshell-modeをお使いの方は特に。
この設定はおそらく漢のzshで知ったのだと思いますが、昔すぎて覚えていません。
[漢のzsh (4) コマンド履歴の検索~EmacsとVi、どっちも設定できるぜzsh|マイナビニュース](http://news.mynavi.jp/column/zsh/004/)
## 履歴マニアの話
シェルの履歴を辿るには十分な数の履歴が必要です。この程度の設定は当然でしょう。
```
# 履歴を保存するファイル
HISTFILE=$HOME/.zhistory
# メモリ内の履歴の数
HISTSIZE=1000000
# $HISTFILE に保存される履歴の数
SAVEHIST=1000000
```
※ 信じられないことにHISTSIZEのデフォルト値は30、SAVEHISTは0です。
こちらの設定もオススメです。
```
# $HISTFILEに時間も記録
setopt extended_history
# 全履歴の一覧を出力する
alias hall="history -E -i 1"
```
私が履歴の重要性を知った伝説の記事です。
[横着プログラミング 第3回: 履歴マニア](http://0xcc.net/unimag/3/)
10年以上前の記事というのに、全く色褪せることがありません(褒めすぎ)。
履歴を味方につけて開発スピードを上げましょう!
## おまけ1
M-.(insert-last-word)もオススメです。直前の履歴の最後の引数をカーソル位置に挿入します。続けて打つと履歴を辿ります。意外に便利です。
## おまけ2
以下の設定をするとM-x tetrisでテトリスをプレイ出来ます。有名ですよね?
```
autoload -U tetris; zle -N tetris
```
## おまけ3
私の~/.zshenvと~/.zshrcを晒します。
~/.zshenv https://gist.github.com/masutaka/9287567
~/.zshrc https://gist.github.com/masutaka/9287575
--------------------------------------------------------------------------------
title: "ひらくPCバッグを買った"
date: "2014-05-18"
--------------------------------------------------------------------------------
{{< figure src="/images/hiraku-pc-bug-logo.jpg" link="http://superclassic.jp/?pid=41001" target="_blank" rel="noopener" alt="画像" >}}
型番: D1001G
販売価格: 20,550円
※画像は公式サイトより
今まで使ってたバッグがヘタれてきたので、この「ひらくPCバッグ」を買いました。
[公式サイト](http://superclassic.jp/?pid=41001)には6/27発送予定と書かれていましたが、予定より相当早い1週間で受け取ることが出来ました。
5/10(土) 公式サイトから注文
5/14(水) 5/16に発送を早められるとの連絡
5/16(金) 商品発送のお知らせ
5/17(土) 受け取り
これが今までのCalvin Kleinのバッグです。画像では分かりづらいですが、6年ほど前に買って酷使してきたため色がだいぶ剥げてきました。

中の物を全部出すとより残念感が漂います。今までよく頑張った!

購入したひらくPCバッグ。予想より一回り小さかったです。

開けるとこんな感じ

上の画像にはこんなものが入っています。
- MacBookAir 13inch {{< post "2014-05-12-1" >}}
- Kindle Paperwhite
- Nintendo3DS {{< post "2013-02-16-1" >}}
- メガネケース
- 各種コード類
- 財布
- ハンドタオル
- 折りたたみ傘
- 扇子
- メモ帳
購入前は取っ手がないのが気になってましたが、何か自信があって付けないのだろうと割りきって買いました。
予想より早く届いたので実物も見ませんでした(1週間に10時間だけ開いている、[渋谷の実店舗](http://superclassic.jp/gallery/)に行く予定ではありました)。
人気のバッグだけあってWeb上にたくさんレビューがあります。
- [clmemo@aka: ひらく PC バッグを入手した](http://at-aka.blogspot.jp/2013/04/bag-for-macbook-ipad.html)
- [【新旧比較】あたらしい「ひらくPCバッグ」開封の儀!新旧のひらくPCバッグと徹底比較したぞ! #hiraP|むねさだブログ](http://munesada.com/2013/09/28/blog-2326)
どれも評価が高かったので自然と期待が高まりましたが、まあ予想通りではありました。この辺、発売前にゲームのトレイラーを見過ぎたのと似ているかもしれませんw
MacBookAirやKindleが内ポケットにジャストフィットで入るのは素晴らしいです。衝撃を若干吸収しそうな素材なので、ケースは不要でしょう。
マジックテープで着脱可能な仕切りが3つ付いているので財布とか折りたたみ傘とか、いい感じに収められます。
反面、確かに今までのバッグよりは持ちやすくはありますが、これだけ入れるとさすがに重いです。このブログにあるギター用のショルダーパッド買うかもしれません。出費がかさみます。。
- [あひるちゃんがゆく:オットくんがひそかに「ひらくPCバッグ」を買っていた](http://blog.livedoor.jp/ahiru178/archives/51914730.html)
あと、やはり取っ手はあったほうが良いと感じました。でも今のデザインだと難しいのかもしれませんね。
これから使い倒していきます☆
--------------------------------------------------------------------------------
title: "Railsセミナーに行ってきた #railssemi"
date: "2014-05-12"
--------------------------------------------------------------------------------
[【学生無料!】【Railsセミナー】Why choose Ruby on Rails ? : ATND](http://atnd.org/events/49952)
弊社フィードフォースの応援要員として、メンバーズ様主催のRailsセミナーに行ってきました。メモ程度ですが軽く記録しときます。
◆第1部 名刺管理アプリ「Eight」を育てるチームと技術
Sansan株式会社 宍倉功一さん
法人向けのSanSanは.NETだが、個人向けのEightはRailsを採用。
spider for MySQL使うとテーブル単位でDB分割できて便利。
SLASHで効果測定。新人研修は徳島の一軒家で2週間。
高負荷サービスの話聞けてよかった。
◆第2部 Railsとアジャイルで変える受託開発
株式会社メンバーズ 木村壮介さん
[CircleCIでfeature branchをHerokuに継続deploy - Masatomo Nakano Blog](http://blog.madoro.org/mn/95)
みたいなdeapというツール良かった。受託の関係でHerokuではなく、自社サーバを使うんだっけかな?
◆第3部 変化を産み出すための組織文化作り
株式会社フィードフォース 鈴木龍さん
他の発表より生々しい感じで存在感を出せてた感。途中の「お金は大事だよー」の画像とか、HipChatの実際のチャットとか追加されてて、数日前の素振りよりもすごく良くなってた。
◆第4部 国内最大級のクラウドソーシングサービス「クラウドワークス」のつくりかた
株式会社クラウドワークス 大場光一郎さん
CIはJenkinsツライので[SEMAPHORE](https://semaphoreapp.com/)を採用。
Amazon Redshift(分散RDBS)を使用。
- 分析用のプラットホームに向いてる
- Hadoopに似てる
- FlydataでRedShiftに転送
なぜCircleCIじゃなくてSEMAPHOREを採用したのでしょう?と質問したら、無料期間中に最後までテスト出来たのがSEMAPHOREだけだったからとのこと。CircleCI含めた他のサービスはは15分以上かかるテストkillされてしまったらしい。
◆懇親会
何人かの方とお話出来た。弊社のメンバー多めだったけど。。
大場さんと話すのがちょっとした目的だったので、ホント来た甲斐がありました。
{{< tweet user="koichiroo" id="465044327878508544" >}}
{{< tweet user="masutaka" id="465045088092303360" >}}
ちなみに私が大場さんを認識したのは{{< post "2007-10-04-1" >}}でした。しかもここ、メンバーズさんのサイトでした。いろいろ繋がります。ちょっと見ると、ソニックガーデン興す前の倉貫さんもいらっしゃる。
--------------------------------------------------------------------------------
title: "MacBook Airを買い替えたよメモ"
date: "2014-05-12"
--------------------------------------------------------------------------------

新マシンへの引っ越しもだいたい終わったのでメモ。
GW中でしたが、注文から約1週間で受け取れました。
4/29(火) apple.jpから注文
5/ 3(土) 上海から出荷のお知らせ
5/ 6(火) 受け取り
2010年秋モデルからの買い替えです。おおよその違いは以下のとおり。キーボードはなんとなくUSに変えました。会社もUSにしとくんだったなあ...。
| |旧|新
|---|---|---
|モデル|[13-inch, Late 2010](https://support.apple.com/kb/SP618?locale=ja_JP)|[13-inch, Early 2014](https://support.apple.com/kb/SP700?locale=ja_JP)
|CPU|1.86GHz Intel Core 2 Duo|1.4GHzデュアルコアIntel Core i5(Turbo Boost使用時最大2.7GHz)
|CPUキャッシュ|6MBオンチップ共有二次キャッシュ|3MB共有L3キャッシュ
|Memory|4GB|8GB
|SSD|256GB|256GB
|キーボード|JIS|US
移行アシスタンスは使わずに手動で移行しました。HOME以下にゴミファイルが溜まってそうだったし、Brewfile{{< post "2014-03-19-2" >}}があるのでそんなに手間ではないと思ったからです。実際、SSDの空きが60GBから130GBくらいに増えました。
コマンドやアプリ類はBrewfileでサクッとインストール。iTunesの音楽ファイルやiPhotoの画像ファイルは、共有設定からリモートログインをONにして、rsyncでコピー。Wifiなので1昼夜かかりました。Dropboxも時間かかった。
iTunesは~/Music/iTunesを上書きする感じでいけました。
iPhotoは~/Pictures/iPhoto Libraryを~/Pictures/iPhoto Library.photolibraryにリネームが必要でした。
iBooksはよくわからなかったのと数も少なかったので、手動で対応。
最後にFinderのlocaleをenにして完了。
```
$ cd /System/Library/CoreServices/SystemFolderLocalizations
$ sudo mv ja.lproj ja.lproj.bak
$ sudo cp -r en.lproj ja.lproj
$ killall Finder
```
1週間くらい使った感じ、Chrome(feedly)とVagrant(VirtualBox)をストレスなく使えるようになって満足です。買ってよかった!
--------------------------------------------------------------------------------
title: "Emacs の自動保存ファイル (#*#) やバックアップファイル (*~) の作成先変更まとめ"
date: "2014-05-11"
--------------------------------------------------------------------------------
Emacs をデフォルトの設定で何かファイルを編集していると、たくさんファイルが出来てゲンナリします。

あと、起動した Emacs 単位でこういうファイルも作られます。

ファイルを保存すると①と②が消えます。③は残ります。Emacs を終了すると④は消えます。
当然ですが、Emacs が強制終了すると①②④は消えません。
## 一切作らない方法
③を作りたくない方は多いと思うので、こんな設定をする方も多いと思います。
```elisp
(setq make-backup-files nil)
```
④も作りたくない方はこちら。Mule 時代は HOME に作られたので、結構ウザかったです。
```elisp
(setq auto-save-list-file-prefix nil)
```
②も作りたくない方はこちら。
```elisp
(setq create-lockfiles nil)
```
①は調べてません。出来ないかもしれません。
## 作成先の変更
とはいえバージョン管理していない場合、③はあればうれしいかもしれません。
実は③の作成先はカスタマイズ可能です。HOME 以下のファイルを対象に、OSX のゴミ箱 `~/.Trash` に変更してみましょう。`~/.Trash/!Users!masutaka!hoge!aaa.txt~` のようなファイルが作られます。
```elisp
(add-to-list 'backup-directory-alist
(cons (expand-file-name "~/") (expand-file-name "~/.Trash/")))
```
ついでに①も変更してみます。同様に `~/.Trash/#!Users!masutaka!hoge!aaa.txt#` のようなファイルが作られます。
```elisp
(add-to-list 'auto-save-file-name-transforms
`("~/\\([^/]*/\\)*\\([^/]*\\)$" "~/.Trash/\\2" t))
```
④はもっと簡単です。こちらも `~/.Trash/.saves-70938-Takashi-no-MacBook-Air.local~` のようなファイルが作られます。
```elisp
(setq auto-save-list-file-prefix "~/.Trash/.saves-")
```
詳しくはヘルプ (F1 v) をご覧ください。
②は分かりませんでした。
## DRY に書く
EmacsLisp もプログラミング言語です。{{< wikipedia word="Don't_repeat_yourself" text="DRY" >}} に書きます。
```elisp
(let ((target-dir (expand-file-name "~/"))
(dest-dir (expand-file-name "~/.Trash/")))
;; ① 自動保存ファイル (#*#) の作成先変更
(add-to-list 'auto-save-file-name-transforms
`(,(concat target-dir "\\([^/]*/\\)*\\([^/]*\\)$")
,(concat dest-dir "\\2")
t))
;; ③ バックアップファイル (*~) の作成先変更
(add-to-list 'backup-directory-alist (cons target-dir dest-dir))
;; ④ 自動保存リスト (.saves--) の作成先変更
(setq auto-save-list-file-prefix (expand-file-name ".saves-" dest-dir)))
```
**追記(2014-05-12):**
cvmat さんに教えていただいたので、②を作らない方法を追記しました。
{{< tweet user="cvmat" id="465701466812862464" >}}
--------------------------------------------------------------------------------
title: "masutaka.netをCapistrano3でデプロイ"
date: "2014-05-03"
--------------------------------------------------------------------------------
{{< figure src="/images/CapistranoLogo.png" link="http://capistranorb.com/" target="_blank" rel="noopener" alt="画像" >}}
http://masutaka.net/ 以下の静的なhtmlはGitHubのprivateリポジトリで
管理しており、変更があったらrsyncでコピーしてました。
あまり変更しないのでそんなに困ってませんでしたが、ちょっとダサいの
とCapistrano3を使ってみたかったので、エイヤッと導入しました。
https://github.com/capistrano/capistrano の通りにGemfileに
> gem 'capistrano', '~> 3.2.0'
を追加して、以下を実行しました。
> $ bundle exec cap install
このようなファイルが自動生成されます。
```
Capfile
config
├── deploy
│ ├── production.rb
│ └── staging.rb
└── deploy.rb
```
ファイル名を以下のように変更しました。melodyはVagrantのVMです。
```
Capfile
config
├── deploy
│ ├── prod.rb
│ └── melody.rb
└── deploy.rb
```
ファイルの内容はこんな感じ
{{< gist "masutaka" "d63952f23971ebe55e9d" >}}
Capistrano3からdeploy:setup不要になったので、初回から以下のコマンド
でOKです。
```
# to masutaka.net
$ bundle exec cap prod deploy
# to vagrant
$ bundle exec cap melody deploy
```
/var/www/vhosts/masutaka.net以下にデプロイされます。
```
current -> /var/www/vhosts/masutaka.net/releases/20140502163850/
logs/
releases/
repo/
revisions.log
shared/
```
nginxのrootを/var/www/vhosts/masutaka.net/current/webrootにします。
chalowディレクトリは前述のCapistranoの設定により、以下のような
sharedディレクトリへのシンボリックリンクになります。
> current/webroot/chalow -> /var/www/vhosts/masutaka.net/shared/webroot/chalow
詳細は割愛しますが、chalow+rsyncで上記sharedディレクトリにコピーし
ています。
--------------------------------------------------------------------------------
title: "『チーム開発実践入門』はツライ環境で開発している方にオススメ"
date: "2014-04-26"
--------------------------------------------------------------------------------
{{< amazon asin="4774164283" title="チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド" >}}
第2章のケーススタディにある、以下の様なツライ環境で開発している方にお
すすめの一冊です。
・毎日バグ対応に追われている
・検証用環境がない
・適切なバージョン管理システムを使っていない。もしくはバージョン管理システムを適切に使っていない
・リファクタリングできない、もしくは奨励されていない
・リリース手順が複雑
チームで開発するために必要なノウハウが広く浅く書かれています。手始めに
この本を読んでから『{{< amazon_link asin="477416366X" title="GitHub実践入門" >}}』や『{{< amazon_link asin="B00BSPH158" title="入門ChefSolo" >}}』に進むと良いので
はないでしょうか。
幸いにも私はそれほど当てはまらない職場で働いている(いた)ため、ほぼ既知
の内容でしたが、第6章のデプロイの自動化や第7章のリグレッションテスト
は思考を再整理する上で有用でした。
個人的にはSeleniumはいきなり導入するものではなく、Capybaraでカバーでき
ないブラウザ依存のテストをするくらいが良いとは思いますが。
第3章ではバージョン管理の歴史が書かれています。初めて使ったSCMがRCSだっ
た私のようなおっさんホイホイの章でもあります。(そういえば20年くらい前の
キ○ノンのある部署ではNFS上に巨大なRCSファイル群が配置され、RCSなのにリ
ポジトリのように扱えました。今考えるとすごい環境だったなあと思います。)
ちょっと気になったのが第4章のチケット管理。
> P112
> チケット管理システムを使って、チケットを中心として開発フローを組み立て
> た方法論をチケット駆動開発(TiDD)と呼びます。
個人的にはチケット管理システムにこだわる必要はないと思います。付箋紙を
使ってもTiDDはできるので。
取り留めがなくなってしまいましたが、何か引っかかるものがある方は読むと
良いと思います。
※ Amazonのレビューにも同じ内容を投稿しました。
--------------------------------------------------------------------------------
title: "NHKニュース24で遊んでたら今日のピックアップツイートに採用された件"
date: "2014-04-25"
--------------------------------------------------------------------------------
今年2月に、最後の3種の神器であるテレビが来たわけですが、最近の
NHKニュースはツイートを表示するんですね。なんとリスキーな...。
というわけでちょっと遊んでみました。
まずは軽いジャブ。ゲストの中山先生(?)の額の汗が気になったので。
{{< tweet user="masutaka" id="459342210740146176" >}}
{{< tweet user="ikicyann" id="459342116833857537" >}}
先を越されてしまいましたorz
{{< tweet user="masutaka" id="459342348804034560" >}}
投げやり
{{< tweet user="masutaka" id="459342528517386240" >}}
ここでちょっと真面目なツイート(キリッ
{{< tweet user="masutaka" id="459342661959168000" >}}
写真撮り忘れたけど、採用されました...
{{< tweet user="masutaka" id="459343687852773376" >}}
オフィスの昼寝のニュースになったので、有益な情報を送信
{{< tweet user="masutaka" id="459343908376682496" >}}
さらに有益な情報を!
{{< tweet user="masutaka" id="459344695769186305" >}}
先ほどの~~本心じゃない~~ツイートが採用されました。なんで?w
{{< tweet user="masutaka" id="459347053005398017" >}}
人生の目標が出来ました!
--------------------------------------------------------------------------------
title: "serverspecでファイルやディレクトリのテストの重複を取り除く"
date: "2014-04-20"
--------------------------------------------------------------------------------
serverspecでは、このようなテストを書くことが多いと思います。
```
describe file '/var/www/vhosts' do
it { should be_directory }
it { should be_owned_by 'root' }
it { should be_grouped_into 'www-data' }
it { should be_mode 775 }
end
describe file '/home/masutaka/.ssh/authorized_keys' do
it { should be_file }
it { should be_owned_by 'masutaka' }
it { should be_grouped_into 'masutaka' }
it { should be_mode 600 }
end
```
テストはDRYにしすぎるべきではありませんが、数が増えてくるとさすがに
冗長なのでこのように変更してみました。
```
describe file '/var/www/vhosts' do
it_behaves_like 'a directory root:www-data 775'
end
describe file '/home/masutaka/.ssh/authorized_keys' do
it_behaves_like 'a file masutaka:masutaka 600'
end
```
対応するshared_examples_forはspec/support/file_support.rbに書きまし
た。メソッドを作ったのは、他にもshared_examples_forがあって重複した
からです。
```
shared_examples_for 'a directory root:www-data 775' do
correct_directory owner: 'root', group: 'www-data', mode: 775
end
shared_examples_for 'a file masutaka:masutaka 600' do
correct_file owner: 'masutaka', group: 'masutaka', mode: 600
end
def correct_directory(owner:, group:, mode:)
it { should be_directory }
it { should be_owned_by owner }
it { should be_grouped_into group }
it { should be_mode mode }
end
def correct_file(owner:, group:, mode:)
it { should be_file }
it { should be_owned_by owner }
it { should be_grouped_into group }
it { should be_mode mode }
end
```
file_support.rbはspec/spec_helper.rbで読み込むようにしています。
```
Dir[File.expand_path('support/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
```
このような書き方も試しましたが、DRYになった感がなかったので、名前を
ベタに指定する方法にしました。
```
describe file '/var/www/vhosts' do
it_behaves_like 'a directory' do
let(:owner) { 'root' }
let(:group) { 'root' }
let(:mode) { 755 }
end
end
shared_examples_for 'a directory' do
it { should be_directory }
it { should be_owned_by owner }
it { should be_grouped_into group }
it { should be_mode mode }
end
```
他の書き方も知りたいなあ。
--------------------------------------------------------------------------------
title: "大江戸Ruby会議04に行ってきた #oedo04"
date: "2014-04-20"
--------------------------------------------------------------------------------
[大江戸Ruby会議04](http://regional.rubykaigi.org/oedo04/)
前日のアルコールが残っていて、着いたのは午後...。バカバカバカバカ。
それでも楽しめました。
柴田さんの発表を聞けなかったことは激しく後悔。
[From 'Legacy' to 'Edge' 2014 edition // Speaker Deck](https://speakerdeck.com/hsbt/from-legacy-to-edge-2014-edition)
何度かお会いしたことがある伊藤さんの発表は、チャレンジングで一番良
かった。
"1年かけてgemを1つ作りました"
Kawamotoさんの発表を聞いて、C言語経験者の端くれとして
ruby-2.1.1.tar.gzをダウンロードしてobject.cを眺めるところまでやった。
"RubyVM読んでみた"
Sasada夫妻の発表は圧巻。勉強にもなりました。メソッド名忘れた。。
"Object Bouquet ~ 幸せの花束・RValue のきらめきを添えて ~"
Nishimuraさんの発表は30歳になって英語留学した話。実際に行動した人の
話は面白いし説得力がある。
"Another language you should learn"
松田さんはこんな発表もするんですね。ソフトウェア開発は建築の手法の
多くを参考にしているので、家を建てることはある意味究極的なことかも
しれない。小学校高学年頃に実家の建て替えをした時、大工さんの仕事を
見るために毎日毎日通ったことを思い出した。
"Hacking Home"
Aokiさんの話も面白かったなあ。同期会が19:00から恵比寿であったので、
19:00過ぎに撤退..。
"Ruby会議でSQLの話をするのは間違っているだろうか"
**追記(2014-04-20):**
スライドはこちらにまとまってました。この記事へのリンクもありがとう
ございます。
[大江戸Ruby会議04参加しました! スライド・リンクまとめ - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/oedo-ruby-kaigi-04-asakusa-rb/)
あとで読むかも。
[Ruby Hacking Guide を Kindle で読めるようにする - Stats of the Rivers](http://makimoto.hatenablog.com/entry/2013/10/20/Ruby_Hacking_Guide_%E3%82%92_Kindle_%E3%81%A7%E8%AA%AD%E3%82%81%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
[Ruby Under a Microscope を読んでみた (つまみぐい紹介編) // Speaker Deck](https://speakerdeck.com/yotii23/ruby-under-a-microscope-wodu-ndemita-tumamiguishao-jie-bian)
--------------------------------------------------------------------------------
title: "Ubuntu13.10のVagrantで/vagrantが見れなくてハマった"
date: "2014-04-12"
--------------------------------------------------------------------------------
`ls /vagrant`から返ってこなくて、今日はずっと調べてました。。。
BoxはUbuntu Officialのやつ
http://cloud-images.ubuntu.com/vagrant/saucy/current/saucy-server-cloudimg-amd64-vagrant-disk1.box
結論から言うと、vagrant-vbguest pluginをインストールし、vagrantを起
動、vagrantの中で/usr/lib/VBoxGuestAdditionsを見えるようにしてあげ
ればOK。道は長かった。
> $ vagrant plugin install vagrant-vbguest
> $ vagrant up
Vagrant起動の途中でvbguest pluginによって
/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
がvagrantにインストールされます。
この時点ではマウントに失敗します。
```
default: /vagrant => /Users/masutaka/projects/example.com
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` /vagrant /vagrant
```
sshログインして、/usr/lib/VBoxGuestAdditionsを見えるようにしてあげます。
/opt/VBoxGuestAdditions-4.3.10はvbguest pluginによって作られたディレクトリです。
> $ vagrant ssh
> $ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions
> $ exit
再起動すれば`ls /vagrant`出来るはず!
> $ vagrant reload
なんかwarningが出ます。よく分かりませんが、Boxが4.2.16を要求するた
めのようです。/vagrantは見えるので気にしないことにします...。
```
==> default: Machine booted and ready!
Got different reports about installed GuestAdditions version:
Virtualbox on your host claims: 4.2.16
VBoxService inside the vm claims: 4.3.10
Going on, assuming VBoxService is correct...
GuestAdditions seems to be installed (4.3.10) correctly, but not running.
Got different reports about installed GuestAdditions version:
Virtualbox on your host claims: 4.2.16
VBoxService inside the vm claims: 4.3.10
Going on, assuming VBoxService is correct...
Starting the VirtualBox Guest Additions ...done.
Got different reports about installed GuestAdditions version:
Virtualbox on your host claims: 4.2.16
VBoxService inside the vm claims: 4.3.10
Going on, assuming VBoxService is correct...
```
~/VirtualBox VMs以下のxmlファイル(*.vbox)で確認できます。
```
```
Thanks!
[Vagrant Shared Directory Hangs on Ubuntu 13.10 - Woolie.co.uk](http://www.woolie.co.uk/article/vagrant-shared-directory-hangs-ubuntu-13-10/)
[ubuntu - Vagrant error : Failed to mount folders in Linux guest - Stack Overflow](http://stackoverflow.com/questions/22717428/vagrant-error-failed-to-mount-folders-in-linux-guest)
[Every 2nd boot, "different reports about installed GuestAdditions" · Issue #111 · dotless-de/vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest/issues/111)
--------------------------------------------------------------------------------
title: "RubyのOpenSSL::OPENSSL_VERSIONはなぜ定数?"
date: "2014-04-08"
--------------------------------------------------------------------------------
本日ネットを震撼させているopensslの脆弱性。
[OpenSSLの重大バグが発覚。インターネットの大部分に影響の可能性|TechCrunch Japan](https://jp.techcrunch.com/2014/04/08/20140407massive-security-bug-in-openssl-could-effect-a-huge-chunk-of-the-internet/)
私のMacbookAirにインストールしたrubyはHomebrewのopensslをリンクして
いるので、状況を調べてみました。
{{< post "2014-01-25-2" >}}の方法でrubyをビルドしているので、Homebrewのopensslを
リンクしています。
```
$ otool -L ~/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle
/Users/masutaka/.rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle:
/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) ★これ
/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) ★これ
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
```
`brew info openssl`によると、Homebrewのopensslは1.0.1fです。
今回の対象です。
以下のコマンドでも調べられるようです。同様の結果を得られました。
> $ ruby -ropenssl -e "p OpenSSL::OPENSSL_VERSION"
> "OpenSSL 1.0.1f 6 Jan 2014"
対策が施された1.0.1gにアップデートします。
> $ brew upgrade openssl
shared libraryが置き換わりました。
```
$ ls -alF /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
-r--r--r-- 1 masutaka admin 1569360 4 8 20:21 /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
-r--r--r-- 1 masutaka admin 358016 4 8 20:21 /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
```
しかし、OpenSSL::OPENSSL_VERSIONはそのままです。
> $ ruby -ropenssl -e "p OpenSSL::OPENSSL_VERSION"
> "OpenSSL 1.0.1f 6 Jan 2014"
Ruby-2.1.0の.rbには定義されてなかったので、ruby-2.1.0.tar.gzのCソー
スをgrepしたらext/openssl/ossl.cに以下を発見。
```
rb_define_const(mOSSL, "OPENSSL_VERSION", rb_str_new2(OPENSSL_VERSION_TEXT));
```
OPENSSL_VERSION_TEXTは
/usr/local/opt/openssl/include/openssl/opensslv.hに定義されていました。
```
#define OPENSSL_VERSION_TEXT "OpenSSL 1.0.1g 7 Apr 2014"
```
どうやらOpenSSL::OPENSSL_VERSIONはRubyビルド時に決定されるようです。
opensslはダイナミックリンクなのに、なぜ定数なんだろう?と思った次第
であります。教えて偉い人!
関連ツイート: https://twitter.com/tmd45/status/453383314523439104
**追記(2014-04-09):**
こんな情報が。いつもありがとうございます。
{{< tweet user="cvmat" id="453718250266714112" >}}
**追記(2014-04-10):**
以下の方法でRubyがダイナミックリンクしているopensslのバージョンを
表示できました。
```
$ ruby -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
OpenSSL 1.0.1g 7 Apr 2014
```
[OpenSSL Severe Vulnerability in TLS Heartbeat Extension (CVE-2014-0160)](https://www.ruby-lang.org/en/news/2014/04/10/severe-openssl-vulnerability/)
--------------------------------------------------------------------------------
title: "Suicaを簡単に取り出せるiPhone5ケースを買った"
date: "2014-04-02"
--------------------------------------------------------------------------------

前回{{< post "2014-01-10-1" >}}から3ヶ月経ってませんが、また買いました。
電車通勤というものを始めてみたんです(何年ぶりだろう)。JRを経由しな
いのでPASMOになるんですよね。そうするとオートチャージが付いたビュー
カードは使えない!
京王パスポート(JRのビューカードみたいなの)を調べた感じ、オートチャー
ジ機能がついた定期券はないようなので、普通の(自分でチャージする)
PASMO定期券を買うことにしました。(入社から1ヶ月過ぎたのにまだ買って
ませんがw)
{{< amazon asin="B009UOL9G6" title="SoftBank SELECTION 高品質 カードホルダーケース for iPhone 5 カード収納可能" >}}
そうすると、問題は前回買ったケース。ICカードを取り出すのがやや面倒
なんですよね。以前たつをさんのサイトで見たケースを買うことにしました。
[Suica が格納できる iPhone 5 ケースで通勤も買物も快適!](http://chalow.net/2013-11-06-3.html)
もうひとつの理由は汚れが吸着しやすく、残念な見た目になったこと。
滑りにくくて好きだったんですけどねえ。
かかった費用はこんな感じ。
本体¥1,100 + 送料¥500 - Amazonギフト券¥1,338 = ¥262
白・水色・ピンクの3色パネル付きです。最初、パネルが外れやすいので
は?と不安になりましたが、すぐにピッタリはまりました。見た目もスリ
ムでおしゃれです。滑りやすいので、気をつけないとなー。
SuicaとiPhoneが一緒になってるとめっちゃ快適です。iD(カード)も一緒に
したい。
--------------------------------------------------------------------------------
title: "Emacs-24.3からネイティブプロファイラが使えてた"
date: "2014-04-02"
--------------------------------------------------------------------------------
1. M-x profiler-start で開始。cpu, cpu+mem, mem のどれかを選ぶ。
2. 適当に何か操作する。
3. M-x profiler-report でレポート表示。
これだけです。

profiler-cpu-start()やprofiler-memory-start()がCで実装されているよ
うです。よくわからんけどEmacs遅い時あるわーって方は使ってみてはいか
がでしょうか?
作者は[auto-complete.el](https://github.com/auto-complete/auto-complete)の{{< twitter "m2ym" >}}さん。2009年tokyo-emacs #x02の発表が
Emacs-23.4で取り込まれたんですね。SUGOI!!
[tokyo-emacs - Google グループ](https://groups.google.com/forum/#!forum/tokyo-emacs)
[(tokyo-emacs #x02) : 発表者用ページ : ATND](http://atnd.org/events/1359)
[elpってのもありますが](http://www.mew.org/~kazu/doc/elisp/profile.html)、指定したパッケージの関数全てにadviceかけるよ
うで遅いです。パッケージを跨ぐことも出来ないみたい。
という話を{{< twitter "tomoyaton" >}}として、{{< twitter "hirocaster" >}}の問題を解決出来ました!
--------------------------------------------------------------------------------
title: "Brewfileをシェルスクリプト化したら少し幸せになった"
date: "2014-03-19"
--------------------------------------------------------------------------------
{{< tweet user="fumikony" id="440457566619844608" >}}
ぶ、Brewfileの方がカッコいいじゃないですか..(震え声)
まあ実際そのとおりで、if文とか使えないので不便です。
さらに、すでにインストール済みのパッケージに新バージョンが出ている
と、brew bundleの当該installでエラーになるのも不便です。
今までbrew update => brew outdated => brew upgrade => brew bundleな
どと頭悪い感じに使っていたので、シェルスクリプト化して賢くしました。
下記シェルスクリプトを実行すると、更新対象のパッケージがあれば
upgradeするかプロンプトで問い合わせ(Ctrl-cで中断可)、なければいつも
のinstallフェーズに進みます。
{{< gist "masutaka" "9642146" >}}
作ってみたら、メソッドとデータを分けるという意味でもtapやinstallは
Brewfileとして切り出すべきか...と余計もやもやしましたw
関連記事: 私もBoxen止めてBrewfile+brew-caskにした {{< post "2014-01-25-1" >}}
--------------------------------------------------------------------------------
title: "今さらながらftpコマンドでの自動ログインとか"
date: "2014-03-19"
--------------------------------------------------------------------------------
数年に一回調べるのでメモ。
~/.netrcを下記内容で、パーミッションは600で作成。
```
machine ftp.example.com
login ユーザ名
password パスワード
macdef init
bin
set prompt "ftp://%M%/ > "
cd /hoge
```
ターミナルから`ftp ftp.example.com`を実行すると、バイナリモードに設
定し、自動ログインしてプロンプトをいい感じに、いつものディレクトリ
にcdしてくれる。最後の空行は必須。複数ホストは試してない。
`ftp -d ftp.example.com`などと、`-d`オプションをつけると挙動を確認
できて捗る。
`man ftp`も確認すべし。
[UNIXの部屋 コマンド検索:~/.netrc (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?~%2F.netrc)
--------------------------------------------------------------------------------
title: "フィードフォースに入社してまだ2週間も経っていないけど"
date: "2014-03-13"
--------------------------------------------------------------------------------
リーン開発の現場 P109
>理想とはたどりつくべき場所のことではなく、
>ありたい姿に向かい続けることなんだ!
ビジネス面や技術面でさまざまな困難を抱えたとしても、こんなチームだっ
たら必ず成功するはず。そして今のチームは素晴らしいチーム!
{{< amazon asin="427406932X" title="リーン開発の現場 カンバンによる大規模プロジェクトの運営" >}}
--------------------------------------------------------------------------------
title: "ラングリッチを退職し、フィードフォースに入社しました"
date: "2014-03-09"
--------------------------------------------------------------------------------
{{< figure src="/images/feedforce-logo.png" link="http://www.feedforce.jp" target="_blank" rel="noopener" alt="画像" >}}
去年の11月14日に[ラングリッチ](http://langrich.com/)を退職しました。退職は人生2回目で{{< post "2011-04-22-1" >}}のメタテクノ以来です。
組み込み業界出身でWebの知識があまりない私を受け入れてくれたラングリッチには、本当に感謝しております。
今回の退職と転職活動では、多くの方にご心配とご迷惑をお掛けしました。この場を借りてお礼とお詫びを申し上げます。
## ラングリッチを振り返る
当時のラングリッチは会社設立からちょうど1年、サービスがローンチされてから9ヶ月経ったあたりでした。
社員はまだいなかったので、[社員番号一桁](http://engineer.typemag.jp/article/fshin21)どころか社員第一号でした。社員番号などない的な。
当時起きたことをまとめてみました。
* [2010年7月17日](http://d.hatena.ne.jp/masutaka26/20100717)
* ラングリッチ誕生
* [2010年8月5日](http://d.hatena.ne.jp/masutaka26/20100805)
* [ラングリッチのプロモアカウントに捕捉される。](https://twitter.com/Langrich_Promo/status/20367032928)多分[このツイート](http://twitter.com/masutaka/status/19751756167)をしたから
* [2010年8月25日](http://d.hatena.ne.jp/masutaka26/20100825)
* [ラングリッチのレッスンを初受講。](https://twitter.com/masutaka/status/22084463631)滝のような汗は出たが、かなり面白かったのでレッスンを毎日受け続けることに!(元々私、ラングリッチの生徒だったんです。こんな記事も{{< post "2010-12-19-1" >}})
* [2011年1月1日](http://d.hatena.ne.jp/masutaka26/20110101)
* ラングリッチのtomoyaさんにTwitterのダイレクトメッセージでコンタクトをとり、後日Skypeのチャットでいろいろお話
* [2011年3月2日](http://d.hatena.ne.jp/masutaka26/20110302)
* メタテクノ最終出社日
* [2011年3月3日](http://d.hatena.ne.jp/masutaka26/20110303)
* 有給消化期間を満喫し始める
* [2011年3月11日](http://d.hatena.ne.jp/masutaka26/20110311)
* 14:46に東日本大震災発生。15:00からラングリッチのレッスンが始まってしまった(キャンセルはレッスン開始1時間前までw)。停電のためiPhoneのSkypeを使って、プライ先生に実況中継
* [2011年3月15日](http://d.hatena.ne.jp/masutaka26/20110315)
* 地震の混乱が収まらない中、関西空港でtomoyaさんと落ち合いフィリピンはセブ島にGO!!
* [2011年4月1日](http://d.hatena.ne.jp/masutaka26/20110401)
* サービスの裏側やフィリピンを体験して帰国。この辺からラングリッチのカスタマーサポートのお手伝い開始。開発にも着手し始める
* [2011年4月21日](http://d.hatena.ne.jp/masutaka26/20110421)
* メタテクノ退職日
* [2011年4月27日](http://d.hatena.ne.jp/masutaka26/20110427)
* 川崎から引っ越し。西明石行きの夜行バスに乗る
* [2011年4月28日](http://d.hatena.ne.jp/masutaka26/20110428)
* 荷物が来るまでCEOの家に居候
* [2011年5月2日](http://d.hatena.ne.jp/masutaka26/20110502)
* 荷物が来て、オフィス兼住居への引越し完了
ラングリッチでは本当に色々なことを学びました。スタートアップの黎明期からの成長っぷりを体験できたことはもちろんですし、東京に進出してからは、アジャイル開発、TDD、まともなWebアプリケーションの作り方等、これらは今も自分の資産となっております。
最後の大きなプロジェクトはラングリッチへの恩返しのつもりで、全てを出し尽くしました。しかしこれが本当に大変で、期日までに終わるのかという不安があり昼夜問わず開発していたため、2ヶ月間の総コミット数は637にもなりました。

※表示が変ですが、2013年8月31日から2013年11月1日の総コミット数です。
もちろんこれは開発者の皆さんだけでなく、関係者全員のご協力のおかげです。そもそもPull Request見てくれる人がいないと成立しないですし。
開発内で言うと、セキュリティチェック、サーバ構築、フロントエンド、要件整理等、自然に役割分担されていきました。あ、オレこれやるわ的な。私はアプリ側を実装したため、コミット数が膨れ上がったというわけです。
## 退職後
前回と違って、退職後は悠々自適の生活...とはいかず、転職活動をしていました。9月から始めてましたが、転職活動は今回が初めてだったので、職務経歴書も知らないひどい状態という。。。
大変な転職活動でしたが、面接自体は緊張することもなく、むしろそれぞれの会社の違いを楽しんでいました。その会社でよく使われているエディタはほぼ必ず聞いていましたし。Emacs率低し。
一番大変だったのは、会社によっては出される課題でしたね。私も採用する側だったら何か出すかもしれませんが、全ての会社が出してたら、転職に時間がかかりますね。。。
あとマッチングって難しいんだなあと痛感してみたり。
12月からは[IPEXC](http://ipexc.com/)の開発を手伝っていました。デプロイ環境整えたり、[CircleCI](https://circleci.com/)導入したり、ずっとレッドだったテストを直したり、デザインをマージしたり。実装はあまり出来なかったなあ。申し訳ない。
初めはCTOのポントさんにうちに来てもらって、一緒に開発していました。あとは近所のバーガーキングだったり、渋谷のコワーキングスペースだったり。うちでやってた時は、ラングリッチの最初の頃を思い出しました。
去年の転職活動は連戦連敗のような感じで心が折れそうになりましたが、2月になって状況が好転し、フィードフォースにjoinすることを決めました。
始めに面接というか面談があり、8日後に社長を交えた面接。帰りの電車の中で内定のメールを拝受しました。スピード感あります。
## ちょっと宣伝
知的財産取引のオンラインネットワーク[IPEXC](http://ipexc.com/)ではRailsエンジニアを募集しているみたいですよ。知的財産っていうのは、特許や著作権等の総称で知財やIPとも言います。
- GitHubを使ったPull Requestベースの開発で、CI(CircleCI)が巡回している感じ
- Ruby on Rails 3.2 (4にしたいとのこと)
- JavaScriptはそんなに使っていない
- TDD(Rspec + Capybara Webkit)
- Heroku
- Twitter Bootstrap
- メンバーに外国の方が多いので英語は出来た方が何かと便利ですが、必須ではないです。
この辺興味あれば、{{< twitter "mponto0405" >}}にお知らせ下さい。
## そしてフィードフォースへ
[フィードフォースはBtoBのサービスを提供する会社](http://www.feedforce.jp/corporate/outline/)で、いますごく伸びています。
使われている技術はRuby on Rails, MySQL, AWS, Amazon EMR(Hadoop)等で、レガシーなものも少なからずあります。
そんなフィードフォースに今週から働き始めています。
最初のメタテクノは250名くらい、ラングリッチは10名くらいで、フィードフォースは30名くらいです。人数はラングリッチより少し多い程度ですが、会社の雰囲気やステージは真ん中くらいだと感じました。今までと違った環境がまたよい感じです。
ラングリッチに慣れた身としては「会社っぽさ」に新鮮味を感じるとともに、メタテクノのあの感じも思い出しました。
一週間働いた感想としては、今までの経験は相当生かせそうです。どんどん改善していきたい。ただこの分野は全くの素人なので、ビジネスルールは頑張って覚えます。
Team Geekにある「謙虚(Humility)」「尊敬(Respect)」「信頼(Trust)」を大事にします。
{{< amazon asin="4873116309" title="Team Geek" >}}
## おまけ
恥ずかしながら、最初の面談の時にフィードフォースとラングリッチとの関わりを知りました。[生涯無料キャンペーン](http://langrich.com/news/2012/free_forever)の時にお世話になっていたのですね。。
[ラングリッチ ソーシャルキャンペーン導入事例 |ソーシャルPLUS](https://socialplus.jp/campaign/langrich.html)
--------------------------------------------------------------------------------
title: "Chromeでよく訪れるサイトにアクセスするためのベストプラクティス"
date: "2014-02-13"
--------------------------------------------------------------------------------
こんな感じで、ブックマークバーに名前なしブックマークを登録します。

スペースを取りませんし、faviconだけでも案外分かるものです。
## なぜこうしたか?
実はずっとこの現象に悩まされていました。時々ね。
1. ⌘-tで新しいタブを開く
2. fとか打つとfacebook.comなどと補完されるのでReturnキーを押す
3. facebookに移動することなく、アドレスバーの入力も消える \(^o^)/
4. しかたがないのでもう一度入力する
これ、Chrome拡張の[Speed Dial 2](http://speeddial2.com/)のせいだったんですね。
1でサムネイル付きブックマークの読み込みが始まって、2でフォーカスを
奪われるみたい。
## どうやって解決したか?
安直にSpeed Dial 2を消すと、Googleのトップページっぽいものが表示さ
れてイヤな感じです。良く見るページの読み込みが若干もたつきますし。
なので、Speed Dial 2を削除し、同じくChrome拡張の[Empty New Tab Page](https://chrome.google.com/webstore/detail/empty-new-tab-page/dpjamkmjmigaoobjbekmfgabipmfilij)
をインストールしました。この拡張は新しいタブを空っぽで開くだけの拡
張です。
これでSpeed Dial 2の時より、高速に新しいタブを開くことが出来ました。
よく訪れるサイトは、ブックマークバーから楽々訪問です。
## 新たなきづき
github.comやfacebook.comなど、本当によく訪れるサイトは、表題のベス
トプラクティスを使わず、上の方法(アドレスバーから訪問)を使っていた!
## おまけ
⌘-l(エル)でアドレスバーに移動できます。
--------------------------------------------------------------------------------
title: "phpenvでちょっと古めのphp-5.3.28をインストールしたメモ"
date: "2014-02-13"
--------------------------------------------------------------------------------
ちょっと5.3系があるとうれしいかも的な状況になったので、OSX Mavericksで
php-5.3.28をビルドしてみました。すると、こんなリンクエラーになります。
```
$ phpenv install 5.3.28
(省略)
-----------------
| BUILD ERROR |
-----------------
Here are the last 10 lines from the log:
-----------------------------------------
_load_all_certs_from_file in openssl.o
"_sk_value", referenced from:
_zif_openssl_x509_parse in openssl.o
_zif_openssl_csr_new in openssl.o
_zif_openssl_pkcs7_verify in openssl.o
_php_openssl_parse_config in openssl.o
_php_openssl_sockop_set_option in xp_ssl.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/fpm/php-fpm] Error 1
-----------------------------------------
The full Log is available at '/tmp/php-build.5.3.28.20140213005117.log'.
[Warn]: Aborting build.
```
## 対応方法
Homebrewのopensslをリンクさせればビルドできます。
1. ~/.phpenv/plugins/php-build/share/php-build/definitions/5.3.28
(以下definitionファイル)の先頭、**install_packageの前の行**に以下を追加
> configure_option -R "--with-openssl" "/usr/local/opt/openssl"
2. あとは{{< post "2014-02-09-1" >}}と同じようにビルドすればOKです。
>$ CONFIGURE_OPTS="--with-pear" phpenv install 5.3.28
>$ phpenv global 5.3.28 && phpenv rehash && rehash
## ハマったこと
definitionファイルを編集せずに、CONFIGURE_OPTSの指定だけでビルドし
ようとしてハマりました...。
definitionファイルの最後に追加してもconfigureオプションとして認識さ
れません。
/var/tmp/php-build/source/5.3.28/config.nice
php-buildのソース(シェルスクリプトです)を追った結果、以下の行の前に
書かないとダメということが分かりました。
> install_package "http://php.net/distributions/php-5.3.28.tar.bz2"
理由は単純でinstall_packageがconfigure&makeしているからです。
install_packageはシェルスクリプトの関数で、php-buildで定義されています。
~/.phpenv/plugins/php-build/bin/php-build
さらに言うと、definitionsファイルはphp-buildの中でsourceされている
だけです。
> source "$DEFINITION_PATH"
じゃあもう少し頑張って、どうにかしてCONFIGURE_OPTSの指定だけでビル
ドを成功させようとしましたが、、configureのややこしさと処理の重さに
途中で力尽きました...。
definitionsファイル自体は結構柔軟に出来ていて、configureオプション
を削除したり置換できたりします。詳しくはマニュアルをどうぞ。
> $ open ~/.phpenv/plugins/php-build/man/php-build.5.html
## その他
`--with-pear`を付けないとpecl{{< post "2014-02-09-1" >}}も有効にならないのですね。
そこに依存関係を付けるんだ...。
--------------------------------------------------------------------------------
title: "Homebrewのnginxをphpenvのphp-fpm付きでセットアップしたメモ"
date: "2014-02-11"
--------------------------------------------------------------------------------
最新のPHPを使えるようになったので{{< post "2014-02-09-1" >}}、nginxもセットアッ
プしてみました。
これでようやくOSX MavericksのApache&PHPとオサラバできます。
## php-fpmの設定と起動
~/.phpenv/versions/5.5.9/etc/php-fpm.conf.defaultを以下のように修正し、
同ディレクトリにphp-fpm.confとして保存しました。
userとgroupをコメントアウトしているのは、今回のNgnixはユーザ権限で
動かす適当なものだからです。
listenはnginxとの橋渡しです。今回は同一マシンなのでUNIXドメインソケッ
トを使用しました。
{{< gist "masutaka" "8920206" >}}
自動起動スクリプトを作成しました。
{{< gist "masutaka" "8920245" >}}
上記自動起動用のファイルを設置しました。
```
$ ln -sfv ~/Library/LaunchAgents
```
自動起動ON&起動しました。
```
$ launchctl load -w ~/Library/LaunchAgents/org.php.php-fpm.plist
```
## nginxのインストールと設定、起動
Apacheを自動起動する設定にしていたので削除しました。
```
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
```
Ngnixはbrewコマンドでインストールしました。
(実際はbrew bundle{{< post "2014-01-25-1" >}}でインストールしてます。)
```
$ brew install nginx
==> Downloading http://nginx.org/download/nginx-1.4.4.tar.gz
Already downloaded: /Library/Caches/Homebrew/nginx-1.4.4.tar.gz
==> ./configure --prefix=/usr/local/Cellar/nginx/1.4.4 --with-http_ssl_module --with-pcre --with-ipv6 --sbin-path=/usr/local/Cellar/nginx/1.4.4/bin/nginx --with-cc-opt=-I/usr
==> make
==> make install
==> Caveats
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
To have launchd start nginx at login:
ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
Then to load nginx now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
Or, if you don't want/need launchctl, you can just run:
nginx
==> Summary
� /usr/local/Cellar/nginx/1.4.4: 7 files, 876K, built in 61 seconds
```
上の説明を参考に以下を実行しました。
/usr/local/etc/nginx/nginx.confを以下のように修正しました。
自分しか使わないのでrootも適当です。
{{< gist "masutaka" "8920342" >}}
上記自動起動用のファイルを設置しました。
```
$ sudo cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist /Library/LaunchAgents
```
自動起動ON&起動しました。
```
$ sudo launchctl load -w /Library/LaunchAgents/homebrew.mxcl.nginx.plist
```
http://localhost にアクセス出来ると思います。
**追記(2014-06-22):**
ポート8080をから80に、権限もユーザからrootに変更しました。
--------------------------------------------------------------------------------
title: "HomebrewのphpenvでPHPをインストールしたメモ"
date: "2014-02-09"
--------------------------------------------------------------------------------
Vagrant使ってたから、OSXでPHP使う必要なかっただけだから..(震え声)
そういうわけでphpenvでPHP環境を作ってみました。まずは基礎知識。
- phpenv
Rubyのrbenv、Perlのplenvに相当。複数バージョンのPHPをHOMEにインストー
ルし、切り替えて使うツール。というよりシステムを汚さないために使う感じ。
- pecl, pear
Rubyのgem、Perlのcpanmに相当。peclはCで書かれ、pearはPHPで書かれて
いる。PHPはCで書かれたライブラリ(要は*.so)を動的にロードできないた
め、このように分かれているそう。
- composer
Rubyのbundler、Perlのcartonに相当。アプリごとにライブラリを切り替え
ることが出来る。
## Homebrewのphpenvをインストール
普通にbrewコマンドでインストールします。
(実際はbrew bundle{{< post "2014-01-25-1" >}}でインストールしてます。)
```
$ brew install phpenv
==> Downloading https://github.com/CHH/phpenv/archive/01a2c1e25096f8ff10f2f781428a5d470e1ecaba.tar.gz
Already downloaded: /Library/Caches/Homebrew/phpenv-01a2c1e.tar.gz
==> /usr/local/Cellar/phpenv/01a2c1e/bin/phpenv-install.sh
==> Caveats
To finish installing phpenv:
* Add ~/.phpenv/bin to your $PATH
* Add "eval $(phpenv init -)" at the end of your ~/.bashrc
* Restart your shell
==> Summary
� /usr/local/Cellar/phpenv/01a2c1e: 6 files, 24K, built in 7 seconds
```
上の説明のとおり、~/.zshenvに以下を追加。
> export PATH=$PATH:$HOME/.phpenv/bin
> eval "$(phpenv init -)"
ここで一点注意。phpenvはrbenvを自前で持っているため、元々のrbenvの
パス(brewでインストールしていれば/usr/local/bin)を優先させる必要が
あります。そのため、上では$PATHの最後に追加しています。うーん。
https://github.com/CHH/phpenv#important-notes
## php-buildをインストール
rbenvやplenvと同じように{{< post "2014-01-25-1" >}}、pluginとしてインストールし
ます。
> $ git clone git@github.com:CHH/php-build.git ~/.phpenv/plugins/php-build
cloneが終わるとインストール可能なバージョンを表示できます。
> $ phpenv install -l
とりあえず最新の5.5.9をインストールしてみます。
> $ CONFIGURE_OPTS="--with-pear" phpenv install 5.5.9
> $ phpenv global 5.5.9 && phpenv rehash && rehash
CONFIGURE_OPTSに`--with-pear`を指定しているのは、pearがデフォルト無
効だからです。
~/.phpenv/plugins/php-build/share/php-build/default_configure_options
他のブログでは、default_configure_optionsの`--without-pear`を書き換
えているケースばかりでしたが、こうすれば書き換える必要はありません。
ruby-buildではRUBY_CONFIGURE_OPTSが使えたのに、php-buildでは
CONFIGURE_OPTSなのも注意です。PHP_CONFIGURE_OPTSは使えませんでした。
~/.phpenv/plugins/php-build/bin/php-buildによると
PHP_BUILD_CONFIGURE_OPTSも使えるようです(試してません)。
phpenvとphp-buildを作ったCHH氏はCONFIGURE_OPTSをどうぞと言っている
ので、今回はそれに従いました。
[How to use CONFIGURE_OPTS in php-build - Asciinema](https://asciinema.org/a/5223)
実際configureにどんなオプションが渡されたかは、
/var/tmp/php-build/source/5.5.9/config.niceを見ればよいと思います。
とにかくインストール出来ました。
```
$ php --version
PHP 5.5.9 (cli) (built: Feb 9 2014 02:22:41)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
```
## peclで何かインストール
とりあえずimagickをインストールしました。予めimagemagickはbrewでイ
ンストールしてあります。
> $ pecl install imagick
> $ echo extension=imagick.so > ~/.phpenv/versions/5.5.9/etc/conf.d/imagick.ini
pecl helpでヘルプを見られます。list-allの結果少ないですね。Rubyと違っ
て適宜channelを追加するようです。面倒くさい。。
## pearで何かインストール
しようと思いましたが、面倒になったので止めました。
composerは今度試します。
Thanks!
[phpenv と php-build で複数の PHP を Mac のローカルで管理する - もじばけおなう](http://bko.hateblo.jp/entry/2013/06/26/093057)
[PHP拡張でPEARとPECLの2グループがあるのはなぜですか? Perlな.. - 人力検索はてな](http://q.hatena.ne.jp/1268653217)
[Mountain LionでPHPのビルド - ぱせらんメモ](http://d.hatena.ne.jp/pasela/20120825/mountain_lion_php)
--------------------------------------------------------------------------------
title: "このブログのはてなブックマーク数もGrowthForecastに記録し始めた"
date: "2014-02-04"
--------------------------------------------------------------------------------
前回{{< post "2014-02-03-1" >}}に引き続きこの話題です。
このブログのはてなブックマーク数も記録し始めました。
http://masutaka.net:5125/list/chalow/subscribers
実装はこれ。
https://github.com/masutaka/growthforecast_postman/pull/1/files
今回初めてXMLRPC APIを使いましたが面倒ですね。{{< wikipedia word="XML-RPC" text="Wikipedia" >}}によると
>その後、これに新たな機能を追加したものがSOAPへと発展した。
とあるので、今は廃れた仕様なのでしょうか。
初め、こんな感じでXMLRPC::Client使おうとしたけど、取得後のエラー
チェックに引っかかってうまくいかなかった。
{{< gist "masutaka" "8784655" >}}
[最終的にはNet::HTTP使ったシンプルなもの](https://github.com/masutaka/growthforecast_postman/blob/3c19c1685fa1647b141fe844de23391e1675c014/lib/hatena_bookmark.rb)になりました。RESTに慣れてい
る身としては、こちらのほうが分かりやすい。
See also
[はてなブックマーク件数取得API - Hatena Developer Center](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/getcount#total)
--------------------------------------------------------------------------------
title: "FeedlyやlivedoorReaderの購読者数をGrowthForecastにポストするRubyスクリプト作った"
date: "2014-02-03"
--------------------------------------------------------------------------------
{{< github_repo "masutaka/growthforecast_postman" >}}
settings.example.ymlをsettings.ymlとしてコピーし、適当に書き換えて
main.rbを実行すれば、お手元のGrowthForecastにポストされると思います。
cronに登録しとけばよいかと。
こんな感じで確認できます。
http://masutaka.net:5125/list/chalow/subscribers
## 作ったきっかけ
先日、55はてブ取得できた{{< post "2014-01-25-1" >}}は、Pocketでは68ストックされ
ていたのですよね。

あと、今までは[[TopHatenar] masutaka.net さんの順位](http://tophatenar.com/view/masutaka.net/chalow/)を見ていればなん
となく人気具合が分かりましたが、他のサービスも台頭してきてよく分か
らなくなってきました。更新もリアルタイムじゃないし。
それじゃあ、全部まとめてGrowthForecastに記録すれば分かりやすいかなと。
今のところ記録するのは、FeedlyとlivedoorReaderだけです。Pocketや
はてブは今後対応する予定です。Pocketについてはひとまずパブリッシャー
ツールを申し込みました。
[あとで読まれた回数までわかる!Pocketパブリッシャーツールを使ってみることにしました。サイトの登録方法など|10251](http://10251.net/pocket_publisher_tool_verify)
最初は気になったら[Feedly Subscribers Checker 2](http://knowledgecolors.net/fsc2.html)で調べりゃいいかなー
と思いましたが、調べるうちに履歴も欲しくなってきたw
## 雑感
初めはshell scriptでcurl使うくらいのつもりが、気がついたらそれなり
の大きさになっていました。。
Raspberry Pi{{< post "2013-12-05-1" >}}を有効活用しようとも思っていたけど、使う
意味を見出せなかった。
作るにあたって、{{< twitter "june29" >}}さんの29hours{{< post "2013-04-14-2" >}}を参考にさせて頂
きました。gemとか全く調べずに車輪の再発明する気満々で作ったので、今
後はリファクタリングもする予定です。
Thanks!
[Feedlyでのブログ購読者数を取得するためのメモ|メモ帳代わりのブログ](http://www.absolute-keitarou.net/blog/?p=395)
[RubyでJSON形式の結果が返ってくるURLをParseする - Qiita [キータ]](http://qiita.com/awakia/items/bd8c1385115df27c15fa)
[RSS購読者数を知るための方法をご紹介 / かりんと~く 【 夢猫工房 】](http://yumeneko.pmfan.jp/wordpress/introducing-way-know-rss-subscribers.html)
See also
[The feedly Cloud API](http://developer.feedly.com/)
--------------------------------------------------------------------------------
title: "HomebrewのPostgreSQLをきれいにインストールした"
date: "2014-02-01"
--------------------------------------------------------------------------------
{{< figure src="/images/postgresql.png" link="http://www.postgresql.org/" target="_blank" rel="noopener" alt="画像" >}}
Heroku用にインストールしていた[PostgreSQL.app](http://postgresapp.com/)をHomebrewのものに変更
しました。
## PostgreSQL.app をアンインストール
[[Mac] PostgreSQL.app をアンインストール at technote](http://blog.withsin.net/2012/05/14/mac-postgresql-app-uninstall/) を参考に。
1. /Library/PostgreSQL/9.3/uninstall-postgresql.appを実行
2. /Library/PostgreSQLを削除
3. OSXのシステム環境設定→ユーザとグループからpostgresユーザを削除
4. ~/.zshenvからsource /Library/PostgreSQL/9.3/pg_env.shを削除
環境変数とか残っているので、OSXを再起動するのが無難です。
## HomebrewのPostgreSQLをインストール
まずは普通にbrewコマンドでインストール。
(実際はbrew bundle{{< post "2014-01-25-1" >}}でインストールしてます。)
```
$ brew install postgres
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/postgresql-9.3.2.mavericks.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/postgresql-9.3.2.mavericks.bottle.tar.gz
==> Pouring postgresql-9.3.2.mavericks.bottle.tar.gz
==> Caveats
If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
https://github.com/Homebrew/homebrew/issues/issue/2510
To migrate existing data from a previous major version (pre-9.3) of PostgreSQL, see:
http://www.postgresql.org/docs/9.3/static/upgrading.html
When installing the postgres gem, including ARCHFLAGS is recommended:
ARCHFLAGS="-arch x86_64" gem install pg
To install gems without sudo, see the Homebrew wiki.
To load postgresql:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
postgres -D /usr/local/var/postgres
==> /usr/local/Cellar/postgresql/9.3.2/bin/initdb /usr/local/var/postgres -E utf8 (※1)
==> Summary
� /usr/local/Cellar/postgresql/9.3.2: 2924 files, 39M
```
※1 Homebrewでインストールすると/usr/local/var/postgresがなければ作ってくれます。
上の説明のうち、関係あるものを実行。
自動起動用のファイルを設置
>$ ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
自動起動ON&起動
> $ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
データベース一覧
> $ psql -l
開発に使うユーザhogeを追加
>$ createuser -W -a -P hoge
上記ユーザの確認と削除。
>$ psql postgres
>postgres=# SELECT * FROM pg_shadow;
>postgres=# drop user hoge;
>postgres=# \q
Thanks!
[postgresqlでユーザー一覧を見る方法 - [Swb:]渋谷に住むWEBデザイナの備忘録](http://d.hatena.ne.jp/susan-style/20111227/1324987416)
--------------------------------------------------------------------------------
title: "改めてHomebrewをクリーンインストールしたメモ"
date: "2014-01-25"
--------------------------------------------------------------------------------
BoxenからHomebrewに戻ってきたので{{< post "2014-01-25-1" >}}、改めてまっさらな状
態からインストール。{{< post "2011-07-26-1" >}}以来だね。/usr/localは空っぽにしといた。
http://brew.sh より。
> $ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
インストールが終わると、brew doctorしろと言われた。doctorから促され
るがままにXQuartz-2.7.5.dmgをインストール。
brewのzsh補完ファイルのリンク先をBoxenからHomebrewに変更。
> $ ln -sf /usr/local/Library/Contributions/brew_zsh_completion.zsh ~/.zsh/functions/_brew
※ ~/.zshrcでFPATH=$HOME/.zsh/functions:$FPATHを追加してある。
{{< post "2014-01-25-1" >}}のBrewfile使って、brew bundleで各パッケージをインストール。
Rubyはrbenvから2.0.0-p353とruby-2.1.0をインストール。
```
# ruby-buildはHomebrew管理にはしない
$ git clone git@github.com:sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# 2.1.0のインストール
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.0
$ rbenv global 2.1.0 && rbenv rehash && rehash
$ cat ~/projects/home/Gemfile.txt | xargs gem install
$ rbenv rehash && rehash
# 2.0.0-p353のインストール
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p353
$ rbenv global 2.0.0-p353 && rbenv rehash && rehash
$ cat ~/projects/home/Gemfile.txt | xargs gem install
$ rbenv rehash && rehash
# 前述のGemfile.txtの中身
$ cat ~/projects/home/Gemfile.txt
bundle
ghn
puppet-lint
```
Perlもね
```
# perl-buildはHomebrew管理にはしない
$ git clone git@github.com:tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build
# Perl-5.18.2のインストール
$ plenv install 5.18.2 -Dusethreads
$ plenv global 5.18.2 && plenv rehash && rehash
$ plenv install-cpanm
$ plenv rehash && rehash
$ cpanm < ~/projects/home/cpanfile.txt
$ plenv rehash && rehash
# 前述のcpanfile.txtの中身
$ cat ~/projects/home/cpanfile.txt
App::highlight
HTML::Template
```
PHPはphpenvは自前でrbenv持ってるのね。まあいいか。。
このリポジトリを使えば良いらしい。
> $ git clone git@github.com:CHH/php-build.git ~/.phpenv/plugins/php-build
Thanks!
[phpenv と php-build で複数の PHP を Mac のローカルで管理する](http://bko.hateblo.jp/entry/2013/06/26/093057)
--------------------------------------------------------------------------------
title: "私もBoxen止めてBrewfile+brew-caskにした"
date: "2014-01-25"
--------------------------------------------------------------------------------
{{< figure src="/images/homebrew.png" link="http://brew.sh/" target="_blank" rel="noopener" alt="画像" >}}
Boxenと比べなくても、導入が簡単なので何かとオススメです。
## 要点
- Brewfileを使えば、インストールするパッケージを管理できる
- BrewfileはHomebrewで最初から使える
- brew-caskもインストールすれば、Chromeとかもインストールできる
## Boxenの問題点
{{< post "2013-11-23-1" >}}に導入したBoxenは以下の問題がありました。
○インストールした一部のツールが壊れていることがある。再インストー
ルで直ることもあるし、直らないこともある(詳細は{{< post "2013-11-23-1" >}}の追記
参照)。
> % wget
> zsh: illegal hardware instruction wget
○PuppetfileでRubyレシピ等のバージョンが固定されているため、最新の
バージョンを気軽に試しづらい。というか、レシピのバージョンを上げて
も問題がないか試したり考えたりするのが面倒くさい。
○パッケージをインストールしたり構成を変えるときに、エネルギーがい
る。なんだか腰が重い。
というわけでBoxenはズビっと削除しました。
> $ git clone git@github.com:masutaka/my-boxen.git
> $ cd my-boxen
> $ ./script/nuke --all --force
## 導入方法
Homebrewでは`brew bundle`コマンドが最初から使えます。このコマンドは
カレントディレクトリのBrewfileに書かれたコマンドを実行します。
`brew bundle path/to/Brewfile`のようにファイルを指定することも出来ます。
Brewfileは例えばこんな感じ
> update
> install ack
こちらと同じ意味になります。
> $ brew update
> $ brew install ack
また、brew-caskというコマンドをインストールすることで、Chromeや
Skypeなどのアプリも入れられます。
brew-caskはデフォルトのFormulaには含まれていないので、`brew tap`でリ
ポジトリを追加する必要があります。/usr/local/Library/Taps以下にクロー
ンされ、/usr/local/Library/Formula以下にシンボリックリンクが張られ
ます。
以上を考慮したBrewfileがこちらになります。
> tap phinze/homebrew-cask
> install brew-cask
> cask install google-chrome
各.appは/opt/homebrew-cask/Caskroom以下にインストールされ、
~/Applicationsにシンボリックリンクが張られます。私は今まで
/Applicationsにインストールしていたので、重複した.appを削除しました。
最終的に私のBrewfileはこのようになりました。まだ手動管理アプリがた
くさんあるので{{< post "2011-04-21-1" >}}、移行していく予定です。
{{< gist "masutaka" "8612279" >}}
蛇足ですが、Brewfileで使えるコメントは行頭の#だけみたいです。
=> /usr/local/Library/Contributions/cmd/brew-bundle.rb
Thanks!
[BoxenやめてBrewfile+homebrew-caskにした - 飲んだり寝たり](http://nomnel.net/blog/boxen-to-brewfile/)
[BrewfileでHomebrewパッケージを管理する|SOTA](http://deeeet.com/writing/2013/12/23/brewfile/)
[「BrewfileでHomebrewパッケージを管理する」をやってみた - sonots:blog](http://blog.livedoor.jp/sonots/archives/35251881.html)
**追記(2014-03-19):**
Brewfileをシェルスクリプトにしました。{{< post "2014-03-19-2" >}}
--------------------------------------------------------------------------------
title: "Herokuにデプロイした時にChatWorkに通知するrakeタスク作った"
date: "2014-01-19"
--------------------------------------------------------------------------------
使っているのはこんな環境です。
- HerokuにRailsのProductionとStaging環境がある。
- Stagingで任意のブランチを動かしたいことがある。
今までHerokuにデプロイする時はこうしてましたが、
```
$ git push prod master
```
今後はこのようになりました。
```
$ bundle exec rake deploy:prod
```
Dryrunも出来ます。
```
$ bundle exec rake deploy:prod DRYRUN=1
```
Stagingで任意のブランチを動かしたい時はこちら。
```
$ bundle exec rake deploy:staging BRANCH=
```
{{< gist "masutaka" "8500864" >}}
[Gistのページ](https://gist.github.com/masutaka/8500864)にも補足情報を書きました。
皆さん、Herokuへのデプロイはどんな方法でやってます?
See also
[ChatWorkのAPIを叩けるGemをつくった - 良いあそなすちゃん](http://asonas.hatenablog.com/entry/2013/12/30/165329)
[チャットワークAPIを限定プレビュー公開します!|ChatWorkブログ](http://blog-ja.chatwork.com/2013/11/api-preview.html)
**追記(2014-01-24):**
なぜかデプロイ後のHashが更新されないことがあったので、
`git ls-remote prod`の代わりに`heroku release`を使うようにしました。
なんだかコードが長くなってしまったorz
--------------------------------------------------------------------------------
title: "『過負荷に耐えるWebの作り方 ~国民的アイドルグループ選抜総選挙の舞台裏』を読んだ"
date: "2014-01-13"
--------------------------------------------------------------------------------
{{< amazon asin="4774162051" title="過負荷に耐えるWebの作り方" >}}
現場の生々しい声を知ることが出来て大変面白かったです。
納期が2ヶ月なんですよね。私も去年、同じ期間でボリュームのあるプロジェ
クトに関わったので、胃がキリキリしてきましたw
スゴイなと思ったのが、運用経験の少ない技術でシステムを作ったこと。
毎秒10,000投票以上を実現可能なサンプルプログラムがあり、その後の耐
久テストにもパスしたとはいえ、よく採用したなあと思いました。まあ、
カットオーバー直後は心配で一睡もせずにアクセスログを凝視したそうで
すがw この辺の話もキリキリしてきます。
あとはこれかな。
P43
> 入力されたシリアル番号が正しいものか(事前に発行したものか)を確認する
> ために、
>
> ・データベースを使って発行済みシリアル番号を管理し、その中に入力された
> 番号があるかを検索する
>
> ・データベースではなく、メモリ上で発行済みシリアル番号を管理し、入力さ
> れた番号を検索する
>
> という方法が挙げられましたが、今回は、処理速度を最優先に考えて、検索処理
> をせずにアルゴリズムでシリアル番号の正当性を確認する方法を採用しました。
当初はここがボトルネックになるとの話だったので、この方法を採用した
のはうまいというか、過負荷なシステムならではと感じました。
採用された技術は馴染みのないものばかりでしたが、採用の経緯は参考に
なりました。
というわけでオススメです。
P.S.
P68でtypoを発見。
×ダウウンロードページ
○ダウンロードページ
--------------------------------------------------------------------------------
title: "『Upgrading to Rails 4』をKindleとiBookで読めるようにした"
date: "2014-01-13"
--------------------------------------------------------------------------------
[Upgrading to Rails 4 を読んだ - HsbtDiary(2013-10-26)](http://www.hsbt.org/diary/20131026.html#p02)
遅ればせながら着手。。
## Kindlegenのインストール
あらかじめKindlegenをインストールしておきます。[Amazonからダウンロー
ド](http://www.amazon.com/gp/feature.html?docId=1000765211)してきても良いですが、Homebrewもお手軽でよいと思います。
私のHomebrewはBoxenでインストールしたので{{< post "2013-11-23-1" >}}、kindlegen
をmodules/people/manifests/masutaka.ppに追加してインストールしました。
素のHomebrewの方は、初めに[homebrew-binary](https://github.com/Homebrew/homebrew-binary)をインストールする必要があ
るみたいです。バイナリファイルの扱いが少し変わったんですね。
>$ brew tap homebrew/binary
>$ brew install kindlegen
## mobiファイルとepubファイルへの変換
公開されている書籍をGitHubから持ってきて、kitabuで変換するだけです。
```
$ git clone git@github.com:alindeman/upgradingtorails4.git
$ bundle install --path vendor/bundle
$ bundle exec kitabu export
$ ls output/
tmp upgradingtorails4.epub upgradingtorails4.html upgradingtorails4.mobi
```
kitabuが生成するファイルはepubとhtmlファイルですが、Kindlegenがイン
ストールされていると、mobiファイルも作ってくれるみたいです。もちろ
ん手動で`kindlegen upgradingtorails4.epub`して作ることも出来ます。
あとは、mobiファイルをUSB接続やメールでKindleに転送し、epubファイル
をiBookにドラッグアンドドロップするだけです。
--------------------------------------------------------------------------------
title: "499円のSuica対応iPhone5ケースを買った"
date: "2014-01-10"
--------------------------------------------------------------------------------
{{< figure src="/images/iphone5-suica.jpg" link="http://www.donya.jp/item/25724.html" target="_blank" rel="noopener" alt="画像" >}}
{{< post "2013-10-14-1" >}}にiPhone5sを買ってから、ずっとケースなしで過ごしてき
ました。
それは良いのですが、駅の改札を通るときに財布からSuicaを出すのが大変
面倒だったので(※)、ついにケースを買いました。
※ 定期入れは落としたことがあるので持ちたくなかった。
まだSuicaでテストしてませんが、触った感触は499円(※)のわりに悪くな
い感じです。ただし、背面のGoldは完全に見えなくなりました。
※ 送料は別途210円でした。
上海問屋、結構良いですね〜
http://www.donya.jp/
**追記(2014-01-13):**
ケースに入れたSuicaは無事使えました。
**追記(2014-01-30):**
あー、ちょっと汚れやすいですね。色がついたり、濡れた後が残ったりし
ています。
--------------------------------------------------------------------------------
title: "GitHubのプライベートリポジトリでも無料で使えるCI、Werckerを使ってserverspecを動かした"
date: "2014-01-09"
--------------------------------------------------------------------------------
{{< figure src="/images/wercker-logo.png" link="http://wercker.com/" target="_blank" rel="noopener" alt="画像" >}}
{{< post "2013-05-27-2" >}}で書いたとおり、このブログのサーバmasutaka.netは
Chef-soloでレシピを、serverspecでそのテストを書いています。
ソースコードはGitHubのプライベートリポジトリに置いており、お金をか
けてまでやる気が出なかったのでCIはしていませんでした(※)。
※ CircleCIの場合、一番安いプランで$19/month
はてブのホットエントリでこちらの記事を見つけたので、serverspecのCI
を設定してみました。
[Githubのプライベートリポジトリでも無料で使えるCI、Werckerを使ってrails newからHerokuのデプロイまでやってみる|mah365](http://blog.mah-lab.com/2014/01/08/rails-wercker-heroku-deploy/)
## serverspec固有の設定
基本的な手順は記事のとおりなので、詰まることはないと思います。
ただしserverspecはssh経由で動作するため、sshの設定が必要です。
(1) WerckerのサイトでSSH key pairを作成する
(2) ユーザmasutakaとしてssh接続する設定をする
(3) ssh接続した時にknown_hostsに追加するか聞かれない設定をする
(1)は以下のサイトが参考になりました。
[wercker + Capistrano で自動デプロイ - milk1000cc's blog](http://milk1000cc.hatenablog.com/entry/20131130/1385810747)
wercker.ymlの中で秘密鍵を $WERCKER_SSH_KEY_PRIVATE として参照できる
ようになります。公開鍵はmasutaka.net:~/.ssh/authorized_keysに追記します。
## 最終的なwercker.yml
(1)の秘密鍵$HOME/.ssh/id_rsaは39行目で作っています。
(2)と(3)は26行目で$HOME/.ssh/configに設定しています。
(2)は33行目の"User masutaka"、(3)は34行目の"StrictHostKeyChecking no"です。
見たまんまですが、serverspecは49行目で設定しています。
{{< gist "masutaka" "8318614" >}}
## wercker.ymlの書式
基本的な書式は http://devcenter.wercker.com/articles/werckeryml/ で
分かると思います。[wercker.ymlのValidaterもありました。](http://devcenter.wercker.com/articles/werckeryml/validate.html)
bundle-installやcreate-fileは拡張という扱いなのか、
https://app.wercker.com/#wercker にアプリとして存在してました。
ドキュメントもあるので、必要に応じてどうぞ。
## ビルド結果
Werckerの各アプリのページでもちろん分かりますが、

各Pull Requstのページでも分かるので、今後はローカルでTest&Cookして
Pull Requst出す、ビルドが通っていればmasterにマージという使い方をし
そうです(Collaboratorはもちろん私一人)。

## Werckerバッジ
TravisCIやCircleCIでお馴染み、ビルドステータスが分かるバッジも
各アプリのページ、右上から取得できます。

README.mdに追加しました。

--------------------------------------------------------------------------------
title: "iOS7のメールとブラウザとマップアプリをGoogleからAppleに変えた"
date: "2014-01-03"
--------------------------------------------------------------------------------
{{< figure src="/images/ios7_mail_icon.jpg" link="http://www.apple.com/jp/ios/" target="_blank" rel="noopener" alt="画像" >}}
気がついたら、iOS7のメールやブラウザ、マップはどれもGoogleのアプリ
を使っていましたが、Appleもだいぶ改善されたようなので、全て移行しました。
◆メール
iOS6までは、Gmailのアーカイブにあまり対応してませんでしたが(設定で
削除をアーカイブとすることはできた)、さっき試したらアーカイブやスター
が使えたので移行しました。
◆ブラウザ
元々、OSXのChromeとブックマークを同期したくて使ってましたが、まあ必
要ないよねということで移行しました。iOSは標準のブラウザがSafari固定
なので、ちょいちょいSafariが開いてうざかったのですよね。[iOSの制約で
Chrome自体、Safariよりパフォーマンスが悪いようですし。](http://internet.watch.impress.co.jp/docs/news/20120629_543634.html)
◆マップ
iOS7が出た時のマップアプリの酷さはもはや伝説ですが、今はまあまあ完
全されたようなので、これも移行しました。まあでも気に食わなかったら
またGoogleに戻すかも。他のアプリと依存関係無いですし。
まとめ:
iPhoneにインストールしたアプリ多すぎなので整理したい。
--------------------------------------------------------------------------------
title: "Rspecのshouldをexpectに置き換えた後の、itの使い道はこれ? #rspec"
date: "2013-12-31"
--------------------------------------------------------------------------------
[Ruby - RSpecのshouldはもう古い!新しい記法expectを使おう! - Qiita [キータ]](http://qiita.com/awakia/items/d880250adc8cdbe7a32f)
こちらの記事は以前から何度も読み返しております。_o_
以前から、これには英語的に違和感がありました。
```
it { expect(hoge).to be_true }
```
複数行でもitの意味が分かりません。
```
it do
result = hoge
expect(result).to be_true
end
```
もちろん、今までのshouldであれば自然です。
```
subject { hoge }
it { should be_true }
```
前の記事で知りましたが(※)、lib/rspec/core/example_group.rbのとおり、
itはexampleやspecifyで置き換え可能なので、今後はitは使わない方が良
い気がしました。
```
example { expect(hoge).to be_true }
# or
specify { expect(hoge).to be_true }
```
※ https://github.com/rspec/rspec-core にも置き換え可能云々は書いて
ありますね。
複数行でもそれほど変ではありません。
```
example do
result = hoge
expect(result).to be_true
end
# or
specify do
result = hoge
expect(result).to be_true
end
```
ここまで書いて、改めてrspecのテストを確認しました。
```
it "returns true if all examples pass" do
group = ExampleGroup.describe('group') do
example('ex 1') { expect(1).to eq(1) }
example('ex 2') { expect(1).to eq(1) }
end
group.stub(:filtered_examples) { group.examples }
expect(group.run(reporter)).to be_truthy
end
it "with 0s outputs pluralized (excluding pending)" do
expect(formatter.summary_line(0,0,0)).to eq("0 examples, 0 failures")
end
specify "CLI `--order defined` takes precedence over `config.order = rand`" do
config.force :order => "defined"
config.order = "rand"
expect(ordering_strategy.order(list)).to eq([1, 2, 3, 4])
end
```
こうやって使えば良いわけね。(specify使っている箇所は少なかった。)
結論としては、itはdescriptionと一緒に使えば違和感なし。
単純な話でした。。
[RSpecでshouldからexpectへ移行する時に困ったこと - 一分一秒真剣勝負!](http://yatmsu.hatenablog.com/entry/2013/04/04/RSpec%E3%81%A7should%E3%81%8B%E3%82%89expect%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8)
> しかし、shouldが使えないとなるとコードをパッと見て「expectを使っているところは更新処理」だと判断しにくくなる点が不満ではあるなぁ。
たしかに少しモヤモヤします。。
https://github.com/rspec/rspec-expectations/blob/master/Should.md#one-liners
One Linerなら使っても良いのか。。
**追記(2014-01-01):**
http://qiita.com/yujinakayama/items/a1d31b2caa35642e8e69
2.99.0.beta2からOne Liner shouldはこんな記法ができるみたいです。
```
it { should be_empty }
↓
it { is_expected.to be_empty }
```
結局、[Everyday Rails Testing with RSpec](https://leanpub.com/everydayrailsrspec)買いました。
奇をてらわずにRailに沿ったテストを書いていきます。
[和訳も出るみたいです!](http://blog.jnito.com/entry/2013/12/30/053612)
--------------------------------------------------------------------------------
title: "FF1,3,5にハマった人には『ブレイブリーデフォルト フォーザ・シークウェル』はめっちゃオススメ"
date: "2013-12-30"
--------------------------------------------------------------------------------
{{< figure src="/images/bdfts.jpg" link="http://www.jp.square-enix.com/bdfts/" target="_blank" rel="noopener" alt="画像" >}}
モンハン4に挫折し、3DSを一ヶ月放置していたマスタカです。
なんとなくRPGやろうかなと思い、評判が良かった『ブレイブリーデフォル
ト フォーザ・シークウェル』を購入しました。
いや〜、こんなにハマるとは思いませんでした。買って一週間経ってない
のに32時間プレイしてます。
これ、タイトルは違いますが、中身はFinalFantasy3(FF3)に近いですね。
寧ろ、FF3の正当な後継版と言えるかもしれません。
FFはファミコンから始まり、スーファミ、PS、PS2、PS3にハードを変更し
進化していきました。他方で、ロマンシング サ・ガや聖剣伝説、ルドラの
秘宝などにも、そのシステムは受け継がれていきました。
ブレイブリーデフォルトはその中で最も色濃く、特にFF3の血を受け継いで
いると感じました。
## バトルシステム
戦闘は単純なターン制で取っ付き易いです。しかし!このゲームはターン
を溜めたり(デフォルトと言います)、溜めたターンを使ったり(ブレイブと
言います)、ターンを前借りしたり(同じくブレイブ)も出来るのですよ。
って、文章にすると大したことありませんが、実際は戦闘の幅がかなり広
がっていて、2次元から3次元に広がった感じです。
FF4のアクティブタイムバトルの他に、こんな解もあったのか!と一人興奮
してしまいました。
例えば、誰か死んだ時、BP(ブレイブポイント)を消費すれば、レイズ→ケ
アルラを絶対に連続でかけられます。
途中からザコ戦に苦戦し始めたのですが、ふと気づいて全キャラブレイブ
を3回したら(4回攻撃可能になる)、1ターンで倒せました。もっとも、1
ターンで倒せなかったらその後3ターン何も出来なくなります。
敵もブレイブ&デフォルトを使ってきますし、溜めたBPを消費するコマン
ドがあったり、攻撃を食らったらBPが溜まるアビリティもあったりします。
「ターンを溜める」だけで、これほど戦闘の幅が広がるのに驚愕しました。
あと、単純なターン制と書きましたが、アクティブタイムバトルのように
時を感じさせる要素も盛り込まれています。のんびりしてられません。
- 必殺技を出した後はBGMが終わるまでは味方が強化状態なので、急いでコ
マンド入力しないともったいない。
- SP(スリープポイント)があれば、STARTボタンを押して時を止めることが
出来る。SPは3DSをスリープ状態にすれば溜まる。必要ないけど課金も可能。
さらにテンポよく進むように、痒いところに手が届いています。
- バトルをAUTOにすることが出来ます。直前のターンと同じ行動を取ります。
- バトルスピードを最大の4倍速にすると激速です。召喚獣のアニメーショ
ンは2倍速からカットされます。
ゲーム中はいつでも難易度を変えられるのも軽く驚きました。エンカウン
ト率も自由に変えられます。自由すぎw
あ、魔法の名前はFF5あたりとほとんど同じです。
## ストーリー
ゲームなので不自然な展開もありますが、意外に練られていると感じました。
まだ3章ですが、終盤の展開が見えません。でも、人死にすぎ殺しすぎw
ほぼ全キャラ喋るので臨場感もあります。3DSのくせに!
よく知りませんが、[声優陣は豪華らしいです](http://netatama.net/archives/7558781.html)。てか、ヴィクトリア様って、
本当に子供だったのかw
## まとめ
以上のように、おっさんホイホイの要素が強いゲームとなっております。
フレンドやすれ違い機能もあるので、誰か一緒にやりましょう!
{{< twitter "masutaka" >}} にお声がけください!
{{< amazon asin="B00EVN4T40" title="ブレイブリーデフォルト フォーザ・シークウェル" >}}
※ 本作『ブレイブリーデフォルト フォーザ・シークウェル』は
『ブレイブリーデフォルト フライングフェアリー』の完全版、廉価版、
続編体験版という位置づけです。誤購入注意。
--------------------------------------------------------------------------------
title: ".emacsをGistにアップしてみた"
date: "2013-12-30"
--------------------------------------------------------------------------------
https://github.com/emacs-jp/emacs-jp.github.com/issues/15
皆さんの.emacsが最近ジワジワとアップされているので、私もアップして
みました。
.emacs含めたdot filesは、GitHubのPrivate Repositoryで管理しているの
で、現時点のコピーです。気が向いたら更新するかもしれません。
以前el-get試しましたが、MELPA+gitsubmodule以上の便利さを味わえなく
て、使いませんでした。init-loaderは分類が面倒で。。
昔は仕事中に/home以下(NFS管理されている)の.emacsを読み漁ったもので
すが、良い時代になってきましたねえ。
{{< gist "masutaka" "8177244" >}}
--------------------------------------------------------------------------------
title: "OSXのzshで直前の履歴をクリップボードにコピーするやつ作った"
date: "2013-12-07"
--------------------------------------------------------------------------------
{{< gist "masutaka" "7838063" >}}
何かコマンドを打ってから、Ctrl-x Ctrl-pするとクリップボードに
コピーされます。
--------------------------------------------------------------------------------
title: "Raspberry Piを購入して、部屋の温度を淡々とグラフにしてみた"
date: "2013-12-05"
--------------------------------------------------------------------------------
{{< figure src="/images/320px-Raspberry_Pi_Photo.jpg" link="http://www.raspberrypi.org/" target="_blank" rel="noopener" alt="画像" >}}
特に目的はなかったけど[Raspberry Pi](http://www.raspberrypi.org/)を買ったので、ついでに温度センサーも買って、淡々と部屋の温度を記録することにしました。
## Raspberry Pi購入まで
購入したのは[Raspberry Pi Type B with 8GB SD card](http://raspberrypi.rsdelivers.com/product/rs/pi-bsd/raspberry-pi-type-b-with-8gb-sd-card/7858654.aspx)です。$52.28でした。
昔より性能も値段も高くなったような。。。
Features
•8GB SD card pre-installed with the Raspian operating system
•Broadcom BCM2835 700MHz ARM1176JZFS processor with FPU and Videocore 4 GPU
•GPU provides Open GL ES 2.0, hardware-accelerated OpenVG, and 1080p30 H.264 high-profile decode
•GPU is capable of 1Gpixel/s, 1.5Gtexel/s or 24GFLOPs with texture filtering and DMA infrastructure
•512MB RAM
•Boots from SD card, running a version of the Linux operating system
•10/100 BaseT Ethernet socket
•HDMI video out socket
•2 x USB 2.0 sockets
•RCA composite video out socket
•SD card socket
•Powered from microUSB socket
•3.5mm audio out jack
•Raspberry Pi HD video camera connector
•Size: 85.6 x 53.98 x 17mm
うっかりSDカードありモデルを買ってしまいましたが、今見たら[SDカードなしモデル](http://raspberrypi.rsdelivers.com/product/raspberry-pi/raspberry-pi-type-b/raspberry-pi-type-b-single-board-computer-512mb/7568308.aspx)との差分はたったの3ドル。そうなんだ。
今はすごく買いやすくなっていて、注文から10日程度で届きました。
## Raspberry Piのセットアップ
HDMIケーブルとモニタを接続し、USBポートにキーボードとマウスを装着。SDカードを挿入し、LANケーブルも接続。最後にiPhone用コンセントを付けたMicro-USBケーブルをコンセントに。

あっさりセットアップ画面になりました。簡単すぎて物足りないw

ちなみにMicro-USBポートは最初の画像の一番手前にあります。始め、分からなかった。
他にもよく見ると、ボード上にコンデンサとか付けられそうな拡張スロットが。ハンダごて持っている人は楽しそうです。
初期アカウントはpiが用意されています。パスワードはraspberry。
時刻をUSTからJSTにしました。/etc/timezoneをAsia/Tokyoに書き換えて、以下のコマンドを実行すればOK
> % sudo /usr/sbin/dpkg-reconfigure -f noninteractive tzdata
IPアドレスを固定にしました。以下を参考にしました。
[固定IPアドレスの設定|hiramine.com](http://www.hiramine.com/physicalcomputing/raspberrypi/setup_staticip.html)
ユーザーアカウントも適当に作成。
> % sudo /usr/sbin/useradd -k /etc/skel -m masutaka
ログインシェルをzshにしたり、sudo権限を与えたり、sshをパスワードなしでも可にしましたが、面倒なので割愛します。Chef-soloとか使おうとしましたが、今回は動かすことが目的なので敢えて無視。
セットアップが終わったら、LANケーブルと電源ケーブルだけ残して、全部外しました。
## パッケージとファームウェアを最新に
```
# パッケージを最新に
% sudo apt-get update
% sudo apt-get upgrade
# ファームウェアを最新に
% sudo rpi-update
# リブート
% sudo reboot
```
以下が参考になりました。
[Raspberry Piで音を鳴らす - 頼りないニモニック](http://nanase.hatenablog.jp/entry/2013/11/08/193003)
## 温度センサーの装着
購入したセンサーはこれ。
{{< amazon asin="B004FI1570" title="USB温度計! USB thermometer-528018" >}}
Linux用ドライバは付いていないので、GitHubで公開されているtemperを使います。
```
% mkdir ~/tmp && cd ~/tmp
% git clone git://github.com/bitplane/temper.git
% cd temper
% sudo apt-get install libusb-dev
% make
% make install
% sudo chmod u+s /usr/local/bin/temper
```
インストールされるのは/usr/local/bin/temperだけです。無事測れました。(摂氏26.667725度)
```
% temper
04-Dec-2013 15:08,26.667725
```
以下がそのまんま参考になりました。
[Raspberry Piと980円USB温度センサーで北海道の冬をロギングしてみる|徒労日記](http://dolls.orz.hm/?p=8909)
## GrowthForecastに淡々と記録
5分毎に部屋の温度を測定して、GrowthForecast{{< post "2013-08-15-1" >}}に記録していくことにします。
以下のようなシェルスクリプトを用意して、
```
#!/bin/bash
temperature=`/usr/local/bin/temper | awk -F, '{print $2}'`
curl -F number=$temperature http://example.com:5125/api/home/thermometer/temperature
```
cronに設定するだけ。
>*/5 * * * * /home/masutaka/thermometer.sh
記録されてる!
{{< figure src="/images/growthforecast-thermometer-s.png" link="/images/growthforecast-thermometer.png" target="_blank" rel="noopener" alt="画像" >}}
ちなみに、[GrowthForecast-0.70からnumberにfloatを指定できるようになりました](https://metacpan.org/changes/distribution/GrowthForecast)。0.70以前の場合、numberに指定できるのはintだけです。
起動オプション--enable-float-numberも追加します。
>% carton exec -- perl growthforecast.pl --data-dir . --enable-float-number &
置き場所を考え中。Air Macが温かいので、温度が高めなのですよね。あと埃対策も兼ねて立ててます。ケース買おうかなあ。てか、他に何やろう..?

--------------------------------------------------------------------------------
title: "elscreen-mew.elをMELPAに登録しました"
date: "2013-12-01"
--------------------------------------------------------------------------------
{{< tweet user="melpa_emacs" id="407105831440637952" >}}
世界で3人くらい使っているかもしれないelscreen-mew.elを、表題の通り
MELPAに登録しました。
このパッケージで何ができるとかはなくて、現状は[elscreen](http://www.morishima.net/~naoto/elscreen-ja/)と[Mew](http://mew.org/)の組み合
わせで発生する不具合を回避するだけです。詳細は下記リポジトリの
READMEを御覧ください。
## インストール方法
M-x package-install elscreen-mew
## リポジトリ
{{< github_repo "masutaka/elscreen-mew" >}}
--------------------------------------------------------------------------------
title: "helm-hatena-bookmark.elを作ってHelmに完全移行した"
date: "2013-11-26"
--------------------------------------------------------------------------------
ようやくHelmに移行出来ました。以前試みたのですが、
anything-hatena-bookmark.elがうまく動かなくてペンドしていたのでした。
今日天からイベントが降ってきたので、helm-hatena-bookmark.elを作りま
した。
{{< github_repo "masutaka/emacs-helm-hatena-bookmark" >}}
MELPAにも取り込まれたのでM-x list-packagesからインストールできます。
[MELPAへのPull Requstは初めてでした!](https://github.com/milkypostman/melpa/pull/1199)
anything-hatena-bookmark.elについては{{< post "2011-12-17-1" >}}で書いたことがあ
りますが、もう一度おさらいしますね。
## helm-hatena-bookmark.elで何ができるのか?
Emacsから自分のはてなブックマークを検索し、ブラウザから開けます。
普通にHelm絞り込みができるので便利です。
M-x helm-hatena-bookmark して、"emacs git"で絞り込んだところ
{{< figure src="/images/helm-hatena-bookmark-s.png" link="/images/helm-hatena-bookmark.png" target="_blank" rel="noopener" alt="画像" >}}
## インストール方法
M-x package-install helm-hatena-bookmark
## 使用方法
M-x helm-hatena-bookmarkして検索するだけです。
初回はキャッシュファイル~/.hatenabookmarkが作成されるのですが、はて
ブの数によってはなかなか終わりません。以下のシェルスクリプト版を使
うと良いでしょう。
[自分のはてなブックマークを検索するanything-hatena-bookmark.elのデータ更新用シェルスクリプト - aki77の日記](http://d.hatena.ne.jp/aki77/20090501/1241167586)
ただ、リポジトリが見えなくなっていたので、一旦
helm-hatena-bookmark.elのリポジトリにインポートしました。
https://github.com/masutaka/emacs-helm-hatena-bookmark/tree/master/script
あとでhelm-hatena-bookmark-get-dump()にいい感じにマージします。
--------------------------------------------------------------------------------
title: "OSXの構成管理ツールBoxenを導入してみた"
date: "2013-11-23"
--------------------------------------------------------------------------------
{{< figure src="/images/boxen.png" link="http://boxen.github.com/" target="_blank" rel="noopener" alt="画像" >}}
過去にこんなネタ記事{{< post "2011-06-06-1" >}}も書きましたが、Mavericksになって
CLI Toolsからrcsが削除されたのと、今どきRCSもないよねということで、
話題のBoxenを導入してみました。
BoxenはGitHub社が開発した、エンジニアの開発環境を構築するための
ツールです。GitHub社員じゃなくても使えます。
Homebrewやrbenv、plenv等を包括出来るだけでなく、ChromeやSkype等も
コマンド一発でインストールできます。さらにはOSXの設定まで管理できます。
私の場合、HomebrewでインストールしたコマンドやGemはもう分かりません
し、今までインストールしたさまざまなアプリはメモしていました{{< post "2011-04-21-1" >}}。
それらをコード化できるのが良いと感じました。
Mavericksに対応しきれていないので、まだハマりどころはあります。
そういう意味ではちょっと待ったほうが良いかも。
導入はそこそこ簡単で、[ここ](https://github.com/boxen/our-boxen)のREADMEのとおりに実行するだけです。
```
% sudo mkdir -p /opt/boxen
% sudo chown ${USER}:staff /opt/boxen
% git clone https://github.com/boxen/our-boxen /opt/boxen/repo
% cd /opt/boxen/repo
% git remote rm origin
% git remote add origin # (1)
% git push -u origin master
```
GitHubアカウントが必要です。あらかじめ自分用のリポジトリを作って、
(1)で指定すると良いです。
あとはboxenコマンドを実行すれば、manifests/site.ppで指定されたツー
ルが/opt/boxen以下にインストールされます(暗号化は不要なのでOFFにし
てます)。シンボリックリンク~/src/our-boxenも作られます。
> % script/boxen --no-fde
ただ、私のMavericks環境ではgccのビルドに失敗しました。デフォルトは
変更したくありませんでしたが、仕方がないので以下のように変更しまし
た。ついでに必要なさそうなdnsmasqや古いバージョンのNode.jsやRubyも
削除しました。
https://github.com/masutaka/my-boxen/commit/19e66fbdddcdbd2b564eb94c10f5345677d3520f
個人向けの設定はmodules/people/manifests/.ppに
記載していきます。というわけで私のリポジトリはこちら。
{{< github_repo "masutaka/my-boxen" >}}
一点、不可解なことがあって、一部のツールが壊れていました。
> % wget
> zsh: illegal hardware instruction wget
brewからインストールしなおせばOKです。(素のbrew installと、Boxen経
由のbrew installがなにか違うのかなあ。gccをインストールしてないので、
clangでビルドしているのが原因?逆アセンブルしてもあまり違いはなかっ
たので違うか。。)
Boxenをアンインストールしたい時はこれ。手順通りの/opt/boxen/repoに
リポジトリがある状態だと、自分自身を削除しようとしてエラーになるの
で、git cloneしてnukeを実行すると良いかも。
> % script/nuke --all --force
以下が参考になりました。ありがとうございます。
[Mac - Boxen使わなくても許されるのは2012年までだよね - Qiita [キータ]](http://qiita.com/yuku_t/items/c6f20de0e4f4c352046c)
**追記(2014-01-02):**
zsh: illegal hardware instructionの問題は、Core 2 Duo固有の問題かも。。
https://github.com/boxen/puppet-nginx/issues/5
--------------------------------------------------------------------------------
title: "Simplenote再開しました!"
date: "2013-11-10"
--------------------------------------------------------------------------------
{{< figure src="/images/simplenote.png" link="http://simplenote.com/" target="_blank" rel="noopener" alt="画像" >}}
[[を] Simplenote の Max OS X アプリが登場してた!](http://chalow.net/2013-10-11-3.html)
{{< post "2012-09-09-1" >}}にSimplenoteからAppleのメモアプリに乗り換えましたが、
OSX用のSimplenoteアプリが出ていたので、また戻って参りました。
Emacsのsimplenote.elは今は必要ないかな。
AppleのメモアプリはGoogleアカウントと連携していたので、Gmailに過去
のリビジョンが溜まっていたのですよね。気にしなきゃいいんだけど。。。
たつをさん++
--------------------------------------------------------------------------------
title: "過去1000件のFoursquareチェックイン履歴をD3.jsで可視化してみた"
date: "2013-10-30"
--------------------------------------------------------------------------------
{{< figure src="/images/d3js.png" link="http://d3js.org/" target="_blank" rel="noopener" alt="画像" >}}
{{< amazon_link asin="4774158747" title="WEB+DB PRESS Vol.76" >}}のD3.jsの記事をちょっと試したかっただけだったの
です。
{{< amazon asin="4774158747" title="WEB+DB PRESS Vol.76" >}}
D3.js自体は記事のとおりに書けば理解出来ましたが、「過去1000件の
Foursquareチェックイン履歴」を取ってくるのに難儀しました。記事では
さらっと書いてあるだけですねw
## どうにかしてoauth_tokenを取得する
私は http://tdoc.info/foursquare-API/authentication.html を参考にし
て、泥臭く手に入れました。Twitterだと簡単なのにね。
1. https://developer.foursquare.com/ にアクセスし、適当なマイアプリを作る。
2. 以下にアクセスし、"code"を取得する(長いので改行入れてます)。
```
https://foursquare.com/oauth2/authenticate?client_id=
&response_type=code&redirect_uri=
```
3. ブラウザのアドレスバーに"code"が表示されるので、以下にアクセスす
る(長いので改行入れてます)。
```
https://foursquare.com/oauth2/access_token?client_id=
&client_secret=&grant_type=authorization_code
&redirect_uri=&code=<2で取得したコード>
```
4. oauth_tokenを取得出来た!
```
{"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
```
## 過去1000件のFoursquareチェックイン履歴を取得する
1. foursquare2 gemをインストールする。
> % gem install foursquare2
2. 取得できるか確認。
{{< gist "masutaka" "7217576" >}}
3. JSONフォーマットにしつつ、緯度と経度を取得する。
https://developer.foursquare.com/docs/users/checkins によると、
250ずつしか取得できないようなので、小分けにして取得。
{{< gist "masutaka" "7217793" >}}
こんなデータが取得できるはず。
```
[
{"coordinates": [139.645709, 35.667857]},
{"coordinates": [139.645709, 35.667857]},
{"coordinates": [139.641393, 35.666568]},
...
]
```
エラー吐いて972件しか取得できなかったけど、まあ良しとする。
JSONなので最後の"},"を"}"に置換するのを忘れずに。。
## D3.js使って可視化
ここまでくれば記事のとおりにコードを書くだけです。[こんな感じ](http://masutaka.net/d3js/)で可視
化出来ます。ドラッグやズームイン・アウトにも対応しています☆
これ試したのは少し前なので忘れてましたが、日本地図を作るのもやや面
倒でした。Homebrewでgdalをインストールするのにかなり時間がかかると
いう。。
## D3.jsの本
PDF版は無料で入手することが出来ます。
[[を] 【書評・感想】Getting Started with D3 eBook](http://chalow.net/2013-08-18-1.html)
こちらはKindle版です。
{{< amazon asin="B008FPJST6" title="Getting Started with D3" >}}
--------------------------------------------------------------------------------
title: "iPhone 4s 32GBからiPhone 5s 64GBに変えたけど案外高くなかったお話"
date: "2013-10-14"
--------------------------------------------------------------------------------
{{< figure src="/images/iPhone-5S-gold.jpg" link="http://www.apple.com/jp/iphone-5s/" target="_blank" rel="noopener" alt="画像" >}}
9/23に予約し、ちょうど3週間でiPhone 5s Gold 64GBモデルをゲット出来ました。Goldだし1ヶ月はかかるかなーと気長に待っていたので、思ったより早かった感じです。
キャリアはLTEにおいて盤石の体制を築いたau様。{{< wikipedia word="日本移動通信" text="IDO" >}}時代から15年使い続けた甲斐がありました(感涙)。
昨日から使い始めた感想は以下のとおり。
- iOS7でのiPhone4sにあった、表示のもたつきがなくなった。
- 軽くなった(物理的に)。
- 画面がだいぶ広くなった感。
- 指紋認証はやっぱり楽。
- 64GBは気持ちに余裕ができる(今までは32GBでカツカツだった)。
- テザリングうれしい。適当なタイミングでEMOBILE解約しよう。{{< post "2012-04-22-2" >}}
- イヤホンの音が良くなった。
A5からA7へのCPU性能のアップは予想以上に快適で、iOS7が本当に気持ちよく動きます。個人的には、[はてブアプリ](https://itunes.apple.com/jp/app/hatenabukkumaku/id354976659)で性能差を一番体感出来ました。
指紋認証もやっぱり楽です。登録した指が使えない時は今までのパスコード認証になりますが。。
料金はだいたいこんな感じとのこと。今までが¥5,538だったので、しばらくは同じくらいです。高くなる頃にEMOBILEの2年縛りが切れるので、まあ大丈夫でしょう。
◆2013年10月〜2014年2月
| |
|---|---:
|LTEプラン|+¥980
|LTEフラット|+¥5,460
|iPhone4s残り|+¥2,570
|iPhone5s本体(※1)|+¥3,237
| 割引(※2)|-¥3,237
|毎月割|-¥2,230
|auスマートバリュー|-¥1,480
|**合計**|**¥5,300**
◆2014年3月
| |
|---|---:
|LTEプラン|+¥980
|LTEフラット|+¥5,460
|iPhone4s残り|+¥2,570
|iPhone5s本体(※1)|+¥3,237
| 割引(※2)|-¥700
|毎月割|-¥2,230
|auスマートバリュー|-¥1,480
|**合計**|**¥7,837**
◆2014年4月〜2014年7月
| |
|---|---:
|LTEプラン|+¥980
|LTEフラット|+¥5,460
|iPhone4s残り|+¥2,570
|iPhone5s本体(※1)|+¥3,237
|毎月割|-¥2,230
|auスマートバリュー|-¥1,480
|**合計**|**¥8,537**
◆2014年8月〜
| |
|---|---:
|LTEプラン|+¥980
|LTEフラット|+¥5,460
|iPhone5s本体(※1)|+¥3,237
|毎月割|-¥2,230
|auスマートバリュー|-¥1,480
|**合計**|**¥5,967**
※1 以下iPhone5s本体の値段を24(ヶ月)で割った
¥77,700 = 本体¥88,200 - 割引クーポン¥10,500
※2 ※1を以下で相殺する
¥18,734 = iPhone4s買い取り¥17,000 - auポイント¥1,734
テザリングは2年間無料でそれ以降は525円だそうです。契約時に伝えないと使えないので気をつけましょう。
アプリで意外だったのがLINEのトークが残っていたことです。機種変すると消えるのかと思ってました。
復元時のトラブルとしては、[Movesアプリ](https://itunes.apple.com/jp/app/id509204969)が見えなくなっていたくらいで、再起動したら直りました。
auショップの人に言われたとおり、以下は本日解約しました。スマートパス、ビデオパス、うたパス、AppleCare+
以下は来月解約します。
au通話ワイド、au通話定額、電話基本パック
P.S.
iPhone4sまでのケーブル2本、コンセントアダプタ1個余ってます。欲しい人いれば連絡下さい。
--------------------------------------------------------------------------------
title: "YAPC::ASIA 2013 はノベルティに満足"
date: "2013-09-29"
--------------------------------------------------------------------------------
{{< figure src="/images/yapcasia2013-logo.png" link="http://yapcasia.org/2013/" target="_blank" rel="noopener" alt="画像" >}}
最近は仕事とか二日酔いとかで結構忙しくて、もう一週間が経ってしまい
ました。。
今回YAPCというPerl最大のイベントに初参加しました。残念ながら土曜日、
最終日だけの参加でしたが、なかなかに満足度が高かったです。(YAPCって、
怖いイベントじゃなかったんですねw)
最初の {{< twitter "yusukebe" >}} さんのトークの分かりやすさが半端なかった(以前聞い
たLTも良かった)。Perlをほぼいじったことない私でも普通に理解出来まし
た。トークがわかりやすいのか、Mojoliciousが分かりやすいのか。
MojoliciousのデフォルトはVCしかないというのは清々しさを感じました。
16:30から始まったLT大会は個人的にはツボのものが多く、他のLLのLTとは
違った雰囲気でした。
以下、当日聞いたトークです。
- [Mojoliciousでつくる!Webアプリ入門](http://yapcasia.org/2013/talk/show/03bedf92-c6d0-11e2-80df-039a6aeab6a4) → [ブログ記事](http://yusukebe.com/archives/20130924/083254.html)
- [Programming AWS with Perl](http://yapcasia.org/2013/talk/show/c95e4d18-df04-11e2-8f00-96816aeab6a4)
- [What's new in Carton & cpanm](http://yapcasia.org/2013/talk/show/9c756568-ea92-11e2-ba88-5f716aeab6a4)
- [GitHubでつくる、たのしい開発現場](http://yapcasia.org/2013/talk/show/f04a3fa0-dfee-11e2-8f00-96816aeab6a4) → [ブログ記事](https://hiroki.jp/yapcasia-2013-github)
- [中規模チャットサービスの運用事例](http://yapcasia.org/2013/talk/show/d6e0b462-e189-11e2-8767-0fa16aeab6a4)
- [PhantomJSによる多岐にわたる広告枠の確実な表示テスト](http://yapcasia.org/2013/talk/show/150e4158-eae2-11e2-ba88-5f716aeab6a4)
- [フルテストも50msで終わらせたい 〜 FreakOutの取り組み 〜](http://yapcasia.org/2013/talk/show/767463b0-d8fd-11e2-971a-72936aeab6a4)
- [Lightning Talks Day 2](http://yapcasia.org/2013/talk/show/ff9983ba-f2bf-11e2-a36f-e9ae6aeab6a4)
- [Keynote](http://yapcasia.org/2013/talk/show/2f50ef1a-d24c-11e2-a70b-a69b6aeab6a4)
- [YAPC::Asia Tokyo 2013 クロージング](http://yapcasia.org/2013/talk/show/961396b6-c82f-11e2-9315-13836aeab6a4)
P.S.
ノベルティが良かったです。中でもmixiプランニングポーカーが一番嬉し
かった。普通に買おうと思ってたので。DeNAのスマホスタンドも使ってま
すし、YAPCタオルは今日ジムで使ってきました。
--------------------------------------------------------------------------------
title: "さらばATOK"
date: "2013-09-09"
--------------------------------------------------------------------------------
{{< figure src="/images/atok.png" link="http://www.atok.com/" target="_blank" rel="noopener" alt="画像" >}}
かれこれ20年近く使ってきた[ATOK](http://www.atok.com/)とお別れすることになりました。残念です。
理由は単純で、実用に耐えないレベルでストレスを感じるようになったか
らです。
-1. 時々固まったり、遅くなることがある。
-2. 変換するためにスペースを押すと、変換された漢字部分が消えることがある。
-3. 以前のATOKと比べて、頭悪くなった気がする。
1はOSXが悪さをしているのかもしれません。というのも、OSXではキーが押
しっぱなしになったり、遅くなったりする現象が私や周りの人も発生して
いるからです。
2はEmacs上だけかもしれません。
3は好意的に解釈すると、私の変換方法と最近のATOKのアルゴリズムが合わないのかも。
今は[Google日本語入力](http://www.google.co.jp/ime/)を使ってます。以前試した時は微妙だったのに、
今は全く問題ないですね。普通にサクサク使えてます。こんなん無料で配
られたらJustSystems厳しいよなあ。。
最後にATOKとの出会いから別れをまとめます。
そういえばベータテストに協力したこともあったなあ.. {{< post "2010-02-06-1" >}}
|登録日|製品名
|---|---
|1996/04/03|一太郎V.6.3 /R.1 Win FMV プリ版 CD-ROM
|1997/03/19|一太郎8 Win95/NT CD-ROM
|2001/11/25|ATOK14 for Windows ESDベクター版
|2004/02/15|ATOK17 for Windows JMS DL版
|2005/02/11|ATOK 2005 for Windows JMS DL版
|2006/02/20|ATOK 2006 for Windows JMS DL版
|2008/02/11|ATOK 2008 for Windows JMS DL版
|2010/02/06|ATOK 2010 for Windows JMS DL版
|2010/12/30|ATOK 2010 for Mac JMS DL版
|2012/05/24|ATOK Passport
そして、2013/09/08にATOK Passportを解約しました。
--------------------------------------------------------------------------------
title: "GitHubのPrivateリポジトリをChef経由でcloneしようとしたらハマった"
date: "2013-08-20"
--------------------------------------------------------------------------------
{{< figure src="/images/octocat.png" link="https://github.com/" target="_blank" rel="noopener" alt="画像" >}} {{< figure src="/images/logo-chef.png" link="http://www.opscode.com/chef/" target="_blank" rel="noopener" alt="画像" >}}
自分のinit.elや.zshenvはGitHubのPrivateリポジトリで管理しています。
masutaka.netでも同じ設定を使いたかったので、Chef経由(実際はKnife
Solo経由)でgit cloneしようとしたら結構ハマったので、メモしておきます。
ぶっちゃけmasutaka.netに秘密鍵をおけば、ハマることはないです。でも
セキュリティ的にあんまりなので、sshのforward agent機能を使い、ロー
カルの公開鍵をリモートでも使うようにします。
## (1) sshのforward agentを設定する
やり方は簡単で、ローカルの~/.ssh/configに以下を追加し、ローカルで
ssh-addコマンドを実行するだけ。
```
Host masutaka.net
ForwardAgent yes
```
この状態でmasutaka.netにsshログインし、git cloneすることが出来まし
た。`ssh-add -l`コマンドでローカルの公開鍵が使われていることを確認
できます。
検証環境にVagrantを使っているので、Vagrantfileにも追加しました
(~/.ssh/configに設定しても構いません)。
```
config.ssh.forward_agent = true
```
## (2) sudo時に公開鍵を引き継ぐ
Chefからgit cloneするため、内部的にはsudo経由でgit cloneすることに
なります。
Ubuntu 12.04.2 LTSのデフォルト設定は以下のとおり、sudo時に環境変数
は引き継ぎません(実際`sudo git clone`すると失敗するはず)。
```
# /etc/sudoers
Defaults env_reset
```
環境変数SSH_AUTH_SOCKだけ引き継ぐようにします(レシピを書きました)。
```
# /etc/sudoers
Defaults env_reset
Defaults env_keep += "SSH_AUTH_SOCK"
```
`sudo ssh-add -l`コマンドでローカルの公開鍵が使われていることを確認
できます。
## (3) ~/.ssh/known_hostsに書き込むか尋ねさせない
これで大丈夫だろうとChefのレシピを実行したところ、以下のプロンプト
が。でもyesと打っても一向に再開されません。
```
The authenticity of host 'masutaka.net (XXX.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is (省略).
Are you sure you want to continue connecting (yes/no)?
```
`yes`がリモートに届かないようなので、そもそも尋ねさせないようにしま
した。リモートの~/.ssh/configに以下を追加するレシピを書きました。
```
Host github.com
StrictHostKeyChecking no
```
## (4) (2)とgit cloneのレシピは別で実行する
こんどこそ大丈夫だろうとChefのレシピを実行したところ、まだgit
cloneに失敗します。ただいろいろ試すと、成功することもありました。
どうやら、(2)の/etc/sudoersのレシピと、git cloneのレシピは別で実行
する必要があるようです。Chefは1回のsudoで複数のレシピを実行するみた
いですね。とりあえずうまくいきました。やった!
## 謝辞
以下の記事にお世話になりました。ありがとうございます。
[vagrantのchefによるprovisioningでgitのprivte repositoryを扱う - あんこの成長記録](http://d.hatena.ne.jp/nekonokataomoi/20130527/1369673600)
[/etc/sudoersのenv_resetオプションについて少し勉強してみた - ぱちブログ](http://www.maepachi.com/blog/entry?id=128)
[~/.ssh/ 以下に書き込めない環境で ssh したとき known_hosts に書き込めないエラーを抑制する - Qiita [キータ]](http://qiita.com/kyanny/items/f9bab97cef32e5483879)
もちろん『入門Chef Solo』には毎回お世話になっております。Kindleで買っ
てよかった。
{{< amazon asin="B00BSPH158" title="入門Chef Solo - Infrastructure as Code" >}}
--------------------------------------------------------------------------------
title: "nginxのアクセスログをFluentd経由でGrowthForecastのグラフにしてみた"
date: "2013-08-15"
--------------------------------------------------------------------------------
{{< figure src="/images/fluentd.png" link="http://fluentd.org/" target="_blank" rel="noopener" alt="画像" >}}
昨日{{< post "2013-08-14-1" >}}インストールした[GrowthForecast](http://kazeburo.github.io/GrowthForecast/)をFluentdと連携させ
てみます。
今回グラフにしたのは2つの情報です。
(1) nginxが各リクエストを処理した時間($request_time)
{{< figure src="/images/growthforecast-nginx-response-s.png" link="/images/growthforecast-nginx-response.png" target="_blank" rel="noopener" alt="画像" >}}
(2) nginxが返したHTTP Status Codeの数
{{< figure src="/images/growthforecast-nginx-status-count-s.png" link="/images/growthforecast-nginx-status-count.png" target="_blank" rel="noopener" alt="画像" >}}
## (1) nginxが各リクエストを処理した時間($request_time)
{{< post "2013-07-14-1" >}}に追加した設定が以下になります。それぞれ
[fluent-plugin-growthforecast](https://github.com/tagomoris/fluent-plugin-growthforecast)をインストールするChefのレシピと、
td-agent.confの設定です。
{{< gist "masutaka" "6238486" >}}
FluentdがnginxのアクセスログをMongoDBとGrowthForecastに渡しています。
特に難しいことはなくて、type copyとstoreを使うと複数の出力先を指定
できました。
```
type copy
type mongo
...
type growthforecast
...
```
## (2) nginxが返したHTTP Status Codeの数
追加した設定が以下になります。さらに[datacounter plugin](https://github.com/tagomoris/fluent-plugin-datacounter)に渡して、
HTTP Status Codeを数え、それをGrowthForecastに渡しています。
{{< gist "masutaka" "6238537" >}}
name_keysに何を渡せばよいか少し悩みました。
タグの中でtype fileなstoreを
増やしたら、datacounter pluginが吐き出すjsonを確認出来ました。この
タグの実行は数分のタイムラグがあるのは注意です。
グラフのタイトルはもっと短くしたかったのですが、remove_prefixや
input_tag_remove_prefixを使っても希望のタイトルに出来なかったので、
今回は見送りました。(タイムラグのせいでデバッグしづらく、ムキーッて
なって諦めました。。)
## 最後に
http://example.com:5125とかに(1)と(2)が表示されたはずです。
今回は[伊藤直也さんの記事](http://d.hatena.ne.jp/naoya/20130205/1360088927)が参考になりました。
特に[Chefのリポジトリ](https://github.com/naoya/vagrant-ltsvbox_sample)はめっちゃ参考になります。。
--------------------------------------------------------------------------------
title: "GrowthForecast をインストールする"
date: "2013-08-14"
--------------------------------------------------------------------------------
前回 {{< post "2013-07-17-1" >}} から間が空いてしまいましたが、[GrowthForecast](http://kazeburo.github.io/GrowthForecast/) をインストールしました。
インストールするだけなら、これだけで OK です。
```console
% mkdir ~/growthforecast
% cd ~/growthforecast
% echo "requires 'GrowthForecast';" > cpanfile
% sudo apt-get build-dep rrdtool
% plenv exec carton install
```
起動方法はこんな感じ。http://example.com:5125 とかにアクセスすると確認出来ると思います。
```cosole
% cd ~/growthforecast
% carton exec -- perl growthforecast.pl --data-dir . &
```
`--data-dir` オプションを指定しないと `~/growthforecast/local/lib/perl5/auto/share/dist/GrowthForecast/data/` 以下に sqlite 関連のファイルが作られます。`~/growthforecast/local` は削除することもあるでしょうから、指定した方が良いと思います。
Chef のレシピはこれ。`Install packages depending RRDTool` のあたりが汚いですが、仕方がないですかね。
{{< gist "masutaka" "6227256" >}}
今回初めて知りました。。
{{< tweet user="masutaka" id="367681281628573696" >}}
次回は GrowthForecast と fluentd の連携を試してみます。
参考にしたサイト
[GrowthForecastをインストールする|Act as Professional - hiroki.jp](https://hiroki.jp/2013/02/19/6690/)
--------------------------------------------------------------------------------
title: "『ここは退屈迎えに来て』を読んだ"
date: "2013-08-13"
--------------------------------------------------------------------------------
{{< amazon asin="B00ANJB3MM" title="ここは退屈迎えに来て" >}}
[@antipopさんのブログ](http://blog.kentarok.org/entry/2013/08/10/234755)を見て、フラフラッと買ってしまった。
読んですぐに、「[はてなでこの手の話題で盛り上がっている](http://anond.hatelabo.jp/20130809115823)ところに、な
んというシンクロニシティ!」 と思ったのですが、[引用元がこの本の感想](http://luvlife.hatenablog.com/entry/2013/08/07/221155)
だったのね(笑)
本自体は地方都市を舞台としたオムニバス形式。かなりサクサク3日で読
めた。第2話に進んで「ああそう来るのね」と少々の意外性があったり。
オススメ。
とは言え、帰省中に読むもんじゃないなーと思いました!
--------------------------------------------------------------------------------
title: "Jenkinsをアップデートしたらジョブが消えた。。だけど無事復活!"
date: "2013-08-10"
--------------------------------------------------------------------------------
Jenkinsを1.516から1.526にアップデートし、プラグインもアップデートし
たらRuby関連のジョブが消えました。。
小一時間悩んで管理画面からシステムログを見たら、
Failed Loading plugin ruby-runtime
とのエラーメッセージ。このプラグインをインストールしたら直りました。
なぜ急に必要になった?と思い、/var/log/jenkins/jenkins.logを見たら、
rbenvとrvmプラグインが要求していました。
> 2013/08/10 11:11:01 jenkins.InitReactorRunner$1 onTaskFailed
> 致命的: Failed Loading plugin rbenv
> java.io.IOException: Dependency ruby-runtime (0.10) doesn't exist
>
> 2013/08/10 11:11:01 jenkins.InitReactorRunner$1 onTaskFailed
> 致命的: Failed Loading plugin rvm
> java.io.IOException: Dependency ruby-runtime (0.7) doesn't exist
プラグインのページを見ると、確かにそう書いてあります。
https://wiki.jenkins-ci.org/display/JENKINS/Rbenv+Plugin
https://wiki.jenkins-ci.org/display/JENKINS/RVM+Plugin
最初のプラグインアップデートで、rbenvもrvmもアップデートされなかっ
たようなので(※)、Jenkinsがエラーを正しく処理してジョブが消えたのか
もしれません。
※ どのプラグインをアップデートしたかはログに書かれないようなので、
確定ではないですが。
しかし、依存関係が出来たのに、なぜruby-runtimeがインストールされな
かったのだろう。。
結論: ログ大事
--------------------------------------------------------------------------------
title: "『とんび』を読んだ"
date: "2013-08-09"
--------------------------------------------------------------------------------
{{< amazon asin="B009GPMFVM" title="とんび" >}}
ホリエモンがオススメしていたのでKindle版を買った(7/31は¥434で超お
買い得だった(今は¥620))。
昭和30年後半から最近くらいまでのお話。正直、出だしはあまり期待感が
持てなかったけど、予想外にスピード感があってすぐ読めた。続きを読む
のが楽しみな小説は久しぶりだった。
なんというか対比が素晴らしかったですね。オススメ。
--------------------------------------------------------------------------------
title: "flymake-puppet.elをインストールした"
date: "2013-08-05"
--------------------------------------------------------------------------------
[flymake-puppet 1.0.0 - Marmalade: Spreadable Elisp](http://marmalade-repo.org/packages/flymake-puppet)
最近Marmaladeに登録されたので、インストールしてみました。
([puppet-flymake](https://github.com/grimradical/puppet-flymake)ってのもあるのですね。ややこしい。。)
1. puppet-lintというコマンドを要求するので、gemでインストールする(※1)。
> % gem install puppet-lint
2. M-x list-packagesからflymake-puppetをインストールする(※2)。
3. ~/.emacs.d/init.elに以下を追加すればOK(※3)
```elisp
;;(load "puppet-mode-init") ; (a)
(add-hook 'puppet-mode-hook 'flymake-puppet-load) ; (b)
```
普通にflymakeが効いていて使える予感。
---
※1 あらかじめrbenvとかでrubyをインストールしないと、/usr/lib/ruby
以下とかにインストールされるので注意。
※2 Emacsのパッケージについては、以下のページや{{< amazon_link asin="4774150029" title="Emacs実践入門" >}}を参考
にどうぞ
[package.elを使う場合の設定ファイルの書き方 - Life is very short](http://d.hatena.ne.jp/syohex/20130624/1372082597)
※3 M-x list-packagesからインストールすると、通常こういった基本的な
設定は不要です。でも今回は~~(a)を設定しないと*.ppがpuppet-modeに関連
付かない~~、(b)を設定しないとflymake-puppetが使われない、という状況だっ
たので設定しました。
{{< amazon asin="4774150029" title="Emacs実践入門" >}}
**追記(2013-10-05):**
puppet-modeからpuppet-mode-init.elが削除され、設定が不要になったの
で、(a)をコメントアウトしました。
--------------------------------------------------------------------------------
title: "plenv + cpanm + cartonでPerlの環境を構築した(OSX版)"
date: "2013-07-17"
--------------------------------------------------------------------------------
{{< post "2013-07-17-1" >}}のOSX(Mountain Lion)版です。こっちはめっちゃ簡単。
brewでplenvとperl-buildをインストール
```
% brew install plenv
% brew install perl-build
```
あとはUbuntuと同じようにperl+cpanm+cartonをインストール
```
% plenv install 5.18.0 -Dusethreads
% plenv global 5.18.0 && plenv rehash && rehash
% plenv install-cpanm
% plenv exec cpanm Carton
```
P.S.
入れたは良いけど、OSXでPerl使わないなーと思ってたら、chalow(このブ
ログを生成するツール)で使ってた。てか、HTML::Templateがなくて
chalowを実行出来なくなっていた...。早速インストール☆
```
% plenv exec cpanm HTML::Template
```
--------------------------------------------------------------------------------
title: "plenv + cpanm + cartonでPerlの環境を構築した(Ubuntu版)"
date: "2013-07-17"
--------------------------------------------------------------------------------
[plenv + cpanm + carton でPerlの開発環境を構築する|Act as Professional - hiroki.jp](https://hiroki.jp/2013/02/18/6684/)
私も[GrowthForecast](http://kazeburo.github.com/GrowthForecast/)をインストールするために、Ubuntu 12.04.2 LTS上に
Perlの環境を構築しました。{{< twitter "hirocaster" >}}さんと若干違いがあった(下記★
の箇所)ので、私の手順も書き留めておきます。
Perl力はゼロな私ですが、以下の認識でだいたい合っていると思います。
- plenv
Rubyのrbenvに相当。複数バージョンのperlをHOMEにインストールし、切り
替えて使うツール。というよりシステムを汚さないために使う感じ。
- cpanm
Rubyのgemに相当。Perlのライブラリをインストールするために必要なツー
ル。今はcpanじゃなくてこれを使うみたい。
- carton
Rubyのbundlerに相当。アプリごとにライブラリを切り替えることが出来る。
## plenv+perl-build
これは同じ。
```
% git clone git://github.com/tokuhirom/plenv.git ~/.plenv
```
以下を~/.zshenv等に設定して、shellを再起動とかして完了。
```
export PATH=$HOME/.plenv/bin:$PATH
eval "$(plenv init -)"
```
Perlをビルドするためにはperl-buildが必要(★)。
```
% git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
```
インストール可能なPerlがずらずらと表示されるようになった(★)。
```
% plenv install -l
Available versions:
(省略)
5.18.0
5.19.0
5.19.1
```
## Perl
現時点での最新リリース版5.18.0をインストールする。Perlはx.y.zのy番
号が奇数が開発版で偶数が安定版とのこと。'-Dusethreads'がなぜ必要な
のかは知らない。
```
% plenv install 5.18.0 -Dusethreads
```
デフォルトで5.18.0を使うように設定&もろもろ更新
```
% plenv global 5.18.0 && plenv rehash && rehash
```
インストールされた!
```
% which -a perl
/home/masutaka/.plenv/shims/perl
/usr/bin/perl
% perl -v
This is perl 5, version 18, subversion 0 (v5.18.0) built for darwin-thread-multi-2level
```
## cpanm
plenvがインストーラを提供しているので、これだけでインストール出来る。
```
% plenv install-cpanm
```
はい!
```
% cpanm -V
cpanm (App::cpanminus) version 1.6923 (/home/masutaka/.plenv/versions/5.18.0/bin/cpanm)
perl version 5.018000 (/home/masutaka/.plenv/versions/5.18.0/bin/perl5.18.0)
```
## carton
cpanmを使って、さくっとインストール(★)。
```
% plenv exec cpanm Carton
```
ほい!
```
% plenv exec carton -v
carton v0.9.15
```
これでシステムにないライブラリを要求するPerlスクリプトがあっても、
怯えずに暮らせそうです!
※ Module::Installは不要っぽいのでインストールしませんでした(★)。
なくてもGrowthForecastはインストール出来ました。
## Chefのレシピ
以上をChefで書きました。serverspecは割愛。
Ruby&Chef力が低いので、ツッコミ歓迎...
{{< gist "masutaka" "6011122" >}}
--------------------------------------------------------------------------------
title: "nginxのアクセスログをFluentd経由でMongoDBに保存してみた"
date: "2013-07-14"
--------------------------------------------------------------------------------
{{< figure src="/images/fluentd.png" link="http://fluentd.org/" target="_blank" rel="noopener" alt="画像" >}}
Fluentdを使ってみたかったので、masutaka.netのnginxアクセスログを
Fluentd経由でMongoDBに保存してみました。
Fluentdについては以下が分かりやすいです。
[Fluentdで始めるリアルタイムでのログ有効活用 - CodeZine](http://codezine.jp/article/detail/6958)
今回も{{< twitter "hirocaster" >}}さんの記事をほぼトレース。
- [なぜFluentdなどを使ってログデータ活用するのか?|Act as Professional - hiroki.jp](https://hiroki.jp/2012/05/22/4054/)
- [fluentdをインストールしてnginxのログをまずはローカルで集める|Act as Professional - hiroki.jp](https://hiroki.jp/2012/05/23/4088/)
- [fluentd経由のデータをmongodbへ保存する|Act as Professional - hiroki.jp](https://hiroki.jp/2012/05/27/4131/)
- [実際に運用しているサービスのnginxログをLTSVにしてみた!|Act as Professional - hiroki.jp](https://hiroki.jp/2013/02/20/6741/)
実際、やっていることは単純で、
1. nginxがアクセスログをファイルに書き出す。
2. それを検知したFluentd(実際はtd-agentを利用)がMongoDBに記録する。
ってだけです。
最後の記事を参考に、nginxのログ形式はデフォルト(Combined形式と呼ぶ
らしい)から[LTSV](http://d.hatena.ne.jp/naoya/20130209/1360381374)形式に変更してます。最近のtd-agentはLTSVをサポートし
ているのでシンプルに書けました。あと、td-agentのログでWarningが出て
いたので、pos_fileも追加しました。
fluent-plugin-mongoをインストールするChefのレシピと、nginxの設定も
コピペしておきますね。
{{< gist "masutaka" "6238387" >}}
始め、nginxとtd-agentの通信はパイプかなにかを介するのかと思い、難し
く考えていましたが、実際は単なるファイルでした。ポーリングしている
みたいです。
もうひとつ誤解してたのが、
td-agentを使う = Hadoopを使わなければならない
だと思い込んでいたことでした。やたら難しく考えていた。
やってみたら予想以上に単純でした。むしろChefのレシピを作るのに、
多大な時間を使ってしまった。。
次は[GrowthForecast](http://kazeburo.github.io/GrowthForecast/)を試してみます。
**追記(2013-07-15):**
今のtd-agentはLTSVをサポートしているFluentdを同封していると指摘を受
けましたので、記事を書き換えました。repeatedlyさん、ありがとうござ
いました。
**追記(2013-08-15):**
Chefのレシピやnginxの設定も追加しました。
--------------------------------------------------------------------------------
title: "masutaka.netをさくらのVPSに置き換えました"
date: "2013-05-27"
--------------------------------------------------------------------------------
このブログはほぼ静的コンテンツなので、置き換えるメリットはほぼありません。でもいろいろ遊びたかったので置き換えました!
## 置き換え前
さくらのレンタルサーバ {{< post "2009-05-17-4" >}}
* リアルサーバ
* 他の人と/homeを共有する
* コントロールパネルからメールアドレスを作ったり、アクセス解析出来る
* カスタマイズ性はほぼない
* OSはFreeBSD 7.1-RELEASE-p16
* WebサーバはApache/1.3.42
* 年間5,000円(スタンダードプラン)
## 置き換え後
[さくらのVPS](http://vps.sakura.ad.jp/)
* 仮想サーバ
* ユーザは自分だけ
* コントロールパネルとかはない
* カスタマイズしまくり
* OSはUbuntu12.04 LTSにした {{< post "2013-05-19-1" >}}
* Webサーバはnginx/1.1.19にした
* 年間16,280円(プランは2G。石狩リージョン)
## 雑記
結構真面目にサーバを構築しました。参考にしたのはもちろん『入門Chef Solo』{{< post "2013-04-22-4" >}}
基本的にVagrantと[serverspec](http://serverspec.org/)で検証しつつレシピを書いたので、本番環境で悩むことは少なかったです。時代は進みましたね。
Webサーバはnginxにしました。Apacheに比べて、設定がシンプルで惚れました。あと、ごく一部で使っているcgi用にfcgiwrapをインストール。
chef-soloで構築してみた疑問や課題はこんな感じ
* パッケージ全体のupgradeはどのタイミングでやれば良いのか?
* 他の人のChef-soloリポジトリを知りたい。Vagrantでも真面目にテスト書いている?とか。
chalowはChef-soloでは管理してません。まあ、Webアプリケーションなので、デプロイ対象とかそっちの話だと思う。今は自作のmkchalowコマンドでアップロードしてます。{{< post "2009-06-14-3" >}}
--------------------------------------------------------------------------------
title: "パソナテック様主催のセミナー『アジャイル開発におけるリーダーシップとは』に行ってきた"
date: "2013-05-27"
--------------------------------------------------------------------------------
先週木曜日の話になりますが、このツイートを見てノリで行ってきました。
http://twitter.com/hirocaster/status/336485491144798208
[【講演】アジャイル開発における新しいリーダシップのありかた|Act as Professional - hiroki.jp](https://hiroki.jp/2013/05/20/6873/)
[【講演資料】アジャイル開発における新しいリーダシップのありかた|Act as Professional - hiroki.jp](https://hiroki.jp/2013/05/27/6883/)
{{< speakerdeck "011614d0a6b3013045c7167a04105724" >}}
当日は間違えて丸の内北口から出てしまったので、着いたのは結構ギリギ
リな時間に...。でも大塚さんの目の前に陣取った!
最初はアジャイルの基本的な話。変化が当然のこの時代に機敏に行動する
ための一つの解がアジャイルという(私の)認識。一度大塚さんから直接レ
クチャーを受けたことがありますが、結構忘れてますね。。。補正が出来
てよかったです。
この辺をメモってた。
・スクラムは炭鉱のカナリア
・スクラム用語ではイテレーションはスプリント
スクラムとアジャイルの違いが分かってませんでしたが、{{< wikipedia word="スクラム_(ソフトウェア開発)" text="wikipedia" >}}による
と『スクラムは、ソフトウェア開発における軽量なアジャイルソフトウェ
ア開発手法の1つである。』とのこと。なるほど。
しかし、アジャイルは難しい。スクラムマスターいないと絶対最初は失敗
するでしょw 講演では40ページ目がスクラムの全てと言ってましたが、絶
対イメージわかないでしょw
後半は本題。アジャイル開発におけるリーダーシップの話でした。スクラ
ムマスターにリーダーシップが求められるのは当然ですが、彼がいなくて
も回るチームが目標とのこと。そうですよね。ってことは、メンバー全員
にリーダーシップが必要になります(今読んでいる本でも同じこと言ってる)。
終わったあとは大塚さんとパソナテックのお姉さん2人とで、~~飲んで~~振り
返りをしてきました。スクラムでは振り返りが大事ですからね!
終わり。
--------------------------------------------------------------------------------
title: "さくらのVPS Ubuntuを10.04から12.04 LTSにバージョンアップした"
date: "2013-05-19"
--------------------------------------------------------------------------------
{{< post "2013-04-22-4" >}}で書いたとおり、このmasutaka.netのリプレイス先のサー
バをセットアップ中です。
今回はカスタムOSインストールからUbuntu 10.04 i386をインストールして
から、12.04 LTSにアップデートしました。
参考にしたのはこの記事。
[さくらのVPS Ubuntu 10.04から12.04 LTSヘバージョンアップする|Act as Professional - hiroki.jp](https://hiroki.jp/2012/05/28/4149/)
ほぼこのまんまやってうまくいきました。毎度ありがとうございます。
resolvconfはバージョンアップしたら勝手に入ったので、apt-get
installは不要と言えば不要でした。
名前解決はやっぱりできなかったので、記事と同じように
/etc/resolvconf/resolv.conf.d/baseへの追記と、
設定の反映"sudo resolvconf -u"をして終了。
MySQLはまだ使わないのでこの時点では何もせず。
Ubuntuは/etc/lsb-release見ればリリース情報が分かるみたいですね。
これはバージョンアップ前
```
% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"
```
これはバージョンアップ後
```
% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"
```
Chef-soloの使い方もだいたい理解したので、これからnginxとか入れてい
きます。
P.S.
preciseって、コードネームだったのか。。(Debian脳ェ...)
--------------------------------------------------------------------------------
title: "『トモダチコレクション 新生活』がやってきた!"
date: "2013-05-10"
--------------------------------------------------------------------------------
{{< amazon asin="B005MWC46E" title="トモダチコレクション 新生活" >}}
ダウンロード版を買っちゃった♡
今までやったゲームって、難しすぎてコントローラを叩きつける系のが多
かったんです。例えばデビルメイクライ3→{{< post "2011-02-11-5" >}}
それと比べると、なんとヌルイゲームであることか。
主にすれちがい通信のMiiを登録してますが、近所の子供とかに告白して
キモイオッサンになってます。やばいw (※基本勝手にするんです)
ググると芸能人Miiもあったので、QRコードで何人か登録してます。
{{< twitter "Nintendo_Mii_" >}} もフォロー☆
[キャンペーン](https://club.nintendo.jp/present/P165/index.html)もやってたので、「トモダチコレクション 新生活 ファッショ
ンカタログ」を50Pで申し込みました。もうどうにでもなれ..ヽ(´▽`)ノ
それにしてもボスがなかなか出てこないなー
--------------------------------------------------------------------------------
title: "『コーディングを支える技術』を読んだ"
date: "2013-05-03"
--------------------------------------------------------------------------------
{{< amazon asin="477415654X" title="コーディングを支える技術" >}}
ちょいちょい話題になっているようだったので読んだ。一見、エディタや
統合開発環境の本に見えるけど、そうじゃなくてプログラミング言語の歴
史が書かれた本。
前半はなじみ深いCやLispが例に出ることが多く、サクサク読めた。やっぱ、
CとLispはテッパンですね。
今なんとなく使っているif文や名前空間、継承などは、歴史によって磨か
れ当たり前に使われていると再認識。
各章はコンパクトにまとめられているのでサクサク読めた。内容もそんな
に濃くないので、GWにさっと読むのは良いかも知れない。
--------------------------------------------------------------------------------
title: "『入門Chef Solo - Infrastructure as Code』を読んだ"
date: "2013-04-22"
--------------------------------------------------------------------------------
{{< amazon asin="B00BSPH158" title="入門Chef Solo - Infrastructure as Code" >}}
業務でちょろっと使ったことある程度だし、890円だし、買ってみた。
Chefはサーバー設定や更新を自動化するツールです。サーバにちょっとで
も興味がある人は今すぐ読んだ方が良いです。仮想サーバのVagrant使って、
本当に簡単に試すことが出来ます。
前職で頑張ってNFSやLDAPをセットアップしてましたが、もうそういう時代
じゃないんですね。
knife-solo 0.3.0のrake installや、[knife solo initでエラーになり](http://appshortcut.blogspot.jp/2013/04/knife-solo-init-uninitialized-constant.html)、
ちょっと調べる必要があったので、そこはアップデート版に期待したいです。
買った時は考えていませんでしたが、これを機にこのブログのサーバをリ
プレイスすることにしました。
今はさくらのレンタルサーバ スタンダードを使っています。{{< post "2009-05-17-4" >}}
要は共有サーバなので、自由にパッケージを入れたり設定を変えることは
出来ません。HOMEディレクトリも共有です。
ちょうど4/20が契約更新のタイミングだったので契約を停止し、[さくらの
VPS 2Gプラン](http://vps.sakura.ad.jp/)を申し込みました。nginx動かしたり、fluentd(というかtd)
でログ集めたりしようかなあと思ってます。
そのためのサーバの設定をChef Soloで書きます。5/31までにリプレイスし
ないと、masutaka.netにアクセスできなくなる。ヤバイw
--------------------------------------------------------------------------------
title: "『若者よ、アジアのウミガメとなれ』を読んだ"
date: "2013-04-22"
--------------------------------------------------------------------------------
{{< amazon asin="477712410X" title="若者よ、アジアのウミガメとなれ" >}}
なんとなく買ってしまった。講演は一度聴いたことあるし、直接話も聞い
たことがあるのにw
読んでいると加藤さんの声が聞こえてくる不思議な本。講演のテープを本
に起こしたので、当たり前と言えばそうなんですが。
しかしまあ、こういう形で出したのは大正解。加藤さんと非常に相性が良
い。ボリュームが手頃だし読みやすいのでガンガン読める。
日々悶々としている人は、とりあえず読むと何か変わるかもしれません。
Kindole版は270円。安い!
ラングリッチの話もちょっと出て来ますよ。
--------------------------------------------------------------------------------
title: "『ビッグデータの衝撃』を読んだ"
date: "2013-04-22"
--------------------------------------------------------------------------------
{{< amazon asin="4492580964" title="ビッグデータの衝撃" >}}
[ビッグデータの衝撃がKindleセール中だったので読んでみた - UNIX的なアレ](http://wadap.hatenablog.com/entry/2013/01/27/164236)
まさに「データ解析をやらないとなーと漠然と思ってるけれど、それによっ
て何が起きるのかイマイチわかってない人」なので読んだ。
知識ゼロだったので読んで良かった。
前半は面白くサクサク読めます。HadoopとかMapReduceとか知らなくても
OKというか、むしろそういう人向けの内容。
後半はやや退屈さが増してきて、読むのに時間がかかってしまった。
でもオススメ。
--------------------------------------------------------------------------------
title: "2013年3月も11回しかジムに行けなかった。 #クイックシェイプ"
date: "2013-04-22"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2013年3月の記録
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|3/ 3(日)|111|76|102
|3/ 6(水)|119|69|92
|3/ 8(金)|121|72|95
|3/12(火)|129|77|98
|3/14(木)|119|75|96
|3/16(土)|117|74|107
|3/19(火)|119|72|78
|3/21(木)|105|65|86
|3/23(土)|119|72|98
|3/27(水)|121|75|98
|3/31(日)|124|72|96
※運動前に測定
3月は31日中11回行ったので、2.8日に1回行ったことになります。
ジムの営業日(26日)を考慮すると2.4日に1回です。最低だった先月をさら
に下回りました。
ちょっと、3月はモチベーションの低下が著しかったですね。2日連続で行
くこともなくなりました。最近も頻度は変わらない気がするなー。ま、そ
のうち気分も変わるでしょ。
--------------------------------------------------------------------------------
title: "通知特化型Twitterアプリ「29hours」をHerokuで動かせた"
date: "2013-04-14"
--------------------------------------------------------------------------------
{{< figure src="/images/heroku-logo-light-300x100.png" link="https://www.heroku.com/" target="_blank" rel="noopener" alt="画像" >}}
[通知特化型Twitterアプリ「29hours」をつくってHerokuで動かしているお話 - 準二級.jp](http://june29.jp/2013/03/08/29hours/)
昨日というか今朝Heroku力がついたおかげで{{< post "2013-04-14-1" >}}、案外簡単に
できました。
settings.ymlはだいたいこんな感じ。
```
twitter:
my_screen_name:
masutaka
consumer_key:
XXXXXXXX
consumer_secret:
XXXXXXXX
access_key:
XXXXXXXX
access_secret:
XXXXXXXX
matchers:
keywords:
- masutaka
- マスタカ
- 増田
notifiers:
imkayac:
username:
XXXXXXXX
linker:
http
```
https://dev.twitter.com/apps からアプリを作って、consumer_keyや
consumer_secretなどを埋める必要があります。やったことない人は気づく
まで時間がかかるかもしれません。
普段使っているTweetAtokは個別ツイートのURLスキーマは対応してなさそ
うでした。残念。
以下、記事の見出しと対応してます。
## 動かす
ここまで来ると、ローカルで普通に動きます。タイムラインがだらだら流
れていくことと、普段から使っている[im.kayac.com](http://im.kayac.com/)から通知が来ることを
確認しました。
あ、今朝と同じようにgemはvender/gems以下にインストールして動作確認
しました。{{< post "2013-04-14-1" >}}
## Heroku に乗せる
ここはちょっとハマりました。Dropboxにsettings.ymlを置きリンクを有効
にしたんですが、29hoursは起動してないようでした。
ログを見るため、[Papertrail](https://papertrailapp.com/)を入れようと
% heroku addons:add papertrail:choklad
を実行したら下記のエラーメッセージ。Freeプランでもクレジットカード
情報が必要みたいです。
```
! Please verify your account to install this add-on
! For more information, see http://devcenter.heroku.com/categories/billing
! Verify now at https://heroku.com/verify
```
登録してもHerokuが混雑しているのか、エラー画面に飛ばされました(再度
Appsのページに行ったら、Papertrailがインストールされてたので良しと
した)。
ログを見たら、Rubyのパースエラーが発生してました。ためしに
% heroku config:unset SETTINGS_FILE_PATH
したあと、settings.ymlをcommitしてHerokuにpushしたところ、無事動きました!
(私以外は見られないリポジトリだから問題ないと思う)
## まとめ
これで通知のためだけに動かしていたTiarraのTIG(TwieetIrcGateway)は
要らなくなるのかも。そもそも最近IRC使ってないなあ。。
{{< twitter "june29" >}}さん、ありがとうございました!
## おまけ
Herokuではworkerを有効にすると、Procfileを参照するのですね。
このように書いてありました。なるほど。
>worker: bundle exec ruby 29hours.rb --production
これはちょっとハマったw
>(誤) $ heroku restart –app アプリ名
>(正) $ heroku restart –-app アプリ名
**追記(2013-04-15):**
上記restartの件は、修正して下さいました。
--------------------------------------------------------------------------------
title: "やっとHerokuデビューできた"
date: "2013-04-14"
--------------------------------------------------------------------------------
{{< figure src="/images/heroku-logo-light-300x100.png" link="https://www.heroku.com/" target="_blank" rel="noopener" alt="画像" >}}
[Railsで簡単なアプリをscaffoldで作ってHerokuにデプロイするまで #heroku #PostgreSQL #Rails #Ruby - Qiita](http://qiita.com/items/cd2391e028dc44dd6f40)
Rails力がそこそこついてきたので、こちら試したら案外簡単にできました。
年末に別な記事で試した時はギブアップしたのですが。orz
Herokuアプリ: http://sample-masutaka.herokuapp.com/
GitHub: https://github.com/masutaka/rails.sample/
基本、記事の通りで大丈夫ですが、最初からRailアプリを作ったことがな
かったので、ちょっとだけハマりました。
## ローカルでRailsアプリ作成
アプリ名のディレクトリ(今回はsample)作って、cdしました。
次にRails gemをインストールしました。Gemfileを作って"bundle
install"実行です。今回は.bundle/configを作って、ローカルのgemは
vender/gems以下にインストールされるようにしました(Heroku上では強制
的にvendor/bundle以下にインストールされるみたい)。
https://github.com/masutaka/rails.sample/commit/e69e24db750b97576a67d62c1e526b8dc57e5f09
最後に"bundle exec rails new ."を実行すれば、Rails環境がセットアッ
プされます。"Could not find gem 'jquery-rails"というエラーが発生し
ましたが、"bundle install"したら問題なさそうでした。
https://github.com/masutaka/rails.sample/commit/fffc748ce3ddf86c286b0ec3515ddc6792b1061c
この状態で"./script/rails s"すると、http://localhost:3000 にアクセ
ス出来るようになります。
## 初めてのHerokuへのデプロイ
記事の通りに"heroku create sample-masutaka"でアプリを作り、
git push herku masterすればデプロイ完了です。
ちなみにアプリを作ると"git remote add heroku .."されるため、
"git push heroku master"出来るようになります。
"git remote -v show"で確認出来ますね。
記事の通りにDBを指定しなかったので、sqlite3関連でエラーになってしま
いました。Herokuではsqlite3使えないのですね。production環境のDBを
postgreSQLにして解決しました。
https://github.com/masutaka/rails.sample/commit/a73fa5cd3b10dd8a47d1daf6b8483051db257374
http://sample-masutaka.herokuapp.com/ にアクセス出来ました。
## 簡単なブログアプリを作る
以下を実行するだけで http://localhost:3000/articles から記事を書け
るようになります。Railsはすげーなあ。
```
% ./script/rails g scaffold article title:text text:text
% bundle exec rake db:migrate
```
https://github.com/masutaka/rails.sample/commit/f4ad98c41877341c410f1ece50b83e459fe1a417
## ブログ機能をデプロイ
問題なさそうなので、"git push heroku master"でHerokuにデプロイしま
したが、PostgreSQL関係でエラーになってしまいました。
config/database.ymlのproductionがsqlite3のままなので当然ですね。
[herokuでRails3.2のアプリケーションを動かす - のほほん女子大生のインタラクション日記](http://yuriponx.com/2012/05/08/heroku%E3%81%A7rails3-2%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99/)
こちらを参考に設定しました。DBのホスト名やユーザ名、パスワードはア
プリのResourcesにあるHeroku Postgres Dev :: Grayに書いてあります。
https://github.com/masutaka/rails.sample/commit/bcd3d018ecb14a6354a504648565c9afd3276064
(当然ですが、pushしたcommitでは伏せ字にしてます。)
http://sample-masutaka.herokuapp.com/articles にアクセスしてもまだ
エラーになります。migrationしてないからですね。
"heroku run rake db:migrate"したらアクセス出来るようになりました。
やった!
--------------------------------------------------------------------------------
title: "ついにドラクエ7をクリアーしたぞ!"
date: "2013-03-24"
--------------------------------------------------------------------------------
{{< figure src="/images/dq7-logo.png" link="http://www.dragonquest.jp/dq7/" target="_blank" rel="noopener" alt="画像" >}}
歩いて歩いて歩いて歩いて歩きまくって、上り階段を間違えて間違えて間
違えて間違えて間違えて上りまくって、ようやくクリアー出来ました。
クリアー時間はなんと98時間22分。レベルも熟練度も上げてないんですよ
これ(街とかダンジョンはまあまあ念入りに探索した)。長い長いと聞いて
いたけど、ホントに長かったw
ラスボスは弱いと聞いていたので、まものハンター、パラディン、パラディ
ン、盗賊という戦略もなにもないパーティでプラッと倒しに行きました。
弱いなんてとんでもない!全てを出し尽くして、ようやく勝てました。世
界樹のしずく、世界樹の葉、まほうの聖水がほぼゼロになった。。
クリアーレベルは43, 39, 38, 40。そんなに低くないみたい。職業が適当
すぎたかw
攻撃力が一番高いキャラに仕事が集中してしまって、バイキルトやマジッ
クバリア、ザオリクに忙しく、全然攻撃出来なかった。一方で賢者の石か
炎の爪を使うしかやることがないキャラもいたしw
フバーハとかスクルトとかかけてもすぐ無効にされるので、最後の方はバ
イキルトしか使いませんでした。
## ドラクエ7は歩きゲー
それにしてもよく歩かされたゲームでした。それもこれも過去の世界でルー
ラが使えないのが大きい。
現代に復活させてからも、同じ街やダンジョンを歩くことになるので、と
にかく歩きました。私情弱なので、大灯台なんて5回くらい上りましたよw
隅々まで確認しないと気が済まない私の性格もありますけど。
## レベルも熟練度も上げなかった
ボスとか接戦で倒すのが好きなので、レベルも熟練度も敢えて上げません
でした。でも、誰も勇者になったことがないってどういうことなの?w (ゴッ
ドハンドや天地雷鳴士にもなってない)
## でも楽しかった!
{{< post "2013-02-16-1" >}}で書いたとおりゲームは2年ぶりだったので、思い切り楽
しめました。7のシナリオは歴代のドラクエの中でも、屈指の出来だと思
います。結果を曖昧にして、それとなく伝わってくる感じが素晴らしい。
リアリティがあります。
そんなわけで~~無駄な~~有意義な時間を使いたい方は、是非プレイをオススメします!
{{< amazon asin="B009Z5XKJO" title="ドラゴンクエストVII エデンの戦士たち" >}}
--------------------------------------------------------------------------------
title: "2013年2月は全然ダメ。10回しかジムに行けなかった。 #クイックシェイプ"
date: "2013-03-24"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2013年2月の記録
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|2/ 1(金)|111|66|89
|2/ 3(日)|121|71|93
|2/ 5(火)|120|69|75
|2/ 7(木)|127|83|86
|2/ 9(土)|115|72|97
|2/12(火)|120|77|77
|2/14(木)|117|69|89
|2/16(土)|測り|忘|れ
|2/22(金)|117|76|83
|2/24(日)|128|71|91
※運動前に測定
2月は28日中10回行ったので、2.8日に1回行ったことになります。
ジムの営業日(23日)を考慮すると2.3日に1回です。今までで最低か。。
前半はいい感じで行ってますが、後半からガクッと行かなくなってます。
それもこれもドラクエが来た{{< post "2013-02-16-1" >}}からです。...違います。仕事
が忙しかったからです。会社出るのが21:30とかだとさすがに行こうとは思
わないですね..。
いつもは月始めのこの記事を24日に更新していることから、モチベーショ
ンも落ちてると思います。
でも3月はまあまあ行けてますし、体脂肪率が急に減ってきたので、良い傾
向に戻ってきたんじゃないでしょうか。
体脂肪率って寒いと減らないのか、寒いと機器が正確でないのか、どっち
なんでしょうねえ。
--------------------------------------------------------------------------------
title: "better than grepなackを試してみた"
date: "2013-03-24"
--------------------------------------------------------------------------------
better than grepなツール[ack](http://betterthangrep.com/)がタイムラインでちょっと話題になっていた
ので、試してみました。find+grepより速くて良いね。
OSXならbrewでインストールするとお手軽なんでしょう。
> % brew install ack
デフォルトで再帰検索してくれます。.gitとか.svnディレクトリは勝手に
無視してくれるようです。
```
% ack hoge
test/test-twittering-mode.el
405: (setcdr (assoc 'in-reply-to-screen-name status) "hoge")
407: (test-assert-string-equal " in reply to hoge"
```
検索対象の拡張子は"ack --help-types"で確認出来ます。-kオプションを
付けると、すべてのファイルを対象にします。
```
% ack -k hoge
```
ファイルやディレクトリも指定可能です。
```
# ファイル
% ack hoge twittering-mode.el
# ディレクトリ
% ack hoge test
test/test-twittering-mode.el
405: (setcdr (assoc 'in-reply-to-screen-name status) "hoge")
407: (test-assert-string-equal " in reply to hoge"
```
--nogroupオプションを付けるとgrep -nっぽい出力になります。
```
% ack --nogroup hoge
test/test-twittering-mode.el:405: (setcdr (assoc 'in-reply-to-screen-name status) "hoge")
test/test-twittering-mode.el:407: (test-assert-string-equal " in reply to hoge"
```
~/.emacs.d/init.elのgrep-find-command変数をこのように変更しました!
```elisp
;; 変更前
(setq grep-find-command
'("find . -type f -name '*' ! -path '*/.git/*' -print0 | xargs -0 grep -nH -e /dev/null" . 76))
;; 変更後
(setq grep-find-command '("ack --nogroup --nocolor -k " . 28))
```
**追記(2013-04-21):**
.ctpファイルを検索してくれないので、~/.ackrcを新規作成して以下を
追加しました。"ack --help-types"で確認出来ます。
>--type-add=php=.ctp
デフォルトは登録された拡張子のファイルだけ検索するようですね。php系
のファイルだけ検索したい時は--phpオプション、除外したい時は--nophp
オプションを付ければ良いみたいです。
参考: [How to let ack support more filetypes? - Stack Overflow](http://stackoverflow.com/questions/3870611/how-to-let-ack-support-more-filetypes)
**追記(2013-08-04):**
ack version2から検索対象のデフォルトが「全て」から「登録された拡張
子のみ」に変わったので、記事を書き換えました。
--------------------------------------------------------------------------------
title: "Railsのpreloader springを試してみた"
date: "2013-03-24"
--------------------------------------------------------------------------------
[Rails使いよspork, zeusからspringへ!|Act as Professional - hiroki.jp](https://hiroki.jp/2013/02/08/6529/)
ようやく[spring](https://github.com/jonleighton/spring)を試しました。
まだ[zeus](https://github.com/burke/zeus)からは乗り換えられないかなー。開発は活発みたいなので、もう
少ししたらまた試します。以下、詳細。
テストを走らせたら、盛大にレッドになった。ちょっと調べたところ、
1と2要因がほとんど。他にもあったかも知れない。3も困るかなあ。
## 1. letではhogeは使えない。hoge_idを使う。
※ この例ではLifeモデルはUserモデルのhas_oneです。
以下のように直す必要がありました。まあ、直せば良いんですけどね。
```
# 修正前
let(:taro) { FactoryGirl.create :taro_full_profile }
let(:life_1) { FactoryGirl.build :life_1, user: taro }
# 修正後
let(:taro) { FactoryGirl.create :taro_full_profile }
let(:life_1) { FactoryGirl.build :life_1, user_id: taro.id }
```
## 2. スタブが使えない。
これが致命的でした。beforeとかでスタブを設定しても効きませんでした。
```
before { Life.any_instance.stub(:fun?).and_return false }
```
## 3. モデルにbinding.pryを追加したらspringを再起動する必要あり。
手動でbundle exec spring stopする必要がありました。
--------------------------------------------------------------------------------
title: "『虐殺器官』を読んだ"
date: "2013-02-26"
--------------------------------------------------------------------------------
{{< amazon asin="4152088311" title="虐殺器官" >}}
舞台はサラエボに核爆弾が落とされた後の近未来。主人公は暗殺部隊の太尉。
登場するギミックはなかなか面白く、ところどころにゾクゾクする面白さがあったけど、不思議と一気に読めてしまうとまでは行かなかった。言葉が難しかったからかなあ。
Kindleじゃなかったら、途中で読むのを止めてしまったかも。。
--------------------------------------------------------------------------------
title: "ドラクエ7がやってきた!"
date: "2013-02-16"
--------------------------------------------------------------------------------

オンラインの10を除いて唯一やってなかったので、発売のこのタイミングで買いました。ドラクエはゲームバランスが良いですね。中ボス戦が燃える!もうすぐダーマの神殿に着きます!
話によるとシリーズ屈指の長さだそうで、覚悟してやってますw でも3DS版はリメイクが良く評判が良いそう。PS版は石版集めが超だるかったけど、3DS版は~~ドラゴン~~石版レーダーがある等。
Amazonだと1000円くらい安かったですよ。ダウンロード版もっと安くすれば買うのに。
{{< amazon asin="B009Z5XKJO" title="ドラゴンクエストVII エデンの戦士たち" >}}
明石に行く時にゲーム機は全て手放しましたが、この度(中古だけど)買いました。専用機でゲームやるのは実に2年ぶり。
{{< amazon asin="B0056F457I" title="ニンテンドー3DS フレアレッド" >}}
付属のSDカードは2GBなので、サイズが大きいものに変えることをオススメします。
{{< amazon asin="B005LFT3MA" title="SANDISK フラッシュカード SDSDXPA-016G-X46 並行輸入品" >}}
--------------------------------------------------------------------------------
title: "2013年1月は良いスタート。皇居ランニング含めて14回ジムに行った。 #クイックシェイプ"
date: "2013-02-02"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2013年1月の記録
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|1/ 5(土)|皇居|ラン|ニング
|1/ 6(日)|128|80|93
|1/ 9(水)|116|68|79
|1/10(木)|測り|忘|れ
|1/12(土)|127|81|95
|1/13(日)|119|73|90
|1/15(火)|114|68|82
|1/16(水)|119|72|80
|1/19(土)|126|72|88
|1/22(火)|121|72|79
|1/23(水)|116|72|74
|1/25(金)|116|67|80
|1/27(日)|109|71|90
|1/29(火)|120|75|76
※運動前に測定
1月は31日中14回行ったので、2.2日に1回行ったことになります。
ジムの営業日(22日)を考慮すると1.6日に1回です。おおすごい。
今月はよく行きましたねえ。皇居ランニングの次の日も行ったのは頭おか
しいとしか思えませんw 30,31日も行くつもりでしたが、仕事が終わらず行
けませんでした。記録更新のチャンスだったのに。残念。
## 皇居ランニングに行った
というわけで、ジムの忘年会の流れで行くことになりました。走るのは2
年前の河口湖マラソン(27km)以来。前職のサークルで皇居ランニングした
のはいつだったかなあ。
雰囲気はうちの店長のブログで分かるかと。
[イベント!|西本誠一 オフィシャルブログ 「夢実現へのサポート」](http://ameblo.jp/nisinisi50/entry-11442902932.html)
[イベント2|西本誠一 オフィシャルブログ 「夢実現へのサポート」](http://ameblo.jp/nisinisi50/entry-11442924581.html)
[イベント3|西本誠一 オフィシャルブログ 「夢実現へのサポート」](http://ameblo.jp/nisinisi50/entry-11444267759.html)
14:00にジムに集まって、みんなで[ランナーズステーションの神保町店](http://runsta.jp/contents/jinbouchou.html)に向
かいました。ちょっと狭いですが、なかなか良かったですよ。
武蔵新城時代のコーチの方々にも再会出来て良かった。まさか皇居のラン
ステで再会とはw
普段全く走っていませんが、まがりなりにも体を動かしているので、5kmは
あっという間でした。ただ、何を思ったのか昼にカレーを食べてしまった
ので、後半は腹が痛くてペースダウン。アホかと。
終わってからのほうがエネルギー使ったかもw
近くの白木屋で懇親会。かなり飲んだ気がする..。下高井戸に戻ってから
も、忘年会{{< post "2012-12-31-1" >}}の方のお宅にまたお邪魔しました。コーヒーを
ご馳走になるはずが、かなり食べた気がする..。調子こいてビールも頂いたw
これは翌々日のツイート☆
{{< tweet user="masutaka" id="288282407411531776" >}}
## 100ポイント溜まった
{{< tweet user="masutaka" id="292537501694971904" >}}
{{< figure src="/images/quickshape-stamp100-s.jpg" link="/images/quickshape-stamp100.jpg" target="_blank" rel="noopener" alt="画像" >}}
去年の7/28に入会した{{< post "2012-07-29-1" >}}ので、かかったのは175日でした。
武蔵新城の時はどうかなあ〜と、ツイートを漁ってみたら230日でした。
フィリピンに3週間行ってた{{< post "2011-04-22-1" >}}とはいえ、これは意外。
{{< tweet user="masutaka" id="23229434466" >}}
{{< tweet user="masutaka" id="62362971501895680" >}}
ジムに行くたびにもらえる、ポイントの交換ルールが以前よりお得になっ
てました。以前はポイントを使って交換しましたが(=ドラクエ4の小さな
メダル)、今は溜まった分だけ交換してくれます(=同ドラクエ5以降)。
20ポイント…[いろはす](http://i-lohas.jp/)
40ポイント…[いろはす](http://i-lohas.jp/)
60ポイント…[いろはす](http://i-lohas.jp/)
80ポイント…[グラソー ビタミンウォーター](http://glaceau.jp/)
100ポイント…[グラソー ビタミンウォーター](http://glaceau.jp/)
150ポイント…クイックシェイプタオルor何か
200ポイント…忘れた
どれもジムで使うので普通にうれしいかも。
## まとめ
- 2013年は良いスタートが切れた。
- 飲みすぎ食べすぎヤバイ。
- 100ポイント溜まって良かった。
--------------------------------------------------------------------------------
title: "お料理共有アプリ『miil(ミイル)』が楽しい"
date: "2013-01-27"
--------------------------------------------------------------------------------
{{< figure src="/images/miil.png" link="http://miil.me/" target="_blank" rel="noopener" alt="画像" >}}
リリースされたのは確か1年半くらい前だったと思う。その時は「料理SNSっ
てちょっと苦しくないかなあ。[Instagram](http://instagram.com/)使ってるから、使うの止めとこ
う。」と思って使わなかった。
でもこの4ヶ月使ってみて、間違いだったことに気づきました。というか楽
しいw
## 楽しいmiil
写真撮ってアップロードするだけで「食べたい!」が結構簡単に付きます。
[Twitter](https://twitter.com/)みたいに凝ったツイートをする必要もないし、Instagramみたいに
美しいものを撮る必要もない。ただただこれから食べるものを撮るだけ。
よく考えたらInstagramで撮ってたの料理ばかりだった。
あと、ユーザー層がTwitterや[Facebook](http://www.facebook.com/)と全然違うんです。気がついたらタ
イムラインがほぼほぼ女性に。主婦の方がやっぱり多くて、大学生や高校
生も普通にいる。中学生もいたw
料理SNSという性格もそうだけど、TwitterのDirectMessageみたいなものが
ないのも理由かも。全部タイムラインに公開されるので危ない感じがしない。
(寝る前にタイムライン眺めるのは非常に危ないですけどねw)
## おや?Twitterが?
それで思ったんですけど、SNSの多様性って確実に進んでますよね。という
かTwitterがSNSじゃなくて、ただのデータ置き場になった感じがする。
(そういう意味では[Crowsnest](http://www.crowsnest.tv/)にはお世話になっています。{{< post "2012-12-24-1" >}})
フォロワーさんとのやり取りは以前より相当減ったような..。って思って
いたら、伊藤直也さんも同じことツイートしてた。
http://twitter.com/naoya_ito/status/294397132960563200
## SNSの使い分け
そういうわけで、最近はなんとなく使い分けています。
Twitterはなんでも流し込んでいて内訳は、どうでもいいツイート、はてブ
したURL(主にプログラミングネタ)、miilの写真かな。
Facebookは直接投稿はまずしない。はてブもプログラミングネタは流さな
いようにしてる。というか今見たらmiilの写真だらけになっていたw
miilはプログラミング色は一切排除。[カレー大好き人間がいるだけ](http://miil.me/u/masutakanet)ですw
## まとめ
そういうわけで、miil楽しいです。[iPhoneとAndroid用のアプリがある](http://miil.me/)ので、
試してみるといいんじゃないかな。ああ、[豚組](http://tabelog.com/tokyo/A1307/A130701/13045423/)行きたい。
--------------------------------------------------------------------------------
title: "『モテキ』は神映画だった"
date: "2013-01-27"
--------------------------------------------------------------------------------
{{< amazon asin="B006LW59HK" title="モテキ Blu-ray豪華版(2枚組)" >}}
うん、前半だけね...。
この手の映画は多分つまらないけど、実は面白いんじゃないか的逆張りを
してみたら、前半はまさにその通りで、でも中盤から「ん?」ってなって
きて、後半爆発した。前半のノリで突き進めば良かったんだけど、ガス欠
になったのかね。
主役の森山未來(今回初めて知った)のダンスがなかなか良かった。Amazon
のレビュー見ると長澤まさみの評価が高いんだけど、私にはさっぱり分か
らなかった。4人の女性の中では麻生久美子が良かった(百鬼丸の母役だっ
たんだ。{{< post "2012-09-30-1" >}} まあ、ああいう女性は無理だけどねw)。真木よう
子はいつ絡んでくるかと待っていたんだけど、最後まで何もなかった。仲
里依紗に至っては単なる1エピソード扱い。うーん。
ほとんどの役者さんは今回初めて動いているのを見たので、それだけでも
収穫かな。リリー・フランキーってあんな人だったのね。
--------------------------------------------------------------------------------
title: "昭和っぽいポットを買いました☆"
date: "2013-01-25"
--------------------------------------------------------------------------------
緑茶が美味しい季節ですよね。最近、[白形傳四郎商店で清沢](http://www.shirakata.co.jp/index.php?main_page=product_info&cPath=1_12&products_id=5)というお茶を
買ったんですが、うちにはやかんしかなかったので、あまり気軽に飲めま
せんでした。
そこで買ったのがこのポットです。
{{< amazon asin="B0030KX2JI" title="ZOJIRUSHI ポット 1.0L AG-KC10-PZクリスマスローズ" >}}
いいでしょう〜 特にこのデザインw 昭和への郷愁を覚えます。小さい頃、
こんなデザインのポットが家にありましたよ。
決め手になったのはAmazonの[このレビュー](http://www.amazon.co.jp/review/R2UQ52M0DQN093/ref=cm_cr_pr_perm?ie=UTF8&ASIN=B0030KX2JI&linkCode=&nodeID=&tag=)。金メダルごもっとも!
> 昔懐かしさのあるポットですが、取っ手の形状が良く見るとセンスのいいデザイン、
> 片手で操作する重さとかお湯の出る口とかさすが象印ちゃんとゾウの鼻のような形状でデザインに金メダルを差し上げたい気持ちです。
このポットは昔ながらのガラス魔法瓶です。うちみたいな独身者二人の家
だったら電気ポットは要らないと思うのですよね。ケトルも持ってたこと
がありますが、気がついたら冷めてることがあるのでイマイチです。シン
プルが一番ですね。
--------------------------------------------------------------------------------
title: "最近作ったchalowプラグイン達"
date: "2013-01-14"
--------------------------------------------------------------------------------
ちょいちょい必要になったので作りました。
[Githubのリポジトリ](https://github.com/masutaka/chalow)放置してるなあ。。
{{< gist "masutaka" "4529427" >}}
順番に説明。
twitter
Twitterアカウントへのリンクを作るだけです。Twitter Anywhereは去年
の12/6をもって使えないことになったので、代わりを探してましたが、こ
の辺で妥協。
tweet
埋め込みツイートを挿入します。今まで[公式の方法](https://dev.twitter.com/docs/embedded-tweets)で取得しHTMLをベタ
に書いてましたが、これだけで表示出来るようです。
speakerdeck_f
Speaker Deckのプレゼンを表示します。
miil
[Miil](http://miil.me/)の画像を表示します。画像は大きさを指定出来ますが、[必ずそのサ
イズを取得出来るとは限らない](https://github.com/FrogAppsDev/miil-apis/tree/master/Japanese)そうです。
省略すると240x240になります。
Instagram
[Instagram](http://instagram.com/)の画像を表示します。
サイズはt(thumbnail), m(medium), l(large)を指定出来ます。
省略するとmになります。
**追記(2013-02-06):**
Instagramを追加しました。
--------------------------------------------------------------------------------
title: "Emacsでカーソル下の記事に対応するchalowのURLをブラウザで開く"
date: "2013-01-14"
--------------------------------------------------------------------------------
結構便利。
{{< gist "masutaka" "4529276" >}}
elisp久々に書いたら、だいぶ忘れてました。文字列ってシングルクオーテー
ションで括っちゃダメなんでしたっけ...?
--------------------------------------------------------------------------------
title: "『アジャイルサムライ』を読まないプログラマはもぐりだよね。私でした。"
date: "2013-01-10"
--------------------------------------------------------------------------------
{{< amazon asin="4274068560" title="アジャイルサムライ-達人開発者への道-" >}}
去年後半から、アジャイルコーチの指導の下、アジャイル開発を始めています。薄々気づいてはいましたが、それ以前はアジャイル**風**開発でしたorz
今までアジャイル本を何冊か読んだり、カンファレンスにも行ったことはありますが、ぶっちゃけよく分かりませんでした。(それでこの本も食わず嫌いのまま、読まなかったわけですが。)
なんとなくこうなんじゃね?と、かんばん使ってみたり、Redmine導入したり、Jenkins導入したり、TDDっぽいことやってみたり。
今思えばアジャイル風開発だったわけです。(それでも、やらなければもっとひどいことになっていたと思いますが。)
そういった状況で、この本を読んでみて思ったこと。
やっぱり本だけじゃ無理だわw
本自体はとっても読みやすいです。元が英語だったことを感じさせない翻訳は特筆に値します。ボリュームも300ページ弱と、めちゃめちゃ多いわけではありません。そのわりに「アジャイルマニフェストの背後にある12の原則」をベースにしており、カッチリ作り込まれています(あとがきそのまま)。
ではありますが、(この本に限らず)本だけでアジャイル始めるのはかなり大変だと思います。でも、これ読まないでアジャイル開発始めるのは無理だと思います。アジャイルに少しでも興味あれば読むべきでしょう。
今はたまたま良い環境に恵まれて、本当に幸運です。まあでも、実際やってみるとアジャイル開発はめちゃめちゃ大変ですねえ。8時間もやるとクタクタです。腹も減るし。
みなさまの苦労が偲ばれる電子書籍です。現在¥480とお買い得になっております。
26人のサムライ達
達人出版会
発行日: 2012-09-14
対応フォーマット: EPUB, PDF
--------------------------------------------------------------------------------
title: "飲みすぎたり食べすぎたりサボった日もあったりしたけど、2012年12月はなんとか12回ジムに行けた #クイックシェイプ"
date: "2012-12-31"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2012年12月の記録
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|12/ 1(土)|103|67|89
|12/ 4(火)|124|68|78
|12/ 6(木)|119|72|76
|12/ 9(日)|122|71|75
|12/11(火)|112|72|83
|12/18(火)|114|72|80
|12/20(木)|120|77|88
|12/22(土)|126|77|95
|12/23(日)|140|87|109
|12/25(火)|122|81|84
|12/28(金)|125|73|97
|12/29(土)|121|72|91
※運動前に測定
12月は31日中12回行ったので、2.6日に1回行ったことになります。
ジムの営業日(24日)を考慮すると2.0日に1回です。
23日の数値がおかしいのは、来る前に下のKALDI COFFEEでシャンパンを試
飲したせいかと...。
今月は前半サボりましたね〜。特に11日からは体調が悪かったわけでもな
いのに1週間空いてます。仕事が忙しかったような気もしますし、飲みが入っ
たような気もしますが、やっぱり寒いんですよ(涙)。
後半はさらに飲みが増えましたが、脂肪がこれ以上増えるのが怖くなった
ので、逆に回数が増しました!気合いも入れ直したけど。
そういえば、12月の頭に先月の健康診断の結果が出て、尿酸値が基準値を
オーバーしてました。悪玉コレステロールの割合も増えてました。時々ド
カ飲み食いをするからでしょうね。野菜も足りないっぽいです。
しかし、普段間食しないし甘い物も飲まないし運動もしているのに、痛風
予備軍とはショック..。
## 忘年会とクリスマスパーティ
22日は下高井戸店で忘年会がありました。あの狭い店内でよく出来たと思
います(笑)。会員の方々が持ち寄った料理がどれもおいしく、また食べす
ぎて飲みすぎました。でも頑張って次の日ジムに行った!
{{< miil "m17z" >}}
[忘年会の様子はこちらにも収められています☆](http://ameblo.jp/nisinisi50/entry-11432792498.html)
忘年会のご縁でクリスマスパーティに招待されたので、24日は会員の方の
お宅にお邪魔してきました。こういうのは武蔵新城時代含めて初めてです
ねえ。またまたしこたま飲んで食べました。大変美味しゅうございました。
{{< miil "m74m" >}} {{< miil "m7oi" >}}
顔見知りの方が増えると、ジムに行くのが楽しくなりますね。
## 皇居ランニングに参加
パーティの流れで、下高井戸店主催の1/5皇居ランニングに参加することに
しました。走るのは2年ぶりで、真冬に走るのは初めてです。距離は5kmな
ので大丈夫だと思いますが、寒さだけが心配です。マジ寒そうだな〜
## まとめ
- 寒さがさらに厳しくなってきて、ちょっぴりサボり気味。
- イベント効果で友達ができた。
- 年明けは皇居ランニングに参加。
--------------------------------------------------------------------------------
title: "Googleリーダーの未読が多くて困っている人はCrowsnestも使うと良いかも"
date: "2012-12-24"
--------------------------------------------------------------------------------
{{< figure src="/images/crowsnest-540x250.png" link="http://www.crowsnest.tv/" target="_blank" rel="noopener" alt="画像" >}}
情報収集系の話題が熱いですね!Crowsnestもそうですが、[SmartNews](https://www.smartnews.be/)とか
[Gunosy](http://gunosy.com/)とか[vingow](https://vingow.com/)とか。
まあでもピンポイントで購読したいブログやウェブサイトは、RSSリーダー
がテッパンです。
[若者が知らない最強の情報収集方法「RSSリーダー」](https://hiroki.jp/2012/08/26/5318/)
[誰よりも詳しく!特定ジャンルの情報を効率的に得るたった1つの方法](https://hiroki.jp/2012/08/26/5369/)
[狙い撃ち!!特定キーワードで最新情報をかき集めて完全把握する方法](https://hiroki.jp/2012/08/26/5397/)
私も以前からGoogleリーダーを使っていますが、250件くらいRSSを登録し
ていると毎日全部読むのはかなり大変です。
特に[はてブのお気に入り](http://b.hatena.ne.jp/masutaka26/favorite)が大変で、数は多いわ同じ記事は何度も出て来る
わで([livedoor Reader](http://reader.livedoor.com/)だとそんなことないそう)、たくさん未読があると憂
鬱になります。マイホットエントリーには期待してたんですが、そのまま
使うと未読管理出来ないし、かといってRSSに登録すると影響範囲が分から
りません。うーん、残念。
そんな時に見たのがこの記事。
[iPhone 5での情報収集でCrowsnestを使うとかなり便利で快適になってきた件 - もとまか日記](http://d.hatena.ne.jp/moto_maka/20121112/1352663271)
CrowsnestはGoogleリーダーのフォルダ(=タグ)を登録出来たんですね。
おかげさまで情報収集にかける時間を1/3くらいに圧縮できました。
## どうやって使ってる?
私はGoogleリーダーで購読している記事には以下の3つのタグを必ず付けて
います。名前の先頭に_(アンダーバー)を付けているのは、他のタグより上
に表示したいからです。この辺は{{< post "2011-01-16-1" >}}の「iPhone情報整理術」
を参考にしてます。
_mustread
必ず読むサイトを登録しています。未読が出来たら何も考えずに別タブで
開きます。そこまでしなくても良いかな〜と思ったら、次に説明する_scanタ
グに変更します。
_scan
Googleリーダー上でざっと見て、面白そうだったら別タブで開きます。新
しくRSSを登録したら、だいたいこのタグを付けます。これも必要性が少な
くなれば、次の_skipタグに変更します。
_skip
優先順位が一番低かったり、更新頻度が高すぎるサイトはこのタグを付け
ます。それさえも必要ないと思ったら、Googleリーダーへの登録を解除し
ます。
Crowsnestに登録するのは_skipフォルダだけです。他の2つは今までどおり
Google Readerで読みます。初めは全部Crowsnestで読んでたんですが、な
んとなく今の形に落ち着きました。
Googleリーダーは大量の記事をざっくり読むのは得意ではないので、そこ
をCrowsnestにお任せするのは良いアイディアなのかもしれませんね。
今は_skipフォルダに気兼ねなく大量配信系のRSSを登録したり、はてブで
フォローする人を増やせるようになりました。
## Crowsnestの良いところ、気になったところ
ざっくり箇条書き。Crowsnest良いですよ!使ってて楽しいです。
良いところ
- 何度も同じ記事を見なくて良い。☆☆☆
- 影響度がすぐ分かる。☆☆
- キーボードショートカット(?で表示)が便利。よく使うのはj,k,s,a,l,o
- 未読管理出来る。☆☆
- タブ内はさくさく動く。
- iPhoneでも読める。
気になったところ
- 未読数が表示されない。
- タブを開くのが遅い時がある。
- 履歴とタイムラインの位置が固定。
- iPhoneでの動作がもっさり。ブラウザの他のタブから戻ってくると再読
み込みされることがありちょっとウザイ。
- はてブする時に(はてブの)タグが使えない。
--------------------------------------------------------------------------------
title: "『ドラゴン・タトゥーの女』は凄まじく面白かった!"
date: "2012-12-18"
--------------------------------------------------------------------------------
{{< amazon asin="B006U9D4U8" title="ドラゴン・タトゥーの女" >}}
2時間半の映画なんですが、全くダレることなく寧ろ一気に最後まで見られ
ました。気がついたら朝の4:00。次の日つらかった!w
監督は{{< amazon_link asin="B0047MZLTC" title="ソーシャル・ネットワーク" >}}の{{< wikipedia word="デヴィッド・フィンチャー" text="デヴィッド・フィンチャー" >}}。ソーシャ
ルネットワークのスピード感そのままに、ストーリーがぎっちり詰め込め
られています。かといって無駄なシーンは一つもありません。序盤はつい
ていくのが精一杯。タダでさえ横文字の名前は覚えられないのにw
主演といっても良いルーニー・マーラがすごい。{{< wikipedia word="ルーニー・マーラ" text="wikipediaの写真" >}}を見た時、
目を疑いました。これが本当に同じ人間なのかと。以下の記事が分かりや
すいです。
[ルーニー・マーラドラゴンタトゥーの女身長イメージ激変:ロハス美容ブログ](http://lohaslove.ti-da.net/e3922135.html)
あ、R-15指定なので、その点はご注意を。結構グロイシーンがあります。
ビュルマンのキャラ最高ですw
--------------------------------------------------------------------------------
title: "『タイタンの逆襲』は続編ものだったのか.."
date: "2012-12-17"
--------------------------------------------------------------------------------
{{< amazon asin="B005UJSH2Y" title="タイタンの逆襲" >}}
アクションが迫力あってストーリーはほぼなかったので、頭を使わずに見
られました。死ぬほど殴られても大丈夫なのにナイフで刺されると即死亡
とか、細かいことは気にしない方が良いでしょうw
見終わってから『{{< amazon_link asin="B003CN5VYC" title="タイタンの戦い" >}}』の続編だったと知り、ちょっとがっく
り。そのうち借りようっと。
--------------------------------------------------------------------------------
title: "Emacsでカーソルに近接したスペースとタブを削除する"
date: "2012-12-11"
--------------------------------------------------------------------------------
いつもいつもdelete-horizontal-spaceのキーバインドを忘れて、
just-one-spaceを使っているので、メモしておきます。
M-\ (delete-horizontal-space)
カーソルに近接するスペースとタブを全て削除する。
M-Space (just-one-space)
スペース1つを除き、カーソルに近接するスペースとタブを全て削除する。
just-one-spaceは一見使わなさそうですが、"=" や "," の前後とか案外
重宝しますよ。
--------------------------------------------------------------------------------
title: "anything-for-elscreen"
date: "2012-12-11"
--------------------------------------------------------------------------------
昨日か今日のペアプロで教えてもらったのですが、anythingからelscreen
が使えるのですね。ググっても最近の記事が見つからなかったので、ageる
意味で書き留めておきます。
設定はこれだけ。
{{< gist "masutaka" "4258904" >}}
Super-eはOSXデフォルトだとCommand-eです。isearch-yank-killが割り当
てられています。使わないのでこのキーを潰しました。
Command-eするとこんな感じに一覧が出るので、簡単にタブを移動出来ます。
C-z とかより打ちやすいと思います。

helmのこの方法もそのまま使えました。ありがとうございます。
[elscreenのタブをまとめて消す - Life is very short](http://d.hatena.ne.jp/syohex/20121205/1354712761)
そういえば、elscreen-cloneとelscreen-toggleは結構便利ですよね。
前者はC-z Cに、後者はC-z C-aとC-z aに割り当てられていますが、
打ちづらいので私はそれぞれC-z C-lとC-z C-spaceに割り当てました。
```elisp
(define-key elscreen-map (kbd "C-l") 'elscreen-clone)
(define-key elscreen-map (kbd "C-SPC") 'elscreen-toggle)
```
P.S.
helmだと最初からhelm-elscreenが使えたりする?
--------------------------------------------------------------------------------
title: "2012年11月は14回もジムに行けてた #クイックシェイプ"
date: "2012-12-01"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2012年11月の記録
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|11/ 1(木)|121|75|87
|11/ 2(金)|114|67|86
|11/ 3(土)|111|69|94
|11/ 6(火)|114|67|79
|11/ 8(木)|108|66|83
|11/ 9(金)|119|77|91
|11/11(日)|107|65|100
|11/13(火)|117|66|77
|11/14(水)|117|65|90
|11/22(木)|114|67|92
|11/24(土)|118|75|100
|11/25(日)|108|65|85
|11/27(火)|120|77|87
|11/30(金)|112|73|96
※運動前に測定
11月は30日中14回行ったので、2.1日に1回行ったことになります。
ジムの営業日(25日)を考慮すると1.8日に1回です。
振り返ってみて「こんなに行けたんだ..」というのが正直な感想です。
というのも中盤はひどい二日酔いと風邪のコンボを食らって、1週間くらい
ジムに行けなかったからです。
回数は先月{{< post "2012-11-03-1" >}}と大体同じ。表を見ると前半ものすごい勢いで
通ってますね。それでか!
## めちゃめちゃ寒くなった
11月に入ってめちゃめちゃ寒くなりました。汗をかいているのでジム帰り
のチャリが寒すぎです。この冬ジムに通えるのでしょうか。。。とりあえ
ずタオルをもう1枚持って行くことにします。
## ウォーキングマシン(ステアマスター)が壊れてた
風邪から復帰したら、2台あるステアマスターのうち1台が壊れてました。

このマシン、結構人気なんですよね。。。ダメージデカし。
先月から始めた
「ステアマスター5分→サーキット2周→ステアマスター15分」
が出来ない日がありますね。
仕方ないので、そんなときはこっちのメニュー。
「軽くエアボード→サーキット2周→ステアマスター15分」
うーん、もの足りない。バイクはキツすぎだしなあ。
ちなみにエアボードはこんなの。ちゃんと服は着るよ。
{{< figure src="/images/airboard.jpg" link="http://www.quickshape.jp/program/airboard.html" target="_blank" rel="noopener" alt="画像" >}}
## 体重や体脂肪率、骨格筋率をグラフにした
8月に初めて丸々4ヶ月。体脂肪率が全然落ちないのですよ...。体型は明ら
かに良くなっているのですが。
ためしにグラフにしてみました。
{{< figure src="/images/my-weight201212-s.png" link="/images/my-weight201212.png" target="_blank" rel="noopener" alt="画像" >}}
これ見ると体重や基礎代謝が落ちて体脂肪率が増えてるから、脂肪は減ら
ず筋肉が減っていることになりますね。腕とかけっこうムキムキになって
きたのになぜだ。。
週に1,2度の居酒屋が良くないのか、メニューの選択が間違っているのか。
コーチに相談してみようかな?
## まとめ
- めちゃめちゃ寒くなってきたけど、なんとか通えている。
- ステアマスターは早く直って欲しい。
- 体型と反比例して、体脂肪率が増えてる。
--------------------------------------------------------------------------------
title: "Ruby 2.0 & Rails 4.0先取りセミナーに行ってきたメモ #webcat"
date: "2012-11-23"
--------------------------------------------------------------------------------
[Ruby 2.0 & Rails 4.0先取りセミナー : ATND](http://atnd.org/events/33996)
Rubyの勉強会に来たのは今回が初めて(Ruby Kaigi{{< post "2011-07-21-1" >}}はお祭り
ですからね)。
Ruby2.0もRails4.0もほぼ知識ゼロで来ました。Ruby2.0は前日rbenvでイン
ストールしましたけど。
## {{< twitter "a_matsuda" >}} さんの「Ruby 2.0 & Rails 4.0を先取りしよう」
{{< speakerdeck "1dbdcc8016220130deb212313d02fc9b" >}}
本当に重たい変更は1.9で済ませたそうなので、2.0への移行はすぐ出来る
とのこと。実際互換性も問題ないらしい。あと、requireが高速化されたの
で、[Railsとかのライブラリたくさん読み込むプロジェクトが2.5倍とか速
くなるらしい。](http://subtech.g.hatena.ne.jp/secondlife/20121122/1353585959)
Rails4.0もRuby1.8を捨てた影響で速くなるとのこと。こちらも互換性は問
題ないそう。
## {{< twitter "kentaro" >}} さんの「Rails4でアプリを作ってみた話」
{{< speakerdeck "e107e170161f0130009522000a1e9b2a" >}}
で、こちらが開発中のRails4.0でアプリを作ったお話。Rails初めて使った
のに開発版でやっちゃうんですか。。いろいろハマったのは開発版だった
から。リリースされたらそんなことないとのこと。
[Rails4 in Action - delirious thoughts](http://blog.kentarok.org/entry/2012/11/22/005844)
--------------------------------------------------------------------------------
title: "EmacsでMarkdownのプレビューをお手軽に確認する方法はこれかな?"
date: "2012-11-23"
--------------------------------------------------------------------------------
最近、業務のリポジトリがGithubに移行したので、Markdownをよく書いて
ます。(Github使うと、目に見えてソフトウェアの品質が上がりますね!)
Markdownのレンダリング結果を確認するために、Githubのwikiに貼り付け
てプレビューとかやってましたが、バカらしくなったのでローカルで確認
出来る方法を探しました。
## 方法1: markdown-mode.elを使う
賢明な皆さんはEmacs24をお使いだと思うので、M-x list-packagesから
markdown-mode.elをインストールし、以下を~/.emacs.d/init.elに追加し
ます。
```elisp
(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
```
README.mdとかがmarkdown-modeで開くようになります。
C-c C-c pでプレビューがブラウザに表示されます。markdownコマンドがな
いと怒られたら、brewとかでインストールして下さい。
```
% brew install markdown
```
## 方法2: node.jsのツール、markupを使う
[markdown のリアルタイムレンダリングツール markup をリリースしました - Block Rockin’ Codes](http://d.hatena.ne.jp/Jxck/20120825/1345887758)
こんなツールを作った方がいらっしゃいました。ありがたや〜
node.jsはbrewとかでインストールしておきます。
```
% brew install node
```
適当なディレクトリにmarkupをインストールします。私は~/local/shareに
インストールし、~/local/binにmarkupのシンボリックリンクを置きました。
```
% cd ~/local/share
% npm install markup
% cd ~/local/bin
% ln -s ../share/node_modules/.bin/markup
```
markupコマンドで編集するMarkdownファイルを捕捉します。
```
% markup README.md 3000
```
README.mdを保存するたびに、http://localhost:3000の結果が書き換わり
ます。
GithubのAPI制限は5000回/時みたいです。
## まとめ
ちょっと編集する時はmarkdown-mode.el、それなりの量を編集する時は
markupが良さそうです。
P.S.
こんな方法もありました。
[タムタムの日記 - RealtimeViewerを作ったらREADMEを書くのがとても捗る件について](http://mt.orz.at/archives/2012/11/realtimeviewerr.html)
[Emacs + MozRepl + Github Markdown APIを使った Markdown Viewer - Life is very short](http://d.hatena.ne.jp/syohex/20121122/1353598333)
--------------------------------------------------------------------------------
title: "OSXのGNU Screenは~/.zprofileを読み込まない?"
date: "2012-11-19"
--------------------------------------------------------------------------------
[tmuxのすすめ|catatsuyのBlog](http://blog.catatsuy.org/a/243)
これを参考にtmuxを試していたら、なんかPATHがおかしい。調べてみたら、
むしろGNU Screenの方がおかしくて、~/.zprofileが読み込まれていないこ
とが分かった。
私の~/.zprofileは以下のとおり。
```
#
# /etc/zprofile and ~/.zprofile are run for login shells
#
# all bourne shells should source /etc/profile
source /etc/profile
```
/etc/profileは以下のとおり。
```
# System-wide .profile for sh(1)
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
```
結果的に以下が原因で、PATHとMANPATHが異なっていた。
GNU Screen -> eval `/usr/libexec/path_helper -s` が実行されない
tmux -> eval `/usr/libexec/path_helper -s` が実行される。
{{< post "2007-01-22-1" >}} 見ると、GNU Screenの挙動が変だよなあ。。。
環境:
OSX 10.8.2 Mountain LION
zsh 4.3.11 (i386-apple-darwin12.0) # OSX付属
Screen version 4.00.03 (FAU) 23-Oct-06 # OSX付属
ひとまず~/.zprofileを空っぽにして対応。OSXで新規ユーザを作ってもそ
れ系のファイルは作られなかったので、Debianの名残なんでしょう。
**追記(2012-11-20):**
今回も {{< twitter "cvmat" >}} さんからアドバイス頂きました。
{{< tweet user="masutaka" id="270811664381800449" >}}
--------------------------------------------------------------------------------
title: "『ショーシャンクの空に』はジワジワ来る映画だった"
date: "2012-11-06"
--------------------------------------------------------------------------------
{{< amazon asin="B0001CSB76" title="ショーシャンクの空に" >}}
前半救いもない感じだったけど、後半ジワジワきましたね〜
なんで観ることにしたか忘れましたが、悪くない映画でした。
**追記(2013-01-26):**
これで知ったっぽい。
[期待せずにレンタルしたら意外にも面白かった映画:ツンダオワタ情報](http://tundaowata.com/archives/1769657.html)
--------------------------------------------------------------------------------
title: "2012年10月は15回ジムに行きました #クイックシェイプ"
date: "2012-11-03"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2012年10月の記録
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|10/ 2(火)|119|73|84
|10/ 5(金)|116|69|85
|10/ 6(土)|115|73|91
|10/ 7(日)|115|78|92
|10/ 9(火)|106|73|92
|10/11(木)|110|77|86
|10/12(金)|123|73|84
|10/13(土)|127|74|92
|10/16(火)|119|70|82
|10/17(水)|121|72|89
|10/20(土)|117|68|96
|10/21(日)|120|73|86
|10/23(火)|129|77|89
|10/25(木)|120|77|96
|10/30(火)|117|70|76
※運動前に測定
10月は31日中15回行ったので、2.1日に1回行ったことになります。
ジムの営業日(25日)を考慮すると1.7日に1回です。
中盤はかなりのハイペースで通ってましたが、後半失速しましたね。
職場の同僚の結婚式で京都に行ってたのと、怠け心が出てしまったのが
原因です。ジム行かずに飲んでたw
8月11回、9月14回、10月15回と回数は上がっているので、まあ良しとします。
## メニューを変えた
メニューをちょっと変えました。なんでかと言うと、8月から体重やら体脂
肪率やらが全く変わらなかったからです。むしろ増え(ry
今までは
「サーキット2周→エアボードでメニューを1周」
でした。
コーチのアドバイスに従い、有酸素運動を増やすことにしました。
前半は新規会員向けに頂いた[ぶるぶるマシン](http://www.quickshape.jp/program/buruburu.html)のチケットがあったので、
「ぶるぶるマシン10分→サーキット2周→ウォーキングマシン(名前忘れた..)15分」
をやりました。
ぶるぶるマシンはこんなのw
{{< figure src="/images/quickshape-buruburu.gif" link="http://www.quickshape.jp/program/buruburu.html" target="_blank" rel="noopener" alt="画像" >}}
チケットがなくなってからは
「ウォーキングマシン5分→サーキット2周→ウォーキングマシン15分」
にしました。
それが功を奏したのか汗が尋常じゃない量になりました(ウォーミングアッ
プしなくてもすごいんですが..)。この季節なのに余裕でタオル絞れます!
今日体重測ったら、一番ひどかった2週間前から3kgくらい、体脂肪率も4%
くらい減ってました。(私の場合ここからが落ちないんだけどorz)
## 食事も変えた
ジム行く日の食事も変えました。
前は「おにぎり1コ食べる→ジム行く→コンビニで軽そうな食事を買う」
にしてたんですが、気がつくとボリュームのあるものを買ってました。
一度コーチのアドバイスに従って、夕飯を早めに済ませてジムに行ってみ
たものの、どうも体が重くて調子が悪い。(食い過ぎ?)
仕方がないのでここ最近は「おにぎり1コ食べる→ジム行く→ささみの燻
製を食べる」に変えました。
{{< amazon asin="B00284PPTW" title="鶏 ささみ 燻製 ( 手作り 鶏肉 スモーク )" >}}
腹持ちは良いのですがお値段も良いので、なくなったらどうしようかなあ
と悩んでいるところです。
## まとめ
- 寒くなってきたけど、ペースは落ちることなく通えている。
- 有酸素運動増やしたら良い感じ。
- 食事は継続検討しよう。
--------------------------------------------------------------------------------
title: "『蒸気でホットアイマスク』が高いと思う人には『あずきのチカラ』がオススメ"
date: "2012-10-31"
--------------------------------------------------------------------------------
[1分の仮眠でも効果があった!現役医師が教える「1分仮眠法」|Act as Professional](https://hiroki.jp/2012/09/24/5979/)
ここで『あずきのチカラ(以下あずき)』を見た時は、『蒸気でホットアイ
マスク(以下アイマスク)』のパチモンかと思いましたよ(笑)。
{{< amazon "B001OGJVAO" >}}{{< amazon "B0012R23UK" >}}
でも700円で繰り返し(約200回)使えるという話なので、さっそく試してみ
ました。結論から言うと、アイマスクより安っぽくはありますが買いです。
あずきは電子レンジで温めて使います。600Wだったら30秒です。アイマス
クはじわじわ温まりますが、あずきは最初から温まっています。時間も5分
と、アイマスクよりやや短いと思います。
なんで買いかというと、やっぱり安いからなんですよね。
アイマスクは無香料でも1枚80円くらいなので、あまり毎日使おうと思いま
せん。あずきは1回あたり3円なので、毎日はおろか1日何度でも使えます
(4時間の間隔を開ける必要はあります)。最近は寝る前と起きた時にあずき
を使ってます。
ところでアイマスクって、今は5種類も香りがあるのですね!あずきは別
の香りは絶対増えないので羨ましい!(笑)
{{< amazon "B002RUMT9Q" >}}{{< amazon "B002RUL0BO" >}}{{< amazon "B005MJ3HNQ" >}}
{{< amazon "B006LU4P68" >}}{{< amazon "B0096HXX34" >}}
**追記(2013-04-21):**
ホットアイマスクの発売って、6年も前だったのね。{{< post "2007-09-21-1" >}}
--------------------------------------------------------------------------------
title: "『リーダブルコード』を読むことはプログラマとしてのたしなみ"
date: "2012-10-31"
--------------------------------------------------------------------------------
{{< amazon "4873115655" >}}
なんだかんだ言ってこの業界、読めるよりも動くコードが重視されて来た
と感じています。
動くだけで読むのが苦痛なコードって、ちゃんと読めるコードにするまで
の時間を、これから読む人や修正する人に預けているだけなんですよね。
書く回数より読む回数の方が圧倒的に多いのです。そしてそれは、ビジネ
ススピードに直接繋がります。
私は今まで、読めるコードになるように丁寧に書いて来たつもりです。で
も「ここまで丁寧に書くのは自己満足なのでは?」と思うことはよくあり
ましたし、コードレビューの時も指針となるものがありませんでした。
本書を読んで「ああ、ここまで書いて良いのね」とある意味救われました
し、いくつかの間違いにも気づきました。コードレビューの時も自信が持
てそうです(笑)。
プログラマ初心者は先輩のクソコードに染まる前に読むべきだし、日々良
いコードを書こうと奮闘しているプログラマも読むべきでしょう。チーム
で読書会など開くのも良いと思います。
本書自体「リーダブル」な文章で書かれていますが、230ページと手頃なペー
ジ数も「リーダブル」です。
--------------------------------------------------------------------------------
title: "Mountain LionでのEmacsの安定度ハンパないっす!"
date: "2012-10-06"
--------------------------------------------------------------------------------
Lionではほぼ毎日Emacsが落ちてましたが、Mountain Lionにしてからは
一度も落ちていません。やっぱり、OSXのバグだったんですね。。。
OSXでのEmacs最新版のdmgは[GNU Emacs For Mac OS X](http://emacsformacosx.com/)からダウンロード
出来ます。
--------------------------------------------------------------------------------
title: "Emacsでお手軽にプレゼンできるorg-tree-slideはかなり良い感じ!"
date: "2012-10-06"
--------------------------------------------------------------------------------
過去に[Gody](http://www.mew.org/~kazu/proj/goby/ja/goby.html)は挫折しましたが、org-tree-slideはお手軽に使えて良い感じ
です。org-modeは必要性がなくて使っていませんでしたが、軽くプレゼン
資料作るためだけに使うのは大いにアリです。
org-modeはEmacsにデフォルトで入っているので、org-tree-slideを
GitHubから入手して、、
> % git clone git://github.com/takaxp/org-tree-slide.git
Emacsに以下の設定をするだけです。F5でプレゼンが始まります。
```elisp
(require 'org-tree-slide)
(setq org-tree-slide-heading-emphasis t)
(define-key global-map (kbd "") 'org-tree-slide-mode)
```
文字サイズを大きくしたいとかは、以下のオフィシャルサイトを参考に
して下さい。
[emacs:org-tree-slide - PastelWiki](http://pastelwill.jp/wiki/doku.php?id=emacs:org-tree-slide)
requireでエラーが出る方(load-pathが分からない方)はあらかじめ
{{< post "2009-07-05-3" >}}の設定をすると良いでしょう。
P.S.
OSXでorgファイルをpdfにする方法、誰か教えて。。
**追記(2012-10-07):**
{{< twitter "cvmat" >}} さんからアドバイス頂きました。
{{< tweet user="masutaka" id="254905065003962368" >}}
--------------------------------------------------------------------------------
title: "2012年9月は14回ジムに行きました #クイックシェイプ"
date: "2012-10-03"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|9/ 1(土)|125|74|86
|9/ 2(日)|107|66|94
|9/ 5(水)|127|70|78
|9/ 8(土)|120|75|95
|9/11(火)|111|68|-
|9/13(木)|114|74|97
|9/14(金)|128|81|90
|9/16(日)|111|69|91
|9/18(火)|119|75|87
|9/19(水)|112|69|75
|9/22(土)|113|75|98
|9/25(火)|108|72|97
|9/28(金)|124|80|86
|9/29(土)|127|73|85
※運動前に測定
9月は30日中14回行ったので、2.1日に1回行ったことになります。
ジムの営業日(25日)を考慮すると1.8日に1回です。
こんなに行ったかなあというのが正直な感想です。体力的にはまだまだ行
けますが、武蔵新城の時より家からジムが遠いのが心理的にマイナスに働
いています。
これから着込むので会社から直接ジムに行くのやめて、家から行くことに
しようかなあ。悩む。
--------------------------------------------------------------------------------
title: "映画『どろろ』は普通に楽しめた"
date: "2012-09-30"
--------------------------------------------------------------------------------
{{< amazon "B000PMGN18" >}}
2007年の映画だったんですね。普通に楽しめました。ゲーム版
{{< post "2011-02-11-5" >}} と似た退廃的で貧しい雰囲気がよく出ていたと思います。
{{< wikipedia word="どろろ_(映画)" text="Wikipediaによると" >}}ロケはニュージーランドで行われたとのこと。その点
意外でした。
柴咲コウのどろろは私は好きだなあ。魔神もゲーム版と似ていて違和感を
感じませんでした。唯一、ウルトラ怪獣みたいな魔神には、ん?と思いま
したがw
{{< youtube "Usu7cnfyjJI" >}}
--------------------------------------------------------------------------------
title: "2012年8月は11回ジムに行きました #クイックシェイプ"
date: "2012-09-21"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
## 2012年8月の記録
9月ももう終わりに近づいてきましたが、先月分の記録です。
7月終わりに入会したので{{< post "2012-07-29-1" >}}、7月の分も書きました。
|日付|最高血圧|最低血圧|脈拍
|---|---:|---:|---:
|7/31(火)|120|64|93
|8/ 2(木)|126|79|-
|8/ 3(金)|124|76|-
|8/ 5(日)|116|72|90
|8/ 8(水)|114|73|83
|8/ 9(木)|125|87|89
|8/10(金)|126|75|88
|8/21(火)|134|89|90
|8/23(木)|118|76|83
|8/26(日)|121|74|83
|8/28(火)|104|73|90
|8/31(金)|115|71|80
※運動前に測定
31日中11回行ったので、2.8日に1回行ったことになります。
8月はジムの盆休みがあり、いつもより営業日は少なく23日でした。
それを考慮すると2.1日に1回です。
2年前はジムが休みの日以外は毎日通っていました。それを考えると全然頻
度が足らないので、もっと頑張っていきたいですね。
## どうすれば継続出来るか?
継続のポイントは「習慣づけ」と「楽しむこと」です。
習慣は何も考えずに通っていれば自然と付きます。思考停止することが一
番大事です。「今日は雨が降っているから止めよう」だとか「今週は通い
すぎだから止めよう」などと思わず、毎日毎日通うことです。
楽しむためには、自分に合った方法を見つけることです。私の場合は[クイッ
クシェイプ](http://www.quickshape.jp/)でした。Wii Fit{{< post "2008-12-07-2" >}}やスロトレ{{< post "2009-07-10-3" >}}は
すぐ飽きたので続きませんでした。
「ジムに行くことは楽しい」と自分に暗示をかけることも大事です。実は
ジムに行く前のおにぎりが一番の楽しみです(笑)。おにぎりはおいしいし、
消化が良くすぐエネルギーになるため太りづらいなどと、良いことずくめ
です。空きっ腹だと力出ませんからね。オススメ☆
--------------------------------------------------------------------------------
title: "EmacsからMacの辞書をお手軽に使う"
date: "2012-09-17"
--------------------------------------------------------------------------------
この記事の最近の状況。
{{< post "2011-05-18-1" >}} Emacs で Mac の辞書を sdic っぽく使う
どうも最近、commandline-dictionary-appの呼び出しに時間がかかります。
あと、Mountain LIONにバージョンアップしてから、
commandline-dictionary-appがこんな警告を吐くようになりました。検索
は出来ますけどね。
```
dict(6389,0x7fff7c6d6180) malloc: reference count underflow for 0x4001a1660, break on auto_refcount_underflow_error to debug.
```
そんなわけでEmacsでコピーしてMacの辞書に貼り付けて調べるという、
非生産的なことをしていました...。
{{< twitter "elim" >}} によると dict:// に渡せばブラウザからMacの辞書を呼び出せるし、
browse-url()使えばEmacsからも呼び出せるとのこと。
→[dotemacs/init-dictionary.el at master · elim/dotemacs](https://github.com/elim/dotemacs/blob/master/init-dictionary.el)
個人的にはwordがいきなり辞書に渡されるより、ミニバッファでワンクッ
ション置きたかったので、[前回のコード](https://gist.github.com/1270473)を改良してみました。
{{< gist "masutaka" "3733250" >}}
M-x my-dictionaryすると、カーソル下の単語がミニバッファに表示されま
す。ReturnするとMacの辞書にフォーカスを移しつつ検索します。C-uを付
けるとsdicで検索します。C-uC-uを付けるとcommandline-dictionary-app
で検索します。
なかなか良い感じ☆
P.S.
sdicインストールしてない人はsdic-read-from-minibuffer()を
read-from-minibuffer()に置き換えれば良いです。
--------------------------------------------------------------------------------
title: "simplenoteやめました!"
date: "2012-09-09"
--------------------------------------------------------------------------------
今日から[simplenote](https://simple-note.appspot.com/)を使うのを止めて、Mountain Lionから追加された標準
アプリ「メモ」に乗り換えました。

## なぜ乗り換えたのか?
simplenoteはWeb、[iPhone](http://itunes.apple.com/jp/app/simplenote/id289429962?mt=8)、[Emacs](https://github.com/cefstat/simplenote.el)から編集できて便利なのですが、どうも
最近調子がよくありません。Web版は以前よりログインに時間がかかる気が
しますし、時々同じファイルがいくつも出来ることがあります。
そんなわけで乗り換え先を探していたところ、Mountain LionからiPhoneの
メモが同期出来ることを知りました。
[メモ: iPhone/iPad とメモを同期できるMac標準アプリが登場【Mountain Lion】 - iPhoneアプリのAppBank](http://www.appbank.net/2012/07/26/iphone-news/448317.php)
iPhone4を手に入れた頃はこのメモアプリを使っていたのですが、最大の短
所はiPhoneでしか編集出来ないこと。それが今回改善されたわけです。
## 悪くなったことはないの?
Emacsからは編集できなくなりました。でもコピペすれば良いだけなのであ
まり困っていません。
## まとめ
simplenoteからAppleの「メモ」に乗り換えました。
居心地の良い監獄は最高です。
--------------------------------------------------------------------------------
title: "このブログがインターネット上から消えていました"
date: "2012-09-07"
--------------------------------------------------------------------------------
http://dlvr.it/ からの通知で気づいたのですが、このブログが1日半ほど
インターネット上から消えていました。
OSXをMountain Lionにバージョンアップしたら、Perlのバージョンが上が
り、HTML::Templateがなくなったことが原因でした。
CPANからインストールして解決しました。
[cpanの使い方の整理 « taichino.com](http://taichino.com/programming/perl-programming/594)
このブログはChangeLogメモという1つのテキストファイルから、[chalow](http://chalow.org/)と
いう変換ツールを使いhtmlに変換しています。
この作業を自動化した自作のmkchalowスクリプトの作りが甘かった。。自
分しか使わないツールと言えども、エラー処理はちゃんとした方が良いで
すね。ブログが生きているかのチェックも。
ちなみにChangeLogメモを始めたのはこの記事がきっかけです。
{{< post "2001-12-30-1" >}}から書き続けていて、23,000行になりました。
[横着プログラミング 第1回: Unixのメモ技術](http://0xcc.net/unimag/1/)
最近はEvernoteに全部まとめる人が多いみたいですが、技術者だったら絶
対ChangeLogメモの方が良いですよ。手に馴染んだエディタが使えるし、整
理する必要がないので。
ただchalowを使うかは微妙なところかも。やはり全てを自分が面倒見るの
で、時間がないとなかなかメンテしきれません。ChangeLogをWordpressと
かTumblrにインポート出来れば良いのですが。それも時間が..w
--------------------------------------------------------------------------------
title: "Agile渋谷Emacs勉強会に参加してきた #Agile渋谷"
date: "2012-08-26"
--------------------------------------------------------------------------------
7月に東京に引っ越してきて、早3回目の勉強会。
そろそろ何もない週末が欲しい...w
さて、そうは言っても東京で何年ぶりかに開催されたEmacsのイベント。
{{< twitter "mori_dev" >}} さんはじめ、お初にお目にかかれた方が何人もいて、楽しい時
間を過ごせました。
最近は勉強会ではなるべくメモを取らずに、イベントを楽しむようにして
いるので、思い出したまま書いていきます。
個人的に一番面白かったのは、{{< twitter "inoue_ariel" >}} さんの「[Emacsのバッファの
内部実装について](http://dev.worksap.co.jp/Members/inoue_se/archives/21)」。Emacsと言えばギャップバッファ、ギャップバッファ
と言えばEmacsというのはもちろん、ギャップバッファという名前自体初め
て聞きました。しかし、memcopy()のコストがあれほど低いのにはビックリ
です。最近のCPUはキャッシュの容量が増えてるのが要因なんでしょうか。
でもギャップバッファって昔から使っているのですよねえ。。
Emacsのソースコードは {{< post "2010-06-19-2" >}} で、その変態性を認識したことが
ありますが、この時の記事も井上さんじゃないですか!(やべっ!深夜に鳥
肌立った!)2010年当時は組み込み業界で働いていたこともあり、アリエル
も、アリエルの井上さんも存じ上げなかったのですが、自分の中で今繋が
りました。
(衝撃的すぎて、何も思い出せなくなってしまった。。)
さて、私もLTやりました。
{{< slideshare "hGx9WjxdFp2CiS" >}}
内容はegg.elとgit-dwin.elの紹介です。自分のまわりで、コマンドライン
からgitを使っている人が意外に多いので、発表することになりました。
頑張ってEmacsで全部やる必要はないけど、結構簡単に楽できるから、まあ
ゆるく使おうよ。そんな内容です。
当日の夕方近くに急にやることが決まったので資料をちゃちゃっと作り、
まあ5分なんて余裕でしょ。なんて思っていたら大失敗w 発表用の画面操作
に手間取るわ、実演用のEmacsはミニバッファが見えないわ、時間は足りな
いわでさんざんでした。さらには腹が減りすぎて、手がぷるぷる震える始
末。よく考えたらLTやるのは初めてでした。次回に生かしたいと思います。。。
--------------------------------------------------------------------------------
title: "Gmail に来た全てのメールをスパム判定しないフィルタリングルール"
date: "2012-08-06"
--------------------------------------------------------------------------------
「条件」に from:(@) を指定し、「処理」に「迷惑メールにしない」を
指定するだけ。

From がないメールは条件に一致しませんが、さすがに無視できる数でしょう。
Gmail の転送機能って、転送する前にスパム判定するのですよね。
Gmail から Gmail に転送していると、二重にスパム判定することになり、
たまに誤判定されるので設定しています。
**追記(2012-11-10):**
from:(.*) はダメでした。実際に検索して、全てのスレッドが引っかかる
か試せば分かることでしたね。。検索条件を from:(@) に変えました。
これなら大丈夫なはず。
**追記(2013-03-28):**
http://ziddy.japan.zdnet.com/qa8009043.html で引用されていたので追
記。from:(@) でもダメなことがありました。半年で4件程度。完璧な方法
はないのかしら。。
--------------------------------------------------------------------------------
title: "LL Decade は元組み込みプログラマーでも楽しめるイベントだった #lldecade"
date: "2012-08-06"
--------------------------------------------------------------------------------
[この記事](http://gihyo.jp/dev/serial/01/lldecade/0001)で開催を知った [LL Decade](http://ll.jus.or.jp/2012/)。LL はおろか、Decade の単語の意味
も知らなかった元組み込みプログラマー、現 Web プログラマーですが、予
想以上に楽しめるイベントでした。
しかし暑かった。予定どおり汗だくで会場に到着。今回は机がなかったの
で MacBookAir は使わず、iPhone に軽くメモりながら純粋に楽しむことに
専念。
基調講演で初めて {{< twitter "miyagawa" >}} 氏を拝見。手錠をはめられてプログラミン
グ..の下りが印象に残りました。PHP は知れば知るほど変態言語で、第一
印象よりかなり好きになりましたが、私も手錠をはめられている感じはす
るのですよね...。
意外だったのは今まで Python に全く関わらずに生きてきたのに、
Language Update Decadev で話を聞いて、やってみようかなと思ったこと。
LL イベントは各言語をつまみ食い出来るので、組み込みなど別な分野の人
が参加しても楽しめますね。今回はまつもとさんの mruby の話も熱かった
ですし。
先週の Jenkins ユーザ・カンファレンスの熱が残っているのか、CI の話
もセッションまるまる使われていました。まあでも CI は各言語やフレー
ムワークに共通する内容は薄いので、CakePHP2 と Jenkins みたいにドン
ピシャの話が聞きたいですね。それは個々の勉強会でやることか。。あ、
もちろん各トークは面白かったです。 {{< twitter "yamashiro" >}} さんの話は特に。
JsTestDriver いいかもと思ったけど、複数サーバが必要なのは残念でした。
Javascript が機械語という解釈は今回一番面白かった。すなわち永遠に生
き続ける。確かに各ブラウザ対応を考えると素で書くのはしんどい。アセ
ンブラに対する C みたいに、今後はもっとしっくりと上に乗っかるとうれ
しいですね。> jQuery, JSX, CoffeeScript
--------------------------------------------------------------------------------
title: "@nifty がパスワードを平文で保存していることが分かり、大変残念に思っている件"
date: "2012-07-31"
--------------------------------------------------------------------------------
先週フィリピンから帰ってきて、ようやく自宅のインターネット回線の契
約に着手することが出来ました。
神戸にいたときは会社の回線を使っており、この1年は自分のアカウント
を「@nifty基本料金(旧お手軽1コース)」にして休眠状態にしてました。
(月額262円。メールアドレスがまだ必要だったので。)
ネットで申し込んでも良かったのですが、ぶっちゃけ分かりづらいので電
話で契約完了。本日「契約内容のご案内」の封書が届きました。
よしよし、@nifty の ID は今までのやつだね。あれ?ログインパスワード
に見覚えのある文字列が。。これ、いつも使っているオレのパスワードやん!
**@nifty さんはパスワードを平文で保存していらっしゃるようです...。**
思えば十数年前、初めて買ったパソコンが FMV-5100C3 だった流れで始め
た NIFTY-Serve。その後 33600bps の高速モデムを手に入れ、Infoweb に
移行。気がついたら合併して、また nifty にカムバック。
私のネット生活はある意味 nifty さんとともにあったわけですが、今回の
件が分かってしまい大変残念です。今まで特に不具合もなく、快適に使っ
ていただけに..。
会社の回線は神戸の時も nifty でしたし、東京に移転しても nifty。おま
けに先週、実家の回線も nifty を新規に申し込んだばかりでした。二重に
も三重にも残念な出来事でした。はぁ。
--------------------------------------------------------------------------------
title: "クイックシェイプに再入会しました! #クイックシェイプ"
date: "2012-07-29"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
今月からオフィスが神戸から東京に移転した関係で、私自身も関東に戻っ
て参りました。
そのオフィスのすぐ近くに、ホントに偶然[クイックシェイプ](http://www.quickshape.jp/)があったので、
念願の再入会を果たすことが出来ました。本当にうれしい。
6/4 にアパートの内覧で初めて下高井戸に降り立った時、早く始めたい気
分でいっぱいでしたが、引っ越し後すぐのフィリピン出張も終わったし、
引っ越しのもろもろの雑用も片付いてきたので、ようやく始められます。
去年の4月に神戸に引っ越す関係で退会したので、1年3ヶ月ぶりの復帰
となります。
## さっそく一周
今日が初日というか初めて下高井戸店に来たので、まずは体験で一周。店
内には聞き覚えのある音楽、モニターには見覚えのあるコーチの方々。
そのあと軽く説明を受け、即入会しました。
{{< tweet user="masutaka" id="229158392760000512" >}}
現金は本当にたまたま持っていたんですが、銀行印はもちろんこのために
持って来てましたw コーチも準備の良さに驚いていましたw
## 支払い方法がちょっと変わってた
多分ですが、支払いの方法が以前とちょっと変わっていました。
ベーシック会員 … 月々6,300円、入会時に2ヶ月分を前払い。
スタンダード会員 … 月々5,250円、入会時に6ヶ月分を前払い。
バリュー会員 … 月々4,812円、入会時に12ヶ月分を前払い。
とりあえずスタンダード会員になりました。一括払い期間が終わったあと
(つまり半年後)、希望すれば他のコースに変更することも出来るとのこと。
その他、入会時の事務手数料が2,100円。キャンペーン中とのことで入会金
はなしでした(前もそうだったような..)。
入会手続き後、もう一周して帰路につきました。
## 武蔵新城店と下高井戸店の違い
下高井戸店は武蔵新城店よりやや狭く、一周は 11 分とのこと(武蔵新城店
は 15 分だったかな)。サンドバックがなく、エアボードの数も少ないです。
まあでも手軽に出来るのは最大の魅力なので、最初は何も考えず毎日行く
予定です。習慣化のためには、思考停止して毎日やるのが一番ですからね。
とか言いつつ、今日は [Jenkins ユーザカンファレンス](http://connpass.com/event/467/)、明日は下高井戸店
はお休みなので、初日は火曜日になります...。
--------------------------------------------------------------------------------
title: "引っ越しの一括見積もりサービスを使ったら大変なことになった"
date: "2012-07-03"
--------------------------------------------------------------------------------
日通さんに普通に見積もりに来てもらうことになった後、他も確認してみ
るか〜と、一括見積もりサービスを使ってみた。
[引越し費用比較は「引越料金.jp」一括見積もりで格安相場が分かる!](http://www.hikkoshi-ryoukin.jp/)
数秒後10通くらいメールが来て、やや引き。
1分後最初の引っ越し屋さんから営業電話。さすが早いなあと感心しなが
ら電話を取る。聞いたことないとこだったけど、見積もりに来てもらうこ
とに。
そして5分後..
電話がひっきりなしにかかってきてドン引き。。
{{< tweet user="masutaka" id="220043967922843649" >}}
{{< tweet user="masutaka" id="220045526475874304" >}}
{{< tweet user="masutaka" id="220053168892018688" >}}
1時間半経った今、全部で20件着信がありました。
途中から出るのを止めたんですが、営業電話なのか、見積もりに来る人か
らの電話なのかが分からないのですよね。仕方がないのでもう業者は決まっ
たことにしてお断りしてました。
退屈な日常が一気にスリリングになります。皆さんも是非使ってみて下さ
いね(ハート)
[深夜の対応もバッチリみたいです。](https://twitter.com/cakephper/status/220049175222550528)
--------------------------------------------------------------------------------
title: "「以後気をつけます。」"
date: "2012-06-29"
--------------------------------------------------------------------------------
前職のころから気になっていました。「以後気をつけます。」
このフレーズ、私は使った記憶がありません。いや、使ったことはあるか
もしれませんが、よほどのことがない限り使わないです。なんでかと言う
と「以後気をつける」ことって、めちゃめちゃ大変だからです。
例えば今日何かミスをして「以後気をつけます」と言ったとします。
あなたは「以後気をつける」ことを 1 つ抱えます。
3日後に別件でミスをして、また「以後気をつけます」と言ったとします。
あなたの「以後気をつける」ことが 2 つになりました。
一週間後に..(略)
このまま続くと「以後気をつける」ことが溜まりすぎて、本来やるべきこ
とに集中できません。ギブアップです。まあ実際は「以後気をつける」の
は忘却の彼方に行くのでしょう。
重要なのは「以後気をつける」必要がないような仕組みを作ることです。
もちろん頻度が少なければ、作らないのもアリです。その都度、自分のア
タマで考えないといけませんね。
--------------------------------------------------------------------------------
title: "受託開発から自サービス開発に移って気づいたことメモ"
date: "2012-06-29"
--------------------------------------------------------------------------------
{{< post "2011-04-22-1" >}} に受託開発から自サービス開発に移って、1年ちょっと過
ぎました。今さらながら気づいたことがあったので、ちょっとメモ。
受託開発は契約が無事決まるとやるべき作業や予算が決まる。どのくらい
開発リソースを使えるかが分かるので、その範囲内で新規実装やメンテナ
ンスなどをする。基本的には他の案件は発生しないが、この案件は○○に
含まれるよねなどと、契約の範囲内で対応を要望されることはよくある。
プロジェクト開始時の要件定義が重要。どちらかと言うとウォーターフォー
ル型開発と相性が良い。
自サービス開発はやるべき作業が決まっても、どこからも予算(お金)は降
りてこない。昨日決まったことが今日覆ったり、なくなったり、全然違う
急ぎの作業を要望されることは日常茶飯事。サービスをリリースしないと
売り上げが分からないので、極力小規模で開発することが重要。受託開発
と同様、中長期的なスケジュールは立てる必要はあるが、状況は刻々と変
わるため、よりこまめな更新が必要。アジャイル開発と相性が良いという
か、それしか選択肢がない。
※ 受託開発の時はそこそこの規模の会社(300人くらい)で、自サービス開
発は零細企業(開発者数人)なので、その辺の違いもあります。
--------------------------------------------------------------------------------
title: "プログラムは仕様通りに動いて当たり前"
date: "2012-06-22"
--------------------------------------------------------------------------------
去年の {{< post "2011-04-22-1" >}} に組み込み系&受託のお仕事から、Web 系&自サー
ビス提供のお仕事に転職し改めて思ったので書き留めておきます。特定の
個人を批判する記事ではないのであしからず..。
何かサービスを作るときに、中身がぐちゃぐちゃでも動くプログラムに価
値があることには全く同意します。私は0を1にするのは得意ではないの
で、むしろ尊敬します。しかしそこで終わってしまってはそのサービスの
将来は暗いでしょう。
## メンテナンス性の高いコードに!
サービスが安定稼働し始めたら、メンテナンス性の良いコードに変更して
いく必要がありますし、新しく追加する機能も同じです。
※ もっとも、緊急時は最小限の工数でできる変更を採用すべきですが、
あとで**絶対に**適切な修正に改めなければいけません。
その新しく追加する機能なんですが、私は実装して開発環境で意図通りに
動いた時がスタートラインだと思っています。
## ちゃんと動いた時がスタートライン
そこからバグや重複、むだなコード、むだなコメントを減らし、いかにメ
ンテナンス性の良いコードにするか、集中して作り込みます。もちろんテ
ストも書きます。
私はここがプログラマの腕の見せ所だと思ってますし、細かいこだわりを
入れられたり、より良いやり方で作り込めると、何度も何度もコードを読
み直してニヤニヤしてしまいます。
**プログラムは仕様通りに動いて当たり前**なので、プログラマとしてはメン
テナス性の良さだとか、パフォーマンスだとかの付加価値を付けることが
重要です。しょうもないバグは論外です。
もうひとつ大事なのが、コミットにストーリー性を持たせることです。
## コミットにストーリー性を持たせる
私は最低でもインストール前に5回は変更を見直して、「本当にこの変更
で良いのかな」「このコミットは2つに分けた方が良いな」とか「これと
これは同じコミットだろう」とかやってます。Git だとこれが容易なので、
とっても便利です。最終的には20回くらい見直していると思います。
※ 平時はこのくらいやる習慣を付けることが重要です。ろくに確認しない
ことを習慣化してはいけません。
インストール後は(当たり前ですが)、インストールした環境で正常に動作
するかをチェックします。
まあ、{{< tag "Jenkins" >}} で CI(継続的インテグレーション) やっているので、単体
レベルでの動作はあまり気にしなくて良いのは助かります。
## まとめ
仕様通りに動くようにプログラムを作るのは、プログラマとして当然です。
コードに付加価値を付けることが、自分への付加価値に繋がると信じてい
ます。
## おまけ
組み込み系でも Web 系でも「品質の良いコードを書く」ことについては同
じでした。前職では数百人規模のプロジェクトに所属しており、自分要因
でシステムが止まる恐ろしさは十分すぎるほど分かっているので、その点
は良い経験でした。
Web 系だと新しいツールを使いやすかったり、テスト環境も構築しやすかっ
たり、他社のプログラマーとの交流もしやすいので、プログラマーの幸福
度は高いかも?
--------------------------------------------------------------------------------
title: "git stash やめました!"
date: "2012-06-17"
--------------------------------------------------------------------------------
git stash は便利なんですけど、stash したのを忘れたり、[egg](https://github.com/byplayer/egg) 使ってい
ると pop しても消えなかったりするので、もう使わないことにしました。
[gitで現在の作業内容をクイックセーブする - アジャイルSEを目指すブログ](http://d.hatena.ne.jp/sinsoku/20120531/1338395399)
この記事からヒントを得て、最近はオレオレ git qsave を使ってます。
{{< gist "masutaka" "2944177" >}}
見てのとおり、変更点を全部 commit しているだけです。
git reset --soft 'HEAD^1' とかすれば commit 前の状態、つまり
Staging の状態に戻ります。
リセットしないであとで圧縮 commit しても良いですね。
git-qsave という名前で(git-qsave**.sh** じゃないですよ!)パスの通ったディ
レクトリに置けば、git qsave で実行できます。
--------------------------------------------------------------------------------
title: "Jenkins-CLI使わずに、リポジトリの変更をプッシュ通知する方法がやっと分かった"
date: "2012-06-17"
--------------------------------------------------------------------------------
git push したら、すぐにテストを実行して欲しいだけなんです。
もう、ポーリング {{< post "2011-12-30-5" >}} で新しい commit があるかチェック
するのは嫌なんです。
いや〜、[Jenkins-CLI](https://wiki.jenkins-ci.org/display/JA/Jenkins+CLI) でやろうとしてかなりハマりました。
{{< tweet user="masutaka" id="213552271039004673" >}}
{{< tweet user="masutaka" id="213553193697816576" >}}
{{< tweet user="masutaka" id="213557302626754561" >}}
初心に返って{{< amazon_link asin="4774148911" title="Jenkins実践入門" >}}読みましたが、Git には特に触れられておらず...。
どうせこれも Jenkins-CLI のススメだろうと {{< amazon_link asin="4774149942" title="WEB+DB PRESS Vol.67" >}} の
[17 ページ目のコラムの URL](http://blog.cloudbees.com/2011/11/polling-must-die-triggering-jenkins.html) を読んでみた。
**「あれ? Git プラグインだけでできるの?」**
試しに git push の後に Web ブラウザで
http://example.com:8080/git/notifyCommit?url=/home/foo/hoge.git
にアクセスしたら、ビルドが始まったじゃありませんか!
あとは /home/foo/hoge.git/hooks/post-receive に以下を追加して終了。
```
curl 'http://example.com:8080/git/notifyCommit?url=/home/foo/hoge.git'
```
なんか矛盾しますが、「SCMをポーリング」にはチェックを入れる必要があ
ります。スケジュールは空っぽで OK です。
あと、今回のもうひとつの素晴らしい点は、**認証が必要なシステムでも使
える**ことにあります。
長年のつっかえがやっと取れました!
Jenkins さん、dis ってすみませんでした。
{{< amazon asin="4774149942" title="WEB+DB PRESS Vol.67" >}}
[Subversion はこの方法で出来るみたいです。](https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin)
--------------------------------------------------------------------------------
title: "Emacs の C-x h (mark-whole-buffer) を使うようになった 〜手癖は直せる〜"
date: "2012-06-02"
--------------------------------------------------------------------------------
{{< tweet user="masutaka" id="208854790359367681" >}}
連投しようかと思いましたが、思い直してブログに書くことにしました。ツイッターやるとそれなりに発散できますが、どこにも収束しませんからね。
上のツイートでは `M-<` とか書いてますけど、実は `Esc-<` って打ってます。最初に触った Emacs(NEmacs(ver18.55)) は X など使えなかったので。
## 手癖は直せる
こういう手癖ってなかなか直せないと思いがちですが、そんなことないと思います。
1. 半年ほど前、`Return` キーは `Ctrl-m` を、`Tab` キーは `Ctrl-i` を打つように手癖を直しました。キータッチが少し速くなったと思います([鬼軍曹.el](https://github.com/k1LoW/emacs-drill-instructor/wiki)さんありがとう!)
2. `C-;` や `C-:` は 1 行スクロールアップ/ダウンに割り当ててましたが、それぞれ `⌘-j` と `⌘-k` に変更しました。右手小指の痛みが治りました
3. メタキーを打ちやすいように、以下の設定で `⌘` と `Option` を入れ替えてましたが、デフォルトの設定に戻しました。おかげで Emacs でも Mac 特有のキーバインドを使えるようになったり、`Super` キーを積極的に使えるようになりました
```elisp
(setq mac-command-modifier 'meta)
(setq mac-option-modifier 'super)
```
`1` と `2` は 10 年以上染みついた手癖です。最初は結構イライラしましたが、3 日くらいで慣れました。で、2 週間ほどで手癖は忘れました。
## まとめ
`M-<` を「Esc 押して離して < を打つ」するのを止めました。
--------------------------------------------------------------------------------
title: "PHPカンファレンス関西2012に参加してきました #phpkansai"
date: "2012-05-13"
--------------------------------------------------------------------------------
今まで参加した勉強会で一番実践的だったと思います。
もちろん私にとって。
とか言いつつ、20 分くらい遅刻してしまいましたw
## PHP5.3、PHP 5.4、次のPHP
第2回 関西PHP勉強会 {{< post "2011-11-26-3" >}} で一度聞いてはいましたが、それで
も知らないことは多々ありました。
### PHP5.3
レイト・スタティック・バインディングがサポートされた。static:: が
C++ とかと同じように動作する。self::who じゃなくて static::who と
書くと、継承先の who() が使われる。
goto がサポートされた。loop の中には入れない。
クロージャがサポートされた。
クラススコープ外で const を使えるようになった。define は APC 使った
時に実行されてしまう。const はそうじゃないらしい。
省略三項演算子がサポートされた。フォームのデフォルト値を処理するの
に便利とのこと。さっそく試してみた。確かにこれは便利。
```
// セットされていれば、その値が使われる。
$aaa = 'masutaka';
$value = $aaa ?: 'aaa';
var_dump($value);
//=> string(8) "masutaka"
// されていなければ、デフォルト値('aaa')が使われる。
$aaa = 0;
$value = $aaa ?: 'aaa';
var_dump($value);
//=> string(3) "aaa"
```
### PHP5.4
Traits がサポートされた。早く使おう。
Class が垂直再利用なのに対して、Traits は水平利用とのこと。なるほど。
Ruby だと mixin に相当するとのこと。Module かと思ってた。
こんな風に Class と同様に利用できる。
```
trait foo {}
class bar { use foo; }
```
Traits を使えば __get() や __set() {{< post "2012-05-13-1" >}} をきれいに実装で
きるとのこと。
Trait を複数使う場合の文法もある。
関数の名前を変えたり、public を private に変えたり出来る。
Trait から Trait を作ることも出来る。
abstract で抽象メソッドを作れたりもする。
CLI Server(ビルドインサーバー)がサポートされた。
php -S 127.0.0.1:1080 とかで、Web サーバを起動できる。
便利だけど正式運用は厳しい。php が落ちたら web server も落ちるから。
watch dog 必須。
ショートタグがサポートされた。
```= ?>```
が常に利用可能。今までも php.ini で設定できたそう。
```= h('') ?>```
とかも書ける。
Ruby っぽい配列文法がサポートされた。
今まで何度も何度も要望があがっていたが、今回ようやく実装されたのは
echo foo()[1]; を書きたい要望があったためだそう。なるほど。
バイナリ記法がサポートされた。
0b1111 とか。
パッチは必要だが Facebook の Hiphop Virtual Machine が内々にサポー
トされたそう。PHP のコードを C++ に変換するアレですね。
## PHP-Ninja
{{< slideshare "jyQPQm8vGG2VDi" >}}
http://php-ninja.com/
WordPress x nginx x Zcloud
発表者は {{< twitter "miya0001" >}} さん。
PHP-Ninja はめっちゃ速い。5000-8000 req/sec 処理可能とのこと。
普通のレンタルサーバは 20 req/sec
高負荷時に CPU のコアをダイナミックに増減。これはすごい!
http://wp.remotemanager.me/
複数の WordPress を一元管理 (3サイトまで無料)
あとで忍者の一人に聞いてみたら、独自ドメインにはまだ対応してないそう。
## PHP on クラウド! – AWS Elastic Beanstalkの真価 –
AWS SDK for PHP
AWS の各種サービスを PHP で操作する SDK
PHP を使って、システム運用の自動化も。
DynamoDB を使った、HTTP のセッション共有が可能
SDK にクラスが同封
AWS 使ったことないですが、これも早く使いたいですね。
## PHPから利用するMySQLのネイティブドライバ「mysqlnd」について
[CentOS6.2にPHP5.3.9とMySQL5.5を導入 - OSSDBwiki](http://myhome.munetika.mydns.jp/ossdbwiki/index.php/CentOS6.2%E3%81%ABPHP5.3.9%E3%81%A8MySQL5.5%E3%82%92%E5%B0%8E%E5%85%A5)
MySQL native driver for PHP (mysqlnd_ms)
オリジナルより速い。
5.4 から本家に取り込まれるかも。
MySQL 向けのロードバランサ
PHP から送られてきたクエリーを更新もしくは検索かを判断して、
マスター/スレーブに自動的に振り分ける。
設定ファイルは json
プログラムは一切変更する必要がないので、Cake とかでも動くはず。
確認は出来てないけど。導入は低コスト。
クリティカルな場面ではマスターに処理を投げたい時もあるはず。
プログラムで制御できるのか? 今のバージョンでは出来るかも?
プログラム側はいっさい変更せずに MySQL のロードバランサが使えるのは
よいですね。導入が低コストなのも○
## CakePHP最新情報
{{< slideshare "nRS11NHpID9gBk" >}}
生の {{< twitter "cakephper" >}} さんを初めて拝見。
懇親会でいろいろお話しすることも出来ました〜
Cake2 では autoload が賢くなったそう。
Cake1 App::import()
Cake2 App::users()
CakeEmail
EmailCompornent と違って、utf8 決めうちではない。
これはめっちゃ助かります。
CakePHP2.1
JsonView/XMLView の追加
View の継承機能
CakePHP2 本が今年の 7 月にでるそう。これは..買おうかな?
## FuelPHP をさわってみて
{{< slideshare "hokdhBM2lhV0g" >}}
たしかにインストールはめっちゃ簡単。3コマンドで終了。{{< twitter "omoon" >}} がすご
く楽しそうに発表しているので、ちょっと使いたくなってしまいました。
メモ取ってなかったので、LT は割愛。。
モックオブジェクトは是非使ってみたいです。
## まとめ
今回は自分に関係ある発表ばかりだったので、かなり役に立ちました。
今後はもっとテスト関係の発表を聞きたいかなあ。調べてもなかなか情報
が出てこなくて。(もちろん cake 以下とかのテストコードは見てます。)
懇親会はヤバかったですねw
LT って、短いと何回もループさせられるものだったとは。。
有名人の方々ともお話しできて良かったです。
{{< twitter "shin1x1" >}} さんはじめ、運営の方々ありがとうございました!
関連情報: [はてなブックマーク - マスタカのはてなブックマーク - PHP - 勉強会](http://b.hatena.ne.jp/masutaka26/PHP/%E5%8B%89%E5%BC%B7%E4%BC%9A/)
--------------------------------------------------------------------------------
title: "今見ているページをRTMに登録するブックマークレットを作った"
date: "2012-05-13"
--------------------------------------------------------------------------------
[RTM(Remember The Milk)へページを簡単に登録するブックマークレット - エンジニアが作る最新ITブログ by DODA](http://www.asp-edita.jp/doda/one/doda7807_135.html)
> ここにあるAdd to RTM!ブックマークレットだと、URLとか登録できないからいやなので、
> m.rememberthemilk.com経由で登録するブックマークレットを作って使っている。
たしかに [Add to RTM!](http://www.rememberthemilk.com/help/answers/quickadd/firefox.rtm) ブックマークレットにはもう少し頑張って欲しいですね。
ってことで私も作りました。
```
javascript:(function(){var%20cp='http://m.rememberthemilk.com/add?name='+document.title+
'&due=Today&url='+document.location;
var%20w=window.open(cp,'addwindow','status=no,toolbar=no,width=475,height=260,resizable=yes');
setTimeout(function(){w.focus();},500);})();
// 可読性を良くするために複数行にしています。ブックマーク登録時には 1 行にしてください。
```
- サイトのタイトルをタスク名にセットしています。
- 期日は今日決めうちです。リストへの振り分けは後でやるからです。
- サイトの URL を URL にセットしています。
- フォーカスを「タスクを追加」に合わせたいのですが、よく分かりませんでした。
## Opera をお使いの聡明な皆さんへ
ブックマークに追加する時にニックネームを設定すると便利です。
私は r にしました。
Shift-F2 -> r の操作でこのブックマークレットのウィンドウが開きます。
参考情報: [Remember the Milkを便利に使う7つのツール|Nomad Worker Style](http://www.nw-style.com/2010/05/remember-milk7.html)
--------------------------------------------------------------------------------
title: "PHP の特殊メソッド __get(), __set()"
date: "2012-05-13"
--------------------------------------------------------------------------------
class に public な変数(プロパティ)を定義することは、オブジェクト指
向のカプセル化の観点から論外ですが、private なプロパティを定義して、
get_プロパティ名(), set_プロパティ名() とかを作るのもイケてなかった
のですね。(薄々気づいてはいましたが...。)
PHP には __get() と __set() という特殊メソッドがあります。
例えば
$myclass = new MyClass;
$myclass->hoge = 1;
の場合、定義していれば MyClass::__set() が呼ばれます。
以下のように private なプロパティを定義し、__get(), __set() を介し
てアクセス制御すると良いでしょう。このプロパティは読み取り専用、こ
のプロパティは両方大丈夫とか。
```
class Post {
private $title;
private $content;
private $author;
private $comments;
private $_getters = array('title', 'content', 'author', 'comments');
private $_setters = array('title', 'content', 'author');
public function __get($property) {
if(in_array($property, $this->_getters)) {
return $this->$property;
}
if(in_array($property, $this->_setters)) {
throw new Exception('Property "' . $property . '" is write-only.');
}
throw new Exception('Property "' . $property . '" is not accessible.');
}
public function __set($property, $value) {
if(in_array($property, $this->_setters)) {
$this->$property = $value;
return;
}
if(in_array($property, $this->_getters)) {
throw new Exception('Property "' . $property . '" is read-only.');
}
throw new Exception('Property "' . $property . '" is not accessible.');
}
}
$post = new Post;
$post->title = "タイトルだよ〜ん\n";
//=> エラーが発生することなく、代入できる。
print_r($post->title);
//=> エラーが発生することなく、「タイトルだよ〜ん」と表示される。
$post->comments = "コメントだよ〜ん\n";
//=> エラーが発生することなく、代入できる。
print_r($post->comments);
//=> 例外が発生する。PHP Fatal error: Uncaught exception 'Exception' with message 'Property "comments" is read-only.'
```
プロパティによっては、加工してから get/set したいものもあるかもしれ
ません。その場合も __get(), __set() を拡張すれば良いです。[PHP マニュ
アルのオーバーロードの項](http://www.php.net/manual/ja/language.oop5.overloading.php)が参考になると思います。ただし、[今回参考に
したコード](http://www.php.net/manual/ja/language.oop5.overloading.php#107547)は間違っているので、注意が必要です。。。
PHP 5.4 からは trait が使えるので、trait 化して自作の各 class に組
み込むと良いと思います(まだ環境を作ってないので、未確認..)。
--------------------------------------------------------------------------------
title: "第5回関西Emacsに参加してきました #kansai_emacs"
date: "2012-04-30"
--------------------------------------------------------------------------------
第3回、第4回{{< post "2011-10-11-1" >}} に引き続き、今回も関西Emacsに参加してきました。3回目にしてようやく顔と名前が一致してきた気がする。。。
まとめはこちらをどうぞ。
[= kansai-emacs #5 - ぺっくブログミラー@peccul](http://d.hatena.ne.jp/peccu/20120412/kansai_emacs5)
[= #kansai_emacs 5 終了 - ぺっくブログミラー@peccul](http://d.hatena.ne.jp/peccu/20120429/ke5)
[第5回関西Emacsまとめ - Togetter](http://togetter.com/li/294705)
始まる前に {{< twitter "tomoyaton" >}} {{< twitter "takaxp" >}} {{< twitter "sanryuu_" >}} {{< twitter "shigemk2" >}} で昼食。初めてお会いした {{< twitter "takaxp" >}} さんは、いかついアイコンとは真逆のナイスガイでした。
{{< figure src="/images/kemacs5-lunch-s.jpg" link="/images/kemacs5-lunch.jpg" target="_blank" rel="noopener" alt="画像" >}}
会場入りは少し遅れてしまいました。スミマセンデシタ。
まずはいつもどおり、ポジションペーパーを使った自己紹介。
{{< slideshare "g1uY4XOnQ1DCOx" >}}
{{< twitter "higaki" >}} さんのツイートがなにげに嬉しかったです。
{{< tweet user="higaki" id="196100716291559427" >}}
皆さんの発表を聞いて思ったんですが、ブログの記事で読むのと、発表を聴くのとでは、印象が全く変わるものですね。
例えば [flex-autopair.el の記事](http://d.hatena.ne.jp/uk-ar/20120401/1333282805)は 4/1 に読んで、試さずにスルーしていたようです。でも当日は速攻インストールして試していましたw Emacs24 で動かなかったので、あとで調べてみようかな?
=> [対応して下さいました。](http://d.hatena.ne.jp/uk-ar/20120518/p1)
[quickrun.el](http://d.hatena.ne.jp/syohex/20111201/1322665378) もちょいちょい使っているので、{{< twitter "syohex" >}} さんの生の発表を聞けて良かったです。PHP で CR(^M) が出力されてしまう件は、[先ほど修正](https://twitter.com/syohex/status/196820140975853569)して頂けました。ありがとうございます。
実は {{< twitter "takaxp" >}} さんが org-mode の翻訳プロジェクトの方だとは知りませんでした。[org-tree-slide.el](http://pastelwill.jp/wiki/doku.php?id=emacs:org-tree-slide) でのプレゼンが超かっこよかったので、あとで試します!(この記事も読んでいたけど、特に試さなかったみたい。)
パッケージの話を聴くのは初めてだったので、{{< twitter "kozo2" >}} さんの発表も参考になりました。package.el は M-x list-packages で待たされるのが嫌ですね。いや、package.el は好きなんですけどね。
{{< twitter "kiwanami" >}} さんの発表で面白かったのは、Emacs 環境を MVC で説明していたこと(それぞれバッファローカル変数、バッファ、keymap/コマンド)。使えるフレームワークが出てくれば Emacs もまだまだ化けるかも知れないですね。
懇親会は鍋でした。京都らしく白みそをチョイス。うまかったです。

{{< twitter "peccul" >}} さん運営諸々お疲れ様でした。{{< twitter "uwabami" >}} さんも会場の手配や設置ありがとうございました。
--------------------------------------------------------------------------------
title: "EMOBILE LTE を契約しました"
date: "2012-04-22"
--------------------------------------------------------------------------------
LITE(ライト)かと思ったら、LTE(エルティーイー)とのこと。
{{< figure src="/images/product_catch_gl02p-s.jpg" link="http://emobile.jp/products/gl02p/" target="_blank" rel="noopener" alt="画像" >}}
時々会社の [UQ WiMAX](http://www.uqwimax.jp/) ( {{< amazon_link asin="B004BVQUBM" title="WM3500R" >}} ) を借りて使ってましたが、面倒になっ
たので個人で契約しました。端末は上の GL02P です。
## UQ WiMAX ではなくて EMOBILE LTE にした理由
やはり下り最大速度です。
EMOBILE LTE (以下 EMOBILE) は 75Mbps、UQ WiMAX (以下 WiMAX) は
40Mbps です。WiMAX でも遅くはありませんが、私はネットのスピードに
これで OK という上限はないと思っているので、これが決め手になりました。
料金は大体同じです。EMOBILE は 3980円(2年縛り) のみ。WiMAX は 3980
円(1年縛り) と 4480円(縛りなし) の 2 種類。
通信エリアも WiMAX 優勢というわけでもなさそうです。WiMAX は首都圏に
強いそうですが、EMOBILE も問題ないそうなので。むしろエリアの広さで
言ったら、EMOBILE が優勢か。
あと細かいところで EMOBILE がポイントを稼ぎました。
- すでに GL02P を使っている同じ会社の人曰く「結構良いですよ」
- 昔 ADSL を契約していたイー・アクセスの印象が良かった。
- 先週行った城崎温泉 {{< post "2012-04-22-1" >}} では WiMAX が繋がらなかった。
- イメージキャラクターがかわいいw てかこの人が AKB48 の板尾友美さんなのか。
{{< figure src="/images/cm_emobilelte_ph.jpg" link="http://emobile.jp/movie/" target="_blank" rel="noopener" alt="画像" >}}
今年 2 月に出た WM3600R は素晴らしいそうなので、WiMAX には興味はあっ
たのですがね。残念。
{{< amazon "B0071F0RIW" >}}
## GL01P はどうなの?
{{< figure src="/images/product_catch_gl01p-s.jpg" link="http://emobile.jp/products/gl01p/" target="_blank" rel="noopener" alt="画像" >}}
大容量バッテリー搭載と書かれていますが、GL02P と大差ないです。むし
ろバッテリー交換できないので、バッテリーに関してはマイナスポイント
かと。GL02P のバッテリーは 3000〜4000 円とのこと。
サイズも大きいですし、microSD カードを使いたい人以外は選択肢から外
して良いと思います。
## 使ってみて分かったこと
GL02P は起動がめっちゃ早いです。10 秒くらいで使えるようになります。
WM3500R は 1 分以上かかっていた気がします。
全然知らなかったのですが、イー・モバイルって携帯回線使っているので
すね。http://192.168.1.1/ にアクセスしたら電話番号が割り振られてい
たので気づきました。(UQ WiMAX はその名のとおり、{{< wikipedia word="WiMAX" text="WiMAX" >}} を使ってます。)
--------------------------------------------------------------------------------
title: "次世代開発手法『温泉駆動開発』のご紹介"
date: "2012-04-22"
--------------------------------------------------------------------------------
先日ご紹介した『フィリピン駆動開発』{{< post "2012-03-30-1" >}} は、導入障壁が高
いことに気づきました。そこで、より導入障壁の低い『温泉駆動開発』を
紹介したいと思います。
先週の水〜金に{{< wikipedia word="城崎温泉" text="城崎温泉(きのさきおんせん)" >}}に行ってきました。
兵庫県の日本海側、京都府との境に近いところにあります。
道中のコンビニで撮影。いい感じの田舎具合です。
{{< figure src="/images/kinosaki1-s.jpg" link="/images/kinosaki1.jpg" target="_blank" rel="noopener" alt="画像" >}}
昼食のため[出石](http://maps.google.co.jp/maps?q=%E5%87%BA%E7%9F%B3%E7%94%BA&hl=ja&ie=UTF8&sll=36.5626,136.362305&sspn=47.342153,83.496094&brcurrent=3,0x3554063c646bffb3:0x10998559ba4f7600,0&hnear=%E5%B2%A1%E5%B1%B1%E7%9C%8C%E5%B2%A1%E5%B1%B1%E5%B8%82%E5%8C%97%E5%8C%BA%E5%87%BA%E7%9F%B3%E7%94%BA&t=m&z=15)で停車。萩に少し似た城下町でした。こういう町並みは好
きですね。
{{< figure src="/images/kinosaki2-s.jpg" link="/images/kinosaki2.jpg" target="_blank" rel="noopener" alt="画像" >}}
誰?
{{< figure src="/images/kinosaki3-s.jpg" link="/images/kinosaki3.jpg" target="_blank" rel="noopener" alt="画像" >}}
この辺は皿そばが有名とのこと。1 人前 5 皿です。記念品がもらえるとの
ことだったので、5 人中 3 人が 20 皿完食しました。私ももちろん完食。
{{< figure src="/images/kinosaki4-s.jpg" link="/images/kinosaki4.jpg" target="_blank" rel="noopener" alt="画像" >}}
もらった記念品。肝心の皿数が書いてありません。
{{< figure src="/images/kinosaki5-s.jpg" link="/images/kinosaki5.jpg" target="_blank" rel="noopener" alt="画像" >}}
城崎温泉の宿に到着。
{{< figure src="/images/kinosaki6-s.jpg" link="/images/kinosaki6.jpg" target="_blank" rel="noopener" alt="画像" >}}
1 日目は内風呂が使えませんでしたが、全く問題なし。徒歩 1 分の所に外
湯がありました。温泉街だけあって、外湯はそこかしこにあります。
{{< figure src="/images/kinosaki7-s.jpg" link="/images/kinosaki7.jpg" target="_blank" rel="noopener" alt="画像" >}}
スナックも多かった。夜の 9 時頃から看板の明かりが灯り始めます。
ただ、今回は勇気が出なくて入れませんでした。orz
{{< figure src="/images/kinosaki8-s.jpg" link="/images/kinosaki8.jpg" target="_blank" rel="noopener" alt="画像" >}}
肝心の開発ですが、急ぎの用件があったのでいつもどおりのタスクをこな
してしまいました。ネットワークが貧弱なのは残念でしたけど、『フィリ
ピン駆動開発』と同様、普通にはかどったと思います。
部屋には作業しやすい机と椅子がなかったので、結構腰にきました。これ
は次回への課題ですね。
3 日目は雨でした。なんとか天気がもって良かったです。
{{< figure src="/images/kinosaki9-s.jpg" link="/images/kinosaki9.jpg" target="_blank" rel="noopener" alt="画像" >}}
合わせて読みたい:
[2012年春の開発合宿に行ってきました。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20120421/1335023673)
--------------------------------------------------------------------------------
title: "『八日目の蝉』を観た"
date: "2012-04-17"
--------------------------------------------------------------------------------
{{< amazon "B005CZ7M72" >}}
今回も前知識なしで観ました。すごく良い映画。
過去と現在がパラレルに進行する映画はよくありますが、使い方を間違えると観てて訳が分からなくなります。そういう意味では、この映画は全く違和感がありませんでした。色使いを変えているんですかね。
昔自分が住んでいた土地を訪問することって、なにか用語ありましたっけ?実は私、これがすごく好きなんです。
社会人になった数年後に、大学時代に住んでいた宇都宮のアパートを訪問した時は何とも言えない思いになりましたし、最近だと2月に武蔵新城をぶらぶら歩いた時も同じでした。ゲームだと {{< wikipedia word="ファイナルファンタジーV" text="FF5" >}} で故郷の村に戻るシーンが好きですね(音楽も)。
失礼な話ではありますが、店が潰れてたりするとなお良いです。この映画でもそんなシーンが何カ所か出て来て、結構萌えました。
そして{{< wikipedia word="永作博美" text="永作博美" >}}があいかわらず良いです。彼女は {{< wikipedia word="ribbon (アイドルグループ)" text="ribbon" >}} 時代から知ってますが、{{< wikipedia word="青い鳥_(テレビドラマ)" text="青い鳥" >}}で惚れました。思えば青い鳥も逃亡のドラマですね。
ということで(?)、オススメの映画です。
--------------------------------------------------------------------------------
title: "これからの開発手法の本流『フィリピン駆動開発』"
date: "2012-03-30"
--------------------------------------------------------------------------------
3/9 から 3/27 まで、フィリピンの{{< wikipedia word="セブ" text="セブシティ" >}}に出張に行ってました。
{{< figure src="/images/atami-s.jpg" link="/images/atami.jpg" target="_blank" rel="noopener" alt="画像" >}}
フィリピンは去年の 3 月{{< post "2011-04-22-1" >}}、8 月に続いて 3 回目です。出
張と言っても特別に用があるわけでもなく、新オフィスが出来る関係で人
が集まるから、ちょっと行ってみようかという程度の話でした。
{{< figure src="/images/langrich-office-s.jpg" link="/images/langrich-office.jpg" target="_blank" rel="noopener" alt="画像" >}}
でもまあ、現地スタッフと直接話して問題点が分かったのは良かったです
し、半年前にはちょっと想像がつかないくらい大きくなった会社を目の当
たりにすることも出来ました。
{{< figure src="/images/langrich-party-s.jpg" link="/images/langrich-party.jpg" target="_blank" rel="noopener" alt="画像" >}}
それ以外の時間はこういうカフェで仕事をしてました。
{{< figure src="/images/coffee-bean-s.jpg" link="/images/coffee-bean.jpg" target="_blank" rel="noopener" alt="画像" >}}
フィリピンには Wifi と電源が使えるカフェが結構あって、長時間いても
文句を言われることはありません。みんなおおらかというか、気にしない
のでしょうね。私のようにネットさえあれば仕事が出来る人にとっては、
悪くない環境です。
滞在場所はなかなかストイックなレジデンスでした。ネットが使えるのは
1 階の、24:00 で閉まるインターネットスペースだけ(1時間15ペソ(30円))。
部屋にシャワーは付いていますが、お湯は出ません(フィリピンだと普通)。
これが何をもたらしたかというと、、、生活が超規則正しくなりました。
部屋でネットが出来ないので、帰ったら寝るしかないんです。私はホット
シャワーじゃないと痛くて髭を剃れないので、シャワーも浴びず歯を磨い
てバタンです。
ほぼ毎日こんなサイクルでした。
8:00 起床、歯を磨いてすぐに[マリオットホテル](http://www.marriott.com/hotels/travel/CEBPH-Cebu-City-Marriott-Hotel)に移動
8:30 同ホテルのジム(マンスリー会員になった)でシャワー
9:30 近くのカフェで朝食を取りつつ仕事開始
18:00 この辺で疲れてくるので仕事終了。飲みに行ったり、マッサージに行ったり。
24:00 就寝
生活が規則正しくなると、仕事が進むもんですね。先日[こんな記事](http://www.lifehacker.jp/2012/03/120316workinbuzz.html)があり
ましたが、やはりカフェとコーディングは相性がよいです。おまけにフィ
リピンだと他の客が何喋っているか分からないので、さらに集中できます。
実感として日本にいる時の2倍くらい捗っていた気がします。ちょっと調
べてみました。
|期間|終了したチケット|commit回数|変更ファイル数|追加行数|削除行数
|---|---:|---:|---:|---:|---:
|2012 2/1-2/29|18|35|165|2825|1228
|2012 3/1-3/29|**40**|**64**|233|3321|1483
終了したチケットと commit 回数が2倍くらいになってます。変更した行
数はそれほどでもないので、細かいチケットを数多くこなしていたようで
す。
私はこの現象というか開発手法を『フィリピン駆動開発』と名付けること
にしました。フィリピンに行けば開発効率は大きく上がります。今後の主
流になるかもしれません(?)。
P.S.
ああ、でもいろんな意味できついわw 半年に 1 回くらいならやっても良い
かも。
--------------------------------------------------------------------------------
title: "『ハングオーバーII』を観た"
date: "2012-02-18"
--------------------------------------------------------------------------------
{{< amazon "B004PVTF42" >}}
予想外に I よりもさらに面白かった。ダグはあいかわらず空気だったし、
一部目を背けたくなるようなグロいシーンもあったけど、コメディだと割
り切れば問題ない。
最後にひとこと言わせてくれ。
や っ ぱ り 二 日 酔 い じ ゃ な い じ ゃ ん w
--------------------------------------------------------------------------------
title: "『ハングオーバー』を観た"
date: "2012-02-16"
--------------------------------------------------------------------------------
{{< amazon "B003W8WUUU" >}}
まあまあ面白かったが、ひとこと言わせてくれ。
二 日 酔 い じ ゃ な い じ ゃ ん w
--------------------------------------------------------------------------------
title: "『南極料理人』を観た"
date: "2012-01-29"
--------------------------------------------------------------------------------
{{< amazon "B002YV7V7I" >}}
全体的にわざとらしさ感が充ち満ちている映画。だけれども、ドキュメン
タリーっぽい感じがあり、悪くなかった。寝っ転がりながらぼ〜っと観る
のがちょうど良いかも。ロケ地は南極ではなく、北海道網走市とのこと。
さすがに無理なのか。
KDD インマルサットの清水さんはなかなか良かった。
--------------------------------------------------------------------------------
title: "『ライフ・イズ・ビューティフル』を観た"
date: "2012-01-28"
--------------------------------------------------------------------------------
{{< amazon "B00005V2NG" >}}
何人かに勧められてようやく観た。でも、私は無理矢理っぽさが合わなかっ
たなあ。前半はコメディ版タイタニックか?と思ったけど、後半になると
全く違った映画になる。最後は悪くなかった。
--------------------------------------------------------------------------------
title: "『ブラック・スワン』を観た"
date: "2012-01-28"
--------------------------------------------------------------------------------
{{< amazon "B005WG7ENS" >}}
これは凄まじい映画。特に中盤以降は本気で何が何だか分からなくなって
くる。瞬きも惜しんで見ることになるとは思わなかった。
--------------------------------------------------------------------------------
title: "『グラン・トリノ』を観た"
date: "2012-01-09"
--------------------------------------------------------------------------------
{{< amazon "B001V9KBSA" >}}
なかなかに渋い映画。前半はコメディチック、後半はシリアス。
Amazon のレビューで「これは西部劇だ。」との意見が。なるほど。
日本語吹き替えで観たので、次は字幕にしよう。
--------------------------------------------------------------------------------
title: "『ロボゲイシャ』を観た"
date: "2011-12-31"
--------------------------------------------------------------------------------
{{< amazon "B0031JP4SK" >}}
2011 年を締めくくるにふさわしい映画。笑いあり涙あり姉妹愛あり。それ
にロボットまで付いてくれば見ないわけにはいかないでしょう。大物俳優
が何人も出演し、脇を十二分に固めています。
.
.
.
ここまでクソ映画だったとは。。。でも頑張って最後まで観たw
片腕マシンガール {{< post "2011-12-11-2" >}} を悪いほうに外した感じ。
途中何カ所か面白いところはあったけど。本当に同じ監督が作った?
低予算ではなくなったそうだけど、それと関係しているのかな?
--------------------------------------------------------------------------------
title: "{Jenkins x CakePHP2 (6/6)} 他にインストールしたプラグイン"
date: "2011-12-30"
--------------------------------------------------------------------------------
※ 詳細情報は「Jenkinsの管理」>「プラグインの管理」から辿れる、各プ
ラグインのリンク先を参照して下さい。
## Emotional Jenkins Plugin
これはインストールした方がよいでしょう。そしてテストを失敗させましょうw
各プロジェクトの設定で ON/OFF できます。
## IRC Plugin
設定すると、指定した channel に Jenkins さんが常駐します。ビルド結
果を IRC で通知してくれるだけでなく、IRC から Jenkins を実行できた
りもします。
私の設定は以下のとおり。
| |
|---|---
|Hostname|chat.freenode.net
|Port|6667
|Channels Name|#example
|Nickname|jenkinsbot
|Command prefix|jenkinsbot:
|(高度な設定)Use /notice command|チェックを入れる
Hostname と Port と Channels Name を設定するだけで動くはずですが、
私の環境では Nickname が初期値の jenkins-bot だと、Channels に
join してくれませんでした。なので試行錯誤の結果、微妙に変えました。
Command prefix は IRC の mentions っぽくしました。なんでも良いと思
います。
Use /notice command もチェックを入れた方がよいと思います。IRC の
/notice コマンドを使って通知します。
## Redmine Plugin
プロジェクトのトップページに Redmine のリンクが現れます。
コミットメッセージの refs #100 とかが概チケットへのリンクになります。
--------------------------------------------------------------------------------
title: "{Jenkins x CakePHP2 (5/6)} Jenkins を自動実行する"
date: "2011-12-30"
--------------------------------------------------------------------------------
「リモートからビルド (例: スクリプトから)」がうまくいかないので、
とりあえず「SCMをポーリング」にしました。
10 分おきにポーリングです。
```
*/10 * * * *
```
Jenkins は良くできたツールなんだけど、微妙に設定が効かないことがあ
るよなあ。単にまだ自分に馴染んでいないだけなのか。
--------------------------------------------------------------------------------
title: "{Jenkins x CakePHP2 (4/6)} Jenkins から PHPUnit を実行する"
date: "2011-12-30"
--------------------------------------------------------------------------------
CakePHP2 から、奨励単体テストツールが SimpleTest から PHPUnit になっ
たのは周知のとおり。http://example.com/cakephp/test.php などから単
体テストができるようになり、カバレッジ率も測定できる環境が整ったら、
Jenkins でも実行したいところ。
## コマンドラインから単体テストを実行する
まずはコマンドラインからテストを実行できることを確認する。
```
% cd app
% mkdir -p results
% ../lib/Cake/Console/cake testsuite --log-junit results/phpunit.xml --coverage-clover results/coverage.xml app AllTests
```
上の例では、Controller や Model を含めた全てのテストケースを実行す
る app/Test/Case/AllTestsTest.php を実行している。
このとき
>PHP Fatal error: Class 'DOMDocument' not found in /usr/share/pear/PHPUnit/Util/Log/JUnit.php on line 135
なんていうエラーが起きたら、[configure で –with-dom を有効にした
PHP がインストールされていない](http://www.php-seed.net/blog/archives/83)。remi リポジトリからインストールする
と良い(詳細は割愛)。
```
% sudo yum --enablerepo=remi,epel,rpmforge,rpmforge-extras,rpmforge-testing install php-xml
```
ここまで出来たらあとは簡単。Jenkins に設定するだけ。
## Jenkins側の設定
トップの「Jenkinsの管理」>「プラグインの管理」から、
results/coverage.xml を解析するためのプラグイン、Clover PHP Plugin
をインストールする。
続けて、プロジェクトに前述のコマンドを設定する。
1. プロジェクト(例:hoge)のトップページから「設定」をクリック。
2. 「ビルド」>「ビルド手順の追加」>「シェルの実行」をクリック。
以下を設定する。
```
cd ${WORKSPACE}/app
mkdir -p results
../lib/Cake/Console/cake testsuite --log-junit results/phpunit.xml --coverage-clover results/coverage.xml app AllTests
```
3. 「ビルド後の処理」>「Clover PHP カバレッジレポートを集計」をクリック。
「Clover XMLパス」に app/results/coverage.xml を指定する。
4. 同様に「JUnitテスト結果の集計」をクリック。
「テスト結果XML」に app/results/phpunit.xml を指定する。
あとはビルドするだけ。エラーが発生してしまったら「コンソール出力」
を見ると、原因が大体分かります。
参考 URL:
[Fatal error: Class ‘DOMDocument’ not foundと出たら: PHPの種 ブログ](http://www.php-seed.net/blog/archives/83)
--------------------------------------------------------------------------------
title: "{Jenkins x CakePHP2 (3/6)} Jenkins からコーディング規約をチェックする"
date: "2011-12-30"
--------------------------------------------------------------------------------
手っ取り早く使ってみたかったので、最初に Jenkins からコーディング規
約チェック出来るようにしてみた。単体テストだと、最初にテストコード
を書かなくちゃいけないからね。
## PHP_CodeSniffer のインストール
インストールすると、phpcs コマンドを使えるようになる。
pear コマンドでインストール出来るが、
```
% sudo pear install PHP_CodeSniffer
```
エラーが発生してインストールできなかったので、
```
downloading PHP_CodeSniffer-1.3.2.tgz ...
Starting to download PHP_CodeSniffer-1.3.2.tgz (328,845 bytes)
......................done: 328,845 bytes
PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 23378 bytes) in /usr/share/pear/PEAR.php on line 252
PHP Stack trace:
PHP 1. {main}() /usr/share/pear/pearcmd.php:0
PHP 2. PEAR_Command_Common->run() /usr/share/pear/pearcmd.php:305
PHP 3. PEAR_Command_Install->doInstall() /usr/share/pear/PEAR/Command/Common.php:271
PHP 4. PEAR_Installer->install() /usr/share/pear/PEAR/Command/Install.php:708
PHP 5. PEAR_Installer->_installFile2() /usr/share/pear/PEAR/Installer.php:1406
PHP 6. PEAR->isError() /usr/share/pear/PEAR/Installer.php:600
PHP 7. is_a() /usr/share/pear/PEAR.php:252
```
/etc/php.ini をこのように修正した。
```
memory_limit = 16M
↓
memory_limit = 32M
```
※ 以降のどこの操作かは忘れましたが、同じ現象が発生したため、私の環
境では最終的に 256M に落ち着きました。
PHP_CodeSniffer をインストールできた。
```
% phpcs --version
PHP_CodeSniffer version 1.3.2 (stable) by Squiz Pty Ltd. (http://www.squiz.net)
% phpcs -i
The installed coding standards are MySource, PEAR, PHPCS, Squiz and Zend
```
CakePHP 用の規約は同封されていないので、別途インストールした。
```
% cd ~/tmp
% git clone git://github.com/jrbasso/CodeSniffer_CakePHP.git
% cd /usr/lib/php/pear/PHP/CodeSniffer/Standards
% sudo cp -r ~masutaka/tmp/CodeSniffer_CakePHP CakePHP
```
無事追加された。
```
% phpcs -i
The installed coding standards are CakePHP, MySource, PEAR, PHPCS, Squiz and Zend
```
app/controllers 以下とかでチェックできるようになった。
```
% phpcs --report=summary --report-checkstyle=phpcs.xml --standard=CakePHP --extensions=php .
```
## Jenkins 側の設定
### Git プラグインと、Check-Style プラグインのインストール
1. トップの「Jenkinsの管理」>「プラグインの管理」をクリックする。
2. 「利用可能」タブをクリックし、Git Plugin と Checkstyle Plugin を
選択し、インストールする。
### ジョブを作成する
1. トップから「新規ジョブ作成」をクリックする。
2. 「ジョブ名(要はプロジェクト名)」に適当な名前(例:hoge)を指定する。
/var/lib/jenkins/workspace 以下に同じ名前のディレクトリが作られるの
で英語名が良い。
3. 「フリースタイル・プロジェクトのビルド」を選択し、OK をクリック。
4. 「ソースコード管理システム」の Git を選択。Repository URL を指定
する(例:/home/foo/hoge.git)。
### Check-Style プラグインを設定する
1. そのまま同じ設定画面の「ビルド」>「ビルド手順の追加」>「シェルの
実行」をクリック。Controller と Model 以下の .php ファイルを対象と
したい場合は、以下を設定する。
```
cd ${WORKSPACE}/app
mkdir -p results
find Controller Model -type f -name "*.php" ! -name AppController.php -print0 | \
xargs -0 phpcs --report=summary --report-checkstyle=results/phpcs.xml --standard=CakePHP --extensions=php || id
```
※ 1つでもエラーがあるとビルド失敗だと判断されてしまうので、この例
では最後に id コマンドを実行して、常にビルドが成功するようにしている。
2. 「ビルド後の処理」>「CheckStyle警告の集計」をクリック。「集計す
るファイル」に app/results/phpcs.xml を指定する。
あとはビルドを実行するだけ。警告出まくりだけど、Jenkins から
CakePHP コーディング規約をチェック出来た。
参考 URL:
[CakePHPのコーディング規約違反をPHP_CodeSnifferでチェックする #CakephpAdvent2011 : candycane development blog](http://blog.candycane.jp/archives/949)
--------------------------------------------------------------------------------
title: "{Jenkins x CakePHP2 (2/6)} Jenkins の認証設定"
date: "2011-12-30"
--------------------------------------------------------------------------------
## 今回採用したセキュリティポリシー
ログインしないとアクセス出来ないようにする。
管理者が手動でアカウントを作成すると、ユーザーがサインアップできる。
第3者は勝手にサインアップできない。
## 設定方法
「Jenkinsの管理」>「システムの設定」>「セキュリティを有効化」にチェック
「アクセス制御」>「ユーザー情報」>「Jenkinsのユーザーデータベース」にチェック
「ユーザーにサインアップを許可」のチェックを外す。
「アクセス制御」>「権限管理」>「行列による権限設定」にチェック。
「追加するユーザー/グループ」から masutaka を追加。全アクセス権を付与。
トップに戻り masutaka のサインアップをすると、ログイン出来るようになる。
--------------------------------------------------------------------------------
title: "{Jenkins x CakePHP2 (1/6)} Jenkins のインストール方法"
date: "2011-12-30"
--------------------------------------------------------------------------------
CakePHP-2.0.4 で{{< wikipedia word="継続的インテグレーション" text="継続的インテグレーション(CI)" >}}ができる環境を構築する
ため、[Jenkins](https://wiki.jenkins-ci.org/display/JA/Jenkins) をインストールすることにした。
ネット上を探し回ったんだけど、まだ Jenkins x CakePHP2 の情報はまと
まってないみたい。毎度のことながら途中何度も何度もハマり、設定して
はアンインストールし、設定してはアンインストールしを 7〜8 回はやっ
たと思う。同じように困っている人と、将来の自分のために構築メモを残
すことにする。全 6 回。
Jenkins のバージョンは 1.445、CentOS のバージョンは 5.6。
Jenkins をインストール&起動した。Jenkins 用のリポジトリを yum の
リポジトリリストに追加して、yum install するだけ。
```
% sudo yum install java-1.6.0-openjdk
% sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
% sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
% sudo yum install jenkins
% sudo /sbin/service jenkins start
```
http://example.com:8080 にアクセスできるようになった。設定ファイル
や workspace は /var/lib/jenkins に、ログは /var/log/jenkins に作ら
れる。
設定やビルド結果は xml で保存され、MySQL とかは使わないので、気楽と
言えば気楽。
そして、ここまでは簡単。
{{< amazon asin="4774148911" title="Jenkins実践入門 〜ビルド・テスト・デプロイを自動化する技術" >}}
--------------------------------------------------------------------------------
title: "『ミリオンダラーベイビー』を観た"
date: "2011-12-24"
--------------------------------------------------------------------------------
{{< amazon "B000AC8OV0" >}}
どこまでも救いようがない物語。でも嫌いじゃない。
マギーは幸せだったのかな?
--------------------------------------------------------------------------------
title: "私の.emacsからピックアップした設定3つ #EmacsAdventJP"
date: "2011-12-17"
--------------------------------------------------------------------------------
[Emacs Advent Calendar jp: 2011](http://atnd.org/events/21982) の 17 日目です。16 日目は、{{< twitter "asudofu" >}}
さんの[点数付けの導入でタスク管理を楽しくする[Emacs拡張]](http://d.hatena.ne.jp/asudofu/20111216/1324034142)でした。
Emacs Advent Calendar jp には初めて参加します。Emacs は 2000 年から
使っていますが {{< post "2009-06-26-2" >}}、あんまり凝ったことはしていません。な
ので、今回は私の .emacs から良さそうな設定を 3 つ紹介します。
## Dired で今日変更したファイルを色づけ
こんな感じに今日変更したファイルの日時に色が付きます。なかなか便利
です。

※ 意味もなく、`s' でファイルを時間順に並べ替えるのも好きです。`s'
で元に戻ります。
元々 [blankspace > emacs > dired](http://homepage1.nifty.com/blankspace/emacs/dired.html) にあった設定なので、ご存知の方も多
いのではないでしょうか。今の私のコードはこのようになっていました。
日付が "12 15" でも "Dec 15" でも色が付くようになっています。
{{< gist "masutaka" "1487093" >}}
## フォントを大きくしたり小さくしたり
Emacs-23.1 からフォントを動的に大きくしたり小さくしたり出来るように
なりました。等幅フォントでは出来ないかもしれません。
M-x text-scale-adjust の後に `+' するだけでフォントが大きくなります。
`-' で小さくなります。`0' で元に戻ります。
等倍
5回+
10回+
私は C-q C-a に割り当てて、何か行き詰まると大きくしたり小さくしたり
しています。
Mac な方は、フォントの設定は [Cocoa Emacs のフォント設定について](http://d.hatena.ne.jp/setoryohei/20110117/1295336454)がてっ
ぱんです。
## 自分のはてなブックマークをEmacsから検索
これも使っている人は多いと思います。M-x anything-hatena-bookmark で
自分のはてブを検索できます。これを使い始めてから、私のはてブの利用
率が急上昇しました。
M-x anything-hatena-bookmark -> emacs したところ
{{< figure src="/images/anything-hatena-bookmark-s.png" link="/images/anything-hatena-bookmark.png" target="_blank" rel="noopener" alt="画像" >}}
導入は少し面倒です。
1. [migemo](http://0xcc.net/migemo/) をインストールする。(Mac な方は {{< post "2011-10-10-1" >}} が参考になるかも)
2. [anything.el をインストールする。](http://d.hatena.ne.jp/rubikitch/20100718/anything)
3. [anything-hatena-bookmark.el をインストールする。](http://blog.livedoor.jp/k1LoW/archives/65139372.html)
3 はリポジトリが変わっていました。
```
% git clone git://github.com/k1LoW/anything-hatena-bookmark.git
```
M-x anything-hatena-bookmark-get-dump で自分のはてブのキャッシュファ
イル ~/.hatenabookmark を作成できます。でも重いので、シェルスクリプ
ト版を使うと良いでしょう。
[自分のはてなブックマークを検索するanything-hatena-bookmark.elのデータ更新用シェルスクリプト - aki77の日記](http://d.hatena.ne.jp/aki77/20090501/1241167586)
svn で取得するのが簡単です。
```
% svn co http://svn.coderepos.org/share/lang/shellscript/misc anything-hatena-bookmark-get-dump
```
Mac な方は、GNU 版の sed が必要です。私は 0:30, 3:30,.. 23:30 のよ
うに 3 時間間隔で実行するように crontab に設定しています。
```
30 0-23/3 * * * PATH=/usr/local/bin:$PATH SED=gsed LANG=ja_JP.UTF-8 $HOME/bin/anything-hatena-bookmark-get-dump masutaka26
```
※1 GNU sed は Homebrew でインストールしました。
※2 cron で実行する場合は環境変数 LANG の設定が必要です。
以上のように少々面倒ですが、一度設定すれば快適はてブ生活を送ること
が出来るので、是非導入すべきでしょう。
## 終わりに
今回久しぶりに自分の .emacs を最初から最後まで読みましたが、結構し
んどいですね(1694行)。init-loader.el のような分割は好きではないので、
アウトラインモードで管理したいところです。標準の
outline-minor-mode を emacs-lisp-mode で使うと ;;; が * に相当する
ようですが、あまり使い勝手がよろしくありません。org-minor-mode って
ないですかね?
明日 18 日目は、{{< twitter "Oh_CanNotAngel" >}} さんです。
--------------------------------------------------------------------------------
title: "Opera でうまく見られないサイトへの対策"
date: "2011-12-14"
--------------------------------------------------------------------------------
Opera はマイナーなブラウザなのか、うまく見られないサイトがいくつか
ありました。User-agent と HTTP Accept Language をカスタマイズすれば
なんとか大丈夫なようです。ただし、後者は全てのサイトに影響するので、
少し注意が必要です。
## jp.techcrunch.com
http://jp.techcrunch.com/ にアクセスすると、
http://m.jp.techcrunch.com/ に飛ばされてしまう。Opera はモバイル機
器で多く使われているようなので、jp.techcrunch.com が適当に判断して
しまっているようだ。
http://m.jp.techcrunch.com/ に飛ばされた状態で右クリック > サイトご
との設定を編集 > 一般設定タブに進む。サイトに jp.techcrunch.com を
入力。
{{< figure src="/images/opera-each-site_s.png" link="/images/opera-each-site.png" target="_blank" rel="noopener" alt="画像" >}}
同様に右クリック > サイトごとの設定を編集 > ネットワークタブに進む。
ブラウザーの識別を「完全に Firefox として認識させる」にする。
{{< figure src="/images/opera-each-site2_s.png" link="/images/opera-each-site2.png" target="_blank" rel="noopener" alt="画像" >}}
## dmm.com
ログインしようとすると、以下のエラーページに飛ばされる。
{{< figure src="/images/dmm-cant-login_s.png" link="/images/dmm-cant-login.png" target="_blank" rel="noopener" alt="画像" >}}
アドレスバーに opera:config と打ち、Enter を押下。
Network > HTTP Accept Language に進み、
```
ja,en;q=0.9,en-US;q=0.8,fr;q=0.7,de;q=0.6,es;q=0.5,it;q=0.4,pt;q=0.3,pt-PT;q=0.2,nl;q=0.1,sv;q=0.1,nb;q=0.1,da;q=0.1,fi;q=0.1,ru;q=0.1,pl;q=0.1,zh-CN;q=0.1,zh-TW;q=0.1,ko;q=0.1,ar;q=0.1,cs;q=0.1,hu;q=0.1,tr;q=0.1
```
から
```
,zh-CN;q=0.1,zh-TW;q=0.1,ko;q=0.1
```
を削除する。
--------------------------------------------------------------------------------
title: "『「リーダーの条件」が変わった』を読んだ"
date: "2011-12-12"
--------------------------------------------------------------------------------
{{< amazon asin="4098251183" title="「リーダーの条件」が変わった" >}}
氏は本書を含め、さまざまな場所で提言しているけど、本書にあるように問題はそれを実行できるリーダーがいないことなんだよね。まあでも大阪とか福岡とか地方が変わってきているので、それは一筋の光明かな?
--------------------------------------------------------------------------------
title: "『片腕マシンガール』を観た"
date: "2011-12-11"
--------------------------------------------------------------------------------
{{< amazon "B001GR50FQ" >}}
天ぷら! YAKUZA! NINJA! そして スーパー遺族!
もう何も言うことはありません。
2007 年の B 級スプラッター映画。日本では公開されてないとのこと。
ようやく観れたわ。てか、さっさと借りれば良かった。
予告編はこれ。本編はこれより 200% グロい。
{{< youtube "h7xqgf43ibk" >}}
小飼弾氏も町山智浩氏も大絶賛です。
[404 Blog Not Found:紹介 - 片腕マシンガール](http://blog.livedoor.jp/dankogai/archives/50965851.html)
[女子高生にマシンガンつけて忍者ヤクザと闘わせろ! - ベイエリア在住町山智浩アメリカ日記](http://d.hatena.ne.jp/TomoMachi/20071212)
オフィスでみんなで観ようかと思ったけど、グロすぎるので躊躇している
ところ。メシ時避ければ良いのかな?
全体的にみんなドスが効いた良い声をしていました。全てが良い意味でツッ
コミどころ満載。監督が良い仕事をしている。体張ってたし。。。
作中で片腕マシンガンを作った石川ゆうやさんは新宿ゴールデン街「ダー
リン」の店主だそうです。是非行ってみたい。
YAKUZA の人は「プロジェクトA」の海賊のボスと似てる。
参考情報: {{< wikipedia "片腕マシンガール" >}}
--------------------------------------------------------------------------------
title: "『プロジェクトA』を観た"
date: "2011-12-11"
--------------------------------------------------------------------------------
{{< amazon "B00005V2MI" >}}
海賊のボスは絶対に真面目でいい人!
参考情報: {{< wikipedia "プロジェクトA" >}}
--------------------------------------------------------------------------------
title: "Mew で新規作成や返信時に case を自動的に切り替える方法"
date: "2011-12-06"
--------------------------------------------------------------------------------
※ この記事は [= MewでiCloudのメールを読み書き - ぺっくブログミラー
@peccul](http://d.hatena.ne.jp/peccu/20111202/mew_icloud) への mention です。
{{< twitter "peccul" >}} さんの記事のとおり、Mew で case を設定すると複数アカウント
を切り替えることが出来ます。さらに、自動的に切り替えることも出来ます。
pooh@example.com から来たメールへの返信で、case に example を使いた
い時は、このように設定します(mew-case-guess-when-replied-alist の書
式は mew-refile-guess-alist と同じです)。
```elisp
;; 返信時(a,A)にケースを自動的に設定する。
(setq mew-case-guess-when-replied-alist
'(("\\(To\\|Cc\\):"
("pooh@example\\.com" "example"))))
```
新規作成や転送の時は mew-case-guess-alist に設定します。でも普通は
To: や Cc: は空なので、推測に必要な情報がありません。
そこで登場するのが mew-ask-to と mew-ask-cc です。以下のように設定
すれば、返信の時と同じように case が自動的に切り替わります。
```elisp
;; 草稿を作る時(w,f,F)、最初に To: と Cc: を聞かれる。
(setq mew-ask-to t mew-ask-cc t)
;; 草稿を作る時(w,f,F)や、再編集時(E)にケースを自動的に設定する。
(setq mew-case-guess-alist
'(("\\(To\\|Cc\\):"
("pooh@example\\.com" "example"))))
```
mew-case-guess-alist と mew-case-guess-when-replied-alist について
は、[Info の Customize > config](http://mew.org/ja/info/release/mew_8.html#SEC84) にさらりと書いてあります。
--------------------------------------------------------------------------------
title: "『もし小泉進次郎がフリードマンの『資本主義と自由』を読んだら』を読んだ"
date: "2011-12-04"
--------------------------------------------------------------------------------
{{< amazon asin="4822248712" title="もし小泉進次郎がフリードマンの『資本主義と自由』を読んだら" >}}
池田信夫さんのメルマガで連載されていた小説の漫画版。まあまあ面白かった。日本が財政破綻したらどうなるのか、私のように経済に疎い人にも想像できる内容に仕上がっている。
漫画としては、もっと少し練った方が良かった。というのも小説をそのまま漫画化した感じで、全体的にメリハリがない(和間さんのところがある意味クライマックス?w)。小泉さんのキャラ設定は不十分というか、設定されていない。
次は藤沢数希さんの「{{< amazon_link asin="4478017158" title="日本人がグローバル資本主義を生き抜くための経済学入門 もう代案はありません" >}}」を読む予定(もう読み始めているけど)。
--------------------------------------------------------------------------------
title: "『Jenkins実践入門 〜ビルド・テスト・デプロイを自動化する技術』を読んだ"
date: "2011-12-01"
--------------------------------------------------------------------------------
{{< amazon asin="4774148911" title="Jenkins実践入門 〜ビルド・テスト・デプロイを自動化する技術" >}}
その名の通り、[Jenkins](http://jenkins-ci.org/) の入門書。Jenkins で出来ることを知っておくに
は良い本。そんなに濃い内容ではないので、時間をかけずにさっと読めた。
逆に、濃い情報を期待して読むと期待はずれだと思う。Subversion の説明
なんていらないし、Java 以外の言語を使っている人にとって、Ant とか
JUnit の説明もいらない。
まあでも、Jenkins は yum で簡単にインストール出来ることが分かったし、
[Selenium](http://seleniumhq.org/) というテストツールを使えば、Web ブラウザからの操作を自動化
できることも分かったので、私には良い本だった。
--------------------------------------------------------------------------------
title: "第2回 関西PHP勉強会 LightningTalk"
date: "2011-11-26"
--------------------------------------------------------------------------------
{{< post id="2011-11-26-1" title="第2回 関西PHP勉強会 目次に戻る" >}}
## Memcached は NoSQL
memcached って、NoSQL に分類されるのね。知りませんでした。。データ
数は 100,000 件とかにすれば、違いがより分かりやすかったかも?
## PHP でも顔認識してみようぜ!
OpenCV を PHP から使う!
画像をアップロードすると、顔を認識してくれる。iPhoto とかであるやつですね。
実演は無事成功。8888
## Windows Azure で PHP 動くんです
{{< wikipedia word="Microsoft_Windows_Azure" text="Windows Azure" >}} ってのがあるのですね。
クラウドで動く Windows Server
## 初心者でもわかる CakePHP と PDFlib
PDFlib は何十万もするらしい。。。弊社ではちょい無理です。
FPDF は無償。これはメモメモ。
12 月中に第 2 回関西 PHP 初心者勉強会やるらしいです。
## PHP で Twitter
OAuth には、twmode とかこのブログとかで使ったことがあるので、これは
馴染み深かった。PHP でも簡単にできるんですね〜
## php でも jubatus
データを突っ込むと、そのデータが何かを類推してくれる。
例えば、はてブのタグの suggestion とか。でも試作は失敗とのことw
## facebook アプリ
heroku 使うやつだったけかな。雛形が用意されているので、結構簡単に作
れるらしい。プロジェクタートラブルはご愁傷様でした。
--------------------------------------------------------------------------------
title: "第2回 関西PHP勉強会 セッション2 PHP5.4おいしさつまみぐい"
date: "2011-11-26"
--------------------------------------------------------------------------------
{{< post id="2011-11-26-1" title="第2回 関西PHP勉強会 目次に戻る" >}}
{{< slideshare "IZAJyt9SE7DIbz" >}}
{{< twitter "tanakahisateru" >}} さんの発表。
5.4 はゆるやかな変更
5.4 から 2 進数リテラル(例: 0b1111)が使える。
## Array Short Syntax
array() 使わなくても [] でいいやつね。
YAML 使わなくてもシンプルにできるかも、とのこと。
## Builtin Server
"php -S localhost :8080" で簡単起動。PHP5.3 とかの既存の環境を変更
せずに試せる。.php だけでなく、static なファイル .html とかも表示で
きる。引数にビルトインサーバ用スクリプトを指定すると、CakePHP とか
の .htaccess を要求するフレームワークも動かせる。
## TRAIT
親クラス以外からもメソッド実装を持って来れる。
class の代わりに、trait で定義する。
使いたい class でだけ use で使う。
これはいい!
## クロージャ
5.3 まではクロージャの中で $this を使えなかった。
--------------------------------------------------------------------------------
title: "第2回 関西PHP勉強会 セッション1 あらためてPHP5.3"
date: "2011-11-26"
--------------------------------------------------------------------------------
{{< post id="2011-11-26-1" title="第2回 関西PHP勉強会 目次に戻る" >}}
{{< slideshare "vdSe164DfVfCju" >}}
{{< twitter "shin1x1" >}} さんの発表。
PHP5.2 から大きく機能追加されたとのこと。PHP6 のリリースがいつにな
るか分からないので、PHP6 から PHP5.3 にバックポートされたためだそう。
class の外でも const が使えるのはうれしいですね〜。と言いたいところ
ですが、define しか知りませんでした。。でも今試しました。OK! できた!
```
const AAA = 'huga'; /* クラスの中に書いても外に書いても OK */
pr(self::AAA); /* クラスの中の時 */
pr(AAA); /* クラスの外の時 */
```
## namespace
PHP5.3 未満には存在しなかった。グローバルネームスペースのみ。
バックスラッシュで階層化。(なんでスラッシュじゃないの?と思った。)
影響は .php ファイルのみ。
use でインポート、エイリアス
クラス、インターフェイス名と、関数、変数とでは名前空間の検索方法が異なる。
名前空間の付け方 -> PSR-0 でルール化
結論。ハマりどころを抑えておけば問題なし。
## クロージャ
似たような処理を関数化することは多いと思うが、クロージャを使えばメ
ソッドを関数の中に閉じ込められる。うまく使うと、保守性の高いコーディ
ングが出来そう。そういえば C 言語でもクロージャは書けるみたいですね。
{{< post "2010-03-30-1" >}}
## LSB
Late Static Bindings 遅延静的束縛
実行時に評価される。
self:: を static:: にするだけ。
## まとめ
PHP マニュアル読みなさい。
ちょっと試したいときは、Silex というフレームワークがオススメ。
## 休憩
なんと!バームクーヘンが出て来ました。PHP 界隈ではスイーツ恒例だそ
うです。(フィルムをはがして撮れば良かったorz)
{{< figure src="/images/kansai-php2-sweets.jpg" link="http://www.i4pc.jp/photo/361823767_1009147" target="_blank" rel="noopener" alt="画像" >}}
--------------------------------------------------------------------------------
title: "初めて PHP 勉強会に参加してきた! #kphpug"
date: "2011-11-26"
--------------------------------------------------------------------------------
## ごあいさつ
PHP 界隈の皆様はじめまして。{{< twitter "masutaka" >}} です。PHP 歴は 8 ヶ月ほどです。
普段は Emacs に住んでいます。組み込み系の業務で C 言語を 11 年くら
い使っていた関係で、私のPHP コードはすごく C 言語っぽい気がしてま
す...。他、EmacsLisp と Ruby でたまに小粒なツールを作ります。
## [第2回 関西PHP勉強会](http://atnd.org/events/21691)
というわけで、第2回 関西PHP勉強会に参加してきました。PHP 勉強会に参
加するのは今回が初めてです。Emacs とも Ruby とも雰囲気が違って良い
ですね〜。初心者が一番参加しやすいんじゃないでしょうか。楽しかった。
{{< twitter "shin1x1" >}} さんを初めとする運営の方々、ありがとうございました。
長くなってしまったので、各セッションは別記事にしました。ほとんど個
人的なメモです。
{{< post id="2011-11-26-2" title="セッション1 あらためてPHP5.3" >}}
{{< post id="2011-11-26-3" title="セッション2 PHP5.4おいしさつまみぐい" >}}
{{< post id="2011-11-26-4" title="LT(Lightning Talk)" >}}
来年の 5 月に PHP カンファレンス関西が開かれる予定とのこと。これは
行かねば!
--------------------------------------------------------------------------------
title: "英語文法メモ4 - 助動詞"
date: "2011-11-22"
--------------------------------------------------------------------------------
難しいし、量が多いしで、part2 の 3 節までまとめて力尽きた。
## 能力・許可を表す助動詞
can と be able to は同じ意味。ただし、will can のように助動詞を2つ
続けることは出来ないので、その場合は will be able to を使う。
ただし、could と was able to には違いがある。
```
(1) She could play the violin at five.
(2) I was able to swim 200 meters yesterday.
```
過去において「〜する能力があった」という過去の能力を表す場合は、
(1) のように could を用いることも出来るし、was able to を用いること
も出来る。反対に「〜することが(実際に)できた」という過去に実行した
ことを表すときには、(2) のように was able to を用いる。could を用い
ることはできない。ややこしい。。。
許可を表したい時は、can または may を使う。May I ...? はやや堅苦し
い言い方なので、Can I ...? が使われることが多いとのこと。
```
Can I turn on the radio?
May I use your bathroom?
```
Yes, of course (you can)./Yes, please (do)./Sure. などと答える。
You may ... は上の立場の人が許可を与える言い方。
```
You may leave early today.
```
従って、Yes, you may. という返答は、子どもや下の立場の人に許可する
感じを与えるとのこと。
依頼を表したい時は Can you ...? を使う。Could you ...? を使うと、よ
り丁寧な言い方になる。Could you possibly ...? を使うとさらに丁寧な
言い方になる。
```
Can you open the window?
Could you lend me the book?
Could you possibly lend me another fifty dollars?
```
## 義務・必要を表す助動詞
「〜しなければならない」
```
You must attend the morning.
I had to write a report about my summer vacation.
```
must と have to を使う。ほぼ同じ意味だが、must の方が意志が強めの印
象。have to は規則や周囲の状況などから、そうしなければならないとい
うことを表すことが多いそう。
must は現在時制でしか使えないので、過去の義務や必要を表したい時は
had to、未来であれば will have to を使う。
否定文では意味が違ってくる。must not は「〜してはいけない」という禁
止、don't have to は「〜しなくてもよい、〜する必要はない」という不
必要を表す。
「〜すべきです」
```
You should exercise every day.
We ought to save energy.
```
should と ought to を使う。日本語の「〜すべきだ」ほど強くはなく、
「〜するほうがよい」くらいの意味と考えて良い。must のような強制力は
ない。
「〜しなさい」
```
You had better report the accident to the police.
```
特に you を主語にすると命令的な感じを与えるので、上の立場の人や年上
の人に対しては使わない。否定形は had better not を使う。had better
は「〜したほうがいい/〜しなければいけない」という意味を表すこともあ
るそう。
```
We'd better go back. It has started to snow.
```
## 可能性・推量を表す助動詞
can / could
```
(1) Anybody can make mistakes.
(2) The light in the sky could be a plane.
(3) Can his story be true?
```
(1) は「〜はありうる」、(2) は「〜かもしれない」。どちらも可能性を
表す。(3) の Can ...? は強い疑問を表す。
may / might
```
(1) We may have some rain tomorrow.
(2) He might come to the party with his wife.
```
どちらも「〜かもしれない」という推量を表す。might は may よりもやや
可能性が低いことを表すことが出来る。
will / would
```
(1) The phone is ringing. That will be my father.
(2) That would be the best solution.
```
「たぶん〜だろう」という話し手の推測をあらわす。would を使うと、
will よりも控えめで丁寧な言い方になり、will よりも自信のなさを表す
こともある。
※ 可能性や推量を表す could / might would は形は過去形だが、過去の
ことを表しているのではない。
must / can't
```
(1) She must be Bobby's sister.
(2) Karen can't be home now.
```
(1) は「〜に違いない」という確信を表す。
(2) は「〜のはずがない」。couldn't を使うことも出来る。
should / ought to
```
(1) My parents should be in Boston by now.
(2) Our guests ought to be here in a few minutes.
```
「〜のはずだ/きっと〜だ」を表す。
※ must は「絶対そうだ」、should は「きっとそうだ」、may は「そうか
もしれない」というニュアンス。
{{< amazon asin="4342010402" title="総合英語 Forest 6th edition" >}}
--------------------------------------------------------------------------------
title: "Emacs での UNIX 時間操作まとめ"
date: "2011-11-21"
--------------------------------------------------------------------------------
Emacs で UNIX 時間が必要になったので、いろいろ調べました。
そういうわけで個人的なメモになります。
```elisp
;; 任意の日時の UNIX 時間を求める。
(let ((year 2011)
(month 11)
(day 21)
(hour 18)
(minutes 30)
(seconds 00))
(time-to-seconds
(encode-time seconds minutes hour day month year)))
=> 1321867800.0
;; UNIX 時間を Emacs 時間(?) に変換する。
(seconds-to-time 1321867800.0)
=> (20170 6680 0)
;; Emacs 時間を UNIX 時間に変換する。
(time-to-seconds '(20170 6680 0))
=> 1321867800.0
;; Emacs 時間を日時に変換する。
(current-time-string '(20170 6680 0))
=> "Mon Nov 21 18:30:00 2011"
;; Emacs 時間を任意のフォーマットの日時に変換する。
(format-time-string "%Y/%m/%d %a %H:%M:%S" '(20170 6680 0))
=> "2011/11/21 月 18:30:00"
;; Emacs 時間を decode する。
(decode-time '(20170 6680 0))
=> (0 30 18 21 11 2011 1 nil 32400)
;; (SECONDS MINUTES HOUR DAY MONTH YEAR DOW DST ZONE)
;; 現在の Emacs 時間を取得する。
(current-time)
=> (20170 6680 0)
```
UNIX のコマンドラインと C 言語での取得方法はこちら。{{< post "2009-11-21-1" >}}
**追記(2011-11-22):**
コメント欄で {{< twitter "kiwanami" >}} さんから、斜め上の図を教えて頂きました。
http://emacs.g.hatena.ne.jp/kiwanami/20110608/1307551439
--------------------------------------------------------------------------------
title: "『自分のアタマで考えよう』を読んだ"
date: "2011-11-18"
--------------------------------------------------------------------------------
{{< amazon asin="4478017034" title="自分のアタマで考えよう" >}}
前回とはうって変わり、表やグラフがよく出てくる分析的な本。考えるこ
とについて突き詰めて考えた本なので、一度目を通しておいた方が良いと
思う。
以下、ビビッと来たところ。
P168
```
日本企業は、与えられたフィルターの中で一番に選ばれるための商品を
開発することにはとても優れているのに、「今までになかった新たなフィ
ルターを消費者に提示する」ことが必ずしも得意ではない、ということで
す。
ビジネスの世界では、この「新たな選択基準=新たなフィルターを提示
する」ことを、「ゲームのルールを変える」といいます。
```
P238
```
①知識は思考の棚の中に整理すること
②空いている棚に入るべき、まだ手に入っていない知識を常に意識すること
③それらの知識が手に入れば言えるようになることを、事前に考えておくこと
これが、ちきりんが考える「知識と思考の、理想的なカンケイ」なのです。
```
--------------------------------------------------------------------------------
title: "Emacs Lisp で buffer-local function を使う方法"
date: "2011-11-05"
--------------------------------------------------------------------------------
[stackoverflow を見ていたら、面白いネタがあった](http://stackoverflow.com/questions/8008211/buffer-local-function-in-elisp)のでメモしておきます。
{{< gist "masutaka" "1340000" >}}
このコードは buffer-local variable のように動作します。
通常のバッファでは "this is a default message." をミニバッファに出
力します。use-my-foo が定義されたバッファ((set ..) の行を評価する)
では "this is a special message." を出力します。
用途はちょっと思いつきませんが、こんなことも出来るのですね。
--------------------------------------------------------------------------------
title: "Git タグ操作のまとめ"
date: "2011-11-02"
--------------------------------------------------------------------------------
個人的なメモ その3
その1と2は {{< post "2010-04-29-1" >}}{{< post "2011-07-05-1" >}} にあるよ。
(1) タグ一覧を表示する。
>% git tag
(2) タグ 1.0.50 を作成する。タグの種類は「注釈付きのタグ」
>% git tag -a 1.0.50
(3) 後からタグ 1.0.50 を 9fceb02 に付ける。
>% git tag -a 1.0.50 9fceb02
(4) タグ 1.0.50 の情報を表示する。
>% git show 1.0.50
(5) リモートブランチ origin にタグ情報 1.0.50 を送信する。
>% git push origin 1.0.50
(6) リモートブランチ origin にタグ情報全てを送信する。
>% git push origin --tags
参考情報:
[Pro Git - Pro Git 2.11 Git の基本 タグ](http://progit.org/book/ja/ch2-11.html)
--------------------------------------------------------------------------------
title: "C で実装された Emacs のビルドイン関数にジャンプする"
date: "2011-11-01"
--------------------------------------------------------------------------------
Emacs ではほとんどの関数は Emacs Lisp で書かれているため、
F1 f (describe-function) すると、定義されている *.el が一行目に
表示されます。
>add-to-list is a compiled Lisp function in `subr.el'.
この例だと `subr.el' 上で Enter すると、定義元に飛べます。
中には高速化のために C で書かれた関数もあります。car や cdr、
write-region などです。このような関数を F1 f すると、以下のように
表示されます。
>car is a built-in function in `C source code'.
同じように `C source code' 上で Enter すると、C のソースコードに飛
べます。
Enter 後に "Emacs C source dir:" というプロンプトが表示されてしまっ
たら、ソースコードの展開先を指定してあげましょう。
もう削除しちゃったよという人や、パッケージでインストールしてソース
コードがない人は適当な場所に展開すると良いでしょう。
```
% pwd
/Users/masutaka
% wget http://ftpmirror.gnu.org/emacs/emacs-23.3a.tar.bz2
% tar xjf emacs-23.3a.tar.bz2
```
上記の例だと、"~/emacs-23.3/src" を指定すれば OK です。毎回指定する
のが面倒なら、以下を設定すれば OK です。
```elisp
(setq find-function-C-source-directory "~/emacs-23.3/src")
```
--------------------------------------------------------------------------------
title: "Emacs の recentf-mode をチューニングしたよ"
date: "2011-10-30"
--------------------------------------------------------------------------------
[Emacs で最近開いたファイルのリストを自動保存する。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20110217/1297928222)
[anything.el](http://d.hatena.ne.jp/rubikitch/20100718/anything) との組み合わせが素敵すぎますね。ずっと便利に使ってます。
ただ、ミニバッファに 30 秒ごとに "Wrote ~/.emacs.d/.recentf" と表示
されるのが結構気になっていました。なので、メッセージを表示しないよ
うに、且つ必要時以外は recentf-save-file に保存しないようにしました。
{{< gist "masutaka" "1325654" >}}
設定は {{< twitter "tomoyaton" >}} さんの記事と重複してますが、分かりづらくなるので
私の recentf 関連の設定を全て記載しています。recentf-save-file をデ
フォルトの ~/.recentf から ~/.emacs.d/.recentf にも変更しています。
{{< twitter "cvmat" >}} さんにはいろいろというか、ほぼ全てのアドバイスを頂きました。
いつもありがとうございます。
**追記(2011-10-30):**
コメント欄でよりシンプルな方法を教えて頂いたので、コードを差し替え
ました。
--------------------------------------------------------------------------------
title: "英語文法メモ3 - 完了形"
date: "2011-10-30"
--------------------------------------------------------------------------------
英語は実に時制を厳密に扱いますね。ってことで今回は完了形です。
## 現在完了形
現在完了形は過去と今の状況をつなげて、「どういういきさつを経て、今、
どうなっているのか」を一気に表現する形である。したがって、現在完了
形が用いられている場合、その内容は「今の状況」とかかわりをもってい
ることになる。
※『Forest』には現在形、過去形、未来形、現在完了形などが図入りで説
明されている。それを見ると分かりやすい。
「宿題が終わったから、遊びに行こうよ。」
>× I finished my homework, so let's go out to play.
{{< post "2011-10-25-1" >}} にも書いたとおり、過去形は現在とは無関係の過去の事柄
を述べるのに使われる。以下が正解。
>○ I have finished my homework, so let's go out to play.
「まだ決心していないんだ」
>× I don't decided.
これも {{< post "2011-10-25-1" >}} に書いたとおり、動作動詞の現在形は「反復・習
慣」を表すので、使えない。以下が正解。
>○ I have not decided yet.
※ 最近のアメリカ英語では、現在完了形を使うべきところで過去形を使う
ことがあるとのこと(フィリピン英語もその傾向があるかも)。『Forest』
には続けて、「だからと言って、むやみに過去形を使うことはせず、現在
完了形と過去形を使い分けるようにしよう」と書いてあった。
現在完了形は、今の状況を述べるものなので、明らかに過去を表す表現と
ともに使うことは出来ない。
```
yesterday, last night[week/month/year], then, just now, when I was
..., When ...?, What time ...?, in 1972, on July 4,...
```
以下の表現は使うことが出来る。
```
before, ever, lately, just, now, today, recently, this
week[month/year], for the last[past] ... days, for ..., since ...
```
### 完了・結果
やっていたことをやり終えて、その結果、今どういう状況になっているか
を示すことが出来る。
>I have already spent all my money.
>Henry has just finished his homework.
already, just, now, yet などの副詞が用いられることが多い。
### 経験
今までの経験を表す場合にも、現在完了形を用いる。
>I have visited London twice.
>Have you ever climbed Mt.Fuji?
before, never, ever, often, once, twice, many times のような、回数
や頻度を表す副詞を用いるのがふつう。
### 継続
{{< post "2011-10-25-1" >}} の状態動詞は、もともと同じ状態が継続する意味合いを含
んでいる。このような動詞を現在完了形にすれば、ある状態が過去のある
時から現在まで続いてきたことを洗わすことになる。
>We have lived in this house since 1992.
>I have known Greg for 20 years.
always, for, since, How long ...? のような表現を用いることが多い。
## 現在完了進行形
「今までずっと〜し続けている」という動作の継続を表す時に使う。
過去と現在進行形を繋ぐような感じ。
>I have been doing this puzzle for 30 minutes.
>How long have you been waiting here?
動作は終わったものの、その余韻が今でも色濃く残っている時にも使われる。
>I'm very tired. I've been running.
## 過去完了形
現在完了形は<今>と<今まで>をつなぐ。
過去完了形は<過去のある一点>と<その時以前>をつなぐ。
よって、when や before などの接続詞とともに使われることが多い。
>The man had run away when the police arrived.
2つの出来事を実際に起こった順序とは逆の順序で述べる場合、時間的に
前に起こった出来事を過去完了形にする。
>I realized that I had left my umbrella in his car.
起こったとおりの順序で述べる場合は、どちらも過去形にする。
>My uncle bought a watch for me and I lost it.
## 未来完了形
これも現在完了形と過去完了形と同じ。<未来のある一点>と<その時以
前>をつなぐ。<その時以前>は、過去および現在も含む。
「(未来のある時点まで)ずっと〜し続けているだろう」という、動作の継
続を表すには未来完了進行形を用いる。ただし、その場面はあまり多くは
ないとのこと。
>Next year I will have been working at the company for 30 years.
{{< post "2011-10-25-1" >}} では『when や if などの「時」や「条件」を表す接続詞
を用いると、それに続く節の中では「実際に成り立つ」と扱うことになる
ため、現在形を用いる。』と書いたが、「未来に実際にあると想定すべき
こと」や「一般論」を表す時は現在完了形を用いることがあるとのこと。
>I'm going to Rome when I have finished my Italian lessons.
>Don't drive a car when you haven't had enough sleep.
{{< amazon asin="4342010402" title="総合英語 Forest 6th edition" >}}
--------------------------------------------------------------------------------
title: "英語文法メモ2 - 動詞と時制"
date: "2011-10-25"
--------------------------------------------------------------------------------
日本語とは時制の解釈が少し違うので注意。
## 現在形と現在進行形
現在形は現在だけのことではなく、「今」を中心として、過去から未来に
わたるある程度の期間に成り立つ行為や状態を表す。
動詞には状態を表す「状態動詞」と動作を表す「動作動詞」がある。
### 状態動詞
特に必要がない限り進行形にはしない。
(1)心理を表す動詞
>like, love, hate, hope, want, think, believe, know, understand,
>remember, forget
(2)知覚・感覚を表す動詞
>see, hear, feel, smell, taste
(3)その他の状態を表す動詞
>be, remain, have, own, belong to, contain, exist, resemble
### 動作動詞
「動作動詞」の現在形は、「今」を中心として過去から未来にわたってく
り返される動作を表す。一回きりの動作は基本的に表せない。
>I always drink coffee at breakfast.
過去・現在・未来を通して変化のない事実を表すことも出来る。
>The earth goes around the sun.
## 過去形と過去進行形
現在とは無関係の過去の事柄を述べるのに使われる。(この点は日本語にな
いこだわりだと思う。)
過去進行形では、無限にある過去のうちの「ある1点」でしている最中だっ
たことを表しているので、「いつしていたか」を示す必要がある。
>I was watching TV around noon.
## 未来形と未来進行形
will と be going to は微妙に意味が違う。
は、その場で(急に)する気になったことを表す。
>"The telephone is ringing." "OK, I'll answer it."
は、その場で突然決めたことではなく、それ以前からする
つもりでいたことを表す。
>I'm going to study abroad next year.
は話し手や主語の意志とは関係なく、自然の成り行きで起こる
であろうことも示す。(単純未来)
>My brother will be twenty next year.
には、主語の意志を表す意志未来と呼ばれる用法があ
る。
>I will give you my answer tomorrow.
過去から見た未来は、過去形の助動詞などで表す。
>I decided that I would study in the U.S.
>He said he was going to visit me the following week.
## (現在形, 未来形)++
when や if などの「時」や「条件」を表す接続詞を用いると、それに続く
節の中では「実際に成り立つ」と扱うことになるため、現在形を用いる。
> The birds will fly south when winter comes.
when や if であっても、その節が名詞の働きをしていたら will が必要と
なる。whether(〜かどうか) も同じかな?
```
Tell me when she will come back. (名詞節)
(彼女がいつ戻ってくるのか教えて下さい。)
Tell me when she comes back. (副詞節)
(彼女が戻ってきたら教えて下さい。)
```
団体などの予定・計画、公共的な事柄の予定など、変更の可能性がない時
は、未来のことであっても現在形を用いる。
>Out flight leaves at 11:45.
個人的な予定など、未来に向けての心構えや準備をしている時は、未来形
ではなく現在進行形を用いる。
>I'm leaving for Paris tomorrow morning.
{{< amazon asin="4342010402" title="総合英語 Forest 6th edition" >}}
--------------------------------------------------------------------------------
title: "英語文法メモ1 - 動詞と文型"
date: "2011-10-22"
--------------------------------------------------------------------------------
英語の文法を一から勉強中です。
そういうわけで、これは個人的なメモになります。
## 文型
主語は S(Subject)、(述語)動詞は V(Verb)、目的語は O(Object)、
補語は C(Complement) で表す。
### (1) SV - S は V する。
>He smiled.
### (2) SVC - S は C である(V)。
S is C が成り立つ。
補語は、動詞の後で主語について説明する。
>The movie was funny.
### (3) SVO - S は O を V する。
>We cleaned the classroom.
### (4) SVOO' - S は O に O' を V する。
>My uncle gave me his watch.
### (5) SVOC - S は O を C させる(V)。
この場合の補語は、目的語について説明する。
make 型: 「O を C にする」(O の状態について述べる)
>They made me angry.
make, get, keep, leave, paint など。
call 型: 「O を C と呼ぶ」(O の名や役職などについてて述べる)
>We call him Teddy.
call,elect, name など。
think 型: 「O を C と考える」(O についての認識を述べる)
>You'll find his brother cool.
think, believe, find, consider など。
### (6) SVO + to/for 〜
(4) の言い換え版。時計ではなく、時計をあげた相手を強調したい場合は、
前置詞 to を使う。
>My uncle gave his watch to me.
give は「相手の元に何かを届かせる」タイプの動詞。
buy 型「相手のために何かをする」もある。
>My uncle bought me an MP3 player.
同様に時計をあげた相手を強調したい場合は、
前置詞 for を使う。
>My uncle bought an MP3 player for me.
ただし ask は特別とのこと。of を使う。
>Can I ask you a favor?
>Can I ask a favor of you?
bring は両方使える。意味合いが変わる。
>Gary brought me this magazine.
>Gary brought this magazine to me. (私に)
>Gary brought this magazine for me. (私のために)
cost や take のように書き換えられない動詞もあるそうな。ややこしい。
>This watch cost me 7,500 yen.
>The journey took us three days.
### (7) There + be 動詞 ...
>There is a cat under the table.
相手が知らないことを伝えるのだから、be 動詞のあとの名詞に the,
that, this, your のような、相手が知っていることを示す語はつけない。
## 自動詞と他動詞
自動詞は主語と動詞で意味を表す。
>He didn't move.
他動詞は名詞を後に続けて意味を表す。動詞のあとの名詞が目的語。
>He didn't move the desk.
自動詞と他動詞で意味が異なる動詞もある。
>He ran to me. (彼は私の所に走って来た。)
>He runs a coffee shop. (彼は喫茶店を経営している。)
## 教科書はこれを使ってます。
{{< amazon asin="4342010402" title="総合英語 Forest 6th edition" >}}
--------------------------------------------------------------------------------
title: "フィッシングサイトにはこうやって引っかかるんだ。こりゃ騙されるわ〜"
date: "2011-10-18"
--------------------------------------------------------------------------------
知り合いから Twitter の Direct Message にこんなのが。
> Found a funny picture of you! http://t.co/(省略)
怪しいのは間違いなくて、実際彼はパスワードを抜かれていたわけですが、
どうやったらこうなるのか興味があったので体験してみました。
## 慎重にことを進める。
Twitter はパスワードが漏れるか、OAuth 認証を許可しない限り、アカウ
ントを乗っ取られることはないはずです。でも慎重を期すために、Web ブ
ラウザはメインでは使っていない Firefox を使うことにしました。
アカウントも普段とは別なのを使います。http://twitter.com にアクセス
して、一旦ログアウト。以前、動作検証用に作ったサブアカウントでログ
インしました。
次におもむろにアドレスバーに Direct Message の URL を貼り付けて、
Return キーを押下。twitter.com から「安全でない外部サイトに移動する
けど問題ないか」聞かれました。このあたりでいつもと違う雰囲気。
移動したところ、Twitter からログアウトしてしまいました。
???
## その巧妙な仕組みを理解
よく分からないなあと思い、別な作業をしていましたが、また思い直して
再挑戦。
!?
twitter.com じゃない!!
{{< figure src="/images/twitter-fishing-s.png" link="/images/twitter-fishing.png" target="_blank" rel="noopener" alt="画像" >}}
これほど精巧な作りだと、アカウントとパスワードを打ってしまうのも無
理はないです。すぐにタブを閉じないと、あとで忘れて打ってしまうかも。
## まとめ
フィッシングサイトのへ防衛策として「リンクを不用意に踏まない」とよ
く言われますが、なぜ踏んだだけで危険なのか、今まで理解していません
でした。IE じゃあるまいし、踏んだだけで危険なわけないじゃんと。
Web サービスで認証が切れて、ログイン画面に飛ばされるのは良くあるこ
とです。その「良くあること」を利用した巧妙な仕組みだなと、腹の底か
ら実感しました。
Twitter 程度なら引っかかってもたかが知れていますが、オンラインバン
キングや PayPal とかだと厳しいですね。
--------------------------------------------------------------------------------
title: "Emacs auto-mode-alist の "\'" ってなんなの〜?"
date: "2011-10-18"
--------------------------------------------------------------------------------
昨晩の Emacs ミニミニ勉強会のネタ。
{{< twitter "tomoyaton" >}} 「auto-mode-alist って、("\\.el\\'" . emacs-lisp-mode)
とかが設定されてるけど、なんで "$" じゃなくて "\\'" なの〜?」
{{< twitter "masutaka" >}} 「言われてみれば確かにそうですね。でも Mule 時代は
("\\.el$" . emacs-lisp-mode) って設定されてた気がしますよ。」
結論から言うと、改行にマッチさせないよう、より厳格にしているからだっ
た。Mule 時代は "\\'" がなかったのかな。
"$" は文字列の終端と改行にマッチする。
```elisp
;; hoge.el には当然マッチ
(string-match "\\.el$" "hoge.el")
=> 4
;; hoge.ell には当然マッチしない。
(string-match "\\.el$" "hoge.ell")
nil
;; あれ、hoge.el の後ろが改行でもマッチするんだけど。。。
(string-match "\\.el$" "hoge.el
")
=> 4
```
"\\'" は文字列の終端のみにマッチする。
```elisp
;; hoge.el には当然マッチ
(string-match "\\.el\\'" "hoge.el")
=> 4
;; hoge.ell には当然マッチしない。ここまで同じ。
(string-match "\\.el\\'" "hoge.ell")
nil
;; おおっ!hoge.el の後ろが改行だとマッチしない!これか!
(string-match "\\.el\\'" "hoge.el
")
=> nil
```
Emacs-23.3a の Info に書いてあったけど、正直言って読んだだけでは分
からなかった。
34.3.1.1 Special Characters in Regular Expressions
```
`$'
is similar to `^' but matches only at the end of a line (or the
end of the accessible portion of the buffer). Thus, `x+$' matches
a string of one `x' or more at the end of a line.
When matching a string instead of a buffer, `$' matches at the end
of the string or before a newline character.
For historical compatibility reasons, `$' can be used only at the
end of the regular expression, or before `\)' or `\|'.
```
34.3.1.3 Backslash Constructs in Regular Expressions
```
`\''
matches the empty string, but only at the end of the buffer or
string being matched against.
```
--------------------------------------------------------------------------------
title: "シェアハウスに住んでそろそろ半年になるから、ちょっと自分の考えをまとめておこうか。"
date: "2011-10-15"
--------------------------------------------------------------------------------
[ギークハウス神戸](http://d.hatena.ne.jp/tomoya/20110520/1305908668) - いわゆるシェアハウスに住み始めてそろそろ半年になります。
シェアハウスではその名のとおり、いろんなものをシェアできたり、家賃や光熱費を節約できるのが良いです。
* 一人暮らしでは買うと余ってしまう食材(ニンニク、生姜、生ハム等)が買える。
* 個人的には、好きな時にペペロンチーノを作れるのは結構嬉しい。
* 一人暮らしではまず買わないものをシェア出来る。
* 例えばここには全自動エスプレッソマシーンがあるので、コーヒーが飲み放題。
* 家電をシェアできる。
* 今回私は供給者なので、メリットはまあ、ないけど。^^;
* 本(技術書や漫画)をシェアできる。
* 知識をシェアできる。毎日がミニミニ勉強会。
反面、他人と住むことになるので、やり方や考えに戸惑ったりイラっとすることもままあります。
逆に、今一緒に住んでいる人から見ると、私は細かいヤツと思われていると思います。まあ確かにそうで、平均以上に掃除とか片付けはやる方です。でも、一人暮らしの時は手を抜くことも多かったです。
洗い物を丸1日以上放置することはザラでしたし、ガスレンジは油でぐっちゃぐちゃ。掃除機は1週間に1回かけてましたが、トイレ掃除は月に1回、風呂掃除は年に1〜2回程度でした。
今は食べたらすぐに食器を洗って、ガスレンジは汚れる前に掃除。掃除機の頻度は同じ(本当は週2回にしたい)ですが、トイレ掃除は週1回やるように指示し、風呂掃除も月に1回くらいやってます。
なんで一人暮らしの時よりマメなのかというと、私はシェアハウスは自分の家ではないと思っているからです。
## シェアハウスは自分の家ではない
シェアハウスは、「プライベートな空間」と「パブリックな空間」に分けられますよね。
「プライベートな空間」は自分の部屋です。完全なるプライペートスペースです。火事や異臭、騒音を発生させなければどうぞご勝手に..と思っています。本当は全部屋に鍵を付けたいくらい。
「パブリックな空間」はリビングやキッチン、トイレ、風呂、玄関などの共用スペースです。言うまでもありませんが、ここは自分の部屋ではありません。
私はこの「パブリックな空間」が、同じ家でありながら自分の家ではないと思っています。
## 「パブリックな空間」での私的なルール
この記事を書くためにあれこれ考えていたわけですが、私は自分で "「パブリックな空間」での私的なルール" を決めて、実行していたことに気づきました。例えばこんな感じです。
(1) 使った食器やペットボトルはすぐ洗う。
→ 放置したら邪魔だし、もっと放置したら他の人に洗わせることになるからです。
(2) 私物は置かない。もしくは置きっぱなしにしない。
→ 他人から見ると、放置された私の物は邪魔以外何者でもないからです。
(3) よその家でやるべきでないことはシェアハウスでもやらない。
→トイレのドアを開けっ放しにしないとか...。(こんなのは無意識に出来るように、子供時代に躾けられないのかなあ。謎。)
(4) 食事を作ってくれる人には最大限の敬意を払う。
→ な〜んて書きましたが、まあ料理以外のことをしなくて済むように協力するってだけです。食器を拭いて作業スペース確保したりだとか、テーブル拭いたり箸並べたりするだとか。ルールって言うよりも、子供時代にさんざん手伝わされたので、そうしないと気持ち悪いって方が強いかな。
## パブリックな空間だと意識が変わる
以上のように「パブリックな空間」は自分の家ですらないと思っているので、自分の家だとサボりがちな掃除とか片付けも「面倒だけどやらないとなあ」と思いながらもやっています。大人にならないといけないわけですね。
最初のうちは、指示しないと動いてくれなかったり(※)、指示してもなかなかやらないことにイライラしてました。でも今は「人に求めてはいけない」なんて達観できるようになりました。もっともその辺に邪魔なものがいつまでも転がっていたりすると、やっぱりイライラはしますけどね。
(※) 指示する人になると分かると思いますが、指示するって、結構エネルギーや気を使うのですよね。なので、指示せず自分でやるものもあります。食材や消耗品の補充とか、共用タオルの洗濯、キッチンの掃除とか。
そういえば、玄関の靴はいつも誰かが整理してくれています。ここで言うのもなんですが、いつもありがとうございます。
## 終わりに
グチっぽい記事になることは分かっていましたが、自分の考えは知っておいて欲しいと思って敢えて書きました。これを機に「ギークハウス神戸」が進化していければ良いかなと思います。
## コラム - プログラマと整理整頓
ここでコラムとは。。。
これは私の持論ですが、整理整頓はコーディングに近い作業だと思います。似たようなものをグルーピングしたりだとか、こまめに整理、一定期間使わなかったら迷わず捨てるだとか。
「整理整頓を極めれば、プログラミングも極められるはず!」なんて妄想を抱きながら今日も整理整頓をしています。
--------------------------------------------------------------------------------
title: "GNU Screenの別Windowsのカレントディレクトリに移動するzshスクリプト、cddを直した"
date: "2011-10-12"
--------------------------------------------------------------------------------
[cdd - screen の別WINDOWのカレントディレクトリに移動する zsh スクリプト - coリ・ー・ン<2nd life](http://d.hatena.ne.jp/secondlife/20080218/1203303528)
結論から言うと結構便利です。GNU Screen を使っている zsh ユーザーは
是非お試しを。
私の環境では以下のエラーが発生するので、修正して gist にアップしま
した。(coderepos へのコミットの仕方が分からないし、人によっては必要
ない修正なので、gist にアップしました。)
- "unsetopt clobber"(既存のファイルへの上書きリダイレクト防止) を設
定していると 49 行目付近の "echo "\n" >> "$CDD_PWD_FILE"" がエラー
になる。
- $HOME/.zsh が存在しないとエラーになる。
あと、cdadd と cddel がそれぞれ _cdadd と _cddel でないと使えなかっ
たので、直しました。
{{< gist "masutaka" "1278571" >}}
**追記(2012-05-18):**
最近は使ってないというか、存在を忘れてますね〜。。
ところでこんな記事がありました。
[cdd を tmux, bash, multi session +α に対応した - カワイイはつくれる](http://m4i.hatenablog.com/entry/2012/01/26/064329)
--------------------------------------------------------------------------------
title: "Emacsデフォルトの機能で改行やタブ、スペースを色づけできるようになってた"
date: "2011-10-12"
--------------------------------------------------------------------------------
今回も、弊社で毎日行われている、ミニミニ Emacs 勉強会で {{< twitter "tomoyaton" >}} から教えてもらいました。
Emacs23 からは M-x global-whitespace-mode すると、改行やタブ、スペースを色づけできるようになってます。常に表示させるには ~/.emacs に以下を書けば OK です。
```elisp
(global-whitespace-mode 1)
```
でも私は改行と全角スペースだけ色付けすればよいので、上記に加えて下記も設定することにしました。
```elisp
;; スペースの定義は全角スペースとする。
(setq whitespace-space-regexp "\x3000+")
;; 改行の色を変更
(set-face-foreground 'whitespace-newline "gray40")
;; 半角スペースと改行を除外
(dolist (d '((space-mark ?\ ) (newline-mark ?\n)))
(setq whitespace-display-mappings
(delete-if
'(lambda (e) (and (eq (car d) (car e))
(eq (cadr d) (cadr e))))
whitespace-display-mappings)))
;; 全角スペースと改行を追加
(dolist (e '((space-mark ?\x3000 [?\□])
(newline-mark ?\n [?\u21B5 ?\n] [?$ ?\n])))
(add-to-list 'whitespace-display-mappings e))
;; 強調したくない要素を削除
(dolist (d '(face lines space-before-tab
indentation empty space-after-tab tab-mark))
(setq whitespace-style (delq d whitespace-style)))
```
※ `delete-if()` 使っているので、あらかじめ `(require 'cl)` する必要があります。
--------------------------------------------------------------------------------
title: "第4回関西Emacsに参加&発表してきました"
date: "2011-10-11"
--------------------------------------------------------------------------------
[= (kansai-emacs #x04) ;=> "第四回関西Emacs勉強会" - ぺっくブログミラー@peccul](http://d.hatena.ne.jp/peccu/20111004/kansai_emacs_4th)
先月の福岡Emacs {{< post "2011-09-28-1" >}} に引き続き、関西Emacsに参加&発表し
てきました。今年の 4 月に行われた第 3 回に出席したこともあり、結構
リラックスして望むことが出来ました。
会場ははてなの京都本社です。ほとんどガラス張りで、風通しの良い会社
の印象を受けました。
{{< figure src="/images/hatena_vs_kansai-emacs.jpg" link="http://www.i4pc.jp/photo/259348337_1009147" target="_blank" rel="noopener" alt="画像" >}}
まずはいつもどおり、ポジションペーパーを使った自己紹介。
{{< slideshare "IoVAlmctV4MBz3" >}}
休憩をはさんで発表開始です。福岡 Emacs より、マニアックな発表者が多
めの印象でした。みなさん Emacs が好きなんですね〜。
{{< twitter "hitode909" >}} さんや {{< twitter "kozo2" >}} さんが紹介した [smartchr.el](http://tech.kayac.com/archive/emacs-tips-smartchr.html) は便利ですね。
こんな設定をすると、M を 1 回打つと普通の "M"、2 回打つと "増田です。"
に切り替わります。でも、"=" を " = " にするのは私にはちょっと合わな
いかも。気が向いたらまた設定します。
```elisp
(define-key global-map (kbd "M") (smartchr '("M" "増田です。")))
```
[dmacro.el](http://www.pitecan.com/papers/JSSSTDmacro/dmacro.el) もその場でインストール。なんでインストールしてなかったの
かなあ?謎。
私も [twittering-mode.el](http://twmode.sourceforge.net/ja/) の布教活動をしてきました。半分以上の出席者がす
でに使っていましたが、その場でインストールして試す人もいて、初回と
しては成功だったのかなと思います。繰り返しますが、Emacs を使えるよ
うになりたければ、**よく使うサービスを Emacs で使うのが一番の近道**です。
{{< slideshare "uWVH1VCoXOtri" >}}
懇親会は会場と同じ場所で、ピザと寿司とビール。ワールドカフェの影響
なのか、会場と同じ場所が功を奏したのか、結構盛り上がって Emacs 談義
に花を咲かせることが出来ました。
{{< twitter "peccul" >}} さん、運営諸々お疲れ様でした。ありがとうございました。
{{< twitter "nitro_idiot" >}} さん、忘れ物して手間をかけさせてしまってゴメンナサイ!
P.S.
はてなは Twitter のホワイトリストに入っているらしく、会場内では
API 残り数が 20,000 でした。はてなすげ〜
--------------------------------------------------------------------------------
title: "migemo の Formula を作った"
date: "2011-10-10"
--------------------------------------------------------------------------------
[migemo](http://0xcc.net/migemo/) の Formula を作りました。本来であれば、pull request 送るもの
だと思いますが、日本語に特化したツールのリクエストを送って良いか判
断が付かなかったので、とりあえず gist に上げました。
{{< gist "masutaka" "1274072" >}}
/usr/local/Library/Formula 以下に上記 Formula をコピーしたら、
"brew install migemo" するだけでインストールできます。
あとは以下を設定するだけです。
```
# ~/.zshenv
export RUBYLIB=/usr/local/lib/ruby
```
```elisp
;; ~/.emacs
(require 'migemo)
```
**追記(2011-11-26):**
[pull request を送りました。](https://github.com/mxcl/homebrew/pull/8786)気長に待ちます。
**追記(2011-11-28):**
却下されました。migemo の Formula が depends_on 'emacs' なことと、
ruby-(bsearch|romkan) が gems に存在するためとのこと。
--------------------------------------------------------------------------------
title: "Emacs で 5 秒間何もしないと、カレント行をハイライトさせる"
date: "2011-10-06"
--------------------------------------------------------------------------------
{{< twitter "tomoyaton" >}} からの耳より情報。
ちょっと席を立って戻ってきた時に、カーソル位置がすぐに分かります。
常にハイライトじゃないので、邪魔にならないのがよいです♪
カーソルを見失いがちな [twittering-mode.el](http://twmode.sourceforge.net/ja/) との組み合わせが良い感じです。
```elisp
(require 'hl-line+)
(toggle-hl-line-when-idle)
```
hl-line+.el は [auto-install.el](http://d.hatena.ne.jp/rubikitch/20091221/autoinstall) とかでインストールすると良いでしょう。
5 秒を 3 秒に変えたい場合は、この設定で OK
```elisp
(setq hl-line-idle-interval 3)
```
色を変えたい場合は、こんな感じ。色の種類は M-x list-colors-display
で確認できます。
```elisp
(set-face-background 'hl-line "Yellow")
```
他にも色々 hl-line+.el に書いてあります。
--------------------------------------------------------------------------------
title: "『あしたのジョー』を観た"
date: "2011-09-30"
--------------------------------------------------------------------------------
{{< amazon "B0051CGVB4" >}}
原作は見たことないんだけど、香川さんの段平を見たくて観た。
時系列がかなり崩されていた気がするけど、どうなんだろう?
伊勢谷さんの軽量シーンはぜったい CG だろと思ったらガチだった。すげ〜
山下君の体の作り込みもハンパないっす。
でも一番の見せ場は段平がサンドバック叩くシーンで決まり(笑)。堂に入っ
ています。
--------------------------------------------------------------------------------
title: "Redmine-1.2.1 にインストールしたプラグインやテーマ達"
date: "2011-09-30"
--------------------------------------------------------------------------------
自分用のメモです。ruby-enterprise-1.8.7-2011.03 をインストールした
CentOS-5.6 上で Redmine-1.2.1 を動かしてます。
→[Redmine 1.2をCentOS5.6にインストールする手順 | Redmine.JP Blog](http://blog.redmine.jp/articles/redmine-1_2-installation_centos/)
## インストールしたプラグイン
### [action_mailer_optional_tls](http://d.hatena.ne.jp/rx7/20100526/p1)
Ruby-1.8 では TLS を使ったメール送信をサポートされていないので、
Gmail から SMTP 送信したい場合は必須。インストールして動作確認まで
したが、今は使ってない。
### [ics export](http://d.hatena.ne.jp/n314/20110121/1295602362)
Google カレンダーに Redmine のチケットを表示できるプラグイン。イン
ストールすると、チケット、ガントチャート、カレンダーに iCalendar の
URL が表示される。便利。
iCalendar のフォーマットは管理→プラグインから変更できる。
私は Issue rendering as を full time event にした。
例によって Google カレンダーは fetch が遅いので、可能ならカレンダー
アプリに直接 iCalendar の URL を登録した方がよい。iPhone にはなぜか
登録できなかった。なぜだ!?
### [Code Review](http://www.r-labs.org/projects/r-labs/wiki/Code_Review)
push された commit に対して、コードレビューできるプラグイン。
```
# (cd vendor/plugins && unzip redmine_code_review-0.4.3.zip)
# chown -R apache:apache vendor/plugins/redmine_code_review
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
### [Gompertan](http://chocoapricot.cocolog-nifty.com/blog/2008/08/redmine_3_ca3c.html)
メニューバーの「チケット推移」から、{{< wikipedia word="信頼度成長曲線" text="ゴンペルツ曲線" >}}を確認できる。
```
# (cd vendor/plugins && unzip gompertan_plugin-foxtrot-100914.zip)
# chown -R apache:apache vendor/plugins/gompertan_plugin
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
### [ニコニコカレンダー](https://github.com/YukiKita/redmine_niko_cale)
メニューバーの「ニコカレ」から、メンバーのその日の気分や体調を
確認&記録できるプラグイン。日本語でコメントすると文字化けする。。
```
# /usr/local/ruby-enterprise/bin/ruby script/plugin install git://github.com/YukiKita/redmine_niko_cale.git
# chown -R apache:apache vendor/plugins/redmine_niko_cale
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
### [Good Job](http://d.hatena.ne.jp/changeworld/20110512/1305203512)
完了したチケットに、"Good Job!" の Water Mark を付けるだけのプラグ
イン。チームの士気向上に役に立つ?
```
# mkdir vendor/plugins/redmine_good_job
# cd vendor/plugins/redmine_good_job
# unzip redmine_good_job-0.0.1.1.zip
# chown -R apache:apache .
# cd ../../..
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
### [Hudson](http://www.r-labs.org/projects/r-labs/wiki/Hudson)
Jenkins(旧名 Hadson) と連携するプラグイン。
```
# /usr/local/ruby-enterprise/bin/ruby script/plugin install http://r-labs.googlecode.com/svn/trunk/plugins/redmine_hudson/
# chown -R apache:apache vendor/plugins/redmine_hudson
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
ジョブの詳細表示の日本語が全て ??? になります。
[Jenkins 側に問題があるようですが、未だ直らないようです。](http://groups.google.com/group/redmine-users-ja/browse_thread/thread/60a3c9395f2f20a0?pli=1)
### [Task Board](https://github.com/daipresents/redmine_task_board)
選択したバージョンのチケットを「かんばん」っぽく表示してくれるプラ
グイン。ロードマップを使っていれば、インストールするのがオススメ。
```
# /usr/local/ruby-enterprise/bin/ruby script/plugin install git://github.com/daipresents/redmine_task_board.git
# chown -R apache:apache vendor/plugins/redmine_task_board
# /etc/init.d/httpd graceful
```
### [Wiki Extensions](http://www.r-labs.org/projects/r-labs/wiki/Wiki_Extensions)
Redmine の Wiki を使うなら、これは絶対入れた方がよい。チケットや
Wiki の自動プレビュー機能もある。コメントを書き込むと文字化けるのは残念。
```
# (cd vendor/plugins && unzip redmine_wiki_extensions-0.3.8.zip)
# chown -R apache:apache vendor/plugins/redmine_wiki_extensions
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
### [Drafts](http://www.r-labs.org/projects/r-labs/wiki/Drafts_plugin)
書きかけのチケット(新規作成or更新)を自動保存してくれます。うっかり
ページ移動してしまったり、ブラウザがクラッシュしたりして、ドラフト
がパーになった経験のある人はインストールした方がよいでしょう。イン
ストールするだけで使えます。設定不要です。
```
# /usr/local/ruby-enterprise/bin/ruby script/plugin install git://github.com/jbbarth/redmine_drafts.git
# chown -R apache:apache vendor/plugins/redmine_drafts
# /usr/local/ruby-enterprise/bin/rake db:migrate_plugins RAILS_ENV=production
# /etc/init.d/httpd graceful
```
### その他
[redmine_workflow_viz](https://github.com/suer/redmine_workflow_viz) もインストールしたかったけど、
># /usr/local/ruby-enterprise/bin/gem install rmagick
したら Magick-config を要求されたので
># yum install ImageMagick-devel.i386
したら ImageMagick 6.4.9 以上を要求されたので、面倒になり終了。
## インストールしたテーマ
### [日本語環境で読みやすい Redmine 用テーマ「farend basic」](http://blog.redmine.jp/articles/farend-basic-theme/)
そのまんま。チケット表示一覧を色分けして表示してくれたりもする。
```
# cd public/themes
# tar xzf redmine_theme_farend_basic_20110523.tgz
# chown -R apache:apache farend_basic
```
## 今後やりたいこと
- チケットにタグを付けられるようにする。
- 担当でないチケットの更新を禁止する。
## 参考 URL
[Redmineに入れたプラグイン一覧part3: プログラマの思索](http://forza.cocolog-nifty.com/blog/2011/05/redminepart3-cb.html)
[Redmineに入れたプラグイン一覧part2: プログラマの思索](http://forza.cocolog-nifty.com/blog/2011/04/redminepart2-cf.html)
[Redmineに入れたプラグイン一覧: プログラマの思索](http://forza.cocolog-nifty.com/blog/2010/01/redmine-5fd1.html)
[r-labs - 概要 - Redmine](http://www.r-labs.org/)
**追記(2012-01-08):**
Hudson Plugin を追加しました。
**追記(2012-02-20):**
Wiki Extensions Plugin を追加しました。
--------------------------------------------------------------------------------
title: "ターミナルの zsh と Emacs を風のように駆け抜ける!"
date: "2011-09-28"
--------------------------------------------------------------------------------
[福岡Emacs](http://atnd.org/events/19653) 行ってきました!
Mew 関係者がお二人({{< twitter "nom4476" >}} {{< twitter "moepanda" >}})もいらっしゃったり、Vim 使い
が 1/3 くらい占めていて案外新鮮だったり、[ワールドカフェ](http://world-cafe.net/about-wc.html)という対話手
法に感心したり(残念ながら時間切れで途中で退席しましたが)で、とって
も楽しかったです!
嬉しかったことは {{< twitter "moepanda" >}} さんにお会いできたことと、{{< twitter "nom4476" >}} さん
が「このブログ読んでますよ」と仰ってくれたこと。うれしはずかし...(*^^*)
私も「[Langrich社でのEmacs活用、langrich.el](http://www.slideshare.net/masutaka/3emacs-9633070)」というお題でデビューを
飾ることが出来ました。8888
それぞれの発表も面白かったのですが、一番気になったのが発表の中でど
なたかが、ターミナルの現在のディレクトリを dired で開いたり、Emacs
の現在のバッファに対応するディレクトリをターミナルで開いたりしてい
たことでした。
どなたか忘れてしまったのですが、試しにツイートしてみたら {{< twitter "nom4476" >}}
さんが gist に置いてくださいました。
{{< tweet user="nom4476" id="118573856742047744" >}}
Gist のコードはこちら。
{{< gist "yoshinari-nomura" "1244467" >}}
かる〜く解説。
- dired()
ターミナル上の zsh で dired とタイプすると、現在のディレクトリを
dired で開いてくれます。
- cde()
同じく cde とタイプすると、Emacs の現在のバッファに対応するディレク
トリをターミナル上の zsh で開いてくれます。
※ emacsclient 使っているので、~/.emacs とかに (server-start) を書
いておく必要があります。
でも elscreen 使っていると、cde() が動きません。elscreen が frame
情報を書き換えているためのようです。なんとしてでも動かしたかったの
で、風邪をおして(笑)頑張ってハックしました。
ついでに {{< twitter "Dubhead" >}} さんの修正も dired() に含めました。("dired .." と
か "dired usr/local" とか出来るようになります。)
{{< gist "masutaka" "1245509" >}}
合わせて [Quicksilver](http://www.blacktree.com/) の Triggers を使えば、dired() や cde() した後
に簡単にフォーカスを切り替えられます。
関連 URL (?) :
[風になりたい奴だけが Emacs を使えばいい。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20100904/1283563254)
**追記(2011-10-10):**
kiwanami さんのブログが更新されたので、追記します。
[fukuoka-emacs 0x03 やりました - 技術日記@kiwanami](http://d.hatena.ne.jp/kiwanami/20111001/1317455091)
**追記(2011-10-11):**
私を含めた全員分のポジションペーパーは [google docs にあります。](https://docs.google.com/present/view?id=dhn2grhk_2f89kzzck)
**追記(2011-10-27):**
{{< twitter "syohex" >}} さんがもう少し厳密に取り出すように改良してくれました。
[cdeを改良 - Life is very short](http://d.hatena.ne.jp/syohex/20111026/1319606395)
--------------------------------------------------------------------------------
title: "『荒木飛呂彦の奇妙なホラー映画論』を読んだ"
date: "2011-09-14"
--------------------------------------------------------------------------------
{{< amazon "4087205959" >}}
こんな本が出てたとは。。。
荒木先生が影響を受けた約 100 本のホラー映画を、先生御自ら解説してい
る。荒木飛呂彦ファンまたはホラー映画ファンなら読むべし。
私はホラー映画ファンではないけれども、ジョジョのあのシーンはこの映
画を参考にしたのかな?などと想像しながら読めたので楽しかった。バオー
来訪者の話もちょろっと出てたよ。
そして最後の締めがまた素晴らしかった。ブラボー! おお…ブラボー!!
--------------------------------------------------------------------------------
title: "Twitter で公式 RT の数が 100 を超えたツイートの、ユーザ一覧を取得する方法"
date: "2011-09-06"
--------------------------------------------------------------------------------
**追記(2012-06-17):**
[今はユーザ数は普通に表示される](https://jp.techcrunch.com/2012/06/17/2012061650-retweets-count/)ようになりました。ユーザ一覧は API 使わないと取得できません。
---
公式 RT の数が 100 を超えると、http://twitter.com/ ではユーザ一覧は
おろか、数も分からなくなります。
http://favstar.fm/ では一見取得できていそうですが、漏れがあることが
ありますし、テキストのユーザ一覧を取得するのは面倒そうです。
いろいろ調べた結果、以下の方法が良さそうです。(もっと良い方法があれ
ば教えて下さい。)
## 1. TweetID を確認
http://twitter.com/curiousir/status/105930346717126656
この場合は 105930346717126656 です。
## 2. ユーザ一覧を取得
Twitter でログインした状態で、以下の URL にアクセスすると
公式 RT した、100 名までのアカウント情報を取得できます。
http://api.twitter.com/1/statuses/105930346717126656/retweeted_by.xml?count=100&page=1
page を増やしていけば、101 名以上も取得できます。
http://api.twitter.com/1/statuses/105930346717126656/retweeted_by.xml?count=100&page=2
上の例では公式 RT の数が 175 なので、page=3 はありません。
また、count の Max 値は 100 です。それ以上は指定できません。
## 3. screen_name の抽出
あとは適当に screen_name を抽出して下さい。
masutaka
参考 URL:
[GET statuses/:id/retweeted_by | Twitter Developers](https://dev.twitter.com/docs/api/1/get/statuses/%3Aid/retweeted_by)
http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt
--------------------------------------------------------------------------------
title: "Emacs For Mac OS X に ElScreen と APEL をインストールする方法"
date: "2011-09-04"
--------------------------------------------------------------------------------
インターン生~~に無理矢理~~が Emacs を使い始めました。
タブ機能を使いたいとのことだったので、[ElScreen](http://www.morishima.net/~naoto/elscreen-ja/) をインストールしても
らおうとしたら、[APEL](http://kanji.zinbun.kyoto-u.ac.jp/~tomo/elisp/APEL/) が必要でした。インストール方法を一言で説明する
のは難しいので、彼向けのブログ記事を書くことにしました。
Emacs は [GNU Emacs For Mac OS X](http://emacsformacosx.com/) からダウンロードしたものを使ってい
ます。
## 1. APEL のダウンロード
http://kanji.zinbun.kyoto-u.ac.jp/~tomo/elisp/APEL/ から APEL-10.8
をダウンロードします。
## 2. APEL の展開とインストール
以下のとおりにコマンドを打てば、インストール出来ると思います。
```
% tar xvzf apel-10.8.tar.gz
% cd apel-10.8
% make PREFIX=$HOME/.emacs.d EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs LISPDIR=$HOME/.emacs.d/elisp VERSION_SPECIFIC_LISPDIR=$HOME/.emacs.d/elisp23
% make PREFIX=$HOME/.emacs.d EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs LISPDIR=$HOME/.emacs.d/elisp VERSION_SPECIFIC_LISPDIR=$HOME/.emacs.d/elisp23 install
% (cd $HOME/.emacs.d/elisp && mv apel .apel-10.8 && ln -s .apel-10.8 apel)
% (cd $HOME/.emacs.d/elisp23 && mv emu .apel-10.8 && ln -s .apel-10.8 emu)
```
## 3. ElScreen のダウンロード
http://www.morishima.net/~naoto/elscreen-ja/ から elscreen-1.4.6 を
ダウンロードします。
## 4. ElScreen の展開とインストール
ElScreen のインストールは簡単です。
```
% cd $HOME/.emacs.d/elisp
% tar xvzf elscreen-1.4.6.tar.gz
% mv elscreen-1.4.6 .elscreen-1.4.6
% ln -s .elscreen-1.4.6 elscreen
```
## 5. ~/.emacs の設定
~/.emacs に以下を追記します。
```elisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Path
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst my-elisp-directory "~/.emacs.d/elisp" "The directory for my elisp file.")
;; 指定したディレクトリリスト以下を load-path に追加。
(dolist (dir (let ((dir (expand-file-name my-elisp-directory)))
(list dir (format "%s%d" dir emacs-major-version))))
(when (and (stringp dir) (file-directory-p dir))
(let ((default-directory dir))
(add-to-list 'load-path default-directory)
;; カレントディレクトリ以下全て load-path に追加する。
;; パスを通したくないディレクトリには、.nosearch という
;; ファイルを置く。ディレクトリ RCS と CVS は追加しない。
(normal-top-level-add-subdirs-to-load-path))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ElScreen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'elscreen)
```
--------------------------------------------------------------------------------
title: "『もののけ姫』と『塔の上のラプンツェル』を観た"
date: "2011-09-04"
--------------------------------------------------------------------------------
{{< amazon "B00005Q4I3" >}}
ちょっと前に観たので、感想を忘れてしまった。。。
みんな頑丈だなあという印象が残ったくらい。。。
{{< amazon "B004LKRQ84" >}}
むかーし、グリム童話か何かで読んだことがあり、懐かしさのあまり観る
ことにした。話題にもなってたしね。で、感想。
- 髪の毛活躍しすぎ。
- CG リアリティありすぎ。
ミュージカル要素も入っているから、日本語化大変だったんだろうな。
ラプンツェルの声は{{< wikipedia word="中川翔子" text="しょこたん" >}}がやってた。なるほど〜
自然で悪くなかった。
原作はもっとグロいストーリーだったよなあと調べてみたら、案の定そう
だった。結構キツイ。
{{< wikipedia word="ラプンツェル" text="ラプンツェル - wikipedia" >}}
--------------------------------------------------------------------------------
title: "ワインメモ「シャトー・レ・モーラン」"
date: "2011-09-01"
--------------------------------------------------------------------------------
{{< figure src="/images/wine-maurins.jpg" link="http://www.doshisha-liquor.jp/wine/item/log/eid87.html" target="_blank" rel="noopener" alt="画像" >}}
シャトー・レ・モーラン
原産国: フランス
フィリピンに持って行って、{{< twitter "maru_yohei" >}} とおいしく飲んだ。
今回は辛口。このくらい辛いのも好き。安い割においしかった。
てか、牛タンを丸ごと買って、{{< twitter "maru_yohei" >}} が捌いてくれたことの方が
強烈に印象に残っているw
--------------------------------------------------------------------------------
title: "『フィリピン「超」格安英語留学』を読んだ"
date: "2011-08-20"
--------------------------------------------------------------------------------
{{< amazon "4492044310" >}}
いやあ、面白い本でした。うちの CEO からフィリピンに持って来てと頼ま
れて買って読んだのがきっかけです。この本の存在は知ってましたが、最
近出たばかりだったのですね。著者も 1985 年生まれと若い!
先日フィリピン留学スクールを始めた会社に在籍している私ですら、フィ
リピン留学に行きたいとさえ思いました。(マジで行くかもw)
[セブ・ラングリッチカレッジ](http://langrich.com/studyabroad)
特に転職を考えている人は、次の会社に入る前にフィリピン留学を検討し
た方が良いでしょう。社会人になってからまとまった自由な時間を取れる
時は、そうありません。
考えていない人でも、今は格安のオンライン英会話スクールがありますか
ら、ちょっと勇気を出して始めてみるのはいかがでしょうか。一歩踏み出
すと、違った世界が広がるかもしれませんよ。
[ラングリッチ - オンライン英会話](http://langrich.com/)
さて本の中では、一般的なフィリピン留学のデメリットも取り上げられて
います。
- スクールの食事が美味しくない。
- 宿泊先が汚い。
- 留学前に聞いていたのと話が違う。
贔屓目に見ることを差し引いても、セブ・ラングリッチカレッジは全てを
クリアしていると思われます。
- 食事は 3 食、日本食。
- 宿泊先はまあまあきれいなコンドミニアム。しかも 24 時間ガードマン常駐。
- 留学エージェントを介さないので、リアルタイムの情報を得られる。
講師を指名することもできるのは、オンライン英会話ラングリッチの生徒
さんにとって、うれしいことですね。私は元々ラングリッチの生徒で今は
運営側の人間ですが、セブに見学に来た時に先生と対面でレッスンを受け
られた時は激しく感動しました。
本の中であまり触れられていないのが不思議なのですが、留学前にオンラ
イン英会話で少しは英語に慣れておくことを強くオススメします。そんな
状態でフィリピンまで一人で行くのは、とっても不安に感じると思います
から。。。(行き先がセブの場合、LCC (格安航空会社)のセブ・パシフィッ
ク航空を使うと、マニラでの乗り換えが必要です。)
その他関連リンク:
[ラングリッチ公式ブログ-オンライン英会話|オンラインで学べる最高の英会話スクール](http://blog.langrich.com/)
[ラングリッチのフィリピン留学スクール出来ました。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20110813/1313188104)
--------------------------------------------------------------------------------
title: "『島田紳助100の言葉』を読んだ"
date: "2011-08-20"
--------------------------------------------------------------------------------
{{< amazon "4847019768" >}}
帰省した時に親が絶賛してたので、試しに読んでみました。さらっと読め
て良かったです。成功者が語る言葉には、共通するものがありますね。
--------------------------------------------------------------------------------
title: "Emacs で対応している画像タイプを確認する方法"
date: "2011-08-12"
--------------------------------------------------------------------------------
個人的なメモです。
```elisp
(mapcar (lambda (type) (cons type (image-type-available-p type))) image-types)
=> ((png . t) (gif . t) (tiff . t) (jpeg . t) (xpm . t) (xbm . t) (pbm . t))
```
[Togetter - 「twittering-mode でアイコンが出なかった件」](http://togetter.com/li/87167)
--------------------------------------------------------------------------------
title: "Lion で Emacs-23.3 をソースからビルド出来ない件を解決できた"
date: "2011-07-31"
--------------------------------------------------------------------------------
Lion にバージョンアップしたら {{< post "2011-03-10-1" >}} の方法でビルド出来なく
なってしまいました。
Macports とか Homebrew の情報はあったのですが、「ソースからビルド」
の情報は見つけられなかったので、ここにまとめます。
パッチは 3 つ必要でした。
1. [patch-no-pie.diff](https://trac.macports.org/attachment/ticket/30268/patch-no-pie.diff)
2. [patch-src_unexmacosx.c.diff](http://repo.or.cz/w/emacs.git/commitdiff_plain/c8bba48c5889c4773c62a10f7c3d4383881f11c1)
3. [patch-fix-title-bar.diff](https://trac.macports.org/attachment/ticket/30268/patch-fix-title-bar.diff)
1 と 2 がビルドを通すために必要です。パッチを当てないとこんなエラー
ログを吐いてビルドに失敗します。
```
Dumping under the name emacs
unexec: unrecognized section name in __DATA segment
--- List of All Regions ---
address size prot maxp
--- List of Regions to be Dumped ---
address size prot maxp
--- Header Information ---
Magic = 0xfeedfacf
CPUType = 16777223
CPUSubType = -2147483645
FileType = 0x2
NCmds = 20
SizeOfCmds = 3464
Flags = 0x00200085
Highest address of load commands in input file: 0x5f4000
Lowest offset of all sections in __TEXT segment: 0x14b0
--- List of Load Commands in Input File ---
# cmd cmdsize name address size
0 LC_SEGMENT_64 72 __PAGEZERO 0 0x100000000
1 LC_SEGMENT_64 712 __TEXT 0x100000000 0x1d3000
__text 0x1000014b0 0x18e9aa
__stubs 0x10018fe5a 0x61e
__stub_helper 0x100190478 0xa44
__const 0x100190ec0 0x9b4
__cstring 0x100191878 0x17266
__gcc_except_tab 0x1001a8ae0 0x40
__unwind_info 0x1001a8b20 0x1d98
__eh_frame 0x1001aa8b8 0x28740
2 LC_SEGMENT_64 1512 __DATA 0x1001d3000 0x367000
__program_vars 0x1001d3000 0x28
__nl_symbol_ptr 0x1001d3028 0x10
__got 0x1001d3038 0x1a0
__la_symbol_ptr 0x1001d31d8 0x828
__objc_classlist 0x1001d3a00 0x70
__objc_protolist 0x1001d3a70 0x10
__objc_imageinfo 0x1001d3a80 0x8
__objc_const 0x1001d3a88 0x21d0
__objc_selrefs 0x1001d5c58 0xe38
__objc_msgrefs 0x1001d6a90 0xf0
__objc_classrefs 0x1001d6b80 0x1f0
__objc_superrefs 0x1001d6d70 0x60
__objc_data 0x1001d6dd0 0x460
__data 0x1001d7240 0x2f5f18
__const 0x1004cd160 0x2020
__cfstring 0x1004cf180 0x640
__bss 0x1004cf7c0 0x59518
__common 0x100528ce0 0x10959
3 LC_SEGMENT_64 72 __LINKEDIT 0x10053a000 0xba000
4 LC_DYLD_INFO_ONLY 48
5 LC_SYMTAB 24
6 LC_DYSYMTAB 80
7 LC_LOAD_DYLINKER 32
8 LC_UUID 24
9 unknown 16
10 LC_UNIXTHREAD 184
11 LC_LOAD_DYLIB 88
12 LC_LOAD_DYLIB 56
13 LC_LOAD_DYLIB 56
14 LC_LOAD_DYLIB 56
15 LC_LOAD_DYLIB 104
16 LC_LOAD_DYLIB 104
17 LC_LOAD_DYLIB 112
18 LC_LOAD_DYLIB 96
19 unknown 16
0x7fa2024fc080 (sz: 0x3f2d/ 0x3f30)
0x7fa202400000 (sz: 0xfc07f/ 0xfc080)
0x7fa2026fc080 (sz: 0x3f2c/ 0x3f30)
0x7fa202600000 (sz: 0xfc07f/ 0xfc080)
0x7fa2038fc080 (sz: 0x3f2d/ 0x3f30)
0x7fa203800000 (sz: 0xfc060/ 0xfc080)
0x7fa2025fc080 (sz: 0x3f2c/ 0x3f30)
0x7fa202500000 (sz: 0xfc07e/ 0xfc080)
0x7fa203cfc080 (sz: 0x3f2c/ 0x3f30)
0x7fa203c00000 (sz: 0x639f/ 0xfc080)
0x7fa204ff8000 (sz: 0x138/ 0x7fa8)
0x7fa204800000 (sz: 0x10dbe/0x7f8000)
0x7fa2037f8000 (sz: 0x728a/ 0x7fa8)
0x7fa203000000 (sz: 0x725fff/0x7f8000)
0x1093f1000 (sz: 0/ 0x1000)
--- Load Commands written to Output File ---
Writing segment __PAGEZERO @ 0 ( 0/0x100000000 @ 0)
Writing segment __TEXT @ 0 (0x1d3000/0x1d3000 @ 0x100000000)
Writing segment __DATA @ 0x1d3000 (0x367000/0x367000 @ 0x1001d3000)
section __program_vars at 0x1d3000 - 0x1d3028 (sz: 0x28)
section __nl_symbol_ptr at 0x1d3028 - 0x1d3038 (sz: 0x10)
make[1]: *** [bootstrap-emacs] Error 1
make: *** [src] Error 2
```
3 を当てなくてもビルドは通りますが、下の図のようにタイトルバーが消
えるので、サイズ変更や移動が出来なくなります。実質使えませんね。
{{< figure src="/images/emacs-startup-s.jpg" link="https://trac.macports.org/raw-attachment/ticket/30268/emacs-startup.jpg" target="_blank" rel="noopener" alt="画像" >}}
必要なパッチが揃ったら、あとは簡単です。{{< post "2011-03-10-1" >}} のビルド手順
を Lion 対応版にしたものが以下になります。
```
% wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.3.tar.bz2
% tar xjf emacs-23.3.tar.bz2
% cd emacs-23.3
% patch -p0 < ../patch-no-pie.diff
% patch -p1 < ../patch-src_unexmacosx.c.diff
% patch -p0 < ../patch-fix-title-bar.diff
% mkdir ../work; cd ../work
% ../emacs-23.3/configure --with-ns --without-x 2>&1 | tee ../emacs-23.3_configure.log
% cp config.log ../emacs-23.3_config.log
% make 2>&1 | tee ../emacs-23.3_make.log
% make GZIP_PROG="" install 2>&1 | tee ../emacs-23.3_make-install.log
% cp -r nextstep/Emacs.app /Applications/Emacs-23.3.app
```
※1 patch-fix-title-bar.diff のパッチ当ては失敗すると思いますが、
src/Changelog なので無視して良いです。
※2 $CC, $CFLAGS, $LDFLAGS は設定する必要はありません。
※3 使用した gcc は /usr/bin/gcc です。私は /Developer/usr/bin に
パスを通していません。どんな時に必要なんでしょう?
参考情報:
[#30268 (emacs-app @23.3 fails to build on Lion ("unexec: cannot write section __data")) – MacPorts](https://trac.macports.org/ticket/30268)
[Library/Formula/emacs.rb at master from mxcl/homebrew - GitHub](https://github.com/mxcl/homebrew/blob/master/Library/Formula/emacs.rb)
**追記(2011-08-01):**
よく落ちるので Homebrew の Emacs を使うことにしました。何かパッ
チが足りないのかも。。。↓こちらをご参考下さい。
[[brew][lion] OS X Lionにhomebrewでemacsとかをインストール - SOSOG](http://d.hatena.ne.jp/yosisa/20110731)
Homebrew の使い方は {{< post "2011-07-26-1" >}} にまとめています。
--------------------------------------------------------------------------------
title: "ワインメモ「カルムネール・レセルバ」"
date: "2011-07-31"
--------------------------------------------------------------------------------
ワインって、なかなか名前覚えられないよね。
ってことでメモメモ。
{{< figure src="/images/wine-carmenere.jpg" link="http://www.inaba-wine.co.jp/search/product/detail.php?id=W032" target="_blank" rel="noopener" alt="画像" >}}
カルムネール レセルバ
原産国: チリ
コクがあり、ほどよい甘さのワインで美味しかった。
次は辛口のワインが飲みたいな。
--------------------------------------------------------------------------------
title: "Macports から Homebrew への移行と、Homebrew の使い方まとめ"
date: "2011-07-26"
--------------------------------------------------------------------------------
Macports {{< post "2011-01-27-1" >}} は便利と言えば便利なのですが、パッケージに
依存関係があると、既に /usr/bin とかにインストール済みのコマンドで
も構わずインストールしてしまいます。
同じコマンドが複数存在することになり気持ち悪いですし、何よりインス
トールに時間がかかるので、評判のよい [Homebrew](http://brew.sh/) に移行することにしま
した。
Homebrew のインストール方法は [Installation - GitHub](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#installation) をご覧下さい。
Homebrew は /usr/local 以下にインストールされます。そのため、root
権限がなくても staff group に所属してさえいれば、各種 Formula(=パッ
ケージ) をインストールできます。
私がよく使いそうなコマンドはこんな感じです。詳細は "man brew" してね。
- Homebrew 自身のアップデート
|% brew update
- インストール済みの Formula で最新でないものを確認。
|% brew outdated
- インストール済みの Formula の一括アップデート
|% brew upgrade
- Formula を検索する
|% brew search
- Formula の情報を得る
|% brew info
- Formula をインストールする
|% brew install
- Formula をアンインストールする
|% brew remove
- インストールしてある Formula をすべて表示
|% brew list
"brew update" は内部で "git pull" 相当のことをやっているだけです。
うーん、シンプル。
Formula は ruby で書かれており、Formula の知識がなくても何となく分
かるくらい平易です(例: /usr/local/Library/Formula/wget.rb)。他のパッ
ケージ管理システムに比べると、カスタマイズの敷居がめちゃめちゃ低い
ですね。
インストール後の配置もまたシンプルで素晴らしいです。
wget-1.12 の場合は prefix を /usr/local/Cellar/wget/1.12/wget にし
て make install しています。で、/usr/local/bin に置くのはシンボリッ
クリンクだけ。
|/usr/local/bin/wget -> ../Cellar/wget/1.12/bin/wget
|/usr/local/Cellar/wget/1.12/wget/bin/wget
余談になりますが、以前 Solaris9 環境の管理者をしていた時に似たよう
なことを考えたことがありましたが、面倒すぎて実際にはやりませんでした。
ただ、ちょっと変な点もあります。/usr/local/share/info/dir は最後に
インストールした Formula の dir になるようです。あと、私の環境では
/usr/local/share/locale/* が全て gnupg の概ディレクトリへのシンボリッ
クリンクになっていました。
でもまあ、大した問題でもないので、しばらく使い続けることにします。
あ、Macports のアンインストール方法は [MacWiki - MacPorts](http://macwiki.sourceforge.jp/wiki/index.php/MacPorts) の
「MacPorts を再インストールしたい」を参考にして下さい。これで
/opt/local を捨てられますね!
参考情報:
[Mac Explorer| Homebrew - Mac OS X 用スマートなパッケージ管理システム](http://idita.blog11.fc2.com/blog-entry-641.html)
--------------------------------------------------------------------------------
title: "キラキラ号で安眠するための5つのポイント"
date: "2011-07-21"
--------------------------------------------------------------------------------
キラキラ号に乗って RubyKaigi から帰ってきました。
{{< post "2011-05-03-1" >}} の続きになります。
「体をできるだけ水平にする」ことがポイントです。
それではいってみましょうか。
## 1. ヘッドレストを外す。
みんな付けたままなのですが、顎は苦しくないのでしょうか。。。

## 2. リクライミングは最大にする。
後ろの人に一声かけるとかして、なんとしてでも最大にして下さい。トイ
レ休憩の時は元に戻します。
で、そのトイレ休憩なんですが、必ず外に出た方が良いでしょう。ストレッ
チとかすると、またよく眠れます。{{< wikipedia word="静脈血栓塞栓症" text="エコノミークラス症候群" >}}対策にもなり
ますね。飲み物がなくなっていたら、しっかり補給しましょう。
## 3. 靴と靴下は脱ぐ。
寝ている時に足の裏から不快な熱が逃げるらしいです。実際その通りです。
## 4. フットレストは使わない。
足下の空間が狭くなり、足を伸ばせなくなるためです。レッグレストは使
います。足を固定化できます。足を宙に浮かせるとベターです。

でも背が高い人はどうやっても足を伸ばせませんよね。ご愁傷様です。。。
夜行バスに関しては、背が高いことは何のメリットもありません。
## 5. 腰を浮かせない。
腰が浮いたままだと、寝ていてとっても疲れます。
取り外したヘッドレストを使うと良いかもしれません。
P.S.
[プラモデルが出てました。。](http://www.1999.co.jp/10068957)
--------------------------------------------------------------------------------
title: "『成金』を読んだ"
date: "2011-07-21"
--------------------------------------------------------------------------------
{{< amazon "4198630968" >}}
RubyKaigi の行きの新幹線の中で読みました。そんなにうまくいくものか
なあというのが正直な感想です。「拝金」{{< post "2010-07-04-2" >}} の方がスピード
感があって好きですね。
--------------------------------------------------------------------------------
title: "RubyKaigi2011 に参加してきた"
date: "2011-07-21"
--------------------------------------------------------------------------------
{{< figure src="/images/rubykaigi2011.png" link="http://rubykaigi.org/2011/ja" target="_blank" rel="noopener" alt="画像" >}}
ここ 3 ヶ月で書いた Ruby コードはわずか 40 行ではありますが、最初で
最後の RubyKaigi に参加して来ました。印象に残ったセッションを書き留
めておきます。
## (1) 組込みシステムのための動的コンポーネント機構とVMの最適化
オリジナルの Ruby をなるべく手を加えずにに移植する、つまりハッキン
グですね。私はこういうの好きですねえ〜。オリジナルに手を加える量が
少なければ少ないほど興奮しますw
そういう意味では elisp の advice や eval-after-load、hook なんかも
好きです。
## (2) 軽量Ruby
こちらは Matz さん本人が関わっている組み込み Ruby 。(1) と違って、
Ruby にバリバリと手が加えられています。
軽量化するために、Ruby を極限まで削り取ったり、高速化可能であればハー
ド化(Ruby チップ)したりするそうです。
VM を介して使うため中間コードに変換する必要があるそうです。いっその
こと、Ruby のコードを実行可能なコード(ELFとか)に変換すればいいんじゃ
ないかと思ったのですが、そういう訳にはいかないのでしょうか。
いずれにせよ、組み込みの分野で Ruby が使える日もそう遠くないのかも
しれません(?)
## (3) その他もろもろ
「Ruby遺産とレガシーコード修理技術」は tDiary の話だと思っていなかっ
たので、予想外でうれしかったです。本当に tDiary が好きなんだなあ。。
懇親会では、ただただしさんとも少しお話し出来ました。
Matz さんのプレゼンももちろん面白かったです。内容は要約すると
「Ruby 最高!」でしたw
隠れた収穫としては、Ruby 界隈ではテスト駆動開発が当たり前になってい
ることを知れたこと。実際にやっているところを初めて見ました。自分の
仕事でも真似しないと。。。
全体的にプレゼンがうまい人が多かったのも印象に残りました。良くある、
テキストで埋め尽くされたプレゼンは少数派で、画像や動画、グラフ、テ
キストが1つか2つというパターンが多数派に思えました。ちょうど
{{< amazon_link asin="4894713284" title="プレゼンテーション zen" >}} を読み終えた後だったので、なおさら目に付いた
のかもしれません。
懇親会への道中、あの [keysnail](https://github.com/mooz/keysnail/wiki/keysnail-japanese) の作者である {{< twitter "stillpedant" >}} さんとお話
しできました。Firefox から Chrome に乗り換えた {{< post "2011-06-03-1" >}} の
バレてました。すみませんw
--------------------------------------------------------------------------------
title: "Dropbox ライクなストレージ、SpiderOak を登録してみた"
date: "2011-07-07"
--------------------------------------------------------------------------------
[Dropboxライクなストレージ、SpiderOakの無料プランが上限50GBになっていた](http://sheephead.homelinux.org/2011/07/07/6779/)
無料プランの上限が最大 50GB になったそうなので、登録してみました。
Dropbox は ~/Dropbox を Sync,Share できるのに対して、
SpiderOak は任意のフォルダを Sync,Share,Backup できる点が異なります。
バックアップできるのが良いですね〜
Dropbox をバックアップ用途に使うためには、~/Dropbox にシンボリック
リンクを張る必要があり、なんだかモヤモヤしていましたが、SpiderOak
なら任意のフォルダをバックアップできるので、そんなことありません。
メジャーにならないのは日本語化されてないのと、トップページがゴチャ
ゴチャしているからじゃないですかね。SpiderOak ってどう読んだら分か
らないのも、マイナスポイントです。
まあでも魅力的なサービスであることは確かです。まだ試していない方は
https://spideroak.com/signup/ から登録してみて下さい。
もちろん Dropbox とも併用できるので、こちらもまだ登録されていない方
は是非是非(こちらは恥じらいもなく紹介用のリンクです)。
[Dropbox へのご招待です。 - 生活をシンプルに](http://db.tt/w2YQeS4)
**追記(2011-12-09):**
みなさまのおかげで容量が無料プラン MAX の 50GB に達しました。ありが
とうございます。紹介リンクを削除しました。
--------------------------------------------------------------------------------
title: "Git ブランチ操作のまとめ"
date: "2011-07-05"
--------------------------------------------------------------------------------
個人的なメモ その2
その1は {{< post "2010-04-29-1" >}} にあるよ。
Git では、たった一日の作業でもブランチを作ることが良くある。基本ブ
ランチは修正が終わったら master に merge して削除、つまり使い捨て。
別な作業が入ったら、master から新たにブランチを作る。
cvs とか svn だと、作業単位毎にディレクトリを掘って cvs checkout と
かしていたけど、Git はこれをブランチ操作のみでできる点が超便利。
ただ、他に違わず、ブランチ操作も複雑なのでメモメモ。
(1) ローカルブランチの確認
```
% git branch
```
(2) リモートブランチの確認
```
% git branch -r
```
(1) + (2)
```
% git branch -a
```
(3) ローカルブランチ bar の作成
```
% git branch bar
```
(4) ローカルブランチ bar への切り替え
```
% git checkout bar
```
(3) と (4) を同時にやる。
```
% git checkout -b bar
```
(5) 任意のタグやリビジョンを起点に、ブランチ bar を作る。
```
% git branch bar <タグ名 or リビジョン>
```
(6) (5) をやりつつ、bar ブランチに切り替える。
```
% git checkout -b bar <タグ名 or リビジョン>
```
(7) 修正の一時的な待避。`` は省略可能。他のブランチに切り替えた
いんだけど、commit はしたくない(ブランチを切り替える時は commit す
る必要がある)という時に使う。個人的には、気分で圧縮コミットと使い分
けてる。
```
% git stash save
```
(8) (5) のリスト表示
```
% git stash list
stash@{0}: On :
```
(9) (5) の取り出し
```
% git stash pop 'stash@{0}'
```
(10) ローカルブランチ bar の削除
```
% git branch -d bar
```
(11) (ローカルブランチの) master にマージしてないと (8) はエラーになる。
とにかく強制削除したい場合はこちら。
```
% git branch -D bar
```
(12) ローカルブランチ bar をリモートリポジトリ origin に新たに作成
する。origin というのは、clone 元のリモートリポジトリ。git config
--list で確認できる。
```
% git push origin bar
```
(13) リモートリポジトリ origin のブランチ bar を削除する
```
% git push origin :bar
or
% git push --delete origin bar # maybe from version 1.7
```
(14) リモートリポジトリ origin のブランチ bar を削除しようとして、
こんなエラーが発生したら、、、
```
% git push origin :bar
error: unable to push to unqualified destination: bar
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'ssh://example.com/~masutaka/rep.git'
```
まずは現状把握。
古くなった(=stale)ブランチ refs/remotes/origin/bar が見つかった。
'git remote prune' 使えと言っている。
```
% git remote show origin
* remote origin
Fetch URL: ssh://example.com/~masutaka/rep.git
Push URL: ssh://example.com/~masutaka/rep.git
HEAD branch: master
Remote branches:
master tracked
refs/remotes/origin/bar stale (use 'git remote prune' to remove)
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
```
使った。消せたようだ。'git branch -a' や 'git remote show origin'
で確認してもうまく消せたことが分かる。
```
% git remote prune origin
Pruning origin
URL: ssh://example.com/~masutaka/rep.git
* [pruned] origin/bar
```
(15) リモートリポジトリのブランチ foo を現在のブランチに pull する。
```
% git pull git://example.com/project.git foo
```
リモートリポジトリは git remote add で追加したリポジトリ名も指定で
きる。いやむしろそちらが正当なやり方か。
(16) リモートリポジトリ origin の ブランチ foo を、ローカルリポジト
リの tmp ブランチに pull する。
```
% git pull origin foo:tmp
```
(17) リモートリポジトリ origin の ブランチ foo を、ローカルリポジト
リの var として、そのまま持ってくる。
```
% git checkout -b var origin/foo
```
リモートリポジトリの名前が origin で、ローカルとリモートで同じブラ
ンチ名でよければ、以下のように省略可能。
```
% git checkout foo
```
(18) ローカルブランチ foo を var にリネームする。
```
% git branch -m foo var
```
(19) リモートリポジトリ foo に含まれているブランチを表示する。
```
% git remote show foo
```
(20) すべてのリモートリポジトリから変更を取得する。マージはしない。
```
% git fetch --all
```
ブランチの作成や切り替え、master へのマージは Emacs の [git-dwim.el](http://d.hatena.ne.jp/rubikitch/20100716/git)
がめちゃめちゃ便利。[egg.el](https://github.com/byplayer/egg) とともに愛用中。
参考情報:
[clmemo@aka: Git remote repository と Branch](http://at-aka.blogspot.com/2009/02/git-remote-repository-branch.html)
[Gitでリモートの共有リポジトリにあるブランチを消す時のメモ - blog.longkey1.net](http://blog.longkey1.net/archives/941)
["git stash" のもう少し詳しい使い方](http://transitive.info/article/git/command/stash/)
[[Git] Git コマンドメモ - それはBlog](http://hamasyou.com/blog/archives/000391)
[Gitを使った分散開発管理7 – ブランチとタグを使う – | .dev():クラスメソッド開発ブログ](http://dev.classmethod.jp/etc/git-branchtag/)
[Git ユーザマニュアル (バージョン 1.5.3 以降用)](http://www8.atwiki.jp/git_jp/pub/Documentation.ja/user-manual.html)
--------------------------------------------------------------------------------
title: "『パターン、Wiki、XP 〜時を超えた創造の原則』を読んだ"
date: "2011-07-01"
--------------------------------------------------------------------------------
{{< amazon "4774138975" >}}
ソフトウェアの開発は建築の手法が元になった、と聞いたことがあったけ
ど、まさにこの本に書いてあった。建築のパターンランゲージを参考に考
え出されたデザインパターン、今のアジャイルに通じる話、Wiki の発明者
カニンバル等々、なかなか面白い本だった。
P.S.
こちらの記事がこの本を知ったきっかけです。
[パターン、Wiki、XP ~時を超えた創造の原則を読んだ。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20101016/1287217591)
--------------------------------------------------------------------------------
title: "Emacs の M-x align-regexp は超便利"
date: "2011-06-29"
--------------------------------------------------------------------------------
こんなソースコードを

このように整形してくれます。

手順はとっても簡単。
Ctrl-space でリージョンを作って、
M-x align-regexp [Return] = [Return] するだけ。
--------------------------------------------------------------------------------
title: "iPhone で複数のカレンダーを表示させるのが大変だった"
date: "2011-06-21"
--------------------------------------------------------------------------------
発端はこの記事。
[[を] iPhone のカレンダーを「ハチカレンダー2」にしました](http://chalow.net/2011-06-13-1.html)
普段使っている「CCal」は全体的に動きがモッサリしているのですよね。
そんなわけで「ハチカレンダー2 Lite」の方を試しに使ってみようとした
のですが、予想以上に大変だったのでここにメモしておきます。
「ハチカレンダー2 Lite」自体は標準のカレンダーの設定どおりに表示す
るだけのアプリなので、設定するのは標準のカレンダー関連になります。
1. Google Sync から、表示したい他のカレンダーにチェックを入れる。
[Googleカレンダーの複数のカレンダーを[カレンダー]と同期したい - できるネット+(できるネットプラス)](http://dekiru.impress.co.jp/contents/040/04005.htm)
2. iPhone のメール/連絡先/カレンダーの設定から、MS Exchange のアカ
ウントを追加する。
[[カレンダー]とGoogleカレンダーを同期させる設定方法は? - できるネット+(できるネットプラス)](http://dekiru.impress.co.jp/contents/040/04002.htm)
あとは「ハチカレンダー2 Lite」を起動するだけです。
MS Exchange のアカウントを作るのがポイントなんですね〜。意味が分か
らなくて、何度もアカウントを作ったり消したりを繰り返しました。
そういえば {{< post "2011-06-18-1" >}} でも、MS Exchange のアカウントを作りまし
たね。Google Sync を初めて知ったのはこの時。。
まあそれはともかく、「ハチカレンダー2 Lite」は動きが軽くて良いですね。
しばらく使ってみます。
- [ハチカレンダー2 Lite](http://itunes.apple.com/jp/app/id384119714)
- [CCal](http://itunes.apple.com/app/id360923868)
**追記(2011-06-23):**
有料版の「[ハチカレンダー2](http://itunes.apple.com/jp/app/id380105927)」を買いました。Lite より機能アップしてます。
個人的には List 表示できるのが嬉しいです。
**追記(2011-08-01):**
もっと簡単な方法がありました。。。
[【最新版】iPhoneの標準カレンダーとGoogleカレンダー(複数アカウントもOK)を同期する方法](http://www.appbank.net/2011/07/28/howtos/279270.php)
**追記(2011-11-22):**
もっともっと簡単な方法がありました。。。
[[を] iPhone と Google カレンダーの連携が昔の方法だったため共有カレンダーが見られなくなってた](http://chalow.net/2011-11-19-1.html)
--------------------------------------------------------------------------------
title: "「Gmail の連絡先」を Mew のアドレス帳にコピーする"
date: "2011-06-18"
--------------------------------------------------------------------------------
[Gmailのアドレス帳をbbdbにインポート](http://sheephead.homelinux.org/2011/06/14/6717/)を見て触発されたので、Mew でも出
来るようにしてみました。
{{< github_repo "masutaka/google-contacts-mew" >}}
**~/Mail/Addrbook が「Gmail の連絡先」で完全に上書きされる**ので、十分
注意して使ってくださいね。
「Gmail の連絡先」と「iPhone の連絡先」も同期できました。
[Google SyncがiPhoneに対応 – カレンダーやアドレス帳の同期が可能に | iPhone 研究室(iPadもね)](http://iphone-lab.net/archives/4307)
P.S.
au 携帯のアドレス帳が悩ましい。。。
--------------------------------------------------------------------------------
title: "RCS は Dropbox に出会って甦った!"
date: "2011-06-06"
--------------------------------------------------------------------------------
{{< wikipedia word="Revision_Control_System" text="RCS" >}} 使ってますか?
私は初めて使ったバージョン管理システムが RCS ということもあり、これ
からは Git だ、Mercurial だと叫ばれる中、ちょくちょく使っていました。
リポジトリを作らなくても良いから、サーバの設定ファイルとか、ちょっ
としたファイルにお手軽に使えるのですよね。
使い方は Google 先生が良くご存知です。"ci (-sInstall)",
"co (-l,-u)", "rcsdiff", "rlog" あたりを良く使うことになるかと思い
ます。
RCS はお手軽に使える反面、RCS ディレクトリが各ディレクトリに散らば
り管理しづらいという問題がありました。これはバックアップしづらいと
いう問題にも繋がります。
なので、こうしてみました。

この例では aliases と main.cf を RCS で管理しています。あれ、RCS ディ
レクトリは Dropbox へのシンボリックリンクになっていますね。ちょっと
見てみましょうか。

なるほど〜 各 RCS ディレクトリをこうやって一カ所に集めたのですね。
しかも Dropbox 配下に置いたから、バックアップもやってくれると。
個人の Mac とかだったら、これで十分かと思います。ci や co はデフォ
ルトでインストールされていますし。これで /etc の下とかの *.bak や
*.orig ファイルからおさらばです。
ってことで、Dropbox をお持ちでない方は[こちらのリンク](http://db.tt/w2YQeS4)からアカウント
を作って頂けると、(私が)喜びます。_o_
--------------------------------------------------------------------------------
title: "Firefox から Chrome に乗り換えたよ"
date: "2011-06-03"
--------------------------------------------------------------------------------
Netscape 時代も含めるとかれこれ 15 年くらい愛用している Mozilla 系ブラウザから、この度 Google Chrome に乗り換えることにしましたので、報告致します。
最近の私の Firefox4 on Mac OS X は時々、メニューバーの反応がなくなるのですよね。。あと、Keysnail を導入していることが逆に仇となって、他のアプリで Command-w してあ"ーしちゃうし。。。
ってのが乗り換えの理由です。
移行自体は簡単で、Chrome さんがブックマークやパスワード、履歴等をインポートしてくれます。
問題はアドオン。試行錯誤して調べました。
## [Firebug](https://addons.mozilla.org/ja/firefox/addon/firebug/)
Chrome には標準で実装されています。Firebug の方がデキが良いとの話も。
## [gpum - Google mail Popup Unread Manager](https://addons.mozilla.org/ja/firefox/addon/gpum/)
これも Chrome には標準で実装されています。Google Web サービスとの親和性はさすがです。
## [Greasemonkey](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/)
あんまり使ってなかったので、調べてません。
## [Hatena Bookmark](https://addons.mozilla.org/ja/firefox/addon/hatena-bookmark/)
Chrome にも、[アプリ](https://chrome.google.com/webstore/detail/kgdndolinendndjobelejjaphbihagof)と[拡張](https://chrome.google.com/webstore/detail/dnlfpnhinnjdgmjfpccajboogcjocdla)がありました。
## [Keysnail](https://github.com/mooz/keysnail/wiki/keysnail-japanese)
(1) Firefox を Emacs 風のキーバインドにしたり、(2) 現在の URL をツイートしたり、(3) Hit-a-Hint が使える、スゲーアドオンです。
(1) は捨てました。Mac は OS 標準のキーバインドが洗練されているので。
(2) は良いのがないですねえ。[TwitterBar](https://chrome.google.com/webstore/detail/pbadgdglepgngpoeijdgicjccomadekm) は Enter でかな漢字変換を確定するとツイートしちゃうし。。
(3) は [KNavi](https://chrome.google.com/webstore/detail/pfcgnkljgjobpkbgcifmpnhglafhkifg) が及第点でした。Fire Key のデフォルトが space というのはあんまりなので、m に変更してます。Hint Character は asdfqwer です。こうすることで、右手で Fire Key を押しながら左手で Hint Characterを押すことが出来ます。確定したら Fire Key を離します。
## [Live HTTP headers](https://addons.mozilla.org/ja/firefox/addon/live-http-headers/)
Chrome 標準のが使えそうです。
## [Operator](https://addons.mozilla.org/ja/firefox/addon/operator/)
{{< post "2010-12-19-1" >}} で紹介したアドオンですね。[ラングリッチ](http://langrich.com)の予約を Google Calendar に登録するために使ってました。
Chrome 用だと [Google Calendar (by Google)](https://chrome.google.com/webstore/detail/gmbgaklkmjakoegficnlkhebmhkjfich) や [Microformats for Google Chrome](https://chrome.google.com/webstore/detail/oalbifknmclbnmjlljdemhjjlkmppjjl) があります。とりあえず両方インストールしました。
## [Tab Mix Plus](https://addons.mozilla.org/ja/firefox/addon/tab-mix-plus/)
まあ要らないかな。タブの多段表示に使っていただけだし。
## [ソース表示タブ](https://addons.mozilla.org/ja/firefox/addon/source-viewer-tab/)
HTML のソース表示の出力先をウィンドウではなく、タブにするだけのアドオンです。Chrome には標準で実装されています。
## [はてなツールバー](https://addons.mozilla.org/ja/firefox/addon/hatena-toolbar-for-firefox/)
複数アカウントのために使ってましたが、良いのがないですねえ。[Hatena Account Switcher](https://github.com/cherenkov/hatena_account_switcher) は、拡張のはてなと連携してくれないし。。
## 乗り換えた感想
やっぱり Chrome は描画が速いです。素晴らしい。反面、タブ毎にプロセスを作るのでメモリをバカ食いします。あれ、Chrome を終了したらメモリの空きが 1.5GB 増えた。。
Emacs キーバインドが使えなくなって不便な反面、OS 標準のキーバインドになったので、シンプルな構成になりました。若干不便ですが、結構満足してます。
--------------------------------------------------------------------------------
title: "Emacs で縦分割と横分割のトグル"
date: "2011-05-19"
--------------------------------------------------------------------------------
[横分割と縦分割を切り替える - Meadow/Emacs memo: ウィンドウ/フレーム関連 ― 分割・サイズ変更](http://www.bookshelf.jp/soft/meadow_30.html#SEC404)
個人的に必要になったのですが、縦分割->横分割すると 3 分割されてしま
うのでちょっと直しました。
```elisp
(defun window-toggle-division ()
"ウィンドウ 2 分割時に、縦分割<->横分割"
(interactive)
(unless (= (count-windows 1) 2)
(error "ウィンドウが 2 分割されていません。"))
(let ((before-height)
(other-buf (window-buffer (next-window))))
(setq before-height (window-height))
(delete-other-windows)
(if (= (window-height) before-height)
(split-window-vertically)
(split-window-horizontally))
(other-window 1)
(switch-to-buffer other-buf)
(other-window -1)))
```
--------------------------------------------------------------------------------
title: "Emacs で Mac の辞書を sdic っぽく使う"
date: "2011-05-18"
--------------------------------------------------------------------------------
[Mac の Emacs でツールチップ辞書 パート2。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20100103/1262482873)
しばらくこれで生活してましたが、自分にはツールチップは合わない気が
してきたので、sdic っぽく改良してみました。
{{< gist "masutaka" "1270473" >}}
M-x my-dictionary すると、カーソル下の単語を Dictionary.app 使って
調べます。C-u M-x my-dictionary すると、sdic 使って調べます。
似たような関数を作りたくなかったので、sdic の major-mode を流用して
ます。
**追記(2011-06-11):**
`q' で sdic バッファが消えないという問題があったので、
dictionary-app() を少し修正しました。
--------------------------------------------------------------------------------
title: "久しぶりに夜行バスに乗った"
date: "2011-05-03"
--------------------------------------------------------------------------------
ここ最近夜行バスに乗ることが増えました。今後もちょいちょい機会が
ありそうなので、今までの感想を書き留めておきます。
## [ヤングリゾート](http://www.bus24.jp/)
4/9 24:20 出発、横浜→京都、¥4,200
7〜8 年ぶりの夜行バスはほとんど眠れませんでした。カーテンは遮光でな
いので眩しいし、レッグリフトがないので(足乗せ台はある)足の疲れが取
れません。要は普通の 4 列シートのバスでした。
夜行バスってこんなものなのかと思っていたら..(続く)
## [WILLER TRAVEL](http://travel.willer.co.jp/)
4/11 23:45 出発、京都→横浜、¥5,500
やあ、このバスは素晴らしい!前回とはうって変わって、遮光カーテンも
レッグリフトもあります。振動がやや気になりましたが、席は 3 列シート
で広々だったので、そこそこ眠ることが出来ました。これならプラス
¥1,300 の価値ありです。休憩後の点呼を、乗務員二人で念入りにしてい
たのも好感が持てました。
## [ホットドック(キラキラ号)](http://www.hotdog.co.jp/bus/)
4/27 24:40 出発、横浜→明石、¥5,500
激安だったのでツライ旅を予想し憂鬱になっていましたが、予想に反して
一番良い夜行バスでした。よく眠れましたというか、10 時間ほとんど寝て
ましたw
遮光カーテンもレッグリフト(WILLER より劣る)もありましたが、このバス
の真の価値はサスペンションです(断言します)。なぜか振動が心地よく、
安心して眠ることが出来ました。
運転手は 2 時間交代のようで、良い職場環境だなと思いました。(他の会
社はチェック忘れました。。)
後日談:
明石で、お隣さん(どこかの会社の寮になっている)に引っ越しのご挨拶に
行ったら、出てきた人はな〜んか見覚えのある顔。話を聞いたら、あの日
のキラキラ号の運転手さんでした。こんなことってあるんですね〜(驚愕)
How to 安眠:
遮光カーテンでない場合はアイマスクなどを付ける。靴は絶対脱ぐ。でき
れば靴下も(寝ている時は足の裏から不快な熱が逃げるらしい)。足は伸ば
す。できれば腰と水平に。
次回への宿題:
どうやったらもっと腰を休ませられるか?体勢を倒しすぎると腰がシート
に密着せず、だんだん痛くなってくる。体勢を垂直に近づけると痛みはな
くなるが、疲れが取れづらい。ブランケットがもっと厚手ならいいんだけ
ど。腰当て持って行くのも面倒だな〜
**追記(2013-12-17):**
そういえばこんな記事{{< post "2011-07-21-3" >}}も書いたのでした。
--------------------------------------------------------------------------------
title: "『儲けたいなら科学なんじゃないの?』を読んだ"
date: "2011-04-30"
--------------------------------------------------------------------------------
{{< amazon "4023309230" >}}
ホリエモンと、元日本マイクロソフト社長の成毛さんの対談本。
科学の対談本は初めて読んだので、へぇ〜と頷くところが多くあった。
ブログやツイッターでは氷山の一角しか出ていないので、興味がある方は
読んでみると良いと思う。
--------------------------------------------------------------------------------
title: "『仕事は5年でやめなさい。』を読んだ"
date: "2011-04-22"
--------------------------------------------------------------------------------
{{< amazon "4763198246" >}}
熱い本だった。
限りある人生、閃光のように生きよと言うことか。
特に飲食関係で独立したいと思っている人は、ぜひ読むべきかと。
--------------------------------------------------------------------------------
title: "退職しました"
date: "2011-04-22"
--------------------------------------------------------------------------------
昨日 4/21 付けで、11 年間お世話になった某 M 社を退職しました。
M 社にはプログラミングのプの字から教えてもらい、大変感謝しています。組み込み、インフラ、テスト等々、いろんな経験をさせてもらって、本当にこの会社に入って良かったと思っています。
でも目を閉じると、辛かった事ばかり覚えているものですねw インフラの方は、Cisco のルーター設定できた!とか、Becky! から LDAP のアドレス帳参照できた!とか結構すぐ思い出すのですけど。
さて、実はここ 1〜2 年、もっと他の仕事をやってみたい、違う世界を知りたいという欲求が徐々に高まっていました。
その中でも Twitter の影響は一番大きかったです。これで会社を辞めたようなものです(笑)。こんなに手軽かつ身近に、違う世界を感じられるツールを私は知りません。
去年の夏、某オンライン英会話スクールの開始を知ったのも Twitter でした。そのすぐ後からそこの生徒になりましたが、これがなかなか面白い。9 月なんてレッスンを受けなかったのは、飲み会があった 2 日間だけでした。
中の人も楽しそうに仕事をやっているようで、それはずっと気になっていました。そこで忘れもしない今年の初め、中の人にアポを取ってみたところ、じゃあ試しにフィリピン見に来ますかと言うことになりました。
ただしその時点では、退職と英会話スクールの仕事は分けて考えて、自分を追い詰めないようにはしていました。
そこからの私の行動は速かったと思います。3 月頭から有休消化に入ることにし、そのタイミングでフィリピンに行くことにしました(実際に行ったのは 3/15 でした)。
行ってみないと分からないもので、予想していたよりも泥臭く、それなりに、いやかなりビックリしましたし、ビビリました。そして分からないことだらけです。フィリピンの生活、彼らの仕事、そして英語w
最初は相当気が張っていました。最後はだいぶ慣れて、帰りたくない気持ちでいっぱいでしたが。
あ、滞在中は、生徒として Web からレッスンを予約して、オンラインならぬオフライン英会話を受けておりました。Skype の向こう側の先生方に生で会えたのは感動でしたねえ。発音レッスンなんかは、やっぱり Skype より生の方が分かりやすいです(オイ
何はともあれ、もう走り出してしまいました。しばらくは何も考えず、突っ走っていこうと思います。
最後に。なんだかんだで転職は体力を使います。転職の前に体力を付けることを強くお勧めします。気持ちも勝手に上向きます。クイックシェイプいいですよw {{< post "2011-03-05-1" >}}
おまけ: フィリピンへの入国の様子(・ω・)?
{{< figure src="/images/ph-island-s.jpg" link="/images/ph-island.jpg" target="_blank" rel="noopener" alt="フィリピンへの入国の様子" >}}
--------------------------------------------------------------------------------
title: "Mac で手動インストールした apps"
date: "2011-04-21"
--------------------------------------------------------------------------------
自分用のメモ。随時更新。
CurrencyConverter155.zip # DashBoard
ESET Cyber Security
Kindle For Mac
SoraMoyo1.5.3.zip # DashBoard
これ以外は{{< post "2014-01-25-1" >}}のbrew-cask、もしくはApp Storeでインストー
ルしている。Boxenを使っていたこともあったけど{{< post "2013-11-23-1" >}}、今は
brew-caskに移行した。
--------------------------------------------------------------------------------
title: "CakePHP-1.2 系の構築方法"
date: "2011-03-11"
--------------------------------------------------------------------------------
自分用のメモ。
Macports の Apache を使っている。
## 一回だけ
edit httpd.conf
```
% sudo cp /opt/local/etc/php5/php.ini-development /opt/local/etc/php5/php.ini
[src]
edit php.ini
[src]
% sudo -u mysql mysql_install_db5
```
## CakePHP を作るたびに
.htaccess に以下を追加。
```
RewriteBase /~masutaka/cake/
```
app/.htaccess に以下を追加。
```
RewriteBase /~masutaka/cake/app/
```
app/webroot/.htaccess に以下を追加。
```
RewriteBase /~masutaka/cake/app/webroot/
```
Apache が読み書きできるように。
```
% mkdir -p app/tmp/cache
% chmod -R o+rw app/tmp
```
edit app/config/core.php
```
//date_default_timezone_set('UTC');
↓
date_default_timezone_set('Asia/Tokyo');
```
edit app/config/core.php
```
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
↓
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mimasutaka');
```
edit app/config/core.php
```
Configure::write('Security.cipherSeed', '76859309657453542496749683645');
↓
Configure::write('Security.cipherSeed', '768593096574535424967496836450123');
```
```
% mysql5 -u root
>create database cake character set utf8;
```
参考情報:
[Snow LeopardなMacBookにMacPortsで開発環境入れ直し(Apache2/PHP5/MySQL5/PostgreSQL8.3) [C!]](http://creazy.net/2010/01/install_macports_snow_leopard.html)
[fresh install of cakephp 1.3, Fatal Error: Call to a member function cd() - CakePHP | Google グループ](https://groups.google.com/group/cake-php/browse_thread/thread/f99ca48358a62940?hl=ja&pli=1)
--------------------------------------------------------------------------------
title: "初めて Mac で Emacs をビルドした!"
date: "2011-03-10"
--------------------------------------------------------------------------------
{{< tweet user="tomoyaton" id="45758067354243072" >}}
Emacs-23.3 がリリースされたとのことなので、[@tomoyaton さんのビルド
をリアルタイムで眺めながら](http://togetter.com/li/110139)、初めて Mac でビルドしてみました。
```
% wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.3.tar.bz2
% tar xjf emacs-23.3.tar.bz2
% mkdir work; cd work
% ../emacs-23.3/configure --with-ns --without-x 2>&1 | tee ../emacs-23.3_configure.log
% cp config.log ../emacs-23.3_config.log
% make 2>&1 | tee ../emacs-23.3_make.log
% make GZIP_PROG="" install 2>&1 | tee ../emacs-23.3_make-install.log
% cp -r nextstep/Emacs.app /Applications
```
ログを神経質に残しているのは、インフラ担当時代の癖です。。
Makefile 見ると分かりますが、prefix が /usr/local じゃなくて
/Users/masutaka/tmp/work/nextstep/Emacs.app/Contents/Resources とか
になるんですねえ。面白い。
最後 /Applications に Emacs.app をコピーしているので、Dock -> アプ
リケーション -> Emacs から使えます。でも環境変数が引き継がれないの
で、私は alias にして端末から起動してます。
>alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs
configure のログはこんな感じでした。Linux の時 {{< post "2009-07-31-2" >}} と比
べて no が多いですが、jpeg は表示できたので別なライブラリが肩代わり
しているのですかね?
```
Where should the build process find the source code? /Users/masutaka/tmp/emacs-23.3
What operating system and machine description files should Emacs use?
`s/darwin.h' and `m/amdx86-64.h'
What compiler should emacs be built with? gcc -g -O2 -Wdeclaration-after-statement -Wno-pointer-sign
Should Emacs use the GNU version of malloc? no
(The GNU allocators don't work with this system configuration.)
Should Emacs use a relocating allocator for buffers? no
Should Emacs use mmap(2) for buffer allocation? no
What window system should Emacs use? nextstep
What toolkit should Emacs use? none
Where do we find X Windows header files? NONE
Where do we find X Windows libraries? NONE
Does Emacs use -lXaw3d? no
Does Emacs use -lXpm? no
Does Emacs use -ljpeg? no
Does Emacs use -ltiff? no
Does Emacs use a gif library? no
Does Emacs use -lpng? no
Does Emacs use -lrsvg-2? no
Does Emacs use -lgpm? no
Does Emacs use -ldbus? yes
Does Emacs use -lgconf? no
Does Emacs use -lfreetype? no
Does Emacs use -lm17n-flt? no
Does Emacs use -lotf? no
Does Emacs use -lxft? no
Does Emacs use toolkit scroll bars? yes
```
ちなみに Mac では ldd はない(※)ので、otool を使うのだそうです。
うーん、依存関係は実にシンプル。
```
% otool -L /Applications/Emacs.app/Contents/MacOS/Emacs
/Applications/Emacs.app/Contents/MacOS/Emacs:
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.35.0)
/opt/local/lib/libdbus-1.3.dylib (compatibility version 8.0.0, current version 8.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
/opt/local/lib/libncursesw.5.dylib (compatibility version 5.0.0, current version 5.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.42.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 38.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.42.0)
```
※ binutils にも入ってない。
```
% port contents binutils | grep /opt/local/bin
/opt/local/bin/gaddr2line
/opt/local/bin/gar
/opt/local/bin/gc++filt
/opt/local/bin/gelfedit
/opt/local/bin/gnm
/opt/local/bin/gobjcopy
/opt/local/bin/gobjdump
/opt/local/bin/granlib
/opt/local/bin/greadelf
/opt/local/bin/gsize
/opt/local/bin/gstrings
/opt/local/bin/gstrip
```
strip されているかはどうやって調べるのでしょう?誰か教えて。。
参考情報: [メモ - Mac OS Xでlddの代わり - D-6 [相変わらず根無し]](http://mt.endeworks.jp/d-6/2006/06/-mac-os-xldd.html)
--------------------------------------------------------------------------------
title: "svn で空のディレクトリが競合して困ったら"
date: "2011-03-06"
--------------------------------------------------------------------------------
```
% svn status -q
C share
> local delete, incoming edit upon update
% svn resolve --accept=working share
'share' の競合状態を解消しました
```
参考ツイート
{{< tweet user="lbnp" id="22875600487" >}}
--------------------------------------------------------------------------------
title: "クイックシェイプを始めてまもなく6ヶ月(その3結果編)"
date: "2011-03-05"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
[クイックシェイプ](http://www.quickshape.jp/)の話その3です。
その1導入編はこちら {{< post "2011-03-05-1" >}}、その2紹介編はこちら {{< post "2011-03-05-2" >}}
スロトレで挫折した私ですが、このジムならイケル!!と感じました。逆
にこの方法でもダメだったら、もうダイエットに成功することはないだろ
うとも思いました。ある意味背水の陣です。
ということで、始めた頃は水金以外は毎日通っていました。
水曜日は付き合いのジョギング、金曜日はジムが休みなので、基本行ける
日は毎日通っていたことになります。クレイジーですね。
これはスロトレの時に思い知った苦い経験からです。例えばトレーニング
の日を月水土にしようと決めると、飲み会とかで出来ない日がきっかけに
なり、だんだんとやらなくなります。そう私は弱い人間なんです。
なので最初は何も考えずに毎日行く、飲み会の次の日でも頑張って行く、
このように良い意味で思考停止することで習慣化に成功しました。今は週
3〜4 回に減らしましたが、習慣化したおかげで今後は怠け要因で行かなく
なる可能性は低そうです。
ここまでやれば少なくとも半年後には体重が 3〜4kg 落ちて、腹筋も割れ
た快適ライフを送れるよね・・・
そんなふうに考えていた時期が俺にもありました
6 ヶ月経った今、数値はあまり減っていません。\(^o^)/
(体重は 1kg くらい、体脂肪率も 2〜3% くらいしか減らず。)
やはりサーキットトレーニングだけだと筋肉量を増やせても、有酸素運動
は足りないので、ある意味予想通りなのかもしれません。
ジム内にあるウォーキングマシンを使うとか、ジム以外でもウォーキング
をすれば数値は減りそうです。面倒でそこまではやりませんでした。。。
ただし、体は締まりました。今までピチピチだった服がある程度スムーズ
に着られるになりました。ウエストや脚も細くなったようで、無理せずパ
ンツを履けるようになりました。洗顔の時に自分の顔に触れると、前より
小顔になったなあと思います。
体も軽くなり疲れづらくなりました。腹がよく減るようになり、トイレも
近くwなりました(前は就業時間中1回だけも普通でした)。基礎代謝が上がっ
たのでしょう。
イマイチなアピールになってしまいましたが、隙間時間を使って体を動か
したり、ダイエットしたい人にオススメなジムであることは確かです。
まずはやってみましょう!
--------------------------------------------------------------------------------
title: "クイックシェイプを始めてまもなく6ヶ月(その2紹介編)"
date: "2011-03-05"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
[クイックシェイプ](http://www.quickshape.jp/)の話その2です。
その1導入編はこちら {{< post "2011-03-05-1" >}}
このジムはサーキットトレーニングを取り入れていて、エアボードや各種
トレーニングマシンを 1 分間隔で回っていきます。1 周がだいたい 15 分
で、2〜3 周します。
エアボードでは DVD に合わせて体を動かします。これが思うようにならな
いし、結構きつい。9 月でまだ暑かったこともありますが、あっという間
に汗だくです。
このジムが他と変わっているのが「シャワーがない」ことです。一見ダメっ
ぽいですが、シャワーは家で入った方が持って行く荷物が少ないし、時間
短縮にもなります。合理的だと思いました。
もっともこれは欠点にもなり得て、もし最寄り駅にこのジムがなかったら
行こうとは思わないでしょう。
あとは、デイタイムとかナイトタイムとか変な時間制限がないことも良い
です。(平日 13:00-14:30、土日祝日 13:00-14:00 の昼休みはシフトとか
うまく使って、なくして欲しいけど。。)
料金が安いことも魅力的です。半年会員だと月々 5000 円程度です。
その3結果編 {{< post "2011-03-05-3" >}} に続きます。
--------------------------------------------------------------------------------
title: "クイックシェイプを始めてまもなく6ヶ月(その1導入編)"
date: "2011-03-05"
--------------------------------------------------------------------------------
{{< figure src="/images/quickshape-logo.jpg" link="http://www.quickshape.jp/" target="_blank" rel="noopener" alt="画像" >}}
去年の 9 月から[クイックシェイプ](http://www.quickshape.jp/)ってジムに通っています。
6 ヶ月近く続けたためか、体が締まって疲れづらくなりました。最寄り駅
にスタジオがある方は、是非体験してみて下さい!
私はこんな人です。
- 35 歳、男、中肉低身長
- 付き合いで、秋の河口湖マラソン(27km)に向けてジョギングすることは
あるが、走るのは好きではない。むしろ嫌い。
- 出来ることなら体を動かしたくないと思っている。というか、実際体は
動かしてなくて引きこもりに近かった。会社には普通に行っていたけどね。
- 今まで買ったもの
{{< google_images "ボディブレード" >}}→後輩にあげた
{{< google_images "ツイスト&シェイプ" >}}→まだ持っている
「ツイスト&シェイプ」が欲しい方はご一報を。。
- 今まで試したダイエット
ヘルシア緑茶を毎日飲む→3ヶ月で効果なしと判断
スロトレ→3ヶ月で飽きた
他忘れた。
始めた理由は1つだけ。そう「ダイエット」です。
大学の頃から年々贅肉が蓄積され、ピチピチな服が多くなり年々危機感を
募らせていました。
スロトレは一応 3 ヶ月続きましたが、最大の欠点は「楽しくない」ことに
尽きます。あれを続けられる人はよっぽど心が強いはずです。
なので楽しく続けられる方法はないかと考えていたところ、近くにクイッ
クシェイプがあることを思い出しました。ちょっと調べたところ、今の自
分に合っていそうです。
思い立ったら即体験です(※)。さっそく次の日に行ってきました。
※ この頃から、まずは何も考えずに行動して、その後に考えることを心が
け始めました。兎にも角にも行動すれば、何かしら変わります。逆に、考
えすぎて行動しないと、結局何も変わりません。
その2紹介編 {{< post "2011-03-05-2" >}} に続きます。
--------------------------------------------------------------------------------
title: "Amazon へのリンクに楽天へのリンクも追加しました"
date: "2011-03-04"
--------------------------------------------------------------------------------

Amazon へのリンクに楽天へのリンクも追加しました。
[[を] ASIN から楽天ブックスのページへ飛ばす CGI](http://chalow.net/2010-07-11-6.html)
またもや、たつをさんのコピーです。
楽天のアフィリエイト ID とデベロッパー ID は
http://webservice.rakuten.co.jp/ から確認できます。
楽天 API って、こうやって使うのですね。へえ〜
って、今まで存在を知らなかったけど。。。
- 楽天ブックス書籍検索 API
http://webservice.rakuten.co.jp/api/booksbooksearch/
TODO:
NOT FOUND! だったら、search.rakuten.co.jp を使いたいです。
追伸:
MacOSX で LWP::Simple がなかったら、p5-libwww-perl をインストールす
れば良いです。"sudo port install p5-libwww-perl"
--------------------------------------------------------------------------------
title: "このブログのコメントシステムも zenback にしました"
date: "2011-03-04"
--------------------------------------------------------------------------------
http://zenback.jp/
[[を] zenback を設置した](http://chalow.net/2011-02-23-2.html)
この記事を見たときははてブしただけでしたが、
[[を] zenback の素晴らしいのは設置する人以外はアカウント取得の必要がないところ](http://chalow.net/2011-03-03-2.html)
この記事を見て勢いで移行してしまいました。
設置はすごく簡単で、zenback に新規登録すると提示されるコードを、ア
イテム毎のページのテンプレートにコピペするだけです。便利なサービス
は外注するに限りますね。
DISQUS を使い始めたのは {{< post "2010-05-03-1" >}} です。一年も経たずに移行とな
りました。hatana_bookmark_anywhere.js {{< post "2009-11-22-1" >}} ももちろん移行
です。
**追記(2011-03-05):**
やっぱり DISQUS は復活させました。リアクションは zenbak にお任せな
ので、もちろん OFF です。DISQUS の管理画面から変更できます。
--------------------------------------------------------------------------------
title: "『“本物のお金持ち”と結婚するルール—ホリエモンの恋愛講座』を読んだ"
date: "2011-02-27"
--------------------------------------------------------------------------------
{{< amazon "4804704361" >}}
面白かった。
要約すると、お金持ちと結婚するのはオススメしないけど、それでもした
いのなら私が教えましょうって本。ただその選択は修羅道への始まりなりw
まあ、本当にホリエモンが言いたいことは最後に書いてあるから、ここで
は書かないことにする。
--------------------------------------------------------------------------------
title: "『実践的プログラムテスト入門—ソフトウェアのブラックボックステスト』を読んだ"
date: "2011-02-27"
--------------------------------------------------------------------------------
{{< amazon "4822280179" >}}
全然分からなくて、30 分で投げてしまった。\(^o^)/
「実践的」と題しているが、私にはどれが現場で使えるのかさっぱり分か
らなかった。Amazon のレビューを見ると、3 人とも絶賛しているが。。。
追伸: この本も一年以上 {{< twitter "simon6867" >}} 氏に借りたままでした。
ごめんなさい。
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(GB+DS編)"
date: "2011-02-11"
--------------------------------------------------------------------------------
{{< post "2011-02-11-1" >}} 目次
## 魔界塔士Sa・Ga
{{< amazon "B000069SX2" >}}
レベル上げずにラスボスの前でセーブして挫折しかけた。ほんっとに偶然
チェーンソー持ってて、試しに使ってみたら...。
## サ・ガ2 秘宝伝説
{{< amazon "B000069SX3" >}}
音楽とストーリーが良いイメージ。
## サ・ガ3 時空の覇者
{{< amazon "B000069SX4" >}}
忘れた。。。
## ドラゴンクエストIX 星空の守り人
{{< amazon "B000LXD7HO" >}}
やっぱり旅芸人でしょう!!昼休みに職場のみんなとやった時を思い出す
なあ。竜王に一撃で倒される低さのレベルで、吐息返しが面白いように決
まり、見事勝利!! MBP 取った!!
{{< post "2011-02-11-1" >}} 目次
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(PS3編)"
date: "2011-02-11"
--------------------------------------------------------------------------------
{{< post "2011-02-11-1" >}} 目次
## DEVIL MAY CRY 4
{{< amazon "B0009RQKSK" >}}
ネロは下手クソでも扱いやすくて好き。チャージショット強ぇええ。
でもダンテは無理だよ..。DMD のダンテステージ開始で止まった。
## BAYONETTA
{{< amazon "B0019JPGGY" >}}
回避がうまくなると、自分が達人のように思えてくる。世界観も好き。
## ファイナルファンタジーXIII
{{< amazon "B000FNQXEO" >}}
面白いゲームだったなあ。全く新しい戦闘システム。
時間が無限にあれば、もっと亀狩りやったんだけど。。
{{< post "2011-02-11-1" >}} 目次
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(PS2編)"
date: "2011-02-11"
--------------------------------------------------------------------------------
{{< post "2011-02-11-1" >}} 目次
## ドラゴンクエストVIII 空と海と大地と呪われし姫君
{{< amazon "B00062ILP8" >}}
世界観、ゲームバランス等含めて好き。ミニゲームないし。寝オチしなが
らメタルキング狩りしてた。練金に洗濯ばさみはかかせないよねっ!!
## 鬼武者
{{< amazon "B00005OULH" >}}
もちろん「鬼武者」の称号は取りましたとも!!
幻魔・鬼武者やりたかったなあ。
## 鬼武者2
{{< amazon "B00005UF77" >}}
孫一の一閃が好き。銃なのにwww
ストーリーを全コンプしたのに、あの特典って。。(;´д⊂)
鬼組おもしろいね!!
## 鬼武者3
{{< amazon "B00008VAFR" >}}
ポリゴンになってキャラが小さくなったイメージ。2〜3周したかなあ。
## 新 鬼武者 DAWN OF DREAMS
{{< amazon "B0009MZ1VC" >}}
武器多すぎ。ラスボスを倒すのに非常に苦労した。
## 鬼武者 無頼伝
{{< amazon "B0000CGMJZ" >}}
クソゲー
## DEVIL MAY CRY
{{< amazon "B000GADLKU" >}}
スタイリッシュにはなれなかった。他の人の動画で我慢。。。
## DEVIL MAY CRY 2
{{< amazon "B00006D2DK" >}}
ちょっとやって売っちゃった。バグが多いらしい。
## DEVIL MAY CRY 3 Special Edition
{{< amazon "B000P31PY2" >}}
兄貴最高!!
## Shinobi
{{< amazon "B00006D2DQ" >}}
一番ハマったゲームかも。
ハードヒルコ様に 8 時間くらい挑戦し続けたなあ。。
## Kunoichi -忍-
{{< amazon "B0000CE7IB" >}}
こちらはイマイチ。ボスの倒し方が分かりづらかった。Shinobi みたいに
一撃じゃないとねえ。。
## ストリートファイターEX3
{{< amazon "B00005OULE" >}}
メテオを見て楽しんだよ。
## ヴァンパイア ダークストーカーズ コレクション
{{< amazon "B000JJDO00" >}}
指動かない。。。格ゲーは人の動画を見るに限る(違
## キン肉マン ジェネレーションズ
{{< amazon "B0001GQ8JK" >}}
うーん、クソゲーの部類かなあ。
## ジョジョの奇妙な冒険 黄金の旋風
{{< amazon "B000067JK4" >}}
間違いなくジョジョ好きが作ったゲーム。5 部のファンには堪らない。。
## 聖剣伝説4
{{< amazon "B000E0RBSK" >}}
良さが分からなかった。5 時間くらいで挫折。
## 龍が如く
{{< amazon "B000BDEJBW" >}}
ストーリーは??だったけど、なかなか楽しめた。ミニゲームいらない。。。
## 龍が如く2
{{< amazon "B000I7VK9A" >}}
1 をクリアーしてすぐにやったらゲップが出たよ。だから 3 以降はやって
ない。あとやっぱりミニゲームいらない。。。
## どろろ
{{< amazon "B0002IW760" >}}
ストーリーを進めるほど難易度が下がる不思議なゲーム。
魔神は全員倒した!!
## 大神
{{< amazon "B000JJ9F0I" >}}
ストーリーが良い。犬(オオカミだけど)も良い味を出している。難易度が
低く、私のようなヘボゲーマーにも優しいゲーム。ただ、私には少々長く
感じたかな(クリアーに 60 時間)。あと、3D 酔いしやすいかも。
{{< post "2011-02-11-1" >}} 目次
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(PS編)"
date: "2011-02-11"
--------------------------------------------------------------------------------
{{< post "2011-02-11-1" >}} 目次
## ドラゴンクエストIV 導かれし者たち
{{< amazon "B00005RTU9" >}}
ラスボスの直前で5年くらい放置していたのだけれど、やっとクリアー。
Lv45 でなんとか倒せた。
## ファイナルファンタジーI・II プレミアムパッケージ
{{< amazon "B00006H1SR" >}}
I はダイの大冒険のキャラの名前をつけて、戦士、モンク、赤、黒でクリアー。
II は回避率の重要さを知り、HP や MP を上げずにクリアー。盾重要。
## ファイナルファンタジーVII インターナショナル
{{< amazon "B00005OVV7" >}}
とりあえずクリアーしただけだったな。ミニゲームが多すぎて心が折れた。
## ファイナルファンタジーVIII
{{< amazon "B00005OVXG" >}}
ちょっとしかやらずに売ってしまった。
{{< post "2011-02-11-1" >}} 目次
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(SFC編)"
date: "2011-02-11"
--------------------------------------------------------------------------------
{{< post "2011-02-11-1" >}} 目次
## ドラゴンクエストIII そして伝説へ
{{< amazon "B000068HX1" >}}
リメイク成功!クリアー後が楽しいよね。
## ドラゴンクエストV 天空の花嫁
{{< amazon "B000068HWJ" >}}
モンスターを全員仲間にして、人間含めて全員レベル MAX にしたなあ。
さすがに 2 匹目以降のモンスターは仲間にしなかったけどw
## ドラゴンクエストVI 幻の大地
{{< amazon "B000068HWX" >}}
ストーリーは一番好きかな。洗濯ばさみと連射コントローラー使って、人
間全員勇者&レベル MAX にした。でもこれやると、みんな無個性になっちゃ
うんだよね。。ランプの魔王が強いらしいけど、モンスターは全然仲間に
しなかったなあ。
## ファイナルファンタジーIV
{{< amazon "B000068HD7" >}}
2 人プレイが熱かったなあ。友達は飽きてたけどww イージータイプが出た
くらいだから、FF にしては難易度高めだった。月の宝箱を開ける時が一番
ドキドキしたかなあ。
## ファイナルファンタジーV
{{< amazon "B000068HD9" >}}
全ジョブマスターにした!薬師のドラゴンパワー最強!!
## ファイナルファンタジーVI
{{< amazon "B000068HDG" >}}
全員レベル 99 にして、魔法とかアビリティを全部覚えさせた!!
と言いたいところだけど、ガウで一匹だけ覚えさせられなかった。。。
## MOTHER2 ギーグの逆襲
{{< amazon "B000065V6Q" >}}
とりあえずクリアーはした。4 人目の武具は全部とれなかったなあ。。
## 聖剣伝説2
{{< amazon "B000068HDC" >}}
最強の武器を取るのがめちゃめちゃ大変で挫折した。クリアーはしたけどね。
## 聖剣伝説3
{{< amazon "B000066BPS" >}}
ラスボスが 3 通りあるから、全パターン試した。面白かったなあ。
## ソウルブレイダー
{{< amazon "B000068HWG" >}}
独特の世界観が好き。
## ガイア幻想紀
{{< amazon "B000068HWN" >}}
最後の赤い宝石の場所が分からなくて、数年後に見つけた攻略本見てよう
やく完全クリアー。オチはまあまあ良かった。
## ルドラの秘宝
{{< amazon "B000068HDL" >}}
難易度高めだったかなあ。この世界は属性に支配されてたね。
{{< post "2011-02-11-1" >}} 目次
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(FC編)"
date: "2011-02-11"
--------------------------------------------------------------------------------
{{< post "2011-02-11-1" >}} 目次
## バトルシティー

当時はファミコンが品薄で「[ジョイスティック-7](http://www.tomorege.com/contents2_katei_fc_syuhenkiki02.html)」と「[S.D.ステーション](http://www.tomorege.com/contents2_katei_fc_syuhenkiki03.html)」
それと下の「ロードファイター」の抱き合わせで買わされた。
でも面白かったなあ。かなりハマった。
## ロードファイター

トレーラーが出現するとワクワクwwした。たしか 5 面をクリアすると
1 面に戻ったよね。よくある無限ループタイプのゲームだった。
## スーパーマリオブラザーズ
{{< amazon "B000068GVY" >}}
今もまだクリアー出来るんじゃないかなあ。
## トランスフォーマー
{{< amazon "B000068GYP" >}}
2面さえ抜ければ、あとは大したことない。コンテニュー使い放題だし。
## ドラゴンスレイヤーIV
{{< amazon "B000068H2U" >}}
これは難しかった。何年もかけてやっとクリアーした。
YouTube 検索すると、、、すごいなああ。
## ドンキーコング3

なぜか親がカロリーメイト(チーズ味)を箱買いして毎日食べてたから、ド
ンキーコング3を見るとカロリーメイト(チーズ味)を思い出す。逆もまた然り。
## エレベーターアクション

最初のビルしか攻略できなかった。。
## 超時空要塞 マクロス
{{< amazon "B000068H55" >}}
これも難しかったなあ。
## ドラゴンクエスト
{{< amazon "B000068HWB" >}}
真面目にやったらレベル 10 くらいで挫折した。レベル 30 のパスワード
使ってクリアーしたよ。。今はパスワード生成アプリあるよね。
## ドラゴンクエストII 悪霊の神々
{{< amazon "B000068HWC" >}}
ロンダルキアの音楽は今聴いてもワクワクするね!
## ドラゴンクエストIII そして伝説へ
{{< amazon "B000068HWD" >}}
最初にゾーマ様を倒したシーンは今も覚えている。勇者、武闘家、賢者が
倒され、最後に残った瀕死の戦士(元魔法使い)が魔神の斧で会心の一
撃!!熱かった。
## ドラゴンクエストIV 導かれし者たち
{{< amazon "B000068HWE" >}}
2周くらいしたかなあ。
## ファイナルファンタジー
{{< amazon "B000068HD0" >}}
戦士、モンク、白、黒でやったなあ。シーフを選択する人が多くて爆死し
てたw 実は赤が強いと知ったのは後のお話。
## ファイナルファンタジーII
{{< amazon "B000068HD3" >}}
当時はバカだったから、HP と MP を上げまくってた。
## ファイナルファンタジーIII
{{< amazon "B000068HD6" >}}
高校受験が終わった日にダッシュで買いに行った。禁ゲーしてたので。関
係ないけど禁ジャンプもしてたwww
## MOTHER
{{< amazon "B000068GUW" >}}
あんまり覚えてないが、ラスボスで○○するのは覚えてる。
## 天地を喰らう
{{< amazon "B000068HL5" >}}
I は曹操様とは戦えないのだよね。ストーリーはむちゃくちゃだけど熱く
楽しめた!
## 天地を喰らうII 諸葛孔明伝
{{< amazon "B000068HLF" >}}
最強の武具が街に落ちている熱いゲームだった。目印は一切ないから、自
分の勘だけを頼りに調べまくった。
{{< post "2011-02-11-1" >}} 目次
--------------------------------------------------------------------------------
title: "今までやったゲームまとめ(目次)"
date: "2011-02-11"
--------------------------------------------------------------------------------
[ゲームメーター](http://gamemeter.net/)に今までやったゲームをメモっていたけど、「情報1ポケッ
ト原則」に忠実に従うことにしたので、この ChangeLog メモに引っ越した。
コメントは当時を思い出しながら大幅に加筆。
{{< post "2011-02-11-2" >}} FC編
{{< post "2011-02-11-3" >}} SFC編
{{< post "2011-02-11-4" >}} PS編
{{< post "2011-02-11-5" >}} PS2編
{{< post "2011-02-11-6" >}} PS3編
{{< post "2011-02-11-7" >}} GB+DS編
※ {{< post "2011-01-04-1" >}} のとおり、今は全部売った。ゲームをやることは当分
ないだろうなあ。
--------------------------------------------------------------------------------
title: "『プログラマが知るべき97のこと』を読んだ"
date: "2011-02-09"
--------------------------------------------------------------------------------
{{< amazon "4873114799" >}}
良書。私も含め、普段何十人もの達人と関わる機会のないプログラマは
ぜひ読むべき。
個人的には、日本人プログラマーに [Mew](http://www.mew.org/) のかずさんを加えてほしかった。
Mew のコードって、洗練されていてとても美しいのだよね。言語は違うけ
れども(いや違ったからこそか)、私のプログラミングの表現の幅を広げて
くれた。
ちなみに {{< amazon_link asin="4873114799" title="Amazon のカスタマレビュー" >}}では、[tdiary](http://www.tdiary.org/) で有名なただただしさ
んがレビューしている。こちらも必見。
--------------------------------------------------------------------------------
title: "『KAGEROU』を読んだ"
date: "2011-02-07"
--------------------------------------------------------------------------------
{{< amazon "459112245X" >}}
非常に読みやすい小説だった。余計な説明がないせいなんだろうな。2時間ほどで読めるので、小説好きの方もミーハーな方にもオススメ。
最後がよく分からなくて確信が持てない。~~Amazon の~~書評でも読んで補完しようかな。
--------------------------------------------------------------------------------
title: "『ゆるく考えよう 人生を100倍ラクにする思考法』を読んだ"
date: "2011-02-05"
--------------------------------------------------------------------------------
{{< amazon "4781605176" >}}
面白い。自分の人生を違った視点で見られる。
「所有という時代遅れ」は {{< post "2011-01-04-1" >}} と同じだし、35 年ローンとか
組んじゃダメってのも同意。(後者はただ面倒で先延ばしにしていただけで
すが。。)
ただ「アドバイスの正しいもらい方」は??だった。「他に何か聞いてお
くべきことなどありますか?今までお聞きしたことと全く違うことでもい
いのですが」うーん、ありえん。
まあでも、そういう考え方もあるよね〜
--------------------------------------------------------------------------------
title: "TeraTerm Menu の ssh 自動ログイン設定例"
date: "2011-01-27"
--------------------------------------------------------------------------------
{{< twitter "wadakei" >}} さん向けの情報。
うちはこんな設定でした。


会社の PC だと自動ログインできないのは何故なんだろう???
--------------------------------------------------------------------------------
title: "MacPorts の使い方まとめ"
date: "2011-01-27"
--------------------------------------------------------------------------------
```
# MacPorts 自身のアップデート
% sudo port selfupdate
# アップデートが必要なパッケージがあるかの確認
% port outdated
# パッケージを指定してアップデート
% sudo port upgrade
# 一括アップデート
% sudo port upgrade outdated
# パッケージを検索する
% port search
# パッケージの依存関係を調べる
% port deps
# パッケージの variants を調べる
% port variants
# パッケージの情報を得る
% port info
# パッケージをインストールする。port に -y オプションを付けるとインストール前の確認ができる
% sudo port install
# パッケージをアンインストールする
% sudo port uninstall
# 古いバージョンのパッケージをアンインストールする
% sudo port uninstall inactive
# 全てのパッケージをアンインストールする。
% sudo port -f uninstall installed
# インストールしてあるパッケージをすべて表示
% port installed
# そのファイルがどのパッケージに属するか調べる。
% port provides
# パッケージに含まれているファイルを確認
% port contents
```
参考情報:
- [MacPortsでインストールしたものを最新版にアップデートする方法](http://doruby.kbmj.com/tmatsuzawa_on_rails/20090521/MacPorts_)
- [port コマンドの簡単な使い方 - MacPorts-JP](http://macports-jp.sourceforge.jp/wiki/index.php/port_%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)
- [port(1) - MacPorts-JP](http://macports-jp.sourceforge.jp/wiki/index.php/port%281%29)
--------------------------------------------------------------------------------
title: "『600万人の女性に支持されるクックパッドというビジネス』を読んだ"
date: "2011-01-23"
--------------------------------------------------------------------------------
{{< amazon "4827550719" >}}
発売から1年半以上経って {{< post "2009-05-17-3" >}} ようやく購入。予想以上に面
白かった。クックパッドは「料理を楽しくする」ことだけを考え、実行し
続けてきたことがよく分かった。常にユーザ視点。Web 関係者は読んだ方
が良さそう。
--------------------------------------------------------------------------------
title: "『アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~』を読んだ"
date: "2011-01-22"
--------------------------------------------------------------------------------
{{< amazon "4839924023" >}}
マネージャー向け。メンバーは『アジャイルプラクティス』
{{< post "2010-05-05-2" >}} がちょうど良い。
私には説明が冗長かつ分かり辛く感じられたので、各章のまとめを中心に
流し読みした。最後のケーススタディは実際のプロジェクトに使う時の参
考になりそう。
追伸: 去年の 6/3 に {{< twitter "simon6867" >}} 氏に借りて、今の今まで積んでました。
ごめんなさい。
--------------------------------------------------------------------------------
title: "StatusNet Desktop から StatusNet を使おう"
date: "2011-01-22"
--------------------------------------------------------------------------------
[StatusNet Desktop](http://status.net/desktop)
純正のクライアントソフトがあるとは知りませんでした。orz
{{< twitter "crontab33" >}} さん、ありがとうございます。
{{< figure src="/images/StatusNet_Desktop_s.png" link="/images/StatusNet_Desktop.png" target="_blank" rel="noopener" alt="画像" >}}
上のスクリーンショットは Windows 版です。他に [OSX 10.5 Intel]
[Linux Intel 32-bit] [Linux Intel 64-bit] があるようです。
## Web 版より良いところ
- 勝手に自動リロードしてくれる。
- 間違って Enter してもツイートしない。
## Web 版より悪いところ
- 一画面に表示されるツイート数が少ない。
- 過去のツイートを辿れない。
- 削除されたツイートがいつまでも表示される。再起動してもダメ。
ローカルでキャッシュを持っているみたい。
- 動きがもっさりしている。
すごく良いクライアントではありませんが、選択肢が増えるのは良いことです。
あ、試していませんが、iPhone 版もありました。
**追記(2011-01-24):**
クリーンルームだと以下のエラーが発生し、インストール出来ませんでした。。

--------------------------------------------------------------------------------
title: "『古事記・日本書紀を歩く—神話と伝説の世界を訪ねて』を読んだ"
date: "2011-01-16"
--------------------------------------------------------------------------------
{{< amazon "4533072623" >}}
{{< post "2009-05-16-2" >}} に買ってから 1 年半以上経ってしまった。鈴木三重吉氏
の『新版 古事記物語』は読みづらくて挫折したが、こちらは写真が多く使
われていてやや読みやすい。どちらにしろ神様の名前って覚え辛いよね。
--------------------------------------------------------------------------------
title: "『iPhone情報整理術 ~あなたを情報’’強者’’に変える57の活用法!』を読んだ"
date: "2011-01-16"
--------------------------------------------------------------------------------
{{< amazon "4774140279" >}}
[dankogai の書評](http://blog.livedoor.jp/dankogai/archives/51309988.html)を盲信して買った。iPhone を使い倒して情報を整理する
ための 57 の方法が紹介されている。内容は悪くない。使えそうな方法を
取り入れるつもり。まずは RSS 整理法かな。
--------------------------------------------------------------------------------
title: "所有しない生活"
date: "2011-01-04"
--------------------------------------------------------------------------------
最近はクラウドサービスやら、カーシェアリングやら、便利なサービスが発達してきて、自分で全部所有しなくても良い時代になりつつあります。
年末に(自分の脳内に)イベントが降ってきたので、いろいろ所有しないことにしました。
## メール→クラウドに移行
iPhone4 を使い始めてから、nifty の POP から Gmail の IMAP に移行しました。それまでのメールはまだ PC の中に入っていたので、全部 Gmail にインポートしました。
これでメールのバックアップを考える必要がなくなりました。
IMAP なので普通にメーラからアップすれば良いのですが、タイムスタンプが変わってしまうのが嫌だったので、以下のようにしました。
メールソフト(Mew) ー(IMAP)→ masutaka.net(さくらのレンタルサーバ) ー(Mail Fetcher)→ Gmail
[GMailにメールを完全移行する](http://gmail.1o4.jp/import.html)を参考にしました。でも、今は goo メールアドバンスで IMAP は使えないようです。
あ、試すと分かりますが、Gmail の Mail Fetcher はすごく時間がかかります。1 万通だと、3〜4 日くらいでしょうか。。。
## CD→全部売却

物理的に場所を取るので、上の写真にある 130 枚全てを {{< wikipedia word="AAC" text="AAC" >}} に変換して iPhone4 に突っ込みました。
最初は mp3 にする予定でしたが、聞き比べたら AAC のほうが音質が良かったので、AAC を選択しました。ちなみに AAC は Apple とは関係ありません。
最近の CD/DVD ドライブは 1 枚 3 分ほどで抽出出来るので、そんなに苦ではありませんでした。iTunes の曲名推測が賢く、ほぼ全て合っていたのも大いに助かりました。
抽出し終わった CD は全てブックオフに売りました。すっきり。
## ゲーム→全部売却
ゲームは時間を取られますから、思い切って同じくブックオフに売りました。どうしてもやりたくなったら、また買えばいいですから。※ PS3+Torne は売ってません。
## NTT固定電話→解約
{{< post "2010-03-06-1" >}} の時は IP 電話に移行しないことにしましたが、イベント効果で移行することにしました。
[回線の休止・解約 | 回線のお手続き | 電話のお手続き | NTT東日本 Web116.jp](http://web116.jp/shop/a_line/cancel.html)
「利用休止」ではなく、迷わず「解約」を選択しました。
今後加入する必要が出たとしても、「加入電話・ライトプラン」なら施設設置負担金(昔は電話加入権と呼ばれていた)を払う必要ありませんし、「ひかり電話」って選択肢もあるようですし。
[概要 | 加入電話・ライトプラン | 回線サービス | 電話商品・サービス | NTT東日本 Web116.jp](http://web116.jp/shop/annai/sinl/sinki_00.html)
[ひかり電話 | 回線サービス | 電話商品・サービス | NTT東日本 Web116.jp](http://web116.jp/opt/hikaridenwa/index.html)
ただ、「解約」の手続きが曲者でした。「利用休止」と違って Web から手続き出来ません。116 に電話して、後日送られてくる書類を送り返すことになりました。
**追記(2011-01-16):**
送られてきた書類に署名&捺印して、NTT に送りました。後日携帯に確認の連絡があり、無事解約となりました。
--------------------------------------------------------------------------------
title: "Firefox アドオン Operator を利用してラングリッチの授業予約を簡単に Google Calendar に登録する。"
date: "2010-12-19"
--------------------------------------------------------------------------------
実は8月の終わりから、[ラングリッチ](http://langrich.com/)というオンライン英会話スクールに通ってます。通ってますといっても Skype のビデオチャットなので、学校は自宅の PC の前です。基本毎日フィリピンの先生とお話ししてます。
さて、先日こんなツイートをしました。
{{< tweet user="masutaka" id="15440852511887360" >}}
このなにげないツイートに、なんとラングリッチのスーパーエンジニア {{< twitter "tomoyaton" >}} が応えてくれました!
[Microformats を利用してラングリッチの授業予約を簡単に Google Calendar に登録する。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20101219/1292745978)
どうやら、ラングリッチのマイページには hCalendar という、イベントやカレンダーを扱える microformat の技術が使われているそうです。Web ブラウザがこれを扱えれば、Google Calendar に登録できるとのこと。
{{< twitter "tomoyaton" >}} さんのページでは Google Chrome の例が示されていましたが、私は Firefox 使いなのでちょっと調べてみました。
1. [Forefox アドオン Operator](https://addons.mozilla.org/ja/firefox/addon/operator/) をインストールし、Firefox を再起動すると Operator のツールバーが出現する。
2. ラングリッチのマイページに行くと、Operator のツールバーの「イベント」に予約数が表示される。クリックすれば、Google Calendar に登録できる。

これだけです。:-)
Google Chrome のように、ページ内にアイコンを表示させられると良いですね。登録しようとすると、イベント名が先生の名前になってしまいます。手動で変えるのは面倒なので、「ラングリッチ(先生の名前)」にしたいです。
もちろん、ics 形式で出力してくれるのが一番うれしいですけどね。
**追記(2013-08-20):**
まさか自分が実装することになるとはw
※ {{< post "2011-04-22-1" >}}に退職して、[2012/03/28](http://blog.langrich.com/2012/03/28/ical/)に実装完了した。
--------------------------------------------------------------------------------
title: "『君がオヤジになる前に』を読んだ"
date: "2010-12-04"
--------------------------------------------------------------------------------
{{< amazon "4198630496" >}}
面白かった。{{< twitter "takapon_jp" >}} が普段から言っていることが凝縮されている。
これまでの本と違うのは、ネガティブな自分をさらけ出していること。今
分からないことも正直に書いている。
--------------------------------------------------------------------------------
title: "最近買ったデジタルガジェット"
date: "2010-11-15"
--------------------------------------------------------------------------------
## リュウド アールボードフォーケイタイRBK-2100BTJ Ver.2.1(Bluetooth HID、JIS配列) RBK-2100BTJ
{{< amazon "B001AVXD9S" >}}
iPhone4 用の Bluetooth キーボードとして買いました。ちょっと長めのメー
ルを書いたり、ツイートしたり、会議のメモを書くのに重宝しています。
スタンドが内蔵されていて、ジャキジャキジャキーンと外に出せます。
ちょっとカッコイイかもです。(全体の作りはややチープですが...。)
最初のペアリングは簡単です。それ以降も何かキーを押せばすぐに繋がり
ます。キーストロークも意外にあり、悪くないです。
と、このように非常に便利ではありますが JIS 配列を買ったのは失敗でし
た。iPhone4 が対応していないようで、付属のシールを貼って結局 US 配
列にすることになります。キーの配置もやや特殊で、未だに慣れません。
iPhone4 で使う人は素直に Mac 用 US 配列を買いましょう。
{{< amazon_link asin="B00405DR8I" title="リュウド アールボードフォーケイタイRBK-2200BTi (Bluetooth HID、Mac用US配列) RBK-2200BTi" >}}
日本語と英語の切り替えは cmd+space で出来ます。cmd+c、cmd+x、cmd+v、
cmd+a でコピー、切り取り、貼り付け、全選択ができます。Shift+カーソ
ルキーで任意の文字列の選択です。
## EXOGEAR iPhone4用バッテリージャケット exolife ブラック E125
{{< amazon "B0040XGIG8" >}}
つい勢いで買ってしまいました。。。
バッテリー持ちを良くしたい人にはお勧めです。
まず良い点。
- バッテリー持ちが2倍になります。
- 普通のケースと同様、受信干渉問題が解消されます。
- 手でスピーカーを塞ぐことがなくなります。
- iPhone4 のデザインを損ないません。
- 単純に合体がカッコイイです。
{{< youtube "YB9JKuxOaQY" >}}
次に悪い点。
- デカくて重いです。リュウドのスタンドが辛そうです。
- 外部端子が小さくなるので(マイクロ USB 端子になるので)、充電しづら
くなります。
## Creative T12 Wireless デスクトップ ステレオワイヤレス スピーカーシステム Bluetooth SP-T12W
{{< amazon "B004184YKY" >}}
結論から言えば買いです。良い音とかよく分かりませんが、
値段(¥7,000〜¥8,000)のわりに重低音が効いていると思います。
何より、iPhone4 とワイヤレスで繋がるのが素晴らしいです。時代はもう
ワイヤレスでしょう。ケーブルとか意味が分かりません。笑
当然、普通の Bluetooth 対応の PC とも繋げられますし、Bluetooth トラ
ンスミッタ {{< post "2009-08-29-1" >}} を付ければ未対応の PC でも繋げられます。
ラインインも付いているので、普通のスピーカーとしても使えます。
Bluetooth 共通の問題として、iPhone4 と繋げるつもりが他の PC に繋がっ
てしまうとかはあります。一旦 OFF にするしかないでしょうね。
## torne(トルネ)(CECH-ZD1J)
{{< amazon "B0034KZXBO" >}}
いや〜、買って良かったです。
HDD レコーダーを買うほどテレビは見ませんが、時々録画したいことがあ
るし何より安かったので、近所のゲーム屋で見てすぐに買いました(いわゆ
る衝動買いです)。
これ、PS3 が起動していない赤ランプ状態でも録画してくれるのですね。
HDD レコーダーとしては当たり前のことですが、正直期待していなかった
のでかなりうれしいです。
おっかけ再生も出来ますし、外付け HDD にも対応しているようです。
PS3 持っている人は、HDD レコーダー買う必要ないのでは。。。
最近はゲームをやらないので、うちの PS3 は完全に torne 専用マシンで
す。
唯一気になるのは torne の起動時間ですかね。今後のバージョンアップに
期待です。
で、今度のバージョンアップでは、[Twitter に投稿された番組のコメント
がTV視聴と同時に楽しめる『ライブ機能』が追加されるそう](http://www.jp.playstation.com/info/release/nr_20101118_torne_v210.html)です。これ
は楽しみ。
**追記(2010-11-21):**
torne を買ったことを忘れていました。追加しました。
--------------------------------------------------------------------------------
title: "『小泉八雲全集〈第1-17巻〉』の「耳無芳一」を読んだ"
date: "2010-11-13"
--------------------------------------------------------------------------------
{{< amazon asin="B000JAUEPW" title="小泉八雲全集〈第1-17巻〉 (1926年) -" >}}
この中の『耳無芳一』を [iPhone の青空文庫アプリ「i文庫」](http://ipn.sakura.ne.jp/ibunko/)で読んだ。平氏鎮魂の話ですね。なぜだか分からないけど読んでいると、自分も目が見えないような不思議な感覚になった。
--------------------------------------------------------------------------------
title: "『新美南吉童話集』の「ごん狐」と「手袋を買いに」を読んだ"
date: "2010-11-13"
--------------------------------------------------------------------------------
{{< amazon asin="4003115015" title="新美南吉童話集 (岩波文庫 緑 150-1)" >}}
[iPhone の青空文庫アプリ「i文庫」](http://ipn.sakura.ne.jp/ibunko/)で『ごん狐』と『手袋を買いに』を読んだ。小学校の教科書か何かで読んだ以来で内容を忘れていたけど、どちらも良かった。昔を思い出す。
--------------------------------------------------------------------------------
title: "『そこまで言うか!』を読んだ"
date: "2010-11-03"
--------------------------------------------------------------------------------
{{< amazon "4905042003" >}}
iPhone の電子書籍版を買った。82 ページで ¥1,000(書籍版だと 416 ペー
ジ、¥1,575) は割高感があったが、電子書籍用に再構成されており(コメ
ントが全部顔写真付き&色分け)読みやすかったので、まあ OK か。
内容がくだけているのでサクサク読めるし、3 人の考えがよく分かった。
ただ、ページの途中や全体が真っ黒になることがあるのは頂けなかった
(iPhone のホームまで戻ったり、いろいろやると直った)。
--------------------------------------------------------------------------------
title: "『夢をかなえる「打ち出の小槌」』を読んだ"
date: "2010-10-11"
--------------------------------------------------------------------------------
{{< amazon "4903853721" >}}
この本自体がショートカットの塊で、{{< twitter "takapon_jp" >}} の考えが簡潔にまとめ
られている。筆者の本は数冊しか読んだことはないが、一番面白く刺激に
なった。
--------------------------------------------------------------------------------
title: "『悪人(下)』を読んだ"
date: "2010-10-10"
--------------------------------------------------------------------------------
{{< amazon "4022645245" >}}
どの登場人物も袋小路に迷い込んでいるような、そんな気がした。最後は
スッキリしないけど、映画よりもエピローグ多めなのは良かった。
--------------------------------------------------------------------------------
title: "『悪人(上)』を読んだ"
date: "2010-10-10"
--------------------------------------------------------------------------------
{{< amazon "4022645237" >}}
映画より話が細かく展開していて、面白かった。
--------------------------------------------------------------------------------
title: "twittering-mode.el 本家に StatusNet 対応が commit された"
date: "2010-08-22"
--------------------------------------------------------------------------------
[本家に取り込んで頂けた](http://github.com/hayamiz/twittering-mode/compare/2497eef4b5...ee4604a345)ので、{{< post "2010-07-18-2" >}} の記事を全体的に書き換え
ました。
--------------------------------------------------------------------------------
title: "StatusNet-0.9.4 がリリースされてた"
date: "2010-08-17"
--------------------------------------------------------------------------------
[0.9.4 がリリースされてました。](http://status.net/2010/08/16/statusnet-0-9-4-released)
今回も私は関係ない修正ばかりかな?
アップデートしましたが、よく分かりませんでした。アップデート手順は
今まで {{< post "2010-05-05-1" >}}{{< post "2010-07-01-1" >}} と同じです。
あ、twittering-mode.el {{< post "2010-07-18-2" >}} からツイートできることも確認
しました。
--------------------------------------------------------------------------------
title: "『Debug Hacks -デバッグを極めるテクニック&ツール』を読んだ"
date: "2010-08-10"
--------------------------------------------------------------------------------
{{< amazon "4873114047" >}}
{{< twitter "yasukichi7" >}} 氏から借りた本。
KAHO を使った、プログラムを変更せずに任意の関数を置き換える方法は存
在すら知らなかったので、これだけでも読んだ価値があった。キャッシュ
ミスの削減方法も少々参考になった。
--------------------------------------------------------------------------------
title: "Mew の g=>C-s のフォルダ名検索に migemo を使う"
date: "2010-08-04"
--------------------------------------------------------------------------------
iPhone4 を買ったので、メール環境を mbox から Gmail の IMAP に移行し
ました。
いつでもどこでもメールを見られるのは便利ですねえ。これでネットから
隔離された実家に帰っても大丈夫そうです。
頻度が減ったとはいえ、Mew からも Gmail を読むことがあります。ただ、
Gmail ではデフォルトのメールフォルダ名が日本語です。
%[Gmail]/
%[Gmail]/すべてのメール
%[Gmail]/ゴミ箱
%[Gmail]/スター付き
%[Gmail]/下書き
%[Gmail]/迷惑メール
%[Gmail]/送信済みメール
`g' => `C-s' での移動が面倒です。正直やってられません。
`g' => [TAB] なんてもってのほかです。
以下の設定をして、`g' => `C-s' から migemo を使えるようにしました。
```elisp
(defadvice mew-input-folder-search-forward-1
(around
mew-input-folder-search-forward-1-with-migemo
activate)
"migemo を使ってフォルダ名を検索する。"
(let ((migemo-do-isearch t))
ad-do-it))
```
--------------------------------------------------------------------------------
title: "Web サイトを再帰的に取得してみた"
date: "2010-07-21"
--------------------------------------------------------------------------------
最近のサイトは昔より複雑になっているので、意外に大変ですねえ。。
ここは静的なページで構成されているので、サクッと取得出来ました。
```
% wget -r -l 1 -k -p http://jibun.atmarkit.co.jp/lskill01/rensai/tool10/05/01.html
```
-r は再帰的に取得、-l num は取得する階層の深さです。-k はリンクをロー
カルコピー間の相対リンクに変換し、-p は画像やそのほかの補助ファイル
もダウンロードしてページを完全構築します。
次に http://gihyo.jp/dev/serial/01/testlink を試しましたが、ちょっ
と無理ですねえ。やり方あるんでしょうか。[GetHTMLW](http://www.vector.co.jp/soft/win95/net/se077067.html) でも出来ませんでした。
そういえば、ダイヤルアップ時代には{{< wikipedia word="波乗野郎" text="波乗野郎" >}}をよく使ってました。懐か
しいなあ。
参考情報: [ITmedia Biz.ID:Wgetでオンライン保管資料をローカルコピー](http://bizmakoto.jp/bizid/articles/0610/24/news014.html)
**追記(2010-07-22):**
[Firefox アドオン ScrapBook](http://amb.vis.ne.jp/mozilla/scrapbook/index.php) を教えてもらいました。GetHTMLW よりは良
い感じです。
--------------------------------------------------------------------------------
title: "twittering-mode.el から StatusNet を使おう"
date: "2010-07-18"
--------------------------------------------------------------------------------
twittering-mode.el は、Emacs で動作する Twitter クライアントです。
詳細は[オフィシャルサイト](http://twmode.sourceforge.net/ja/)をご覧下さい。
最新リリース版 v1.0.0 は対応していませんが、2010.8.22 から Git 最新
版で StatusNet を使えるようになりました!
Twitter で出来ることはほとんど StatusNet で出来ます。ただし、
StatusNet がサポートしていない機能は使えません。例えば、`V' からの
:retweeted_by_me, :retweeted_to_me, :retweets_of_me や `L' からのリ
ストです。
## インストールの手引き
GitHub からソースコード一式をダウンロードします。
http://github.com/hayamiz/twittering-mode/archives/master
EmacsWiki の「インストールの手引き」に従ってインストールします。
http://www.emacswiki.org/emacs-ja/TwitteringMode-ja
StatusNet 固有の設定をします。以下は StatusNet を
http://example.com/statusnet/ に構築し、{{< post "2010-04-18-3" >}} の Fancy
URLs の設定を行った場合の設定になります。
```elisp
(setq twittering-service-method 'statusnet)
(setq twittering-auth-method 'basic)
(setq twittering-username "StatusNetのアカウント")
(setq twittering-api-host "example.com")
(setq twittering-api-search-host "example.com")
(setq twittering-web-host "example.com")
(setq twittering-api-prefix "statusnet/api/")
(setq twittering-search-api-method "statusnet/api/search")
(setq twittering-web-path-prefix "statusnet")
```
SSL を使っていなければ、こちらも設定してください。
```elisp
(setq twittering-use-ssl nil)
```
## 今後の予定
StatusNet にはハッシュタグやグループ用の API があるので、対応したい
です。
## おまけ
StatusNet のデモサイト http://identi.ca/ でも使うことが出来ます。
```elisp
(setq twittering-service-method 'statusnet)
(setq twittering-auth-method 'basic)
(setq twittering-username "StatusNetのアカウント")
(setq twittering-api-host "identi.ca")
(setq twittering-api-search-host "identi.ca")
(setq twittering-web-host "identi.ca")
(setq twittering-api-prefix "api/")
(setq twittering-search-api-method "api/search")
(setq twittering-web-path-prefix "")
```
**追記(2010-08-22):**
[本家に取り込んで頂けた](http://github.com/hayamiz/twittering-mode/compare/2497eef4b5...ee4604a345)ので、全体的に書き換えました。
--------------------------------------------------------------------------------
title: "先週と今週の買い物"
date: "2010-07-18"
--------------------------------------------------------------------------------
## アジュバン RE:エミサリーシャンプー 300ml
このシャンプーに変えたら頭皮の痒みがなくなりました。リンスを使わな
くても良いのが楽ですね。シャンプーだけでシットリします。
## アジュバン Re:エミサリーローション 125g
良いそうなので勢いで買ってしまいました。すーっとします。
## シャープ EC-BP3 掃除機サイクロンクリーナー用フィルター
フィルターを掃除するのが面倒になったので、新しいのを買いました。買っ
てから知ったのですが、これ水洗いできるのですね...。ま、いいか。
--------------------------------------------------------------------------------
title: "『稼げる 超ソーシャルフィルタリング』を読んだ"
date: "2010-07-10"
--------------------------------------------------------------------------------
{{< amazon "490385387X" >}}
{{< twitter "wadakei" >}} さんから借りた。
内容は目新しいものがなかったが、著者の意見が簡潔かつ明確に書かれて
いて読みやすかった。1時間で読めた。
メーリングリストを使っていない会社ってまだあるんだ...。
--------------------------------------------------------------------------------
title: "『IT批評 創刊号』を読んだ"
date: "2010-07-08"
--------------------------------------------------------------------------------
{{< amazon "4904920007" >}}
2010.7.3 購入。タイトルから往年のパソコン批評を思い出して買ったが、
内容が固く地味で面白くなかった。
--------------------------------------------------------------------------------
title: "『拝金』を読んだ"
date: "2010-07-04"
--------------------------------------------------------------------------------
{{< amazon "4198629668" >}}
2010.7.3 購入。3時間くらいで読めた。欲にまみれて欲を突き抜ける、
これは仏陀に通じるものがある(キリッ
--------------------------------------------------------------------------------
title: "Mew の Draft-mode で次や前の草稿にジャンプする"
date: "2010-07-04"
--------------------------------------------------------------------------------
Summary-mode での C-c C-o (今開いている任意の草稿にジャンプする) は
便利なのでよく使いますが、Draft-mode でも同じことをやりたかったので、
適当な関数を作りました。
```elisp
(defun mew-draft-jump-to-next-buffer (&optional previous)
"Jump to next draft buffer if exists."
(interactive "P")
(let* ((draft-dir (file-name-as-directory mew-draft-folder))
(regex (mew-folder-regex draft-dir))
(bufs (sort (mew-buffer-list regex) 'string<))
next-list next-buf)
(if previous (setq bufs (reverse bufs)))
(setq next-list (cdr (member (buffer-name) bufs)))
(setq next-buf (if next-list (nth 0 next-list)
(nth 0 bufs)))
(if (and (get-buffer next-buf)
(not (equal next-buf (buffer-name))))
(switch-to-buffer next-buf)
(message "No such other draft buffer!"))))
(defun mew-draft-jump-to-previous-buffer ()
"Jump to previous draft buffer if exists."
(interactive)
(mew-draft-jump-to-next-buffer t))
```
実は今回一番悩んだのがキーバインドでした。C-c F1 で調べたところ、ほ
とんど空いていませんでした。仕方がないので、vi っぽく j と k を使う
ことにしました。
```elisp
(define-key mew-draft-header-map (kbd "C-c C-j") 'mew-draft-jump-to-next-buffer)
(define-key mew-draft-header-map (kbd "C-c C-k") 'mew-draft-jump-to-previous-buffer)
(define-key mew-draft-mode-map (kbd "C-c C-j") 'mew-draft-jump-to-next-buffer)
(define-key mew-draft-mode-map (kbd "C-c C-k") 'mew-draft-jump-to-previous-buffer)
```
--------------------------------------------------------------------------------
title: "StatusNet-0.9.3 がリリースされてた"
date: "2010-07-01"
--------------------------------------------------------------------------------
[0.9.3 がリリースされてました。](http://status.net/2010/06/29/statusnet-0-9-3-released)
今回もマイナーバージョンアップのようです。
Admin -> Design から css を変更出来るようになりました。
プロファイルに Daily average が表示されるようになりました。
他は私にはあまり関係ないかな。
前回 {{< post "2010-05-05-1" >}} と同じ手順でアップデート出来ました。
日本語パッチ {{< post "2010-04-18-2" >}} は今回も必要でした。
会社の StatusNet はまだアップデートしてませんが、{{< post "2010-04-18-5" >}}
{{< post "2010-04-29-2" >}} {{< post "2010-04-18-6" >}} のパッチは必要そうです。
**追記(2010-07-07):**
会社でもバージョンアップしました。どのパッチも問題なく充てることが
出来ました。
--------------------------------------------------------------------------------
title: "『メールの超プロが教えるGmail仕事術』を読んだ"
date: "2010-06-24"
--------------------------------------------------------------------------------
{{< amazon "476313048X" >}}
どちらかというと Gmail 初心者向けの本。大量のメールの仕分け方や、スパム対策などがサラリと書いてあって読みやすい。個人的にはスパムフィルターオフの方法が参考になった。
--------------------------------------------------------------------------------
title: "今週の買い物"
date: "2010-06-20"
--------------------------------------------------------------------------------
## ウェーブチェア 5G
PC のモニターをテレビにしたら {{< post "2010-05-30-1" >}} 腰が痛くなってきたので、
座椅子を買いました。ソファーを買うまでもないけど、普通の座椅子は安っ
ぽくて嫌、という方にお勧めです。
作りがしっかりしていますし、頭、腰、脚部がそれぞれ、5,14,14 段階リ
クライニングするので、一番楽な姿勢になれます。ただ、腰の部分に隙間
ができるので、クッション等あてないと疲れるかもしれません。
似た商品の[ウェーブチェア FG](http://item.rakuten.co.jp/i-office1/5904020/) は、「床面がフローリングや畳で使用する
場合、ジュータンやカーペット等の敷物をしいてください。」とのことな
ので、注意した方が良いです。ウェーブチェア 5G は「床へのキズ防止も
バッチリ!」なので、問題ありません。
## ウエーブチェア座椅子用カバー(ベージュ)
「ウェーブチェア 5G」の表面の生地は取り外しができないので、汚れ対策
のためカバーも購入しました。麻っぽい質感で肌触りがよいです。
問題は、付けるとダサくなることでしょうか...。元の座椅子はそこそこお
しゃれなデザインなので、少し残念です。
## SanDisk 2GB microSD カード SD アダプタ付 バルク品
{{< amazon "B000T93Q3K" >}}
[W51CA](http://k-tai.casio.jp/products/w51ca/) 用に買いました。メーカー保証のないバルク品ですが、大した用途
には使わないので安さ重視にしました。SD アダプタ付きで ¥600 は安い!
## ロジクール ワイヤレスマウス M505 ライトシルバー M505LS
{{< amazon "B002MRR22I" >}}
{{< post "2010-05-30-1" >}} のマウスが使いやすいので、会社用にもう一台買いました。
色まで同じです。ヨドバシより Amazon の方が ¥1,000 くらい安かったです。
--------------------------------------------------------------------------------
title: "「Anthy の変換精度を上げる方法」を試した"
date: "2010-06-20"
--------------------------------------------------------------------------------
[適当に… » Blog Archive » Anthyの変換精度を上げる方法](http://www.josw.net/blog/?p=1203)
Anthy が~~バカ~~ユニークな変換をするのは、物忘れをしやすいからみたいで
す。早速設定しました。しばらく様子を見ることにします。
```
# su -
# chattr +a ~masutaka/.anthy/last-record2_default.utf8
```
"man chattr" によると、chattr は「Linux 第 2 拡張ファイルシステム
(ext2fs) 上にある ファイルの属性 (attribute) を変更する」コマンドだ
そうです。ファイルに圧縮属性を付けたり、root でも消せないファイルを
作れたり、面白そうなコマンドです。
属性の確認は lsattr で行います。ユーザ権限でも実行できます。
```
% lsattr
-----a------------- ./last-record2_default.utf8
------------------- ./lock-file_default
------------------- ./private_words_default
------------------- ./last-record1_default.utf8
```
~/.anthy 以下のファイルの説明は [Anthy wiki - FAQ](http://anthy.sourceforge.jp/cgi-bin/hiki/hiki.cgi?FAQ) にあります。
元になったツイートです。ありがとうございます。
{{< tweet user="stillpedant" id="16588117147" >}}
--------------------------------------------------------------------------------
title: "Debian squeeze で Windows キーを GNOME メインメニュー表示に割り当てる"
date: "2010-06-20"
--------------------------------------------------------------------------------
$HOME を掃除したら、Windows キーを「GNOME メインメニュー」の表示に
割り当てられなくなりました。どうやら squeeze から変更されたようです。
たまたま[某サイト](http://pc11.2ch.net/test/read.cgi/linux/1274866441/569)で方法が分かったので、メモします。
1. 「GNOME メインメニュー」→「システムツール」→
「設定エディタ(gconf-editor)」を起動する。
2. /apps/metacity/global_keybindings/panel_main_menu を右クリックし
て「キーの編集」を選び「値」欄に Super_L と入力する。
設定エディタは Windows のレジストリエディタと似たようなものだそうで
す。そのため、できるだけ GNOME アプリケーションが用意する設定インター
フェースを使用すべきです。
今回の場合だと GNOME が用意する設定インターフェースは「GNOME メイン
メニュー」→「システム」→「設定」→「キーボード・ショートカット」
になります。
過去の記事を検索したら {{< post "2005-11-07-1" >}} や {{< post "2007-03-11-3" >}} を見つけま
した。「Windows キー」→「C-p」でメニューを辿れるのは良いですね。
早速設定しました。
--------------------------------------------------------------------------------
title: "「Emacs23.2が更に1ビット稼いだ秘密」の自分用メモ"
date: "2010-06-19"
--------------------------------------------------------------------------------
「[Emacs23.2が更に1ビット稼いだ秘密 — ありえるえりあ](http://dev.ariel-networks.com/Members/inoue/emacs23.2)」の理解に時間
がかかったので、自分用にメモしておく。
Emacs23.1 の enum Lisp_Type は以下のように定義されていた。
| |
|---|---
|000|Lisp_Int
|001|空き
|010|Lisp_Symbol
|011|Lisp_Misc
|100|Lisp_String
|101|Lisp_Vectorlike
|110|Lisp_Cons
|111|Lisp_Float
enum Lisp_Type は オブジェクト変数(でいいのかな?) 32bit のうち、
下位 3bit に対応する。
Lisp_Int(= 下位 3bit 全てがゼロ)の時は、整数オブジェクトと判断する。
この場合、残り 29bit を符号と整数長として使える。
```
printf("Emacs23.1(%0.0fMB)\n", ((double)(0xffffffff >> (3 + 1)) / 1024 / 1024));
=> Emacs23.1(256MB)
```
整数長を計算すると 256MB になる。これが Emacs23.1 での最大バッファ
サイズ。
Emacs23.2 から enum Lisp_Type はこのように変更された。
| |
|---|---
|000|Lisp_Int0★変更
|001|Lisp_String★変更
|010|Lisp_Symbol
|011|Lisp_Misc
|100|Lisp_Int1★変更
|101|Lisp_Vectorlike
|110|Lisp_Cons
|111|Lisp_Float
整数オブジェクトを 2 つ (Lisp_Int0 と Lisp_Int1。両者は同じ意味) に
増やし、メンバーの並びを変えた。
これにより、下位 2bit がゼロかどうかで、整数オブジェクトと判断でき
るようになった。残り 30bit を符号と整数長として使える。
```
printf("Emacs23.2(%0.0fMB)\n", ((double)(0xffffffff >> (2 + 1)) / 1024 / 1024));
=> Emacs23.2(512MB)
```
同じように整数長を計算すると 512MB になる。これが Emacs23.2 での最
大バッファサイズ。
--------------------------------------------------------------------------------
title: "StatusNet API のパスを Twitter と同じにする方法"
date: "2010-06-19"
--------------------------------------------------------------------------------
{{< post "2010-05-16-1" >}} の補完です。
今回の記事は元々、twittering-mode で StatusNet を使うために書きまし
た。しかし、twittering-mode 側の修正で対応することにしたので、私は
今現在設定していません。ニッチな層向けに残しておくことにします。
Identifox, twittering-mode, TweetDeck 以外に使えるクライアントがあ
れば、教えて下さい!
さて、説明に入ります。
statusnet は http://example.com/statusnet/ に構築し、
{{< post "2010-04-18-3" >}} の Fancy URLs の設定を行ったものとします。
[StatusNet の API は Twitter-compatible です。](http://status.net/wiki/Twitter-compatible_API)
ただし、{{< post "2010-05-16-1" >}} で書きましたが、API の URL は少し異なります。
何らかの事情で Twitter クライアントを修正できない場合でも、Twitter
とパスを同じにすれば使えるかもしれません。Apache の mod_rewriteで置
換してみましょう。
※ /var/www は Debian における、Apache の DocumentRoot です。
## /var/www/.htaccess
以下を設定します。
```
RewriteEngine On
RewriteBase /
RewriteRule ^1/(.*)$ statusnet/api/$1
RewriteRule ^search(.*)$ statusnet/api/search$1
```
1 つ目の RewriteRule で http://example.com/1/* へのアクセスを、
http://example.com/statusnet/api/* に切り替えています。
この設定は必須です。
2 つ目の RewriteRule では検索時にアクセスする
http://example.com/search* を
http://example.com/statusnet/api/search* に切り替えています。
## /var/www/statusnet/.htaccess
{{< post "2010-04-18-3" >}} の設定も込みのパッチを貼り付けておきます。
```
--- /var/www/statusnet/htaccess.sample 2010-05-04 04:27:44.000000000 +0900
+++ /var/www/statusnet/.htaccess 2010-05-08 22:03:29.000000000 +0900
@@ -7,7 +7,7 @@
# http://example.com/ => /
# http://example.com/mublog/ => /mublog/
#
- RewriteBase /mublog/
+ RewriteBase /statusnet/
## Uncomment these if having trouble with API authentication
## when PHP is running in CGI or FastCGI mode.
@@ -15,6 +15,9 @@
#RewriteCond %{HTTP:Authorization} ^(.*)
#RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
+ # for twitter client
+ RewriteRule (.*)/status/(.*)$ notice/$2 [R=301,L]
+
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?p=$1 [L,QSA]
```
各ツイートへの URL を変更する設定です。
http://example.com/statusnet/<アカウント>/status/<ツイート番号> へ
のアクセスを、http://example.com/statusnet/notice/<ツイート番号> に
リダイレクトする設定です。
本当は /var/www/.htaccess に書きたかったのですが、うまくいきません
でした。
--------------------------------------------------------------------------------
title: "『武士道』を読んだ"
date: "2010-06-11"
--------------------------------------------------------------------------------
{{< amazon "456966427X" >}}
2010.4.17 購入。武士道が大衆にも広まった経緯のあたりは興味深かった。
明治の本だけど外国人向けに書かれた本なので、それほど読みづらくない。
訳も良いのかな。
--------------------------------------------------------------------------------
title: "『ちょいデキ!』を読んだ"
date: "2010-06-06"
--------------------------------------------------------------------------------
{{< amazon "4166605917" >}}
http://chalow.net/2009-05-17-3.html で知って、2010.4.17 に購入した。
これも読みやすかった。二日で読めた。凡人のためのちょっとした仕事術
が Q&A 形式でまとまっている。
--------------------------------------------------------------------------------
title: "『はじめての課長の教科書』を読んだ"
date: "2010-06-03"
--------------------------------------------------------------------------------
{{< amazon "4887596146" >}}
http://blog.livedoor.jp/dankogai/archives/50995105.html で知って、
2010.4.17 に購入した。読みやすかった。中間管理職向けの本って他にな
いと思う。
--------------------------------------------------------------------------------
title: "テレビとワイヤレスデバイスの組み合わせは最高"
date: "2010-05-30"
--------------------------------------------------------------------------------
2 週間ほど前から {{< post "2009-11-03-1" >}} に買った AQUOS 32 型テレビを PC の
モニタとして使っていますが、予想以上に使いやすいことが分かりました。
ええ、すごく良いです。
さっそく外観です。
{{< figure src="/images/wireless1-s.jpg" link="/images/wireless1.jpg" target="_blank" rel="noopener" alt="画像" >}}
向かって左下のシルバーの筐体がメインマシンの DELL Inspiron
530s(Debian GNU/Linux Squeeze) です。AQUOS の「入力 2」に繋げていま
す。Debian からの音声は、別途 Audio ケーブルを通じて AQUOS から出ます。
AQUOS の前にある VAIO W(WindowsXP) は D-sub ケーブルで「入力 7」に
繋げています。
「入力 2」と「入力 7」の音声入力は共通なので、「入力 7」の VAIO W
に切り替えても、DELL 側の音楽を聴き続けることができます。ただし、音
声は一瞬途絶えます。
手前にあるキーボードとマウスはワイヤレスです。DELL と繋がっています。
Synergy を使っているので{{< post "2009-07-20-3" >}}、VAIO W を操作することも出来
ます。
テレビ台に収まっているのは PS3 です。HDMI ケーブルで「入力 1」に繋
げています。
左斜め前から撮ってみました。
{{< figure src="/images/wireless2-s.jpg" link="/images/wireless2.jpg" target="_blank" rel="noopener" alt="画像" >}}
DELL がよく見えます。
右斜め前からも撮ってみました。
{{< figure src="/images/wireless3-s.jpg" link="/images/wireless3.jpg" target="_blank" rel="noopener" alt="画像" >}}
右下の白い箱は DVD/CD ドライブです。VAIO W と繋がっています。
WinDVD をテレビで表示出来るので、DVD プレイヤーが不要です。奥に見え
るのは {{< post "2010-03-03-1" >}} に買った、加湿空気清浄機です。
## AQUOS
{{< amazon asin="B002ANRN0K" title="SHARP 32V型AQUOS 地上・110度CSデジタルハイビジョン液晶テレビ LC-32DS6-B ブラック" >}}
{{< amazon asin="B000FP2H7O" title="ELECOM HDMI-DVI-Dケーブル CAC-HTD15" >}}
DELL と AQUOS は上の DVI->HDMI 変換ケーブルで繋げています。
ケーブルで繋げたら、AQUOS リモコンの「画面サイズ」ボタンから "Dot
by Dot" に切り替える必要があります。これをやらないと画面がはみ出ます。
他のテレビは知りませんが、AQUOS のインターフェースの充実度は異常だ
と思います。
- HDMI 入力×3
- D5 映像入力×2
- S2 映像入力×1
- ビデオ入力×3
- モニター出力×1
- アナログ RGB (いわゆる D-sub。PC 用)×1
- アナログ音声入力×1
- デジタル音声出力×1
- アンテナ入力 地上デジタル/地上アナログ(VHF/UHF)
- アンテナ入力 BS/110度 CS
- ヘッドホン用出力
- 電話回線
- LAN(10BASE-T/100BASE-TX)
- RS-232C
DVI 以外は全て揃っている感じです。RS-232C もあるのはさすがにビック
リしました。チャンネル切り替えや音量調節、入力切り替えなどが出来る
ようです。
さて、今までの液晶モニタ {{< post "2009-07-11-1" >}} から、こんな点が良くなりま
した。
- 画面が 22 インチワイドから 32 インチワイドになりました。
- 最大解像度が 1680x1050 から 1920x1080 に上がりました。
- 音が良くなりました。
YouTube やニコニコ動画を大画面で見られるようになったメリットは大き
いです。テレビを見てるのと変わりません。
ただ、テレビを見ながらのパソコン操作が少し不便になりました。VAIO W
の小さい画面を使うか、今までの液晶モニタを引っ張り出す必要がありま
す。「テレビ」「入力2」「入力7」の切り替えもスムーズとは言えません。
## ワイヤレスキーボードとマウス
{{< amazon asin="B002MRR23W" title="ロジクール ワイヤレスキーボード K340" >}}
{{< amazon asin="B002MRR22I" title="ロジクール ワイヤレスマウス M505 ライトシルバー M505LS" >}}
Linux での動作報告が少なかったので、人柱になる覚悟で購入しましたが、
あっさり使えて拍子抜けしてしまいました。Fn キーとの組み合わせ(音楽
の再生や停止、ボリューム調整等)も使えます。どちらも最大 10m 離れて
使えるそうです。
キーボードの打鍵感はとても良いです。今までのキーボード
{{< post "2009-11-03-1" >}} は、Enter や Space を押すときに良く引っかかっていま
した。
ただ、キーが Ctrl Fn Win Alt という並びになっているため、Win と
Alt を押し間違いやすいです。特に Alt-Tab を間違って Win-Tab してし
まいます。キーボードスタンドがないことと、汚れが目立ちやすい点も気
になります。
マウスはホイールボタンのクリックが少し固いことを除けば、良い感じです。
ホイールボタンを左右に動かすとクリックになります。合計 5 ボタンです。
両方とも電池の持ちが良いです。キーボードは 3 年、マウスは 15 ヶ月ら
しいです(今回ついでにエネループも買ってしまいました)。
Linux での制限事項についても書いておきます。
Windows だと Logicool が配布する SetPoint をインストールすることで、
キーの配置やマウスボタンへの機能割付等が出来るようです。でも、
Linux 版はありません。
[Unifying](http://www.logicool.co.jp/ja-jp/349/6072) も Linux 版はありません。Unifying をインストールすると 1
つのレシーバで最大 6 台までのデバイスを接続出来ますが、インストール
しないと 1 台しか認識させられないようです。キーボードとマウスに同封
している Unifying レシーバを、2 つとも PC の USB ポートに付ける必要
があります。ただ、驚くほど小さいサイズなので、気になることはないで
しょう。
以上ダラダラと書きましたが、やっぱりワイヤレスは良いです。キーボー
ドとマウスの操作がワンテンポずれるということは全くありませんし、ケ
ーブルがないので取り回しが楽です。モニタが大画面のテレビなので、部
屋の隅に持っていっても良く見えます。ま、今思えば 37 型を買えば良か
ったかなーと少し悔やんでいるくらいです。
参考情報:
[Wireless Keyboard K340](http://www.logicool.co.jp/ja-jp/keyboards/keyboard/devices/6007)
[Wireless Mouse M505](http://www.logicool.co.jp/ja-jp/mice_pointers/mice/devices/5870)
[indygrab.org » Blog Archive » AQUOSにPCをHDMIで接続](http://indygrab.org/blog/2007/08/26/aquos%e3%81%abpc%e3%82%92hdmi%e3%81%a7%e6%8e%a5%e7%b6%9a/)
--------------------------------------------------------------------------------
title: "『「法令遵守」が日本を滅ぼす』を読んだ"
date: "2010-05-25"
--------------------------------------------------------------------------------
{{< amazon "4106101971" >}}
http://ameblo.jp/takapon-jp/entry-10262279171.html で知って、
2010.4.17 に購入した。
元東京地検特捜部の著者の言葉には説得力があった。日本では単純に「法
令遵守」をしても、その場凌ぎの対応にならざるを得ない。法令の背後に
ある社会的要請に応えることこそコンプライアンスであり、その観点から
組織のあり方を考え直すことが重要である。
--------------------------------------------------------------------------------
title: "使用可能なフォントリスト"
date: "2010-05-22"
--------------------------------------------------------------------------------
http://pc12.2ch.net/test/read.cgi/unix/1265413075/83
以下の S 式を評価すると、現在のフレームで使用可能なフォントリストを
返す。
```elisp
(font-family-list)
```
--------------------------------------------------------------------------------
title: "TweetDeck から StatusNet を使おう"
date: "2010-05-22"
--------------------------------------------------------------------------------
[TweetDeck から StatusNet を使えるようになりました!!](http://status.net/2010/05/21/tweetdeck-supports-statusnet)
TweetDeck は、Mac, Windows, Linux, iPhone, iPod touch, iPad 等で動
作する Twitter クライアントです。今回は Windows 版で試しました。
インストールと StatusNet 向けの設定は前述の URL を参考にしてくださ
い。TweetDeck for Desktop は 0.34.1 以上である必要があります。
デフォルトの設定では日本語を表示できません。
Setting アイコンをクリック→
Color/Font のタブをクリック→
InternationalFont/TwitterKey にチェックを入れれば表示できます。
Web 版で悩まされてきた、Enter でのツイートは抑制出来ます。
Setting アイコンをクリック→
General のタブをクリック→
Press Enter to Send an Update のチェックを外せば OK です。
なぜか、パブリックタイムラインを表示出来ませんでした。
[そのうち対応されるのかな?](http://support.tweetdeck.com/entries/88359-please-add-an-option-to-check-the-public-timeline)
参考情報:
[Tweetdeck 日本語の設定](http://www.dougamanual.com/blog/180/1036/e4689.html)
**追記(2010-05-24):**
クリーンルームでは使えませんでした。初回起動時に必ず
Twitter/Facebook/MySpace のいずれかの認証を受ける必要があるためです。
非常に残念です。
**追記(2010-06-07):**
ある方経由で、開発元に問い合わせてもらっています。
**追記(2010-06-09):**
ダメでした。まだ対応する気はないとのことです。
気長に待ちましょう。。。
--------------------------------------------------------------------------------
title: "『会社をぶっ壊して、チームを創ろう!』を読んだ"
date: "2010-05-19"
--------------------------------------------------------------------------------
{{< amazon "4534044054" >}}
まあまあかな。「かき混ぜ隊」はツイッターで一部代替できるかもと思っ
た。社員が会社を良くしようという基盤がない状態で、多くの会社が根本
的な変革をしようとしているが、それは全く無意味ということが書いてあっ
たけど、それは全くその通り。
--------------------------------------------------------------------------------
title: "Twitter と StatusNet の URL の違い"
date: "2010-05-16"
--------------------------------------------------------------------------------
statusnet は http://example.com/statusnet/ に構築し、
{{< post "2010-04-18-3" >}} の Fancy URLs の設定を行ったものとします。
基本 API
| |ホスト名|パス
|---|---|---
|Twitter|http://api.twitter.com|/1/statuses/*.xml
|StatusNet|http://example.com|/statusnet/api/statuses/*.xml
検索 API
| |ホスト名|パス
|---|---|---
|Twitter|http://search.twitter.com|/search*
|StatusNet|http://example.com|/statusnet/api/search*
"20 minutes ago" や "in reply to hoge" のリンク先
| |ホスト名|パス
|---|---|---
|Twitter|http://twitter.com|/<アカウント>/status/<ツイート番号>
|StatusNet|http://example.com|/statusnet/notice/<ツイート番号>
ハッシュタグへのリンク先
| |ホスト名|パス
|---|---|---
|Twitter|http://twitter.com|/#search?q=%23<タグ名>
|StatusNet|http://example.com|/statusnet/tag/<タグ名>
参考情報:
[Twitter API - TwitterまとめWiki](http://usy.jp/twitter/index.php?Twitter%20API)
[Twitter-compatible API - StatusNet](http://status.net/wiki/Twitter-compatible_API)
--------------------------------------------------------------------------------
title: "elisp でマクロを含んだ関数のデバッグに便利な方法"
date: "2010-05-15"
--------------------------------------------------------------------------------
マクロを含んだ関数のデバッグをするために、ステップ実行しようとする
と一瞬で終わってしまうことがあります。これについて、ツイッターでア
ドバイスをもらったので、調べてみました。
例えば以下のコードで、hoge() をステップ実行しようとすると
hoge-only の式に入れず、ミニバッファに Result: "ccc" と表示され
一瞬で終わってしまいます。
```elisp
(defun hoge-p () t)
(defmacro hoge-only (&rest body)
`(cond
((not (hoge-p))
(message "This command can be used in hoge only"))
(t ,@body)))
(defun hoge ()
(hoge-only
(message "aaa")
(message "bbb")
(message "ccc")))
```
対策は簡単で、以下の S 式を評価するだけです。
```elisp
(def-edebug-spec hoge-only t)
```
どこかで見たことあるなあと思ったら、[mew-edebug.el](http://github.com/kazu-yamamoto/mew-contrib/blob/master/mew-edebug.el) でこれが使われて
いました。なぜ気づかない。。。
元になったつぶやきです。ありがとうございます。
{{< tweet user="cvmat" id="13952793940" >}}
--------------------------------------------------------------------------------
title: "『アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣』を読んだ"
date: "2010-05-05"
--------------------------------------------------------------------------------
{{< amazon "4274066940" >}}
2010.4.9 購入。アジャイルを理解するにはとても良い本。45 のプラクティ
スが簡潔に面白くまとめられている。
--------------------------------------------------------------------------------
title: "StatusNet のバージョンアップ"
date: "2010-05-05"
--------------------------------------------------------------------------------
[0.9.2 がリリースされた](http://status.net/2010/05/04/statusnet-0-9-2-released)ので、バージョンアップしました。
インストール {{< post "2010-04-18-1" >}} をお手軽にした感じでした。
## アップデート手順
※ "#" は root での作業、"%" は一般ユーザでの作業です。
### 1. Apache は終了させておきます。
># /etc/init.d/apache2 stop
### 2. http://status.net/ から tar ball を落とし、/var/www に展開します。
># cd /var/www
># tar xzf statusnet-0.9.2.tar.gz
### 3. 以前のバージョンと置き換えます。
># mv statusnet statusnet.bak
># mv statusnet-0.9.2 statusnet
### 4. 必要なファイルをコピーします。
># cd statusnet
># cp ../statusnet.bak/.htaccess .
># cp ../statusnet.bak/config.php .
># cp ../statusnet.bak/avatar/* avatar
># cp ../statusnet.bak/background/* background
># cp ../statusnet.bak/file/* file
### 5. アクセス権を適切に設定します。
># chown -R root:root .
># chown www-data:www-data . .htaccess config.php
># chown -R www-data:www-data avatar background file
### 6. 必要なパッチを当てます。
今回は {{< post "2010-04-18-2" >}} {{< post "2010-04-18-5" >}} のパッチを当て、
{{< post "2010-04-29-2" >}} の日本語を修正しました。
{{< post "2010-04-18-6" >}} は当てませんでした。{{< post "2010-04-29-3" >}} は
修正されていました。
### 7. Apache を起動します。
># /etc/init.d/apache2 start
README によると、今回の主な修正は OStatus がらみのバグフィックスの
ようです。他にもインストーラのバグが修正されています。
**追記(2010-05-22):**
なぜか Debian Lenny では locale を英語から他の言語に変更出来ません
でした。なんでだろう???
**追記(2010-05-25):**
Admin->パスに存在しないロケールのパスが書かれていたためでした。
--------------------------------------------------------------------------------
title: "DISQUS API を使って、過去のコメントをインポートする方法"
date: "2010-05-03"
--------------------------------------------------------------------------------
DISQUS は標準で IntenseDebate, JS-Kit, Movable Type, WordPress のコ
メントをインポートすることが出来ます。「[くっつき BBS](http://nais.to/~yto/tools/kuttukibbs/)」のインポート
は当然サポートされていません。
幸い、[WWW-Disqus](http://blog.as-is.net/2008/10/www-disqus.html) という [DISQUS API](http://groups.google.com/group/disqus-dev/web/api-1-1) を叩く Perl モジュールがあったの
で、これでインポートすることにしました。ありがたいことです。
これを使えば「くっつき BBS」に限らず、どのコメントシステムからも移
行は可能だと思います。
WWW-Disqus は若干古くなって動かなかったので、以下の修正が必要でした。
```
Index: lib/WWW/Disqus.pm
===================================================================
--- lib/WWW/Disqus.pm (リビジョン 695)
+++ lib/WWW/Disqus.pm (作業コピー)
@@ -57,8 +57,7 @@
my $obj = shift;
return 1
if $obj->{succeeded}
- && $obj->{succeeded}->{value}
- && $obj->{succeeded}->{value} eq 'true';
+ && $obj->{succeeded} eq 'true';
confess $obj->{message};
}
@@ -81,7 +80,7 @@
disqus_api_url( "get_forum_list", user_api_key => $user_api_key ) );
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -99,7 +98,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -118,7 +117,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -131,7 +130,7 @@
disqus_api_url( "get_thread_list", forum_api_key => $forum_api_key ) );
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -149,7 +148,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -167,7 +166,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -185,7 +184,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -203,7 +202,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
@@ -221,7 +220,7 @@
);
confess 'Failed to access DISQUS API: ' . $res->status_line
unless $res->is_success;
- my $obj = $this->{json}->jsonToObj( $res->content );
+ my $obj = $this->{json}->decode( $res->content );
return $obj->{message} if is_succeeded($obj);
}
```
WWW-Disqus のページのサンプルを参考にして、インポートしました。
```
#!/usr/bin/perl
use strict;
use warnings;
use WWW::Disqus;
# (★後述)
my $forum_name = 'your forum short name';
my $user_api_key = 'your user api key';
my $api = WWW::Disqus->new;
$api->user_api_key($user_api_key);
my $forum_id = $api->get_forum_id($forum_name);
my $forum_api_key = $api->get_forum_api_key($forum_id);
$api->forum_api_key($forum_api_key);
# The above 3 lines can be rewritten by using a helper method:
# $api->set_forum_api_key_by_forum_name($forum_name);
# (★後述)
my $identifier = 'test';
my $title = 'title';
my $url = "http://www.example.com/test.html";
# スレッドがなかったら作成。さらにスレッド情報を返す。
my $thread = $api->thread_by_identifier(
identifier => $identifier,
title => $title,
);
# まだ関連付けられていなければ、スレッドを URL と関連付ける。
unless ($thread->{thread}->{url}) {
$api->update_thread(
thread_id => $thread->{thread}->{id},
url => $url,
);
}
# これでコメントをポスト(★後述)
$api->create_post(
thread_id => $thread->{thread}->{id},
author_name => 'マスタカ',
author_email => 'masutaka@example.com',
message => '日本語も OK
このように改行も出来ます。',
# ↑ここまで必須
# ↓ここから任意
# UTC で指定する必要があるようなので、日本時間を 4 時間プラスする。
created_at => '2009-10-18T02:02',
author_url => 'http://www.example.com/',
);
use Data::Dumper;
# print Dumper( $api->get_thread_list() );
print Dumper( $thread );
```
上のスクリプトを見ると分かると思いますが、今回は手動でインポートし
ました。数が少なかったので、今回はこれが一番良い方法かと。
$forum_name は DISQUS の管理画面 SETTING->General から確認できる
Website shortname です。
$user_api_key は DISQUS にログインした状態で
http://disqus.com/api/get_my_key/ を参照すると取得出来ます。
これはとても大事な key なので、誰にも知られてはいけません。
$identifier, $title, $url は記事毎に設定します。
$api->create_post() の引数は、コメント毎に設定します。日本語のコメ
ントがある場合、スクリプトの文字コードは UTF-8 にしてください。
--------------------------------------------------------------------------------
title: "このブログのコメントシステムを DISQUS にしました"
date: "2010-05-03"
--------------------------------------------------------------------------------
{{< post "2008-09-29-1" >}} のバージョンアップ。
今まで「[くっつき BBS](http://nais.to/~yto/tools/kuttukibbs/)」を自サイト内に構築し使っていましたが、スパム
対策が面倒になってきた、コメントを書いた人が自分のコメントを修正で
きない等の理由から、[DISQUS](http://disqus.com/) という外部コメントサービスを使うことにし
ました。
同様にトラックバックも「くっつきトラックバック」を使っていましたが、
こちらは廃止しました。実はトラックバックはあまり好きではないのです。
(DISQUS の管理オプションを ON にすれば一応使えます。)
## 良くなった点
DISQUS のアカウントを作ると、自分のコメントの一覧表示や編集、アバター
機能やコミュニティ機能が使えるようになりました。(アカウントを作らな
くても投稿はできます。)
DISQUS アカウント以外にも Facebook, Twitter, OpenID でもログインで
きます。(ただ、Facebook は何かうまくいきません...。)
コメントを投稿するついでに Twitter や Facebook にも送信出来るように
なりました。(コメントが活発になることを期待。)
Twitter や FriendFeed でリアクションがあれば、コメントの下に表示さ
れるようになりました。
各コメントに返信すると、スレッド化するようになりました。
管理者はスパムのことを気にしなくてよくなりました。
管理者は全記事のコメントを一覧表示出来るようになりました。
## 悪くなった点
最近頂いたコメントは左側にあるウイジェットの RECENT で表示出来ます。

しかし、タイトルに日本語を含む記事にコメントすると、文字化けます。
文字化けるのは "2010-03-06-1 at chalow" の部分です。(この例では
DISQUS API を使ったため文字化けは発生していません。)
過去のコメントは既に移行済みです。これが一番大変でした。次の記事
{{< post "2010-05-03-2" >}} で説明します。
参考情報:
[Ogawa::Buzz: このブログのコメントシステムにDISQUSを使い始めました](http://blog.as-is.net/2008/10/disqus.html)
--------------------------------------------------------------------------------
title: "キー操作のみでウェブサイトのタイトルや URL をコピーする方法"
date: "2010-05-01"
--------------------------------------------------------------------------------
今までページのソースや、"C-c T" からコピーしていましたが、さすがに
バカバカしくなったので KeySnail の関数を作りました。
それぞれ、"t" でタイトルコピー、"T" でタイトルと URL コピー、
"u" で URL コピーが出来るようになります。
```
key.setViewKey('t', function () {
var w = window._content;
var d = w.document;
var txt = d.title;
const CLIPBOARD = Components.classes['@mozilla.org/widget/clipboardhelper;1'].getService(Components.interfaces.nsIClipboardHelper);
CLIPBOARD.copyString(txt);
}, 'タイトルコピー');
key.setViewKey('T', function () {
var w = window._content;
var d = w.document;
var txt = "\"" + d.title + "\" - " + d.location.href;
const CLIPBOARD = Components.classes['@mozilla.org/widget/clipboardhelper;1'].getService(Components.interfaces.nsIClipboardHelper);
CLIPBOARD.copyString(txt);
}, 'タイトルとURLコピー');
key.setViewKey('u', function () {
var w = window._content;
var d = w.document;
var txt = d.location.href;
const CLIPBOARD = Components.classes['@mozilla.org/widget/clipboardhelper;1'].getService(Components.interfaces.nsIClipboardHelper);
CLIPBOARD.copyString(txt);
}, 'URLコピー');
```
[firefoxをEmacsにしてくれるKeySnailがすごすぎる](http://sheephead.homelinux.org/2009/09/27/1604/)
このサイトを丸々参考にさせて頂きました。ありがとうございます。
参考情報:
[KeySnail :: Add-ons for Firefox](https://github.com/mooz/keysnail/wiki/keysnail-japanese)
--------------------------------------------------------------------------------
title: "StatusNet のセッションが異常に短い"
date: "2010-04-29"
--------------------------------------------------------------------------------
Debian squeeze は問題ないのですが、Debian lenny ではすぐログアウト
する問題に悩まされていました。セッションが短いと、こうなるそうです。
/etc/cron.d/php5 を以下のように修正して解決しました。
修正前
>09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
修正後
>00 6 10,20,30 * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
セッションの削除を毎時 9,39 分から、毎月 10,20,30 日の 6:00 に変更
しました。数十人くらいしか使わない環境なので、設定は適当です。
PHP のセッションは session.gc_divisor, session.gc_maxlifetime,
session.gc_probability が関係しているそうです。これは以下の cgi で
確認できます。
```
```
Debian Lenny はこのような設定でした。
| |
|---|---:
|session.gc_divisor|100
|session.gc_maxlifetime|1440
|session.gc_probability|0
session.gc_probability/session.gc_divisor = 0/100 = 0
0 だと PHP からはセッションの削除はしないそうです。
## 結論
Debian Lenny は、cron が 30 分おきに PHP のセッションを削除する。
cron の設定を変えることで、これを制御できる。
参考情報:
[セッション(session)の有効期限を設定するには - spanstyle::monolog](http://monolog.spanstyle.com/2005/07/session.html)
--------------------------------------------------------------------------------
title: "StatusNet インストーラのバグ"
date: "2010-04-29"
--------------------------------------------------------------------------------
{{< post "2010-04-18-1" >}} の補完。
後日ネットを彷徨っていたら、[こんなページ](http://forum.status.net/discussion/467/error-while-installing-statusnet)を見つけました。(良く知った
方もいらっしゃいます。)
どうやら statusnet-0.9.1 のインストーラにはバグがあるようです。ただ
し PHP のバージョンによっては発生しないそうです。実際 5.3.2-1 で発
生しましたが、5.2.6-1+lenny では発生しませんでした。
インストールが途中で止まった 5.3.2-1 はその後も
/var/log/apache2/error.log にこんなログが吐かれ続けていました。
>[Sun Apr 25 14:42:15 2010] [error] [client 192.168.1.11] PHP Warning: Parameter 1 to RSSCloudPlugin::onRouterInitialized() expected to be a reference, value given in /var/www/statusnet/lib/event.php on line 105
気持ち悪いので、前述のページからリンクされていた以下のパッチを当て
ました。
```
--- orig/statusnet-0.9.1/plugins/RSSCloud/RSSCloudPlugin.php 2010-03-29 00:39:56.000000000 +0900
+++ statusnet-0.9.1/plugins/RSSCloud/RSSCloudPlugin.php 2010-04-25 16:48:46.000000000 +0900
@@ -105,7 +105,7 @@
* @return boolean hook return
*/
- function onRouterInitialized(&$m)
+ function onRouterInitialized($m)
{
$m->connect('/main/rsscloud/request_notify',
array('action' => 'RSSCloudRequestNotify'));
```
**追記(2010-05-08):**
0.9.2 で修正されたことを確認しました。
--------------------------------------------------------------------------------
title: "StatusNet のおかしな日本語"
date: "2010-04-29"
--------------------------------------------------------------------------------
例えば誰かにフォローされるとこんな件名のメールが飛んできます。
>誰かさん は StatusNet であなたのつぶやきを聞いています。
ちょっと気持ち悪いです...。
locale/ja/LC_MESSAGES/statusnet.po にはこのように書いてありました。
翻訳ソフトか何かを使ったのでしょうか。
>msgid "%1$s is now listening to your notices on %2$s."
>msgstr "%1$s は %2$s であなたのつぶやきを聞いています。"
以下に変更し、
>msgstr "%1$s は %2$s であなたをフォローしました。"
msgfmt コマンドで .mo ファイルに変換しました。
>% msgfmt -o statusnet.mo statusnet.po
※ Debian Lenny では msgfmt は gettext パッケージに含まれています。
--------------------------------------------------------------------------------
title: "Git コマンドまとめ"
date: "2010-04-29"
--------------------------------------------------------------------------------
個人的なメモ。ページ番号は「入門 Git」より。
P21
```
# グローバル変数の確認
% git config --global --list
# グローバル変数に自分の名前とメールアドレスを追加
% git config --global user.name "Takashi Masuda"
% git config --global user.email "masutaka@example.com"
# 大半の出力に色づけ
% git config --global color.ui true
# グローバル変数とローカル変数の確認
% git config --list
```
P42
```
# コミットのための対話的なステージング
% git add -i
```
```
% git pull
% git pull git://github.com/hayamiz/twittering-mode.git master
```
git pull と同じ意味
```
% git fetch
% git merge origin/master
```
```
% git push --dry-run git@github.com:masutaka/twittering-mode.git
% git push git@github.com:masutaka/twittering-mode.git
```
mergeしてコンフリクトが発生し、面倒で止めたくなったらこれ。
```
% git reset --hard ORIG_HEAD
```
ローカルで rm したファイルの復活
```
# ファイルを指定
% git checkout hoge/huga/hogehoge.txt
or
# 全ファイル(編集したファイルも上書きするので超危険なコマンド!!)
% git checkout .
```
git log はこれらのコマンドをよく使う
```
# 修正したファイル名とログメッセージを参照
% git log --stat --summary
# 修正した差分を全て表示
% git log -p
# Author, Committer 両方の名前を表示
git log --pretty=full
```
リポジトリ自体のクローン(git でのリポジトリのコピーがこれという認識)
```
% git clone --bare rep.git rep2.git
```
直前のコミットログの訂正
```
% git commit --amend
```
直前のコミットの取り止め。git add した直後の Staging 状態になる。
```
% git reset --soft 'HEAD^1'
```
直前のコミットの削除。危険。
```
% git reset --hard 'HEAD^1'
```
リモートリポジトリの場所
```
% git remote -v
```
リネームしたファイルを追跡した diff
```
% git diff -M
% git log -p -M
```
特定リビジョンのファイルの中身を確認
```
% git show リビジョン:ファイルパス
```
http://blog.ecworks.jp/archives/1145
http://d.hatena.ne.jp/Ubuntu/20081023/github
{{< amazon asin="427406767X" title="入門git" >}}
--------------------------------------------------------------------------------
title: "Firefox アドオン KeySnail から StatusNet を使おう"
date: "2010-04-23"
--------------------------------------------------------------------------------
{{< post "2010-04-18-7" >}} の補完です。
statusnet は http://example.com/statusnet/ に構築し、
{{< post "2010-04-18-3" >}} の Fancy URLs の設定を行ったものとします。
[KeySnail](https://github.com/mooz/keysnail/wiki/keysnail-japanese) でツイートすることも出来ます。以下を .keysnail.js にコピペ
すれば、"C-c t" または "C-c C-t" でツイートできます。
```
key.setGlobalKey([['C-c', 't'], ['C-c', 'C-t']], function (aEvent) {
prompt.read("tweet:", function (aTweet) {
var username = "アカウント";
var password = "パスワード";
var xhr = new XMLHttpRequest;
xhr.open("POST", "http://example.com/statusnet/api/statuses/update.json", false, username, password);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("X-Twitter-Client", "KeySnail");
xhr.setRequestHeader("X-Twitter-Client-Version", "0.1");
xhr.send("status=" + aTweet);
});
}, 'Twitter投稿');
```
いろんな意味で本家の "C-c t" に遠く及ばないです。とりあえずツイート
出来るよといったレベルです。"C-c T" の「このページのタイトルと URL
を使ってつぶやく」の実装もまだです。
出来れば、オリジナルの [Yet Another Twitter Client KeySnail](http://wiki.github.com/mooz/keysnail/plugin) を修正
する方向で実装したいですねえ。Twitter アカウントがあれば、オフィシャ
ルな StatusNet のサイト https://identi.ca/ にログイン出来ます。誰か
試してー。^^;
参考情報:
[Firefox via KeySnailでtwitterに投稿するjavascript](http://sheephead.homelinux.org/2009/09/30/1618/)
--------------------------------------------------------------------------------
title: "Firefox アドオン Identifox から StatusNet を使おう"
date: "2010-04-18"
--------------------------------------------------------------------------------
StatusNet のデモサイト https://identi.ca/ 用のクライアント
Identifox を少し修正すると、イントラネットに構築した StatusNet でも
使えます。
statusnet は http://example.com/statusnet/ に構築し、
{{< post "2010-04-18-3" >}} の Fancy URLs の設定を行ったものとします。
## [Identifox](https://addons.mozilla.org/en-US/firefox/addon/identifox/)
Firefox 用アドオンです。ある時点の [Ecofon](https://addons.mozilla.org/ja/firefox/addon/echofon-for-twitter/) を StatusNet 用にポーティ
ングしたようです。
https://identi.ca/api/ がハードコーディングされているので、
identifox-0.9-fx.xpi を zip 伸長し、以下のような修正を加え、
また zip 圧縮します。
```
--- orig/identifox-0.9-fx/components/nsIdenticaNotifier.js 2009-03-09 03:15:06.000000000 +0900
+++ identifox-0.9-fx/components/nsIdenticaNotifier.js 2010-04-18 17:18:38.000000000 +0900
@@ -17,7 +17,7 @@
var insert_status_stmt = null;
var find_status_stmt = null;
-const IDENTICA_API_URL = "https://identi.ca/api/";
+const IDENTICA_API_URL = "http://example.com/statusnet/api/";
const NETWORK_TIMEOUT_TIME = 120;
const APP_NAME = "IdentiFox";
```
他にも [KeySnail](https://github.com/mooz/keysnail/wiki/keysnail-japanese) や [twittering-mode](http://twmode.sourceforge.net/ja/) が使えそうですが、まだ調査中です。
参考情報:
[Web Apps|StatusNet](http://status.net/open-source/add-ons/Web%20Apps)
{{< tag "Twmode" >}}
**追記(2010-04-23):**
{{< post "2010-04-23-1" >}} に KeySnail の記事をアップしました。まだ暫定です。
--------------------------------------------------------------------------------
title: "StatusNet クリーンルーム特有の問題"
date: "2010-04-18"
--------------------------------------------------------------------------------
StatusNet は一部、インターネットサービスにアクセスする箇所があるの
で、私がクリーンルームに設置した時はいくつかエラーが発生しました。
参考までに、情報と対策をまとめておきます。
## インストール時に以下のエラーが発生。
```
Install StatusNet
・Starting installation...
・Checking database...
・Changing to database...
・Running database script...
・Adding SMS carrier data to database...
・Adding notice source data to database...
・Adding foreign service data to database...
・Writing config file...
Fatal error: Call to undefined method Ostatus_profile::ensureprofile() in /var/www/statusnet/install.php on line 907
```
http://update.status.net/ へのアクセスを試みるためのようです。イン
ストールの最後のフェーズなので対策は不要ですが、気になる人は以下の
パッチを当ててからインストールすると良いと思います。
```
--- orig/statusnet-0.9.1/install.php 2010-03-29 00:39:56.000000000 +0900
+++ statusnet-0.9.1/install.php 2010-04-14 13:00:19.000000000 +0900
@@ -898,19 +898,6 @@
$user->grantRole('owner');
$user->grantRole('moderator');
$user->grantRole('administrator');
-
- // Attempt to do a remote subscribe to update@status.net
- // Will fail if instance is on a private network.
-
- if (class_exists('Ostatus_profile') && $adminUpdates) {
- try {
- $oprofile = Ostatus_profile::ensureProfile('http://update.status.net/');
- Subscription::start($user->getProfile(), $oprofile->localProfile());
- updateStatus("Set up subscription to update@status.net.");
- } catch (Exception $e) {
- updateStatus("Could not set up subscription to update@status.net.");
- }
- }
return true;
}
```
## ハッシュタグへのリンクをクリックすると、以下のエラーが発生。
```
Warning: Cannot modify header information - headers already sent by (output started at /var/www/statusnet/lib/xmloutputter.php:230) in /var/www/statusnet/lib/htmloutputter.php on line 108
Warning: Cannot modify header information - headers already sent by (output started at /var/www/statusnet/lib/xmloutputter.php:230) in /var/www/statusnet/lib/error.php on line 75
Hoge StatusNet Hoge StatusNet
Unable to connect to tcp://hashtags.wikia.com:80. Error #0: php_network_getaddresses: getaddrinfo failed: ??????????????
```
こちらは http://hashtags.wikia.com/ へのアクセスを試みるためのよう
です。以下のパッチを当てればアクセスしなくなります。
```
--- orig/statusnet-0.9.1/plugins/WikiHashtagsPlugin.php 2010-03-29 00:39:56.000000000 +0900
+++ statusnet-0.9.1/plugins/WikiHashtagsPlugin.php 2010-04-12 19:50:12.000000000 +0900
@@ -63,35 +63,13 @@
if (!empty($tag)) {
- $url = sprintf('http://hashtags.wikia.com/index.php?title=%s&action=render',
- urlencode($tag));
$editurl = sprintf('http://hashtags.wikia.com/index.php?title=%s&action=edit',
urlencode($tag));
- $request = HTTPClient::start();
- $response = $request->get($url);
- $html = $response->getBody();
-
$action->elementStart('div', array('id' => 'wikihashtags', 'class' => 'section'));
- if ($response->isOk() && !empty($html)) {
- $action->element('style', null,
- "span.editsection { display: none }\n".
- "table.toc { display: none }");
- $action->raw($html);
- $action->elementStart('p');
- $action->element('a', array('href' => $editurl,
- 'title' => sprintf(_('Edit the article for #%s on WikiHashtags'), $tag)),
- _('Edit'));
- $action->element('a', array('href' => 'http://www.gnu.org/copyleft/fdl.html',
- 'title' => _('Shared under the terms of the GNU Free Documentation License'),
- 'rel' => 'license'),
- 'GNU FDL');
- $action->elementEnd('p');
- } else {
- $action->element('a', array('href' => $editurl),
- sprintf(_('Start the article for #%s on WikiHashtags'), $tag));
- }
+ $action->element('a', array('href' => $editurl),
+ sprintf(_('Start the article for #%s on WikiHashtags'), $tag));
$action->elementEnd('div');
}
```
--------------------------------------------------------------------------------
title: "StatusNet SMTP の設定"
date: "2010-04-18"
--------------------------------------------------------------------------------
フォローされた時や、お気に入りに追加された時に、ユーザにメール通知
されるようになるので、SMTP の設定をすると良いでしょう。パスワードを
忘れた時にユーザが再発行手続きを行えるので、メンテナンスコストも下
がります。
以下は認証なしの SMTP サーバの場合です。config.php に追記します。
```
// Email info, used for all outbound email
$config['mail']['notifyfrom'] = 'noreply@example.com';
// Domain for generating no-reply and incoming email addresses, if enabled.
// Defaults to site server name.
$config['mail']['domain'] = 'example.com';
// See http://pear.php.net/manual/en/package.mail.mail.factory.php for options
$config['mail']['backend'] = 'smtp';
$config['mail']['params'] = array(
'host' => 'SmtpServerName',
'port' => 25,
);
```
$config['mail']['notifyfrom'] は StatusNet が送るメールの From: に
なります。適当に設定してください。
私が設置したクリーンルームでは、メールヘッダが常に文字化けしてしま
いました。メールサーバが怪しげな変換をしているようなんですが、そも
そも StatusNet がメールヘッダの MIME ENCODE をしていないことが原因
です。
適当なパッチを作りましたので、もし困っていたらご利用下さい。
```
--- orig/statusnet-0.9.1/lib/mail.php 2010-03-29 00:39:56.000000000 +0900
+++ statusnet-0.9.1/lib/mail.php 2010-04-25 17:52:56.000000000 +0900
@@ -78,6 +78,9 @@
if (!isset($headers['Content-Type'])) {
$headers['Content-Type'] = 'text/plain; charset=UTF-8';
}
+ if (!isset($headers['MIME-Version'])) {
+ $headers['MIME-Version'] = '1.0';
+ }
assert($backend); // throws an error if it's bad
$sent = $backend->send($recipients, $headers, $body);
if (PEAR::isError($sent)) {
@@ -149,8 +152,8 @@
$profile = $user->getProfile();
$headers['From'] = mail_notify_from();
- $headers['To'] = $profile->getBestName() . ' <' . $address . '>';
- $headers['Subject'] = $subject;
+ $headers['To'] = mb_encode_mimeheader(mb_convert_encoding($profile->getBestName(), 'UTF-8')) . ' <' . $address . '>';
+ $headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding($subject, 'UTF-8'));
return mail_send($recipients, $headers, $body);
}
@@ -236,11 +239,12 @@
$headers = _mail_prepare_headers('subscribe', $listenee->nickname, $other->nickname);
$headers['From'] = mail_notify_from();
- $headers['To'] = $name . ' <' . $listenee->email . '>';
- $headers['Subject'] = sprintf(_('%1$s is now listening to '.
- 'your notices on %2$s.'),
- $other->getBestName(),
- common_config('site', 'name'));
+ $headers['To'] = mb_encode_mimeheader(mb_convert_encoding($name, 'UTF-8')) . ' <' . $listenee->email . '>';
+ $headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding(sprintf(_('%1$s is now listening to '.
+ 'your notices on %2$s.'),
+ $other->getBestName(),
+ common_config('site', 'name')),
+ 'UTF-8'));
$body = sprintf(_('%1$s is now listening to your notices on %2$s.'."\n\n".
"\t".'%3$s'."\n\n".
@@ -286,9 +290,10 @@
$name = $profile->getBestName();
$headers['From'] = $user->incomingemail;
- $headers['To'] = $name . ' <' . $user->email . '>';
- $headers['Subject'] = sprintf(_('New email address for posting to %s'),
- common_config('site', 'name'));
+ $headers['To'] = mb_encode_mimeheader(mb_convert_encoding($name, 'UTF-8')) . ' <' . $user->email . '>';
+ $headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding(sprintf(_('New email address for posting to %s'),
+ common_config('site', 'name')),
+ 'UTF-8'));
$body = sprintf(_("You have a new posting address on %1\$s.\n\n".
"Send email to %2\$s to post new messages.\n\n".
@@ -413,9 +418,10 @@
$headers = array();
$headers['From'] = ($incomingemail) ? $incomingemail : mail_notify_from();
- $headers['To'] = $to;
- $headers['Subject'] = sprintf(_('%s status'),
- $other->getBestName());
+ $headers['To'] = mb_encode_mimeheader(mb_convert_encoding($to, 'UTF-8'));
+ $headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding(sprintf(_('%s status'),
+ $other->getBestName()),
+ 'UTF-8'));
$body = $notice->content;
@@ -439,8 +445,8 @@
$recipients = $address;
$headers['From'] = mail_notify_from();
- $headers['To'] = $nickname . ' <' . $address . '>';
- $headers['Subject'] = _('SMS confirmation');
+ $headers['To'] = mb_encode_mimeheader(mb_convert_encoding($nickname, 'UTF-8')) . ' <' . $address . '>';
+ $headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding(_('SMS confirmation')));
// FIXME: I18N
```
**追記(2010-04-29):**
メールヘッダの文字化け対策用のパッチを追加しました。
--------------------------------------------------------------------------------
title: "StatusNet のカスタマイズ"
date: "2010-04-18"
--------------------------------------------------------------------------------
設定はある程度 Web から出来ますが、出来ない設定も多いです。
そんな場合は config.php を修正しましょう。
私は以下の設定をしました。
>$config['attachments']['uploads'] = false;
→必要になったら ON にすれば良いと思うので、添付ファイルは OFF にし
ました。
>$config['location']['share'] = 'never';
→ツイートしたときに、常に「狛江市, 東京都, 日本」と挿入されるので
OFF にしました。今回設置したのはクリーンルームだったので、そもそも
位置情報が不要です。
その他の設定は config.php.sample が参考になると思います。ただ、ここ
にも載っていない設定があるので、*.php を common_config 等で grep す
る必要があるかもしれません。
--------------------------------------------------------------------------------
title: "StatusNet Fancy URLs の設定"
date: "2010-04-18"
--------------------------------------------------------------------------------
Fancy URLs を設定すると、URL から index.php がなくなります。
クールな URL を実現するためにも、是非設定しましょう。
設定は比較的簡単です。
**1. .htaccess を作成します。**
statusnet 直下の htaccess.sample を .htaccess という名前で保存し、
修正します。以下は http://example.com/statusnet/ というサイトの場合です。
```
--- /var/www/statusnet/htaccess.sample 2010-03-29 00:39:56.000000000 +0900
+++ /var/www/statusnet/.htaccess 2010-04-13 01:36:37.000000000 +0900
@@ -7,7 +7,7 @@
# http://example.com/ => /
# http://example.com/mublog/ => /mublog/
#
- RewriteBase /mublog/
+ RewriteBase /statusnet/
## Uncomment these if having trouble with API authentication
## when PHP is running in CGI or FastCGI mode.
```
http://example.com/statusnet//all に
アクセス出来ることを確認しましょう。
は {{< post "2010-04-18-1" >}} の通りに設定した場合、
root になります。
アクセス出来ない場合は、mod_rewrite が有効でないのかもしれません。
{{< post "2010-04-13-1" >}} を参考にしてみてください。
**2. Fancy URLs を有効にします。**
管理者権限(今回は root)でログインし、Admin → パスに進みます。
Fancy URLs にチェックを入れれば有効になります。
上のメニューにある Personal や Admin へのリンク先から "index.php"
が消えたはずです。
また、以降の各ツイートや各グループへのリンクからも "index.php" が消
えます。これらは MySQL のデータベースに直に書かれるので、Fancy
URLs は早めに設定することをオススメします。
参考情報:
[statusnet-0.9.x.tar.gz の README](http://gitorious.org/statusnet/mainline/blobs/0.9.x/README)
[ブログを作る際のクールなURLを考える - Open MagicVox.net](http://www.magicvox.net/archive/category/computer/development/2009_02091557/)
--------------------------------------------------------------------------------
title: "StatusNet のログイン画面を日本語にする"
date: "2010-04-18"
--------------------------------------------------------------------------------
Admin → Site の Default language を日本語にするだけではログイン画
面は日本語になりませんでした。ブラウザ側の言語設定によるそうですが、
少なくとも Firefox-3.5.8 は日本語になりませんでした。
language.php を修正します。すぐにログイン画面が日本語になります。
```
--- orig/statusnet-0.9.1/lib/language.php 2010-03-29 00:39:56.000000000 +0900
+++ statusnet-0.9.1/lib/language.php 2010-04-12 13:20:56.000000000 +0900
@@ -307,6 +307,7 @@
'ia' => array('q' => 0.8, 'lang' => 'ia', 'name' => 'Interlingua', 'direction' => 'ltr'),
'is' => array('q' => 0.1, 'lang' => 'is', 'name' => 'Icelandic', 'direction' => 'ltr'),
'it' => array('q' => 1, 'lang' => 'it', 'name' => 'Italian', 'direction' => 'ltr'),
+ 'ja' => array('q' => 0.5, 'lang' => 'ja', 'name' => 'Japanese', 'direction' => 'ltr'),
'jp' => array('q' => 0.5, 'lang' => 'ja', 'name' => 'Japanese', 'direction' => 'ltr'),
'ko' => array('q' => 0.9, 'lang' => 'ko', 'name' => 'Korean', 'direction' => 'ltr'),
'mk' => array('q' => 0.5, 'lang' => 'mk', 'name' => 'Macedonian', 'direction' => 'ltr'),
```
参考情報:
[Twitter Clone なStatusNet を入れてみる - matoken’s meme -hatena-](http://d.hatena.ne.jp/matoken/20090903/1251994078)
--------------------------------------------------------------------------------
title: "StatusNet の構築"
date: "2010-04-18"
--------------------------------------------------------------------------------
{{< post "2010-04-11-1" >}} の補完。
Debian squeeze でのイントラネット版 Twitter「StatusNet」の構築方法
をまとめます。
## 構築の前に
StatusNet は PHP で書かれているので、以下のような基本的な PHP スク
リプトが Web サーバ上で動くことを確認しておきます。
```
```
## 構築手順
※ "#" は root での作業、"%" は一般ユーザでの作業です。
### 1. http://status.net/ から tar ball を落とし、/var/www に展開します。
```
# cd /var/www
# tar xzf statusnet-0.9.1.tar.gz
```
### 2. リネームします。
```
# mv statusnet-0.9.1 statusnet
```
### 3. アクセス権を適切に設定します。
```
# cd statusnet
# chown -R root:root .
# chown www-data:www-data . avatar background file
```
### 4. MySQL の DB を作成します。
```
% mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1292
Server version: 5.1.45-1 (Debian)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.00 sec)
mysql> create database statusnet;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| statusnet |
+--------------------+
3 rows in set (0.00 sec)
mysql> grant all privileges on statusnet.* to statusnetuser@localhost identified by 'statusnetpassword';
Query OK, 0 rows affected (0.00 sec)
mysql> exit;
Bye
```
### 5. http://<インストールするマシン名>/statusnet/install.php にアクセスします。
以下を参考に StatusNet の設定をします。
|設定名|値
|---|---
|Site name|Hoge StatusNet
|Fancy URLs|disable
|Hostname|localhost
|Type|MySQL
|Name|statusnet(※1)
|DB username|statusnetuser(※1)
|DB password|statusnetpassword(※1)
|Administrator nickname|root(※2)
|Administrator password|rootpassword(※2)
|Subscribe to announcements|チェック
(※1) **4** で設定した DB 名やユーザ名を入力します。
(※2) これが StatusNet の管理者アカウントになります。
### 6. 問題なくインストール完了
インストーラにバグがあるのか、今回はここで止まってしまいましたが、
http://<インストールするマシン名>/statusnet/ には問題なくアクセスで
きたので、まあ良しとします。
```
Install StatusNet
・Starting installation...
・Checking database...
・Changing to database...
・Running database script...
・Adding SMS carrier data to database...
・Adding notice source data to database...
・Adding foreign service data to database...
・Writing config file...
```
curl や gd、mysql 関連のエラーが出たら、該当のパッケージをインストー
ルし、Apache を再起動してください。
```
# /etc/init.d/apache2 restart
```
私の場合は php5-curl, php5-gd, php5-mysql をインストールする必要が
ありました。
参考情報:
[statusnet-0.9.x.tar.gz の README](http://gitorious.org/statusnet/mainline/blobs/0.9.x/README)
--------------------------------------------------------------------------------
title: "Debian squeeze での mod_rewrite 有効方法"
date: "2010-04-13"
--------------------------------------------------------------------------------
http://localhost/hoge/ で .htaccess から mod_rewrite を使う方法。
root になって a2enmod で有効にする。
```
# a2enmod rewrite
```
これだけで使えない場合は、.htaccess の読み込みが許可されていない場
合が多い。というか私がそうだった。
/etc/apache2/sites-available/default を以下のように修正。
修正前
```
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
```
修正後
```
Options Indexes FollowSymLinks MultiViews
AllowOverride FileInfo Options
Order allow,deny
allow from all
```
.htaccess が読み込まれているか否かは、必ずエラーが発生する内容にし
て試せば良いと思う。
mod_rewrite とは関係なくなってしまうが、.htaccess の以下のような
Order を許可するには AllowOverride の行に Limit を続けて書けば良い。
```
Order allow,deny
```
参考情報: [AllowOverride ディレクティブ - Apache コア機能](http://httpd.apache.org/docs/2.1/ja/mod/core.html#allowoverride)
--------------------------------------------------------------------------------
title: "「しゃべる」と「StatusNet」を比較した"
date: "2010-04-11"
--------------------------------------------------------------------------------
某所で「[社内マイクロブログ しゃべる](http://sites.google.com/site/shovelx/)」をテスト稼働していますが、不満
な点があるので {{< twitter "fortunan" >}} オススメの「[StatusNet](http://status.net/)」を試してみました。
どちらもいわゆるイントラネット版 Twitter です。
まずは両者の比較です。
| |しゃべる|StatusNet
|---|---|---
|言語|Java|PHP
|データベース|しゃべる付属の MySQL|MySQL or pgsql
|インストール|パッケージ(msi,rpm,deb)から|tar ball を展開し、Web サーバ上で動作させる
|ユーザ登録|管理者権限で作成|ユーザ権限でも作成可(※1)
|まとめてユーザ登録|csv からインポート可能|ユーザが自由に作れるので、実質必要なし
|言語対応|日本語のみサポート|多言語サポート
|検索|出来ない(※2)|出来るが、日本語検索がやや怪しい
|ReTweet|非サポート|公式 RT が出来る
|ハッシュタグ|非サポート|サポート
|開発状況|2009.3 から停止状態|活発
|クライアント|[P3fSV:PeraPeraPrv for Shovel](http://d.hatena.ne.jp/lynmock/20080708)|[Identifox](https://addons.mozilla.org/en-US/firefox/addon/identifox/)(※3)
(※1) 試してないが LDAP プラグインが同封されている。
(※2) 「[エンタープライズサーチ どこかな?](http://sites.google.com/site/dokokana/)」はこれを補うツールではある
が、doko-0.5.0 では shovel-0.9.12 のクロールが出来ないため、
実質検索できない。
(※3) nsIdenticaNotifier.js に書いてある IDENTICA_API_URL を自サイト
に変更すれば使えます。{{< post "2010-04-18-7" >}}
「しゃべる」は言語が Java で且つ開発が停止しているので、バグがあっ
たら諦めるしかありません。その点、「StatusNet」は PHP で書かれてい
るので、例え開発が停止してもなんとかなります。これだけの理由で
「StatusNet」に軍配が上がるでしょう。
実際、「しゃべる」にはバグらしきものが確認されています。
▼時々ログインできなくなることがあり、Admin 権限でも対応できない。
→ 2010.3.9 に開発元に問い合わせたが、今のところ返信なし。現状、
例えば masutaka アカウントを破棄し、masutaka2 アカウントを発
行して凌いでいる。
▼時々「しゃべる」からの応答がなくなり、再起動が必要になることがある。
→ cron で毎日深夜 3 時に再起動するようにした。
機能面から見ても「StatusNet」は勝っているので、これを導入することに
なりそうです。構築編は後日アップします。
**追記(2010-04-17):**
StatusNet のクライアントは Identifox が使えたので、記事を修正しまし
た。他、KeySnail や twittering-mode も使えないか調べているところです。
**追記(2010-04-18):**
構築編をアップしました。→ {{< post "2010-04-18-1" >}}
--------------------------------------------------------------------------------
title: "C でクロージャ"
date: "2010-03-30"
--------------------------------------------------------------------------------
gcc 拡張を使うと、関数の中に関数を定義することができる。これを利用すると C でもクロージャが使えることを少し前に知ったが、ようやく理解できた...気がする。
{{< tweet user="masutaka" id="10408203974" >}}
## クロージャとは
C 言語のコールバック関数に近いが、引数以外の変数を自身が定義された静的スコープで解決することが最大の特徴。
...だと理解しています。^^;
## コーディング例
```c
#include
/* 任意の関数 func を n 回実行するだけのライブラリ関数 */
void
dolist(void (*func)(void), int n)
{
int i;
for(i = 0; i < n; i++) {
func();
}
return;
}
int
main(void)
{
int level = 0;
void lambda(void)
{
level++;
}
printf("%d\n", level);
dolist(lambda, 1);
printf("%d\n", level);
dolist(lambda, 2);
printf("%d\n", level);
dolist(lambda, 3);
printf("%d\n", level);
return 0;
}
```
## 結果
```
0
1
3
6
```
Solaris9 の /usr/local/bin/gcc で確認した。
dolist は渡された処理(lambda)を、指定された回数分実行するだけのライブラリ関数。
ユーザ(main)は処理内容を、自分の静的スコープの中で自由に定義することができる。level を外部変数にしなくて良い点が素晴らしい。狭いスコープ大事。
lambda() を nm で確認したところ、t マークが付いていた。lambda() はスタックに展開されているわけではなく、static な関数として定義されているということ。
lambda() と level の関係はどうなっているんだろう?
--------------------------------------------------------------------------------
title: "『池袋ウエストゲートパーク』を読んだ"
date: "2010-03-22"
--------------------------------------------------------------------------------
{{< amazon "4167174030" >}}
{{< twitter "kanatinxx" >}} から借りた。
最初のドーベルマンのエピソードで引いた。。こういうアングラな話は、
読んでてお腹いっぱいになるなあ。
--------------------------------------------------------------------------------
title: "『東京奇譚集』を読んだ"
date: "2010-03-17"
--------------------------------------------------------------------------------
{{< amazon "4101001561" >}}
『回転木馬のデッド・ヒート』の次に読んだのは正解だった。こちらはよ
り小説に近くなっている。「偶然の旅人」「ハナレイ・ベイ」のもの悲し
さが好き。「どこであれそれが見つかりそうな場所で」これは氏の他の小
説と比べて意外な展開で楽しめた。
--------------------------------------------------------------------------------
title: "『回転木馬のデッド・ヒート』を読んだ"
date: "2010-03-17"
--------------------------------------------------------------------------------
{{< amazon "4062749068" >}}
登場人物をリセットしながら読むのが苦手なので短編はあまり読まないけ
ど、これは読みやすかった。インタビューに近い構成を取っているためだ
と思う。ただ、聞いたそのままを文章にしているわけではない。「昼飯に
ハムとキュウリのサンドイッチを作って食べ、ビールを一缶飲んだ。」こ
のあたりは間違いなく村上アレンジ。
--------------------------------------------------------------------------------
title: "Emacs で現在の日時付きの名前でバックアップしてからセーブする"
date: "2010-03-13"
--------------------------------------------------------------------------------
例えば「昨日まで書いてあったんだけど、もうあの内容は消しちゃったな
あ」ということは良くあると思います。
ずいぶん前から「現在の日時付きの名前で ~/.trash にバックアップして
から、セーブする関数」を使っています。結構便利です。ファイルは無限
に増えるので、cron 等で削除して下さい。
```elisp
(defvar renban-copy-directory "~/.trash" "The directory for renban-copy.")
(defvar renban-copy-upper-limit-size (* 512 1024) "The upper limit of the file size for renban-copy.")
(defun renban-copy ()
"現在のバッファに対応するファイルを filename.year-date-time という
書式で `renban-copy-directory' にコピーします。
`renban-copy-upper-limit-size' より大きなサイズのファイルはコピー
しません。"
(unless renban-copy-directory
(error "%s is nil." (symbol-name 'renban-copy-directory)))
(let ((srcname buffer-file-name)
(dir (expand-file-name renban-copy-directory))
(dir-mode #o2700)
dstname)
(when (and srcname
(file-exists-p srcname)
(buffer-modified-p)
(<= (nth 7 (file-attributes srcname))
renban-copy-upper-limit-size))
(unless (file-exists-p dir)
(make-directory dir t))
(unless (eq dir-mode (file-modes dir))
(set-file-modes dir dir-mode))
(setq dstname
(expand-file-name
(concat
(file-name-nondirectory srcname)
"."
(format-time-string "%y-%m%d-%H%M%S"))
dir))
(message "Copying...")
(copy-file srcname dstname t nil)
(message "Copying...done."))))
```
renban-copy() は advice や関数と組み合わせて使います。
例1: save-buffer() に advice します。他の elisp プログラムから呼ば
れた場合も、バックアップされます。
```elisp
(defadvice save-buffer
(before
save-buffer-before-advice
activate)
"save-buffer() の前に renban-copy() します。"
(renban-copy))
```
例2: 例1 とほぼ同じですが、バックアップする/しないを Ctrl-u で制御
できます。[引数の意味が save-buffer() と逆になってしまう](http://www.fan.gr.jp/~ring/doc/elisp_20/elisp_25.html#SEC372)ので、気にな
る人は気になるかもしれません。
```elisp
(defadvice save-buffer
(before
save-buffer-before-advice
activate)
"save-buffer() の前に renban-copy() します。
ただし、引数が与えられたら renban-copy しません。"
(let ((arg (ad-get-arg 0)))
(if (or (null arg) (= arg 1))
(renban-copy))))
```
例3: Ctrl-x Ctrl-s した時だけバックアップします。例えば Mew のドラ
フトはバックアップされないので、残念な気持ちになることもあるかもし
れません。
```elisp
(defun renban-copy-and-save (&optional arg)
"renban-copy() してから save-buffer() します。
ただし、引数が与えられたら renban-copy() しません。"
(interactive "P")
(unless arg (renban-copy))
(save-buffer))
(define-key ctl-x-map (kbd "C-s") 'renban-copy-and-save)
```
元ネタは [blankspace -> tips](http://homepage1.nifty.com/blankspace/emacs/tips.html) の my-backup-save() ですが、原型がほと
んどなくなってしまいました。こちらは現在のバッファをバックアップす
るので、微妙に動きが違います。
P.S.
ちょっとブログにアップするだけの予定だったのに、気がついたら関数を
だいぶ書き換えていました。アップ前は renban-copy() の中でセーブまで
していましたが、アップ後の方が汎用的で良いと思います。
**追記(2010-03-14):**
新規にファイルを作成し、セーブする場合に問題があったので、
renban-copy() を置き換えました。さらに 例2 も Mew のドラフトを作る
ときに問題があったので差し替えました...。
--------------------------------------------------------------------------------
title: "ver22 までの Emacs で、物理行単位にカーソル移動する方法"
date: "2010-03-13"
--------------------------------------------------------------------------------
{{< post "2009-01-20-1" >}} の補完。
ver22 までの Emacs のカーソル移動は論理行単位なので、こんなのを使っ
てます。時々移動がミスりますが、そこはご愛嬌ということで。
```elisp
(defvar vz-goal-column 0 "Vz風ゴールカラム")
(defvar vz-enable-p t "*Enable the physical moving.")
(defun toggle-variable (var)
"Toggle '(symbol-value var)'."
(set var (not (symbol-value var)))
(message "'%s' is now '%s'"
(symbol-name var) (symbol-value var)))
(defun vz-toggle-vz-enable-p ()
"Toggle 'vz-enable-p'."
(interactive)
(toggle-variable 'vz-enable-p))
(defun vz-next-line (num)
"Vz:↓"
(interactive "p")
(if (or (not vz-enable-p) truncate-lines)
(next-line num)
(or (eq last-command 'vz-next-line)
(setq vz-goal-column (% (current-column) (1- (window-width)))))
(if (eolp)
(progn
(forward-char 1)
(move-to-column vz-goal-column))
(vertical-motion num)
(move-to-column (+ vz-goal-column (current-column))))))
(defun vz-previous-line (num)
"Vz:↑"
(interactive "p")
(if (not vz-enable-p)
(previous-line num)
(if truncate-lines
(previous-line num)
(or (eq last-command 'vz-next-line)
(setq vz-goal-column (% (current-column) (1- (window-width)))))
(let ((ncol (- vz-goal-column (window-width) -1)))
(vertical-motion (- num))
(if (<= 0 ncol)
(move-to-column ncol)
(move-to-column (+ vz-goal-column (current-column))))))
(setq this-command 'vz-next-line))) ;fake
```
情報源:
[極私的 Emacs カスタマイズ紹介マガヂン Emacs をわたし色に染めて♪
第 16 回 物理行単位のカーソル移動 〜vz.el から一部を流用する〜](http://www.dennougedougakkai-ndd.org/~delmonta/emacs/16.html)
--------------------------------------------------------------------------------
title: "『幽霊人命救助隊』を読んだ"
date: "2010-03-07"
--------------------------------------------------------------------------------
{{< amazon "4167717263" >}}
{{< post "2009-09-19-1" >}} 購入。職場の上司が勧めてくれた本。鬱や自殺について考
えるには良い本。ユーモアもある。ただ、前半のテンポは私には悪く感じ
た。普段長編ばかり読むので、このオムニバス風の話に慣れていないのも
あると思うが。4人のメガホンは読者に向けられていたんだと、最後の方
になって気づいた。作者はとにかく死ぬな死ぬなと、読者にメッセージを
出しつづけている。「未来が定まっていない以上、すべての絶望は勘違い
である」これは確かに名言。
--------------------------------------------------------------------------------
title: "IP 電話への移行を検討しました"
date: "2010-03-06"
--------------------------------------------------------------------------------
今ある固定電話は大学に入ったときに契約したのですが、ほとんど使うこ
とはありません。にも関わらず毎月¥1,800も払うのは無駄だと思ったので、
IP 電話への以降を検討しました。
## 加入することになるサービス
私は [@nifty ひかり One T シリーズ](http://setsuzoku.nifty.com/hikarionet/)に加入していました。(今見たら、
2011 年 9 月でサービス終了って書いてある...。)
ひかり One T シリーズの場合、[@niftyフォン-C](http://ipphone.nifty.com/niftyphone/c/index.htm) に加入することになるら
しいです。
## お得な料金
月額料金は @niftyフォン-C の方が安いです。
| |月額料金|機器レンタル料金
|---|---:|---:
|NTT|1740円|0円
|@niftyフォン-C|0円|525円
川崎〜浜松間の通話料金も、@niftyフォン-C の方が安いです。IP 電話に
すると、かける側もかけられる側も安くなるのですね。
| |平日 19:00〜23:00 の浜松への通話|平日 19:00〜23:00 の浜松からの通話
|---|---:|---:
|NTT|73.5円 <26秒>|73.5円 <26秒>
|@niftyフォン-C|8.4円 <3分> (全国一律)|11.34円 <3分> (全国一律)
[国内通話料金|通話料金&国番号表|電話 - NTT コミュニケーションズ](https://506506.ntt.com/0033data/)
[@niftyフォン-C > 料金 : @nifty](http://ipphone.nifty.com/niftyphone/c/price/index.htm)
[固定電話からIP電話(050番号)への通話料金|料金のご案内|電話商品・サービス|NTT東日本 Web116.jp](http://web116.jp/phone/fare/k_to_ip.html)
携帯電話への通話料金も、概ねお得です。
| |
|---|---:
|NTT|31.5〜42円 <1分>
|NTT+0036|16.8〜18.375円 <1分>
|@niftyフォン-C|18.9円 <1分>
[NTT東日本|固定電話発・携帯電話着0036通話サービス【料金表】](http://www.ntt-east.co.jp/0036/price/price.html)
[@niftyフォン-C > 料金 : @nifty](http://ipphone.nifty.com/niftyphone/c/price/index.htm)
## デメリット
良いことずくめですが、デメリットもあります。
[@niftyフォンで110、118、119などの緊急電話番号へかけられますか。 - @nifty](http://faq.nifty.com/nft5795/web2210/faq/search_direct01Detail.asp?id=3232)
```
かけられます。
ただし、その場合は@niftyフォンからの発信ではなく、一般加入電話から
の発信になります。一般加入電話を併用していない場合、かけることがで
きません。
```
電話番号も変わってしまいます。前回の引越しの履歴を見たら、今使って
いる固定電話番号で登録しているところがかなりありました。手続きが面
倒そうです。
[IP電話は今までの電話番号を使い続けることはできますか。 - @nifty](http://faq.nifty.com/nft5795/web2210/faq/search_direct01Detail.asp?id=3185)
```
ご利用されるIP電話サービスの種類によって異なります。
(省略)
@niftyフォン @niftyビデオフォン-F
現在ご利用中のNTT加入電話の電話番号は、そのままご利用可能です。
また、050から始まるIP電話用の番号が別途発行されますので2番号で
ご利用いただけます。
```
どうやら IP 電話と NTT 固定電話は併用することが前提のようです。
あと、停電になるとルータへの電源供給が止まるため、IP 電話は使えませ
ん。NTT 固定電話は使えます。
## 結論
IP 電話への移行はしません。固定電話を良く使うようになったら、また考
えることにします。
## 関連情報
[通話料無料!? プロバイダのIP電話を活用しよう - AllAbout](http://allabout.co.jp/gm/gc/18852/)
**追記(2011-01-04):**
{{< post "2011-01-04-1" >}} のとおり、IP 電話に移行しました。
--------------------------------------------------------------------------------
title: "加湿空気清浄機を買いました"
date: "2010-03-03"
--------------------------------------------------------------------------------
{{< post "2009-11-03-1" >}} で発生したエコポイントを JCB ギフトカードと交換した
ので、空気清浄機を買うことにしました。
今回もあまり下調べはしませんでした。
たつをさんの記事を鵜呑みにして、SHARP の加湿空気清浄機を買いました。
[[を] シャープの加湿空気清浄機を導入しました](http://chalow.net/2010-01-29-4.html)
## SHARP KIREION 加湿空気清浄機 高濃度7000プラズマクラスター技術 加湿13畳/空清21畳 ホワイト系 KC-Y45-W
{{< amazon asin="B002KCJKEI" title="SHARP KIREION 加湿空気清浄機 高濃度7000プラズマクラスター技術 加湿13畳/空清21畳 ホワイト系 KC-Y45-W" >}}
他のメーカーと比べて、SHARP はデザインが良いですね。
今まで加湿したい時は洗濯物を干していましたが、これからはお手軽に加
湿出来そうです。
元々空気が汚い部屋ではなかったようで、空気清浄の効果は良く分かりま
せん。しかし、買った翌日から朝の目覚めが良くなりました。深く眠れる
ようになったのかもしれません。
--------------------------------------------------------------------------------
title: "ATOK スペシャルサンクスの表示方法"
date: "2010-02-06"
--------------------------------------------------------------------------------
以下の操作で、ATOK のベータテストに協力した人リストが見られます。
先日発売された ATOK2010 で表示できました。
1) ATOKパレットを右クリックします。
2)[ヘルプ(H)−バージョン情報(A)]をクリックします。バージョン情報
ダイアログボックスが表示されます。
3) 画面左上のATOKアイコンを[Ctrl]キーを押しながら、ダブルクリック
します。
→ATOK スペシャルサンクス画面が表示されます。
--------------------------------------------------------------------------------
title: "gpg で暗号化されたファイルを Emacs で開いてもパスフレーズを聞かれない方法"
date: "2010-02-04"
--------------------------------------------------------------------------------
[Mew スレで紹介されていた](http://pc12.2ch.net/test/read.cgi/unix/1203921079/390)ので、メモメモ。
いつからなのか分かりませんが、少なくとも Emacs23 では gpg で暗号化
されたファイルを開くとパスフレーズを聞かれ、gpg コマンドを打たずし
てファイルを開くことが出来ます。ファイル保存時には、パスフレーズを
また聞かれます。また入力します。
**そう、ファイルを保存する時にも聞かれてしまうんです。**
一方、外部パッケージに、[alpaca.el](http://www.mew.org/~kazu/proj/cipher/ja/) というものがあります。これは保存
時にはパスフレーズを聞かない優れものです。
しかし、Emacs23 で alpaca.el を使うと、gpg なファイルを開く時に
2 回パスフレーズを聞かれてしまいます。そういうわけで alpaca.el は
しばらく使っていませんでした。
この度、やっと Emacs 標準の機能の OFF のやり方が分かりました。.emacs
に以下を書くだけです。
```elisp
(epa-file-disable)
```
interactive な関数なので、M-x で呼ぶことも出来ます。
当然というかなんというか、epa-file-enable() もありました。
先行者がいらっしゃいました...。
[epa(EasyPG Assistant)を無効にする方法 - koie blog](http://blog.livedoor.jp/hkoie/archives/50949752.html)
--------------------------------------------------------------------------------
title: "『ファイナルファンタジーXIII アルティマニア』を読んだ"
date: "2010-01-31"
--------------------------------------------------------------------------------
{{< amazon asin="4757527764" title="ファイナルファンタジーXIII シナリオアルティマニア" >}}
{{< amazon asin="4757527756" title="ファイナルファンタジーXIII バトルアルティマニア" >}}
Amazon でつい、ポチッとしてしまいました。。。
--------------------------------------------------------------------------------
title: "Emacs のソースコードを Bazaar から取得してみた"
date: "2010-01-17"
--------------------------------------------------------------------------------
{{< post "2009-09-27-1" >}} の補完。
Emacs リポジトリが Git に移行したと思っていましたが、Git *でも* 取
得できるようになっていただけなのですね。[年末に CVS から Bazaar に移
行したらしい](http://lists.gnu.org/archive/html/emacs-devel/2009-12/msg00812.html)ので、手元のリポジトリも移行しました。Bazaar は Git と
同じ分散型バージョン管理システムだそうです。
Debian では bzr をインストールすると、Bazaar が使えるようになります。
1. 最初にユーザ登録する必要があるそうです。
```
% bzr whoami "Takashi Masuda "
```
2. Bazaar チェックアウト用のディレクトリ emacs を作成します。
```
% bzr init-repo --2a emacs
```
3. チェックアウトします。私の環境では 30 分くらいかかりました。
```
% cd emacs
% bzr checkout http://bzr.savannah.gnu.org/r/emacs/trunk trunk
```
Bazaar については全然調べていないのでアレですが、とりあえず
"bzr update" すればリポジトリ先端のソースを取得できるようです。
**参考 URL**
[Emacs のリポジトリが Bazaar に移行したので Bazaar をインストールする。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20100107/1262858808)
[EmacsWiki: Bzr For Emacs Devs](http://www.emacswiki.org/emacs/BzrForEmacsDevs)
--------------------------------------------------------------------------------
title: "KeySnail で IME を ON/OFF する方法"
date: "2010-01-11"
--------------------------------------------------------------------------------
私は Windows でのキーバインドを Emacs 風にするために XKeymacs を使っ
ています。IME の ON/OFF は Alt-l(エル) という変則的なものにしています。
Firefox で KeySnail を使おうとすると、XKeymacs を OFF にする必要が
ありますが、KeySnail にはデフォルトで IME を ON/OFF するコマンドは
用意されていません。
そういう理由から、Windows 版の Firefox では KeySnail を使っていなかっ
たのですが、Twitter でつぶやいたら作者さんから以下のコードを教えて
もらいました。
```
key.setEditKey("M-l",
function (ev, arg) {
let elem = ev.originalTarget;
elem.style.imeMode = {
active : "inactive",
inactive : "active"
}[elem.style.imeMode] || "active";
elem.blur();
elem.focus();
}, "Toggle IME", true);
```
.keysnail.js に記載し、再読み込みしたら Alt-l で IME の ON/OFF が出来
るようになりました!!
その時のつぶやきです。
{{< tweet user="stillpedant" id="7621233590" >}}
{{< tweet user="stillpedant" id="7621260456" >}}
{{< tweet user="masutaka" id="7622796134" >}}
この技は Linux 版の Firefox では使えないそうですが、UIM の設定から
IME の ON/OFF のキーバインドを変更出来るので問題はないでしょう。
**関連 URL**
[KeySnail :: Add-ons for Firefox](https://github.com/mooz/keysnail/wiki/keysnail-japanese)
[Tips (Japanese) - keysnail - GitHub](http://wiki.github.com/mooz/keysnail/tips-japanese)
[XKeymacs](http://www.cam.hi-ho.ne.jp/oishi/)
--------------------------------------------------------------------------------
title: "『白夜行』を読んだ"
date: "2010-01-02"
--------------------------------------------------------------------------------
{{< amazon "4087474399" >}}
{{< twitter "kanatinxx" >}} から借りた。
おもしろかった。ただ最後はちょっと雑だったかな。
--------------------------------------------------------------------------------
title: "flv から音声を抜き出す方法"
date: "2009-12-20"
--------------------------------------------------------------------------------
Flash Video から音声を抽出して、mp3 にする方法です。
ffmpeg がインストールされていなかったら、Synaptic パッケージマネー
ジャや、aptitude でインストールします。
あとは以下のコマンドを実行するだけです。hoge.flv の音声が hoge.mp3
として抽出されます。
```
% ffmpeg -i hoge.flv -acodec copy hoge.mp3
```
↓これを抽出したかったんです。(^^)
{{< nicovideo id="sm2627334" title="【作業用BGM】FFⅠ~Ⅵノンストップバトルアレンジメドレー" >}}
参考 URL: [Linuxでflvからmp3へ変換する方法 - よしみ視点](http://d.hatena.ne.jp/sfujisak/20070609/1181369782)
関連記事: swf から音声を抜き出す方法 {{< post "2009-07-10-2" >}}
--------------------------------------------------------------------------------
title: "タイムスタンプを変えずに文字コードを変換する方法"
date: "2009-12-17"
--------------------------------------------------------------------------------
必要になって調べたので、メモメモ。
以下の例では、hoge.txt のタイムスタンプを変えずに UTF-8 に変換している。
```
#!/bin/sh
FILE=hoge.txt
TIMESTAMP=`ls -d -l --time-style=full-iso $FILE | awk '{print $6 " " $7 }'`
echo $FILE
mv $FILE ${FILE}.bak
nkf -w ${FILE}.bak > $FILE
rm ${FILE}.bak
touch -d "$TIMESTAMP" $FILE
```
--------------------------------------------------------------------------------
title: "Subject も本文も存在しないメールはスパムフォルダに振り分け"
date: "2009-12-13"
--------------------------------------------------------------------------------
最近 1 日に 10 通程度、毎回違う From で Subject も本文も存在しない
スパムが来るのですが、bsfilter で捕捉できません。仕方がないので、そ
のようなメールは問答無用でスパムフォルダに振り分けることにしました。
以下が ~/.procmailrc のレシピです。touch しているのは、Mew でスパム
フォルダを訪問した時に自動でスキャンを走らせるためです。
```
PATH=${HOME}/bin:${PATH}
MAILDIR=${HOME}/Mail
:0
* !^Subject:
{
:0 HB:
* ? mail-body-empty
* ? touch ${MAILDIR}/spam/.mew-mtime
${MAILDIR}/spam/.
}
```
mail-body-empty は自作の Ruby スクリプトです。~/bin に置きました。
以下にコピペします。
```ruby
#!/usr/bin/ruby
# 標準入力から渡されたメールの本文が空だったら 0、空でなかったら 0 以外を返す。
# メール本文が空行のみ、または空行の連続を「空」と定義する。
mode = :header
STDIN.each do |line|
case mode
when :header
if /^$/ =~ line
mode = :body
end
when :body
unless /^$/ =~ line
exit 1
end
end
end
exit 0
### End of file
```
最初は "* ? mail-body-empty" でなく "* < 1" と書いていたのですが、
うまくいかなかったのでこのスクリプトを作りました。どうやら "<" は
ヘッダと本文の合計サイズを評価する仕様のようです。
--------------------------------------------------------------------------------
title: "本を売却"
date: "2009-12-06"
--------------------------------------------------------------------------------
{{< amazon_link asin="4478006431" title="起きていることはすべて正しい—運を戦略的につかむ勝間式4つの技術" >}}
{{< amazon_link asin="4166606824" title="断る力" >}}
{{< amazon_link asin="4334034969" title="会社に人生を預けるな リスク・リテラシーを磨く" >}}
{{< amazon_link asin="4837900186" title="孫子の兵法—ライバルに勝つ知恵と戦略" >}}
{{< amazon_link asin="4569672558" title="大人のための「北斗の拳」人物伝" >}}
{{< amazon_link asin="4167656868" title="2ちゃんねる宣言—挑発するメディア" >}}
以上をブックオフで売ってきました。これで 320 円です。
前回ブックオフで売ったのは {{< post "2009-03-29-1" >}} でした。
こうして見るとごったまぜですね。
私の場合、小説以外は躊躇なく売る傾向にあるようです。
--------------------------------------------------------------------------------
title: "Emacs で登録されている timer の一覧を表示"
date: "2009-12-05"
--------------------------------------------------------------------------------
[Emacs スレ](http://pc12.2ch.net/test/read.cgi/tech/1191875993/386)で紹介されていたコードを、ここにコピペ。
```elisp
(defun describe-timer ()
(interactive)
(let ((tl timer-list)
timer)
(pop-to-buffer (get-buffer-create "*timer*"))
(erase-buffer)
(insert
"TIME FUNCTION\n"
"-------------- --------------------------\n")
(while tl
(setq timer (car tl))
(insert
(concat
(format-time-string "%m/%d %T"
(list (aref timer 1)(aref timer 2)(aref timer 3)))
" "
(symbol-name (aref timer 5))
"\n"))
(setq tl (cdr tl)))))
```
こんな出力が得られる。
```
TIME FUNCTION
-------------- --------------------------
12/05 16:05:00 display-time-event-handler
12/05 16:06:32 mew-passwd-timer
12/05 16:07:43 twittering-timer-action
```
--------------------------------------------------------------------------------
title: "『奥州藤原氏物語―黄金文化を創った清衡・基衡・秀衡・泰衡四代がくりひろげる壮大な歴史絵巻』を読んだ"
date: "2009-11-30"
--------------------------------------------------------------------------------
{{< amazon "4946424466" >}}
[読書メーター](http://book.akahoshitakuya.com/)で自分が一番乗りだった。ニッチすぎるwww
DVD と小説、そしてこの本が揃った。うちは奥州に思いを馳せるには申し
分ない環境だ。
--------------------------------------------------------------------------------
title: "Windows の画面がディスプレイからはみ出る件が直った"
date: "2009-11-24"
--------------------------------------------------------------------------------
VAIO W {{< post "2009-09-06-1" >}} は画面が狭いので、三菱の 22 インチワイド液晶
{{< post "2009-07-11-1" >}} に繋げて使っています。
この液晶は最大 1680x1050 ピクセルなんですが、時々解像度が粗くなって
Windows が画面に収まりきらなくなることがあります。
仕方がないので 1280x768 ピクセルまで落として、画面に収まるようにし
ています。ただしこの状態でも、各ピクセルが大きく、例えばフォントは
かなり粗い状態です。
Linux (1680x1050) から VNC 越しに見ると 1280x768 の小さな画面がキレ
イに見えるので、ディスプレイドライバと液晶がきちんとお話しできてい
ないように見えます。
ところが、先ほど
1. 画面のリフレッシュレートを 60 ヘルツから 75 ヘルツに上げて、
2. 解像度を 1280x768 から 1680x1050 に上げたら、
1680x1050 のキレイな画面が現れました。
まったく謎です。。。
**追記(2009-12-02):**
またおかしくなりました。今度は同じ方法で復旧させようとしても、直り
ません。ビデオドライバとモニタのどっちのバグなんだろう? OS のバグ
の可能性もあるのかなあ?
**追記(2010-01-10):**
試しに {{< post "2009-11-03-1" >}} に買った液晶テレビに繋げてみたら、1920x1080
まで表示出来たものの、液晶から Windows の画面がはみ出してしまいまし
た。ビデオドライバ原因の可能性が高くなって来ました。VAIO のサポート
に聞いてみようかなあ?
--------------------------------------------------------------------------------
title: "はてなブックマークのコメントを、アイテム毎のページに表示させた"
date: "2009-11-22"
--------------------------------------------------------------------------------
このブログにはコメント欄があるので、時々コメントを残してもらえるの
ですが、はてなブックマーク(以下、はてブ)にも良いコメントがあります。
そこで、アイテム毎のページにはてブのコメントを表示させました。今の
ところ、一番多いのは {{< post "2009-10-04-1" >}} の 509 です。この時は一日で
10,000 アクセスもありました。(普段は 100 アクセス程度です。)
以下、設置手順です。
**1.** 「[ブログにはてブのコメントを表示するhatana_bookmark_anywhere.js](http://blog.masuidrive.jp/index.php/2008/04/17/released-hatena-bookmark-anywhere/)」
から、hatena_bookmark_anywhere.js をダウンロードし、
http://masutaka.net/chalow/ に置きました。
**2.** アイテムページのテンプレート $item_page_template に、以下を追加
しました。
```
```
**3.** 「[hatana_bookmark_anywhere.jsの設置方法とカスタマイズ](http://blog.masuidrive.jp/index.php/2008/04/18/how-to-setup-hatana_bookmark_anywhere-js/)」を参考に
しながら、[現在使っている kaeru.css](/theme/kaeru/kaeru.css) に合うように、[kaeru.css から
import している clfix.css](/theme/kaeru/clfix.css) に CSS を追加しました。
**4.** デザインがこのサイトに合うように、hatena_bookmark_anywhere.js を
修正しました。また、より高速な /entry/jsonlite/ エンドポイントを使
うようにも修正しました。(参考情報: [はてなブックマークエントリー情報取得API](http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%d6%a5%c3%a5%af%a5%de%a1%bc%a5%af%a5%a8%a5%f3%a5%c8%a5%ea%a1%bc%be%f0%ca%f3%bc%e8%c6%c0API))
```
--- hatena-bookmark-anywhere-0-1.js 2009-11-22 00:07:27.000000000 +0900
+++ hatena-bookmark-anywhere.js 2009-11-22 11:22:05.000000000 +0900
@@ -57,16 +57,19 @@
}
if(json==null) {
- html += "このエントリーのはてなブックマーク (0) はてなブックマークのページへ飛ぶ
";
+ html += "";
html += "";
- html += "このページはまだブックマークされていません。";
html += "
";
}
else {
if((typeof hatena_bookmark_anywhere_limit)!="number") hatena_bookmark_anywhere_limit = 100;
if((typeof hatena_bookmark_anywhere_collapse)=="undefined" && json.bookmarks.length>hatena_bookmark_anywhere_limit) hatena_bookmark_anywhere_collapse = true;
- html += "このエントリーのはてなブックマーク ("+json.count+") はてなブックマークのページへ飛ぶ
";
+ html += "";
html += "";
for(var i=0; i0; ++i) {
var bookmark = json.bookmarks[i];
@@ -96,7 +99,7 @@
var script = document.createElement("script");
script.setAttribute("type","text/javascript");
if((typeof hatena_bookmark_anywhere_url)=="undefined") hatena_bookmark_anywhere_url = location.href.replace(/#.*/,"");
- script.setAttribute("src","http://b.hatena.ne.jp/entry/json/?url="+hatena_bookmark_anywhere_url+"&callback=__hatena_bookmark_anywhere_receiver");
+ script.setAttribute("src","http://b.hatena.ne.jp/entry/jsonlite/?url="+hatena_bookmark_anywhere_url+"&callback=__hatena_bookmark_anywhere_receiver");
document.body.appendChild(script);
}
} catch(e) { }
```
ついでにサイドバーに「このブログのはてなブックマーク数」を追加しま
した。ほとんどが {{< post "2009-10-04-1" >}} の記事ですねえ。^^;
あと、「[[を] はてなブックマークによる自blogの注目記事リスト](http://chalow.net/2005-08-10-3.html)」を参考
にしながら、サイドバーにはてブの新着エントリーや、人気エントリーを
表示させようとしましたが、さくらで [kuttuki-rss.pl](http://nais.to/~yto/tools/kuttuki-rss/) を実行すると以下
のエラーが発生したので、今回は見送りました。
>Use of uninitialized value in string eq at /usr/local/lib/perl5/site_perl/5.8.9/XML/RSS.pm line 934, line 855.
>Use of uninitialized value in string eq at /usr/local/lib/perl5/site_perl/5.8.9/XML/RSS.pm line 934, line 855.
>
>not well-formed (invalid token) at line 128, column 63, byte 7672 at /usr/local/lib/perl5/site_perl/5.8.9/mach/XML/Parser.pm line 187
さらにさらに「[MOONGIFT のこの記事](http://www.moongift.jp/2009/01/twitterer_anywhere/)」を参考にしながら、Twitter のつぶ
やきを各ページに表示させようとしましたが、うまく表示出来なかったの
で諦めました。[Twitter が TinyURL を捨てて、bit.ly を採用した](https://jp.techcrunch.com/2009/05/07/20090506url-shortening-wars-twitter-ditches-tinyurl-for-bitly/)からな
のかもしれません。[twitterer anywhere](http://twitterer.moongift.jp/) の開発は止まっているようです。
悔しいので、サイドバーに「[このブログに関するつぶやき](http://twib.jp/entrylist?url=masutaka.net/chalow)」のリンクを貼
りました。
**追記(2009-11-22):**
現在は、より高速な /entry/jsonlite/ エンドポイントが使えるので、**4**
のパッチを修正しました。コメントは日付の昇順にしたいなあ。
--------------------------------------------------------------------------------
title: "UNIX 時間"
date: "2009-11-21"
--------------------------------------------------------------------------------
業務で C 言語と、シェルコマンド date での UNIX 時間(1970 年 1 月 1 日 0:00 からの秒数)の取得方法を調べたのだけれど、我らが Emacs Lisp を調べていませんでした。
## Emacs Lisp
```elisp
(time-to-seconds (current-time))
```
で良いようです。
[真夜中ごろ - ポロポロ](http://d.hatena.ne.jp/kitokitoki/20091120/p1)
業務で調べた UNIX 時間は以下。
## シェルコマンド
>% date +%s
=> 1257925989
※ Solaris9 の場合、SUN 謹製の date (/usr/bin/date) ではなく、GNU の date (/usr/local/bin/date) を使う必要がある。
## C言語
```c
#include
#include /* gettimeofday() */
int
main(void)
{
struct timeval tv;
double unix_time;
gettimeofday(&tv, NULL);
unix_time = tv.tv_sec + (tv.tv_usec * 0.000001);
printf("%f\n", unix_time);
return 0;
}
```
=> 1257926292.479697
--------------------------------------------------------------------------------
title: "昨日の買い物"
date: "2009-11-03"
--------------------------------------------------------------------------------
## SHARP 32 型 AQUOS 地上デジタルハイビジョン液晶テレビ
{{< amazon asin="B002ANRN0K" title="SHARP 32V型AQUOS 地上・110度CSデジタルハイビジョン液晶テレビ LC-32DS6-B ブラック" >}}
アナログテレビとともにアナログマの最後を看取る予定でしたが、PS3 の
ゲーム中の文字が滲んでよく見えないという理由だけで、あっさり買いか
えてしまいました。
昨日の 18:00 に会社を出て、19:30 に購入して、今日の 9:00 過ぎにうち
に届きました。なんというハイスピード。
今まで 21 インチのアナログテレビでしたが、32 インチにしたのは正解で
した。37 インチを買わなくてよかった...。
今回購入したヨドバシでの価格は ¥137,800 でした。Amazon の値段を見
ると最安値が ¥99,800 で、ちょwww って感じですが、
|本体(¥137,800) - ヨドバシポイント(¥24,846) - エコポイント(¥15,000) = ¥97,954
なので、実は妥当だと思いたいです...。
さっそく地デジの設定をしましたが、簡単でした。薄々気づいていました
が、壁のテレビ端子がそのまま使えるのですね。←何も調べずに買った人
この互換性はすごいのでは..。
肝心の PS3 は、特に文字がはっきり見えるようになりました。コンポーネ
ントケーブルを HDMI ケーブルに変えれば、もっと綺麗になるのでしょう。
→ 綺麗になりました!!
## キーボード
{{< amazon asin="B001HHJUK6" title="バッファローコクヨサプライ BUFFALO フルキーボード USB接続 日本語 112キー ライトグレー BSKBU02LG" >}}
DELL キーボードの接続が時々切れるようになってしまいました。(注: 有
線キーボードです。)
再現性はバラバラですが、OS 起動時にキーボードを認識しないことがあっ
たり、BIOS に入ることも出来ないことがあったので、キーボード原因だろ
うということで、日本語フルキーボードかつ、なるべくコンパクトなもの
を買ってきました。
打ち心地はそれほどよくありません。^^;
Sun Blade2500 に付属しているキーボードは秀逸だと思うのですが、見た
目は普通の日本語キーボード、打ち心地は Sun のそれ、ってやつないのかな?
--------------------------------------------------------------------------------
title: "Emacs23 から行番号を表示できるようになっていた"
date: "2009-10-25"
--------------------------------------------------------------------------------
今まで外部パッケージを入れないと、Emacs は行番号を表示できませんでしたが、Emacs23 では最初から行番号表示できるようになっていました。
M-x linum-mode すると、カレントバッファで行番号が表示されます。M-x global-linum-mode すると、全てのバッファで行番号が表示されます。
常に行番号を表示させたい方は ~/.emacs に以下を書いておくとよいでしょう。
```elisp
(global-linum-mode t)
```
--------------------------------------------------------------------------------
title: "Debian squeeze でスクロールするとカクカクするようになった"
date: "2009-10-18"
--------------------------------------------------------------------------------
最近、testing(=squeeze) の不具合調査が多いなあ。^^;
xserver 関連のアップデートをしてから、Iceweasel(=Firefox) や
Emacs のスクロールがやけにカクカクするようになりました。
以前 {{< post "2008-08-24-1" >}} で似たような現象が起きた時は、理由が分からない
まま解決できたため、この現象に気づいたときは正直げんなりしました。
(この時予想したソフトレンダリングは、勘違いということが今回判明。)
今回は過程を重視したいため、結論は後に書きます。
まず、X の VIDEO まわりの設定を調べました。私の PC の VIDEO カード
は ATI の Radeon HD 2400 PRO です。ただ、/etc/X11/xorg.conf には以
下のような情報しか書かれていませんでした。
```
Section "Device"
Identifier "Configured Video Device"
EndSection
```
気を取り直して、ググってみたところ [debian-users:51900](http://lists.debian.or.jp/debian-users/200902/msg00047.html) が引っかかっ
たので、
># dpkg-reconfigure -plow xserver-xorg
等やってみたが変わらず。/etc/X11/xorg.conf は touch された形跡さえ
ありませんでした。
どうやら最近の X は /etc/X11/xorg.conf ではなく、hal で設定されてい
るようです。lshal コマンドで設定内容を確認できるようです。
>% lshal
lshal の出力にはめぼしいものはありませんでしたが、このスレッドの以
下のコマンドに解決のヒントが隠されていました。
>% grep EE /var/log/Xorg.0.log
>% grep WW /var/log/Xorg.0.log
実行しました。
>% grep EE /var/log/Xorg.0.log
> (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
>(II) Loading extension MIT-SCREEN-SAVER
>(EE) RADEON(0): Acceleration initialization failed
>
>% grep WW /var/log/Xorg.0.log
> (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
>(WW) The directory "/usr/share/fonts/X11/cyrillic" does not exist.
>(WW) RADEON(0): Direct rendering disabled
**Direct rendering disabled** などという、描画が遅くなりそうなキーワー
ドを発見しました!!
Direct rendering は **DRI(Direct Rendering Infrastructure)** という略
称があるらしく、xdriinfo コマンドで状態を確認できるようです。案の定、
有効になっていませんでした。
>% xdriinfo
>Screen 0: not direct rendering capable.
ここで、公式のバグ報告を探してみました。
[Debian のバグ報告は Google グループから参照できるようです。](http://groups.google.co.jp/group/linux.debian.bugs.dist/topics)
[Bug#544938](http://groups.google.co.jp/group/linux.debian.bugs.dist/browse_thread/thread/30c6a6eb6c7db75f/90fa6b836f3cbb76?lnk=gst&q=RADEON+Direct+rendering+disabled) が私の現象と良く似ています。
>Bug#544938: linux: direct rendering does not work with radeon driver on kernel 2.6.30-1-i686
私の /var/log/kern.log にも Bug#544938 と同じエラーログがありました!!
>Oct 19 00:16:52 vergil kernel: [ 34.336437] platform r600_cp.0: firmware: requesting radeon/RV610_cp.bin
>Oct 19 00:16:53 vergil kernel: [ 34.435915] r600_cp: Failed to load firmware "radeon/RV610_cp.bin"
>Oct 19 00:16:53 vergil kernel: [ 34.435918] [drm:r600_do_init_cp] *ERROR* Failed to load firmware!
Moritz Muehlenhoff さん曰く、firmware-linux パッケージをインストー
ルすべきとのこと。
インストールしました!再起動しました!解決できました!!
- スクロール時のカクカクが直りました。
- /var/log/kern.log のエラーログがなくなりました。
- /var/log/Xorg.0.log のログが変わりました。
>(WW) RADEON(0): Direct rendering disabled
>↓
>(II) RADEON(0): Direct rendering enabled
- xdriinfo の結果も変わりました。
>Screen 0: not direct rendering capable.
>↓
>Screen 0: r600
testing で問題が起きたときは、公式のバグ報告を確認するのが良さそうです。
バグ報告の詳細は [Debian バグ追跡システム](http://www.debian.org/Bugs/)をどうぞ。
**追記(2009-10-19):**
とは言え、testing はトラブルが多いなあ。testing は unstable で問題
のなかったパッケージを機械的に集めているだけなので、安定度で言えば
イマイチらしい。unstable に移行しちゃおうかなあ?
- [Debian sid(不安定版)を常用する - Hatena::Diary::Ubuntu](http://d.hatena.ne.jp/Ubuntu/20081204/1228330583)
--------------------------------------------------------------------------------
title: "VAIO W を買って、1ヶ月が過ぎた"
date: "2009-10-11"
--------------------------------------------------------------------------------
{{< post "2009-09-06-1" >}} のその後です。
1ヶ月使いましたが、それほど不満はないです。むしろ Let's Note W2
CF-W2AW1AXR と違和感がなさ過ぎて、置き換えたことを時々忘れるくらいです。
私のようにメインマシンが Linux で、サブマシンに Windows を探してい
るという人には良い選択肢だと思います。5 万で買えますし。(Let's
Note は 20 万したなあ。。。)
Let's NOTE と比べて、良くなったと感じる点です。
- 若干パフォーマンスが上がりました。
- Bluetooth が使えるようになりました。時々 {{< post "2009-08-29-1" >}} のワイヤ
レスヘッドホンで遊んでいます。
Let's NOTE と比べて、悪くなったと感じる点です。
- ファンの音が多少気になります。
- 解像度は高くなりましたが、画面は小さい(10.1 型ワイド)ので、目が疲
れそうです(※1)。
- キーボードが小さいので、打ち辛そうです(※2)。
- 足元に置いているのでそれほどでもありませんが、外付けマルチドライ
ブが少し邪魔です。
※1 いつも外部モニタに出力させているので、画面になにか表示させるこ
とはほとんどありません。
※2 synergy を使っているので、キーボードに触ることはほとんどありま
せん。{{< post "2009-07-20-3" >}}
--------------------------------------------------------------------------------
title: "Emacs23 から初期化時間や動作時間を確認できるようになった"
date: "2009-10-11"
--------------------------------------------------------------------------------
```elisp
;; Emacs 起動時の初期化時間を返す。
(emacs-init-time)
=> "26.6 seconds"
;; Emacs の動作時間を返す。
(emacs-uptime)
=> "1 day, 15 hours, 2 minutes, 17 seconds"
```
参考にした Web サイト:
[Emacs23における変更点(一部) - とりあえず暇だったし何となく始めたブログ](http://d.hatena.ne.jp/khiker/20080627)
--------------------------------------------------------------------------------
title: "MySQL の主要なコマンド"
date: "2009-10-10"
--------------------------------------------------------------------------------
```
# 接続("mysql>" プロンプトに移行する。)
% mysql -u root -p
# データベースの一覧
mysql> show databases;
# 文字コードの確認
mysql> show create database データベース名;
# データベースの作成
mysql> create database データベース名;
# 文字コードに utf-8 を指定したデータベースの作成
mysql> create database データベース名 character set utf8;
# ユーザの追加
mysql> grant all privileges on データベース名.* to ユーザ名@localhost identified by 'パスワード';
# データベースの削除
mysql> drop database データベース名;
# サーバのステータス情報確認。"mysqladmin -u root -p status" はこれの簡易版。
mysql> status;
# サーバの詳細なステータス情報確認。"mysqladmin -u root -p extended-status" と同様。
mysql> show status;
# 終了
mysql> exit;
# 変数の確認
% mysqladmin -u root -p variable
# 存在するデータを全てバックアップ
% mysqldump -u root -p -x --all-databases > alldump.sql
# 全てのデータベースのバックアップを復元
% mysql -u root -p < alldump.sql
# 特定のデータベースのバックアップ
% mysqldump -u root -p データベース名 > dump.sql
# 特定データベースのみの復元(データベースを作成してから下記コマンドを実行)
% mysql -u root -p データベース名 < dump.sql
```
参考にした Web サイト:
[mysql - Linuxで自宅サーバ構築・管理: KSKNET](http://www.ksknet.net/mysql/)
[mysqldumpでバックアップ&復元 - phpspot](http://phpspot.net/php/pgmysqldump%82%C5%83o%83b%83N%83A%83b%83v%81%95%95%9C%8C%B3.html)
**追記(2011-07-27):**
[Mac 用 DMG](http://www.mysql.com/downloads/mysql) をインストールした場合、以下のコマンドで mysqld を
start/stop 出来る。
```
# /usr/local/mysql/support-files/mysql.server start
# /usr/local/mysql/support-files/mysql.server stop
```
--------------------------------------------------------------------------------
title: "Debian squeeze で Redmine を構築してみた (MySQL 版)"
date: "2009-10-10"
--------------------------------------------------------------------------------
{{< post "2009-10-08-1" >}} はデータベースに sqlite3 を使用する方法ですが、書き
込みが行われている時はデータベース全体がロックされるなどパフォーマ
ンスに問題があるそうです。そこで、MySQL を使う方法も試してみました。
前回に補足する形で説明していきます。
## 基本的な構築手順
### 1. に加え、mysql-server もインストールしてください。
さらに、MySQL のデータベースも作成します。
>% mysql -u root -p
>
># 文字コードに utf8 を指定したデータベース redmine を作成
>mysql> create database redmine character set utf8;
>
># データベース redmine のユーザ redmine を作成し、パスワードに XXXXXXXX を設定。
>mysql> grant all privileges on redmine.* to redmine@localhost identified by 'XXXXXXXX';
>
>mysql> exit;
### 3-1. の database.yml は以下の修正に置き換えます。
```
--- config/database.yml.example 2009-09-13 21:10:16.000000000 +0900
+++ config/database.yml 2009-10-10 23:14:31.000000000 +0900
@@ -10,9 +10,10 @@
adapter: mysql
database: redmine
host: localhost
- username: root
- password:
+ username: redmine
+ password: XXXXXXXX
encoding: utf8
+ socket: /var/run/mysqld/mysqld.sock
development:
adapter: mysql
```
socket の場所は以下のコマンドで調べられます。
>% mysqladmin -u root -p variable | grep socket
設定の差分はこんなところです。
注意点として sqlite3 の時はデータベースが redmine-0.8.5/db に作られ
ましたが、MySQL の時は /var/lib/mysql 等に作られます。バックアップ
を取り忘れないようにしてください。
データベースのディレクトリは以下のコマンドで調べられます。
>% mysqladmin -u root -p variable | grep datadir
MySQL の主要なコマンドや、バックアップの取り方は {{< post "2009-10-10-2" >}} に
まとめました。
--------------------------------------------------------------------------------
title: "Debian squeeze で Redmine を構築してみた"
date: "2009-10-08"
--------------------------------------------------------------------------------
Redmine とは、プロジェクト管理ツールです。
仕事で必要になったので、手始めに自宅で構築してみました。
lenny から Ruby on Rails がパッケージに含まれるようになったそうで、
比較的簡単に構築することが出来ました。
## 基本的な構築手順
### 1. Synaptic パッケージマネージャから rails をインストールします。
構築したマシンに既に apache2 や libsqlite3-ruby1.8 をインストールし
ていたので、今回は rails のみのインストールで済みました。
### 2. [Redmine の公式サイト](http://redmine.jp/)から、redmine-0.8.5.tar.gz をダウンロードし、~/public_html に展開します。
>% cd ~/public_html
>% tar xzf redmine-0.8.5.tar.gz
### 3. [公式サイトの手順](http://redmine.jp/tech_note/install/)を参考にして、Redmine の設定をします。
展開したディレクトリに移動します。
>% cd redmine-0.8.5
### 3-1. database.yml の設定
サンプルを元に設定を開始します。
>% cp config/database.yml.example config/database.yml
修正内容は以下のとおり、公式と同じにします。
```
--- config/database.yml.example 2009-09-13 21:10:16.000000000 +0900
+++ config/database.yml 2009-10-08 21:27:03.000000000 +0900
@@ -7,12 +7,9 @@
# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
production:
- adapter: mysql
- database: redmine
- host: localhost
- username: root
- password:
- encoding: utf8
+ adapter: sqlite3
+ dbfile: db/redmine.db
+ timeout: 5000
development:
adapter: mysql
```
### 3-2. email.yml の設定
サンプルを元に設定を開始します。
>% cp config/email.yml.example config/email.yml
修正内容は以下のとおり、公式と同じにします。
```
--- config/email.yml.example 2009-09-13 21:10:16.000000000 +0900
+++ config/email.yml 2009-10-08 21:27:32.000000000 +0900
@@ -3,12 +3,9 @@
production:
delivery_method: :smtp
smtp_settings:
- address: smtp.example.net
+ address: localhost
port: 25
- domain: example.net
- authentication: :login
- user_name: redmine@example.net
- password: redmine
+ domain: localhost
development:
delivery_method: :smtp
```
### 3-3. データベースを初期化します。
>% rake db:migrate RAILS_ENV=production
>% rake load_default_data RAILS_ENV=production
ja を選択。
### 3-4. Apache が書き込めるように、other に write 権限をつけます。
>% chmod -R o+w .
### 4. Redmine を起動します。http://localhost:3000/ でアクセスできたら成功です。
>% ./script/server -e production
## 自動起動と URL の設定手順
Redmine を毎回手動で起動するのはかっこ悪いので、自動起動するように
設定を行います。
さらに、http://localhost:3000/ ではなく、http://localhost/redmine/
でアクセス出来るようにします。
### 1. Synaptic パッケージマネージャから libapache2-mod-passenger をインストールします。
### 2. root になって、以下のシンボリックリンクを貼ります。
># ln -s ~masutaka/public_html/redmine-0.8.5/public /var/www/redmine
### 3. mod-passenger の設定ファイルを以下のように修正します。
```
--- /etc/apache2/mods-available/passenger.conf.default 2009-08-20 05:33:57.000000000 +0900
+++ /etc/apache2/mods-available/passenger.conf 2009-10-08 23:27:10.000000000 +0900
@@ -1,4 +1,5 @@
PassengerRoot /usr
PassengerRuby /usr/bin/ruby
+ RailsBaseURI /redmine
```
### 4. Apache を再起動します。http://localhost/redmine/ でアクセスできたら成功です。
># /etc/init.d/apache2 restart
2,3,4 は http://tech.lampetty.net/tech/index.php/archives/276 を
参考にさせて頂きました。ありがとうございます。
**追記(2009-10-10):**
データベースに MySQL を使用する方法も検討しました。{{< post "2009-10-10-1" >}}
--------------------------------------------------------------------------------
title: "Web ブラウザに表示されている画面を直接編集する方法"
date: "2009-10-04"
--------------------------------------------------------------------------------
これはすごい。Web ブラウザのアドレスバーに以下を入力し Enter すると、
今表示されている内容を直接編集できる。Firefox 3.0.14 と IE8 で出来
ることを確認した。
```
javascript:document.body.contentEditable='true'; document.designMode='on'; void 0
```
[WEBブラウザーに表示されている画面を直接編集する方法 - sanonosa システム管理コラム集](http://nosa.cocolog-nifty.com/sanonosa/2009/04/web-75b1.html)
**追記(2009-10-04):**
戻す方法はないものかなあ。'false' と 'off' では出来なかった。
**追記(2009-10-17):**
「戻す方法」というのは、「編集モードから閲覧モードに戻す方法」のこ
とです。端折った書き方ですみませんでした。もう少し楽な方法が見つかっ
たので、以下に追記します。
IE では、以下を入力し Enter すると編集状態を保ったまま閲覧モードに
戻せますが、Firefox ではそれができません。
```
javascript:document.body.contentEditable='false'; document.designMode='off'; void 0
```
[はてなブックマークからの情報](http://b.hatena.ne.jp/entry/masutaka.net/chalow/2009-10-04-1.html)によると、[Firefox の Page Hacker アドオ
ン](https://addons.mozilla.org/ja/firefox/addon/page-hacker/)を使えば閲覧モードに戻せることが分かりました。編集モードへの移行
もこのアドオンで出来ます。
--------------------------------------------------------------------------------
title: "最近の 200 件より前のつぶやきを、はてなにアップした"
date: "2009-09-28"
--------------------------------------------------------------------------------
{{< post "2009-08-23-1" >}} の続きです。
[twtr2src](http://twtr2src.ogaoga.org/) の仕様で、200 件より前のつぶやきは HTML, Hatena, Plane
Text のいずれのフォーマットでも取得することが出来ません。
私が Twitter を始めたのは 2009/6/2 です。twtr2src を使って、はてな
につぶやきをアップ出来たのが 2009/7/16 までです。つまり、2009/6/2〜
2009/7/15 までのつぶやきが、はてなにアップ出来ていないことになりま
す。これは対策を講じる必要があるでしょうw
**いきなりですが、[twilog](http://twilog.org/) を利用すると、この問題を解決できます。**
本来は、そういう目的の Web サービスではありませんけどね。
twilog にユーザ登録(無料)をすると、右上の「各種設定」から「過去のつ
ぶやきの取得」ができるようになります。ただし Twitter 自身の仕様で、
取得出来るのは 3200 件までだそうです。私はまだ、815 回しかつぶやい
ていないので、セーフでした。
取得し終わったら、はてな記法のソースを取得します。と言っても用意さ
れているわけではないので、自分ではてな記法に設定します。
**1.** 各日付の「ソース取得」の "div・p" や "ul・li" をクリックすると、
[こちらの Greasemonkey](http://userscripts.org/scripts/show/57746) というリンクがあります。これをクリックします。
**2.** "Install" というボタンの下に、["How do I use this?"](http://userscripts.org/about/installing) というリンク
があります。これをクリックします。この時点では "Install" をクリック
しても、[57746.user.js](http://userscripts.org/scripts/source/57746.user.js) がそのまま表示されるだけです。
**3.** なにやら英語で書いてありますが、"Install" ボタンをクリックする前
に [Greasemonkey という Firefox アドオン](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/)をインストールする必要がある
ようです。インストールします。
**4.** Greasemonkey をインストールすると、2 の "Install" ボタンが有効に
なるはずです。クリックします。
**5.** 以上を終え、http://twilog.org/YourTwitterAccount/ をリロードすると
「**テンプレート:編集**」や「ソース取得: div・p ul・li p **テンプレ**」
が出現するはずです。
**6.** 以下のようにテンプレートを設定すると、twtr2src が吐き出すはてな
記法に近くなります。ヘッダはそのまま、はてなダイアリーのタイトルに
なります。自動で日付を入れることは出来ないので、ソース取得後に手動
で修正する必要があります。
```
◎ヘッダ
*2009-06- () の Twitter でのつぶやき
◎リスト
- [%url%:title=%time%] %text%
◎フッタ
Powered by [http://twtr2src.ogaoga.org/:title=twtr2src]
```
**7.** ここから先は、ひたすら手動で「各日付ごとのソースを取得」し、
はてなに手動でアップする作業を続けます。自分との戦いです。
こんなことやる人は私以外いないのでは...。しかも twtr2src と書式を合
わせるために、時刻の秒の部分は除外してアップしました(さすがに正規表
現置換は使いましたけど)。
--------------------------------------------------------------------------------
title: "Emacs のソースコードを Git から取得してみた"
date: "2009-09-27"
--------------------------------------------------------------------------------
[emacs - Git Repositories](http://savannah.gnu.org/git/?group=emacs)
Emacs のソースコードは Git(ぎっと) でも公開されているので、
Git Repository から取得してみました。
まず、Git というのは分散型バージョン管理システムです。CVS や
Subversion は集中型バージョン管理システムなので、操作や考え方が少し
違います。
分散型バージョン管理については、以下のページにわかりやすくまとめら
れています。
[Git/分散レポジトリって何が嬉しいの - かWiki](http://b4.x0.com/hiki/?Git%2F%CA%AC%BB%B6%A5%EC%A5%DD%A5%B8%A5%C8%A5%EA%A4%C3%A4%C6%B2%BF%A4%AC%B4%F2%A4%B7%A4%A4%A4%CE)
作業者が個別にリポジトリを持てるので、commit 権がないプロジェクトの
修正を管理できる点が良さそうですね。
以下のページも面白いです。アリスの遅れている作業を、ボブが手伝って
います。
[アリスとボブのコラボレーション、gitをちゃんと理解したい! - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20080908/1220881938)
これで、Git の概要が分かりました。コマンド操作は後で述べるとして、
先に Emacs のソースコードを取得することにします。
Debian では git-core をインストールすると、Git が使えるようになります。
以下のコマンドで Emacs のソースコードを取得できます。カレントディレ
クトリに emacs というディレクトリが作られます。
>% git clone git://git.savannah.gnu.org/emacs.git
Emacs のソースコードを取得できました。
cvs update や svn update に相当するコマンドは以下になります。
>% git pull
CVS や Subversion を使ったことがある人なら、以下のページが参考にな
りそうです。
[Git/CVSコマンド対応表 - かWiki](http://b4.x0.com/hiki/?Git%2FCVS%A5%B3%A5%DE%A5%F3%A5%C9%C2%D0%B1%FE%C9%BD)
[Git/Subversionコマンド対応表 - かWiki](http://b4.x0.com/hiki/?Git%2FSubversion%A5%B3%A5%DE%A5%F3%A5%C9%C2%D0%B1%FE%C9%BD)
Git のドキュメントは以下のページをどうぞ。
[Git入門](http://www8.atwiki.jp/git_jp)
**追記(2010-01-17):**
Emacs リポジトリは CVS から Bazaar に移行したそうです。古い情報を載
せておくのもよくないので、{{< post "2010-01-17-1" >}} に軽くまとめました。
--------------------------------------------------------------------------------
title: "Debian squeeze で migemo が使えなくなった"
date: "2009-09-22"
--------------------------------------------------------------------------------
10 日くらい前から Debian squeeze で migemo が使えなくなってしまいま
した。
正常に実行できる Meadow と " *migemo*" バッファを比べてみると、
Debian の方は文字化けしています。migemo_0.40-8 の /usr/bin/migemo
への以下の修正が影響しているようです。
```
# 修正前
puts regex_str
# 修正後
puts ENV['LANG'].include?("UTF-8") ? NKF.nkf('-Ew', regex_str) : regex_str
```
/usr/share/emacs/site-lisp/migemo/migemo.el も修正する必要があった
ようで、[#546920](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=546920) で対応されました。migemo_0.40-10 では直るようです。
しかしまだ squeeze には降りてきていないので、当面は ~/.emacs に以下
を設定し生活することにします。
>(setq migemo-coding-system 'utf-8-unix)
**追記(2009-09-29):**
migemo_0.40-10 が squeeze に降りてきたので、migemo-coding-system の
設定を削除しました。
--------------------------------------------------------------------------------
title: "本を購入"
date: "2009-09-19"
--------------------------------------------------------------------------------
近所の文教堂に行ってきました。
## 幽霊人命救助隊
{{< amazon asin="4167717263" title="幽霊人命救助隊" >}}
今月の部会で上司がおすすめしていて、たまたま見つけたので買ってきま
した。サラっと読めると聞いたのですが、予想外の分厚さにうろたえましたw
## シグルイ 13
{{< amazon asin="425323223X" title="シグルイ 13" >}}
新巻が出ていたので、買ってきました。大手を振って「読んでます」って
言えない漫画です。^^;
--------------------------------------------------------------------------------
title: "文字列の整列"
date: "2009-09-15"
--------------------------------------------------------------------------------
M-x align-regexp がなかなか便利。
まずは *Help* のサンプルより。
```
Fred (123) 456-7890
Alice (123) 456-7890
Mary-Anne (123) 456-7890
Joe (123) 456-7890
```
上記をリージョンで括って、
M-x align-regexp [Enter] ( [Enter] すると、、、
```
Fred (123) 456-7890
Alice (123) 456-7890
Mary-Anne (123) 456-7890
Joe (123) 456-7890
```
C ソースだともっと便利さが伝わるかもしれない。
実行前
```
printf("aaa\n");/* aaa */
printf("bbbbbb\n");/* bbb */
printf("ccccccccc\n");/* ccc */
```
M-x align-regexp [Enter] /\* [Enter] 実行
```
printf("aaa\n"); /* aaa */
printf("bbbbbb\n"); /* bbb */
printf("ccccccccc\n"); /* ccc */
```
おっと、M-x align というのもあると教えてもらった。これは現在のメ
ジャーモードから適切な整形を推測し、行ってくれる。M-x align-regexp
は明示的に整形したい時に使う。
--------------------------------------------------------------------------------
title: "synergy その後"
date: "2009-09-10"
--------------------------------------------------------------------------------
{{< post "2009-07-20-3" >}} のその後
新しい PC でも、良い感じで使っています。
ただ、左端や右端から少しでもはみ出ると、隣の PC からカーソルがひょっ
こりと顔を出してしまうので、上 10% と下 10% は無視させるようにしま
した。
サーバ側の ~/.synergy.conf を置き換えます。
```
# vergil -> SERVER PC (Linux)
# nero -> CLIENT PC (Windows)
section: screens
vergil:
nero:
end
section: links
vergil:
left(10,90) = nero(10,90)
nero:
right(10,90) = vergil(10,90)
end
```
参考情報:
[Synergy Configuration Guide](http://synergy2.sourceforge.net/configuration.html)
--------------------------------------------------------------------------------
title: "今日の買い物"
date: "2009-09-06"
--------------------------------------------------------------------------------
## VAIO W シリーズ VPCW119XJ/W
{{< amazon asin="B002GK2Q8Q" title="ソニー(VAIO) VAIO Wシリーズ W119 ホワイト 10.1型ウルトラワイド XP Home VPCW119XJ/W" >}}
[Let's NOTE W2 CF-W2AW1AXR](http://panasonic.jp/pc/support/products/w2a/index.html) の HDD がクラッシュしたので、代わりに買っ
てきました。いや、もう少し正確に書きましょう。
- 2年ほど前から、Let's Note の液晶の半分の領域に縦線が出現し、かな
り見えづらい状態だった。
- そのため、普段は画面を隣のデスクトップの液晶に出力して使っていた。
- 先週の日曜日に、私の目の前で HDD がクラッシュした。
- HDD の換装を試みたが、ネジをバカにしてしまい、諦めた。
- 今日、情報収集するためにノート PC を見に行った。
- 気がついたら買っていた。
いわゆるネットブックというやつです。ほとんどの作業は Linux PC で行
うので、私の場合、Windows PC はネットブックで十分だと思います。(関
係ないけど、ネットブックという呼称はなんか好きになれないなあ。)
Sony の PC は初めてなので、ちょっとドキドキしています。
[VAIO W のスペック表はこちらです。](http://www.vaio.sony.co.jp/vaio/pre_include/html/W1/spec_retail1.html)見た目のよさと、IEEE 802.11n と
Bluetooth が対応されていることに惹かれて、購入しました。CPU やメモ
リ、HDD にはこだわりませんでした。液晶は私の嫌いな光沢タイプ :-P で
すが、外部出力する予定なので今回は問題ありません。
値段は ¥50,025 でした。内訳は以下になります。
|本体(¥51,700) + ヨドバシ延長保証サービス(¥2,585) - 金券(¥100) - ヨドバシポイント(¥4,160)
ヨドバシ延長保証サービスは、故障した時に正規の値段よりも安く修理が
できるサービスのようです。安いのでまあいいかと思い、申し込んでしま
いました。[ヨドバシ延長保証サービスの詳細はこちらです。](http://www.yodobashi.com/ec/support/afterservice/guarantee/index.html)
金券は、古い PC の下取り価格です。念のため古い PC を持っていったの
で、下取りが出来ました。ヨドバシ側の事情で、買い取りという形にする
必要があるそうで、¥100 という下取り価格になりました。
HDD の代わりに SSD が搭載されている、[NEC の UltraLite VS](http://www.nec.co.jp/products/bizpc/versapro/spec/vs.shtml) も検討しま
したが、外部ビデオ出力がないため見送りました。ちなみにこちらの値段
は、10 万円くらいでした。
これからセットアップを始めます!!
## 外付けマルチドライブ
{{< amazon asin="B001DX9ESC" title="BUFFALO DVD-RAM/±R(1層/2層)/±RW対応 USB2.0用 外付けDVDドライブ DVSM-XE20U2/B" >}}
VAIO W には、DVD ドライブが付いていません。普段は Linux PC の DVD
ドライブを Samba で共有にして使えば良いと思うので、Windows を再イン
ストールする時だけ、これを使います。
あと、最近の PC にはリカバリ用の DVD が付属していることは少なく、
VAIO W にも付属していなかったので、セットアップ後すぐにリカバリ用の
DVD を作ることも目的の一つです。(あっ、DVD-R 買うの忘れた...。)
そういう用途なので、一番安い(¥5,480)マルチドライブを買いました。全
くコンパクトではなくて、うちの NAS より大きいです。使うときだけ箱か
ら出して使う予定なので、まあいいのですが。
最後になりますが、会社で同じものを見かけた気がすることを付け加えさ
せていただきます。
--------------------------------------------------------------------------------
title: "このサイトに Google AdSense を設置しました"
date: "2009-09-03"
--------------------------------------------------------------------------------
アイテム毎のページ(例: {{< post "2009-09-03-1" >}})に [Google Adsense](https://www.google.com/adsense/) を表示する
ようにしました。
Google Adsense は、広告配信サービスの一つです。サイトに合った広告を
配信するのが特徴のようです。
{{< wikipedia "Google_AdSense" >}}
現在のアクセス数で収益が出るとは思っていませんが、それなりに適切な
広告が配信されていて興味深いです。
ところで、GIGAZINE にこんな記事がありました。
[Google AdSenseの始め方 その1「審査を突破する」 - GIGAZINE](http://gigazine.net/index.php?/news/comments/20061107_adsense_start/)
でも、私の場合はあっさり突破できてしまいました。個人向けだからでしょ
うか。それとも、たまたま[連絡先メールフォームを設置していた](/contact.html)からでしょうか。
配色は、たつをさんのページに触発されました。
[[を] コンテンツ連動型広告はどこに設置するのが良いか](http://chalow.net/2006-04-12-1.html)
なるべく目立たないように設置したつもりです。
ついでに {{< post "2009-03-22-1" >}} に設置したシムエントリも周囲に溶け込ませる
配色にしました。
--------------------------------------------------------------------------------
title: "今週の買い物"
date: "2009-08-29"
--------------------------------------------------------------------------------
## Bluetooth 送信機(トランスミッタ)
{{< amazon asin="B0021YZ3F0" title="シグマAPO Bluetooth(ブルートゥース)ver.2.1対応オーディオトランスミッター(発信機)。 SBT04WH" >}}
iPod 用にはコードレスで本体に直接接続できるトランスミッタが発売されていますが、DS 用のものはないようなので、不本意ながらコード付きのこれにしました。ゲームには音が必須だと思いますが、需要はないのでしょうか...。
結論としては DS でワイヤレスイヤホンを使うのは時期尚早だと思います。素直に DS が Bluetooth 対応するのを待つか、直接接続&給電できるタイプのトランスミッタが出るのを待ちましょう。
## ワイヤレスヘッドホン
{{< amazon asin="B001BAHNVM" title="SONY ワイヤレスステレオヘッドセット BT140Q ホワイト DR-BT140Q/W" >}}
耳かけタイプのヘッドホンです。イヤホンタイプのものを探したのですが、高い({{< amazon_link asin="B001MSQWHE" title="¥4.5万!!" >}})か、片側だけのものしかありませんでした。
本当は、有線のイヤホンをそのまま無線にしたものが良いのですが。
さて、右側のヘッドホンには以下の機能が集まっています。
- Power ボタン
- 音量調節ボタン
- 音楽再生、停止、スキップボタン
- 携帯用マルチファンクションボタン
- ペアリングボタン
- マイク
左側のヘッドホンは充電用の端子だけです。
左右のヘッドホンは紐で繋がれていますが、邪魔だからと言って切ってはいけません。良く考えれば分かりますが、左側のヘッドホンから給電しているため、即使えなくなります。危なかった。。。
今回買ったトランスミッタとヘッドホンは、どちらもワイヤが残っています。値段もそうですし、Bluetooth ヘッドホンはまだ過渡期なんだなあと思いました。
ところで、付けているとなぜか左耳だけ痛くなります。合わないのかな...?
## 排水口付きトレー
{{< figure src="/images/brezza12.jpg" link="http://house.richell.co.jp/view.html?gid=13690" target="_blank" rel="noopener" alt="画像" >}}
ブレッザ ドレイナートレー S
この上に、洗った食器を入れるザルを置いて使います。こうすることで、溜まった水が速やかに排出されるので清潔です。排出される様子を見ているのも、面白いです。^^;
## 爪切り用品
{{< amazon asin="B002KGMX9I" title="匠の技ステンレス製高級爪切G-1008" >}}
{{< amazon asin="B0023D3V7Q" title="足爪クリアスティック" >}}
家にある爪切りにヤスリが付いていなかったので、買ってきました。が、良く見たら、家にあるものと同じものを買っていました...。(なんだか雰囲気が違って見えたので...。←言い訳) ただ、良く見るとヤスリは付いていたことが分かったので、良しとします。
もう一つのは、爪の垢をかき出すものらしいです。これにもヤスリは付いています。
## メモ帳
{{< amazon asin="B0012OV6QU" title="コクヨ ノ-414 ポケットノート(ツインリングとじ)A6変形B罫50枚 20セット" >}}
愛用しているメモ帳がなくなったので、まとめて4冊買いました。
## その他買ったもの
箸、茶碗、弁当箱
**追記(2009-09-17):**
意識していませんでしたが、{{< post "2009-09-06-1" >}} に買った VAIO とワイヤレスヘッドホンは、同じ Sony 製で色も同じホワイトでした。うちにはスピーカーがないので、ちょっと音楽を楽しむために重宝しそうです。
--------------------------------------------------------------------------------
title: "Twitter のつぶやきを一日単位で自動でアップする"
date: "2009-08-23"
--------------------------------------------------------------------------------
[[を] はてなダイアリーに一日単位で自分のツイッターのつぶやきをアップする方法](http://chalow.net/2009-08-15-1.html)
おもしろそうだったので、私もはてなダイアリーにアップすることにしま
した。一日単位での Twitter のつぶやきが、はてなダイアリーの記事とし
て毎日 0:00 に投稿されます。
[マスタカ (masutaka) on Twitter (はてな版)](http://d.hatena.ne.jp/masutaka26/)
記事のタイトルや、つぶやきを昇順にするか降順にするかは [twtr2src](http://twtr2src.ogaoga.org/) の
Setting → Format から設定できます。
私は Sorting order of timeline を「Morning to night」に、
Title format を「%Y-%m-%d (%a) の Twitter でのつぶやき」にしました。
--------------------------------------------------------------------------------
title: "screen で window 毎に encoding を変える方法"
date: "2009-08-22"
--------------------------------------------------------------------------------
普段は LANG=EUC-JP な環境で、時々 LANG=UTF8 の環境に ssh する時などに便利です。
変えたい window 上で以下のコマンドを実行してください。`` のデフォルトは Ctrl-a です。Ctrl-z にしている人が多いかもしれないです。
```
:encoding [enc]
```
`[enc]` は、utf8, eucjp, sjis, jis などが使えます。詳細は man screen をご覧下さい。
参考情報:
[unknownplace.org - 2005/10/19 - :encoding](http://unknownplace.org/memo/2005/10/19#e005)
P.S.
今気づいたのですが、~/.screenrc の内容は `:` で実行できるのですね。
--------------------------------------------------------------------------------
title: "screen で 最終行にウィンドウ一覧を表示する方法"
date: "2009-08-22"
--------------------------------------------------------------------------------
以下を ~/.screenrc に書くと、
```
hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"
```
こんな風に表示できます。

タブ表示みたいで良いですね。ウィンドウをいくつ開いているかよく忘れるので ^^; 、便利です。
参考情報:
[GNU screen いろいろまとめ。 - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20051223/1135351050)
**追記(2009-08-23):**
zsh ユーザの方は、以下を ~/.zshrc に書いておくと "zsh" という文字列の代わりに「コマンド実行中はコマンド名を、未実行ならカレントディレクトリを表示」してくれます。情報ありがとうございます。> kitokitoki さん
```
case "$TERM" in
screen)
preexec() {
echo -ne "\ek#${1%% *}\e\\"
}
precmd() {
echo -ne "\ek$(basename $(pwd))\e\\"
}
esac
```
参考情報:
[screenのキャプションにディレクトリ名 or コマンド名を表示 - メモの日々(2008-03-31)](http://ogawa.s18.xrea.com/tdiary/20080331.html#p02)
--------------------------------------------------------------------------------
title: "Twitter でつぶやいた日々の食事を Google カレンダーで表示する"
date: "2009-08-22"
--------------------------------------------------------------------------------
食べったー {{< twitter "tabetter" >}} という Twitter Bot があります。
tabetter にフォローすると、フォローし返してくれます。その状態で、自
分のアカウントに決まった書式のつぶやきをすると、
http://tabetter.bug-fix.net/ical/.ics
にひたすら記録してくれるというサービスです。
詳細は、食べったーの Web site をご覧下さい。
http://tabetter.bug-fix.net/index_/index.html
さて、.ics は、iCalendar 形式のファイルです。これは
Google カレンダーから「表示のみが可能なカレンダー」として読み込ませ
ることができます。
こうすることで、Twitter でつぶやいた日々の食事を Google カレンダー
で表示することが可能です。
左側のメニューにある「他のカレンダー」から、「追加」→「URLで追加」
をクリックし、前述の URL を追加します。

食事の記録が表示されました!!

参考情報:
[vCalendar、iCalendar - コニファマメ知識](http://www.conifer.jp/coni_mame102.html)
[Twitterでの発言をGoogleカレンダー上に表示させることができる『twistory』](http://www.ideaxidea.com/archives/2008/11/twittergoogletwistory.html)
P.S.
Firefox の Twitter アドオンは、[TwitterFox](https://addons.mozilla.org/ja/firefox/addon/echofon-for-twitter/) がなかなか良いです。
RT は右クリックでできます。← できないと思っていた人...。
**追記(2009-12-06):**
[こんな感じ](/tabetter.html)に任意の Web サイトに Google カレンダーを表示させることも
できます。
--------------------------------------------------------------------------------
title: "ソーシャルブックマーク用のボタンを付けました。"
date: "2009-08-19"
--------------------------------------------------------------------------------
{{< post "2009-08-16-2" >}} のバージョンアップ。
「twitter でつぶやく」ボタンに加え、「はてなブックマーク」と「livedoor クリップ」ボタンも付けました。
| | | |
|---|---|---|
|  |  |  |
「はてなブックマーク」はそろそろ使おうかなと思っていましたが、livedoor のアカウントは以前破棄したので、このためだけにアカウントを再取得しました。
今回も chalow 本体の修正です。chalow ユーザ向けに、オリジナル(chalow-1.0.tar.gz)の cl.conf と chalow へのパッチを貼り付けておきますね。{{< post "2009-08-16-2" >}} のパッチよりも、こちらのパッチのほうが拡張性あるのでオススメです。
```diff
--- cl.conf.org 2007-10-19 21:38:22.000000000 +0900
+++ cl.conf 2009-08-19 21:18:09.000000000 +0900
@@ -315,7 +315,7 @@
$item_template = << "EACHITEM"
-
+
《続きを読む》
--- chalow.org 2007-10-19 23:15:01.000000000 +0900
+++ chalow 2009-08-19 22:10:37.000000000 +0900
@@ -586,6 +586,7 @@
$t->param(content => $ccc);
$t->param(header => $ih);
$t->param(cat => $catstr);
+ $t->param(sbm => make_sbm_link_html($e->{$i}{h}, $item_url));
$t->param(author => $e->{$i}{a});
$t->param(referrer => join(" ", @inside_refs));
$t->param(id => $item_id);
@@ -778,6 +779,7 @@
$t->param(header_text => $item->{ho});
$t->param(header => $item->{h});
$t->param(cat => $catstr);
+ $t->param(sbm => make_sbm_link_html($item->{h}, $item_url));
$t->param(author => $item->{a});
$t->param(referrer => join(" ", @inside_refs));
$t->param(id => $item_id); # 200101011
@@ -1401,6 +1403,37 @@
}
+### ソーシャルブックマーク用のリンクを作る。
+sub make_sbm_link_html {
+ my ($ih, $item_url) = @_;
+
+ my $item_url_full = $clog_url . $item_url;
+ my $link_html = "";
+
+ ### はてなブックマーク用のリンクを作る。
+ $link_html .= qq().
+ qq(
).
+ qq(
);
+
+ ### livedoor クリップ用のリンクを作る。
+ $link_html .= qq().
+ qq(
).
+ qq(
);
+
+ ### Twitter 用のリンクを作る。
+ my $statusstr = $ih;
+ to_utf8_cl(\$statusstr);
+ $statusstr =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei;
+ $statusstr =~ s/\s$//;
+ $statusstr =~ s/\s/%20/g;
+ $link_html .= qq().
+ qq(
);
+
+ return $link_html;
+}
+
+
### 指定されたファイルへ文字列を出力
sub output_to_file {
my ($fname, $contp) = @_;
```
画像ファイルは image ディレクトリに置いて下さい。
| | | |
|---|---|---|
|  |  |  |
Twitter の %23masutaka は、適当な文字列に置き換えて下さい。
~~**追記(2009-09-14):**~~
~~はてなブックマークな人は、Firefox アドオン使っているだろうというこ~~
~~とで、Twitter のつぶやきボタン以外、止めました。~~
**追記(2009-10-26):**
やっぱり、上記全てのボタンを使うことにしました。
--------------------------------------------------------------------------------
title: "「twitter でつぶやく」ボタンを付けました。"
date: "2009-08-16"
--------------------------------------------------------------------------------
このブログの各記事にボタンを付けました。Twitter ユーザは、簡
単にこのブログに関するつぶやきを投稿することが出来ます。どうぞご利
用下さい。
今回も chalow 本体を修正しました。chalow ユーザ向けに、オリジナ
ル(chalow-1.0.tar.gz)の cl.conf と chalow へのパッチを貼り付けてお
きますね。
```
--- cl.conf.org 2007-10-19 21:38:22.000000000 +0900
+++ cl.conf 2009-08-16 15:26:20.000000000 +0900
@@ -315,7 +315,7 @@
$item_template = << "EACHITEM"
-
+
《続きを読む》
```
```
--- chalow.org 2007-10-19 23:15:01.000000000 +0900
+++ chalow 2009-08-16 15:29:44.000000000 +0900
@@ -573,6 +573,9 @@
my $item_ymdi = $ymd."-".$i;
(my $item_id = $ymd.$i) =~ s/-//g; # Ex. "200309241"
+ ### ReTweet
+ my $retweet = make_retweet_link_html($e->{$i}{cat}, $e->{$i}{h}, $item_url);
+
### item の組み上げ
my $t = HTML::Template->new(scalarref => \$item_template,
die_on_bad_params => 0);
@@ -586,6 +589,7 @@
$t->param(content => $ccc);
$t->param(header => $ih);
$t->param(cat => $catstr);
+ $t->param(retweet => $retweet);
$t->param(author => $e->{$i}{a});
$t->param(referrer => join(" ", @inside_refs));
$t->param(id => $item_id);
@@ -754,6 +758,9 @@
$ymdi_after = $day_a."-1";
}
+ ### ReTweet
+ my $retweet = make_retweet_link_html($ent->{$i}{cat}, $item->{h}, $item_url);
+
### ページの組み上げ
my $t = HTML::Template->new(scalarref => \$item_page_template,
loop_context_vars => 1,
@@ -778,6 +785,7 @@
$t->param(header_text => $item->{ho});
$t->param(header => $item->{h});
$t->param(cat => $catstr);
+ $t->param(retweet => $retweet);
$t->param(author => $item->{a});
$t->param(referrer => join(" ", @inside_refs));
$t->param(id => $item_id); # 200101011
@@ -1401,6 +1409,29 @@
}
+### ReTweet 用のリンクを作る。
+sub make_retweet_link_html {
+ my ($catp, $ih, $item_url) = @_;
+
+ my $catstr = join("", map {"[$_] "} @$catp);
+
+# my $statusstr = $catstr . $ih;
+ my $statusstr = $ih;
+ to_utf8_cl(\$statusstr);
+ $statusstr =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei;
+ $statusstr =~ s/\s$//;
+ $statusstr =~ s/\s/%20/g;
+
+ $item_url = $clog_url . $item_url;
+
+ my $link_html = qq().
+ qq(
).
+ qq();
+
+ return $link_html;
+}
+
+
### 指定されたファイルへ文字列を出力
sub output_to_file {
my ($fname, $contp) = @_;
```
- カテゴリも含めたい場合は、$catstr を使って下さい。
- %23masutaka は、適当な文字列に置き換えて下さい。
- は image ディレクトリに置いて下さい。
正直、ベタな修正になってしまったと思います。他にボタンを付けること
があれば、拡張性のある修正を考えます。
たつをさんのページを大いに参考にさせていただきました。
[[を] このブログに「twitter でつぶやく」ボタンをつけた](http://chalow.net/2009-07-28-5.html)
やろうと思ったきっかけは、たつをさんのこのつぶやきです。
{{< tweet user="yto" id="3283291871" >}}
**追記(2009-08-19):**
この記事を書いてから幾日も経っていませんが、さっそく「拡張性のある
修正」に置き換えました。上のパッチではなく {{< post "2009-08-19-1" >}} のパッチ
を参考にすることをオススメします。
--------------------------------------------------------------------------------
title: "VL ゴシックで行間が広い件と、↑↓←→が半角幅な件"
date: "2009-08-16"
--------------------------------------------------------------------------------
squeeze になってしばらくして、行間が広くなったことと、↑↓←→が半
角幅になったことがとても気になっていたので、ちょっと調べてみました。
結論から言うと、VL ゴシックが原因でした。20090422 のリリースまでは
上の2つの問題は起きていませんでしたが、20090612 のリリースから変わっ
たようです。
## 調べたこと
Windows で動くフォントビューア [Shampolyon](http://akiroom.com/freeware/recommend/shampolyon.html) を使って調べました。
Debian の下記フォントを C:\Windows\Fonts にコピーすれば、
Shampolyon で確認できます。
>/usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf
>/usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf
確かに半角幅しかありませんね。

20090422 にリリースされたフォントでは全角幅分あります。20090612 の
リリースから変わったようです。

## 対策したこと
ttf-vlgothic パッケージを 20090422 に戻せば良いのですが、squeeze に
は存在しません。lenny にはあります。
面倒なので /usr/share/fonts/truetype/vlgothic/*.ttf をリネームし、
20090422 の *.ttf をコピーするという暴挙を行いました。
しばらく暮らしてみましたが、広い行間に慣れてしまったようでw、どう
もしっくりきません。結局元に戻しました...。
ただ、↑↓←→が半角幅というのは困りますので、なんらかの手段で作者
に要望する予定です。
## 関連情報
[VLゴシックフォントファミリ](http://dicey.org/vlgothic/)
{{< post "2009-07-12-1" >}}
**追記(2009-08-27):**
20090710-1 のパッケージが 20090811-1 に更新されたら、この問題が解消
されました。よかったよかった。20090806 の以下の修正が該当するのでしょう。
>* VL-Gothic の文字幅を調整
> o 互換性を高めるために Unicode で文字幅が Ambigious なものの一部を全角幅に変更。
http://sourceforge.jp/projects/vlgothic/releases/43072/changelog
--------------------------------------------------------------------------------
title: "twittering-mode.el のハック"
date: "2009-08-08"
--------------------------------------------------------------------------------
**[2010.4.21 に取り込んで頂きました](http://github.com/hayamiz/twittering-mode/commit/7021ed5050fe183851483a70cd742242765f92a6)ので、以下の修正はもう不要です。**
大したハックではありませんが、以下の修正をしました。
## 修正内容
`t' でオフラインとオンラインをトグル出来るようにしました。デフォル
トの twittering-toggle-proxy() へのキーバインドを変更しています。接
続状態はミニバッファに表示されたアイコンで分かるようになっています。


`q' で twittering-mode を終了できるようにしました。
Emacs23 以降で twittering-update-lambda() と
twittering-jojo-mode() を実行すると、文字化けする件を修正しました。
{{< post "2009-08-01-1" >}} の件です。
## 反映方法
twittering-mode.el を置いたディレクトリに icons というディレクトリ
を作り、[plugged.xpm](image/plugged.xpm) と [unplugged.xpm](image/unplugged.xpm) を置いてください。これらの画像
は Navi2ch に付属するものです。
修正した twittering-mode.el へのパッチは以下になります。アイコンを
表示させるコードは Navi2ch から、ほぼそのまま流用させて頂きました。
```elisp
Index: twittering-mode.el
===================================================================
--- twittering-mode.el (revision 138)
+++ twittering-mode.el (working copy)
@@ -296,8 +296,9 @@
(define-key km "H" 'beginning-of-buffer)
(define-key km "i" 'twittering-icon-mode)
(define-key km "s" 'twittering-scroll-mode)
- (define-key km "t" 'twittering-toggle-proxy)
+ (define-key km "t" 'twittering-toggle-offline)
(define-key km "\C-c\C-p" 'twittering-toggle-proxy)
+ (define-key km "q" 'twittering-mode-exit)
nil))
(defvar twittering-mode-syntax-table nil "")
@@ -363,8 +364,102 @@
(set-syntax-table twittering-mode-syntax-table)
(run-hooks 'twittering-mode-hook)
(font-lock-mode -1)
- (twittering-start))
+ (twittering-start)
+ (twittering-offline-init-icons)
+ (twittering-set-mode-line-identification))
+(defvar twittering-mode-line-identification nil)
+
+(defmacro twittering-display-image-p ()
+ '(and (display-images-p)
+ (image-type-available-p 'xpm)))
+
+(defvar twittering-online-image nil)
+(defvar twittering-offline-image nil)
+
+(defvar twittering-online-indicator "[ON] ")
+(defvar twittering-offline-indicator "[--] ")
+(defvar twittering-modeline-online twittering-online-indicator)
+(defvar twittering-modeline-offline twittering-offline-indicator)
+(put 'twittering-modeline-online 'risky-local-variable t)
+(put 'twittering-modeline-offline 'risky-local-variable t)
+
+(defvar twittering-icon-directory
+ (expand-file-name "icons/"
+ (file-name-directory
+ (locate-library "twittering-mode")))
+ "* アイコンファイルが置かれたディレクトリ。nil ならアイコンを使わない。")
+
+;; folder icons. filename relative to twittering-icon-directory
+(defvar twittering-online-icon "plugged.xpm"
+ "*Icon file for online state.")
+(defvar twittering-offline-icon "unplugged.xpm"
+ "*Icon file for offline state.")
+
+(defun twittering-offline-init-icons ()
+ (let ((props (when (display-mouse-p)
+ (list 'local-map (purecopy (make-mode-line-mouse-map
+ 'mouse-2 #'twittering-toggle-offline))
+ 'help-echo "mouse-2 toggles offline mode"))))
+ (if (twittering-display-image-p)
+ (progn
+ (unless twittering-online-image
+ (let ((load-path (cons twittering-icon-directory load-path)))
+ (setq twittering-online-image (find-image
+ `((:type xpm
+ :file ,twittering-online-icon
+ :ascent center)))
+ twittering-offline-image (find-image
+ `((:type xpm
+ :file ,twittering-offline-icon
+ :ascent center))))))
+ (setq twittering-modeline-online
+ (apply 'propertize twittering-online-indicator
+ `(display ,twittering-online-image ,@props))
+ twittering-modeline-offline
+ (apply 'propertize twittering-offline-indicator
+ `(display ,twittering-offline-image ,@props))))
+ (when props
+ (setq twittering-modeline-online
+ (apply 'propertize twittering-online-indicator props)
+ twittering-modeline-offline
+ (apply 'propertize twittering-offline-indicator props))))))
+
+(defun twittering-set-mode-line-identification ()
+ (let ((offline
+ '(twittering-timer twittering-modeline-online twittering-modeline-offline)))
+ (unless twittering-mode-line-identification
+ (setq twittering-mode-line-identification
+ (default-value 'mode-line-buffer-identification)))
+ (setq mode-line-buffer-identification
+ (list offline
+ 'twittering-mode-line-identification)))
+ (force-mode-line-update t))
+
+(defun twittering-toggle-offline ()
+ "twittering-mode の接続をトグルする。"
+ (interactive)
+ (cond
+ (twittering-timer
+ (twittering-stop)
+ (message "Now offline"))
+ (t
+ (twittering-start)
+ (message "Now online")))
+ (twittering-set-mode-line-identification))
+
+(defun twittering-mode-exit ()
+ "twittering-mode を終了する。"
+ (interactive)
+ (when (y-or-n-p "Really exit twittering-mode? ")
+ (if twittering-timer
+ (twittering-stop))
+ (dolist (buf (list twittering-http-buffer
+ twittering-wget-buffer
+ twittering-buffer))
+ (if (get-buffer buf)
+ (kill-buffer buf)))))
+
;;;
;;; Basic HTTP functions
;;;
@@ -971,18 +1066,24 @@
(interactive)
(twittering-http-post
"statuses" "update"
- `(("status" . "\xd34b\xd22b\xd26f\xd224\xd224\xd268\xd34b")
+ `(("status" . ,(if (>= emacs-major-version 23)
+ "\x3bb\x304b\x308f\x3044\x3044\x3088\x3bb"
+ "\xd34b\xd22b\xd26f\xd224\xd224\xd268\xd34b"))
("source" . "twmode"))))
(defun twittering-update-jojo (usr msg)
- (if (string-match "\xde21\xd24b\\(\xd22a\xe0b0\\|\xdaae\xe6cd\\)\xd24f\xd0d6\\([^\xd0d7]+\\)\xd0d7\xd248\xdc40\xd226"
+ (if (string-match (if (>= emacs-major-version 23)
+ "\x6b21\x306b\\(\x304a\x524d\\|\x8cb4\x69d8\\)\x306f\x300c\\([^\x300d]+\\)\x300d\x3068\x8a00\x3046"
+ "\xde21\xd24b\\(\xd22a\xe0b0\\|\xdaae\xe6cd\\)\xd24f\xd0d6\\([^\xd0d7]+\\)\xd0d7\xd248\xdc40\xd226")
msg)
(twittering-http-post
"statuses" "update"
`(("status" . ,(concat
"@" usr " "
(match-string-no-properties 2 msg)
- "\xd0a1\xd24f\xd243!?"))
+ (if (>= emacs-major-version 23)
+ "\x3000\x306f\x3063!?"
+ "\xd0a1\xd24f\xd243!?")))
("source" . "twmode")))))
;;;
```
P.S.
"C-c C-s" で投稿する時は、ミニバッファ以外を使うようにしたいですねえ。
あと、作者さんにはどうやって連絡を取るのでしょうか。。。
**追記(2009-11-21):**
作者さんに連絡とれました。
Emacs23 以降で twittering-update-lambda() と
twittering-jojo-mode() を実行すると、文字化けする件は最新の Git
リポジトリでは修正されていました。他 2 つのパッチも取り込んでいただ
けそうな雰囲気です。
--------------------------------------------------------------------------------
title: "UIM のツールバーを消し、GNOME のパネルに UIM を表示させる方法"
date: "2009-08-08"
--------------------------------------------------------------------------------
UIM は GNOME のパネルに表示するようにしていて、UIM のツールバーは表
示させないようにしたんだけど、会社で Lenny をインストールした時に設
定方法を忘れて、いろいろ調べたのでメモメモ。
## GNOME パネルに UIM を表示させる
GNOME パネルに UIM を表示させるには、uim-applet-gnome パッケージが
必要。「パネルを右クリック→パネルへ追加→入力メソッド表示器を追加」
すると、GNOME パネルに UIM を表示出来る。
## UIM のツールバーを消す
im-switch を使うと、UIM のツールバーを消すことが出来る。
># 現在の設定確認
>% im-switch -l
>
># 設定変更
>% im-switch -c
Lenny では、"uim-toolbar" を "uim" に変更することでツールバーを消す
ことができた。
自宅の Squeeze は "default" と "default-xim" の 2 種類が存在する。
現在の設定は "default" でツールバーは表示されていない。
~/.xprofile で以下の設定をする必要がある。設定しないとかな漢字変換
が出来ない。
```
GTK_IM_MODULE=uim
export GTK_IM_MODULE
```
## UIM のボタンを極力減らす
表示される UIM のボタンを、「あ」だけにすることも出来る。
1. 設定→ツールバー→ボタン の選択をすべて外す。
2. 設定→Anthy→ツールバー→有効にするボタン から、「かな入力方式」
を無効にする。
--------------------------------------------------------------------------------
title: "本日の買い物"
date: "2009-08-01"
--------------------------------------------------------------------------------
今日は川崎のヨドバシでいろいろ買ってきました。
## SATA II ケーブル
{{< amazon_link asin="B001LQYCO2" title="SATAIIケーブル ストッパー付 片側Lコネクタ PSD30BK" >}}
{{< amazon_link asin="B001LQYCMY" title="SATAIIケーブル ストッパー付 片側Lコネクタ PSD30BL" >}}
{{< amazon_link asin="B001FQAD00" title="オウルテック シリアルATA2ケーブル30cmブラック OWL-CBSATA-SLU30(BK)" >}}
まずは SATA II ケーブル 3 本。これらは仕事で使います。先月、Samba
サーバ用に買った 2 台の内蔵 1TB HDD を接続するケーブルです。同じも
のが 3 つなかったので、色や種類が違う 3 本を買いました。1 本は予備
です。
↓先月買った内蔵 1TB HDD
{{< amazon asin="B002AK2GDM" title="WesternDigital WD10EADS-M2B 500GBプラッタ×2 3.5インチ内蔵HDD 1TB キャッシュ32MB SeiralATA 3Gps" >}}
## 扇風機
{{< amazon asin="B0026FBHL8" title="YAMAZEN 30cmリビング扇風機(押しボタンスイッチ)タイマー付 YLT-C30(WA) ホワイトブルー" >}}
ずいぶん前に壊れたきり夏はエアコンだけで過ごしていました。扇風機と
エアコンのコンボはかなり涼しいので、ずっと買おうと思っていたのです。
一番シンプルで一番安いものを選びました。ヨドバシのポイントを使った
ら、お代は¥0でした。:^)
## ニンテンドーDSi + 液晶保護フィルム + ドラゴンクエストIX
{{< amazon asin="B002C1ARLC" title="ニンテンドーDSi レッド" >}}
{{< amazon asin="B00280MF8A" title="Rix DSi専用 液晶保護フィルム 上下画面用2枚セット 液晶クリーナー付き RX-DSIF640" >}}
{{< amazon asin="B000LXD7HO" title="ドラゴンクエストIX 星空の守り人" >}}
??? おかしいなあ。買うつもりじゃなかったのにw
実家に帰った時に、暇をつぶせそうです。
--------------------------------------------------------------------------------
title: "twittering-mode で「λかわいいよλ」が文字化けする件を調べた"
date: "2009-08-01"
--------------------------------------------------------------------------------
twittering-mode には、C-c C-l で「λかわいいよλ」と投稿できる、
よく分からない機能がある。たいてい間違って投稿されるのだと思う。w
まあ、OFF にすればいいんだけどね。
よく分からない機能ではあるけど、実際に使ってみるとハングルのような
文字が投稿されてしまう。前から気づいていたんだけど、急に思い立って
調べてみることにした。
## 調査内容
まず、Emacs23 で再現し、Emacs22 では再現しないことが分かった。
twittering-update-lambda() の
"\xd34b\xd22b\xd26f\xd224\xd224\xd268\xd34b" を評価すると、以下のよ
うに結果が異なる。
Emacs22

Emacs23

"λ" の上にカーソルを置いて、"C-u C-x =" で文字コードを調べたところ、
Emacs22 は #xd34b で、Emacs23 は #x3bb だった。
[mule-ja-2009:09607](http://www.m17n.org/mlarchive/mule-ja/200907/msg00018.html) で聞いてみたところ、Emacs23 では内部文字コードは
UNICODE になったとのこと。じゃあ Emacs22 はなんだろうと思ってググっ
てみたら、以下の変換式らしいと分かった。
>0xc000 + JIS上位バイト*128 + JIS下位バイト
http://www.dennougedougakkai-ndd.org/~delmonta/emacs/27.html
"λ" は JIS コードでは 0x264b、UNICODE(UTF-16) では 0x03bb 。
このことから、Emacs23 の内部文字コードが UNICODE である裏付けが取れた。
では "λ" の JIS コード 0x264b を、Emacs22 の変換式に当てはめてみようか。
>0xc000 + (0x26 * 0x80) + 0x4b = 0xd34b
前述の Emacs22 の変換式に間違いはなさそうだ。
さらに半田さんが [mule-ja-2009:09610](http://www.m17n.org/mlarchive/mule-ja/200907/msg00021.html) で Emacs22 の内部文字コードにつ
いて、正確な情報を提供してくれた。すごいなあ。
## まとめ
Emacs22 と Emacs23 の内部文字コードは異なる。"\xd34b" のような表記
をするときは、(>= emacs-major-version 23) 等で切り分ける必要があり
そう。twittering-update-jojo() も化けるので、修正する必要あり。
## おまけ
"C-u C-x =" で一文字ずつ内部文字コードを調べるのは非効率なので、ま
とめて変換できるコードを作りました。もっと良い方法はあると思います。
```elisp
(let ((str "λかわいいよλ")
(str2 "") code)
(with-temp-buffer
(insert str)
(goto-char (point-min))
(while (> (point-max) (point))
(setq code (char-after (point)))
(setq str2
(concat str2
(if (>= code 128)
(format "#x%x" code)
(buffer-substring-no-properties (point) (+ (point) 1)))))
(forward-char 1)))
str2)
```
Emacs23 では上記の場合、"#x3bb#x304b#x308f#x3044#x3044#x3088#x3bb"
が得られ、"#" を全て "\" に変換し評価すると、"λかわいいよλ" にな
るはず。最初から "\x3bb" といった出力は出来ないのかなあ。
--------------------------------------------------------------------------------
title: "Emacs-23.1 のビルドとインストール"
date: "2009-07-31"
--------------------------------------------------------------------------------
Emacs 23.1 released
http://lists.gnu.org/archive/html/emacs-devel/2009-07/msg01526.html
もう飽きるほどやっている Emacs のビルドとインストールだが、23.1 リ
リース記念に記録を残すことにした。
1. tar ball の展開。展開されて出来た emacs-23.1/INSTALL も確認すること。
>% tar xjf emacs-23.1.tar.bz2
2. ビルド用ワークディレクトリの作成と、チェンジディレクトリ。
>% mkdir work; cd work
3. configure 実行。xim は使わないので、OFF にした。
tee 使っているのはログを残すため。私はソースからのビルドする時には、
このように必ずログを残すようにしている。
>% ../emacs-23.1/configure --without-xim 2>&1 | tee ../emacs-23.1_configure.log
>% cp config.log ../emacs-23.1_config.log
このようなログが出力されれば成功。
```
Where should the build process find the source code? /home/masutaka/share/src/emacs/emacs-23.1
What operating system and machine description files should Emacs use?
`s/gnu-linux.h' and `m/intel386.h'
What compiler should emacs be built with? gcc -g -O2 -Wno-pointer-sign
Should Emacs use the GNU version of malloc? yes
(Using Doug Lea's new malloc from the GNU C Library.)
Should Emacs use a relocating allocator for buffers? yes
Should Emacs use mmap(2) for buffer allocation? no
What window system should Emacs use? x11
What toolkit should Emacs use? GTK
Where do we find X Windows header files? Standard dirs
Where do we find X Windows libraries? Standard dirs
Does Emacs use -lXaw3d? no
Does Emacs use -lXpm? yes
Does Emacs use -ljpeg? yes
Does Emacs use -ltiff? yes
Does Emacs use a gif library? yes -lgif
Does Emacs use -lpng? yes
Does Emacs use -lrsvg-2? yes
Does Emacs use -lgpm? yes
Does Emacs use -ldbus? yes
Does Emacs use -lfreetype? yes
Does Emacs use -lm17n-flt? yes
Does Emacs use -lotf? yes
Does Emacs use -lxft? yes
Does Emacs use toolkit scroll bars? yes
```
4. ビルド。
>% make 2>&1 | tee ../emacs-23.1_make.log
5. ビルドが正常終了したら、起動確認。
>% src/emacs -q
オーケー。インストールしようか。
6. ここからは root 権限での作業。まずは timestamp というファイルを touch 。
># touch timestamp
7. make install 実行。*.el が gzip されないようにオマジナイもする。
># make GZIP_PROG="" install 2>&1 | tee ../emacs-23.1_make-install.log
8. インストールしたファイルをログに残す。
なぜかインストールしてないファイルもログに残るので、手作業で削除...。
># find /usr/local -cnewer timestamp | sort >> ../emacs-23.1.log
9. なぜか group が masutaka のままになっているものがあるので、chown 実行。
># chown -R root:staff /usr/local/share/emacs
deb パッケージ管理は不勉強のため、分かりません。Debian を使い始めて
から、ソースからビルドすることが少なくなったので、今後も知らないま
までいそう。。。
--------------------------------------------------------------------------------
title: "ソースの検証"
date: "2009-07-31"
--------------------------------------------------------------------------------
Emacs-23.1 がリリースされた。せっかくなのでソースが改竄されていないか、検証をしっかりやってみた。
Emacs 23.1 released
http://lists.gnu.org/archive/html/emacs-devel/2009-07/msg01526.html
上記によると、MD5 check-sums は以下のとおり。
```
17f7f0ba68a0432d58fa69d05a2225be emacs-23.1.tar.bz2
```
ふむ。合ってる。改竄はされていないだろう。
```
% md5sum emacs-23.1.tar.bz2
17f7f0ba68a0432d58fa69d05a2225be emacs-23.1.tar.bz2
```
しかし、MD5 が 100% 信用できるわけではないので、emacs-23.1.tar.bz2 と同じ場所にある emacs-23.1.tar.bz2.sig を使って、さらに確かめる。
```
% gpg --verify emacs-23.1.tar.bz2.sig emacs-23.1.tar.bz2
gpg: 2009年07月30日 10時18分53秒 JSTにDSA鍵ID BC40251Cで施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません
```
まあ、ID BC40251C の公開鍵は持ってないよね。公開鍵を取得しようか。
```
% gpg --keyserver pgp.nic.ad.jp --recv-keys BC40251C
gpg: 鍵BC40251Cをhkpからサーバーpgp.nic.ad.jpに要求
gpg: 鍵BC40251C: 公開鍵“Chong Yidong ”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg: 読込み: 1
```
再度検証。警告はされたが、正しい署名であることは確認できた。終了。
```
% gpg --verify emacs-23.1.tar.bz2.sig emacs-23.1.tar.bz2
gpg: 2009年07月30日 10時18分53秒 JSTにDSA鍵ID BC40251Cで施された署名
gpg: “Chong Yidong ”からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: AF1A 0574 841E 0F2D EDE2 829A 764D A716 BC40 251C
```
ちなみに警告をなくす方法は以下のとおり。
```
% gpg --edit-key BC40251C
(略)
コマンド> trust
(略)
あなたの決定は? 5
本当にこの鍵を絶対的に信用しますか? (y/N) y
(略)
コマンド> q
```
ただし信用度は、公開鍵の正当性を確認してから変更すべき。gpg のメッセージによると、「パスポートを見せてもらったり、他から得た指紋を検査したり、などなど」によって、正当性を確認できるとのこと。
改めて検証。警告がなくなった。
```
% gpg --verify emacs-23.1.tar.bz2.sig emacs-23.1.tar.bz2
gpg: 2009年07月30日 10時18分53秒 JSTにDSA鍵ID BC40251Cで施された署名
gpg: “Chong Yidong ”からの正しい署名
```
**参考にしたページ**
http://www.hyuki.com/gnu/gnupg-v12-readme.html#verify
http://www.usamimi.info/~pochi/linux/gnupg.html
**追記(2009-08-16):**
署名と検証するファイルが一致しない場合は、以下のようなメッセージが出力される。
```
% gpg --verify emacs-23.1.tar.bz2.sig emacs-22.3.tar.gz
gpg: 2009年07月30日 10時18分53秒 JSTにDSA鍵ID BC40251Cで施された署名
gpg: “Chong Yidong ”からの 不正な 署名
```
--------------------------------------------------------------------------------
title: "lsof"
date: "2009-07-27"
--------------------------------------------------------------------------------
{{< wikipedia "Lsof" >}}
オープン中のファイルと、そのファイルをオープンしているプロセスの
リストを出力するコマンド。
似たツールに netstat がある。
{{< wikipedia "netstat" >}}
このコマンドは、全てのアクティブな TCP コネクションと、そのマシンが
listen している TCP ポートおよび UDP ポートを表示する。
"netstat -an" と使うことが多い。netstat は Windows でも使える。
--------------------------------------------------------------------------------
title: "パターンにマッチした行を削除"
date: "2009-07-27"
--------------------------------------------------------------------------------
何をいまさらという感じもするけど。^^;
空行を削除
>% sed -e '/^$/d' hoge.txt
hoge とだけ書かれた行を削除
>% sed -e '/^hoge$/d' hoge.txt
--------------------------------------------------------------------------------
title: "OpenOffice.org を使ってみた"
date: "2009-07-21"
--------------------------------------------------------------------------------
[OpenOffice.org 日本語プロジェクト](http://ja.openoffice.org/)
OpenOffice.org に含まれる、プレゼンテーション用のアプリ Impress を
ちょろっと使ってみた。なかなか使いやすい。もう自宅用に MS-Office を
買うことはないと思う。
ただ、デフォルトでテンプレートが 2 つしか含まれていないのは面倒だった。
[オープンオフィス 3 始める人のページ](http://openoffice-docj.sourceforge.jp/wiki/Documentation/start3)から辿ったページからダウンロードした。
## OpenOffice.org(おーぷんおふぃす・おるぐ)とは?
- オープンソースのオフィススウィート。
- Windows、UNIX 系 OS、Mac OS X で動作する。
- MS-Office と互換性がある。
- PDF 形式で保存することも出来る。
- 世界的なシェアは増加傾向だそう。最近では会津若松市が有名。
[会津若松市がOpenOffice.orgを全庁的に導入へ - スラッシュドット・ジャパン](http://slashdot.jp/it/article.pl?sid=08/05/28/2133239)
[OpenOffice.org導入の会津若松市が、ノウハウをまとめCCで公開 - スラッシュドット・ジャパン](http://slashdot.jp/it/article.pl?sid=09/07/18/1713231)
## MS-Office との関連付け
|機能名|オープンオフィスでの名前|マイクロソフトオフィスの対応ソフト
|---|---|---
|ワープロ|ライター (Writer)|ワード (Word)
|表計算|カルク (Calc)|エクセル (Excel)
|プレゼンテーション|インプレス (Impress)|パワーポイント (PowerPoint)
|データベース |ベース (Base)|アクセス (Access)
|図形描画|ドロー (Draw)|-
--------------------------------------------------------------------------------
title: "2台のマシンでキーボードとマウスを共有する"
date: "2009-07-20"
--------------------------------------------------------------------------------
私は PC を 2 台持っていて、それぞれ以下の用途に使っている。
|用途|OS|形態
|---|---|---
|Windows マシン|WindowsXP|ノート PC
|Linux マシン|Debian GNU/Linux squeeze|デスクトップ PC
ノート PC の液晶はずいぶん前から壊れていて、画面の半分位を縦線が占
めるようになってしまった。そのため、ノート PC とデスクトップ PC は
同じ液晶モニタに接続し、前面のボタンで画面を切り替えて使っている。
キーボードとマウスはそれぞれの PC に繋がっているものを使っている。
## キーボードとマウスを共有させてみるか
synergy を使えばノート PC に繋げているマウスが必要なくなって、机の
上を少し広く使えるかも?と、ふと思ったので早速試してみた。
synergy とはネットワーク上の複数のマシンのキーボードとマウスを共有
できるアプリ。Linux、Windows、Mac OS X に対応している。
## 設置ポリシー
Linux マシンをサーバ、Windows マシンをクライアントとする。
## サーバの設定
1. Synaptic パッケージマネージャから、synergy をインストールした。
(Synaptic からインストールすると履歴が残るので、私は最近 aptitude
ではなく Synaptic を使うようにしている。)
2. ~/.synergy.conf を新規作成し、以下の設定をした。液晶モニタは1つし
かないが、左側に Windows マシン、右側に Linux マシンがあることにした。
```
# vergil -> SERVER PC (Linux)
# nero -> CLIENT PC (Windows)
section: screens
vergil:
nero:
end
section: links
vergil:
left = nero
nero:
right = vergil
end
```
3. synergys を実行した。
> % synergys --daemon
4. synergys 自動起動の設定をした。
「GNOME メインメニュー」→「システム」→「設定」→「自動起動するア
プリ」に synergys --daemon を追加し、ログイン時に自動起動するように
した。
## クライアントの設定
1. 下記サイトからダウンロードした日本語版のインストーラ
SynergyInstaller-1.3.1-ja.exe を使って、インストールした。
http://wiki.nothing.sh/page/memo/Synergy
[オフィシャルサイト](http://synergy2.sourceforge.net/)にあるものとの違いは、リソースが日本語されている
ことと、日本語キーボードがサポートされていること。
2. スタートメニューから synergy を実行し、サーバ名を入力した。
{{< figure src="/images/synergy1_s.png" link="/images/synergy1.png" target="_blank" rel="noopener" alt="画像" >}}
3. 自動実行の設定をした。
{{< figure src="/images/synergy2_s.png" link="/images/synergy2.png" target="_blank" rel="noopener" alt="画像" >}} {{< figure src="/images/synergy3_s.png" link="/images/synergy3.png" target="_blank" rel="noopener" alt="画像" >}}
Linux の画面上でマウスカーソルを左に持っていくと、Windows の画面の
右から現れようになった。
ただし、今回の環境ではモニタを切り替える必要があるので、リアルタイ
ムには確認できない。
## 感想
モニタを切り替える必要はあるが、キーボードとマウスを切り替える必要
がなくなったため、以前よりもスムーズに Linux と Windows を行き来で
きるようになった。
机の上が少し広くなった。
若干ではあるがキー操作がもたつくことがある。でも問題ないレベル。
vncviewer で、Linux から Windows を操作していると、やや混乱する。(笑)
## 参考にしたページ
[【コラム】Yet Another 仕事のツール (91) Synergyでキーボード、マウスを共有する - マイコミジャーナル](http://journal.mycom.co.jp/column/yetanother/091/index.html)
[1組のマウスとキーボードを複数のPCで共有するには - @IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/830usesynergy.html)
**追記(2009-07-23):**
~/.xprofile ではなく、GNOME の設定で synergys を自動起動するように
しました。
**追記(2009-07-30):**
日本語版のインストーラを使うように、クライアントの手順を変更しました。
--------------------------------------------------------------------------------
title: "テレビのリモコン"
date: "2009-07-20"
--------------------------------------------------------------------------------
いろんな使い道があるんだなあ。(違)
{{< youtube "Jd-9RHFlnTc" >}}
{{< youtube "OrGdpVexpVc" >}}
{{< youtube "bYEoZfc0fUo" >}}
元ネタ:
[テレビ埼玉のCMがマジでキチガイじみてる件 - アルファルファモザイク](http://alfalfa.livedoor.biz/archives/51490510.html)
--------------------------------------------------------------------------------
title: "キーロガー"
date: "2009-07-20"
--------------------------------------------------------------------------------
>F1 l (M-x view-lossage)
それまでに打鍵した最後の 300 個のコマンド文字を表示します。
--------------------------------------------------------------------------------
title: "@nifty の DNS サーバ "
date: "2009-07-18"
--------------------------------------------------------------------------------
@nifty の DNS サーバがおかしくなったときに、代わりに使った DNS サーバ。
>202.248.37.74
>202.248.20.133
ちなみに、今日の WAN 側の設定は以下であった。
|Key|Value
|---|---
|IPアドレス|211.2.102.77
|PPPサーバIP|218.231.1.55
|DNS1(プライマリ)|218.231.0.3 (自動取得)
|DNS2(セカンダリ)|218.231.0.35 (自動取得)
|MTU値|1454
**追記(2011-10-01):**
今だったら、[Google Public DNS](http://code.google.com/intl/ja/speed/public-dns/) を使えば良いね。
8.8.8.8 and 8.8.4.4
--------------------------------------------------------------------------------
title: "minibuf-isearch"
date: "2009-07-18"
--------------------------------------------------------------------------------
バージョンが古かったので最新にしようと思ったら、subversion リポジト
リが公開されていたことに気がついた。そこで、メンテナンスの手間を省
くために、site-lisp ディレクトリからシンボリックリンクを張ることにした。
1. まず、以下のコマンドで適当なディレクトリに checkout した。
```
% svn checkout http://svn.coderepos.org/share/lang/elisp/minibuf-isearch
```
2. /usr/local/share/emacs/site-lisp から、checkout した
minibuf-isearch ディレクトリにシンボリックリンクを張った。
## minibuf-isearch とは?
Emacs のデフォルトの動作では、C-x C-f でファイル名を入力する時など
に、M-p を打つと1つ前の履歴を取り出すことが出来る。
minibuf-isearch を使うと、M-p の代わりに C-r することで履歴をインク
リメンタルに検索することが出来る。bash や zsh のそれと同じ。
## 設定例
参考までに私の設定は以下のとおり。
```elisp
(require 'minibuf-isearch)
;; メッセージがミニバッファの右端に表示される。
(setq minibuf-isearch-message-on-right t)
```
## 関連サイト
[minibuf-isearch オフィシャルサイト](http://www.sodan.org/~knagano/emacs/minibuf-isearch/)
[横着プログラミング 第3回: 履歴マニア](http://0xcc.net/unimag/3/)
**追記(2011-11-27):**
Emacs23 では minibuf-isearch 相当の機能が入っているので、
この elisp は不要になりました。
--------------------------------------------------------------------------------
title: "QuickRestart"
date: "2009-07-18"
--------------------------------------------------------------------------------
[QuickRestart - Firefox Addons](https://addons.mozilla.org/ja/firefox/addon/quickrestart/)
「ファイル」メニューに「Firefoxを再起動する」を追加するだけのアドオン。
シンプルで素晴らしい。再起動時にタブの状態は保持される。
--------------------------------------------------------------------------------
title: "Emacs講座 -第9回- C コーディングスタイル"
date: "2009-07-16"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} 第9回
## cc-mode
Emacs では cc-mode というパッケージが C 系言語のコーディングスタイルを統括しています。cc-mode はパッケージ名で、個々のメジャーモード名は c-mode や c++-mode です。
cc-mode がサポートする言語を cc-mode.el から抜粋しておきます。
>CC Mode supports K&R and ANSI C, ANSI C++, Objective-C, Java,
>CORBA's IDL, Pike and AWK with a consistent indentation model
>across all modes.
## 設定例
前述の言語の中で私が使うのは C 言語だけで、以下の設定をしていました。
```elisp
(add-hook 'c-mode-common-hook
(lambda ()
(c-set-style "bsd") ;;; (a)
(setq c-basic-offset 4) ;;; (b)
;; 演算式が複数行にまたがるときのオフセット
(c-set-offset 'statement-cont 'c-lineup-math) ;;; (c)
;; 行末のスペースやタブに色づけして警告する。
(setq show-trailing-whitespace t))) ;;; (d)
```
c-mode-common-hook は C と C++ 両方に影響する hook です。C だけに設定したい場合は c-mode-hook を、C++ だけに設定したい場合は c++-mode-hook を使います。
インデントは以下の手順で設定します。
1. 近いスタイルを選ぶ。
2. 気にいらないインデント部分を見つける。
3. Ctl-c Ctrl-s でインデントに効いてくる変数を見つける。
4. その変数の値をc-set-offset関数で変える。
`1` が (a) です。加えて (b) も設定しています。私の場合は bsd スタイルが一番しっくり来ました。bsd 以外の他のスタイルは M-x c-set-style し、TAB キーを押すと確認できます。
`2` は私の場合、以下のようなインデントでした。
```
ret = a +
b +
c;
```
このようにしたかったのです。
```
ret = a +
b +
c;
```
`3` の見つけ方です。
まず "b +" の行で `Ctrl-c Ctrl-s` します。すると `*Messages*` バッファに以下のように表示されました。
```text
Syntactic analysis: ((statement-cont 107))
```
この行のインデントは statement-cont によって設定されていることが分かりました。
statement-cont とは何でしょうか。
cc-mode では c-basic-offset と c-offsets-alist がインデントに関係してきます。この c-offsets-alist を構成する値が statement-cont です。c-offsets-alist の値を確認してみると以下のように設定されていました。
```text
(statement-cont . +)
```
`4` の方法です。が、ここで一点注意。
c-basic-offset は (b) のように setq() で設定すれば良いのですが、c-offsets-alist は直接 setq() でいじってはいけません。c-set-offset() で修正します。
(statement-cont . +) に相当する設定は以下になります。
```elisp
(c-set-offset 'statement-cont '+)
```
`'+` は c-basic-offset の値です。`'++` にすると 2 倍になるそうです。
しかし、今回は意図した設定になりませんでした。どうやらこの設定を調べていた当時、2ch で質問して c-lineup-math にしたようです。チャンチャン。
[Emacs part8 の 891 レス目 - 2ch](http://www.bookshelf.jp/2ch/unix/1051455239.html#891)
(d) はコメントのとおり、不必要なスペースやタブに色付けして警告する設定です。ソースによっては警告されまくりで、真っ赤になったりするのであまりオススメはしません。
第9回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} 第9回
--------------------------------------------------------------------------------
title: "dwww"
date: "2009-07-12"
--------------------------------------------------------------------------------
dwww パッケージをインストールすると
**[GNOME メニュー]→[アクセサリ]→[Debian Documentation Browser]**
または
**Synaptic メニューの [パッケージ]→[ドキュメントを参照]**
からインストール済みの全オンライン文書を、ローカルの HTTP サーバで
参照することが出来る。(文書は英語。)
※ Synaptic は [GNOME メニュー]→[システム]→[システム管理]→
[Synaptic パッケージマネージャ] から起動できる。
--------------------------------------------------------------------------------
title: "Software Sources"
date: "2009-07-12"
--------------------------------------------------------------------------------
**[GNOME メニュー]→[システム]→[システム管理]→[Software Sources]**
インストールまたはアップデートできる APT パッケージの場所についての
情報は /etc/apt/sources.list に書かれている。
今までは場所の追加や削除をするときはテキストエディタで修正していた
が、"Software Sources" という GUI ツールがあるのを今日知った。今後
はこちらを使うことにしようかな。
--------------------------------------------------------------------------------
title: "xpdf-japanese"
date: "2009-07-12"
--------------------------------------------------------------------------------
文字化けする pdf ファイルがあったんだけど、xpdf-japanese をインストー
ルしたら文字化けが直った。
```
# aptitude install xpdf-japanese
```
xpdf-japanese の他に、cmap-adobe-japan1 ttf-kochi-gothic
ttf-kochi-mincho が自動的にインストールされた。
--------------------------------------------------------------------------------
title: "ディレクトリ→ファイルの順に並べる"
date: "2009-07-12"
--------------------------------------------------------------------------------
Dired の表示を Windows のように「ディレクトリ→ファイル」の順にする方法。
```elisp
(add-hook 'dired-load-hook
(lambda ()
(require 'ls-lisp)
(setq ls-lisp-use-insert-directory-program nil)
(setq ls-lisp-dirs-first t)))
```
ls コマンドの代わりに elisp でディレクトリを表示することになるので、
表示は遅いかもしれない。まあ参考程度で。
--------------------------------------------------------------------------------
title: "行間を広くする"
date: "2009-07-12"
--------------------------------------------------------------------------------
VL ゴシックの行間が広いので狭くする方法を調べていたら、広くする方法
が見つかった。w
```elisp
(setq line-spacing 0.1)
```
小数値を設定すると行の高さに対して相対値で設定され、整数値を設定す
るとピクセル数で設定されるらしい。
設定すると即座にカレントバッファに反映されるので、Emacs を 2 つ起動
してちょうど良い値を設定すると良いと思う。
VL ゴシックの行間を狭める方法は継続して調査中。フォントを変更する以
外ない気がしているので、他のフォントに変えることも検討している。
参考にしたページ:
[Emacsのとりあえず最低限の環境を整える - ubulog](http://ubulog.blogspot.com/2007/09/emacs_22.html)
--------------------------------------------------------------------------------
title: "テカテカでない液晶モニタを買いました"
date: "2009-07-11"
--------------------------------------------------------------------------------
去年の8月に DELL Inspiron 530s と一緒に買った光沢液晶 [SP2208WFP](http://www1.jp.dell.com/jp/ja/home/peripherals/monitor_sp2208wfp/pd.aspx?refid=monitor_sp2208wfp&cs=jpdhs1&s=dhs) を使い始めてから、目がやけに疲れるようになりました。視力も落ちたと思います。
最近特に耐えられなくなってきたので、今日ヨドバシで三菱のノングレア液晶モニタを買いました。店頭価格は ¥31,070 でしたが、溜まっていたポイントを使ったら ¥25,199 になりました。
{{< amazon asin="B001IEKX18" title="三菱電機 22W型三菱液晶ディスプレイ RDT223WM" >}}
購入する時にこだわったこと、こだわらなかったことです。
- 絶対にグレア液晶は買いません
- サイズは今と同じ 22 インチワイドです
- 色味にこだわりはありません。テキストが見やすいものを買います
- スピーカーが付属したものを買います。ただし音にこだわりはありません
- 入力デバイスの切り替えがスムーズにできるものを買います
やっぱり、ノングレア液晶はいいですねえ。良い買い物をしました。
以下は購入してから分かったことです。
- 高さは、3個付属するプラスチックのブロックを付けたり外したりして調節します。微妙な調節はできませんが、特に不満はありませんでした
- 画面の角度は、ある程度自由に変えられます
- 安定感は少しなくなりますが、底のスタンドの後部を外すと、作業スペースを広く保てます
- 一体型スピーカーは ≫ ボタンで音量調整できます。スピーカーの音は、やはりショボかったです
- メニューから、スタンダード、テキスト、ムービー等の映像モードを選べます。もちろん、自分で微調整もできます。メニューに入らずに ≪ ボタンからのショートカットも用意されています
- INPUT/EXIT ボタンを 1 回押すだけで、次の入力デバイスに変更出来ます
SP2208WFP に比べ、良くなったこと、悪くなったことです。
**良くなったこと:**
- 照明器具や太陽の光が映り込まなくなりました
- 自分の姿が映り込まなくなりました
- テキストが見やすくなりました
- 画面を暗くしても、テキストが見づらくならなくなりました
- 入力デバイスを変更するために押すボタンの回数が減りました。今までは 4 回くらい押す必要がありましたが、今は 1 回で済みます。INPUT/EXIT ボタンを押した時に、使っていない入力デバイスをスキップ出来る点は気が利いています
**悪くなったこと:**
- 結構簡単に本体が揺れます。底のスタンド後部を外したため?
- 音がショボくなりました
- スピーカーの音量調節がやりづらくなりました。前はダイヤル式で簡単でした
- INPUT/EXIT ボタンで、現在の入力デバイスから、次の入力デバイスに切り替えている間は、音が消えます
- 使っていませんでしたが、カメラと USB ハブがなくなりました
今回の件で、メールや Web サイトを見るような PC の液晶モニタを、光沢タイプにしてはいけないことがよく分かりました。はぁ〜。
**関連記事:**
- {{< post "2008-10-05-2" >}} テカテカ液晶対策
- {{< post "2009-02-21-2" >}} Emacs23 のフォント
--------------------------------------------------------------------------------
title: "Emacs講座 -第8回- タブ幅"
date: "2009-07-10"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} 第8回 {{< post id="2009-07-16-1" title="第9回" >}}
## 3つの変数
Emacs のタブ幅には、3つの変数が関係しています。
### tab-width
タブコードを半角スペースいくつ分で表示するかを制御する変数です。各バッファ毎に設定できます。デフォルトは 8 です。
### default-tab-width
tab-width のデフォルト値です。全てのバッファに影響する変数です。デフォルトは 8 です。
### tab-stop-list
TAB キーを押した時に、カーソルが移動するカラムの位置です。デフォルトは (8 16 24 32 40 48 56 64 72 80 88 96 104 112 120) です。
例えばタブ幅を 4 に変更したい場合は以下のようなコードを ~/.emacs に記述します。
```elisp
(setq-default tab-width 4)
(setq default-tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60
64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))
```
## 関数化してみよう
tab-stop-list の設定が少し煩雑ですよね。以前は手計算で tab-stop-list の中身を作っていたのですが、見事に計算間違いした経験があります。そんな自分が嫌になったので、関数化しました。
「下記設定」と「前述の設定をタブ 8 に変えたもの」は同じ意味です。
```elisp
(defun set-aurora-tab-width (num &optional local redraw)
"タブ幅をセットします。タブ5とかタブ20も設定できたりします。
localが non-nilの場合は、カレントバッファでのみ有効になります。
redrawが non-nilの場合は、Windowを再描画します。"
(interactive "nTab Width: ")
(when local
(make-local-variable 'tab-width)
(make-local-variable 'tab-stop-list))
(setq tab-width num)
(setq tab-stop-list ())
(while (<= num 256)
(setq tab-stop-list `(,@tab-stop-list ,num))
(setq num (+ num tab-width)))
(when redraw (redraw-display)) tab-width)
(set-aurora-tab-width (setq default-tab-width (setq-default tab-width 8)))
```
## 動的なタブ幅の切り替え
開いたテキストが自分のタブ幅と異なるため、インデントがずれた経験はありませんか?
キー操作で動的に切り替えられるように、私は以下の設定をしています。結構おすすめです。(ctl-q-map については、{{< post id="2009-07-02-2" title="第5回" >}}を参照してください。)
```elisp
(define-key ctl-q-map (kbd "2") (lambda () (interactive) (set-aurora-tab-width 2 t t)))
(define-key ctl-q-map (kbd "4") (lambda () (interactive) (set-aurora-tab-width 4 t t)))
(define-key ctl-q-map (kbd "8") (lambda () (interactive) (set-aurora-tab-width 8 t t)))
```
例えば `Ctrl-q 4` すると、カレントバッファのタブ幅が 4 になります。他のバッファには影響を与えません。
## ファイル単位でのタブ幅の切り替え
ファイルの先頭に以下を書いておくと、Emacs はそのファイルをタブ 4 で開きます。
```text
-*- tab-width: 4 -*-
```
ファイルの最後に書くことも出来ます。
```text
Local Variables:
tab-width: 4
End:
```
tab-width に特化された実装になっているわけではありません。このような記述をすると、ファイル毎に変数値を設定できるのです。
英語ですが、Info にも詳しい説明が書いてあります。
1. M-x info [Enter]
2. 以下の行で Enter
* `* Emacs: (emacs). The extensible self-documenting text editor.`
3. g を押したあと、Specifying File Variables [Enter]
## 関連する関数
タブに関連する関数をご紹介します。それぞれ M-x で呼び出せます。
* tabify
* リージョン内の連続する空白をタブに変換します。変数 tab-width がこの動きを制御します。
* untabify
* リージョン内のタブを複数のスペースに変換します。変数 tab-width がこの動きを制御します。
第8回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} 第8回 {{< post id="2009-07-16-1" title="第9回" >}}
--------------------------------------------------------------------------------
title: "スロトレ"
date: "2009-07-10"
--------------------------------------------------------------------------------
{{< post "2008-12-12-2" >}} に買った「{{< amazon_link asin="4767805139" title="一生太らない体のつくり方" >}}」。
付録のスロトレの動画を見つけた。これは参考になるわ。
メタボ侍「スロトレ」に挑戦!石井直方教授に聞く
{{< youtube_link id="mTcUSIiW8fM" title="1/5 ウォームアップ" >}}
{{< youtube_link id="geVlJeqJVs0" title="2/5 ニートゥチェスト" >}}
{{< youtube_link id="mJ2E_uuU2gw" title="3/5 スクワット" >}}
{{< youtube_link id="qlL2-INB0Ig" title="4/5 プッシュアップ" >}}
{{< youtube_link id="oUE7kH07lLg" title="5/5 アームレッグクロスレイズ" >}}
付録のプッシュアップは台の上に手をついてやっていたんだけど、この動
画では台は使っていない。必要ってわけじゃないのか。ちょうどよい台が
なかったから助かる。
**追記(2009-07-13):**
この動画だとストレッチをやっていないけれど、ストレッチは非常に大事
らしいので、実際はストレッチを間にはさんでください。本当にやるんだっ
たら、本を買った方が良いと思いますけど。
--------------------------------------------------------------------------------
title: "swf から音声を抜き出す方法"
date: "2009-07-10"
--------------------------------------------------------------------------------
swftools をインストールする。
```
# aptitude install swftools
```
swfextract コマンドに -m を付けると、音声を output.mp3 に出力する。
```
% swfextract -m hoge.swf
```
-o を付けると、ファイル名を指定できる。
```
% swfextract -mo hoge.mp3 hoge.swf
```
[[linux]swfから音声を抜き出す方法 - (rubikitch loves (Emacs Ruby CUI))](http://d.hatena.ne.jp/rubikitch/20090710/1247163201)
--------------------------------------------------------------------------------
title: "水平スクロール"
date: "2009-07-10"
--------------------------------------------------------------------------------
間違って実行することがあって地味に困るので、メモしておく。
"C-x <" or "M-x scroll-left"
カレントウィンドウのテキストを左にスクロールする。
"C-x >" or "M-x scroll-right"
右にスクロールする。
以下の設定をしておくと、ポイントがウィンドウの右端からはみ出した時
に自動で横方向にスクロールする。
```elisp
(setq truncate-lines t)
```
--------------------------------------------------------------------------------
title: "Emacs講座 -第7回- 文字コード"
date: "2009-07-09"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} 第7回 {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
さあ、文字コードです。
## 文字コードの設定
いきなり矛盾しますが、最近の Emacs(例:23.3) では文字コードの設定は不要です。
Emacs はデフォルトの状態でも、文字コードを自動判別してファイルを開くことが出来ます。新規作成ファイルの文字コードも locale の設定によって自動決定されます。
もしあなたの ~/.emacs に下の設定が書いてあったら削除しましょう。もはや廃れた設定です。
```elisp
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(setq-default buffer-file-coding-system 'utf-8)
```
参考情報: [mule-ja-2009:09813](http://www.m17n.org/mlarchive/mule-ja/201106/msg00005.html)
## Mac OS X における文字コードの設定
Mac ではファイルシステムに HFS+ を使っているため、濁点や半濁点の扱いが Windows と Linux と異なるそうです。これを回避するため、以下の設定が必要とのこと。Emacs-23.2 以上で設定可能です。
```elisp
(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)
(setq locale-coding-system 'utf-8-hfs)
```
参考情報: [紹介マニアどらふと版: Mac OS X におけるファイル名に関するメモ(NFC, NFD等)](http://www.sakito.com/2010/05/mac-os-x-normalization.html)
## 文字コード関連の便利機能
* `Ctrl-x Ctrl-m c <文字コード> [Enter] Ctrl-x Ctrl-v [Enter]`
* 文字コードを指定し直して、現在開いているファイルを開き直す方法です。結構重宝します。`<文字コード>` は TAB で補完出来ます。
* `Ctrl-x Ctrl-m f <文字コード> [Enter]`
* 現在開いているファイルの文字コードを変更する方法です。たくさんのファイルを変換する場合は nkf なんかを使うのでしょう。
第7回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} 第7回 {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
**追記(2011-02-08):**
文字コードの設定は set-language-environment() と prefer-coding-system() だけで良いようですので、他を削除しました。
**追記(2011-08-06):**
set-language-environment() と prefer-coding-system() さえも必要ないことがわかったので、全体的に書き換えました。
--------------------------------------------------------------------------------
title: "Emacs講座 -第6回- load-path"
date: "2009-07-05"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} 第6回 {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
本項は、ネット上から *.el をダウンロードして、いろいろ試したくなってきたあたりで読むと良いと思います。load-path の仕組みを理解しましょう。
## load-path とは何か?
UNIX や Windows 等に存在する「環境変数 PATH」の Emacs 版です。
例えば ls を実行すると、「環境変数 PATH」に登録された最初のディレクトリから ls が検索され、最初にヒットした ls が使われますよね?
また、どのディレクトリにも ls が存在しなければ、
```shell-session
command not found: ls
```
などといったエラーが発生します。
Emacs では例えば ~/.emacs に以下のようなコードを書くと load-path が参照されます。
```elisp
(require 'hoge)
```
load-path は Emacs Lisp の変数です。どんな値が入っているのかは{{< post id="2009-06-28-1" title="第3回" >}}の方法で調べられます。
load-path には複数のディレクトリが登録されているはずです。
まず先頭のディレクトリについて、以下の順で検査が行われます。{{< post id="2009-06-27-1" title="第2回" >}}の .emacs と同じですね。
1. hoge.elc が存在するか?
2. hoge.el が存在するか?
3. hoge が存在するか?
1, 2, 3 のどれにも当てはまらなければ、次のディレクトリが検査されます。
全てのディレクトリで当てはまらなければ、以下のエラーが発生します。
```shell-session
Cannot open load file: hoge
```
## load-path を構成するディレクトリ
デフォルトの設定では、以下の順番に構成されているはずです。
1. `/share/emacs//site-lisp` 以下全てのディレクトリ
2. `/share/emacs/site-lisp` 以下全てのディレクトリ
3. `/share/emacs//lisp` 以下全てのディレクトリ
Emacs-22.3 を /usr/local 以下にインストールした場合は、このようになります。
1. `/usr/local/share/emacs/22.3/site-lisp` 以下全てのディレクトリ
2. `/usr/local/share/emacs/site-lisp` 以下全てのディレクトリ
3. `/usr/local/share/emacs/22.3/lisp` 以下全てのディレクトリ
1 は当該バージョンの Emacs だけに参照させたい *.el を置くディレクトリです。デフォルトでは subdirs.el というファイルだけが置かれています。(subdirs.el は後で説明するので、覚えておいて下さい。)
2 は全てのバージョンの Emacs から参照させたい *.el を置くディレクトリです。ここにも、デフォルトでは subdirs.el というファイルだけが置かれています。
3 は当該バージョンの Emacs に付属する、全ての *.el が置かれているディレクトリです。
## load-path が構築される仕組み
`/share/emacs/site-lisp` 以下に適当な名前のディレクトリを作って、Emacs を再起動してみて下さい。追加したディレクトリが load-path に追加されていますよね。なぜでしょう?
Emacs は起動時に以下の 3 つの subdirs.el を評価します。
1. `/share/emacs//site-lisp/subdirs.el`
2. `/share/emacs/site-lisp/subdirs.el`
3. `/share/emacs//lisp/subdirs.el`
1 と 2 の subdirs.el の内容は同じで、以下のように記載されているはずです。
```elisp
(if (fboundp 'normal-top-level-add-subdirs-to-load-path)
(normal-top-level-add-subdirs-to-load-path))
```
この Emacs Lisp 式の意味は「normal-top-level-add-subdirs-to-load-path という関数が存在すれば、normal-top-level-add-subdirs-to-load-path を実行する」になります。
normal-top-level-add-subdirs-to-load-path() はディレクトリを再帰的に探索し、見つかったディレクトリを load-path に追加する関数です。ただし、以下のディレクトリは load-path に追加しません。
- "." で始まるディレクトリ
- "RCS" "CVS" "rcs" "cvs" という名前のディレクトリ
- ".nosearch" というファイルが存在するディレクトリ
3 の subdirs.el には Emacs-22.3 の場合、以下のように記載されているはずです。
```elisp
(normal-top-level-add-to-load-path
'("url" "textmodes" "progmodes" "play" "obsolete" "net" "mh-e" "mail" "language"
"international" "gnus" "eshell" "erc" "emulation" "emacs-lisp" "calendar" "calc"))
```
まあ、だいたい意味は分かりますよね。(説明するのが面倒になってきました..。^^;)
## load-path にユーザ指定のディレクトリを追加する方法
root 権限を持っていない等の理由から、前述の site-lisp 以下に *.el をコピーできない場合もあるでしょう。その場合は、load-path にディレクトリを追加します。
例えば、"~/share/elisp" を追加したい場合は以下を ~/.emacs に設定して下さい。
```elisp
(add-to-list 'load-path "~/share/elisp")
```
この例では load-path の先頭に "~/share/elisp" が追加されます。
## ユーザ指定のディレクトリ以下全てを load-path に追加する方法
上の方法だと、~/share/elisp 以下にディレクトリを追加するたびに add-to-list() を追加する必要があり、少々面倒です。そこで前述の normal-top-level-add-subdirs-to-load-path を利用します。
先にコードを晒します。
```elisp
(defconst my-elisp-directory "~/share/elisp" "The directory for my elisp file.")
(dolist (dir (let ((dir (expand-file-name my-elisp-directory)))
(list dir (format "%s%d" dir emacs-major-version))))
(when (and (stringp dir) (file-directory-p dir))
(let ((default-directory dir))
(add-to-list 'load-path default-directory)
(normal-top-level-add-subdirs-to-load-path))))
```
このコードを ~/.emacs に設定すると、load-path の先頭に以下の順番で追加されます。
1. `~/share/elisp` 以下全てのディレクトリ
2. `~/share/elisp` 以下全てのディレクトリ
使用している Emacs のバージョンが 22.3 の場合、`` は 22 になります。変数 my-elisp-directory は適宜変更して下さい。
## require 以外の *.el 読み込み方法
require は、ファイル中に (provide 'hoge) などと書かれている *.el を読み込む関数です。そうすることで、require 済みかを以下の方法で判別できます。
```elisp
(if (featurep 'hoge)
...)
```
また、(require 'hoge) は何度実行しても、hoge.el は一度しか読み込まれません。
require と似たものに load があります。featurep() による検査は行えません。load すると、安直に hoge.el が load されます。
```elisp
(load "hoge")
```
少し特殊なものに autoload があります。この式が評価された時点では hoge.el は読み込まれません。hogehoge という関数が実行された直後に hoge.el が読み込まれ、その後 hogehoge() が実行されます。
```elisp
(autoload 'hogehoge "hoge" nil t)
```
他、load-file という関数もあります。M-x load-file を実行し、読み込みたいファイルを指定すると、そのファイルが load されます。つまり、load-path とは直接関係ありません。
## 関連する関数
load-path に関連する関数をご紹介します。それぞれ M-x で呼び出せます。
* locate-library
* 指定した *.el の場所をフルパスで出力する。
* list-load-path-shadows
* *.el の名前が同じであるため、load されない *.el を表示する。
第6回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} 第6回 {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
--------------------------------------------------------------------------------
title: "Twitter の便利情報"
date: "2009-07-05"
--------------------------------------------------------------------------------
[私のTwitterスタイル - 304 Not Modified](http://maname.txt-nifty.com/blog/2008/10/twitterlife.html)
◎[buzztter](http://buzztter.com/)
今 Twitter のタイムラインで頻出しているキーワードを教えてくれるサービス。
◎[ふぁぼったー](http://favotter.matope.com/)
Twitter にあるお気に入りの可視化サービス。自分の発言が誰にどのくら
いふぁぼられているのかが分かる。→ [マスタカのふぁぼられ](http://favotter.matope.com/user.php?user=masutaka)
Twitter には、まだまだ私の知らない使い道がありそう。
--------------------------------------------------------------------------------
title: "move-file-to-trash"
date: "2009-07-05"
--------------------------------------------------------------------------------
Emacs23 から使えるようになった関数。Dired からも使えるようにすると便利かもしれない。
実行すると以下のプロンプトが現われ、ファイル名かディレクトリ名の入力を促される。
```
Move file to trash: ~/
```
指定したファイルやディレクトリは trash-directory に移動される。trash-directory の初期値は "~/.Trash"。
既に trash-directory に同名のファイルがあると、以下のようにリネームされるようだ。
```
hoge.txt
hoge.txt.~1~
```
--------------------------------------------------------------------------------
title: "Emacs講座 -第5回- キーバインドの変更"
date: "2009-07-02"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} 第5回 {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
Emacs では数多くの関数がキーに割り当てられています。その中には押しやすいものもあれば、押しづらいものもあります。また、全ての関数がキーに割り当てられているわけではないため、頻繁に使う関数なのに
>M-x hogehoge [Enter]
などと実行しなければならない場合もあります。
という状況ではありますが、Emacs のキーバインドはフルカスタマイズ可能です。カスタマイズするしかないでしょう。:-)
## ポリシー
私は以下のことを念頭に置いて、キーバインドを変更しています。
- デフォルトのキーバインドは、極力変更しない。
- 連打することがあるコマンドは1ストローク(例: `Ctrl-t`)。
- 連打する必要が少ない、もしくはやや危険なコマンドは2ストローク(例: `Ctrl-q Ctrl-h`)。
- 2ストロークにする時は、全て `Ctrl-q Ctrl-h` のような `Ctrl` を介したものにする。例えば `Ctrl-q h` だと、`Ctrl` キーを一旦ニュートラルにする必要があるので、`Ctrl-q Ctrl-h` より確実に遅い。
- カーソルキーやファンクションキーは遠いので、極力使わない。
## 知っておくべきこと
例えば、`Ctrl-n` というキーを押すと next-line という関数が呼ばれます。`Ctrl-f` は forward-char です。ただの `a` というキーにも self-insert-command という関数が割り当てられています。
このように、全てのキーに関数が割り当てられています。
では、どうやって調べたらよいでしょうか?これを調べるヘルプコマンドが、以下になります。ミニバッファに関数名が表示されます。
>F1 c 調べたいキー操作
`F1 c` 自体も、もちろん関数呼び出しとなっています。上の方法で調べると、describe-key-briefly という関数だと分かります。
逆に、ある関数がどのキーに割り当てられているのかは、`F1 w` で分かります。
以上を知っていれば、現在のキーバインドがどのように設定されているか分かるはずです。
よく使うヘルプコマンド一覧を記載しておきますね。`F1 Ctrl-h` すると、一覧から以下のヘルプを選択することも出来ます。
|キー|関数名|説明
|---|---|---
|`F1 c`|describe-key-briefly|指定したキーに対応する関数名を、ミニバッファに表示
|`F1 k`|describe-key|指定したキーに対応する、関数のヘルプを表示
|`F1 f`|describe-function|指定した関数のヘルプを表示
|`F1 w`|where-is|指定した関数に対応する、全てのキーを表示
|`F1 b`|describe-bindings|現在のバッファのキーバインド一覧を出力
|`F1 m`|describe-mode|現在のバッファのメジャーモードとマイナーモードの説明を出力
|`F1 a`|apropos|キーワードにマッチする関数と変数を検索
|`F1 i`|info|Infoを閲覧
## 基本となる設定方法
### global-map
一例として。`Ctrl-z` すると、M-x shell を実行できるようにしてみます。
デフォルトで `Ctrl-z` に割り当てられている関数は、iconify-or-deiconify-frame です。フレームが最小化されます。これを置き換えます。
設定内容はこちらになります。~/.emacs に記載します。
```elisp
(define-key global-map (kbd "C-z") 'shell)
```
`define-key` が関数名です。後ろの `global-map`, `(kbd "C-z")`, `'shell` は `define-key` への引数になります。
`global-map` というのは全てのバッファに影響するキーマップです。
`(kbd "C-z")` は `Ctrl-z` というキーのことだと思って下さい。他に `(kbd "C-x C-p")`, `(kbd "M-p")`, `(kbd "C-M-p")`, `(kbd "C-,")`, `(kbd "")`, `(kbd "")` などが使えます。`(kbd "ほげ")` の ほげ の部分は、`F1 c` した後、調べたいキーを押すと分かります。
`'shell` は関数名です。`'` (シングルクォート) を忘れないで下さい。
### global-map 以外のキーマップ
有名なところでは、esc-map と ctl-x-map があります。global-map と同じく、全てのバッファに影響するキーマップです。
以下は設定の一例です。`M-j` や `Esc-j` すると、goto-line を実行します。
```elisp
(define-key esc-map (kbd "j") 'goto-line)
```
後述しますが、キーマップを自作することも出来ます。
他にも c-mode-base-map や dired-mode-map、isearch-mode-map などがあります。apropos で調べられます。
>Ctrl-u F1 a -map$ [Enter]
Emacs の Info や、elisp のソースを確認するのも良いと思います。
## キーマップを自作する
デフォルトのキーバインドをできるだけ変更しないで、自分好みの設定をしようとするとあることに気づくはずです。
*「どのキーも埋まっているじゃん。。。」*
使わなそうなキーなら良いのですが、実は使えるキーで、後で後悔するかもしれません。
ここで、`Ctrl-なんとか` というキーを一つずつ調べてみました。結果、`Ctrl-q` の使用頻度が少ないことに気がつきました。
`Ctrl-q` には quoted-insert という関数が割り当てられています。コントロールコード(ASCII コードの Ctrl-l や Ctrl-i 等)を挿入できます。
そこで、ctrl-q-map を作ってみることにしました。
そうすると、`Ctrl-q Ctrl-アルファベット` や `Ctrl-q 記号` などを自由に使えるようになります。quoted-insert は `Ctrl-q Ctrl-q` に追いやることにします。
前置きが長くなりましたが、設定内容を下記に記載します。「your-favorite-funca〜your-favorite-funcz」はもちろん、割り当てたい関数名にしてください。
```elisp
(defvar ctl-q-map (make-keymap)) ;;; (★a)
(define-key global-map (kbd "C-q") ctl-q-map) ;;; (★b)
(define-key ctl-q-map (kbd "C-a") 'your-favorite-funca)
(define-key ctl-q-map (kbd "C-b") 'your-favorite-funcb)
.
.
(define-key ctl-q-map (kbd "C-q") 'quoted-insert)
.
.
(define-key ctl-q-map (kbd "C-z") 'your-favorite-funcz)
;;; (★a) ctrl-q-map という変数を新たに定義しました。
;;; 新規作成したキーマップを代入しています。
;;;
;;; (★b) ctrl-q-map を Ctrl-q に割り当てています。
```
かなり自由に設定できるようになりましたね!
## 引数を指定したキーバインドの設定
「{{< post id="2009-06-30-2" title="-第4回- カーソル移動" >}}」の「スクロールアップ、スクロールダウン」の `Ctrl-u 1 Ctrl-v` のような操作をキーに割り当てることもできます。
一例として1行スクロールアップする機能(`Ctrl-u 1 Ctrl-v` に相当)を `Ctrl-;` に割り当てることにします。
### 方法1
(1) 1行スクロールアップする関数 scroll-up1 を新規作成します。
```elisp
(defun scroll-up1 ()
(interactive)
(scroll-up 1))
```
(2) scroll-up1 を `Ctrl-;` に割り当てます。
```elisp
(define-key global-map (kbd "C-;") 'scroll-up1)
```
### 方法2
1行スクロールアップする無名関数を作って、直接 `Ctrl-;` に割り当てます。
```elisp
(define-key global-map (kbd "C-;") (lambda () (interactive) (scroll-up 1)))
```
## 参考資料
今回は少しだけ「emacs 雑記」を参考にさせて頂きました。[keybind のページ](http://homepage1.nifty.com/blankspace/emacs/keybind.html)ですね。
英語ですが、Info にも詳しい説明が書いてあります。
1. M-x info [Enter]
2. 以下の行で Enter
* `* Emacs: (emacs). The extensible self-documenting text editor.`
3. g を押したあと、Key Bindings [Enter]
最新の Info って誰か翻訳していないのかなあ。手元にあるのは 20.6 の日本語マニュアル...。
第5回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} 第5回 {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
--------------------------------------------------------------------------------
title: "セキュアコーディング"
date: "2009-07-02"
--------------------------------------------------------------------------------
[セキュアコーディング - JPCERT コーディネーションセンター](http://www.jpcert.or.jp/securecoding.html)
ここに無料セミナーの案内が掲示されています。
>「[C/C++ セキュアコーディング ハーフデイキャンプのご案内](http://www.jpcert.or.jp/event/half-day_Camp-seminar.html)」
>- Part 1. 7月16日(木) 13:00-18:00 「文字列、整数」
>- Part 2. 8月 7日(金) 13:00-18:00 「ファイル入出力」
>- Part 3. 9月10日(木) 13:00-18:00 「動的メモリ管理、書式指定文字列」
昨年度の資料をダウンロードできます。
http://www.jpcert.or.jp/research/materials.html
セキュアコーディングのドキュメントもダウンロードできます。
http://www.jpcert.or.jp/sc-rules/
まだ読んでないけど、無料とはすごい!!
--------------------------------------------------------------------------------
title: "Firefox3.5リリース!!"
date: "2009-07-01"
--------------------------------------------------------------------------------
Firefox3.5 がリリースされたようですね。
ツイッターでやけに話題が多いなあと思ったら、そういうことだったか。
私はサイドメニューに付けた Discover Shiretoko で知りました。^^; {{< post "2009-06-24-1" >}}
ただし、もう少し様子見します。少なくとも Tab Mix Plus は
まだ対応していないようなので。
[Mozilla Japan - 次世代ブラウザ Firefox とメールソフト Thunderbird の公式サイト](http://mozilla.jp/)
--------------------------------------------------------------------------------
title: "Emacs講座 -第4回- カーソル移動"
date: "2009-06-30"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} 第4回 {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
高速なカーソル移動は、エディタを使う上で重要なポイントになります。上下左右以外の移動手段を無意識に使えるようになることが、高速化のコツだと思います。
※[「emacs 雑記」の motion](http://homepage1.nifty.com/blankspace/emacs/motion.html) に触発されて書いてみましたが、かなりパクリになってしまいました。:pray:
## 上下左右
それぞれ、`Ctrl-p`, `Ctrl-n`, `Ctrl-b`, `Ctrl-f` に割り当てられています。
十字キーでも移動できますが、こちらの方がホームポジションからの距離が短いので効率が良いはずです。
以下のように前置き引数を付けると、「何文字だけ移動」とか「何行だけ移動」とか出来ます。
|キー|説明
|---|---
|`Ctrl-u Ctrl-f`|4 文字右に移動
|`Ctrl-u Ctrl-u Ctrl-n`|16 行下に移動
|`Ctrl-u 7 Ctrl-b`|7 文字左に移動
## 前の単語、次の単語
それぞれ、`Meta-b`, `Meta-f` に割り当てられています。
英文だと正確に単語単位で移動しますが、日本語だと単語の区切りがおおざっぱです。ただ、通常の左右移動の高速版と考えると、かなり使えます。
私はそれぞれ、`Ctrl-,` と `Ctrl-.` に割り当て直しました。
## 行頭、行末
行頭は `Ctrl-a` と `Home` に、行末は `Ctrl-e` と `End` に割り当てられています。どちらもかかせません。
## スクロールアップ、スクロールダウン
スクロールアップは `Ctrl-v` と `PageDown` に、スクロールダウンは `Meta-v` と `PageUp` に割り当てられています。
一行だけスクロールしたい場合は、`Ctrl-u 1 Ctrl-v` や `Ctrl-u 1 Meta-v` のように前置き引数を付けます。もしくは、以下相当のものをキーに割り当てます。
```elisp
(scroll-up 1)
(scroll-down 1)
```
私はそれぞれ `Ctrl-;` (一行スクロールアップ) と `Ctrl-:` (一行スクロールダウン) に割り当てました。
## ウィンドウの上、中央、下
ウィンドウの中央には `Meta-r` すると、移動できます。
前置き引数を付けると、ウィンドウの上や下にも移動できます。それぞれ、`Ctrl-u 0 Meta-r` と `Ctrl-u -1 Meta-r` です。もしくは、以下相当のものをキーに割り当てます。
```elisp
(move-to-window-line 0)
(move-to-window-line -1)
```
私はそれぞれ、`Ctrl-q Ctrl-p` (上)、`Ctrl-q Ctrl-l` (中央)、`Ctrl-q Ctrl-n` (下) に割り当てました。
## バッファの先頭、終端
それぞれ、`Meta-<`, `Meta->` に 割り当てられています。
実行するとマークセットしてしまうので、私は、以下相当のものをキーに割り当て直しました。
```elisp
(goto-char (point-min))
(goto-char (point-max))
```
## 検索
Emacs の検索はインクリメンタルサーチなので、移動手段としても重宝します。
`Ctrl-s` で前方検索、`Ctrl-r` で後方検索が出来ます。それぞれ `Ctrl-u` を付けて実行すると、正規表現検索が出来ます。
検索中に `Meta-e` すると、非インクリメンタルな検索が出来ます。
## Migemo 検索
:link: [Migemo: ローマ字のまま日本語をインクリメンタル検索](http://0xcc.net/migemo/)
ローマ字のまま日本語をインクリメンタル検索するためのツールです。変換なしで日本語を検索出来るため、高速な移動手段となり得ます。
## 現在行の空白でない最初の文字まで移動
`Meta-m` に割り当てられています。
これは、行頭の空白を飛ばして最初に文字がくる部分に飛ぶ、というコマンドです。
あらゆるプログラムではインデントして字下げをしますが、字下げされたところに行きたいときに使用します。かなり必須です。
## 行番号を指定した移動
キーには割り当てられていません。M-x goto-line を実行します。
目的の行番号が分かっている時は、この方法で移動します。
## 対括弧移動
対になっている括弧の一方から他方に飛ぶ移動です。
"(" や "{" から、")" や "}" への移動は `Ctrl-Meta-n` 、その逆は `Ctrl-Meta-p` です。文字列中の括弧を無視してくれる優れものです。
私はそれぞれ、`Ctrl-q Ctrl-f` と `Ctrl-q Ctrl-b` に割り当て直しました。
## マークセットした場所に移動
`Ctrl-x Ctrl-x` すると、`Ctrl-space` 等でマークセットした場所にカーソルを飛ばすことが出来ます。もう一度 `Ctrl-x Ctrl-x` すると、元の場所に戻ります。
カーソル移動からは脱線しますが、M-x transient-mark-mode すると、リージョンに色が付きます。さらに Emacs22 の場合は `Ctrl-space` を 2 回打つと、このモードになります。
## 前の関数、次の関数 (C or C++)
標準では用意されていないようですが、個人的に関数を自作し、`Ctrl-c Ctrl-[`, `Ctrl-c Ctrl-]` に割り当てました。いつか紹介できるかもしれません。
## grep 関連
キーには割り当てられていません。M-x grep を実行します。
ヒットした候補は、`` Ctrl-x ` `` で順番にジャンプできます。もちろん、`*grep*` バッファ上で `Enter` してもジャンプできます。Emacs22 以降であれば、`n` や `p` で次の候補を別ウィンドウに開けます。
似た機能に以下のものがあります。
|関数|説明
|---|---
|M-x occur|現在のバッファを検索します。
|M-x grep-find|find と grep を使って検索します。
## タグジャンプ
ある程度の規模のソース群を探索する場合に便利です。キー操作は以下のとおりです。
|キー|関数|説明
|---|---|---
|`Meta-.`|M-x find-tag|シンボルの定義部分に飛ぶ。
|`Meta-*`|M-x pop-tag-mark|前の状態に飛ぶ。
|なし|M-x tags-search|シンボルを検索させる。
|`Meta-,`|M-x tags-loop-continue|次の候補に飛ぶ。(検索状態で実行)
|`Ctrl-x 4 .`|M-x find-tag-other-window|定義部分を別ウィンドウに表示。
|`Ctrl-x 5 .`|M-x find-tag-other-frame|定義部分を別フレームに表示。
|`Meta-TAB`|M-x complete-symbol|シンボル名の補完(TAGS を読み込んだ状態で)
|なし|M-x visit-tags-table|タブテーブルを読み込み直す。
第4回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} 第4回 {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
--------------------------------------------------------------------------------
title: "「Linux 標準教科書」と「Linux サーバー構築標準教科書」"
date: "2009-06-30"
--------------------------------------------------------------------------------
- [Linux標準教科書Wiki](http://www.lpi.or.jp/linuxtext/wiki/)
- [Linuxサーバー構築標準教科書 Wiki](http://www.lpi.or.jp/linuxtext/server/)
アンケートに答えると、それぞれ pdf ファイルを無料でダウンロードできる。
かなりボリュームがあるが、体系的な知識の習得に良さそう。
--------------------------------------------------------------------------------
title: "Meadow の背景色を半透明にする"
date: "2009-06-29"
--------------------------------------------------------------------------------
世界を股にかける某氏から質問されたので、調べてみた。
Meadow は default-frame-alist に alpha の設定をするだけで、フレーム
を簡単に半透明に出来るようだ。試した Meadow のバージョンは 3.00-dev (菊)。
```elisp
(setq default-frame-alist
'((alpha . (nil 70 50 30))
...
))
```
この例の (nil 70 50 30) は、前から順番に
- 通常のフレーム
- アクティブでないフレーム
- 移動中のフレーム
- サイズ変更中のフレーム
の透明度を示すとのこと。
nil は通常の状態。0 がより透明に近く、100 がより通常に近い。
参考情報: [26.1.7 背景色を半透明にする - Meadow/Emacs memo](http://www.bookshelf.jp/soft/meadow_26.html#SEC314)
--------------------------------------------------------------------------------
title: "Emacs が開ける最大ファイルサイズ"
date: "2009-06-29"
--------------------------------------------------------------------------------
以下のように `*scratch*` バッファなどで調べることができるようだ。
Emacs22 は 256MB だった。
```elisp
(let ((i 1024))
(while (> i 0)
(setq i (* i 2)))
(1- i))
268435455
(1+ 268435455)
-268435456
(/ 268435456.0 1024 1024)
256.0
```
Emacs21 は 128MB だった。昔なつかしい nemacs は 8MB だった。
参考情報:
[EmacsFileSizeLimit - emacswiki](http://www.emacswiki.org/emacs/EmacsFileSizeLimit)
{{< post "2010-06-19-2" >}}
**追記(2010-03-13):**
Emacs23 は 512MB に上がっていました。
--------------------------------------------------------------------------------
title: "Emacs講座 -第3回- *scratch* バッファ"
date: "2009-06-28"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} 第3回 {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
本項は、いろいろな設定を .emacs にコピペし始めたあたりで読むと良いと思います。コピペ房から脱却しましょう。
.emacs で多い設定の一つに
```elisp
(setq message-log-max 256)
```
などといった setq 文があると思います。上記例では、message-log-max という変数に 256 という値を代入しています。(message-log-max は、`*Messages*` バッファに保存される最大行数を格納する変数です。)
では設定しないと、message-log-max にはどのような値が入っているのでしょう? `*scratch*` バッファを使うと簡単に調べられます。
message-log-max を `*scratch*` バッファにコピペし、message-log-max の後ろで `Ctrl-j` してみてください。前述の設定をしないと 100 が、設定をすると 256 が出力されると思います。
```elisp
message-log-max
;; =>100
```
※ 変数のヘルプからも、現在の値を確認できます。
>F1 v message-log-max [Enter]
実は上の方法は単に変数の値を調べているのではなく、変数を**評価**しています。
もっと正確に言うと、message-log-max というシンボルを評価しています。評価の結果(戻り値)が 100 というわけです。シンボルは S 式の最小単位です。S 式が分からなければ、単に「式」と読み替えていただいて構いません。
さて、もっとも典型的な S 式は前述のような `(setq message-log-max 256)` です。これも `*scratch*` バッファで評価できます。
```elisp
(setq message-log-max 256)
;; =>256
```
評価すると、変数 message-log-max には 256 が代入されます。Emacs Lisp では S 式は必ず値を返すので、256 が出力されます。
では、なぜ `*scratch*` バッファでは、このようなことが出来ると思いますか?
それは `*scratch*` バッファのメジャーモードが lisp-interaction-mode だからです。これは Emacs Lisp を対話的に実行できるモードです。モードラインに以下のように表示されてもいると思います。

メジャーモードというのは、各バッファに1つだけ設定でき、且つ必ず設定されているモードです。各バッファのメジャーモードは、変数 major-mode を評価すると分かります。
もうひとつ。emacs-version という変数があります。Emacs のバージョンが文字列として格納されています。
```elisp
emacs-version
;; =>"23.1.50.1"
```
実は emacs-version という**関数**もあります。関数は以下のように評価します。
```elisp
(emacs-version)
;; =>"GNU Emacs 23.1.50.1 (i686-pc-linux-gnu, GTK+ Version 2.16.1)
;; of 2009-06-26 on vergil"
```
まとめ。
- かっこがない時は変数を評価している。
- かっこがある時は関数を評価している。
以上を知っていれば、.emacs に設定を追加した後 Emacs を再起動することが少なくなるはずです。気軽に色々設定してみましょう!!
そうそう、`*scratch*` バッファでは簡単な計算も出来ます。`+` や `*` という関数を使います。
```elisp
(+ 1 2) ;;; 1 + 2
;; =>3
(* (+ 1 2) 5) ;;; (1 + 2) * 5
;; =>15
```
最後に `*scratch*` バッファ以外で評価する方法もご紹介します。
方法1
`Meta-:` した後、ミニバッファに評価したい S 式を書き、Enter する。
方法2
評価したい S 式の直後で `Ctrl-x Ctrl-e` する。評価結果がミニバッファに表示される。`Ctrl-u Ctrl-x Ctrl-e` すると、評価結果がカーソル下に挿入される。
方法3
`Ctrl-space` でマークセットし評価の先頭地点とする。次に、評価したい最終地点までカーソルを移動する。M-x eval-region すると、その範囲を評価できる。
第3回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} {{< post id="2009-06-27-1" title="第2回" >}} 第3回 {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
--------------------------------------------------------------------------------
title: "セゾンカード年会費無料の秘密"
date: "2009-06-27"
--------------------------------------------------------------------------------
{{< wikipedia word="クレディセゾン" text="wikipedia" >}} によると、セゾンカードが年会費無料なのは大きく 2 つの理由
かららしい。
その1 ポイントが永久不滅
これによりカードの稼働率が上がるそうで、損失を防ぐ効果があるらしい。
その2 他社と違って盗難保険の契約をしていない
カードが不正利用されたときは、セゾン自社の損害になるらしい。
これは少し心配だな。
--------------------------------------------------------------------------------
title: "ibuffer を試してみた"
date: "2009-06-27"
--------------------------------------------------------------------------------
{{< post "2009-06-07-4" >}} からの浮気。
buffer-menu に慣れていたせいか、別ウィンドウに表示される bs-show に
どうも馴染めない。ibuffer に浮気してしまおう。
```elisp
(define-key ctl-x-map (kbd "C-b") 'ibuffer)
```
ibuffer の良いところは、現在開いている全てのバッファに対して置換を
かけられるところ。
`m' で置換したいバッファにマークし、`Q' で問い合わせ置換、`U' で問
い合わせなし置換を実行。
`u' するとカーソル下のバッファのマークを消せる。`* *' で全てのマー
クを消せる。
`,' すると条件を切り替えながらソートしてくれる。その中の一つに
major-mode で並び替える `s m' があるが、これで並び替えると良さげ。
`?' でヘルプが表示される。
--------------------------------------------------------------------------------
title: "Emacs講座 -第2回- .emacs (どっと いーまっくす)"
date: "2009-06-27"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} 第2回 {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
何はなくとも、まずは .emacs (どっと いーまっくす) です。
Emacs は起動すると次の順番にユーザ設定ファイルを検索し、最初にヒットしたものを読み込みます。これがいわゆる .emacs (どっと いーまっくす) です。(最近の Emacs は ~/.emacs.d/init.el も使えます。)
1. ~/.emacs.elc
2. ~/.emacs.el
3. ~/.emacs
.emacs.elc は、.emacs.el や .emacs を以下のようにバイトコンパイルしたものです(他の方法もあります)。
```console
% emacs -Q -batch -f batch-byte-compile ~/.emacs
```
バイトコンパイルすると、起動時間や実行時間が少し短くなります。ただ、.emacs を修正した後にバイトコンパイルし忘れると、前述の読み込み順番のため、古い設定のまま Emacs が起動するという弊害もあります。
.emacs.el と .emacs は名前が違うだけです。
.emacs の他に site-start.el と default.el もあります。あまり意識することはないかもしれませんが、管理者が全ユーザに設定させたい内容を記載して使います。{{< post "2008-05-15-1" >}} もご覧下さい。
-q オプションはよく使います。こうすると ~/.emacs を読み込みません。
```console
% emacs -q
```
~/.emacs の代わりに別なファイルを読み込ませたい時は、このようにします。
```console
% emacs -q -l /hoge/huga.el
```
第2回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / {{< post id="2009-06-26-2" title="第1回" >}} 第2回 {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
--------------------------------------------------------------------------------
title: "Emacs講座 -第1回- Emacs と私"
date: "2009-06-26"
--------------------------------------------------------------------------------
{{< post id="2009-06-26-1" title="目次" >}} / 第1回 {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
GNU Emacs に初めて出会ったのは、入社した時に使った Nemacs でした。Solaris2.6 にインストールされていました。2000 年入社なので、使い始めてもう 10 年です。
ちょうど良い区切りなので、初心者から脱却したい人向けに、まとまった文章を書くことにしました。今回はそのイントロです。GNU Emacs は Emacs と略します。XEmacs の話はしない予定です。
さて、入社当時の話に戻ります。
最初は訳が分からなかったため、Nemacs はすぐに使わなくなりました。Windows に C ソースをコピーして秀丸で編集したり、rmail を使わずに Becky! を使ったりしていました。しかし、Windows がない環境で仕事をすることになったため、腹を決めて Emacs と付き合っていくことにしました。
その環境には運良く Mule がインストールされていました。私は C ソースを Mule で編集し、mh-e でメールを読み書きすることになりました。
そういえば、今も覚えていることがあります。当時はファイルを開くたびに Mule を起動していましたが、職場の上司は Dired でディレクトリを開いて、そこからファイルをいくつも開いていました。shell-mode も使っていたかもしれません。ああ、こういう使い方をするエディタなんだと思ったことを覚えています。
当時はいろんな人の ~/.emacs を読み漁りました。職場の人のものや、ネット上に転がっているものです。
ネット上で特に参考になったのは、[GANAWARE に置いてある .emacs](http://www.tsg.ne.jp/gana/D/NT/index.html) です。UNIX や Windows、Emacs の各バージョンの環境切り分け方法がきれいだったので、今もその名残りが私の ~/.emacs に残っています。ほかに [blankspace](http://homepage1.nifty.com/blankspace/emacs/emacs.html) も大変参考になりました。
そうこうしているうちに、Mule は過去のものだと知りました。当時の最新は Emacs-20.7 でそろそろ Emacs21.1 が出る頃だったと思います。
Mule は時々 X まわりの不具合に遭遇したため、1 年と使わずに Emacs-20.7 に移行しました。併せてメーラも mh-e から [Mew](http://www.mew.org/) に乗り換えました。Mew には今もお世話になっています。
ちなみに当時の開発環境は入社当時と異なり、オープンソースソフトウェアが日々バージョンアップされ、最新の技術に触れられる素晴らしい環境でした。
そのころから ~/.emacs は会社で用意された共通設定ファイルを使わずに、自分でスクラッチから書いたものを使うようになりました。スクラッチから書くために Emacs Lisp の知識が必要になったため、広瀬さんの本を購入し、多くを学ばせていただきました。
{{< amazon asin="4906391702" title="やさしいEmacs‐Lisp講座" >}}
Emacs とは関係ありませんが、広瀬さんは最近「{{< amazon_link asin="4774138649" title="zshの本" >}}」という本を出されたようです。私は zsh ユーザでもありますが、それについてはまたの機会で。
話を Emacs に戻しますと、その後 Emacs21 と Emacs22 のバージョンアップに追随しました。今は自宅の Emacs は CVS 先端の 23 を使っています。
2001 年頃から自宅で使い始めた [Meadow](http://www.meadowy.org/meadow/) の話もしましょう。
Meadow は Emacs の Windows 移植版です。Emacs を Windows でコンパイルした NTEmacs というものもありますが、NTEmacs に比べて IME まわりの親和性、フォントの設定、画像の取扱いが優れているそうです。ただ、NTEmacs は触ったことないです。
自宅 PC には Windows しかインストールしていなかったため、Meadow + Cygwin を使っていました。そういう意味で Meadow との付き合いも長いです。
Cygwin は Linux の Windows エミュレート環境ですが、エミュレートであるが故にハマル要素は多くありました。そのため、自宅 PC に RedHat Linux をインストールし、Meadow はあまり使わなくなりました。ただ、この 1〜2 年は会社の開発環境が Windows になったこともあり、またよく使うようになりました。
Emacs にはさまざまな派生物があり、私は最初混乱しました。
{{< wikipedia word="Emacs" text="Wikipedia の Emacs" >}} あたりが参考になるかもしれません。少し古いですが、Emacs の各バージョンは [History of Emacs and Mule](http://emacs-20.ki.nu/mule/history.shtml) や [Mule History Drawing](http://emacs-20.ki.nu/mule/history-drawing.shtml) としてまとめられています。
ネット上の情報が古かったのも、混乱させる要因の一つでした。そういう経験が、この「{{< tag "Emacs講座" >}}」を書くきっかけの一つになりました。
第1回終わり。
{{< post id="2009-06-26-1" title="目次" >}} / 第1回 {{< post id="2009-06-27-1" title="第2回" >}} {{< post id="2009-06-28-1" title="第3回" >}} {{< post id="2009-06-30-2" title="第4回" >}} {{< post id="2009-07-02-2" title="第5回" >}} {{< post id="2009-07-05-3" title="第6回" >}} {{< post id="2009-07-09-1" title="第7回" >}} {{< post id="2009-07-10-4" title="第8回" >}} {{< post id="2009-07-16-1" title="第9回" >}}
**追記(2011-10-03):**
「やさしいEmacs‐Lisp講座」は改訂版が出ましたよ!!
{{< amazon asin="4877832718" title="やさしいEmacs‐Lisp講座" >}}
--------------------------------------------------------------------------------
title: "Emacs講座 -目次-"
date: "2009-06-26"
--------------------------------------------------------------------------------
* {{< post id="2009-06-26-2" title="-第1回- Emacs と私" >}}
* {{< post id="2009-06-27-1" title="-第2回- .emacs (どっと いーまっくす)" >}}
* {{< post id="2009-06-28-1" title="-第3回- *scratch* バッファ" >}}
* {{< post id="2009-06-30-2" title="-第4回- カーソル移動" >}}
* {{< post id="2009-07-02-2" title="-第5回- キーバインドの変更" >}}
* {{< post id="2009-07-05-3" title="-第6回- load-path" >}}
* {{< post id="2009-07-09-1" title="-第7回- 文字コード" >}}
* {{< post id="2009-07-10-4" title="-第8回- タブ幅" >}}
* {{< post id="2009-07-16-1" title="-第9回- C コーディングスタイル" >}}
Emacs のバージョンは 23.3 を想定しています。22 以下は考慮しないことにします。
Emacs の全てを説明することは出来ないので、私の書きたい内容を書きたい順番で書いています。
以下は今後の予定。
-第10回- 私の .emacs (どっと いーまっくす)
-第11回- edebugger
-第12回- 次の関数、前の関数
--------------------------------------------------------------------------------
title: "みずほから他銀行への振込手数料が無料になっていた!!"
date: "2009-06-25"
--------------------------------------------------------------------------------
今日ネットバンキングで家賃を振り込んだら、なぜか手数料がかからなかった。
[みずほマイレージクラブ > うれしい特典 > 振込手数料割引・無料](http://www.mizuhobank.co.jp/mmc/tokuten/furikomi.html)
どうやら 6/1 から、みずほマイレージクラブにこのうれしい特典が加わったようだ。
**他銀行への振り込みが月 3 回まで無料**になった。私の場合では年間 ¥315 * 12 = ¥3,780 の手数料が必要なくなった。大した額ではないが、普通にうれしい。
みずほマイレージクラブの他の特典として、みずほ ATM やコンビニ ATM の時間外手数料無料というのがある。今までなんでかからないのかな〜と思っていたんだけど、そういうことだったのね。^^;
これらの特典を受けるためには、3 つの条件のうち 1 つを満たしていれば良い。ただ以下のとおり、そのうちの 1 つは条件が緩いので、満たすのは難しくないと思う。
[みずほマイレージクラブ > うれしい特典 > お取引条件](http://www.mizuhobank.co.jp/mmc/tokuten/jyouken.html)
> お取引条件1
> 各種預金[円預金(普通〔無利息型を除く〕・貯蓄・定期)、外貨預金(普通・定期)(注1)]、投資信託(注1)、金融債[財形金融債を除く]、公共債(注1)などの月末合計残高が10万円以上
年会費は必要ない。詳細は以下をどうぞ。
[みずほマイレージクラブ](http://www.mizuhobank.co.jp/mmc/)
--------------------------------------------------------------------------------
title: "ドラクエ風ステータスジェネレータ"
date: "2009-06-25"
--------------------------------------------------------------------------------
[ドラクエ風ステータスジェネレータをいくつか - たつをの ChangeLog](http://chalow.net/2009-06-24-1.html)
さっそくやってみた。
## [ドラクエ3 風 ステータス ジェネレーター](http://memory.jpn.org/dq/)

なぜ女!?良い点は「武器」「うんのよさ」くらいか。
無駄に高いレベルがもの悲しいです。

カタカナにしただけで、正統的な勇者になりました。(・∀・)
良い防具を持たせれば、すぐにでもゾーマを倒せるでしょう。
## [ドラクエ風ステータス](http://u-enterprise.com/dqstatus/)

釣りは好きではないのだけれど。(´・ω・`)
経験値がゼロで、レベルが35なのはすごい!!
ノートよりも、メモ帳が欲しかった。

また釣りバカかよ。。゜(゜´∀`゜)゜。。
今度はまるで取り柄がありません。オニオンシリーズだけが救いです。
--------------------------------------------------------------------------------
title: "Discover Shiretoko"
date: "2009-06-24"
--------------------------------------------------------------------------------
[Firefoxと知床がコラボしたキャンペーン「Discover Shiretoko」 - スラッシュドットジャパン](http://slashdot.jp/it/article.pl?sid=09/06/24/0434201)
そろそろ、Firefox3.5 が出るらしい。開発ネームが「Shiretoko」とのこ
とで、「[Discovert Shiretoko](http://www.discovershiretoko.org/ja/)」というキャンペーンを実施しているようだ。
自分のサイトにバナーを貼って、上記キャンペーンサイトへの誘導を行う
と、Web 上の自分の樹が成長するらしい。8 月 31 日までの期間限定のよ
うなので、さっそく左側のメニューバーに追加してみた。
知床と Firefox というミスマッチもさることながら、上のサイトで使われ
ている Web 技術も興味深い。HTML5 で追加されることになる Canvas とい
うグラフィック技術らしく、「JavaScriptを使って平面や立体図をブラウ
ザ上に描画でき、様々な画像効果や動画再生といったことをプラグインな
しで実現できること」とのこと。Firefox は v1.5 からサポートしている
ようだ。
[日本語チュートリアル](https://developer.mozilla.org/ja/Canvas_tutorial)も用意されていた。早い。moveTo とか lineTo とか
どこかで聞いたような名前が。。。
フォクすけ萌えのあなたに。→ [フォクすけの Firefox 情報局](http://foxkeh.jp/)
**追記(2009-06-26):**
ようやく 660 番に自分の樹を見つけた。本みたいなものはページ中央をダ
ブルクリックもしくはドラッグすると、次のページに行ける。ずーっと、
折り返しになっている部分をいじっていたんだけど出来なくて、数字を直
接入れて自分の樹を探していた。orz
**追記(2009-10-03):**
2009 年 9 月 18 日にキャンペーンが終了し「樹の成長」もストップした
そうなので、バナーを削除しました。
http://www.interforest.org/signup/
--------------------------------------------------------------------------------
title: "間違った解像度にしたら何も映らなくなった"
date: "2009-06-15"
--------------------------------------------------------------------------------
リフレッシュレートは高い方が目に優しいよなー、なんて思いながら解像
度をいじったら画面が真っ黒。Windows なら 30 秒後に復帰するから、
GNOME も同じだろうと思っていたら、ずっと真っ黒のまま。(ToT)
試行錯誤の末、以下のようにすれば復旧出来ることが分かった。
## 1. なんとかして root 権限で X にログインする。
一番安全なのは、「masutakaのログアウト」→「ユーザの切り替え」から
GDM の画面に戻り、root でログインする方法。ただ、私の環境では作業終
了後、masutaka に戻れない上、また真っ黒になってしまった。
次に安全なのは、「masutakaのログアウト」→「ログアウト」から GDM の
画面に戻り、root でログインする方法。
画面が真っ黒なので、いずれもキーボード操作だけでログアウトする必要
がある。私の場合は「Windows キー」で GNOME メインメニューを起動する
ようにしていたので、「Windows キー」→「↑キー×2」→「Alt-l(エル)」
でログアウト出来た。デフォルトの設定でも、Ctrl-Alt-Delete でログア
ウト出来るかもしれない。
これらでも出来なければ ssh でログインして、root で reboot コマンド
を実行...するしかないかなあ。
## 2. masutaka 権限で画面の解像度を設定する。
GNOME の場合、画面の解像度はユーザ毎に設定されているっぽい。そのた
め root でログインしたら、masutaka に su して画面の解像度を変更すれ
ば良い。
```
# xhost +
# su - masutaka
% export DISPLAY=:0.0
% gnome-display-properties
```
## 3. masutaka でログインすれば、無事復旧しているはず!!
--------------------------------------------------------------------------------
title: "Debian squeeze の subversion で http リポジトリにアクセスできなくなった"
date: "2009-06-15"
--------------------------------------------------------------------------------
一ヶ月くらい前から、Debian squeeze で svn が使えなくなってしまいま
した。
- svn diff の実行は出来る。
- file リポジトリへのアクセスも出来る。
- http リポジトリへのアクセスは、内部外部問わず出来ない。
という状況で地味に困っていましたが、~/.subversion/servers に以下を
追加することで解決できました。
>http-library = serf
今回お世話になったサイトです。
[svn(subversion)が突然使えなくなった at 半歩先](http://hanposaki.blog.so-net.ne.jp/2009-06-04)
犯人は Neon モジュールでした。WebDav へのアクセスモジュールを serf
に変えることで回避できました。
世の中にはスゴイ人もいるものですね。私なんか、strace コマンドのログ
から locale や gcov まわりのエラーなのかと思って調べていました...。
subversion はソースからインストールしたことがあるので、WebDav アク
セスに Neon が使われていたことは知っていましたが、気づくことができ
ませんでした。他に serf があることと、~/.subversion/servers で変更
が出来ることはもちろん知りませんでした。
```
% svn --version
(snip)
* ra_neon : Neon を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。
- 'http' スキームを操作します
- 'https' スキームを操作します
(snip)
* ra_serf : serf を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。
- 'http' スキームを操作します
- 'https' スキームを操作します
```
**追記(2009-07-21):**
Neon が直ったようなので、~/.subversion/servers から "http-library
= serf" を削除しました。
--------------------------------------------------------------------------------
title: "ElScreen のタブにニックネームを設定する"
date: "2009-06-14"
--------------------------------------------------------------------------------
{{< post "2009-06-14-2" >}} の補完。
通常、ElScreen のタブにはバッファ名が表示されますが、自分でニックネー
ムを付けることも出来ます。ニックネームを付けると、タブがすっきりキ
レイになります。
下記は、順番に navi2ch, skype.el 用の設定です。(require 'elscreen)
の後に書いて下さい。
```elisp
(defcustom elscreen-navi2ch-mode-to-nickname-alist
'(("^navi2ch-" . "Navi2ch"))
"*Alist composed of the pair of mode-name and corresponding screen-name."
:type '(alist :key-type string :value-type (choice string function))
:tag "Navi2ch major-mode to screen nickname alist"
:set (lambda (symbol value)
(custom-set-default symbol value)
(elscreen-rebuild-mode-to-nickname-alist))
:group 'navi2ch)
(elscreen-set-mode-to-nickname-alist 'elscreen-navi2ch-mode-to-nickname-alist)
(defcustom elscreen-skype-mode-to-nickname-alist
'(("^skype-" . "Skype"))
"*Alist composed of the pair of mode-name and corresponding screen-name."
:type '(alist :key-type string :value-type (choice string function))
:tag "Skype major-mode to screen nickname alist"
:set (lambda (symbol value)
(custom-set-default symbol value)
(elscreen-rebuild-mode-to-nickname-alist))
:group 'skype)
(elscreen-set-mode-to-nickname-alist 'elscreen-skype-mode-to-nickname-alist)
```
--------------------------------------------------------------------------------
title: "C-c C-c で mkchalow"
date: "2009-06-14"
--------------------------------------------------------------------------------
ChangeLog メモの chalow への変換とアップロードは、毎日 0:00 から
3 時間毎に行うように、自宅 PC の cron に登録しています。
登録しているのは mkchalow という自作のシェルスクリプトです。
手動でアップしたい時は、このコマンドをコマンドラインから実行します。
手動での実行が面倒になってきたので、mkchalow を実行する elisp の関
数を作りました。非同期で実行されるので、実行中も他の作業が出来ます。
```elisp
(defun mkchalow (force)
(interactive "P")
(let (pro
(pnm "mkchalow")
(buf " *mkchalow*")
(cnm "mkchalow")
(opts (if force '("-f"))))
(message (format "%sBuilding chalow for masutaka.net..."
(if force "Force " "")))
(setq pro (apply 'start-process pnm buf cnm opts))
(set-process-sentinel
pro
`(lambda (process string)
(message ,(format "%sBuilding chalow for masutaka.net...done"
(if force "Force " "")))
(kill-buffer ,buf)))))
(eval-after-load "clmemo"
;; C-c C-c で mkchalow
'(define-key clmemo-mode-map (kbd "C-c C-c") 'mkchalow))
```
※ [clmemo.el](http://pop-club.hp.infoseek.co.jp/emacs/changelog.html#clmemo) を使っていない方は、(eval-after-load "clmemo" 以降を
下記に置き換えて下さい。
```elisp
(eval-after-load "add-log"
;; C-c C-c で mkchalow
'(define-key change-log-mode-map (kbd "C-c C-c") 'mkchalow))
```
**追記(2009-06-14):**
Emacs 起動時にエラーになるので、訂正しました。シクシク...。
**追記(2010-05-03):**
mkchalow() を修正しました。C-u を付けるとメッセージが少し変わります。
--------------------------------------------------------------------------------
title: "ElScreen のススメ"
date: "2009-06-14"
--------------------------------------------------------------------------------
私は [ElScreen-Mew](/elisp.html#ElScreen-Mew) の作者なのに、このブログで ElScreen について一度
も言及していないことに気づきました。^^;
**ElScreen は Emacs で多くの作業をする人にお薦めです!**
私の場合は、ざっとこれだけありました。
- [Mew](http://www.mew.org/) でメール送受信する。
- [navi2ch](http://navi2ch.sourceforge.net/) で2ちゃんねるを見る。
- [mpg123.el](http://www.gentei.org/~yuuji/software/mpg123el/) で音楽を聴く。
- {{< post id="2009-06-07-5" title="twittering-mode.el" >}} で Twitter する。
- {{< post id="2009-06-14-1" title="skype.el" >}} でチャットする。
- [ChangeLog メモ](http://0xcc.net/unimag/1/)を書く(→[chalow](http://chalow.org/) でこのブログに変換)。
- 他、さまざまなテキストファイルを編集する。
もちろん、Emacs は個々の作業ごとに起動しません。全て1つの Emacs 上
で行います。
でも、さすがにこれだけいろんなことをやっていると、バッファを切り替
えるのが面倒です。一時期はフレームを立ち上げて(C-x 5 2)いましたが、
これも複数あると邪魔です。
ここで、Web ブラウザのウィンドウとタブを思い出して下さい。Emacs で
前者はフレームに相当します。しかし、後者はありません。Emacs でもタ
ブが使えたら便利だと思いませんか?
**そこで登場するのが ElScreen です!!**
ElScreen は Emacs にタブ機能を提供します。メニューバーからの
ElScreen->Create Screen または、"C-z C-c" で新しいタブを作れます。
もちろん、マウスでタブを選択することも出来ます。
キーバインドは GNU Screen ライクなので、GNU Screen ユーザはすんなり
使えると思います。ダウンロードやインストール方法等の詳細は
[ElScreen の Web site](http://www.morishima.net/~naoto/software/elscreen/) をご覧下さい。
Mew を使っている方は、[ElScreen-Mew](/elisp.html#ElScreen-Mew) もどうぞ。今は単に不具合を解消す
るためだけのツールですが、現在、メールの新規作成や返信、転送をする
時は "Create Screen" する機能を実装中です!
他に似たツールとして、[windows.el](http://www.gentei.org/~yuuji/software/) というものがあります。windows.el
にはタブ機能はありません。しかし、ウィンドウの分割状態をいくつも記
憶できるので、それが実質的なタブ機能となっています。また、レジュー
ム機能という大きな売りがあります。
ElScreen と windows.el、ご自分に合う方を使ってみて下さい。
--------------------------------------------------------------------------------
title: "skype.el を試してみた"
date: "2009-06-14"
--------------------------------------------------------------------------------
ひょんな(?)ことから、Skype の ID を取得してしまいました。
最初に Linux 版の Skype を使ってみましたが、日本語入力が出来ないた
め(※対策は後述)他のアプリからコピペする必要があり、非常に面倒でした。
やっぱり、Emacs で Skype できちゃったりするのかなあと思って、調べて
みたら skype.el というのがありました。(相変わらず、Emacs で何でもで
きちゃうのね。^^;) うまく動いたので方法をまとめておきます。
## 今回の環境
Debian GNU/Linux squeeze (testing)
Emacs 23.0.94 (← Emacs23 以上じゃないとダメっぽい)
## 技術的な仕組み
skype.el は Skype の Emacs フロントエンド。Skype を起動したあとに、
skype.el を起動して使う。両者のやりとりは、D-Bus を介して行われると
のこと。D-Bus というのは、プロセス間通信の実装の一つらしい。
→ {{< wikipedia "D-Bus" >}}
## 設置手順
### 1. Linux 用の Skype をインストールした。
[公式サイト](http://www.skype.com/)から deb パッケージをダウンロードしてもよいが、
/etc/apt/sources.list に apt-line を追加する方がスマートなので、
こちらをお勧めする。
>deb http://download.skype.com/linux/repos/debian/ stable non-free
追加したら、いつものように aptitude でインストールする。
```
# aptitude update
# aptitude install skype
```
インストールできたら、Skype 単体でチャットや通話が出来ることを確認すべし。
### 2. skype.el 一式をダウンロードした。
```
% svn co http://svn.codecheck.in/lang/elisp/skype/trunk skype
```
/usr/local/share/emacs/site-lisp から、ダウンロードした skype ディ
レクトリにシンボリックリンクを張った。
### 3. ~/.emacs に以下を追加した。
```elisp
(defun my-skype ()
(interactive)
(require 'skype)
(setq skype--my-user-handle "私のSkypeID")
(skype--init)
(skype--open-all-users-buffer-command))
```
### 4. Skype 自動起動の設定をした。
「GNOME メインメニュー」→「システム」→「設定」→「自動起動するア
プリ」に skype を追加し、ログイン時に自動起動するようにした。
Skype を起動し、「Skype のオプション」→「一般」→「システムトレイ
内で最小化した Skype を開始」にチェック。こうすると起動時に邪魔にな
らない。
※ システムトレイは、GNOME の「パネルに追加」から「通知スペース」を
追加していかないと表示されない。
## 使い方
Emacs を起動し、M-x my-skype する。
キーバインドは「[skype.el を Debian でインストールしてみた](http://d.hatena.ne.jp/aiam/20090405/1238945334)」が詳しい。
## スクリーンショット
{{< figure src="/images/skype_s.png" link="/images/skype.png" target="_blank" rel="noopener" alt="画像" >}}
なかなかの見栄えだと思う。あと、Linux 版の Skype がシステムトレイに
収まっているので、誰かからのメッセージは右下にポップアップし、すぐ
に分かる。
## Linux 版 Skype の日本語入力について
日本語入力は uim-qt をインストールし、~/.xprofile に以下を記載する
必要がある。
```
QT_IM_MODULE=uim
export QT_IM_MODULE
```
Skype は (GTK ではなく) QT アプリなので、GNOME 向けの下記の設定は効
かなかった。
```
GTK_IM_MODULE=uim
export GTK_IM_MODULE
```
## 他に参考にしたページ
http://slashdot.jp/~kawa-t/journal/466769
http://wiki.debian.org/skype
http://d.hatena.ne.jp/authorNari/20090226/1235580841
**追記(2010-08-15):**
リポジトリが github に移行してました。
http://github.com/kiwanami/emacs-skype
--------------------------------------------------------------------------------
title: "tdiary のテーマを最新にした"
date: "2009-06-13"
--------------------------------------------------------------------------------
今まで安定版のテーマを使っていましたが、開発版で良いことに今更気が
つきました。開発版の方がテーマの数が増えています。
以下、今回やったことです。
修正したテーマは tar で固めて、[ここ](../theme.tar.gz)に置きました。
## 1. http://www.tdiary.org/ から、tdiary-theme-2.3.2.tar.gz をダウンロードした。
## 2. 以下を行うシェルスクリプトを作成し、実行した。
- 全ての *.css の先頭に以下の 1 行を追加。参考情報→{{< post "2009-05-24-1" >}}
```
@import "/prettify/prettify.css";
```
- 古いディレクトリの clfix.css を新しいディレクトリにコピーし、
コピーしたディレクトリにある「テーマ名.css」に以下の 1 行を追加。参考情報→{{< post "2009-02-21-1" >}}
```
@import "clfix.css";
```
- chmod -R go-w .
## 3. いくつかの clfix.css には、オリジナルの「テーマ名.css」を修正したことをメモしてある。その通りに修正した。
作成したシェルスクリプトは以下になります。
```
#!/bin/sh
OLD_THEMEDIR=$HOME/tmp/theme.old
NEW_THEMEDIR=$HOME/tmp/tdiary-theme-2.3.2
if [ ! -d "$OLD_THEMEDIR" ]; then
echo "$OLD_THEMEDIR isnot exist."
exit 1
fi
if [ ! -d "$NEW_THEMEDIR" ]; then
echo "$NEW_THEMEDIR isnot exist."
exit 1
fi
cd $NEW_THEMEDIR
# 全てのディレクトリの *.css に 1 行追加
cat < $CSS_FILE
@import "/prettify/prettify.css";
EOF
cat ${CSS_FILE}.bak >> $CSS_FILE
rm ${CSS_FILE}.bak
done
printf "done.\n\n"
# 古いディレクトリの clfix.css を新しいディレクトリにコピーし、
# テーマ名.css に 1 行追加する。
cat < $CSS_FILE
@import "clfix.css";
EOF
cat ${CSS_FILE}.bak >> $CSS_FILE
rm ${CSS_FILE}.bak
cat <<- EOF
added to the $CSS_FILE.
EOF
done
chmod -R go-w .
### End of file
```
--------------------------------------------------------------------------------
title: "キーバインド"
date: "2009-06-11"
--------------------------------------------------------------------------------
kbd() を使って、~/.emacs を書き換えました。kbd() は anything.el で
使われていたのですが、こちらの方が今までの書き方より統一感が出るの
で、採用させていただきました。
修正前はこんな感じ。
```elisp
(define-key esc-map "b" 'backward-sexp)
(define-key global-map "\C-t" 'call-last-kbd-macro)
(define-key global-map [(control \,)] 'backward-word)
(define-key global-map [(control \.)] 'forward-word)
(define-key ctl-q-map [?\C-\ ] 'comint-dynamic-complete-filename)
```
kbd() を使ったら統一感がでました。
```elisp
(define-key esc-map (kbd "b") 'backward-sexp)
(define-key global-map (kbd "C-t") 'call-last-kbd-macro)
(define-key global-map (kbd "C-,") 'backward-word)
(define-key global-map (kbd "C-.") 'forward-word)
(define-key ctl-q-map (kbd "C-SPC") 'comint-dynamic-complete-filename)
```
※ ctl-q-map は自作のキーマップなので、デフォルトでは存在しません。
(kbd "ほげ") の ほげ の部分は、"F1 c" した後、調べたいキーを押すと
分かります。以下は Ctrl-f を調べた場合です。(kbd "C-f") と書けば良
いのだと分かりますね。
>C-f runs the command forward-char
Emacs のキーバインドと、キー動作について、某所でまとめ中です。
まとめ終わったら、ここにもアップする予定です。
ちなみに、kbd() が定義されている subr.el には、lambda, when,
unless, caar など馴染みのある関数やマクロが定義されています。
とても興味深いですね!
--------------------------------------------------------------------------------
title: "C-u bs-show <-> bs-show"
date: "2009-06-11"
--------------------------------------------------------------------------------
{{< post "2009-06-07-4" >}} のその後。
デフォルト C-u 付きの動作にしたかったので、以下の設定をした。
自分はこっちの方が合うかも。
```elisp
;; M-x bs-show と C-u M-x bs-show の動作を交換する。
(setq bs-default-configuration "all")
(setq bs-alternative-configuration "files")
```
--------------------------------------------------------------------------------
title: "au のサポートサイトにログインできない"
date: "2009-06-09"
--------------------------------------------------------------------------------
4 月くらいから Linux からログインできなくなって放置していたのだけど、
さっき思い立って何度も試した。まだログインできなかった。でも、試し
に Windows の IE7 や Firefox3 から試してみたらログインできた。orz
以下、Firefox3 on Linux での、au サポートサイトの不具合まとめ。
1. https://cs.kddi.com/ を開くと、Flash が Loading のまま固まる。
HTML(シンプル)版から中に入った。
※ 後から確認したら、サポートしているのは、Windows の Flash Player
9.0.28.0 以上とのこと。うちのは 10.0 r22。OS を選ぶのか...?
2. Windows では使えた ID とパスワードでログインすると、以下のエラー。
一度も間違えてないのだけど…
>サポートIDやパスワードを連続して複数回間違えられた可能性があるため、ログイン制限がかかりました。
3. ログイン制限は以下の手順で解除できるそうなので、[トップページ](https://cs.kddi.com/html/)の
「サポートID・パスワードを忘れた方」をクリック。
>ログイン制限は、下記のお手続きで解除が可能です。
>
>パソコンから:
>auお客さまサポートトップページのログインフォーム下部の「サポートID・パスワードを忘れた方」
>(システムの反映には約5分程度時間がかかります。)
>[S0007]
4. 「わからなくなってしまったのは?」に「サポートIDとサポートパスワー
ド」を選択し、「次へ」をクリック。
5. 「サービス」に「auケータイ」を選択し、「au携帯番号」「暗証番号」
「お客様コード」を入力。ちなみに、「お客様コード」は、毎月メールで
来る「auご利用料金更新のお知らせ」の「ご請求コード」のことらしく、
非常に分かりづらかった。
6. 照会まで進むと自分の「サポートID」が明らかになる。(Windows で使
えたものと同じだったけど。。。)
7. 上記「サポートID」と、その後メールで送られてくる「サポートパスワー
ド」でログインすると、"2" に戻る。以降ずっとループ。
au の携帯電話は IDO 時代から使っていて、今の電話番号も 11 年目にな
る。今まで au はこんなことはなかったので、頑張ってほしいところ。そ
う思って、サポートセンターにもメールしてみた。
他、私が感じた問題点は以下の 2 つ。
問題点1:
用語が統一されていない。「お客様コード」と「ご請求コード」、「暗証
番号」と「サポートパスワード」など。
問題点2:
4 月に送られてきた、「Subject: 【auからの重要なお知らせ】『WEB de
請求書』ご利用のお客様へ」の[「サポートID」の取得/確認サイト](https://cs.kddi.com/mb/support/ez/info/200905webde/index.html)は今現在
も混み合っていて(ホントかなあ)アクセスできない。Windows からも同様。
>ただいま大変混みあっております。
>恐れ入りますが、もう一度、お客さまサポートのトップページからご利用ください。
>[A9002]
**追記(2009-06-10):**
早速、au から丁寧な回答があった。やはり動作環境に制限があるとのこと。
>▼HTML版
>OS:WindowsVista/XP、Macintosh (Mac OS X 10.1以上)
>ブラウザ:InternetExplore 6.0/7.0、Mozilla Firefox 1.5/2/3、
> Safari 2/3
でも、今時の Web サイトで OS に依存しているのも珍しいよなあ。
まあ、Windows で見ればいいので、私的には今後に期待です!
**追記(2009-07-12):**
Bird さんから、[Firefox の User Agent Switcher](https://addons.mozilla.org/ja/firefox/addon/user-agent-switcher/) を使うとログインでき
るよと教えてもらいました。
>▼ Flash 版
>IE[6-8] ではログインできなかった。というか、ログインメニューの表示
>さえされなかった。iPhone にしたら、なぜかログインできた。
>
>▼ HTML 版
>IE[6-8] と iPhone でログインできた。
とりあえず iPhone にしておけば、どちらもログインできるようです。
--------------------------------------------------------------------------------
title: "ケーキいろいろ "
date: "2009-06-08"
--------------------------------------------------------------------------------
個人的なメモ。
写真デコレーションなんてものがあるんだ。
http://www.b-shop.co.jp/hanabishi/
同じ店だけど、ケーキはアレゲ。
http://news.ameba.jp/gizmodo/2009/05/38928.html
他のケーキ屋(この例では五反田)と比べると、若干高めだな。
http://le-fromage.jp/
ケーキ好き(?)の私としては、下記の質問も気になる。
http://okwave.jp/qa5001183.html
--------------------------------------------------------------------------------
title: "三国志 英雄占い"
date: "2009-06-07"
--------------------------------------------------------------------------------
占いはやらないのだけれど、三国志となれば話は別。
[DORON特集「三国志 英雄占い」](http://doron.allabout.co.jp/s/070530/index.htm)
私は「周瑜」タイプでした。
>美を理解する者は、生きざまも美しいもの。
(´∀`)
>細やかなやりとりの積み重ねで大局を思うように動かしていくといった
>知将ならではの技も身につけています。
( ̄ー ̄)
>あわててしでかした失敗がいつまでも脳裏に残り、ふたたび失敗する材料
>となってしまうのです。
(;´Д`)ハァハァ
--------------------------------------------------------------------------------
title: "twittering-mode.el を試してみた"
date: "2009-06-07"
--------------------------------------------------------------------------------
**[2010.6.12 Emacs Wiki にインストールガイドと全てのキーバインドを記載
しました。](http://www.emacswiki.org/emacs-ja/TwitteringMode-ja)この記事はもう古いです。**
やはりというかなんというか、探してみたらありました。
Emacs 上で Twitter できる、twittering-mode.el が。
M-x twit で、Twitter 開始です。"u" または "C-c C-s" でつぶやけます。
デフォルトでは 90 秒ごとにリロードされますが、"g" で手動リロードす
ることも出来ます。
## スクリーンショット
{{< figure src="/images/twitter_s.png" link="/images/twitter.png" target="_blank" rel="noopener" alt="画像" >}}
後述の twittering-icon-mode を有効にしているので、なかなかの見栄え
です。:-)
## インストール方法
**1.** [twittering-mode の公式サイト](http://twmode.sourceforge.net/ja/)から、tar ball を取得します。
もしくは、GitHub から開発版を取得します。
```
% git clone git://github.com/hayamiz/twittering-mode.git
```
**2.** 展開した twittering-mode を load-path に追加します。
```elisp
(add-to-list 'load-path "/path/to/installed/dir")
```
## 必要最小限の設定
```elisp
(autoload 'twit "twittering-mode" nil t)
(setq twittering-username "Twitterアカウント")
```
## 私が追加で設定した内容
```elisp
(setq twittering-icon-mode t)
(setq twittering-jojo-mode t)
(defun twittering-mode-hook-func ()
(set-face-bold-p 'twittering-username-face t)
(set-face-foreground 'twittering-username-face "DeepSkyBlue3")
(set-face-foreground 'twittering-uri-face "gray35")
(define-key twittering-mode-map (kbd "<") 'my-beginning-of-buffer)
(define-key twittering-mode-map (kbd ">") 'my-end-of-buffer)
(define-key twittering-mode-map (kbd "F") 'twittering-favorite))
(add-hook 'twittering-mode-hook 'twittering-mode-hook-func)
```
- twittering-icon-mode を有効にしました。
各ユーザのアイコン画像が表示されて見栄えよくなります。
- twittering-jojo-mode を有効にしました。
followings の誰かが "次にお前は「XXX」と言う!" とつぶやくと、
自動で "XXX、、、はっ!?" とつぶやきます。
- ユーザ名と URI の色を変更し、見栄えよくしました。
- "<" や ">" でバッファの先頭や終端に移動できるようにしました。
- "F" でお気に入り登録出来るようにしました。"C-u F" でお気に入りか
ら外せます。
## 参考にしたページ
http://d.hatena.ne.jp/wadap/20080628/1214650097
http://www.kototone.jp/com/how_to_use_twittering-mode.html
**追記(2010-04-18):**
情報が古くなっていたので、全体的に書き換えました。
**追記(2010-05-12):**
twittering-mode ディレクトリを site-lisp に放り込むと、追加されては
いけないディレクトリまで load-path に追加されてしまうので、修正しま
した。
--------------------------------------------------------------------------------
title: "bs-show を試してみた"
date: "2009-06-07"
--------------------------------------------------------------------------------
今まで "C-x C-b" には buffer-menu を割り当てていたんだけど、代わり
に bs-show を割り当てることにした。
```elisp
(define-key ctl-x-map (kbd "C-b") 'bs-show)
```
実行すると、*buffer-selection* バッファに「ファイルだけが」候補とし
て現れる。他のバッファも表示させたい場合は、"C-u C-x C-b" すれば OK!!
情報源:
[bs-show - MOEPANDA diary (2009-05-17)](http://ko.meadowy.net/~shirai/diary/20090517.html#p02)
--------------------------------------------------------------------------------
title: "anything.el を試してみた"
date: "2009-06-07"
--------------------------------------------------------------------------------
**この記事は obsolete です。**
**http://d.hatena.ne.jp/rubikitch/20100718/anything をご覧下さい。**
ずいぶん前からアレゲな方々の間で話題になっていた anything.el を
ようやく試すことができた。
Emacs は様々な局面で「補完」することができるが、anything.el を使う
と、この補完 IF をある程度統一出来る。
## 機能の概要
anything を実行すると、以下の候補一覧が *anything* バッファに作成さ
れる。
「現在開いているバッファ」
「今まで開いたファイルの履歴」
「カレントディレクトリのファイル」
「今まで実行したコマンド」
何か文字を打つと、そのパターンにマッチした候補に絞り込まれる。候補
を C-n, C-p, C-v, M-v で選択したり、C-s や C-r で候補自体を検索する
ことも可能。
## インストール方法
以下のファイルをダウンロードして、load-path の通ったところにコピー
する。
http://www.emacswiki.org/cgi-bin/wiki/download/anything.el
http://www.emacswiki.org/cgi-bin/wiki/download/anything-config.el
## 私が設定したこと
~/.emacs に以下の設定をした。"C-x b" の switch-to-buffer を
anything で上書きし、次と前の機能一覧に、それぞれ C-M-n と C-M-p で
移動できるようにした。
```elisp
(require 'anything-config)
(define-key ctl-x-map (kbd "b") 'anything)
(define-key anything-map (kbd "C-M-n") 'anything-next-source)
(define-key anything-map (kbd "C-M-p") 'anything-previous-source)
```
以上の設定を行うと、"C-x b" で anything を使える。
## 補足
anything-sources を自分で設定することで、候補一覧をカスタマイズでき
る。ドキュメントはないようなので、インストールした *.el を直接見る
とよいと思う。
## 感想
拙作の [cdutil.el](/elisp.html#cdutil) を使っているためか、それほど便利に感じなかった。
cdutil は自分で登録したファイルやディレクトリと、シェルの "cd ..."
というエイリアスから補完候補を作成する elisp なんだけど、anything
から使えるようにすると面白いかも?と思った。
## 参考にしたページ
http://www.ftnk.jp/~fumi/cl/2009-05-28-2.html
http://dev.ariel-networks.com/Members/matsuyama/open-anything-emacs
http://yamashita.dyndns.org/blog/anythingel/
**追記(2009-06-11):**
"C-x b" を潰すのは自分には合わなかったようです。"C-x ;" に変更しま
した。anything.el は使わなくなる予感。。。
--------------------------------------------------------------------------------
title: "わらびもち"
date: "2009-06-07"
--------------------------------------------------------------------------------
これはひどい。w
{{< nicovideo id="sm7028438" title="【ぷるぷる】わらびもちに命をかける業者【ぷる〜ん】" >}}
--------------------------------------------------------------------------------
title: "ウィンドウの幅や高さを、キー操作で変更する"
date: "2009-06-07"
--------------------------------------------------------------------------------
## "C-x 2" で上下に分割した場合
### "C-x ^" or "M-x enlarge-window"
現在のウィンドウの縦幅を大きくする。
### "M-x shrink-window"
現在のウィンドウの縦幅を小さくする。
## "C-x 3" で左右に分割した場合
### "C-x }" or "M-x enlarge-window-horizontally"
現在のウィンドウの横幅を大きくする。
### "C-x {" or "M-x shrink-window-horizontally"
現在のウィンドウの横幅を小さくする。
## "C-x +" or "M-x balance-windows"
各ウィンドウの大きさを揃えることが出来る。
## 参考にしたページ
[eyesrobe >> ブログアーカイブ >> 基本編 Emacsウィンドウの枠を拡げたり縮めたり](http://blog.eyesrobe.com/2007/07/20/p=33)
--------------------------------------------------------------------------------
title: "Twitter を始めてみた"
date: "2009-06-02"
--------------------------------------------------------------------------------
Twitter(ついったー)とは、アカウントを作ると自分のつぶやきを投稿でき
るサービスだそう。他の人のつぶやきに対して、フォローという名の返信
をすることもできるとのこと。
{{< wikipedia "Twitter" >}}
[Twitter 公式サイト](http://twitter.com/)
[Twitter をはじめよう! - GreenSpace](http://www.greenspace.info/twitter/)
寂しがり屋向けのサービスなのだろうか。。。
上のサイトを見る限り、他の可能性もあるようだけど。
でも、まあとにかく始めてみた。このブログの左側にも表示させてみた。
**追記(2009-06-07):**
なんだか重いので、左側に表示させるのは止めました。
--------------------------------------------------------------------------------
title: "TopHatenar を付けてみた"
date: "2009-06-02"
--------------------------------------------------------------------------------
今度はサイドメニューの下の方に、[TopHatenar](http://tophatenar.com/) というのを付けました。

ブログのランキングを表示してくれます。ランキングは、RSS フィード購
読者数やソーシャルブックマーク獲得数から決定しているようです。
ランキングは現在最下位でございます。
ついでに、ここ 3 ヶ月のアクセス分析をしました。
3,465 名の方が、6,278 回アクセスして下さいました。1 日に換算すると、
約 40 名の方の、約 70 アクセスになります。
|Page View|Visit
|---:|---:
|6,278|3,465
上記カウント数のうち、検索エンジン経由で来た方のランキングです。
|No|検索エンジン|検索フレーズ|割合|カウント
|---:|---|---|---:|---:
|1|Google|SP27213.exe|1.5%|35
|2|Google|printf 自作|1.3%|31
|3|Google|svn: URL に対し ra_local セッションを開始できません|0.9%|22
|4|Google|svn ra_local セッションを開始できません|0.7%|16
|5|Google|xz 圧縮|0.6%|15
|6|Google|sp27213.exe 使い方|0.5%|13
|7|Google|wave mp3 変換|0.5%|13
|8|Google|solaris 9 ntp|0.5%|12
|9|Google|wav mp3 変換|0.5%|12
|10|Google|apache favicon|0.3%|9
まあ、なんというかアレゲなランキングになってしまいました。
少ないアクセスではありますが、なるべく正確な情報や手順を心がけてい
ます。誰かの役には立っているのかな?これからもよろしくお願いします。
**追記(2009-06-08):**
TopHatenar はもう少し購読者が増えてから設置することにします。^^;
**追記(2009-08-01):**
少し購読者が増えたので、また設置しました。
--------------------------------------------------------------------------------
title: "このブログをケータイで見た時のリダイレクト"
date: "2009-05-29"
--------------------------------------------------------------------------------
このブログがケータイからアクセスされたら、内部でケータイ向けのペー
ジにリダイレクトするように設定してみた。
リダイレクトとしては以下の動作になる。アクセスした人はリダイレクト
されたことに気づかないはず。
YYYY-MM-DD-I.html へのアクセス例:
```
http://masutaka.net/chalow/2009-05-29-1.html
↓
http://masutaka.net/chalow/clkeitai.cgi?date=2009-05-29-1
```
YYYY-MM-DD.html へのアクセス例:
```
http://masutaka.net/chalow/2009-05-29.html
↓
http://masutaka.net/chalow/clkeitai.cgi?date=2009-05-29
```
それ以外の *.html へのアクセス例:
```
http://masutaka.net/chalow/index.html
↓
http://masutaka.net/chalow/clkeitai.cgi
```
.htaccess への記載内容は以下のとおり。
```
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} (J-PHONE|SoftBank|Vodafone|DoCoMo|KDDI)
RewriteRule ^chalow/([0-9]+-[0-9]+-[0-9]+(-[0-9]+)?)\.html$ chalow/clkeitai.cgi?date=$1 [L]
RewriteCond %{HTTP_USER_AGENT} (J-PHONE|SoftBank|Vodafone|DoCoMo|KDDI)
RewriteRule ^chalow/(.*\.html)?$ chalow/clkeitai.cgi [L]
```
clkeitai.cgi はデフォルトのままなので、トップと日ペー
ジ(YYYY-MM-DD.html)、それにアイテムページ(YYYY-MM-DD-I.html)しか表
示できない。だから、それ以外のページが指定されたらトップを表示する
ようにしている。
表示後にブログ内のリンクをクリックすると、URL に clkeitai.cgi が出
てしまうのもイマイチか。
参考にしたページ:
[「を」このブログをケータイで見たときのリダイレクトと「はてブ」リンクの修正](http://chalow.net/2008-07-13-3.html)
ついでにサイドメニューに、QR コードを張り付けてみた。
QR コードは http://qrcode.jp/ で作れるよ。
--------------------------------------------------------------------------------
title: "ペペロンチーノ"
date: "2009-05-29"
--------------------------------------------------------------------------------
パスタ第3弾です。今回は見た目よくできました。
## レシピ
{{< figure src="/images/pasta4_s.jpg" link="/images/pasta4.jpg" target="_blank" rel="noopener" alt="画像" >}}
>材料(1人分)
>パスタ・・・・・・・・・・・110g(いつもより多め)
>オリーブオイル・・・・・・・適当(いつもより多め)
>ベーコン・・・・・・・・・・2枚
>乾燥ニンニク・・・・・・・・適当
>鷹の爪・・・・・・・・・・・1本
>塩・・・・・・・・・・・・・多め
>こしょう・・・・・・・・・・少々
>味の素・・・・・・・・・・・少々
1. 鍋に塩を入れ、湯を沸かし始める。塩は多めで。
2. ベーコンの油が気になる人は、電子レンジで油抜きをする。キッチンペー
パー 2 枚、ベーコン、キッチンペーパー 1 枚の順に敷いて、電子レンジ
で 1 分ほど加熱すれば OK 。ベーコンが冷めるのを待って 1cm 幅に切る。
3. 乾燥ニンニクを水で戻しておく。鷹の爪は種を除いておく。
4. 湯が沸いたら、パスタを投入する。キッチンタイマーを忘れずにセット
する。
5. オリーブオイル、ベーコン、水を切ったニンニクをフライパンに入れて
弱中火で熱する。音がしてきたら弱火にする。ベーコンが跳ねるので注意。
6. ニンニクにこんがり焼き色が付いたら火を止め、鷹の爪を入れる。
7. パスタが茹で上がる前に、おたまに軽く一杯の茹で汁をフライパンに入
れる。
8. パスタが茹で上がったら、湯切りしたパスタをフライパンに入れ、塩、
こしょう、味の素で味を整える。茹で汁に塩気が含まれていることに注意
する。
9. いつもどおり乳化({{< post "2009-04-12-1" >}})を意識して、強火でよくかき混ぜれ
ば出来上がり。
## まとめ
今回は、茹で汁を上の分量より多く豪快に入れてしまいました。少し水っ
ぽくなってしまいましたが、オイル*ソース*らしいといえばそうだったか
もしれません。まあ、悪くない出来でした。
オイルソースなのでオリーブオイルはいつもより多めです。具が少ないの
で、パスタもいつもより多めです。茹で汁で塩気を付けるので、湯に入れ
る塩もいつもより多めです。
ベーコンと味の素を入れているのは、自分の腕に自信がないからです。そ
ういえば、以前近所で食べたペペロンチーノは信じられないくらいうまかっ
たです。新城なのに。w
乾燥ニンニクを使っているのは、お手軽に作るためです。次の日も息が臭
くなることは(多分)ありません。
ところで、国産の乾燥ニンニクってなかなか売ってないですよね。しかも
かなり高い。何で中国産とあんなに違うのでしょうか...。鷹の爪も同様で
すが、今回は国産を手に入れられました。国産は形がとてもきれいですし、
苦もなく辛味がオイルに移ります。
--------------------------------------------------------------------------------
title: "XHTML へのステップアップ"
date: "2009-05-28"
--------------------------------------------------------------------------------
{{< post "2009-05-28-1" >}} のつづき。
{{< wikipedia word="Extensible_HyperText_Markup_Language" text="wikipedia" >}} によると XHTML というのは、SGML で書かれていた HTML を XML の文法で定義し直したマークアップ言語とのこと。参考情報→{{< post "2008-06-29-1" >}}
HTML とは文法はさほど変わらないので、「マスタカのホーム」と「マスタカ宛メッセージ送信」を XHTML で書いてみた。ただ、HTML との違いは知らないので、[The W3C Markup Validation Service](http://validator.w3.org/) でエラーを潰しながら対応した。以下、XHTML の説明。
XHTML は HTML 4.01 をベースに作られた。最新の 1.0 仕様書は以下から参照できる。
- [XHTML 1.0 仕様書](http://www.w3.org/TR/xhtml1/)
「[3.1.1. Strictly Conforming Documents](http://www.w3.org/TR/xhtml1/#strict)」に書かれているとおり、以下の 3 種類の DTD(Document Type Definition、文書型定義) を規定している。
**XHTML 1.0 Strict DTD (厳密型)**
```html
```
**XHTML 1.0 Transitional DTD (移行型)**
```html
```
**XHTML 1.0 Frameset DTD (フレーム設定型)**
```html
```
XHTML に戸惑う部分もあったけど、XHTML 1.0 Strict での診断結果が Passed になったので「マスタカのホーム」と「マスタカ宛メッセージ送信」の下に以下の画像リンクを付けることができた。

さらに厳しい診断ページもあった...。
[Another HTML-lint gateway](http://openlab.ring.gr.jp/k16/htmllint/htmllint.html)
参考にしたページ:
* [XHTML 1.0 Transitionalへの道 - まずは導入編 -](http://seeds.whitesnow.jp/blog/archives/2004/12/xhtml_10_transitional.html)
* [XHTMLの書き方と留意点](http://www.kanzaki.com/docs/html/xhtml1.html)
--------------------------------------------------------------------------------
title: "HTML の妥当性を診断する"
date: "2009-05-28"
--------------------------------------------------------------------------------
[The W3C Markup Validation Service](http://validator.w3.org/) で、任意のサイトの HTML の文法チェックができる。そこで手始めに「マスタカのホーム」をチェックしてみた。エラーの嵐だった...。
エラーがあっても、Web ブラウザはうまく解釈して表示してくれる。ただ、後述の HTML の仕様にはなるべく沿うようにしたいし、Firefox では OK だが、IE だとレイアウトが崩れるなんてことはなるべく避けたいので、頑張ってゼロにしてみた。以下、HTML の説明。
まず知っておかなくてはいけないことは、HTML にはバージョンがあるということ。最新の 4.01 の仕様書は以下から参照できる。
- [HTML 4.01 仕様書](http://www.w3.org/TR/html401/)
- [HTML 4.01 仕様書(日本語訳)](http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/)
「[7.2 HTMLバージョン情報](http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/struct/global.html#h-7.2)」に書かれているとおり、HTML 4.01 仕様では、3 つの DTD(Document Type Definition、文書型定義) を規定しており、各 HTML ファイルには次のいずれかの文書型宣言を含める必要があるようだ。
**HTML 4.01 Strict DTD (厳密型)**
```html
```
**HTML 4.01 Transitional DTD (移行型)**
```html
```
**HTML 4.01 Frameset (フレーム設定型)**
```html
```
HTML4.0 から、見た目のレイアウトなどのデザインは、スタイルシートを使うことが前提とされているとのこと。そういう意味から「厳密型」と「移行型」が定義されているようだ。
「フレーム設定型」はフレームのサイトに使用する。ただし、前に述べたようにデザインには HTML は関与しない流れになっているので、フレームのサイトは作らない方が良いと思う。
IE や Firefox には、HTML の仕様にはない独自規格がある。例えば、`` や `` など。これらを使うと前述の診断でエラーとなる。この状態で DOCTYPE 宣言をするのは意味がないので、その場合は DOCTYPE 宣言は行わず Web ブラウザに表示を任せてしまった方が良いと思う。
この chalow のページも、使わざるを得ない(もしくは代替の方法が分からない)箇所があったため、DOCTYPE 宣言はしていない。
「マスタカのホーム」と「マスタカ宛メッセージ送信」はエラーゼロに出来たため、宣言している。ただ、HTML ソースを見ると DOCTYPE 宣言が前述のものと違うはず。
```html
```
これは XHTML で書いてあるため。XHTML の説明は次の記事 {{< post "2009-05-28-2" >}} をどうぞ。
参考にしたページ:
* [HTMLタグ/HTMLの基本/DOCTYPE宣言 - TAG index Webサイト](http://www.tagindex.com/html_tag/basic/doctype.html)
* [各HTMLバージョンのDOCTYPE宣言のサンプル集](http://www.animegif.net/tips/html/doctype-html-public.html)
* {{< wikipedia "HyperText_Markup_Language" >}}
* [DOCTYPE宣言って?](http://www.d3.dion.ne.jp/~tiyoko01/sitoku/doctype.html)
--------------------------------------------------------------------------------
title: "FoxMeter を付けてみた"
date: "2009-05-25"
--------------------------------------------------------------------------------
サイドメニューの下の方に、[FoxMeter](http://nakanohito.jp/stage/foxmeter/) を付けました。
公式サイトによると、以下の機能だそうです。うーむ。
- サイト訪問者の Firefox3 移行率を、簡単にチェック!
- 最大の特徴は、Firefox3 への移行状況に応じて、「フォクすけ」の表情が変わっていく、という点です。

--------------------------------------------------------------------------------
title: "サイドメニューの「カテゴリ」を大文字小文字無視でソート"
date: "2009-05-24"
--------------------------------------------------------------------------------
今回も「戯術者の日記」を参考にさせて頂きました。
```
--- orig/chalow-1.0/chalow 2007-10-19 23:15:01.000000000 +0900
+++ chalow-1.0/chalow 2009-05-24 23:57:16.000000000 +0900
@@ -1174,7 +1174,7 @@
# return if ($output_cat_pages == 0);
my @lines = ();
- foreach my $cat (sort keys %{$cl->{CAT}}) {
+ foreach my $cat (sort { lc $a cmp lc $b } keys %{$cl->{CAT}}) {
my $n = $cl->{CAT}->{$cat};
my $url;
if ($output_cat_pages) {
```
参考にしたページ:
[戯術者の日記:カテゴリ一覧を大文字小文字無視でソート](http://www.jp-z.jp/changelog/2005-06-30.html#2005-06-30-1)
**追記(2011-07-06):**
カスタマイズできるようにして、[GitHub に push しました。](https://github.com/masutaka/chalow/commit/faf6848c16a1cb7c913028d0c17d70d1e5a07111)
--------------------------------------------------------------------------------
title: "cl.rdf にもカテゴリ表示"
date: "2009-05-24"
--------------------------------------------------------------------------------
※ {{< wikipedia word="フィードリーダー" text="RSS リーダー" >}}を使うと、自分の見たい Web サイトの更新を自動で確認
してくれます。未読管理が出来るものも多いです。ぜひ使ってみてくださ
い。数ある RSS リーダーの中でも、私は [Google リーダー](http://www.google.com/reader/)をお薦めします。
ちなみに、このブログの登録フィードは[こちら](cl.rdf)です。
RSS リーダーでは各記事のタイトルにカテゴリ名が付かないので、付ける
ようにしてみました。cl.rdf の出力が変わります。
```
--- orig/chalow-1.0/chalow 2007-10-19 23:15:01.000000000 +0900
+++ chalow-1.0/chalow 2009-05-24 17:54:55.000000000 +0900
@@ -1089,7 +1089,7 @@
push @items, {
permlink => $permlink,
- itemheader => html2xmlstr($e->{$i}{h}),
+ itemheader => html2xmlstr("[".join("][", @{$cl->{all}->{$ymd}->{$i}->{cat}})."] ".$e->{$i}{h}),
itemauthor => $e->{$i}{a},
itemcontent => $cont,
itemcontentencoded => $coen,
```
参考にしたページ:
[戯術者の日記:rdfファイルにもカテゴリ表示](http://www.jp-z.jp/changelog/2005-06-14.html)
[戯術者の日記:続きを読…めない](http://www.jp-z.jp/changelog/2006-07-30.html)
**追記(2009-08-31):**
[twitterfeed](http://twitterfeed.com/) の出力が不格好になるので、元に戻しました(カテゴリ名を付
けないようにしました)。
--------------------------------------------------------------------------------
title: "private item と normal item"
date: "2009-05-24"
--------------------------------------------------------------------------------
各日付の中で private item (p:) と normal item をどういう順番で置く
かは、自分で決めておかないとマズイね。
例えばある日付の中で、両者が交互に出現すると [YYYY-MM-DD-I] を使っ
た参照がややこしくなる。private item の方が数が少ないと思うから、
normal item が下、private item を上に置くようにすると良さそう。
あと、[YYYY-MM-DD-I] で参照されているアイテムを移動すると、リンクが
切れてしまう。アイテムを移動するときは、そのアイテムの参照元も修正
する必要がある。
--------------------------------------------------------------------------------
title: "main() の第 3 引数"
date: "2009-05-24"
--------------------------------------------------------------------------------
処理系に依存してしまうが、main() の第 3 引数には環境変数リストが入っているとのこと。うちの Debian GNU/Linux squeeze では参照できた。
```c
#include
int main(int argc, char **argv, char **envp){
int i;
for (i = 0; envp[i] != NULL; i++){
printf("%s\n", envp[i]);
}
return 0;
}
```
* [404 Blog Not Found:CGIの神話と現実](http://blog.livedoor.jp/dankogai/archives/50460011.html)
* [int void (main)の意味/// -OKWave](http://okwave.jp/qa3185703.html)
--------------------------------------------------------------------------------
title: "Lisp 系のソースコードにも色を付ける"
date: "2009-05-24"
--------------------------------------------------------------------------------
{{< post "2009-05-24-1" >}} の続きです。
[リリース元の解説](http://google-code-prettify.googlecode.com/svn/trunk/README.html)にも書いてありますが、Lisp 系のソースは拡張サポート
のようで、自動判別してくれません。変な色になってしまいます。
lang-lisp.js も別途読み込ませる必要があるようです。
以下、Emacs Lisp を例に説明します。他の Lisp 系言語で色付けする参考
にもなるかと思います。lang-lisp.js もご覧下さい。
{{< post "2009-05-24-1" >}} とは、cl.conf と chalow の修正が変わります。4 と 5
の手順を以下に置き換えてください。あと、`[src]〜[/src]` の代わり
に `[src_el]〜[/src_el]` を使って下さい。
4'. cl.conf を修正します。全ての