11 Feb 2015, 02:20

関数型言語 (Scala) をどうオブジェクト指向の現場に持ち込むか? セミナーをきいた感想

はじめに

今日は, なんだか仕事のやる気も起きないアンニュイな気分だったので, 仕事をサボって社内で開かれたセミナーを聴きにいきました.

Scala による OO と FP のお話

スピーカーは, 浅海智晴さん.

話の内容は, “オブジェクト指向と関数型プログラミング (Scala)“について.

用語を復習しようと Google で検索していたら, 今日きいた話のスライド発見. 一生懸命メモをとったものの, ラッキー.

以下, 用語についての復習と感想を書く.

背景

ハードウェアのメニーコア, 大容量メモリ化によって, 性能のボトルネックが I/O ではなくて, アプリケーションとなってきた. アルゴリズムが勝負の世界. アプリがボトルネックになってきた. そのため, 言語レベルで平行・並列処理が書きやすい言語が求められるようになった.

Cloud Computing において, 異常が発生したら全体をとめるのではなくて, 一部を停止して運用を継続させる必要がある.従来の例外処理では処理する のが複雑になってきた.そのため, 言語レベルで分散コンピューティングや Fault Tolerant をサポートするような言語が求められるようになった.

所感

ストレージ業界にいることもあって, アプリが性能のボトルネックになるというはなしはよくきく.

以前, 次世代メモリと呼ばれている ストレージ・クラス・メモリ (SCM) の技術動向の話をきいたときにも同じはなしが出た. アプリがストレージの性能のボトルネックになるとわかったとき, 我々開発者はなにをすればいいのか? という質問がでたが, 答えは,

関数型言語をつかうこと

All SCM Array が数年後に実現したときにはじめて, プログラミングの パラダイムシフト が起こるかもしれない.

関数型言語とは

過去と現在の関数型言語の認識の違い.

昔は, 高階関数 をサポートする言語という緩い定義だった.

現代のモダンな言語の定義は違う!

現代のモダンな言語 (Haskell, Scala など) は,

数学的理論を背景にプログラムを記述する言語

数学をベースとするプログラミング

数学的理論とは, たとえば以下.

  • ラムダ計算
  • 数理論理学
  • 圏論

とりわけ, Monad が大事.Monad をつかって, どうつくるかという流れ.

所感

数学のベースについて, 以下の記事でまとめられているが,これがおもしろい. 数学がベースといってはいるものの, 数学のほんの一部分.抽象代数学がからんでいる.

自分は, 大学では一応応用数学を学んだ気がしたので, プログラミングと数学が結びつくという売り文句はとてもうれしいのだ.

ああ, 学生時代の苦しみは無益ではなかったのだと.

代数学は, 禅僧の修行のような単なる苦悩に耐え忍ぶ訓練だと思っていたので, まさか, 社会人になって再び群論にお目にかかるとは,学生のときには想像 出来ないことだった.

コンパイル = 証明

コンパイルを通すということは, 正しさを証明すること

関数型言語では, コンパイルが通るとバグがほとんどでない. 純粋関数の世界でプログラミングをすることによって, 実現できる. 背景には数理論理学がある.

このことがなぜ大事かというと, 並列プログラミングのバグとりは大変. テストですべてのバグをとれたという保証ができない.

関数型ならば数学をベースにして, バグがないことを証明することができる

関数型言語のメリット・デメリット

  • メリット
    • 高階関数を使った技が使える (それによってコードが短くなる)
    • 定理と証明
  • デメリット デメリットだけみると, 組み込み系ではほとんど出番なしな気がした. いつの時代も, C 言語最強?? いや, C で並列処理はつらい.

    質問時間に, 組み込み系では関数型言語は活用できますかと 質問してみたが, わかりませんという回答だったので, 調べてみた.

    有力候補は OCaml. 時間効率, 空間効率がいいらしい.

    マイナーな言語で ATS というものもあるが, 情報が少ない.

    分散システムを組むならば, Erlang もつかえるか? - 組み込みから生まれた言語 Erlang の時代が来る - 日経エレクトロニクス

    組み込み系といっても, リッチな環境の組み込み系ならばリソースなんて 関係ない?? Android は Java で動いているし, Scala だって.

Monadic Programming

モナドを中心にプログラムを組む方法.

モナドとは,

  • コンテナ
  • パイプライン
  • インタプリタ

モナドにはいろいろな種類がある.

  • IO モナド
  • State モナド
  • Future モナド …

モナドの使い方は難しいのだけれども, パターンがあるのでなれれば簡単.

所感

モナドはよくわからない.

しかし, 今日の話で距離が狭まった.

難解なもの, 副作用をもつものは, モナドに閉じ込めて隠蔽する. それによって, プログラムがスッキリする.

この言い回しは, OO におけるカプセル化 でもきいたような気がする.

難解なもの, 副作用をもつものは, オブジェクトに閉じ込めてカプセル化する. それによって, プログラムがスッキリする.

また, モナドには使い方があり, 覚えてしまえば簡単という話は, 以前まとめた関数型デザインパターンの話にもつながるのかもしれない.

Functinal Reactive Programming (FRP)

ある変化に応じて動作する, イベント駆動のプログラミング方法.

Reactive Programmig には, 2 つの種類があるように思う.

  • Actor Model
  • Monadic Model

所感

以下の記事がわかりやすい.

最近よくみかける用語だし, これから流行しそうな手法.

GUI, インフラ, ビッグデータ処理など様々な場面で浸透しつつあります. 今までは複雑すぎて作ることが難しかったアプリケーションが簡単に設計できるようになっていくでしょう.

