2012-11-03

How to Fit ViewBox to Area of Drawing on SVG

  1. Delete attribute(width and height), from root element (the tag name is svg) of SVG document. Then save it as tmp.svg. notice: This process is needed to calculate position and area size of drawing correctly.
  2. With inkscape command, get position (X and Y) and area size (W and H) of drawing from tmp.svg. To do this, execute command "inkscape -X tmp.svg", in the same way for Y, W and H. See "inkscape --help"
  3. Change viewBox attribute to "X Y W H". The root element has this attribute.
here is an example:
#!/bin/zsh

INKSCAPE=$(whence inkscape)
if [ -z "${INKSCAPE}" ]; then
  echo "Command inkscape not found." > /dev/stderr
  exit 1
fi
CSHARP=$(whence csharp)
if [ -z "${CSHARP}" ]; then
  echo "Command csharp not found." > /dev/stderr
  exit 1
fi

ID=
INPUT=
while [ -n "$1" ]; do
  case $1 in
    -I)
      ID="$2"
      shift
    ;;
    *)
      INPUT="$1"
    ;;
  esac
  shift
done

if [ -z "${INPUT}" ]; then
  echo "No input file." > /dev/stderr
  exit 1
fi
if [ ! -f "${INPUT}" ]; then
  echo "File '${INPUT}' is not found." > /dev/stderr
  exit 1
fi

OPTS=()
if [ -n "${ID}" ]; then
  OPTS=(${OPTS} -I ${ID})
fi

TMPFILE=$(tempfile).svg
cat <<EOT | ${CSHARP} -reference:System.Xml.Linq > ${TMPFILE}
using System;
using System.Xml.Linq;

var doc = XDocument.Load(@"${INPUT}");
var width = doc.Root.Attribute(XName.Get("width"));
if (width != null) width.Remove();
var height = doc.Root.Attribute(XName.Get("height"));
if (height != null) height.Remove();

doc.Save(Console.Out);
EOT

X=$(${INKSCAPE} ${OPTS} -X ${TMPFILE})
Y=$(${INKSCAPE} ${OPTS} -Y ${TMPFILE})
W=$(${INKSCAPE} ${OPTS} -W ${TMPFILE})
H=$(${INKSCAPE} ${OPTS} -H ${TMPFILE})

cat <<EOT | ${CSHARP} -reference:System.Xml.Linq
using System;
using System.Xml.Linq;

var doc = XDocument.Load(@"${TMPFILE}");
var viewBoxValue = @"${X} ${Y} ${W} ${H}";

var viewBox = doc.Root.Attribute(XName.Get("viewBox"));
if (viewBox == null) doc.Root.Add(new XAttribute(XName.Get("viewBox"), viewBoxValue));
if (viewBox != null) viewBox.SetValue(viewBoxValue);

doc.Save(Console.Out);
EOT

2012-10-31

Today's Oneliner: Numbering Files

mkdir renamed
ls -1 *(.) | sort | awk '{ count++; printf "cp %s renamed/%04d\n",$1,count; }' | zsh
  1. get the list of files in the current directory
  2. sort the list with sort command by the required order: reversed, numeric, ignoring case, ...
  3. generate a shell script, and execute it.

2012-10-23

Disabling Auto-Indent for Current File

:setl noai nocin nosi inde=

Today's Oneliner

 % sudo emerge -uDN --keep-going @world

 * IMPORTANT: 7 news items need reading for repository 'gentoo'.
 * Use eselect news to read news items.

Calculating dependencies \

!!! Problem resolving dependencies for net-nds/openldap from @selected
... done!

!!! The ebuild selected to satisfy "net-nds/openldap" has unmet requirements.
- net-nds/openldap-2.4.33::gentoo USE="berkdb crypt cxx ipv6 (multilib) ssl
  syslog tcpd -debug -experim
passwd"

  The following REQUIRED_USE flag constraints are unsatisfied:
    cxx? ( sasl )

(dependency required by "@selected" [set])
(dependency required by "@world" [argument])
 % sudo equery d net-nds/openldap
 * These packages depend on net-nds/openldap:
app-admin/sudo-1.8.6_p3 (ldap ? >=net-nds/openldap-2.1.30-r1)
app-crypt/gnupg-2.0.19 (ldap ? net-nds/openldap)
app-text/acroread-9.5.1-r1 (ldap ? net-nds/openldap)
dev-libs/apr-util-1.4.1 (ldap ? =net-nds/openldap-2*)
dev-libs/cyrus-sasl-2.1.25-r3 (openldap ? net-nds/openldap)
gnome-base/gconf-3.2.5 (ldap ? net-nds/openldap)
kde-base/kdepimlibs-4.9.2 (ldap ? net-nds/openldap)
net-misc/curl-7.26.0 (ldap ? net-nds/openldap)
net-misc/openssh-6.1_p1 (ldap ? net-nds/openldap)
 % sudo USE="-ldap" emerge -1 $(equery -C d net-nds/openldap | awk '{ print "="$1}')
...snip...
 % sudo emerge -c net-nds/openldap
 % sudo emerge -uDN --keep-going @world

2012-09-01

Shown on Heading, not in Table of Contents

Issue

By the reason on layouting, sometimes there is "somestuff" I should write in a heading command such as \section. It is also shown in the table of contents by \addcontentsline used by \section. But "somestuff" should be enabled only on the heading, not the table of contents. How can I solve that?

Solution

In the document preemble (or style file):
\makeatletter

\let\if@notinaddcontentsline\iftrue
\let\@oldaddcontentsline\addcontentsline
\def\dontaddcontentsline#1{%
  \if@notinaddcontentsline #1 \fi}
\def\addcontentsline#1#2#3{%
  \let\if@notinaddcontentsline\iffalse  
  \@oldaddcontentsline{#1}{#2}{#3}
  \let\if@notinaddcontentsline\iftrue}

\makeatother
Then, write my heading:
\section{foobar\dontaddcontentsline{\\}baz}

2012-07-27

Failed to emerge =x11-drivers/xf86-video-vmware-12.0.2 with >=x11-base/xorg-server-1.12.99.902

The new ebuild (x11-drivers/xf86-video-vmware-12.0.2-r1) has been provided since Aug 8th, so this problem has already been resolved. Now, we can emerge it.

2012-06-09

カーネルを 3.4 に更新しました

長い間ノートパソコンのカーネルの更新をサボっていて、記念すべきバージョン 3.0.0 (gentoo-sources-3.0)のままだったのですが、そろそろ更新しようということで、gentoo-sources-3.4 に更新しました(いまさら)。
で、喜々として再起動すると:
  • iwlagn がなくなっていたので無線 LAN 接続できねえ
  • あれ?USB マウス動かんがな
という現象が起こったので直していました。

iwlagn -> iwlwifi

無線アダプタは Intel の WiFi Link 5300 で、今までカーネルモジュール iwlagn とファームウェア net-wireless/iwl5000-ucode で動いていたものです。
menuconfig して wireless drivers のところを見ていたら iwlwifi がそれっぽいのでとりあえずモジュールとしてコンパイルして make modules_install したのち modprobe iwlwifi; /etc/init.d/wpa_supplicant start するとうごきました。
ちなみにモジュールにせず直接組み込むと「ファームウェアが読み込めない」とかいうメッセージ(dmesg)を吐いて動きません。謎い。というかこれのせいで時間かかった。
ということなので、やっぱりモジュールにしておいて /etc/conf.d/modules の modules 変数に iwlwifi を追記しておきます。

82801I (ICH9 Family) USB UHCI Controller

ですので、uhci_hcd あたりを適当に組み込んでやると動きました。やったね

いやじぇんつーはいいですね

数年前と比べるとトラブル耐性がだいぶついたように思います。

2012-05-30

~amd64 環境でも特定パッケージを ~amd64 とマークされたバージョンへ自動更新しないようにする

make.conf に ACCEPT_KEYWORDS="~amd64" と書いていると、どんどんパッケージが更新されて楽しいのですが、 firefox はパッケージがでかい上に ~amd64 なパッケージも比較的頻繁に降ってきます。さすがにちと時間がかかって面倒な感じがしないでもありません。そこで指定した任意のパッケージを ~amd64 とマークされたバージョンへ自動更新しないようにします。
まず手始めに、 /etc/portage/env/nounstable.conf あたりに次のように記述します:
ACCEPT_KEYWORDS="-~amd64"
さて、/etc/portage/package.env に以下のように、パッケージ名(とバージョン)を指定して選択的に nounstable.conf が適用されるようにします:
www-client/firefox nounstable.conf
app-office/libreoffice nounstable.conf
これで、たとえ make.conf で ~amd64 を受け付けるように記述していても、emerge の際に明示的に ACCEPT_KEYWORDS="~amd64" emerge ほげほげ としなければこれらパッケージの unstable バージョンはインストールされません。
…とここまで書いたのはいいのですが、今朝(2012-05-30)の寝起きのテンションでやってたのでうまく行ったような気がしたのですがいまいちどうもちゃんと動かないので、/etc/portage/package.accept_keywords に
www-client/firefox -~amd64
app-office/libreoffice -~amd64
と書いておくのが近道のようです。なお、emerge するときに ACCEPT_KEYWORDS="-~amd64" emerge ほげほげ と指定すると unstable なバージョンはインストールされません。

2012-04-18

sudo.vim があるときの zsh 補完関数

