Allwinner H5搭載Orange Pi PC2向けにArmbianの開発中版が出た

Allwinner H5搭載のOrange Pi PC2で動くLinux OSは、Orange Pi公式が出しているDebianとUbuntuだけでした。

Orange Pi公式の問題点は1つ。
kernelのアップデート提供実績がほぼ無い。
ある場合はOSイメージまるごと配布。

こんなんじゃ、継続運用に使えないわけです。
Allwinner系を中心にARM SoC向けにDebian/Ubuntuベースのディストリビューションとして「Armbian」というものがあります。
Allwinner H3搭載のOrange Pi向けも各機種出てますが、この度、Orange Pi PC2向けも登場しました。

Armbain for Orange Pi PC2

現状は、まだNightly版ということで開発中のモノしかありません。
「Warning: nightly downloads are automated untested builds and no end user support is provided for them!」とあるように、とりあえず出している、というやつです。

しかしながら、X-Windowが表示されるDesktop版も、しばらく使ってみた感じでは問題無く動いているようですし、一般的な用途では使えそうです。
ただ、ヒートシンクもしくは冷却ファンが必須です。
標準状態ではかなり発熱します。

2017/02/07時点でダウンロード可能な「Armbian_5.24.170202_Orangepipc2_Ubuntu_xenial_dev_4.10.0_desktop.7z」は、Ubuntu 16.04.1で、Linux kernelは4.10.0と、現在開発中の最新Linux kernelをベースとしています。

LinkStation LS410Dの1TBモデルを4TBに変えた

buffshopでLinkStaton LS410Dの1TBモデル(LS410D0101)が7,900円で売っていた。
そして、4TB HDD単品が8,800円だった。

LinkStationは、HDD初期状態からOSをセットアップできる技術が確立している・・・

というわけで、買ってみました。

  1. LS410Dの中を開ける
  2. HDDを交換
  3. LinkStationのアップデートzipを入手し、uImageとinitrdを取り出す(パスワードはググれ)
  4. Windowsマシンにtftpサーバを立てる
  5. LinkStationの電源を入れていろいろやる(詳しくはググれ)
  6. LinkStationのアップデータのexeを実行して、firmwareアップデート実施(詳しくはググれ
  7. LinkStationの初期化が終わって正常起動する

という感じで、問題無く4TBモデルが完成しました。

DTCP-IP機能も問題なく動作しています。

電子基板定規を3.6ドルで買った

Aliexpressで電子部品を見てたら、定規を発見。

基板と同じ材質で作られており、定規の機能の他に、基板上の様々な場面で使えるサンプルを盛り込んだものです。

下記の2種類があり、3.6ドルと3.98ドルと、お安い値段です。
20cmモデル「Multifunctional PCB Ruler EDA Measuring Tool High Precision Protractor 20CM Black」$3.60
30cmモデル「30cm Multifunctional PCB Ruler EDA Measuring Tool Black」$3.98

私が買ったのは3.6ドルの20cmモデルです。

2017/1/19発注で、2017/02/02到着と、約2週間で届きました。

PowerShellで巨大なファイルをGet-Contentし、Export-Csvするのを省メモリで行う

PowerShellで、ファイルを加工し、CSVファイルに出力する、ということを行った。

しかし、Get-Contentで取得したファイルを、下記の様にそのまま変数に突っ込むとファイル容量の数倍のメモリを確保しまう、というPowerShellの仕様が存在することがわかった。

$inputfile="c:\tmp\input.txt"
$inputdata=Get-Content $inputfile -Encoding UTF8 
foreach($line in $inputdata){
  いろんな処理~ 
}

しかも、配列を追加していく処理は重いらしく、かなり時間がかかる。

開発段階では、元のファイルサイズが1MB程度だったので気がつきませんでしたが、500MBや800MBになると、とんでもなくメモリを食っていました。

配列を確保しないで、次の処理を行わせるようにするには、パイプで繋いでForEach-Objectで回します。

$inputfile="c:\tmp\input.txt"
Get-Content $inputfile -Encoding UTF8 | ForEach-Object {
  $line=$_
  いろんな処理~
}

これにより、Get-Contentで読み込んだファイルに対するメモリ確保は行わずに、次の処理を行わせることができるようになります。

次に、各行を処理した結果をcsvファイルで出力する方法について改善します。

例えば、下記の様に出力結果を$results配列に入れ、それをまとめてexport-csvする、というのが簡単な実装でしょう。

$inputfile="c:\tmp\input.txt"
$outputfile="c:\tmp\output.csv"

$results=Get-Content $inputfile -Encoding UTF8 | ForEach-Object {
  $line=$_
  いろんな処理~
  $output = New-Object -TypeName PSObject
  $output | Add-Member -MemberType NoteProperty -Name "Name" -Value $name
  $output | Add-Member -MemberType NoteProperty -Name "Value" -Value $value
  $output | Add-Member -MemberType NoteProperty -Name "Details" -Value $details
  $output
}
$results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber

これも、input側と同じく、配列のメモリ確保問題があります。

しかし、Export-Csvは、配列を使わないと出力できませんし、ファイルの入出力処理を毎行実行するにはコストが高いです。 (ファイルを開く処理、閉じる処理というのは一般的に遅い)

1000行ぐらいであればメモリへの影響も少なく、また、1回当たりの書き込み負荷もそれほどではないようなので、1000行に1回、Export-Csvを実行するようにしたものが、下記です。

$inputfile="c:\tmp\input.txt"
$outputfile="c:\tmp\output.csv"

$results=@()
$linecount=0
Get-Content $inputfile -Encoding UTF8 | ForEach-Object {
  $line=$_
  いろんな処理~
  $output = New-Object -TypeName PSObject
  $output | Add-Member -MemberType NoteProperty -Name "Name" -Value $name
  $output | Add-Member -MemberType NoteProperty -Name "Value" -Value $value
  $output | Add-Member -MemberType NoteProperty -Name "Details" -Value $details
  $results+=$output

  $linecount++
  if(($linecount % 1000) -eq 0 ){
    $results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber
    $results = @()
  }
}
$results | Export-Csv $outputfile -Encoding UTF8 -NoTypeInformation -Append -NoClobber

これにより、読み込ませるファイルが大きい場合でも、PowerShellが使用するメモリ容量を少なく抑えることが可能となりました。


NetAppのperfstatデータ収集ツールで取得したファイルを分解する」で1行1出力で動かしてみたところ5時間かかりました。それを1000行まとめてから出力かけるように変更したところ2分で終わりました。

やはりファイル出力処理は重いですね。