有能なフリ

有能ではないが、有能かのように振る舞う

ブログサイトのプロトタイプをRailsで作ってみた

はじめに

内定先の研修の一貫として、入社までの数ヶ月に目標を課して達成するというものがあり、その目標の一つとしてブログサイトを作ってみようという目標を立て、そのプロトタイプを作ったのでその開発記を一旦つけたいと思います。

特に面白いものはないですが、一応見れます。

https://namedpython-mysite.herokuapp.com/

卒研等々でWeb開発自体が久しぶりで、「あれこれどう書くんだっけ」とかRuby自体の文法とか結構抜け落ちてしまっていてすごくショックでした。思い出しながら開発しています...。

環境

途中で友達が静的サイトジェネレータ(e.g. Hugo)などで作っているのを見かけて、そっちの方がスマートだよなあとは思いつつも、Railsでの開発を思い出すためにこれで開発しました。

Markdownをブラウザで投稿して、表示する際にHTMLで表示するようにしたかったので、gemとしてcommonmarkerを導入しました。レイアウトやデザインは、お気に入りのMaterializeCSSを使いました。gemはmaterialize-sassです。

Sassのコンパイラがdeprecatedか何かされていたので、sassc-railsを導入しました。

道のり

設計

まずは軽く設計だ!と意気込んで機能リストなんか作ってみましたが、記事自体はArticleモデルがあればいいし、投稿ユーザも一人なのでわざわざUserモデル作る必要もありませんでした。 なので、開発の順番としては以下のようになりました。

  1. 開発およびデプロイ環境の構築
  2. ArticleをCRUDを整える
  3. CRUDが最低限できるViewをレイアウトする
  4. CRUDのうち、Rのみを公開
  5. AdminDashboardを作り、ArticleのCUDを管理する
  6. ルーティングと認証実装
  7. Materializeによる装飾

環境構築

個人開発なのでそこまでガチガチに整える必要はないのですが、実用的な手の動かし方を復習したかったので、最低限CircleCIのビルドが通ってからHerokuにデプロイするという環境を構築。

f:id:namedpython:20190328110416p:plain
CircleCI

f:id:namedpython:20190328110538p:plain
Heroku

この手順ですらきっちりつまずいているので、先行きが不安でした。

Scaffoldは使わずに

自動生成は生産性を上げてくれるので大賛成ですが、思い出すためにもコントローラのアクションは一つ一つ書きました。

f:id:namedpython:20190328111045p:plain
開発中

かなりシンプルな感じですが、こういうところからじんわり作っていくの大事だよな〜って思ってやってました。

認証は少し雑

そもそもブログ記事執筆と閲覧が同じアプリケーションに乗ってるのがどうなんだって感じなので、もはや設計からやり直しレベルなのですが、AdminDashboard的なものを作って、before_actionでDigest Authを呼ぶような形にしました。デフォルト値はuser:passwordですが、ENVをfetchしてセキュア(?)な感じにしました。

f:id:namedpython:20190328111614p:plain
digest auth

もうMaterializeで装飾されていることがわかると思います。あらかたViewが固まったあたりからレイアウトしました。たくさん使っただけあって結構覚えていました。

ひとまず終わり

ここまで作っておいてアレですが、実際に運用するならもう少し設計を考え直さなきゃだよなと思ったので、これはプロトタイプとして捉えて、きちんとした形で(ドメインもとって)公開できたらいいなと思っています。

クォリティはすごくお察しですが、ひとまず開発のフローは追えた気がしているので満足しています。

おわりに

Webエンジニアとして就職するのに、めちゃくちゃ先行き不安な形になったかな...と思いますが、開発の勘はどこかで寝坊していると思っているので、社会人生活の中で早めに取り返していきたいと思います。

ではまた。

プログラミングとはを人に知ってもらうために

はじめに

またまたエントリを書きます。ここ数年、エンジニア以外で関わった人たちに一回は語ってしまうテーマとして、このエントリを書きます。

きっかけ

