タグ

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

  • mktexlsr は有害だ (mktexlsr Considered Harmful)

    最近の TeX システムには mktexlsr なるコマンドが付属していま す。これは /usr/share/texmf (環境によって異なります) ディレ クトリ以下の全ファイルのリストをテキストファイル /usr/share/texmf/ls-R*1 に記 録するためのコマンドです。 ls-R ファイルの目的は、/usr/share/texmf 以下のファイルの検索 (Kpathsea ライブラリによって行われます) を高速化することにあ ります。筆者はこの高速化の仕組みは有害であると主張します。 なぜなら、この高速化によって得られる利益より、弊害の方が大き いと考えられるからです。極端に言えば「百害あって一利しかない」 ということです。 弊害とはこういうことです。/usr/share/texmf 以下に何かファイ ルを追加したとします。このとき、必ず忘れずに mktexlsr を実行

    nsyee
    nsyee 2014/04/14
  • 普通のやつらの下を行け: Cで動的コード生成・実行 - bkブログ

    普通のやつらの下を行け: Cで動的コード生成・実行 スクリプト言語には動的にコードを生成して実行する機能を持ったものが多くあります。 普通のやつらの下を行けの第3回として、今回は C による動的なコード生成と実行に取り組んでみたいと思います。 今回書いたコードの main() 関数は以下のようなものです。 int main(int argc, char **argv) { assert(argc == 2); define(int, add, (int x, int y), "{ return x + y; }"); define(int, mul, (int x, int y), "{ return x * y; }"); define(int, add_argv1, (int x), "{ return x + %d; }", atoi(argv[1])); printf("%d\n"

  • 普通のやつらの下を行け: assert_caller() - bkブログ

    普通のやつらの下を行け: assert_caller() 以前に、低レベルプログラミングを愛好する知人が「普通のやつらの下を行け」を口癖にしていました。当時は何を言っているのかと聞き流していましたが、自分も最近になってようやく低レベルプログラミングのおもしろさがわかってきました。今回は「普通のやつらの下を行け」企画の第一弾として assert_caller() なるものを作ってみたいと思います。 assert_caller() とは assert_caller() とは、特定の関数からの関数呼び出しだけを通すためのアサーションです。たとえば、次のように foo() の先頭で assert_caller(main) と書いた場合、 foo() は main() からしか呼び出せなくなります。他の関数から foo() を呼び出した場合はエラーメッセージとともに異常終了します。 void foo

  • いやなブログ - RAII と setjmp/longjmp

    RAII と setjmp/longjmp C++ には RAII (Resource Acquisition Is Initialization) というイディオムがあります。これはリソースの開放を確実に行うためのテクニックとして C++ のプログラムで広く用いられています。しかし、RAII も setjmp/longjmp という落とし穴があります。 RAIIの基 次のプログラムはメモリリークを起こします。 #include <string> using namespace std; int main() { string *p = new string; return 0; } このプログラムをビルドして valgrind でテストすると次のようなエラーメッセージが表示されます。4バイトのメモリリークが検出されました。 % g++ test.cc % valgrind ./a.ou

    nsyee
    nsyee 2010/12/02
  • 設定ファイルの整理 - zsh 編 - bkブログ

    設定ファイルの整理 - zsh 編 以前からやろうと思って気になっていた、Unix環境の設定ファイルの整理を行いました。まずは zsh からです。 zshを使い始めたのは2000年頃なので、ほぼ10年使っていることになります。最初のうちはよく設定をいじっていましたが、ここ数年はほぼ放置の状態が続いていました。ひさびさに ~/.zshrc を見ると、だいぶ垢がたまっていました。 export LV='-Ou8' export PAGER='lv' 以前は Shift_JIS, EUC-JP, UTF-8 など、いろいろなエンコーディングのファイルが混在していたので、lv を愛用していました。が、最近のファイルは UTF-8 だけになったので less でよくなりました。 LANG=ja_JP.UTF-8 のように設定しておけば、 less で UTF-8 のファイルを表示できます。というわけ

    nsyee
    nsyee 2009/11/25
  • yak shaving で人生の問題の80%が説明できる問題 - bkブログ

    yak shaving で人生の問題の80%が説明できる問題 つい最近、 yak shaving (ヤクの毛を刈る)、という言葉を知りました (原典)。これは「一見無関係に見えるけど、真の問題を解くのに必要な問題を解くのに必要な(これが何段階も続く)問題を解くのに必要な活動」という意味の言葉です。 yak shaving は、ようするに「ある問題を解こうと思ったら別の問題が出てきて、それを解こうと思ったらさらに別の問題が出てきて…」ということが延々と続く状況を表しています。ちなみに、ヤクとは毛が長い、牛の一種です。 yak shaving は、以前に覚えた bikeshed と同じくらい便利そうな表現です。というもの、プログラムを書いていると yak shaving 的な状況がすぐに発生するためです。 たとえば、「Amazon のほしい物リストを CSV 形式に変換して Excel で読み

  • いやなブログ: SpiderMonkey で JavaScript のインタラクティブシェル

    SpiderMonkey で JavaScript のインタラクティブシェル JavaScript のコードをインタラクティブに動かせるツール (Ruby における irb のようなもの) が欲しいと以前から思っていたのですが、今日になってようやく SpiderMonkey のインタラクティブシェルをインストールしました。 Debian GNU/Linux なら sudo apt-get install spidermonkey-bin を実行するだけでインストールできます。インストール後、 js コマンドを実行するとインタラクティブシェルが立ち上がります。 式を入力すると値が表示されます。 readline ライブラリがリンクされているので、コマンドライン編集は bash と同様にできます。 js> a = [1,2,3] 1,2,3 js> a.push(4) // 末尾に 4 を追加

  • JavaScript でトップページへのリンクを追加する - bkブログ

    JavaScript でトップページへのリンクを追加する 最近のサイトの多くは、ページの左上にあるリンク画像から、どのページからもトップページに戻れるようになっています。一方、私のブログ以外のページではそうなっていなかったので、 JavaScript を使ってトップページへのリンクを追加してみました。 私のブログ以外のページは歴史的事情によりすべてただの HTMLファイルで構成されています。これらをすべて書き換えてトップページへのリンクを追加するのは大変です。perl -i -pe などの方法で一括置換してリンク画像を挿入する方法もありますが、今後のメンテナンスを考えると考えものです。 そこでもっと楽な方法はないかと考えたところ、都合のいいことに、これらのページでは、右側のサイドバー (サイト共通のリンクなどが並んでいる領域) 用に共通の JavaScript ファイルを読み込んでいること

  • 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' 文字の

  • 1