「Linux」タグアーカイブ

mlterm<->Xでの快適コピペ環境

PCの中では、当然Emacsが鎮座しているのですが、その他にもいろいろと立ちあげていまして、その中の一つがzsh on tmux on mlterm(ややこしい)です。 一時期、シェルもEmacsだろとか考えていた時期もありましたが、やはりzsh便利すぎなので、結局zshに落ちついています。

ただ、ここで困っていたのが、mltermとX上のアプリ間でのコピペでした。 うまくできなかったり、できたとしてもマウスを使わないとできなかったりとか悲しいことばかりです。

コピペを使わない人がいるはずもなく、先人達もいろいろと提案されています。

X環境のクリップボードやOS Xのペーストボードとtmuxのバッファを連携する方法 – Dマイナー志向
tmux のコピーモードを使ってみる – ようへいの日々精進 XP

ただ、どれも少し手間がかかります。コピペなどしょっちゅうする作業なので、あまり手間はかけたくないものです。

というわけで、マウスレスで手間のかからないコピペ環境をmlterm(上のtmux)<->Xで作ってみたので紹介します。

X->mlterm (mltermの設定)

~/.mlterm/key に次のように書いておけばCtl+y でPRIMARYの内容をmltermにペーストすることができます。

# Ctl+y で PRIMARY の内容をペーストする
Control+y=INSERT_SELECTION

mlterm->X (tmux, mltermの設定)

tmuxにはもともとcopy-modeが備わっています。このcopy-modeを使えば、マウスレスなコピペが可能になるはずです。

ただ、コピーした内容をX環境にも伝播させる必要があります。これにはmltermが対応している制御シーケンスのOSC52を使うこととします。

リモートの tmux でコピーした内容のローカルのクリップボードへの反映 | doda’s blog

.tmux.confには次のように書いておきます。

#コピーモードのキーバインドを設定
bind y copy-mode
# OSC52に対応させる
set-option -ag terminal-overrides ",mlterm:Ms=\\E]52;%p1%s;%p2%s\\7"

~/.mlterm/mainにも次のように書いておきます

##OSC52に対応させる
allow_osc52=true

これで、tmuxのコピーモードでコピーした内容がクリップボードにも渡されます。

PRIMARYをCLIPBOARDと同期させる

X環境はコピペのためにPRIMARY、SECONDARY、CLIPBOARDと3つもバッファを持っています。mltermはPRIMARYしか使っていないのですが、PRIMARYはペーストに中クリックしか使えなかったり不便極まりないので、CLIPBOARDにもその内容を同期させます。

同期には autocutsel というツールを使います。

sigmike/autocutsel

debianやArchLinuxではパッケージになっているようですので、比較的簡単に導入できるかと思います。

インストールが完了したら、.xinitrcあたりに以下のように書いといて autocutsel による同期が自動的に始まるようにしておきます。

if [ -x /usr/bin/autocutsel ]; then
    autocutsel -selection CLIPBOARD -fork
    autocutsel -selection PRIMARY -fork
fi

これでまたひとつマウスが文鎮に近づきました。

Appendix:Emacsとクリップボードバッファ

EmacsでPRIMARY、CLIPBOARDにコピーするには次のようにしておくと良いみたいですよ。

(setq x-select-enable-clipboard t)
(setq x-select-enable-primary t))

UbuntuからArch Linuxへ宗旨替えしてからしたことまとめ

実は昨年の末頃から自宅のマシンは徐々にArch Linuxへ移行してたのですが、いろいろと忘れないうちにここらへんできちんと整理しておこうかなと。

インストール作業に関する情報はかなり見かけますのでここでは、はまったとことか細々としたTipsを書き留めておこうと思います。

Ubuntuをやめた理由

Unityがひどいといった理由を見かけますが、そもそもUbuntu使ってた頃からWMはawesomeだったので全く気にかかりませんでした。

Ubuntuをやめようと思った決定的理由はアップグレードの安定性のなさでした。Ubuntuでは半年ごとにアップグレードが来るのですが、すんなりアップグレードが完了することは一度もなく、ひどい時は再インストールすることもありました。

