June 3, 2014

"Linux Kernel HACKS"

Linux カーネル HACKS』[amazon.co.jp] メモ

June 2, 2014

DraftSight for Fedora installation on CentOS

DraftSight for Fedora (Beta V1R5.1) を CentOS 6.5 x86_64 にインストール。
rpm インストール時に必要と言われる cups-libs.i686、起動時に必要と言われる mesa-libGLU.i686 nas.i686 glib2.i686 をインストールすると起動できたはずが、Segmentation fault。
Draftsight - CAD - installing in 64bits (Page 1) / Applications & Desktop Environments / Arch Linux Forums [archlinux.org] によると、NVIDIA のドライバをインストールするときに NVIDIA's 32-bit compatibility libraries を入れなかったのが問題かもしれない。NVIDIA のドライバインストーラで 32-bit ライブラリをインストールしたら、起動できた。
# yum install cups-libs.i686
# rpm -ivh draftSight.rpm
# yum install mesa-libGLU.i686 nas.i686 glib2.i686
# ./NVIDIA-Linux-x86_64-331.67.run
$ startx
$ /opt/dassault-systemes/DraftSight/Linux/DraftSight &

May 14, 2014

EAGLE PCB 6.5.0 for Linux

EAGLE PCB 6.5.0 を CentOS 6.5 (x86_64) にインストールしようとしたところ、libssl.so.1.0.0 や libcrypto.so.1.0.0 がないと怒られる。OpenSSL のアップデートで libssl.so.1.0.1e になっていたのが問題。アップデートでは古いバージョン名のシンボリックリンクは作ってくれない模様。
Download - Get the latest Version of EAGLE PCB Design Software [cadsoftusa.com] によると 32-bit runtime environment with the libraries libssl.so.1.0.0 and libcrypto.so.1.0.0. とあるので、32-bit 版の openssl をインストールして、lib*.so.1.0.0 というシンボリックリンクを作って解決。
$ ./eagle-lin-6.5.0.run 
/tmp/eagle-setup.3131/eagle-6.5.0/bin/eagle: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory
# yum install openssl.i686
# cd /usr/lib
# ln -s libssl.so.1.0.1e libssl.so.1.0.0
# ln -s libcrypto.so.1.0.1e libcrypto.so.1.0.0

April 22, 2014

eagleUp-4.4 on OS X Mavericks

Eagle から SketchUp に変換する eagleUp [wordpress.com] をセットアップ。基本的に Installation [wordpress.com] と Tutorial [wordpress.com] に従えば動いた。

環境
  • OS X 10.9.2
  • SketchUp Make 14.0.4899
  • Cadsoft Eagle 6.5.0
  • Trimble SketchUp 2014 14.0.4899
  • ImageMagick 6.8.8-9
    ($ brew install imagemagick でインストール)

eagleUp のインストール
eagleUp4.4.zip をダウンロード、中のファイルやディレクトリをインストール。
  • Eagle ULP/eagleUp_export.ulp -> /Applications/EAGLE-6.5.0/ulp/
  • models -> /Applications/EAGLE-6.5.0/
modified importer for Sketchup 2014 をダウンロード、インストール。
  • eagleUp_import_sketchup2014.rb -> /Users/[user]/Library/Application\ Support/SketchUp\ 2014/SketchUp/Plugins/

Eagle で .eup をエクスポート
  • File -> Open "demo files/demo3d.brd"
  • File -> Run ULP "/Applications/EAGLE-6.5.0/ulp/eagleUp_export.ulp"
  • 初回実行時は初期設定。
  • 初期設定後、エクスポート。
  • 生成された demo3d.eup のモデルディレクトリのパスに誤りがあったので訂正。
    $ vi demo\ files/eagleUp/demo3d.eup
    $ diff -u demo\ files/eagleUp/demo3d.eup.orig demo\ files/eagleUp/demo3d.eup
    --- demo files/eagleUp/demo3d.eup.orig 2014-04-22 06:30:25.000000000 +0900
    +++ demo files/eagleUp/demo3d.eup 2014-04-22 06:30:36.000000000 +0900
    @@ -1,5 +1,5 @@
    version;4;4;http://eagleup.wordpress.com/;
    -settings;/Applications/EAGLE/models/;/usr/local/bin/convert;/usr/local/bin/composite;rm;
    +settings;/Applications/EAGLE-6.5.0/models/;/usr/local/bin/convert;/usr/local/bin/composite;rm;
    color;0x98041C;0xE2012D;silver;ivory;
    images;/Users/a2ya/Downloads/eagleUp4.4/demo files/eagleUp/;eagleUp_demo3d;png;600;png;
    outline-arc;38.100000;19.050000;5.080000;0.000000;90.000000;1.600000;
    

