Rubyで国際化ドメインを変換

日本語.jpみたいなUラベルを含むドメイン名をpunycodeでA-Labelのドメイン名に変換する方法。 simpleidnというGemを使う。 インストール $ gem install simpleidn コード例 require 'simpleidn' SimpleIDN.to_ascii("日本語.jp") #=> "xn--wgv71a119e.jp" Si…

objcopyでバイナリにデータを埋め込む

リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術 (COMPUTER TECHNOLOGY)に載っていた方法。 objcopyを使えばファイルのデータをELFのセクションとして埋め込むことができる。 以下のコード(binary.c)ではbindataセクションにデー…

main関数以外から関数を呼び出す

#include <stdio.h> #include <stdlib.h> void ctor() { puts("ctor"); } void dtor() { puts("dtor"); } void (*fp1)(void) __attribute__((section(".ctors"))) = ctor; void (*fp2)(void) __attribute__((section(".dtors"))) = dtor; void __attribute__((constructor)) ini</stdlib.h></stdio.h>…

C言語での整数型間の変換

C言語の整数型には符号付き・符号なし、ビット列の大きさの2要素の組み合わせから種々の型があり、その間の変換規則にはややこしいものがある。 変換規則をまとめる。 以下の結果はC標準で規定されている規則であるかどうかまでは調べていない。 以下の結果…

ELF のセクション名一覧を表示

