22 Apr 2015, 15:28

プログラマとしての自分はなぜ学ぶのか?

はじめに

なぜ学ぶのか?

この言葉を Google で検索すると, なぜか NHK 大河ドラマの花燃ゆばかりが引っかかる.

というわけで, 今日はプログラマとして自分はなぜ学ぶのかを考える.

組織を守るため

会社の生存競争に勝つために, 最新技術を学びつづける.

技術は日々進歩する.

プログラマは最新技術についていかないと生きていけない, 競争に負けてしまう.

このことは, 結構差し迫ったシビアな問題だ. 現在努めている職場も, 皆が最新技術を学ぶことに執着しなければ, この先も仕事があるか危うい

職を得るため

お金を得るために, 知識を得る.

プログラマは, 技術があれば, たとえ会社が倒産しても生きていける. また, 技術があれば, いろんなチャンスに手をあげることができる.

この 1 年で, 自分は Ruby, Java を利用するプロジェクトに関わることができ た.その理由のひとつは, 独学で言語をたくさん学んでいたからだと思っている.

自分の可能性を広げるため

自分の可能性を広げるために, 学ぶ.

学べば学ぶほどに, 自分ができることが広がっていく. それが, プログラミングの世界.

様々な領域の技術や知識があれば, いざなにかをやろうと考えたときに, できることが広がる. ハックするために学ぶのだ.

チャンスが生まれたときに, 手をあげることができる. そのために, 爪はいつでも研ぎ澄ませておく必要がある.

志を為すため

なぜ学ぶのか, 己れの志を為すために学ぶ.

以下の記事にも書いた.

志はなんだ? それは, すごいプログラマになること.

自分は, いったいなにができるのだろう? いつもかんがえている. それは, なにもできないから, そのことが不安だから.

自分がなにかをするために, そのなにかを見つけるために, 学ぶ. 未だに, 青年モラトリアムを抜け出せないでいる.

知的絶景を眺めるため

知的絶景を眺めるために学ぶ. 爽快感を得るために学ぶ.

疲れるのに, なぜ山上りをするのだろう. それは, 美しい景色を見るため.

なぜ眠いのに, つかれているのに, 本を読むのだろう. それは, 知的絶景を眺めるため. それは同じことではないか?

苦しいことよりも, それを乗り越えたときにある快楽を求めているのだ. ここまでつらつらと思うことを書いてきたけれども, 一番の動機はこれでは ないかとおもう. 快楽のためという, だらしない理由.

好きな交響曲に, ブルックナーの交響曲第 5 番がある.

旋律やリズムがいくどとなく繰り替えされて, カタチを買えていく. 最後には, 壮大なフィナーレに至る.

そういうものを, 学びに求めている. たとえば, こういうやつ.

21 Apr 2015, 06:55

Windows 環境の Emacs から Linux マシンに tramp で乗り込む方法メモ

はじめに

昨日, 職場で vi しかインストールされていないという, ぼくたち Emacs ユーザにとっては恐怖にみちた Linux マシンをつかった.

もちろん, vi コマンドなんて覚える気はないので, 全くなにもできない.

そこで, Windows から Emacs の tramp 機能を利用して, Linux マシンへ ssh 接続する方法を調べた.

Environment

環境は, AWS から Ubuntu を借りて利用する.

  • Windows 8.1 (Client)
  • Ubuntu 14.0 (Server)

Cygwin をつかう

cygwin 上で動く Emacs から tramp を利用する方法は簡単. C-x C-f のあとに以下を入力.

/ssh:(ユーザ名)@(ホスト名):

:を押すと, パスワードがきかれるので答える.

AWS へ乗り込む

AWS は公開鍵を利用して, アクセスする必要がある. tramp には, 公開鍵を指定する方法がない.

そこで, .ssh/config に設定を書くことで, alias を作成する.

以下を参考に, .ssh/config に設定を追記.

Host remote_box_alias
    HostName ip_or_address_of_remote
    User username
    IdentityFile path_to_pem_file

あとは, alias 名を打てば良い

/ssh:remote_box_alias:

