2019年7月29日

Giga LANDISK(HDL-G)を復旧する

はじめに

14年前位に購入したアイ・オー・データ機器のGiga LANDISKというNAS製品があったのですが、ある日HDDが調子悪くなり、中のデータだけPCに退避してしばらく放置していました。

これより高性能なラズパイがある今、復旧させる必要性もあまり感じなかったのですが、当時バッファローの玄箱に代表される組み込みLinuxの学習環境として愛着が多少はあったので、残りの余生をデータ退避先として過ごしてもらおうと復旧作業を行ってみた次第です。

準備

復旧手順は、
  1. 新しいHDDと交換する
  2. Linuxをインストールする
だけなんですが、この製品のHDDは今主流のSerialATAではなくパラレルATAのため、新品での入手はほぼ絶望的で、今回は仕方なくヤフオクで中古を仕入れました。

次のLinuxにインストールについても、時間が経ち過ぎてネット上の情報が少なくなっているのと、この製品をサポートしたLinuxカーネル(Debian)は5世代前のwheezyで、LTSも去年の5月で期限を迎えていました。
(しかも次のバージョンのjessieではサポート自体切られている。。)

HDDにインストーラーを入れる

いくつか不安要素はあったものの、ダメならその時は寿命と諦めるという事で、まずはHDDにDebianのインストーラーを入れるため、母艦PC(Windows)上のHyper-VにUbuntuをセットアップします。

その際、パラレルATA-USB変換ケーブルでHDDと母艦PCを繋ぎますが、デフォルトでは母艦PC側にHDDがマウントされてHyper-V側に接続できないため、ディスクの管理よりHDDをオフラインにしておく必要があります。

オフラインにしたHDDを無事Hyper-V側にマウントできたら、Ubuntuのターミナル上でHDDのセットアップを行います。
# マウントされたHDDデバイスパスを確認
$ sudo fdisk -l
(/dev/sdbなどに表示を確認) 
# インストーラーを入れるパーティション100MBを確保
$ sudo fdisk /dev/sdb
d で既存パーティションを削除
n で新規パーティションを作成
開始シリンダ数は2048でそのまま、次のサイズ指定で+100Mを入力して100MB分のパーティションを作成
p で作成されたパーティションを確認
w で結果をHDDに書き込み 
# 作成したパーティションをext2でフォーマット
$ sudo mkfs -t ext2 /dev/sdb1 
# HDDに読み書きできるようマウント
$ sudo mount /dev/sdb1 /mnt 
# インストーラーをダウンロード
$ wget http://ftp.riken.jp/Linux/debian/debian-archive/debian/dists/wheezy/main/installer-armel/current/images/iop32x/network-console/glantank/initrd.gz
$ wget http://ftp.riken.jp/Linux/debian/debian-archive/debian/dists/wheezy/main/installer-armel/current/images/iop32x/network-console/glantank/preseed.cfg
$ wget http://ftp.riken.jp/Linux/debian/debian-archive/debian/dists/wheezy/main/installer-armel/current/images/iop32x/network-console/glantank/zImage 
# インストーラーをHDDにコピー(initrd.gzは.gzを外してリネーム)
$ sudo initrd.gz /mnt/initrd
$ sudo preseed.cfg /mnt/preseed.cfg
$ sudo zImage /mnt/zImage 
# initrdとzImageに実行権限を付与
$ sudo 0777 /mnt/initrd
$ sudo 0777 /mnt/zImage 
# HDDをアンマウント
$ sudo umount /mnt
以上の作業が完了したら、母艦PCからHDDを取り外し、Giga LANDISKに取り付けます。
この後、最初は機器上のUARTからシリアルコンソール経由でインストール作業を行っていたのですが、時間が経つと応答が返ってこなくなってしまったため通常通りSSH接続にて行いました。
(なお、UART端子はこちらの情報を参考に、▼マークから3.3V、RxD、TxD、GNDの順となっているため、それに従ってUSB-シリアル変換ケーブルとシリアルコンソールを115200/8-N-1に設定して接続します)

ミラーサイトをdebian-archiveにする

Giga LANDISKに有線LANケーブルを接続し電源を入れて数分待つと、DHCPによってIPアドレスが振られてSSHでアクセスできるようになります。
(ユーザー名はinstaller、パスワードはinstall)

詳しい画面はこちらのサイトが参考になりますが、ミラーサイトの選択については前述の通りwheezyはサポート切れのため、一般的なミラーサイトを選択してもエラーが出て次へ進めません。

そのため、Choose a mirror of the Debian archiveで"enter information manually"を選択し、
  • Debian archive mirror hostname に ftp.riken.jp
  • Debian archive mirror directory に /Linux/debian/debian-archive/debian
を入力してミラーサイトを手動で設定する必要があります。
(ftp.riken.jpで決め打ちするより、cdn.debian.orgなどCDNを設定した方がいいかも)

以降は案内に従ってインストールを進めると、無事Debianがセットアップされます。

その他

