24 Jan 2016, 11:07

Living Clojure を読んだ

Living Clojure を読んだ。

内容

2 部構成。前半は、Clojure の基本文法について簡単にまとめたもの。 そして、後半は Clojure を身につけるための学習プランが書いてある。

Clojure の文法はシンプルなのだが、それをさらにシンプルに解説する良書。

文法に加えて、Clojure のプロジェクト管理の方法だったり、 Web アプリケーション(ClojureScript)に章を割いているところが面白い.

後半は、7 週間をかけて Clojure をまなぶための学習プランが示される。 学習には、4clojure が利用される。

感想

やさしい英語なので、サクサク読み終えることができた。 読了までにかかった時間は 11 時間。あっという間だ。

文法書は概して読み終えるのに時間がかかったり、 途中で退屈になりやすいが、 この本は不思議の国のアリスを例にした楽しい解説が続き、 また分量としてもちょうど良く、飽きることがなかった。

ただし説明がシンプルなのはよいが、若干物足りなさを感じた。 マクロやプロトコルなど、例がすくないので、理解できていない。

この本のよくできているところは、 文法を定着させるためのトレーニングプランが 後半で示されているところ。文法書は手を動かさないと身につかない。

後半の学習はこれからやります。

19 Jan 2016, 07:14

認知を変えてうつな自分を変える!Three Good Things について

Three Good Things とは、一言でいうと、

寝る前にその日にあったよいことを3つ書き残す習慣

です。

Three Good Things

Three Good Things とは、ポジティブ心理学の父、セリグマン博士が唱える習慣です。

Three Good Things のエクササイズは、 一週間の間、寝る前にその日にあったよいことを書き出し、 なぜそれがよかったのかをふりかえるものです。

なぜこれが効果的かというと、 心のフォーカスを悪くなることからそれを許せるように変え、 良くなることに注意を向けることで、心の圧力をこわし、幸福度をあげるからです。

Three Good Things は普段注意を払っていないことに注意をむけます。 人はよくいったことに注意を払わず、悪くいったことに注意を向けがちです。 なので、よくいったことに集中し、注意を向けることが重要なのです。

たったこれだけで、うつの改善に驚異的な効果を発揮するそうなのです。 以下記事も参考にしてください.

Three Good Things の効果

なぜ、このような単純な方法が効果的なのでしょうか?

それは 人々の関心事を悪いものからよいものへと変えることができるからです。 私たちはよいことを忘れがちでうまくいかなかったことをよく覚えている傾向があります。

なので、この傾向を逆転させるために、このエクササイズが必要なのです。 そして、よりよいものへと注意を向けることで、私たちの人生はよりポジティブになります。

また、一日の終わりに書くためのネタを日中つねに探すようになるので、 注意を普段ならば気にもとめないよかったことへと注意が自然と向かって行きます。

Three Good Things のやりかた

Three Good Thins のやり方は、

  • 就寝前に一日の間でよくいったことを3つ書き出す
  • なぜそれがよかったのかを振り返る

これだけです。

悪いことも無理やりよいことととらえてみる

<div class="outline-text-3" id="text-orgheadline4">
  <p>
    うつ病の有名な治療方法として認知療法があります。
  </p>

  <blockquote>
    <p>
      人が成長するにつれ固定的なスキーマが形成され、 それに基づいて歪んだ思考方法や考えが自然に浮かぶ自動思考が起こっており、 そうした認知の歪みに焦点を当てて、 認知を修正することで症状が改善されるとされる心理療法
    </p>
  </blockquote>

  <p>
    うつになりがちな人は考え方のクセがあり、 そのクセにしたがって物事をとらえると普通のことも悪くとらえてしまう傾向があります。
  </p>

  <p>
    よいことと悪いことは表裏一体だったりします。 そこで、無理やりにでも悪いことを良かったことに考え直すというのはどうでしょうか?
  </p>

  <p>
    悪く考えるクセを認知して、物事をポジティブに考える訓練としても Three Good Things は効果的です。
  </p>
</div>

