あめだまふぁくとりー

Boost.Graphとかできますん

Neovim 上で Sixel 画像を表示する

Neovim 上で Sixel 画像を表示する(といっても,実際は Noevim をバイパスして,ターミナルエミュレータが表示するわけだが). 環境は macOS,iTerm2 を使用した. Sixel 画像の生成には timg を使用したが,いろいろ面倒なので img2sixel を使った方が楽…

iTerm2 上の Neovim だと Ctrl + backslash が効かない

iTerm2 で Neovim を再起動するとなぜか Ctrl + backslash が効かなくなるため,これまで Mac 標準のターミナルを今まで使用していたのだが,iTerm2 の設定でうまく回避することができた. iTerm2 の Key Bindings の設定で,「Send Hex Codes」Action を「^…

vfiler.vimの乗り換えました

Neovimの設定をLuaで一新したので,使用していたプラグインも見直しを行いました. ファイラーはこれまでDefxを使用していましたが,以下の理由でvfiler.vimを採用しました. Luaで設定が書けること(Luaの設定ファイル内でVimScriptを書く方法がよくわかっ…

Sphinx における日本語文書の不自然な空白を除去する拡張を公開した

Sphinx で日本語文章を書いたドキュメントを HTML として表示すると, 改行箇所やインラインマークアップの前後で空白が表示されてしまいます. 今までは japanesesupport.py を使用していたのですが, pip でインストールできないのが面倒くさかったので同機能…

CentOS7でPlantUMLのレイアウトが上手く制御できない

CentOS7でPlantUMLサーバを立ち上げて見たのですが,ユースケース図やクラス図の配置が上手く制御できませんでした. 結論としてGraphvizのバージョンを上げることで解決できました. 制御が正しく機能しない例 PlantUMLでは,要素間の関係にleft, right, up…

sphinx-docxbuilderを復活させた

どうしても Office Word を使いたくなかったので, sphinx-docxbuilder を復活させまし た. ソースは GitHub にあげています. 最初はちょっと手を入れる程度だったのですが, テーブル周りに色々問題があったりで修正しすぎてソースコードの原型はほとんどなく…

Networking TS の Boost.Asio からの変更点 - その 4: Associated Executor

はじめに Boost 1.66 で Boost.Asio が Networking TS に対応するようです. なのでその 3 からかなり間が空きましたが, その 4 の記事を書きます. 前回 Executor について説明したので, 今回は Associated Executor について説明します. Boost.Asio でのハン…

Networking TS の Boost.Asio からの変更点 - その 3: Executor

はじめに 前回までに説明した Associated allocator や async_result は少し地味目な変更点でした. 今回説明する Executor は Boost.Asio から Networking TS の中でも大きめの変更になっています. 一般化された io_service と strand Executor は Networkin…

Networking TS の Boost.Asio からの変更点 - その 2: async_result

はじめに 前回は Boost.Asio から Networking TS への変更点として Associated allocator について説明しました. 今回は, async_result について説明します. Boost.Asio における非同期処理スタイル Boost.Asio の非同期関数はすべて継続渡しスタイルをベー…

Boost.Asio でのタイマのキャンセル処理の仕方

先日, マイナンバーのカード管理システムの障害の原因と対応についての発表がありました. 地方公共団体情報システム機構 カード管理システムの中継サーバに生じた障害原因の特定と対応について その原因 2 では, Windows のタイマをキャンセルしたのにタイム…

Networking TS の Boost.Asio からの変更点 - その 1: Associated allocator

はじめに 現在 TS に提案されている Networking Library は Boost.Asio をベースにしていますが, Boost.Asio そのままというわけではなく様々な変更が含まれています. 本記事ではそれらの変更点によって何が変わったのかを説明しようと思います. 最初は Asso…

名前解決から始める C++

この記事は 初心者 C++er Advent Calendar 2015 14 日目の記事です. いきなりですが次のコードを見てください. #include <iostream> struct cat { std::string name; }; void print_name(cat const& neko) // const 参照渡し! { std::cout << "this cat name is " << n</iostream>…

io_service の使い方

この記事は C++ Advent Calendar 2015 14 日目の記事です. 13 日目は okdshin さんの Boost.Computeでグラボを燃やす - クリアボックス でした. 本記事の内容 本記事では io_service をどう使うかについて書きます. 具体的には, io_service の使用モデルを整…

initiating function 内で yield_context を呼べるようになった

Boost 1.58.0 以降では, Asynchronous operation の initiating function (async_write_some など) 内で直接 yield_context の handler の呼び出しが可能になりました. 以前まではどうだったかというと, spawn 外へのコンテキストスイッチ (initiating funct…

GCC 4.9.1 で List-initialization の評価順が直っていた

C++

List-initialization におけるリストの各要素の評価順は左から右に評価されるように規定されています. しかし, GCC 4.9.0 以前では List-initialization でコンストラクタが呼び出される場合は正しい順序で引数が評価されていませんでした. #include <iostream> int f(</iostream>…

Boost 1.59 を GitHub リポジトリのソースからビルド

いつもは zip か, Homebrew でインストールしていたのを使用していましたが, 今回は GitHub から持ってきたのでメモを残しておきます. # boost のトップリポジトリを取得 git clone https://github.com/boostorg/boost.git # 各ライブラリのリポジトリを取得…

Boost.Function を使わない SCOPE_EXIT_ALL

修正(2015-02-22) RVO を無効化した場合, 指定した処理が複数回実行されてしまうのを修正しました. Boost.Scope Exit の実装を覗いてみたら, C++11 (or later) 用の BOOST_SCOPE_EXIT_ALL には Boost.Function が使用されていました. Boost.Function は動的…

Asio の coroutine で明示的に yield する

実行時間がかかる処理 A を coroutine の中で行うと, その coroutine と同じ strand 内の処理は処理 A が完了するまで待たされてしまいます. io_service::post または strand::post を使用することで, 処理 A の合間で明示的に coroutine を切り替えることが…

boost::asio::async_write / read の限界

asio::async_write と asio::async_read に難癖をつけてみます. stream のコンテキストとハンドラのコンテキストが分離されていない socket への書き込み (読み込み) 処理は sock_strand 内で実行し, その書き込み (読み込み) 完了のハンドラは handler_stra…

連続で async_write するまでの道のり (その 3)

単一の socket で連続して async_write するの 3 回目で, 最終回です. 前回の記事では strand を使用方法について見ました. 本記事では作成する queueing socket の wrapping callback に strand を適用する方法を見ていきます. wrapping callback の実装 qu…

boost::asio::asio_handler_is_continuation の効果

asio_handler_is_continuation の効果がいまいち良く分からなかったので調べてみました. ある handler について, asio_handler_is_continuation の結果が true の場合, 処理が以下の様に少し変わります. handler はスレッド固有の private queue に一度登録…

連続で async_write するまでの道のり (その 2)

単一の socket で連続して async_write するの 2 回目です. 前回の記事 では, 普通に socket に対して非同期送信関数を連続で呼び出す際の問題点について整理しました. 前回の内容を踏まえると, 以下のような動作をする async_write_some メソッドを持つ soc…

連続で async_write するまでの道のり (その 1)

単一の socket を使用して, 一つ目の送信処理の完了を待たずに二つ目の送信処理を実行したいといった場合は多々あります. レスポンスの順番がリクエストの順番とは異なる非同期プロトコルを使用または実装する場合には, そういったケースに特に遭遇します. B…

標準入出力を Boost.Asio で非同期に行う

標準入出力を Boost.Asio で非同期に行いたい場合は, posix::stream_descriptor を使用するといいみたいです. 使用例 #include <chrono> #include <iostream> #include <boost/asio/buffer.hpp> #include <boost/asio/io_service.hpp> #include <boost/asio/posix/stream_descriptor.hpp> #include <boost/asio/read_until.hpp> #include </boost/asio/read_until.hpp></boost/asio/posix/stream_descriptor.hpp></boost/asio/io_service.hpp></boost/asio/buffer.hpp></iostream></chrono>

Graph Visitor でアルゴリズムの振る舞いを描写してみる

BGL

学習用にグラフアルゴリズムの振る舞いを視覚的に見たい場合, Boost.Graph の Visitor を使用すれば, 一からそれ用のアルゴリズムを実装せずにすみそうです. という訳で, 実装してみました. GUI は Python + Tk で実装して, 表示する情報を Visitor から TCP…

Boost.Asio で read / async_read を使用する際の注意点

1. boost::asio::streambuf と組み合わせる場合 うっかり, boost::asio::async_read(socket, streambuf, handler); 見たいに書くと, 永遠に handler が起動されない可能性があるので注意しましょう. これは, async_read は指定されたサイズ分読みを行い, デ…

Boost.Test で Test Suite と Test Case の Fixture の併用

Boost.Test では,Test Case に対して Fixture を設定すると,Test Suite レベルの Fixture がその Test Case に対して使用されなくなります. よって,以下のようなコードはコンパイルエラーになってしまいます. #define BOOST_TEST_DYN_LINK #define BOOS…

第一回 グラフ王 決定戦

dijkstra_shortest_paths での比較 Stanford GraphBase と boost::adjacency_list, boost::vector_as_graph を利用した std::vector によるグラフで boost::dijkstra_shortest_paths の実行時間を 適当に 比較してみました. boost::adjacency_list は節点と…

Boost.Graph property to Boost.Fusion

Boost.Graph のグラフ構造体で使用される property を fusion::for_each で使用できるようにしてみました. ソースは こちら にあげています. property に bundle (ユーザが定義した構造体)が含まれる場合, bundle は fusion::for_each 上には現れないので注…

Boost.Program_optionsで名前を持たないオプションの扱い方

Boost.Program_optionsについて調べてみたので,備忘録として. 名前を持たないオプションの対応 以下が名前を持たないオプション値の例です.オプション値hogeはoptionという名前に関連づけされていますが,huga.txtには関連づけされた名前がありません. $…