冒頭でも述べたとおり、エンジニア以外の人と関わると必ず一回は「プログラミングとは」という話題に触れます。自己紹介した時にも、「へぇ〜プログラミングやってるんだ」の流れであったり、僕がエンジニアであることを知っている人がプログラミング教育の義務化の話題について振ってきた時にも、この話題は発生します。

あくまで僕が思っていることな上、プログラミングという「上には上がいる」世界でプログラミングを語るのはとても恐れ多いことですが、言葉にして自分の中で整理してみます。

実際人に説明するときは、飽きないように端折りながら説明しています(それでも長い)。

そもそもコンピュータの話から

発明のきっかけは軍事目的だったような。映画「イミテーション・ゲーム」でその開発物語が描かれています。PrimeVideoで見れるので、みていない人は是非見てみてください。2回くらい見るとほぼ全ての面白さを回収できると思います。

www.amazon.co.jp

作戦本部から潜水艦などに送られる通信は、傍受は可能であっても暗号化されていて人には理解できませんでした(エニグマ暗号)。この暗号を読み解くために開発されたものが、今のコンピュータの元祖となっています(だった気がする)。

そしてプログラミングの元祖へ

実際に扱ったことがあるわけではなく、知識としてあるだけですが、「長い紙にパンチで穴を空けた」プログラムというものの存在を話します。

ja.wikipedia.org

「穴の位置と組み合わせによって処理する」みたいな説明をしています。この話は割と「へぇ〜」というような反応をもらえる気がします。

コンピュータの進化とプログラムの進化

ブール代数が発明された頃でも、まだ0/1の管理は機械式でした。それが今ではトランジスタの電圧によって管理され、扱えるビット長も長くなっています。これを「扱える情報量が増えて」という簡単な表現で説明し、それに合わせてプログラムはもっと扱いやすく、もっといろんなことができるように進化してきたということを話します。 それまではコンソールアプリケーションだったプログラムも、Webやゲーム、GUIの需要からビジュアルやデザインの分野まで風呂敷が広がっています。

今必要とされているもの

そして、プログラミング教育が義務化される中何が求められているかというと、「論理的思考」です。 僕は、これらのことを踏まえてプログラミングのことを「積み木遊び」で表現します。

積み木には色々な形があって、その組み合わせによって様々な形のオブジェクトを作り出すことができます。 果たして目的を持って積み木を積んでいたかは覚えていませんが、例えば「お城が作りたい」という目的を持ったとします。手段は、積み木の組み合わせによって実現できます。同じ形を作るにも、色々な積み木の組み合わせがあるので、それを試しながら目的に到達しようとします。

この思考過程自体がプログラミングと同等と言っていいと僕は考えます。基本的に世は「目的」を突きつけてきます。「切符を自動で処理したい」、「ハガキに書いてある住所を文字に起こしたい」等々抽象的な目的が突きつけられます。そこでエンジニアやプログラマに求められるのは、「与えられた目的を、具体的かつ現実的な手段に分解し、構築すること」です。仕事では目的すら求められたりしますが。

ここで出した「具体的かつ現実的な手段」をいかにたくさん知っているか、いい組み合わせを知っているかが、今の人類に求められていることです。いかにたくさん知っているかは、色々な形の積み木を持っていることに等しく、色々なものが作れるということに等しいのです。プログラミングに限らず、色々な業界におけるエリートはこの情報量が圧倒的です。

しかしプログラミングは、この「目的を手段に分解する」という「論理的思考」を育むのに適した手段であるため、義務化されているのだと僕は考えています。

おわりに

タイトル通りの記事が書けているかはわかりませんが、ひとまずこれで締めくくりたいと思います。

ではまた

サレジオ高専を卒業しました

はじめに

アウトプットを増やそうと思っていた春休みなので、ギリギリですがいくつかエントリを書こうと思います。 タイトルの通り、5年間通ってきた高専を卒業しました。軽い沿革と、思いについてつらつらと書こうと思います。

入学のきっかけ

