2015年3月7日土曜日

Stumpwmを使おうと思ったけどやめた話

先日 http://sourceforge.jp/projects/tilingwm/wiki/FrontPage やらawesomeを使っている友人やらに感化されてタイル型ディスプレイマネージャーを使ってみようとおもった。その中でもStumpwmが(Emacsみたいに)拡張性が高そうで良さそうに感じたのでしばらく軽く使ってみた。そこで起こったいくつかの問題とか思ったことを書いてみる。

日本語入力がうまく行かない -> cjkみたいなimを使わないと生きていけない人の情報が少ない

ibus+mozcをここ何年か使っている。別にibusにこだわりがあるわけではないがとりあえずibusを使ってみようと思ったらどうにも入力ができていない。stumpwmについてはwikiとかに色々な情報があるにはあるが如何せんimを使う文化圏の人の情報が多くなくてibusとかについては調べてもだいぶ古い情報しか見つからなかった。やはり利用者がそれなりにいるor日本語ユーザの書いたドキュメントがある環境でないと辛いなと感じたときでした。(そういえば僕はこんな感じの理由で永らくVine Linuxを使ってましたね。今はArch Linuxを使っていますが。)

Commom Lisp環境についての知識がないとそんなに幸せになれない

僕はLisperではないです。Lisperではないですが、学科の課題でScheme処理系をSchemeで書いたりEmacs Lispの設定を書いたりするくらいにはLispは書けます。Common Lispも昔若干書いたことがあるので書けなくはないです。だからStumpwmを使おうかと思いました。しかしQuicklispとかasdfとかそういったCommon Lispを取り巻く周辺事情については全く知りません。Stumpwmにmoduleを追加したりしようと思ったらどうしてもその辺の知識が必要になるようです。Lisperになりたいなら勿論こういったことを勉強すればいいと思いますが、僕はLisperではなくて結局Unix文化圏の人でLispも書けなくはないくらいの人です。Window Managerを使うためにCommon Lispの世界に足を突っ込むのは割に合うのかと考えてしまった瞬間に僕は colon quitしてgnomeを開きました。gnomeはJavaScriptを知らなくても動きます。

つまり何を思ったか

僕はawkとかCとかbashとかが好きなUnix文化圏の人であってLisp文化圏の人ではない(と思っている)ので慣れない世界のものを中途半端に取り入れるのは辛いなあと。(そのくせEmacsは使ってるんだよなあ…)面白そうではあるのでしっかり時間が取れるときにちゃんと勉強したいなあと。

2015年2月20日金曜日

.emacs.dを書き直す会 第一弾

ここのところ.emacs.dの秘伝のタレ化が進んで非常に汚く、重くなってきたので.emacs.dを書き直した。第一弾として特定のモードに依らない設定を書いた。

package.el(melpa)

Emacs 24からデフォルトで入るようになったpackage管理。非常に便利なので引き続き使う。公式レポジトリだけだと足りないのでmelpaも追加する。marmaladeは以前は入れていたがひとまず入れないでみる。

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize) 

init-loader

設定ファイルを分散して書けるようなもの。.emacs.d/inits以下に設定ファイルを書くと、辞書順に呼ばれる。

(require 'init-loader)
(init-loader-load)

twittering-mode

emacsからtweetするために必要。普段も使っていた。いつでも呟ける様にキーバインドを設定しておく。

(require 'twittering-mode)
(global-set-key "\C-xt" 'twittering-update-status-interactive)

appearance

特定のモードではなく背景色とかそういうもの。以前はXのクリップボードとemacsのコピーが同期されるようなものも書いていたが気がついたら勝手に同期されるようになっていた。背景色はthemeとかを使おうかと思ったが良さそうな色がなかったので”秘伝のタレ”を取り出した。

;;背景色の設定
( when window-system 
  (custom-set-faces
   '(default ((t
           (:background "#000040" :foreground "#e0e0e0")
           )))
   '(cursor ((((class color)
           (background dark))
          (:background "#00AA00"))
         (((class color)
           (background light))
          (:background "#999999"))
         (t ())
         ))))

;; フレーム透過設定
(add-to-list 'default-frame-alist '(alpha . (0.75 0.75)))
;; tool-barを消す
(tool-bar-mode 0)