SketchUp でインポート
  • Preference -> Extension -> Extentions で Ruby Script Examples が有効になっていることを確認。
  • Plugins -> Scale -> set units -> Units で Length unit が Decimal と Meters になっていることを確認。
  • Plugins -> Import eagle Up v4.4 で demo files/eagleUp/eagleUp/demo3d.eup をインポート。

March 6, 2014

bootargs in .dts for Altera JTAG UART

Nios II Linux、Altera JTAG UART を使っている場合、sopc2dts で .sopcinfo から .dts を自動生成すると、bootargs に debug console=ttyAL0,115200 などと記載される。その場合でも make menuconfig で、Device Drivers -> Character devices -> Serial drivers -> Altera UART console support (CONFIG_SERIAL_ALTERA_UART_CONSOLE) を有効にすると、下記のように途中まではコンソールが表示される。しかし、その後ルートファイルシステムをマウントする辺りで boot console early0 が閉じられ、その後何も表示されなくなる。
$ nios2-terminal
Linux version 3.13.0-g434d565-dirty ...
bootconsole [early0] enabled
...
...
...
turn off boot console early0

sopc2dts の GUI 画面や、--board オプションで渡す boardinfo ファイルで bootargs の console=ttyAL0,... を console=ttyJ0,... に置き換えることで、early0 が閉じられた後もコンソールが表示される。
Linux の .config は make 3c120_defconfig のデフォルト値で構わなかった。
version: linux-socfpga 3.13 bb0bb0a

March 5, 2014

Linux kernel config for GPIO-less Nios II Qsys design

Nios II Linux、GPIO が無い Qsys デザインの場合、make menuconfig で Device Drivers -> GPIO Support を未選択にすると、Platform options -> Compile and link device tree into kernel image を有効にした場合でも、コンパイル時にエラーにならない。
version: linux-socfpga 3.13 bb0bb0a

March 4, 2014

Swap on RAM disk in CentOS 6.5 x86_64

RAM ディスク上にスワップを設定できるかの調査。

環境
$ uname -r
2.6.32-431.5.1.el6.x86_64
$ grep CONFIG_SWAP /usr/src/kernels/`uname -r`/.config
CONFIG_SWAP=y
$ grep CONFIG_BLK_DEV_RAM /usr/src/kernels/`uname -r`/.config
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
$ cat /proc/swaps
Filename    Type  Size Used Priority
/dev/dm-1                               partition 835576 0 -1

swap file on ext4 @/tmp -> PASS
$ mount
(近頃(?) /tmp は RAM 扱いではない模様)
$ dd if=/dev/zero of=/tmp/swapfile bs=1M count=1
$ mkswap -f /tmp/swapfile
Setting up swapspace version 1, size = 1020 KiB
no label, UUID=fd6633bd-5d5c-4e6a-99fc-f8ee9741eacc
$ file /tmp/swapfile
/tmp/swapfile: Linux/i386 swap file (new style) 1 (4K pages) size 255 pages
$ chmod 600 /tmp/swapfile
# swapon -v /tmp/swapfile
swapon on /tmp/swapfile
swapon: /tmp/swapfile: found swap signature: version 1, page-size 4, same byte order
swapon: /tmp/swapfile: pagesize=4096, swapsize=1048576, devsize=1048576
# swapon -s
Filename    Type  Size Used Priority
/dev/dm-1                               partition 835576 0 -1
/tmp/swapfile                           file  1016 0 -2
# swapoff /tmp/swapfile
ちなみに、swapon -v オプションを有効にしているとスワップファイルの permission が 600 でないと警告されたが、 600 であっても root 以外がオーナになら警告すべきだが警告されなかった。
$ swapon -V
swapon: (util-linux-ng 2.17.2)
stable/v2.17 の swapon.c は util-linux/util-linux.git [kernel.org] で uid を確認していないが、最新 stable/v2.24 の swapon.c util-linux/util-linux.git [kernel.org] では、uid もチェックしている模様。
ちなみに、util-linux [wikipedia.org] によると、util-linux-ng は util-linux の後継として開発されたが、また util-linux という名前に戻ったらしい。