書いてたらすごく長くなったのでさらっといきます。

  1. 兄が壊したMacBookを父と修理して手に入れる
  2. Minecraftと言うゲームを兄から紹介される
  3. Minecraftやりたさに友達とPCを自作する
  4. MinecraftJavaで書かれていることを知る
  5. プログラミングに興味を持つ
  6. 父が育英高専を卒業していることもあり、サレジオ高専をおすすめされ志願

といった感じです。かなりサラッと書きましたが、この過程を中学3年間かけて辿りました。

普通高校情報科に行かなかった理由

情報科でやる内容のレベルをすでに越している自信があったからです。自信過剰ではありますが、実際高専情報工学科と普通高校情報科ではあまりにもカリキュラムに差がありすぎて比べ物にならなかったと思います。

普通高校に行かなかった後悔

日本男児が本来辿ったであろう輝かしい青春にはありつけなかった気がしていて後悔しています。高専で得た青春は、「エナジードリンクを手にレポートやプログラムを仲間と開発する泥臭い青春」でした。

1年生

この時は人間的にもまだ綺麗な年でした。クラスで友達と話し始めるにもそんなに時間はかからなかった気がします。専門の授業も、まだ僕が知っている範囲を超えていなかったため、PC組み立ての演習は一番できていた自信がありました。めちゃくちゃドヤ顔で生きていた気がします。

部活は「機材が多い・人が面白い」と言う理由から放送部に入り、プロジェクト活動として「先輩が多くてやってることがカッコいい」と言う理由でSP2LCおよびプロコンに所属しました。

放送部では学校行事の裏側を覗き、プロコンではまるで機械かのようにキーボードを叩くバケモノの先輩たちから教えを受けつつ本戦に参加したりでした。

2年生

だんだんプログラミングの授業が増えてきて、最初はワクワクしていましたがあまりにも内容が単調で後半はすごく適当にやっていた気がします。 学科内の知り合いもだんだん増えてきて楽しかったのを覚えています。

プロコンで初めて登壇して競技を行なったのはこの年が最初でした。

f:id:namedpython:20190328083225j:plain

ぶっちゃけると、この年なぜ僕が登壇メンバーになったのかよく覚えていません。僕がコミットしていたのは主に周辺ツールで、探索側のソースコードはさほどいじっていませんでした。それでも、登壇できた貴重な機会だったのでよかったと思っています。

3年生

ここから授業も少し難しいものがちらほら出てきていました。しかし、「めっちゃ勉強した!」なんて言うことも特になく、難しいところだけ重点的に...くらいの勉強だけしていました。

この時からすでに遅刻魔の兆候も見えていた気が。あとめちゃくちゃオタクが表面化しました。

プロコンでは、競技部門リーダーとメインコーダーをやったりしました。プロコンに関して一番頑張ったのはおそらくこの年です。競技部門の競技内容と、僕の采配等で軽く部門が炎上したりしましたが、いい経験でした。

4年生

グループ開発をする授業で、プログラミングが苦手なクラスメイトが助けを求める中、相対的に技術力が高いプロコンメンバーで固められた全員MacBook使いの4人組「りんご組」が発足した年でした。これをやった結果、次の年の授業でプロコンメンバーが固まることが制限されました。

f:id:namedpython:20190328083104j:plain
シンガポール研修旅行でのりんご組

プロコンや学業もやりつつ、インターン扱いで開発の業務委託バイトをしました。いいことも悪いこともありましたが、Web開発に関して一番知識と根性が身についたのはこれがきっかけです。

4年の最後には、内定先の競技形式のインターンで優勝を収めました。優勝できた技術はほぼ先述のインターンで培ったものです。そしてこのまま選考に入り、内定がもらえました。

学校の助けをほぼ借りずにクラス最速で就職を決めました。

5年生

ひたすら卒研でした。卒研に関しては一個前のエントリに書いていますのでよろしければ。

本当はプロコンからは一歩引いて見守らなければいけないのですが、諸事情でかなり手を出してしまい、反省しています。5年連続プロコンに参加と言う実績を解除しました。