リアクティブ宣言なんという, かっこいい文章も存在する.

Object-Functional Programming (OFP)

オブジェクト指向のパラダイムと関数型のパラダイムの両方を利用して プログラミングする.

上流工程では, 今までどおりオブジェクト指向設計で考えることになる. ユースケースで今までどおり要件定義をして, コンポーネント分割までする. そこから, オブジェクトかファンクションのどちらかつかって責務を実現する. なので, OOP と FP は共存関係にある.

OFP 新三種の神器.

  • トレイト
  • モナド
  • 型クラス

OFP を導入することメリットは, 以下.

  • 高階関数DSL を書くことで 開発効率 をあげる
  • Monadic Programming を行うことで並列処理の品質をあげる

どこに Functional Programming を適用するか?

Functinal Programming で書くと, バグが出にくいので, Functonal Programming の割合をできるだけ増やしていくのがベスト.

システム開発では, OO:FP の割合は 6:4 くらいか??

FP でつくるのに適した部分は, DSL の部分. OOP で, Framework と呼ばれている部分.

アプリ開発は Java でもいい. アプリ開発の基盤にある DSL 部分を 関数型でかく.

DSL

DSL とは,特定のタスク向けに設計されたコンピュータ言語. DSL は一種類のタスクをうまく実行することに集中したもの.

そして, FP (というよりも Scala) は, DSL を書くことに 適している (Scalable language). なぜなら, 簡単に独自の型や制御構造を定義できるので.

まとめ

去年から, 関数型言語をかじりはじめてきたが, 自分が理解してきた

  • Stateless
  • High-order function

という考え方は, いわゆる伝統的な FP の概念だということを知った. また, それにかわるモダンな考え方は Monad だということも知った. (OFP 新三種の神器)

モナドについては, ほとんどまだ理解できていないので, 今年はモナドに注目して学んでいくことにする.

個人的には, 関数型言語を並列処理どう適用するかという話をもう少し つっこんで知りたい. それも, Monadic Model を理解すると見えるかもしれ ない.まずは, Monad.

Next Action

今は (伝統的!) 関数型言語の聖典, SICP を読んでいるので, Monad はさておき, まずはこれを読み終えなければ.

4 月か 9 月に coursera の Scala の講義が開講されたらもう一度受けてみる. (なぜなら, 前回は落第して単位をもらえなかったから…)

Reactive Programming についても学んでみたい. 去年 coursera で講座が 開講されるのをまっていたのだが, 去年は開講されなかった. 今年も開講されなかったら, 11 月からアーカイブ講座をつかって学んで見ようと思う.

05 Feb 2015, 12:59

統計解析の基礎を学ぶ! edX の Foundations of Data Analysis をうけた

はじめに

統計の基礎を勉強するために, edX の Foundations of Data Analysis を受けました.

内容

タイトルどおり, 統計学の基礎を 11 週に渡って学ぶ講座. 大学初年度の学生が 1 年かけて学ぶ内容をざっと網羅している.

前半は, 記述統計学・後半は推定統計学, とくに仮説検定.

以下, 用語を思い出しながら主要なキーワードを列挙.

  • 記述統計学
    • 統計モデル
      • 線形モデル
      • 指数モデル
      • 対数モデル
    • 確率分布
      • 二項分布
      • 正規分布
    • 相関
  • 推定統計学

    • サンプリング
    • 区間推定・点推定
    • 仮説検定
      • Z 検定
      • T 検定
      • F 検定
      • カイ二乗検定
      • 分散分析

    言語は R を利用する. R を利用した統計解析の方法が一通り分かるところがよい.

    この講座のかわっているところは, Reading が多いこと. テキストが PDF で毎週ダウンロードできる. その内容を読んでから, R の使い方を学んで, 問題をとくスタイル.

    また, この講座のよかった点は, 課題が現実のデータを利用しているところ. 実験の分析などの, 現実とはかけ離れた内容ではなく, 親しみやすいデー タなので, 興味が沸きやすい.

    あくまで, 基礎的な内容なのでそこまで難しくはない. 1 難しい数式もでてこない. なので, 数学があまり得意でない文系のひとでもついていけると思う.

感想

大学の統計学の授業はつまらなかった

大学生のときに統計の授業を受けたのだが, それよりも圧倒的にわかりやすかった!! 無料でわかりやすい授業がうけら れると, 大学の授業はどうなってしまうのだろう?? That’s MOOC 革命.

大学のときの統計がつまらなかった理由は,

  • データを扱わなかった
  • 数式ばかりをあつかっていた
  • プログラミングで計算しなかった

こんなところで大学の授業の愚痴をいってもしょうがないのだが, 統計学なはずなのに, 実際にデータを分析するようなことは一切なかったし, グラフを書くようなことも一切なかった. 朝一に授業がはじまって, 難しい 数式をノートにひたすら写していた記憶しかない.2

この講座は, 大学生のときにつまらないと思っていた要因の反対のことをし ている. だから, おもしろい.

あくまで基礎

そんなわけで, 大学生以来, xx 年ぶりに統計を学び直した.

  • 覚えていたこと
  • 忘れていたこと
  • 習っていないこと

がそれぞれ出てきて, 毎週おもしろかった. 仮説検定はほとんど大学では学ばなかった 3 ので, 考え方が新鮮だった.

ただ, これは基礎だ. 以下のページに統計学の大まかな図があったのだが, 基礎の先には広大な統計学の応用領域が広がっている.

これから

