08 Jan 2017, 04:24

coursera で Programming Languages を受けた

coursera で Programming Languages を受けた。

概要

ワシントン大学の CS のコース。3 つの言語、SML、Racket、Ruby を通じて、プログラム言語のエッセンスを学ぶというコース。

なぜこの3つの言語かというと、以下のようなマトリックスで説明される。

                dynamically typed   statically typed

functinal Racket SML object-oriented Ruby Java/C#/Scala

  • ML: polymorphic type, pattern-matching, abstract type & module
  • Racket: dynamic typing, “good” macro, minimalist syntax, eval
  • Ruby: classes but not typed, very OOP, mixens

つまり、関数型言語、オブジェクト指向言語、動的型付け、静的型付けを バランスよく学ぶためにこの3つが選ばれたのだ。

講義は、関数型言語、オブジェクト指向言語、動的型付け、静的型付け の各特徴を比較しながら、コンセプトを解説していく。

感想

とてもハードな内容だった。StudyPlus で勉強時間を記録していたのだけれども、 各コースにかかった時間は以下のとおり. 150時間くらい。

  • Part A 72h
  • Part B 33h
  • Part C 52h

Assignment の目安は 3 時間となっているけれども、とてもそんな時間ではできなかった。

A,B,C を平行して受講したので、年末年始地獄を見た。全然時間が足りない。 1 日 12-15 時間くらいこれにかかりきりだった。

Assignment も難しく、何度もカンニングした。 本当は自力でときたかったけれども、力足らず解けなかった。 しかし、Assignment の内容は骨のある楽しい内容だった。詳しくは後述。

英語力がないことを痛感。 いろいろと力説していることの意味が把握できなかった。 この一年、英語力の向上に力を入れてきたのだけれども、それでもほとんどダメ。

関数型言語、オブジェクト指向言語、動的型付け、静的型付け、それぞれの特徴や比較が 興味深かった。言語もいろいろな特徴があり、一長一短あることを知った。

Emacs をエディタとして推奨しているところがいい。Emacs Love.

Part A

言語は Standard-ML を使う。 なぜなら、文法がシンプルで、初学者に使いやすいからとのこと。

SML を利用して、関数型ブログラミングのエッセンスを学んでいく。

week1

week1 では、プログラミングはしない。 コースの説明と、環境設定(Emacs や SML のインストール)まで。

week2

SML の基本文法を学ぶ。

  • 変数宣言
  • 関数宣言
  • if - then - else
  • 変数のスコープと内部変数(let)

基本データ型についても学ぶ

  • Pair
  • List
  • Tuple
  • Option(これが特殊)

Assignment は日付に関する関数を作成していく問題。これは難しくなかった。

week3

  • データ型(Datatypes)
  • パターンマッチ
  • 例外
  • 末尾再帰

パターンマッチの便利さに開眼。

Assignemnt は、文字列操作に関する関数を作成していく問題。

week4

  • 第一級関数
  • 高階関数
  • 関数クロージャ
  • 無名関数
  • map,filter
  • レキシカルスコープ

week5

  • type interface(型推論, ポリモーフィズム)
  • Mutual Recursion
  • modules
  • equivalence
  • Exam

Part B

Lisp 系の言語はいろいろ経験がある(Common Lisp ,Scheme, Emacs Lisp,Clojure) ので、それほど苦戦することはないだろうと思っていたが、とても苦戦した。

なにが苦戦したかというと、

week1

  • Racket の文法(cons, car , cdr … etc)
  • 遅延評価
  • ストリーム
  • メモ化再帰
  • マクロ(Optional)

Assignment でやたらとストリームが出てくる。手強かった。

week2

  • struct
  • インタープリタとコンパイラ
  • インタプリタの実装方法

Assignment は、MUPL という独自言語のインタプリタを Racket で書くこと。 意味が分からなすぎて泣きそうになった。

Honor Code とかもうどうでもいい(どうでもよくはないが・・)

github にある他人のソースコードを読んで理解するのがやっとだった。(理解すらできない!)

week3

  • 動的型づけ言語と 静的型づけ言語の比較.
  • Exam

Part C

week1

  • Ruby の文法
  • Duck Typing
  • Arrays, Hashs
  • block, proc
  • SubClass
  • Overriding, Dynamic Dispatch

Ruby は業務で使ったことがあるので、文法は問題なし。

assignment は テトリスのゲームの仕様拡張。 動作するコードが与えられて、継承を使って機能を追加する。 コードを読む力が試される。

と、ここでさっそくサンプルが動かない!Ruby2.3 では動かないみたい。 親切なおじさん現れて、解決用のスクリプトを公開してくれていた。

week2

  • Function Decomposition
  • Double dispatch
  • Multiple Inheritance
  • Mixins
  • Interfaces

Assignment は SML(FP)でかかれたコードを Ruby(OOP)にポートする。

week3

  • Subtyping
  • Final Exam

サブタイピングにについては、意味不明だった。

日本語情報もほとんどないから理解は諦めた。

最後に

今回、初めて MOOC にお金を払ってコースを受講した。 なぜなら、現在休職しているのだが復職の条件の一つがプログラミングの勉強をすることだからだ。 なので、certification があれば、プログラミングの勉強をしたという証明になると思った。

普段は途中で諦めてもいいやと思って受講していたけれども、お金を払うとやる気がでるね。

取得した cartification は以下。

07 Jan 2017, 09:40

babel-loader:org-mode で init.el を管理する方法

私の現時点での.emacs 管理方法を紹介します。リポジトリは以下です。

org ファイルがならんでます。そうです!

emacs の設定ファイルを org-mode で管理しています。

org-mode で書いた設定ファイルを hoge.org -> hoge.el に変換しています。

それを可能にするパッケージが、babel-loader です。

org-mode で init.el を管理することで得られる 7 つの恩恵

benel-loader は init-loder と組み合わせることによって、効果を発揮します。 hoge.org -> hoge.el に変換したファイルを init-loader によって、 一つずつロードしていくからです。

rubikitch さんが以下のような記事を年末に書きました。