swap file on ramfs @/dev/ram0 -> FAIL
# mkdir /mnt/ram0
# mount -t ramfs /dev/ram0 /mnt/ram0
# dd if=/dev/zero of=/mnt/ram0/swapfile bs=1M count=1
# mkswap -f /mnt/ram0/swapfile
Setting up swapspace version 1, size = 1020 KiB
no label, UUID=7a23a073-c7a0-4e13-abfb-a0746abe3afc
mkswap: unable to relabel /mnt/ram0/swapfile to system_u:object_r:swapfile_t:s0: Operation not supported
# file /mnt/ram0/swapfile
/mnt/ram0/swapfile: Linux/i386 swap file (new style) 1 (4K pages) size 255 pages
# chmod 600 /mnt/ram0/swapfile
# swapon -v swapfile
swapon on swapfile
swapon: /mnt/ram0/swapfile: found swap signature: version 1, page-size 4, same byte order
swapon: /mnt/ram0/swapfile: pagesize=4096, swapsize=1048576, devsize=1048576
swapon: swapfile: swapon failed: Invalid argument
# dmesg | tail -1
swapon: swapfile has holes
# cp /tmp/swapfile /mnt/ram0/
# chmod 600 /mnt/ram0/swapfile
# swapon -v /mnt/ram0/swapfile
swapon on /mnt/ram0/swapfile
swapon: /mnt/ram0/swapfile: found swap signature: version 1, page-size 4, same byte order
swapon: /mnt/ram0/swapfile: pagesize=4096, swapsize=1048576, devsize=1048576
swapon: /mnt/ram0/swapfile: swapon failed: Invalid argument
# dmesg | tail -2
swapon: swapfile has holes
swapon: swapfile has holes

swap file on ext2 @/dev/ram0 -> PASS
# mkfs /dev/ram0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
4096 inodes, 16384 blocks
819 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=16777216
2 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
 8193

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# mount -t ext2 /dev/ram0 /mnt/ram0
# dd if=/dev/zero of=/mnt/ram0/swapfile bs=1M count=1
# mkswap -f /mnt/ram0/swapfile
Setting up swapspace version 1, size = 1020 KiB
no label, UUID=acaff689-a570-43a7-8c97-2c8c80045bbc
# chmod 600 /mnt/ram0/swapfile
# swapon -v /mnt/ram0/swapfile
swapon on /mnt/ram0/swapfile
swapon: /mnt/ram0/swapfile: found swap signature: version 1, page-size 4, same byte order
swapon: /mnt/ram0/swapfile: pagesize=4096, swapsize=1048576, devsize=1048576
# swapon -s
Filename    Type  Size Used Priority
/dev/dm-1                               partition 835576 0 -1
/mnt/ram0/swapfile                      file  1004 0 -2
# dmesg | tail -1
Adding 1004k swap on /mnt/ram0/swapfile.  Priority:-2 extents:5 across:1020k
# swapoff /mnt/ram0/swapfile

swap partition @/dev/ram0 -> PASS
# mkswap /dev/ram0
Setting up swapspace version 1, size = 16380 KiB
no label, UUID=efac3cf3-9d79-4f68-935c-f4da81845dbb
# swapon -v /dev/ram0
swapon on /dev/ram0
swapon: /dev/ram0: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/ram0: pagesize=4096, swapsize=16777216, devsize=16777216
# swapon -s
Filename    Type  Size Used Priority
/dev/dm-1                               partition 835576 0 -1
/dev/ram0                               partition 16376 0 -2
# dmesg | tail -1
Adding 16376k swap on /dev/ram0.  Priority:-2 extents:1 across:16376k
# swapoff

