数弱プログラマのいろいろ

数学が苦手なのにプログラムを書いている高専生のいろいろ

Railsのデプロイ先でレイアウト変更が反映されない

はじめに

自分が経験不足なだけと思っていたトラブルに関して,割と詰まる人多いかなと思って書きます.

環境

大したことじゃないので雑にいきます.

症状

ローカル環境では反映されてたのにデプロイ先では反映されてない,とか.
rails5 assets doesn't workとか,There are differences between local(development) and deployed(production)とか.

解決策

多分二つある.

デプロイ前に毎回precompileする

デプロイ先だと,precompileされたapplication.*を読むらしい.ローカルは各assets読むからすぐ反映される.

んじゃデプロイ前にprecompileしようねってことで以下のコマンド.

$ bundle exec rake assets:precompile

これやると各assetsがapplication.*にに集結する.はいハッピー!

configいじる


production.rbにprecompileをtrueにするconfigがあったからそれ.


雑だけどあった気がする.時間がないので検証は省略.

おわりに


10分で書いたので誤記を含むと思われます.指摘していただけるとハッピーです.
これで結構長いこと悩んだ経験あるので誰かのお役に立てれば.

ではまた.

言う側の「わかりました」

「…わかりました」

割とポロっと口から出る割に,だいたいわかってない.

けれど,わかるまで説明をお願いするのも申し訳ないし,話を聞きながらではあまり整理がつかない.

メモを取るにも話が抽象的するぎる.

「すみません,いまいちわからないので,一度自分で整理します.」

一時的に話から離脱して,自分の理解を見直す.

相手の言葉が消えないうちに,自分の世界へ持ち込んで,理解を組み立てる.

理解が形になったと思ったら,相手に確認を取る.話に具体性が出て,理解を固めやすくなる.

相手の時間もとらないし,理解もできる.お互いに幸せになれる.

なぜかを考える

話す側の説明は,いまいち整理されていない.なぜなら,話し言葉のほとんどは,準備された文章ではないから.

わかりやすいための工夫をしていても,断片的でしかない.

ストリームを受け取って,リアルタイムにデータを構築できるのは,一緒にいる時間が長い人同士にしかできない(と思う).

それなら,リアルタイムに構築するのではなく,すべて受け取ってから構築を開始するべきだと思う.

話から離脱しているので,構築の余裕もそれなりにある.人との会話は,脳のリソースを結構食う(と思う).

わかるまで説明してもらうことは,また同じストリームを開始することであり,人間の場合,表現方法が変わって余計わからない.

おわりに

ここ最近で思うところがあったので書きました.

仕事を振る立場も,振られる立場も,いろいろ意識することがあるなと感じました.

ではまた.

Raspberry Pi 3に電源を繋ぐだけでSSHとVNCができる環境を構築する via Bluetooth PAN

はじめに

授業でRaspberry Piを扱うことになって,できるだけ少ない配線で作業したいなと思って構築した環境です. どっちかっていうと実用ではなく学習向けの環境かも.インターネット共有はできません.

f:id:namedpython:20170415121820j:plain

環境

初期セットアップはやっぱり装備多めになりますよね〜.

これらを最終的に上から4つ(または5つ)ぐらいまでに絞ります.

やり方

普通にセットアップしていきます.

まずはRaspbianを公式からダウンロードします.割と長い.

ダウンロードできたら,イメージをmicroSDに焼いていきます.

macOSのターミナルにて

$ diskutil list
$ diskutil unmountDisk /dev/diskN
$ diskutil eraseDisk MS-DOS RASPI /dev/diskN
$ diskutil unmountDisk /dev/diskN
$ sudo dd if=~/Downloads/xxx-raspbian-jessie.img of=/dev/diskN bs=N

Nは,環境に合わせて適当にやってください.eraseDisk前のunmountは必要だったか覚えてませんが,まあ一応やっておきます.

焼き終わったらRasPiに各種I/Oと焼いたmicroSDを差して電源を投入します.

無事起動したら,左上のスタートボタンからPreference -> Raspberry Pi Configurationをクリック.

