OmniAICreator/Qiita-1.07M huggingface dataset:
RubyMineチートシートというか感動したこと箇条書き

\ 感動をあなたに！JetBrailns! /

大枚はたいてRubyMineを導入したので感動したポイントを書いていくぞ。~~エディタのカスタムやってらんねーわ！~~ 高速&高機能エディタ最高！

意外と日本語情報充実してないので、需要あるんじゃないかとおもいます。。順次更新。

RubyMineベースで書いていきますが、IntelliJ系ではけっこう共通のところもあると思います。

## コンフリクトの解消がしやすい。
左右に両のブランチが並んで、GUIでポチポチ採用する個所をきめるだけで解消できます。
https://www.jetbrains.com/help/idea/resolving-conflicts.html


## Viewのリアルタイムデバッグ
[Chromeのアドオン](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji?hl=ja)とRubyMineにプラグインを入れる必要があります。

機能をオンにするとバチバチ書いていくそばからchromeで更新されます。気持ちいい。
たまに不調なのがまたかわいいよね。

サムライズムさんに教えてもらいました。

## JSのPostfilx Copetion
>Postfix code completionは書きかけのコードに特定のキーワード(Postfix)を追加することでよくあるコードブロックに整形してくれる機能です。カーソルを戻す頻度を大幅に減らすことができ大幅に開発生産性が向上します。たとえばboolean型の式に”.if”をいうキーワードを追加するとif文に、オブジェクト型の式に”.notnull”と追加すればnullチェックをする文に変えてくれます。

みたいにしてくれる。.returnとか.forでもできる。うまくするとちょっと書いて左に戻って書き足してみたいなのをしなくて良くなるらしい。まだ使いこなせていないけどすごい。


## ⌘ + shift + enterで下に一行追加し、カーソルも移動
vimでいうoに相当。カーソル位置から行末までが次行についてこないので便利。
矢印キーって使いたくないよね。

## ⌘ + shift + 8 で矩形選択モード
vimでよくあるやつ。⌥ + shift + 矢印で、ワードごとに飛んで選択もできるので超便利。
ターミナルのログからPIDだけ取り除いて要るとこだけ取り出すとかに使える。

## ターミナル開かなくてもbundle installできる。
⌘ + shift + a でRubyMine備え付けアクションを検索できるので、installとタイプ
Enterポチポチするとbundle installが走る。いちいちterminal開いてた自分におさらば。
必要に応じてオプションつけれます（--path=vendor/bundleとか）

## ターミナル開かなくてもdb migrate できる
同上

## ターミナル開かなくてもbin/rails s できる
^ + ⌥ + R → Development → RUN で起動できます。やったぜ。
⌘ + Rで再起動できるのもいいですね。initializerいじったあととか。

