CMS (contestms) のユニットテストと機能テスト

CMS (contestms) は国際情報オリンピックと各国の情報オリンピックを中心に利用されているオープンソースのオンラインジャッジシステムである。 CMSのバックエンドに手を入れる場合には、ユニットテストと機能テストを手元で実行できるようにしたほうがよい…

gitでbareとnon-bareを切り替える

git

用語集 non-bare repository: 皆様のお手元にある普通のリポジトリがそれです。 bare repository: 普通はgitサーバーにある。手元でも取り扱い可能。ただしworking directoryがないので、work treeを必要とする様々な操作ができない。 bare repositoryは hog…

過去のコミットでgit LFSを使うように歴史改変をする

git

「Subversionからgitに移行したはいいが、履歴があまりにでかいのでPDFを別管理にしたい」という状況を考える。でかいデータやバイナリを別管理にするといえばgit LFS, 昔の履歴に遡って変更を加えるにはgit filter-branchであるが、これらを組み合わせる方…

gitの履歴から大きなファイルを探すスクリプトを書き直した

git

巷では、gitの履歴から大きなファイルを探す方法を紹介する記事がいくつかあるが、ここに書かれているスクリプトは遅いし、bareリポジトリやsubmoduleやpackのないリポジトリでは動作しないし、looseオブジェクトからは探してくれないので、書き直してみた。…

combine: マクロのいらないRustのパーサーコンビネーター

はじめに Rustには有名なnomというパーサーコンビネーターライブラリがあるが、せっかく高級な型システムと最適化があるのにマクロで何とかしようとするのは勿体無いと思うので、マクロに深く依存しないcombineを使ってみた。 combineの主な特徴 parsec リス…

OCamlのformat (型安全なprintf/scanf) の仕組み

OCamlのPervasives (デフォルトでopenされるモジュール) には、Printf/Format/Scanfで使うための format という型がある。OCamlの特殊機能として、型推論時に文字列リテラルにstringではなくformatという型がつくことがある。 $ ocaml OCaml version 4.04.0+…

C言語で部分適用したい!(実は、できるアーキテクチャがあるんです)

通常、C言語の関数ポインタは、クロージャではない。したがって、関数を部分適用したり、カリー化したり、ローカル変数をキャプチャーした関数ポインタを返したりすることはできない。しかし、実際にC言語が動作する環境のなかには、そのようなことが実現で…

巻き舌できるようになった(たぶん)

これまで巻き舌ができなかったが、今日ふと試したらできるようになった。巻き舌といっても、舌を変な形にするほうではなく、Rの音を出すほう。あんまり参考にならないかもしれないけど、一応どんな風にやったか書いておく 舌を意図的に動かす ロシア語やイタ…

ランサムウェアを作ってみた(シェルスクリプトで)

ランサムウェアの暗号化部分についての実証コードを書いてみた。暗号の計算にはOpenSSLのコマンドが使えるので、シェルスクリプトを使って書いた。github.com 注意 このコードを試して起こった損害について作者は責任を追わない。基本的にdocuments/以下にあ…

とある偽シャッフルアルゴリズムとその分布

