Boost.勉強会 #11 東京 に参加しましたpost

久しぶりのboost勉強会でした。 早速ですが、レポートというかメモというかをドーゾです。

C++ポケットリファレンスについて

著者前へ→一人足りないwww

C++11の日本語初のリファレンス。

著者ズ→ @nyaocat@andochin@hotwatermorning@wraith13@egtra@cpp_akira

コミュニティから本を出していきたい!

  • 日本語の問題が苦労した
  • Redmineで校正を管理

Boostライブラリ一周の旅 1.51.0?1.53.0

Atomic

InterlockedIncrimentなどの置き換え、mutexの代わりなど。

Lookfree

キュー、スタック、順位付きキューなどの実装がある。 push() や pop() がシュッパイする可能性があるので注意が必要!

Coroutine

処理中に中断&復帰ができる。

次のバージョン(1.54)でStackOverflowをあまり気にしなくてすむ機能が入る。

Multiprecision

多倍長整数計算ライブラリ。

Odeint

常微分方程式を解くライブラリ。 ゲームでも使えるらしい。

C++でデータをDBに保存して扱ってみよう

リレーショナルデータベース使ってる人→6〜7割

C++で使えるO/Rマッパーのはなし。

JSONで大量のデータの管理はいくない!

Wt(ウィッティー) Wt::Dbo Tutorial

JSONと比べデータベースを使うと、データの整合性や検索、同期、そしてデータ構造の管理などもできる!

bind処理も実装してある。

ほかにもC++のO/Rマッパーには次のような物がある。

会場からつ boost.python boost.Fusion などを絡め統一的なのができるのでは?

おまけ

何故、あえてC++なのか

  • データは表示するための物
  • 見やすいインターフェースが必要
  • HTMLとかのインターフェースに特化した物を使う
  • C++はデータを表示するインターフェースには向いていないのではないか?
  • C++の立ち位置を再確認するべき!
  • C++とWeb系言語を連携しよう!

昼休み&C++ポケットリファレンス購入祭り

C++ポケットリファレンスをまだ購入していない人を有志で募って近くの本屋さんで購入しようって流れになったので、乗りました。

集まったのは9人

一番近くの三省堂書店に突撃しましたが、4冊しか置いてませんでした(後でTwitterでtweetされていましたがいつの間にかまた補充されていたようです)

周辺を探しましたが新刊でしかも技術書は扱っているところが少ないようで見つかりませんでした。

結局、未購入の人は秋葉原まで行って購入してきたようです(自分は三省堂書店で購入しました)。

あと、午後の発表の合間に著者ズにサインをしていただきました。

The Instrumental C++

DTMer(D™を使っている人)向けの発表

※ただし、対象者は数人の模様

VSTプラグインを実装してみた話

サンプルでノイズを作るのに boost.Random を使っています。

MIDI

  • ノートオン‥‥音を出す信号、ピアノの鍵盤を押したり笛を吹いたりする動作
  • ノートオフ‥‥音を止める信号、ピアノの鍵盤を離したりする動作

まとめ

C++でぼくが忘れがちなこと

C++覚えてますか?

  • 型周り、char と signed char と unsigned char や int[n]_t
  • typedefとcv修飾
  • virtualはいらない、overrideでいい
  • const参照での浮動小数点型と整数型、 const int &i = d; // dのテンポラリが保持される
  • アクセス修飾子、、、、
  • operator& をオーバーロードしていても addressof()でポインタ値がとれる
  • operator void の挙動、operator void をオーバーロードしていると static_cast(s); とするとGCC4.7では呼ばれる
  • uniformd initializerによる初期化、 {} でクラスも初期化ができる。
  • クラスメンバの初期化の順番は宣言した順番に初期化される。

C言語との違い

  • main() Cではreturnが必要だけどC++では必要ない、C++では再起などが禁止
  • 式中の型宣言
  • 条件式の結果、代入式、カンマ演算子の結果がCだと右辺値だけどC++は左辺値
  • 戻り値の有無、Cではエラーにならないが不定な値が返る、C++ではエラー
  • typedefと構造体(クラス)、C++では同じスコープで別のtypedefを作れない
  • 定数の扱い、C++では未初期化の定数を作れない const int NG;

CilkPlus, TBB, OpenMP

並列プログラミングの話

支える技術

  • Intel CilkPlus
  • Intel TBB
  • OpenMP
  • Future/Promise

Intel CilkPlus

並列プログラミング用のコンパイル拡張、GCCやLLVMでも使用可能。

  • cilk_spawn と cilk_sync
  • Array Notation 自動でSIMD化される
  • #pragma simd
  • Elemental Functions

Intel TBB

C++STL風のアルゴリズム

parallel_for と parallel_reduce があればだいたい事足りる。

parallel_for

  • 並列でforを実行
  • 範囲の分割幅を指定
  • C++11のラムダ式が使える

parallel_reduce

  • 並列リダクションを実行
  • C++11のラムダ式が使える

OpenMP

#pragma で指示

Future/Promise

詳しくは、去年の筑波で発表された資料を参照

マークする理由

コンパイラは並列化可能かどうかの判断が難しい。

なので、プログラマが指示してあげる。

ベンチマーク

時間がなかったので適当

性能差には大きく変化はない。