## ターミナル開かなくてもbin/rails gできるし、選択式で実行できる。
⌘ + shift + a でRubyMine備え付けアクションを検索できるので、rails gとタイプ
するとこう。
![スクリーンショット 2017-11-03 14.25.43.png](https://qiita-image-store.s3.amazonaws.com/0/65315/26c1a585-a087-ac5d-0cd5-5f04c1bc1c2a.png)


みたいなかんじでRailsでよくあるやつは大体統合されてて、楽に呼び出せる。アレ出来るかな？と思うやつは大体できると思って下さい。（なんでもできるとは言っていない）


## Upsourceとかいう楽々コードレビューツール（入れたい）
github側でのコードレビューを楽にするのと、やり取りをRubyMineにとりこんで使いやすくすることができるやつ。

レビュー側では、changed fileのとこからメソッド定義元にジャンプしたりできる。

エディタ側では、コメントされた個所を取り込んでサイドウィンドウで一覧できて、そのコメントをポチポチすると該当箇所にジャンプとかもしてくれるらしい。その場でコメント返信とかもできるらしい。
ブラウザのGithubと⌘+tabで行ったり来たりするめんどいアレがなくなるので非常に良い。

たしか10人までは無料。ただし自分でホスティングする必要あるっぽい。
EC2においてシェルスクリプト startで起動してポート空けたらつかえるっぽいです。

## GithubのIssueと関連付けできる
1. Issueを取り込んで、
2. タスク（RubyMine的概念）を作成して、
2. 紐付いたブランチをつくって
3. タスクごとにチェンジリストも作れる

手軽にできます。すごい。ぜひともショートカットを設定したい昨日の一つ。

タスクを切り替えるときにタブの状態をまるっと切り替えれる。
タスクごとにチェンジリストが生まれるのも強い。一つのWorking Copyの中がさらに分割されてバラバラに管理できる。

Issueのスイッチが超カンタンなので、プルリク送って待ってる間にすぐに次のIssueに取り組めます。

詳しくはこちら
https://qiita.com/Avene/items/4d6c32010e5bf476dab2 


## おわりに

日本の公式代理店であるサムライズムさんで買うと、本家で買うよりだいぶ安いのでおすすめです。たぶん半額ぐらい。
[RubyMine | サムライズム](http://samuraism.com/products/jetbrains/rubymine)

サムライズムさんのハンズオンセミナーもおすすめ。セミナー参加費は2000円かかるんですが、後日ブログ書くなら無料になります。
なお僕はお金払ったのにこうして記事を書いています。でも素敵なセミナーだったからオッケー！
Setup Device to USB Serial Port (ttyUSB) example with Kondo Kagaku Servo Motor

When you sometimes plug in a device to your PC but it cannot detect to ttyUSB Port, you should do following action:

First: Check the device ID

```
   $ lsusb
   Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
   Bus 003 Device 003: ID 165c:0009 Kondo Kagaku 
   Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
   Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
   Bus 001 Device 004: ID 0bda:0153 Realtek Semiconductor Corp. Mass Storage 
   Device
   Bus 001 Device 003: ID 8087:0a2a Intel Corp. 
   Bus 001 Device 006: ID 1a81:1004 Holtek Semiconductor, Inc. 
   Bus 001 Device 005: ID 2047:0200 Texas Instruments MSP430 USB HID Bootstrap 
   Loader
   Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

Second: Lets say we want to direct "Kondo Kagaku" Device to USB device, there is `165C:0009 represent vender_id:product_id`
Do the following action to activate it

```
   $ sudo modprobe ftdi_sio
   $ sudo su
   root@$ echo "165C 0009" > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
   root@$ chmod 666 /dev/ttyUSB0
   root@$ exit
```

and now you should able to access the port /dev/ttyUSB0!

If you want to fix the port, please refer to this site: https://qiita.com/osada9000/items/3e6ff429ba782624def1
minig pool作成時のNATルータセキュリティ方針

#前提

このナレッジが必要なのは、マイニングプール構築の場合だけかもしれない。

通常のサービスであれば、
・ロードバランサを使う
・仮想ルータ的なものを使う
・クラウドサービスで提供されているセキュリティ機能を使う
が王道。

##LinuxでNATする理由

coindがportを大量に消費する為。
VPSで提供されているロードバランサはport固定が多いんですよね、、、
拡張性を考えると役不足。

なお、コイン毎にNOMPを個別に建てるなら、ここまで考えなくて良い。
ただワタクシは、ひとつのページで全コインの採掘状況を知りたい（こだわり）

##NATルータのセキュリティ方針

###Interne側のSSHポートを閉じちゃう

オーナー含めて誰もアクセスできない、これ最強。
そもそも、役割分担としてiptable 管理くらいしかしないはず。

SSHそのものをアンインストールしない理由は、ログの回収やパッチアップデート関連作業のため。これらはプライベートアドレスを持った内部サーバから実施すればよい。

###管理用ユーザの作成＆sudo権限付与

後述する「rootアカウントでのログイン禁止の為に必要」なので作成。

```
adduser 管理用ユーザ名
```
```
gpasswd -a 管理用ユーザ名 sudo
```
実施後にログアウトして、管理用ユーザとして再ログイン
###/etc/ssh/sshd_config の編集

念の為に設定。
・ポートの変更
・rootアカウントでのログイン禁止
は最低限、実施したい。

```
testuser@nat:~$ more /etc/ssh/sshd_config
# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 21  <--ココを「任意の数字」に変更
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 1024

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin yes <--ココを「no」変更
StrictModes yes

```

###定期的なセキュリティパッチ適応

お忘れなく。

##iptablesの設定について (セキュリティ編)

###インターネット→プライベート
「DNAT」すればよい。

###プライベート→インターネット
「SNAT」すればよい。

###「MASQUERADE」のほうがセキュアでは？

coindを利用する際、ポート番号は重要な意味を持つ。
よって、通信ポートを変更してしまう「MASQUERADE」はNGとなる。


#総括

セキュリティ方針が決まったので、次回から実装編（の予定）

#追記
昔、物理サーバをレンタルしていた時に成功した構成だったので、行けると思っていたのですが、、、

現在、メインで利用しているクラウドVPSがNAT禁止だったため、構築断念。
契約先を見直して、いつか再チャレンジします。
多対多の関連付けについてのまとめ

RailsでDBを構築する際によく使用される「多対多の関連付け」について。


#has_many :through

とある病院の診療予約管理システムを考える。

患者(patient.rb)と医師(Physician.rb)は多対多の関係性にある。1人の患者は複数の医師にかかっているだろうし、1人の医師もまた複数の患者を診察している。

このとき、患者と医師は予約情報(Appointment.rb)を介して関連付けするとスムーズになる。

```rb:patient.rb
class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end
```

```rb:physician.rb
class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end
```
```rb:appointment.rb
class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
end
``` 

多対多の関連付けは、上記のようなソースコードで記述される。

先述したように、ここで特徴的なのはPatientモデルとPhysicianモデルは、直接的な関連付けがなされていないという点。

<img width="715" alt="スクリーンショット 2017-11-03 3.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/200260/df23b60b-2033-4ebc-3088-d037fb605523.png">
（RailsGuideより抜粋：https://railsguides.jp/association_basics.html#has-many-through%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91）


ここでappointmentsテーブルは、physiciansテーブルとpatientsテーブルの間に入っているため、中間テーブルと呼ばれます。

また、Appointmentモデルのように、2つのモデルの中立ちを行うモデルを結合モデルと呼びます。


#SNSアプリケーションにおける多対多
多対多関連付けは2つの独立したモデルを、第3のモデルを介して関連付けます。

Railsチュートリアルなどで作成するサンプルアプリケーションでは、twitterのようにユーザーをフォローする機能を実装する。

フォローするユーザーAとフォローされるユーザーBは、どちらも同じUserモデル。

また、ユーザーAはユーザーBをフォローしているものの、ユーザーBはユーザーAをフォローしていない可能性がある。そのため、図のように新たにRelationshipモデルを作成し、フォロー情報を管理する必要がある。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/200260/8cc434ef-77c7-434c-c404-3c09b4c28a0e.png)

こうすることにより、1人のユーザーAが複数のユーザーを、relationshipテーブルを介してフォローしているという状態を作り出すことが出来る。

```rb:user.rb
class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed

 #（　中略　）

end
```
WEBデザイン仕様チェックリスト

デザイナーがWEBデザインを作ってくれたタイミングで、ここはチェック・質問・詰めておきたいというリスト。
ずっと使えるなと思ってリスト化しました。

普段はSketchでデザイン、Ruby on Rails・SCSSで作って、AWSのホスティングするパターンが多いので、全体的にそんな前提になっています。

## 画面幅ごとの挙動。

- [ ] media queryとか込みでどう実装するか考える。グリッドシステムの挙動など。
- [ ] 比で指定されるべきところはどこか（特にスマホ版）逆に固定長で作るところはどこか
- [ ] 画面幅が狭まったときにテキストが縦に長くなる個所がないか確認する。その場合デザインが崩れないか確認する。

## SEO
- [ ] どこにどのHTMLエレメントを当てるのか（特にHタグ）
- [ ] title、description、canonical、パンくず、

## 仕様面
- [ ] DB叩いてそうなところは叩き方を確認する。
- [ ] リンクが張られている領域を全て洗い出す。文字なのか領域なのか、忘れてる場所がないか。
- [ ] position: fixedな所がないか確認する。
- [ ] 押したら動きを見せる個所がないか確認する。ここ実は開きます的な。Sketch上ではわかりにくいため確認したい。
- [ ] 全ページにフラッシュメッセージが出せるようになっている必要がある（という前提で作ったほうが良い）。error、notice、successの3種類


## スピーディーに実装するために
- [ ] font-awsmとかでズルして作れる要素あったら教えてもらう
- [ ] 何度も使っている色を全部洗い出してSASS|SCSSのVariableに入れらるようにする
- [ ] 使いまわしてるデザイン表現を洗い出す（角丸の大きさ、色、フォント、文字サイズ）
- [ ] Sketchでくれる場合は、画像書き出しようのページをつくって、画像1枚毎にアートボードを作って欲しい。一括で書き出せるようになり、便利。
- [ ] 画像を全部書き出してS3に入れて、開発者がURLで使えるようにする。retina対応で2x（と3x）も作る。
- [ ] borderやpadding、marginがどっちに着くイメージなのか確認する。できるだけ使いまわしやすいようにする。


##その他

- [ ] フォントサイズに関して、親要素に対する比率でつくっているところがある場合確認する。
- [ ] 表示数が変動するものは、変動したときの挙動を確認する。数字の桁数が変動する、文字数の増減、値に応じて星が増えるなど。増えすぎる場合（レイアウト崩れ）、0になる場合の表示を確認する。
- [ ] ユーザー側が画像アップロードする場合、サイズが大きい場合、小さい場合にどうなるかを確認する。（記事中の画像など）
- [ ] divの構造作る
- [ ] faviconは用意されているか。
- [ ] OGPはどうするか。画像はページごとに動的か全ページ固定か、必要なサイズの画像が用意されているか。
- [ ] プレースホルダーはどうするか。画像がない場合（サムネなど）
- [ ] テキストで横着してpxがわからないようになっている個所はないか。グローバルメニューを `項目1 | 項目2 | 項目3 | 項目4` みたいにテキストでデザインされると幅がわからない。
- [ ] 画像の書き出しは誰がするのか。

けっこう抜け漏れあるとおもうので、是非コメントで確認項目の追加をお願いします。
MarkDown+Math

#概要
　vscodeでmarkdown+mathの動作概要
#投稿理由
　なんだか、うまく動かなかったんでそのコメント
#内容
　markdown+mathはけっこう、書き直しをしているんで情報が錯綜している

　今では、\$\$ 数式　\$\$とすれば、cntl+k Vで無事に数式に変更してくれる

　ただし・・
　$ 数式　$のインラインモードはできない
　また、昔は　cntl+k .でプレビューという動きだったが、今はこのショートカットはhtmlソースをクリップボードに格納する意味で、プレビューはmarkdownといっしょということのようである。
macOSでemacs irony-serverがコンパイルできない時の対処法

自分のためにメモ

ironyはインストール後に自律的にローカルで動かすサーバをコンパイルしようとするが，macOS sierra, high sierraだと `Could NOT find LibClang (missing: LIBCLANG_LIBRARY LIBCLANG_INCLUDE_DIR)` というようなエラーが出てコンパイルがコケるのでwork aroundな対処法．

ironyはELPAでインストールしているものとする．

## homebrewでllvmをインストールする

```shell-session
$ brew install llvm
```

これはXcodeのllvmとは別に必要

## 以下のコマンドを実行

```shell-session
$ cd $HOME/.emacs.d/elpa/irony-*/server
$ rm -fr CMakeCache.txt CMakeFiles/
$ mkdir -p build && cd build
$ cmake \
   -DLIBCLANG_INCLUDE_DIR\=/usr/local/opt/llvm/include/ \
   -DLIBCLANG_LIBRARY\=/usr/local/opt/llvm/lib/libclang.dylib \
   -DCMAKE_INSTALL_PREFIX\=$HOME/.emacs.d/irony/ ..
$ cmake --build . --use-stderr --config Release --target install
```
オートレイアウトが効かない場合の対処方法

#色々なサイズの画面にオートレイアウトで対応したはずなのに、シミュレータで確認してみるとサイズが合っていない場合の対処です。

何で調べたらいいのか分からず、結局うまくいっていた時のstoryboadとdiffを取って解決しましたので、備忘録としても残しておきます。

##事象
下記イメージの通り選択した状態で、シミュレータからSEを起動すると画面から溢れて表示される状態に。
下記イメージの通り選択した状態で、シミュレータからipadを起動すると画面に小さく表示される状態になってしまいました。
<img width="452" alt="スクリーンショット 2017-11-03 11.20.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/172105/4a21e08c-dbe5-ace5-f2ad-b5f6ad4eecaf.png">

シミュレータで表示したときのイメージ
<img width="1164" alt="スクリーンショット 2017-11-03 11.29.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/172105/d4acb0b8-1359-6dda-12d3-9ba120548656.png">



##対処方法
Autoresize Subviewにチェックを入れる

##画面でいうところの
<img width="303" alt="スクリーンショット 2017-11-03 11.17.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/172105/fcd4d66b-69c5-0cf5-fbaf-85237dd013a9.png">
iOS11の異常バッテリー消費の原因を探る(未解決) ※追記2あり

※まだまだ未解決ですが、一つだけ進展がありました。(2017.11.28)

# バッテリードレイン

![09.gif](https://qiita-image-store.s3.amazonaws.com/0/141731/03ec634b-fffb-558b-d3c4-aa6f1c4c4c18.gif)

「ドルアーガの塔」のFLOOR 9で取れるアイテムです。

…と言う話ではなく(それはエナジードレイン)、Qiitaに書くべきネタなのかどうかは微妙なところですが、自分のiPhone SEがiOS11にしてからとんでもなくバッテリーを消費するようになってしまいました。なんと、10分間Twitter見てるだけで5%も減る!!。当然iPhone本体もとんでもなく熱くなって、非常に不快。期待のiOS11.1でも変わりませんでした。昨日は「電撃ゲームミュージックライブ ～初冬の陣～」と言う、オールドナムコファンが多幸感に包まれすぎて昇天するレベルの非常に楽しいイベントがあったのに、バッテリー切れでその思いの丈を全くツイートできない始末。

ここでAppleStoreのGeniusBarに殴り込むのも乙なものですが、プログラマならプログラマらしく、iPhoneのログを見てみましょう。Xcodeを使えば簡単に見れます。Window->Devices and Simulatorsを開いて、下の方にある三角ボタンを押すとログウィンドウが出て来ます。
![スクリーンショット 2017-11-03 10.41.58.png](https://qiita-image-store.s3.amazonaws.com/0/141731/284e8f85-e6a2-d13c-9d26-02a08c252090.png)

とはいえ、意外と山のようにログメッセージが出てくるのでなかなか解析するのは難しいですが、よーく見てみると、YouTubeアプリのエラーだか警告が非常に目立つことに気付きました。例えばこんな感じ。

```
Nov  3 09:39:52 iPhone assertiond[66] <Notice>: Creating PowerAssertion on YouTube:1520
```

なんとなく、YouTubeアプリがOSからバッテリー警告を言い渡されているように見えます。と言うことで、アプリをさっくり削除してみました。今のところ、スリープしない状態にしてTwitterを起動して1時間放置しましたが、5%減ったのみです。これはアタリかも？ テンゲンかも？？

…違ってたらごめんね。(YouTubeの設定とかアカウントの状態によるのかも？)

# 追記(2017.11.4)

今日一日試してみました。「急激にiPhoneが熱くなる」ことはなくなりましたが、やはりiOS10に比べるとバッテリーの消費は依然多く、本体も「ホカホカ」くらいにはなるようです。うーん。もうちょっと調査します…。

# 追記2(2017.11.28)

Google(YouTube)から公式に発表があったようです。

YouTubeアプリがiOSデバイスのバッテリーを空にするバグ、Googleが修正を確認
http://jp.techcrunch.com/2017/11/28/2017-11-27-youtubes-battery-drain-problem-on-ios-devices-is-now-fixed/

iOS11と直接は関係なく、ユーザーによって発生しないこともあるようです。一応合ってた(エッヘン)わけですが、それでもやはりiOS11のバッテリーの持ちは良くなく、特に長距離移動をすると減りやすい気がします。ポケモンGO勢によるとGPS関連のバグがあるという話なので、まだまだ調査が必要のようです。

# 電撃ゲームミュージックライブ ～初冬の陣～

![DNnjD-mVoAAUBxX.jpg](https://qiita-image-store.s3.amazonaws.com/0/141731/9eb9e00d-9a0f-6428-c10f-1a12da381c40.jpeg)

さらに、Qiitaに書くべきネタかと言うと完全にアウトだと思いますが、昨晩(2017/11/2)の「電撃ゲームミュージックライブ ～初冬の陣～」。イベント名からは分かりませんが、出演者は元ナムコの小沢純子さん慶野由利子さん川田宏行さん中潟憲雄さんという、まさに1980年代ナムコ黄金期を支えたレジェンドサウンドクリエイターの皆様。客席にはそれを享受して来た平均年齢40代のオッサンが結集。

第1幕はピアノ。小沢純子さんが師匠である大野木宣幸さんの作品である「マッピー」、さらに慶野由利子さんも参加してピアノ連弾で「ディグダグII」を演奏。よくこんな曲を手で弾けるなぁ…。他にも「リブルラブル」「トイポップ」「ドラゴンバスター」、そして、今回演奏された曲の中で一番新しい「風のクロノア」。それでも20年前だけどね…。あと、登壇はされませんでしたが、滅多にイベントに参加されない大野木さんが会場にいらしていることが小沢さんの口から明らかにされて、客席がどよめきました。中潟さんも30年ぶりに会ったというくらいの、ある意味、歴史的な瞬間でした。

第2幕は川田宏之さんが佐藤豪バンドを引き連れて登場。起動音付きの「スターラスター」から始まり、まさにバンド演奏にぴったりな「ドライバーズアイ」「ウイニングラン」、「妖怪道中記」「ワルキューレの伝説」では川田さんのショルキー姿がめちゃくちゃカッコよかった！！。そして白眉は「ビデオ・ゲーム・グラフィティVol.1」B面の「かっとびラリーX」「ちょっとマッピー男の子」「恋のディグダグ」「目蒲線の女」と、「ベラボーマン」「ワンダーモモ」と言ったボーカル曲。21世紀に「ちょっとマッピー男の子」でPPPHが打てるなんて…。

第3幕は中潟憲雄さん率いるプログレッシブバンド・アクアポリス。「サンダーセプター」「源平討魔伝」は、最初っからプログレの曲だったんじゃないかと思うくらい、圧巻で壮大。涙腺を鎮めるのに必死でした。「未来忍者」については今後ニュースがあるかも？(立川方面をチェックしておこう！) 新曲として、元ナムコのMr.ドットマン小野さん(人間国宝級ドット絵師)をイメージした「方眼紙の唄」が初披露。作詞は同じく元ナムコのワンダーモモ弓達さん(ファミリーテニスを作った伝説のプログラマーなのになぜか曲も歌詞も書ける!!)。お二人も登壇されて、中潟さんとともに軽妙なトークを展開していました。この曲、いずれは小野さん本人が歌うそうです(笑)

他にも書き忘れた曲はたくさんあると思うんですが、公演時間はなんと3時間半(!!)。終電ギリギリな人もいそうな時間だったため、あんなに退場を急がされたのは初めてでした(笑)。同じナムコファンの同僚の言葉を借りると、このイベントはまさに「神々の集い」。その集いの末席にいられたことを幸せに思いました。

本当、よかった…。
PACEMAKER > Raspberry Pi + Raspbian > モニタの自動OFFを切る > xscreensaverの設定変更

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

プロジェクト開始: [link](https://qiita.com/7of9/items/6aa0ea8b3a4fc802ca61)

### 症状

https://qiita.com/7of9/items/6427552acad5169a7431
にて液晶モニタに表示されるようにはなったが、１０分後にモニタの表示が消える。

「休みなさい」という画面自体が先に休まれるのは仕様としていかがかと。

### 対応

モニタの自動OFFの解除はいくつか試したなかで、以下が有効であった。

https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=57552
> Last edited by klricks on Mon Jun 01, 2015 12:40 pm, edited 2 times in total.

```bash
sudo apt-get update
sudo apt-get install xscreensaver
```

> In the [Display Mode] tab, set like this - Mode: [Disable Screen Saver]

上記のコマンドを実行後に設定をするのだが、失敗した場合は以下のコマンドを再実行すると設定できた。

```
$ xscreensaver-demo
```

[設定画面例　](https://askubuntu.com/questions/216783/ubuntu-12-10-turn-screen-off-when-inactive-for-never-still-turns-off
)
SQLインジェクションとは？

SQLインジェクションは、調べると<blockquote>SQLインジェクション（英: SQL Injection）とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。 また、その攻撃を可能とする脆弱性のことである。</blockquote>

言っていることは理解できたのですが、具体的にどうやって攻撃されるの？ということで簡単ですが書いていきます。
<h1>テキスト上でDBにアクセスできる</h1>
例えば、パスワードを入力する欄があるとします。
そこに検索条件を入れてしまえば、DBの内容を変更できたり、削除したり、検索できたりすること。

いわゆる情報漏えいとなり、大変なことになってしまうのだが
SQLインジェクションを行う人も、サイトのセキュリティーがしっかりしていない方もどちらも問題があるといえる。

まとめるとこんな感じ
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/158511/a3112b61-abee-f092-4050-9764dc2d7b87.jpeg)

パスワードの入力欄に 適当なパスワード　or "A" = "A"
or文を使うことによって、必然的に「真」にするとことができてしまう。

これをSQL文にすると

```
SELECT * FROM ユーザマスタ WHERE パスワード = 0000 OR 'A' = 'A'
```
このようになり、全体として「真」になるので結果的にログインが出来てしまう構造だ。

有名サイトでは脆弱なサイトは少ないが、個人サイトだと中には脆弱なサイトも含まれているらしい。
セキュリティーもしっかりと学ばないといけないなと怖いな、と感じました。
IAM Policy Simulatorが特定のActionがResourceで制限できるかを調べるのに便利

## 概要

カスタムポリシーを作る時に、そのActionが何のResourceで制限できるかを調べるのに便利だった。

## IAM Policy Simulator
https://policysim.aws.amazon.com/

![スクリーンショット 2017-11-03 10.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/21172/5cd0d061-9000-efe7-ec23-c8632f291a6e.png)

サービスを選んで、 Select Allを押すとそのサービスのActionがで制限できるかどうか、制限できる場合は何のResourceで制限できるのかが分かる。
VS2015でエラー「IIS Expressサーバーを起動できません。」

# 問題
GitHubからダウンロードしたASP.NetプロジェクトをIIS Expressでデバック実行しようとすると
「IIS Expressサーバーを起動できません。」
や稀に
「プロセスID xxxxは実行されていません。」
と出る

調べてみると日本語のサイトではuser/DocumentのIIS Expressフォルダを削除したり、
IIS Expressを再インストールすれば直ったとのことだったが
それらをやってもしなかった。

# 解決
stack　overflowで見つけた記事です。

システム環境変数に
変数名：_CSRUN_DISABLE_WORKAROUNDS
変数値：1
で登録するだけ。
（記事にはVSを「管理者として実行」しろと書いてありましたが、私の環境ではしなくても大丈夫でした。）

[システム環境変数の設定方法](http://www.k-cube.co.jp/wakaba/server/environ.html)

# 参考資料
https://stackoverflow.com/questions/26424902/process-with-an-id-is-not-running-in-visual-studio-professional-2013-update
PACEMAKER > Python > 今日は金曜日かを調べる > datetimeのweekday()

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

プロジェクト開始: [link](https://qiita.com/7of9/items/6aa0ea8b3a4fc802ca61)

今日はX曜日かを調べる方法を調べた。

参考: https://stackoverflow.com/questions/9847213/how-do-i-get-the-day-of-week-given-a-date-in-python
参考: https://docs.python.org/2/library/datetime.html

weekday()を使うようだ。

https://ideone.com/kttGld

```py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from datetime import datetime as dt

def isFriday(dt):
    if dt.today().weekday() == 4:
        return True
    return False

aday = dt.today()
if isFriday(aday):
    print("Friday")

```

```txt:run
Friday
```

| M | T | W | T | F | S | S |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
要素の縦横サイズを小数点以下も含めて取得する

jQuery1系では小数点以下のサイズが取得できず困ったため備忘録。
Web APIの「getComputedStyle」で取得できる。
古いWebブラウザでは一部仕様が異なるか、非対応。参照元が詳しい。

```js
(function ($) {
    "use strict";

    // Document ready
    $(function () {

            $('.target').each(function(i) {
                var tag = $(this).get(0).tagName.toLowerCase();
                if(tag === 'img'){
    
                    var style, w, h;
                    if (getComputedStyle) {
                        style = getComputedStyle($(this).get(0), '');
                        w = style.getPropertyValue('width');
                        h = style.getPropertyValue('height');
                    } else {
                        // for ie8 or less
                        style = $(this).get(0).currentStyle();
                        w = style.width;
                        h = style.height;
                    }

                    console.log('No.' + i + ' = width:' + w + ' height:' + h);
        
                }else{
                    console.log('not img tag : ' + tag + ' ' + i);
                }
            });

    });
})(jQuery);
```

【参照元】

* [HTML要素の幅を小数点以下まで取得する方法](https://teratail.com/questions/14282)
* [caniuse getComputedStyleの対応](https://caniuse.com/#search=getComputedStyle)
* [IT戦記：getComputedStyle について調べてたら深みにハマったのでメモ](http://d.hatena.ne.jp/amachang/20070611/1181554170)
PACEMAKER > 液晶モニタ+Raspberry Piにてjp2aで画像を表示できた | 賞賛の言葉はスクロールで見えない

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

プロジェクト開始: [link](https://qiita.com/7of9/items/6aa0ea8b3a4fc802ca61)

### 概要

[コマンドを間違えるたびに美少女に罵られたい！](https://qiita.com/onokatio/items/4930e4b23339edd05d47)を参考に良い習慣を作るためのペースメーカー（もしくは伴走者）を作ろうとしている。

[プロジェクトのマインドマップ](https://atlas.mindmup.com/yasokada/hw0002_pacemaker_171026/index.html)

### セットアップ

参考: https://qiita.com/7of9/items/41952fbb9a88eaa88c6d

/home/pi/WORK/pacemaker_171103.pyを使用する(実装は後述）。

### Image

とりあえずDelta Flyerの画像で試してみる。

https://fromthedeltaquadrant.wordpress.com/category/misc/the-delta-flyer/

Thank you.

### code

```pacemaker_171103.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
from datetime import datetime as dt
import subprocess as sb

while True:
    now = dt.now().strftime('%Y-%m-%d %H:%M:%S')
    print(now)
    cmd = "jp2a --colors /home/pi/WORK/PACEMAKER_171026/IMAGE/delta_flyer_1024.jpg"
    sb.Popen(cmd.split())

    msg = "ハァ...? 今から勉強って何言ってんの?\r\n"
    msg += "休憩もろくに取れないなんて、アンタどうしようもないクズね。\r\n"
    msg += "週に一度は休みなさい。"
    print(msg)
    
    time.sleep(10)
```

### 実行例

使用するRPi + [IPアドレス表示LED](https://qiita.com/7of9/items/33296849786e38ff3467)。
![DSC_0263.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/89de04dc-6126-1888-9a28-8a2c870adfb3.jpeg)

液晶モニタに表示した様子。
![DSC_0264.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/7ce86150-107d-c445-1a63-364759046c39.jpeg)

print()で表示している「賞賛の言葉」はスクロールされて見えない。

geometryを150x60と縦長にすることで、言葉も見えるようになった。
画像のアスペクト比によっては言葉は見えないようになる場合がある。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b76de0f4-5a8c-1a54-5c76-e13802947005.png)


### code 訂正

jp2aの表示後に1秒のwaitを入れることで、文字を下に表示できるようにした。

```pacemaker_171103.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
from datetime import datetime as dt
import subprocess as sb

while True:
    now = dt.now().strftime('%Y-%m-%d %H:%M:%S')
    print(now)
    cmd = "jp2a --colors /home/pi/WORK/PACEMAKER_171026/IMAGE/delta_flyer_1024.jpg"
    sb.Popen(cmd.split())

    time.sleep(1)

    msg = "ハァ...? 今から勉強って何言ってんの?\r\n"
    msg += "休憩もろくに取れないなんて、アンタどうしようもないクズね。\r\n"
    msg += "週に一度は休みなさい。"
    print(msg)
    
    time.sleep(10)
```

### 検索用キーワード

- 水曜日
- 休み
PACEMAKER > linux > LXTerminalを起動してPythonスクリプトを実行する > -eオプション | .desktopファイルでの設定例

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

プロジェクト開始: [link](https://qiita.com/7of9/items/6aa0ea8b3a4fc802ca61)

LXTerminalを起動してPythonスクリプトを実行するには`-e`オプションを指定すれば良さそう。

```~/WORK/PACEMAKER_171026/hello_171103.py
#!/usr/bin/env python
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
from datetime import datetime as dt

while True:
    now = dt.now().strftime('%Y-%m-%d %H:%M:%S')
    print(now)
    time.sleep(1)

```

念のため、上記のスクリプトにchmod +xしておく。

以下を実行する。

```bash
$ lxterminal -e ~/WORK/PACEMAKER_171026/hello_171103.py
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/56f31102-8a4d-7b6c-a127-d109b0db64c6.png)

### スクリプトが始まらない > パス指定ミス

.desktopファイルのEXECに上記のlxterminalコマンドを記載しxdg-openでテストしたが、Pythonスクリプトが起動する様子が見られない。

RPiの自動起動で確認したが、LXTerminalが起動時にPythonスクリプトが実行されなかった。　

~/WORKというパスが認識されてなかったようだ。/home/pi/WORKにすると動いた。

### .desktopファイル設定例

```PACEMAKER-setup.desktop
[Desktop Entry]
Exec=lxterminal --geometry=200x50 -e /home/pi/WORK/PACEMAKER_171026/hello_171103.py 
Type=Application
Name=PACEMAKER
Comment=Keep your pace as healthy as possible
Terminal=true
```

上記のファイルを/home/pi/.config/autostartに置いておくことで、自動ログイン後にLXTerminalが起動し、Pythonスクリプトが動くようになった。
PACEMAKER > linux > .desktopファイルをターミナルから実行してみる > xdg-open PACEMAKER-setup.desktop

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

プロジェクト開始: [link](https://qiita.com/7of9/items/6aa0ea8b3a4fc802ca61)

上記にて.desktopファイルを用意して自動ログイン時にLXTerminalを表示できるようにした。

.desktopファイルからPythonスクリプトなどを実行する方法を試そうとしたが、.desktopファイルをテストするためにRPiを再起動するのは面倒だ。

.desktopファイルを実行する方法はないか。

参考: https://askubuntu.com/questions/5172/running-a-desktop-file-in-the-terminal

> answered Oct 4 '10 at 15:28
Richard Holloway

xdg-openというコマンドがあるらしい（Ubuntuではバグがある？)

```PACEMAKER-setup.desktop
[Desktop Entry]
Exec=lxterminal --geometry=200x50
Type=Application
Name=PACEMAKER
Comment=Keep your pace as healthy as possible
Terminal=true
```

```bash
$ xdg-open PACEMAKER-setup.desktop
```

ssh -X接続したRPi上でLXTerminalが起動することを確認できた。
fedora: アプリのバイナリを配置してコンソールから使えるようにする


```
su 

mkdir /opt/<app-name>

chown -R root:root <app-binary-file>

mv <app-binary-file> /opt/<app-name>/

ln -s /opt/<app-name>/<app-binary-file> /usr/local/bin/<command-to-call-app>

eixt
```
Convert Hex to Bin & Ascii to HEX etc / Python 使って、10進数、16進数, Bin, Ascii文字列、変換

Good morning.


[root@localhost sample]# python
Python 2.6.6 (r266:84292, Aug 18 2016, 14:53:48)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

```pycon

>>> hex(30600)
'0x7788'
>>> bin(0xffee)
'0b1111111111101110'
>>> bin(255)
'0b11111111'
>>> bin(30600)
'0b111011110001000'
>>> int('0xffee',16)
65518
>>> bin(65518)
'0b1111111111101110'
>>> bin(0xffee)
'0b1111111111101110'
>>> int('0x7788',16)
30600
>>> bin(int("abcd1234cdef", 16))[2:]
  '101010111100110100010010001101001100110111101111'
>>> bin(0xabcd1234cdef)
'0b101010111100110100010010001101001100110111101111'


```


Type below if you want to decode Ascii to HEX .



```pycon


>>> 'HTTP'.encode('hex') #Ascii Strings. (アスキー文字列）
'48545450'　＜－－hex (16進数)

>>> bin(0x48545450)
'0b1001000010101000101010001010000'
HTTP = 1001 1000 0101 0100 0101 0100 0101 0000
HTTP = 0x48545450

```

Enjoy.
Rapberry Pi に USB DAC をつないでオーディオサーバーにする (MPD編)

# これまでの振り返り

[前回](http://qiita.com/henri_t/items/33a514ae4ac0fda89ee0) USB DAC をつないで音を出すところまで確認しました。今回は、MPD サーバーをインストールして、リモートで UBS DAC から音楽を再生出来るようにしてみます。

# MPD のインストール
```bash
pi@raspberrypi:~ $ sudo apt-get install mpd mpc
```

でインストールが完了します。

# MPD の設定

まず、USB HDD 内の MP3 を認識してもらうためにシンボリックリンクを張ります。

```
pi@raspberrypi:/var/lib/mpd/music $ sudo ln -s /mnt/hdd0/mp3/
pi@raspberrypi:/var/lib/mpd/music $ sudo chown mpd -R .
```

次に、MPD 本体の設定を変えます。

```bash
pi@raspberrypi:~ $ sudo vi /etc/mpd.conf
...
auto_update    "yes"
...
mixer_type      "software"
...
#bind_to_address                "localhost"
port    "6600"
```

auto_update を有効にすると、自動でプレイリストの更新をするようです。mixer_type は MPD クライアントからソフトでボリュームを変更するために必要なようです。

```bash
sudo /etc/init.d/mpd restart
```

# MPD クライアントからテスト

windows からは Gnome Music Player Client というものを使ってテストしました。

+ project page: https://gmpclient.org/

メニューの Music -> Connect でサーバーのIPを指定して、もし Port 番号を 6600 意外にした場合はそれも設定したうえで接続するだけです。つながれば、Raspberry Pi 上の MP3 が見えると思います。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/93800/cdb79612-5fa1-9d57-bb25-7bd3a9ef1bf9.jpeg)

すごい古い曲を再生しています...
debian9 stretch で opencv3 をビルドしよう

#前説
ディープなラーニングをするために云々かんぬんでOpenCV3を入れようと思った。
ただpythonでopencv使うだけならanaconda使ったほうがクッソ楽だけどビルドしてみようという試み。
まぁ、案の定ubuntuの情報ばかりだったけどdebian9ではそのままじゃうまくいかなかったのだ。
ちなみにopencv3ならなんでもいいやと思って3.0でビルドしようとしたらハマった。

#ubuntuでのインストール
https://www.learnopencv.com/install-opencv3-on-ubuntu/
参考
普段からpyenvのpython使ってるのでStep3(上記参照)のpython関連の部分はばっさりカット
cmakeはまだ実行しないでね。

#debian9での問題点（読み飛ばしても多分大丈夫）
基本的には上記ubuntu16でのインストールをなぞる
するとmakeでおそらくエラーが出るはず
gnuのバージョンがどうたらこうたら
要はgccとg++のバージョンが5以上だと新しすぎて動かねーよっていうCUDA?からの悲痛な叫び
CUDAが何してくれるのかはわからないけど、ここで２パターンに分岐

1)CUDAを使わない
多分この方法でも行けるはず（試してないけど）
https://qiita.com/tymob/items/42b438da2242e88e509f
ここが参考になるんじゃないかな