次のようなシャッフルアルゴリズムを考える(簡単のためrand()%Nと表記したが、この部分で0以上N-1未満の一様な整数乱数が生成されると仮定して議論する)。出力されるものは 0, ..., 255 を並び換えたもの(置換)である。 std::vector<int> a(N); for(int i = 0; i </int>…

C/C++の静的解析ツール・事例まとめ

C/C++の静的解析は、どう考えても大変なんだけどどう考えても需要が高いので、やはり色々なソフトウェアや事例があるようだ。まとまった情報が欲しいけど見つからなかったので自分の調べた範囲でまとめることにした。他にも耳寄りな情報があったら教えてほし…

latexmk設定メモ

LaTeX文書のコンパイルをよしなにやってくれるlatexmkについて。全体設定である ~/.latexmkrcには以下のように記入してある。 #!/usr/bin/env perl $pdf_mode = 3; $latex = 'uplatex -kanji=utf8 -synctex=1 -file-line-error -halt-on-error -interaction=…

volatileとatomicの違い

volatileとatomicの違いを調べるために、以下のC++プログラムをコンパイルしてみる。 #include <atomic> void func1(int *p) { ++*p; ++*p; } void func2(volatile int *p) { ++*p; ++*p; } void func3(std::atomic_int *p) { ++*p; ++*p; } $ g++ -std=c++11 -pthre</atomic>…

文脈自由文法(CFG)と解析表現文法(PEG)をHaskellのモナドで説明する話

文脈自由文法(Context Free Grammar) と 解析表現文法(Parsing Expression Grammar) は記法が似ているものの、その性質は大きく異なっている。しかし、以下のようにHaskellのモナドを用いて、左再帰的でない文脈自由文法をそのままパーサーコンビネーターと…

GCC拡張の無効化 (と、それにまつわる細かい話)

端的に言えば-pedantic-errorsを使えばよい。(できれば-std=...も併用したほうがいいだろう)以下解説GCCのC/C++コンパイラは、独自の拡張機能を導入している。これを無効化するオプションには2種類あり、意味が異なる。 C標準と矛盾する拡張機能を無効化する…

64bit windows上でのalloy* (hola)

Alloy (hola) のバックエンドはSATソルバであり、いくつかのバックエンドから選べる。しかし、64bit windows上の64bit JREでは、SAT4J以外は動作しない。以下の手順で自分でjarを作成すれば、minisat等が動くバイナリが作れる。 kodkodのネイティブライブラ…

C++11 random 覚え書き

C++11以降では<random>ヘッダで良質な擬似乱数を得ることができる。 #include <random> 外部からの乱数 外部から乱数を得るにはrandom_deviceを使う。 #include <random> #include <iostream> int main() { std::random_device rand_dev; std::cout << rand_dev() << std::endl; std::cout << r</iostream></random></random></random>…

いわゆる「中卒」は数学/情報オリンピックには参加できるのか否か

「高校生に相当する年齢だが、高校等の教育機関に在学していない」場合、数学オリンピックや情報オリンピックには参加できるのか、という問題がある。該当する組織に直接訊ねるのが最も正確だと思われるが、2015/06/26時点の資料を読む限り、おそらく以下の…

C言語(標準)にM_PIは無い

C言語で円周率πを使うには M_PI を使う、と経験で知っている人は多いが、あれは実はC言語の規格には含まれていない。むしろ、処理系がM_PIを定義してはいけない事情(c - Using M_PI with C89 standard - Stack Overflow)がある。 ここでは、C言語の最新規格…

GW-450DやWN-AC433UKをRaspberry Piで使う

planexのありがたい記事を参考に作業。環境としてはRaspbian wheezyを仮定。おおまかな流れ : まず、下準備としてカーネルモジュールのビルドに必要な道具を揃える(既に揃えてある人はスルーしてよい)。続いて、ドライバのソースコードを取得し、必要な変更…

Coqの新機能、Primitive Projectionについて

Coqリポジトリのtrunkを見ると、次の2つの機能が入っていることがわかります。 Universe Polymorphism Primitive Projection Universe Polymorphismは、グローバル定義をUniverseのレベルについて量化した形で定義することができる機能で、型に飾り付けをし…

よく使う Coq.Logic の公理

Coq.Logic にはCoqの集合論モデルにおいて正しい公理や、それらの間の関係が記述されている。ここではその一部を取り上げて、意味を説明する。 前提知識 公理を仮定しない状態では、 Coqの論理は直観主義論理である。 ある2つが「等しい」という命題が証明で…

WindowsでCoqIDEの見た目をWindows風にする方法

%COQ%\share\themes\MS-Windows\gtk-2.0\gtkrc を %COQ%\etc\gtk-2.0 の下にコピーする。ただし、%COQ%はCoqのインストールディレクトリのことを指すとする。たとえば %COQ% = C:\Program Files (x86)\Coq

C++で多倍長整数ライブラリGMPを使う

目的 GCJなど一部のプログラミングコンテストでは既存のライブラリを使用することが認められている。特にC++であれば多倍長整数ライブラリとしてGMPを使うのが妥当であると考えられる。GMPを直接叩くのもよいが、GMPのC++バインディングを使うのが簡単である…

PowerPC64アセンブリ開発環境の整備

目的 PowerPC64アセンブリの演習のための環境を手元で構築する. 最新情報へのリンク 2015/01/11 以下のように事情が変化している。 PowerPC64 アセンブリ開発環境の設定メモに、以下の手順を現在行った場合に起きる問題への対処法がある。 crosstool-ngのバ…

ipc_botの紹介

この記事はTheorem Prover Advent Calendarの22日めの担当記事です.今年の僕の持ちネタの一つですが,ipc_bot というTwitter botを作りました.https://twitter.com/ipc_botこのbotは直観主義命題論理の命題を投げると解いてくれるbotです. 仕組み 証明を…

情報オリンピック予選 2014

情報オリンピックの予選に参加しました.(予選は誰でも参加できます)次のような制約で解くことにしていました. 1番は Wolf RPGエディター 2番は TeX 3番は Scratch 4番は Excel 5番は APL 6番は Bash 結局1と4を解きました. 1番 Wolf RPGエディターで解き…

夏季セミナー参加記&反省会

来年やる人が同じ失敗をしないために色々書いておきます途中で「です・ます」調でなくなっているのは息切れです。めんどくさいので直していません 参加記 端的にまとめます 場所:今年は埼玉の準山奥でやりました。2009年に僕が生徒として参加したときと同じ…

情報オリンピック夏季セミナーの参加記一覧とか

2013/08/26 - 08/30の間、夏季セミナーというのにチューターとして参加していました。以下はその記録として参照できる各種媒体へのリンクです。参考:去年のリンク集 募集案内 実施の概要 参加者のtwitterリスト 発表会の様子(Togetter) その1(AI) その2(グ…

ICFPC参加記

チーム名 qnighy メンバー qnighy (計1名) 記録 08/06 ICFPCの登録期限が目前に迫っていたのでEasyChairに登録する。 08/07 EasyChairに登録するだけではだめで、ICFPCという名前のカンファレンスに論文を登録したことにしないといけないことを知り、論文の…