OmniAICreator/Qiita-1.07M huggingface dataset:
距離行列を作る

# 地点相互の距離
Numpyではループを使うと遅くなるので，様々な技法が使われます。ベクトルや行列形式で書けば良いものは簡単なのですが，ブロードキャストを用いるものがあります。その例として，距離の行列の生成があります。複数の場所の位置が`x`に格納されているとして，相互の距離を計算するにはどのようにしたら良いでしょうか。

# とりあえずループ
筆者はFortranに長年親しんでいるので，ループを使って書きたくなります。

```fortran
do j = 1, n
  do i = 1, n
    r(i, j) = sqrt((x(i) - x(j))**2)
  end do
end do
```

Pythonに直訳すると

```py3
for i in range(len(x)):
    for j in range(len(x)):
        r[i, j] = math.sqrt((x[i] - x[j])**2)
```

となります。ndarrayにしても長さ10程度では差はなく，むしろリストのままの方が速くなりました。

# ブロードキャスト
Numpyの（積も含む）配列演算は，基本的に要素毎です。4x3の2次元配列など同じ形状の配列の演算は，それぞれの要素に対して行われます。4x3の2次元配列と1x3の1次元配列のようなサイズが違うものに対しては，サイズが同一になるように1次元配列の行が繰り返されているとして計算が行われます。この変換を「ブロードキャスト」と呼びます。

位置を格納した`x`については，その転置との演算を行えば配列が返ってきそうですが，そうはなりません。同一形状とみなされ0の羅列になってしまいます。

# 次元を増やす
ブロードキャストを使いループなしに求める距離行列を生成するには，片方の次元を増やします。次元を増やすには，`np.newaxis`を使います。`None`でも同様です。`np.newaxis`または`None`を指定した次元の長さは1になります。なお，筆者は使ったことがないのですが，Fortran95には`spread`という組込関数があります。

```py3
np.sqrt((x - x[:, np.newaxis])**2)
```

nx1と1xnの演算にしても良いでしょう。

```py3
np.sqrt((x[np.newaxis, :] - x[:, np.newaxis])**2)
```
筆者の環境では10地点に対して`%timeit`で計測したところ，ndarrayのループが69.1 μs，リストのループが54.1 μs，ループを回避して行列の次元を増やしたものは3.04 μsでした。1000地点だとndarrayのループが660 ms，行列の次元を増やしたものは2.47 msとなりました。

# n次元化
`...`を使うと次元の数が配列の次元になるように`:`を並べたのと同じになります。n次元空間の点のユークリッド距離は次のように計算できます。  

```py3
np.sqrt(((x[..., np.newaxis, :] - x[..., :, np.newaxis])**2).sum(axis=0))
```