ELF形式のファイルには先頭にELFヘッダーがある。 ELFヘッダーは以下の構造体になっている。 typedef struct { unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ Elf64_Half e_type; /* Object file type */ Elf64_Half e_machine; /* …

readelf で折り返さず表示

-Wオプションを付ける。 オプションなし $ readelf -aW a.out ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type:…

はじめて読む8086

GW中に「はじめて読む8086」という本を読んだ。 8086というのはインテルが開発、発売していたCPU「Intel 8086」のことで、今まで連綿と続くx86アーキテクチャを採用した最初のCPU。 ただし、8086で採用されたx86は16ビット版のx86。 8086(x86-16)のアセンプ…

再帰なしのマージソート

C言語で。 もう少し変数を減らせないものか。 #include <stdio.h> #include <stdlib.h> #include <string.h> int merge_sort(int n, int *a) { int *tmp_a, *src, *tgt, *tmp; int *sp_ed, *tp, *tp_ed; int *p1, *p1_ed, *p2, *p2_ed; int w; tmp_a = (int*) malloc(n * sizeof(int)); if</string.h></stdlib.h></stdio.h>…

関数呼び出し時のスタック操作

大雑把なメモ。 大事なレジスタがip、sp、bp。(GDBではrip、rsp、rbpになっている。) ip(インストラクションポインタ)は次に実行する命令列のアドレスを格納している。 sp(スタックポインタ)は今のスタックフレームの上のほうを指している。(多分。) bp(フレ…

GDB

GDBの基本的な操作メモ。 サンプル用のプログラム。(sample.c) #include <stdio.h> int sum(int a, int b) { int c; c = a + b; return c; } int main(int argc, char** argv) { int a = 10; int b = 20; int c; c = sum(a, b); printf("%d\n", c); } 準備 デバック用</stdio.h>…

メモリセグメント

メモリセグメントのメモ。 プロセスが扱うメモリ領域はその用途によって複数のセグメントに分けられている。 テキスト(コード)セグメント データセグメント bssセグメント ヒープセグメント スタックセグメント (上のセグメントほど、メモリアドレスが小さい…

GlassFishでMySQLを使う準備

GlassFishでMySQLを使おうと思ったら、コンパイルは通ったが、アクセスしたときに「適切なJDBCドライバーが見つかりません」みたいな感じで怒られた。 JDBCのjarを適切な場所に配置しれやらないといけないようだ。 JDBCのjarを<GlassFishのインストールディレクトリ>/glassfish/domains/<対象ドメ</glassfishのインストールディレクトリ>…

JavaのArrays.asListが固定長な理由

テストを書くときなどは特定の要素が入ったListがほしいことがあります。 普通だと以下のように書きます。 import java.util.ArrayList; import java.util.List; List<String> strs = new ArrayList<String>(); strs.add("hoge"); strs.add("foo"); strs.add("bar"); でもこ</string></string>…

アルジャーノンに花束を / ダニエル・キイス

とってもいい本でした。 知能は元に戻ってしまったけれども逆に人間性を取り戻した主人公に切なさを感じました。 アルジャーノンに花束を〔新版〕(ハヤカワ文庫NV)

htagsをつかってみる

結構大きめのソースコードを読んでると、ブラウザで読みたいなーと思うときがある。 ブラウザだとタブを開きまくれるし、タブの操作も楽だ。 色々調べてみるとhtagsというツールがあることを知った。 htagsを使うとブラウザでソースコードを見ることができる…

Rubyで類似文字列検索

類似文字列検索といえばSimStringが有名だけど、自分の環境でRubyバインディングが上手くビルド出来なかったので、自分で実装することにした。 SimStringのアルゴリズムは「高速な類似文字列検索アルゴリズム」*1で公開されている。 アルゴリズム自体は思っ…

Augmented BNF for Syntax Specification: ABNF (RFC5234)

ABNFはあるモノのシンタックスを形式的に定義するための言語。 URIもABNFをもとに定義されている。(RFC3986) 但し、RFC3986が参照しているABNFはRFC2234によるもの。 英Wikipediaによると、RFC5234はRFC4234をアップデートしたもの。 そして、RFC4234はRFC22…

「RDBMS解剖学」を読んだ

リレーショナルデータベースの仕組みについて書かれた平坦な本。とても読みやすい。 リレーショナルデータベースがクライアントからSQLクエリを受け取って結果を返すまでどういう処理を行っているかが書かれている。 パフォーマンス向上のためのログの利用(W…

設定ファイルを指定してzookeeperを起動

結論からいうと、 $ zkServer.sh start /path/to/zoo.cnf で設定ファイル/path/to/zoo.cnfを指定してzookeeperを起動できる。 zkServer.shの61行目あたりを見ると以下のようになっていて2つ目の引数を変数に設定している。 if [ "x$2" != "x" ] then ZOOCFG=…

プロセスグループ・セッションについて勉強した

fabricというデプロイツールでサーバーを動作させるコマンドが上手く実行出来なくて、原因を調べるために勉強したメモ。(原因はまだよくわかってない) プロセスグループ 名前の通り、プロセスの集合のこと。 あるプロセスからforkした子プロセスはデフォルト…

Prestoをビルドした

Prestoは分散SQLエンジンと呼ばれるソフトウェア。 Facebookが開発元だが、OSSとして公開されている。 ライセンスはApache Licence 2.0。 従来は分散SQLエンジンとしてHadoop上で動くHiveというものがあったが、HiveはSQLクエリーを多段のMapReduceに変換し…

Fluentdをとにかく使ってみる方法

Fluentdは"ログ”を別のサーバーに転送したり、一箇所に集めたり、DBに格納したりといったことが簡単にできるツールです。 Fluentdではログの入力方法と出力方法さえ指定すればデータの転送・バッファリング・エラー処理といったややこしいことは全てFluentd…

KVSを自作するぞい (1) - スタート

勉強のため、C言語でKVSを実装していきます。 ちなみに、筆者はC言語の経験があまりありません。(せいぜい、一つのファイルで完結する数百行のプログラムを書いたことがあるくらい。) 仕様としてはだいたい以下のようなことを考えています。 キー・バリュー…

デザイン変更

デザイン変えました。 前のデザインは文字が大きめだったので、もう少し文字が小さめで画面あたりの情報量が多いほうがいいなと思っておりました。 このデザインはよく見かけるデザインですが、程よい情報量で見やすいのではないかと思います。

"Cassandra - A Decentralized Structured Strage System" を読んだ

Cassandra(Apache Cassandra)はFacebookによって開発された分散データベース。 分散型のデータベースとしては、マスターが存在しない(単一障害点が存在しない)ことが大きな特徴。 データ構造 検索は文字列であるキーで行う。 行(row)は複数のカラム(column)…

HDFS Architecture Guideを読んだ

HDFS(Hadoop Distributed File System)はHadoopのデータストアとして使われる分散ファイルシステムである。 「Google File System」を元に設計されている。 高い耐障害性を持つこと、高いスループットが大きな特徴である。 また、大規模データ処理に使われる…

NTT・NTTデータのHadoop関連スライドまとめ

最近、並列分散システムにはまってる。 といっても自分でHadoopクラスタを組んで、分散処理やってます、とかではなくて、Web上の記事やスライド、論文を読んで粛々と情報収集をしている段階。 HadoopやMapReduceってコトバは知っていたが、詳しい仕組みを知…

Go入門した

最近、Go界隈が熱い気がして(主にDockerのせい?)、一介のプログラマならば一般教養として基本的な文法ぐらいは抑えておいた方がいいだろうと思いGoの勉強を始めた。 色々調べたところ、A Tour of Goが Go入門には良いらしく、僕もそれに従った。 A Tour of …

TCPプログラミングでハマった

TCPを勉強しようと思って、Rubyネットワークプログラミングを参考にしながら色々といじっていたらハマった。 以下のようなサーバープログラム(tcp_server.rb)とクライアントプログラム(client.rb)を書いた。 # tcp_server.rb require "socket" server = TCPS…

RMapperというgemを書いた

大雑把にいうとKVS(Redis)で複数カラムのデータを扱えるようにするgemである。 GitHubで公開中 RMapper 動機 このgemを書いたのは自分の開発で レコードを検索するのに一つのキーしか使わない。 でも複数のカラムを持つ。 スキーマが変更されやすい。 データ…