2009年8月9日日曜日

Emacsで行を右寄せをする

 昔作ったやつです。
 標準だと、M-x set-justification-right で右寄せしてくれます。がこれだとタブと空白で埋めてくれるので、空白だけで右寄せしてくれるものを作りました。

インストール

  1.  下の方のelispを right-line.el という名前で、~/.lisp などに保存します。
  2.  ~/.emacs に

    (require 'right-line)
    (global-set-key "\C-cr" 'justify-right-line) ; 行を右寄せする
    と書いておきます。


使い方

 右寄せしたい行の上にカーソルを持っていき、C-c r とすれば右寄せされます。
 選択範囲内の右寄せも出来ます。
 桁数は C-u 桁数 M-x set-fill-column で。デフォルトだと C-x f かな?

right-line.el


;;; right-line.el --- 右寄せ
;; $Id: right-line.el,v 1.6 2007/10/11 09:55:17 yama Exp yama $
;; last updated : 2007/10/16 15:00:41 JST

;; Copyright (C) 2007 yama

;; Author: yama <yama@localhost>
;; Keywords:

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; 行を右寄せする。範囲選択していれば範囲選択部分を右寄せする。

;;; ToDo


;;; Code:

(defun yama-region-active-p ()
"リージョンアクティブならtを返す.
2007年10月06日(土曜日) 12:45:08 JST by yama"

(if (and transient-mark-mode mark-active) t nil))

(defun right-line ()
"2007年09月15日(土曜日) 14:46:17 JST
カレント行を空白で埋めて、右寄せする"

(interactive)
(save-excursion
(end-of-line)
(let ((ln(- fill-column (current-column))))
(beginning-of-line)
(insert-char ?\ ln))))


(defun right-line-region (start end)
"選択範囲内を空白で埋めて右寄せする。範囲選択されてなければカレント行を右寄せする
2007年10月06日(土曜日) 12:44:41 JST by yama"

(interactive "r")
(save-excursion
(save-restriction
(goto-char start)
(unless (bolp)
(beginning-of-line)
(setq start (point)))
(goto-char end)
(unless (bolp)
(beginning-of-line)
(setq end (point)))
(narrow-to-region start end)
(let ((max-line (count-lines start end))
(count 0))
(goto-char (point-min))
(while (< count max-line)
(right-line)
(next-line)
(setq count (1+ count)))))))

(defun justify-right-line (start end)
"カレント行を右寄せする。範囲選択されているなら範囲内を右寄せする.
2007年10月16日(火曜日) 14:08:05 JST by yama"

(interactive "r")
(if (yama-region-active-p)
(right-line-region start end)
(right-line)))

(provide 'right-line)
;;; right-line.el ends here



 報告書とか文書の末尾の署名なんかに利用すると便利です。
 自分で作って使っていなかったり・・・orz

2009年8月2日日曜日

Emacsの起動時間を調べる

Emacs23.1 がリリースされましたねー。めでたいめでたい。やんややんや。
もっともだいぶ前から使っていたんで新鮮さはないんですが、やっぱりアンチエイリアスの効いたフォントは美しい。

んで、emacs23から追加された関数を使って、Emacsの起動に掛かった時間を表示する機能など。小ネタです。

;;;====================================
;;;; boot-time
;;;====================================
;;; 起動するまでにかかった時間を表示。
(defun boot-time ()
" 起動するまでにかかった時間を表示。"
(interactive)
(message "起動時間:%s秒"
(- (cadr after-init-time) (cadr before-init-time))))


M-x boot-time で起動時間が表示されます。

2009年7月2日木曜日

CLIで天気予報を表示する

 最近perlを触る機会があり、perlをいじるのは初めてだったのですが、なんとかでっち上げてみました。perlなんて記号だらけの省略記法だらけで大嫌いだったのでですが、時代は変わり、最近ではモジュールを活用してブロックを組み立てるかのように書けるとか。
 実際 CPAN の充実ぶりは凄いですね。あらためて perl を見直しました。

 んで今回はYahooから天気予報を取得して表示するコマンドです。前回は今現在の気象情報を表示するだったのですが今回は予報です。

インストール

 以下のスクリプトを適当な名前、yohou.pl みたいな名前で ~/bin/ あたりにでも保存し、chmod +x yohou.pl として実行属性を付けておいてください。

#!/usr/bin/perl
# last updated : 2009/07/02 15:46:45 JST
#
# Yahooから天気予報を取得する。

use utf8;
use strict;
use warnings;
use XML::TreePP;

binmode STDOUT, ":utf8";


# url
# 以下のurlから調べて下さい。
# http://weather.yahoo.co.jp/weather/public/rss.html
my $url = "http://rss.weather.yahoo.co.jp/rss/days/4410.xml";
# カットする文字列。
my $cut = " 東京(東京) ";




my $tpp = XML::TreePP->new(array_element => [qw( item )]);
$tpp->set( utf8_flag => 1 );
my $tree = $tpp->parsehttp( GET => $url);
my $channelhash = $tree->{rss}->{channel};
print $channelhash->{title} . "\n";
my $itemarray = $channelhash->{item};
foreach my $itemhash ( @$itemarray ) {
my $base = $itemhash->{title};
unless ($base =~ /^\[PR\]/) {
$base =~ s/ - Yahoo!天気情報$//;
$base =~ s/ (\d)日/ 0$1日/;
if ($base =~ /^【 \d\d日/) {
my $idx = rindex($base, '】');
my $day = substr($base, 0, $idx + 1);
$day =~ s/$cut//;
my $wea = substr($base, $idx + 2);
my @tenki = split(/ - /, $wea);
$tenki[0] = trim($tenki[0]);
print sprintf("%s %-4s %s", $day, ume($tenki[0]), $tenki[1]) . "\n";
}
else {
print $base . "\n";
}
}
}
print $channelhash->{copyright} . "\n";

sub trim {
my $val = shift;
$val =~ s/^\s*(.*?)\s*$/$1/;
return $val;
}

sub ume {
my $val = shift;
my $len = length($val);
if ($len < 4) {
$val = $val . " " x (4 - $len);
}
return $val;
}

 次に自分の住んでいる地域の天気予報を表示するために、http://weather.yahoo.co.jp/weather/public/rss.html から地域のurlをコピーして
my $url = ”http://rss.weather.yahoo.co.jp/rss/days/4410.xml"
の行を変更しておいてください。その下の my $cut も同じく地域に合わせて変更を。$cut は単に冗長な部分を削除するだけですから、ほっといても特に問題ありません。

 次にこのスクリプトは XML::TreePP というモジュールを利用しているので、
sudo apt-get install libxml-treepp-perl
としてインストールしておいて下さい。
 以上で準備は完了です。後は ~/bin/yohou.pl とでもして実行すれば、
~$ yohou
Yahoo!天気情報 - 東京(東京)の天気
【 02日(木)】 雨後曇  26℃/21℃
【 03日(金)】 曇り   26℃/21℃
【 04日(土)】 曇時々雨 25℃/22℃
【 05日(日)】 曇時々雨 27℃/21℃
【 06日(月)】 曇り   28℃/22℃
【 07日(火)】 曇時々雨 28℃/22℃
【 08日(水)】 曇時々雨 27℃/22℃
【 09日(木)】 曇時々雨 26℃/22℃
【 23区西部 】警報・注意報はありません
【 23区東部 】警報・注意報はありません
【 多摩北部 】警報・注意報はありません
【 多摩西部 】警報・注意報はありません
【 多摩南部 】警報・注意報はありません
Copyright (C) 2009 Yahoo Japan Corporation. All Rights Reserved.
な感じで天気予報が表示されます。天気情報コマンドと合わせて使えばいいでせう。


# ん〜それにしてもperl の文字列処理のやり方がまだ理解していない・・・でもモジュールは便利だね。というか便利すぎ。
# いままでrubyばかりだったけど、perlで便利なモジュールがある場合はperlを使おう。

2009年6月7日日曜日

ubuntuに Nagios を入れる

UbuntuでNagiosなんだけど、英語ですね。
という のっぽのブログ「バカンチ」さんの書き込みをみたので、Nagios を日本語化したものをPPAに上げておきました。
https://launchpad.net/~yama-natuki/+archive/ppa
からどうぞ。

これだけではあれなので自分でも入れてみました。
インストール後、パスワードを設定しないといけないみたい。
sudo dpkg-reconfigure nagios3-common
してパスワードを設定。
あとは、 http://localhost/nagios3/ にアクセス。

2009年6月2日火曜日

ubuntuで AppArmor を使ってセキュアな環境を構築する

AppArmor はubuntuにセキュアな環境を提供するフレームワークです。同様のものにSElinuxがありますが、あちらはがっちがちの強固なセキュアOSで、我々のようなエンドユーザーが気軽にほいほいと使えるものでもありません。SElinuxの中の人も、ポリシーは専門家が記述すればいいと言っています・・・

 幸いにして AppArmor はカジュアルに扱えるセキュリティツールとしてubuntuで採用されており、これを使わない手はありません。がしかし日本語での資料がほとんどなく、ろくに有効活用されていないのが実情だと思います。
 そこで、自分のためのメモとして簡単な使い方を書いてみたいと思います。

導入

 apparmor はアプリごとにルールを設定し、設定したルール以外の行動を禁止します。ですからあるアプリが脆弱性を利用してクラックされ、そのアプリから全然関係のないファイルにアクセスしようとしても、それはルールで許可されていませんから、アクセスが出来ず、被害を防げるという仕組みです。
 このルールをプロファイル(ポリシー)といい、あらかじめいくつか用意されていますので、まずprofileを導入します。
sudo apt-get install apparmor-profiles apparmor-utils
apparmor 自体は標準で有効になっているはず。

確認する

sudo apparmor_status
でステータスが確認出来ます。
 enforce mode が実際にprofileを適用しています。
 complain mode が学習モードで、システムログに学習結果をどんどん書き出しています。


新しいprofileを作る

 polipo を使っているので、こいつのprofileを実際に作っていきます。

sudo aa-genprof /usr/bin/polipo
とすると、
Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" button below in
order to scan the system logs for AppArmor events.

For each AppArmor event, you will be given the
opportunity to choose whether the access should be
allowed or denied.

Profiling: /usr/bin/polipo

[(S)can system log for SubDomain events] / (F)inish
と聞いてきますので、F キーを押して終了させます。そうすると、 /etc/apparmor.d/ 以下に usr.bin.polipo というファイルが作られます。
 次に、
sudo aa-complain /usr/bin/polipo
としてすぐさま学習モードにし、
sudo /etc/init.d/polipo restart
としてpolipoをリスタートさせ、しばらく動作させます。この間 apparmor はpolipoの動作ログを取り続けます。いろいろとpolipoを動作させ、その振る舞いを学習できたかなあと思ったら、
sudo aa-logprof
として学習結果を反映させます。
対話形式で、許可、不許可を聞いてきますので、逐次答えていきます。答え終わると、セーブするか聞いてくるので、もちろんセーブします。

 しばらく学習行為を終え、もう漏れがないかなあと思ったら、complainモードからenforceモードに
sudo aa-enforce polipo
として切り替えます。

 これでpolipoは設定したファイル以外にはアクセス出来なくなります。
 参考までに、/etc/apparmor.d/usr.bin.polipo の中身を。
# Last Modified: Tue Jun  2 16:00:15 2009
#include

/usr/bin/polipo flags=(complain) {
#include
#include



/etc/polipo/config r,
/etc/polipo/forbidden r,
/etc/polipo/uncachable r,
/usr/bin/polipo r,
/usr/share/polipo/www/doc/* r,
owner /var/cache/polipo/ r,
owner /var/cache/polipo/** rw,
owner /var/log/polipo/polipo.log a,
owner /var/run/polipo/polipo.pid w,

}

こんな感じになっています。もちろんエディタで直接変更してもかまいません。

 つまり簡単に言うと、
  1. プロファイルがなければ aa-genprof で作る。
  2. complainモードでしばらく学習させる。
  3. aa-logprof で学習結果を反映させる。
  4. Okなようなら enforceモードに切り替える。
こんな感じです。ね、簡単でしょう?w

 ちなみに aa-genprof でいきなりFキーで終了させていましたが、あのままの状態でアプリを立ち上げ、いろいろ操作をした後に、Fキーでなく、Sキーを押すと、許可、不許可の設定が続きます。ただ短時間の学習だとどうしても漏れがあるので、しばらくはcomplainモードで回したのちに、 aa-logprof で反映させるといいでしょう。

# 正直デスクトップユーザで セキュアOS必要かというと現状いらないんじゃないかと思うんですが、将来のことを考えると憶えておいて損はないと思います。でもその前に TOMOYO がubuntu にきちゃうかなw

2009年5月18日月曜日

ubuntuでcompiz使用時のmltermの描画がおかしい

Ubuntuを 9.04 に上げてcompizで mlterm を使用しているさいに、ls などでずらずらと表示させてみると描画されない区域が出てきました。マウスで表示されていない部分を反転させると表示されます。
 top コマンドで画面をじーっと見ていると、描画されない部分がぴょこぴょこ出るのがわかると思います。
 かなり不便というか問題なのでいろいろ悩んでいたんですが、compiz設定マネージャーを起動し、次善策プラグインの、Force synchronization between X and GLX をenableにすることで解決出来ました。

2009年5月11日月曜日

Ubuntu 9.04 にアップグレードメモ

 Ubuntu 9.04 にしました。今回はクリーンインストールではなくアップデートをすることにしました。
 今まで使っていたのが 8.04 でしたので、8.04 → 8.10 → 9.04 へと順にアップデートしていきます。
 アップデート自体はなにも問題なく終わりました。
 アップデートするときのコツは、公式のリピジトリ以外から入れたものは全てpurgeすることです。また、デーモンなどの初期起動状態も sysconfig などで変更した場合は、入れた時の状態に戻しておきます。

 以下気づいたことなどをメモ。


  • Xorgがubuntu8.10になってVer1.5になり、いろいろと斬新に変更された。のでトラブルが多い。
  • Xorgが1.5から返ってくるキーコードが変更されている。従ってxmodmapでキーバインドを変更している場合は再度設定し直し。
  • 入力デバイスの設定が xorg.conf から読まなくなった。/etc/hal/fdi/policy/ 以下にXMLで書けばいいらしいが、XMLなんて人間が直接書くものじゃないと思う。アホー。とりあえず、
    setxkbmap -rules evdev -model pc101 -layout us
    としてicewm用に ~/.icewm/startup に書いて手動で設定した。GNOMEは自前で設定するので問題ない。けどXとGNOMEで設定分かれているっていうのはどうなのよ・・・
  • 制限付きドライバの名称が変わっている。そしてnvidiaのドライバが入らなかったので、envyng で入れた。
  • 解像度がおかしかった。ので手動でxorg.confを書き直して対処。
  • Ctrl + Alt + Backspace がデフォルトで無効になった。xorg.conf に

    Section "ServerFlags"
    Option "DontZap" "False"
    EndSection
    と記述して対処。
  • compizと端末の組み合わせがおかしい・・・色抜けする。
  • compizやcairo-dockなどは変更が激しいので、そのつど設定を破棄するか、見直ししたほうがいい。
  • mlterm 256色化済み jaunty 対応版をパッケージ化した。以下からどうぞ。
  • icewm で icewm が完全に立ち上がる前に startup などで指定したプログラムが起動したりすると、icewm の挙動がおかしくなる。キーバインドが一部効かなくなる。タスクトレイが表示されなくなるなど。~/.icewm/startup の各プログラムの間に sleep を入れることで対処。
  • Emacs23 が起動時に変なウィンドウサイズで起動したりする。
  • 起動は確かに速くなっている。アプリの起動速度は速くなっている。こちらの方が体感出来た。


まとめ


 8.10はnvidiaのレガシードライバが対応していなかったので見送っていました。他にXorgがラディカルに変更されていたのも理由です。
 うちでは KVM (キーボードマウスモニタ切換器)を使用しているのでhalの自動認識が機能しません。機能しない手動で設定しなけれならない環境にはやさしくないですね。
 結論としては、LTS使っている人ならわざわざ急いでアップデートする理由はないかなー。