OmniAICreator/Qiita-1.07M huggingface dataset:
大学の研究室インフラとしてのGitHub Education

## GitHubの導入のきっかけ

研究室にGitHubを導入したら，インフラとしてかなり便利だったので，GitHub Educationはいいぞという紹介です。最初は通常のコードホスティングサービスとしての利用を想定しており，導入にあたって，いくつかの点を考慮しました。

+ 導入コストがそれなりに低いこと
    + ITツールにそれほど親しくないメンバーもいるため
+ 安価または無料であること
    + 月額課金モデルは研究室の予算では申請がむずかしいため
+ プライベートレポジトリが使えること
    + データセットなど，セキュアなものも含むため

そんな中で我々に射した希望の光が「GitHub Education」だったのです。また今回の記事で紹介するのは「GitHub Education for Organization Account」についてです。GitHub Educationは個人アカウント向けのものもありますが，それとの違いも含めて説明します。

## GitHub Education でできること

以下はGitHubに期待していたことのうち，実際に実現したことのいくつかです。

### Gitでコードホスティングできる

当たり前ですがコレが最も大きいです。研究をしていると，ソースコードや論文の下書き，関連ファイルがあちらこちらに分散します。それに対して差分管理ができるだけでも，はじめはかなりありがたかったです。
これは余談ですが，Jupyter Notebookのデータをあげておくと自動でレンダリングしてくれるようになり，研究の成果を残しておく場所としてはかなり有用であるといえます。

### 管理が楽

はじめはGitLabやGitのみのリモートリポジトリを研究室サーバに構築しようと思っていました。しかしセキュアな通信の確保や必要ファイルのインストール，実際の管理はそれほど簡単ではありません。GitHubなら管理の手間はほとんどゼロです。

### プライベートレポジトリが使える