だんだん回数を重ねるたびに知恵がついてきて、リリースしてしばらく間を置いてからアップグレードした方が良いのではなどいろいろ試してみましたが、あんまり効果はなかったような気がします。 そもそもアップグレードしないという選択肢も当然あるわけですが、新しいもの好きな性格が災いしてついアップグレードしたくなってしまうのです。

ここ最近のアップグレードではアプリの安定性も悪くなってきてました。常用しているmltermとtmuxを併用するとmltermがなぜか落ちるという謎の現象が発生していて、こういった些細な問題もイライラを募らせていた原因だったように思います。

ArchとGentooが残った

というわけで、Ubuntuをやめようと決心、次は宗派の選定です。まず、Gentoo。twitterでGentooという言葉を見かけることが度々あって気になっていました。

それとArch Linuxにも興味がありました。Linux関連の情報を集めているとしばしばArch wikiに行き着くことが多くて、漠然と気になっていました。

そこでTwitter上でいろいろな方からご意見いただきまして、結局Arch Linuxに入信することにしました。

Gentooにしなかった理由ですが、やはりほとんどコンパイルというのはつらいなーと思いました。 常用しているアプリなどはいろいろと手を加えてコンパイルしたいという気持はとてもよくわかるのですが、Xとかベーシックなとこまでコンパイルとなると、デスクトップ用途で使うのにはちょっと気がひけました。

インストールするマシンにスペックが低いものがあったのもGentoo導入の障害でした。気の短い性分のため寝ている間にコンパイルなんてとてもできそうにありませんでした。

というわけで、Arch Linuxをインストールすることと相成りました。次からは実際の作業で知った、気づいたことを書き連ねていきます。

GPTを使うならArchbootがおすすめ

今回Arch Linuxをインストールしたマシンはデスクトップ1台、ラップトップ2台の計3台。ラップトップの2台についてはSSDだったので、まずはArch wikiでSSDについて調べてみるとGPT使うといいよーなことが書いてありました

Solid State Drives – ArchWiki

よくわかりませんが良さそうです。というわけでGPTを使うことにしたのですが、GPTを使うとbootloaderは必然的にGRUB2となってしまいます。ところが、Arch Linuxの標準インストーラにGRUB2が選択肢になく、いろいろと面倒なことをしないといけなさそうです。

Arch LinuxをGPT + Grub2でインストールを行う: くしゃみ日記

面倒くせーなーといろいろ調べていると、標準インストーラにいろいろと手が加えられたArchbootというものがあるということを発見しました。

Archboot – ArchWiki

これだと、GRUB2のインストールも楽そうです。最新の変更に追随しているようなので、インストール後のアップデートによるトラブルも減らせるかもしれません。

.fonts.confの設定が反映されない。

ホームデイレクトリの.fonts.confをいぢるのですが、全然反映されません。どうやら/etc/fonts/conf.d/50-user.conf というのがないといけないようです。

それとこのディレクトリはフォントをインストールしたりする時にしょっちゅう更新されるので、注意。フォントがなんか変だな、という時は/etc/fonts/conf.d/にあるconfを確認してみましょう。

flashが文字化け

当然flashも使えるのですが、うちの環境だと文字化けしてしまいました。どうやらインストールしているフォントとシステムフォントの設定で文字化けが起きるみたいです。 うちの環境ではシステムフォントをVlゴシックにすると正しく表示されるようになりました。

(早くflashなくならないかな。。。)

skksearchがない

skkはサーバ派です。Ubuntuでは、skksearchを使わせてもらってたのですが、Archではパッケージがありません。はて、どうしようかといろいろ見ていましたらyaskkservというskkサーバを発見しました。

wac’s webpage./yaskkserv
AUR (en) – yaskkserv

独自辞書を作る手間はありますが、google Japanese Input との連携があったりととても面白そうです。何よりすでにAURにPKGBUILDがあるので、インストールがとても楽。というわけで、なんの憂いもなく移行しました。