swap file on tmpfs -> FAIL
# mkdir /mnt/tmp
# mount -t tmpfs tmpfs /mnt/tmp
# dd if=/dev/zero of=/mnt/tmp/tmpfsswap bs=1M count=1
# mkswap -f /mnt/tmp/tmpfsswap
Setting up swapspace version 1, size = 1020 KiB
no label, UUID=ed44d266-47e6-40a2-8ac7-7f925d88fa6e
# chmod 600 /mnt/tmp/tmpfsswap
# swapon -v /mnt/tmp/tmpfsswap
swapon on /mnt/tmp/tmpfsswap
swapon: /mnt/tmp/tmpfsswap: found swap signature: version 1, page-size 4, same byte order
swapon: /mnt/tmp/tmpfsswap: pagesize=4096, swapsize=1048576, devsize=1048576
swapon: /mnt/tmp/tmpfsswap: swapon failed: Invalid argument
# dmesg | tail
(no message invoked by this swapon)
tmpfs 自体 swap を使うのだから swap を tmpfs 上に作れるとは思えなかったが、念のためやってみた。

March 1, 2014

Linux for Nios II (MMU) on custom design

socfpga-linux カーネルでデフォルトパラメータが設定されている Altera Embedded Systems Development Kit, Cyclone III Edition [altera.com] (3C120) ではない FPGA ボードでオリジナルの Qsys デザインを作成し、MMU を有効にした Nios II で Linux をブートした。

MMU を有効にした Nios II で Linux を動かす場合の最近の流儀はルートファイルシステムは uClinux [uclinux.org] でなく、BuildRoot [buildroot.net] に移行した模様。ビルド方法などの各種情報も Category:Linux - Altera Wiki [alterawiki.com] から Nios II Linux User Manual ・ Documentation ・ RocketBoards.org [rocketboards.org] に一本化されている。流行りは ARM 内蔵の Altera SoC [altera.com] に移ったのか、Nios II (MMU) + Linux で BuildRoot 移行後の情報はとても少ない(日本語では皆無?)。ちなみに、Altera SoC の場合は Yocto になる模様。Altera SoC Yocto Powered Embedded Linux [altera.com]

基本的に Nios II Linux User Manual ・ Documentation ・ RocketBoards.org [rocketboards.org] に従う。以下のセクションは上記文書に合わせる。

ホスト環境
  • RedHat 5 x86_64
  • Quartus II v13.1 (64bit)

1. Setting up toolchain
Sourcery CodeBench Lite Edition - Altera Nios II Processor - GNU/Linux release をダウンロード、インストール。 利用バージョン: Sourcery CodeBench Lite 2013.05-43

$ export PATH=/<your path>/CodeSourcery/Sourcery_CodeBench_Lite_for_Nios_II_GNU_Linux/bin/:$PATH
$ export ARCH=nios2
$ export CROSS_COMPILE=nios2-linux-gnu-

2. Building root filesystem
git レポジトリでも良いが、Buildroot - Download [buildroot.net] より、リリース版をダウンロード、展開。
利用バージョン: buildroot-2013.11.tar.(bz2|gz)

$ wget http://www.rocketboards.org/pub/Documentation/NiosIILinuxUserManual/nios2_defconfig
$ mv nios2_defconfig configs/
$ make nios2_defconfig
$ make menuconfig
$ make source
(オフラインビルドをしたい場合)
$ make

3. Building U-Boot
とりあえず U-Boot は使わず、JTAG (nios2-download) でカーネルとルートファイルシステムをメモリに展開するため、スキップ。

4. Building Nios II Linux kernel
sopc2dts [alterawiki.com] をインストールしておく。
レポジトリ: sopc-tools.git
ブランチは無いので、master の現時点での head をダウンロード、展開、make。
利用バーション: commit 83a62e0e3d8618afeb92bf15f2696fbd0804680a [rocketboards.org]
java がインストールされていなければ、インストールしておく。

# yum install java-1.7.0-oracle-devel  
CentOS 6 で OpenJDK ではエラーになったので、Oracle Java を利用。
OpenJDK (CentOS 6) でもコンパイル、実行できた。
# yum install java-1.7.0-openjdk-devel  