# 参考
* Scipy lecture notes 1.3.2.3 [Broadcasting](http://www.scipy-lectures.org/intro/numpy/operations.html#broadcasting) [和訳](http://www.turbare.net/transl/scipy-lecture-notes/intro/numpy/operations.html#broadcasting)
* [scipy.interpolate.Rbf](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.Rbf.html#scipy.interpolate.Rbf)の[ソース](https://github.com/scipy/scipy/blob/v0.19.0/scipy/interpolate/rbf.py#L57-L240)
phpとmysqlで開発する時に使うdocker-composeについて考えた

# 必要だったもの

- php 5.3の環境
- mysql 5.5の環境
- 複数のphpサイトを扱える
- 複数のphpサイトでmysqlを共有できる

## 考えるに至る動機

- 手元の環境はphp7にしておきたかった。
- 開発用のDB管理を楽にしたい。

## 今回覚えたこと

- docker-composeはとても便利だ。
- Virtual Machineのディスクやパーティション管理はやっぱり面倒だったんだな。

# 使っているもの

## https://hub.docker.com/_/amazonlinux/

採用理由はphp 5.3をサポートしている環境で使ったことがあったから。
公式のdocker hubにはphp 5.6からしかなかった。

## https://hub.docker.com/_/mysql/

MYSQL_DATABASE環境変数に複数指定する方法がわからなかったので、
Docker MySQL公式イメージを使用してDBに初期データを流し込む
http://qiita.com/furu8ma/items/75e5b1df29fef04ec7f1
を使わせてもらってます。
もしかしたらmysql公式dockerの思想では1コンテナ1データベースなのかもしれない。

# サンプルプロジェクト
https://github.com/iyoda/docker_sample

# 動作に必要なもの
docker version 17

# 使い方

## コンテナ実行
1. サンプルプロジェクトをチェックアウト
2. foobar-serverフォルダに移動
3. docker-compose up -d を実行してイメージ作成コンテナ起動を行う
4. docker-compose logs を実行してログを確認

mysqlのデータ領域をホスト側のmysqlフォルダに作るのでコンテナを消してもDBの内容は消えない。

## 動作確認

http://localhost:9080/mysql_sample.php
http://localhost:9081/phpinfo.php
が見れていればOK
libpng を使ったアプリが実行時に `libpng warning: Interlace handling should be turned on when using png_read_image` を吐いてくれる時の正しい対処法

# 概要

[libpng](http://www.libpng.org/pub/png/libpng.html) を使ったアプリの実行中に以下のの警告表示が発生する場合の正しい対処方法をメモ。

# warning

```
libpng warning: Interlace handling should be turned on when using png_read_image
```

# 原因

インターレースが有効なPNGを読み込む際に、`png_set_interlace_handling` しないまま `png_read_image` を呼んでしまっている。

# 対処方法

`png_get_IHDR` などで読み込むPNGの width や height などと併せて interlace の定数値も読めるので、 interlace の定数値が `PNG_INTERLACE_NONE` でなければ `png_set_interlace_handling` を呼んでから `png_read_image` するよう修正する。

```c++
...

// 本件で欲しい情報
int interlace_type = PNG_INTERLACE_NONE;

// 情報が要らないところは nullptr を渡す仕様
png_get_IHDR
( png.get()
, nullptr // info
, &width
, &height
, &bits_per_element
, &color_type
, &interlace_type
, nullptr // compression_type
, nullptr //filter_type
);

...

// 本件に必要な修正
if ( interlace_type != PNG_INTERLACE_NONE )
  png_set_interlace_handling( png.get() );

...

// read
png_read_image( png.get(), rows.data() );
png_read_end( png.get(), nullptr );

...
```

# 参考

- https://sourceforge.net/p/libpng/bugs/165/
MD5

```objc:Objective-C-Bridging-Header.h
#import <CommonCrypto/CommonCrypto.h>
```

```swift:String.swift
extension String {

	var MD5: String? {
		let length = Int(CC_MD5_DIGEST_LENGTH)
		var digest = [UInt8](repeating: 0, count: length)
		
		if let d = self.data(using: .utf8) {
			_ = d.withUnsafeBytes { (body: UnsafePointer<UInt8>) in
				CC_MD5(body, CC_LONG(d.count), &digest)
			}
		}
		
		return (0 ..< length).reduce("") {
			$0 + String(format: "%02x", digest[$1])
		}
	}

}
```

http://stackoverflow.com/questions/24123518/how-to-use-cc-md5-method-in-swift-language
Lambdaにjarをdeployする（その２）

# マネージメントコンソールからLambda関数を登録する。

マネージメントコンソールからLambdaを選択し、関数の作成に進みます。

新規関数からトリガーの設定を選択します。
点線の四角をクリックすると、イベントが選択できるのでS3を選択します。
![dep2.png](https://qiita-image-store.s3.amazonaws.com/0/169729/f2f1d2a2-4106-64cc-e0fa-8d836565953a.png)

ちょっとハマったのが、トリガーになるS3バケットが入力可能なComboBoxなのですが、作成済みのS3バケットを「選択」しないで「手入力」すると必須エラーになります。
※Kinesis Firehoseは設定しながらS3バケットが作れたのですけどね。
![dep4-error.png](https://qiita-image-store.s3.amazonaws.com/0/169729/982ff7c8-b084-af5e-0fbf-9228b5eb6aa1.png)

あとは説明をよく読みながら設定を進めます。

私が注意した所は「ロール」と「メモリ」ですね。
ロールは「テンプレートから新しいロールを作成」で作成することをお勧めします。
Lambdaの実行結果がCloudWatchのログに書かれますが、ロールの設定を間違えるとログすら見れない状況になります。

また、メモリですがデフォルト設定が512MBです。
メモリのサイズはLambdaの課金にかかわるリソースなので、最初は小さい値にしておいた方が良いと思います。

![dep5.png](https://qiita-image-store.s3.amazonaws.com/0/169729/89caa5a3-1a2f-92f5-e87c-8901a71d33c7.png)

そんなこんなでjavaのLambda関数が出来上がりました。
![dep6.png](https://qiita-image-store.s3.amazonaws.com/0/169729/8eaa6762-a7f3-25a2-7aed-f1c3655c21ed.png)

「テスト」からボタンから実行もできますが、S3バケットに直接アップロードして動かした結果がこれです。
(CloudWatchのログから参照できます)
![dep7 (2).png](https://qiita-image-store.s3.amazonaws.com/0/169729/fd2618fe-d26c-3435-b964-f22257c049b4.png)

めでたくHello hogehogeを確認することが出来ました。

気になる点ですが、Lambdaを利用した場合は１つ１つの処理が独立したJavaVMのプロセスで実行されていると思うのですが、たったこれだけの処理で48MBのメモリーを使用しています。
なのでJavaでLambdaを利用するのは非効率な気がします。

既存のJavaプログラムをLambdaに乗せるにしても、DBのConnection pool等、リソース共有ができないのでLambdaが持つauto scalingを有効に利用することができないと思います。
なのでスクラッチで作る場合は実装する言語や方式設計をよく練ったほうが良いと思いました。

さて、次はNode.jsを使って書いてみようと思います。
【Vagrant】新たなrailsアプリを作るまで

> VirtualBoxとVagrantのダウンロードは割愛

# 完全に自分用です。
最近vagrantでrailsの環境を立てることが多かったので、自分用にまとめたメモです。
きっと様々な要因で全員がこれの通りに構築できるとはないと思いますが、参考になればと思いアップします。
そして説明がめっちゃ少ないです。ごめんなさい。

# vagrant init
```
$ vagrant init ubuntu16.04 # vagrant box listで確認してから任意のOSを。
$ vim Vagrant file
```

以下のように修正・確認

```
Vagrant.configure("2") do |config|

  config.vm.box = "ubuntu16.04"

  config.vm.network "forwarded_port", guest: 3000, host: 3000

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.synced_folder ".", "/vagrant", nfs: true

end
```

# 諸々install

```
$ sudo apt-get update
$ sudo apt-get install -y libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
$ cd
$ wget https://www.kernel.org/pub/software/scm/git/git-2.5.0.tar.gz
$ tar -zxf git-2.5.0.tar.gz
$ cd git-2.5.0
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
$ which git
$ git --version
$ cd
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

`$ vim .bashrc`
で、末尾に以下を追加する。

```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
```

```
$ rbenv install 2.3.1
$ rbenv global 2.3.1
$ rbenv rehash
$ rbenv version
$ ruby -v
$ which gem
$ sudo apt-get install mysql-server
$ rbenv exec gem install bundler
$ gem search -r rails
$ gem install rails --no-ri --no-rdoc
```

# rails newじゃーー！
-T をつけてテストを作成しないように。

```
$ rails new app_name -T
$ cd app_name
$ bundle install --path vendor/bundle
```
Raspberry Pi 3でWifi接続(PEAP, MSCHAPv2)

ここ最近電子工作をがんばっています。同じITの世界なのにこんなに知らないことがあったのかと改めて実感しています。新しく知ることが多くて面白いです。

さてラズパイ3はWifiモジュールが標準装備になっていることを知り、いろいろ試行錯誤したので記録しておきます。

Wifiと一口に言ってもたくさん種類があります。
正確な説明を簡単にするのは難しいので、設定に必要な知識のみ大胆に端折って紹介します。

接続の方式にはWEP、WPA、WPA2があります。WPA2以外は解読する手法が見つかっているので現在では安全ではありません。WPA2にもWPAパーソナルとWPAエンタープライズがあります。よくWifiにつなげる方法として紹介されているのはWPAパーソナルと思われます。
例えばこういうもの
http://qiita.com/toshihirock/items/8e7f0887b565defe7989

WPAエンタープライズはその名の通り企業内でよく使われる方式のようです。こちらは設定がより難しくなっています。さらにこの中でも種類がいくつかあるようです。オイシックスではPEAP, MSCHAPv2でした。この場合の設定は以下のようにすればできました。

```/etc/wpa_supplicant/wpa_supplicant.conf
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="SSID名"
	priority=1
	key_mgmt=WPA-EAP
	pairwise=CCMP
	auth_alg=OPEN
	eap=PEAP
	identity="ユーザー名"
	password=hash:ハッシュ化したパスワード
	phase1="peaplabel=0"
	phase2="auth=MSCHAPV2"
}
```
パスワードをハッシュ化するには以下のコマンドを使います。

```
echo -n 'password_in_plaintext' | iconv -t utf16le | openssl md4
```
またDHCPにするため以下設定ファイルを変更しました。

```sh:/etc/network/interfaces
iface wlan0 inet manual
↓
iface wlan0 inet dhcp

追加
iface default inet dhcp
```

その他のコマンド。
設定ファイルを変えて接続を試す場合はifdown,ifupを使います。

```
sudo ifdown wlan0
sudo ifup wlan0
```
wifiの接続状態を確認するにはiwconfigコマンドが使えます。

```
iwconfig
```
以上、下記のサイトが一番参考になりました。
https://eparon.me/2016/09/09/rpi3-enterprise-wifi.html
Eclipseのインストール（Windows 64bit版）

JAVAアプリケーションの移行案件が舞い込んできたので
とりあえず自分のPCにEclipseをインストールすることに。

# 1.Eclipseのダウンロード
まずはEclipseをダウンロードしようとGoogle検索してみたところ
どうやら、Eclipse 本体と日本語化を行うための Pleiades プラグイン
およびプログラミング言語別に便利なプラグインをまとめた
オールインワンパッケージが用意されていたので、そちらをダウンロードすることに。

### 1-1.以下のURLにアクセス
http://mergedoc.osdn.jp/

### 1-2.最新版のリンクをクリック
<img width="1080" alt="スクリーンショット (2).png" src="https://qiita-image-store.s3.amazonaws.com/0/174442/f1b20530-8e71-e737-45dd-3daec0c52ba8.png">

### 1-3.自分のPCは64bit版Windowsなので赤枠のリンクをクリック
※32bit版なら青枠
<img width="1079" alt="スクリーンショット (3).png" src="https://qiita-image-store.s3.amazonaws.com/0/174442/b89b0b7f-0b9b-9320-24f1-c3a685b88763.png">

### 1-4.ダウンロードが開始されるのでしばらく待つ
※容量が約1Gバイトのため数分かかる
# 2.Eclipseのインストール（というか設置）
### 2-1.ダウンロードされたzipファイルを展開（pleiadesというフォルダができる）
※自分はC直下に展開
<img width="636" alt="スクリーンショット (4).png" src="https://qiita-image-store.s3.amazonaws.com/0/174442/472b830a-7e09-f8ac-0335-5a5a900bf945.png">


これくらいで、特にインストールする必要はなかった。

あとは「C:\pleiades\eclipse」配下にあるeclipse.exeを起動すれば、
日本語化されたEclipseが開いたのでこれでOKだと思う。

最初の起動時のみワークドキュメントを指定するウィンドウが開いたので
必要に応じて任意の場所を指定すればよい。
※プリントスクリーンは取り忘れた
IDCFクラウドでvagrant-cloudstack使ってみた話 

とても便利でした。

# あらまし

itamaeとserverspecを使って環境構築スクリプトを書いていて、砂場がほしくなったのでローカルマシンにVMを立てたかったのですが、職場のルール上ダメとのこと。

ローカルがダメならクラウド上に立てればいいじゃない！
ということでIDCFクラウドで仮想マシンを1つ作ることに。

# Vagrantfile

基本的に[こちら](http://qiita.com/atsaki/items/631b3d78a3949fe37b0f)の記事通りに進めていったのですが、何やらエラーが出てしまいました。
networkが判別できずに落ちているようだったので、`network_id`か`network_name`を設定しなければならないようです。

あとはそのままだとマシン名が人に優しくない名前になってしまうので設定しておきます。
管理コンソール上の表示名と合わせておくと、管理コンソールから作成したときと同じになるので分かりやすいです。

フォルダの同期設定もしておくと便利です。
`vagrant up`や`vagrant reload`を行うと設定したホストマシン上のフォルダとゲストマシン上のフォルダの同期を取ってくれます。
筆者はhomeディレクトリ直下にVagrantfileを置いてしまったため、初期設定でhomeディレクトリ以下全てを同期してくれようとしてひどい目にあい、同期先・元ともに変更しています。

OSはCentOSに変えています。
こちら、Vagrant向けのテンプレートを用意してくださっているので、それを利用しました。

上記の諸々を反映して以下のようになりました。

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-6.8"

  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder "./vagrant_data", "/home/vagrant/synced_data", type: "rsync"

  config.vm.provider :cloudstack do |cloudstack, override|
    # ダミーBox
    override.vm.box = "dummy"
    override.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"

    # CloudStackAPIを使用するためのエンドポイント・認証情報
    cloudstack.host = "compute.jp-east.idcfcloud.com"
    cloudstack.path = "/client/api"
    cloudstack.port = "443"
    cloudstack.scheme = "https"
    cloudstack.api_key = "API Keyをここに記入"
    cloudstack.secret_key = "Secret Keyをここに記入"

    # 仮想マシン作成のパラメータ
    override.vm.hostname = "マシン名を記入"
    cloudstack.display_name = "管理コンソール上の表示名を記入"
    cloudstack.template_name = "CentOS 6.8 64-bit for Vagrant" # <= Vagrant向けテンプレート
    cloudstack.zone_name = "joule"
    cloudstack.network_name = "joule-network1" # <= 必須！
    cloudstack.service_offering_name = "light.S1"

    # 仮想マシンへの接続に必要なネットワークの設定
    cloudstack.pf_ip_address_id = "IPアドレスのIDを記入"
    cloudstack.pf_public_port = "22"
    cloudstack.pf_private_port = "22"
    cloudstack.keypair = "SSH鍵の名前を記入"
    override.ssh.private_key_path = "SSHの秘密鍵のパスを記入"
    override.ssh.username = "vagrant" # <= Vagrant向けテンプレート使用に伴いユーザーを設定
  end
end
```

# 使ってみて

作成・削除ともにすぐに終わりますし、砂場用途にはかなりもってこいだと感じました。
管理コンソールからやると何かと面倒ですが、コマンド1つで出来るようになると使い勝手が格段に良くなりますね。

何かの機会があれば個人でも使ってみたいです。
docker execするのがめんどくさ過ぎる時の便利コマンド

コンテナにbashでログインするのがめんどくさいのでpecoを使って簡略化しました
ない場合はbrew等でインストールして下さい

```bash
brew install peco
```

brew使ってない方は go get でインストールして下さい

```bash
go get github.com/peco/peco/cmd/peco
```

# 本題:`de`というalias作成

```bash
alias de='docker exec -it $(docker ps | peco | cut -d " " -f 1) /bin/bash'
```

色んな使い方出来るpecoめっちゃ便利
長さの違う振り子のシュミレーション

#概要
長さの違う振り子のシュミレーションやってみた。
box2dwebは、シンクロしない。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/M/s/h/MshH.jpg?t=1491462331)

#成果物
http://jsdo.it/ohisama1/MshH
技術書読書会 #1 Infrastructure as Code

#技術書読書会 #1 Infrastructure as Code

## 技術書読書会とは
技術書を１冊きちんと読み込んだ先に見える景色が見てみたい！！

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思ったのか、そんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。メンバーのスキルレベルはまちまちですが、それはそれで面白いかと。どうぞ暖かく見守ってください。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間1時間で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 1～3を2回繰り返す
5. 10分間、まとめ
```


### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
4人

## 所要時間
1時間

## 進捗
1 - 1.4.5

## ディスカッション

### 1.2 Infrastructure as Codeとは何か？
オーケストレーションって何ですか？
        
峯　wikiペディアより
https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)
    
### 1.2.1 Infrastructure as Codeの目標
  岡　この通りだと思う

### 1.3.2 構成ドリフト
 峯　時間が立つと構成と設定が自然に変わっていくってよくあるよね。
宮　うなずく。

### 1.3.3 スノーフレークサーバー
岡　うちでもあるよね。

### 1.3.4　脆いインフラストラクチャ
峯　そのサーバーに触るな、指差すな、見るのもダメだ　は、身に沁みます。

### 1.3.5　オートメーション恐怖症

## 気づき
- タイマーは、みんなが見えるようにするといい感じ
- ディスカッションは、みんなが言いたいことを言おうとするので長くなってしまった。
- ファシリテーターが時間に気を配らないとだらだらする
- 結構音が気になる
- 結構集中できる

## まとめ
初めての読書会、勝手がわからずに手探り状態です。
時間が大事で、きっちり区切って進めていく事を心がけていきたいです。
PIXEL for PC を内蔵HDDからブート

raspbianOSであるPIXELのHDDへのインストール方法。

[公式](https://www.raspberrypi.org/blog/pixel-pc-mac/#comment-1267082)からの引用だと

> 
1. Boot it from USB/DVD
2. Transfer the entire stick to your drive:
  1. “sudo bash”
  2. “dd if=/dev/sdb of=/dev/sda bs=1M”
3. Reboot without the stick, should boot from internal HDD_
  1. “reboot”
4. Resize the Partition:
  1. “sudo bash”
  2. “fdisk /dev/sda”
  3. print partitions with “p”
  4. write down the beginning of partition 2
  5. delete partition 2 with “d”, then “2”
  6. create a new parition with “n”, primary partition, starting at the location from 4.4
  7. write with “w”
5. Reboot:
  1. “reboot”
6. Resize the filesystem on /dev/sda2 to fill the disk:
  1. “sudo bash”
  2. “resize2fs /dev/sda2”

ということで順にやってみる。

PIXELは[公式](http://downloads.raspberrypi.org/pixel_x86/images/pixel_x86-2016-12-13/)からisoで落としてUSBメモリに入れた前提です。

まずはインストール先のPCをUSBから起動する設定にします。電源入れてからF2とかDELとかのあれ。

無事起動したらターミナルを開きます。起動しなかった人は大体はUSBメモリへの入れ方が間違えてます。

いきなり`dd`コマンドは超怖いのでとりあえず`sudo fdisk -l`あたりでディスクを調べます。

```
Disk /dev/sda: ディスク容量 GiB, ・・・ bytes, ・・・ sectors
```

こんな表示と

```
Disk /dev/sdb: ディスク容量 GiB, ・・・ bytes, ・・・ sectors
```

がでたら容量でどちらがUSBメモリか判断します。そうじゃない方がHDDです。
だいたいsdbがUSBメモリのはず。

んで無事上記のとおりだったら`dd if=/dev/sdb of=/dev/sda bs=1M`でsdbをsdaにクローンします。

当然HDDの中身は消えます。お気に入り動画は避難しておきましょう。

無事完了したら、とりあえず起動できる形です。パーティションサイズも同じでいいなら終了。閉廷。
USBメモリ抜いてHDDから起動で終わりです。

パーティションサイズを変更したい人は`fdisk /dev/sda`でfdiskに入ります。

pを入力しエンター。/dev/sda2の次の数字をメモ。私は2709504でした。
dを入れてパーティション２を選ぶとパーティション２が消えます。
nで新しくパーティションを作ります。プライマリpで。パーティション番号は2。
開始位置はpを押したときにメモした数字です。

wでパーティションを書き込みます。exitして`sudo reboot`で再起動。

再起動後`resize2fs /dev/sda2`でフィニッシュです。

古いパソコンにインストールしたんだが、メモリが少ないと動作が厳しいです。
特にブラウザ。重い。。。
Amazon LinuxでのMongoDBアップグレード(3.0to3.4)

# 環境

## バージョン

    $ cat /etc/system-release
    Amazon Linux AMI release 2016.09

# 手順

## 準備

### バージョン確認

MongoDBのバージョンを確認する。

    $ mongo --version

今回の場合、3.0であった。
これを最新のバージョンである3.4に上げたい場合、3.0→3.4と一気にアップグレードできないため、3.0→3.2、3.2→3.4と2段階に分けてアップグレードする必要がある。

以下参考。
[3.4-upgrade-standalone](https://docs.mongodb.com/manual/release-notes/3.4-upgrade-standalone/#upgrade-version-path)

### バックアップの取得

念のため、バックアップを取得する。

    $ mongodump --out mongodump_20170406


### MongoDBにアクセスするサービスの停止

念のため、該当のMongoDBにアクセスするサービスを停止する。


## アップグレード(3.0to3.2)

mongodを停止する。

    $ sudo service mongod stop


repoファイルを作成する。

    $ sudo vi /etc/yum.repos.d/mongodb-org-3.2.repo

以下のように記述・保存する。

    [mongodb-org-3.2]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
    gpgcheck=0
    enabled=1

baseurlはOSによって異なるため、Amazon Linux以外のOSの場合、以下を確認して対応するURLに書き換える必要がある。

[https://repo.mongodb.org/](https://repo.mongodb.org/)

旧Repoファイルのenabledを0に変更する。

    $ sudo vi /etc/yum.repos.d/mongodb-org-3.0.repo

    [mongodb-org-3.0]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.0/x86_64/
    gpgcheck=0
    enabled=0

MongoDB3.2がアップデート可能なパッケージに含まれているかを確認する。

    $ yum check-update

アップデートを実行する。

    $ sudo yum update

アップデート完了後、mongodを起動する。

    $ sudo service mongod start

バージョンを確認する。

    $ mongo --version
    MongoDB shell version: 3.2.12

## MongoDBのアップグレード(3.2to3.4)

mongodを停止する。	

    $ sudo service mongod stop
	
repoファイルを作成する。

    $ sudo vi /etc/yum.repos.d/mongodb-org-3.4.repo

以下のように記述・保存する。	

    [mongodb-org-3.4]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/
    gpgcheck=0
    enabled=1	


旧Repoファイルのenabledを0に変更する。

    $ sudo vi /etc/yum.repos.d/mongodb-org-3.2.repo

    [mongodb-org-3.2]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
    gpgcheck=0
    enabled=0

MongoDB3.4がアップデート可能なパッケージに含まれているかを確認する。

    $ yum check-update

アップデートを実行する。

    $ sudo yum update

アップデート完了後、mongodを起動する。

    $ sudo service mongod start

バージョンを確認する。

    $ mongo --version

    MongoDB shell version v3.4.3
    git version: f07437fb5a6cca07c10bafa78365456eb1d6d5e1
    OpenSSL version: OpenSSL 1.0.0-fips 29 Mar 2010
    allocator: tcmalloc
    modules: none
    build environment:
        distmod: amazon
        distarch: x86_64
        target_arch: x86_64
【Flex使用】CSSで丸囲み文字

##概要
[前に作った丸囲み文字](http://qiita.com/noixip/items/dffc788a66d9608e787d)は、font-family変えたり文字の幅によって正円じゃなくなったりしていたので改良しました。
今回はCSS3の`display:flex-inline`を使って円の中に文字を中央設置します。
インラインにしたくない場合は`display:flex`にしてください。
今度は１文字じゃなくてもOKだし、2段にもできるようになった！
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/173132/ce4a6fa3-b792-6fc3-ba92-566b82423d0f.png)
こんな感じです。

##DEMO(CODEPEN)
[demo](https://codepen.io/noixip/pen/mWYeBa)

##ソース
###HTML

```html
<div class="maru size_normal pink1">
    <div class="letter3">ABC</div>
</div>
```
divの入れ子にします。

###CSS

```css
/* 円の基本形 */
.maru {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  border-radius: 50%;
  flex-flow: column; 
  vertical-align: top;
}
/* 円の大きさ */
.size_normal{
  width: 120px;
  height: 120px;
}
/* 文字の大きさ */
.letter3 {
  font-size: 3em;
  line-height: 1.5em;
}
/* 円と文字の色 */
.pink1 {
  color: pink;
  border: 4px solid pink;
}
```
maruクラスで円の形を生成します。
`border-radius`を指定しなければ正方形になります。
`justify-content`で上下の位置を、`align-items`で左右の位置を指定します。
`flex-flow`に`column`を指定することで子要素が縦並びになります。２段以上にしない場合は指定不要です。
インラインにしたくない場合は`display:flex`を指定します。
円を複数並べる場合は`vertical-align`を`top`か`bottom`に指定したほうがいいでしょう。
【Salesforce初心者】SOSLで複数のSObjectからの結果を取り出す書き方

SOSLで複数のオブジェクトに検索をかけた結果を取り出す時に使える書き方をTrailheadから学んだ。
Trailheadの例文だが、コメントを入れただけ。メモメモ。

```
List<List<SObject>> searchlist = //WingoとSFDCの検索結果リストを格納するリストを宣言
    [FIND 'Wingo OR SFDC' IN ALL FIELDS 
    RETURNING Account (Name), Contact(FirstName, LastName, Department)];

//searchlistの中の1個目のリスト(Accountで返されたリスト）をAccount[]でキャスト
Account[] searchAccounts = (Account[])searchlist[0];


//searchlistの中の2個目のリスト(Contactで返されたリスト）をContact[]でキャスト
Contact[] searchContacts = (Contact[])searchlist[1];

System.debug('Found the following accounts.');
for (Account a : searchAccounts) {
    System.debug(a.Name);
}

System.debug('Found the following contacts.');
    for (Contact c : searchContacts){
        System.debug(c.LastName + ' '+ c.FirstName);
    }

```
Cognos Framework Managerの接続先が本番環境・開発環境など複数ある場合

##概要
Cognos BI & AnalyticsのFramework ManagerをWindows端末に入れてモデル開発を行うと思いますが、時々、開発環境にも本番環境にも一つの端末のFramework Managerから接続したいがどうすれば良いか、という質問を受ける事があります。
本当に軽いTipsなのですが、過去に何度か聞かれたので投稿します。

##内容
Framework Managerからの接続先の指定は、Cognos Configurationで行います。
下図の「Gateway URI」と「Dispatcher URI for external applications」のところですね。
本番・開発の接続先を変更する際に、ここをいちいち書き換えている環境を時々お見かけしますが、URI書き換えてCognos Configurationを保存すると、その都度暗号化キーの再生成が発生し、そしてこのキーの再生成が失敗してはまってしまう事多いですよね。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/23bc5f35-1ce7-e01a-5d61-3bbf393440e4.png)

解決策は、単に1台の端末に複数のFramework Managerを入れておけば良い、というただそれだけなのですが、結構やられていない方も多いので。
Framework Managerの導入時に、C:\Program Files(x86)\IBM\Cognosの下に(Cognos Analyticsの場合は)「model」というフォルダ名で導入されますが、そこのフォルダ名を変えて何度もインストールする事が可能です。
その結果、下図のように、全てのプログラムを開いた時に、Framework Managerが複数表示されます。
Cognos ConfigurationもそれぞれのFramework Manager毎に存在しますので、先にお話したURI指定は、1度指定しておけば変更は不要なので、暗号化キーの再生成に悩まされる事はなくなります。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3bcffa7f-4bd2-a645-841b-a6679840f010.png)

生活の知恵的な小ネタでしたが、覚えておいて頂ければどこかで役にたつかと。
Python3+xlrd+mecabを利用してExcelデータを分かち書きで出力

# 目的

Excelファイルにテキストデータが存在し、そのテキストデータを分かち書きしたものをタブ区切り形式(tsvファイル)で出力する。

## 動作確認環境
Mac OS 10.12.3
Python 3.6.0
mecab of 0.996
mecab-python3==0.7

# 準備

## mecabと辞書をインストール

Homebrewでのインストール(Mac)
　[Python3からMeCabを使う](http://qiita.com/taroc/items/b9afd914432da08dafc8)
もしくは、自分でmakeしてインストール
　[Python3で形態素解析エンジンMeCabを使えるようにする(2016年3月版)](http://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd)

## pythonバインディングのインストール
　[Python3でmecabを使う](http://qiita.com/piruty_joy/items/5ae2c2ba660796112207)

## xlrdのインストール
　[【Python】pandasでExcelを読み込む](http://qiita.com/stokes/items/75aca6ce142ff9778003)

# ソースコード

```py3:mecab.py
#!/usr/bin/env python

import xlrd
import MeCab
import sys

args = sys.argv

# Excelファイルを開く
book = xlrd.open_workbook(args[1])
sh = book.sheet_by_index(0)

# header
print("\t".join(('text','price')))

# 分かち書きオプションでパース
t = MeCab.Tagger ("-Owakati")

# 各行について
for rx in range(1, sh.nrows):

    # 必要なカラムを拾う
    text = sh.cell_value(rowx=rx, colx=1)
    price = sh.cell_value(rowx=rx, colx=2)

    # 改行削除
    text = text.replace('\n','').replace('\r','')

    try:
        # パースと改行削除
        m = t.parse(text).replace('\n','')

        # 出力
        print( "\t".join((m, price)) )

    except RuntimeError as e:
        print("RuntimeError:" + e)
```
# 実行

``` $ ./mecab.py [excelファイル名] ```
macOS Sierra移行後のキーリマップ設定

Xcode 8.3がmacOS Sierra以降の対応となったため、今更ながらSierraへのアップグレードを行った。
すぐにアップグレードを行わなかった理由として大きかったのがKarabiner Elementsで設定可能な項目が少ないという点だった。

Macに接続したWindowsキーボードに対して旧Karabinerで設定できていた以下の設定をKarabiner Elementsでも再現したく試行錯誤。

1. Command, Option, Control の位置調整
2. E/J (バッククオート) -> 英/日のトグル切り替え
3. Home/End -> 行の先頭/末尾に移動

## Command, Option, Control の位置調整
これは問題なく設定を行えた。

## E/J (バッククオート) -> 英/日のトグル切り替え
Karabiner Elementsで設定可能な項目が「英数キー」「かなキー」しかないためトグル切り替えが出来なかった。
その為、以下の方法で実現。
1. grave_accent_and_tilde > F13 にリマップ
2. Macの「システム環境設定」>「キーボード」>「ショートカット」>「入力ソース」>「前の入力ソースを選択」に F13 を設定

## Home/End -> 行の先頭/末尾に移動
これもKarabiner Elementsでは実現できなかったため、以下のアプリを導入。
⌘英かな
https://ei-kana.appspot.com/

- (fn)Home -> (fn)⌘←
- (fn)End -> (fn)⌘→

---

最終的に以下の状態となった。![170406-0003.png](https://qiita-image-store.s3.amazonaws.com/0/43078/c269549f-1d34-b80c-7259-578555b1df70.png)
![170406-0002.png](https://qiita-image-store.s3.amazonaws.com/0/43078/bcc3b578-40e8-881b-a720-1dd48ba55964.png)
![170406-0001.png](https://qiita-image-store.s3.amazonaws.com/0/43078/e3e0d57c-540d-86b1-4cbc-5850b6afd31e.png)
Class-based Viewへのリクエスト時の共通処理

Djangoで[Class-based view](https://docs.djangoproject.com/en/1.11/ref/class-based-views/base/)を実装した際に、getだろうとpostだろうと共通で処理したくなったので実装してみた。

## 実装
getだろうとpostだろうとリクエストがあった場合は[dispatch()](https://docs.djangoproject.com/en/1.11/ref/class-based-views/base/#django.views.generic.base.View.dispatch)を経由して呼び出される。
なのでdispatch()を[method_decorator](https://docs.djangoproject.com/en/1.11/ref/utils/#django.utils.decorators.method_decorator)を使ってラップした。

```py3
def some_decorator(dispatch):
    def wrapper(request, *args, **kwargs):
        # ... なんらか共通処理

        return dispatch(request, *args, **kwargs)

    return wrapper


@method_decorator(some_decorator, name='dispatch')
class MyView(View):

    def get(self, request, *args, **kwargs):
        return HttpResponse('Hello, World!')
```

## middlewareじゃだめなの？
単純なアクセスログみたいなのであれば[middleware](https://docs.djangoproject.com/ja/1.11/topics/http/middleware/)を実装するで良いと思う。
ただ、全てのmiddlewareが実行されたあとであることを保証したかったり、特定のViewだけログ残したかったりしたかったので。

## Viewを拡張してdispatchをオーバーライドしちゃだめなの？
本当に特定の（単一の）Viewだけで実装したいのであればオーバーライドでも良いと思う。
ただ、Viewを実装する場合、実際にはTemplateViewだったりListViewだったりDetailViewだったり、django-rest-frameworkのModelViewSetだったりするわけで、それらで共通処理を実装したかったので。

## バージョン
Django==1.11
[ssh] 複数の踏み台を経由したssh接続

すでに同情報は多数

- [多段 ssh でどこまでも](http://qiita.com/masahixixi/items/ab6caa688289dfdc92e4)
- [サーバーを中継し更に中継する 多段SSH](http://qiita.com/i47_rozary/items/01261bb7219ee0fbe0be)
- [最強のSSH踏み台設定](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8)

ありますが、自分のためにメモ投稿です。

# 環境

自マシンから、踏み台1、踏み台2を経由して目的地へ接続します。


![ssh-fumidai.png](https://qiita-image-store.s3.amazonaws.com/0/59475/a4e2a1a3-c36d-9b6f-cacc-a3e9845bb7bd.png)


# sshの設定

## 踏み台1へ接続するための設定

`HostName`と`User`は、必要に応じて設定します（以下同様です）。

```text:~/.ssh/config
Host 踏み台1
  HostName （踏み台1実ホスト名)
  User     （踏み台1ユーザ名)
```

## 踏み台2へ接続するための設定

ProxyCommandを使用して踏み台1経由にします。

```text:~/.ssh/config
Host 踏み台2
  HostName     （踏み台2実ホスト名)
  User         （踏み台2ユーザ名)
  ProxyCommand ssh -W %h:%p 踏み台1
```

## 目的地へ接続するための設定

ProxyCommandを使用して踏み台2経由にします。

```text:~/.ssh/config
Host 目的地
  HostName     （目的地実ホスト名)
  User         （目的地ユーザ名)
  ProxyCommand ssh -W %h:%p 踏み台2
