右上➚

プログラミングに関するメモをのこしていきます

Rust で Unix のシグナルを channel 経由でキャッチする

Rust でシグナルハンドリングをする必要があったのですが,あまり自分の用途にあるライブラリがなかったので作りました. 僕が Windows のことをほとんどわからないので,Windows 未対応です. github.com docs.rs https://crates.io/crates/signal-notify g…

BK-tree を golang で実装した

先日はてぶに 興味深いデータ構造:BK木 | プログラミング | POSTD という翻訳記事 ( 元記事 http://signal-to-noise.xyz/post/bk-tree/) があがっているのをみて初めて BK-tree というものを知ったので,golang で実装してみました. github.com BK-tree と…

Rust でグラフ構造や木構造を作る

プログラムを書いていると何かしら木構造っぽいものやグラフっぽいものを作りたい場面が多々あると思います. Rust は所有権や Size の都合で,これらを作ろうと思うと地味にハマるのでまとめておきます. Rust で木構造 最も単純な木構造は Rust だと enum …

mio で echo サーバメモ

Rust の非同期 IO ライブラリのなかでももっとも低レベルなレイヤーを担っている mio を使ってecho サーバを書いた。 echo サーバばっかり書いているような気がするけど,echo サーバやっておくと簡単な割にライブラリの使い方とかがちゃんと分かる気がする…

NCurses の Crystal binding を作った

この記事は、 Crystal Advent Calendar 2016 の8日目の記事です。 qiita.com ncurses という CUI を作るためにスクリーンやキー入力を扱う有名なライブラリの Crystal binding を作りました。 github.com ほとんど C の ncurses と同じ感じで使えるようにな…

Rust で Box に包まれた構造体の所有権分解

ちょっとはまったのでメモ struct A { foo: Vec<i32>, bar: Vec<bool>, } こんな構造体があったとする。 普通、A の所有権を分解して foo と bar にしたいときは fn xxx(x: A) -> (Vec<i32>, Vec<bool>) { let A { foo, bar } = x; (foo, bar) } とやれば良い(この例だともっと簡</bool></i32></bool></i32>…

日本語の改行を適当にいい感じにするツールを作りました

必要に迫られて、HTML ページ内の改行位置をいい感じにするツールを作ってみました。 github.com HTMLに長文を書くと、親 DOM のサイズの制約上、適宜改行がぶちこまれます。 しかし、改行位置は文節を考慮などせずにごりっと挿入されるので、多くの問題が生…

Rust の Result と Iterator

Rust には失敗するかもしれない値を表す Result<T, E> という型があります。 std::result::Result そして iterate できることを表す Iterator という trait があります。 std::iter::Iterator また、Iterator trait は要素型を表す関連型を持ちます。例えば String</t,>…

値と参照について

「値」と「参照」という言葉があります。 このへんの言葉について、今の理解をまとめておこうと思います。 言葉の定義や理解が誤っている部分があればご指摘ください。 まず、前提として以下では、「値」ベースの言語として C, C++, Rust などを、「参照」ベ…

再帰的 grep ツール crepe を作っています

C++

再帰的にパスをたどりながらパターンにマッチする行を検索する grep 系のツールを作っています。 agatan/crepe 有名どころとしては、ack とか ggreer/the_silver_searcher(ag) とか monochromegane/the_platinum_searcher とか tkengo/highway なんかがあり…

C++ で result 型を作る

Haskell や Rust など多くの強力な型システムを持つプログラミング言語は、Either とか Result といった「失敗するかもしれない」計算の値を示す型を持っています。 現在の C++ の標準ライブラリにはこのような型はありませんので、それを自作してみようとい…

C++テンプレートイディオム CRTP

C++テンプレートの有名なイディオムとして、CRTPというものがあります。 今回はそれについて。 複雑な部分特殊化みたいな話もないですし、メリットもわかりやすい良いイディオムだと思うので、ちょっとまとめておきます。 (Control キーのことをよく CTRL と…

C++ のテンプレートの実装

C++ のテンプレートがなぜ必要で,どんな構文・種類のものがあるかについては前回までにまとめました。 というわけで次は C++ ではテンプレートという機能を使用するとどんなバイナリが生成されるのかについて見ていきます。 C++ のテンプレートの強力さとか…

C++ テンプレートの種類と構文

C++

前回テンプレートがなぜ必要なのかについて簡単にまとめたので、今回はその構文や種類についてまとめたいと思います。 agtn.hatenablog.com アウトライン テンプレートの種類と構文 定義する 使用する(インスタンス化) クラステンプレート 関数テンプレート …

C++ : なぜテンプレートが必要なのか

C++

こんにちは。 ちょっと C++ への熱を冷まさないために、C++ のテンプレートについてまとめてみたいと思います。 対象 C++ のテンプレートが怖い人 C++ のコンパイルエラーメッセージが怖い人 C++ の規格とブログポストを比較して誤りを探したい人(もし誤って…

Rust のパーサコンビネータライブラリ combine を使う時の tips

Rust のパーサコンビネータライブラリの一つである Marwes/combine: A parser combinator library for Rust を使ってみています. 詳しい使い方はきちんとしたドキュメントがあるのでそちらを参照してください. ざっくりいうと Haskell の parsec: Monadic …

C++ でパーサコンビネータを書きました

C++ で構文解析といえば,Boost.Spirit や yacc系などが有名ですが,どうにも使うの辛かったので作りました. 2016/05/01 追記 いろいろ更新しました.肯定先読み以外はプリミティブも実装し終わっているかと思います. ドキュメントはまだ無いのですが,す…

Rust における return文の LLVM IR 表現について

if 文が値を返す return 文を持つ 以上のような特徴を持つ言語はどういう感じでコンパイルされるのか知りたくて,Rust について調べてみました. Rust では以下の様なことが出来ます. fn f() { let x = if cond { return None; } else { 1 }; ... } Scala …

C++ の複雑な型を整形するプログラムを作りました

C++

テンプレートをバリバリ使っている C++ プログラムのコンパイルエラーが,死ぬほど辛かったので作りました. 型を綺麗に出力するだけです. C++の型版 jq みたいなやつありそうだけど無いのかな? agatan/tf たとえば, boost::spirit::x3::raw_directive

Type Erasure による Visitor パターンの実装

プログラミングしていて,木構造をうまく扱いたいという状況は結構良くあると思います. 代数的データ型とパターンマッチを持つ言語であればとても美しく完結に表現できる木構造ですが,オブジェクト指向言語でやろうと思うと結構たいへんです. 典型的には …

#include をソートするVimプラグインを作りました

Haskellでimport文をソートするプラグイン vim-haskell-sort-import を作りました - プログラムモグモグという記事を拝見して,コードを見たらすごくわかりやすくて,これの C/C++ 版がほしいと思い,書いてみました. vim script はほとんど書いたことがな…

コンパイラ内部の AST 表現について

コンパイラは大体,ソースコードを構文解析し,AST を作り,意味解析,コード生成という流れで実装されると思います. さて,AST は単純に書くと type expr = | Int of int | Add of expr * expr | Apply of expr * expr list | ... みたいな感じに書けると…

Boost.Spirit.X3 で簡易電卓を実装 1

agtn.hatenablog.com agtn.hatenablog.com 引き続き,Boost.Spirit.X3 です. 今回は,前回までの知識をつかって,簡易電卓を実装してみます. 仕様 今回定義する電卓は, + - * / の 4 つの演算と単項の - をサポートします. また,整数型のみを扱うものと…

Boost.Spirit.X3 の練習 2

Boost.Spirit.X3 の練習1 - プログラミングのメモ帳➚に引き続き,Boost.Spirit.X3 のお勉強メモです. セマンティックアクション 構文解析にはセマンティックアクションというのがつきものです. yacc や parsec など有名な構文解析のためのツール/ライブラ…

Boost.Spirit.X3 の練習1

Boost.Spirit.X3 の練習1 Boost.Spirit.X3 という C++ のための パーサコンビネータライブラリを使ってみています. Boost.Spirit というと, C++ の黒魔術の塊みたいなイメージがあります. ちなみに Boost.Spirit.Qi が安定版のパーサコンビネータライブラ…

Sokoban.nim を書いてみた

Sokoban.nim を書いてみた Nim という言語を使って倉庫番を書いてみました. sokoban-nim sokoban-rs に影響されました. といっても SDL ド素人なので見た目は恐ろしく質素です. Nim の練習のつもりで書いてみました. 動作 動作としては,コマンドライン引…

Golang での文字列連結に関するベンチマーク

まず結論 append しよう. bytes.Buffer はそんなに速くない. きっかけ こんな記事を見かけました. Goでは文字列連結はコストの高い操作 - Qiita buf += "abc" はコストが高いよーっていうお話ですね. これは golang にかぎらず, Javaとかでもよく話題になる…

Golangでechoサーバ

最近 golang が気になります golang の特徴はもはやわざわざここに書くまでも無いことだと思うので書きませんが, 気になっている理由を書いてみます. バイナリ(しかもポータビリティが非常に高いバイナリ)にコンパイルされること C/C++ には及ばずとも実行が…

Haskellでechoサーバ

はいどうもー 引き続きHaskellの話題です. ちょっとHaskellでTCPソケットを使ってみたくなったので, まず簡単なものから実装してみます. TCPソケットのチュートリアルといえばechoサーバですね!クライアントからの入力をそのまま返すサーバです. せっかくな…

HaskellのConcurrentについて調べてまとめる (MVar編)

どうもこんにちは. 前回(HaskellのConcurrentについて調べてまとめる (IORef編) - プログラミングのメモ帳➚)の続きです. 今回はスレッド間協調のためにMVarを使う方法について調べたので, まとめたいと思います. MVar Haskellにかかわらず, 最近の並行処理は…

HaskellのConcurrentについて調べてまとめる (IORef編)

こんばんは. Haskell(GHC)で並行処理を必要とするアプリケーションを書いてみようと思ったのですが, 並列処理に関するいろいろについてよくわかっていない部分が多かったので, 調べたついでにまとめておこうと思います. もし間違い等ありましたらコメントい…

yukicoder 2015/05/08

yukicoderさんのコンテストに出てきましたー ★から★★★までの四問ということでもしかしたら完答いけるんじゃないかとか甘いことを考えていたのですが...ww 結果 3完で19位でしたー4問目はTLEの連発で...解法全く思いつけませんでしたねー ただ前よりはちょ…

yukicoder 2015/05/03

今週は土日共に予定があってAtCoderさんもyukicoderさんも出場したかったのですが出来ず... AtCoder - ARC 今週のAtCoderさんはABCはなかった?ぽくて, ARCに挑むにはまだちょっと力不足かなと思うので, 一旦保留します yukicoder というわけでyukicoderさん…

【yukicoder】yukicoder open 2015 small - 3完

yukicoder open 2015 small に挑戦してきました! yukicoderさん主催のコンテストに初挑戦してきました! 人生二回目のコンテストということで昨日よりは緊張もなく楽しめたかな? 言い訳になりますがちょっと同時並行でやらなきゃいけないことがあったので…

【AtCoder】ABC022 - 競技プログラミング初挑戦!

AtCoder ABC022に挑戦! 人生で初めて競技プログラミングのコンテスト(オンライン)に出場してみました! 使用言語はC++にしようかと思ったのですが、どっちかというとD言語のほうがすきだし、Dlangも十分競技プログラミングに向いているっぽかったのでD言語…