PhoneGap (Apache Cordova) について追記.

この間の闇鍋で PhoneGap について発表したのですが, あの後わかったり, 言うの忘れていたことがあったのでここに書きます.

PhoneGap Build

Adobe に置いてあるクラウドサービスで, Javascript や HTML をアップロードすれば, それを Adobe 側のサーバでビルドしてくれるというものらしいです.
マルチプラットフォームなので, 結構便利そうな気がするんですが, ファイルを全部アップロードするのに抵抗がありますね.

Dreamweaver での PhoneGap 対応

これは教えて頂いたのですが, Dreamweaver CS5.5 から PhoneGap との連携機能が搭載されたそうです.
内部的には PhoneGap Build を用いてビルドしているとか.

ASCII.jp:Dreamweaver CS5.5でスマホアプリ作ってみた (3/3)

WebView で外部サイトを開くと API が丸見えになる?

API が丸見えになるのは変わらないのですが, そのままでは API は見えないです.
PhoneGap API は, Javascript ファイルで定義されているので, それをロードしない限りは大丈夫なようです.
しかしその Javascript は誰でもダウンロードできるので, ちょっとした手間で API が丸見えの状態にできます.
闇鍋ときのスライドのように, 外部サイト接続時は端末にインストールされたブラウザを起動するようにした方が吉です.

第2回闇鍋プログラミング勉強会 各発表のスライド

ngx_small_lightを使った画像変換

@cubicdaiya さんの発表.

Intel AVX で SIMD 入門

id:kawa0810 さんの発表.

ATL に見る黒魔術

id:egtra さんの発表.

温故知新・Fortran

@n_scattering さんの発表.

Unite x Node x MMD

@sters9 さんの発表.

アジャイルを高校生に教えてみた.

@alan_islands さんの発表.


プログラマに知ってもらいたいネットワークの話.

@toshi__ya さんの発表.


Javascript を書きたくない話

id:mizchi さんの発表.

発表資料とかは Gist.
闇鍋勉強会#2いってきた + LTしてきた資料 #yaminabePG - mizchi log

Jenkins と Scala の発表

id:ponkotuy さんの発表.

これは PDF 直接リンク.
第2回闇鍋プログラミング勉強会で発表してきた - ponkotuyの日記

クイックソートの話

@kazoo04 さんの発表.

数値シミュレーションの話

@disknikr さんの発表.


集合知によって得られる大切なこと

id:faith_and_brave さんの発表.

第2回闇鍋プログラミング勉強会を開催しました.

第2回 闇鍋プログラミング勉強会 - Togetterまとめ
* 9/17 追記: @sters9 さんがまとめてくれました!ありがとうございます!

昨日9月15日に闇鍋プログラミング勉強会第2回を開催しました.

当日は, 参加者が迷ったりするのはまあ今回の会場が初見の人はいいとして, もうちょっと会場の注意を周知する必要があるなと感じました. ( 電源タップの件とか )

誰か言っていましたが, 今回の発表は30分は長すぎるし, 5分の発表は短すぎるという感じでしたね. LT 大体10分近くになっていたりした人が多かったですけど, 特に止めませんでしたし.

まあ, 色々面白い話が聴けていい刺激になったのではないかと期待しています.

僕の発表は C++フレームワークとして Cinder をやる予定だったのですが, やっても微妙だなと感じてしまったので, 某所で調査中の PhoneGap ( Apache Cordova ) について話しました. スライドは以下です.

PhoneGap については, 僕の調査不足なのか, 色々と不便な点が多いなと感じています. Javascript で手軽にかけるのはいいことであり, その言語を書かねばならないという悪い点でもあるかもしれません.

ほかの発表

発表資料は後でクロールして探してきます.
なので, ここでは気になった発表だけをいくつか感想.

Intel AVX で SIMD 入門

そういえば, posix_memalign とかあるけど, std::align とかって使えなかったかな...

早いところ FMA 命令ください.

ATL でみる黒魔術

マイクロソフトによるテンプレートベースのライブラリ群.

非常に黒魔術的な何かをしていてカオスなのですが, これはマイクロソフトコンパイラを十分に熟知したプロが専門家の指導のもと開発しているもので, 絶対真似しないでください.

温故知新・Fortran

Fortran の発表, 結構途中から Fortran のプログラミング方法になってきて結構技術的なものだったと思います.

Fortran って結構早いんですよね... 使えるようにするべきなのか.

Jenkins の話

Jenkins は継続的インテグレーション (Continuous Integration : CI)を行うためのツールです.

CI はビルドやテストを継続的に行っていきましょうというもので, それによって例えばバグの早期発見などの品質改善を早め早めに行えるというものです.

Jenkins を使えば, あるコミットがマージされた瞬間にその時点のリポジトリをビルドしてテストを実行でき, ビルドやテストに失敗した場合, プログラマにメールで通知ができたりします.

クイックソートの話

クイックソートの脆弱性をつけば, 最悪計算量 O(n^2) をだしてサーバに DoS 攻撃をかけられるみたいな話.