linux-socfpga.git [rocketboards.org] レポジトリの socfpga-3.13 [rocketboards.org] head のスナップショットをダウンロード、展開。
利用バージョン: commit: bb0bb0a2a05443edef7af9f7de9fc8c3f36f01cb [rocketboards.org]
$ make 3c120_defconfig
$ java -jar ../sopc-tools-83a62e0/sopc2dts/sopc2dts.jar --board ../hoge.boardinfo --input ../hoge.sopcinfo --output arch/nios2/boot/dts/hoge.dts
(.sopcinfo は Qsys で出力。.boardinfo は一度 sopc2dts --gui で起動し生成。)
$ make menuconfig
General setup -> Initial RAM filesystem and RAM disk (initramfs/initrd) support を有効化
General setup -> Initramfs source file(s). に "../buildroot/output/images/rootfs.cpio" など、buildroot で生成したルートファイルシステムの .cpio のパスを指定
Platform options -> Compile and link device tree into kernel image を有効化
Platform options -> Device tree source file. に "arch/nios2/boot/dts/hoge.dts" など上記 .dts のパスを指定
$ make zImage
$ nios2-download -g vmlinux && nios2-terminal
(nios2-download -g arch/nios2/boot/zImage の方が転送が速い)

February 10, 2014

uClinux-dist (nommu) for Nios II on custom design

自前の FPGA デザインで nommu 版の uClinux for Nios2 を動かそうとすると、Qsys ではなく .ptf を生成する SOPC Builder でないとすんなりいかない模様。Quartus II v12.x まで戻れば SOPC Builder が入っていたが、UniPHY を使うと Are there any issues with using the UniPHY EMIF toolkit with SOPC builder projects? [altera.com] という問題があるらしいので、v10.1 まで戻り(v11.0でもよさそうだが)デザインを作り、まず HAL を使った OS なしのプログラムが動くことを確認。先日の uClinux-dist (nommu) build for Nios II [blogspot.jp] と同様にカーネルとユーザランドをビルドし、JTAG で通常の ELF ファイルをロードするように nios2-download で images/zImage をダウンロード、実行(場合によりリセットも)すると uClinux がブートした。

February 7, 2014

Memory Leak Patch to Homebrew Emacs 24.3 on OS X Mavericks

OS X Mavericks 上の Emacs 24.3 で distnoted が暴走する問題、This is a patch (with commentary) that fixes a memory leak in 24.3 for OSX Mavericks (10.9) users who experience excessive resource consumption by distnoted. [github.com] のパッチを当てるという対策で落ち着いて来た模様(?)。Homebrew では他にも Backport of Emacs master's fullscreen mode to Emacs 24.3 [github.com] パッチや、--japanese オプションを付けてインストールすると File Details: /inline_patch/trunk/emacs-inline.patch (583) - macemacsjp (svn) - MacEmacs JP - SourceForge.JP [sourceforge.jp] パッチがあたる。パッチがあたるファイルが一部重複していたが、Hunk #n succeeded でなんとかパッチが適応でき、順番はあまり気にしなくてもよさそう。
$ brew edit emacs
$ brew reinstall emacs
参考文献
  1. distnoted が原因でEmacsが落ちるのを防ぐemacs.rb [qiita.com]
  2. emacsやdistnotedを安定させるパッチをhomebrewで適用した [n-z.jp]

(February 8, 2014 追記)
折角なので今回は Formula Cookbook [github.com] に従い Pull Request してみた。 (February 9, 2014 追記)
早速取り込んでいただけた模様。
commit message の英文法が間違ってるのが恥ずかしい。オープンソース活動はスヌープされても問題ないから、英文構成サービス使うべし。

February 5, 2014

uClinux-dist (nommu) build for Nios II

FPGA ボードで学ぶ組込みシステム開発入門 ~Altera編~サポートページ [gihyo.jp] の SOPC Builder 版 DE0 のデザインでカーネルとユーザランドをビルドしてみた。
ホスト環境: RedHat 5 x86_64

デザインをダウンロード、展開
$ wget http://image.gihyo.co.jp/assets/files/book/2011/978-4-7741-4839-7/download/DE0.ZIP
$ unzip DE0.ZIP

ビルドに必要なツールをインストール
# yum install git-all git-gui make gcc ncurses-devel bison byacc flex \
gawk gettext ccache zlib-devel gtk2-devel lzo-devel pax-utils libglade2-devel uboot-tools
Install Nios II Linux [alterawiki.com] のパッケージ指定にタイポがあり pax-utils と libglade2-devel の間にスペースが必要

