技術memo

関数型ゴースト

これまで触ってきたプログラミング言語について語った(2017/09時点)

#いいねされた数だけ触ってきたプログラミング言語について語る ってしようと思ったら、いいねされた数が触ったことのわずかでもある言語の数を上回ってしまった話のまとめです。

順不同。 言語の(+1)(-1)(+-0)は、今後触りたい(+1)か否(-1)かの点数ということで。

1. C (+-0)

学部の卒論でコマンドラインツール作成に使ってそれきり。メモリ管理とデバッグがつらぽよの思い出。ビルド周りわからん。ソフトウェア技術者やってる限り逃れられないものは感じる。

2. C# (+1)

業務経験上一番得意ということになっている。LINQ to Objectsにハマったのが技術沼に落ちたきっかけで、個人的に重大な言語。 .NET 1.1はもう嫌。ASP .NET WebFormsもWinFormsもやめたい。ConfigureAwaitつらい。でも書ける。最新、最近の言語機能は実はあんまり追えてない。

3. F# (+1)

Linq to Objects楽しい!って言ってたら気づいたら始めてた。実行環境を選ばなければ今のところ一番ラクに書ける言語。F# スクリプトペラ一枚で実行できる環境もっとほしい。 |> は空気。私の名古屋行きの直接の原因。

4. Java (+-0)

経験あるのはバージョン7だけ(StreamAPI使いたいって言ったら導入まだ無理言われた)。ビルド環境わからない。普通にOOPできて型チェックもあり、巷で言うほどそこまでストレスない。何はともあれJVMなので実運用で困っても先人の知見はたくさんあってラク。

5. Groovy (+-0)

JenkinsとGradleのための言語という認識が拭えず。Gradleすごいべんり。困ったらJava的に書けばいいからラク。書けて損しない。言語自体はあんまり。Groovyといえばきょんさん

6. Javascript (+-0)

jQueryエンジニア(つらい)。最近Vue.jsをはじめた。thisの参照で迷子になりがち。Chromeのコンソールと開発者ツールがべんり。WebGUIやるなら逃れられない感。最近のビルド、構成周り全くついていく気がしない。

7. Python (+1)

実務経験では2系only。Rubyより好き。reSTは今となっては名前で損してる感。lambdaに式しか書けない、むしろ文と式の区別があるのがつらい。デコレータやリスト内包でヒャッハーしてたら「読めねえ」って叱られた思い出。Windows捨てたい。

8. Scheme (+1)

処理系いろいろ。君だけの最強の処理系をつくろう!(実装経験なし)。仕様がコンパクト(読んでない)だし関数型で書き易いので好き。業務で使うには不安なのでトレーニングしたい。ビルド環境周り自分で面倒みれないと厳しそう。

9. Ruby (+-0)

Railsは便利だけど文化(?)は好かない。RSpecべんりでスゴい。ネットに蔓延る駄情報つらいし結局ソース読む。言語仕様が難しくてときどき脳内parseできない。

10. シェルスクリプト (+-0)

言語といっていいのかアレだけど。sedたのしい。ワンライナーでリスト処理するのは関数型っぽくて好き。ある程度は書けて当然扱い(つらい)。Windows捨てたい。

11. SML (+1)

オブジェクト指向要素のない関数型言語(要出展)。スタンダードというわりに普及してない(要出展)。私が書くとF# のクセで色々間違えがち。SML# はかわいい。

12. Scala (+1)

Hello Worldプラスアルファくらい。言語の使い勝手はRubyというか、Better C# な感じ。zはわからない。関数型というかOOPLとして便利だと思う。ビルド時間は金で殴りたい。

13. Haskell (+1)

Hello Worldくらい。聞き齧りの知識ばかり増える。モナモナ。関数型怖いって言われがちなの殆どScalazとHaskell狂信メンのせいだと思うけど(要出展)、実際怖くない。 stackは神。pandocべんり。

14. Clojure (+1)

Hello Worldくらい。Lispで関数型。immutable基本だし肌に合いそう。括弧こわくない。

15. PHP (-1)

実務経験を職務経歴書に書きたくない。言語仕様が謎。Cakeの思い出。

16. Common Lisp (+1)

