Git:圧縮とリポジトリのサイズ

Git便利ですね。Gitではオブジェクト(ファイルなど)をzlibで圧縮して保持します。それだけではなく、差分を計算したり、複数のオブジェクトを packすることで、単純にすべての履歴を記録するよりも効率的にリポジトリを保持することができます。

% git --version
git version 1.7.9.2
% alias | grep dirsizeinbyte
dirsizeinbyte='find . -type f -print -exec wc -c {} \; | awk '\''{ sum += $1; }; END { print sum }'\'

duだとファイルサイズではなくてブロックサイズになるので上記コマンドを使います。Landscape – エンジニアのメモを参考にしました。

まずはgit initしただけの状態で。

% git init
Initialized empty Git repository in /Users/kcrt/repostest/.git/
% cd .git
% dirsizeinbyte
13917

13.6KiBです。ここからどうなっていくかを見て行きましょう。まずはテキストファイルから。

% cd ..
% perl -e 'for(1..1000000){print "This is a large text file\n";}' > textfile
% wc -c textfile
26000000 textfile
% git add textfile
% git commit -m "textfile"
[master (root-commit) f274f23] textfile
1 file changed, 1000000 insertions(+)
create mode 100644 textfile
% cd .git
% dirsizeinbyte
165888

Gitはファイルをテキストファイルとして認識してくれました。巨大なテキストファイル(24.8MiB)を追加したにもかかわらず、リポジトリのサイズは162KiBに収まっています。これは繰り返し文字列でありzlibによる圧縮が良好に効いていることによります。

ファイルの一部(10000行目のみ)改変してみましょう。

% cd .. 
% vi textfile
(10000行目のみ改変)
% cat textfile | grep test 
10000:This is a large test file
% git add textfile 
% git commit -m "text->test" 
[master a87fd52] text->test
 1 file changed, 1 insertion(+), 1 deletion(-)
% cd .git 
% dirsizeinbyte 
317734

Gitは一行のみの変化であることをきちんと認識してくれました。しかし、リポジトリのサイズは310KiBとなっています。先ほどのリポジトリのサイズが162KiBなのでほとんど倍です。圧縮されて効率的なのは確かですが、ちょっと期待していた動作と違います。1行だけの変更なので、もう少し小さなサイズになることを期待していました。

Gitは、コンテンツの変更の際も単純にリポジトリに新しいオブジェクトとして追加します。これは高速に動作しますが、ディスク容量の観点からは非効率です。差分を探して、不必要なオブジェクトを削除するにはgit gcコマンドを使います。

% git gc 
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 1), reused 0 (delta 0)
% cd .git 
% dirsizeinbyte 
79679

リポジトリのサイズは78KiBと十分に小さくなりました。一つ目のファイルを追加した際のサイズより小さくなっています。

git gcコマンドは上記のように手動で実行することもできますが、必要と考えられるときやリモートリポジトリへのpushを行う時には自動で実行されます。

それではバイナリファイルの実験に入りましょう。リポジトリを初期化して開始します。

% yes | \rm -R .git 
% git init 
Initialized empty Git repository in /Users/kcrt/repostest/.git/
% perl -e 'for(1..1000000){print "\x00\x01\x02\x03\x04\x05\x06\xfd\xfe\xff";}' > binfile 
% wc -c binfile 
 10000000 binfile
% git add binfile 
% git commit -m "binfile" 
[master (root-commit) 8580c04] binfile
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 binfile
% cd .git 
% dirsizeinbyte 
67942

Gitはファイルをバイナリ(binfile)として認識してくれました。binfileは9.5MiBと大きなファイルですが、繰り返しが多いのでzlibによる圧縮が効率的に行えそうです。リポジトリのファイルは66KiBと期待通り小さなものになりました。

一部を改変するとどうなるでしょうか。

% ..
% vi -b binfile
(:%! xxd 編集 :%! xxd -r)
% git add binfile                                                                   
% git commit -m "small change"                                                      
[master c05696a] small change
 1 file changed, 0 insertions(+), 0 deletions(-)
% cd .git                                                                           
% dirsizeinbyte                                                                     
121847
% git gc                                                                            
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 1), reused 0 (delta 0)
% dirsizeinbyte                                                                     
36149