クロスコンパイラをダウンロード、展開
$ wget ftp://ftp.altera.com/outgoing/nios2-linux/nios2gcc-20080203.tar.bz2
$ tar jxvf nios2gcc-20080203.tar.bz2
$ export PATH=$PWD/opt/unios2/bin:$PATH

uClinux-dist をビルド
Install Nios II Linux [alterawiki.com] や Downloading Linux Distribution [alterawiki.com] によると、nommu の場合は test-nios2 ブランチになっているらしい。
$ wget http://sopc.et.ntust.edu.tw/pub/linux/nios2-linux-20100621.tar
$ tar xvf nios2-linux-20100621.tar
$ cd nios2-linux/linux-2.6
$ git checkout test-nios2
$ cd ../uClinux-dist
$ git checkout test-nios2
$ make menuconfig
$ make vendor_hwselect SYSPTF=$HOME/DE0/dai9sho/uclinux/uclinux_sopc.ptf
$ make
$ file images/zImage
images/zImage: ELF 32-bit LSB executable, version 1 (embedded), statically linked, not stripped
ptf ファイルは絶対パスで指定する必要あり。

January 28, 2014

Porting Altera Transciever Toolkit

Transciever Toolkit [altera.com] の移植(データレート、リファレンスクロック、チャンネル数の変更)方法まとめ。
環境: RedHat 5.10 x86_64, Quartus II 13.1.1 Build 166
  1. On-chip Debugging Design Examples [altera.com]
    より Transceiver Toolkit Example をダウンロードし展開。現時点では Transceiver Toolkit Examples for Stratix V GX, Arria V GX/GT, Cyclone V GX/GT and Stratix IV GX/GT devices (Quartus II software v13.0 SP1) が最新で、これを Quartus II 13.1 で開くと 13.1 用にコンバートされる。
  2. 各ディレクトリ以下の readme.txt にある通り、*.qar を展開した後 ip ディレクトリを展開したプロジェクトディレクトリ内に移動する。
  3. Quartus II でプロジェクト (*.qpf) を開き、Qsys を起動、*.qsys を開く。
  4. System Contents タブで xcvr_low_latency_phy を Edit...。General タブでNumber of lanes と、Data rate、Input clock frequency を編集し、Base data rate を選択。クロックとデータレートの組み合わせは、MegaWizard Plug-in Manager の ALTGX のウィザードで探った。
  5. System Contents タブで pllclk を Edit...。Clock frequency を編集する。
  6. System Console タブで元々あったあるレーン用の generater_*, timing_adapter_*, checker_*, timing_adapter_* をそれぞれ右クリック Duplicate し、Connection で元々あったレーンを参考に同様の配線を行う。
  7. Qsys の Generate メニューより Generate... を選択し、Generation ウィンドウで必要なら各種パラメータを設定し、Generate。
  8. Quartus II に戻り、Qsys で生成したモジュールを含むトップモジュール(*.v など) とクロックのタイミング制約が書かれている *.sdc を編集し、ピンアサインメント変更など必要があれば行い、Processing メニューから Start Compilation を実行。*.sof ファイルが生成される。

January 22, 2014

Emacs Mew Biff with MacOS X Notification Center

Google Notifier [google.com] がサンセットするらしい。以前は Mew の Biff [mew.org] 機能で新着メールを確認していたが、最近は Emacs が常に最前面に表示されているような生活でもないので、Mew から terminal-notifier [github.com] 経由で、MacOS X の Noficitaion Center (通知センター)に新着メールの到着を表示するようにした。

Homebrew で terminal-notifier をインストール。
$ brew install terminal-notifier
下記を .mew.el に追記し、mew-biff-bark をオーバーライト。
(defun mew-biff-bark (n)
  "Overwrite mew-biff-bark to invoke terminal-notifier to show a biff alert in MacOS X Notification Center"
  (if (= n 0)
      (setq mew-biff-string nil)
    (if (and mew-use-biff-bell (eq mew-biff-string nil))
 (call-process "/bin/bash" nil nil nil "-c" 
        (format "\/usr\/local\/bin\/terminal-notifier -message Mail\\\(%d\\\) -title Mew -sound Default -activate org\.gnu\.Emacs -sender org\.gnu\.Emacs -group Emacs.mew -remove Emacs.mew" n)))
    (setq mew-biff-string (format "Mail(%d)" n))))