```

# 使い方

以下のようにするだけで目的地につながります。

```
ssh 目的地
```

# 解説

`-W`オプションを付けると、自マシンの標準入力と標準出力が、指定されたホスト/ポートへ転送されるようになります。
Pythonインストール

# 事前準備

## 目的
deep learningを学習する環境を用意する

参考書籍：O'REILY　ゼロから作るDeepLearning

## 要件
* Python3系
* NumPy
* Matplotlib

* 既にPython2.7が入っている為、別途3系をインストールする

### Homebrewをインストール

https://brew.sh/index_ja.htmlのサイトでインストールコマンドが記載されているのでターミナルから実行する

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### pyenvをインストール

* 下記コマンドでインストールする

```
brew install pyenv
```

* インストール後バージョンを確認

```
pyenv -version
```

### 環境変数を通す

* .bash_profileのファイルが存在するか確認しない場合は作成する

```
cd ~
ls -al
```

* 上記コマンドで「.bash_profile」が存在しなければ下記コマンドより作成する

```
touch .bash_profile
```

* 作成後にファイルを編集する

```
vi ~.bash_profile
```

```
export PATH="$HOME/.pyenv/shims:$PATH"
```

* 編集後、変更内容を反映する

```
source ~/.bash_profile
```

* パスが通っているか確認

```
which python
```

## Pythonをインストール

* インストール可能なバージョンを確認

```
pyenv install -l
```

* インストールする

```
pyenv install 3.5.0
```

* ※失敗した場合はXcodeコマンドライン用ツールをインストールする

```
xcode-select --install
```

* 仕様するpythonのバージョンを指定する

```
pyenv global 3.5.0
```

* pythonのバージョンを確認

```
python -v
```

* Numpyをインストール

```
pip install numpy
```

* Matplottlibをインストール

```
pip install matplotlib
```
CentOS7.3でsudoを使用せずに、dockerコマンドを実行する。

# CentOS7.3でsudoを使用せずに、dockerコマンドを実行する。

CentOS7でdockerの勉強を始めたが、dockerコマンドを実行するたびにsudoするのが面倒くなったので、少し調べてみたのでメモる。

環境は CentOS 7.3.1611、docker-1.12.6-11

何もしないと、dockerをインストールした状態でdockerコマンドの実行で以下のようにエラーで弾かれる。

```
$ docker ps
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