それにならって、org-mode で init.el を管理することの恩恵を考えて見たいと思います。

  1. 説明をコメントとして書かないですむ。… ;; で説明をコメントアウトする見苦しさとはおさらば。
  2. 説明とコードを一緒に 一元管理できる。… Run Book Automation です。
  3. org-mode に慣れていれば説明を書きやすい。… I love org-mode!!
  4. org-mode の折りたたみ機能によって、階層的に設定を管理できる。
  5. 設定ファイルがブログ記事になる … こんな感じです。Emacs プログラミング言語開発環境 | Futurismo
  6. 読みやすい。他人に見せやすい。… とくに github にあげるといい感じにシンタックスハイライトしてくれる。
  7. 書いていて楽しい!!

私の Emacs 起動方法

以下、自分き Emacs の起動順序について抜粋しながら書く。

フォルダ構成

フォルダ構成はこんな感じ。

.emacs.d
  |- init.el ... 一番初めに起動されるファイル
  |- inits ... org ファイルが入っているディレクトリ
       |- 00_init.org
       |- ....
       |- 90_color.org
  |- el-get
      |- repo 
          |- el-get 
          |- el-get で取得したパッケージ群
      |- user-recipes ... el-get 用の自分のレシピ

init.el: el-get

まずは、el-get を一番初めにダウンロードする。