Linux版窓使いの憂鬱がDAEMONで起動しない

SandSを使っています。Linuxで実現するにはいろいろと方法があるのですが、Windowsで使っていることもあり、Linux版窓使いの憂鬱を使わせてもらってました。

窓使いの憂鬱 Linux & Mac (Darwin) 対応版とか配布してるところ

さすがにLinux版窓使いの憂鬱のPKGBUILDはなかったので、PKGBUILDをちょろちょろと書いてインストール。rcスクリプトまでこさえたのですが、DAEMONSにいれても全く起動してくれませんOrz

手動で起動してあげれば使えるのですが、起動するたびにいちいち立ちあげるのもめんどくさいので、代替のアプリを探すとat-home-modidfierというものを発見しました。

At home modifier – Gitorious
AUR (en) – xf86-input-evdev-ahm-git

こちらもAURがすでにあるのでインストールはとても楽。SandSの設定も簡単なので、楽に移行できました。

トラックポイントでスクロール

Ubuntuでも度々手間がかかっていたこ問題。Archでも同じように/etc/X11/xorg.conf.d/20-thinkpad.conf に次のように書いておけば良いみたいです。

Section "InputClass"
   Identifier   "Trackpoint Wheel Emulation"
   MatchProduct "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device"
   MatchDevicePath  "/dev/input/event*"
   Option       "EmulateWheel"      "true"
   Option       "EmulateWheelButton"    "2"
   Option       "Emulate3Buttons"   "false"
   Option       "XAxisMapping"      "6 7"
   Option       "YAxisMapping"      "4 5"
EndSection

トラックポイントの速度調整

これもUbuntuでやってた設定。UbuntuだとGUIツールもあったのですがArchでは /etc/rc.local に次のように書いて凌いでます。

echo -n 230 > /sys/devices/platform/i8042/serio1/speed
echo -n 230 > /sys/devices/platform/i8042/serio1/sensitivity

音関係

もともとALSAが入っているのでaudioグループにユーザを追加すれば使えるようになります。

gpasswd -a yourusername audio

ただ、インストールした時はミュートになっていることに注意。alsamixerなど使って音量を設定しましょう。

デスクトップはALSAで問題なかったのですが、奥様機であるラップトップのx40はなぜか音が鳴りませんでした。というわけで、x40にはOSSをインストール。OSSについてはWikiに詳しく書いてあるので、そちらを参考にすればつまずくこともなく設定できました。

Open Sound System – ArchWiki

R関連

Rもパッケージになっています。「R」という何のひねりもないパッケージ名ですので探すのも楽です。

RのライブラリもいくつかAURにあります。

AUR (en) – Search Criteria: R-cran

また、cran2archというPythonスクリプトはcranにあるパッケージからPKGBUILDを生成してくれますので、これを使ってABSにパッケージ管理を統一しても良いかもです。

AUR (en) – cran2arch
master/cran2arch

Arch wikiをローカルに保存しておきたい

Arch Linuxについて調べているとWikiの情報量の膨大さにびっくりします。この膨大な情報、オフラインでも見れたら良いなと思うのはどうやら僕だけではないらしく。すでにパッケージングされています。

Arch Linux – arch-wiki-docs 20111219-1 (any)

これでgrepなり何なりで快適に探しものができますね。

Emacsのpkgbuild-mode

Arch Linuxでは、すでにかなりのアプリがパッケージングされているのですが、中にはLinux版窓使いの憂鬱などまだパッケージングされていないものもあったりします。そんな時はPKGBUILDを書くことになるのですが、そこはEmacs、すでにPKGBUILD用のモードがありました。

juergenhoetzel/pkgbuild-mode

これで、ガシガシPKGBUILDが書けますね!!

インストール後の感想

普段使いの状況に戻すまで手こずりましたが、慣れてしまえばとても楽です。

確かにUbuntuはインストールが終わってすぐ使えるディストロとしてはとても素敵ですが、自分のこだわりを追求すると途端にめんどくさくなります。その点、Arch LinuxはオレオレPKGBUILDさえ書いてしまえば、野良ビルドにも全く手間はかかりません。

