タグ

ブックマーク / 0xcc.net (22)

  • Cのプログラムの中でブレークポイントを設定する - bkブログ

    Cのプログラムの中でブレークポイントを設定する Cのプログラムをデバッグする際には GDB などのデバッガが役立ちます。通常、ブレークポイントはデバッガの中から設定しますが、デバッグ対象のCのプログラムの中で設定することもできます。 Linux なら #include <signal.h> して、任意の箇所に raise(SIGTRAP); を挿入すれば OK です。 raise() 関数を用いて SIGTRAP シグナルを発生させています。 あるいは x86 限定なら __asm__("int3"); でも OK です。ここでは SIGTRAP を発生させるために int3 (0xcc) 命令を埋め込んでいます。GDB もソフトウェア的にブレークポイントを設定するときは当該箇所に int3 を書き込んでいるので、やっていることは割と似ています (GDBの場合は int3 を書き込む部分の

    tyru
    tyru 2018/07/01
  • UNIXにみる世代間の断絶

    (まだまだ調査中) UNIXにみる世代間の断絶をまとめようという試 みです。どちらが良い悪いという比較をするつもりはありません。 両者の良い点を学んでいこう (新旧自在の hybrid type を目指そ う) 、というのがこの文書の目的です。

  • JavaScript でソートアルゴリズムを可視化 - bkブログ

    JavaScript でソートアルゴリズムを可視化 JavaScript でソートアルゴリズムを可視化するプログラムを書いてみました。元ネタは Jon Bentley による ソートアルゴリズムを可視化する Java アプレットです。 アルゴリズム 要素数 動作確認は Firefox 2, IE 7, Opera 9 で行いました。要素数は最大で200まで選べますが、かなり重くなるので遅いマシンで実行すると危険です。 English version is also available. ソースコード: sort-animation.js 解説 X軸が配列の添え字、Y軸が配列の要素の値を示しています。最初に要素がランダムに並んでいる配列 (値に重複なし) を作って、それを各種のソートアルゴリズムでソートする様子をアニメーションで表示します。 ただし、要素のあらゆる変更に対して毎回表示を更新し

  • C++ のシンボルをデマングルする - bkブログ

    C++ のシンボルをデマングルする C++ コンパイラはシンボルが一意の名前を持つように名前マングル (name mangling) と呼ばれる処理を行います。記事では GNU の開発環境で C++ のシンボルをデマングル (demangle) する方法を紹介します。 マングルの方法はコンパイラ依存です。同じコンパイラでもバージョンによってマングルの方法が異なることがあります。たとえば GCC 3.x では int foo(int) を _Z3fooi に、 int foo(const char*) を _Z3fooPKc のようにマングルしますが、 GCC 2.95 ではそれぞれ foo__FPCc, foo__Fi となります。 コマンドラインからデマングル C++ のオブジェクトファイルに nm をかけると、デフォルトではマングルされた読みづらい形式でシンボルが出力されます。 %

    tyru
    tyru 2009/11/14
  • いやなブログ: STL のバインダとリファレンスへのリファレンス問題

    STL のバインダとリファレンスへのリファレンス問題 STL に含まれる bind1st と bind2nd は for_each や find などの関数と組み合わせて使うと便利です。しかしながら、リファレンス (参照) を引数に取る関数の引数をバインドすることはできないので注意が必要です。 注意が必要ですと言いつつ、自分がこの問題を知らずにはまりました。次のようなコードで問題は起きます。 #include <algorithm> #include <functional> #include <iostream> #include <string> #include <vector> using namespace std; void print(const string& s1, const string& s2) { cout << s1 << ": " << s2 << endl;

    tyru
    tyru 2009/07/09
    STLのbind1stとbind2ndは参照を引数に取る関数の引数をバインドすることはできない
  • いやなブログ: C のテンプレートでダックタイピング

    C++ のテンプレートでダックタイピング RubyPython などの動的な言語では、ダックタイピング (duck typing) というテクニックが多用されています。 ダックタイピングは、同じインタフェースさえ備えていれば型は何でも構わない、という考え方に基づく多態 (polymorphism) の手法です。アヒルのように見えて、アヒルのように鳴くなら、アヒルに違いない、というわけです。 そして、現在最も注目を浴びている言語である C++ でもテンプレートを用いるとダックタイピングを行えます。 ダックタイピングを使うと、継承関係を無視して多態的にオブジェクトのメソッドを呼び出せます。たとえば、次の Ruby のコードでは、func に Duck と Foo のどちらのオブジェクトを渡しても正常に動作します。これは Duck, Foo ともに、共通のインタフェースを持つ quack

    tyru
    tyru 2009/06/10
  • pdumpfs: a daily backup system similar to Plan9's dumpfs

    What's pdumpfs? pdumpfs is a simple daily backup system similar to Plan9's dumpfs which preserves every daily snapshot. pdumpfs is written in Ruby. You can access the past snapshots at any time for retrieving a certain day's file. Let's backup your home directory with pdumpfs! pdumpfs constructs the snapshot YYYY/MM/DD in the destination directory. All source files are copied to the snapshot direc

  • 横着プログラミング 第1回: Unixのメモ技術

    最終更新日: 2002-03-18 (公開日: 2002-03-18) Unix Magazine 誌に 2002年1月号から 2003年2月号にかけて連載し ていた記事の元の原稿です。 横着プログラミングとは 私は必要が発明の母だとは思わない。私の意見では、発明とは怠惰 から、おそらくはまた、まさに無精から生じるものである。面倒を 省くために。 -- アガサ・クリスティ この言葉によると、どうも発明とは横着したいがために生まれるも のらしい。そう考えてみると確かに、私がプログラミングをする動 機は、横着するためのソフトウェアを作るため、という要素が大き い。突然、「うげー、面倒くせー」と叫んでプログラムを書き始め るのである。 そんなわけで、横着するためにプログラミングすることを私は勝手 に「横着プログラミング」と呼んでいる。連載では横着プログラ ミングをテーマに、横着のコツや私が作っ

  • ライブラリの外に公開するシンボルを制限する - bkブログ

    ライブラリの外に公開するシンボルを制限する C言語にはファイル内 (コンパイル単位) からしかアクセスできない static 関数と、別のファイルからもアクセスできる非static 関数があります。しかし、ライブラリを作成する上では、この2つのスコープだけでは不十分なときがあります。 記事では GNUの開発環境において、ライブラリの外に公開するシンボルを制限する方法を紹介します。 次のような例を考えてみます。 % cat a.c // foo() は libfoo の主役の関数なので公開したい void foo() { bar(); } % cat b.c // bar() はライブラリの中だけで使われるべきなので当は公開 // したくない。しかし別のファイルに含まれる foo() から使われ // ているので、非staticにせざるをえない void bar() { } このようなコ

  • 浮動小数点演算ではまった話 - bkブログ

    浮動小数点演算ではまった話 浮動小数点演算のありがちな問題ではまりました。 いろいろ調べているうちに x86 特有のちょっとおもしろい 現象に遭遇したので紹介したいと思います。 パーセンテージの計算 簡単な C のプログラムでパーセンテージを計算しようと思い、 次のようなコードを書きました。 int x, y; ... int a = (double)x / y * 100; int a = x * 100 / y としないのは、 x が大きい場合に x * 100 が オーバーフローを起こす (INT_MAX を越える) ためです。 このコードは一見、期待通りに動いていたのですが、 しばらく使っていると、手元の環境では x = 53, y = 100 のときに a は 53 ではなく 52 になることに気づきました。 これは次の理由によります。 式の最初の (double)53 / 10

  • STL の string のリファレンスカウント - bkブログ

    STL の string のリファレンスカウント Effective STLによると、多くの STL の実装では string クラスの内部において、文字列のコピーを減らすために、リファレンスカウントが行われているそうです。そこで、手元の環境の string クラスでリファレンスカウントが実際に行われているか調べてみました。 結論としては、Debian GNU/Linux sarge + GCC 3.3.5 の環境では、リファレンスカウントが行われていました。次のコードをコンパイルして実行すると 2つの string オブジェクトの data() は同じアドレスを指している (つまり、メモリ上の同じ文字列を共有している) ことがわかります。 #include <stdio.h> #include <string> using namespace std; int main() { stri

    tyru
    tyru 2009/04/09
  • GNU diff の地味だけど便利な機能 - bkブログ

    GNU diff の地味だけど便利な機能 最近になって GNU diff の地味だけど便利な機能を2つ知りました。調べてみると、いずれも昔からある機能でした。 --side-by-side は2段組で結果を表示するオプションです。変更されていない行を含めて2つのファイルの内容全体と変更点が表示されるのがポイントです。変更された行の前後数行だけでなくファイル全体をまとめて読みたいときに使えます。デフォルトの表示の横幅は130文字です。必要に応じて --width オプションで変更できます。 こういった用途には meld などの GUI の diff ツールを使えばいいのですが、 ssh 端末しかないような状況で重宝します。 --strip-trailing-cr は行末の CR を無視する機能です。改行コードが CRLF と LF でい違っているけど、中身はほぼ同じ、というファイルを比較す

  • C++ の string と vector の reserve() の挙動 - bkブログ

    C++ の string と vector の reserve() の挙動 C++ の string と vector には前もって容量を確保するための reserve() というメンバ関数があります。何気なく使っていた関数ですが最近になって興味深い挙動に気づきました。 reserve() の基 string と vector の reserve() は前もって容量 (capacity) を確保しておくためのメンバ関数です。前もって容量を確保 (reserve) しておけば、データの追加時に発生する再割り当て (reallocation) を防ぐことができ、効率的です。 たとえば、何もしないで文字列に 1,000文字追加した場合、(内部的に倍々で容量を増やしていくため)10回程度の再割り当てが発生しますが、 s.reserve(1000) のように容量を確保しておけば 1回の割り当て (

    tyru
    tyru 2009/02/13
  • Text Escaping and Unescaping in JavaScript(Unicode の文字列をエスケープする JavaScript)

    Notes No data is sent to the server (i.e. everything is done in JavaScript). Conversion from Unicode to other encodings such as Shift_JIS can be slow first time as it needs to initialize internal conversion tables. Surrogate pairs in UTF-16 are supported. Try inserting \uD840\uDC0B in the second form. Three-byte characters in EUC-JP are not supported. Links JavaScript Unicode Charts Try GNU Libidn

  • UNIXの落とし穴

    UNIXを使っていて気づいた細かい不満を挙げます。他の人の意見も 混ざっています。もっと UNIX が嫌いになりたい人は Unix Hater's Handbook をどうぞ。UNIXをなんとかしたい人は Let's Make Unix Not Suck をどうぞ。 目次 設定ファイル地獄 変な文法 流儀の違い 貧乏くささ プログラミング 初心者の敵 X Window System その他 設定ファイル地獄 山のような設定ファイル ソフトウェアごとに異なる流儀を覚えるのむちゃくちゃ面倒。 まさに、しょうもない 雑多なノウハウ の山。 procmail の設定ファイル 変態的。 :0 ってなんだ? BIND の設定ファイル ドメイン名を書くレコードの最後に . をつけ忘れる。 シェルごとの .*rc .*profile .*login などの挙動の違い わけわからん。 /etc/sh

  • バッドノウハウと「奥が深い症候群」

    計算機を使っていると、何でこんなことを覚えないといけないのだ ろうか、とストレスを感じつつも、それを覚えないとソフトウェア を使いこなすことができないためにしぶしぶ覚えなければならない、 といった類いのノウハウは多い。そうした雑多なノウハウのことを、 来は知りたくもないノウハウという意味で、私はバッドノウハウ と呼んでいる。 バッドノウハウは、ソフトウェアの複雑怪奇な仕様が歴史的に引き ずられ、根的な改善は行われないまま、そのノウハウが文書によっ て受け継がれることによって蓄積が進行する。Unix 上で広く使わ れているツールとしてはTeX, Emacs, sendmail, bind, perl, gnuplot, procmail などは、役に立つツールであると同時に、その 複雑怪奇な仕様によって長年に渡ってユーザを苦しめ続け、バッド ノウハウの温床として悪名が名高い。こうしたツー

  • wxWidgets でクロスプラットフォーム GUIアプリを作ろう

    最終更新日: 2004-10-08 (公開日: 2004-10-08) UNIX USER誌 2004年8月号 に掲載された記事の元の原稿です。 文中の「原稿執筆時点」は「2004年 6月半ば」を指します。 wxWidgets は Linux, Windows, Mac OS X など多くのプラットフォー ムに対応したオープンソースの GUI ツールキットである。稿で は wxWidgets を用いてクロスプラットフォーム対応の GUI アプリ ケーションを開発する方法を紹介する。 はじめに Unix の大きな魅力のひとつに、強力なコマンドライン処理がある。 zsh などのシェルと perl などのワンライナーを組み合せて、大量 のファイルを一気に処理するときなどは、「これぞコマンドライン の醍醐味」と感じる瞬間である。 一方、Unix の大きな不満のひとつに、凶悪なコマンドライン書法

    tyru
    tyru 2008/12/14
    ブクマしてなかった
  • Python の unicodedata モジュール - bkブログ

    Python の unicodedata モジュール Unicode のちょっとしたテキスト処理をしようと思い、 Python の unicodedata モジュールを使ってみました。これは非常に便利です。 unicodedata は Python に標準で付属するため、別途のインストールは不要です。次のようなことができます。 文字の名前を取得する 文字の名前を取得することができます。Unicode の文字にはすべて一意の名前がつけられています。ソースコード内で Unicode のコードポイントを使うときは U+20AC (EURO SIGN) などとコメントをつけておくと便利でしょう。 >>> unicodedata.name(u'A') 'LATIN CAPITAL LETTER A' >>> unicodedata.name(u'あ') 'HIRAGANA LETTER A' 文字の

  • いやなブログ - 文字列操作の比較表: Ruby, Python, JavaScript, P...

    文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++ Ruby, Python, JavaScript, Perl, C++ の文字列操作の比較表を作りました。配列操作の比較表の続編です。間違いなどがあったらご指摘いただけると助かります。 Ruby (String) Python (str) JavaScript (String) Perl C++ (std::string)

  • 自転車置場の議論 - bkブログ

    自転車置場の議論 人が集まると、なぜかどうでもいいようなことほど議論が紛糾してしまう傾向がありますが、このような現象のことを、FreeBSD のコミュニティでは自転車置場の議論 (bikeshed discussion) と呼んでいることを知りました。 この、「瑣末なことほど議論が紛糾する現象」はパーキンソンの法則というの「議題の一項目の審議に要する時間は、その項目についての支出の額に反比例する」という法則として知られています。 このの中で著者は、原子炉の建設のような莫大な予算のかかる議題については誰も理解できないためにあっさり承認が通る一方で、市庁舎の自転車置場の屋根の費用や、果ては福祉委員会の会合の茶菓となると、誰もが口をはさみ始めて議論が延々と紛糾するというストーリーを紹介しています。 このように、「瑣末なことほど議論が紛糾する現象」はパーキンソン氏によって見事に説明されているの