binfileに16バイトのわずかな変更を加えました。git gcを行うとリポジトリのサイズは35KiBとなりました。バイナリファイルでも差分による圧縮とzlib圧縮を行なって効率的にリポジトリにファイルが格納されることがわかりました。

経口セフェムメモ

自分用に薬の使い分けメモを書いていく。

いちおういろいろ調べて書いてますが無保証です。臨床で使われる方はご自分でも調べて使ってください。

第1世代

腸球菌(Enterococcus)をのぞくグラム陽性球菌・E. coliなど

  • Cefalexin [CEX] (ケフレックス)
  • Cefaclor [CCL] (ケフラール)

使い分け

  • CEXは扁桃腺への移行がCCLより悪い
  • CEXはおいてない病院・薬局が多い(らしい)
  • CEXは腸球菌への適応がなぜか通っている(もちろんセフェムなので使わないのが無難だと・・・)
  • CCLは吸収率がCEXより悪い(同量だと血中濃度が低くなる)
  • CCLはH. influenzaeに効果あり。ただし、β-lactamase産生菌には無効。
  • CCLは他のβラクタム系と比較してアナフィラキシーの頻度が10倍以上高い。
  • 第3世代(CFDN, CFPN-PI, CDTR-PI)と比較して常用量が多い(CDPN-PI 9mg/kg/day に対して CCL 30mg/kg/day)→少々MICで劣っていても血中濃度は高くなるので、感受性のあるMSSA, E.coliなら優位かも

第2世代

腸内細菌に強くなった代わりにグラム陽性菌に弱くなった。インフルエンザ菌に効く。

  • Cefotiam [CTM] (パンスポリン)
  • Cefuroxime Axetil [CXM-AX] (オラセフ)

使い分け

  • あんまりどっちも使わないからわかんない

第3世代

より広くなった。髄液移行性がよくなった。

  • Cefdinir [CFDN] (セフゾン)
  • Cefcapene Pivoxil [CFPN-PI] (フロモックス)
  • Cefditoren Pivoxil [CDTR-PI] (メイアクト)

使い分け

  • CFDNはスペクトラムがちょっと狭い。
  • というかCFDNって第2世代じゃなかったの?
  • CFPN-PIは淋菌への適応がある。
  • CFPN-PI・CDTR-PIはそれほど耐性でないPRSP・BLNARにも効果がある。
  • CDTR-PIは牛乳アレルギーの人には使えない。→最近のは大丈夫

その他

FRPM (ファロム)

  • PRSPに有効.

医療における単位メモ

なんかいっつも覚えにくいなぁと思っていたのでメモっておく

フレンチ

カテーテルの外径・シースの内径の単位。FrとかFと略す。導尿・経管栄養(NGT)・気管内吸引・心カテなどいろんなところで大活躍。考えた人:フランス人のJoseph-Frédéric-Benoît Charrièreさん。19世紀パリの医療機器メーカーの人。フランスでは「フレンチ」ではなくCharriere (略号はCh)という名前で呼ばれるらしい。

1 Fr ≒ 1/3 mm。すなわち、6 Fr = 2 mm。15 Fr = 5 mm。

ソース:French Catheter scale (Wikipedia en) とかもろもろ。

ゲージ

注射針の外径や針の太さ。CV/PIカテーテルでは外形にも内径にも用いられます。新生児に使う27GのダブルルーメンPIカテーテルもあれば透析に使う16G針まで。もっと太いCVカテーテルでは上記のFr表記が用いられることがあります。

正式名称はBirmingham Wire Gauge (またはStubs Iron Wire Gauge)。イギリス生まれの単位。Gと略す。

数字が大きいゲージほど細いです。念のため。24Gより16Gのほうが太いです。

1ゲージ大きくなったからこれだけ細くなりますよ、ってのはない(not correspond to a particular mathematical pattern)らしい。Wikipediaさんには医学においてはXX G = 1/XX inchと近似することもありますよなんてことを書いてあるけどびっくりするほどかけ離れた値が出るのであてにならない。おとなしく変換表を見たほうが安全そう。

まぁフレンチと違って「0.2mm」とか言われても細すぎてあんまり実感がわかないけど、変換表を見ればサイズは分かると。色で覚えたほうが安心安全そう。