先日、
てなことを思ったのですが、ついでなので補完関数書いてみよう、ということで書いてみました:
function _vimsudo {
  local LAST="${words[$#words[*]]}"
  case "${LAST}" in
    sudo:*)
      local BASEDIR="${LAST##sudo:}"
      BASEDIR="${~BASEDIR}"
      [ -d "${BASEDIR}" ] && BASEDIR="${BASEDIR%%/}/"
      compadd -P 'sudo:' -f $(print ${BASEDIR}*) \
      && return 0
      ;;
    *)
      _vim && return 0
      ;;
    esac

  return 1
}
ファイル名にワイルドカードを含めたとき(sudo:/etc/*conf とか)は上手く動きません。うーん
  • 2012-04-27:色々とミスっていたので修正。そもそも sudo: で始まるときだけやればいいのでした
  • 2012-04-30:ご指摘のとおり esac が抜けていました。
  • 2012-08-29:実は find いらないんですよね

2012-04-16

Being Gone

新年度早々からこんな陰気な曲を書くあたり先が思いやられる…と思ったらいままでも陰気な曲しか書いてないので問題ないでしょう(ぇ。 ハ短調で書き始めたのですがあまりに陰気くさいので移調して、出だしはニ短調です。ホ長調のつなぎのフレーズの(憂鬱なニ短調のテーマに対して、)雲が晴れる感じと最後のフレーズが気に入っています。
私は、見頃の桜を見ても綺麗だとか何とか思う前に、諸行無常だとか、散華だとか、儚さだとか、変化だとか、そういった言葉を連想する程度には中二病…もとい仏教的思想の人間だったりします。
12 日、校庭の桜が綺麗に咲いていました。正直なところ、むしろ変化の感じられる葉桜ぎみの頃のほうが好きなのですが、ともかくこれはその日に書き始めた曲です。曲名はいつもどおり管理の都合で、書き始めた日にあったことや思ったことをそのままつけているに過ぎないのですが、さすがに桜、そんな名前は unix システムコールの open とか read 並の特等席ですし、何か別の名前をつけたくなってとりあえず、落花としてみたところです。

2012-04-14

Gentoo の Portage Tree を Git のものに差し替え

ここの手順をそのままやるとあなたの Gentoo/Linux が Funtoo Linux になります。 Gentoo ユーザは git://github.com/funtoo/portage.git を使ってください。
研究室の PC は gentoo/linux なのですが、funtoo なら portage のバージョンが新しい(>= 2.2)ので git の portage tree が使えますし、標準で git tree を使わせています。そこで、git tree を使うように変えたのでそのメモというか覚書です。なんかまえ同じ事をしようとしてわけわからんことになって、おかしいなあと思っていたのですが多分ファイルのパーミッションか所有権がおかしかっただけかと思います。
# portage 2.2 以降をインストールします 
sudo emerge -1av --autounmask-write '=app-portage/portage-2.2.0_alpha100'
sudo dispatch-conf
sudo emerge -1av '=app-portage/portage-2.2.0_alpha100'
# /usr/portage.git に git tree を展開します
cd /usr
sudo mkdir portage.git
sudo chown portage:portage portage.git
sudo -u portage git clone https://github.com/funtoo/ports-2012.git portage.git
cd /usr/portage.git
sudo -u portage git checkout funtoo.org # これいらないかも? いらない
cd /usr
# tree を差し替えます
sudo mv portage portage.bak
sudo mv portage.git portage
emerge --sync で git が動くようになります。ばんざい。@world を emerge したほうがいいかもしれません。というより、funtoo の portage はばんばん更新されているので emerge -1 portage がおそらく必要です。
それと、funtoo の portage tree には boot-update とかの gentoo にはなかった便利ツールがいくつか入っていたり、いろんなカーネルが含まれていたりしますから、gentoo/linux ユーザなら funtoo の portage tree を使えば funtoo の恩恵が受けられていいんではないでしょうか。
以下蛇足

2012-04-11

Inkscape Extension を書くには

Extension の呼出し方がかなりシンプルになっているというか、ほとんど単なる外部プログラム呼出しなので簡単にできるようです。ようするに、
(interpreter)? your_script (--param=value)* /path/to/input[[/SVGfile]] | inkscape
というコマンドが発行されるのでコマンド引数を解析し、テンポラリファイルに出力された選択部分のオブジェクトの SVG データを変更して 標準出力に書きだせばよいということになります。もっとも、interpreter とか your_script とかいうのはプレースホルダでこいつは .inx ファイル(XML ファイル)の中で設定してやると必要なものに置き換えられます。
<?xml version="1.0" encoding="utf-8"?>  
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
  <_name>inkex</_name>  
  <id>com.example.inkex</id>  
  <effect>  
    <object-type>all</object-type>  
    <effects-menu>  
      <submenu _name="InkscapeExtension1"/>  
    </effects-menu>  
  </effect>  
  <script>  
    <command reldir="extensions" interpreter="mono">InkscapeExtension1.exe</command>  
  </script>  
</inkscape-extension>
  • command タグで起動コマンドを設定します。interpreter 属性がインタプリタ、タグの中身がインタプリタで実行するスクリプトファイルです。この例だと InkscapeExtension1.exe というアセンブリを mono で実行することになります。実行可能ファイルであれば interpreter の指定を省きます、いらないので。
    • reldir は(多分) $HOME/.config/inkscape/ の下のどこに起動するスクリプトがあるかということです。$HOME/.config/inkscape/extensions に .inx ファイルと一緒に置くと動きます。
  • _name タグは inkscape の extension メニューに表示される内容です。submenu を指定してるのでサブメニューで表示されますがこの例ではありがたみがありません。
  • object-type では extension を適用するオブジェクトの種類を指定します。all ですと全てですが、path にするとパスだけです。
    • 選択されたオブジェクトの id が --id=hoge の形式でコマンドラインオプションに追加されます。複数オブジェクトが指定されている場合はもちろん複数あります。

2012-02-25

クリティカルヒットの確率

クリティカルヒットの確率ってどう計算されているのかなーと。一様分布でもいいけどそうすると乱数が偏った時に "出すぎる" とか "でない" という現象が起こってしまうし。ポアソン過程だと思ったらいいのかなーとかと思ってぼんやり考えていたんですが。
放射性元素の時間あたりの崩壊数、一定時間における電話の呼びは離散的確率過程でありポアソン過程として知られている。単位時間に偶発事象が平均して l 回起こる場合に、k 回発生する確率は
P(k) = l**k exp(-l) / k!
ほて、攻撃 10 回(単位回数)に対して 1 回程度発生する crit の発生判定をするとして、 l = 1/10 = 0.1 から P(k) = 0.1**k exp(-0.1) / k! としてやると、
  • 10 回のうち 0 回発生する確率
    P(0) = 1 exp(-0.1) / 1     = exp(-0.1)         ~ 0.90
  • 10 回のうち 1 回発生する確率
    P(1) = 0.1 exp(-0.1) / 1     = 0.1 exp(-0.1)     ~ 0.090
  • 10 回のうち 2 回発生する確率
    P(2) = 0.1**2 exp(-0.1) / 2! = 0.01 exp(-0.1)/2  ~ 0.0045
  • 10 回のうち 3 回発生する確率
    P(3) = 0.1**3 exp(-0.1) / 3! = 0.001 exp(-0.1)/6 ~ 0.00015
となるので、過去 9(=10 - 1) 回の攻撃のうち n 回 crit が発生しており、次に crit が発生する確率は P(n+1) で計算して判定すればいい?のかなーと思ったりした。初回の確率(n=0) P(0+1) が 9%、まあ 10% ぐらいになるので感覚的にもだいたい合っているし。
しかし、実用的には階乗計算はあんまりでかい数を使うとすぐオーバーフローしてしまいますし、そもそも [0,1) の数を何乗もすると値が極端に小さくなるので、"単位回数"はせいぜい 10 回ぐらいになるんでしょうか。過去何回のうち何度出たかみたいなのを記憶するのも割りとアレです。
実際のゲームどうなってるんでしょー

参考文献
  • 中川正雄、真壁利明:確率過程,培風館,2002

2012-02-17

Impatience

切羽詰まった時にこそ別のことをしたくなるのです。実は今週の水曜ごろまで昼夜逆転で(いや厳密に言うと昼間は学校でプレゼンしたり色々していたので違うのですが)レポートやらなんやらをやっつけていたのですが、そのときに片手間に書き始めたものです。
焦っていたので「焦燥」という名前にしておきます。もっとも、名前は管理の都合でつけているだけなので深い意味はないのですが。
例によって例のごとくベタ打ちですが、チェンバロにしているのでわりと様になってる気がします。ト短調ですが途中何回か転調してイ短調で終わります。バロックと古典派とポピュラーを足して割った感じの構成だと思ってますがいかに。

2012-02-11

DrawingArea のダブルバッファリング

まあぼくがドキュメントちゃんと読んでなかったからなのですが。
Cairo で描画するときに激しくちらついたのでなんでだろーと思ったらダブルバッファリングのためのメソッドを呼んでやってなかったという間抜けです。なんせ DrawingArea なんて使うの初めてですし。
DrawingArea.GdkWindow.BeginPaintRect あたりを描画前に呼んでやって、DrawingArea.GdkWindow.EndPaint を終わったら呼べばいいみたいです。

2012-01-29

Hauptwerk で遊んでみるなど。

パイプオルガンの音源に Hauptwerk というものがあるのですが、こいつをえっちらおっちらダウンロードして、自分の環境で使って鳴らす方法を確認していました。そのために即興的に打ち込んだものを。
明らかにノイズが聞こえます。どうしたものか。
ノイズはペダルがピアニッシモになってたっぽく、それをノーマライズしたから当然というポカ

2012-01-28

Lunar Eclipse

去年の 12 月だっけかに月食があったと思うのだけど、そのときにコード進行と曲全体の構成だけ決めて放置していたのがあったので適当にメロディつけてみた。
ベタ打ちなのはいつも通り。
ひとつめのテーマが嬰ト短調、ふたつめのテーマが嬰ハ長調、これらを適当に繰り返したあと、ニ長調の間奏っぽいものを挟んで、ふたつめのテーマを変イ長調で、最後にひとつめのテーマをイ短調で再現して終わり。

2012-01-22

大量のファイルを Windows ファイル共有先からコピーするとき

エクスプローラーからファイルをコピーしようとすると、まずはじめにファイルをスキャンして容量をチェックするということをやり始めるので、ファイル数が数千から数万個以上あるようなときには、無駄な時間ばかりかかる。
どうせこっちは先に容量を調べているのでコピー可能なことはわかっている。
まあなんというか Windows 特有のお節介というやつなので、そのお節介を焼かせなければいいのである。そういうときは xcopy なりを使えばいいのだけど、Vista 以降はもっと便利な robocopy というツールがある。

his-pc という別の PCの共有名 docs のファイル群をツリーを維持してまるまるコピーするには
  • robocopy \\his-pc\docs .\ /mir /r:10 /w:1
などとすればよい。オプションが最後尾につくのが *nix 使いからするとものすごく気持ち悪いがまあそれはさておき。
このコマンドによって his-pc の共有名 docs からカレントディレクトリに、その中身のファイル郡がそのままコピーされる。厳密にいうと /mir オプションによってミラーリングをするので、コピー先にファイルがあるとコピー元と同期されたり削除されたりする。
ファイルのコピーの失敗にはあらゆる原因が考えられる。たとえばアクセス権がなかったとか、ネットワークが一時的に不調だったとか、そういう時に robocopy はご丁寧にリトライをやってくれるのだけど、デフォルトでは 1 ファイルにつき 30 秒待機したり 100 万回やりなおしたりするので、 /r や /w スイッチで指定してやる。r はリトライの回数、w が待機の秒数だ。

2012-01-21

Windows における chmod とか chown

のようなツールってなんだろな、という話。
chmod にあたるのは icacls で、chown のようなことは takeown でできるようです、うーん、せっかく GUI ベースの OS なのになんでこう大量のファイルに対する処理を GUI でできるようにしてくれないのかと。
それはさておき、以下、ものすごくいい加減な記述になりますが、ファイルの所有者が me で、現在のユーザが me だったとすると:
  • icacls hoge /grant me:F が chmod u+rwx hoge
  • icacls hoge /grant me:F が chmod -R u+rwx hoge
みたいな感じになります、気分的には。
さらに、以下いい加減な記述が続きますが、
  • icacls hoge /deny me:WD が chmod u-w hoge
みたいな感じです。icacls では書き込みと削除権を明示的に否定していることになります。
さて、takeown は所有権の獲得なんですが、
  • takeown /U me /F hoge が chown me hoge
  • takeown /U me /F hoge /R が chown -R me hoge
のようなイメージです。あくまでイメージで厳密にはところどころ違います。

2012-01-10

GTK# を Visual Studio から使う

ということをしようとしているのでちょっとメモ。 Gtk 名前空間のクラス群は IDE から references に gtk-sharp.dll を追加すれば使える。atk-sharp.dll, glib-sharp.dll もまた依存しているので一緒に追加する必要がある。
using Gtk;

class Program
{
    public static void Main(string[] args)
    {
        Application.Init();

        var window = new Window("GTK# on Visual Studio");
        window.DeleteEvent += (sender, e) => Application.Quit();

        var box = new HBox(true, 0);
        box.WidthRequest = 320;
        box.HeightRequest = 240;

        window.Add(box);
        window.ShowAll();
        
        Application.Run();
    }
}
出力の設定は Windows アプリケーションにしておくとコンソールがでない。まあこの辺は当然。
それはともかく mono のライブラリのクラス名とかその他命名規則が .NET からすると異質で気持ちが悪い。イベントは例えば Deleted とか Deleting だよねという。