WiFiルーターの有線LANポート節約のため、USB-Ethernet接続で内蔵イーサネットポートが空いているラズパイにGiga LANDISKを接続しています。そのため、ラスパイ側と母艦PC側で静的ルーティングの設定を行います。
# Giga LANDISK側のIPアドレスを設定
$ sudo vim /etc/network/interfaces
auto eth0
iface eth0 inet static
  address 10.0.3.2
  netmask 255.255.255.0
  gateway 10.0.3.1
  dns-nameservers 10.0.3.1 
# ラズパイのIPフォワーディングを有効にする
$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1 
# 内蔵イーサネットポートにIPアドレスを設定
$ sudo vim /etc/dhcpcd.conf
interface eth0
static ip_address=10.0.3.1/24
static routers=10.0.0.1
static domain_name_servers=10.0.0.1 
# IPマスカレードを設定
$ sudo vim /etc/rc.local
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE 
# 母艦PC側でルーティングテーブルを追加
> route -p add 10.0.3.0 mask 255.255.255.0 10.0.0.3

おわりに

aptコマンドじゃなくてaptitudeコマンドだったり、sambaがSMBv1のため最新のWindowsから接続できないなど細々と問題はありますが、それを解決していくのも組み込みLinuxの醍醐味だったりします。
(自分だけ?)

2019年6月30日

ScalaMatsuri 2019に行ってきた


前回の投稿が「ScalaMatsuri 2018に行ってきた」で、その間何も投稿していなかったのかと軽くショックなのですが、今年は初日が平日開催だったのでお休みを頂いてお邪魔してきました。

1日目

Scalaライブラリを作る前に知っておきたいメンテナンスのこと
ライブラリを提供するにあたって、どうやったら使ってもらいやすいか(特にJavaとの相互運用性)や、リリースバージョン間の互換性や依存関係など、普段のサービス開発とは異なった視点が必要なところは面白そうに感じました。

Scalaにおける型クラス入門
”型クラス≒型システムにより支援されたストラテジパターン”という切り口が個人的にしっくりきたのと、Scala2のimplicitとScala3からのdelegate-forに書き方が変わるという情報が収穫でした。

コードで理解するPlayFrameworkの脆弱性
PlayFrameworkで過去に報告された脆弱性を例に、何が原因でどう対策したのかの解説が行われたのですが、どれも何気に普段の開発でも踏みやすいような内容だったので、後からじわじわと空恐ろしくなりました。。

ScalaプロジェクトでEffを使用する利点
Futureとfor式を使ってScalaっぽく書きたい(けど挫折した)身としては、より便利とおすすめされるEffはとても気になりました。

こんなに違うScalaとKotlin
ScalaとKotlinの構文的やリストの挙動の違いを見て、Scalaと構文が似てる気持ちでKotlinに入門すると痛い目を見そうな感じがしました。

DOT計算をやさしく説明する
不勉強でうまく感想を書くことができませんが(汗)、プログラミング言語が満たす性質を証明する何か(チューリング完全?)のような印象を受けました。

ハイパフォーマンスScala
ExecutionContextやリストの特性、Boxing/Unboxingの挙動に気を使うことでより高いパフォーマンスを出すコードを書くためのコツを知ることができました。計測大事。

Scala💛Graal
個人的に最近気になっているGraalについてTwitter社での取り組みについての発表でしたが、GraalVMとGraalは異なるもの(後者はJavaでのJIT実装)で、JVM標準のJITよりモダンなコードで書かれたGraalをチューニングすることでパフォーマンス改善を行うための試行錯誤の過程が面白かったです。

継続とDI
オブジェクト指向言語でよく行われている委譲とDIに対し、関数型言語では”継続”というアプローチを取ることでアドホックに合成がしやすいなど、両言語の特性を使えるScalaならではの使いどころなどが説明されました。

2日目

仕事でScalaを使おう - Arm Tresure DataでのAirframe活用事例
Scalaのロギングライブラリを探していた際、たまたま見つけたのがairframe-logで、そこからちょっと気になっていたので今回いい機会となりました。

いかにして我々は10年もののPerlプロダクトをScalaでリプレースしたか
”レガシーシステムをScalaでリプレースする”は鬼門のように感じていた時期があったのですが、こうやって着々と完走した事例が紹介されるのを見ると、必要なのはやりきる力なんだと改めて思いました。

over40の転職成功事例(オフレコ枠?)
今いらっしゃる職場に至るまでの経緯(しくじり)とその対処法、組織での振る舞いや心構えなどの発表と議論が行われました。

ScalaでWeb開発するときのデファクトな構成が知りたい
Webフレームワーク、DBライブラリ、JSONライブラリのそれぞれで、参加者の方が業務でよく使われているプロダクトの多数決とそのいいところの共有が行われました。

gRPC gateway with Scala
セッション後の質疑応答の中で、実務としてのマイクロサービスでの開発や運用が普通に語られているのが印象的でした。

