2016年の振り返りなど
特に恒例でもないですが、折角なので振り返りエントリでも。
すっかり幾日か経ってはいますが。
目次
2016年
個人的に色んな経験が出来た年だったと思います。
半年以上無職な生活を送りまして、怠惰な毎日を楽しく過ごしてました。
その間、色んな本を読んだり、プログラムを書いたり、ゲーム漬けになったりしてました。
2015年から活動を始めたでがらし会でも、定期的な勉強会のほかにFAMを作ったり、C91に向けて
同人誌を作成・頒布するという経験もできました。
Firebirdのアドカレにも一本記事を載せれたのはよかったです。
本当はもう何本か書くつもりではいたのですが。。
夏頃から転職活動を始め、無事、ASP.NET MVCを書くお仕事にありつけています。
Firebirdは仕事で全く使わなくなりました!
これまでとは全く違う環境になったので、新しい発見があってとても刺激的です。
プライベートでも色んな出来事があり、色々と考えさせられたので、本当すごい一年だったなぁ
という気がします。
ブログ
年間で17エントリなので、前年よりも少ないですねw
仕事していると色んなネタが転がり込んでくる一方で、自分でネタを発見するって結構大変だなと
思った次第です。
FAMというアプリを作っていたこともあって、Firebird成分多めでしたね。
今年はどれくらいネタ見つけられるかなぁ。
2017年
あまり気負わず、今やれていることは継続しつつも新しいことに挑戦していきたいと思います。
とりあえずは、少しフロントエンドをかじろう。
それと最近、色々と思うところもあるので、ポエムでもブログにのせてみようかと考え中。
C91でFirebird Embeddedの記事を寄稿した本が出ます
気が付いたら本を作ることになっていたので、その宣伝です。
目次
同人誌作りました
昨年から、栃木県宇都宮市を中心に活動する「でがらし会」なるものに参加しているのですが、
C91で同人誌を出すことになりました。
本を作るのが初めてなメンバーがほとんどで、四苦八苦しながらもなんとか製本までこぎつけました!
Rasbery Pi、Xamarin、Firebird、ソフトウェアデザインというラインナップになっています。
私は記事を一本と、表紙の編集等を担当しました。
私の記事
例のごとく、Firebird Embeddedの入門記事を書いています。
サンプルコードもC#で載せています。
需要はほとんど無いはずですが、何らかの気の迷いで本を手に取ってくださった方が、
興味持ってくれると良いなと思っています。
1日目西み23a
1日目西み23aが頒布場所となります。私も当日ブースにいる予定です。
本は1冊だけです。
おまけとして小冊子もあるのですが、個人的にはこいつがおすすめです(笑)
ここを見てくださる方の中で興味ある方がいれば、ぜひ当日おこし下さい!
C91 新刊「でがらしBOOK Vol.1」 300円
— でがらし会@C91木曜 西み-23a (@degarashi_0807) 2016年12月27日
でがらし会として初めての同人誌です!Rasbery Pi、Xamarin、Firebird、設計をC#でやってみました!
29日 西地区“み”ブロック-23aでお待ちしています!
よろしくお願いいたします! #C91 pic.twitter.com/BddozEAspZ
C#でFirebirdのストアドを書く
本エントリは、Firebird AdventCalender 2016 の14日目です。
今回は、Firebirdの.NET ProviderのコミッターであるJiri Cincura氏がブログで公開している、FbNetExternalEngineについて書きます。
目次
FbNetExternalEngineってなに?
簡単に言うと、C#でFirebirdのストアドがかけるようなpluginです。
Firebird3では新しいplugin機構が追加され、ストアドや関数、トリガー等がFirebirdの内部エンジン以外で動作できるようになりました。
基本的にはC++でpluginを書くことが想定されているようです。
そんな中Jiri Cincura氏が、C#用のplugin機構を仮実装したのが「FbNetExternalEngine」です。
ちなみに、procedureだけの対応です。
もっともお試し実装なので、Productionでは使えません。
簡単な例
実際にどんな風になるかというと。
こんなC#の関数を用意して、
public static IEnumerator<Tuple<string>> HellowWorld(string name) { yield return new Tuple<string>($"Hello World!!, Hello {name}!!"); }
SQL投げると、書いた処理が返ってくる。
実装
Firebird Embeddedで実際に試してみた。
検証環境
- C# (.NET 4.6.1)
- Firebird .NET Data Provider 5.6.0
- Firebird 3.0.0 (Embedded)
Firebirdのバージョンが古いですが、手元にあったのでそのままw
Pluginの作成
ポイントは以下の通り。
- static クラス
- static メソッド
- 戻り値はIEnumerator
IEnumerableではありません!私はよく間違えて動かない (゚A゚;)ってなってます。 - 引数は必ず用意する
引数無しだと上手く動かせなかった... - 引数/戻り値がPrimitive&Value Typeの場合死ぬので、Nullable
にする
こう見ると、割と制限が多い。
サンプル
namespace FbExternalSample { public static class Procedures { public static IEnumerator<Tuple<string>> HellowWorld(string name) { yield return new Tuple<string>($"Hello World!!, Hello {name}!!"); } public static IEnumerator<Tuple<int?>> GetNumbers(int? count) { return Enumerable.Range(0, count.Value).Select(x => Tuple.Create((int?)x)).GetEnumerator(); } public static IEnumerator<Tuple<int?, string>> GetDemo(string txt) { yield return new Tuple<int?, string>(1, "sample1"); yield return new Tuple<int?, string>(2, "sample2"); yield return new Tuple<int?, string>(3, $"{txt}"); yield return new Tuple<int?, string>(4, $"Done!!"); } } }
Pluginを呼ぶほう
まずは普通にEmbeddedが動く環境整備
適当に必要なDLLを配置する準備だけしておきます。
よくわからなければ、過去記事を参照。
Firebird3.0でEmbedded試してみた - ぽにょろん
FbNetExternalEngineを配置
下記ブログ記事から、必要なアセンブリを取得します。
External procedures in Firebird in .NET done(-ish) | tabs ↹ over ␣ ␣ ␣ spaces by Jiří {x2} Činčura
ちなみに、7zで圧縮されてます。解凍して、中身をpluginsフォルダに突っ込みます。
plugins.confの作成
Firebirdのplugin設定を変更するために、plugins.confを配置又は作成します。
中身はこんな感じで。
Plugin = FBNETEXTERNALENGINE { Module = $(dir_plugins)/FbNetExternalEnginePlugin Config = FBNETEXTERNALENGINE_config } Config = FBNETEXTERNALENGINE_config { }
DBにprocedure作成しておく
FirebirdのDBファイルを適当に作成して、そこにprocedureのcreate文を流し込みます。
recreate procedure HellowWorld (in_name varchar(300)) returns (out_0 varchar(300)) external name 'FbExternalSample!FbExternalSample.Procedures.HellowWorld' engine FbNetExternalEngine; recreate procedure GetNumbers (in_count integer) returns (out_0 integer) external name 'FbExternalSample!FbExternalSample.Procedures.GetNumbers' engine FbNetExternalEngine; recreate procedure GetDemo (in_txt varchar(300)) returns (out_0 integer,out_1 varchar(300)) external name 'FbExternalSample!FbExternalSample.Procedures.GetDemo' engine FbNetExternalEngine;
作成したPluginを配置する
上記で作成した、PluginのDLLもFirebirdのアセンブリがあるPluginsフォルダにぶち込みます。
実行
あとは、SQLを実行するだけ。
結構雑なコードですけど、こんな感じで確認すると、
var sqls = new[] { "SELECT * FROM HellowWorld('Taro')", "SELECT * FROM GetNumbers(5)", "SELECT * FROM GetDemo('やったぜ!')" }; using (var con = new FbConnection(builder.ConnectionString)) using (var command = con.CreateCommand()) { con.Open(); foreach (var sql in sqls) { Console.WriteLine("- SQL -"); Console.WriteLine(sql); Console.WriteLine("- 実行結果 -"); command.CommandText = sql; var reader = command.ExecuteReader(); while (reader.Read()) { var result = ""; for (var i = 0; i < reader.FieldCount; i++) { result += $" {reader[i]}"; } Console.WriteLine(result); } Console.WriteLine("------------------------------------"); } }
こんな結果になります。
最後に
Jiri Cincura氏のブログ読んで貰えればわかりますが、実際はまだまだ試作段階です。
制限も多いし手順も割と面倒ではありますが、まぁ、とりあえずできるよ!という状況です。
とはいえ、どれくらい存在するのかわからない、Firebird + C#erには嬉しいので、色々と試してみてはいかがでしょうか。
記事を書くのに殴り書いたサンプルも置いておきます。
Sample/FbExternalSample at master · kowill/Sample · GitHub
HTML5 CONFERENCE 2016 に参加してきた
HTML5 CONFERENCE 2016 に参加してきました。
参加時と後から録画をちらっと見たメモを記載しておきます。
公式HP
events.html5j.org
YouTube - ライブ配信録画 www.youtube.com
目次
- 目次
- 基調講演
- ブラウザ用のCPUをつくるよ!WebAssemblyで
- Webのグラフィックス前編: WebGL事例、パフォーマンス
- Webのグラフィックス後編: WebGL2、そしてWebVR
- Webパフォーマンス最前線
- 最後に
基調講演
中村さん
- Webという名の Distributed Operating System
- インターネットで世界中のコンピュータが繋がってる
- Webページは世界中のドキュメント
- みんなで分散システムを作ってるみたいなもん
- Block Chain に関するワークショップ
分散システムにおけるTrustをどうやって作るか
参加者の合意でTrust作れるんじゃないの?という可能性
及川さん
- 実はIE7担当してました
- HTML5というキーワードはもういいんじゃないの? → Webそのもの
- モバイルWebはUI/UXが悪いことが多くなってきた
キュレーションアプリとかが流行ってきた理由の一つでもある - ProgressiveWebApp
よりアプリ化されたWeb - モバイルWebの課題対応について
Accelerated Mobile Pages - Webは何度も死んでるw
が、生き返る
medium.com
ブラウザ用のCPUをつくるよ!WebAssemblyで
- WebAssemlby は WASM VM上で動くよ
- WebAssembly の Working Grop Mozzila, Microsoft, Google, Apple の各社から人が来てる
- asm.js と比較すると WebAssembly の方が Binary Size が小さい
- WASM はコンパイルの生成物
Nativeではなく、parsingが終わってるだけ。
ASTのバイト表現。 - まだまだこれからの技術
Webのグラフィックス前編: WebGL事例、パフォーマンス
Webのグラフィックス2016
- WebGLを実務で使ってる人 → 昨年より増えている感じ。(参加者の)
- 3D、難しい、大規模コンテンツ というイメージが強い 2Dでも使えるし、Three.js等を使うことで、割と簡単にできる
- 表現を広げる選択肢になるうる
- 小さいコンテンツから始めると良い
ものによってはCSS等で頑張るよりも、簡単なケースもある
資料
WebGL最適化の勘所
- GPU処理のおさらい
- ボトルネックになりやすい場所
JS & WebGLドライバ パフォーマンスチェックして最適化しよう - まずはCPUボトルネックを疑おう Windows版のChrome等では、WebGL実装がDirectXに命令に変換してたりするのもある
- WebGLプロファイラ
- WebGL専用ではないけど、おすすめ
tracing-framework by Google - プロファイラ使ってるときは、とうぜんその負荷もプラスされるので、相対値で考える
- WebGL専用ではないけど、おすすめ
- WebGL独自のTips
gl.TRIANGLE_FANは避ける
頂点アトリビュートは4byte境界に揃える
etc... - ライブラリ使ってるときは?
WebGL命令が隠蔽される とにかくドキュメント読め!
stackoverflowとかでノウハウ集めよう → 有名なライブラリ使ったほうが楽
資料
WebGL最適化の勘所
Webのグラフィックス後編: WebGL2、そしてWebVR
WebGL 2.0
- 1.0と比較して、劇的進化しているわけではない
普段から WebGL をぺろぺろしてないと、そこまで恩恵はないかも - WebGL 2.0 がきたら
- より 美しく現実的/高速で効率的 なレンダリングができる
- リソースやデータ方が柔軟になる
- テクスチャの画像データサイズが2の累乗でなくてもよくなる
- 既存のコンテンツはそのままでも大丈夫 実装が別
- 学習が難しくなるか?
そもそも3DCG全般ムツカシイ
日本語情報はほぼない
そしてWebVR
資料
Webパフォーマンス最前線
- Webがアプリのように振る舞うことが求められている
Progressive Web Apps - パフォーマンスに対する優先度
- Webサイト
LoadやAnimationが重要 - Progressive Web Apps
ResponseやAnimationが重要
- Webサイト
- GPUを活用しよう
ex) translate, will-change -> 常時使うと電池とかに悪影響なので、上手く使おう - 通信量を気にするところから、UIを早くしようという方向にきてる
最後に
所用で最後までは参加せずに帰ったのですが、とても勉強になりました。
率直に思ったのは以下の通り。
かなりのバイアスがかかってるけど、Web周りの話を聞きに行ったのに、スタックマシンやAST、GPUの話を聞いたイメージばかりが残ってる。
— kowill (@kowillm) 2016年9月3日
WebページがどんどんNativeっぽくなってる側面は確かにあるなぁというのが実感。
あと、俺、Webの知識が足りないなぁ。というのも。頑張ります。
FAManagementStudioなるものを作ってます
以前からFirebird Embedded用のGUIツールを作成、公開しています。
名前は「FAManagementStudio」です。
その宣伝記事になります。
目次
背景
Firebird Embeddedを以前から使っていたのですが、個人的に使い勝手の良いGUIツールにめぐり合わなかったので、簡易なものを作ってみました。というのが背景です。
定番ツールのFlameRobinも悪くないのですが、ちょっと馴染めなかった。
ちなみにWindows環境のみ対応。
Firebird2.5/3の両方で使用可。
ツールの概要
とにかくお手軽に使えるようにという方針です。
DBファイルをドロップ、SQLを実行(F5)、結果を確認するといったイメージです。
詳しい使い方
GithubのWikiを少しづつメンテしているので、そちらを参照ください。*1
Home · degarashi0913/FAManagementStudio Wiki · GitHub
開発環境
VS2015 + C# + WPF です。
Ver1の時は.NET3.5で作成していましたが、Ver2で.NET4.5に変更しました。
最後に
Firebird Embeddedを使っている方がいれば、ぜひ一度試してみてください。
まだまだ機能が足りなかったり、バギーだったりしますがその際はFB、PRお待ちしております。
*1:主に他のメンバーが