2011年12月29日木曜日

python の時間関連ライブラリ

Javaの時間関連ライブラリもたいがい使いにくいが、Pythonのも使いにくい。 多分問題なのは、時刻表現のコアになるタプル形式にタイムゾーンの情報が無いことだろう。 タプル形式を経由するとタイムゾーン情報が欠落するのでローカルタイムで扱っていたのか、GMTなのかわからなくなる。 ちなみにタプル形式にはDay light saving time(サマータイム)かどうかのフラグはある。なんなんだ。

今回はまったのはGMTのdatetime型からepoch秒数を求める場所。タプルにするとタイムゾーンが落ち、

time.mktime(tuple)
とすると、ローカルタイムで解釈されるので、9時間ずれる。。。

色々ググって

calendar.timegm(tuple)
とするといいということがわかった。これはGMTで解釈してくれるので大丈夫、とのこと。

しかし、なんだかなあ。。Javaのように、epochからのミリ秒表現をコアにするほうが合理的だと おもうのだが。

Google Storage public linkの更新遅延

Google storageは、プライベートリンクとパブリックリンクが作れるんだけど、 ドキュメントを更新してもパブリックリンクの中身がなかなか更新されない。。 プライベートのほうはすぐに更新されるのに。 中身を消してもパブリックリンクからはしばらくアクセスできる。正確にはわからないが、おそらく1時間程度は アクセスできてしまうもよう。
こちらの記事には、CacheのExpireの問題ではないかということだが、ブラウザのキャッシュの問題ではないことは 確認できている。想像するに、パブリックリンクのほうはプロキシかなんかになっていて、このプロキシのなかで キャッシュされているのではないか。その場合、デフォルトで1時間キャッシュされることになる。
間違えてパブリックにしてしまった場合、一度でもアクセスするとキャッシュされてしまうので、すぐにパブリックを消しても、1時間は公開状態が続いてしまうので、結構要注意。

Google SitesでJavaScript

Google Sites のページはHTMLで編集できるのだけど、危険なタグは全部削り落とされてしまうので、javascriptが使えない。

検索してみたところ、 こちらのページ が引っかかった。要するにガジェットとしてどこかにおいておいて、そのガジェットへの参照をGoogle Sitesに置く、ということ。 ガジェットにするには、HTMLフラグメントの前と後ろにおまじないを書いてXMLにするだけ。 ちょっとめんどうだけど、よく考えると、こちらのほうがワークフロー的に自動化しやすい。

たしかにJavaScriptは動くのだけど、なんか初期値がおかしい。具体的にはdisplay noneに指定しているエレメントが表示されている。よくわからないので放置。

追記:上記の不具合は単なるミスで問題なく動作することがわかった。めでたしめでたし。

2011年12月16日金曜日

mac os Xにstatic route を登録