Hello World程度。どちらかといえばScheme派なので敬遠してる。実用向け。すごくつよい使い手がゴロゴロいるイメージ。

17. VBScript (-1)

.NET 1.1のダークサイド。解説書を読んでみて何か違うと思ったら、解説書はクライアントサイド、使われてるのはサーバーサイドだった罠。ほんと無理。ジェネリクスのないC# ですら神々しく思えるレベル。

18. (Excel)VBA (-1)

VBって名前につくプログラミング言語は書けないということにしているので書けません。

19. Perl (+-0)

業務使用歴1日。最近だとモダンでいい感じの言語になったと噂で聞くけど、やる気はあまりない。コマンドラインワンライナー書くのに便利らしいのでそういう意味ではモチベある。

20. EmacsLisp (+-0)

設定用言語。Emacs使いなので逃げられない。設定をいい感じにまとめようとして関数抽出して直したりしてたら数時間吹っ飛んでて時間泥棒。自分で拡張書いたりまでする気はあまりしない。Windows捨てたい。

21. VB .NET (-1)

VBって名前につくプログラミング言語は書けないということにしているので以下同文。 .NET な時点でかなり救いがある。特殊な理由がなければC# にしたい。

22. OCaml (+1)

Hello World程度。名古屋の公用語。F# 以外で何かと言われたら一番書きやすそうな気がする。モジュールとか多相バリアントとかイケてるので、そのうちちゃんとやりたい。

23. Powershell (-1)

言語なのかどうなのか。普段使いならgit bashの方が楽なのであまり真面目に使う機会はなく、Azureのコマンド叩くの専用。モナモナ*1。エラー処理の実装でハマりまくった思い出。

24. バッチ(Windowsのアレ) (-1)

必要に迫られてなんとなくそれっぽい感じに書いてみるやつ。単にコマンドを並べる以上のことをやると死ぬ。rem。

25. Hy (+1)

Python上でLispが書けると聞いてHello Worldした。イカ。気になってるけど使う機会はまだない。

26. SQL (+-0)

SELECT文でJOINしまくったりサブクエリや集計頑張るの楽しい。但し保守者は死ぬ。チューリング完全?ちょっとよくわからないですね……

27. PL/SQL (-1)

書けないけど書かされるやつ。みんな大好き業務バッチ。書けない。テストがしづらくてとても厳しい。

*1:Powershellの開発中のコードネームがモナドだったとか聞きました。

キーカスタマイズツールKeyhacと日本語入力システムSKKがオススメだけどオススメしづらい話

Keyhacの話

WindowsMac限定ですけど、Keyhacって常駐アプリがあります。

たとえば通常ではCtrl+cでテキストやファイルをコピーするところを、Alt+wでコピーするように変更したりできます。 つまり、Emacsキーバインドに洗脳されてしまった人がOS全体の操作感をEmacs風にできます。オススメ層が狭いですね。 まあそれに限らず、どこでも使えるクリップボード履歴が便利なので、それだけでもオススメだとは思います。

設定は Windows の操作を emacs のキーバインドで行うための設定 (Keyhac版) - NTEmacs @ ウィキ - アットウィキを参考にしてやるといい感じです。でもどうしてwikiなんでしょうか、githubにでも上げてほしいです。

私は最近は開発にEmacsを使うことも増えたのでそこまで不便してないのですが、.NET開発だとVisual Studioなので、キーバインドが辛いという問題がありました。 ここにも以前XKeymacsがおすすめと書いたのですが、なぜだかどうにも処理が不安定なことがあり、最近はKeyhacを常用しています。

設定がファイル(Pythonコード)で保存できるのもいいかんじですね。設定をdotfileリポジトリにアップしておいて自動で同期とか、そこまではちょっとできてないのですが、今後の課題です。設定ファイルのパスを環境変数で指定したりできないんでしょうか。よくわかりません。

SKKの話

日本語入力するとき、皆さんMSIMEとかGoogleIMEを使っていると思うんですけど、SKKという種類のものに最近(ここ1年くらい)はまっています。