即座に自分の普段使いの環境に戻すことができるので、トータルで見るとUbuntuより環境設定にかかる時間は短かくなった気がします。

また、低スペックマシンにも優しいのかなという気がしました。奥様用のThinkpad x40には LXDE on Arch Linuxを入れたのですが、以前使っていた fluxbox on Ubuntuよりもサクサク動くようになって、とても喜んでいます。というわけで、奥様にも優しいディストロ、Arch Linuxなのでした。

Arch Linux Handbook 2.0: A Simple, Lightweight Handbook

出版社:Createspace( 2010-10-13 )

定価:¥ 1,481

Amazon価格:¥ 160,518

ペーパーバック ( 187 ページ )

ISBN-10 : 1453807683

ISBN-13 : 9781453807682


gitやめてmercurialとtortoiseHGをインストール

いろいろとgitについてお勉強してきたのですが、今の自分の環境で運用するのはかなり面倒くさそうな気がしてきました。
というのも、自宅PCはubuntuなのですが、職場の環境はルールでwindows限定。win環境にはMSYSGITとかTortoiseGITとかもあるのですが、開発途中だったりバギーだったりと使い勝手がイマイチ・・・
それと致命的なのが職場のネット環境。セキュリティ上proxy経由で、しかもHTTP意外のポートで外に出られなくなっているので、githubとやりとりしようもんならトンネリングなりいろいろとしないといけなさそう。といかwinでトンネリングができるかも実は定かでない。おいおい、したら自宅からでしかpushできんし。というわけで、gitを運用するのは諦めることにしました。んで、どういう人がgitを使ってはいけないか、独断と偏見でまとめてみると・・・

gitを使ってはいけない人

・環境がwinか、Linuxとかwinとか混在している人。win環境で運用するには、かなりいろいろと障害がありそう。
・ネットワークにいろいろ制限がある人。少なくともsshが問題なく使えないと、いろいろとめんどくさそう。
・CUIに抵抗がある人。git、かわいいよgitなんて言ってる人にそんな人いないと思いますが、Tortoisehogehogeとかにお世話になってる人が使い出すと膨大なオプションとかを使うには結局コマンド手打ちしないといけないので、面倒くさくなりそう。
・手数が多くなってもいいので、覚えるコマンドは少ない方がいい人。gitはいろいろと便利なコマンドがあるんだけど、あまりにいろいろあって覚えるのが結構大変。

これにかなり当てはまる人は、 gitの運用は考えた方がいいかも。改めて整理してよくわかったんだけど、gitってwinとは無縁な(まさしくLinusのような)人のためのシステムだと思いました。

Mercurial入れてみる

というわけで、Mercurial入れてみます。Mercurialはpythonで動く(一部C言語)でgitと同じく分散型バージョン管理システム。決め手はやはりめんどくさいことしなくてもhttpでいけるという点。google codeがMercurialを採用した理由にもあげられていますが、これはかなり大きいんではないかと思います。というか、なんでgitはそういう仕様になってないんだろう。インストールはgitよりかは少し面倒くさいですが、ubuntu環境ならばそんなに手数はかかりません。

[cpp]
sudo apt-get install build-essential gcc python-dev
sudo apt-get install python setuptools
easy_install -U Mercurial
[/cpp]

ちなみに、Mercurialはapt-getでもインストールできますがubuntu9.04でもバージョンがちと古いのでeasy_installで入れた方が良さそうです。

tortoiseHGを入れてみる

MercurialのGUIツールとしては、tortoiseHGが公開されています。tortoiseHGはMercurialと同じくpythonで実装されているよう。ということで、マルチプラットフォームで使うことができる素晴らしいツールでwinのエクスプローラを使うようにnautilusの右クリックメニューから操作ができます。winにはexeが公開されているし、redhat系にはrpmもあります。debは、今のところ公開されていないですが、インストールはレポジトリでソースコード落としてきて、そこにnautilusに該当するファイルのシンボリックリンクをつけるだけ。

