Unixの最近のブログ記事

よくターミナルで、catとかlessとかファイルなどを見たときに2バイト文字が化けて出力されて以降にlsなどの出力がガタガタになるときありますよね。

あれ、ないですか?それは幸せですね。

僕はよくあるんですけど、そういうときの対処法を昔だれかに聞いて、それ以来この状態になるとずっと今回紹介する技を使ってきています。

やり方は簡単です、ターミナルに以下のコマンド(?)を打つだけです。
% echo ^[c
でも、単純に「echo スペース ハット ブラケット c」って打ってもだめです。
実際には「echo Ctrl-v Esc c」と打っています。

このあとリターンを押せば、あら不思議。
ガタガタしてた出力が直ります。

他にも対処法あると思いますが、僕がよく使うのはこれです。

これはエスケープシーケンスの1種で、この用途以外にもターミナルで色などを変えることもできます。ネットで調べると色の定義とかはあるんですがこの「c」だとこういうことができるっていうのは探してみたのですが出てきませんでした。

この辺のエスケープシーケンス一覧が載ってるところを知ってる方がいたら教えて欲しいです。

シェルスクリプト書いてて調べるのに時間かかったのでメモしておく。
  • exprの正規表現
    $valにfooかbarかbazどれかが入ってるかどうかを調べるには。
    expr $val : 'foo\|bar\|baz'
    でOK。 でもMac OS X 10.6.3のexprはだめでした。方言があるっぽい。 ちなみにifで使うとしたら
    if [ expr $val : 'foo\|bar\|baz' ]
    then
    ...
    fi
シェルスクリプト書いてて調べるのに時間かかったのでメモしておく。
  • ifのOR表現
    if [ "x$val1" = "xfoo" -o "x$val2" = "xbar" ]
    then
    ...
    fi
    でOK。「-o」なんですね。 一生懸命「||」って書いてました...。

自分はずっと環境変数TERMにvt100を設定していたのですがvt100だとemacsとか使ったときに色が付かないというのがあってここしばらくはxterm-colorを設定していたんです。

でも、xterm-colorだとAlternate Screen Bufferといって、lessやmanやviなどの使用時に使う前の画面状態を覚えておいて、それらが終了したときに元の画面に戻すという機能あって、それがが有効になってしまい、これをどうやったら回避できるのかずっと悩んでいました。

これが有効になってると、直前まで見てたファイルを参考にコマンドを打ったりしたいのにそれが消えてしまい開発効率半減、いや半減以下になってしまうのです(個人的に)。

ということで昨日ずっとその解決法を探していたら、やっとみつけました。

http://slashdot.jp/~doda/journal/438524


詳しくは上記のページを参照してほしいのですが、やり方としては

% infocmp > xterm-color.ti

と、やって現在のterminfoを出力して「rmcup=ふんふん,」と「smcup=ほんほん,」の部分を削除。

% tic -o $HOME/.terminfo xterm-color.ti

とやることで、ホームディレクトリに.terminfo/というディレクトリが出き、その中に編集したterminfoの設定が生成されます。

これでいまわしきAlternate Screen BufferがOFFになるというわけです。

ちなみに自分はtermcapの方は設定してませんが今のところ問題ありません。
でも、termcapを見るソフトだとそちらも設定だめかもしれませんね。

もし今後困ったらそっちも設定してみようと思います。


ls ~

| コメント(0) | トラックバック(0)
Mac OS X 10.5.8 / 1.8GHz Intel Core 2 Duo / Memory 2GB

% ls ~
Desktop/        Library/        Music/          Sites/          public_html/    work/
Documents/      Mail/           Pictures/       dev/            shipit-dist/
Downloads/      Movies/         Public/         local/          tmp/
tmpの中はカオスです。 あと仕事系は work/ に、自分で小ネタとかは dev/ に収めてます。
% ls ~/dev
AppleScript/    apache/         c/              elisp/          github/         quicksilver/
SIMBL/          appengine/      chumby/         flashlite/      iPhoneApp/      ruby/
actionscript/   arduino/        coderepos/      flex/           oauth/
android/        as2/            ec2/            gisty/          perl/
こっちもややカオスですね。
antipopさんのApp::SocialSKKをさっそくインストールして使ってみた。
これは素晴しすぎる!

使えるまでを軽く説明しておく(Macの場合)。

まずインストール。

# cpan App::SocialSKK
この際 socialskk.pl も同時にインストールされます。
次に $HOME/.socialskk に

plugins:
  - name: SocialIME
  - name: HatenaBookmark
  - name: Wikipedia
こんな感じに書く。
あとはsocialskk.plを起動するだけでApp::SocialSKK使える状態になります。

AquaSKK側での設定は「環境設定」の「辞書」タブで「+」を押して辞書を追加し、辞書の種類を「外部 skkserv 辞書」にし、場所を「localhost:1179」にするだけです。
(ちなみにいままでMacではMacUIMを使っていたのですが、現状のMacUIMだとskkservとskkの辞書を同時に設定できないっぽいので2年ぶりぐらいにAquaSKKに乗り換えました。そしたらAquaSKKがめっちゃ進化していてびびった)

とりあえず「ほってんとり」って書いて変換したら

料理のススメ:これから料理をしようと思っているひとへ - Money does not hurt your heart
ってでた。はてブからうまく取れてるようですね。
まぁ、これはネタとして。

その他にもSocialIMEには郵便番号とかも登録されてるっぽくて、日本語入力モードで「/0000000」(0000000はちゃんとした郵便番号ね)と打って変換を押すとその郵便番号の住所が出てきました(昔は郵便番号データベースをファイルに落したりしてたのを思い出した)。

っていうか実はSocialIMEに郵便番号が登録されてること知らなくてApp::SocialSKK::Plugin::ZipCodeとか作っちまった。悔しい...。

悔しいからソースを公開しておく。

package App::SocialSKK::Plugin::ZipCode;

use strict;
use warnings;
use base qw( App::SocialSKK::Plugin );
use XML::Simple ();
use URI;
use Encode ();

sub get_candidates {
    my ($self, $text) = @_;
    return if !defined $text || $text !~ /^\d{7}$/;

    my $uri = URI->new( 'http://zip.cgis.biz/xml/zip.php' );
    $uri->query_form( zn => $text );
    my $res = $self->ua->get( $uri->as_string );
    if ($res->is_success) {
        eval {
            my $xml = XML::Simple::XMLin(
                $res->content, ValueAttr => [ qw(state_kana city_kana address_kana company_kana
                                                 state city address company) ]
            );
            my @candidates;
            for my $seq ( [ 4..7 ], [ 0..3 ] ) {
                my $val = join( '', map {
                    my $v = $xml->{ ADDRESS_value }->{ value }->[ $_ ];
                    $v ne 'none' ? $v : '';
                } @$seq );
                push @candidates, Encode::encode(
                    'euc-jp',
                    Encode::is_utf8( $val ) ? $val : Encode::decode( 'utf8', $val ),
                );
            }
            return @candidates;
        };
    }
}

1;

__END__

=head1 NAME

App::SocialSKK::Plugin::ZipCode - Retrieves Candidates from Zip Code API

=head1 SYNOPSIS

  # Add a line like below into your .socialskk:
  plugins:
    - name: ZipCode

=head1 DESCRIPTION

App::SocialSKK::Plugin::ZipCode performs retrieval of
candidates from Zip Code API

=head1 SEE ALSO

=over 4

=item * Zip Code API

http://zip.cgis.biz/

=back

=head1 AUTHOR

Yoshiki Kurihara E<lt>kurihara __at__ cpan.orgE<gt>

あ、本題を忘れそうになってしまった。
socialskk.plをログインしたら毎回起動するのはめんどうなのでlaunchdで起動するようにしといた。これはMac OS X 10.5.6でしか動作確認してませんのであしからず。

設定は簡単。$HOME/Library/LaunchAgents/socialskk.plist ってファイルを作って下記の内容にで保存したあとMacを再起動すると socialskk.pl が自動で起動しているはず。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>socialskk</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/local/bin/socialskk.pl</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/dev/null</string>
        <key>StandardOutPath</key>
        <string>/dev/null</string>
</dict>
</plist>


sbinのsってなんだろうと気になったので調べてみた。

結論から言うと下記のようにSystem BINaryのことでした。
Wikipediaのこの辺にも書いてありますね。

http://momox.net/blog/2007/02/bin_sbin_lib_libexec.html

<ディレクトリ名の意味>
bin -- binary 実行可能なプログラムのこと。
sbin -- system binary システム管理者が主に使用するプログラム。
lib   -- ライブラリ--同じ階層のbinとかsbinのプログラムが使う関数(プログラムの断片)
libexe -- プログラムが使うプログラム


よくサービスとかパッケージのディレクトリ内でbinとsbinって作って使い分けてたりするけど自分の中でいまいちその棲み分けができていない。

cronとかに設定するのはsbin?
コマンドラインで実行するのはbin?
とかばっくり自分基準があるけど、この基準も合ってるか怪しい。

こんな基準のやってるよ!ってのがあったら教えて欲しいです。

あとlibexecとかもあるけど、これもなにを置くか微妙で「プログラムが使うプログラム」はこの中みたいですね。ぱっと思いつくので言うとmysqldとかがlibexecに置いてあったりしますね。

もうすぐUNIX timeが1234567890秒になるらしい。

いつ1234567890秒になるのか気になって夜も眠れない!
という人のために確認できるページを作ってみた。

まぁどこにでもあるとは思うけどね。。。

時間を過ぎたら落す予定です。

暇だったらボーっと見てみてくださいませ。

dateコマンドで今の時刻の1日前とかを求めるのってよくやると思いますが、
dateコマンドはOSによって方言があってオプションをいつも忘れて毎回調べたりしてるので
メモがわりに書いておりきます。

1日前をもとめたいときは?

BSD系
% date -v-1d

Linux系
% date --date '1 days ago'


1日前をもとめつつフォーマットを整えたいときは?

BSD系
% date -v-1d +%Y%m%d

Linux系
% date --date '1 days ago' +%Y%m%d


ある指定した日の1日前とかを求める方法。

BSD系
% date -j -v-1d -f %Y%m%d 20081201 +%Y%m%d

※この「-j」を付け忘れるとシステムの時間が変わっちゃうので注意
Linux系
% date --date '20081201 1days ago'


とこんな感じ。

関連エントリ:
crontabで月末に実行させたし

最近、会社の同僚から教えてもらったTipsですが、コマンドラインで

% ps auxww | grep httpd

とやったときに「grep httpd」自体のプロセスをひっかけないようにする方法です。

実際やってみるとわかりますが、タイミングが悪いと下記のように「grep httpd」自体もひっかかってしまいます。そんなに実害はないけど、なんだかちょっと気持ち悪い。と思っていたのは自分だけではないはず。

www       3811  0.0  3.3 216244 14732  ??  S    12:52AM   0:00.38 /path/to/bin/httpd -k start
www       4511  0.0  1.4 207900  6456  ??  S     1:13AM   0:00.00 /path/to/bin/httpd -k start
root     59037  0.0  1.4 207860  6372  ??  Ss   23Jul07  11:30.38 /path/to/bin/httpd -k start
yoshiki   4530  0.0  0.0   348   208  p2  R+    1:13AM   0:00.00 grep httpd

で、結論から言うと

% ps auxww | grep \[h\]ttpd

とやればいいのですが、なんでこれでひっかからなくなるかわかりますか?

以下ネタバレ。

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja