2013年9月22日日曜日

C言語からTcl/Tkを呼び出す

前回のTcl/Tk版 Hello WorldをC言語から実行させることができたのでメモ.

まずは, ソース. Tcl_Initの前にTcl_FindExecutableが必須と説明している文書もあったが, 無くても動いたのでそのまま.
#include <tcl.h>
#include <tk.h>

int main(int argc, char* argv[])
{
    Tcl_Interp* interp;
    char        wish_cmd[] =
      "wm title . \"Hello World\"\n"
      "wm geometry . \"480x240\"\n"
      "label .label -text \"Hello, World! with Tcl/Tk.\"\n"
      "pack .label -side top -anchor w";
    
    interp = Tcl_CreateInterp();
    Tcl_Init(interp);
    Tk_Init(interp);
    Tcl_Eval(interp, wish_cmd);
    Tk_MainLoop();
    
    return 0;
}


次にコンパイル.
$ gcc -Wall hello_tcltk.c -ltcl86 -ltk86
/mingw/libの下にlibtcl86.aとlibtk86.aが配置されていたので, 上記のようにした.
また, CentOSでもTcl/Tkをインストールして, 上記のソースコードをコンパイルしてみた. こちらは, 以下のコマンドでOKだった.
$ gcc -Wall hello_tcltk.c -ltcl -ltk
ちなみに, これをMinGW/msysで実行すると, 当然のことながらld先生に「cannot find ...」と怒られる.

2013年9月21日土曜日

Tcl/Tkを初めて触った

HDD内のファイルを整理していたら, 大学/大学院時代に作成した数値計算のプログラムを見つけた. 懐かしくなってソースを眺めていたら, 数値計算したいという思いが湧き上がってきた.

当時のプログラムは, 主にC言語で記述してあり, 計算結果をGnuplotで可視化する代物なのだが, 初期値や条件を ソース内にベタ書きしてあるせいで, 値を変更すると再コンパイルが必要だった. さすがにこのままだと不便なので, まずはこの改良から取り掛かることにした.

改良の方針は以下のようにした.
  1. 初期値/各種条件の入力フォームを作成
  2. 物理量/数値誤差の表示欄を作成
  3. その他ログの表示欄を作成
  4. グラフ等の可視化は, Gnuplotで
  5. 【課題】OpenMPで並列化(主に逆行列ソルバー部分)
1~3をGUIで実装するつもりではあるが, 私はGUIプログラミングに対して, 苦手というか面倒臭いという思いが強かったため, 今まで手を出してこなかった(大学3年のころjava/swingで似たようなことして非常に面倒臭い思いをしたせいだろう).

そこで, 今回は以下の条件で自分に合った言語を見つけることにした.
  • マルチプラットフォーム対応
  • C言語と連携が可能
  • コーディングが簡単
ググっていろいろ放浪した結果, Tcl/Tkにたどり着いた. Tcl/Tkという単語は聞いたことあったが, 今まで触ったこと無かったし, 研究室で日焼けして色あせた入門書を見かけていたから, 単なる古臭い言語だとばかり思っていた.
しかし, インストールからHello Worldまでやってみたところで, お手軽にGUIを表示させられることを実感した. その時のメモを残しておく.

Tcl/Tkのインストール

mingw-getでインストール.
$ mingw-get update
$ mingw-get install mingw32-tcl mingw32-tk

Tcl/TkでHello World

適当に.
wm title . "Hello World"
wm geometry . "480x240"
label .label -text "Hello, World! with Tcl/Tk."
pack .label -side top -anchor w

Tcl/Tkスクリプトの実行

Tcl/Tkは, 「wish」コマンドを使うそうだ.
$ wish ./hello.tcl

実行結果

でた!

次は, C言語との連携にチャレンジ.

2013年9月12日木曜日

MinGWの備忘録

MinGWの設定とかをメモ.

インストーラのダウンロード

Download mingw-get-setup.exe

パッケージのアップデート/アップグレード

$ mingw-get update
$ mingw-get upgrade

【2013/10/17追記】
2013/10/04にアップされているインストーラ(mingw-get-setup)から仕様が変わったようだ. 2012/04/26のインストーラ(mingw-get-inst)でインストールしたMinGWには, mingw-getコマンドが含まれているが, 2013/10/04のインストーラからコマンドが含まれず、パッケージ管理用のGUIアプリケーションが別途インストールされるようになっている.
【2013/10/27追記】
2013/10/04のインストーラでインストールした場合, デフォルトではfstabが設定されていなかった.そのため, /mingw/binに何もマウントされていない状態になっていた.

minttyのインストール

$ mingw-get install msys-mintty
msys.bat起動時にminttyを使うには, 以下のようにする.
C:\opt\MinGW\msys\1.0\msys.bat --mintty

設定ファイルの作成