Interfaceタブから,SSHを探してEnableしておく.Localeタブから,ロケールとかタイムゾーンとか設定しとく.

設定の適用には再起動が必要なので,ダイアログに従って再起動する.

戻ってきたらコンソールを立ち上げて,update & upgradeしていきます.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

パスワードが初期パスのままなので変えておきましょう.初期パスはraspberryです.

$ passwd
  1. 初期パス
  2. 新パス
  3. 新パス確認

の順で打っていきます.このパスはSSHのログインにも使います.

次に,ネットワークの設定をやっていきます.コンソールエディタを使いますので,いろいろ好みはあると思いますがなければインストールしておきます.

$ sudo emacs /etc/dhcpcd.conf

こいつに追記していきます.

bnep0は,今回のメインであるBluetooth PANのインターフェースです.書いといてください.

#Bluetooth PAN with my MBP
interface bnep0
static ip_address=192.168.x.y/z
static routers=192.168.l.1

xyzは好みで変えてください.

static ip_addressに設定したアドレスは,静的に割り振られます.メモっときましょう.

次に,BluetoothMacとRasPiをペアリングします.

$ bluetoothctl
[bluetooth]# scan on

こうすると,周囲のBluetoothバイスが検知されていきます.

自分のMacが検知されたら(そのMacのの名前とアドレスが出ます),一緒に書かれているアドレスをメモっときます.以降,これをBT_Addrと呼びます.

ではペアリングです.

自分がやった時割とよくFailedとか出されたので,出た場合は後述の対処をしてください.

[bluetooth]# pair BT-Addr
[bluetooth]# connect BT-Addr
[bluetooth]# trust BT-Addr

とします. これらのいずれかでBluez.Failedとか出されたら,以下の対処を試してください.

$ pulseaudio --start
$ bluetoothctl
[bluetooth]# connect BT-Addr

これでできなかったら,もうわかりません.格闘してください.

自分はこれで成功したこともあったのですが,なぜこれで成功するのかわかりません.格闘してたら見つけました.

それでは,ペアリングが完了した前提で進めていきます.確認方法としては

  • Mac側のBluetooth設定でraspberrypiが太字になっている.

  • Raspbianの左上の方のBluetoothアイコンをクリックすると,自分のMacの名前の左にチェックマークがついている

って感じです.これらが揃っていればペアリングは成功しているでしょう.

次に,Bluetooth PANを構築します.

参考にした記事はこちら

必要なパッケージをインストールしておきます.

sudo apt-get install python-dbus

スクリプトを適当な場所にwgetし,実行権限とか与えて,BluetoothPANのリクエストをMacに送信します.

$ wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
$ chmod +x bt-pan
$ sudo chown root: bt-pan
$ sudo mv bt-pan /usr/bin/
$ sudo bt-pan client BT_Addr

Macにダイアログが出てくるので許可する.

ここで一旦Macの設定に戻ります.Macの設定からネットワーク設定を開きます.左側の窓の中にBluetooth PANが出ていると思いますが,自己割り当てアドレスとなって黄色くなっていると思います.

これを修正しなければなりません.Bluetooth PANの詳細を開き,TCP/IPタブで,IPv4の設定を手入力にします.もし他の設定とかぶったりする場合は新しくプロファイルを作ってくださいね.

そして,IPv4アドレスのところをstatic routersのアドレスにします.

サブネットマスクはおおかた255.255.255.0でしょうか.

ルーターはメインのネットワークのルーターアドレスを設定しておきましょう.

これで,黄色から緑になったと思います.

ではRasPiに戻って,コンソールでIPが振られているか確認しましょう.

$ ifconfig bnep0

これで,inetのアドレスが,static ip_addressのアドレスになっていればうまくBluetooth PANが構築できています.

それでは,電源投入後自動で構築するようにしましょう.

sudo emacs /etc/rc.local

一番下にexit 0が見えると思いますが,そこの上であればどこに書いても構いません.

先ほど実行したbt-panを,ここに記述しておきます.これにはsudoは不要です.

bt-pan BT_Addr

と記述します.

ここまできたら,とりあえずテストとしてMacからSSH叩いてみましょう.

