やっぱり Perl スクリプトは perltidy をかけておかないと気持ち悪いよね。 Emacs からは perltidy を呼べるように設定済み。
基本 Perl スクリプトを書く時は Emacs なのだが、Windows 上でさくっと書く時もある。最近は Windows 上のテキストエディタは Notepad++ を使っているので、同様に Notepad++ からも呼べるように設定しておこう。
以下 Notepad++ v5.8.7 (UNICODE)、[全般設定] で言語に日本語を指定してある状態での設定手順。Perl は Strawberry Perl で cpanm が入った状態。
以下のコマンドで perltidy をインストールする。
cpanm Perl::Tidy
Notepad++ v5.8.7 に 外部コマンドを実行する NppExec プラグインが入っていなかったのでインストール。
NppExec_041_dll_Unicode.zip をダウンロードしてきて展開し c:\Program Files\Notepad++\plugins に NppExec.dll をコピーする。
Notepad++ を起動し以下の設定を行う。途中 Notepad を再起動するように指定されたら指示に従って起動しなおす。
c:\strawberry\perl\bin\wperl.exe -x -S perltidy --quiet --preserve-line-endings --backup-and-modify-in-place "$(FULL_CURRENT_PATH)"
これで [マクロ]-[perltidy] と指定できるようになる。
お気に入りの .perltidyrc (perltidy.ini でも OK)を
perltidy -dpro
で表示されるディレクトリのどこかに置くか、置き場所を PERLTIDY 環境変数に設定しておくか、コマンドラインオプションに -pro=filename という形で指定しておく。
適当に Perl スクリプトファイルを開いて [マクロ]-[perltidy] を実行。ウィンドウの下部に Console 出力が表示される。 処理が終わったら [ファイル]-[開き直す]をすると整形された Perl スクリプトが表示される。
上記の手順を Notepad++ マクロ化しようとしたんだけれど、これは失敗。
「ある Perl スクリプトで、ある環境変数を使ってる可能性があるのだけれどどこでどう使ってるのかわかなくて」と言われたので、どこで %ENV から値を読んでいるか探してみることにした。なんか簡単にフックできなさそうなので、ついカッとなって %ENV を tie した。
だいたいこんな感じ。
#!/usr/bin/perl use warnings; use strict; package CarpFetchHash; use Carp qw/carp/; sub TIEHASH { bless {%ENV}, shift; } sub FETCH { carp 'FETCH: $ENV{' . $_[1] . '}'; $_[0]->{$_[1]}; } # 必要なら EXISTS, FIRSTKEY NEXTKEY も package main; tie %ENV, 'CarpFetchHash'; print $ENV{PATH};
環境変数に連動している %ENV (のリファレンス)自身にはさすがに tie できないので (TIEHASH で \%ENV を tie しようとすると Self-ties of arrays and hashes are not supported っておこられる)、%ENV の値をコピーした別の無名ハッシュオブジェクトに %ENV を tie する形になっている。
tie %ENV, '...' した後は、$ENV{$key} から値を取るたびに、どの行で使われたか carp してくれる。
これだと %ENV 経由で環境変数そのものは変更できなくなるんだけれど、読み込みしかしていないようなスクリプトならだいたいうまくいってそう(もし getenv(3) とか直接使ってると駄目だけど)。
VirtualBox 上の Debian GNU/Linux BOX から sshfs でリモートホストのディレクトリをマウントして QGit を使って Git リポジトリのグラフ見てたりしてたけど、メモリもパワーも食うし起動も面倒。何げに今はリモートホスト側にも QGit がインストールされているので、Windows 7 に X server を入れることにした。
X server は普通に Cygwin/X で。setup.exe をダウンロードしてきて実行。X 関連も選択してインストール。
普段 PuTTY でリモートログインしていたので PuTTY で X11 forwarding させる。以下の手順で。
あっさり。
昨日に引き続き今日も Developers Summit 2015 で目黒雅叙園へ。セッション会場では(一般人は)机が無かったので、ノート PC は家に置いてきた。
デブサミはほとんどのセッションが撮影可なんだけれど、スライドを公開すると発表者が言っているのに全スライドをシャッターの電子音を鳴らしてながら撮り続ける人がいて昨日は結構ウザかった。
そういった声は多かったようで、今日は進行の人がシャッター音に配慮するように注意を促していてちょっとは減った感じだった。撮りたかったら無音カメラアプリをインストールしてくるとかした方が良いと思う。
会場でばったり zakwa 氏と再会。まさか来ているとは知らなくてびっくり。今はデータ解析やっているとかいっていたかな。良い再会があったのがデブサミ2日目の一番の収穫。こんど同窓会やりましょう。
朝一番のセッションは昨日の朝に比べて遅い人出。
Docker や Ansible などの話。いろいろ模索し続けている話。インフラ整備専任者が欲しいとのこと。ローカルホストに開発環境を簡単に構築できるというのは良いのだけれど、やはり管理コストが高い印象。
個人的にはやはりどこかのラックに自分の VM がある方が使う側も楽な気がしている。
事前の注意とか言い訳についての前置きが長かった。宣伝セッション。
お昼から帰ってきて会場に行ったら、既にまさかの満席だった。あきらめてソファで本を読んだり、kintone CAFE でコーヒー飲んだり。
プラットフォームの刷新にあたり既存のサービスや機能をきちんと UML を用いてモデリングしなおしてあるべき姿の議論を行ったというのが良いなと。
自分の本部でも今いろいろ可視化を行っているグループがあるのだけれど、散文的に書き出すのではなくてきちんとモデンリングするようにしたい。
Miiverse におけるマルチリージョン構成や多言語対応についての話。
各リージョンに対してどういったサーバとDB構成にしているのかについての説明は興味深かった。パフォーマンスもそうだけれど、サービスとしてどこの機能・情報をリージョン別に出し分けるかを念頭におく必要があることがわかった。なおコードベースは1つで環境変数で機能の出し分けをしているのだとか。
L10N については具体的な話で良かった。Miiverse 特有の話というよりは一般的に誰もが通る道的な。
Eraser Button Law など世界展開においてはやはり法的な事情があるというのもやはり大変なところのようだ。監視ポリシーは統一していとのこと。また投稿監視は関係会社がやっているとのこと(どこにアウトソーシングしているのかな)。
Miiverse もそうだけれど、どこも独自にコミュニケーションサービスを提供していくので、汎用コミュニティサイトはどういう路線でいくのが良いのかなと考えたり。
ガラガラだったし、15分ぐらい経っても本題に入らないし琵琶湖の説明が始まったので途中で出てきた。
及部敬雄氏の
Not プロセス導入 自分たちに必要なものは自分たちで選ぶ
という話が良かった。推進者がゴリゴリ推し進めるのではなくきちんとみんなで考えて試行錯誤していくところに本当の学びがあるんだなと。
セッションの一番最後に、スタンディングオベーションの号令があったのでそそくさと退席した。
シェルで特定の開発ディレクトリ以下に移動すると自動的に設定ファイルで指定された環境変数を設定し、そのディレクトリから別のディレクトリに移動すると戻してくれる direnv が便利。
https://github.com/zimbatm/direnv
Go で開発するのに GOPATH と bin への PATH 追加が面倒だったので導入してみた。
git clone https://github.com/zimbatm/direnv cd direnv make build cp -a direnv $HOME/local/bin
なお direnv は Go で書かれているのでソースからビルドするには Go の開発環境が必要。
.bashrc に以下を追加。
if command -v direnv > /dev/null; then eval "$(direnv hook bash)" fi
その他のシェルでの設定は https://github.com/zimbatm/direnv 参照。
$ cd project_dir $ export EDITOR=emacsclient # 次のコマンドで開くエディタ $ direnv edit . .envrc の編集用にエディタが開くので layout go と入力して保存。
後は Bash でこのディレクトリ以下(サブディレクトリも含む)に移動するとこの .envrc のあるディレクトリが GOPATH に追加され、また bin ディレクトリが PATH に追加される。便利。
なお direnv edit . しないで直接 .envrc を作った場合は、別途 direnv allow . を実行してこの .envrc を使うことを明示的に許可する必要がある。許可したかどうかは ~/.config/direnv/allow/* に保存される(freedesktop.org の XDG Base Directory Specification っぽくなっているので XDG_CONFIG_HOME 環境変数があれば ~/.config ではなくてその下に保存される)。
その他標準で
などが用意されている。また
PATH_add bin
のようにして PATH への追加も簡単。
その他コマンドの実行も可能なので開発以外にもいろいろ便利に使える。
Go で書かれている各種ツールを go get しておく場所を作っておく。このあたり定番のディレクトリ名が良くわからないので ~/local/golang にしておいた(~/local/go は Go 環境自体を入れてある)。
先日使い始めた ディレクトリ毎に異なる環境変数を設定してくれる direnv を使い、 ~/local/golang に移動したらここに GOPATH が設定されるようにしておき、そこで適宜 go get するようにする。
$ mkdir ~/local/golang $ cd ~/local/golang $ echo 'layout go' > .envrc $ direnv allow $ go get -u golang.org/x/tools/cmd/goimports $ go get -u github.com/golang/lint/golint $ go get -u github.com/dougm/goflymake
今日は goimports と golint と goflymake をインストール。
goimports は「gofmt + import の自動追加・削除」ツール。golint は Go 用の lint。 goflymake は名前の通り Go の Flymake ツール(on-the-fly 文法チェッカ)。
上の $GOPATH/bin に PATH を通しておく。
if [ -d $HOME/local/golang/bin ]; then PATH=$PATH:$HOME/local/golang/bin fi
go-mode 自体は package.el でインストール済み(package.el は helm を入れた際に設定済み)。
以下今日いれたツールを Emacs から使う設定を追加。
; バッファ保存時に gofmt (あれば goimports) を実行してソースコード整形する。 (add-hook 'before-save-hook 'gofmt-before-save) (let ((goimports (executable-find "goimports"))) (if goimports (setq gofmt-command goimports))) ; M-x golint で golint をかけられるようにする。 (let ((golint-emacs "~/local/golang/src/github.com/golang/lint/misc/emacs")) (if (file-exists-p golint-emacs) (progn (add-to-list 'load-path golint-emacs) (require 'golint)))) ; on-the-fly シンタックスチェックが動くようにする。 (let ((goflymake "~/local/golang/src/github.com/dougm/goflymake")) (if (file-exists-p goflymake) (progn (add-to-list 'load-path goflymake) (require 'go-flymake))))
Mac 上でテキストを選択すると Android や iOS のようにメニューがポップアップしていろいろなアクションを実行させられる PopClip を今週試用してみたところまずまず便利だったので購入しました。
エクステンションを追加して Day One・Remember The Milk・Alfred・Buffer へ送れるように設定。特に Day One・Remember The Milk についてはそのアプリケーションの画面を開くことなく処理が完結できるので超捗ります。
ちなみに Remember The Milk にタスク追加するエクステンションは見当たらなかったので rumember (記事)を呼び出すエクステンションをさくっと作ってみました。
シェルスクリプト実行時に環境変数 HOME が設定されていなかったのでとりあえず決め打ちで指定しちゃっています。
Config.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Extension Identifier</key> <string>org.naney.popclip.extension.ru</string> <key>Extension Name</key> <string>ru</string> <key>Actions</key> <array> <dict> <key>Title</key> <string>ru</string> <key>Image File</key> ← 省略可 <string>rtm.png</string> ← 省略可 <key>Shell Script File</key> <string>ru.sh</string> </dict> </array> </dict> </plist>
ru.sh
#!/bin/sh if [ -x /Users/naney/local/rumember ]; then HOME=/Users/naney GEM_HOME=/Users/naney/local/rumember /Users/naney/local/rumember/bin/ru "$POPCLIP_TEXT" fi
Alfred workflow の Run Script で呼んでいる mkdocs gh-deploy が git するところで動かなくなっていた。
調べたところ Alfred 5 から Run Script 時に外部の環境変数を渡さないようにしたとのこと。 SSH_AUTH_SOCK が渡らなくなって ssh-agent が働かなくなっていた。
Run Script の中で明示的に SSH_AUTH_SOCK を設定するよう修正して動くようにした。
路地・夏#photography
— Naney (@Naney) July 27, 2022
RICOH GR III #GR #GRIII #GR3 pic.twitter.com/Bx92w68MP7
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。