オリジナルの mew-biff-bark の beep を terminal-notifier の呼び出しに置き換えたので、既に新着メールが1個以上あるときに更に新しいメールが来ても、通知はされない(五月蝿いからそういう仕様になってる!?)。
Mew 6.5, Emacs 24.3.1, terminal-notifier 1.5.1, OS X 10.9.1 で動作確認。

ちなみに、最近の Emacs は Desktop Notification [gnu.org] がサポートされているらしいが、freedesktop.org Desktop Notifications Specification のみの模様。

(January 23, 2014 追記; Gist Revision 2)
既に新着メールが1個以上あるときに更に新しいメールが来ても通知されないのは、Emacs のモードラインが常に見える状況ならよいかもしれないが、Notification Center の使い方としてはやはり不便なので、若干変更し Gist に置いた。

(January 30, 2014 追記; Gist Revision 3)
新着メールを Mew で取り込みモードラインの "Mail(n)" の表示を消す mew-buff-clear が呼び出されるときに、Notification Center の通知も消すように変更。

January 20, 2014

GPG with Mew 6.5

Mew 6.5 (Emacs 24.3.1) で GPG を使うため Homebrew で GnuPG 1 と GnuPG 2 をインストール。
$ brew install gpg gpg2

January 18, 2014

bookmarklet "ehon2calil"

絵本ナビ [ehonnavi.net] で表示している本をカーリル [calil.jp] で検索するブックマークレットを作った。

使い方
  1. ehon2calil をブックマークバーにドラッグ
    Bookmarkitfy.it [bookmarkify.it] からも登録可(簡単なスクリーンショット解説付き)
  2. 絵本ナビの各絵本の紹介ページを表示
    例えば、とかいのネズミといなかのネズミ [ehonnavi.net] など
  3. 1 で登録したしたブックマークをクリック
  4. 少し待つと、絵本ナビで表示していた絵本をカーリルで検索した結果が表示される
コードは Amazonからカーリルへ飛ぶブックマークレット [hatena.ne.jp] を参考にさせていただき、Bookmarkify.it [bookmarkify.it] でブックマークレットを公開するためのリンクを作った。
Safari 7.0.1 及び Google Chrome 32.0.1700.77 で動作確認。

January 11, 2014

Qsys 13.1.1 Build 166 (64 bit)

IP (Avalon ALTPLL v13.1) を追加しようとしたところ、追加しているような画面遷移になりながら結局エラーも出ずに追加されない現象に遭遇。.sopc から変換した .qsys だけでなく、そのバージョンの Qsys で新規に .qsys を作成しても追加できない。
Design Examples [altera.com] の中から比較的新しい Qsys Compliant のデザインを探し、Nios II Ethernet Standard Design Example [altera.com] の niosii-ethernet-standard-4sgx230.zip を Qsys で開いてみると、同じ IP を追加できた。
その後、先ほど IP を追加できなかったデザイン .qsys を開き、同じ IP (Avalon ALTPLL) を追加してみると、今度は追加された。謎。

Device family: Stratix IV

January 10, 2014

Fast Nios II Hardware Design Example

Fast Nios II Hardware Design Example [altera.com] を試してみようとしたが、最新の Quartus II v13.1 では Stratix II が現時点ではサポートされていない。
プロジェクトファイル .qpf を見ると v7.2 で作られたらしい。
CentOS 6.5 x86_64 に v7.2 SP3 をインストールしたものの、プロジェクトを開いたり option ウィンドウを開くと、Segment Violation で落ちる。
Opening "option" window in Tool menu causes the following error:
*** Fatal Error: Segment Violation at 0x28
Module: quartus
0xFDACD   : FontDrawCharset::bInit(tagLOGFONTA*) + 0x22D (gdiuser32)
0xFF0EF   : fontcache::GetNewFontDraw(tagLOGFONTA*, tagXFORM*, int, unsigned long, unsigned long) + 0x21F (gdiuser32)
0xFF387   : fontcache::FindOrCreateFontDraw(tagXFORM*, CW_DC*, tagLOGFONTA*) + 0x197 (gdiuser32)
...
調べてみると、v7.2 当時に新しめの Linux ディストリビューションで動かそうとしていた人たちは同様のエラーに苦しんで居たようだ。そういえば当時の Quartus II は MainWin を使っていたので、色々苦しんだのを思いだしてきた…。
KDE は利用していないので関係なさそうだが、念のため Why does the Quartus II software version 7.2 main GUI window disappear or fail to open when running on Linux with a KDE desktop? [altera.com] のパッチを当てるが治らず。

