Meblog

このブログ記事は個人の見解であり、所属する組織の公式見解ではありません

Windows 7でVPNを接続すると、Emacsが遅くなる

背景

出張中、VPNで社内LANに繋いで作業していると、WindowsEmacsが非常に低速になってしまった。VPNを有効にした途端、やたら重くなってしまうのだ。とくにdiredやファイル読み出し、書き込みなど、ファイルI/O関連で遅くなってしまっているように思える。よくある問題だと思うんだけど、何故か日本語解説が全く出なかったのでメモ。
(特に外に出て行くSEなんかは、WindowsVPN使ってるなんてよくある状況に思えるんだけど、なんでほとんど情報が出なかったのか、不思議だ。。)

解決法

recentf-auto-cleanup

(setq recentf-auto-cleanup 'never)

を init.elもしくは .emacsに書き込んで 、eval-buffer。が、パフォーマンス改善せず。

w32-get-true-file-attributes

(setq w32-get-true-file-attributes nil)

を評価。すると、パフォーマンスがもとにもどって、これでヨシ。

コレは何か

GNU Emacs Manual: Windows Files

ここに解説があるように、Windowsファイルシステムに対して、権限の制御などをうまくやってくれる設定のようだ。これを有効にしておくと、理由はわからないけど、VPNでのパフォーマンスに問題が出るようだ。これにnilを設定した場合、上記の制御がきかないので、UNIXDOSファイルシステム差分をうまく制御できなくなるはずなんだけど。。ido-modeやdiredはきちんと動いているように見えた。逆にこれを設定するメリットがわからないほどなんだけど、僕は基本内勤で、VPNは頻繁には使わないので、VPN使うときだけ手動でOFFに設定にするようにしよう。

emacsの思想

松山朋洋氏の「Emacsは死んだ」を読んだ。

Emacsは死んだ

UNIX界隈では、ソフトウェアの哲学が語られるころが多いし、ストールマン御大が開発者として名を連ねているEmacsも何らかの哲学や思想をもってしかるべきだ。しかし現在のEmacsの実装からは、パイプ入出力をほとんど持たない独立した環境を持ってしまっているぶん、いさいさか異形の存在である感がある。

このあたりの話はまつもとゆきひろ氏の記事が詳しい。

まつもとゆきひろのハッカーズライフ:第4回 Emacs対vi (2/2) - ITmedia エンタープライズ

歴史をひもとくと、Emacsは実はUnixの思想のもと生まれたものでなく、Lispの思想から生まれたものらしい。これは他のツールとの親和性があまりないEmacsの、かなり納得のいく説明だと思う。

すると、そういったUnix哲学の中にあるEmacsは、独立した「孤島」の存在であり、今後のバージョンアップの方向はより孤島になっていく事が、予想される。しかし松山氏は、やはりEmacsは外部プログラムに依存し発展すべきだと主張している。

要はSemanticで実現された価値がEmacsに閉じてしまい、社会的価値の増大が図れないのが問題になります。これは「Emacsの思想」に相反するものであり、Eclipseに至る危険な一歩を踏み出した証になります。

Lispのみで完結する環境はひいてはUnix文化への貢献度が下がることを意味する、という主張だ。

僕はWindows、OS-X、LinuxでそれぞれEmacsを用いている身である。その視点からすると、昨今のEmacsの「閉じた」肥大化は非常に歓迎するものがある。外部プログラムにたよるとなると、Windowsでの利用はほぼ絶望的なものになってしまう。なので、むしろ僕はLispで閉じたプラグインを好んで使っている。まさかこのような主張があるとは考えてもみなかった。

自分はEmacsの魅力は全く別のところにあると思っているし、ひとつにはマルチプラットフォームで用いることができるという点も軽んじられるべきではない。まつもと氏の言及するような、Unixの中のLisp思想として独自の進化をしてほしいと願っている。

nonoloop

今更ながらnanoloopで遊んでみた。
nanoloop

Androidだと以下が利用可能だ。
nanoloop - Google Play の Android アプリ

だが、Androidだと、いきなり購入に踏み込まずとも、一旦無料で試す方法がある。Gameboyエミュレータを用いる方法だ。もともとnanoloopGameboy用のシーケンサとして開発されたようだ。そのため、本家からGameboyのROMを入手し、Google Playより別途エミュレータを入手すればすぐに遊ぶことができる。

たとえば、Gameboyだと下記ページより「Demo ROM」をダウンロードすることが可能である

nanoloop one

また、エミュレータはJohn GBC Liteを使っている。端末内から自動的にROMファイルを拾ってくれるため、ダウンロード先などを意識しなくても、使うことが出来る。

John GBC Lite - GBCエミュレータ - Google Play の Android アプリ

プレイ動画も数本見ることができる。これらを見る限り、やはりGameboy実機でのプレイはやはりガジェット感満載で、見てるだけでなかなかおもしろい。

Minimalistic 8-bit techno with Nanoloop & Echo - YouTube

org-modeで日記やブログを書こう

org-modeってのがEmacsの機能にバインドされている。以前にも言及した。
はじめてのorg-mode - Meblog

あれからしばらく使い続けているが、やはりこの機能は素晴らしい。
org-modeはもともとはmark-downのような構造化文書だ。org-modeはEmacsの一つの機能として実装されている。非常に多くの機能を有し、例えば、todo管理にも使えるし、クロックイン、クロックアウトを利用して一日の作業内容を細かにログをとるのにも使える。site-mapの機能を使えば、インデックスつきの立派なブログになってしまう。しかも、当然構造化文書なので、Emacsで閲覧するときには、シンタックスハイライトの効いた、リーダブルなプレーンテキストで扱うことができる。

僕は常々日々の日記をorg-modeで書いている。で、オフラインでhtmlに吐き出して、org-publish-projectってやつでサイトマップを自動生成している。んで、cssで適当に見た目を整える。今のサイトマップの見た目は以下のスクリーンショットみたいになっている。

f:id:gntm_mdk:20160928074226p:plain:w300

ただ、あまり日本では人気がないのか、使用例があまり見当たらなくって、elispの設定に苦労する。

と今まで思っていたのだけど、結構身近に使用例を発見した。

Wurly氏の個人ページ
Wurly's HOMEPAGE

Emacs for Windowsバイナリを配布してくれる親切な人(と書くと誤解があるんだけど)。
なかなかのorg-modeっぷり。このサイトのかなりの部分がorg-modeで書かれている(画面下部postambleを見れば、org-modeによる生成だということがわかる)。

この人はブログと日記を別アプリで行っているようで、日々の日記をorg-modeで書いているようだ。Monotypeによるブログで、ある程度まとまった記事を書こうとしている傾向がつかめる。だが、org-modeのほうもまとまった記事量は多く、結果、あまりブログのほうは更新されていないよう..

こういう人のelispスクリプトは参考になる。僕はelispがかけないからね。。

http://cha.la.coocan.jp/doc/OrgMode.html:OrgMode | Wurly's HOMEPAGE

もちろんこのページ自体もorg-modeで書かれているわけで、非常にお手本になる。

あとはお手本といえば、こことか
Blogging using org-mode (and nothing else)
非常にelispの記述量が多くて参考になった。特に複数の系を扱っているのは、なかなか珍しい例だ。

そういえばるびきち氏のブログもorg-modeベースだった気がする。見た目は完全に何かのブログサービス使ってるんじゃないかと思ってたけど。
「org」タグの記事一覧 | るびきち「新生日刊Emacs」

githubにソースが公開されていて、検索が容易にできるようになっている。これを見ると、org-modeで書かれているのが一目瞭然だ。
GitHub - rubikitch/daily-emacs-jp
htmlに吐き出して、それをペタペタと貼り付けてるのかなあ。結構複雑なスクリプト書いてそうだ。

      • -

自分もあまりに散文的な内容だとHatenaなどのブログサービスよりもorg-modeのほうが書きやすいと感じている。

以前もHatenaでより散文的な内容にしてみたいとさけんだこともあった。。
無題 - Meblog

ブログで見かけるのは、みんな割とかっちりした文書ばっかり。もしくは技術的なメモとか、そんなの(今はQiitaに書くのかな)。僕はそれよりも日記的な、もっと日々のログを残したいし、皆様も残せばいいと思うのだ。

でも、あまりブログサービスは散文的な内容に向いているとは思えない。
入力機能からしてHatenaをはじめとするブログサービスはそのWebのUIに文書作成機能も頼ってしまうことになるので、どうしても文書編集機能が貧弱になりがちだ。
また、最近のブログはテーマ重視の設計になっているのか、ナビゲーションのUXが日々の散文向けになっていない。一昔まえのブログって、そういう日記調の構造でも割りと見やすい設計になっていたと思うんだけど、最近あんまり流行らないのかね.. かといって、昔ながらのブログはあんまり垢抜けてなくって使う気が起こらない。


その点、org-modeなんかだと、自分で色々カスタマイズして、散文を書くことが出来る。スクリーンショットを見てもらえばわかるんだけど、ナビゲーションもこういうのが好みなのだ(Radium Softwareのアーカイブページとかね..)。体裁も気を使わず、ひたすらキーボードを打てばいいからっていうのもなかなかの強みだと思う。

今はローカルのみでひっそりと書いているorg-modeによる日記。しっかりスクリプティングすれば、インデクシングもしてるわけだし、僕もgithubなんかにもあげられると思う。でも、流石に上げるほどの内容でないわけで。妄想で終始しそうだなあ。

Unsupported major.minor なんとか

Android Studioにて、GitやらSubversionからimportしたときに

Cause com/anroid/build/gradle/AppPlugin Unsupported major.minor version 52.0

なんて出た時の対処メモ。

対処方法

上記の意味はJavaの実行バージョンがあってないよーということらしい。
現在の実行バージョンを見るには以下手順

  1. メニューバーから File > Project Structure > SDL Location を選択
  2. JDK Locationを確認

これでJDK Locationを適切なバージョン(上記エラーの場合、1.8)を選んでやると良い。

このエラー、OS-Xでよく出ると思うんだけど、OS-XのJDKが古いせいで頻発する。
具体的には、JDK8が必要なのに、JDK7しか入ってないってわけ。

公式サイトから取ってくるのが良い。
ここで、まじめにやるなら、各環境変数を変更しないといけないんだけど、とりあえず使うだけなら、上記JDK Location変更のみでいけるはず。

ReactiveCocoaでiOSのエンターキーが押されたことを検知する

前座

そして連続投稿。
iOSでエンターキーでフォーカス移すのって鬼門だなー、なんか簡単な方法ないかなーと探してた矢先見つけたもの。

Enterキーを検知する

以下コードで簡単にEnterキーを検知することができる。

ただ、これだけだと、バージョンによっては、なぜか期待動作とならない。画面遷移時にフォームにフォーカスがあたった状態になってしまうのだ。これを改善するのは以下。

Thank you, lukeredpath 氏

AndroidアプリからiOSアプリに移る君たちへ

前座

とある担当アプリがバージョンアップすることになった。自分はAndroid専門なんだけど、上司がやってきて、
Androidアプリの設計がわかるなら、iPhoneアプリもわかるよね^^ じゃあ、次から担当ね!」
なんていうふうに言われ、まんまとiOSの担当になってしまった。

そんな同じような境遇に置かれた悲しき君たちへ贈る。

前提

今回はスクラッチではなく、バージョンアップ。
なので、過去の遺産がある。あるんだけど、残念ながらObjective-c。慣れてくれば悪い言語じゃないが、今更モチベーションの上がらない言語ではある。

Object-c自体は学生時代に少しいじった記憶があるんだけど、もうさすがに忘却してしまっている。まあ、それでも、OS-Xもいじったことのない周りの方々よりも幾分かマシなスタートが切れそう、っていう目論見もあったんだろう。

AndroidからiOS

せっかくAndroidの心得があるんだから、ある程度はショートカットしたい..
さすがに今から「はじめてのiPhoneアプリ」みたいなのをやる気はない、というより、間に合わない。

写経

とはいえ、やはり感覚をつかむための「何か」がほしい。
この目的でApple公式資料を用いて写経した。ところが最近はSwiftに移行し、Appleのドキュメントもそちらよりになってしまっている。そのため、少し古めの資料を使うしかなかった。土日を使って写経したが、やはり資料が古いところもあり、結構時間がかかった。それゆえ、全て写経はできなかったが、それでもかなり役に立ったと思う。特にX-Codeの使い方とか。
http:// https://developer.apple.com/jp/documentation/SecondiOSAppTutorial.pdf

JavaObjective-c

JavaからObjective-cに入るQiitaが何件かあった。正確なところはわからんのだけど、ノリを理解するには十分。こういうのが欲しかったんですよ。
visible true: Java脳でもわかるObjective-C入門
qiita.com

Reactive Cocoa

こうして、X-codeとObjectve-Cのノリをなんとか掴んだのだが、なんと要所要所にReactiveCocoaが使われている。これがなかなか理解を妨げる。
確かに非同期通信するには相当便利なんだけど、Objective-cがままならない時期のReacitiveCocoaは相当きついものがあった。参考資料以外にも色々読んだが、かなり参照したのが以下に示したもの。
qiita.com

以下の記事は公式の翻訳。うまく翻訳されている。
qiita.com

以下が公式のドキュメント。もうObjective-cはLegacyフォルダに入ってしまっている。
github.com

X-code

あと、おまけでX-Codeのショートカット集。X-codeって通常備えておくべき機能が微妙に隠されてたりして、わかりにくいんよね..インデントとかさあ..そのあたりを解決した。
Xcodeでショートカット覚えてないと効率低すぎ | iii ThreeTreesLight

おわりに

で、このプロジェクトはなんとか終焉を迎えた。ReactiveCocoaがReactiveなプログラミングでほとんどはじめてだったので、いい経験だった。Javaだと、こうは書けないよねっていう。
AndroidでもRxJavaが使われていたんだけど、通信部分は違うライブラリが使われてたりして、あんまり運用されていない様子だった。ボタンも全部インタフェースだったし。一方でiOSはボタンのイベントや通信部分まで至るところにReactiveCocoaが使われていた。ふうむ、親和性が高いのかねえ。

今回は、Androidアプリの対応をし、iOSアプリの対応をこの順で行った。上司はAndroidユーザなので、iOSアプリには興味を示さなかったというオチ..