だいこんの日々2

軸足をtwitterとfacebookに移しつつも、技術的な話はここに書いていきます。

transferFrom/transferToによる2GBを超えるファイルのコピーで嵌められる

久々に書いてみる。

Javaでファイルをコピーするには、java.nioのtransferFrom/transferToを使うと早いとされていますが、そこには落とし穴が。

だいたい、どんなサイトでも以下のようなサンプルが載っています。

FileChannel src = new FileInputStream(source).getChannel();
FileChannel dst = new FileOutputStream(destination).getChannel();
dst.transferFrom(src, 0, src.size());
dst.close();
src.close();

が、これがダメなんだな。
以下のようにしないと、不完全なコピーが出来上がることがある。

FileChannel src = new FileInputStream(source).getChannel();
FileChannel dst = new FileOutputStream(destination).getChannel();
long pos = 0;
long size = src .size();
while (pos < size) {
   long add = src .transferTo(pos, size, dst);
   if (add == 0) {
     throw new IOException();
   }
   pos += add;
}
dst.close();
src.close();

そう、1回でコピーしきれないことがある。それが2G超のファイルで顕著に表れる。
(JVM実装依存だとは思うんだが。)

単純にStreamをwhileで回すだけだと問題は起きないので、高速化しようとして陥る罠ってところですな。

LED照明の導入

1年ほど前、玄関内のセンサーで自動点灯するレフランプをLED照明にしようと思ったのだが、明るさが代替できるものがなかったのであきらめたことがあった。しかし、このご時世。再度、LED照明にしてみることにした。
まず、該当のランプの仕様を調べる。ランプ自体には「TOKI RF110V95W」、ソケット側には「E26」と書いてある。まったく同じものを見つけることはできなかったが、全光束が1000lm程度であることを確認。
「うーん、そんな明るさのLED照明は出ているのか?以前はなかったような…。」とか思いながら調べると、今年出たユニティのXLEDIAシリーズがかなり明るい(X15-CJで1300lm)らしい。3年保証だし。
色々検討した結果、電球色で820lmのX13-WJにしてみた。
[rakuten:hitline:11435456:detail]
で、実際に交換してみた結果、気にならない程度に少しだけ暗くなったけどなかなかいい感じ。これで消費電力85%OFF!
あとは自治体のLED照明等購入費補助制度などを利用してみるか。

HDL4-G1.0をHDL4-G4.0に改造(6)

Debian化後にしてはいけないこと。
それはシステム初期化。
「すべて」が初期化されたw

前回のサイトの情報だけではうまくいかず、「HDL4-G1.0をHDL4-G4.0相当(3.0テラバイト)化」と「LAN-DISK Memo」を参考に現在ボリューム再構築中。

その過程でシステム初期化をしてみたら、HDL4-G4.0にはなったものの、最初のとおり、「すべて」が初期化されちゃいました。
ファームも1.00てw

HDL4-G1.0をHDL4-G4.0に改造(4)

LANDISK Home (HDL4-G) Hack」と「HDL4-G hack(2)」と「HDL-Gぷちハック手順 (最新版)」を参考にDebian化。

問題は /var/lib/dpkg/status の入手。
最小のDebian環境を作るのが面倒だったのでいろいろ試行錯誤。

# apt-get install dpkg

すると、パッケージのダウンロードは完了するが、インストールでエラーが出る。
一応 /var/lib/dpkg/status は生成されているようだ。

Status が non-installed になっているので installed に書き換え。
再度 apt-get & installedに書き換え、を正常終了するまで繰り返す。

その後、

# dpkg -i /var/cache/apt/archives/*.deb

で完了した。