プログラミング一覧

Vulkan から OpenGL へ描画

Vulkan で描画した結果を OpenGL の世界で使用することができます。
これには NVIDIA 拡張を使用するので、現時点においては NVIDIA のグラフィックスボードを使用していることが条件になります。
今回のこの拡張の名前は、 GL_NV_draw_vulkan_image というもので、将来的に他のメーカーも対応するようになればいいなと思います。

何が出来るのか

GL_NV_draw_vulkan_image という拡張は何を行ってくれるのかというと、
Vulkan を使用して描画した結果を OpenGL の描画で使用するといったことを可能にしてくれます。
詳細には Vulkan の Image を用いて、 OpenGL のカレントのフレームバッファに対して矩形を描画します。
これにより Vulkan でオフスクリーンに描画した結果を (FBOを用いて) OpenGL のテクスチャにするといったこともできます。

API の仕様は、以下の URL にて記載があるので興味のある人はご確認ください。
NV_draw_vulkan_image

続きを読む


C++/CX の小ネタ その2

データの通信で Stream を扱っていたときに出遭ったものです。
送受らの際に、持っているデータを送り出すのは Flush だと考えていると同じようにはまります。

注意事項

持っているデータを送り出すのは Flush というのは間違っていないのでしょうが、
C++/CX のストリーム系の実装のうち、DataReader/DataWriter の詳細がちょっとだけ異なるのがポイントでした。

これらは内部バッファにデータを読み込み、自分の期待するデータで取り出す(出力する)といったものになっています。
そのため、内部バッファのことを考慮したコードを書く必要があるようです。

データを送出のときには、 StoreAsync を呼び出します。
受信の際には、 LoadAsync を呼び出します。これらによって、内部のバッファとのデータをやりとりが行われます。

これらの詳しい説明は以下のページのものが非常にわかりやすく、勉強になりました。

http://garicchi.hatenablog.jp/entry/2015/01/04/102749


C++/CX でHTTPサーバーと JSON を送受したい

以前の C++/CX 小ネタ に続く C++/CX の話題です。
HTTPサーバーに JSON データを送って、何か JSON データが返ってくるまでを記述した例になります。

コード例

通信なので非同期処理で記述しています。
create_task 関数は処理の継続を、 then で続けて記述できるので便利でした。
このコード例では、 json の文字列が UTF-8 エンコードされたものとして送っています。

あとは、JSON データをどう作るか、デコードするかですが、これには json を扱うライブラリは多種あるのでそれらにお任せです。
手元では picojson を入れてみましたが、 C++/CX の環境でも問題なく動作しているようです。


C++/CX の小ネタ

.Net framework を C++ から扱うために、自分は C++/CLI を書いたりすることもあるのですが、今回 C++/CX にも少し手を出し始めたのでそのときの記録メモです。
慣れている人から見ればしょうも無いことを記録しているのかもしれませんが、あたたかく見守ってくれればと思います。

C++/CXとは

今流行の(?) UWP アプリを C++ で記述するときに使用する言語です。
CLI では .Net framework を扱ってきたように、 CX では WinRT を扱います。

各種方法まとめ

C++/CX ではどう記述するのかを場合に分けて記録しておきます。 C++/CLI ではおなじみの点については記載なしです。

オブジェクトの生成

gcnew から ref new に変わりました。
削除には delete を呼び出してもよいみたいです。

as 演算子

C# での as 演算子に相当するものとして dynamic_cast が使えるようです。

文字列について

このように記述することが可能。 こう書くのであれば、Lプレフィックスもつけなくてよいみたいです。
Cの char 配列も String コンストラクタに渡せます。

std::string, std::stringstream を使っている場合にはちょっと面倒が増えました。一度UTF8経由して wchar_t 文字列へと変換が必要でした。
変換が終わった後は String( oss.str().c_str() ) などで C++/CX の String に出来ました。

SHA1 ハッシュを計算

std::string の文字列から Cryptography API を使って、 SHA1 ハッシュを計算するには以下のようにします。
配列データのプロキシを作って、 CryptographicBuffer に入れて計算オブジェクトに渡します。

素直に配列を渡せないという点で、一手間増えてますね。

Task.Run

C#で非同期処理をやるのに便利だった Task です。
create_task 関数を使って同じようにできるようです。

タスクの実行スレッドを制御するには、この関数の第2引数で設定します。これにより現在のスレッドで実行したり他のバックグランドスレッドにやらせたりとできます。