に書いてあった。 一時的に変更するには
sudo route add 192.168.1.0/24 -interface vmnet8
とかやればいい。 恒久的に変更するには、
  • ディレクトリ/Library/StartupItems/AddRoute を堀る。
    sudo mkdir /Library/StartupItems/AddRoute
    
    ここに二つファイルをつくる。
  • StartupParameters.plist を作る。
    {
     Description = \"Add static routing tables\";
     Provides = (\"AddRoutes\");
     Requires = (\"Network\");
     OrderPreference = \"None\";
    }
    
  • AddRoutes を作る。
    #!/bin/sh
    . /etc/rc.common
    
    StartService ()
    {
            ConsoleMessage "Adding Static Routing Tables"
    sudo route add 192.168.1.0/24 -interface vmnet8
    
    }
    
    StopService ()
    {
            return 0
    }
    
    RestartService ()
    {
            return 0
    }
    
    RunService "$1"
    
    これに実行権限を与えておく。
    sudo chmod +x /Library/StartupItems/AddRoute/AddRoutes
    
なんというか面倒くさいことだなあ。なんでVMwareが自動的にやってくれないんだろう。

2011年12月12日月曜日

python からgmail でメイル送信

面倒かな、と思って検索したらこちらに全部書いてあった。ありがたや、ありがたや。
# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
import getpass

def create_message(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

def send_via_gmail(from_addr, to_addr, msg, passwd):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(from_addr, passwd)
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

if __name__ == '__main__':
    from_addr = 'hoge@gmail.com'
    to_addr = 'target@example.com'
    passwd=getpass.getpass("password for %s:" % (from_addr))
    msg = create_message(from_addr, to_addr, u'テスト', u'本文', 'ISO-2022-JP')
    send_via_gmail(from_addr, to_addr, msg, passwd)

2011年11月22日火曜日

cassandora 1.0 で YCSB

  • ベンチマークツール YCSBは 公式には多分まだ1.0をサポートしていない。db/cassandora-1.0というディレクトリはない。 けど試したところ、どうも0.8用の設定で動く模様。
  • YCSBを動作させるにはテーブルスキーマを設定しなければならない。0.6ではstorage.xmlというファイルで静的に設定することができたが、これは0.7以降はできなくなっている。xml対yamlという話ではなく、0.7からは動的にスキーマが変更できるようになったため静的に設定できるべきではなくなった、ということらしい(出典)。
  • したがって、動的にスキーマを入れなければならないが、これにはcassandra-cliを使う。基本的にはインタラクティブに使うツールのようだが、ファイルを指定すればバッチで実行される。
    create keyspace usertable
        with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy'
        and strategy_options = {replication_factor:1};
    use usertable;
    create column family data;
    
    このようなファイルをsetup.cas として用意しておいて
    > cassandra-cli -h localhost -p 9160 -f setup.cas
    
    とすればよい。

2011年11月19日土曜日

gnome-shell でのemacs key map

こちらのサイトに書いてあった。

dconf-editorを起動、
/org/gnome/desktop/applications/interface の gtk-key-theme の値を Emacs に。

2011年10月4日火曜日

ffmpeg でiphone用動画

#!/bin/sh
ffmpeg -i $1 -s 480x270 -vcodec libx264 -b 100k -strict experimental -acodec aac -ac 2 -ar 48000 -ab 64k -coder 0 -level 13 -nr 50 -threads 2 $2
-b が動画ビットレート、-ab が音声ビットレート。これは、某レクチャーを見るためなので極端に低くしている。普通の映画とかならもっと高めにしないと駄目。

2011年9月2日金曜日

python でタイムアウト

SIG ALARMを使ったタイムアウトの仕掛け。再実装するのが嫌なのでメモとして残しておこう。スレッド環境では使えないので注意。
import signal
import time

class timer():
    def __init__(self):
	self.flag = True

    def _handler(self, x, y):
	self.flag = False

    def set(self, sec):
	signal.signal(signal.SIGALRM, self._handler)
	signal.alarm(sec)

    def check(self):
	return self.flag

if __name__ == "__main__":
    tmr = timer()
    tmr.set(3)
    while tmr.check():
	time.sleep(100)

2011年8月31日水曜日

Hadoop on Mac OS (single node)

CDH からHadoopをダウンロードしてきて展開。 http://hadoop.apache.org/common/docs/stable/single_node_setup.html のとおりにconf以下の3つのファイルをいじる。

ssh でlocalhostに入れるようにしなければならないので、共有でリモートログインを有効にしておく必要がある。

で、

> bin/hadoop namenode -format
> bin/start-all.sh
でOK. namenode のフォーマットをしないでstart-allするとnamenodeが起動しないので要注意。
> jps
6724 
17758 DataNode
17969 Jps
17958 TaskTracker
17833 SecondaryNameNode
17683 NameNode
17885 JobTracker
とかなって、4つのデーモンが全部立ってればOK.

2011年8月23日火曜日

Mac でfortran + mpi

本気で使うわけではないので適当に。mac portsで入れる。

まずはfortran95を、とか思って
> sudo port install g95
とかやるとgcc4.2ベースのg95が入ってくれるけど、実はMPICH2が使ってくれない!ので無駄。

MPICH2を入れるときにvariantとしてgccXXを入れると、enable-fortranフラグが立ち、勝手にfortranを入れてくれる。らしい。

> sudo port install mpich2 +gcc45

とかやると、fortranだけじゃなくて、なんかgcc-javaとかobjective-cとかまで入れてる。。いつまでたっても終わらん。が、最終的にはちゃんと入ったようだ。めでたい。

Mac でMDをmp3に変換

Audacity で万全。Audacity はもっといろんなことの出来るソフトウェアらしいのでこんなことに使っては申し訳ないような気もするが。

Audacity は単体ではMP3への書き出しができないのでlameをプラグインとして追加する必要があるが、これもインストラクションに従えば良い。

  • まずは録音をする。入力を外部入力に指定するのを忘れないこと。デフォルトはモノラルなのでステレオにすること。
  • 分割をする。「解析」ー「find silence」とやると自動的にラベルを打ってくれる。無音部を拾うだけなので実際の曲の区切りとは異なる場合があるので、結果を聞きながら修正する。ラベルは削除することも追加することも可能。削除はラベルの文字列を削除した状態からさらにバックスペースを押すと消える。特に1曲目の頭と最後の曲の末尾は、切り捨てられてしまう場合があるので、注意して修正する必要がある。
  • 「複数ファイルへ書き出し」でMP3へ書き出し。ID tagの入力をいちいち求められるがあとで纏めて打ったほうが簡単かもしれない。

2011年8月12日金曜日

Mac OS X 64ビットと32ビット切り替え

MacOS X でデフォルト動作モードを切り替える方法。
$ sudo systemsetup -setkernelbootarchitecture x86_64
$ sudo systemsetup -setkernelbootarchitecture i386

2011年7月22日金曜日

ps2gif

#!/bin/sh
pstopnm -stdout $1 | pnmrotate -90 | ppmtogif > ${1%.*}.gif

2011年7月10日日曜日

git の設定

手元のディレクトリ(text)を新たにリモート側にレポジトリを作ってプッシュする。

リモートサーバ
まずは、リモートサーバにgit のレポジトリを用意

> mkdir text.git
> chdir text.git
> git --bare init --shared

ローカル側のディレクトリをレポジトリとして初期化

> cd text
> git init

ローカルレポジトリに追加してコミット

> git add .
> git commit -m "initial commit"

ローカルとリモートを接続

> git remote add origin ssh://example.com/home/yourname/text.git

このとき自分のホームからの相対パスではなく、フルパスで指定するところがポイント。

で、プッシュ

> git push origin master

別のマシンで作業するときには

git clone ssh://example.com/home/yourname/text.git

とすればよい。

2011年6月26日日曜日

Mac Chromeでapplication shortcut

なんでだかいつまでたってもApplication ShortcutがサポートされないMac用Chrome。なんとかならんのかな、と思ってググっていたらこんなの見つけた。 こんなのみつけた。shell scriptで作ってしまうというもの。こんなに簡単にできるならなんで本体になかなかはいらないんだろう。とりあえず動いている。

2011年6月23日木曜日

Safari のJavaScript

なぜかSafariで動かないJavaScriptがあったので追ってみたら意外なことが。
xxx.class = yyy;
という表現がパースエラーになっていた。
xxx["class"] = yyy;
ならOK。'class'がキーワードになってるとか? わけわからん。 ちなみにSafariのDevelop メニューを出すにはコンソールで次のようにする。
defaults write com.apple.Safari IncludeDebugMenu 1

2011年6月14日火曜日

Picasa のアルバムをHTML化

何か他にずっといい方法がありそうだけど、Picasa のアルバム内の写真と説明を抜き出してHTMLのテーブル(の中身だけ)を取り出すスクリプト。Picasa Web Albums Data APIのPython APIを利用。簡単。

使い方

第1引数にアルバム名を指定する。アルバム名は英字にしたほうがいい。漢字だとうまくいくかどうか不明。なにか面倒くさいことが起こるだろう。

ソース

# -*- coding: utf-8 -*-

import gdata.photos.service
import gdata.media
import gdata.geo
import getpass
import sys

email="YOUR_GMAIL_ADDRESS"
#
password=getpass.getpass("password for %s:" % (email))

albumname = sys.argv[1]

gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()

username=email

albumid = ""
albums = gd_client.GetUserFeed(user=username)
for album in albums.entry:
  if album.title.text == albumname:
    albumid = album.gphoto_id.text

photos = gd_client.GetFeed(
  '/data/feed/api/user/%s/albumid/%s?kind=photo' % (
    username, albumid))
for photo in  photos.entry:
  print '<tr><td><a href="%s"><img src="%s"/></a></td><td>' % (photo.content.src, photo.media.thumbnail[-1].url)
  print '%s\n</td></tr>' % (photo.summary.text)

2011年6月12日日曜日

GDDphone を2.3に

すでに1.6になっていたので、まずrootを取得
  
  http://komugi.net/archives/2010/08/04212446
で、こちらを参考に2.3を導入。
  
  http://rhp.ninja-x.jp/review/Gingerbread/install.html
ありがたいことだなあ。

2011年4月19日火曜日

java で pid (2)

ManagementFactory.getRuntimeMXBean().getName() とやると PID@HOST 形式の文字列が取れるらしい。こっちのほうがポータブル。

Java でgetpid

ポータブルかどうかはしらない。まあ、JNIを使うよりはましってことで。Windowsは無理ってことで。
 
 static private int getPid() throws IOException, InterruptedException {
  ProcessBuilder pb = new ProcessBuilder();
  pb.command("/bin/sh", "-c", "echo $PPID");
  Process p = pb.start();
  p.waitFor();
  String str = (new LineNumberReader(new InputStreamReader(p.getInputStream()))).readLine();
  return Integer.parseInt(str);
 }

2011年3月29日火曜日

mavenのレポジトリをGoogle code上に作る

MavenのレポジトリをGoogle code上に作る方法。 ここに書いてあった。ためしてないけど、パスワードをベタでファイルに書くのか。。Google CodeのアカウントはGoogleのアカウントだから、これはちょっといやだなあ。

2011年3月24日木曜日

ラベル付けとそれを使ったmount

SATAとPATA両方あるマシンでブートドライブじゃないほうのドライブが/dev/sdb になったり /dev/sdaになったり安定しない。ラベルをつければいいと言うことなのでつけてみた。e2labelコマンドでラベルをつける
$ e2label /dev/sdb1 /repo
/etc/fstab でそれを参照。
LABEL=/repo   /repo  ext2 defaults  1 2

2011年3月23日水曜日

gnome ディレクトリ名を英語表記に。

ubuntu インストールするたびにやるので。「デスクトップ」などの日本語ディレクトリを英語にするおまじない。
 LANG=C xdg-user-dirs-gtk-update

2011年3月21日月曜日

sbt

Scalaの開発環境、Eclipseがいつまでたっても安定してくれないようなので、sbtというのを使ってみる。統合環境ではなく、ビルドとテストを補助する環境で、ここにある。こちらこちらの記事を参考に試してみる。

環境をつくる

空のディレクトリを作って、その中で sbtとうつ。新しいプロジェクトを作るか聞いてくるのでsとするといろいろできる。
$ sbt
Project does not exist, create new project? (y/N/s) s
Getting Scala 2.7.7 ...
:: retrieving :: org.scala-tools.sbt#boot-scala
 confs: [default]
 2 artifacts copied, 0 already retrieved (9911kB/281ms)
Getting org.scala-tools.sbt sbt_2.7.7 0.7.4 ...
:: retrieving :: org.scala-tools.sbt#boot-app
 confs: [default]
 15 artifacts copied, 0 already retrieved (4096kB/385ms)

コンパイルと実行

プログラムは src/main/scala/ 以下に書く。書いて sbt内のプロンプトで、run とやるとコンパイルして実行してくれる。compileだけならコンパイルまで。更新のあったファイルを自動的に検出して依存関係を見て(たぶん)コンパイルするようだ。 さらに ~run, ~compileとすると継続的にファイルを監視して実行してくれる。つまり、書き換えてセーブすると、コンパイルしてくれるてことだ。当然不完全な状況でセーブするとコンパイルエラーがでる。気持ち悪いが馴れか。

Scalaのバージョンを変える

sbt は複数のScalaのバージョンに対応していて、コンパイラを管理してくれる。複数のバージョンに対してクロスビルドすることも可能。ターゲットを変えるには次のようにする。複数指定することも可能らしい。
> set.scala.versions 2.8.1
> reload
こうすると2.8.1のコンパイラをとりに行ってくれる。べんりー。

ライブラリの導入

プロジェクトを設定するとで自動的にmavenのライブラリを取ってきてくれたりする模様。project/以下にbuildというディレクトリを作って、そこに、scalaファイルを書くと、それを自動的にプロジェクトの定義として読むと言う仕掛けらしい。
import sbt._

class MyProject(info: ProjectInfo) extends DefaultProject(info) {
  val scalaTest = "org.scalatest" % "scalatest" % "1.3"
}
で、reload, update とやる。
> reload
[info] Recompiling project definition...
[info]    Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed.
[info] Building project test 1.0 against Scala 2.8.1
[info]    using MyProject with sbt 0.7.4 and Scala 2.7.7
> update
[info] 
[info] == update ==
[info] downloading http://scala-tools.org/repo-releases/org/scalatest/scalatest/1.3/scalatest-1.3.jar ...
[info]  [SUCCESSFUL ] org.scalatest#scalatest;1.3!scalatest.jar (4751ms)
[info] :: retrieving :: test#test_2.8.1 [sync]
[info]  confs: [compile, runtime, test, provided, system, optional, sources, javadoc]
[info]  1 artifacts copied, 0 already retrieved (1755kB/116ms)
[info] == update ==
[success] Successful.
[info] 
[info] Total time: 8 s, completed Mar 21, 2011 10:41:05 PM
レポジトリから自動的にライブラリをダウンロードしている。すごいなー。

テスト

ScalaTestを入れたのでテストをすることができる。テストプログラムは、src/test/scala/ 以下に書く。 で、sbtのプロンプトからtestとやるとテストが実行されると。

2011年3月17日木曜日

gdata でpicasaを操作

People FInder の入力作業に協力しようとしたのだけど、未作業の写真をなかなか見つけられないので、コメント数が1以下の写真だけを調べるスクリプトを書いてみた。といっても、ここにあるスクリプトほぼそのままだが。
import gdata.photos.service
import gdata.media
import gdata.geo

email=xxxxx
password=xxxx

gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()

username="tohoku.anpi"

albums = gd_client.GetUserFeed(user=username)
for album in albums.entry:
  print 'title: %s, number of photos: %s, id: %s' % (album.title.text,
      album.numphotos.text, album.gphoto_id.text)
  photos = gd_client.GetFeed(
      '/data/feed/api/user/%s/albumid/%s?kind=photo' % (
          username, album.gphoto_id.text))
  for photo in photos.entry:
      comments = gd_client.GetFeed('/data/feed/api/user/%s/albumid/%s/photoid/%s?kind=comment&max-results=10' % (username, album.gphoto_id.text, photo.gphoto_id.text))
      if len(comments.entry) < 2:
          print 'Photo title:', photo.title.text, len(comments.entry)

2011年3月16日水曜日

Hadoop のHDFS上のファイルを読む

サイドファイルにObjectOutputStreamで書いたものはObjectInputStreamで読めばいい。 dirname 以下のfilterにひっかかるファイルからオブジェクトを読み出すのはこうする。
  Configuration conf = new Configuration();
  FileSystem fs = FileSystem.get(URI.create("hdfs://localhost:9000/"), conf);
  for (FileStatus status: fs.listStatus(new Path(dirname), filter)) {
   InputStream is = fs.open(status.getPath());
   ObjectInputStream ois = new ObjectInputStream(is); 
   Object o = ois.readObject();
   System.out.println(o);
  }
filter はこんな風に取得。filePrefix に指定した文字を含むファイルを選ぶ。この実装だとprefix になってないけど。
 static PathFilter getPathFilter(final String filePrefix){
  PathFilter filter = new PathFilter() {
   public boolean accept(Path path) {
    return path.getName().contains(filePrefix);
   }
  };
  return filter;
 }

普通に書き出したファイルの場合

サイドデータじゃなくて、普通にcontext.writeした場合は読み方が変わってくる。SequenceFile.Readerで読む。
  Configuration conf = new Configuration();

  FileSystem fs = FileSystem.get(URI.create("hdfs://localhost:9000/"), conf);
  for (FileStatus status: fs.listStatus(new Path(dirname), filter)) {
   SequenceFile.Reader reader = new SequenceFile.Reader(fs, status.getPath(), conf);
   Text key = new Text();
                        Text value = new Text();
   while (reader.next(key, value){
                               ....
   }
  }
この読み方は、ValueがWritableの時にしか使えない。Serializable の場合はつぎのようにする。 nextでkeyだけ読んで、getCurrentValueでvalueを読む。このときにconfにJavaSerializationを追加しておかないと、エラーになるので注意。
  Configuration conf = new Configuration();
  conf.set("io.serializations", 
    JavaSerialization.class.getName() + "," +
    WritableSerialization.class.getName());

  FileSystem fs = FileSystem.get(URI.create("hdfs://localhost:9000/"), conf);
  for (FileStatus status: fs.listStatus(new Path(dirname), filter)) {
   SequenceFile.Reader reader = new SequenceFile.Reader(fs, status.getPath(), conf);
   Text key = new Text();
   while (reader.next(key)){
    System.out.println(key.toString());
    ChlacTest.Result res = new ChlacTest.Result();
    res = (Result) reader.getCurrentValue(res);
    System.out.println(String.format("%d %d %f", res.rx, res.time_frame, res.alpha));
   }
  }

2011年3月14日月曜日

googleで地名から緯度経度を取得

$  curl "http://maps.google.com/maps/geo?q=千代田区外神田"
{
  "name": "千代田区外神田",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "Japan, Tokyo Chiyoda外神田",
    "AddressDetails": {
   "Accuracy" : 4,
   "Country" : {
      "AdministrativeArea" : {
         "AdministrativeAreaName" : "東京都",
         "Locality" : {
            "DependentLocality" : {
               "DependentLocalityName" : "外神田"
            },
            "LocalityName" : "千代田区"
         }
      },
      "CountryName" : "日本",
      "CountryNameCode" : "JP"
   }
},
    "ExtendedData": {
      "LatLonBox": {
        "north": 35.7100074,
        "south": 35.6918852,
        "east": 139.7856097,
        "west": 139.7215803
      }
    },
    "Point": {
      "coordinates": [ 139.7535951, 35.6940027, 0 ]
    }
  } ]
}

2011年3月11日金曜日

hadoop side effect file

hadoopではファイルを正式なアウトプットの他に作ることができる。 getWorkOutputPath を使う。ディレクトリは正式なアウトプットの出力先と同じなので注意。
 public static class R1 extends
 Reducer {
  public void reduce(Text key, Iterable values,
  Context context) throws IOException, InterruptedException {
   context.write(key, values.iterator().next());
   Path path = FileOutputFormat.getWorkOutputPath(context); 
   Path fpath = new Path(path, "sidefile" + key.toString());  
    OutputStream os = fpath.getFileSystem(context.getConfiguration()).create(fpath);
   PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
   pw.println("hello");
   pw.flush();
   pw.close();
   os.close();
  }
 }

2011年3月9日水曜日

Hadoop job 管理

ps 相当
> hadoop job -list
kill
> hadoop job -kill xxxxxxxx

2011年3月8日火曜日

screen

設定

デフォルトだとC-aがエスケープなのだけど、emacsとコンフリクトするのでC-zに設定し直す。下記を~/.screenrc に。
escape ^z^z

デタッチ と アタッチ

C-z d でデタッチ。screen -ls で確認すると、セッションが見える。 >|| $ screen -ls There is a screen on: 6398.pts-11.xxxx (Detached) 1 Socket in /var/run/screen/S-xxxx. ||< screen -r でアタッチ。複数のセッションがある場合には先頭のpts番号(この場合は6398)を指定。

仮想画面

  • C-z c で仮想画面追加
  • C-z w で仮想画面のリストを最下段に表示
  • C-z 番号 でその番号の仮想画面に移動。
  • C-z space で順番に仮想画面を移動。
  • C-z n, C-z p で前後に移動。 nはspace と同じ。

コピーモード

screen ではスクロールをscreenが処理してるので端末のスクロールバーが使えない。面倒。 そのかわりコピーモードというのがあってそれで過去のログをみることができる。 C-z [ でコピーモードに入る。エスケープで抜ける。

2011年2月4日金曜日

hadoop でjava のserializableを受け渡すには

何らかの方法でシリアライズするわけだが、hadoop はデフォルトではJavaのシリアライズではなく 独自のシリアライザを使うようになっている。これはJavaのシリアライズが重いため、だそうだ。

しかしもちろんシリアライザの実装を変更することができ、Javaのシリアライザを使うように 指定することもできる。それには、こうする。

Configuration conf = new Configuration();
conf.set("io.serializations", 
  org.apache.hadoop.io.serializer.JavaSerialization.class.getName() + "," +
  org.apache.hadoop.io.serializer.WritableSerialization.class.getName());
要するにSerialization クラスをカンマで区切って、 io.serializations にセットするのだけど、JavaSerialization だけだと、Textとかが デコードできなくなっちゃうので、デフォルトのWritableSerialization も書いておくこと。

2011年1月18日火曜日

mac os JISキーボードをUS配列で

これまで、JISキーボードをUS配列で使うために、 こちらの JANSIマップというのを使っていた。 これは、キーマップを追加するもので、 日本語入力とUS入力の他にJANSIマップをつかって入力する形になる。 これはこれでいいのだけど、日本語入力では結局JIS配列になるし、気がついたら USになっていたりして、発狂寸前。

ということで、別の方法を模索したところ、Emacs bind化にもつかえる KeyRemap4MacBookで出来ることが判明 さらに、スペースとコマンドキーの間にあってウザかった「英数」キーをコマンドキーに変えたので 大変に快適に! ありがたいことだ。