Twitter でつぶやこう

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    ツィッターで毎日つぶやいてもいいです(ハッシュタグ #3good)
  </p>

  <p>
    フォーマットをいい感じに整形してツイートできたらいいな。。と思ったそこのあなた。
  </p>

  <p>
    Web から簡単にツイートできる WEB アプリを開発しました(ここが本題!)
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://secure-ocean-2865.herokuapp.com/">https://secure-ocean-2865.herokuapp.com/</a>
    </li>
  </ul>

  <p>
    ツイッターでログインしてつぶやくだけのアプリですが是非利用してみてください.
  </p>

  <p>
    記事の反応がよければ SNS 機能を実装して いいね!とかできるようにしたいと思います
  </p>
</div>

15 Jan 2016, 09:43

Emacs で Python デバッグするときは pdb が便利

Emacs で Python のデバッグをするときは、pdb が便利.

以下を参考にして設定してみた.

手順

  • デバッグしたいファイルまで M-x cd で移動。
  • 以下のスクリプトを書いて、パスが通った場所におく

[sourcecode language=”bash” title=”” ]
#!/bin/sh
exec python -m pdb $1 $2 $3 $4 $5 $6 $7 $8 $9
[/sourcecode]

Python2 だとこっち.

[sourcecode language=”bash” title=”” ]
#!/bin/sh
exec python2 /usr/lib/python2.7/pdb.py $1 $2 $3 $4 $5 $6 $7 $8 $9
[/sourcecode]

  • M-x pdb を実行
  • ミニバッファで pdb (file 名) を実行
  • 画面が 2 分割されて、ソースと pdb の画面が現れる.
  • (pdb) コンソール上で n とか s で ステップ実行

便利!

14 Jan 2016, 13:34

Machine Learning for Fx

しばらく放置していた FX システムトレードに新しくストラテジを追加.

Machine Learning for Trading の講義を聞いて、 以下の 2 つが紹介されていたので実装してみた.

線形回帰

statsmodels ライブラリを使う.

[sourcecode language=”python” title=””]
class OLS(Strategy):
def __init__(self, status):
super(OLS, self).__init__(status)

self.sma_ols_ts = pd.DataFrame()
self.mean_for_ols_period = 100
self.ols_period = 20

self.a = 0
self.b = 0
self.pre_b = 0

def calc_ols(self, timeseries, event):
# データをならすために平均をとる.
mean_for_ols = timeseries.get_latest_ts_as_df(
self.mean_for_ols_period).mean()[0]
self.sma_ols_ts.loc[event.time, event.instrument] = mean_for_ols

x = range(self.ols_period)
y = np.asarray(
self.sma_ols_ts.tail(self.ols_period)[event.instrument])

if len(y) < len(x):
return

# いい感じの線分にするために、大きな数をかける
results = sm.OLS(y * 1000000, sm.add_constant(x), prepend=True).fit()
self.pre_b = self.b
self.a, self.b = results.params

# print(str(self.a) + ", " + str(self.b))

def ols_buy_condition(self):
# 傾きが xx 以上のときに buy する
return self.b > 1.5

def ols_sell_condition(self):
# 傾きが-xx 以上のときに sell する
return self.b < -1.5

def ols_close_buy_condition(self):
# 傾きがひっくり返ったときに終了
return self.pre_b >= 0 and self.b < 0

def ols_close_sell_condition(self):
# 傾きがひっくり返ったときに終了
return self.pre_b <= 0 and self.b > 0

def cleanup_data(self):
if len(self.sma_ols_ts) > self.ols_period:
self.sma_ols_ts.drop(self.sma_ols_ts.head(1).index)
[/sourcecode]

K 近傍法

実装してみたものの、バックテストをしてもうまく動いているようには見えない.

なにか、バグっているっぽい.

[sourcecode language=”python” title=””]
class KNN(Strategy):
def __init__(self, status):
Strategy.__init__(self, status)

self.knn_train_period = 100
self.knn_pred_period = 100
self.knn_neighbors = 10
self.predict = 0
self.now = 0
self.beta = 0
self.knn_ts = pd.DataFrame()

def calc_knn(self, timeseries, event):

x = [[i] for i in range(self.knn_train_period)]
y = timeseries.get_latest_ts_as_array(self.knn_train_period, event)

if len(y) < len(x):
return

neigh = KNeighborsRegressor(n_neighbors=self.knn_neighbors)
neigh.fit(x, y)

self.now = event.bid
self.predict = neigh.predict(
self.knn_train_period + self.knn_pred_period)

if self.status["is_sim"]:
self.knn_ts.loc[event.time, event.instrument] = self.predict

self.beta = self.predict – self.now

def knn_buy_condition(self):
return self.beta > 0.0001

def knn_sell_condition(self):
return self.beta < -0.0001

def knn_close_buy_condition(self):
return self.beta <= 0

def knn_close_sell_condition(self):
return self.beta >= 0
[/sourcecode]

10 Jan 2016, 19:18

自分史: プログラミングには感動が必要である

人生の休憩地点にいるので、人生をここで振り返って見ようと思う。

[toc]

過去を振り返るメリット

  • 人生は過去の決断の積み重ねで成り立っている
  • 過去を分析するすることで今の自分の心境が明確になる。
  • また、これから進むべき道がみえるかもしれない.

自分はなにもので、どこへ向かって進むべきなのか、 そういう点が明確になる効果が期待できる.

小学生

小学 3 年生、家にパソコンがやってきた!

そして、母親がパソコンの勉強を始めた。 母親がキーボードをうつ練習をしているとなりで、 真似してブラインドタッチの練習を始めた. 我ながら早熟である.

そして、小学 4 年生のときに、なんと自分用の PC を手に入れる. コンパック製。母親の会社でいらなくなった PC をもらったのだった. そのなかには、Windows95 が入っていて、Excel や Word で遊んだ. ゲームの攻略情報を Excel や Word にまとめて管理したりした. しかし、プログラミングをするには至らなかった.

母の影響でパソコンに興味をもつ

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    パソコンが家にやってきて依頼、母はパソコンにハマってしまって、 夜な夜なパソコンやネットワークの勉強をしていた。 そういう後ろ姿を毎日見ながら寝ていた. 家には、どんどん IT 系のわけの分からない本がたまっていく。
  </p>

  <p>
    そういう姿をみて、パソコンは熱中できるなにかがあると、 幼いこころで感じたのだった.
  </p>
</div>

中学生

パソコンとは無縁の生活。なんにもやらなかったよ。

高校生

高校一年生の夏、お年玉が 20 万たまっていた。 なにか大きい買い物をしようと考えて、購入したものは、

ソニー VAIO だった。

2 台めの自分用のパソコン。今度は明確な目標を持っていた。

ゲームがつくりたい

中学高校と、ゲームっ子だったので、 プログラムといえばゲームのイメージが強かったのでそう思った.

ゲームをつくるためには、プログラミング言語が必要だ。 ここで、C 言語と出会う。独習 C を購入して、夏休みをつかって独習。 最終的には、コマンドラインで使用するカレンダーアプリが完成した. また、ホームページビルダーをつかって、簡単な自分の Web ページをつくった.

そのあと、モチベーションが途切れてしまってゲーム製作には至らなかった. 血気盛んな時期だったので、VAIO はエロビデオを見るための箱となったのだった。

数学と母親とコンピュータ

<div class="outline-text-3" id="text-orgheadline6">
  <p>
    高校は受験高に通っていて、しかも帰宅部だったので、ガリ勉だった。 平日 5 時間、休日10時間の勉強を 3 年間しているような学生だった。
  </p>

  <p>
    得意科目は、数学だった。 なので、漠然と数学が生かせるような仕事につきたいと考えていた。
  </p>

  <p>
    母親のパソコン好きや VAIO 購入もあって、自分が選ぶべき道は エンジニアではないかと、考えるようになった。
  </p>

  <p>
    当時、バックトゥーザフューチャーが大好きだったので、 自分はマッドサイエンティストになって怪しい発明をしたいと考えていた.
  </p>
</div>

浪人生

大学受験に失敗し、一浪。

哲学とクラシック音楽にハマる。コンピュータとは無縁の生活.

大学生

浪人しても大学受験に失敗した。自分は、うつ病にかかった。

いちおう、情報系の学問を学ぶ大学には入学できた。 まったくやる気が起きなくなってしまい、一年間ひきこもっていた。

大学 2 年生になって、狂ったようにクラシック音楽とオペラのコンサートに 通いつめるようになって、ようやくうつから脱出した。 そんな感じだから、大学生のときはほとんど勉強をしなかった。

一応、学校の授業で Java やアルゴリズムの基礎を学ぶものの、 それにたいして、深い興味を抱くことはなかった。音楽にしか興味がなかった。

今では、大学生のときに勉強をしていなかったことについて、 大変に後悔している。人生をやり直せるならば、大学生のときに戻りたい。

院にいって勉強をしようかという選択肢で悩んだが、 うつ病が完全に治りきっていない状態だったので、 うつになって院を中退することが怖かったので、就職を選択した。

就職活動

<div class="outline-text-3" id="text-orgheadline9">
  <p>
    就活は &#8220;組み込みソフト + 大企業の子会社 + 関東&#8221; でリクナビで検索して消去法で残った 15 社を受けた.
  </p>

  <p>
    組み込みソフトを選んだのは、大学で抽象的な数学に嫌気がさしていたので、 ソフトウエアの動作を生で感じることができる組み込み系がいいと思ったから。
  </p>

  <p>
    大企業の子会社を選んだのは、大企業はうつになっても休職できるから。 また、研究開発職につきたかったので、院卒でなくても研究開発職につくためには、 研究開発だけを専門にやっている会社に入るのがよいと考えたから。
  </p>

  <p>
    関東を選んだのは、クラシックやオペラを見にいきたかったから。
  </p>

  <p>
    消去法と雰囲気で選んだ会社に就職。
  </p>
</div>

社会人

入社1、2年目

<div class="outline-text-3" id="text-orgheadline10">
  <p>
    社会人になったこと、一人暮らしできたことがうれしくって、 自由に趣味を楽しんでいた。 家に帰ってもプログラミングをすることはなかった。 プログラミングには大して興味がなかった。
  </p>

  <p>
    会社では、C 言語を学び、ストレージ装置の制御ファームを開発する業務についた. ストレージ開発では、10 年前からのデバッグ手法(print debug)でテストを しているような感じだった。それが当たり前だと思っていた。
  </p>

  <p>
    しかしあるとき、常識を覆す本に出会ってしまう。
  </p>

  <ul class="org-ul">
    <li>
      test driven development for embedded c
    </li>
    <li>
      <a href="http://futurismo.biz/archives/172">そろそろ『 test driven development for embedded c 』について書いてみる | Futurismo</a>
    </li>
  </ul>

  <p>
    TDD との出会いである。こんな方法があったのか!と夢中になった。 プログラミング面白い!と思った最初のきっかけである。TDD に夢中になった。
  </p>
</div>

入社3、4年目

<div class="outline-text-3" id="text-orgheadline11">
  <p>
    そのころ、世の中ではカフェにパソコンを持ち込んで作業をすることが流行っていて、 自分もそれにあこがれて VAIO をバッグに入れて休日はノマドワーカーになっていた。
  </p>

  <p>
    普段の生活のなかで、パソコンをいじっている時間が極端に増えた。このブログも、立ち上げた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/7">はじめまして | Futurismo</a>
    </li>
  </ul>

  <p>
    はじめはアフィリエイトのためにブログ記事ばかり書いていたのだが、 どうもアフィリの才能がないことに気づき、次第にプログラミングに休日の時間を割くようになった.
  </p>

  <p>
    ある動画がきっかけとなり、部屋のオートメーションハックに熱中した。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/154">iRemocon でミクミクにしてやんよ。 | Futurismo</a>
    </li>
  </ul>

  <p>
    このころの技術は Teraterm マクロだけれども, それでも、ハッキングの楽しさを知った体験だった。
  </p>

  <p>
    気づけば、休日のほとんどをパソコンのハッキングに費やすようになっていた。
  </p>
</div>

入社 5, 6 年目

<div class="outline-text-3" id="text-orgheadline12">
  <p>
    そうして、プログラミングの楽しさにようやく目覚めたのだが、 自分には基礎がないことに気づいた。 大学生のとき遊んでいたし、仕事は定形の作業をこなしているだけなので。
  </p>

  <p>
    猛烈に勉強がしたくなった。そこで出会ったのが、MOOC だった。 MOOC で、自分のコンピュータサイエンスを叩き直そうと決意した。 日本で一番 MOOC を頑張る社会人を目指して、とにかく講座数をとった。
  </p>

  <p>
    自分のスキルは間違いなく向上していた。喜びの絶頂を感じていた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2586">感動駆動学習こそ最強の学習法だ! MOOC をはじめて 1 年たったまとめ. | Futurismo</a>
    </li>
    <li>
      <a href="http://futurismo.biz/archives/2427">プログラミングの世界観を変える衝撃!Paradigms of Computer Programming で震えるほどの知的感動を体験した | Futurismo</a>
    </li>
  </ul>

  <p>
    ただし、2 年が過ぎてきたころ、MOOC にあき始めた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/4140">MOOC をはじめてから 2 年たち、そろそろ飽きてきた | Futurismo</a>
    </li>
  </ul>

  <p>
    そして、次第にうつ病になりプログラミングに興味を失ってしまった。現在に至る.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/5439">プログラミングに興味がなくなってしまった | Futurismo</a>
    </li>
  </ul>
</div>

過去の経験から得られること

過去を振り返ると、偶然の出会いの数々によって今の自分がいることを認識した。

自分は、たまたまプログラミングに感動しプログラミングが好きになってきたのだった。

最近、プログラミングに興味がなくなってしまった原因は、病気のこともあるけれども、 感動がなくなってしまったことが原因としてあるのだろう。

感動が欲しい!感動が、今のうつの状態から抜け出せる処方箋だ。

これからどうするか

感動はどのようにして得ることができるのだろうか?

それは、感動の対象を心の底から尊敬し、感動を得られると信じることが大事だと思う。

そう思うのは、大学生のときに音楽に狂った自分の体験からだ。すべての経験は無駄ではない。

そうすると、次の疑問はプログラミングから感動をえるためにはどうすればいいだろうか? ということだ。

プログラミングの喜びは、以下のように分類してある。

NextAction として、プロコンをはじめた

プロコンに取り組むことで、かつての数学が好きだった自分を取り戻し、 問題を Solve する喜びを見つけたい。これが現時点で出した進むべきみちだ。

10 Jan 2016, 12:25

競技プログラミング対策用 Futurismo 別館を立ち上げ

Futurismo 競技プログラミング対策用 別館を立ち上げました。

プログラミングコンテストの参加記録や過去に解いた問題を 投稿していくためのサイトです。

このサイトに投稿記事を混ぜると、RSS フィードが汚れる?ので、 別サイトを立ち上げました.

以上

06 Jan 2016, 05:20

プログラミング Clojure を読んだ

プログラミング Clojure 第 2 版をようやく読みきりました。

読むのにかかった時間は、36 時間 14 分. 流し読みしてこのくらい.

本の構成

日本語で読める唯一のまともな Clojure 入門書.

全部で 10 章構成.1,2,3 章で、Clojure の基本的な文法を紹介する. 4 章以降、中級、上級向けの内容になってくる。 関数型プログラミング、状態、プロトコル、マクロ、マルチメソッドなどなど。 そして、最後の 2 章で、より実践的なアプリケーションを作成する.

感想

序文がやたらとカッコよかった.

  • Clojure はエレガントだ。
  • Clojure は「Lisp ・リローデッド」だ。
  • Clojure は関数型言語だ。
  • Clojure は並行プログラミングを簡単にする。
  • Clojure は Java を歓迎する。
  • Clojure は速い。

この序文とポールグレアムの本で, 誰もが Lisp ハッカーに憧れて Clojure の門を叩くのではないか?

しかし、内容は難しかった。

理解ができない部分が多々あり。 そういうところは流し読みして、老後の楽しみにして飛ばした。 1、2、3章は理解できたが、それ以降は正直理解したといえない.

これは、初心者向けの本ではない. Lisp や Java を熟知している人が Clojure を使ってみようという場合を想定してかかれている気がした. また、話の展開が早く、話題が次から次へとポンポン変わって、ついていくのが苦しい。

ただし、1,2,3 章で基本的な章を理解したので、 簡単なプログラムはかけるようになった.これからこの本読むひとは、 とりあえず最初の章を理解することを目標においてはどうだろうか?

日本語で出ている資料としてはこのプログラミング Clojure を 入門の入り口として選ぶひとが大多数だと思うが、 これを読みきって理解するひとは少ないのでは? 入門の敷居が高いところにも、Clojure が流行らない理由があるのではと思う.

ちなみに、入門には以下の MOOC がおすすめ.

これからどうするか

Clojure 力をつけるには、どうしよう。 ほかに日本語で読める本には目を通してしまった。選択肢としては、

どれもあまりパッとしないなぁ。答えはここでは出ませんでした。 このままだと、ここで Clojure の勉強がストップして先に進めない.

おすすめあれば、教えてつかあさい.

02 Jan 2016, 00:21

Emacs で Clojure の開発環境を構築

Clojure の勉強を始めました。

まずはなにより Emacs の設定からかと思うので、 Clojure の Emacs 設定を整えました. 現時点での設定をプログにスナップショット.

優れた IDE が備える機能

  • シンタックスハイライト/ インデント clojure-mode
  • 検索・置換 たくさんあるよ.
  • タグジャンプ ggtags
  • コード補間 ac-clojure
  • エラーチェック flycheck
  • リファクタリング clj-refactor
  • インタープリタ・デバッカ cider
  • プロジェクト管理 projectile
  • ドキュメント参照 eldoc

Clojure に特科した Elisp

clojure-mode

<div class="outline-text-3" id="text-orgheadline2">
  <p>
    Clojure のためのメジャーモード. シンタックスハイライトとかインデントとかを正してくれるモード. これは必須.
  </p>

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

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clojure-mode)<br /> [/sourcecode]
  </p>
</div>

cider

<div class="outline-text-3" id="text-orgheadline3">
  <p>
    Clojure のためのインタラクティブな開発環境.
  </p>

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

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;cider)<br /> ;; clojure-mode で cider を有効に<br /> (add-hook &#8216;clojure-mode-hook &#8216;cider-mode)<br /> ;; eldoc を有効にする<br /> (add-hook &#8216;cider-mode-hook &#8216;cider-turn-on-eldoc-mode))<br /> [/sourcecode]
  </p>

  <ul class="org-ul">
    <li>
      cider-jack-in で repl 起動
    </li>
    <li>
      cider-connect でリモート repl に接続
    </li>
  </ul>

  <p>
    repl と連携して開発を行うことができる. REPL 駆動開発!!
  </p>
</div>

4clojure

<div class="outline-text-3" id="text-orgheadline4">
  <p>
    clojure の問題集.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/losingkeys/4clojure.el">https://github.com/losingkeys/4clojure.el</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;4clojure)<br /> [/sourcecode]
  </p>

  <p>
    Emacs から問題をといたり、答え合わせができる. そのまま答えを投稿できればいいのだけれども、それは未対応.
  </p>
</div>

ac-cider

<div class="outline-text-3" id="text-orgheadline5">
  <p>
    auto-complete for cider. 強力な補完機能が手に入る.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/ac-cider">https://github.com/clojure-emacs/ac-cider</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;ac-cider)<br /> (add-hook &#8216;cider-mode-hook &#8216;ac-flyspell-workaround)<br /> (add-hook &#8216;cider-mode-hook &#8216;ac-cider-setup)<br /> (add-hook &#8216;cider-repl-mode-hook &#8216;ac-cider-setup)<br /> (eval-after-load &#8220;auto-complete&#8221;<br /> &#8216;(progn<br /> (add-to-list &#8216;ac-modes &#8216;cider-mode)<br /> (add-to-list &#8216;ac-modes &#8216;cider-repl-mode))))<br /> [/sourcecode]
  </p>
</div>

clojure-cheatsheet

<div class="outline-text-3" id="text-orgheadline6">
  <p>
    CheatSheet を参照できる.
  </p>

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

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clojure-cheatsheet)<br /> (define-key clojure-mode-map (kbd &#8220;C-c C-h&#8221;) #&#8217;clojure-cheatsheet)<br /> [/sourcecode]
  </p>
</div>

clj-refactor

<div class="outline-text-3" id="text-orgheadline7">
  <p>
    Clojure 用リファクタリング支援ツール.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/clj-refactor.el">https://github.com/clojure-emacs/clj-refactor.el</a>
    </li>
  </ul>

  <p>
    できる機能か多すぎ!覚えらんない..
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/clojure-emacs/clj-refactor.el/wiki">https://github.com/clojure-emacs/clj-refactor.el/wiki</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clj-refactor)
  </p>

  <p>
    (defun my-clojure-mode-hook ()<br /> (clj-refactor-mode 1)<br /> (yas-minor-mode 1) ; for adding require/use/import statements<br /> ;; This choice of keybinding leaves cider-macroexpand-1 unbound<br /> (cljr-add-keybindings-with-prefix &#8220;C-c C-m&#8221;))
  </p>

  <p>
    (add-hook &#8216;clojure-mode-hook #&#8217;my-clojure-mode-hook)<br /> [/sourcecode]
  </p>
</div>

clojure-snippets

<div class="outline-text-3" id="text-orgheadline8">
  <p>
    Yasnipeet for Clojure
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/mpenet/clojure-snippets">https://github.com/mpenet/clojure-snippets</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;clojure-snippets)<br /> (setq clojure-snippets-dir &#8220;~/.emacs.d/el-get/repo/clojure-snippets/&#8221;)<br /> [/sourcecode]
  </p>
</div>

主に Lisp 系に役立つ Elisp

ggtags

<div class="outline-text-3" id="text-orgheadline10">
  <ul class="org-ul">
    <li>
      <a href="https://github.com/leoliu/ggtags">https://github.com/leoliu/ggtags</a>
    </li>
  </ul>

  <p>
    変数や関数の定義にタグジャンプする. ggtags-create-tags 関数を呼ぶと, ctags コマンドがコールされてタグがつくられる.
  </p>

  <p>
    と思ったら、つくられない。.globalrc に設定を追加する必要があるようだ. 以下のサイトを参考にした。ありがとうございます.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ayato.hateblo.jp/entry/20150603/1433329200">Clojure の開発で gtags を使う &#8211; (define -ayalog &#8216;())</a>
    </li>
  </ul>

  <p>
    タグができたら、あとはコマンドを定義するだけ.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;ggtags)<br /> (add-hook &#8216;clojure-mode-hook (lambda () (ggtags-mode 1)))
  </p>

  <p>
    ;; use helm<br /> (setq ggtags-completing-read-function nil)
  </p>

  <p>
    ;; use eldoc<br /> (setq-local eldoc-documentation-function #&#8217;ggtags-eldoc-function)
  </p>

  <p>
    ;; imenu<br /> (setq-local imenu-create-index-function #&#8217;ggtags-build-imenu-index)
  </p>

  <p>
    (define-key ggtags-mode-map (kbd &#8220;C-c g s&#8221;) &#8216;ggtags-find-other-symbol)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g h&#8221;) &#8216;ggtags-view-tag-history)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g r&#8221;) &#8216;ggtags-find-reference)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g f&#8221;) &#8216;ggtags-find-file)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g c&#8221;) &#8216;ggtags-create-tags)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g u&#8221;) &#8216;ggtags-update-tags)<br /> (define-key ggtags-mode-map (kbd &#8220;C-c g m&#8221;) &#8216;ggtags-find-tag-dwim)
  </p>

  <p>
    (define-key ggtags-mode-map (kbd &#8220;M-,&#8221;) &#8216;pop-tag-mark))<br /> [/sourcecode]
  </p>
</div>

smartparens

<div class="outline-text-3" id="text-orgheadline11">
  <ul class="org-ul">
    <li>
      <a href="https://github.com/Fuco1/smartparens">https://github.com/Fuco1/smartparens</a>
    </li>
  </ul>

  <p>
    カッコの移動を簡単にする elisp. 似たような機能に Paredit という elisp もある. どちらを使うかは好き嫌い.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;smartparens-config)<br /> (smartparens-global-mode t)<br /> [/sourcecode]
  </p>

  <p>
    以下、自分のキーバインドを貼り付けるけれども、キーバインドは好きに設定してよい.
  </p>

  <p>
    正直、あまりつかいこなせてない&#x2026;
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (define-key sp-keymap (kbd &#8220;C-M-f&#8221;) &#8216;sp-forward-sexp) ;; forward<br /> (define-key sp-keymap (kbd &#8220;C-M-b&#8221;) &#8216;sp-backward-sexp) ;; backward
  </p>

  <p>
    (define-key sp-keymap (kbd &#8220;C-M-n&#8221;) &#8216;sp-next-sexp) ;; next<br /> (define-key sp-keymap (kbd &#8220;C-M-p&#8221;) &#8216;sp-previous-sexp) ;; previous
  </p>

  <p>
    ;; 一段中の/ 外のカッコに移動.<br /> (define-key sp-keymap (kbd &#8220;C-M-d&#8221;) &#8216;sp-down-sexp) ;; down<br /> (define-key sp-keymap (kbd &#8220;C-M-u&#8221;) &#8216;sp-up-sexp) ;; up
  </p>

  <p>
    ;; かっこの先頭と末尾に移動.<br /> (define-key sp-keymap (kbd &#8220;C-M-a&#8221;) &#8216;sp-beginning-of-sexp)<br /> (define-key sp-keymap (kbd &#8220;C-M-e&#8221;) &#8216;sp-end-of-sexp)
  </p>

  <p>
    ;; カッコのなかを削除・コピー (かたまり単位)<br /> ;; sp-kill/copy-hiblid-sexp というものもある<br /> (define-key sp-keymap (kbd &#8220;C-M-k&#8221;) &#8216;sp-kill-sexp)<br /> (define-key sp-keymap (kbd &#8220;C-M-w&#8221;) &#8216;sp-copy-sexp)
  </p>

  <p>
    ;; かっこを外す<br /> (define-key sp-keymap (kbd &#8220;C-M-s&#8221;) &#8216;sp-unwrap-sexp)<br /> [/sourcecode]
  </p>
</div>

show-paren-mode

<div class="outline-text-3" id="text-orgheadline12">
  <p>
    対応する括弧を光らせる.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> ;; turn on highlight matching brackets when cursor is on one<br /> (show-paren-mode 1)<br /> [/sourcecode]
  </p>
</div>

rainbow-delimiters

<div class="outline-text-3" id="text-orgheadline13">
  <p>
    かっこの深さに応じて色付けしてくれる.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/Fanael/rainbow-delimiters">https://github.com/Fanael/rainbow-delimiters</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> (require &#8216;rainbow-delimiters)<br /> [/sourcecode]
  </p>
</div>

31 Dec 2015, 22:46

REPL 駆動開発について(REPL Driven Development) 調べたメモ

REPL と REPL 駆動開発について調べたメモです.

REPL とは

Read-Eval-Print-Loop の略. 読んで、評価して、表示するを繰り返す.

対話的に開発するためのツール.

素早いフィードバックを得ることで、頭に浮かんだ考えを即実行できる!!

インタラクティブシェルとの違いがよくわからなかった. Lisp 系の言語で REPL という用語が利用され, スクリプト言語で インタラクティブシェルという用語が利用される??

各言語のサポート状況

スクリプト言語は大体できる.

  • Ruby … irb, pry
  • Python … iPhthon
  • Perl … perl -de 1

Lisp 系言語はもちろんできる.

  • Clojure .. lein repl
  • Scheme
  • Common Lisp

コンパイラ系言語でもサポートしようという取り組みがある.

REPL Driven Development

Repl によって開発を駆動する方法. 以下 RDD. 具体的には、 エディタと Repl を両側にならべて、以下のプロセスを繰り返す.

  1. 実装(S 式)を書いてみる
  2. 実装を 即座に Repl に読み込ませて評価
  3. 結果を確認しその実装が正しいことを確認する

この 記事によると、以下の 3 点から開放されることで、 開発に集中することができるとのこと.

  1. restarting the application … アプリケーションの再起動
  2. running something other than the application to verify behavior … 振る舞いの確認のためにアプリケーション以外を起動すること
  3. moving out of the source to execute arbitrary code… 任意のコードを実行するためにソースから離れること.

たとえば C#の場合は、アプリを止めて リビルドして、アプリを再起動するというサイクルが入るが、 このサイクルはとても時間がかかり受け入れがたい. REPL は瞬時にフィードバックが得られる.

RDD は TDD と組み合わせることもできる. テストを書くよりもより素早く フィードバッグを得られることが RDD の TDD に対するメリットだ. RDD の結果から, REPL の出力ずく pritty print をコピペすることで TDD のテストケースを書くことで、 リグレッションテストのメリットを享受できる.

資料

日本語

RDD 解説したスライド.

たいへん丁寧な解説。参考になる.

つまり、プログラムを作りながら、横で REPL を起動しておき、 その関数をロード(またはリロード)して実際に使ってみて、 さらに修正して、使ってみて、ということができる、ということです。

REPL 駆動開発を体験することができる.

Clojure は他の言語とは違ってファイルをベースに開発しません。 基本的に REPL の上に全てあるので、それを最大限に活かして開発出来るのが Clojure の利点であり他の言語に対するひとつの優位性でしょう

英語

REPL で評価した結果をコピペで TDD の期待値としてつかえば、 期待値を用意するのが楽。REPL の結果からテストが自動できればいいねという話.

所感

なにも REPL 駆動開発なんて、名前をつけるまでもなく、 つくったコードを動かして結果を確認するということは、当たり前のことだ. C 言語をはじめて勉強したときも、書いて、コンパイルして、実行をしていた.

REPL 駆動開発は、このフィードバッグを得るスピードが普通よりも抜群に速いことで、 開発により集中出きるのではと感じた. Emacs で C-x C-e をすることで、 Clojure や Emacs Lisp コードを評価して結果をパッと得られることは、快感でもある.

RDD は TDD と比較されることが多い. TDD はテストコードを書くのに、またメンテナンスすることに時間がかかることが問題視されることが多い. TDD は費用対効果を考えてやらなければならないというのが今の持論.

とくにプロトタイプなどは品質よりは速く成果をあげることが大事.そこで、RDD である. 先日ハッカーと画家を読んだが、そこでも速くアイデアを形にすることがハッカー気質だと学んだ.

より素早くフィードバッグを回してガンガンつくることに相性が良い.

REPL 駆動開発は、素早くプロトタイプや自分の考えを形にするときに有効な手段だと感じた.

28 Dec 2015, 17:39

あなたはハッカーですか?ハッカーと画家から学ぶハッカー気質について。

ハッカーと画家を読んだ.

エッセイの随所で、ハッカーの気質について語られている.

本記事では、その箇所の抜粋と要約、それに対する自分の考えをメモする.

記事を読むたびに、自分はハッカーとは程遠い存在なのだと悲観してしまう.

メイド・イン・ USA

コードは、ピラミッドみたいに、慎重に計画をしてから苦労して組みくものではない。 一気に集中して手を動かしながら、常に気を変えていく、木炭スケッチのようなものだ.

ソフトウェアの腕のよさは、素早い仕事を意味する.

そこでは大胆さが酬われる.

車や都市はそうはいかない. あまりに物質的すぎるからだ.

とにかくやる、という方法は、確かに利点がある. 速度がその理由だと思う. 誰でも作れる日用品を作ることで富を成すのは難しい. 価値は新しいものにある. そして最初になにかを作り出したいと思うならば速くやることは重要だ.

ハッカーの気質というものを、ソフトウェアや映画と都市や車の対比によって説明している.

  • ハッカー気質 … 速さ、新しさ
  • 職人気質 … 精密さ、成熟さ

アメリカ人は、日本に比べて車をつくることは下手だけれども、 ソフトウェアをつくるのは得意、それはハッカー気質をもっているから.

ハッカー気質、自分には存在するか?今のところ、ない. 一気呵成に自分の頭に浮かんだアイデアをコードに落とすことができない. それは、気質の問題なのだろうか?才能の問題なのだろうか?

ハッカーと画家

ハッカーと画家に共通することは、どちらもものを創る人間だということだ。

ハッカーと数学者は科学をやっているわけではないんだ。

科学者は、まず完璧な仕事から始める. つまり、 誰か他の人が既にやったことを再現することから始める。 そうしているうちに、独自の仕事が出来るレベルに達するのだ。 一方、ハッカーは、最初から独自の仕事をする。 ただ、最初はへたくそだろう。ハッカーはオリジナルから始め、 上手になってゆく。 科学者は上手になることから始め、オリジナルになってゆく。

ハッカーと科学者の対比によって、両者の違いを示している.

ハッカー気質 科学者


美しいデザインで評価される 独創的な論文で評価される 実践重視 理論重視 独自なものから上手になる 完璧なものを再現して上手になる

ハッカーと画家は*ものを創る*という点において共通していると述べている.

  • 昼間の仕事をもち、美しい創作の時間は別の時間にもつ。
  • 自分で書く(描く)ことによって学ぶ。ハックしながら学ぶ。
  • 技法を模倣することで上達する。
  • 次第に詳細化しながらものを創っていく(細部から全体へ)
  • 偉大な作品は到達すべきゴールのさらに上をいっていなければならない
  • 美に対する熱狂的な没頭を要求する。見えない細部にもこだわる.
  • 他の人と共同で作品をつくる。共感能力が必要。
  • 絵画同様に、ハッキングもクールな時代がやってくる.

自分は、ハッカーというよりも科学者に近い. 自分の学習スタイルは、本を買って読んでいる。 つまり、完璧なものを模倣することで上達を考えている。 これは、ハッカー気質からは遠いことだ。

ハッカー気質とは、下手でもいいからなにかを創り上げながら上達していく. なにかをつくりあげて、github に公開したこともない.

The Word Hacker

一般的には、ハッカーとはコンピュータに侵入する人物のことを指す。 プログラマの間では、優れたプログラマを指す。 プログラマにとって”ハッカー”は文字通りその道の達人であることを意味しているんだ. つまり、コンピュータに、よいことであれわるいことであれ、 自分のやりたいことをやらせることができるもの、と言うことだ.

名詞の”ハック”には二つの意味がある. それは賞賛にもなるし、侮辱にもなる. 醜い解答と独創的な解答には、共通点がある。どちらもルールを破っているということだ.

ハッカーは規則に従わない。それがハッキングの本質なんだ。

トマス・ジェファーソンはこう書いている。 『政府への慣行の精神は、ある種の状況では非常に価値のあるものだ。 だから私は、そのような精神が常に保たれることを望む』

ハッカーの気質、それはルールを破ること。 ルールを破ることが富と力の源であり、アメリカ人の気質ではなかったかと。

自分は、日本人だし、とりわけルールを破ることに臆病だ。 この点においても、ハッカーには遠い。

普通のやつらの上を行け

エリック・レイモンドはエッセイ「ハッカーになろう」の中で、 他のいろいろなアドバイスに混じって、 ハッカーになりたい人はどんな言語を勉強すべきかを述べている。 まず Python と Java から始めよ、学ぶのが容易だから。 真剣なハッカーはさらに、Unix をハックするために C を学び、 システム管理と CGI スクリプトのために Perl を学ぶべし。 そして本当に真剣なハッカーは Lisp を学ぶことを熟慮すべきだ、と。

技術を選択するときは、他の人がどうやってイルカなんて無視して、 何が最適かを見極めることだけを考えるべきだ.

プログラミング言語は、その力において差がある。 アプリケーションを書くならば、手に入るなかで最も力の強い言語を使うべきだし、 そうでない選択は、機械語を使うことが間違いであるのと同様で、間違いなのだ.

私は、Lisp が一番上にくると言おう。なぜなら、マクロがあるから。

ハッカーは Lisp を学ぶべきと、Lisp を熱く語る文章.

自分は、Lisp ができない.

素晴らしきハッカー

難しいのは、問題を解くことではなく、どの問題を解くかを決めることだ。 創造性を測るのは難しい。が、現実にはそれはコードの行数で測られるような 生産性をはるかに陵駕するだろう。

スーパーハッカーを特徴づけている資質は、 プログラミングを本当に愛しているということだ。 普通のプログラマは生活のためにコードを書く。 素晴らしいハッカーにとっては、コード書きは楽しみのためにするもので、 それにお金を払ってくれるというひとがいれば大いに喜ぶものだ。

ハッカーはよい道具が好きだ。悪い道具をつかうことに耐えられない.

素晴らしいハッカーはオープンソースを使うことを主張する。 そのほうが良質だというだけでなく、自分で多くをコントロールできるからだ。

ハッカーにとって、ソフトウェアの次に大事な道具は、おそらく仕事場だ。

ハッカーは、よい道具とともに、面白いプロジェクトを好む. 新しい技術的な挑戦があれば、どんなアプリケーションだって面白くなれる。

良いハッカーになる鍵は、たぶん自分がやりたいことをやることだ。 何かをうまくやるためには、それらを愛していなければならない。 ハッキングがあなたがやりたくてたまらないことである限りは、 それがうまくできるようになる可能性は高いだろう。

ハッカーはとりわけ好奇心が強い。 集中力について、他のすべてのことを頭から追い出せる能力。

自分を素晴らしいハッカーにすることができるとしたら、 退屈なプロジェクトの仕事は一切しなくてよい、その代わり、 絶対に中途半端な仕事はしないと誓うことだ。

この文章では、よいハッカーの特徴について乱雑にかかれている.

  • よい道具を愛する
  • よい職場を愛する
  • 面白いプロジェクトを愛する
  • やりたいことをやる
  • 好奇心と集中力が強い

自分は、いやいやながら、どんな仕事でもしてしまう。 それは、自分はプログラムを生活のために書いているからだ。 生活のためではなくて、楽しみのために書くほど実力がない。

プログラミングすら、今の自分には愛せないでいる.

まとめ

ハッカーに憧れてきた。しかし、ハッカーとは程遠い自分を再認識した.

自分の嫌になるほどの、慎重さ、臆病さが、ハッカー気質を妨げる。

自分は本当に、この道を選んで正解だったのか?

ハッカーになりたければ、もっと大胆に考えて、行動しなければいけない.