調べると、[設定](http://qiita.com/tubone/items/9c1b3d807197b7162fd9)によって回避が出来ることが判明。

* 作業ユーザにグループを追加

 ```
 $ sudo gpasswd -a USER dockerroot
 ユーザ USER をグループ dockerroot に追加
 ```

* サービスとの通信ファイルのパーミションを変更

```
$ ls -ld /var/run/docker*
drwx------. 4 root root 80  4月  6 13:34 /var/run/docker
-rw-r--r--. 1 root root  4  4月  6 13:34 /var/run/docker.pid
srw-rw----. 1 root root  0  4月  6 13:34 /var/run/docker.sock
$ sudo chgrp dockerroot /var/run/docker.sock
$ ls -ld /var/run/docker*
drwx------. 4 root root       80  4月  6 13:34 /var/run/docker
-rw-r--r--. 1 root root        4  4月  6 13:34 /var/run/docker.pid
srw-rw----. 1 root dockerroot  0  4月  6 13:34 /var/run/docker.sock
$ exec su - USER
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

ただ、/var/run/docker.sock は起動のたびに作成されるファイル(ソケット)だからどこかでグループを定義してやる必要がある。

[ここ](http://exlair.hatenablog.com/entry/install-docker-on-centos7) に書いてあった。

/etc/sysconfig/docker で、ファイル(ソケット)のグループオーナを指定する。

```text:/etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
# OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -G dockerroot'
```

システムを再起動。グループは正しく設定されていることを確認

```
$ ll -d /var/run/docker*
drwx------. 4 root root       80  4月  6 14:10 /var/run/docker
-rw-r--r--. 1 root root        4  4月  6 14:10 /var/run/docker.pid
srw-rw----. 1 root dockerroot  0  4月  6 14:10 /var/run/docker.sock
```
インターフェースデザインの実践教室 I部 リサーチ

## 1章　ユーザーリサーチ

多くの人は自分自身が欲しいものを分かっていない
だからフォーカスグループの意見を鵜呑みにはできない

## 2章　ジョブシャドウイングとコンテキストインタビュー

- ジョブシャドウイング　利用予定者の仕事を観察し、気づきを得る
- コンテキストインタビュー　利用予定者に質問をして、改善の余地をつかむ
- リモートのシャドウイング　キャプチャを取る

コンテキストインタビューの限界 ...　相手に解決策は期待できない

> とにかく最初は観察とインタビュー

## 3章　ペルソナ
ユーザーリサーチが済んでいる前提で定義する架空の人物

### 危険性
- 柔軟すぎるがゆえに今の意見に都合のいいペルソナを作り出してしまうことがある
- 時間がかかる。リサーチを人物像に落とすのは簡単ではない

### 作成方法
- コンテキストインタビューをする
- 目標を定義する
- 職業・年齢・性別・スキルなどを加える
- 細かなバックグラウンドを加える
- 顔と名前を付ける

### 活用
- 製品のデザインを考えるとき、具体的なペルソナを使って考える

ユーザーリサーチの代わりにはならない
ペルソナを作ったとしても現実の人間相手のテストは必要

> 凝ってペルソナ作っても、システム設計に入ってあれもこれもと要望聞いているうちに忘れがち

## 4章　活動中心のデザイン

製品によっては、人間中心よりも活動(何をしたいのか)を中心にした方がよいことがある

> 具体的なペルソナのためではなく、行う活動のためにデザインして、そこに人間の方が合わせる、という考え方もあるのか

## 5章　付随資料の作成
初期段階から資料類に取り組む＝逆行方式

### マニュアル
- 優れたものを作るには早くから取り組む
- 製品の説明を書くことで、デザインの細部を深く考えることになる
- 説明しにくいものは、きっと使いにくい

### ブログ・スクリーンキャスト・プレスリリース
- これらも、問題点を見つけるのに役立つ

> 後手後手が常。
> パワポに構成を書いて使い捨てになるよりマニュアル化の意識を持ってみたら何か変わるかも？

## 6章 文章のユーザビリティ
- 文章は読まれない。できれば避ける
- 簡潔にざっと見てわかるように
- 文字は大きめに
- 図解も有効

> 書かなきゃ書かないで問い合わせが来るし・・・

## 7章 インターフェースデザインと階層

メニュー、ボタン、その他UIなど、いたるところに階層はある
階層をうまく使えばわかりやすくすることができる

## 8章　カードソート

訪問者がどのように目的のページを見つけるのか、を確認する
その結果を参考に階層構造を設計する

やり方：
- カードに並べる対象のものをひとつひとつ書き出す 20-80枚
- 参加者に分類してもらって、それぞれの山に名前を付ける　理想はのべ15回
- 結果を集計し、設計に利用する

単にクリックが少なければよいわけでもない
選択肢が多い時は、画面内で局所的な階層構造＝グループ化を考えることもある

> 要件定義までにやらないと機能が増えそう・・

## 9章 メンタルモデル

ユーザーのメンタルモデル ... ユーザーが思い描く動作
と
UI・製品の実体(インプリメンテーション)
は一致するのが理想。だが現実的ではない

UIを簡素化してインプリメンテーションを隠ぺいしてあげる必要性もある
(メンタルモデルに近づけてあげる)
そうしたが故にインプリメンテーションに誤解を生むこともある

メンタルモデルに基づくデザイン
- シャドーイング・コンテキストインタビューでメンタルモデルを探る(2章)
- カードソートで組み合わせ・階層の認識を探る(8章)
- 紙のプロトタイプでユーザビリティテスト(11章) じゃあなんでこの章あとなんだろう・・・

有効なメンタルモデルを思い描けるUIデザイン・7つの指針
- 単純さ
- 身近なものからの類推
- 記憶不要
- 柔軟性
- フィードバック
- 安全
- アフォーダンス(シグニファイア・ディテール)

> UI設計に限らず何かに基づく、相手の常識・刷り込みに合わせるっていうのは大事だと思う
Networkxを使ったグラフ内パス検索

# 個人的なメモです：
## グラフの作成
いちいち書くのはめんどくさいので、隣接リストの形式で作成

```
import networkx as nx
g = nx.read_adjlist('/path/to/adjacencylist', create_using=nx.DiGraph())
print('nodes: ' + ', '.join(g.nodes()))
```

``` print ```文を追加したことによってgraph内のnodeを全て表示します。

## 最短経路の検索
もし重みなどを追加した場合は別に必要ですが、ここでは単純のために重みは考えません。

```
nx.shortest_path(g, source="hoge", target="fuga")
```
返り値はnodeが入ったリストとなります

## ノードに1回だけ訪れたの経路の列挙
```
for path in nx.all_simple_paths(g, source='hoge", target="fuga"):
    print(path)
```
遠回りの経路も表示してくれます。
インターフェースデザインの実践教室 勉強会


## 書籍
[インタフェースデザインの実践教室 ―優れたユーザビリティを実現するアイデアとテクニック(オライリー)](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%95%99%E5%AE%A4-%E2%80%95%E5%84%AA%E3%82%8C%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Lukas-Mathis/dp/4873116082 "amazon")

## [I部 リサーチ](http://qiita.com/r-n/items/97b70966bc8eb0434d09)
作るものの方向性を決めていく

## [II部 デザイン(1)](http://qiita.com/r-n/items/1611968a3144816bb723)
細部を決めていく(1)

## [II部 デザイン(2)](http://qiita.com/r-n/items/906911a8fc4dd6dd59ea)
細部を決めていく(2)

## [III部 インプリメンテーション](http://qiita.com/r-n/items/24a98dfdc81f5eaf7d85)
テストとフィードバック
.vimrcが再読込できない

vimでsource ~/.vimrc　やると以下のエラーが起こったためメモ



```bash
-bash:  Note: Skip initialization for vim-tiny or vim-small.
if 0 | endif

if &compatible
  set nocompatible               : command not found
-bash: endif: command not found
-bash:  Required:
set runtimepath+=~/.vim/bundle/neobundle.vim/

: No such file or directory
-bash: /Users/Username/.vimrc: line 12: syntax error near unexpected token `('
-bash: /Users/Username/.vimrc: line 12: `call neobundle#begin(expand('~/.vim/bundle'))'
```

NeoBundleの設定をいれているがsourceできない。。いろいろ調べ尽くしたけど
そもそもvimはvimが起動した時に再読込するのでsourceは必要ないらしい

# 参考
http://stackoverflow.com/questions/8457599/warning-message-when-sourcing-vimrc
http://tabunmuri.hatenablog.com/entry/2014/09/12/zsh%E3%81%A7source_.vimrc%E3%81%97%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84%E3%82%89%E3%81%97%E3%81%84%E3%80%82
establish_connectionで複数DBと接続しているRailsアプリでのトランザクションの使い方

establish_connectionを使い複数DBに接続しているRailsアプリで、transactionをかけようとしてハマった。
establish_connectionを使って複数DBを扱っている時は、対象となるオブジェクトのデータがあるDBとコネクションのあるクラス（インスタンス）をレシーバに指定しないとロールバックが効かない。


問題が起きたケースでは以下のように、基本的にmodelのデータを別DBと連携するように設定している。

```
class Examples < ApplicationRecord
  #このクラスを継承したモデルでは別DBのデータを使う。
  self.abstract_class = true
  establish_connection "example_db_2_#{Rails.env}".to_sym
end

class Example1 < Example
 ...
end

class Example2 < Example
 ...
end

```

---

この書き方ではロールバックが効かないので注意が必要。

```
ActiveRecord::Base.transaction do
  example1 = Example1.new
  example1.save!
  ...
  example2.save!
end
```

↓こちらが正解

```
Example.transaction do
  example1 = Example1.new
  example1.save!
  ...
  example2.save!
end
```

上に書いたとおり、レシーバーにトランザクション対象のオブジェクトのDBとコネクションのあるクラス（インスタンス）を指定する必要がある。

ちなみに、そのモデルクラスがどのDBとコネクションがあるのかは以下のメソッドで確認出来る。

```
クラス名.connection
```



## 参考

http://markdaggett.com/blog/2011/12/01/transactions-in-rails/
Unityを複数バージョンインストールする

2017年3月31日（金）にUnity5.6がリリースされましたね。

http://japan.unity3d.com/blog/press/20170403

しかし、以前のバージョンをPCに残しながら、新しいバージョンをインストールしたいという時があると思います。そういう時にどうすればいいかメモしておきます。

# やり方
以前のバージョンのフォルダの名前を「Unity」以外に変えてから、イントールする。

# 手順

まず、`/Application/Unity`というフォルダの名前を変えましょう。例えば`/Application/Unity5.5.1`のようにしましょう。
もし「Unity」という名前のフォルダが残っている場合、そのフォルダは上書きされてしまいます。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/e1e3baa4-cb25-7090-41b2-1cb52cc5886e.png)

それから、[ダウンロードページ](https://store.unity.com/ja/download?ref=personal)から新しいバージョンのUnityをダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/4ff99552-9b68-25f9-26fa-aa79da3cc6b3.png)

# 【オマケ】過去のバージョンをインスールしたい時

https://unity3d.com/jp/get-unity/download

↑のページから過去バージョンのUnityを選択する。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/24161a52-16cc-52d9-44e6-e53e7340431e.png)



# 参考

Mac編と書きましたが、Windowsでも同じ方法で大丈夫だと思います。

[【Unity】複数バージョンのUnityをインストールする](http://macky2016.hateblo.jp/entry/2016/10/02/220000)
Excel 2013 > bug > 日時の補間処理で抜けが発生する

```txt:動作環境
Excel 2013 on Windows 8.1 pro (64bit)
```

以下で日付の補間が失敗するようだ。

1. セルA2に「2017/4/5 11:50:00」と入力
2. セルA3に「2017/4/5 11:50:01」と入力
3. セルA2とA3を選択後、2017/4/5 15:27:00あたりまで下に延ばす

2017/4/5 15:06:00の行が見つからない。

さらに下に伸ばすと、他の日時でも抜けが発生する。
Laravel5 FuelPHP Windows 構築メモ 3-1 Laravel

#Laravel
vagrantの起動からLaravelプロジェクトのインストール
※vagrantが未起動の場合

```
$ cd
$ cd Homestead
$ vagrant up
```
※vagrant起動後

```
$ vagrant ssh
$ cd Code
$ composer create-project --prefer-dist laravel/laravel Laravel
```
####ブラウザで確認
http://homestead.app/

#プロジェクトの追加
「blog」というプロジェクトを追加する場合

```
$ cd Code
$ composer create-project --prefer-dist laravel/laravel blog
```

[←homesteadの設定を行う](http://qiita.com/sheena_gl/items/bc264cd59e8c591dae2f)
javascript - 勝手に添削 - 任意の文字数にゼロ埋めをする

> [Javascriptでよく使う処理をスニペットにしてみた](http://qiita.com/thelarch/items/5e2a82a77c796788e848#%E6%97%A5%E4%BB%98%E3%81%AE%E6%95%B4%E5%BD%A2)
> 日付の整形
> // 日付時刻文字列のなかで常に2ケタにしておきたい部分はここで処理

昔からよく使われるテクニックです。
考えられる最大の文字数を頭に追加して、右から必要な桁数を切り出します。
実際には、String()に lpad, rpad メソッドを追加するんでしょうけどね。

```js:javascript
/**
 * 日付文字列を整形してYYYY/mm/ddで返す
 * @param {string} dateStr Dateがパースできる文字列 例:IEでDateTime型はパースできない
 * @param {boolean} isDateTime DateTime方式にするか
 * @returns {string} 整形した日時 "2017/01/01 00:00:00"
 */
const convertDateTime = function (dateStr, isDateTime) {
	const now = new Date(dateStr);

	// 日付時刻文字列のなかで常に2ケタにしておきたい部分はここで処理
	// 1~9の数値場合"01"~"09"という文字にする
	let [year, month, day, hour, minute, second] = [
		// 年を取得
		now.getFullYear(),
		// 月を取得 0~11で取得されるので実際の月は+1したものとなる
		('0' + (now.getMonth() + 1)).slice(-2),
		// 日を取得
		('0' + now.getDate()).slice(-2),
		// 時を取得
		('0' + now.getHours()).slice(-2),
		// 分を取得
		('0' + now.getMinutes()).slice(-2),
		// 秒を取得
		('0' + now.getSeconds()).slice(-2),
	];

	let datetime = [year, month, day].join('/');
	if(isDateTime)
		datetime += ' ' + [hour, minute, second].join(':');

	return datetime;
};

// test
[true, false].forEach(function(isDateTime){
	console.log('isDateTime', isDateTime);
	for(var i = 1; i <= 12; i++){
		let dateStr = ['2017', i, i].join('/')
		            + ' '
		            + [i, i, i].join(':');
		console.log('dateStr', dateStr, 'convertDateTime', convertDateTime(dateStr, isDateTime));
	}
});
```

```:実行結果
isDateTime true
dateStr 2017/1/1 1:1:1 convertDateTime 2017/01/01 01:01:01
dateStr 2017/2/2 2:2:2 convertDateTime 2017/02/02 02:02:02
dateStr 2017/3/3 3:3:3 convertDateTime 2017/03/03 03:03:03
dateStr 2017/4/4 4:4:4 convertDateTime 2017/04/04 04:04:04
dateStr 2017/5/5 5:5:5 convertDateTime 2017/05/05 05:05:05
dateStr 2017/6/6 6:6:6 convertDateTime 2017/06/06 06:06:06
dateStr 2017/7/7 7:7:7 convertDateTime 2017/07/07 07:07:07
dateStr 2017/8/8 8:8:8 convertDateTime 2017/08/08 08:08:08
dateStr 2017/9/9 9:9:9 convertDateTime 2017/09/09 09:09:09
dateStr 2017/10/10 10:10:10 convertDateTime 2017/10/10 10:10:10
dateStr 2017/11/11 11:11:11 convertDateTime 2017/11/11 11:11:11
dateStr 2017/12/12 12:12:12 convertDateTime 2017/12/12 12:12:12

isDateTime false
dateStr 2017/1/1 1:1:1 convertDateTime 2017/01/01
dateStr 2017/2/2 2:2:2 convertDateTime 2017/02/02
dateStr 2017/3/3 3:3:3 convertDateTime 2017/03/03
dateStr 2017/4/4 4:4:4 convertDateTime 2017/04/04
dateStr 2017/5/5 5:5:5 convertDateTime 2017/05/05
dateStr 2017/6/6 6:6:6 convertDateTime 2017/06/06
dateStr 2017/7/7 7:7:7 convertDateTime 2017/07/07
dateStr 2017/8/8 8:8:8 convertDateTime 2017/08/08
dateStr 2017/9/9 9:9:9 convertDateTime 2017/09/09
dateStr 2017/10/10 10:10:10 convertDateTime 2017/10/10
dateStr 2017/11/11 11:11:11 convertDateTime 2017/11/11
dateStr 2017/12/12 12:12:12 convertDateTime 2017/12/12
```
Laravel5.6 FuelPHP Windows 構築メモ 2 homesteadのインストール

#Homesteadのインストール
[Homestead](https://github.com/laravel/homestead)

##デスクトップのショートカット「Git Bash」起動
1.Vagrant Boxのインストール
2.Homesteadのインストール
3.プロジェクトフォルダ「Code」を作成
4.sshキーの作成(未作成の場合)

```
$ cd
$ vagrant box add laravel/homestead
↓
3) virtualbox を選択
↓
$ git clone https://github.com/laravel/homestead.git ~/Homestead
↓
$ mkdir code
$ cd ~/Homestead
$ bash init.sh
Homestead initialized!
↓
$ ssh-keygen -t rsa -C "myname@email.com"
デフォルトのまま(.../ssh/id_rsa)
パスワードを入れる
```
##hostsの編集
C:\Windows\System32\drivers\etc\hosts
hostsに追加

```txt:hosts
192.168.10.10    homestead.app
```
#Homesteadの起動
```
$ cd
$ cd Homestead
$ vagrant up
```

####※homestead2.0で以下のエラーが出る場合

```
C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.3/lib/vagrant/util/is_port_open.rb:21:in `initialize': The requested address is not valid in its context. - connect(2) for "0.0.0.0" port 8000 (Errno::EADDRNOTAVAIL)
```
この場合\Homestead\scripts\homestead.rb の90行目を以下に変更する

```
config.vm.network "forwarded_port", guest: guest, host: host, auto_correct: true, host_ip: "127.0.0.1"
```

#Homesteadの設定
プロジェクト(サイト)の追加などを行う場合は以下のファイルをエディタで編集
C:\Users\your_name\\.homestead\Homestead.yaml
####プロジェクトの追加
```txt:Homestead.yaml
sites:
    - map: homestead.app
      to: /home/vagrant/code/Laravel/public
# blogの追加
    - map: blog.app
      to: /home/vagrant/code/blog/public
```
####環境変数の設定例
```txt:Homestead.yaml
# 環境変数の設定(fuelPHPで追加)
variables:
    - key: FUEL_ENV
      value: test
```

####設定を変更したら以下を実行のこと
```
$ cd
$ cd Homestead
$ vagrant reload --provision
```

####ローカル時間の設定変更
```
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ sudo apt install ntpdate
$ sudo ntpdate -v ntp.nict.jp
$ date
```
####hostsの設定例
C:\Windows\System32\drivers\etc\hosts

```txt:hosts
192.168.10.10    homestead.app
#追加
192.168.10.10    blog.app
```
####mysqlの設定例
DBにアクセスする際に
id:root
password:null
等に設定しておくとプロジェクト共有の際にいろいろと便利。

```
$ vagrant ssh
...
$ mysql
mysql > GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '';
mysql > exit
```

[→構築メモ 3-1 Laravelプロジェクトの作成](http://qiita.com/sheena_gl/items/6ae4093519cdc24ac055)
[→構築メモ 3-2 FuelPHPプロジェクトの作成](http://qiita.com/sheena_gl/items/4953d8b8737965a42a2b)
自分のやりたい開発をやるために構成管理サーバ全般をVagrant + Ansibleでコマンド一発で立ち上がるようにしたった！

# このページについて
[ライブラリ管理のススメ（概要）](http://qiita.com/sh-ogawa/items/26bd4edb2eff5787ca75)のほぼ続きです。
主にArtifactoryについて書きます。

# 動機
構成管理サーバって毎回似たようなもの入れるけど、無駄じゃない？
最近Infrastructure as Codeって流行ってるからコード化して楽しよう。

# なぜVagrant + Ansibleにしたか
簡単に使えるため。
Ansibleのエージェントレスというのが特に気に入ってます。

# 扱わないもの
インフラのテスト

# プロダクト
https://github.com/sh-ogawa/config-management

# 動作確認環境
* OS:Windows7 Pro(64bit)、Windows10、Windows Server 2012 R2
* RAM: 4GB
※ゲストは2GB設定

# 構成
色々入れていますが、Artifactoryの部分だけこのページでは扱います。
![構成.png](https://qiita-image-store.s3.amazonaws.com/0/56851/5bec2482-aee9-e2ef-9523-01a9b3bd1c9d.png)


# 使い方
1. 上記のGitHubリポジトリをcloneする or zipダウンロード
2. Vagrantをダウンロードする(1.9.3はprivateなゲストにport forwardするとIPアドレスのチェック(0.0.0.0は許さん)でエラーになるため、それ以外を入れてください(1.9.4で修正されるはず))
3. Oracle Virtual boxをインストールする
4. vagrantにboxを追加する

```lang
vagrant box add centos7.2 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
```

5.git cloneした配下でvagrant up

# ページ
* GitBucket<BR>
http://localhost:48081/gitbucket
* Jenkins<BR>
http://localhost:48080
* Artifactory<BR>
http://localhost:48081/artifactory

# 永続領域
git(gitbucket)、jenkins、Artifactoryの各種データはVagrant上のゲストOS上には置いてません。
データはゲストから見た"/vagrant"配下に置くことで、ホストOS上に配置し、
サーバーの引越しなどはしやすいようにしています。
※Artifactoryだけderby使っているためデータのExportが必要

# Artifactoryについて
## メリット
* 対応リポジトリがとにかく多い
* リポジトリのアクセスをするための設定を作ってくれるので、コピペできる
* どこがセントラルと繋がっていて、どこがローカルオンリーかがわかる
* リポジトリが(Cache含め)持っているArtifactを見せてくれる

## デメリット
* RPMインストールすると、ディレクトリを作りすぎ＆シンボリックリンク当てまくりなため、どこに何があるのかが判りづらい

## Artifactoryに登録してみる
MAVENを使ってデプロイしてみます。
登録するプロダクトは以下です。
https://github.com/sh-ogawa/artifactory-demo-parent
※pom.xmlだけを登録するプロダクト

![1.png](https://qiita-image-store.s3.amazonaws.com/0/56851/8a1a8952-504b-ed2a-6024-14cf253a2536.png)
今は何も登録されていないです。
libs-snapshot-localに登録してみます。

```lang
mvn deploy -e
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/56851/e33e2d27-8232-46b5-6420-a115ec3b81b1.png)
登録されました。
いま登録したartifactを各サブプロダクトのpomに、parentで取り込んであげれば、
いちいちサーバーの設定を入れなくて済んでスマートですね。

# 注意事項
## 別のサーバーに引っ越す場合
Artifactory以外はフォルダのコピペすればOKなのですが、
ArtifactoryのデータだけはExportが必要です。
これをやらないとderbyのチェックサムに引っかかって、データを移せないです。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/56851/86922d88-6374-3b34-0d37-b32c9a5e5c07.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/56851/5ba03ca1-ac26-77e7-1ee6-0ba186d1d087.png)
ZIPファイルが出てくるので、引越し先でインポートしてあげればOK。
※同じ画面にインポートがある
![5.png](https://qiita-image-store.s3.amazonaws.com/0/56851/18d19594-8944-862f-b825-1728b4d03ea1.png)

# 最後に
ローカル環境にリポジトリを持つことを取り扱ってみました。

SIの現場でこういった環境で開発している現場は、まだまだ稀です。
その原因は「無知」な訳ですが、有識者がレッスンしても私の経験では何も変えられなかったです。
それは、環境が自分たちで用意できないことが特に大きいと感じているので、
このプロダクトで以って、色々啓蒙できたらな、と思っています。

こういう開発をしたいけどできていない人、是非このプロダクトを使って提案をしてみてください。

# 2017/4/8追加
プロキシで虐げられるであろう会社内では以下を行ってください。
1. vagrantfileでproxyの設定をできるようにする<BR>
どこでも良いので以下のコマンドを実行
> vagrant plugin install vagrant-proxyconf

2. Vagrantfileの最後のendの前に以下を記述<BR>

> config.proxy.http = "http://ホスト:ポート"<BR>
config.proxy.https    = "http://ホスト:ポート"<BR>
config.proxy.no_proxy = "localhost,127.0.0.1"
【javascript】オブジェクトにプロパティを追加する

オブジェクトにプロパティを追加する方法です。


```js
var user = {
  id: 1,
  name: "name",
};

user.country = "Japan";
user["language"] = "jp";

console.log("user", user);

// user Object {id: 1, name: "name", country: "Japan", language: "jp"}
```

`オブジェクト.プロパティ`に値を入れる、もしくは、`オブジェクト["プロパティ"]`に値を入れることで、オブジェクトにプロパティを追加することができます。
ACMで米国東部(バージニア北部）リージョンを選択する

[S3+CloudFront+ACM(AWS Certificate Manager)でHTTPS静的サイトを作ってみた](http://qiita.com/toshihirock/items/914f408cd565b66fe9f9)

↑この記事を参考にして、s3で作った静的サイトをssl化しようとしてたのですが、
最後のACMで米国東部（バージニア北部）リージョンでsslを発行する方法がわからなくて詰まったのでメモ。

##手順
1.ACM(Amazon Certificate Manager)にログイン。
2.右上からリージョン選択。米国東部（バージニア北部）リージョン選択。
<img width="1310" alt="スクリーンショット 2017-04-06 12.34.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/a49aabea-88c0-0fbe-354c-aa9ff01575d9.png">



※このリージョンでないと、cloudfrontでSSLが使えないです。
https://aws.amazon.com/jp/certificate-manager/faqs/
Ruby で Twitter に画像を投稿＆ダウンロードする

## twitter_api ライブラリのインストール

Twitter API のラッパー・ライブラリ https://rubygems.org/gems/twitter_api をインストール。

```sh
$ gem install twitter_api
```

## サンプルコード

```ruby
require 'twitter_api'
require 'json'
require 'open-uri'

# Twitter API の認証情報をセット
t = TwitterAPI::Client.new({
  :consumer_key => 'YOUR_CONSUMER_KEY',
  :consumer_secret => 'YOUR_CONSUMER_SECRET',
  :token => 'YOUR_ACCESS_TOKEN',
  :token_secret => 'YOUR_ACCESS_SECRET'
})

# PNG画像をアップロードして media_id を取得
image_1 = File.open('sample1.png', 'rb').read
res_1 = t.media_upload({'media' => image_1})
media_id_1 = JSON.parse(res_1.body)['media_id_string']

# JPEG画像をアップロードして media_id を取得
image_2 = File.open('sample2.jpg', 'rb').read
res_2 = t.media_upload({'media' => image_2})
media_id_2 = JSON.parse(res_2.body)['media_id_string']

# media_id を指定して画像付きツイートを投稿
res_3 = t.statuses_update({
  'status' => "hello, こんにちは #{Time.now.to_i}",
  'media_ids' => media_id_1 + ',' + media_id_2 # カンマ区切り
})
status_id = JSON.parse(res_3.body)['id_str']

# ツイート情報を取得して画像をダウンロード
res_4 = t.statuses_show_id({'id' => status_id})
tweet = JSON.parse(res_4.body)
puts tweet['text'] # ツイートのテキストを出力
tweet['extended_entities']['media'].each do |media|
  url = media['media_url']
  puts url # 画像のURLを出力
  name = File.basename(url)
  # 画像をダウンロードして保存
  open(name, 'wb').write(open(url).read)
end
```

## 参考資料
- twitter_api | RubyGems.org | your community gem host https://rubygems.org/gems/twitter_api
- POST media/upload — Twitter Developers https://dev.twitter.com/rest/reference/post/media/upload
- POST statuses/update — Twitter Developers https://dev.twitter.com/rest/reference/post/statuses/update
- GET statuses/show/:id — Twitter Developers https://dev.twitter.com/rest/reference/get/statuses/show/id
Doctrineでカラムごとに文字コードとコレーションを設定する

昔調べた時に見当たらないと思ってたんだけど、よく調べたらあったので書いておく。

> [Doctrine - 21.2.1. @Column](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#column)

テーブルのコレーションは　`collate` なのにカラムのコレーションは `collation` っていう罠が。 MySQL 使ってるとコレーション設定したいケースは割とあると思うのでちゃんと対応しててえらいですね。

```yaml
App\Entity\User:
  type: entity
  table: users
  options:
    charset: utf8mb4
    collate: utf8mb4_general_ci
  fields:
    code:
      type: string
      length: 40
      options:
        charset: utf8mb4
        collation: utf8mb4_bin
```

ちなみに Symfony だと `app/config/config.yml` でテーブルの文字コードとコレーションの一括設定できます。

```yaml
doctrine:
  dbal:
    driver:   pdo_mysql
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"
    user:     "%database_user%"
    password: "%database_password%"
    charset:  utf8mb4
    default_table_options:
      charset: utf8mb4
      collate: utf8mb4_general_ci
```