;; C-h でbackspaceにする
(global-set-key "\C-h" 'delete-backward-char)

;; 括弧を強調表示
(show-paren-mode t)

helm

色々と便利な子。こいつがいないともうファイルも開けない。設定がよくわからなかったのでここも”秘伝のタレ”。

(when (require 'helm-config nil t)
  (helm-mode 1)

  (define-key global-map (kbd "M-x")     'helm-M-x)
  (define-key global-map (kbd "C-x C-f") 'helm-find-files)
  (define-key global-map (kbd "C-x C-r") 'helm-recentf)
  (define-key global-map (kbd "M-y")     'helm-show-kill-ring)
  (define-key global-map (kbd "C-c i")   'helm-imenu)
  (define-key global-map (kbd "C-x b")   'helm-buffers-list)

  (define-key helm-map (kbd "C-h") 'delete-backward-char)
  (define-key helm-find-files-map (kbd "C-h") 'delete-backward-char)
  (define-key helm-find-files-map (kbd "TAB") 'helm-execute-persistent-action)
  (define-key helm-find-files-map (kbd "C-z") 'helm-select-action)
  (define-key helm-read-file-map (kbd "TAB") 'helm-execute-persistent-action)

  ;; Disable helm in some functions
  (add-to-list 'helm-completing-read-handlers-alist '(find-alternate-file . nil))

  ;; Emulate `kill-line' in helm minibuffer
  (setq helm-delete-minibuffer-contents-from-point t)
  (defadvice helm-delete-minibuffer-contents (before helm-emulate-kill-line activate)
    "Emulate `kill-line' in helm minibuffer"
    (kill-new (buffer-substring (point) (field-end))))

  (defadvice helm-ff-kill-or-find-buffer-fname (around execute-only-if-exist activate)
    "Execute command only if CANDIDATE exists"
    (when (file-exists-p candidate)
      ad-do-it))

  (defadvice helm-ff-transform-fname-for-completion (around my-transform activate)
    "Transform the pattern to reflect my intention"
    (let* ((pattern (ad-get-arg 0))
           (input-pattern (file-name-nondirectory pattern))
           (dirname (file-name-directory pattern)))
      (setq input-pattern (replace-regexp-in-string "\\." "\\\\." input-pattern))
      (setq ad-return-value
            (concat dirname
                    (if (string-match "^\\^" input-pattern)
                        ;; '^' is a pattern for basename
                        ;; and not required because the directory name is prepended
                        (substring input-pattern 1)
                      (concat ".*" input-pattern)))))))

日本語入力

日本語入力は普段\C-\ではなく[変換/無変換]を使っているのでその辺の設定をまずする。(2015/02/25修正)Emacs 24.3以降でinactive-input-methodがobsoleteになったので修正した。

;; IMEの設定
(define-key global-map [zenkaku-hankaku] 'toggle-input-method)
;; 変換キーでIME ON
(define-key global-map [henkan]
  (lambda ()
    (interactive)
    (if current-input-method (deactivate-input-method))
    (toggle-input-method)))

;; 無変換キーでIME OFF
(define-key global-map [muhenkan]
  (lambda ()
    (interactive)
    (deactivate-input-method)))

次にmozcの設定。

;; mozc
(require 'mozc)
(setq default-input-method "japanese-mozc")

auto-complete

コードを書くときとかにいい感じで補完してくれる子。emacs lispを書くにもこれがないとつらい。Cとか特定の言語に依存する設定は後で。

(require 'auto-complete)
(require 'auto-complete-config)
(ac-config-default)

magit

emacsからgitを操作するもの。そう言えば結構前は標準で入るVCからgitを使っていたが、VCはgitに特化しておらず色々とやりたいことが出来なかったのでmagitにした。git rebase -iに当たるものをmagit-statusじゃない場所からやるとか使用頻度の少ないキーバインドは消した。

(require 'magit)
(global-set-key "\C-xgs" 'magit-status)
(global-set-key "\C-xgb" 'magit-branch-manager)

iedit

共通部分を全部まとめて編集するもの。変数名とかを変えるときに便利。”\C-;”と書きたいがそれだと動かないのでこんな感じで書いた。

;; iedit
(global-set-key [?\C-;] 'iedit-mode)

Written with StackEdit.

2015年1月1日木曜日

AwkLike classを作った

Google Apps Scriptでawkみたいな行志向でパターンマッチして動かしたくなったのでAwkLikeを作った。 こっから先は後日追記する。

2014年11月20日木曜日

isimをcliで呼んでみた

ISEについているisimは実はcommand line interfaceがある。これを使ってguiを使わずにシミュレーションしようぜっていう話。ISim User GuideとかISim In-Depth Tutorialとかを参考にしている。

isimはGUI modeとCLI modeがあって、CLI modeだとtclの対話環境があってそれを使う。走らせるtestが事前にあるならbatch scriptを走らせることもできる。そうじゃなくても短ければ標準入力からpipeとかで与えると動く。何も考えなければ

 
  run all
とか
 
  run 10ms
とか与えればよい。終わったらexitで抜けられる。

これだと波形が見れないが、debugするのであれば波形を見たい。vcdファイルを吐けば良いが、isimのvcd出力はverilog用っぽくて情報が欠けているようだ。そこでisimの波形のフォーマット(?)のwcfgとwdbを使うと良い。

こういうtclのbatchを書いて、(fadd_sim.tclとする)

  $ ./fadd_sim -wdb fadd.wdb -tclbatch fadd_sim.tcl
のようなことをするとfadd_sim.wcfgとfadd.wdbが生成される。波形を見たいときはこんな感じで見ることができる。

  $ isimgui -open fadd.wdb -view fadd_sim.wcfg

isimで自動テストを回してみた

ハードウェアでも自動テストをやると捗るので自動テストを回してみた。自動テストをやるのにいちいち波形を見る方法は取りづらいので、想定される出力と一致するかのみを判定して、一致しなければsimulationを止める方法で正誤判定を行った。まず、isimの実行ファイルをcliで作るのには依存関係を記述した,prjファイルが必要である。

下記のようなprjファイル(fadd_sim.prjとする)を作る。この例だと、fadd_simを作るのにwork libraryのfadd.vhd,fadd_sim.vhd,fadd_stage1.vhd,fadd_stage2.vhd,fadd_stage3.vhd,right_shift.vhd,ZLC.vhdが必要だという意味である。

次にMakefileを書く。これは普通に書けば良い。


fadd_isim: fadd_sim.prj fadd.vhd fadd_sim.vhd fadd_stage1.vhd fadd_stage2.vhd fadd_stage3.vhd right_shift.vhd ZLC.vhd
        fuse -incremental -prj $< -o $@ fadd_sim
test: fadd_isim
        ./run.sh

最後にtestを回す次のようなスクリプトを書く(run.shとする)。

これを実行すると次のようになる。

[==========] Running 2 tests
[ RUN      ] fadd_isim
[  PASSED  ] fadd_isim
[ RUN      ] i2f_isim
[  PASSED  ] i2f_isim
[==========]
[  PASSED  ] 2 tests.

2014年9月22日月曜日

sizeがよくわかんないarrayの受け渡しをやってみた

Cで


void foo(int* xs,int length)
みたいなことやってる関数をC++11のstd::arrayを使って書き換えようとしたらどうなるのかと思ってやってみた.

とりあえず

  • まあtemplate使えばできるね
  • 呼び出し側もstd::arrayに変更する必要がある.
位のことは気がついた.

2014年9月9日火曜日

jenkinsをpowerpcのgentooにinstallした.

jenkinsをpowerpcのgentooにinstallしました.emergeだけで済まなかったので書きます.ibmのjreをinstallするところまではemergeの言うとおりにやっていればいいので省きます.まず,http://mirrors.jenkins-ci.org/war/latest/jenkins.warからjenkins.warをダウンロードします.これをとりあえずjava -jar jenkins.warで実行します.jreが正しくinstallされていればこれで127.0.0.1:8080につなぐとjenkinsのページにアクセスできます.

次にInstall Jenkins as a Unix daemonのshell scriptの部分のshell scriptを適当にpathの通っている場所に置きます.最後に

# useradd jenkins -m -U
# mkdir /usr/share/java/jenkins
# mv jenkins.war /usr/share/java/jenkins
# mkdir -p /var/lib/jenkins
# mv .jenkins/* /var/lib/jenkins
# chown jenkins:jenkins -R /var/lib/jenkins
# mkdir -p /var/log/jenkins
# chown jenkins:jenkins /var/log/jenkins
で終わりです.起動は作ったscriptをroot権限で実行すればいいです.停止はそれっぽいprocessをkill止めるしかないです.

これでjenkinsのinstallは終わりです.自動で起動したりとかproxyとかで80番ポートに飛ばしたりできます.