この先は, 統計学のおもしろそうな領域にすこしずつ手をつけていこう.

統計学が, 今後の人生にどう関係してくるのかはわからない. 勉強の先に宝が埋まっているかもしれないし, 徒労に終わってまた忘れてしまうかもしれない.

でも, 統計学がここ数年で急激に注目されていることは紛れもない事実だ.

必ず役に立つ, いや, 必ず役に立たせると信じることにする.

Footnotes


  1. 英語が難しいのだが… [return]
  2. そして, 朝起きることができなくて次第におサボリ. [return]
  3. 学んだけれども忘れたのかも [return]

01 Feb 2015, 16:08

helm-google と eww で サクっと キーワード検索が便利

はじめに

helm-google と eww を組み合わせたらなかなか相性がよかった.

helm-google

helm-google は, google 検索結果を helm で絞り込めるもの.

(require 'helm-google)
(setq helm-google-tld "co.jp")

eww と組み合わせる

ブラウザはデフォルトでは browse-url を呼んでいるので, これを eww を呼ぶように変更してしまう.

;; eww で表示
(setq helm-source-google
    `((name . "Google")
      (init . (lambda () (require 'google)))
      (action ("Browse URL" . eww-browse-url))
      (display-to-real . helm-google-display-to-real)
      (candidates . helm-google-search)
      (requires-pattern)
      (nohighlight)
      (multiline)
      (volatile)))

helm-resume と組み合わせる

helm-resume と組み合わせると便利. 検索語句にキーワードを追加で足して検索したいときは, helm-resume!!

便利だと感じたのは, 一度キーワードで検索をかけたあとに, 追加でキーワードを指定したいと思ったとき.

helm-resume だと, 前回の検索結果からはじまるので, 追加でキーワードををいれることができる.

検索結果の表示を高くする

検索結果は, helm の buffer に現れる. 画面の 20%にしか表示されないので, すこし小さい. 大きくしてみる.

最近追加された autoresize 機能で, 動的に高さを調整.

(helm-autoresize-mode 1) ;; 検索結果によってリサイズ. default 40%
(setq helm-autoresize-max-height 50)

01 Feb 2015, 06:58

Coursera で R 入門! Data Scientist の講座 2 つ

はじめに

今年の目標はデータサイエンスを学ぶこと.

coursera でデータサイエンスのシリーズ講座があるので, うけてみることにしました.

今回は, その中の 2 つを同時にうけた.

  <div id="outline-container-unnumbered-2" class="outline-2">
    <h2 id="unnumbered-2">
      Coursera の データサイエンティストシリーズの紹介の講座
    </h2>

    <div class="outline-text-2" id="text-unnumbered-2">
      <p>
        データサイエンテス関連の講座が去年に公開された.
      </p>

      <ul class="org-ul">
        <li>
          <a href="https://www.coursera.org/specialization/jhudatascience/1">Data Science &#8211; Specialization | Coursera</a>
        </li>
      </ul>

      <p>
        去年はあまり余裕が無かったけれども, 今年はちょっと背伸びをして受けてみる.
      </p>

      <p>
        データサイエンスの分野が細かく 9 つに分けられて講座として用意されて いる.
      </p>

      <ol class="org-ol">
        <li>
          The Data Scientist&#8217;s Toolbox
        </li>
        <li>
          R Programming
        </li>
        <li>
          Getting and Cleaning Data
        </li>
        <li>
          Exploratory Data Analysis
        </li>
        <li>
          Reproducible Research
        </li>
        <li>
          Statistical Inference
        </li>
        <li>
          Regression Models
        </li>
        <li>
          Practical Machine Learning
        </li>
        <li>
          Developing Data Products
        </li>
      </ol>

      <p>
        ひとつの講座が 1 ヶ月単位. このシリーズの特徴は, 毎月同じ講座が開 講されていること. 半年や一年に一回開講される他の講座に比べると, 珍しい. 検索をかけると, 一年中トップに検索結果が表示されるので, よく目につく.
      </p>

      <p>
        毎月 1 つの講座をうけようとは思うものの, 終わるまで 9 ヶ月かかりそうな&#x2026;
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-3" class="outline-2">
    <h2 id="unnumbered-3">
      Data Scientist&#8217;s Toolbox
    </h2>

    <div class="outline-text-2" id="text-unnumbered-3">
      <p>
        この講座は, シリーズのはじめにうける必要がある.
      </p>

      <ul class="org-ul">
        <li>
          <p>
            <a href="https://www.coursera.org/course/datascitoolbox">The Data Scientist&#8217;s Toolbox</a>
          </p>

          <p>
            2 つのトピックを扱う.
          </p>

          <ul class="org-ul">
            <li>
              データサイエンスの概要と, シリーズの別の講座の詳しいガイダンス.
            </li>
            <li>
              データサイエンティストに必要なツールを身につける
            </li>
          </ul>

          <p>
            以下のツールを利用する.
          </p>

          <ul class="org-ul">
            <li>
              R
            </li>
            <li>
              RStudio
            </li>
            <li>
              git
            </li>
            <li>
              github
            </li>
          </ul>

          <p>
            しかし, すべてのツールを利用したことがあったので, なんと 2 時間で 終わってしまった! あっけない.
          </p>

          <p>
            この講座は, データサイエンスシリーズのオリエンテーションだった.
          </p>
        </li>
      </ul>
    </div>
  </div>

  <div id="outline-container-unnumbered-4" class="outline-2">
    <h2 id="unnumbered-4">
      R Programming
    </h2>

    <div class="outline-text-2" id="text-unnumbered-4">
      <p>
        シリーズを通じて R を利用する用なので, まずは R 言語を学ぶ.
      </p>

      <ul class="org-ul">
        <li>
          R の基本文法
        </li>
        <li>
          R の基本データ構造
        </li>
        <li>
          R の 関数型の性質 (apply 系)
        </li>
        <li>
          デバッグ方法・プロファイリング方法
        </li>
        <li>
          Random 生成によるシミュレーション
        </li>
      </ul>
    </div>

    <div id="outline-container-unnumbered-5" class="outline-3">
      <h3 id="unnumbered-5">
        課題
      </h3>

      <div class="outline-text-3" id="text-unnumbered-5">
        <p>
          課題は, csv ファイルからデータを読み出して, 編集して表示するようなもの. 統計的なはなしはほとんどでてこない. せいぜい平均程度.
        </p>

        <p>
          言語の文法とデータの扱い型の説明に終始している.
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-6" class="outline-3">
      <h3 id="unnumbered-6">
        感想
      </h3>

      <div class="outline-text-3" id="text-unnumbered-6">
        <p>
          week1,2 は基本文法を次から次へと紹介されるので, 頭が追いつかない. 少し忘れた.
        </p>

        <p>
          講座では, R の関数型の性質が強く説明されていたように感じた. apply の説明に week3 のほとんどが費やされるなど.
        </p>

        <ul class="org-ul">
          <li>
            値は代入では無くて, 束縛.
          </li>
          <li>
            loop を利用するよりも, apply を利用するとプログラムが短くなる.
          </li>
        </ul>

        <p>
          なんとなくだけれども R を身につけた. 文法は抑えたので, あとは R の関数の使い方を覚えていけば大抵のことはできる気がする.
        </p>

        <p>
          R を利用すると, 大きな CSV データが簡単に処理できることに驚いた.
        </p>

        <p>
          いままで, Excel しか知らなかった人間にとって, <b>データをプログラムで解析する</b> という新しい視点を手に入れた. こういう, 新しい知見を得ることも, MOOC に取り組む一つの目的だ. g
        </p>
      </div>
    </div>
  </div>

30 Jan 2015, 04:31

Coloring Rules で Filter に色付け! カラフルな DarkWireShark でログ解析を加速する方法

はじめに

前回の続きです.

WireShark の Coloring Rules をいじることで, 表示されるパケットに自由に色をつけることができたので紹介.

Coloring Rules をいじる

Wireshark を開き,

  • ツールバーから view > Coloring Rules を選択.
  • New を選択
  • Name: で名前をつける. String で絞りこむ条件を入れる.

この設定をすることで, 起動時から Filter に色をつけておくことができる. たとえば, 以下の記事に書いたフィルタをあらかじめ色付けしておけば, とてもログ解析がやりやすくなる.

以下, 色づけの例.

Name Fildter ForeGround BackGround
SMB2 smb2 #F8F8F2 #272822
SMB2 ERROR smb2.nt_status>0 #F8F8F2 #FF5800
SMB2 CREATE smb2.cmd==5 #F8F8F2 #225D71

これだけでも, だいぶカラフルになる.

SnapCrab_NoName_2015-1-30_13-19-44_No-00.png

29 Jan 2015, 12:53

WireShark で SMB/CIFS のパケット解析をするときの便利 Tips

はじめに

仕事で SMB プロトコルのパケット解析ばかりするようになってきた.

少し Tips がたまってきたので, 忘れないうちにメモしようと思う. SMB2 限定.

かなりニッチな内容だけれども, いつかどこかで誰かの役に立つことを願う.

検索を利用する

Ctrl + F で検索窓か開くので, キーワードから検索.

Filter を利用する

素早く情報を検索するには, フィルタが有効.

  • ツールバーからフィルタのパターンを入力
  • よく利用するものは, save を押すと再利用可能
  • フィルタの追加, 削除は Edit > Preferences > Filter Expressions から.

以下, よく利用するものを列挙

smb プロトコルをフィルタする

<div class="outline-text-3" id="text-3-1">
  <p>
    これは基本.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb or smb2<br /> [/sourcecode]
  </p>
</div>

IP アドレスでフィルタリング

<div class="outline-text-3" id="text-3-2">
  <p>
    サーバのログをみるとき, たくさんのクライアントからのアクセスがある ので, ログが見づらい. 以下で, 送信元または送信先でフィルタリング.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1<br /> [/sourcecode]
  </p>

  <p>
    送信元と先を指定する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1 and ip.addr == 10.0.0.0<br /> [/sourcecode]
  </p>
</div>

NT Status が エラーのものをフィルタリングする

<div class="outline-text-3" id="text-3-3">
  <p>
    エラーを素早くチェックするために.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.nt_status > 0<br /> [/sourcecode]
  </p>
</div>

Command Code でフィルタリング

<div class="outline-text-3" id="text-3-4">
  <p>
    コマンドコードで絞込み.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> # create でフィルタ<br /> smb2.cmd==5<br /> [/sourcecode]
  </p>

  <p>
    コマンドコード一覧
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://msdn.microsoft.com/en-us/library/cc246528.aspx">2.2.1.1 SMB2 Packet Header &#8211; ASYNC</a>
    </li>
  </ul>
</div>

FileId でフィルタリング

<div class="outline-text-3" id="text-3-5">
  <p>
    create response コマンドにある fileId を追跡する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.fid==00004001-0000-0000-0000-000000000000<br /> [/sourcecode]
  </p>
</div>

tshark を利用する

コマンドラインの tshark を利用したほうが, 操作が早いことに気付く. しかし, Detail をしっかりみるためには GUI 版の WireShark がいい.

smb でフィルタリンクしたものを吐き出し. これでログが軽くなる.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2’ -w foo.pcapng
[/sourcecode]

-Y でフィルタをかける. サブ画面でちょっとした grep をするのに便利.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.cmd==5’
[/sourcecode]

エラーがないかなどを素早くチェックする.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.nt_status > 0’
[/sourcecode]

25 Jan 2015, 09:31

Emacs での テキストブラウザ eww を使えるレベルにする

はじめに

最近よくマックにいくのだけれども, ここがとても電波回線が悪い (@_@);

ネットサーフィンをしてても, とてもストレスがたまる. このままだと, マックのせいでストレスから立ち直れなくなってしまうので なんとかしようと思った.

テキストブラウザをつかえば, よりサクサクとネットを楽しめるのではとお もい, Emacs での テキストブラウザの eww をつかってみた.

EWW とは

Emacs での テキストブラウザ. Emacs24.4 からデフォルトで Emacs にはいっている.

Basics Config

KeyBindings

  • N (eww-next-url)
  • P (eww-previous-url)
  • l (eww-back-url)
  • r (eww-forward-url)
  • H (eww-list-histories)
  • & (eww-browse-with-external-browser)
  • b (eww-add-bookmark)
  • B (eww-list-bookmarks)
  • q (quit-window)

見にくいときは, R eww-readable をすると, 余計なリンクやサイドバーが消えて見えやすくなる.

いくつか自分でも追加.

(define-key eww-mode-map "r" 'eww-reload)
(define-key eww-mode-map "c 0" 'eww-copy-page-url)
(define-key eww-mode-map "p" 'scroll-down)
(define-key eww-mode-map "n" 'scroll-up)

背景色の設定

正直, 以下の記事をみつけなければ, eww は利用していなかった!!

黒背景を利用していると, google の検索結果が白みががかってしまってつか いものにならなかった. 以下の設定をしたら, あらー不思議. いろが消えた.

(defvar eww-disable-colorize t)
(defun shr-colorize-region--disable (orig start end fg &optional bg &rest _)
  (unless eww-disable-colorize
    (funcall orig start end fg)))
(advice-add 'shr-colorize-region :around 'shr-colorize-region--disable)
(advice-add 'eww-colorize-region :around 'shr-colorize-region--disable)
(defun eww-disable-color ()
  "eww で文字色を反映させない"
  (interactive)
  (setq-local eww-disable-colorize t)
  (eww-reload))
(defun eww-enable-color ()
  "eww で文字色を反映させる"
  (interactive)
  (setq-local eww-disable-colorize nil)
  (eww-reload))

default の検索エンジンを Google に変更

default では, duckduckgo が設定されている. Google へ.

(setq eww-search-prefix "http://www.google.co.jp/search?q=")

dokudokgo

こまかくパラメータ設定

  • kl=ja-jp 日本語
  • k1=-1 広告なし
  • kc=1 自動先読み
  • kf=-1 サイトアイコンなし
  • q = 検索文字

=> サイトアイコンなしは動かない.

;; (setq eww-search-prefix "https://duckduckgo.com/html/?kl=jp-jp&k1=-1&kc=1&kf=-1&q=")

eww 複数起動する

バッファ名を rename すればいい.

(defun eww-mode-hook--rename-buffer ()
  "Rename eww browser's buffer so sites open in new page."
  (rename-buffer "eww" t))
(add-hook 'eww-mode-hook 'eww-mode-hook--rename-buffer)
  • eww-list-buffers (S にキーバインドされている) 生成した eww を一覧で表示できる.

クイック検索

サクッと Google 検索をしたいので, 検索機能を強化した.

  • 検索結果にハイライトをつける.
(defun eww-search (term)
  (interactive "sSearch terms: ")
  (setq eww-hl-search-word term)
  (eww-browse-url (concat eww-search-prefix term)))

(add-hook 'eww-after-render-hook (lambda ()
                   (highlight-regexp eww-hl-search-word)
                   (setq eww-hl-search-word nil)))

テキストブラウザは地味なので, ときには別のブラウザでも Web ページを閲覧したい. 私は普段は conkeror を利用しているので, これで開きたい.

以下の関数で今見ているページを外部ブラウザで開くことができる. &にキーバインドされている.

eww-browse-with-external-link

以下の設定で, ブラウザを conkeror に指定.

(setq browse-url-generic-program (executable-find "conkeror"))
(setq shr-external-browser 'browse-url-generic)

現在の url を eww で開く

外部ブラウザで開きたいときもあれば, eww で開きたいときもある.

(defun browse-url-with-eww ()
  (interactive)
  (let ((url-region (bounds-of-thing-at-point 'url)))
    ;; url
    (if url-region
      (eww-browse-url (buffer-substring-no-properties (car url-region)
                              (cdr url-region))))
    ;; org-link
    (setq browse-url-browser-function 'eww-browse-url)
    (org-open-at-point)))
(global-set-key (kbd "C-c p") 'browse-url-with-eww)

画像表示

画像は遅いので表示させない. 以下の記事のテクをそのまま借りた.

(defun eww-disable-images ()
  "eww で画像表示させない"
  (interactive)
  (setq-local shr-put-image-function 'shr-put-image-alt)
  (eww-reload))
(defun eww-enable-images ()
  "eww で画像表示させる"
  (interactive)
  (setq-local shr-put-image-function 'shr-put-image)
  (eww-reload))
(defun shr-put-image-alt (spec alt &optional flags)
  (insert alt))
;; はじめから非表示
(defun eww-mode-hook--disable-image ()
  (setq-local shr-put-image-function 'shr-put-image-alt))
(add-hook 'eww-mode-hook 'eww-mode-hook--disable-image)

eww-copy-page-url (w) で現在の URL をクリップボードにコピー.

しかし, やりたいことは org-mode のリンクをクリップボードにコピーす ること.この機能かあるかどうかで, 情報収集のスピードが全然違う.

別記事にしました.

External Elisps

eww-hatebu

モードラインにはてぶ数を表示する.

(require' eww-hatebu)
(eww-hatebu-setup)

はてなブックマークを投稿するには, メールからのブックマーク機能を利用する. wl-draft を起動して, コメント書いて送信.

helm-eww-history

helm インタフェースで履歴を見る.

helm-eww-bookmarks

helm インタフェースでブックマークを見る.

(require 'helm-eww-bookmark)
(define-key eww-mode-map "B" 'helm-eww-bookmark)

auto-hightlight-symbol で語句をハイライト

auto-hightlight-symbol を利用すると, 語句にカーソルを当てるだけで, キーワードがハイライトされる.

なんかもうメンテナンスされていないようにみえる.

(require ' auto-highlight-symbol)
(add-hook 'eww-mode-hook 'auto-highlight-symbol-mode)
(global-auto-highlight-symbol-mode t)

ace インタフェースによるリンクの選択. これは必須!! conkeror のようなリンク選択ができる.

o をおすと発動.

(require 'ace-link)
(eval-after-load 'eww '(define-key eww-mode-map "f" 'ace-link-eww))
(ace-link-setup-default)

24 Jan 2015, 15:23

関数型デザインパターンのプレゼン動画をまとめてみた

はじめに

オブジェクト指向言語の世界では, デザインパターンが人気!

関数型言語の世界でも, OO の影響を受けて, きっと誰かがパターンを考えているに違いないと考えて, いろいろとネットで情報収集してみた.

思ったとおりで, いくつか動画をみつけたのでまとめてみる.

Functinal programming patterns for the non-mathematician

15 分くらいに短くまとまっている動画. JavaScript.

関数に成り立つ法則によってまとめている.

  • Composition laws
  • Lenses laws
  • Fmap laws
  • Monad laws
  • Applicative laws
  • Monoid laws
  • Arrow laws

SlideShare のプレゼン資料

Functional Programming Patterns

動画はリンク先から.

プレゼン, 動画ともにとてもボリュームがある. 導入部の説明がとても笑える.

SlideShare のプレゼン資料

Patterns and Functional Programming

Patterns and Functional Programming from Chariot Solutions on Vimeo.

この本を書いた人の動画.

Amazon:

Pragmatic Bookshelf:

既存の OO Pattern を FP で置き換える.

こんな記事もみつけた.

Replacing Object Oriented Patterns
    Introduction
    Replacing Functional Interface
    Replacing State Carrying Functional Interface
    Replacing Command excerpt
    Replacing Builder For Immutable Object
    Replacing Iterator
    Replacing Template Method
    Replacing Strategy
    Replacing Null Object
    Replacing Decorator
    Replacing Visitor
    Replacing Dependency Injection

FP 独自のパターンも紹介.

Functional Patterns
    Introduction
    Tail Recursion excerpt
    Mutual Recursion
    Filter-Map-Reduce
    Chain of Operations
    Function Builder
    Memoization
    Lazy Sequence
    Focused Mutability
    Customized Control Flow
    Domain-Specific Language

これはあとで読みたい.(できれば日本語訳で!!)

Functional Design Patterns

Clojure による,パターンの紹介.

内容をみていないのだけれども, ブックマークだけしておく.

  • State/Event,
  • Consequences,
  • Accumulator
  • MapReduce,
  • Reduce/Combine,
  • Recursive Expansion,

おわりに

シンフォニーとミニマルミュージック

OO でのパターンと FP のパターンでは, うけるイメージが違った.

OO のパターンからは, 堅牢な構築物のようなイメージを受ける. それは, クラス図で表現されているからかもしれない.

それに対して, FP からは, ミニマルな文様なようなイメージを受ける. 微細なパターンが組み合わさって, 全体をつくるような. FP で言うところのパターンは小さいので, OO でいうところの idiom のようにもとらえられる.

それは, 堅牢な交響曲と, 微細なテクノミュージックのような違いを感じる.

今年の目標は関数型パターンをみにつけること.

去年の目標は, OO のデザインパターンを身につけることが目標だった.

今年は, FP のパターンを身につけることを目標にしよう.

それにしても, FP のパターンは Gof のような教科書が見当たらない.

動画の内容にも言えることだけれども, いろんなひとがそれぞれの意見を持っているような群雄割拠状態.

だれでもいいので, すごい本とか出してこの分野を統一してくれないかなと思ってみたり.

23 Jan 2015, 01:38

もうダサいなんていわせない! 黒くてクールな DarkWireShark

はじめに

WireShark がダサいとおもっているならば, それも今日限りだ.

WireShark の UI をクールなブラックにする方法を紹介.

環境

  • Windows 8.1
  • WireShark 1.12

手順

WireShark は GTK2 を UI として利用している. なので, GTK2 のテーマを適用することができる.

テーマを以下からダウンロード

なかにテーマいろいろある.

適当なテーマを選んで, WireShark のインストールフォルダにそのまま コピペする. WireShark を再起動すると, 選択したテーマで起動される.

テーマをチェック

テーマは Youtube 動画がいくつかある. 動画で色をチェックしてから利用するのがいい.

BookMarks

22 Jan 2015, 15:49

Team Geek を読んだ. 仕事をつくるのは誰か?

はじめに

とりたてて読む動機はなかったのだけれども, 図書館でふとタイトルに止まったので借りて読んでみました.

内容

Google のエンジニアがエンジニアの働き方について書いた本.

薄い本なのですぐ読める (1-2 時間) しかし, 得るものはおおい. 講演を元にしているようで,口語で軽い語り口だほ

  • 1 章 天才プログラマの神話
  • 2 章 素晴しいチーム文化を作る
  • 3 章 船にはキャンプテンが必要
  • 4 章 有害な人に対処する
  • 5 章 組織的操作の技法
  • 6 章 ユーザーも人間

感想

1 番こころにのこったのは, 第 3 章だ. この章は, マネージャーについてかかれている.

管理職にはなりたくない

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    正直にかくと, マネージャーにはなりたくない.
  </p>

  <p>
    消極的な理由は, 自分はひとをまとめる力がなくて, メンタル的に打たれよわいから. また, 自分のまわりにいるマネージャーをみると, いつも障害対応でクタクタになっているように見える.
  </p>

  <p>
    積極的な理由は, コードを書く時間がなくなるから.
  </p>
</div>

サーバントリーダーとテクニカルリーダー

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    マネージャーは, 野球部の女子マネージャーのような存在で, 野球選手が輝くためのことをするべき存在だと思っていた.
  </p>

  <p>
    そんな自分の思いを移すような内容だった. この本では, それを
  </p>

  <p>
    <b>サーバント・リーダー</b>
  </p>

  <p>
    と表現している. 19,20 世紀的なマネージャー観とこれからのマネージャー観は違うと書いている. 野球選手やお笑いタレントを影で支えるのがマネージャーの仕事.
  </p>

  <p>
    その代わりにサーバント・リーダーとともに, 技術的にチームを引っ張っていくテクニカル・リーダーの存在も書いている. 会社がうまく回るためには, サーバントリーダーとテクニカルリーダーの存在が不可欠なのだと.
  </p>
</div>

自分のなりたい姿について

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    あっというまに, 読んでしまったのだけれども, 少なからず自分のこれからの仕事観に影響を受けた.
  </p>

  <p>
    自分の将来が未だに描けないのだが, 自分はテクニカル・リーダーになりたいと思った. 従来のような管理職にはなりたくない.会社の仕組みとか人の管理とか, 興味ないし.
  </p>

  <p>
    実現したい想いをもって, ストーリーを描けるようになりたい.
  </p>

  <p>
    もしかしたら, そのためにはコードを書くことを犠牲にするかもしれない. 協力してくれる仲間を巻き込んで, 1 人ではできないような大きなことを成し遂げるのも, それはそれでいい.
  </p>
</div>

仕事をつくるのは誰か?

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    現状のマネージャー独裁運営から, テクニカルリーダーとサーバントリーダーによる共和制に移行するためには, テクニカルリーダーがもっとお金稼ぎについて責任をもつ必要がある.
  </p>

  <p>
    今の職場では, 仕事はマネージャーがつくりだすものだけれども, これからは, メンバの 1 人ひとりが, 新しいビジネスにつながることを考えないといけないと思う. そのためには, 一人ひとりが技術の動向についてもっと追いかけ, 議論して, 新しい金の卵は落ちていないか探す必要がある.
  </p>

  <p>
    今, 自分の所属している部署は, 売上が減ってきている. 受託開発を長年しているのだけれども,受託が減ることはこの先は明らかなのだ. 生き残っていくには, 新しいことにチャレンジする必要がある.
  </p>

  <p>
    しかし, 自分の目からみると, どうも回りの人は技術の動向に疎いように見える. 家に帰ってプログラミングをすることを厭うような文化がある. 家庭のためにプログラミングを通じてお金を稼ぐサラリーマンのような.
  </p>

  <p>
    今までは仕事があったからよかったのだけれども, これからは, 一人一人がもっともっとお金稼ぎについて 頭をひねるようなことをしないといけないと感じている.
  </p>

  <p>
    そんな状況で, 自分にできることはなんだろうか?
  </p>

  <p>
    ということを考えることが, 今受けてる会社の研修内容だったりする. 答えはおぼろげなので, ここまで.
  </p>
</div>

Bookmarks

以下, 心に残ったものを抜粋する.

天才プログラマの神話

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    ソフトウエア開発は <b>チームスポーツ</b> である.
  </p>

  <ul class="org-ul">
    <li>
      隠したらダメになる.いつも一人でやっているとリスクが高くなる. 成果を共有することで <b>バス係数</b> (冗長性) が高くなる.
    </li>
    <li>
      ソーシャルスキルの三本柱は以下.(HRT) <ul class="org-ul">
        <li>
          謙虚 (Humility) 世界の中心は君ではない. 君は全知全能ではないし, 絶対に正しいわ けでもない.つねに自分を改善していこう.
        </li>
        <li>
          尊敬 (respect) 一緒に働く人のことを心から思いやろう. 相手を 1 人の人間として扱い, その能力や功績を高く評価しよう.
        </li>
        <li>
          信頼 (Trust) 自分以外の人は有能であり, 正しいことをすると信じよう. そうすれ ば, 仕事を任せることができる.
        </li>
      </ul>
    </li>
  </ul>
</div>

素晴らしいチーム文化をつくる

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    コミュニケーションの原則は, <b>同期コミュニケーションの人数を減らし, 非同期コミュニケーションの人 数を増やすこと</b> である.
  </p>
</div>

<div id="outline-container-unnumbered-11" class="outline-4">
  <h4 id="unnumbered-11">
    コミュニケーションツール
  </h4>

  <div class="outline-text-4" id="text-unnumbered-11">
    <ul class="org-ul">
      <li>
        ミッションステートメント <ul class="org-ul">
          <li>
            プロジェクトが目指す姿を短い言葉で表現して共有する.
          </li>
          <li>
            <b>方向性</b> と <b>スコープの制限</b> を明確にすること.
          </li>
          <li>
            企業のわけのわからない抽象的な表現がミッションステートメント をダメにしている.
          </li>
        </ul>
      </li>

      <li>
        効率的なミーティング <ul class="org-ul">
          <li>
            ミーティングに 5 以上参加させてはいけない.意思決定者がいなけ れば, 決まるものも決まらない.
          </li>
          <li>
            ミーティング中にノート PC をいじってメールチェックをしている人 は参加しなくていい人.
          </li>
          <li>
            ミーティングを開くときの簡単な 5 原則 <ol class="org-ol">
              <li>
                絶対に必要な人だけを呼ぶ
              </li>
              <li>
                アジェンダを作ってミーティング開始前に配布する
              </li>
              <li>
                ミーティングのゴールを達成したら時間前でも終了する
              </li>
              <li>
                ミーティングを順調に進める
              </li>
              <li>
                ミーティングの開始時間を強制的に中断される時間の前に設定す る (お昼休み, 就業時間)
              </li>
            </ol>
          </li>
        </ul>
      </li>

      <li>
        設計文書 <ul class="org-ul">
          <li>
            設計文書は 1 人が所持するもの. 大勢の人がレビューして, 2,3 人の人が承認するもの.
          </li>
          <li>
            何をどうしたいのかを低コストでチームに伝える手段.
          </li>
          <li>
            タスク分割につかうもの.
          </li>
          <li>
            プロジェクトが進むにしたがって更新するべきもの.
          </li>
        </ul>
      </li>

      <li>
        メーリングリスト <ul class="org-ul">
          <li>
            チームが同じフロアにいるのであれば, メーリングリストで議論す る必要はない.
          </li>
          <li>
            議事録・ミーティングメモ・決定事項・設計文書などをメーリング リストに投稿して, 記録をまとめる.
          </li>
        </ul>
      </li>

      <li>
        オンラインチャット <ul class="org-ul">
          <li>
            信じられないほど便利なツール. 他人の作業を邪魔することなくリクエストを送信できる.
          </li>
          <li>
            IM では, チーム内での情報共有ができない.
          </li>
        </ul>
      </li>

      <li>
        課題管理ツール <ul class="org-ul">
          <li>
            ただの掲示板. メーリングリストと同じ.
          </li>
          <li>
            バグの優先順位をつけることができる.
          </li>
        </ul>
      </li>

      <li>
        コードレビュー <ul class="org-ul">
          <li>
            すべてのコミットにコードレビューする.
          </li>
          <li>
            コードの監視方法をプロダクトに導入する.
          </li>
          <li>
            コードの行のスタイル・品質・ケアレスミスを第三者が確認するべき.
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

船にはキャプテンが必要

<div class="outline-text-3" id="text-unnumbered-12">
</div>

<div id="outline-container-unnumbered-13" class="outline-4">
  <h4 id="unnumbered-13">
    リーダとマネージャー
  </h4>

  <div class="outline-text-4" id="text-unnumbered-13">
    <p>
      マネージャーは, &#8220;サーバント&#8221;, 執事のような存在だ. 芸能人のマネージャーがタレントの活動をサポートするための黒子に徹す るのと同じように, マネージャーはチームのエンジニアに最高のパフォー マンスを発揮させることが使命.
    </p>

    <p>
      一方, リーダはすべてのエンジニアに要求される役割.
    </p>

    <p>
      トンガリ頭のマネージャーは, 軍隊の階級制度を散光にして, 産業革命の ときに導入されたもの.向上では組み立てラインの稼働を労働者に命令する 必要があった.
    </p>

    <p>
      エンジニアリングの世界でも時代遅れの マネージャ&#8221;という肩書きを使っ ている.マネージャーじゃなくて, リーダーにしたほうがいいと思う.
    </p>

    <p>
      マネージャーになりたがらない理由はたくさんある.ぼくたちが耳にした大 きな理由は, コードを書く時間が少なくなるから.
    </p>

    <p>
      もう一つの語られない大きな理由は, &#8220;階層的な組織に属する人間は,必ずその人の無能レベルまで昇進する&#8221;
    </p>

    <p>
      マネージャーは, サーバントリーダーとして謙虚・尊敬・信頼の雰囲気をつくり 出さなければならない. これは, エンジニアでは対処できない社内の障害物を排除することかもしれないし, チームの合意形成を支援することかもしれない.あるいは, 夜遅くなった時にチームに夜食を買ってくることかもしれない.
    </p>

    <p>
      マネージャーになるメリットは, 自分のストーリーを描くことができるから. また, 自分がコードを書く代わりに, チームメンバを利用して より多くのコードを書くことができるから.
    </p>
  </div>
</div>

その他

<div class="outline-text-3" id="text-unnumbered-14">
  <p>
    1 週間に書いたコード行数のような意味のない (デラタメな) 方法で生産性を計測する会社もある. (行数が少ない方がいいに決まっている)
  </p>
</div>