ユーザがサーバに何百万ものデータを送りつけてそれをソートするとかないだろ, という意見もあったのですが, 例えば最近バズワード化しているビッグデータの解析ツールなんかはかなりありそうですね.

集合知によって得られる大切なこと

みんなで知恵を出せば, 必ずよりよい知恵をみんなが共有でき, すべての人の知恵を底上げできるだろうという話だと僕は記憶しています.

かなり RT されていましたが, 「ネットに転がっている情報という人がいますが, ネットに転がっているのではなく, 不特定多数の誰かのために意思を持って活動している人がいる」ということです.

この言葉, かなりぐさっときましたね... 僕もこの言葉割りと使ってしまうので, 注意していかないと.

最後にふさわしい内容でした. ありがとうございます.

懇親会

これも周知が足りなかったものの一つ, 懇親会の存在を知らない人が結構いて最終的に6人ぐらい増えました.

話としては, でちまるさんと DSiLL でできる GHCi とか, SSH ターミナルを携帯ゲーム機でできればいいとか, それ Linux の携帯があればよいのではとかそんな話してました.

あと, 僕が「なぜテストだけ書いて TDD とかのたまっているのか」という件で切れていたら, でちまるさんが「テストだけデベロップメントの略では?」とか言われて大爆笑でしたね.

今度から無駄にコメントがあったら黙って bugfix で消すことにしました.

最後に

第2回は PyCon とか PHP とかとかぶっていてかなりあれだったのですが, なんだかんだで50〜60人ぐらいの参加者となりまして, にぎわってよかったと思います.

かなり早めに #yaminabePG のハッシュタグも人気ハッシュタグ化していたらしいですね.

今回も色々反省がありましたので, まあまた次回に反映しようと思います.

次回は多分2月か3月じゃないかと思っております. そのときはまたぜひよろしくお願いします.

ある変数がメソッドを呼び出せるかで SFINAE

auto func(...) -> decltype(...) を使えば, 渡された変数がメソッドを持つか持たないかで SFINAE とかできる.

#include <iostream>

struct memory {
  std::string to_string() const {
    return "is memory.";
  }
};

struct device {
  std::string to_string() const {
    return "is device.";
  }
};

template<class T>
auto get_string(T const& t) -> decltype(t.to_string()) {
  return t.to_string();
}

std::string get_string(...) {
  return "other instance.";
}

int main() {
  std::cout << get_string(0) << std::endl;
  std::cout << get_string("hoge") << std::endl;
  std::cout << get_string(memory()) << std::endl;
  std::cout << get_string(device()) << std::endl;
}

実行結果>

other instance.
other instance.
is memory.
is device.

実行環境
GCC 4.6.3 C++11 mode (-std=gnu++0x or -std=c++0x)
GCC 4.7.1 C++11 mode (-std=gnu++11 or -std=c++11)

カーネル関数を分離して C++11 コードをビルド.

nvcc でないとビルドできないのはカーネル関数なので, ここと通常の C++ コードを分離してそれぞれビルドしたオブジェクトをリンクすれば, 普通に C++11 を使ったコードが(カーネル関数以外で)書けるようになる.

後, CUDA を使うために必要なライブラリとか, リンクするのが面倒なので nvcc にやってもらう.

以下で検証.

CUDA 4.2
gcc 4.6.3

// kernel.h
#ifndef _KERNEL_H_
#define _KERNEL_H_

void call_kernel(int block, int thread, float * x);

#endif
// kernel.cu
__global__
void kernel_func(float * x) {
  // do something.
}

void call_kernel(int block, int thread, float * x) {
  kernel_func<<<block, thread>>>(x);
}
#include "kernel.h"

// カーネル関数を呼び出すコード.
call_kernel(block, thread, x);

かなりはしょったけど, こんな感じ, cudaMemcpy などのランタイム API は cuda_runtime_api.h に宣言されているので, /include をインクルードパスに追加する.

Makefile で適当に書くとこんな感じになるはず.

CC = g++
NVCC = nvcc
CPPFLAG = -std=gnu++0x -O3 -Wall
NVCCFLAG = -O3 -Xcompiler -Wall
INCLUDE = -I/usr/local/cuda/include
OBJS = kernel.o main.o
NAME = a.out
.SUFFIXES : .cu

$(NAME) : $(OBJS)
  $(NVCC) $(NVCCFLAG) -o $(NAME) $(OBJS)

.cpp.o :
  $(CC) $(INCLUDE) $(CPPFLAG) -c $<

.cu.o :
  $(NVCC) $(INCLUDE) $(NVCCFLAG) -c $<

(ハイライトが微妙におかしい...)

clean とかは省略.

例えば, カーネル関数が float, double など複数の型で欲しいときは, どうしようもないのでカーネル関数自体は template にして call_kernel といった関数を必要な型の分定義するしかない.

そういう面倒なところがあっても, C++ コードを C++11 でかけるのは利点がでかい. 例えばデバイスメモリを RAII で保存する為に unique_ptr とか, move semantics とか, ラムダ式とか. auto が使えるだけでも個人的には嬉しい. 若干メタいコードを良く書くので.

結構備忘録.