;; el-get ロードパス設定
(add-to-list 'load-path (locate-user-emacs-file "el-get/repo/el-get"))

;; ダウンロードした elisp 置き場
(setq el-get-dir "~/.emacs.d/el-get/repo")

;; ダウンロードしていないときはダウンロード
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "http://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))

;; 初期化処理用
(setq el-get-user-package-directory "~/.emacs.d/el-get/init-files")

;; レシピ置き場
;; 追加のレシピ置き場
(add-to-list 'el-get-recipe-path "~/.emacs.d/el-get/user-recipes")

init.el: org-mode

org-mode を読み込む。load-path に

;; org-mode/lisp, org-mode/contribe/lisp をロードパスに追加する
(let* ((org-dir (expand-file-name
                 "lisp" (expand-file-name
                         "org-mode" el-get-dir)))
       (org-contrib-dir (expand-file-name
                         "lisp" (expand-file-name
                                 "contrib" (expand-file-name
                                            ".." org-dir)))))
  (setq load-path (append (list org-dir org-contrib-dir)
                          (or load-path nil))))
(require 'org)

init.el: init-loader

(el-get-bundle emacs-jp/init-loader)

;; バイトコンパイルする
;; 初めのバイトコンパイルは手動で実施する必要がある
(setq init-loader-byte-compile t)

;; エラー発生時にだけ log を開く
;; (setq init-loader-show-log-after-init t)
(setq init-loader-show-log-after-init 'error-only)

init.el: babel-loader

el-get で babel-loader をインストール

(el-get-bundle takaishi/babel-loader.el)
(add-to-list 'load-path (locate-user-emacs-file "el-get/repo/babel-loader.el"))
(require 'babel-loader)

;; インデント保持
;; これをしないと 変換された elisp ファイルのインデントがずれる.
(setq org-src-preserve-indentation t)

;; inits 配下の org ファイルを elc に変換して読み込み.
(bl:load-dir "~/.emacs.d/inits/")

inits:00_init.org フォルダを再帰的にロードパスに追加

;; @ load-path
;; for Emacs 23 under
(defvar user-emacs-directory "~/.emacs.d")

;; load-path の追加関数
(defun add-to-load-path (&rest paths)
  (let (path)
    (dolist (path paths paths)
      (let ((default-directory (expand-file-name (concat user-emacs-directory path))))
    (add-to-list 'load-path default-directory)
    (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
        (normal-top-level-add-subdirs-to-load-path))))))

;; load-path に追加するフォルダ
;; 2 つ以上フォルダを指定する場合の引数 => (add-to-load-path "elisp" "xxx" "xxx")
(add-to-load-path "elisp" "inits" "el-get" "local" "mylisp")

inits:00_init.org: use-package

パッケージ管理のパッケージ

(package-initialize nil)
(el-get-bundle use-package)

;; use-package が存在しないときはなにもしない
(add-to-list 'load-path "~/.emacs.d/el-get/repo/use-package")
(unless (require 'use-package nil t)
  (defmacro use-package (&rest args)))

inits:00_init.org: el-get 同期 Package

el-get で自動にインストールするパッケージをひたすら列挙。

(defvar my/el-get-packages-all
  '(
    ;; 03_display
    popwin
    switch-window
    isearch-dabbrev
    ;; open-junk-file
    iy-go-to-char
    key-chord
    jump-char
    recentf-ext
    stripe-buffer

    ;; 20_text
    hydra
    swiper
    yasnippet
    dired-k
    migemo
    undo-tree
    define-word
    auto-complete
    anzu
    auto-highlight-symbol
    highlight-symbol
    multiple-cursors
    bm
    emacs-async
    pcre2el
    ht
    iedit
    codic
    search-web
    wgrep
    expand-region
    ag
    auto-capitalize
    omni-kill

    ;; 以下省略
    )
  "A list of packages to install from el-get at launch.")

inits: 00_init.org el-get config

;; 通知は minibuffer のみ
(setq el-get-notify-type 'message)

;; パッケージをインストール
(el-get 'sync my/el-get-packages-all)

inits: 01_global.org … 90_color.org

babel-loader によって、次々と org ファイルを el に変換して読み込んでいく。

Special Thanks

01 Jan 2017, 18:23

タグ管理が徹底した爆速メールシステム!Emacs の notmuch で Gmail を読む

motmuch というメールシステムを導入したので、導入手順をまとめます。

notmuch とは

notmuch とは、タグベースの高速検索メールシステムだ。

タグベースというところが気にいって、今回試してみた。

日本語情報が皆無なので、先駆者になれるかと思って使ってみる。

前回、同じコンセプトのタグ管理メールシステム mu4e について調べた。

今回は、ライバルの notmuch ということだ。

環境

<div id="text-orge333d36" class="outline-text-3">
  <ul class="org-ul">
    <li>
      Ubuntu 16.04 LTS
    </li>
    <li>
      notmuch 0.23.4… タグづけツール
    </li>
    <li>
      Offlineimap 6.6.1 … ローカルディレクトリとリモートフォルダを同期するツール
    </li>
    <li>
      msmtp 1.6.6… smtpmail を軽量化したメール送信用ツール
    </li>
  </ul>
</div>

インストール方法

Ubuntu にインストールする。

[sourcecode language=”bash” title=””]
sudo apt-get install notmuch
[/sourcecode]

端末上で notmuch setup を入力すると、簡単なガイダンスが始まる。

質問に答えていく。mkdir ~/mail で notmuch 用のフォルダを作成。

そのあと、notmuch new と入力する。.~/mail/.notmuch という DB フォルダが作成される。

Emacs Frontend Interface の導入

notmuch は Emacs 専用ソフトではない。いろんなフロントエンド I/F が用意されている。 (cli, vim, emacs, mutt)

しかし、Emacs でメールを閲覧することが目的なので、Emacs I/F をインストールする。

git repository からインストールすることが推奨されている。

[sourcecode language=”bash” title=””]
sudo apt-get install libxapian-dev libgmime-2.6-dev libtalloc-dev zlib1g-dev python-sphinx
git clone git://notmuchmail.org/git/notmuch
./configure
make
make install
[/sourcecode]

notmuch の Emacs 設定

[sourcecode language=”emacs-lisp” title=””]
(require ‘notmuch)
[/sourcecode]

メールを受信する

Offlineimap

<div id="text-org5a40e6d" class="outline-text-3">
  <p>
    IMAP サーバーからメールを同期する Python ユーティリティ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinuxjp.org/index.php/OfflineIMAP">OfflineIMAP &#8211; ArchWiki</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> sudo apt-get -y install offlineimap<br /> [/sourcecode]
  </p>

  <p>
    ~/.offlineimaprc を作成する。ここでは、Inbox と Notes と Drafts を同期するように設定している。
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> [general]<br /> accounts = main
  </p>

  <p>
    [Account main]<br /> localrepository = main-local<br /> remoterepository = main-remote
  </p>

  <p>
    [Repository main-local]<br /> type = Maildir<br /> localfolders = ~/mail/Gmail
  </p>

  <p>
    [Repository main-remote]<br /> type = Gmail<br /> # maxconnections=1<br /> remoteuser = fox10225fox@gmail.com<br /> remotepass =<br /> # realdelete=no<br /> folderfilter = lambda foldername: foldername in ["INBOX", "Notes", "[Gmail]/Drafts"]<br /> sslcacertfile = /etc/ssl/certs/ca-certificates.crt<br /> [/sourcecode]
  </p>

  <p>
    ターミナルより、offlineimap を入力することで、メールボックスを同期できる。
  </p>
</div>

<div id="outline-container-orga70d1d5" class="outline-4">
  <h4 id="orga70d1d5">
    パスワードをかくす
  </h4>

  <div id="text-orga70d1d5" class="outline-text-4">
    <p>
      設定ファイルは github で管理したいのだが、パスワードを晒すわけにはいかない。 netrc が使える。
    </p>

    <p>
      [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> touch ~/.netrc<br /> chmod 600 ~/.netrc<br /> [/sourcecode]
    </p>

    <p>
      .netrc の中身は次の通り。
    </p>

    <p>
      [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> machine imap.gmail.com<br /> login fox10225fox@gmail.com<br /> password<br /> machine smtp.gmail.com<br /> login fox10225fox@gmail.com<br /> password<br /> [/sourcecode]
    </p>
  </div>
</div>

<div id="outline-container-org4f75ad7" class="outline-4">
  <h4 id="org4f75ad7">
    デーモン化
  </h4>

  <div id="text-org4f75ad7" class="outline-text-4">
    <p>
      offlineimap を定期的に動作させるためには、systemd サービスに登録する必要がある。 以下の wiki に手順が載っている。
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://wiki.archlinuxjp.org/index.php/OfflineIMAP#.E3.83.90.E3.83.83.E3.82.AF.E3.82.B0.E3.83.A9.E3.82.A6.E3.83.B3.E3.83.89.E3.81.A7_offlineimap_.E3.82.92.E5.AE.9F.E8.A1.8C">OfflineIMAP &#8211; ArchWiki</a>
      </li>
    </ul>

    <p>
      または、.offlineimaprc の[Account]欄に以下を書く。
    </p>

    <p>
      [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> autorefresh = 1<br /> [/sourcecode]
    </p>

    <p>
      cron に登録してもよい。
    </p>
  </div>
</div>

<div id="outline-container-org1304050" class="outline-4">
  <h4 id="org1304050">
    Post-sync hook
  </h4>

  <div id="text-org1304050" class="outline-text-4">
    <p>
      メールを受信したら、notmuch new を動作させて、インデックスを作成する。
    </p>

    <p>
      .offlineimaprc の[Account]欄に以下を書く。
    </p>

    <p>
      [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> postsynchook = /usr/bin/offlineimap-postsync<br /> [/sourcecode]
    </p>

    <p>
      offlineimap-postsync というスクリプトを作成する。そのなかに notmuch new と書く。
    </p>

    <p>
      以下のファイルが参考になる。 この例では、notify-send で通知を表示したりログしたりしている。
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://github.com/cbancroft/config/blob/master/mail/lib/offlineimap-postsync.sh">https://github.com/cbancroft/config/blob/master/mail/lib/offlineimap-postsync.sh</a>
      </li>
    </ul>
  </div>
</div>

メールを検索する

基本は、search 欄にキーワードを入れて検索する。

helm-i/f がある。

メールを送信する

msmtp を使う。

[sourcecode language=”emacs-lisp” title=””]
$ git clone git://git.code.sf.net/p/msmtp/code msmtp
$ cd msmtp
$ autoreconf -i
$ ./configure; make; make install
[/sourcecode]

.emacs の設定は以下の通り。

[sourcecode language=”emacs-lisp” title=””]
;; use msmtp
(setq message-send-mail-function ‘message-send-mail-with-sendmail)
(setq sendmail-program "msmtp")
;; tell msmtp to choose the SMTP server according to the from field in the outgoing email
(setq message-sendmail-extra-arguments ‘("–read-envelope-from"))
(setq message-sendmail-f-is-evil ‘t)

;; don’t keep message buffers around
(setq message-kill-buffer-on-exit t)
[/sourcecode]

Tips

ショートカット

<div id="text-org2fea8e0" class="outline-text-3">
  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (define-key notmuch-show-mode-map "\C-c\C-o" &#8216;browse-url-at-point)
  </p>

  <p>
    (define-key notmuch-search-mode-map "g"<br /> &#8216;notmuch-poll-and-refresh-this-buffer)<br /> (define-key notmuch-hello-mode-map "g"<br /> &#8216;notmuch-poll-and-refresh-this-buffer)
  </p>

  <p>
    (define-key notmuch-search-mode-map "d"<br /> (lambda ()<br /> "toggle deleted tag for thread"<br /> (interactive)<br /> (if (member "deleted" (notmuch-search-get-tags))<br /> (notmuch-search-tag &#8216;("-deleted"))<br /> (notmuch-search-tag &#8216;("+deleted" "-inbox" "-unread")))))
  </p>

  <p>
    (define-key notmuch-search-mode-map "!"<br /> (lambda ()<br /> "toggle unread tag for thread"<br /> (interactive)<br /> (if (member "unread" (notmuch-search-get-tags))<br /> (notmuch-search-tag &#8216;("-unread"))<br /> (notmuch-search-tag &#8216;("+unread")))))
  </p>

  <p>
    (define-key notmuch-show-mode-map "d"<br /> (lambda ()<br /> "toggle deleted tag for message"<br /> (interactive)<br /> (if (member "deleted" (notmuch-show-get-tags))<br /> (notmuch-show-tag &#8216;("-deleted"))<br /> (notmuch-show-tag &#8216;("+deleted" "-inbox" "-unread")))))
  </p>

  <p>
    (define-key notmuch-search-mode-map "a"<br /> (lambda ()<br /> "toggle archive"<br /> (interactive)<br /> (if (member "archive" (notmuch-search-get-tags))<br /> (notmuch-search-tag &#8216;("-archive"))<br /> (notmuch-search-tag &#8216;("+archive" "-inbox" "-unread")))))
  </p>

  <p>
    (define-key notmuch-show-mode-map "a"<br /> (lambda ()<br /> "toggle archive"<br /> (interactive)<br /> (if (member "archive" (notmuch-show-get-tags))<br /> (notmuch-show-tag &#8216;("-archive"))<br /> (notmuch-show-tag &#8216;("+archive" "-inbox" "-unread")))))
  </p>

  <p>
    (define-key notmuch-hello-mode-map "i"<br /> (lambda ()<br /> (interactive)<br /> (notmuch-hello-search "tag:inbox")))
  </p>

  <p>
    (define-key notmuch-hello-mode-map "u"<br /> (lambda ()<br /> (interactive)<br /> (notmuch-hello-search "tag:unread")))
  </p>

  <p>
    (define-key notmuch-hello-mode-map "a"<br /> (lambda ()<br /> (interactive)<br /> (notmuch-hello-search "tag:archive")))<br /> [/sourcecode]
  </p>
</div>

org-mode 連携

<div id="text-org56c985d" class="outline-text-3">
  <p>
    org-store-link が使える。
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (require &#8216;org-notmuch)<br /> (define-key global-map "\C-cl" &#8216;org-store-link)<br /> [/sourcecode]
  </p>
</div>

日本語ワードが検索で引っかからないときの対応

<div id="text-org7b11419" class="outline-text-3">
  <p>
    日本語ワードが検索でうまく引っかかってない。 いろいろ調べた結果、以下の記事にたどり着いた。 この方法で検索がうまく動くようになった。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://u7fa9.org/memo/HEAD/archives/2012-06/2012-06-01.rst">notmuch で日本語検索をいい感じにする &#8211; memo</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> $ export XAPIAN_CJK_NGRAM=1<br /> $ notmuch dump > ~/Maildir/.notmuch/dump-$(date +%Y%m%d)<br /> $ mv ~/Maildir/.notmuch/xapian{,.old}<br /> $ notmuch new<br /> $ notmuch restore &#8211;input~/Maildir/.notmuch/dump-$(date +%Y%m%d)<br /> [/sourcecode]
  </p>
</div>

mu4e と notmuch との比較

mu4e の方が使いやすい。なぜなら、

  • notmuch には、メールの削除の方法がない(わからない)
  • Gmail との同機の方法が面倒。

notmuch が mu4e より優れている点は、

  • タグ管理が より mu4e に比べて徹底している

削除の機能がないというところを考えると、 notmuch はそもそも膨大なデータを検索するためのソフトウェアで タグによる検索に徹底していて、 削除など必要ないという設計思想なのかもしれない。

この記事によると、mu4e よりも、notmuch のほうが圧倒的に高速のようだ。

purely tag and search based mail client

mu4e のほうが一見使いやすくみえるが、 上の記事を読むと最終的には notmuch に軍配が上がるのではないか?

よし、決めたぞ。notmuch を使うことにしよう。迷ったときは、マイナーな方を選ぶのだ!

01 Jan 2017, 13:26

タグ管理という新たな世界観!!Emacs の mu4e で Gmail を読む

mu というタグメールシステムを導入したので、導入手順をまとめます。

mu4e とは

notmuch とは、タグベースの高速検索メールシステムだ。

タグベースというところが気にいって、今回試してみた。

これまで、ファイルベースのメーラが世を席巻してきた。

しかし、21 世紀はタグでデータを管理する時代なのだ!

そのことは、この本にかかれていた。

ファイラだと、FenrirFS というファイラが気に入っている。

メールだと、Gmail がある。じゃあ Gmail でいいじゃないかということになるが、 Gmail は Web ベースだ。 Emacs 好きとしては、Emacs から、メールを操作したい、というのが主な動機だ。

ちなみに、Mutt と Wanderlust は経験している。

環境と各ツールの役割

<div class="outline-text-3" id="text-org324f80a">
  <ul class="org-ul">
    <li>
      Ubuntu 16.04 LTS
    </li>
    <li>
      mu 0.9.18&#x2026; タグづけ検索メールシステム
    </li>
    <li>
      mu4e 0.9.18&#x2026; mu の フロントエンド I/F
    </li>
    <li>
      Offlineimap 6.6.1 &#x2026; ローカルディレクトリとリモートフォルダを同期するツール
    </li>
    <li>
      msmtp 1.6.6&#x2026; smtpmail を軽量化したメール送信用ツール
    </li>
  </ul>
</div>

インストール方法

事前の依存ライブラリのインストール

[sourcecode language=”bash” title=”” ]
# must
$ sudo apt-get install libgmime-2.6-dev libxapian-dev gnutls-bin

# optional
$ sudo apt-get install guile-2.0-dev html2text xdg-utils
[/sourcecode]

mu のインストール

<div class="outline-text-3" id="text-orga0fbd05">
  <p>
    github から最新版の mu ををインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/djcb/mu/releases">https://github.com/djcb/mu/releases</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> ./configure && make<br /> sudo make install<br /> [/sourcecode]
  </p>
</div>

mu4e(Emacs Frontend Interface) の導入

<div class="outline-text-3" id="text-orga936df7">
  <p>
    mu をインストールすると、サブディレクトリに mu4e というものがあり その中に elisp が入っている。
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;mu4e)<br /> (setq user-mail-address &#8220;fox10225fox@gmail.com&#8221;<br /> user-full-name &#8220;Tsunemichi Harada&#8221;)
  </p>

  <p>
    (setq mu4e-maildir &#8220;~/Maildir&#8221;)<br /> (setq mu4e-drafts-folder &#8220;/[Gmail].Drafts&#8221;)<br /> (setq mu4e-sent-folder &#8220;/[Gmail].Sent Mail&#8221;)<br /> (setq mu4e-trash-folder &#8220;/[Gmail].Trash&#8221;)<br /> ;; U で 更新するときに使うプログラム<br /> (setq mu4e-get-mail-command &#8220;offlineimap&#8221;)<br /> [/sourcecode]
  </p>
</div>

メールを受信する

2つのツールがある。

mbsync のほうがいい??

今回は、日本語情報の多い Offlineimap を使う。

Offlineimap

<div class="outline-text-3" id="text-org410064b">
  <p>
    IMAP サーバーからメールを同期する Python ユーティリティ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://wiki.archlinuxjp.org/index.php/OfflineIMAP">OfflineIMAP &#8211; ArchWiki</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> sudo apt-get -y install offlineimap<br /> [/sourcecode]
  </p>

  <p>
    ~/.offlineimaprc を作成する。 ここでは、Inbox と Notes と Drafts を同期するように設定している。
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> [general]<br /> accounts = Gmail
  </p>

  <p>
    [Account Gmail]<br /> localrepository = Local<br /> remoterepository = Remote
  </p>

  <p>
    [Repository Local]<br /> type = Maildir<br /> localfolders = ~/Maildir
  </p>

  <p>
    [Repository Remote]<br /> type = Gmail<br /> folderfilter = lambda foldername: foldername in [&#8220;INBOX&#8221;, &#8220;Notes&#8221;, &#8220;[Gmail]/Drafts&#8221;]<br /> sslcacertfile = /etc/ssl/certs/ca-certificates.crt<br /> maxconnections = 1<br /> realdelete = no<br /> [/sourcecode]
  </p>

  <p>
    ターミナルより、offlineimap を入力することで、メールボックスを同期できる。
  </p>
</div>

パスワードをかくす

<div class="outline-text-3" id="text-org60c8fd9">
  <p>
    設定ファイルは github で管理したいのだが、パスワードを晒すわけにはいかない。 netrc が使える。
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> touch ~/.netrc<br /> chmod 600 ~/.netrc<br /> [/sourcecode]
  </p>

  <p>
    .netrc の中身は次の通り。
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> machine imap.gmail.com<br /> login fox10225fox@gmail.com<br /> password <your password here><br /> machine smtp.gmail.com<br /> login fox10225fox@gmail.com<br /> password <your password here><br /> [/sourcecode] </div> </div> 

    <div id="outline-container-orgb2c067a" class="outline-3">
      <h3 id="orgb2c067a">
        定期的に動作させる
      </h3>

      <div class="outline-text-3" id="text-orgb2c067a">
        <p>
          できれば定期的に動作させたい。 以下で、5 分ごとにバックグラウンドでポーリングできる。
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (setq mu4e-update-interval 300)<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-org201a44a" class="outline-3">
      <h3 id="org201a44a">
        メール受信通知を受けたい
      </h3>

      <div class="outline-text-3" id="text-org201a44a">
        <p>
          mu4e-alert という elisp がある。
        </p>

        <ul class="org-ul">
          <li>
            <a href="https://github.com/iqbalansari/mu4e-alert">https://github.com/iqbalansari/mu4e-alert</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;mu4e-alert)<br /> ;; デスクトップ通知<br /> (when linux-p<br /> ;; デスクトップ通知<br /> (mu4e-alert-set-default-style &#8216;libnotify))<br /> (add-hook &#8216;after-init-hook #&#8217;mu4e-alert-enable-notifications)<br /> ;; モードライン通知<br /> (add-hook &#8216;after-init-hook #&#8217;mu4e-alert-enable-mode-line-display)<br /> [/sourcecode]
        </p>
      </div>
    </div></div> 

    <div id="outline-container-org28257c7" class="outline-2">
      <h2 id="org28257c7">
        メールを検索する
      </h2>

      <div class="outline-text-2" id="text-org28257c7">
        <p>
          mu4e を開いて、更新 U を押すと、Offlineimap が走ってメールを受信し、 mu が走ってタグ付けされる。
        </p>
      </div>

      <div id="outline-container-org9214a97" class="outline-3">
        <h3 id="org9214a97">
          helm-mu
        </h3>

        <div class="outline-text-3" id="text-org9214a97">
          <p>
            helm I/F で検索できる。
          </p>

          <ul class="org-ul">
            <li>
              <a href="https://github.com/emacs-helm/helm-mu">https://github.com/emacs-helm/helm-mu</a>
            </li>
          </ul>

          <p>
            [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;helm-mu)<br /> (setq helm-mu-default-search-string &#8220;(maildir:/INBOX OR maildir:/Sent)&#8221;)<br /> (define-key mu4e-main-mode-map &#8220;s&#8221; &#8216;helm-mu)<br /> (define-key mu4e-headers-mode-map &#8220;s&#8221; &#8216;helm-mu)<br /> (define-key mu4e-view-mode-map &#8220;s&#8221; &#8216;helm-mu)<br /> [/sourcecode]
          </p>
        </div>
      </div>
    </div>

    <div id="outline-container-org6d9c03d" class="outline-2">
      <h2 id="org6d9c03d">
        メールを送信する
      </h2>

      <div class="outline-text-2" id="text-org6d9c03d">
        <p>
          sendmail ライブラリが Emacs にデフォルトで搭載されていたけれども、 動かなかった。。。 msmtp を使う。
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> $ git clone git://git.code.sf.net/p/msmtp/code msmtp<br /> $ cd msmtp<br /> $ autoreconf -i<br /> $ ./configure; make; make install<br /> [/sourcecode]
        </p>

        <p>
          .emacs の設定は以下の通り。
        </p>

        <p>
          [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> ;; use msmtp<br /> (setq message-send-mail-function &#8216;message-send-mail-with-sendmail)<br /> (setq sendmail-program &#8220;msmtp&#8221;)<br /> ;; tell msmtp to choose the SMTP server according to the from field in the outgoing email<br /> (setq message-sendmail-extra-arguments &#8216;(&#8220;&#8211;read-envelope-from&#8221;))<br /> (setq message-sendmail-f-is-evil &#8216;t)
        </p>

        <p>
          ;; don&#8217;t keep message buffers around<br /> (setq message-kill-buffer-on-exit t)<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-org9ac4b3e" class="outline-2">
      <h2 id="org9ac4b3e">
        参考
      </h2>

      <div class="outline-text-2" id="text-org9ac4b3e">
        <ul class="org-ul">
          <li>
            <a href="http://wenshanren.org/archives/=111#Message-complete">mu4e: an E-mail Client for Emacs | 肉山博客 (Wenshan&#8217;s Blog)</a>
          </li>
          <li>
            <a href="http://qiita.com/kaz-yos/items/164f03c7bba401646783">mu4e でメール &#8211; Qiita</a>
          </li>
        </ul>
      </div>
    </div>

01 Jan 2017, 07:00

GNU Emacs 25.1 を Ubuntu16.04 LTS にソースからビルドしてインストールする

2016 年 917 に Emacs25.1 がリリースされたのですが、Ubuntu16.04 LTS で apt-get で Emacs を インストールすると、Emacs24.5 がインストールされてしまう。

なので、ソースコードから Emacs25.1 をインストールすることにした。

事前準備

以下のモジュールを入れておく。

[sourcecode language=”bash” title=”” ]
sudo apt-get install build-essential checkinstall
[/sourcecode]

Emacs24 に依存するライブラリをインストールする。 Emacs 24 と 25 は、同じ依存関係を持っている。

なお、デフォルトでは、build-dep ができないので、 以下を参考に設定を有効にする。

[sourcecode language=”bash” title=”” ]
sudo su -c “grep ‘^deb ‘ /etc/apt/sources.list | \
sed ‘s/^deb/deb-src/g’ > /etc/apt/sources.list.d/deb-src.list”

sudo apt-get build-dep emacs24
[/sourcecode]

Emacs のインストール

ダウンロード

<div class="outline-text-3" id="text-orge86a210">
  <p>
    GNU のページから Emacs のアーカイブをダウンロードして、解凍する。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ftp.gnu.org/gnu/emacs/">http://ftp.gnu.org/gnu/emacs/</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> wget https://ftp.gnu.org/gnu/emacs/emacs-25.1.tar.gz<br /> tar xf emacs-25.1.tar.gz<br /> cd emacs-25.1<br /> [/sourcecode]
  </p>
</div>

ビルド

<div class="outline-text-3" id="text-org74540f1">
  [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> ./configure</p> 

  <p>
    # エラーしたので以下を追加で入れた。<br /> sudo apt-get install libxpm-dev libjpeg-dev libgif-dev libtiff5-dev
  </p>

  <p>
    ./configure<br /> make<br /> [/sourcecode]
  </p>
</div>

インストール

<div class="outline-text-3" id="text-org8aa474e">
  <p>
    sudo make install ではなくて、sudo checkinstall を使う。
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> sudo checkinstall<br /> [/sourcecode]
  </p>

  <p>
    deb パッケージが作成されて、インストールされる。emacs_25.1-1_amd64.deb
  </p>
</div>

アンインストール

<div class="outline-text-3" id="text-orgc20b1d8">
  [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221; ]<br /> # sudo dpkg -r emacs-25<br /> [/sourcecode]
</div>

追記: 170102 もっとお手軽な方法

deb パッケージが配布されていた。

[sourcecode language=”bash” title=”” ]
sudo add-apt-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt-get install emacs25
[/sourcecode]

29 Dec 2016, 07:52

fish で Emacs とターミナルのディレクトリを行ったり来たり。dired と cde を移植した。

zsh で大変お世話になっていたコマンド、dired と cde を fish に移植した。

dired

ターミナル上の fish で dired とタイプすると、 現在のディレクトリを Emacs の dired で開いてくれる。

function dired 
        emacsclient -e "(dired \"$PWD\")"
end

cde

ターミナル上で cde とタイプすると、 Emacs の現在のバッファに対応するディレクトリをターミナル上の fish で開いてくれる。

function cde
        emacsclient -e "(return-current-working-directory-to-shell)" | sed 's/^"\(.*\)"$/\1/' | read EMACS_CWD
        echo "chdir to $EMACS_CWD"
        cd "$EMACS_CWD"        
end

以下は、init.el に定義。

(defun return-current-working-directory-to-shell ()
  (expand-file-name
   (with-current-buffer
       (if (featurep 'elscreen)
           (let* ((frame-confs (elscreen-get-frame-confs (selected-frame)))
                  (num (nth 1 (assoc 'screen-history frame-confs)))
                  (cur-window-conf
                   (assoc 'window-configuration
                          (assoc num (assoc 'screen-property frame-confs))))
                  (marker (nth 2 cur-window-conf)))
             (marker-buffer marker))
         (nth 1
              (assoc 'buffer-list
                     (nth 1 (nth 1 (current-frame-configuration))))))
     default-directory)))

29 Dec 2016, 04:06

fish で 最近訪れたディレクトリに peco で選択して移動する

fish シェルを使っていて、最近訪れたディレクトリに peco で選択して移動する方法を紹介します。

zsh のときは

最近訪れたディレクトリをどうやって覚えるかが最大の課題だった。 zsh のときは、zsh の組み込み関数があったので以下のように対応していた。

# ------------------------------------------------------------------------
# Name     : cdr
# Function : 最近訪れたフォルダへ移動
# ------------------------------------------------------------------------
autoload -Uz is-at-least
if is-at-least 4.3.11
then
  autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
  add-zsh-hook chpwd chpwd_recent_dirs
  zstyle ':chpwd:*' recent-dirs-max 5000
  zstyle ':chpwd:*' recent-dirs-default yes
  zstyle ':completion:*' recent-dirs-insert both
fi
# ------------------------------------------------------------------------
# peco-recentd
# 最近訪れたディレクトリに移動
# ------------------------------------------------------------------------
function peco-recentd () {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-recentd

fish 版 z の導入

fish で、最近訪れたディレクトリをどう管理するか? z という fish 用のライブラリがあり、これが利用できそうだ。

以下のコマンドで最近訪れたディレクトリの一覧を取得できる。

$ z -l 

peco と組み合わせる

以下のような関数を用意した。これを config.fish に書くか、 .config/fish/functions ディレクトリ配下に peco_recentd.fish ファイルを作成して書けばよい。

function peco_recentd
        z -l | peco | awk '{ print $2 }' | read recentd
        cd $recentd
end

キーバインドを以下のように設定する。.config/fish/config.fish に以下を記述。

function fish_user_key_bindings
        # 最近見たディレクトリに移動
        bind \cx\cr peco_recentd
end

これで、zsh でできていた、選択的ディレクトリ移動が fish でもできるようになった。

24 Dec 2016, 08:18

デフォルト設定で強力に便利!zsh から fish に乗り換えたまとめ

3 年間くらいずっと zsh を使ってきたけれども、fish という新しいシェルに移行しました。

[toc]

環境

  • Ubuntu 16.04 LTS
  • fish 2.4.0

fish とは

賢くて、ユーザーフレンドリーなコマンドラインシェル。

  • fish shell

    Fish の由来は、Finally, shell らしい。

なぜ fish に乗り換えようとしたか?

るびきち(@rubikitch)さん の書いた記事に煽られたからです。

そんなにすごいものなのか?るびきちさんは、 Emacs の先駆者としてとても尊敬しているので、 そんな彼が進めるのならば、いいものなのではないか?

新しいものが好きなので、早速試してみました。

ちなみに、Google トレンドによると、だんだん上昇しています。

fish のインストール

各ディストリビューションによって異なる。Ubuntu の場合は、

sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish

いよいよデフォルトのシェルを zsh から fish に乗り換え

以下のコマンドで乗り換える。心の準備はいいかい?

chsh -s `which fish`

設定ファイルの移行 .zshrc -> config.fish

現状の.zshrc はこんな感じ。

これを config.fish に移行しなければいけない。。621 行の移行。これは大変だぞ!

どこから手をつけようか? と、その前に fish-mode.el の導入。

Emacs major mode for fish shell scripts.

(require 'fish-mode)

これで、作業が楽になる。

まずはコピペから

.zshrc を config.fish にコピペする

cp $HOME/.zshrc $HOME/.config/fish/config.fish

そのままだとエラーが多発するので、とりあえず、全部コメントアウト。

zsh 関係の設定は全武消す

ここは、思い切って消してしまう。fish の魅力を信じる。

alias の移行

以下の形式でかけるので、zsh と変わらない。zsh らしさをなくすために=を除去する。

alias NAME DEFINITION
alias NAME=DEFINITION

~/.config/fish/alias.fish に alias と関数をまとめていく。 そのためには、config.fish 冒頭に以下を追記。

. ~/.config/fish/aliases.fish

alias は関数を簡単に書いたものらしい。

file / directory の存在確認

以下でできる。

file:

if test -e ~/.foobar
    echo "File exists"
end

directory:

if test -d ~/.hello
    echo "Dir exists"
end

プログラムの存在確認

if test -x "emacs"
   function fish_title; end
end

関数の移行

関数は以下の function - end で挟み込む。

function dual
        xrandr --output eDP1 --primary --left-of HDMI1 --output HDMI1 --mode 1280x720
end

Emacs の関数たち

# Emacs で dired をひらく
function dired 
        emacsclient -e "(dired \"$PWD\")"
end

cde が移植できませんでした。

PATH の移行

環境変数は .config/fish/env.fish にまとめることにする。以下を config.fish にかく。

if status --is-login
    . ~/.config/fish/env.fish
end

PATH は以下の形式で設定する。set -U がポイント。

set -U fish_user_paths /usr/local/bin $fish_user_paths

プラグイン

oh-my-fish

  • fish shell をさらに魅力的にしてくれるツール.

17@112:追記 : fisherman を使った方がよい。

curl -L http://get.oh-my.fish | fish

インストールすると、画面がカラフルになる。さまざまなフレームワークを含んでいるらしい。

詳しくは README.md で!

function fish_user_key_bindings
        # ghq を選択
        bind \cl peco_select_ghq_repository
        # コマンド履歴を見る
        bind \cr peco_select_history
        # プロセスをキルする
        bind \cx\ck peco_kill        
end

テーマの設定

ここから好きなテーマが選べる。

迷うからデフォルトで

omf theme default

powerline

かっこいいパワーラインを入れてみる。

と思ったけれども、かっこ悪いので封印。

z

訪れたフォルダにジャンプ。

完成した設定ファイル

config.fish

# alias & function 読み込み
. ~/.config/fish/aliases.fish

# 環境変数読み込み
if status --is-login
    . ~/.config/fish/env.fish
end

env.fish

export LANG=ja_JP.UTF-8
export LD_LIBRARY_PATH=/usr/local/lib
export LIBRARY_PATH=/usr/local/lib
export CPATH=/usr/local/include

if test -d ~/script
        set fish_user_paths ~/script/sh $fish_user_paths
        set fish_user_paths ~/script/ruby $fish_user_paths
        set fish_user_paths ~/script/scala $fish_user_paths        
end

set -x EDITOR emacs
set -x VISUAL "emacsclient -nw"

# for ruby
if test -x "`which ruby`"
        set fish_user_paths $HOME/.gem/ruby/2.1.0/bin $fish_user_paths
end

# for go
if test -x go
        set -x GOPATH $HOME/go
        set fish_user_paths $GOROOT/bin $fish_user_paths 
        set fish_user_paths $GOPATH/bin $fish_user_paths 
end

# my bin
set fish_user_paths $HOME/bin $fish_user_paths

aliases.fish

alias o ‘xdg-open’ alias c ‘cygstart’ alias forced_git_local_destroy ‘git fetch origin;git reset –hard origin/master’ alias xmap ‘xmodmap ~/.Xmodmap’

alias m ‘emacsclient -nw’ alias kill_emacs “emacsclient -e (kill-emacs)“” alias boot_emacs “emacs –daemon”

function reboot_emacs kill_emacs;boot_emacs end

alias lock ‘gnome-screensaver-command -l’

alias fault ‘sudo shutdown -P now’

####################################### ## peco ###################################### function peco command peco –layout=bottom-up \$argv end

function fish_user_key_bindings

bind \cl peco_select_ghq_repository

bind \cr peco_select_history

bind \cx\ck peco_kill end

#######################################################

#######################################################

function dual xrandr –output eDP1 –primary –left-of HDMI1 –output HDMI1 –mode 1280x720 end

function dual2 xrandr –output eDP1 –primary –left-of HDMI1 –output HDMI1 –auto end

function single xrandr –output HDMI1 –off end

############ ## Emacs ########### function dired emacsclient -e “(dired “\$PWD)” end

## Chdir to the ``default-directory” of currently opened in Emacs buffer. function cde end

#+end_src

使ってみた感想など

メリット

  • 軽い

    体感だけれども、zsh よりも、サクサク動作する気がする。

  • 色鮮やか

    デフォルトでも十分色鮮やかだ。黒背景にカラフルな色が好きな自分にとってはうれしい。

  • 設定がとても簡単

    驚くほどに簡単だ。zsh の職人技じみた設定はなんだったのだろうか?

    デフォルトで強力な機能が備わっている。

    設定ファイルをみても、zsh では 600 行あったものが 100 行程度に収まっている。

  • 補完がつよい

    困った時は、タブを押す。 すると、補完がきいて助けてくれる。この機能が一番気に入っている。

デメリット

  • ドキュメントやブログ記事が少ない。
  • 利用者がまだまだ少ない。

    このことによって、他人の設定を参考にすることができない。

  • zsh でできたことが fish でできなかったりする

    zsh では、いろいろと自作関数をつくって便利にしたのだけれども、 fish では同じ機能が実現できなかった。たとえば Emacs との連携など。 時間をかければできるかもしれない。暇な時にハックしよう。

参考

21 Dec 2016, 13:27

Emacs で Racket 開発環境を構築

coursera で Programming Languages , PartB を受講し始めた。

開発環境で DrRacket(Racket をインストールするとついてくる開発環境)が指定される のだけれども、Emacs Love な自分はどうしても Emacs からやりたかったので、 Emacs で Racket 開発環境を構築した。

環境

  • Ubuntu 16.04 LTS
  • Racket v6.3

Racket のインストール

sudo apt-get install racket

これで /usr/bin/配下に racket がインストールされる。

優れた IDE の条件

優れた IDE が備えるべき機能は以下.

  • シンタックスハイライト/ インデント
    • racket-mode, aggressive-indent
  • 検索・置換 iedit, multiple-cursors, helm-ag, helm-swoop
  • タグジャンプ racket-visit-definition
  • コード補間
    • auto-complete
    • tab で complete
  • エラーチェック
    • flycheck
  • インタープリタ・デバッカ racket-repl

racket-mode

Racket の開発環境は、24.2 Emacs によると

  • racket-mode
  • Quack
  • Geiser

などがある。

今回は、新しめの racket-mode を利用することにした。 インストールは M-x el-get-install でした。

(require 'racket-mode)
;; tab で補間
(setq tab-always-indent 'complete)

aggressive-indent

賢い indent-mode

names package に依存しているので, require ‘names してからインストールしないとおかしくなる.

(add-hook 'racket-mode-hook #'aggressive-indent-mode)

smartparens

smart + parens カッコ移動を楽々。

(require 'smartparens-config)

auto-complete-mode

補間

(require 'auto-complete)
(add-to-list 'ac-modes 'racket-mode)

RainbowDelimiters

かっこの深さに応じて色付けしてくれる.

(add-hook 'prog-mode-hook #'rainbow-delimiters-mode)

flycheck

エラーチェック

(require 'flycheck)
(add-hook 'after-init-hook #'global-flycheck-mode)

quickrun

ファイルを実行できる。

quickrun は最近 Racket に対応したようだ。

(require 'quickrun)

参考 URL

20 Dec 2016, 04:33

2016 年のまとめと2017年の目標

今年も終わりなので、2015 年の振り返りと 2016 年の目標を立てる.

2016 年の振り返り

2016 年の目標は以下の通り。

最悪の年だった。うつ病にかかり、2015/12/15 より休職。 未だ休職中だ。復職のめどがいつになってもたたない。

記事数を見てもらえば分かる。ほとんど Output なし。成果なし。

ということで、振り返ることありませーん。

2017 年の目標

ソフトウェア開発よりも、2017 年は TOEIC の勉強に力を入れる。

TOEIC 用のブログも立ち上げた。

ソフトウェアに関して強いてあげれば、おもしろそうな MOOC の講座や書籍があれば 取り組んでみる程度に留める。

とにかく、今年は TOEIC に注力して、900 score を取得したい。

なぜ TOEIC900 なのか?

これは、まだ自分でも踏ん切りがついていない。860 点でもいいんじゃないかと思う。 TOEIC900 とれても、英語ができるわけではないし、転職でもあまり重視されない。 − TOEIC900 点は全くたいしたことがない件について

でも、あえて書くと、以下かな。

  • TOEIC 楽しいから。ハマっている。点数があがっていくのがゲーム感覚で楽しい。現実はこの半年間さがってるけどね。
  • みんなから尊敬される。すごーいといわれたい。
  • 英語力をあげることに注力したい。これからのキャリアを考えると英語は必須。だらだらと今までのように勉強していても、大して変化がない。ブレイクスルーが欲しい。
  • 頑張る目標が欲しい。目標があると、人生にはりがうまれ、生き生きとした生活がおくれる。

ということで、2017 年は、このブログもあまり更新しません。TOEIC ファーストです。