f:id:namedpython:20190328083548j:plain
Procon29 後輩との打ち合わせ

夜更かしで寝坊して論文提出が遅れゲフンゲフン。なんてこともありましたが卒業することができました。

思い

5年という年月はとても長いものです。しかし、とても早かった。友達とも5年近く一緒にいるので、卒業式や謝恩会の後も、「どうせまた明日会うでしょ」くらいのノリで別れてしまっていますが、すごく後悔しています。

関東にいる人達とはしばらく会えそうにないので、本当に寂しい気持ちです。 教室でのガヤガヤすら恋しい気持ちです。

それでもまた会えると信じて、これからを頑張っていきたいと思います。

おわりに

雑に書き走ってしまった気がしますが、振り返るにはいいきっかけになりました。

読んでいただきありがとうございました。 ではまた。

スマートフォンで撮った書類から影を取り除いてみた

はじめに

久しぶりに記事を書いています、NamedPythonです。

卒業が近づき、卒業研究も大詰めになってまいりました。テーマは「陰影を含む文書画像からの陰影除去」と題して画像処理をちまちまやっていました。

ぶっちゃけほぼ既存だし、目新しいこともしてないので論文書くついでに研究?のまとめとして記事を書きたいと思います。

なんならGitHub公開しています、ハハハ。もはやこうやって記事のネタにすること、公開することを想定してなんとDockerにのっけてあります。すぐ試せるね。

プロジェクトのコードネームはdeshade-doc(でしぇーど どっく)shadeで挟むことによる謎のそれっぽさを演出しています。スタバで10分考えました。

github.com

愚かにも入力画像をignoreしていないですが、見逃してください。

きっかけ

授業ノートとか、書類とかを紙でとっておくのは面倒なので、Scanbotというアプリ でスキャンして管理していました。

そこそこ気に入っていて、ある程度のノイズは取り除いてくれていました。しかし、にはどうも弱いらしく黒つぶれが多発していました。

表面化していた問題はそこではなく、OCRが効かないというところだったので、当初はOCRの精度改善をテーマにしようと考えていましたが、なにせ郵便局あたりが頑張ってしまって研究の余地がない。ないというか、僕の技術では追いつけない

じゃあOCRかける前段階、二値化とか画像への前処理を研究すればいいんじゃないの、っていうことで陰影の除去をテーマにしました。

一応重複とか類似の研究は調べましたが、ここまでピンポイントなのはなかった気がします。あったらこっそり教えてください。といっても時すでに遅しですが。

環境

めちゃんこわかりやすい。

あとはこの上でドッカーン。コンテナの中身は

です。もともと FROM ですでにあるイメージを引っ張ってきてPillowを足してるだけなのでシンプル。他の授業でも使うので流用ができている、良きかな。

理論みたいな

そんな大層なものではないですが、考えなしにやっているわけでもないのでそれっぽく。

二値化の手法としてそこそこ有名?な判別分析法ではうまく二値化できないことを利用して、「陰影を含んでいる文書は判別分析法でうまく二値化できない。問題がある。」といちゃもんをつけて問題を解決する形をとっています。

しかし、判別分析法のいいところ(と、勝手に思っているの)は、曖昧な影の輪郭(領域)を、ヒストグラムをもとにはっきり示してくれるところです。しかしこの判断ができるのは、文書画像のみであることに注意されたい。風景写真ではこんなガバガバな判断基準で陰影の領域は断定できないです。

では、「判別分析法によってはっきりした領域を切り出して、個別に処理してあげればいいではないか」と考えて、手っ取り早くガンマ補正をしました。

一回ではそうはうまくいかないので、ちまちま二値化、切り出し、ガンマ補正、元の位置に貼り付け、二値化、...という風に繰り返す処理にしました。

切り出しの条件はというと、面積です。そこそこ大きい面積の暗い領域を影と決めつけて、切り出しています。

そして、このが見つからなくなったら繰り返し脱出、有限回で終了、アルゴリズムとしても破綻していない(はず)です。

以下はこれらに結果をつけながらつらつらと。