入力時に、たとえば「私は走る」って入力しようと思ったら watashi<space>(変換候補を選ぶ)<enter>ha<enter>hashiru<space>(変換候補を選ぶ)<enter> みたいに入力するのが普通です。それがSKKだとWatashi<space>(変換候補を選ぶ)haHashiRu(変換候補を選ぶ)<enter> みたいに入力します。くわしくはググってください。SKKとは (エスケイケイとは) [単語記事] - ニコニコ大百科このあたりとか。

特徴としては以下です。

  • 送り仮名位置の指定を大文字入力にします(例: HashiRu → 走る)
  • 漢字変換しないときはひらがなモード、カタカナモードで変換なしに入力し続けられます
  • 変換候補の選択がしやすいです
    • 直近2, 3候補で出なければ一覧表示され、ホームポジションのどれかのキーで確定するか、ページ送りできます
    • 使用した変換候補は次の変換時には上位に表示されるようになるので、多用する変換はラクになります
  • 辞書の登録、削除がスムーズです
    • 変換候補が一番最後まで無かった場合、自動で登録処理に移ります
    • 削除する場合は変換候補を選択している状態で特定のキーを押すだけです
  • 中毒性があります
    • もう普通の入力には戻れません
  • typoや誤変換が減ったりはしません
    • 一緒に仕事してるチームメンバー複数の証言があります

実際にインストールするツールとしては、OSや環境によって複数の選択肢がありますが、例えば以下です。

CorvusSKKだとカタカナモードからCtrl+jでひらがなモードに戻るのですが、ibus-skkだとそうはならないので、そこだけは慣れでカバーするしかないかなあと思っています。

オススメしづらい話

どちらもマシン全体のキー操作に影響するツールなので、慣れると便利ですが、他の人に操作を替わるときには戸惑いがあります。 解決策としては、一時的にKeyhacやSKKをオフにするとか、周りの皆をSKKユーザーにする等があります。

こまってる話

WebブラウザでもEmacs風のキーバインドにしたいとか、マウスにあまり触れずに操作したいという欲求はあるのですが、Chromeだとあまりいいかんじのソリューションが見当りません。 FirefoxならKeySnailがあったのですが、それも開発が続く(続いている)のか怪しいですし……。

Keyhacが動作しているときはブラウザ上でもさほどストレスないのですが、対応外のOSでは代替案がないです。 こまりました。

雑な感じですけど、とりあえずこんなところで。

Spacemacsを使い始めた話 #emacs #spacemacs

Spacemacsってなに?

  • Emacsの拡張(魔改造?)
  • 全体的に人間に優しくなった(キーボードショートカットのサジェストとか出たりする)
  • 設定管理をいいかんじにしてくれる(layerシステム)
  • キーバインドVim(Evil)かEmacsか選べる
    • 私はEmacsバインドで使ってます

おすすめする理由

  • 素のEmacsよりはいろいろ親切(上記)
  • とりあえず各種プログラミング言語IDEとか覚えなくても開発し始められて便利
    • デバッガとかは諦めてください
    • Emacsキーバインドに洗脳されることさえ受け入れれば入力で迷わなくなります
      • Vim派でもEvilなら大丈夫(たぶん)
  • (Spacemacsに限った話ではないけど)ターミナルまでEmacs上で操作できるようになってくると、マウス触ることがほぼなくなるくらいにはキーボードだけで操作できる時間が増えてうれしいです
  • Vim派のひとと宗教戦争(笑)でネタにできて楽しいです(冗談です)

導入方法

めんどうなのでググってください

使っててオススメの拡張

利用中のバージョンはSpacemacs 0.200.7、Emacs 24.5.1、Ubuntu 16.04.2 LTS(デスクトップ)です。

もろもろ検索 ivy

Spacemacsのデフォルトではhelmが推奨ですが、ivy(swiper)もいい感じに動いてくれます。 migemoローマ字入力でいいかんじに日本語を検索してくれるやつです。 ivyでmigemoを使うのにググってもよくわからなかったのですが、avy-migemo-e.g.swiperでいいみたいです。 cmigemoは別途インストールしてください。 クリップボード履歴の検索はcounselってやつみたいです。

