Emacsのcompilation-modeでANSIカラーが表示できないのを直す

EmacsのCompile Commandでjadeを使ったときに、*compilation*バッファに文字化けみたいなものが表示されてた。

^[[90mrendered ^[[36mindex.html ^[[0m


どうやらANSIカラーのカラーコードだったので、カラー表示できるようにした。

(require 'ansi-color)
(add-hook 'compilation-filter-hook
          '(lambda ()
             (ansi-color-apply-on-region (point-min) (point-max))))

参考ページ
http://stackoverflow.com/questions/3072648/cucumbers-ansi-colors-messing-up-emacs-compilation-buffer

最近読んだ本、あるいは途中まで読んだ本

フリーソフトウェアと自由な社会 ―Richard M. Stallmanエッセイ集

フリーソフトウェアと自由な社会 ―Richard M. Stallmanエッセイ集


これを読んで、晴れてフリーソフトウェア主義者になった。少し前まで、OS Xに心惹かれてたこともあったけど、これからもGnu/Linuxを使っていきたい。そしてフリーソフトウェア運動に貢献したい。


Inside Linux Software オープンソースソフトウェアのからくりとしくみ

Inside Linux Software オープンソースソフトウェアのからくりとしくみ


オープンソースソフトウェア開発の各種ツールについて詳しく書かれている。プログラミングうんぬんの話は少なく、1章のgccの仕組みくらい。後半は斜め読みした。


ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道


C言語Unixのコマンドやプログラムを実装する本。パイプやリダイレクトがまだよくわかってない。


リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)


話題になってそうだったから読んでみた。何度か読み返して実践できるようにしたい。


改訂新版 Cプログラミング診断室

改訂新版 Cプログラミング診断室


上のついでに読んでみた。サンプルがANSI C以前の規格で書かれていて、しかも長かったので、詳しくは読んでない。


プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~


入門OCaml ~プログラミング基礎と実践理解~

入門OCaml ~プログラミング基礎と実践理解~


プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)


OCaml本3冊。
関数型言語を勉強しようと思って少し調べて、言語の候補をML系のHaskell, OCamlLisp系のCommon Lispに絞った。その中でも、副作用や手続き的な記述をある程度は許容するOCamlが入門には向いているのかなと思って、OCamlを勉強してみた。
『プログラミング in OCaml』は、OCamlの言語仕様とサンプルが詳しくてわかりやすい。ファンクターとか多相ヴァリアントとかの章はまだ読んでないけど。
『プログラミングの基礎』は、OCamlの入門書ではなく、プログラミングをどのように行なっていくかをOCamlを題材として書かれている。OCamlの言語仕様は他2冊に比べて少ないが、プログラミング一般の本としてためになった。


フルスクラッチによるグラフィックスプログラミング入門

フルスクラッチによるグラフィックスプログラミング入門


画像処理ライブラリの車輪の再発明をする本。Windows上での動作環境というのが少し残念だった。Ubuntu Gnu/Linux上で、自分でビットマップファイルを読み書きしてなんとか進めてた。


数学ガール ガロア理論 (数学ガールシリーズ 5)

数学ガール ガロア理論 (数学ガールシリーズ 5)


数学ガールシリーズはこれ以前のも読んでたけど、今作が体感的に一番難しかった気がする。途中で読むの放棄してしまった。


ニートの歩き方 ――お金がなくても楽しく暮らすためのインターネット活用法

ニートの歩き方 ――お金がなくても楽しく暮らすためのインターネット活用法


コンピュータを働かせれば人間は働かなくてもいいような未来になると結構真剣に思ってるんだけど、どうなんだろう。

libjpegを使ってjpegファイルを出力する

libjpegというjpegを扱うライブラリを使ってjpegファイルを出力します。

インストール

Ubuntu 11.10 以降なら公式リポジトリにパッケージがあるそうなので、それを使います。

$ sudo apt-get install libjpeg-dev 

使い方

インクルード

インストールすると、/usr/include/jpeglib.h ができているのでそれをインクルードします。ファイルの入出力やエラーの出力のために、stdio.h もインクルードする必要があります。

#include <stdio.h>
#include <jpeglib.h>
jpegオブジェクトの初期設定

jpegファイルの出力にはjpeg_compress_structというjpegオブジェクトを使います。またエラー処理のための構造体jpeg_error_mgrも確保します。

struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;

エラーの処理はデフォルトで構わないので、jpeg_std_error()でデフォルト値を設定します。その後、jpeg_create_compress()でjpegオブジェクトを初期化します。

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
出力ファイルの設定

バイナリ、書き込みモードでfopen()し、jpeg_stdio_dest()で出力先に設定します。

FILE *fp = fopen(filename, "wb");
jpeg_stdio_dest(&cinfo, fp);
画像のパラメータの設定

画像の幅、高さ、色の種類、画質などを設定します。幅はimage_widthプロパティ、高さはimage_heightプロパティで設定します。
色の種類は、RGBカラーならin_color_spaceにJCS_RGBを、input_componentsに3を設定します。グレースケールならin_color_spaceにJCS_GRAYSCALEを、input_componentsに1を設定します。
画質はjpeg_set_quality()で設定します。第2引数には0から100の値を指定し、値が大きいほど画質が良くなります。jpeg_set_quality()を使わないときのデフォルト値は75です。

cinfo.image_width = 256;
cinfo.image_height = 256;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 75, TRUE);
書き込み

jpeg_start_compress()で圧縮を開始します。ピクセルごとの色を設定していき、jpeg_write_scanlines()でファイルに書き込みます。
色の設定は、JSAMPLE型を使って行います。RGBカラーならJSAMPLE型3つで1ピクセルを表します。JSAMPROW型はJSAMPLEの配列で、横1列分(1行)を表します。JSAMPARRAY型はJSAMPROWの配列で、画像全体を表します。

jpeg_start_compress(&cinfo, TRUE);

JSAMPARRAY img = (JSAMPARRAY) malloc(sizeof(JSAMPROW) * height);
for (int i = 0; i < height; i++) {
    img[i] = (JSAMPROW) malloc(sizeof(JSAMPLE) * 3 * width);
    for (int j = 0; j < width; j++) {
        img[i][j*3 + 0] = i;
        img[i][j*3 + 1] = j;
        img[i][j*3 + 2] = 127;
    }
}

jpeg_write_scanlines(&cinfo, img, height);
終了

jpeg_finish_compress()で圧縮を終了し、jpeg_destroy_compress()で圧縮に使ったjpegオブジェクトを破棄します。

jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
コンパイル

コンパイル時にライブラリとリンクさせる必要があるため、コンパイルオプションに -ljpeg を付け加えます。

$ gcc test_libjpeg_compress.c -std=c99 -ljpeg

こんな画像が出力されました。

Ubuntu12.04で/dev/dspを使えるようにする

Ubuntu12.04で/dev/dspを使えるようにします。/dev/dspはUbuntu10.10以降のカーネルでデフォルトだと無効になっているので、カーネルをビルドし直します。

手順

ビルドに必要なものをインストール

$ sudo apt-get install build-essential
$ sudo apt-get install kernel-package
$ sudo apt-get install libncurses5-dev


linuxのソースをダウンロード

$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-3.2.0 - Linux kernel source for version 3.2.0 with Ubuntu patches
$ sudo apt-get install linux-source-3.2.0

/usr/src/linux-source-3.2.0.tar.bz2 にダウンロードされます。


ソースコードを展開する

$ sudo su - 
# cd /usr/src/
# tar xf linux-source-3.2.0.tar.bz2
# ls
linux-headers-3.2.0-23  linux-headers-3.2.0-23-generic  linux-headers-3.2.0-24
linux-headers-3.2.0-24-generic  linux-source-3.2.0  linux-source-3.2.0.tar.bz2
# cd linux-source-3.2.0/


現在のビルドの設定を反映させる

# cp /boot/config-3.2.0-24-generic .config
# make oldconfig


/dev/dspを使えるように設定を変更する

# make menuconfig

configのメニューが開くので、「Device Drivers」->「Sound card support」->「Advanced Linux Sound Architecture」と進み、
・OSS PCM (digital audio) API - Include plugin system
・OSS Sequencer API
にチェックを入れます。


Makefileを編集してカーネルのバージョンに名前をつける

# vim Makefile
// 4行目を変更
EXTRAVERSION = -24-generic.devdsp

カーネルのバージョンは3.2.xx{EXTRAVERSION}になります。僕の環境だと3.2.16-24-generic.devdspになりました。


カーネルをビルドする

# CONCURRENCY_LEVEL=2 make-kpkg --revision=1 --initrd kernel-image

CONCURRENCY_LEVELは並列でビルドするときのコア数です。ビルドが完了すると/usr/srcにパッケージファイルが作成されます。


カーネルのインストール

# cd ../
# ls
linux-headers-3.2.0-23          linux-headers-3.2.0-24          linux-image-3.2.16-24-generic.devdsp_1_amd64.deb
linux-source-3.2.0.tar.bz2      linux-headers-3.2.0-23-generic  linux-headers-3.2.0-24-generic  linux-source-3.2.0
# dpkg -i linux-image-3.2.16-24-generic.devdsp_1_amd64.deb

インストール後に再起動します。


これで/dev/dspはデバイスとして有効になっているはずですが、デバイスドライバがないためか、使おうとするとbusy状態で使えませんとエラーが出ます。
デバイスドライバのインストール

$ sudo apt-get install alsa-oss


試しに使ってみる

$ echo 1 > /dev/dsp

ChromeでGoogleの検索結果から+1(プラスワン)ボタンを消す

Googleにログインした状態で検索すると、検索結果の横に+1(プラスワン)ボタンが表示されますが、ほとんど使ってない機能だし、誤って押してしまうのも恥ずかしいので、押さないように消してしまいます。

やり方



  1. Chrome ExtensionsのStylishをインストール
    Chrome Web Store - Stylish

  2. Stylishのオプションを開き、左下にある[Write new style]をクリック

  3. [Code]のテキストボックスに以下を入力

    button.gbil.esw.eswd {
    display: none !important;
    }

  4. [Applies to]の一番右にある[Specify]をクリック

  5. セレクトボックスから[URLs matching the regexp]を選択し、横のボックスに以下を入力

    https?://www\.google\.(co\.jp|com)/.*

  6. [Name]にわかりやすい名前を入力し、[Enabled]にチェックを入れる


  7. 左下の[save]をクリック

VMwarePlayer上のゲストOSからFTPS接続ができない

VMware上のUbuntuから外部のwebサーバーにFTPSで接続しようとしても接続できなかったのですが、対処法が見つかりました。

環境

ホストOS Windows 7 64bit
仮想環境 VMware Player 4.0.2
ゲストOS Ubuntu 11.10
FTPクライアント FileZilla 3.5.0
外部webサーバー heteml

エラー症状

FileZillaを使って外部のwebサーバーに、明示的なFTPS(explicit FTP over TLS)で接続したときにエラーが生じる。

エラー内容は以下のようなもの。

状態:	ssl***.heteml.jp のアドレスを解決しています
状態:	***.***.***.***:21 に接続しています...
状態:	接続が確立されました, ウェルカム メッセージを待っています...
応答:	220 ***.***.***.*** FTP server ready
コマンド:	AUTH TLS
応答:	234 AUTH TLS successful
状態:	TLS を初期化しています...
エラー:	接続タイムアウト
エラー:	サーバーに接続することができませんでした


ホストOS上から外部のwebサーバーへのFTPS接続はエラーになっていません。

対処法

VMwareの「仮想マシンの設定」を開き、「ハードウェア」タブの「ネットワークアダプタ」をデフォルトの「NAT」から「ブリッジ」に変更する。