GUI 版 Emacs を利用する

なんと, ssh がつかえない. かわりに plink という外部ツールを利用する.

以下から, Putty のインストーラを落としてきて, putty をインストールする と, 付随で plink がついてくる.

plink.exe があるフォルダに, 環境変数 PATH を通す.

Emacs を起動して, C-x C-f 後, 以下を入力.

/plink:(ユーザ名)@(ホスト名):

ssh から plink に変更している.

AWS へ乗り込む

putty の機能を使って, session を保存する. 保存の仕方は, 以下のサイトを参照. .pem ファイルは, putty 形式の鍵に変換が必要なところに注意.

作成した, session 名を指定して接続する.

/plink:(alias 名)

おわりに

これで, すべてが Emacs.

19 Apr 2015, 12:37

Clojure で楽器を演奏しよう! Overtone をインストールしてみた

はじめに

前回, overtone を起動しました.

今回は Emacs から利用するまでを試します.

Emacs Live

Emacs Live は Overtone を Emacs から操るための 環境, ツール群, Emacs の設定.

Install

overtone の設定は, 前回の記事を参照.

bash <(curl -fksSL https://raw.github.com/overtone/emacs-live/master/installer/install-emacs-live.sh)

~/.emacs.d に emacs live 用の環境が作成される.

もし, すでに .emacs.d が存在する場合は, emacs-live-old-config ディレクトリに旧設定がコピーされる.

Getting Started

  • lein repl 起動.
  • emacs 起動.
  • M-x cider-connect で lein に接続する
    • localhost/port 番号 (lein repl 起動時にコンソールに出る) を入れる.

これで, emacs 上から, repl を操作することができる.あとは, コンソー ルから overtone を利用するときと同じ.

# External server 起動
$ user=> (use 'overtone.core)
$ user=> (boot-external-server)

# 音がでるか確認. ピーっと音が出れば OK.
user=> (demo (sin-osc))

ファイルに音楽を書く.

github にサンプルの音楽が置いてある.

適当なファイルを作成して, コピペ後, C-x C-e でひとつずつ評価すると, コードが repl に送信されて, 音がなる. Live Coding !!

自分の Emacs で overtone をつかう

overtone を利用する度に自分の Emacs 設定を Emacs live に置き換えたくは ないので, 自分の Emacs 環境で overtone を利用する方法を試す.

Emacs Live を利用すためには, 以下を入れる必要あり.

  • clojure-mode
  • cider

自分は, el-get からインストールした.

clojure-mode

Clojure のためのメジャーモード.

(require 'clojure-mode)

cider

Clojure のためのインタラクティブな開発環境.

(require 'cider)
(add-hook 'clojure-mode-hook 'cider-mode)
(add-hook 'cider-mode-hook 'cider-turn-on-eldoc-mode)

Getting Started

Emacs Live と起動方法は同じ. 音が出れば OK.

おわりに

Emacs Live には, いろいろ便利な関数や色が定義されているので, 時間をみて Emacs Live の リポジトリを眺めてみよう.

今日はここまで!

Special Thanks

18 Apr 2015, 23:58

Clojure で Hello, World

はじめに

千里の道も Hello World からはじまるというユダヤの教えがありますが, 今回は, Clojure で Hello, World をしてみます.

[toc]

Environment

  • Arch Linux
  • Java 1.7

Clojure とは

Clojure は JVM 上で動く Lisp 系モダン関数型言語.

- 以下の本によると, Clojure の魅力は, **簡潔さと力**. つまり... **Elegant**

インストール

事前に, JDK6 以上 をインストールしておくこと.

ダウンロード

以下からダウンロードして解凍.

leiningen

leingen は, clojure 用のビルドツール.

github のページにしたがい lein スクリプトをインストール.

Hello, World

プロンプトから起動

Clojure 起動.

java -cp clojure-1.6.0.jar clojure.main

=>user というプロンプトがでる. 以下を入力で, Hello, World!!

user=> (println "Hello, World!!")
Hello, World!!
nil

REPL から実行

lein から REPL (インタラクティブスクリプト) を呼び出す.

lein repl

user=>というプロンプトがでる.あとは, 上と同じ.

ファイルから実行

ファイルに保存して実行する. 拡張子は, .clj

echh "(println \"Hello, World!!\")" >> hello_world.clj
java -cp clojure-1.6.0.jar clojure.main hello_world.clj

Special Thanks

18 Apr 2015, 08:59

ScalaCheck をつかって Java の性質テスト (Property-based Testing) をしてみる

はじめに

Property-based Testing というものを知ったので, Java でできるか試してみました.

[toc]

Property-based Testing とは

うまい日本語訳がないのだが, この記事では性質テストとする.

ある集合のなかにある要素から取り出した値をつかって, 総当たりテストをして, 条件式がなりたつことを確認するテスト.

よく数学の問題で, 任意の x について hogehoge がなりたつことを証明せよ みたいなのがあるが, hogehoge が 性質にあたるもの.

上手く説明できないので, 大量の参照リンクをはっておく.

英語:

ScalaCheck

Scala の 性質テスト用ツールで, ScalaCheck というものがある.

Scala なので, Java にもつかえるか試す.(私は, 現在 java プログラマなので)

target

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    以下のコードをテスト.
  </p>

  <p>
    [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221;]<br /> package example;
  </p>

  <p>
    public class MyArithmetic {<br /> public static int add (int a, int b) { return a + b; }<br /> public static int del (int a, int b) { return a &#8211; b; }
  </p>

  <p>
    public static void main (String[] args) {<br /> System.out.println (add (1, 2));<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

Java で sbt をつかう

scala のテストツールなので, scala の ビルドツール sbt をつかうのが楽.

src/main/java 配下に ソースをおいて, root で sbt を起動すると なんと Java コードが sbt で使えてしまう.

これはこれで, 手軽さに驚いた. Java のビルドツールとして使えそう.

[sourcecode language=”bash” title=””]
# コンパイル
> compile

# main 関数を自動で検索して実行
> run
[/sourcecode]

ScalaCheck をつかう

以下のようなファイルを作成して, src/test/scala 配下におく.

[sourcecode language=”scala” title=””]
import org.scalacheck.Properties
import org.scalacheck.Prop.forAll

import example._

object MyArithmeticSpecification extends Properties ("MyArithmetic") {

property ("add") = forAll { (a : Int, b : Int) =>
val aa = a % 100
val bb = b % 100
val c = MyArithmetic.add (aa*aa, bb*bb)
c >= aa*aa && c >= bb*bb
}

property ("add2") = forAll { (a : Int) =>
val aa = a % 100
aa * aa >= aa
}

property ("del") = forAll { (a : Int, b : Int) =>
val aa = a g% 100
val bb = b % 100

val c = MyArithmetic.del (aa*aa, bb*bb)

c <= aa*aa || c <= bb*bb
}
}
[/sourcecode]

root ディレクトリの build.sbt に以下を書く.

[sourcecode language=”bash” title=””]
libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.12.2" % "test"
[/sourcecode]

ファイル構成はいかのようなかんじ

[sourcecode language=”bash” title=””]
— build.sbt
src
main
java
MyArithmetic.java
test
scala
MyArithmeticSpecification.scala
[/sourcecode]

テスト実行

[sourcecode language=”bash” title=””]
$ sbt test
[info] + MyArithmetic.add: OK, passed 100 tests.
[info] + MyArithmetic.add2: OK, passed 100 tests.
[info] + MyArithmetic.del: OK, passed 100 tests.
[info] Passed: Total 3, Failed 0, Errors 0, Passed 3
[success] Total time: 1 s, completed 2015/04/18 17:54:54
[/sourcecode]

おわりに

むかしむかし, CUnit のことを課長にはなしたことがあったのだが, (うたぐり深い) 課長は, xUnit のようなものでは品質がとれないと突っかかってきた.

全部網羅したテストじゃないと, 完全にバグがないなんて言いきれない

自分はこれに対して反論ができなかった.

いまならば, 反論できる.Property-based Testing はどうだろう? 乱数による総当たりテストならば, 信じてくれるのではないだろうか?

15 Apr 2015, 16:20

Emacs で自動ライフログできる! プログラマのためのタイムトラッキング WEB サービス Wakatime がスゴい

はじめに

最近, ほとんどの時間を Emacs の中で過ごす. Emacs で実施している作業を, Wakatime をつかうと自動で記録することができる.

これを, つかって一日の行動を自動でライフログしたお話.

[toc]

Wakatime とは

Wakatime とは, プログラマのためのタイムトラッキング Web サービス.

エディタ上での作業を自動で記録, 分析して, おしゃれに可視化してくれる.

さまざまなエディタのプラグインが用意されている.

Emacs 連携

Emacs のための Elisp はこちら.

基本設定.

(require 'wakatime-mode)
  (global-wakatime-mode)

(defun browse-wakatime ()
  (interactive)
  (browse-url "https://wakatime.com/dashboard"))

スナップショット

ダッシュポード.

自分がどのプロジェクトに関わっていたかが, リポジトリごとに表示される. 私は, あらゆるテキストファイルをなるべく git で管理しようと心がけてい るので, Emacs で作業するいろいろなものが各プロジェクトごとに記録され る.

file:./../img/2015-04-16-011145_1131x453_scrot.png

一日のタイムライン. 自分が何時になにををしていたかが, 分かってしまう.

org-clock と併用することにする

今まで, タイムトラッキングには幾度と挑戦してきた. org-clock や toggl を試したが, 結局挫折してしまった.

その理由は, 計測し忘れ にあった.

この wakatime が気に入った点は, 自分では計測を意識しないということだ. 自動で, 記録してくれるところがありがたい.

ただし, 最大の欠点は, 無料版は昨日制限されているところ. 優良だと 1 ヶ月 1000 円程度かかるので, さすがにこんなお金は出せない.

そこで, org-clock での時間トラッキングと併用しようと考えた. 計測し忘れがないかどうかを一日の終わりに, wakatime をつかってチェックする.

このことによって, 一日の成果を確認するともに, 計測しわすれをチェックできる.

12 Apr 2015, 13:43

仕事に関わる知識を MOOC で! Coursera で Cloud Computing Concepts Part2 を受けた

file:./../img/IMG_3914.JPG

はじめに

Coursera で, クラウドコンピューティングの講座を受けました. これは, Part2 です.

Part1 の感想は以下です.

内容

講義

以下の内容を扱う.

  • Leader Election, Mutual Exclusion
  • Concurrency Control, Replication Control
  • Stream Processing, Graph Processing, Structure of Networks, Scheduling
  • Distributed File Systems, Distributed Shared Memory, Sensor Networks
  • Security, Datacenter Outage Studies, Wrap-up

コースの進みかたは Part1 と同じだ.

たくさんのコンセプトや考え方が次から次へと紹介されるので, すべてを消化できない..そして, 早口の英語の説明が困る.. \^-\^;

内容や課題は, Part1 を引用していることもあり, Part2 は Part1 が終わってから取り組んだ方がよい.

宿題

プログラミングの宿題は, Key-Value Store の実装. この課題に取り組むことで,

  • replica の扱いかた,
  • key-value store の考え方.
  • quorum consistency level の考え方.

などが学べる. 言語は C++. 自分には難しくて, 満点をどうしてもとれずに途中で諦めた.

こころにのこった考え方

こころにのこった考え方をコメントともに書く.

Leader Election

こういうロジックを考える仕事をしていたので, Leader Election ロジック は感銘を受けた. 以下, 記事にした.

Replication Control

もともとがストレージ屋なので, レプリケーションの技術とは馴染みがある.

昨今, 急激に台頭してきた分散ストレージのなかで使われている KVS や Replication の知識を補充することができたことは価値があった.

以下, 勉強メモ.

分散 KVS

分散 Key-Value ストア. スケールアウト技術の基幹技術.

同じデータを複数のコンピューターに複製して保存し, それぞれのコンピューター上のデータに変更が起きていないかどうかを 随時チェックすることによって整合性を確保. リアルタイム性はない.

Key で担当サーバを分ける.

たいていはいくつかのサーバ上に複製 (replica) を作成することによって 耐故障性を高めている.

Replication

レプリケーション. 複製.

データ複製.オブジェクトをコピーし, ノード間で複製を保持することで 冗長性を高める手法.

システム障害時の継続運用が目的となります. 災害時に接続しているシステ ムが壊れてしまったとき, 遠隔地にある複製データを利用し事業継続を実現 する DR (ディザスタリカバリ) に有効.

コンテンツ配信する方法は二つある.

  • Passive Replicatoin .. Master Replica だけを更新
  • Active Replicatoin .. id ごとにすべてを更新.

Distributed File Systems

現在の業務は, SMB プロトコルの高速化についての研究開発.

講義では, NFS を例に, 分散ファイルシステムの特徴や, NFS における高速 化技術を解説していた. 仕事にからんでいる領域なので, きいていておもしろい. 印象としては, NFS は高速化のための仕組みがた くさん試されている用に見えた. SMB は….

以下, 簡単な勉強メモ.

分散ファイルシステムの特徴

分散ファイルシステムの目的は, ユーザから ファイルかリモートにあるかローカルにあるか意識しなくていいよう にすること.

2 つのアクセスモデルがある.

  • 遠隔アクセスモデル … リモートサーバにあるファイルを読み書き
  • アップロードダウンロードモデル … 一旦ローカルにダウンロードして 編集してからアップロード.

ローカルファイルにアクセスするときは, file discripter を指定する. file discripter には, read/write に必要な pointer が保持されているので, ユーザは, offset を指定しない.

リモートファイルにアクセスするときは file id と offset を指定する.

これからどうするか?

フォールトトラレントの情報をあつめる

信頼性の高い製品の開発に関わっていく以上, これからもフォールトトラレントは必要な, より深めるべき知識だろう.

フォールトトラレントについては, この領域で研究が盛んで本や論文もた くさんでている. こういうものをどんどん読み込んでいきたい.

特許ノルマが仕事で課せられているので, 集めた情報の Output として, 特許に結びつけたい.

日経コンピュータをよむ

今まで, お昼休みにフロアにおいてある日経コンピュータを読んでいた. しかし, 職場で席を引っ越したので, 現在日経コンピュータを読む 機会がない.

日経コンピュータは, クラウドコンピューティングの最新動向をつかむた めのとてもいい情報源なので, これからも読みたい. これはここでブログ に宣言することによって, 自分にプレッシャーを.

12 Apr 2015, 06:13

Gacco で 社会人のためのデータサイエンス入門をうけた

日本の MOOC はどんなものかと思って, gacco で統計学を学んでみました.

内容

統計学の基礎知識を学ぶことができる.

内容は, 中学生でも理解で切るような平易な内容.

  • 第 1 週:統計データの活用 … 統計データの活用事例
  • 第 2 週:統計学の基礎 … 統計の基礎知識を学ぶ
  • 第 3 週:データの見方 … グラフの見方を学ぶ
  • 第 4 週:公的データの入手とコースのまとめ … e-Stat の使い方の紹介.

以下に詳細が書いてある.

感想

やりきった感なし

実際のデータの計算などはほとんどでてこなかったり, 一度きいたことがあるような基礎概念を説明しているので, まったく物足りなかった.

1 週の内容が 1 時間もかからずに終わってしまう軽いもの. さらに, 4 週で終わってしまう. coursera や edX は 一科目 5 時間とか 10 時間学習を強いるし, 平均で 8 week くらい続くので, 負荷の度合いがまったく違う.

MOOC は大学で学ぶ講義を一般に開放しているところに魅力があるのだが, 中学校の授業を立ち見しているような気分なのだ.

コンテンツがよく吟味されている

ただ, 内容が欲吟味されていて, 動画の構成のよさや内容のわかりやすさはとてもよかった. 動画の長さも 10 分ごとに分かれているし, 各動画で要点がまとまっているし

また, 構成社会人のための! ということで, 話題の選び方がビジネスよりなところがよかった. 扱う統計の題材は, 現実に即したもの.(売上とか, 人口比とか) 話のたとえも, マーケティングに関わるようなものが使わたり. 題名が “社会人のために”ということなのでこの辺を意識したことが伺える.

gacco 初体験の感想は…ビミョウ

日本語であるところが, とてもうれしかった.

しかし, とても物足りない. 負荷の度合いが coursera/edX にくらべると違いすぎる. 例えばこれとくらべたら負荷が軽すぎて, やりきった感がまったくない.

こんなものなのか??

日本の MOOC はどんなものかと思って, gacco で統計学を学んでみました.

11 Apr 2015, 06:52

C 言語/C++ における イベントハンドラの定石 (switch/ 関数ポインタ配列/lambda)

はじめに

C/C++ における イベントハンドラの書き方について,定石を整理してみた.

[toc]

前提

<div class="outline-text-3" id="text-unnumbered-2">
  <p>
    以下のようなコードがあるとする.
  </p>

  <p>
    [sourcecode language=&#8221;cpp&#8221; title=&#8221;&#8221; ]<br /> #include <iostream><br /> typedef enum {START, STOP} COMMAND;
  </p>

  <p>
    void check (COMMAND command) {<br /> std::cout << (int) command << " is called" << std::endl; } int main (int argc, char *argv[]) { check (START); check (STOP); return 0; } [/sourcecode] 

    <p>
      出力結果は以下のようになる.
    </p>

    <p>
      [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> 0 is called<br /> 1 is called<br /> [/sourcecode]
    </p>

    <p>
      この出力結果は以下のようにしたい.
    </p>

    <p>
      [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> start is called<br /> stop is called<br /> [/sourcecode]
    </p></div> </div> </div> 

    <div id="outline-container-unnumbered-3" class="outline-2">
      <h2 id="unnumbered-3">
        方法
      </h2>

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

      <div id="outline-container-unnumbered-4" class="outline-3">
        <h3 id="unnumbered-4">
          switch を使う
        </h3>

        <div class="outline-text-3" id="text-unnumbered-4">
          <p>
            一番単純な方法は, switch をつかって, 表示を分岐する
          </p>

          <p>
            [sourcecode language=&#8221;cpp&#8221; title=&#8221;&#8221; ]<br /> void onStart () { std::cout << "start is called" << std::endl; } void onStop () { std::cout << "stop is called" << std::endl; } void check (COMMAND command) { switch (command) { case START: onStart (); break; case STOP: onStop (); break; } } }; [/sourcecode] </div> </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>
                  別の定石は, 関数ポインタ配列をつかう.
                </p>

                <p>
                  [sourcecode language=&#8221;cpp&#8221; title=&#8221;&#8221; ]<br /> #include <iostream>
                </p>

                <p>
                  typedef enum {START, STOP} COMMAND;
                </p>

                <p>
                  void onStart () { std::cout << "start is called" << std::endl; } void onStop () { std::cout << "stop is called" << std::endl; } typedef void (*HANDLER) (); static HANDLER handle_tbl[2] = {&onStart, &onStop}; void check (COMMAND command) { handle_tbl[command] (); } [/sourcecode] </div> </div> 

                  <div id="outline-container-unnumbered-6" class="outline-3">
                    <h3 id="unnumbered-6">
                      lambda をつかう
                    </h3>

                    <div class="outline-text-3" id="text-unnumbered-6">
                      <p>
                        関数テーブルに関数を登録するために, 関数を作成する必要があるけれども, 一行なので, 関数を作成するのは面倒.
                      </p>

                      <p>
                        そんなときは,c++11 からつかえるようになったラムダ式を利用する.
                      </p>

                      <p>
                        [sourcecode language=&#8221;cpp&#8221; title=&#8221;&#8221; ]<br /> #include <iostream><br /> #include <functional>
                      </p>

                      <p>
                        typedef enum {START, STOP} COMMAND;
                      </p>

                      <p>
                        static std::function<void ()> handle_tbl[2] = {<br /> [] (){ std::cout << "start is called" << std::endl;}, [] (){ std::cout << "stop is called" << std::endl;} }; void check (COMMAND command) { handle_tbl[command] (); } int main (int argc, char *argv[]) { check (START); check (STOP); return 0; } [/sourcecode] 

                        <p>
                          やっぱり, これからは関数型の時代だよね!
                        </p></div> </div> </div> 

                        <div id="outline-container-unnumbered-7" class="outline-2">
                          <h2 id="unnumbered-7">
                            Special Thanks
                          </h2>

                          <div class="outline-text-2" id="text-unnumbered-7">
                            <p>
                              この記事によると, switch 型と関数テーブル型では, スピードは変わらないとか.
                            </p>

                            <ul class="org-ul">
                              <li>
                                <a href="http://dixq.net/forum/viewtopic.php?f=3&t=13875">関数ポインタテーブルと switch 文 • C 言語交流フォーラム ~ mixC++ ~</a>
                              </li>
                            </ul>

                            <p>
                              委譲をつかう方法もある (Strategy Pattern)
                            </p>

                            <ul class="org-ul">
                              <li>
                                <a href="http://www7b.biglobe.ne.jp/~robe/pf/pf016.html">プログラマの友 第十六報:イベントハンドリングとデリゲート</a>
                              </li>
                            </ul>

                            <p>
                              C++11 の方法.
                            </p>

                            <ul class="org-ul">
                              <li>
                                <a href="http://qiita.com/shiro_naga/items/5967f6cd1710e7b78677">C++ &#8211; メンバー関数ポインタと配列を使って, メンバー関数を番号で指定して呼び出す方法 &#8211; Qiita</a>
                              </li>
                              <li>
                                <a href="http://kaworu.jpn.org/cpp/std::function">std::function &#8211; C++ 入門</a>
                              </li>
                            </ul>
                          </div>
                        </div>

10 Apr 2015, 13:19

Wayland/weston を ArchLinux で動かして遊んでみた

はじめに

仕事で, GUI プログラミングに関わることになりそうです.

そこで, 次世代 ウィンドウシステム wayland/weston を Arch Linux にいれて遊んでみました.

[toc]

Environmet

$ sudo pacman -Qe weston linux
weston 1.7.0-2
linux 3.19.2-1

インストール

以下のコマンドでインストール.

sudo pacman -S wayland weston

wayland

x window にかわる, 次世代ウィンドウマネージャー.

Arch Wiki が詳しい.

x window にくらべて, 高速で, 実装がシンプルらしい.

以下の比較動画をみると, xorg と wayland/weston の違いが歴然としていおもしろい.

Weston

Wayland はただのライブラリなので, それだけでは使い物になりません. X サーバーを置き換えるには, (Weston などの) コンポジタが必要.

遊んでみる

weston 起動.

$ weston

左上のターミナルアイコンをクリックすると, weston-terminal が起動する.

いろいろなデモが用意されている.

  • weston-flower
  • weston-smoke
  • weston-editor

レンダリングが鮮やかな気がする.

以下で, デモが見られる.

x window アプリを wayland で動作させる

Wayland は, 描画に OpenGL ES を用いていている. 一方, Linux のデスクトップアプリは, X クライアント.

xorg-server-xwayland をインストールすれば, 従来の Linux アプリを wayland で動かす方法がある.

.config/weston.ini に以下を書くと, weston-terminal からアプリを立ち上 げたときに, weston 内でアプリが起動する.

[core]
modules=xwayland.so,desktop-shell.so

weston.ini の マニュアルは以下.

# xorg アプリを動作させる
[core]
modules=xwayland.so

# 日本語設定
[keyboard]
keymap_layout=jp

# ターミナルアイコン
[launcher]
icon=/usr/share/icons/gnome/24x24/apps/utilities-terminal.png
path=/usr/bin/weston-terminal

# firefox アイコン
[launcher]
icon=/usr/share/icons/hicolor/24x24/apps/firefox.png
path=/usr/bin/firefox

# フルスクリーン
[output]
name=X1
mode=1600x900

パフォーマンスについての考察.

Bookmarks

Linux conf 2013 におけるプレゼン.