設定

  • dotspacemacs-configuration-layersに ivy
  • helm関連のデフォルト設定は全部コメントアウト
  • dotspacemacs-additional-packagesに avy-migemo
  • dotspacemacs/user-configで以下
  ;; migemo
  (require 'migemo)
  (setq migemo-command "cmigemo")
  (setq migemo-options '("-q" "--emacs" "-i" "\a"))
  (cond
   ((eq system-type 'darwin)
    (setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
    )
   ((eq system-type 'gnu/linux)
    (setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
    )
   ((eq system-type 'windows-nt)
    (setq migemo-dictionary "c:/app/cmigemo-default-win64/dict/utf-8/migemo-dict")
    ))
  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  ;; initialize migemo
  (migemo-init)
  ;; avy-migemo
  (require 'avy-migemo)
  (avy-migemo-mode 1)
  (require 'avy-migemo-e.g.swiper)
  ;; M-yでkill-ring履歴から検索
  (global-set-key (kbd "M-y") 'counsel-yank-pop)

シェル multi-term

Emacs上でシェルを動かす場合はいくつか選択肢があるのですが、なんかよさそうだったのでmulti-termにしてみました。 シェル上でのコピペがつらいなーという感じだったのですが、コピーしたいときはモード切り替えするのが無難みたいです。 Windows上でシェルを動かすのは諦めたので、もっぱらUbuntuでしか使ってないです。

設定

  • dotspacemacs-configuration-layersに shell
  • dotspacemacs/user-configで以下。キーバインドはお好みで。
  ;; multi-term
  ;; emacs に認識させたいキーがある場合は、term-unbind-key-list に追加する
  (require 'multi-term)
  (dolist (x '("C-q"))
    (add-to-list 'term-unbind-key-list x))
  ;; terminal に直接通したいキーがある場合は、term-unbind-key-listからdeleteする
  ;(dolist (x '("C-c"))
  ;  (delete x term-unbind-key-list))
  ;; term-mode-hook
  (add-hook
   'term-mode-hook
   '(lambda ()
      (define-key term-raw-map "\C-h" 'term-send-backspace)
      (define-key term-raw-map "\C-y" 'term-paste)
      (define-key term-raw-map term-view-toggle-key 'toggle-term-view)))
  ;; C-q c で multi-term を起動する
  (define-key ctl-q-map (kbd "c") 'multi-term); 事前に (defvar ctl-q-map (make-keymap)) (define-key global-map (kbd "C-q") ctl-q-map) とかしてるのが前提なので普通は global-set-keyとかでいけるはずなので適当にしてください
  ;; C-t で term-mode と fundamental-mode + view-modeを切り替える
  (setq term-view-toggle-key (kbd "C-t"))
  (defun toggle-term-view () (interactive)
         (cond ((eq major-mode 'term-mode)
                (fundamental-mode)
                (view-mode)
                (local-set-key term-view-toggle-key 'toggle-term-view)
                (setq multi-term-cursor-point (point)))
               ((eq major-mode 'fundamental-mode)
                (View-exit)
                (goto-char multi-term-cursor-point)
                (multi-term-internal))))

ファイルツリーをEmacs上で見る neotree

spacemacsのデフォルトで使えます。 M-x neotreeとかやると起動します。面倒ならglobal-set-keyしてください。 M-x neotree-dirまたはneotreeのバッファ上でC-c cとやるとツリー表示のルートディレクトリを移動できます。 neotreeのバッファに移動してからのswiperでのバッファ内検索が本当に捗るのでおすすめです。そうでもないか。

その他雑感

あとは各言語のlayerいれたりキーバインドをいじったりしてるくらいです。 オレオレレイヤーは作らずに、dotspacemacs/user-configを秘伝のタレ置き場として雑につかっても、とりあえずなんとかなってます。

ところでキーバインドでC-hをバックスペースにしたい派なんですが、その場合spacemacsキー(EvilのひとはSPC, Emacsバインドの人はM-m)を押したときのヘルプのページングとバインドが被ります。いろいろ試したんですが、とりあえず下記にしたらうまくいきました。理由はよくわかりません。とりあえずC-hかF1押しておけばいいかんじに解釈してくれます。

  (global-set-key (kbd "C-h") 'delete-backward-char)
  (global-set-key (kbd "<F1>") help-map)

あとWindows10でNTEmacs使ってる場合、M-mを押すとウィンドウが最小化されて「ウオアアアアア!!!」ってなるんですが未解決です。たすけてください。

とりあえずこんなところで。