From Go To Scala Easy vs Simple
Go言語とScala(とKotlin)の"Simple"と"Easy"の感じ方の違いや、C++やSwiftも参戦しての熱い議論(プロレス)が行われました。みんなちがってみんないい。

Finagle(thrift) admin-page probrem
Finagleでやり取りされるthriftのraw dataが格納されたMySQL(KVSとして有名!)の管理ツール画面フォームを、thriftのコンパイラが生成するASTより生成する発表が行われました。

おわりに

Scalaを触る時間が少しずつ増えてきたせいか、アカデミックな内容からより実務的な内容を選択したような気がしました。implicitは怖さが少し軽減されてきたので、次は既存の課題をScalaらしい関心の分離が行えるような取り組みを行っていきたいと思います。

2018年3月19日

ScalaMatsuri 2018に行ってきた

今年も昨日と今日東京国際交流館で行われた「ScalaMatsuri 2018」にお邪魔してきました。

去年の初参加の際にレベルの高いセッションの数々はとても刺激になったので、今年はScalaを本格的に使うための学びを得られるようなものを選んでみました。

1日目

Scalaの言語特性の一つとしてComposabilityが高いことがあげられ、それによって問題を分割(分割統治)しやすくなり実装が簡単になるという事が説明されました。講演後の質問で、分割される事によって可読性が下がる事については、HowとWhatがうまく分離できていないとそうなる恐れもあるという回答は個人的にしっくりきました。

「暗黙」とうまく付き合うためのTips
ScalaのハマりどころであるImplicitについて、InteliJ IDEAを使った調査方法のデモや、理解を進めるためのコツなどが分かりやすく解説されました。”Enrich my library”パターンの効用として出てきた今は非推奨のJavaConversionsの動きがエグかったです。。

Listのmapを改善するところから始まり、Optionやエラーを絡めた場合の例がどれも実用的で改善される感じが肌で感じられたのがよかったです。
(Javascriptでdeferやpromiseに初めて触った時の体験に近かったかも)

Scalaでの部分的な関数型プログラミング
避けられない副作用を認識し、それを取り除いていきながら純粋な層と副作用のある層を分離していったら、純粋な層はテスト可能な核となるビジネスルールになったというところは自分たちのシステムを見直す観点としてとても興味深かったです。

関数型プログラミングの比較対象としてよく出てくるHaskellとScalaの違いを、サンプルコードを交えながら解説されました。

JVM上で動くHaskellであるEtaを紹介する講演でしたが、最初にHaskellとScalaの違いについて、”HaskellではIOが型に現れるためコンパイラでチェックが可能”という説明が目から鱗でした。
(あとログ出力も副作用扱いというのも驚きました、、なにそれこわい)

Scalaらしいオブジェクト指向プログラミング
Scalaの言語特性を生かした依存性の管理方法などが説明されました。”コンストラクタを見れば依存関係が分かる”といったところから、コード設計の見通しや不穏なところを感じ取るところは過去の経験ならではといった感じでした。

ブロックチェーンはどうやって動くのか、オレを5歳児だと思って説明してくれ
ビットコインなどで使われるブロックチェーン技術について、歴史的経緯や使われている技術、分散システム特有の問題などを踏まえながら、実際に講演者が作成した手荷物トラッキングを例に説明されました。

2日目

今年もアンカンファレンス形式で行われましたが、結構聞きたかった内容が被りました。。

JVM+ScalaでLambdaを使用すると性能や費用的に問題があった(でもScalaは使いたい)ため、scala.jsでJavascriptに変換(+フロントエンド側とコード共有)してnode.js上で動かすという事例の説明でしたが、実験ではなく既に本番投入されているのが驚きでした。

VS Code Scala
Language Server Protocolの説明と、講演者が開発されているVS Code上でScalaを開発するためのプラグインの紹介が行われました。

エンジニア組織づくり(オフレコ枠)
研修教育や組織体制などの悩みや知見が共有されました。

人材ブラックホール化計画(オフレコ枠)
各社の採用戦略やどういう人材を求めているかなどについて意見が交わされました。

JVM Web Application Metrics & Monitoring
メトリクスの収集方法や形式、JVMで取得するべき項目についての説明が行われました。その中で今後Java界隈ではデファクトになりそうというMicrometerがいいとの事で、この辺の情報は手薄だったのでとても参考になりました。

前にScalaPBに入門してみたものの、あえなく挫折したので再入門の意味も込めて選択しました。スマホアプリ界隈では採用事例を多く聞くようになったgRPCですが、ScalaにはFinagleやAkkaもあるせいか、メッセージ再送やリトライなどについて質問が集まっていたのが印象的でした。

Scalaで転職すると年収は上がるのか(オフレコ枠?)
会場内で無記名で転職前と転職後の年収の変化について投票を行い、その結果の開票と傾向について議論が行われました。

おわりに

この記事を書きながら去年の内容と見比べてみたのですが、少しScalaを触った影響かより実用的な内容を多く選択したような気がしました。今年はgRPC(ScalaPB)を使った既存資産(Java)との連携や、モナド周りの一層の理解に努めてみたいです。