ソース:  Needle gauge comparison chart (Wikipedia en)

挿管チューブ

単位はmm。実に分かりやすくていいですね。

超低出生体重児に使う2.0mmから成人男性に使う9.0mmまで、0.5mm刻みで製造されています。

添付文書にI.D.と記載があるので内径なのでしょう。

喉頭鏡のサイズ0とかサイズ1とかはどうやって決まってるかはよくわかりませんでした。

縫い糸

一番細い糸を#1、太い糸を#6をまず決めたが、技術の進歩でより細い糸を作れるようになり、#1より細い糸を#0, #00(=2-0), #000(=3-0)…と呼ぶようになったとのこと。サイズ一覧表

気圧単位系

血圧はmmHg(ミリメートル水銀柱)。1気圧 = 760mmHg。他分野ではどんどん他の単位への置き換えが進んでいる古い単位だけど、血圧に関してはしばらくは使う続けられると。「血圧 200/160 ヘクトパスカル」とか言われても 高いんだか低いんだかわからないし。

呼吸関係はcmH2OかkPa。1気圧≒1030 cmH2O≒101 kPa。10cmH2O ≒1 kPa。PEEPやPIPなど呼吸器の設定では未だにcmH2Oが多い。計量法に従っている吸引器や麻酔器などでは基本的にSI単位系であるkPaをちゃんと使用しているはず(cmH2Oを併記しているものもあります)。

クレアチニンとGFRの推定(成人・小児)

この投稿の内容はやや古くなっています。新しい記事をご参照ください

計算(医療計算機)

CCr, eGFR(成人)

Schwartzなど小児

蓄尿から

Cockcroft-GaultのCCr計算式

Ccr = {(140-Age) x Wt(kg)} / { 72 x Cre[mg/dL]} ( 女性は x 0.85)

日本人のためのGFR推定式(2008年日本腎臓学会)

GFR(ml/min/1.73m2) = 194 x Age-0.287 x Cre-1.094 (女性は x 0.739 Cre: 酵素法)

Schwartzの式(小児)

GFR(ml/min/1.73m2) = k x Ht[cm] / Cre[mg/dL] (Cre: Jaffé法)

k
1歳以下(低出生体重児) 0.33
1歳以下(正常出生体重児) 0.45
2~12 0.55
13~21歳男 0.70
13~21歳女 0.55

ただし、Jaffé法のCre = 酵素法のCre + 0.2

小児の正常GFR

年齢 平均GFR mL/分/1.73m2
13日(男児・女児) 20±5
414日(男児・女児) 37±7
28週(男児・女児) 66±25
8週~2歳(男児・女児) 96±22
212歳(男児・女児) 133±27
1321歳(男児) 140±30
1321歳(女児) 126±22

小児の正常血清CrJaffé法)

年齢(歳) 男児 女児
1 0.40.30.6 0.40.30.6
2 0.40.30.6 0.40.30.6
3 0.50.30.7 0.40.40.7
4 0.50.30.7 0.50.40.7
5 0.50.30.7 0.50.40.8
6 0.50.40.7 0.50.40.8
7 0.60.40.7 0.50.40.8
8 0.60.40.7 0.60.40.8
9 0.60.40.8 0.60.40.8
10 0.60.40.8 0.60.40.8
11 0.60.40.8 0.60.40.8
12 0.70.50.8 0.60.40.9
13 0.70.50.9 0.60.40.9
14 0.80.60.9 0.70.40.9
15 0.80.61.0 0.70.51.0
16 0.90.71.0 0.70.51.0
17 0.90.71.1 0.80.51.1
成人 1.050.81.3 0.80.61.0

参考文献:

日本腎臓学会編(09年)/ガイドライン 第16章 小児CKDの診 http://minds.jcqhc.or.jp/stc/0067/1/0067_G0000189_0142.html

文字列をゴミ箱に入れる

本当にあった脱力PC話」に、