UIスレッドで実行させたい場合には、 CoreDispatcher.RunAsync メソッドという方法もあるようです。
処理させたい内容をそのままラムダで渡せず、 DispatchedHandler でくるんで上げる必要があるようです。

まとめ

流行ってないからなのか日本語で C++/CX の情報ってまだまだ少ないですね。
C++/CX を触ってみて、C++/CLI のものとはまたちょっと違った風のコードになるという感触でした。
1つ気になったのは、コンパイル速度がやや遅めであるという点です。ヘタしたら C++ のコードよりもコンパイル遅いかも。


OpenGL 4.6 発表!

2017年の SIGGRAPH で OpenGL バージョン 4.6 が公開となりました。
Vulkan が登場して、 OpenGL もバージョンアップを続けるとといわれても不安なところでしたが、ちゃんと出ました。
今回の目玉と個人的に思っているのは、 SPIR-V 関連が標準サポートに入ってことですね。これで事前コンパイル済みシェーダーを OpenGL でも使うことが出来るようになります。

SPIR-V を OpenGL で使用してみることは 4.5 のころの拡張で入っていました。このときの実験の結果は以前の記事に書いてあります。興味のある方はそちらも参照ください。
続きを読む



curl で Cookie 認証突破

様々な Web サービスがありますが利用する際に、ユーザーはまずログインして使用するといったものがあります。
有名どころはアプリケーション用のAPIキーを発行して使用させてくれたりしますが、そうでないところもまだ残っているんじゃ無いかと思います。
それと、 API キーを発行するまでじゃないんだよなぁといったときに、ログインしてちょっとだけ処理させたいといった需要でなんとか出来ないかトライした記録です。

はじめに

通常の Basic 認証なら、 curl のオプションに設定して終わりだったりします。ここでは専用のログインフォームがあって、そこに入力するといったものを想定しています。

ここで対象にあげたサービスらはちゃんと REST API を備えているので、今回紹介するような話は全く不要のものとなります。無駄な努力は避けるようにしましょう・・・。

続きを読む


Cloud9 IDE をサーバーにインストール

クラウド開発環境サービスの Cloud9 の IDE については、オープンソースとして公開されているため、 Linux 環境に入れて使うことができます。
これを利用して、開発サーバーに Cloud9 IDE をインストールして、ブラウザで開発ということにトライした記録です。

インストール

Ubuntu 17.04 にインストールしてみました。
Cloud9 Core (https://github.com/c9/core.git)として環境が公開されています。
一般ユーザーの環境にインストールすることが前提なのでその点にご注意ください。
続きを読む


CMake に入門&対処事例

Visual Studio の各バージョンごとに vcxproj を用意して… というのが辛くなったため、 CMake によるプロジェクト生成という流派にちょっと入門してみました。
現時点において、 Visual Studio のバージョンが違っても割とプロジェクトは開くことが出来ますし、ツールセットなどの設定をプルダウンメニューから変更する程度で対応できるような状態になっているため、以前ほど対応に時間がかかるような問題ではありません。

しかしながら、ユーザーの操作が伴いますし、各バージョンごとにビルドチェックしたい!といった点ではできないようなので、 CMake 方式に変更してみた次第です。

事例色々

ここでは入門してみて、Visual Studio でのあれそれが、 CMake ではどうやるの?といったことを挙げていきたいと思います。
また、こんなところに躓きました、という点も合わせて上げていきます。これがこれからの CMake やる人への助けになればいいなと思います。

そもそもとして CMake についての書籍があればそれを紹介&読んでみようと思うのですが見当たらず・・・。 gnu make は書籍があるのに残念です。
基本的な点については自分が把握していないこともあるので、別の解説サイトにお任せしたいと思います。

一応自分はこのようにして対処したというものなので、もっと良い方法がある可能性は大いにあります。また、ある状況ではうまくいかないということもあるかもしれません。

続きを読む


Python 開発環境としての VSCode

Python での開発をやりやすくするために、 Visual Studio Code で Python 開発環境を準備してみました。

必要なもののインストール

VSCode

Visual Studio Code をインストールします。
VSCode は https://code.visualstudio.com/ から取得可能です。
この記事を作成しているときには 1.13 というバージョンのものでした。

Python

Python をインストールします。 Anaconda のほうではなく本家の Python をインストールしました。
そして、今後の取り扱いのことを考えて、 virtualenv も準備ししておきます。そのためには Python のインストール時に pip もインストールされるようにしておきます。

インストールが終わったら、 pip を使って virtualenv をインストールします。

続きを読む