各ステップと結果

1.

文書を携帯端末で撮影、クロップします。なので入力画像はクロップされた3チャンネル画像です。画像は実際に僕がとったノート。

f:id:namedpython:20181225155543j:plain
入力画像

2.

判別分析法を用いて二値化。 すると、影がある場合はヒストグラム(および割り出される閾値)が偏って影の部分は黒く潰れます。以下は大津の二値化をかけたもの。すごく黒く潰れる。

f:id:namedpython:20181225160131p:plain
判別分析法で二値化をかけた入力画像

3.

影の部分を切り出してガンマ補正γ=1.2くらい(これらは1.18)でゆっくり明るくしていく。以下は切り出した影の部分(左)とガンマ補正をかけたあと(右)。

f:id:namedpython:20181225162331p:plainf:id:namedpython:20181225162326p:plain
ガンマ補正前、ガンマ補正後

4.

元の位置に貼り付けます。実はMatで貼り付けるのがめんどくさくてImage.paste()を使うためにここだけPILを使っていたり。貼り付けると明るくしたのがわかりやすい。

f:id:namedpython:20181225163243p:plain
元の位置に貼り付け

5.

2の手順に戻って判別分析法で二値化します。以下は2との比較。

f:id:namedpython:20181225160131p:plainf:id:namedpython:20181225163716p:plain
さっきの二値化、今回の二値化

あれ、なんか領域広くなってますね。いいんです。これはまだ途中経過。こうやって階層的に明るくする範囲を拡大していくんです。

6.

以降は、切り出し、ガンマ補正、元の位置に貼り付けまで一気にやったものを、前後比較しながら見ていきましょう。

f:id:namedpython:20181225163243p:plainf:id:namedpython:20181225164217p:plain
貼り付け1回目、貼り付け2回目

少し段ができましたね。次も見ていきましょう。

7.

プログラム内のループで言えば3ループ目になります。

f:id:namedpython:20181225164217p:plainf:id:namedpython:20181225164704p:plain
貼り付け2回目、貼り付け3回目

8.

そうこうして15ループします。このループ数は影の分散具合とγをどれくらい細かく(>1.00)するかによります。これが最終結果。元画像と比べてみましょう。

f:id:namedpython:20181225155543j:plainf:id:namedpython:20181225165104p:plain
最初、最後

...できてはいるけど汚い。っていうのは心にしまっておいてください。階層的に明るくしていった感じがわかると思います。思いの外、この階層が影の濃度ごとに分かれていて面白い。

9.

最後のものを判別分析法によって二値化します。プログラム的には、ここである一定の面積の黒い領域がなければbreakとなっています。以下は最初の二値化と最後の二値化。

f:id:namedpython:20181225160131p:plainf:id:namedpython:20181225165445p:plain
最初の二値化、最後の二値化

こう見ると、だいぶ綺麗になっています(言い聞かせるように)。 かすれている部分は、僕の筆圧が足りていなかったり過度に照明が当たっていたりする部分です。

まとめと所感

「やってみた感」と思ったあなた、正解です。研究としての体裁を最低限保ったやってみたです。でも研究の動機はそんくらいがいいだろうと思っているので、僕は僕を許します。

ちなみに実行時間はまあまあ現実的。入力画像はリサイズしていたりします。 上の結果は15ステップですが、実行時間は約20[sec]timeコマンドをつけて計測したrealタイム。リアルタイム処理は想定していないのでこんくらいが妥当だと愚考。

もちろん、伸び代はあります。γは可変にできますし、現在の処理に加えて明るすぎる領域は明度を下げて白飛び黒つぶれ両方に対応したらもっと綺麗になると思います。

ですが、今回はここまで。あとは論文を書くだけです。

さいごに

読んでいただきありがとうございました。まとめかた、およびアウトプットが下手なので、とりあえず数を打って改善を図ります。

GitHubに上がってはいますが、なんというかバックアップに近いので、READMEは需要があれば書きます。

ではまた。

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ライフがスマートでありますように.

ではまた.