ssh pi@192.168.x.y

これでパスワード入力まで行けば成功です.一旦sudo rebootして再起動しましょう.自動でMacとつながるかどうか試します.

RasPiが起動した10秒後くらいにもういっかいSSHを叩いてパスワード入力まで行くようであれば,rc.localに書いた自動接続もうまくいっているようです.

それでは最後にVNCもできるようにしましょう.

MacからのVNCなので,プリインストールのReal VNCではできません.別のパッケージを使います.

sudo apt-get install tightvncserver

これをインストールすると,$ vncserver$ tightvncserverエイリアスされます.

$ vncserver

と実行すると,初回は接続用のパスワード設定しろと出てくるので,設定しましょう.

設定が終わると,画面の配信が始まります.気をつけて欲しいのは,配信される画面はディスプレイに映っているものと同じではなく別ウィンドウだということです.

それでは接続してみましょう.

MacのFinderを開きます.メニューバーの移動から,一番下のサーバーに接続をクリックします.

ダイアログが出てくるので,アドレス欄にvnc://192.168.x.y:5901と打って接続します.:5901もちゃんとつけてくださいね.

パスワード入力を要求されるので,入力して接続します.すると,RasPiの画面がMacに映ります!やったね!

VNCは,あくまで第二の手段として用意しておくまでです.基本的には,必要になった時にSSHから叩いてからの接続です.もし起動時に配信したいのであれば,先ほど同様rc.localに記述しましょう.

もし配信を停止したければ

$ vncserver -kill :N

で配信を切れます.Nは,$ vncserverを叩いた時に出てくるウィンドウ番号です.

けっこう長くなりましたね.お疲れ様でした.

Bluetooth PANによる接続ですが,インターネット接続は提供できません.他のやり方でできるかもしれませんが,このやり方ではできません.

しかし,僕がなぜWi-Fi共有ではなくBluetooth PANを選んだかにはきちんと理由があって,Mac/RasPi側のWi-Fi等を食いつぶしたくなかったからです.

RasPi側に,Bluetooth PAN以外に外界へのネットワーク接続をすれば,パッケージ等のインストールもSSH越しでできます.

あ,注意してほしいのですが,Mac側がスリープしてペアリングとかBluetooth PANが途切れると,他のネットワークを経由するか再起動しか接続の方法がありませんので悪しからず.

おわりに

画像とかなくてすみません.後日スクショとかつけるかもしれません.

指摘等ありましたらコメントでお願いします.

長くなってすみませんでした.あなたのRasPiライフがスマートでありますように.

ではまた.

Safariとかで出る警告『Unexpected CSS token』

はじめに

今回もGithub Issueに埋もれてるんじゃ?と思って書きます.

環境

症状

警告なのでそこまで気にすることでもないのですが,ないに越したことはないので一応対応しようと思いました. その警告は,bootstrap等のgemを利用していると出るのですが,タイトルにもある通り『Unexpected CSS token』. 10件くらいまとめて出てくるわりに,ページのスタイルが崩れているわけでもなかったので,調べました.

解法というより解説

github.com

おそらく調べると一番上かそこらに表示されるページなんですが,Issueスレたどるのって結構めんどくさかったりだいたい英語だったりするので翻訳も含めて解説しちゃいます. 大したことでもないんですけどね.

というのも,この警告はIE8やそこらへんの特殊なブラウザへのスタイル適用のためのコードが,Safariだと警告されて出てくる.ということらしいのです.

試しに,SafariのユーザーエージェントをIE8に変えてやってみたら警告は綺麗さっぱり消えました.

ユーザーエージェントは,開発タブ > ユーザーエージェント > (各エージェント) で変更できます.

開発タブがない場合は,メニューバーのSafari > 環境設定 > 詳細 の一番下にチェックボックスがあるのでそこにチェックです.

おわりに

今更ですが,生のWebをきっちり触ってからRails触りたかったと後悔しています. ではまた.

RailsのUpdateがうまくいかない

はじめに