そんな中、Device Support List [altera.com] を発見。直近の 13.0sp1 で Stratix II もサポートされていた。最新ツールは古いデバイスのサポートが後回しになっているだけで、忘れ去れているわけではない模様。
Quartus II v13.0 SP0 をインストールし .sopc を開いたが、SOPC Builder は無くなっているので、Qsys で開いて変換。無事開けた。

結局、v13.1 でも、Stratix II はサポートされていないが Qsys で .sopc を開くと、サポードデバイスへのリプレースを促され、デバイス依存の PLL の再設定をする程度で Stratix IV で Hello World が動いた。

January 9, 2014

VBoxService --timesync-set-threshold

VirtualBox の VM の時計のずれを修正する方法。
正確には、直接修正するコマンドオプションではなく、ホストとのズレの閾値設定なのだが、コマンド実行時に閾値以上ずれていると結果的にすぐ同期された。
# VBoxService --help
...
    --timesync-set-threshold
        The absolute drift threshold, given as milliseconds,
        where to start setting the time instead of trying to
        adjust it. The default is 20 min.
...
# VBoxService --timesync-set-threshold 60000
# VBoxService --version
4.3.6r91406
参考文献

January 8, 2014

Synthesis options for SignalTap II in Altera Quartus II

SignalTap II などで利用するため fan-out のないレジスタや重複したレジスタを最適化で消されないために下記のようにすると便利らしい(Verilog の例)。
reg hoge /* synthesys syn_noprune syn_preserve = 1 */;
参考文献
  • Quartus II Handbook Version 13.1 - Volume 1: Design and Synthesis - Chapter 16: Quartus II Integrated Synthesis [altera.com] - Quartus II Synthesis Options - Preserve Registers 及び Noprune Synthesis Attribute/Preserve Fan-out Free Register Node

January 7, 2014

Altera Quartus II 13.1 Install Memo

CentOS 6.5 x86_64 (netinstall 版) にインストールするときは、Altera Software Installation and Licensing Manual (PDF) [altera.co.jp] に書かれている通り、compat-libstdc++-33.i686 など多数の 32 bit ライブラリのインストールが必要だった。
手元の RedHat 5.10 x86_64 では必要な 32 bit ライブラリが予めインストールされているようで、インストール不要だった。

Stand-Alone Software の Quartus II Programmer and SignalTap II [altera.com] はインストール後に $QUARTUS_64BIT や $QUARTUS_ROOTDIR など下手に環境変数を設定すると起動しなかった(CentOS 6.4 x86_64)。
CentOS 6.4 x86_64 では USB-Bluster Driver for Linux [altera.com] や USB-Bluster Driver for Linux [altera.co.jp] に書かれている udev のルールファイル(/etc/udev/rules.d/51-usbblaster.rule)のフォーマットは古く、
などを参考に
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666", NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}", RUN+="/bin/chmod 0666 %c"
と書き直すと、(ルートでなく一般ユーザでも)JTAG ケーブルを利用できるようになった。

January 5, 2014

Cocoa Emacs 24.3 - locale

先日 Cocoa Emacs 24.3 を homebrew で --japanese オプションを有効にしてインストールしたが、toggle-input-method (C-\) の動作がおかしかった(emacs-inline.patch: r583)。具体的には、C-\ ではことえりが切り替わらず Emacs に付属の Quail に切り替わってしまい、 Cmd + space (USキーボードなので) でことえりを切り替える必要があった。
Cocoa Emacs 23のIME patchでPreferred Languagesを参照させる [tempus.org] によると、System の環境が日本語になっていない場合は、
defaults write org.gnu.Emacs AppleLanguages "(ja, en)"
などが必要だったらしい。この情報になかなかたどり着けなかったのだが、システム環境が日本語になっていない人は少ないのだろうか。Emacs のときのみアップルメニューが日本語になり、あまり見ないので構わないがなんだか気持ち悪い。