2)古いgcc,g++を入れる
debian9はgcc,g++が6.xしか入ってない
debian9ではバージョン6以上しか入れないのが目標だったそうな

ないなら入れればいいじゃないの思考
とりあえずgcc-4.9とg++-4.9をインストールしたい
ただ、ここで問題
apt install gcc-4.9 g++-4.9としたくてもパッケージが見つからない
ビルドしてもいいんだろうけど、めんどくさいのでなんとかaptで入れられないものか

#gcc-4.9 g++-4.9のインストール
https://unix.stackexchange.com/questions/334888/how-install-g-4-9-on-debian-stretch
参考
/etc/apt/sources.listを編集
読み取り専用なのでrootになるなりsudo使うなりして編集してね

```
deb http://ftp.us.debian.org/debian/ jessie main contrib non-free
deb-src http://ftp.us.debian.org/debian/ jessie main contrib non-free
```

を適当に追加

```
sudo apt update
sudo apt install gcc-4.9 g++-4.9
```

でインストール完了
インストールが終わったら再び/etc/apt/sources.listから先程追加した2行を消すのを推奨

これでgcc-4.9とg++-4.9が入ったわけだけど
このままビルドを実行しても使用するgcc,g++のバージョンは6系のままなので、ビルドに使うコンパイラのバージョンを変更する。