わたしがこれまで最も感心した話は、オヤジBさんがワープロソフトを使っているとき、削除したい部分を範囲指定し、ドラッグしてゴミ箱に捨てようとした話だ。もちろん、ゴミ箱に捨てられるのはファイルとフォルダだけで、文字列は捨てられない。Bさんは何度も試し、たびたびPCを再起動したが、らちがあかない。だれかが「それは無理だ」と教えてあげたのだが、Bさんは「文字を小さくしたのに」とフォントサイズを下げたのにゴミ箱に入らないことが許せなかったようだ。この話を20世紀末に知人から教えてもらったとき、MacとWindowsの別なくGUIの致命的欠陥を知った。メタファーは難しいのだ。

と、書いてありましたので実際やってみました。出来ました。

環境はMac OS X 10.6.4 Snow Leopard + Microsoft Word 2008 for Mac。Windowsで出来るかどうかは知りません。

IS01とIS03で標準プレーヤ以外でもFMトランスミッタを使用する。

IS01の話題ばっかりですが。

IS01にはFMトランスミッタが内蔵されています。にもかかわらず使えるのは標準搭載のメディアプレーヤーのみでした。このソフトは設定画面を直接表示して、その他のソフトウェアでもFMトランスミッタを使用できるようにします。

ただし、メモリが足りなくなるとLMKがトランスミッタ自体を殺しますので送信が止まることかも。

注意点

  • IS01専用です。
  • タスクマネージャーソフトを利用してできるだけ空きメモリを作ってから使用することを推奨します。
  • メモリが足りなくなるとトランスミッタが追い出されて音が本体から出始めます。注意。
  • トランスミッタがオンだと本体から音が出ません。

Android Marketにうpしようかとも考えたけど、たいしたことやってないしアイコンしょぼいしでここで野良アプリで公開しておきます。気が向いたらMarketにあげようかな。

IS01 FMTransmitter 設定

注意:なんだかIS01から直アクセスだとインストールがうまくいかないようです。一度ダウンロードしてDropboxやSDカード経由で渡してみると大丈夫みたいです。

追記(2010/12/3)
なんだかIS03でも動作するらしいです。inashiroさんありがとうっ。

僕がau IS01にいれたAndroidソフトウェア

なんとなく僕がIS01にインストールしたソフトウェアをメモがわりに書いておきます。

Androidにインストールしたい方はこのarticleにからアクセスすれば幸せになれるとおもうよ。PCから下記リンククリックしても飛べません。残念。

通信系

Twicca (Tetsuya Aoyama)

Twitterクライアントではピカイチ。プロフィール閲覧からハッシュタグ検索まで全てとも言える機能がまとまっています。yfrogやtwitpicを利用して写真を載せることも。横画面でも違和感なく使用できます。

Tuboroid / 2ch Viwer(Hiroyui Narazaki)

2chを見るソフト。「anちゃん」はなぜか巡回しない設定でも無駄にServiceが常駐しますがこちらはそんなこともないです。AAが綺麗に表示できる機能付き。

K-9 Mail (K-9 Dog Walkers)

標準搭載のGMailの代替として使用しています。IMAP IDLEにも対応。十分に高機能です。

ジョルテ (Johospace Co., Ltd.)

標準スケジューラの代替として。Google Calendarの内容が表示できます。IS01は標準スケジューラが十分に高機能で不自由がないのですがなんとなくジョルテを愛用しています。

Nimbuzz (Nimbuzz BV)

MSN MessengerとSkype用に。

ConnectBot (Kenny Root and Jeffrey Sharkey)

SSHやTelnetが使えるソフトウェア。うーん、ここまでできるとは、さすがAndroid。ガラケーではこうは行きませんね。さりげなくlocal terminalも使用できます。busyboxいれてtop眺めるだけでもちょっと面白いです。「|」(パイプ)の入力の仕方がわからんとです。

画像

Adobe Photoshop Express (Adobe Systems)

簡易画像編集に使ってます。とった画像の一部分だけ切り取って友人に送るときなどに重宝。

システムその他

シェアウェア SystemPanel App / Task Manager(Next App, Inc.)
フリー SystemPanelLite Task Manager(同)

フリー版で機能は十分。ただ、すごい良いソフトだったのでお金を払いたくなって上記を購入してしまいました。タスクマネージャーの中でも分かりやすくて良いと思っています。

Simeji (adamrocker)

日本語変換ソフト。標準のは変換候補領域が大きすぎてうるさいので。IS01ではちょっとバグリ気味ですが気にせず愛用しています。