[cpp]
sudo apt-get install python-nautilus
mkdir -p ~/src/ && cd ~/src
hg clone https://bitbucket.org/tortoisehg/stable tortoisehg
mkdir -p ~/.nautilus/python-extensions/
ln -s ~/src/tortoisehg/contrib/nautilus-thg.py ~/.nautilus/python-extensions/
[/cpp]

んで、再起動かければubuntuでもtortoiseHGが使えるように。使用した感じもwin版と全く変わりません。

Mercurialに対応したホスティングサイト

google code
まずは、大店google code。git対応に先んじてMercurialに対応しています。

bitbucket
githubにそっくりなホスティングサイト。ただ、githubは無料版だとクローズドソースなレポジトリは使えないのに対して、bitbucketは一つまでクローズドソースなレポジトリを作れるよう。以前は日本語コメントがが文字化けするようですが、今は問題なく使えそう。
また、文字化けしてしまうようになってます。
freeHG
こちらは、ホスティングサービスでもあり、ホスティングツールとしても使える。ただ、日本語は文字化けするみたい。あと、ちょくちょく落ちててあまり安定してないようです。

まとめ

セキュリティからすれば、問題はあるかもしれないですが、やっぱhttpで通信できるのは、win環境ではお気楽です。それと環境を選ばずにtortoiseHGというツールが使えるのも大きな魅力。gitに挫折したものの分散型バージョン管理システムを使ってみたいという方は試してみるといいかもです。

参考にしたサイト

UnixInstall – Mercurial
tortoisehg / stable / wiki / nautilus — bitbucket.org

入門Mercurial Linux/Windows対応 入門Mercurial Linux/Windows対応
藤原 克則

秀和システム 2009-01
売り上げランキング : 30713

Amazonで詳しく見る

ESS(Emacs Speaks Statistics)のチートシート作った

Rいじるときは専らESS on Emacs(Meadow)使うのですが、キーバインドが大量にあるので、なかなか覚えきれません。
しかも、ESSはESSモード、iESSモード、さらにはrdiredモードと複数のモードを並行して使うのでいちいちC-h bなんかしてるとバッファがぐちゃぐちゃしてきて、かなりイヤです。
というわけで、チートシート作ってみました。

A4の紙に印刷するのを想定してます。机の前とか下敷きとかにはさんでおくと良いかも。ディスプレイがでかければ、壁紙にもできるかも。
というわけで、おい、あのキーバインドが抜けとるがな、なツッコミよろしくです。
あと、原盤はgimpで作っています。手前でカスタムしたいという方がいらしたら、xcfファイルも公開しますのでご連絡を。

参考にしたサイト

Emacs クイックリファレンス
ESS – RjpWiki
Emacs Speaks Statistics

今週の気になるアレJuly 11th