トラブル解決というわけでもなく,格闘の結果わかったことを書きます. とある予約システムを作っていて,Submit毎のリダイレクトがうざいので非同期にしようと考えてremote: trueとかやって周りを調整してました. お客さんが触る部分はわりとすんなり非同期にできたんですけど,管理画面(ステータス表示・変更)を非同期にしたら500(Internal Server Error)吐きまして,そういう話です.

環境

  • Rails 5.0.0.1
    • development
    • SQLite3

超適当ですすみません.

症状と格闘の結果

冒頭で書いた通り,500を吐かれました.これはブラウザ側で見たエラーコンソール.じゃあRailsのログには何が残っていたかというと,

...
(1.0ms) rollback transaction
...
ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: commit transaction):
...

死ぬほど省いてますがこんな感じ.rollback?! BusyException?! リダイレクトしないようにしただけで?!と思いながら格闘開始.

database is lockedから見るに,アクセスが衝突したんだろうな〜と思いながらエラー名コピペサーチでビンゴ.なんで衝突したのかの究明へ.

  • 作成Submitはめちゃすんなりできる
  • 更新Submit&Redirectはいける
  • 更新Submitは死ぬ

これらとのコードの違いを見ていきながらデバッグしていった.

得られた結果

という感じになりました.productionで試しても良かったのですが,「まぁ管理画面くらいリダイレクトしようや」とサボローがいったので保留. 他に読んだ記事はこれくらい

最近テストコードは書くようになりましたが,デバッグは雑ってよく言われるのでおそらく解決策は存在すると思うのでもう少し格闘します.

おわりに

Atomのterminal-plusの記事がよく読まれていてめっちゃ嬉しいのでトラブル解決系書きたいんですけど,そこまでトラブルに出会わないので書けません. そういえばMacBook Pro(Late-2016)買いました.またなんか開発したいです. ではまた.

Atomのterminal-plusが動かないトラブル

はじめに

久しぶりの記事です.そして新年ですね.あけましておめでとうございます.
今回の記事についてですが,解決法がterminal-plusのIssueに上がってて自分の環境では解決したのですが,もしかして他のIssueに埋もれて見えないんじゃないかと思って記事にしようと思いました.
こういう技術系の記事ってQiitaの方が良かったりするんですかね...(小声)

環境

現時点での環境です.実際のトラブルはもう少し下のバージョンだったかもしれません.

症状

検索に引っかかるようにここに症状を書きだしときます.
英語で検索かける人向けにterminal-plus not workingとかいれとくといいのかもしれませんね.
症状は,Atom内でterminal-plusを起動しても入力待機してくれない(カーソル点滅もない)というものです.
自分はちょっとだけprofileをいじったbashを使ってるのですが,terminal-plusは各個人の環境と同じシェルをAtomに出してくれます.
f:id:namedpython:20170101181829p:plain
macOS上のターミナルの画像です.変なカスタムをしてても...
f:id:namedpython:20170101182334p:plain
ちゃんとそのまま出てくれます.
今回の症状は,
https://cloud.githubusercontent.com/assets/17022349/20955206/91868450-bc41-11e6-8c56-e17927dc0240.png
このままの状態で動かないものです.これは入力待機状態ではありません.正常なterminal-plusの動作は,各環境でのシェルと同じものになっているはずです.先ほど自分の環境の画像を出したのはこれを説明するためです.(もちろん,zsh等使っている人はそれが出ますよ!)

解決方法

いちおうterminal-plusのGithub Issueに書いてあることなのでリンクを載せておきます.
Issueのタイトルにもある通り,temporary fix(一時的修正,要は応急処置)なので,修正リリースがくると思います.もうきてたりして...
github.com
まず,メニューのAtom -> 環境設定 -> パッケージ -> 検索欄[terminal-plus]でパッケージを選択します.
f:id:namedpython:20170101185005p:plain
次にterminal-plusのパッケージ画面から,View Codeをクリックします.
f:id:namedpython:20170101185306p:plain
Tree Viewからpackage.jsonを選択します.
f:id:namedpython:20170101185412p:plain

編集画面47行目あたりに,

"pty.js": "git+https://github.com/jeremyramin/pty.js.git#28f2667",