◆.profile
#-------------------------------------------------------------------------------
# read .bashrc
#-------------------------------------------------------------------------------
if [ -e ~/.bashrc ] ; then
 source ~/.bashrc
fi

◆.bashrc
#-------------------------------------------------------------------------------
# env
#-------------------------------------------------------------------------------
# for gettext
export OUTPUT_CHARSET=sjis

#-------------------------------------------------------------------------------
# alias
#-------------------------------------------------------------------------------
alias grep='grep --color'
alias ls='ls -hF --color --show-control-chars'
alias ll='ls -l'
alias la='ls -A'

◆.minttyrc
#
# Looks
#
## Theme : Monokai
Black=0,0,0
Red=229,34,34
Green=166,227,45
Yellow=252,249,30
Blue=196,141,255
Magenta=250,37,115
Cyan=103,217,240
White=242,242,242
BoldBlack=0,0,0
BoldRed=229,34,34
BoldGreen=166,227,45
BoldYellow=252,249,30
BoldBlue=196,141,255
BoldMagenta=250,37,115
BoldCyan=103,217,240
BoldWhite=242,242,242
##
Transparency=medium
#
# Text
#
Font=Consolas
FontHeight=11
FontIsBold=no
BoldAsFont=no
FontSmoothing=full
Locale=ja_JP
Charset=SJIS
#
# Window
#
Columns=95
Rows=35
#
# Terminal
#

◆.inputrc
# Key-bindings for the command-line editor.

# Ask before displaying >50 items
# Since $WINDIR $PATH var can be in $PATH, this could list
# all window exectables in C:\WINDOWS
set completion-query-items 50

# Ignore case for the command-line-completion functionality
# on:  default to a Windows style console
# off: default to a *nix style console
set completion-ignore-case on

# none, visible or audible
set bell-style audible

# disable/enable 8bit input
set meta-flag on
set input-meta on
# default
#set output-meta off
#set convert-meta on
# for Japanese
set output-meta on
set convert-meta off
set kanji-code sjis

# visible-stats
# Append a mark according to the file type in a listing
set visible-stats off
set mark-directories on

# Show all instead of beeping first
set show-all-if-ambiguous off

# MSYSTEM is emacs based
$if mode=emacs
 # Common to Console & RXVT
 "\C-?": backward-kill-line       # Ctrl-BackSpace
 "\e[2~": paste-from-clipboard    # "Ins. Key"
 "\e[5~": beginning-of-history    # Page up
 "\e[6~": end-of-history          # Page down
 
 $if term=msys # RXVT
  "\e[7~": beginning-of-line      # Home Key
  "\e[8~": end-of-line            # End Key
  "\e[11~": display-shell-version # F1
  "\e[15~": re-read-init-file     # F5
 $endif
 $if term=cygwin # Console
  "\e[1~": beginning-of-line      # Home Key
  "\e[4~": end-of-line            # End Key
 $endif
$endif

2013年9月11日水曜日

FirefoxやChromeでWebサイトへのショートカットをデスクトップに作成するには

ブックマークをうまく使いこなせない私は, IEでWebサイトへのショートカットを作りまくってしまう人なのだ(こういう人は未だに結構いるだろうと勝手に思っている).

そんな私には, FirefoxやChromeを使っているときに右クリックでショートカットを作れないことが不便に感じていた.

しかし, それは誤解だったようだ. ちゃんとショートカットを作成する機能があることを「mozilla support」で知った. アドレス横のアイコンをドラッグするだけとは・・・
しかもこれ, Chromeでもできるのね.

AWK版簡易 HTTP Server を MinGW/msysで実行

AWK Users JPで紹介されている「簡易 HTTP Server」をMinGW/msysで動作するか確かめてみた話.

紹介されているコードをそのまま実行して, 「http://localhost:8080/」にアクセスしてみたところ, ちゃんと動作することを確認できた.

Windows上でAWKの「inet」を使ったプログラムが動作することが分かって満足!

COREファイルの出力先

COREファイルの出力先についてよくわからないことがある.

COREファイルの出力先は, 「/proc/sys/kernel/core_pattern」に定義されており, RHEL6/CentOS6はデフォルトで以下のように定義されている.
|/usr/libexec/abrt-hook-ccpp <hogehoge>
<hogehoge>の部分はRHELとCentOSで異なっていた.
Linux2.6.19以降, 上記のようにCOREファイルをパイプ後方のプログラムの標準入力に渡すことができるようだ. この場合, 「abrt-hook-ccpp」というプログラムに渡している.
つまり, バグ報告プログラム「ABRT」にCOREファイルを渡すということが読み取れる.

ということは, COREファイルは「ABRT」に渡されるのだから, 実行ファイルと同じディレクトリには出力されなくなっているのではないだろうか?
ちょっと調べてみると, このページには, 実行ファイルと同じディレクトリにCOREファイルを出力するのであればcore_patternの記述を変更しなさいと書かれている(3. Ruling out ABRTのところ).