twitter (feed #2)
今日の平成教育学院はおもしろかった [#]
delicious (feed #4)
googlereader (feed #6)
IT土方に未来は無い を共有しました。
delicious (feed #4)
delicious (feed #4)
delicious (feed #4)
delicious (feed #4)
6章 グラフと図形の表示 を共有しました。
delicious (feed #4)
2009-03-16 – bettermanの日記 を共有しました。
delicious (feed #4)
2008-02-26 – j-kyodaのつぶやき を共有しました。
delicious (feed #4)
delicious (feed #4)
twitter (feed #2)
サンフランシスコからブツが届いた [#]
twitter (feed #2)
今年は扇風機で凌いでみせる [#]
twitter (feed #2)
そろそろ寝るか [#]
googlereader (feed #6)
2 件のリンクを共有しました。
googlereader (feed #6)
VLC 1.0.0 リリース を共有しました。
delicious (feed #4)
delicious (feed #4)
googlereader (feed #6)
delicious (feed #4)
Stratini :: Firefox Add-ons を共有しました。

matplotlib使ってRichards成長曲線を描く

matplotlibはpythonで使うグラフ描画ライブラリ。
今回は、こいつを使って、ちょっとグラフ描きの練習のため、Richards成長曲線を描かせてみました。
とはいうものの、matplotlibのドキュメントは、全部で800頁、しかもNumpyというモジュールにばり依存しているので、そっちも理解しないといけまてん。
結構大変です。
というわけで、いきなりソースコードどん。

[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pylab import *
import math
import numpy

x = range(1,100)
y = []

for richardv in x :
outy = 40*(1 – math.exp(-0.05*richardv))**1.5
y.append(outy)

x = numpy.array(x)
y = numpy.array(y)

plot(x,y)
savefig(‘richards.png’, dpi=150)
show()

[/python]

これを実行するとこんなのが出てくるはず。

一発目にしては結構すんなり書けた気がする。
ちなみに同じことをRで書くと・・・・

[cpp]
x <- c(1:100)
line <- function(x) {40*(1 – exp(-0.05 * x))**1.5}
plot(x,line(x),col="white")
lines(x,line(x),col="blue",lwd=3)
[/cpp]

・・・
やっぱRって、すげっす。

引越します

といっても、この日記書いてるサーバの話。しかも、デザインとかまったく同じやし。しかし、自宅サーバにしたので表示がかなり速くなりました。

というわけで、明日からは↓の自鯖で日記書きます。
今後ともごひいきに願います。

 新sheephead日記

weekly Digest for June 28th

delicious (feed #4)
10:42pm via Delicious
delicious (feed #4)
12:37am via Delicious
delicious (feed #4)
7:30am via Delicious
delicious (feed #4)
8:32am via Delicious
delicious (feed #4)
8:56am via Delicious
googlereader (feed #5)
7:08pm via Google Reader
googlereader (feed #5)
9:52pm via Google Reader
delicious (feed #4)
12:40am via Delicious
googlereader (feed #5)
10:26am via Google Reader
lastfm (feed #2)
5 曲を聴きました。
6:37pm via Last.fm
googlereader (feed #5)
9:30pm via Google Reader
delicious (feed #4)
3:09am via Delicious
delicious (feed #4)
5:41pm via Delicious
lastfm (feed #2)
22 曲を聴きました。
5:48pm via Last.fm
delicious (feed #4)
8:10pm via Delicious
delicious (feed #4)
7:59pm via Delicious
delicious (feed #4)
6:37am via Delicious
delicious (feed #4)
12:03pm via Delicious
delicious (feed #4)
10:01pm via Delicious
delicious (feed #4)
11:13pm via Delicious
lastfm (feed #2)
3 曲を聴きました。
10:15am via Last.fm
googlereader (feed #5)
7:18pm via Google Reader

wxglade使ってpythonのGUI

なかなか、進まないpythonアプリに手を付けてみることに。 肝心の中身のアルゴリズムは、まだなんも考えてないんだけど、ガワの部分はだんだんと目処が立ってきたっぽい。 とりあえず、気づいたことメモしとく。

・ソースコード中の# begin wxGlade: extracodeと# end wxGladeの間に書いた部分は後でgenerate codeしても消えない。ウィジェットで叩くイベントとかは、この間に書くと良い。

・wxgladeがはくwxgなるファイルはxmlみたくなっていて、そっちを編集してもいけそう。ただ、変なとこいぢるとwxgladeで開けられなくなるので、いぢりすぎは禁物。 いちお、長たらしいけどコードも貼っとく。

[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Mon Jun 22 16:20:41 2009

import wx
import wx.grid

# begin wxGlade: extracode
# end wxGlade

class Myforman(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Myforman.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.sizer_2_staticbox = wx.StaticBox(self.panel_1, -1, "")

# Menu Bar
self.kforman_menubar = wx.MenuBar()
wxglade_tmp_menu = wx.Menu()
self.kforman_menubar.Append(wxglade_tmp_menu, _(u"ファイル"))
wxglade_tmp_menu = wx.Menu()
self.kforman_menubar.Append(wxglade_tmp_menu, _(u"ヘルプ"))
self.SetMenuBar(self.kforman_menubar)
# Menu Bar end
self.label_6 = wx.StaticText(self.panel_1, -1, _(u"人工林資源予測システム"))
self.label_1 = wx.StaticText(self.panel_1, -1, _("formak"), style=wx.ALIGN_CENTRE)
self.button_2 = wx.Button(self.panel_1, -1, _(u"林分情報入力画面"))
self.button_1 = wx.Button(self.panel_1, -1, _(u"立木情報入力画面"))
self.button_3 = wx.Button(self.panel_1, -1, _(u"将来の間伐率入力画面"))
self.button_4 = wx.Button(self.panel_1, -1, _(u"シミュレート"))

self.__set_properties()
self.__do_layout()
# end wxGlade

self.button_2.Bind(wx.EVT_BUTTON, self.Showframe2)
self.button_1.Bind(wx.EVT_BUTTON, self.Showframe1)

def Showframe1(self,e):
win = Myforman1(self,-1)
win.Show()

def Showframe2(self,e):
win = Myforman2(self,-1)
win.Show()

def __set_properties(self):
# begin wxGlade: Myforman.__set_properties
self.SetTitle(_(u"人工林資源予測システム formak"))
self.button_2.SetMinSize((150, 30))
self.button_1.SetMinSize((150, 30))
self.button_3.SetMinSize((150, 30))
self.button_4.SetMinSize((150, 30))
# end wxGlade

def __do_layout(self):
# begin wxGlade: Myforman.__do_layout
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2 = wx.StaticBoxSizer(self.sizer_2_staticbox, wx.VERTICAL)
sizer_2.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
sizer_2.Add(self.label_1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 8)
sizer_2.Add(self.button_2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
sizer_2.Add(self.button_1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
sizer_2.Add(self.button_3, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
sizer_2.Add(self.button_4, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
self.panel_1.SetSizer(sizer_2)
sizer_1.Add(self.panel_1, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 8)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
self.Centre()
# end wxGlade

# end of class Myforman

class Myforman1(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Myforman1.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)

# Menu Bar
self.frame_1_menubar = wx.MenuBar()
wxglade_tmp_menu = wx.Menu()
self.frame_1_menubar.Append(wxglade_tmp_menu, _("item"))
wxglade_tmp_menu = wx.Menu()
self.frame_1_menubar.Append(wxglade_tmp_menu, _("item"))
self.SetMenuBar(self.frame_1_menubar)
# Menu Bar end
self.grid_1 = wx.grid.Grid(self, -1, size=(1, 1))

self.__set_properties()
self.__do_layout()
# end wxGlade

def __set_properties(self):
# begin wxGlade: Myforman1.__set_properties
self.SetTitle(_(u"立木情報入力画面"))
self.grid_1.CreateGrid(30, 3)
self.grid_1.SetColLabelValue(0, _(u"個体番号"))
self.grid_1.SetColLabelValue(1, _(u"胸高直径"))
self.grid_1.SetColLabelValue(2, _(u"樹高"))
self.grid_1.SetMinSize((400,500))
# end wxGlade

def __do_layout(self):
# begin wxGlade: Myforman1.__do_layout
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3.Add(self.grid_1, 1, wx.EXPAND, 0)
self.SetSizer(sizer_3)
sizer_3.Fit(self)
self.Layout()
# end wxGlade

# end of class Myforman1

class Myforman2(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Myforman2.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.label_2 = wx.StaticText(self, -1, _(u"樹種名nカタカナで記入してください。"))
self.text_ctrl_5 = wx.TextCtrl(self, -1, "")
self.label_3 = wx.StaticText(self, -1, _(u"林齢n半角数字で記入してください"), style=wx.ALIGN_CENTRE)
self.text_ctrl_6 = wx.TextCtrl(self, -1, "")
self.label_4 = wx.StaticText(self, -1, _(u"ha当たりl立木本数n半角数字で記入してください。n"))
self.text_ctrl_7 = wx.TextCtrl(self, -1, "")
self.label_5 = wx.StaticText(self, -1, _(u"備考nその他特記すべきことを書いてください"))
self.text_ctrl_1 = wx.TextCtrl(self, -1, "")
self.button_5 = wx.Button(self, -1, _("O K"))

self.__set_properties()
self.__do_layout()
# end wxGlade

def __set_properties(self):
# begin wxGlade: Myforman2.__set_properties
self.SetTitle(_(u"林分情報入力画面"))
self.label_2.SetForegroundColour(wx.Colour(255, 255, 255))
self.label_3.SetForegroundColour(wx.Colour(255, 255, 255))
self.label_4.SetForegroundColour(wx.Colour(255, 255, 255))
self.label_5.SetForegroundColour(wx.Colour(255, 255, 255))
# end wxGlade

def __do_layout(self):
# begin wxGlade: Myforman2.__do_layout
grid_sizer_1 = wx.GridSizer(5, 2, 2, 6)
grid_sizer_1.Add(self.label_2, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_5, 0, 0, 2)
grid_sizer_1.Add(self.label_3, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_6, 0, 0, 2)
grid_sizer_1.Add(self.label_4, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_7, 0, wx.ALL, 2)
grid_sizer_1.Add(self.label_5, 0, 0, 0)
grid_sizer_1.Add(self.text_ctrl_1, 0, 0, 2)
grid_sizer_1.Add(self.button_5, 0, wx.RIGHT|wx.ALIGN_RIGHT, 0)
self.SetSizer(grid_sizer_1)
grid_sizer_1.Fit(self)
self.Layout()
# end wxGlade

# end of class Myforman2

class MyApp(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
kforman = Myforman(None, -1, "")
self.SetTopWindow(kforman)
kforman.Show()
return 1

# end of class MyApp

if __name__ == "__main__":
import gettext
gettext.install("app") # replace with the appropriate catalog name

app = MyApp(0)
app.MainLoop()

[/python]

起動するとこんな感じ。


うちのubuntuで動かすとこんな感じ。 OSXは試してないけど、多分動くと思います。今のところはマルチプラットフォーム。てかwinのフォントしょぼいな。
今後の問題としては・・・

・winでは、python,wxpythonをインストールしないといけないので、ちと面倒くさい。できればフローズンバイナリにしたい。

・グラフをどうやって書こう。gnuplotとかRとかpychartとかmatplotlibとかいろいろありそう。できればRにrpyって方法がなれてるからいいんだけど、いろいろバギーな気がする。matplotlibあたりが手堅いか?

・wxpythonは印刷まわりがかなり弱そう。となるとHTMLに書き出してブラウザで開いて印刷??なんかいい方法ないかなー

うちのサーバにPlone入れてみたよ

最近、うちのお古PCをサーバにしたもの、放置ぎみだったので久しぶりにいぢってみました。
入れてみたのは、Plone。いわゆるCMSってやつですな。
Ploneはpythonで動くzopeの中で動くアプリケーション。ややこしいですが、とりあえずベースはpython。

インストールは、すごく簡単。とりあえず、こっちのサイトから落としてきたやつの中にあるシェルスクリプトを実行するだけ。
とかいいながらも、apacheから飛ばすのは結構めんどかったのですが、それはいずれまとめるとして。

とりあえず、うまく稼働させることができました。サイト名はyet another sheephead

はっきり言って、ぱっと見ただのwikiですが、ちょっとすごいのがplone稼働させた段階でftpサーバとwebDAVサーバが入ってるんですな。
実は、うちの職場のネット環境80番ポート意外がことごとく閉じられていて、sshはおろか、ftpも使えないのです。というわけで、httpで通信してくれるwebDAVはオンラインストレージとしてもかなり便利。しばらくは、備忘録と物置代わりに使う予定です。

後は、この日記も自宅サーバにお引越しすれば完璧なんだけどなーーー。また、URLも変わるし、お引越し作業もめんどいし。
でも、使わせてもらってるサーバかなりもっさりなんですよね。ま、ただで使わせてもらってる身分でどーのこーのゆーつもりはないけど。
むーとりあえず、今の状態がベターか。