#CMake
https://codeyarns.com/2013/12/24/how-to-set-c-or-c-compiler-for-cmake/
参考
opencv-3.3.0直下にあるCMakeLists.txtを編集

```CMakeLists.txt
SET(CMAKE_C_COMPILER /path/to/c/compiler)
SET(CMAKE_CXX_COMPILER /path/to/cpp/compiler)
```

を多分どこでもいいので追加（自分は一番下に追記した）
先程の手段でgcc-4.9とg++-4.9を入れていたのであれば
それぞれ

```CMakeLists.txt
SET(CMAKE_C_COMPILER /usr/bin/gcc-4.9)
SET(CMAKE_CXX_COMPILER /usr/bin/g++-4.9)
```

になるはず

ここまでくればあとは
https://www.learnopencv.com/install-opencv3-on-ubuntu/
このページに沿って、cmake以下を実行していけば行けるはず

#課題
opencv3自体のインストールはうまくいった。
けど、pythonからopencvを使うためのcv2*.soが見つからなかった。
結局anacondaを使ってインストールして使うことになった。
Macとsystemd-nspawnで普通の開発環境を作るまで(3)～ファイル共有設定～

前回: [Macとsystemd-nspawnで普通の開発環境を作るまで(2)～起動設定～](https://qiita.com/yaasita/items/78271deb8fcb6cee0a14)

今回はファイルの共有設定を行い、Mac側からファイルを編集できるようにしてみます。

# 概要

今回はこんな感じにします。
Mac側に`/Users/yamasita/mnt`というディレクトリを作り、そのディレクトリとVituralbox Ubuntu(host)内の`/mnt`にvboxsfで繋げます。
さらにそのディレクトリをコンテナ側にマウントしてつなげることでMacからコンテナ内のファイルを触れるようにします。

![fileshare.png](https://qiita-image-store.s3.amazonaws.com/0/106549/c0b73207-4a39-57d6-d6a7-048486a37148.png)

# Ubuntu(host)とのファイル共有設定

まずvirtualbox guest additionsをインストールします。
ubuntu(host)にログイン後、rootで以下を実行します

```bash
# multiverseのパッケージなのでリポジトリを追加します
curl -L https://goo.gl/qsE7A8 > /etc/apt/sources.list
# インストール
apt update
apt install -y virtualbox-guest-dkms
# シャットダウン
shutdown -h now
```

次に、Virtualboxの設定から共有フォルダーを選び以下のように共有するディレクトリと名前を指定します。

![Virtualbox設定.png](https://qiita-image-store.s3.amazonaws.com/0/106549/f5f23769-8266-45b1-d558-04d4ddd860fb.png)

設定後、起動し、Ubuntu(host)のrootで以下のようにしてmountしてみます

```bash
# mount設定を追記、uid,gidを指定してアプリケーションユーザが触れるようにする
echo 'mnt /mnt vboxsf defaults,uid=1000,gid=1000 0 0' >> /etc/fstab
echo vboxsf >> /etc/modules
mount /mnt
```

これで、ubuntu(host)の`/mnt`とMacの`/Users/yamasita/mnt`がつながったと思います

# Ubuntu(host)とコンテナを繋ぐ

最後にUbuntu(host)の`/mnt`とコンテナの`/mnt`を繋げます
Ubuntu(host)のrootから

```bash
# コンテナ停止
machinectl poweroff ubuntu
# nspawnファイルを作成
mkdir /etc/systemd/nspawn
curl -L https://goo.gl/3n6QkG > /etc/systemd/nspawn/ubuntu.nspawn
# コンテナ起動
machinectl start ubuntu
```

.nspawnファイルはコンテナ個別に設定するためのファイルです
[コンテナ名].nspawnファイルという名前で保存すれば、特定のコンテナだけに有効な設定を追加できます
今回は/mnt同士を繋げるので`Bind=/mnt`を書いておきます
これで、Ubuntu(host)の`/mnt`とコンテナの`/mnt`が繋がりましたので最終的にMacの`/Users/yamasita/mnt`とコンテナの`/mnt`が繋がっているということになります。

# Mac側から編集

本当にMac側で編集したファイルがコンテナ内から見えるかテストしてみます

```bash
# コンテナに入る
machinectl shell ubuntu /bin/bash
# appユーザの追加　※おそらく最初のユーザなのでuid=1000,gid=1000のアカウントが作られます
useradd -m app
# 例としてmojoliciousを使います
apt update
apt install -y libmojolicious-perl
# appユーザになってWebアプリを作成
su - app
cd /mnt
mojo generate lite_app example.pl
morbo -l http://0.0.0.0:3000 example.pl
```

http://192.168.56.3:3000/ にアクセスするとmojoliciousが作るHTMLが見えると思います

Mac側で`/Users/yamasita/mnt/example.pl`を編集してブラウザをリロードすると表示が変わります
このようにして、コンテナ内のファイルを編集できるようになります

[次回](https://qiita.com/yaasita/items/d7281fbaf646b55ea824)は実際にDBコンテナを作ってRailsの開発環境を作ってみます
次回: [Macとsystemd-nspawnで普通の開発環境を作るまで(4)～実践編～](https://qiita.com/yaasita/items/d7281fbaf646b55ea824)
javascriptの「配列ライク」の罠

# javascriptのドキュメントで登場する「配列ライク」

例えば、「getElementsByClassName」メソッド。
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName

>与えられたクラス名で得られる要素の配列ライクのオブジェクトを返します。document オブジェクトで呼び出されたときは、ルートノードを含む、完全な文書が検索されます。任意の要素でgetElementsByClassName() を呼び出すこともできます。その場合は、与えられたクラス名を持つ指定されたルート要素下の要素だけが返ります。

なるほど、つまり、配列形式で帰ってくるんだな。確認してみる。

```js:sample.js
 tests = document.getElementsByClassName('test')
 console.log(tests) // [<div class='test'>1</div>,<div class='test'>2</div>,...]
```

確かに、配列で帰ってる。（ように見える…）

だけど、

```js:sample.js
 tests = document.getElementsByClassName('test')
 tests.forEach(...) // TypeError
```

とエラーになる。

# 配列ライクは配列ではない

言われれば当たり前だが、配列ライクは配列ではないのだ。したがって、配列(Array)に対して用意されているメソッド
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array
はそのままでは使えない。

# 対処法

今回はforEachがやりたかったので以下の記事が参考になった。Array.prototype.forEach.call()を使うのが基本的な対処法らしい。

http://ptech.g.hatena.ne.jp/noromanba/20120521/1337639496
http://ism1000ch.hatenablog.com/entry/2014/07/30/024635
ReactでimportしたComponentを操作する

# 外部Componentsをカスタマイズしたい・・・
　Reactをいじっていて、Componentsをimportすることは多々あるだろうが、そのComponentにカスタマイズしたい時がある。自分のアプリケーション内からのimportであれば、元のComponentを書き換えてあげれば問題ないが、外部からimportしているとそうはいかない。

# 解決法：直接DOMから操作する
　Reactの構成上、カスタマイズ（挙動を変える）するには、propsを使うしかない。当たり前だが、外部Componentsはあらかじめ指定されたpropsしか受け取らないので、Reactちっくにカスタマイズするのは無理そう。
　そうすると、残された道はReactでなくJavaScript(jQuery)を使って直接DOMを操作していくしかない。

# componentDidUpdateで直接DOMを操作する
　Reactは仮想DOM云々言われるように、実際のDOMを操作するわけではない。では、直接DOMを操作できないのか？一応できる。（あまり綺麗ではないが…）

　Reactには、ライフサイクルというのがあって（詳しくは下記URL）、その中で、直接DOMを操作できるタイミングがある。そのうちの一つがcomponentDidUpdate。（componentDidMountでも出来る）
　https://qiita.com/yukika/items/1859743921a10d7e3e6b

　つまり、このcomponentDidUpdate内にJSやらjQueryでDOM操作をすればいい。

```js:React.js
class sample extends React.Component {
 ...
 componentDidMount(){
  //ここにDOM操作処理
 }
 ...
}
```

# Reactのメリット
　Reactは、仮想DOMという「DOMの設計図」を作る。「DOMの設計図」と言われても良く分からない場合は、以下のように解釈したら良い。

- javascript(jQuery)では、プログラマは「これをこうして」という指示を飛ばす
- Reactでは、プログラマは「これをこうなるようにして」という指示を飛ばす（それをどう実現するかはReactが考える）

　こんな感じ。Reactでは「こうしたい」という完成図（＝設計図）がコード上に見て取れるので、jQueryなどに比べて（React文法を理解できれば）理解しやすい。

　ただ、今回のように、「こうなる」の部分を変えられない場合には、「こうして」の指示を別途に飛ばさないといけない。
virt-managerが動かない

virt-managerが動かない…

環境
* ローカル: MacOS High Sierra
* リモート: Debian

# 第一章
```
-bash: virt-manager: コマンドが見つかりません
```

**結論**
virt-managerが入っていない。apt-getで入れる。

# 第二章
```bash
Traceback (most recent call last):
  File "/usr/share/virt-manager/virt-manager.py", line 383, in <module>
    main()
  File "/usr/share/virt-manager/virt-manager.py", line 285, in main
    raise RuntimeError(_("Unable to initialize GTK: %s") % gtk_error)
RuntimeError: GTK を初期化できません: could not open display
```
GTKが初期化できないらしい

`ssh -vvv`して見てみると、こんなログを見つける

```
debug1: X11 forwarding requested but DISPLAY not set
```

**結論**
XQuartzが入っていない。https://www.xquartz.org/ からダウンロードしてインストールし、ログアウト→ログインする。

ちなみに、`ssh -X`を付けていない場合もこのエラーが出る。

# 第三章
```
debug2: X11 connection uses different authentication protocol.
X11 connection rejected because of wrong authentication.
```

**結論**
うーん…どうやって直したか忘れてしまった…
~/.Xauthorityを消して、XQuartz.appの「環境設定→ネットワーク・クライアントからの接続を許可」をしたら直った気がする。

# 第四章
```bash
$ sudo virt-manager
[sudo] password for user: 
Traceback (most recent call last):
  File "/usr/share/virt-manager/virt-manager.py", line 383, in <module>
    main()
  File "/usr/share/virt-manager/virt-manager.py", line 285, in main
    raise RuntimeError(_("Unable to initialize GTK: %s") % gtk_error)
RuntimeError: GTK を初期化できません: could not open display
```
変わらず〜〜
-vvvすると…

```
debug2: X11 auth data does not match fake data.
X11 connection rejected because of wrong authentication.
debug2: X11 rejected 1 i0/o0
```

**結論**
`sudo`をやめる。

# 最終章
<img src="https://qiita-image-store.s3.amazonaws.com/0/103086/afb3a893-674b-63bc-1e38-aea3af04cc48.png" width="500px"/>
あばばば

ここまで来るとググればヒットしそう。
`sudo`がないから`virt-manager`が`virsh`の情報を読み込めない。でも、`sudo su`でやると、今度はX11の転送に失敗する。

**結論**
`sudo XAUTHORITY=~/.Xauthority virt-manager`
これでsudoしながら~/.Xauthorityを使ってもらえる。

これで無事に実行できた。。
Twitter で誕生日をお祝いするブックマークレット

を書きました！

![happy.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/58c658a9-030d-1579-a408-d98ed84b720b.gif)

### 実行方法

(1).

```
javascript: (() => { let x = 0; const texts = $('.tweet') .find('.tweet-text') .map((t, v) => v.innerText); const colors = [ '#ff7f7f', '#ff7fbf', '#ff7fff', '#bf7fff', '#7f7fff', '#7fbfff', '#7fffff', '#7fffbf', '#7fff7f', '#bfff7f', '#ffff7f', '#ffbf7f', ]; const iid = setInterval(() => { const text = texts[Math.floor(Math.random() * texts.length)]; const element = document.createElement('div'); element.innerHTML = text; element.style.position = 'absolute'; element.style.zIndex = 10000; element.style.background = colors[Math.floor(Math.random() * colors.length)]; element.style.color = 'white'; element.style.padding = '5px'; element.style.borderRadius = '5px'; element.style.top = window.innerHeight * Math.random() + 'px'; element.style.left = window.innerWidth * Math.random() + 'px'; document.body.appendChild(element); let t = 0; const sid2 = setInterval(() => { if (++t === 100) { window.clearInterval(sid2); document.body.removeChild(element); } element.style.transform = `rotate(${Math.abs(t % 16 - 8) - 4}deg)`; }, 100); if (++x === 100) { window.clearInterval(iid); } }, 1000); })();

```
をブックマーク


(2). Tweet ページ(/status/:tweet_id) で実行してみよう！

例: https://twitter.com/keisei_1092/status/926102386380218369



💻 Code:
https://github.com/elzup/bookmarklets/blob/master/balloon-tweet.js

```js:pretty
// javascript:
(() => {
	let x = 0;
	const texts = $('.tweet')
		.find('.tweet-text')
		.map((t, v) => v.innerText);
	const colors = [
		'#ff7f7f',
		'#ff7fbf',
		'#ff7fff',
		'#bf7fff',
		'#7f7fff',
		'#7fbfff',
		'#7fffff',
		'#7fffbf',
		'#7fff7f',
		'#bfff7f',
		'#ffff7f',
		'#ffbf7f',
	];
	const iid = setInterval(() => {
		const text = texts[Math.floor(Math.random() * texts.length)];
		const element = document.createElement('div');
		element.innerHTML = text;
		element.style.position = 'absolute';
		element.style.zIndex = 10000;
		element.style.background =
			colors[Math.floor(Math.random() * colors.length)];
		element.style.color = 'white';
		element.style.padding = '5px';
		element.style.borderRadius = '5px';
		element.style.top = window.innerHeight * Math.random() + 'px';
		element.style.left = window.innerWidth * Math.random() + 'px';
		document.body.appendChild(element);

		let t = 0;
		const sid2 = setInterval(() => {
			if (++t === 100) {
				window.clearInterval(sid2);
				document.body.removeChild(element);
			}
			element.style.transform = `rotate(${Math.abs(t % 16 - 8) - 4}deg)`;
		}, 100);
		if (++x === 100) {
			window.clearInterval(iid);
		}
	}, 1000);
})();

```

おめでとうございます！
Flatten an array in TypeScript

An array containing primitive values, objects and other arrays can be flattened using a recursive `reduce` function.

```ts
const flatten = < T = any > (arr: T[]) => {
  const reducer = < T = any > (prev: T[], curr: T | T[]) => {
    if (curr.constructor !== Array) {
      return [...prev, curr];
    }
    return curr.reduce(reducer, prev);
  };
  return arr.reduce(reducer, []);
};
```

For example:

```ts
const values = [1, 2, 3, 4, [5, 6], 7, [8, [9]]];
const flatValues = flatten(values);
console.log(flatValues);
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```
[Github Gist](https://gist.github.com/maroun-baydoun/ec07608580113d132434698430e61db3)
.NET Core で Code Coverage を利用する

# はじめに

.NET Core で Code Coverage を利用する方法です。テストフレームワークは xUnit.net を使います。

検証した環境は以下の通り。（カバレッジは Enterprise じゃないと使えないはず）
Visual Studio Enterprise 2017 (15.4.0)
.NET Core 2.0

# プロジェクトの作成

クラスライブラリを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/abdb6232-3a28-1e38-fd9f-46821590cf42.png)

同じソリューションにテストプロジェクトも作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/eed86071-e4a1-8b98-1e16-7fce97186670.png)

テストプロジェクトにはクラスライブラリへの参照を追加しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/ba3ce4a6-aa6d-c86c-b868-6ac21da33517.png)

# NuGet Package の追加とアップデート

パッケージマネージャーコンソールを開いて、以下のコマンドを実行します。

```ps1
Update-Package

Install-Package Microsoft.CodeCoverage -ProjectName UnitTests
```

テストプロジェクトは以下のようになります。

```UnitTests.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeCoverage" Version="1.0.3" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
    <PackageReference Include="xunit" Version="2.3.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\ApplicationCore\ApplicationCore.csproj" />
  </ItemGroup>

</Project>
```

# テストメソッドの追加

クラスライブラリにテスト対象のメソッドを追加します。

```csharp:Class1.cs
using System;

namespace ApplicationCore
{
    public class Class1
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}
```

テストプロジェクトにテストメソッドを追加します。

```csharp:UnitTest1.cs
using System;
using Xunit;
using ApplicationCore;

namespace UnitTests
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            var sut = new Class1();

            Assert.Equal(5, sut.Add(2, 3));
        }
    }
}
```

# DebugType の変更

クラスライブラリの DebugType を Full にします。現時点では Full でないとカバレッジが利用できません。

```ApplicationCore.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <DebugType>Full</DebugType>
  </PropertyGroup>

</Project>
```

[Working with code coverage](https://github.com/Microsoft/vstest-docs/blob/3c64cbc1a387d6f7f9ebc82a953246322d94cd5c/docs/analyze.md#working-with-code-coverage)
temporary workaround と書いてあるので、そのうち不要になるのかも。

# 分析の実行

[テスト] - [コードカバレッジの分析] - [すべてのテスト] を実行します。テストが実行され、コードカバレッジの結果が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/2913ab22-07f8-8330-b55d-4e093a556763.png)

# コマンドラインからの実行

コマンドラインから実行する場合は、テストプロジェクトのアセンブリを指定して実行します。結果はカレントディレクトリの TestResults フォルダ 配下に出力されます。出力された .coverage ファイルは Visual Studio に読み込ませて確認できます。

```
vstest.console.exe  --collect:"Code Coverage" --framework:".NETCoreApp,Version=v2.0" "C:\Source\CoverageSample\UnitTests\bin\Debug\netcoreapp2.0\UnitTests.dll"
```

# まとめ

Visual Studio Enterprise は高いんですよねぇ。。。カバレッジぐらいは Professional とか Community でも使えるようにしてほしい。
RHEL7のvmxnet3ではPTPが使用できない

# 結論
ESXi上の仮想マシンでRHEL7を使用する場合、vmxnet3ではPTPが使用できないのでE1000の仮想NICを使用する。

Support for PTP software transmit timestamping in vmxnet3 driver shipped with RHEL7.
https://access.redhat.com/solutions/2145591


# メモ

**ethtool -T コマンド**
> \# ethtool -T ens192
> Time stamping parameters for ens192:
> Capabilities:
>         software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
>         software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
> PTP Hardware Clock: none
> Hardware Transmit Timestamp Modes: none
> Hardware Receive Filter Modes: none

**ethtool -i コマンド**
> \# ethtool -i ens192
> driver: vmxnet3
> version: 1.4.7.0-k-NAPI
> firmware-version:
> expansion-rom-version:
> bus-info: 0000:0b:00.0
> supports-statistics: yes
> supports-test: no
> supports-eeprom-access: no
> supports-register-dump: yes
> supports-priv-flags: no


**/etc/sysconfig/ptp4lファイル**
> OPTIONS="-f /etc/ptp4l.conf -i ens192 -S"
> ※ -S はソフトウェア時刻同期にすることを指定

**/var/log/messagesのエラー**
> Nov  3 00:52:22 rhel7 systemd: Started Precision Time Protocol (PTP) service.
> Nov  3 00:52:22 rhel7 systemd: Starting Precision Time Protocol (PTP) service...
> Nov  3 00:52:22 rhel7 ptp4l: [8377550.546] interface 'ens192' does not support requested timestamping mode
> Nov  3 00:52:22 rhel7 ptp4l: failed to create a clock
> Nov  3 00:52:22 rhel7 systemd: ptp4l.service: main process exited, code=exited, status=255/n/a
> Nov  3 00:52:22 rhel7 systemd: Unit ptp4l.service entered failed state.
> Nov  3 00:52:22 rhel7 systemd: ptp4l.service failed.
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第九章 暗黙的な概念を明示的にする4 文献・実験

[前々々回](https://qiita.com/YasuhiroKimesawa/items/809ac929026daef0b768)より

暗黙的な概念を導き出すためのヒントはどこにあるか。
>
1. [チームの言語に耳を傾ける](https://qiita.com/YasuhiroKimesawa/items/620feebc26b047c39264)
2. [設計のぎこちない点・エキスパートの発言で矛盾すると思われる点を詳細に調べる](https://qiita.com/YasuhiroKimesawa/items/97c98042b37416f82d75)
3. ドメインに関する文献を読む
4. 大量の実験をする

続きです

## ドメインに関する文献を読む

> モデルの概念を探す時には、自明のことを見逃してはならない(第三部第九章より)

いろいろなドメインでも、基本的な用語や通念を解説している文献がありますよね。
そういった文献からヒントが得られることが多々あります。

書籍だけではなく、専門雑誌や専門紙なんかもその業界を知り、用語を得るヒントが満載です。

例えば、アパレル系であれば、[WWD](https://www.wwdjapan.com/)や[繊研（せんけん)新聞](https://senken.co.jp/)など参考になります。

また、日本人なら同じ業界の海外のサイトなども参考になります。
ECサイトであれば、Amazon.co.jpではなく、[Amazon.com](https://www.amazon.com/)が参考になります。

特に、こういったサイトのHelpページは業務の用語が満載です！
例えば、ECサイトでよくあるサービスである、「当日お急ぎ便」。
comの[ヘルプページ](https://www.amazon.com/gp/help/customer/display.html/ref=hp_left_v4_sib?ie=UTF8&nodeId=202082690)を見ると「One-Day Shipping」とありますね。

しかし、これもきちんとドメインエキスパートと会話をしないといけません。
この英語だと、1日でお届けと言う意味になりますよね。

ではなくて、その日のうちに発送(お届け日はわからない）という意味での「当日」であると、恐らくOne-Day Shippingは使えません。

こういったことも文献・サイトをヒントに会話を始めることができます。

## 大量の実験をする

> わかりやすい、有用なものを見つけるためには、会話に出てきた手がかりを、片手では数え切れないくらい辿らなければならなかっただろう。それも、後で最低1回は取り替えることになる。(第三部第九章より)

方向性を変えることは、ムダではなく、変更するたびに、より深い洞察がモデルに反映されていきます。

他に方法はなく、銀の弾丸もありません。実験＆実験＆実験です。

> 設計における誤りを避けようとすれば、結果としてできるものの品質は低くなる。**基になる経験が少ないからだ**(第三部第九章より)

深いですね。実験を繰り返すことで、経験を得ることができて、品質は上がっていく。逆に実験・失敗を避けるということは経験をも避けるということで品質が下がっていくということです。

やはり、実験＆実験＆実験が大事ですね。
cocos2d-xをやってみた導入編(ios)

# はじめに
iOS開発が2年目に差し掛かるにあたって、
個人的に興味があったcocos2d-xに挑戦してみようと思い至りました。
webに投稿すること自体も初めてです。

#環境
- macOS sierra バージョン10.12.5
- xcode 8.3.3

#用意するもの
- cocos2d-x-3.16(http://www.cocos2d-x.org/download)

#環境構築
## 1. Command Line Toolsをインストール
>ターミナルを起動して以下のコマンドを入力
`
USER $ xcode-select --install
`
以下のようなダイアログが出るので**install**を選択
 ![Qiita](https://macops.ca/images/2013/10/xcodeselect-install@2x.png)


## 2. cocos2d-xをインストール
>ダウンロードしたcocos2d-x-3.16のディレクトリへ移動
（ダウンロード先：http://www.cocos2d-x.org/download）
`
$ cd ~/cocos2d-x-3.15.1/
`
セットアップ用のコマンドを入力
`
$ ./setup.py
`
androidのSDK,NDK,ANTの確認が求められると思うが、
今回はandroidは使用しないので**enter**でスキップ

>これで`cococs`コマンドが利用できるようになる
`
$　cocos
`を実行すると以下のような内容が出力される

>```
>/Users/user/cocos2d-x-3.15.1/tools/cocos2d-console/bin/cocos.py 2.3 - cocos >console: A command line tool for Cocos2d-x.
>
>Available commands:
>	run              Compiles, deploy and run project on the target.
>	gen-libs         Generate prebuilt libs of engine. The libs will be placed >in 'prebuilt' folder of the engine root path.
>	luacompile       Encrypt and/or compile lua files.
>	deploy           Compile and deploy a project to a device/simulator.
>	package          Manage package for cocos.
>	compile          Compile projects to binary.
>	gen-simulator    Generate Cocos Simulator.
>	new              Creates a new project.
>	jscompile        Compile and/or compress js files.
>
>Available arguments:
>	-h, --help			Show this help information.
>	-v, --version			Show the version of this command tool.
>	--ol ['en', 'zh', 'zh_tr']	Specify the language of output messages.
>	--agreement ['y', 'n']		Skip the agreement with specified value.
>
>Example:
>	cocos new --help
>	cocos run --help
>```

## 3. cocos2d-xのプロジェクト作成
>`cocos new`でプロジェクト作成
コマンドの解説と使用法の出力を参考

>```
>usage: cocos new [-h] [-p PACKAGE_NAME] [-d DIRECTORY] [-t TEMPLATE_NAME]
>                 [--ios-bundleid IOS_BUNDLEID] [--mac-bundleid MAC_BUNDLEID]
>                 [-e ENGINE_PATH] [--portrait] -l {cpp,lua,js}
>                 [PROJECT_NAME]
>```
>サンプルコマンド
>
>```
>$ cocos new SampleCocos -p com.mycompany.SampleCocos -l cpp -d ~/Desktop/myProdacts
>```

#おわり
とりあえず今回はここまで。
次回から手を動かしてみて、
色々と書いていこうと思います。

#参考書
cocos2d-xではじめるスマートフォンゲーム開発 :
(http://gihyo.jp/book/2015/978-4-7741-7055-8)
英語の文章を選択するだけで和訳を表示させる方法

英語文献を読む際に、単語がわからなかったりパッと読み取れなかったりする場合、一度google翻訳をかけたくなることがあります。

その際、文章をコピーしてgoogle翻訳のページを立ち上げて貼り付け、としていませんか？

もっと簡単に、文章を選択しただけで翻訳結果を取得する方法があります！

(ただし、chrome限定になります)

### まずはgoogle翻訳chrome拡張
まず、chrome拡張をインストールします。

[Google 翻訳 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja)

これだけでも、だいぶ便利に使うことができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/e7b1589d-d930-a311-bc44-98de1e7ead37.png)

英語の文字列を選択するとアイコンが表示されるので、それをクリックすると。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/77693bd7-aaf2-4944-8141-c012fec2e34a.png)

訳文が表示されました。便利ですね！！

ただ、私の英語力だと同じページでなんども使いたくなるので、そうすると***「選択→アイコンクリック→選択→アイコンクリック」***の繰り返しが結構面倒になります。

### 設定を変更してより便利に！
そんな時に良い設定があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/31da8ae3-d68f-3276-e41d-4baa99f6e2f5.png)

この「拡張機能オプション」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30489/7d46d443-1c69-3e4d-143b-06a3f415018a.png)


ここで「すぐにポップアップを表示する」を選択して「保存」ましょう。

すると、英語の文字を選択しただけですぐに訳文が表示されます！

これは非常に便利で、手放せなくなります。ぜひお試しあれ。

#### その他ネタ
[googleスプレッドシートのフィルタ機能で自分だけの絞り込みを行う方法](http://office-hacks.hatenablog.com/entry/2017/10/29/213551)
[セルの値を連結するとき、「A1 & B1 & C1 & D1 & ......」という長くて面倒な式を書かなくて良くなる方法](http://office-hacks.hatenablog.com/entry/2017/10/29/185522)
[ドメイン駆動設計関連情報のググるときのコツ](http://little-hands.hatenablog.com/entry/2017/10/31/002552)
mDNSを設定して、いちいちIPアドレスを打ち込むのをやめよう。


# やりたいこと

VirtualBoxで動かしているUbuntuへのアクセスをIPアドレスじゃなくて名前指定したい。

# 環境
- macOS Sierra
- Ubuntu 17.04(VirtualBox)

# mDNSとは

（ローカルネットワーク内に限り）DNSサーバなしで名前解決できる便利な仕組みっぽい。


# インストール手順


```
sudo apt-get install avahi-daemon
```

インストールのためのコマンドはこれだけ。

# 成果確認


```
msrx9@ubuntu:~$ cat /etc/hostname
ubuntu
```

Ubuntuのホストネームを確認します。
hostnameの後に.localをつけるだけでアクセスできるようになります。
私の環境だと `ubuntu.local` で名前解決できるはずです。
さっそくsshでログインしてみましょう。

```
mba-no-MacBook-Air:~ mba$ ssh -l msrx9 ubuntu.local
msrx9@ubuntu.local's password:
Welcome to Ubuntu 17.04 (GNU/Linux 4.10.0-35-generic x86_64)
```

無事、IPアドレスではなく名前で接続できました。


# 参考

- [Raspberry Pi(Raspbian)にmDNSを設定する](http://d.hatena.ne.jp/pasela/20131023/mdns)

- [avahi-daemonを設定してDNSサーバ運用をやめた](https://qiita.com/ymotongpoo/items/700884e64832f812b9db)

- [mDNSの謎について](https://amiq11.tumblr.com/post/131870343484/mdns%E3%81%AE%E8%AC%8E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)