ところが, RHEL6.1がインストールされたとある環境では, core_patternで「ABRT」に渡しているのにもかかわらず, COREファイルが実行ファイルと同じディレクトリに出力されていた. もしかして「ABRT」が正常に機能していない場合は, 実行ファイルの場所に出力される仕様なのか?

【2013/09/12 追記】
以下のドキュメントを見つけた.

How to Enable Creation of Core Dump Files Due to Crashed Applications in Fedora Linux Distribution

この中に以下の記述がある.
$sysctl -a|grep core_pattern
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp /var/cache/abrt %p %s %u %c

“abrtd” creates a sub-directory (named something like “ccpp-1279914365-14618″) in the directory “/var/cache/abrt” as shown in the value of the variable. This also means that the core files will also be stored in that sub-directory in the “/var/cache/abrt” directory (in addition to the current directory where application was run). ABRT daemon also creates other files in addition to the core dump files in the sub-directory to further help users in debugging the crash issue.
 つまり, abrt-hook-ccppにパイプすると, 実行ファイルと同じディレクトリにCOREファイルを出力するのに加えて, バグレポート用にCOREファイルを「/var/cache/abrt/ccpp-<hoge>(RHEL6.1では, /var/spool/abrt/ccpp-<hoge>)」配下にも出力するということだ.

実際にプロセスをKILLしてみたところ, COREファイルが両方に出力されることを確認できた. この状態だとCOREファイルのサイズが倍になるということだから, 知らずにシステム設計してしまうと, ディスク使用量の見積もりを間違えて大変なことになるな.

2013年9月9日月曜日

セキュリティコンテキストの設定

SELinuxが有効になっているCentOS6上にpukiwikiを設置しようとして, セキュリティコンテキストの設定に手こずった.
SELinuxが有効になっている場合, とあるセキュリティコンテキストが設定されているディレクトリ配下のファイルには, セキュリティコンテキストが適切に設定されている必要があるようだ(経験上そうらしいというだけしか知らない).
SELinuxを無効にするのが手っ取り早いのだが, 悔しいのであえて有効のままやった.

手こずった経緯を書くのは面倒なので, 結論と注意事項くらいにまとめる.
今回, ドキュメントルートは「/var/www/html」とし, pukiwikiのディレクトリ名を「wiki」にして設置した. この場合, セキュリティコンテキストは以下のように設定する.
# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wiki/(attach|backup|cache|diff|wiki)(/.*)?"
# semanage fcontext -a -t httpd_sys_htaccess_t "/var/www/html/wiki/(.*/)?\.ht[^/]*"
# restorecon -R /var/www/html/
これでうまくいった.
「semanage」コマンドは, セキュリティコンテキストを定義するコマンドなのだが, デフォルトではインストールされていないので, 以下を参考にインストールしておく.

【参考】
RHEL 6: semanage SELinux Command Not Found

「restorecon」は, 定義したセキュリティコンテキストを適用するコマンド. このコマンドは, 私の環境にデフォルトでインストールされていた.ちなみに, 適用されたセキュリティコンテキストは「ls -Z」で確認することができる.
# ls -aZ /var/www/html/wiki
・・・
-rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_htaccess_t:s0 .htaccess
-rw-r--r--. apache apache system_u:object_r:httpd_sys_htaccess_t:s0 .htpasswd
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 COPYING.txt
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 INSTALL.txt
-rwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 README.en.txt.gz
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 README.txt
-rwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 UPDATING.en.txt.gz
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 UPDATING.txt
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 attach
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 backup
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 cache
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 counter
・・・
はじめ, セキュリティコンテキストをすべて「httpd_sys_content_t」で設定したら(/var/www/html/index.htmlがそうだったから), pukiwikiにアクセスしたときに以下のエラーがでてしまった.
Runtime error
Error message :

Directory is not found or not writable (DATA_DIR)
Directory is not found or not writable (DIFF_DIR)
Directory is not found or not writable (BACKUP_DIR)
Directory is not found or not writable (CACHE_DIR)
そこで, 「semanage fcontext -l | grep wiki」で調べたら, mediawiki用に「httpd_sys_rw_content_t」が定義されていたので真似をした. 「httpd_sys_htaccess」は, ググってたら見っけた.

備忘録ちゃんとつけようと思った

1年半くらいブログをほったらかしにしてしまった.

2012年度は, 仕事でめっためたにされて疲れてしまった(とは言うものの, いろいろ挑戦はしたし, 結構頑張ったと思う).

だけど, 2013年の9月になって, やっとブログ書こうかなって気になった.
備忘録ちゃんとつけて, 同じこと調べるといった無駄を省きたいと思った.

一時期Twitterを備忘録にしようと思ったけど, アレ流れちゃうから駄目だね.
ブログに書き散らして, wikiにまとめるって習慣をつけられるといいなぁ.