Raspberry Pi 3でハマった箇所 その2
exFATはデフォルトで対応していない
NASサーバーとして他端末からファイルアクセスできるようにしたかったため、
余っていたexFATフォーマット済みの、Seagate SSHD 500GBをSATA to USBケーブルで接続しました。
その後、mountを試みるも以下のメッセージが。
$ sudo /dev/sda2 /mnt/sshd1 mount: unknown filesystem type 'exfat
Linuxだと基本的にデフォルトではサポート対象外なんですね。
apt-getでexfat-fuseをインストールして対応しました。
外付けHDDを自動マウントさせる
その後、起動時に自動マウントするために、fstabに設定を書きましたが、reboot後はmountが外れてしまいます。
調べるとこちらの記事が見つかりました。
/etc/fstabのパースがHDD認識と同時またはそれ以前に行われてしまう
とのことで、コメント欄の通り私はcrontabに以下のように設定して、無事自動マウントできるようになりました。
@reboot mount /mnt/sshd1
Raspberry Pi 3でハマった箇所 その1
先日Raspberry Pi 3を購入しました。
一番の目的は安価なNASサーバーとして活用することなのですが、
軽く調べてみただけでも他に色々試したいことが出てきています。
これじゃあ1機では足りないので、とりあえずマルチブートで運用することにしました。
しかし当然のようにすんなり行くはずもなく、あれこれ調べながらやっています。
BerrybootはFATじゃないと動かない
最初、TranscendのmicroSDXCはSD Formatterを使用したため、exFATでフォーマットされていました。
しかし電源ONにしても画面が映らなかったため、Raspibian単体でやり直すとあっさり起動。
BerrybootのサイトをみるとFAT formattedと指定があったため、 FAT32でフォーマットし直して無事起動できるようになりました。
SD規格外なので若干もやもやしますが...。
Raspberry pi 3の無線は2.4GHzのみ
WiFiで接続しようと思ったら、WiFiリストネットワークに自分のルーター(AtermWG600HP)のSSIDがなぜか出てこない。
Macbook, iPhone, iPadでは全て表示されるのになぜ...と思い、ルーターの設定画面を除くと、2.4GHz通信機能が無効になっていました。 忘れてたのですが、どうせ5GHz帯しか使用しないし、リストに同じようなSSIDが4つも出てくるのが紛らわしいので無効化していたのでした。
マルチブートの場合でも、各OSの固定IPは違うものにした
とりあえずRaspbianとRetropieでマルチブートできるようにしましたが、
サーバーとして利用するので、それぞれのOSでIPは固定化しました。
しかし、設定後2つ目のOSにSSH接続を試した時に以下のような警告がでました。
MacBook-Pro:~ user$ ssh pi@192.168.10.5 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is 2b:cd:cb:1f:5c:c8:bd:88:0f:e1:a5:d0:cf:71:6a:45. Please contact your system administrator. Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message. Offending RSA key in /Users/user/.ssh/known_hosts:13 RSA host key for 192.168.10.5 has changed and you have requested strict checking. Host key verification failed.
1つ目のOSに接続した際の鍵が残ってるのに、同じIPで別のOSに接続したので鍵が違うと言われたのでしょうか。
この警告無視する設定もあるようですが、固定IPのホストアドレスを一つずらすことにしました。
Electronの勉強会に行ったので感想
参加したのはこちらです。
セキュリティ対策がとにかく大変
開発側がセキュリティに対してそんなにやる気がないということで、
XSS対策ひとつにしてもこんなに大変なのかと思いました。
とにかく、自分のような浅いことしかわからない人は
Electronを使うにしろ割り切って用途を限定したほうが(今は)よさそうですね...
社内ツールだったらあり
個人的には、社内のWindowsマシンでちょっとしたお役立ちツール、
本来.NETとかVBSとかbatchで作る系のものを、GUI作りたいしカッコつけてElectronでやろうとしていて、
しかしそれだとクロスプラットフォームな利点を潰してるし結局自己満だなあと思ってました。
でもこの発表を聞いてみると、
むしろ数少ないElectronが使えるケースということがわかったので意外でした。
総じてかなりdisられているのが驚きだったんですが、
僕は少しやる気になれました。
コールバック関数の中でthisを参照
forを書くのが嫌で、underscoreの._eachでコールバック関数の中でthisでプロパティの値を取得しようとして失敗したもの。 this.basePathとかやってる部分でundefinedになってしまって、このときは_.eachを諦めてfor構文でやったのですが。
Setting.prototype.parseFiles = function(jsonFiles) { var self = this; _.each(jsonFiles, function(file) { var propName = file.match(/^.*\\(.*)\.json$/); // ex: one WScript.Echo(Setting.basePath) self[propName[1]] = JSON.parse(includeFile(self.basePath + "\\" + file)); // setting.one }); }
それで、thisを一旦変数に逃がすといけるということを知りました。 基本でした...
エンジニアじゃなくなったのでプログラミングを趣味にしたい
7月中旬から7月末までの2週間, JavaScript勉強会と称して、1対1で主にVue.jsを教えてもらっていました。
家にいるとき自然とテキストエディタを開けるようになれてる気がします。
@5t111111さん勉強会、ありがとうございました!!
— a0sy (@a0sy_tw) 2015, 8月 3
失業期間中の短い間でしたが、結果とても有意義な時間を過ごすことができたと思っています。
良かったことは、
- Git(& Github)がCUIで自然に使えるようになった
- Vue.jsはまだ初歩段階だけど、公式サイトなどを参照して自分で学習していく流れがつかめるようになった
- Blog(アウトプット)を書くようになった
といったところです。特に、余暇でもコードに触れるような状態に持って行けたのが、自分にとっては素晴らしい効果になったと考えています。
プログラミングを趣味にしたい
そもそも、趣味とかって、やるぞ!という感じでやるんじゃなくてもっと自然にやるものです。 本職がエンジニア、であってもなくてもTech系Blogなどでアウトプットしてる方たちは、なんか好きでやってるんだなあというのが伝わってきます。
僕はついこの前までIT企業の会社員でしたが、正直こういったことは別段好きという感情もなく、どちらかといえば苦手意識のほうが強かったのです。
そういう所だと(ステレオタイプな言い方ですけど)ナチュラルボーン理系、みたいなやつも入ってくるし、そういった人たちを見ているとやっぱ向いてないなあ等と思っていました。
でも、今回転職が決まって、webとかソフトウェアとはあまり関係ない世界に行くことになりました。
本職では無くなった分プレッシャーもないし、知識の無さに焦らなくても良いし、逆にポジティブな接し方がこれからはできるんじゃないかなと...その第一歩がこの勉強会で踏み出せたような気がします。
実際今回は自分でも意外に楽しくやれたなと感じていて、続けられればこれから一人で学習していくよりもっと早く成長できそうなので、惜しい気持ちもあります。
今後やりたいこと
そこで、今後やりたいことを書いてみましょう。
- todoじゃなくて別のなにかを作る
-> 勉強会ではtodomvcと同じようなものを作っていました。 とりあえずネタを思いついたので、(勿論既にネットに同じようなものはたくさんあるものですが...)ちびちび作ろうと思います - 他の勉強会に行ってみる
-> JavaScript系は残念ながら初心者向けのがほとんどないみたいなので、他の言語やフレームワークを触って興味を持てるものがあったら...
勉強会は本当に行かないとダメだなと思ってます。
やはり人と会って、やれる環境を作ってしまった方がモチベーションを保てるだろうと感じます。学生時代一人で勉強なんてできなかったのでなおさらです。
果たして、趣味にすることはできるのでしょうか。
多分、プログラミングを本当に好きになって、純粋に楽しめるようになったらいけるかなと。
まだまだ、自分の中でゲームしたりといった遊びと同じ感覚でやるようになるには時間がかかりそうですが、続けられればいいなと思います。
webpackで画像を読み込む
前回は画像を扱いましたが、こちらで書いた構成だとエラーになってしまいます。
問題箇所
このCSSの、url指定で読み込んでいる画像でエラーが起きます。 対応するloaderが入っていないと駄目みたいです。
.first-form { background: url("../images/freeza-first.jpg"); width: 400px; height: 232px; } .second-form { background: url("../images/freeza-second.jpg"); width: 280px; height: 300px; } .third-form { background: url("../images/freeza-third.jpg"); width: 200px; height: 288px; } .fourth-form { background: url("../images/freeza-fourth.jpg"); width: 280px; height: 460px; }
その1: url-loaderを使う
jpgを扱う場合、moduleのlordersに下記のように追加すれば利用できます。
- webpack.config.js
module: { loaders: [ { test: /\.jpg$/, loader: "url-loader?mimetype=image/jpg" } ] }
無事に画像もエラー無くwebブラウザで表示されますが...
Developper Toolsで確認すると
.first-formの場合、
.first-form { background: url(data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAcFBQYFBAcGBQYIBwcIC…J2dcarOm4Pry3onp2eau1hA2HazqJousbZeUP4KBeqEqfSFjgT2NIk2wq1btx55YYzj/K5/9k=); width: 400px; height: 232px; }
画像がBASE64エンコードされてしまい、ファイル名がこんな文字列になってしまいます。 data URI schemeというらしいですが、短所も結構あるし、普通のファイルとしても扱いたいところです。
その2: file-loaderを使う
こちらもjpgの例です。
- webpack.config.js
module: { loaders: [ { test: /\.jpg$/, loader: "file?name=[path][name].[ext]" } ] }
(file?name
の後の書き方はgithubのExampleにあります)
こうするとwebpackが画像をビルドしてくれますが、プロジェクトのルートディレクトリに画像が出来上がってしまうので、"build"というディレクトリに出力するようにしました。
module: { loaders: [ { test: /\.jpg$/, loader: "file?name=build/[path][name].[ext]" } ] }
ついでに、 bundle.jsも"build"ディレクトリに出すようにすれば、webpackでビルドされたものがまとまって良い感じになります。
- webpack.config.js
module.exports = { entry: './js/app.js', output: { path: __dirname, filename: 'build/js/bundle.js' }, module: { loaders: [ { test: /\.html$/, loader: 'html?minimize' }, { test: /\.css$/, loader: "style!css" }, { test: /\.jpg$/, loader: "file?name=[path][name].[ext]" } ] } };