LED Light (picolyl)

デスクトップにWidgetを置いておきましょう。きっといつかやくにたつはず。

添付文書検索ツール (kaepapa)

薬の添付文書を閲覧するツールです。AndroidブラウザではPMDAのサイトからの検索は面倒ですがこのソフトを利用すれば目的の情報に素早くアクセスできます。作者は現役薬剤師さんだとのこと。

あとはファイルマネージャとDropboxをいれていますがおすすめ出来るほど使いこなせてないので割愛。なんかいいの見つけたらまた書き足します。





IS01で右サイドバーの無いアプリを作成する方法

発売して結構時間がたってるけど誰も書かないので書いちゃう。

IS01はよくあるAndroid端末と違い、特殊な解像度を持っています。一般のソフトウェアに配慮してか、右側にサイドバーが表示されてその全体を使うことは通常できませんでした。

今回のサンプルではそれを回避する方法を書いています。

package com.example.is01.fullscreen;
/*
 * IS01 FullScreen Window Sample
 *      IS01の邪魔なサイドバーを回避するサンプル
 *      Programmed by kcrt <kcrt _atmark_ kcrt.net>
 *          Nanoseconds Hunter "http://www.kcrt.net/"
 * $id:$
 */
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import java.lang.Class;
import java.lang.reflect.Method;

public class StartupActivity extends Activity {
    /** Called when the activity is first created. */
    Method setFullScreenMode;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try{
            Class<?> sgManager = Class.forName("jp.co.sharp.android.softguide.SoftGuideManager");
            Class<?> paramstype[] = {boolean.class};
            setFullScreenMode = sgManager.getMethod("setFullScreenMode", paramstype);
        }catch(Exception o){
            Log.d("is01fullscreen", "failed" + o.getMessage() + ":" + o.getClass().toString());
        }
    }

    @Override
    public void onResume(){
        super.onResume();
        try{
            setFullScreenMode.invoke(null, true);
        }catch(Exception o){
            Log.d("is01fullscreen", "failed");
        }
    }
}

結論からいうと、jp.co.sharp.android.softguide.SoftGuideManager::setFullScreenMode(true)をonResumeで呼び出してあげる事になります。これタイマーで呼び出したりできないのかな。また試してみよう。

Javaでプログラムを書くのは初めてなのでおかしかったらごめんなさいな。

あ、あとバージョンアップで潰されたらごめんなさい。

zipで欲しい人: IS01FullScreenSample

crontab temp file must be edited in place

% crontab -e
crontab: temp file must be edited in place
Snow Leopardでcrontabを編集するとこうなった。Mac OS X で cron を使う(EDITOR=vim)を参考にするところによるとset writebackupが原因の様子。保存するときに、別名で保存→元ファイルを削除→保存ファイルを元ファイルの位置へ、としているためi-nodeが変わるのが原因の様子。
元サイトの対処方法でも良さそうだけど、crontabだけ特別扱いして上げたかったので.vimrcに
autocmd BufRead /tmp/crontab.* :set nobackup nowritebackup
で対処。

仕込み

毎年欠かさずしていた果実酒作り。去年は当然というかなんというか忙しさと家に帰れなさで仕込みをできず。

今年は忙しくないというかなんというか、今月になっていきなりの出来ることの少なさと何をすればいいのか分からない戸惑いで既に2回も家に帰ってしまっています。先月までではありえないことです。

久しぶりに時間も出来たので、二年ぶりに漬け込み作業を行って見ることにしました。

梅は毎年漬けていたし、寝かせのための分を数年分ちょっとずつ残してきているので今回はパス。コーヒーも美味しかったけど、エスプレッソメーカーを使えてなくて豆がないので今年はパス。

で、何を漬け込むか迷った結果が↓

果実酒

こうなった。若干収集がついていないのではないかという意見もありますが、おそらく気のせいです。

どれもこれもおいしいものが出来そうです。一ヶ月くらいで引き上げした方がいいか、三ヶ月くらい漬け込んでおくか。徐々に変化する様子を楽しみにしていきたいと思います。

昔の仕込みのいちご酒も出してきてちょっと飲んでみたりして。やっぱり作った直後より数年寝かした今のほうが格段に美味しいですね。なんでだろう。