とあると思います.これを,

"pty.js": "git+https://github.com/jeremyramin/pty.js.git",

に書き換えます..git以降を削ればOK.この時点ではまだ治っていません.
ターミナルを開いて,次のようにコマンドを打ちます.コマンドから見るにパッケージのリビルドですかね.

$cd ~/.atom/packages/terminal-plus/
$npm install
$apm rebuild

そしてAtomを再起動.これで治ると思います.

$npm install

でエラーが出た人はNodeJSが入っていないかもしれないので

$brew install node

とかでNodeJSをインストール.

$apm rebuild

でエラーが出た人はシェルコマンドが入っていないかもしれないので,メニューのAtom -> シェルコマンドをインストール でインストールしましょう.

おわりに

親切でやわらかい解説を心がけました.用語間違ってたらすみません,指摘してくださるとありがたいです.
つい最近までAtom.appを開いて使っていたのですが,あれだと環境変数参照できなかったりするんですね.LaTeXコンパイルができなくてめっちゃ悩んでました.コマンドラインから起動するようにしたら治りました....
今年もプロコンとかいろいろ頑張っていきます.
ではまた.

rvmからrbenvへの移行ごにょごにょ

はじめに

ここ最近Ruby on Railsに触れる機会を持って、環境構築で遭遇した面倒thingとその解決法を書き留めます。
CeylonとLAIは保留です。

面倒thing

遭遇したのはrvmからrbenvへの移行で起きた面倒thingです。
今回Ruby on Railsに触れる以前にどうやらRubyを触ろうとした自分がいたらしく、rvmでのバージョン管理を採用していました。
しかしRailsでのRubyを含めるとなるとrbenvの方が都合がいいっぽい(自分調べ)ので移行を決めました。
環境はOSX 10.11.5で、Homebrewが入っている前提です。
zshとかは使ってません。普通にbashです。
ちなみにrvmの導入法は覚えていません。

以下は

$rvm seppuku
$rm -rf ~/.rbenv
$brew update
$brew install rbenv ruby-build
$rbenv install i.j.k
$rbenv install x.y.z

とかを叩いた後の動作です。

簡単に言うと

$rbenv global i.j.k

と叩いても

$ruby -v

でバージョンの変化が確認できなかったというものです。

あっているかわからない解説と一緒に叩いたコマンドを並べます。


うまく動いていない~/.rbenvを消します

$rm -rf ~/.rbenv

もとのやつをクローンします

$git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

~/.bash_profileになんか書きます。

$emacs ~/.bash_profile
...
export PATH=.:~/.rbenv/bin:$PATH
eval "$(rbenv init -)"

と追記します。もし他にPATHに追加しているものがあればそれも一緒に書いてください。
自分の場合はライブラリがまとめてあるディレクトリへのパスが書かれています。

先ほどの.rbenvを消した動作の影響で

$rbenv global i.j.k

とかができないので

$rbenv install i.j.k

を必要なバージョンごとに行います。

インストール完了後に

$rbenv global x.y.z
$rbenv rehash
$ruby -v

すると、バージョンがちゃんとx.y.zに変わっていると思います。

おまけに、Rails 5.0.0.rc1の導入法もつけときます。
5.0.0.rc1はruby-2.2.2以上が条件なので

$rbenv install 2.2.2
$rbenv global 2.2.2
$rbenv rehash

もしくはそれ以上のバージョンのインストールを行い、必要に応じてglobal、localをわけてバージョンを設定します。
ちなみに僕は2.3.1を導入しました。
そのあとgemを使ってrailsの導入をします。

$gem install rails -v 5.0.0.rc1

以上でできると思います。
gemの管理はbundlerでやるとかなんとか。
できなかったらごめんなさい、何か指摘をいただければと思います。

おわりに

特に難しいことでもないですが忘れないように書き留めておきました。
Ruby on Rails、思想とかバックグラウンドの動作がなかなか魅力的なので頑張って勉強していきたいと思います。
Procon27もそろそろ書類提出の時期に入ってきました。どちらかというとそっちがメインなので頑張りたいと思います。
ではまた。