まとめ

Hello, C++ + JavaScript World!

世界観

  • ChromeのJSエンジンはV8
  • V8はC++で実装
  • SimCityやNode.jsやQtでも
  • NaitiveClient
  • Emscripten (C++をJSに変換)
  • Android

Node.js

サーバーサイド JavaScript プラットフォーム

ブラウザでできないようなことができる

  • ローカルのファイルを読み込んだり
  • サーバーを立てたり
  • npm モジュールで拡張可能

Qt

QtQuickでV8を使用

NaitiveClient

  • NaCl(塩)
  • ブラウザ上で安全にネイティブのコードを実行
  • Pepper(湖沼) API ローカルファイル、キーボード、ゲームパッドへのアクセスなど
  • Twitterより: Portable NaCl LLVM中間言語を使いマルチプラットフォーム対応に

Emscripten

  • LLVM-IRをJavaScriptに変換
  • C++ →(Clang)→ LLVM-IR →(Emscripten)→ JavaScript
  • UnrealEnginがヌルサクで → Epic Citadel
  • Qtもブラウザで動く!
  • HellowWorldは12万行に!?
  • asm.js形式で吐き出すので OdinMonkey で動かすとロードは遅いけどヌルサク

未来のC++に向けて書いた論文という名のネタ帳

  • 発表者:@Sigureya

  • マクロ的な何か(boost.spirit.qi)

  • まとめ、LISPは神の言語、C++は邪心の言語

  • LISPの布教
  • 30分のところ、5分で終了

コンテナのパフォーマンスについて

  • 発表者:@hgodai

  • 29歳教

  • Ivar jacobson と一緒に仕事をしたことが

  • 思考を硬直させない
  • 常識、慣例、しきたり、都市伝説に惑わされない、 自分の目で確かめる

std::vectorでいいの?

  • プロフェッショナルは「とりあえず」は似合わない
  • 「とりあえず」していいのは「ビール」

ベンチマーク

  • std::deque + Win/VS2012 はなぜかすごい遅い
  • oreoreアロケータ使った場合、std::deque や boost::stable_vector が遅い
  • emplace_back() つかえるなら push_back() を使うよりパフォーマンス的に良いことが多い
  • insert()は std::list は爆速、大きなデータの場合は boost::stable_vector も候補に加えてもよい
  • 検索は unorderd_map が早い、ソート済みvectorはそこそこ早い

ソフトウエア研究会in秋葉原

C++14の概要

  • 発表者:@cpp_akira

  • C++11のバグ修正&マイナーアップデート、改め、色々機能追加あり

  • C++17を目指すC++1yも

コア機能

  • 2進数リテラル、 0b1100 で 12
  • 実行時サイズの配列、 定数だけでなくローカル変数や引数でも配列を初期化できるようになった、確保できなかったり0が指定された場合は例外が発生する
  • 通常の関数の戻り値型推論、ラムダ式と同様に通常の関数でも戻り値を推論できるようにする
  • ジェネリックラムダ、ラムダ式の引数にautoが使えるようになる
  • 一般化されたらラムダキャプチャ
  • constexpr関数の制限緩和
  • 変数テンプレート、変数定義にテンプレートを使用できるようになる
  • 軽量コンセプト、C++11で入らなかったコンセプトの軽量版

ライブラリ

  • make_unique()、std::unique_ptr のヘルパ関数
  • exchange()、非並列プログラミング用compere_exchange()
  • コンパイル時整数シーケンス、主にstd::tuple用
  • tupleの型指定get()、インデックスではなく指定した型を取得できるようになる、最終的に変わるかも?
  • quotedマニュピレータ、Boost.Iostreams由来
  • ユーザー定義リテラルライブラリ
  • Type Traitsのエリアステンプレート版、C++11のType Traitsライブラリに対するエイリアステンプレートのラッパー
  • optional型、boost::optional由来、一部boostから変更(none→nullopt)
  • 実行時サイズの配列、dynarray、std::vector風なインターフェースを持ちスタックでメモリを確保するコンテナ
  • 共有ミューテックス、multiple-reader / single-writer なミューテックス、shared_lock / .lock_shared() が追加
  • ファイルシステム、ファイル属性やパス、ディレクトリのサポート、boost.FileSystem V3由来
  • ネットワークライブラリの基本的な機能、間に合わないのでバイトオーダーの交換機能のみ

入らないもの

  • モジュールシステム
  • Rangeライブラリ
  • コルーティン

などなど

ここから始めよう

まとめ

  • C++14には便利な機能が入るっぽい、ただし状況が変わるかも?
  • C++14の次はC++1y
  • C++の仕様策定はクローズドからオープンに

全体的なまとめ

久しぶりのboost.勉強会でしたが、相変わらずboost成分が少ないなーと。

あと、C++ポケットリファレンスを買って著者にサインをもらう流れが面白かったなと、、、ただ、自分もですが休憩時間を越えてサインに行列ができたのはちょっとまずかったと反省(自分は越える前に席には戻っていましたが、、)。

個人的にはJavaScript関連はジャストミートで聞いていて楽しかったです。


   /   変更履歴  /   Permalink  /  このエントリーをはてなブックマークに追加 
 カテゴリ: ブログ  /   タグ: C++, Boost, 勉強会