以前のEducationプランではプライベートレポジトリ数が制限されていましたが，[このリリース](https://github.com/blog/2164-introducing-unlimited-private-repositories)でプライベートレポジトリの制限はなくなりました。

![Screen Shot 2016-12-04 at 21.38.32.png](https://qiita-image-store.s3.amazonaws.com/0/59488/c9c121d6-1079-43b2-70a4-bd8a6de67e87.png)


上の画像にあるように，ユーザ数もプライベートレポジトリ数も制限なく，無期限で使い続けられるようです。

### チームで使える

これはどちらかというとGitHub Organizationの機能ですね。個人アカウント向けGitHub Educationでは，プライベートレポジトリは基本的にはじぶん1人のみ閲覧可能なプライベートレポジトリであり，collaboratorをじぶんで設定するなど，あまりチーム開発向きであるとはいえません。
しかしGitHub Organizationではチームを設定できたり，Organization内のレポジトリが自由に見られたりと，研究室というチームでの開発に向いています。

## GitHubを研究室に導入して変わったこと

以下はGitHub導入により，思ってもなかったよかったことです。

### ディスカッションが捗るようになった

導入後には「とりあえずissueたてといて」とか「PRにコメントしといたよ」のような会話が日常的に行われるようになりました。また，各自の論文プロジェクトの進捗が可視化されるので，より積極的にコミュニケーションが行われるようになりました。
ぼくらの研究室は特にコアタイムを設けてはいないので，実際に会わなくても助言をもらえたり，他人の研究に助言をしたり，ということができるようになりました。

### ドキュメントを気軽に参照できるようになった

それまでは研究室のサーバ管理情報，年内にある行事，各種ノウハウやテンプレコードに至るまでが様々なところに散らばっており，参照するのがむずかしい状況でした。しかしGitHubのレポジトリ，wikiなどに情報をまとめておくと，検索機能で簡単に探すことができ，非常に助かりました。
しかしGitHubそれ自体は優秀ですが，wiki機能はそれほど使いやすいという感じもなく，徐々に使われなくなりました。Markdownファイルをそのままあげておくとよさそうです。

## GitHub導入の注意点

上記の文章を読むと万能ツールであるかのように見えますがそうではなく，いくつかの軽微な問題点もあります
。

### 導入コストがやや高い

これはGitHubに限った話ではありませんが，導入コスト，学習コストはやや高いといえます。issue程度であれば問題はないのですが，Git自体の操作方法，Pull Requestなどは開発経験のない学生にはなかなかつらいものです。勉強会を開く，ときどきペアプロするなどの対応が必要であると思えます。

### 万能ツールではない

GitHubは万能ツールではありません。コードホスティングサービスとしてはかなり優秀ですが，コミュニケーションツール，ファイルストレージとして使うとなると，使いにくい部分も多いです。Google DriveやSlackなどと連携しつつ，数あるサービスのうちの1つとして使っていくのがよさそうです。

### まだまだ発展途上のサービス

GitHubは優れたサービスですが，それ自体の開発もまだ続いています。突然課金システムを変えてきたり，新機能の導入，UIの変更など，まだまだ手探りのサービスです。上記2つにも関連することなのですが，そういう点も踏まえつつ使っていくといった姿勢が必要であるといえます。

## GitHub Edicationを研究室に導入しよう

以下に簡単に方法をまとめました。

### GitHub Organizationを作る

まずOrganizationを作り，それに対してEducation Couponの申請をします。研究室のメンバーを招待しておくといいですね。

### Education申請をする

[こちらのページ](https://education.github.com/discount_requests/new) から申請をしましょう。 *What are you looking to get a discount for?* のところで *Organization account* を選択し，あとで先ほど作ったOrganizationを選択します。学生証のアップロードやメールアドレスの入力などがあり，個人アカウントよりやや厳しい感じです。

### 承認されるのを待つ

しばらく(〜2ヶ月くらい)待つと承認され，メールが届きます。数ヶ月待っても来ない場合はGitHubのお問い合わせフォームのような部分に英語で問い合わせると，運営の方からメールが届き，手動で追加したぞということを教えてくれます。どうしても待てない場合は使いましょう。
ESP8266の起動時に文字化けしているメッセージをちゃんと読みたい

この記事は[ESP8266/ESP-wroom-02 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/esp8266) の1日目の記事です。
空いていたので、最初にふさわしいかもしれない（？）起動時に関する記事を書きます。

ESP8266で開発しているとすごく気になることがあります。

それは起動時に文字化けしたメッセージが表示されることです。

![boot1.png](https://qiita-image-store.s3.amazonaws.com/0/104360/d916f2bf-e089-7319-b577-564495772863.png)

これが何なのか知りたい。

#答え

起動時のシリアルポートの速度は 74880bps なんだそうです。

その速度は変更できなさそうなので、ソースやシリアルモニタの速度設定を74880bpsに統一すれば読むことができます。

```cpp:hello.ino
void setup(void){
  //Serial.begin(115200);
  Serial.begin(74880);  // 起動時に合わせて74880bpsにする
  WiFi.begin(ssid, password);

  // ...
```

![boot2.png](https://qiita-image-store.s3.amazonaws.com/0/104360/30c4d32a-738c-ac96-cc49-644f1191242b.png)

やったー！ 読めた！！

#で？

読めたからと言って、何が出力されているか意味不明なので、文字化けしてても変わりないんじゃないかとも思ったりしますが、それでも豆腐よりはアルファベットの方が気持ちイイかなと思います。

なお、書き込み速度（ツール → Upload Speed: で設定する値）とは別の値でも構いません。
PDBの中で複数行のスクリプトを実行する

Pythonのデバッガpdbで複数行のスクリプトを実行しようとすると、そのままだとエラーになる。

```python
(Pdb) if root_task in task_sets['completed']:
*** SyntaxError: unexpected EOF while parsing
```

こういう時は `interact` コマンドを使うとpythonのインタプリタシェルが立ち上がる。

```python
(Pdb) interact
*interactive*
>>> if root_task in task_sets['completed']:
...     completed_tasks = task_sets['completed']
...     for key in task_sets.keys()
```

pdbの状態での変数の名前は値を引き継いでいるので、そのまま通常のPythonスクリプトが書ける。


https://docs.python.org/3/library/pdb.html

> interact
Start an interactive interpreter (using the code module) whose global namespace contains all the (global and local) names found in the current scope.
New in version 3.2.
改行

# 改行コード
Unicodeにはプレーンテキスト的に改行として扱うべきコードポイントがいくつもあります。

- U+000D `\r`: Carriage return
- U+000A `\n`: Line feed
- U+000B `\v`: Vertical tab
- U+000C `\f`: Form feed
- U+0085: Next line
- U+2028: Line separator
- U+2029: Paragraph separator

なるほど、この7つのどれかがきたら改行すればいいんだな、と考えると残念ながら間違いです。
なんと、`\r`と`\n`の間では改行されません。
つまり以下の文字列

1. `\r`
2. a`\n`
3. b`\0`

からaを削除すると

1. `\r\n`
2. b`\0`

になります。

おや。改行コードを削除していないのに行数が減りました（楽しいですね）。

毎回全ての文字列を再描画するのなら問題はないのですが、何十万文字ものテキストを扱おうと思うとほんの少しだけ頭を動しておく必要があります。
TATEditorではこの対処のために少しだけ面倒な改行カウント機構が入ってます。
また、TATEditorではここで紹介した改行のコードポイントを等しく改行として扱っています。
（デフォルトではCRとLFとCR+LFは改行記号で判別できるようになってますが）

タイプライターを模擬していた頃はCarriage return (CR) は行末から行頭に、Line feed (LF) は次の行に移動するものでした。そのため、本来は2つで一つの改行動作でした。
なので私はCR+LF式のWindowsの改行が好きです。

おしまい。

# 折り返し
あ、もう少しだけ続けます。

テキストを表示する領域が狭い場合、

- 一部を表示する
- スクロールする
- 次の行に折り返す

という選択肢があります。
改行コードがデータに由来する論理的な改行なのに対し、折り返しは表示領域という制約に由来するものです。
そのため、描画条件を決めるまではどこで改行されるかはわかりません。
また、改行される場所によって文字の送り幅も変わりうるので事前に計算することもままなりません。
（もっと言えば、描画領域の大きさが変わると折り返し位置は変わり続けます。つまり描画領域が変わると、テキスト全体を再描画するまで様々な情報が取得できません。例えば、描画領域全体がどれくらいの大きさになるか、指定された文字列がどこにあるかといったことはテキスト全体を再描画しなければ概算しかわかりません）

さらに、こうした折り返しの処理では論理改行に比べ格段に多くのことに注意しなければなりません。
例えば

- 句読点の直前では改行されない
- parenthesisの内側では改行されない
- 英語などではハイフネーションすることも
    - 単語の**特定の箇所**でハイフンを置いて折り返すこと

一方、日本語ではそのような制約はありませんが、長音記号やもしかすると小書き文字の前では改行しないかもしれません。さらに、句読点が本来の描画領域の外に描画されるぶら下がりという処理があることもあります。

大変ですね。
でも大抵のケースについてはUnicodeがカバーしてくれます。

# おわりに
今日は改行って面倒だなという話をしました。
TATEditorではICUというライブラリを通してUnicodeの改行可能な場所を調べ、それとぶら下がり処理を組み合わせて折り返しを実装してます。
（ハイフネーションはいずれ実装したいですね）
Yum リポジトリのエイリアスを作成した

毎回 Yum の追加リポジトリのURLをコピペするのが面倒だったので、エイリアスURLを作成した。
CentOS 64bit (x86_64) を前提としている。

例えば CentOS 7 に remi リポジトリをインストールするには以下のようなコマンドで追加できる。

```bash
yum install http://p80.jp/remi-release-7.rpm
```

## 対応リポジトリ
現在対応しているリポジトリは以下の通り。
### EPEL
`yum install epel-release` でインストールできない場合に利用する。

```
yum install http://p80.jp/epel-release-6.rpm
yum install http://p80.jp/epel-release-5.rpm
```

### Remi's repository
```bash
yum install http://p80.jp/remi-release-7.rpm
yum install http://p80.jp/remi-release-6.rpm
yum install http://p80.jp/remi-release-5.rpm
```

### Nginx repository
```bash
yum install http://p80.jp/nginx-release-7.rpm
yum install http://p80.jp/nginx-release-6.rpm
yum install http://p80.jp/nginx-release-5.rpm
```

### MySQL repository
```bash
yum install http://p80.jp/mysql-release-7.rpm
yum install http://p80.jp/mysql-release-6.rpm
yum install http://p80.jp/mysql-release-5.rpm
```

### IUS
```bash
yum install http://p80.jp/ius-release-7.rpm
yum install http://p80.jp/ius-release-6.rpm
yum install http://p80.jp/ius-release-5.rpm
```

### IUS
```bash
yum install http://p80.jp/atomic-release-7.rpm
yum install http://p80.jp/atomic-release-6.rpm
yum install http://p80.jp/atomic-release-5.rpm
```

### Webtatic
```bash
yum install http://p80.jp/webtatic-release-7.rpm
yum install http://p80.jp/webtatic-release-6.rpm
yum install http://p80.jp/webtatic-release-5.rpm
```

### Lux
```bash
yum install http://p80.jp/lux-release-7.rpm
yum install http://p80.jp/lux-release-6.rpm
yum install http://p80.jp/lux-release-5.rpm
```

最終的にリクエストされる URL は [yumリポジトリ一追加リスト 完全版](http://qiita.com/bezeklik/items/9766003c19f9664602fe) を参照。
lexima.vimで閉じ括弧を補完する

職場で先輩からvimで閉じ括弧を補完するプラグインを教わったので入れてみた。

### プラグインの特徴
```{```を入力したら```}```を挿入、```"```を入力したらもう１個```"```を挿入といった具合に、
括弧やクォーテーションの対応した文字を補完してくれる。

プログラミングで使う一通りの括弧に対応している模様。
デフォルトで対応している文字の一覧は[こちら](https://github.com/cohama/lexima.vim#default-rules)から。

他にも

* [括弧の中で改行した時にインデントを深くする機能](https://github.com/cohama/lexima.vim#new-line-rules)
* [rubyのendなど特定の構造の終了を意味する単語を補完する機能](https://github.com/cohama/lexima.vim#endwise-rules)

といった機能も存在する。カスタマイズ可能。

### 実際の様子
閉じ括弧や閉じのダブルクォーテーションは一切キー入力してません。
![lexima.vimを使っている様子](https://qiita-image-store.s3.amazonaws.com/0/116289/1ff38e4c-5494-804f-8004-cd4a97965372.gif)

### 使ってみた所感
##### **スラスラかける**
片方だけ入力すればもう片方が勝手に入るのでキー入力が減った。
プログラミングしていると括弧やクォーテーションは頻繁に入力するが、そこが楽になるので恩恵が大きい。
また開き括弧入力後、括弧の中にカーソルがくるので、スラスラと中身の入力に移行できる。

##### **閉じ括弧の入力忘れで困らない**
必ずペアで入力してくれるから、括弧やクォーテーションの数が合わない事によるシンタックスエラーが減った。
あと ```if (!(isset($hoge) && piyo(fuga($hoge)))) ``` みたいに括弧が集中するようなコードを書いてても、
「閉じ括弧足りているっけ？」って考えることがなくなって凄い楽！

##### **導入時のつまづきが少ない**
開き括弧を入力直後に閉じ括弧を入力しても、```{}}```といった具合に閉じ括弧が二重に入力されず、
ちゃんと```{}```で入力してくれる。
この手の自動補完するプラグインは、導入直後に導入前のノリでキー入力して意図しない入力になることが多いが、そういうことが起こらない。使い手に優しい！

そんなわけで、lexima.vim入れてよかった！✧＼٩( 'ω' )و ／✧

### プラグインの入れ方
.vimrcに以下を追加

```
NeoBundle 'cohama/lexima.vim'
```

その後、NeoBundleInstallで入れる。

### lexima.vim
https://github.com/cohama/lexima.vim
SurfaceViewを使用するために３

#はじめに
SurfaceViewを使用して部分的な描画行ったときに
おかしな描画結果となりました。
そのときの失敗についてまとめました。

#事例
SurfaceViewで部分的な再描画を行うとき
どの範囲を再描画するかをRectに設定してlockCanvasに渡します。
lockCanvasで渡したRectの設定値はlockCanvasの中で、
値が書き換えられているようです。

[誤]

```java:MainSurfaceView.java
Rect rect = new Rect(0, 0, 100, 100);

Canvas canvas = this.surfaceView.getHolder.lockCanvas(rect);

if (null != canvas) {

	// lockCanvas内でrectの値が変更されているので期待した結果とならない
	canvas.drawBitmap(bitmap, src, rect, null);

	this.surfaceView.getHolder.unlockCanvas(canvas);
}
```

[正]

```java:MainSurfaceView.java
Rect rect = new Rect(0, 0, 100, 100);

Canvas canvas = this.surfaceView.getHolder.lockCanvas(rect);

if (null != canvas) {

	// 再描画したい範囲の指定はlockCanvasで使用したRectではなく別のRectで行う
	Rect dst = new Rect(0, 0, 100, 100);

	canvas.drawBitmap(bitmap, src, dst, null);

	this.surfaceView.getHolder.unlockCanvas(canvas);
}
```

#まとめ
参照渡しで引数をやり取りしているのでどこかのメソッドで使用された
オブジェクトを無条件で使用するときは注意が必要でした。
Rails 5.1系からは redirect_to :backがきえまっせ

`redirect_to :back`をなんとなく使ってみたら

DEPRECATION WARNING: `redirect_to :back` is deprecated and will be removed from Rails 5.1. Please use `redirect_back(fallback_location: fallback_location)` where `fallback_location` represents the location to use if the request has no HTTP referer information.

..とおこられてしまった.
つまり
<b>request.refererがnilなとき,fallback_locationにリダイレクトしてくれる</b>

ってことなんでしょうが、なんでそもそもredirect_to :backが非推奨なのか少し調べてみました.


#HTTP_REFERERがないときActionController::RedirectBackErrorが発生

```ruby
class PostsController < ApplicationController
  def publish
    post = Post.find params[:id]
    post.publish!

    redirect_to :back
  end
end
```

こういう実装にしたとき,`HTTP_REFERER`がないことでエラーになってしまうことを防ぐため
これまでは

```ruby
class PostsController < ApplicationController
  rescue_from ActionController::RedirectBackError, with: :redirect_to_default

  def publish
    post = Post.find params[:id]
    post.publish!
    redirect_to :back
  end

  private

  def redirect_to_default
    redirect_to root_path
  end
end
```

としていたと.

# Rails 5.1系からは

`redirect_to :back`
が
`redirect_back(fallback_location: root_path)`におきかわりrescueしなくてもよいみたいです


```ruby
class PostsController < ApplicationController
  def publish
    post = Post.find params[:id]
    post.publish!

    redirect_back(fallback_location: root_path)
  end
end
```
としておけばエラーが出る前にroot_pathにとんでくれるようになりました.
Rustによる数値計算: 線形代数編

Rust Advent Calendar 12/4の記事です 

以前に[Rustで1次元のNewton法を実装する](http://qiita.com/termoshtt/items/ecbd228b0e54ad7fec7d)記事を書きましたが、実際の科学技術計算では多次元のベクトルの扱いが必要になります。
PythonではNumPyで提供されている[numpy.ndarray](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html)が中心的な役割を果たしますが、
今回はRustによる多次元配列の実装である[rust-ndarray](https://github.com/bluss/rust-ndarray)を使用します。
しかしこのcrateにはベクトルの演算と行列xベクトルの演算までしか実装されておらずQR分解や特異値分解、
あるいは高速Fourier変換のような演算は実装されていません。
このままだと自分でアルゴリズムを書くのに支障があるため、基本的な部分を実装してきました。

rust-ndarray
-------------
rust-ndarrayはnumpyのものと同じで一つの連続したメモリとstridesと呼ばれる各インデックス毎のとび幅からなっています。
この辺は[numpyのstrideのドキュメント](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.strides.html#numpy.ndarray.strides)を参照してください。
このシンプルな構成が好みでrust-ndarrayを選択しました。
簡単にrust-ndarrayの使い方を確認しておきましょう。

```rust
extern crate ndarray;
use ndarray::prelude::*;

let a = Array::<f64, _>::zeros(3)
// [0.0, 0.0, 0.0]
let b = Array::range(0., 9., 1.).into_shape((3, 3)).unwrap();
// [[0, 1, 2]
//  [3, 4, 5]
//  [6, 7, 8]]
```

乱数を生成するときは`ndarray-rand`を使います：

```rust
extern crate rand;
extern crate ndarray_rand;
use rand::distributions::*;
use ndarray_rand::RandomExt;

let r_dist = Range::new(0., 1.);
let a = Array::<f64, _>::random((10, 10), r_dist); // 10x10の乱数でうまった行列
```

ndarray-linalg
---------------
線形代数演算をrust-ndarray上に実装したものが[ndarray-linalg](https://github.com/termoshtt/ndarray-linalg)です。
OpenBLAS(旧:GotoBLAS)をrustにバインドした[lapack](https://github.com/stainless-steel/lapack) crateをrust-ndarrayに用にバインドしたものです。
類似のプロジェクトとして[linxal](https://github.com/masonium/linxal)があります。
ndarray-linalgではQR分解・SVD等の演算をtraitとして実装してあります。
現状まだ実数の行列にしか対応していません(v0.2で対応の予定)。以下の演算が実装されています：

- trait Matrix
  - singular-value decomposition
  - LU decomposition
  - QR decomposition
  - 作用素norm (L1/L^inf)
  - Frobeiuns norm
- trait SquareMatrix
  - inverse of matrix
  - trace of matrix
  - [WIP] eigenvalue
- trait TriangularMatrix
  - solve linear problem with upper triangular matrix
  - solve linear problem with lower triangular matrix
- trait HermiteMatrix
  - eigenvalue analysis
  - symmetric square root
  - Cholesky factorization

すべてtraitで実装されているため、rust-ndarrayのinstanceに対して勝手に演算が定義されています：

```rust
extern crate ndarray;
extern crate ndarray_linalg;

use ndarray::prelude::*;
use ndarray_linalg::prelude::*;

fn main() {
    let a = arr2(&[[3.0, 1.0, 1.0], [1.0, 3.0, 1.0], [1.0, 1.0, 3.0]]);
    let (e, vecs) = a.clone().eigh().unwrap(); // 固有値計算(エルミート)
    println!("eigenvalues = \n{:?}", e);
    println!("V = \n{:?}", vecs);
    let av = a.dot(&vecs);
    println!("AV = \n{:?}", av);
}
```

各種演算は失敗するかもしれないので`Result<_, LinalgError>`をほとんどの演算が返します。

（おまけ）crateを公開する
---------------

```
cargo package
cargo publish
```

によって自作のcrateを[crates.io](https://crates.io/)に公開できます(事前にcrates.ioにログインしておく必要があります)。
ここに公開させるとしばらくしてから[docs.rs](https://docs.rs/)に反映されます。
ここではドキュメントが`cargo doc`で生成され、自動的にホストしてくれます。

最後に
-------
現在までに他にもrust-ndarrayの拡張として以下のcrateを作ってるのでissue/PR募集中です。

- ndarray-odeint : ODEのソルバ集(の予定)
- ndarray-fftw : FFTWのバインド
- ndarray-numtest : テスト用コードの集積
Delphi について勉強会で LT してきた

僕も Delphi は長らく使ってきました。
でも Turbo Delphi (Delphi 2006) で 2010 頃までかな。
それ以降は VB.NET です。最近は JavaScript だったり。
でも Delphi 10.1 Starter が無償になったので、久々に触りました。
Delphi いいですね！
知人の勉強会で「帰ってきた Delphi」という LT してきました。
参加者の半数以上が Delphi を知っていて反応よかったです。
LT の資料を公開します。
そうだよねって楽しんで見て貰えたら幸いです。

[帰ってきた Delphi]
(http://www.slideshare.net/TakumiYamada5/delphi-69798446)

<iframe src="//www.slideshare.net/slideshow/embed_code/key/pbcBxMxUIzoa8j" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
【メモ】 Rails5のnewでActiveRecordなし(-O)のオプションをつけるとどう変わるか

下記2つのコマンドを叩いてみた時に生成されるファイルの差分です。

```shell-session
rails new app_name
rails new app_name -O
```

ちなみに、Railsのバージョンはv5.0.0.1です


```diff:.gitignore
-# Ignore the default SQLite database.
-/db/*.sqlite3
-/db/*.sqlite3-journal
```

```diff:Gemfile
-# Use sqlite3 as the database for Active Record
-gem 'sqlite3'
```

```diff:app/models/application_record.rb
# なくなります
```

```diff:config/application.rb
-require "active_record/railtie"
+# require "active_record/railtie"
```

```diff:config/database.yml
# なくなります
```

この辺までは、ぱっと見た感じで分かる。
これ以降が自分でDBへの依存をなくそうとすると多分思いつかなくてエラーが出るやつな気がする。

```diff:config/environments/development.rb
-  # Raise an error on page load if there are pending migrations.
-  config.active_record.migration_error = :page_load
```

```diff:config/environments/production.rb
-  # Do not dump schema after migrations.
-  config.active_record.dump_schema_after_migration = false
```

```diff:config/initializers/new_framework_defaults.rb
-# Require `belongs_to` associations by default. Previous versions had false.
-Rails.application.config.active_record.belongs_to_required_by_default = true
```

```diff:config/initializers/wrap_parameters.rb
-# To enable root element in JSON for ActiveRecord objects.
-# ActiveSupport.on_load(:active_record) do
-#   self.include_root_in_json = true
-# end
```
DOMイベント伝播を止める（stopPropagation）

こんにちは。
d3.js で svg の DOMイベント伝播を止める動作例（下記）を見つけたので、動かしてみました。緑色の円の方は circle だけがマウスクリックイベントを受け取り、svg には届かないことが右側に表示されます。

* "[stopPropagation](http://bl.ocks.org/jasondavies/3186840)" (Jason Davies’s Block)

<img width="384" alt="stopPropagation.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54617/0df46e80-61fe-1276-6e1a-edc2de9db8d8.jpeg">

```d3_stopPropagation.html
<!DOCTYPE html>
<style>circle {stroke: #000;}</style>
<body bgcolor="#eee">
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var svg = d3.select("body").append("svg")
    .style("float", "left")
    .attr("width", 480)
    .attr("height", 480)
    .on("click", log("click svg"));

svg.append("circle")
    .style("fill", "lightgreen")
    .attr("cx", 200)
    .attr("cy", 80)
    .attr("r", 60)
    .on("click", function() { d3.event.stopPropagation(); })
    .on("click.foo", log("click circle"))  // namespacing for events

svg.append("circle")
    .style("fill", "lightblue")
    .attr("cx", 200)
    .attr("cy", 240)
    .attr("r", 60)
    .on("click.foo", log("click circle"))

var divlog = d3.select("body").append("div")
    .style("float", "left")

function log(message) {
  return function() {
    divlog.append("p")
        .text(message)
        .style("background", "#ff0")
      .transition()
        .duration(2500)
        .style("opacity", 1e-6)
        .remove();
  };
}
</script>
```
引き継いだソースコードを大幅改変する

引継いだソースコードを大幅に改編した。そのときの経験を述べてリファクタリングと改訂の参考にしたい。

従来記事
- [引き継いだソースコードを改変する前に](http://qiita.com/nonbiri15/items/47e25c2d5fb46f3495df)
- [引き継いだソースコードをメンテナンスしやすくする。](http://qiita.com/nonbiri15/items/3417facd391e01c3e365)

の続きです。

###**大幅改変の必要性を吟味する**
 大幅改変は趣味でするもんじゃない。改変をすると新たなバグを埋め込む危険があるし、下手なやりかたをすると壊してしまうだけになる危険がある。小規模に少しずつリファクタリングをしていって、次第にきれいな構造のプログラムにしていくことの方がはるかにいい。
　不幸にして、用いているアルゴリズム上の問題で性能がでないことが判明したので、やむなく大幅改変せざるをえなくなった。

###**名前空間 namespaceを導入する。**
 ソースコードを改変する際にはその変更の範囲がどこまで及ぶのかを見極めることが必須です。名前空間を導入することで、それがどの範囲の機能なのかが明確になっていきます。
　また、名前空間を導入したことと対応して、ソースコードのディレクトリ構造も見直します。置き換える予定コードと置き換え後のコードは別のディレクトリに入れておきます。

###**開示するAPIを明確にする**
 その引継いだコードがもっているの中で、改変対象のコードのうち開示するAPIを明確にしていきます。そうすると、そのAPIを利用する上位層についてはコードの改変の影響が及ばなくなります。

###**別アルゴリズムバージョンの名前空間と開示するAPIを明確にする**
 別アルゴリズムに置き換えるからといって、使い方は同じであるべきです。ですから、名前空間だけちがって、APIは同じメソッド名、関数名を持つように考えていきます。このようにすることで、別アルゴリズムバージョンの公開すべきAPIが明確になります。そうすれば、それより下層の実装については別アルゴリズムの方で好きに考えて実装すればよくなります。


###**アルゴリズム自体は自然な実装にして、上位層の事情を持ち込まない**
 新規に開発する別アルゴリズムは、極力自然な定義・実装をしよう。その全体のプログラム固有の事情
などをアルゴリズム自体の中に持ち込まないように心がけよう。自然な実装であれば保守するのも、テストするのも簡単になります。ソフトウェア部品としてみたときにも再利用性を損ないにくくなります。

###**公開するAPIとアルゴリズムの自然な実装の間には層を設ける**
 アルゴリズムの自然な実装と、全体のプログラムの固有の事情とを結びつける層(layer）が必要になります。このような層の存在によって、アルゴリズム自体の記述している層を、固有な事情によって汚染させることなく、記述することが可能になります。公開するAPIを絞り込んであることで、下位の詳細な実装に直接不必要にアクセスことを防止します。
　

###**互換ライブラリを作り上げる**
 このようにして作り上げた互換ライブラリをテストします。そうして完成度を上げていきます。

###**元々のアルゴリズムと入れ替える**
 既に関数のAPIをそろえて開発してあるので、利用する関数、クラスの名前空間を入れ替える程度で、元々のアルゴリズムと入れ替えることができます。
　　その時点の改変が少ないものであるので、大幅入れ替えがうまくいかない場合には、引き戻すことが可能です。


###**完成度を高める**
 旧来のアルゴリズムを新しいアルゴリズムに書き換えたときには、まだ試しきれていないことがあるものです。十分な結合試験をして問題をつぶしていきます。そうして、実用になる水準にしていきます。



これが、引継いだソースコードを大幅改変したときの私の経験です。このような経験が皆さんにも役立つことを期待します。



追記：
　ソースコードのモジュールの依存性を調べるには、Doxygenでdotを使ってincludeファイルの依存性を調べていきます。この\#include  "some.h" などは本当に必要なのかと思ったら、その行をコメントしてビルドできるかをで確かめています。不要なincludeを見つけるもっと気の利いた方法があればと思っています。



大幅改変する前に：
　チームで共同開発しているコードは、自分の所有物ではありません。チームメンバーと十分に意見交換しておきます。変更がいろんなところに影響を及ぼしそうな改変は、それが妥当な内容であっても、実施するタイミングがあります。

 

追記：
　大幅改変をするときには、その前の版の限界を十分にだれにでも分かるように記録を残しておきましょう。　その経過が分からない人にとっては、「前のバージョンで十分だったんじゃない」などというということになりやすくなります。


追記：
言語によっては不要なimport があるとbuild できないとか、
言語と開発環境によっては、不要なimport が色違いで表示されるとかある。
C++でも可能なようだ。良い開発環境を使おう。
たいがいの場合、良い開発環境を使うことは、開発効率の向上・コードの品質の向上につながって元をとることができる。
https://pleiades.io/help/clion/unused-include-directive.html
npm lsでのエラー


mysqlパッケージを追加したところ、npm lsでエラーが出た。

```
$ npm ls
npm ERR! extraneous: mysql@2.12.0 /vagrant/app/node_modules/mysql
```

## 対応方法

package.jsonファイルに記述を追加。

```package.json
"devDependencies": {
    "mysql":"2.12.0"
  }
```


## 参考

[npm list でのエラー](http://tamagonoheitai.blog105.fc2.com/blog-entry-489.html)
RxJavaとRxJava 2を混在させる時に書くもの

2016/12/4現在、RxBindingはRxJava 2未対応です。
それでもRxJava 2化したい場合、RxJavaとRxJava 2を混在せることになります。

混在させるとBuild APK時に以下のエラーが出ます。

> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties

以下をモジュール個別のbuild.gradleに追加すると、エラーが出なくなります。

```java:build.gradle
packagingOptions {
    exclude 'META-INF/rxjava.properties'
}
```

参考元
2.x_ Duplicated file rxjava.properties · Issue #4445 · ReactiveX_RxJava
https://github.com/ReactiveX/RxJava/issues/4445
Vue.jsでMarkdownをパースするためのvue-markdownの紹介と絵文字サジェストを作った話

## はじめに

Vue.jsでMarkdownエディタを作ろうと思って探していたところ、vue-markdownという便利なコンポーネントがあったのでそれの紹介と、それ使う際絵文字のサジェストがあったらうれしいなと思い作った話です。

## vue-markdown

vue-markdownはmarkdown-itというMarkdownパーサをラップして、Vue.jsで使いやすいようにコンポーネントにした簡単なライブラリです。ソースの中身を眺めてみるとmarkdown-itをコンポーネントにしているだけで、余計なことをほとんどしていないことがわかります。

[vue-markdown](https://github.com/miaolz123/vue-markdown)

[markdown-it](https://github.com/markdown-it/markdown-it)

使い方も簡単で以下のようにpropsのsourceにMarkdownで書いた文字列を入れるだけで簡単にMarkdownエディターが作れます。

```html
<div id="app">
  <h1>Vue Markdown Editor</h1>
  <div class="editor-main">
    <div class="main">
      <textarea class="editor" v-model="source"></textarea>
      <div class="preview">
        <vue-markdown :source="source"></vue-markdown>
      </div>
    </div>
  </div>
</div>
```

```js
import VueMarkdown from 'vue-markdown'
export default {
  name: 'app',
  data () {
    return {
      source: ""
    }
  },
  components: {
    VueMarkdown
  }
}
```

![vue-mark-down.gif](https://qiita-image-store.s3.amazonaws.com/0/11510/c0b424e1-d5b8-8ad2-6988-1017508b6999.gif)

## 絵文字サジェストを作った話

これだけだと作っただけの工夫のないエディタになってしまうので、何か味付けをと思い考えたのですが。絵文字がサジェストされると便利で良いんじゃないかと思い絵文字サジェストの機能を作ってみました。

サジェストの機能を作るのはかなり大変で、今回はちょっと日和って一番最後に入力している単語を対象にしています。

絵文字入力の前はスペースが空くのでスペースで単語を区切って一番最後の入力している単語が `:` であればサジェストを表示するという簡単なロジックです。

```html
<div>
    <span>{{ preConvertEmoji }}</span>
    <ul>
      <li v-for="key in suggest_filter()">
        {{ key }} : {{ emojiList[key] }}
      </li>
    </ul>
    <textarea class="editor" v-on:keyup="enter"></textarea>
</div>
```

```js
//絵文字の一覧jsonを読み込む。
//絵文字一覧のJSONはmarkdown-it-emojiから拝借
//https://github.com/markdown-it/markdown-it-emoji
import emojiOrigin from '../data/light.json'

export default {
  name: 'suggest',
  data () {
    return {
      emojiList: emojiOrigin,
      preConvertEmoji: ""
    }
  },
  methods: {
    suggest_filter: function () {
      const emoji = this.preConvertEmoji.replace(/:/g, '')

      if (emoji == ""){
        return []
      }

      //読み込んだemojiOriginから前方一致で候補を5つ出す
      return Object.keys(emojiOrigin).filter(function (key) {
        return key.indexOf(emoji) == 0
      }).slice(0, 5)
    },
    enter: function(data){
      const words = data.target.value.split(/\s/)
      const lastWord = words.pop()
      //最後に入力している単語がコロンからはじまっていれば絵文字入力と見なして入力中の文字を保持する
      if(lastWord.indexOf(':') == 0){
        this.preConvertEmoji = lastWord
      } else {
        this.preConvertEmoji = ""
      }
      // 親コンポーネントに入力を渡すために$emitを使っている
      this.$emit('enter', data.target.value)
    }
  }
}
```

動きとしてはこんな感じになります。

![vue-mark-down_2.gif](https://qiita-image-store.s3.amazonaws.com/0/11510/b1d1ffd9-ba70-0ea1-56fb-f54618a02802.gif)

ソースコードは以下にあります。
https://github.com/nasum/vue-markdown-editor

サジェストを出すだけでこの中から選択とかは出来ませんが、入力の助けにはなると思います。今後うまく改修してこの中から選択して入力することや、入力しているカーソルの部分への表示、最後の単語だけでなくどの位置でもサジェストが出るようにしたいところです。

## まとめ

Vue.jsでMarkdownエディタを作るのに便利なvue-markdownの紹介をしました。絵文字サジェストはちょっとショボかったものの、自分が欲しいものに少し近づけたのでこれから発展させていきたいところです。

明日（12/05）の担当は@akifoさんです。
VPSしか触ったことがない人がPaaS試す時に知っておきたいこと

要はOSをフルコントロールできる環境でオンプレミスサーバーアプリしか動かしたことがない人が、PaaS的なサービスを始めて使う時に概念レベルでどこでつまづいたか、を記録しておきたいと思って投稿した感じです。正しい情報からは程遠いかもしれませんが自分と似た境遇の人の助けにちょっとでもなれば嬉しいです。

# PaaSとは"コンテナ"の上で一個アプリ動かしていいよってこと
VPSは(多分仮装の)OSを作らせてもらえる、PaaSは"コンテナ"を作らせてもらえる。"コンテナ"とは、サーバー上に複数個作れる仮装ファイルシステムみたいなもの、らしい。これを実現するDockerというド定番の実装があって、それを使っているPaaSサービスがある。[wikipediaのDockerの記事](https://ja.wikipedia.org/wiki/Docker)を見てざっくり雰囲気だけ把握。

# "コンテナ"に対してどういう指示を出せるのか、について、Cloud Foundryという共通のAPIがある
VPSでは"OSのrootを通じて出来ることはできる"みたいな認識があって、その認識の下で、どの会社のVPSもリモートログインさせてもらった後は同じ操作でやりたいことができた。これはある種のAPIだと自分は思っている。

一方PaaSは各社それぞれ何をさせてもらえるのか、という点が曖昧だったが、調べるとどうやらCloud Foundryというオープンソースの普及したルール+実装があって、しかもこれを主要OSのコマンドラインから操作できるCloud Foundry Interfaceという実装があるとのことなので、"PaaSはcfのCLIから操作する"という認識でいればよいらしい。これはこちらのSlideShare:[Cloud Foundryで学ぶ、PaaSのしくみ講座](http://www.slideshare.net/jacopen/paas-for-beginners)がわかりやすかった。

# で、実際に試すには
自分の場合はIBMさんのBluemixでトライさせていただいたので、その手順をメモレベルで書いておく。

- いろいろ調べてもやっぱりよく分からないのでまずは意を決してアカウントを作る。
- チュートリアルをやってみる。自分の場合はNode.jsのアプリを動かす予定だったので[こちらにあったチュートリアル](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-fundamentals-create-and-deploy-a-node-app-to-the-cloud/)に挑戦する。

    - 途中でこちらの[cf CLI](https://github.com/cloudfoundry/cli/releases)をインストールさせていただく。
    - cf loginというコマンドでサーバーにログインするとき、このチュートリアル本文では現在選べる3つのサーバーのうちの1つが決め打ちで書かれているので、[自分がアカウント作成時に選んだサーバーを指定すべし](http://stackoverflow.com/questions/34371408/bluemix-cf-reports-no-orgs-found)。
    - cf pushした後にアクセスするURLも同じように3つのサーバーの識別があるようで、自分の場合は http://<皆さんのアプリの名前>.au-syd.mybluemix.net/ とするのが正解だった。

チュートリアルはとりあえずできたので、次はデータベースとかファイルを使う場合にどうするのか知りたい。

# その他思ったこと
PaaSで動かそうとすると、巷でよく使われるライブラリ等の使用を強制される部分もあるようだが、意図せずオレオレ変なルールになっていたりする開発方針を矯正できるのでむしろ良いのかもと思う。
SQLアンチパターン：EAV(エンティティ・アトリビュート・バリュー)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 可変属性をサポートする

# アンチパターン

- 汎用的な属性テーブルを使用する
 - 属性を取得するにはどうするか
 - データ整合性をどう保つか

## 用いてもいいパターン

- 簡単には見つからない

# 解決策

- 非リレーショナルなデータが欲しいのであれば、非リレーショナルな技術を使うべきである

## シングルテーブル継承（STI：Single Table Inheritance）

- 1つのテーブルにサブタイプを全部入れてしまう
- Active Record のような単一テーブルに対するデータベースアクセスパターンを使うときに有効

## 具象テーブル継承

UNION

## クラステーブル継承（CTI）

- 基底テーブルを用意し、サブテーブルには必要な拡張をする属性だけを用意する

## 半構造化データ

- LOB列を追加。jsonやxml を利用する
- LOB列は、SQLではアクセスできない（絞り込みとかできない）

# まとめ

メタデータは、メタデータのために用いましょう。

# 感想

- やっている箇所ありそう...
- STIは、Railsであれば...
- マーティンファウラーの名前がたくさん出てくる
- Postgresql にjson型があるけれど、どうなんだろう？

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
UWPのイメージアセットのイメージファイルは最大204,800バイト

####約48種類
UWPでは、正方形とほぼ正方形、それに2.1対1の横長長方形のアイコン画像を約48種類登録する必要がある。基本的には最大サイズである1240×1240ピクセルと、2480×1200ピクセルの画像を用意し、それを『UWP Tile Generator』などを使ってリサイズすればよい、というのが基本方針となる。
ただし、すこしでもデザインを気にしたことがあるひとならば、アイコンのサイズによって微妙な調整をしたほうがよいことは容易に想像できるのであって、じっさいそうなのではないかと思う。
縮小エンジンのできが悪いと、小さくしたときにノイズがでたりつぶれてしまったりしてしまうためである。もし時間をかける余裕があるのなら、できるだけ高性能の画像編集エディタを使って複数の解像度を用意することが望ましい。
48種類というのはその手間を越えていると感じさせる物量であって、どれをどうしたらよいか、という手順をまだ確立できていない。

####とりあえず手で作った7種類を登録してみた
さてそんなわけで、とりあえず手で作った7種類を登録してみたのだが、620×300ピクセルの画像を作るのに、1ピクセル間違えて621×300ピクセルにするだけで、解像度が違うと怒られる始末。これではいつになったら完成するかわからない…。
なので、もうえいやで、最大サイズである1240×1240ピクセルと、2480×1200ピクセルの画像を用意し、『UWP Tile Generator』で一括生成してしまおうと思った矢先。
まず、手作業で621×300ピクセルを620×300ピクセルに修正したところ、別の課題に直面した。なんと…。

####イメージファイルの最大サイズ204,800バイト
エラーはこんな感じ。
「現在のイメージはイメージファイルの最大サイズである204,800バイトを超えています。現在のイメージ(スプラッシュ スクリーン(スケール 200)のサイズは978,894バイトです。」
なのだそうだ。
えっ。グラデーションのある画像をpngで保存しただけなんですけど…。グラデーション不可ですか…? pngで圧縮したらどうですか? ひゃ～。などという状況である。
どう考えても980KBを200KBにできるような圧縮技術はおいそれとはないのではないか、という気がしてならない。jpgの圧縮率って、40%くらいじゃなかったかしらん。
そもそもスクリーンにjpgファイルを使うことはできるのか?
う～む。
スタイリッシュなFizzBuzz(Java8)

QiitaのJava8を紹介する記事で、やたらスタイリッシュになったFizzBuzzのコードがあったので、メモとして転記する(※若干加工したけど)。
参考元の記事は、以下。
http://qiita.com/oohira/items/9c13f92815266cc5112c

```java
public class FizzBuzz {
    public static void main(String[] args) {
      IntStream.rangeClosed(1, 100).mapToObj(n ->
                            (n % 15 == 0) ? "FizzBuzz" :
                            (n % 3 == 0) ? "Fizz"  :
                            (n % 5 == 0) ? "Buzz" :
                            String.valueOf(n))
      .collect(Collectors.toList()).forEach(System.out::println);
    }
}
```

StreamAPIのコードを最近見たり書いたりするようになったけど、適切なインデントがあまり定まっていない気がする。
Raspberry Pi の選定と購入

4日目にしてようやく Raspberry Pi の記事となる。

## 主な小型軽量ボードコンピューター

主な小型軽量ボードコンピューターとして次の4つがある。[^microcomputer]

[^microcomputer]: http://blog.iot.nifty.com/index.php/2015/12/14/arduino-raspberry-pi-intel-edison-mbed/

* Arduino
* Raspberry Pi
* Intel Edison
* mbed

ここでは時短のために情報量と流通量の多さで **Raspberry Pi** を選択することにする。

## Raspberry Pi の選定と価格調査
Amazon, 楽天, Yahoo!ショッピングで簡単に検索したが、Amazon が一番安いようである。

### Amazon
[マザーボード の 売れ筋ランキング](http://amzn.to/2fHbtFx) は以下の通り。

* 1位 [Raspberry Pi3 Model B ボード＆ケースセット (Element14版, Clear)-Physical Computing Lab](http://amzn.to/2fTOBRy) 5,580円
* 3位 [kksmart Raspberry Pi 3 Model B ラズベリーパイ 3 モデル B コンプリートスターターキット 16GB (class 10)](http://amzn.to/2fHhIsU) 8,980円
* 6位 [Raspberry Pi 3 本体＋5V/2.5A USB電源アダプター＋ケース＋スイッチ付きケーブル＋ヒートシンク ５点セット Raspberry Pi 3 Model B](http://amzn.to/2fTUwWO) 5,799円
* 8位 [Raspberry Pi 3 MODEL B](http://amzn.to/2gXE7Cs) 4,750円
* 11位 [Raspberry Pi3 Model B 本体 (Element14)](http://amzn.to/2gXBzUP) 4,700円
* 13位 [Raspberry Pi Raspberry Pi3 ModelB](http://amzn.to/2g9OXB5) 5,080円
* 15位 [kksmart Raspberry pi 3 model b ラズベリーパイ電子工作入門 7インチ1024×600 LCDパネルキット](http://amzn.to/2gXEEEl) 14,999円
* 19位 [Raspberry Pi 3 Model B made in Japan 【2016年11月10日発売】 (日本製本体)](http://amzn.to/2fTWiHD) 5,580円

## Raspberry Pi の選定
### 本体
Raspberry Pi には3つのバージョンが存在しているようだが、Raspberry Pi 3 が最新版のようなのでそれを選択する。
Raspberry Pi 2 が高騰しているようだが、なにか理由があるのだろうか。

* [Raspberry Pi Model B+](http://amzn.to/2gUOOCL) 4,400円
* [Raspberry Pi 2 Model B](http://amzn.to/2gBUJPh) 7,058円
* [Raspberry Pi 3 Model B](http://amzn.to/2gBRx67) 4,979円 

![](https://images-na.ssl-images-amazon.com/images/I/913XYU1VtjL._SL300_.jpg)

### ケース
今回は乳児向けに使用する想定のため、ケースはさすがに必要だろう。ヒートシンクも別に必要なようだが、ケースとセットになって販売されているようだ。

### 電源
電源には 2.5A 程度の Micro USB (Micro-B) が必要のようである。1A でもギリギリ使えるようだが、今回センサーを多く使用することが想定されるため、ある程度余裕は必要だろう。

iPad 用のアダプターを利用している人がいたので、取り急ぎそれを利用することにする。

![](https://images-na.ssl-images-amazon.com/images/I/41My0-0gF5L._SL200_.jpg)

### SD カード
クリスマス前のせいか Trancend の SD カードが高騰しているので I-O DATA の SD カード [EX-MSDC10/16G](http://amzn.to/2g78vJ0) を選択した。

![](https://images-na.ssl-images-amazon.com/images/I/813I-F0wnKL._SL300_.jpg)

### ディスプレイ
HDMI ケーブルで接続できるっぽいので、自宅のテレビに接続することにする。

## Raspberry Pi 3 の購入
悩むのが面倒なので売れ筋ランキング1位の [Raspberry Pi3 Model B ボード＆ケースセット (Element14版, Clear)-Physical Computing Lab](http://amzn.to/2fTOBRy) 5,580円 を購入することに決定した。いまポチった。
![](https://images-na.ssl-images-amazon.com/images/I/71Drxo1BtUL._SL300_.jpg)



## 参考文献
デバッグに役立つSwiftの標準出力関数3種

記事の内容はこちらを参照してください。
https://mishimay.github.io/b6606147c304feaa23e7/
<!--

Swiftには標準出力関数がいくつか用意されているのでその違いについてまとめます。

# `print`
  - 一般的な標準出力関数 
  - 値をカンマ区切りで渡せる [^5]
    - e.g. `print(1.0, 2.0, 3.0, 4.0, 5.0)`
  - カンマ区切りで渡した値を出力するときの区切り文字を指定できる [^5]
    - e.g. `print(1.0, 2.0, 3.0, 4.0, 5.0, separator: " ... ")`
  - 終端文字を指定できる [^5]
    - デフォルト値は改行文字 `/n`
    - 最後に改行したくないときは空文字 `""` を指定する
      - e.g. `print(1.0, terminator: "")`

# `debugPrint`
  - `print` より詳しい情報を出力するとされる [^2] が、printと変わらない場合が多い
  - Xcodeの **リリース用ビルドでも出力される** ので注意 [^3] 
  - `print` と同様、カンマ区切りで値を渡したり区切り文字や終端文字を指定できる [^2]

# `dump`
  - Mirrorという、クラス・構造体・列挙型の情報をあらわす構造を出力 [^1] [^4] 
  - `print` や `debugPrint` よりも詳細な情報が出力される

# 出力例
## Range
```swift
let range = 1...5

print(range)
// 1...5

debugPrint(range)
// CountableClosedRange(range)

dump(range)
// ▿ CountableClosedRange(range)
//   - lowerBound: 1
//   - upperBound: 5
```

## Array & Dictionary
```swift
let array: [Any] = [1, 2, ["a": 3, "b": 4]]

print(array)
// ["b": 2, "a": 1]

debugPrint(array)
// ["b": 2, "a": 1]

dump(array)
// ▿ 2 key/value pairs
//   ▿ (2 elements)
//     - .0: "b"
//     - .1: 2
//   ▿ (2 elements)
//     - .0: "a"
//     - .1: 1
```

## UIView
```swift
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

print(view)
// <UIView: 0x7f815d4055f0; frame = (0 0; 100 100); layer = <CALayer: 0x60800003b220>>

debugPrint(view)
// <UIView: 0x7f815d4055f0; frame = (0 0; 100 100); layer = <CALayer: 0x60800003b220>>

dump(view)
// - <UIView: 0x7f815d4055f0; frame = (0 0; 100 100); layer = <CALayer: 0x60800003b220>> #0
//   - super: UIResponder
//     - super: NSObject
```

# 雑感
普段良く使うのは `print` だと思いますが、状況によっては `debugPrint` や `dump` を試してみるのも良いと思います。

とにかく詳しい情報を見たいときは `dump` を使ってみるのが良さそうです。


# 環境
```
$ swift --version
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9
```

***

[^1]: [Shaps さんのツイート: "ProTip: Why debug with \`print\` when you can \`dump\`? \`dump\` uses Mirror for introspection\. \#swift \#iosdev \#protip \#xcode https://t\.co/jAdCX3AJc6"](https://twitter.com/shaps/status/785786934375448576?lang=ja)
[^2]: [debugPrint\(\_:separator:terminator:\) \- Swift Standard Library \| Apple Developer Documentation](https://developer.apple.com/reference/swift/1539920-debugprint)
[^3]: [Swift Log \- Devil or Why print is dangerous – iOS App Development – Medium](https://medium.com/ios-os-x-development/swift-log-devil-or-why-println-is-dangerous-46390453353d#.kjgeunffm)
[^4]: [\[Swift\] リフレクションを利用してEnumのcase名を文字列として利用する方法 \| iOS Programming \[CAPH TECH\]](http://ios.caph.jp/articles/using-case-as-string-by-reflection/)
[^5]: [print\(\_:separator:terminator:\) \- Swift Standard Library \| Apple Developer Documentation](https://developer.apple.com/reference/swift/1541053-print)


-->
動的計画法の学習(from:Paiza)

いろいろとPaizaの課題を解いている中で、動的計画法が便利だということなので、その学習と実装を記載する。
基本的に以下の記事に記載されている内容を読んで実装しただけ。
https://paiza.jp/poh/kirishima

以下、実装。記事に記載されているコードと若干異なる部分があるが、これでも満点を取ることができた。

```ruby
M = gets.to_i # プロジェクトに必要な人員数
N = gets.to_i # 下請けの会社の数

dp = Hash.new
dp[0] = 0

N.times{|i|
  line = gets.split(" ")
  num = line[0].to_i
  price = line[1].to_i
  temp_dp = dp.clone
  dp.each_with_index{|(k, v), j|
    idx = k + num # 対象のキーを求める
    min = v + price
    if dp.has_key?(idx)
      # 既に値が入っていた場合のみ、その値と比較して小さい方を格納
      min = [min, dp[idx]].min
    end
    temp_dp[idx] = min
  }
  dp = temp_dp
}
dp.select!{|k, v| k >= M}
puts dp.values.min
```

アルゴリズムになんとなく苦手意識を持っていたが、解説の記事の内容が分かりやすく、実装も思っていたよりもずっと簡単に済んだ。
地味に新しい武器を手に入れた感覚。
いつかは、A*等の高度なアルゴリズムもマスターしたいが、基本的にアルゴリズムを業務で使うことはないだろうし、結構先のことになるだろう。。。
SSLサーバー証明書に関する選ぶときの細かなあれこれ

Qiita初投稿がファーストサーバのAdventCalenderという、:beginner:itamitoです。

なにを書こうかと思いましたが、itamitoが最近一番悩まされた、SSLサーバー証明書に関しての重箱の隅を書きます。

##:beginner:SSLサーバー証明書に関する選ぶときの細かなあれこれ
　2日目の投稿[常時SSL化（AOSSL）に向け、合わせて点検・対応すべきこと](http://qiita.com/y-okuda/items/6db521b49be0aee964f4)でもありましたが、昨今、常時SSL化の波が押し寄せてきています。

「うちのもHTTPS化するか～」
となったときのSSLや証明書の選び方は各販売元に任せるとして、選ぶ際に意外と見逃しそうな点を、どこかにまとめておきたいなぁと思ったので、オレ得的に記載します。

証明書のラインナップを見てみても…普通に…

- サーバー証明書の種類がある
- サーバー証明書のベンダーがたくさんある
- サーバー証明書のベンダーごとに証明書の特徴がある
- サーバー証明書のベンダー内でも仕様違いがたくさんある

といった具合で…複雑怪奇。その仕様に関するところでは、多くの会社が説明していますが、

- 認証レベル
- 暗号強度
- クライアント対応率
- シールの有無
- 金額
- 発行までの所要期間
- etc

とこれもまたたくさんあり、検討要素満載です。。

証明書のモノとしては同じなのに、細かく違っている…これじゃ、利用者は何をみたらいいか、わかりづらいですよね。
（いや、売ってる側として、すんません…


##:ear:仕様面で見逃しがちだけど気をつけるべきこと（私見）
　証明書を選ぶとき、認証レベルを気にしましょうとか、シールの有無は？みたいなことはまだ分かりやすいですが、次のようなものはどうでしょうか？


| 気をつける項目 | 内容 |
|:-:|:-:|
| ライセンス  | 購入すべき枚数。サーバー単位とかコモンネーム単位とか|
| SANs  | example.comのコモンネームで取得したら、www.example.comでも使えるようになる　とか  |
| 保証・補償  | もし証明書のぜい弱性とかで、証明書の機能をなさなくなったときの補償  |
| 中間証明書  | 有・無/クロスルートか否か  | 

　正直、なんのこと？とか、あまり気にしなくていいんじゃない？ってなるかもしれません。
いや、でも…ちょっと気にしてみてください。


##:one:ライセンス
　証明書を使う上で、１サイトのみを１台のサーバーで運用する場合は、ライセンスとしてはあまり悩む必要はありません。
ライセンシーとして、WEBアクセスするURLに含まれるホスト名をコモンネームとして１枚取得して、WEBサーバーに設定すればそれでいいからです。

　これが、「複数台のWEBサーバーを持つシステムに適用したい」だとか、「証明書を使っているサイトがアクセス集中で重くなったので、CDNを導入したい。」となったときには簡単でなかったりします。
前者の「複数台の…」では、その台数分のライセンスが必要となったり、
後者の「CDNを…」では、証明書をコピーして入れる必要が出てくる場合がありますが、ライセンスで許してない場合があります。

ベンダーや証明書によりまちまちなのがライセンスで、
　　コモンネームにつき１枚とっておけば、何か所でも同じ証明書を適用してもよい、
といったライセンスのものあれば、
　　1バーチャルドメイン設定1個所ごとに１枚必要、
　　証明書仕様でSANsに登録されているものについてはそれぞれに１個所は許可する
といった特殊なライセンス体系のモノもあります。

※ちなみに当社のZenlogicでは、ここらへんの制御を全て機能化しています。死ねましたよ。:sweat_smile:


##:two:SANs

　ここでいうSANsは、ベンダーごとに呼び名が違いますが、「特定条件下で、コモンネームと、そのコモンネームにwww.がついたものをSANsに入れて提供されること」を指したいと思います。(自動設定SANsとか、wwwオプションとか、2WAY-SANsとかベンダーによりいろいろな呼び名があります。)

　この、コモンネーム意外にwww.付きでも利用できるようにしたSANs、実はベンダーごとにばらばらの仕様で提供されています。

一方のベンダーでは、

- 第2レベルドメインまでのコモンネームであればwww.も適用されるが、第3レベルドメイン以上でのコモンネームであればwww.は適用されない

他方のベンダーでは、

- 申し込まれればwww.は適用される

というような仕様違いがままあります。

ただ、この各社提供仕様が異なる状況を鑑みてか、CA/Blowserフォーラムでは統一化を図っているようです。
近々、呼び名も含めて統一されるかもしれませんね。


##:three:保証・補償

　サーバー証明書が売りだされたころからあったと思っているのですが、証明書自体の危殆化などによって何らかの被害を被ったときに、補償を受けられることを謳ったモノがあります。

　ただ…会社の業務内で、いろんなベンダーの補償を調べたことがあるのですが、これが結構マチマチなんです。
古くからのベンダーや、大手であれば、ついているほうが多いですが、中には保証なんてないものもあります。
無償のものであれば、無くても仕方がないと思いますが、有償のモノでは、どうかと思います。
中には、CPS(Certification Practice Statement)をよく読むと、「保証しない」と書かれているところもあります。

もちろん、これまで証明書の危殆化による被害は聞いたことが無いですが、気にされる方は見ておいたほうがよいでしょうね。


##:four:中間証明書

　証明書と聞くと、発行されたもののみ設定、で良いと思われがちですが、実はそれだけでは足りない場合があります。
証明書本体と併せて設定するものが、中間証明書です。
たぶん、いま発行されているほとんどの証明書で、中間証明書も必要となっていると思います。

　中にはクロスルートと呼ばれる方法で設定する必要があるものもあります。
クロスルートは古い端末からのアクセスをカバーするために設定するものです。
（ベンダーによって、クロスルートとそうでないものを選択できる場合がアリ、クライアント対応率はクロスルートのほうで記載されているような場合もあります。）

※これが結構厄介で、正常に設定されていない場合でも、主要なブラウザではエラーが発生しないことがあります。
　OSやブラウザ自身が中間証明書を持っている場合や、過去アクセスしたキャッシュが残っている場合にエラーが見えなくなります。


##:frowning2:唐突ですが…最後に…

　つたない文章ですが、読んでいただけた方の役に立てていれば幸いです。
　(これ、投稿後にあとからEDITできるのかなぁ…)
Giphy Captureで撮影したGifにマウスカーソルを入れる方法


上部メニューにあった．

![スクリーンショット 2016-12-04 18.09.10.png](https://qiita-image-store.s3.amazonaws.com/0/113504/88b553ab-ef38-2eee-d564-3ad9bd754b1b.png "スクリーンショット 2016-12-04 18.09.10.png")
単一責務の原理(Single Responsibility Principle)を守るとバグに苦しむことが減る

ある機能を修正した。ところがその機能を使っている状況Aではうまくいっているのに、状況Bではうまくいかなかった。

###**事例１：同じ目的の異なる実装を作らないこと。**
既存のソースコードの全体がうまく理解されていないときは、いつの間にか同じ機能の関数を複数実装していることがある。そのため状況Aではうまくいくのに、状況Bではうまくいかなかった。ある機能を修正したときに、それを呼び出す側の関数が状況Aと状況Bでは違っていた。そのため状況Aではつじつまの合う修正になっていたのに、状況Bではつじつまの合わない修正になっていた。
　単一責務の原理を守ると、このような状況にはならなくなるし、プログラムの見通しがよくなる。

###**事例２：単一責務の原理にしたがえば、多重定義はしないこと。**

原因の解決にあたると、同じ「hohehoge」という名で機能を呼び出しているはずが、hogehogeが多重定義されていた。多重定義の結果、一方と他方の他方の間で食い違いが生じやすい。一方だけ実装を改変して、他方の実装を同じように改変することをしていないというトラブルを生じやすい。
C++でdefault引数を使えば、引数の個数が違うだけの実装をする必要がない。

```
void hogehoge(double a, double b=0.0);
```


ところが問題のソースコードの中では

```
void hogehoge(double a, double b);
void hogehoge(double a);
```

のようにそれぞれの関数があって、それぞれが独立に実装されていた。
このような状況は、問題が生じたときに一方だけ修正されて、別の側は違った動作をするようになっていく。だから、このような実装が存在したときは（自分が作ってしまったこともあるだろう）、default引数を使って一つだけ実装するようにしよう。


単一責務の原理はSOLIDなプログラムを書く出発点だ。単一責務の原理は理想論ではなく、実際の実務でバグを減らす経験則だ。単一責務の原理を意識するかとしないとでは、結果に大きな違いを生じる。

もし、まだ単一責務の原理を知らない人が職場にいたら、ぜひ紹介してください。
`import * as f from 'foo';` のための `foo.d.ts` の書きかた

# 問題

TypeScript (2.0.10) において次のように利用するための `foo.d.ts` の書きかたが分からない。

```ts
import * as f from 'foo';

const n: number = 123;
const s: string = f(n);
console.log(s);
```

# 解決策

```ts:foo.d.ts
declare module 'foo' {
  namespace foo {} // この行がポイント
  function foo(n: number): string;
  export = foo;
}
```

- `namespace foo {}` をなしにすると `export = foo;` が通らない。
- `export default foo;` とすると `import * as f from 'foo';` が通らない。
AWS SDK for Ruby V2 への移行（主にS3）

山本と申します。
弊社の[TeamFake](https://fusic.co.jp/doings/125)というチームに属しており、Rubyを中心としながらもiOSやAndroidアプリ、IoT関連事業など幅広い技術をカバーしているのが強みです。

今回は我がチームのコア技術であるRubyに関するエントリーとなります。


### AWS SDK V2への移行

AWS SDK V2がリリースされて1年以上経っていますが、V1で書いていたコードを全面的にV2に対応する機会があったので、使えなくなったメソッドとその置換について、V1と比較しながらS3を中心に紹介します。


### トップレベルの名前空間が変わってます
これは言わずもがなですが、

- V1 → `AWS`
- V2 → `Aws`

のように、トップレベルにおける名前空間の表記が変わっています。`AWS.config` とか書くと怒られます。

### イニシャライズの変更

```ruby
#[V1]
AWS.config(
  region: 'xx-region'
  ...
)

#[V2]
Aws.config.update(
  region: 'xx-region'
  ...
)
```

### S3バケットオブジェクトの取得
以下からメインになってきますが、S3に関する処理で変更が多くありました。まずは、バケットを指定してのオブジェクトを取得する方法が変わってます。


```ruby
#[V1]
s3 = AWS::S3::new
@bucket = s3.buckets['bucket-name']
# 関連をわかりやすくするためインスタンス変数にしています
```
V1ではこうすることで、`@bucket` は `bucket-name` 以下に存在するオブジェクトを扱うことができました。


```ruby
#[V2]
s3_res = Aws::S3::Resource.new(region: 'xxx')
@bucket = s3_res.bucket('bucket-name')
```
V2からは、新たに加わった`Resource`クラスを使ってbucket名を指定してのオブジェクト取得を行います。


### S3特定のオブジェクト以下のリソースを取得する

```ruby
#[V1]
@bucket.objects.with_prefix('hogehoge').each do |obj|
  ...
end
```

V1では、`with_prefix` というalias_method_chainな書き方で、指定した名前以下のリソースにアクセスできましたが以下に変更になっています。

```ruby
#[V2]
@bucket.objects(prefix: 'hogehoge').each do |obj|
  ...
end
```
`prefix`オプションで明示的に指定する感じですね。

### 特定のオブジェクトを読み込む

```ruby
#[V1]
@bucket.objects['hogehoge.txt'].read
```

V1では、指定したオブジェクトに対し`read`とすることでファイル自体にアクセスできましたが、V2からはプロパティ群が厳密になったようで、ファイル内容にアクセスするには少し複雑になりました。

```ruby
#[V2]
@bucket.object('hogehoge.txt').get.body.read
```
`get`で取得できるあらゆる情報の中の一つに`body`情報があり、`read`することでデータとして取得できるようになります。
また、`objects` ではなく単数系の`object`になっていることも注意です。


### ファイルをアップロードする
```ruby
#[V1]
@bucket.objects['hogehoge.txt'].write('sample')
```

V1ではこれで、本文が`sample`と書かれた`hogehoge.txt`というファイルがアップロードできました。
また、IOやStringでなくても、ファイルパスを指定するだけでその内容がアップロードできました。

```ruby
#[V2]
@bucket.object('hogehoge.txt').put(body: 'sample')
```
V2では`write`が`put`になり、`body`にIOオブジェクトかStringを記述することでアップロードされます。少し厳密になり、ファイルパスの指定は効かなくなりました。
ちなみに、`Aws::S3::Client`を使ってもアップロードできます。


### paperclipを使っている場合はバージョンアップもお忘れなく
ファイル管理を担ってくれるpaperclipですが、V2に対応するためには最新バージョン(5系)にする必要があります。ただ、paperclipを4->5にすることは、特にコストはかかりませんでした。


### さいごに
S3に関しては、Read,Writeともに互換性がほぼない印象です。それでいて、V1->V2の対応表のようなものはないので、Try&Errorを繰り返して地道に修正していくしかないと思います。この記事が、移行に少しでもお役に立てれば幸いです。
ちなみに、S3以外ではSNSやAutoScalingもV2へ移行したのですが、イニシャライズが変わるぐらいでとくに対応がいりませんでした。（そんなに複雑な処理をしていないのですが）
NTFS partition read-write mode in Mac OSX 10.9+

There are many ways to enable read-write in Mac OS X, but I found simple utility so just want to share at qiita.

[Mounty](http://enjoygineering.com/mounty/), a donationware by [Chris & Uwe](http://enjoygineering.com) takes simple approach to enable read-write mode at Mac OS.

This simple tool support OS X 10.9+ (including Mac OS Sierra).

Just same way in these articles e.g.:
* [NTFS Write Support On OS X Mountain Lion](https://prateekvjoshi.com/2013/04/21/ntfs-write-support-on-os-x-mountain-lion/)
* [How to Enable NTFS Write Support in Mac OS X](http://osxdaily.com/2013/10/02/enable-ntfs-write-support-mac-os-x/)

Mounty can be downloaded at their [homepage](http://enjoygineering.com/mounty/) or if you're using Homebrew Cask, Just install with cask.

```sh
$ brew cask install mounty
```

P.S: this is my first article at qiita. Nice to meet you! I'm korean programmer living & working @ seoul. Below article is [my related article](http://blog.funspaces.org/2016/12/04/ntfs-for-mac/) translated by google translator.

---

MacOS Sierraで外付けハード/ USBドライブの使用のためにNTFSの書き込みを活性化させる方法。

## [Mounty for NTFS](http://enjoygineering.com/mounty/)を使用する方法

しばらく項目の下の```/etc/fstab```ファイルにNTFSの書き込みモードを有効にする方法を少なくナニ、同じ事をしてくれるMountyを発見した。

[ダウンロード](http://enjoygineering.com/mounty/releases/Mounty.dmg)して、通常のアプリケーションのインストールと同じように進行した後に実行すると、NTFSの外付けハード/ USBを接続すると、通知領域に **Re-mount with read-write？** のようなメッセージが浮かび上がる。 remountを選択すると、書き込みモードで使用可能。

```Homebrew Cask```ユーザーの場合は、次のようにインストールすればよい。

```sh
$ brew cask install mounty
```
 
## ```/etc/fstab```を利用する方法

```sh
$ sudo vi /etc/fstab
```

ファイルを作成した後、次のような内容で編集して保存する。

``` 
LABEL=Seagate\040\Expansion\040Drive none ntfs rw,auto,nobrowse
```
 
ここで、LABELはファインダーに表示されたドライブ名を書けば良い。 Escapeされている```\040```は、Spaceを意味する。 したがって、上記の設定で```Seagate\040\Expansion\040Drive```部分は、ファインダーから```Seagate Expansion Drive```と表示されることを意味する。

**fstab**ファイルを利用する方法の説明は多いが、ドライブ名にスペースがある場合の話があまりなく記録に残ら。

## Paragon NTFS for Mac 14

```/etc/fstab```だけで、ほとんどの場合、十分だろうが、コストを自分たちのも便利でサポートを受けることができる方法を探しているなら[Paragon NTFS for Mac 14](http://macntfs.com/go/paragon-ntfs)側を推薦する。 競合製品にTuxera NTFSがあるが、全体的な反応には、Paragonのほうが優れている雰囲気だ。 特にTuxera NTFSは```Tuxera ntfs could not mount```に関連するエラーが多く報告されており、しようとしなかった。

さらに、Seagateの外付けハード系列を使用している人であれば、あえてコストをかけずにParagon NTFSを使用することができる。 [Mac OS用のParagon Driver（10.9。以上）](http://www.seagate.com/jp/ja/support/downloads/item/ntfs-driver-for-mac-os-master-dl/)を受けて設置すれば、Seagate専用に設定されたParagon NTFSの使用が可能である。
【PHP】配列

この記事は[PHP総復習カレンダー](http://qiita.com/advent-calendar/2016/php_beginner)3日目の記事です！

関数って言ってたけど先に配列を書いちゃったよ（´・ω・｀）
引数とか出てきちゃうけど追記するので察してください・・・。

## 配列とは
配列は「複数の値をしまっておく箱」のようなものです。
配列として宣言すると、中身が空っぽでも配列になります。

配列の宣言と同時に値を入れることができます。

```php
<?php

$days = []; // $daysは配列

$family = ['dad', 'mom', 'son', 'daughter']; // $familyは配列
```

※PHPでの配列の書き方は5.4以降変更されました。

## 配列の添字
配列に列挙された中身には、添字という要素の場所を表すものがあります。
添字は0から順番に0,1,2..となります。添字をつけると配列の要素にアクセスすることができます。

```php
<?php

// 添字は0, 1, 2, 3
$family = ['dad', 'mom', 'son', 'daughter'];

echo $family[0]; // 'dad'

echo $family[3]; // 'daughter'
```

## 連想配列
添字の代わりに、要素に名前（キー）をつけてアクセスすることができます。

```php
<?php

$family_name = [
	'dad' => 'Bob',
	'mom' => 'Jessy',
	'son' => 'James',
	'daughter' => 'Emily'
];

echo $family_name['dad']; // 'Bob'
```


## 要素の追加
### 末尾に要素を追加
配列の末尾に新しい要素を追加するには以下のように記述します。

```php
<?php

// 添字配列の場合
$family = ['dad', 'mom', 'son', 'daughter'];

$family[] = 'puppy'; // 配列の末尾に要素を追加

echo $family[4]; // 'puppy'


// 連想配列の場合
$family_name = [
	'dad' => 'Bob',
	'mom' => 'Jessy',
	'son' => 'James',
	'daughter' => 'Emily'
];

$family_name['puppy'] = 'John';

echo $family_name['puppy']; // 'John'
```

### 先頭に要素を追加
先頭に追加する場合は`array_unshift()`を使います。

```php
<?php

$family = ['dad', 'mom', 'son', 'daughter'];

array_unshift($family, 'grandma');

// $familyは['grandma', 'dad', 'mom', 'son', 'daughter']になる
```

### 任意の場所に要素を追加
配列の途中に要素を差し込むなら以下。
`array_splice()`はもともと要素を置換する関数なのですが、第3引数に0を指定すると要素を消去せず差し込めます。

```php
<?php

$family = ['dad', 'mom', 'son'];

// $family[2]の前に'uncle'を追加
array_splice($family, 2, 0, 'uncle');

// ['dad', 'mom', 'uncle', 'son']
```

### 複数の要素を追加
`array_push()`を使って一度に複数要素を追加することもできます。

```php
<?php

$family = ['dad', 'mom', 'son'];
array_push($family, 'puppy', 'citty');

// ['dad', 'mom', 'son', 'puppy', 'citty']
```

`array_merge()`を使うと配列と配列を結合。

```php
<?php

$family = ['dad', 'mom', 'son'];
$add_member = ['grandma', 'grandpa'];

$new_family = array_merge($add_member, $family);

// $new_familyは['grandma', 'grandpa', 'dad', 'mom', 'son']
```
※array_mergeの場合、元の配列（`$family`）には影響しない


## 多次元配列
配列の要素には配列を持たせることができます。

```php
<?php

$families = [
	[
		'dad', 'mom', 'son'
	],
	[
		'dad', 'mom', 'daughter'
	]
];

echo $families[0][0]; // 'dad'

echo $families[1][2]; // 'daughter'

// $families['Smith']と$families['Williams']はそれぞれ配列
```

もちろん連想配列を多次元配列にすることもできます。

```php
<?php

$families = [
	'Smith' => [
		'dad' => 'Bob',
		'mom' => 'Jessy',
		'son' => 'James'
	],
	'Williams' => [
		'dad' => 'Michael',
		'mom' => 'Jessy',
		'daughter' => 'Emily'
	]
];

echo $families['Smith']['dad']; // 'Bob'
```
ここでの `$families['Smith']['mom']`の'Jessy'と`$families['Williams']['mom']`の'Jessy'は、同じ文字列ですが別物です。
スミス家のジェシーさんとウィリアム家のジェシーさんですね。

この辺、プログラミング始めたばっかの時「ハァ？(^p^)」ってなったんだよなあ。。

## PHPの配列での注意
PHPの場合は添字配列と連想配列が同じ「配列型」の扱いです。添字配列と連想配列を混ぜたり、ループ処理などでもほぼ同じように扱えるのですが、他の言語だと扱いそのものが違うので注意です！

## まとめ
配列は奥が深くて、他にも配列に係る関数等々たくさんあるのですが、初心者向けということでまたの機会に！

下記の記事たちが参考になるので是非見てみてください。（勝手にリンクすいません）

[【PHP】連想配列、配列への追加](http://qiita.com/kazu56/items/6947a0e4830eb556d575)

[[PHP] 配列・連想配列の初期化、結合、追加]
(http://qiita.com/shuntaro_tamura/items/784cfd61f355516dfff0)
Rの二項四則演算は複数の書き方があった話

きぬいとです．
R言語の演算について，お話します．
もうご存知の方もいるでしょうが，R言語は二項四則演算が`"+"(a,b)`という形でもちゃんと答えが返ってくるんです．すごいねぇ．
備忘録でもあり，実際これによってどんな恩恵があるかはわからないんですけどね．
「""」でも「``」でも正しく返してくれるあたり，文法的にRは寛容ですね．
>参考:Norman Matloff　著、大橋 真也　監訳、木下 哲也　訳[「アート・オブ・Rプログラミング」](https://www.oreilly.co.jp/books/9784873115795/)

```R:四則演算.R
#いつもの四則演算
1+2
>3
#Rは演算子を関数としても認識する
#""は``でもいい．
"+"(1,2)
>3
#乗法，除法も同様

"*"(1,2)
>2

"/"(1,2)
>0.5

#三項以上だとダメっぽい
"+"(1,2,3)
> `+`(1, 2, 3) でエラー:  演算子は一つまたは二つの引数を必要


```