OmniAICreator/Qiita-1.07M huggingface dataset:
de:code2016 ~day 1~ 印象に残ったことを箇条書きでまとめてみた

※完全に自分メモです。

# keynote

* 出だし遅れて立ち見(２時間辛かった)
* かつらさんという人、会社の中で見たことある。。
* microsoftのトップ。翻訳機械が配られていると知らず英語で聞き取ることに。何を言っているのか全然わからなかった。。
* power BIに興味あり。英語が聞き取れなかったのでtwitter見ながら視聴。
* DevOps! DevOps!


# 間違いだらけのIoTプラットフォーム〜今すぐビジネス拡大に繋げるためのデータ基盤構築〜

* お昼食べながらだったのでメモが残っていない。
* 「目的を明確にし、目的を見失わない」ことが、データ分析で一番大切。

# 黒船襲来！世界DevOpsトップ企業 × マイクロソフトによるトークバトルセッション

* 人気すぎて立ち見必須なセッション。
* Japanese chonmage = water fall!! ww
* DevOps! DevOps!

# オープンソースから見たマイクロソフト

* オープンソースソフトウェアは、元はフリーソフトウェアと呼ばれていた。
* ソフトウェアそのものが産業となることに目をつけたのが、ビルゲイツ。
* 「ソフトウェアの発達と技術者の成長のためにも、オープンソフトウェアにするべき」
* 数あるOSがある中で、Windowsだけが全く異なるインターフェースを採用していて、ソフトウェアの移植性がダントツで悪かった。
* windowsではRubyの挙動が変わってしまうらしい。怖いね😱
* Web開発では、Windowsで開発する人は少数。追い込まれたからこそ、マイクロソフト自らWeb開発者に歩み寄ってきた。
* ソフトウェアにおいて、囲い込みは悪。
* ソフトウェアにおいて、進歩の阻害は悪。
* ソフトウェアにおいて、学びは善。
* ソフトウェアにおいて、競争は善。
* ソフトウェアにおいて、自由は善。

# 本音で語る、マイクロソフトのOSSはどうなのよ？

* 「日本のコミッターを増やすための策はあるんですか？」「ソースコードを公開するだけではダメだと思っている。歩み寄って、コミュニティに認めてもらうことが先決だと思う。寿司食べにきてください」

# 日本でもできる！マイクロソフト技術をフル活用したDevOpsの具体的実現手法！

* DevOpsは、システムを導入するだけではなく、人、文化の意識改革が必要。
* DevOpsの目的は三段階
    * まずはリードタイムを短縮しましょう
    * 本番環境にデプロイしてユーザからのフィードバックを受けましょう
    * 継続的な実験と学びを続けましょう
* 日本とUSの生産性の違いは「物量」であり、彼らがものすごく能力があるわけではない。
* 世の中のほとんどのことは「ノイズ」
* 気軽に聞いて、気軽に断るのって、スピーディーだよね。
* DevOps! DevOps!

# 参加者パーティー

* 人すごい
* 寿司うまい

# 一日目まとめ

* 一日目おつかれさまでした(立ち見が続いたので結構疲れた)
* 初のde:code参加だったので、色々と勝手が分からず、翻訳機を取り忘れたり、飲み物がEXPOブースで提供されているのを知らずにホテル内のコンビニで水買ってたりした。
* 牛尾さんという人物との出会い(※双方向ではない)。メソッド屋のブログを読んでみよう。
vagrantでWordPressのアップデートをする

vagrant上にWordPressを入れてはまったのでメモ。

# 環境
ホスト：MacOSX 10.10.5（14F27）
Vagrant 1.8.1
VirtualBox 5.0.20
ゲスト：CentOS 7.0 x64

# ポイント
WordPressを管理画面からアップデートするためには、WPのインストールディレクトリにApacheの権限が権限がないとダメ！

# vagrantとホストのディレクトリ共有設定（やらかしver)

Apacheは/var/www/htmlを見にいく
＆
ゲストの/vagrantが同期される
ので、手っ取り早くシンボリックリンクにしてしまう目論見

**vagrant**

```
$ cd /var/www
$ sudo rm -r html
```

**ホスト**
ホストから実体ファイルを操作するディレクトリ

```
$ mkdir ~/Vagrant/html
```

**vagrant**
シンボリックリンク作成

```
$ sudo ln -s /vagrant/html /var/www/html
```

これで、ホストのhtml以下にWPを置いて、vagrant側から見ることはできるようになった。

# WordPressのアップデートができないよん

WPの管理画面から、WPのアップデート実行しようとして
サーバのFTP情報を要求される

↓

権限がない。
vagrant側の　/var/www/html　の権限が
vagrant:vagrant になっている。

↓

```
$ chown　-R apache:apache html
```

↓

＿人人人人人人＿
＞　変わらない＜
￣ＹＹＹＹＹＹ￣

# Vagrantfileで権限設定する

vagrantの共有ディレクトリに権限設定をする場合、Vagrantfileで指定する。

**vagrant**
シンボリックリンクを削除

```
[vagrant@localhost ~]$ sudo unlink /var/www/html 
```

**ホスト**
一旦先ほどの/vagrant/htmlは破棄。
別ディレクトリを共有対象にして、オプションでオーナーとグループを設定。

```file:Vagrantfile
config.vm.synced_folder "/Users/xxx/Desktop/work/hoge/html", "/var/www/html", id: "vagrant-root", :nfs => false,
    :owner => "apache",
    :group => "apache",
    :mount_options => ["dmode=775,fmode=664"]
```

`$vagrant reload`して、ホストの共有ディレクトリにWPのファイルを置く。

**vagrant**

```
[root@localhost www]# ls -al
合計 4
drwxr-xr-x   4 root   root     31  5月 26 00:51 .
drwxr-xr-x. 21 root   root   4096  5月 26 00:51 ..
drwxr-xr-x   2 root   root      6  5月 12 19:28 cgi-bin
drwxrwxr-x   1 apache apache  170  5月 25 22:59 html
```

ばっちり。

WPのアップデートもできました。

とりあえずここまで。



---
# 参考
http://qiita.com/tiwu_official/items/f135e6b6fbbe3ec6aa54
http://www.sandalot.com/wordpress%E6%9B%B4%E6%96%B0%E3%81%A7ftp%E5%85%A5%E5%8A%9B%E7%94%BB%E9%9D%A2%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/
http://bulblub.com/2013/10/24/setup_vagrant_synced-folders/
https://www.vagrantup.com/docs/synced-folders/basic_usage.html
http://qiita.com/tbpgr/items/67125ea883409ae5fd51
Cordova開発環境構築からGenymotionでの動作確認まで（on Windows）

Win10環境で設定

2016/5での環境

# 事前環境構築メモ
- node.jsのインストール
  - v6.2をnodistで追加
- JDKのインストール
  - JDK8をインストール
  - JAVA_HOMEとPathの設定
- Apache Antのインストール
  - DLして解凍したものを任意のディレクトリにコピーしANT_HOMEとPathの設定
  - v1.9.7を追加
- Android Studioのインストール
　-v2.1を追加。1G超えなのでwifiでないと通信上限に注意が必要
  -デスクトップはCPUがAMDなので高速エミュレータが使えないｗ
  - デフォのエミュレーターでは遅いので実機 or Genymotionを使う
  - File-Settings-PluginsでGenymotionを探して追加
  - ツールバーにGenymotion のアイコンが追加されているのでクリック
  - Genymotionのpathを追加
  - C:\Program Files\Genymobile\Genymotion
  - Genymotion起動後にandroid studioでrunをするとGenymotionが追加される
  - tools/platform-toolsのpathを追加する


# 開発環境メモ
cordovaのインストール

```
$npm i -g cordova
$cordova -v
6.1.1
```

plugin用にplugmanもインストール

```
$npm i -g plugman 
$plugman -v
1.2.1
```

### プロジェクトの作成(bropwser)

```
$ cordova create hello_world com.example.hello_world HelloWorld
$ ls ./hello_world/
config.xml
hooks/
platforms/
plugins/
www/
```

#### ブラウザ確認用プラットフォームの追加

```
$cd hello_world
$cordova platforms add browser
$cordova serve
```

http://localhost:8000
に接続してベースが動いていることを確認

#### Androidプラットフォームの追加

```
$cordova platforms add android
```

アプリのビルド

```
$ cordova build            # 全部のプラットフォームを
$ cordova build android    # 個別で
$ cordova build --release  # リリースビルド
```

Genymotionで動作確認

Genymotionを起動しViretual Deviceをstartさせる

```
cordova run android
```

最初は下記のエラーで怒られた

```
ADB server didn't ACK
* failed to start daemon *
```

どうもabdのバージョンが古かったようなのでGenymotionのSettingsからabdをandroid studioからいれたandroid sdkを使うように設定変更

これでrunがうまく実行できた


Genymotionで起動しているVirtual Deviceにapkが展開されてアプリが実行される

```
cordova emulate android
```
ではエミュレーターが起動するのでダメ

# 参考
基本設定周り

http://nikami.org/cordova-iphone-ios-android-%E4%B8%A1%E6%96%B9%E3%81%A7%E5%8B%95%E3%81%8F%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/

http://qiita.com/Cookie_maker/items/422bc97d45de26e6bf22

http://qiita.com/krtbk1d/items/63f7103d681c2263ad40

Genymotion
http://qiita.com/murachi1208/items/efe8c938d1fa5948b917
http://www.teradas.net/archives/13895/
http://qiita.com/Sam/items/44ee1ec1fdc902f92b79
http://www.webcyou.com/?p=5838
http://d.hatena.ne.jp/itog/20141208/1418021388
Androidアプリ開発：Kii cloud とFacebookログインを連携


KiiのAndroidアプリ用サンプルコードを使います。
サンプルコードを動作させるところまでを解説します。

##GitHubでサンプルコードをダウンロード
ターミナルから Kii-FB-Integrationをgit cloneする。

```bash
git clone https://github.com/satoshikumano/Kii-FB-Integration
```

##Kii Developer コンソールを開く
https://developer.kii.com/v2/apps/29157/users/console

アプリで使いたいデータベースを作成。(ここでは"Kii-Integration"とする)
![スクリーンショット 2016-05-22 2.05.02.png](https://qiita-image-store.s3.amazonaws.com/0/64560/b586d6cf-d463-60e1-7b46-b05d5a3ba1fe.png "スクリーンショット 2016-05-22 2.05.02.png")

コンソール画面で「歯車アイコン」をクリックしてから「キーアイコン(上記画面を参照)」をクリックし、APP IDとAPP KEYを確認する。

##Android studioにてConstants.javaを修正

```java
public class Constants {
    public static final String Kii_APP_ID = "(上記のAPP ID)";
    public static final String KII_APP_KEY = "(上記のAPP KEY)";
    public static final Site KII_SITE = Site.JP;
}
```
APP IDとAPP KEYを入力しておく。

##Facebook Developersを開く
https://developers.facebook.com/

###(1) ダッシュボードでアプリ(例えばKii-Integration)を作成。
![スクリーンショット 2016-05-22 2.07.35.png](https://qiita-image-store.s3.amazonaws.com/0/64560/9102d2f2-d7d4-7777-0de1-fcc682b72755.png "スクリーンショット 2016-05-22 2.07.35.png")

アプリIDと app secretをメモしておく

###(2) Facebook Developersの設定をクリック
![スクリーンショット 2016-05-26 1.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/64560/7c284fe6-a02e-7002-10c9-ee0ca373608a.png "スクリーンショット 2016-05-26 1.09.13.png")

ウェブサイトを追加し、サイトURLにはhttps://(KiiのAPP ID).jp.kiiapps.comを入れる。
Google Play パッケージ名には、サンプルコードのパッケージ名

```
com.pgtest.example.kii.fb_integration
```

を入れる。

###(3) キーハッシュを生成する

開発用キーハッシュを生成する。ターミナルで下記を実行すれば良い。 詳しくは[facebook for developers](https://developers.facebook.com/docs/android/getting-started#samples) を参考にすること。

```bash
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
```

出てきた文字列をコピーし、Facebook Developers ダッシュボード内の「キーハッシュ」に貼り付ける。
最後に、「変更を保存」をクリック。

##Kii Developer コンソールをもう一度開く
![スクリーンショット 2016-05-22 2.09.47.png](https://qiita-image-store.s3.amazonaws.com/0/64560/f207d9d7-3d5d-20c5-f829-e8b36e25c785.png "スクリーンショット 2016-05-22 2.09.47.png")

App IDにFacebookのアプリID、App SecretにFacebookのapp secretを入力する。その上でSAVEをクリック。

##Android Studioにてstrings.xmlに下記を追加
```xml
    <string name="facebook_app_id”>(FacebookのアプリID)</string>
```
最後にコンパイルを実行すれば良い。


##リンク
https://docs.kii.com/ja/guides/android/managing-users/social-network-integration/facebook/
http://community-jp.kii.com/t/facebook-facebook-android-sdk-4/554

以上
サポートベクトルデータによる異常検知の続き

[異常検知と変化検知 (機械学習プロフェッショナルシリーズ) ](https://www.amazon.co.jp/dp/4061529080)の第6章の輪読資料です。
[前半](http://qiita.com/bohemian916/items/3df0af9dd69a336a959d)の続きの資料です。
## 前回の流れ

[サポートベクトルデータによる異常検知](http://qiita.com/bohemian916/private/3df0af9dd69a336a959d)
  
データを囲う、中心bと半径Rの球を最適化して、球からはみ出た距離を異常度として定義しよう！
制約条件がたくさんあって最適化しづらいから、別の問題にして最適化しよう（双対問題）
双対問題ができた！ 

```math
\max_{\alpha} \bigl\{ \sum^N_{n=1}\alpha_n K_{n,n} - \sum^N_{n=1,n'=1}  \alpha_n \alpha_{n'} K_{n,n'} \big \} \\
\quad subject \quad to \quad 0 \leq \alpha_n \leq C \quad (n=1\cdots N) \tag{6.8}
```


## カーネルトリック
本質的に非線形の問題を線形分離しようとすると、うまく分離できない。今回の問題は、そもそも球面なので、線形で分離するのに無理がある。そこで、非線形空間に非線形変換して、そこで問題を解こうという話になる。  

非線形の基底関数$\varphi(x) \quadただし\quad  \varphi(x) = [ \varphi_1, \varphi_2, \cdots, \varphi_{K} ]^T$ 

```math
 
```

を考えると、内積は、$\varphi(x) \varphi(x')^T$のように表せる。  
ここで基底関数の次元$K$は、元々のxの次元より次元が大きくなっている。
基底関数の次元$K$をサンプル数程度にまでしないと、十分に線形分離できなくなってしまう。  
すると、非線形空間での内積の計算量が膨大になってしまう。

今回の最適化問題では、xに関わるものがいい感じに内積のみになっているので、非線形空間への写像$\varphi(x)$や$\varphi(x')$を計算せず、

```math
K(x,x') = \phi(x) \phi(x')^T

```

のようにx,x'だけで非線形空間内の内積だけを計算できれば、効率がよい。

ここで、RBF(動径基底関数)と呼ばれる、基底関数が、その中心$\mu\_{{j}}$からの動径にのみ依存する、

```math
\phi_j(x) = h(||x-\mu_j||)
```

のような形式のものをとると、内積が、

```math
K(x,x') = exp\{- \sigma ||x - x'||^2\}

```

と計算できる。  
つまり、内積の定義を上記のものに置き換えるだけで、非線形に写像して内積を計算したことになる。これをカーネルトリックという。 
一般的にこのように置き換える関数のことを**カーネル**、上記のようにRBFを基底関数としたカーネルを**ガウスカーネル**と呼ぶ。  
  
ガウスカネールをテーラー展開すると、無限次元への写像に対応する形になるので、ガウスカーネルに置き換えるだけで無限次元の非線形空間で線形分離ができてしまうということ。すごい。

カーネルの分かりやすい説明
[カーネルとは直感的に説明するとなんなのか？](http://qiita.com/keisuke-nakata/items/9d46152ac52dcd2cc92a)
[カーネルトリック](http://home.hiroshima-u.ac.jp/tkurita/lecture/svm/node6.html)

[カーネルトリックで遊べるとこ](http://shogo82148.github.io/homepage/memo/algorithm/svm/kernel.html)

## 最適化手法 SMO法の概要
Sequential Minimal Optimization algorithm (逐次最小問題最適化法)   

step 1: 観測データ集合$ \mathcal{D} $を、適当な部分集合$ \mathcal{D_1},\cdots \mathcal{D_J} $に分割する
step 2: $a_n=0 \quad (n=1, \cdots,N) $に初期化する
step 3: 適当な$\mathcal{D_j}$を選び、$\mathcal{D_{now}}$とする
step 4: repeat
　　　　step4-1 : $\mathcal{D_{now}}$についての最適問題を解く
　　　　step4-2 : KKT条件を満たさない観測データを含む新たな部分集合を選び、これを$\mathcal{D_{now}}$とする
step 5: until 停止条件を満たす
step 6: $\{a_n\} (n=1, \cdots, N)$を結果として出力して終了

pythonでの実装
http://d.hatena.ne.jp/se-kichi/20100306/1267858745

スライド
[SMO徹底入門 - SVMをちゃんと実装する](http://sssslide.com/www.slideshare.net/sleepy_yoshi/smo-svm)

## 解の性質と分類
本を写してやります。
Rails 5 の API モードのイニシャライザーで CORS に対応する


Rails 5 のプロジェクトを API モードで生成すると CORS 対応するためのイニシャライザーが含まれている。今回はそのイニシャライザーで CORS 対応する方法をメモっとく。

# API モードでプロジェクトを生成する

API モードの Rails プロジェクトを生成する。サンプルプロジェクトは本を登録できる本棚プロジェクト。

```shell-session
$ rails new bookshelf --api
$ cd bookshelf
```

# rack-cors gem をインストールする

Gemfile の rack-cors gem を有効にする。

```diff
--- a/Gemfile
+++ b/Gemfile
@@ -18,7 +18,7 @@
 gem 'puma', '~> 3.0'
 # gem 'capistrano-rails', group: :development
 
 # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
-# gem 'rack-cors'
+gem 'rack-cors'
 
 group :development, :test do
   # Call 'byebug' anywhere in the code to stop execution and get a debugger console 
```

rack-cors gem をインストールする。

```shell-session
$ bundle
```

# cors.rb を設定する

`config/initializers/cors.rb` の設定を有効にする。今回は `origins` に `*` を設定して、全てのオリジンからのアクセスを許可している。本番運用するときは適切に設定してほしい。

```diff
--- a/config/initializers/cors.rb
+++ b/config/initializers/cors.rb
@@ -5,12 +5,12 @@
 
 # Read more: https://github.com/cyu/rack-cors
 
-# Rails.application.config.middleware.insert_before 0, Rack::Cors do
-#   allow do
-#     origins 'example.com'
-#
-#     resource '*',
-#       headers: :any,
-#       methods: [:get, :post, :put, :patch, :delete, :options, :head]
-#   end
-# end
+Rails.application.config.middleware.insert_before 0, Rack::Cors do
+  allow do
+    origins '*'
+
+    resource '*',
+      headers: :any,
+      methods: [:get, :post, :put, :patch, :delete, :options, :head]
+  end
+end
```

# API を Scaffold 機能で生成する

動作検証用に API を Scaffold 機能で生成する。サンプル API は本を登録できる API。

```shell-session
$ rails g scaffold book title:string
$ rails db:migrate
```

# Rails サーバーを起動して動作検証する

Rails サーバーを起動する。

```shell-session
$ rails s
```

適当な SSL 接続ではない Web サイト [rubyonrails.org](http://rubyonrails.org) などにアクセスして、Chrome のデベロッパーツールの Network と Console を開いて下記の JavaScript を実行する。

```js
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/books');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send('{ "title": "JavaScript: The Definitive Guide, 6th Edition" }');
```

`OPTIONS` メソッドのプリフライトリクエストと `POST` メソッドのリクエストの2つのリクエストが送信される。それぞれ `200 OK` と `201 Created` というステータスコードが返ってくれば正常に動作している。
コレクションが変更されました。列挙操作は実行されない可能性があります。

## 凡例

基本的には次のような場合に発生する例外です。

>引用元：[列挙操作中のコレクションの変更](http://smdn.jp/programming/netfx/enumerator/1_modify_collection/)

>List, Dictionary, Queueなど、要素を動的に追加・削除できるコレクションをforeach文/For Eachステートメントで列挙する場合、列挙中に追加・削除等の操作を行うことはできません。


## その他の例

そのほか、こんなパターンでも起きました。ハマりました。

```vbnet:落ちる例
Private Function GenerateRow(ByRef data As String) As DataGridViewRow

    ' ByRefしているが、dataに対しては参照処理のみ行っている
    ...

End Function


Private Sub ViewGird()

    Dim additionalRow As DataGridViewRow
    Dim dict As Dictionary(Of Integer, String)
    ...

    For Each key As Integer In dict.Keys

        ' ここが更新処理扱いになる！
        additionalRow = GenerateRow(dict(key))
        ...

    ' Nextで次のループを開始しようとしたタイミングで例外発生
    Next
    ...

End Sub

```

ByRefではなく、ちゃんとByValで受け取るようにすると、正常に動きます。

```vbnet:落ちない例
Private Function GenerateRow(ByVal data As String) As DataGridViewRow

    ' dataに対しては参照処理のみ行っているので、ByValで受け取りましょう
    ...

End Function


Private Sub ViewGird()

    Dim additionalRow As DataGridViewRow
    Dim dict As Dictionary(Of Integer, String)
    ...
    
    For Each key As Integer In dict.Keys

        additionalRow = GenerateRow(dict(key))
    ...

    ' 正常にループしてくれます
    Next
    ...

End Sub

```

## まとめ

ByRefするのは本当に必要な箇所だけにする・・・って適当なことやってるからこんなことになるんですね。反省。
「ファイル ‘～’  が見つかりませんでした。」「 ディレクトリが空ではありません。」エラー原因

# はじめに
仕事でこの原因特定までに時間を要したので、情報を共有しておく。

# 現象
自社開発のバックアップツール(VB.NET)を関連会社に提供しているのですが、お客様から下記のエラーがログに出力されてバックアップが途中までで失敗している旨の問い合わせがありました。
【ログ】
「ファイル ～ が見つかりませんでした。」
「 ディレクトリが空ではありません。」

# 調査
「ファイル ～ が見つかりませんでした。」エラーは単純にファイルが見つからないだけだろうと、一方の「 ディレクトリが空ではありません。」エラーを調べてみたのですが、ネットで検索する限りではフォルダを削除する際にフォルダ内にファイルが残っていた場合にこのエラーが発生するとのこと。
フォルダを削除するタイミングとしては、バックアップツールで世代管理を実装しており世代を超えた場合に最古のフォルダを削除している。そして、フォルダ削除は「My.Computer.FileSystem.DeleteDirectory」メソッドの1行のみで行っている。
こちらでいろいろ試したが同様のエラーは発生しない。

お客様からエラー発生するフォルダのキャプチャ画像がメールで送られてきて、4フォルダ内の3つは正常にバックアップ出来るが最後の1フォルダでエラーが発生しているとのこと。
しかし、キャプチャ画像を見た限りでは何も問題ないので実際にエラーとなるフォルダをもらえることになった。中身は5つの画像(JPGファイル)が入っているだけで、特に問題がありそうなファイルは見当たらない。
しかし、バックアップツールで該当フォルダを指定してバックアップを取ると下記エラーが発生したのである。
「パス ‘～’ の一部が見つかりませんでした。」

このエラーをネットで調べることで、やっと原因が分かったのです。
参照:[「パス ‘～’ の一部が見つかりませんでした。」のエラーについて](http://www.norikistudio.com/software/error-path-not-found)

# 原因
「パス ‘～’ の一部が見つかりませんでした。」は、エラーメッセージに表示されているフォルダ名の最後にスペースの文字が含まれている場合に発生するとのこと。
実際にもらったフォルダ名の末尾には全角空白が含まれていたのである。キャプチャ画像では区別が付かないわけだ(^-^;

# 最後に
「[フォルダ名 末尾 空白](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E5%90%8D+%E6%9C%AB%E5%B0%BE+%E7%A9%BA%E7%99%BD)」でネット検索すれば、それなりに記事に見つかります。
過去にそのような体験をしたらなら、すぐに原因の推測が出来たのかも知れません。今回のエラーメッセージではその原因に辿り着かなかったので、記事のタイトルを見つけやすいものにしました。

上位フォルダを指定して下位フォルダに末尾空白のフォルダ名があった場合、「ファイル ‘～’  が見つかりませんでした。」となります。
これは空白を除去(Trim)してファイル検索してしまうため、一致しないと判断されてしまうのです。

# 参照
* [NETでのデレクトリ走査でデレクトリ名の最後がスペースで終わっていると止まる問題]
(http://d.hatena.ne.jp/hmori/20090113/p1)
* [全角スペースがあるフォルダあるとSystem.IO.Directory.GetFilesがエラーになる]
(http://dobon.net/vb/bbs/log3-8/4859.html)
* [末尾に全角空白を含むファイルのコピー](http://dobon.net/vb/bbs/log3-28/16679.html)
新しいbranchがリモートリポジトリに作られた時に共有する方法


`git pull`してもbranch取ってこれなくてはまったのでメモ

## リモートリポジトリにあるbranchを確認

まずリモートリポジトリにあるbranchを確認する。
`git branch`に-aをつけると見れなかったbranchも見れるようになる。

```sh:branchを確認
$ git branch
* master        #ローカルにはmasterブランチしかない
$ git branch -a
* master
  remote/origin/develop    #リモートにdevelopブランチがある
```

## ローカルにbranchを取ってくる

`git branch <ローカルブランチ名> <リモートブランチ名>`とすることでローカルにリモートブランチを取ってくることができる。

```sh:例
$ git branch develop origin/develop
Branch develop set up to track remote branch develop from origin
$ git branch
* master
  develop

```
CSSファイルを<head>内ではなく</body>直前で読み込む

Webページの表示は少しでも高速化させたいですね。
そのために我々はいろいろな方法を使いミリ秒単位の短縮化を頑張るわけですが、そのテクニックの一つをメモします。
Webサイト表示高速化の一つの方法として、レンダリングをブロックさせるCSSとJavaScriptをHTMLの`<head></head>`内ではなく`</body>`タグの直前に読み込ませるというものがあります。
JSは普通に`</body>`タグの直前に書けばいいのですが、~~CSSは残念ながら`<head>~</head>`の中にしか書けません。~~
<ins>HTMLの仕様が変わって書けるようになったそうです！教えてくれたmyakuraさんありがとうございます。コメント欄参照
</ins>
それでもどうしてもCSSも`</body>`タグの直前に書きたいという場合はJSを利用し以下のように書くことが出来ます。

```html:html
<head>
...
</head>
<body>
...
<script type="text/javascript">
  var link = document.createElement('link');
  link.href = 'pathto/css/style.css';
  link.rel = 'stylesheet';
  link.type = 'text/css';
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(link);
</script>
</body>
```

ファーストビューに関わるCSSだけを`<style>`タグを使ってインライン化した上で、このテクニックを使えば、体感上の速度は結構向上するのではないでしょうか。

## 2019年8月9日追記
レンダリングブロックを発生させずにCSSを読み込むならこの方法が簡単で良いですね。ってかこれすげえハックだわ→ [CSSを非同期ロードする最も簡単な方法 - Qiita](https://qiita.com/rana_kualu/items/95a7adf8420ea2b9f657)
SI向けJava EE vs Spring

# 前提とかきっかけ

Java EE7とSpring。
今のプロジェクトでどちらを採用するか決めないといけないので比較してみた。

一応、SIやる前提です。
ツッコミは歓迎。

# 比較対象

Java EEアプリケーション・サーバーはWebLogicあたりを買うと思ってください。

+ Java EEアプリケーション・サーバー（Java EE）
+ Payaraマイクロ（Payara）
+ Springboot(Spring)

# 比較観点

### インターフェース

使いそうなものだけピックアップ。
素のサーブレットやJSPは・・・今更ないよね？
Springも多分JSFは使えるとは思うけど、今の[プロジェクト一覧](https://spring.io/projects)になかったので×。

|項目| Java EE | Payara | Spring |
|:---------:|:--------------:|:---------------:|:----------:|
|REST|○(JAX-RS)|○(JAX-RS)|○(Spring MVC)|
|JMS|○(JMS)|○(JMS)|○(Spring)|
|AMQP|×|×|○(Spring AMQP)|
|Action-Base-MVC|×|×|○(Spring MVC)|
|Component-Base-MVC|○(JSF)|○(JSF)|×？|

### 永続化

RDBはJPA(Hybanate)をともにサポート。
Java EEはKVSをサポートしてない。

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|RDB|○(JPA)|○(JPA)|○(JPA)|
|Cassandra等のKVS|×|×|○(Spring Data)|

### キャッシュ

PayaraはHazelcastをサポート。  
Springもキャッシュをサポートしてる。

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|キャッシュAPI|×|△(JCache)|○(Sring Integration)?|

### アーキテクチャ

Java EEの場合、マイクロサービスアーキテクチャはサービスディスカバリーとかを自分で用意する必要があるのでちょっとつらいか。
Springの場合もNetflixOSS使う前提でもあるのでフェアじゃない？

モノリシックだったらJava EEが安定すると思う。
（でも、JSFは・・・うん、まぁ）

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|モノリシック|○|○|○|
|マイクロサービス|×|△|○|

### SNS連携

Java EEの場合はTwitter4Jとかを使おう。


|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|Twitter|×|×|○(Spring Social)|
|Facebook|×|×|○(Spring Social)|

### クラウド対応

IaaSは割愛。
Java EEのPaaSはOracleCloudのようにアプリケーション・サーバーの提供元＝サービス提供元だといい感じ。
コンテナはGlassfishがDocker対応したらしいけど、サポートがない時点でちょっとなーという感じ。

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|オンプレミス|○|○|○|
|IaaS|○|○|○|
|PaaS|○|○|○|
|コンテナ|△|△|○|

### ユニットテスト(Integration)

Java EEの場合はarquillianを使う必要がある。
アプリケーション・サーバーによっては対応してなかったり煩雑だったりする。

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|モノリシック|△|△|○(SpringJUnit4ClassRunner)|

### サポート

どのアーキテクチャもどこかでサポートは受けられる。

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|サポート|○|○|○|

### 後方互換性

Java EEはRemoteEJBやJSP辺りを使ってるとそのうち標準機能から外れるかも。
Springはよくわからない・・・。

|項目| Java EE | Payara | Spring |
|:---------:|:----------:|:----------:|:----------:|
|サポート|△|△|○？|


## まとめ

まとめというほどではないですけど。

### オンプレミス

+ サポートを受ける前提なら、プロジェクトメンバーの好みや特性で選べばいい
  + サポートを受ける予算がない場合、Glassfish4.Xを使うのは危険。Payaraを使ったほうがいいかも。
+ Java EEの場合、癖が強いJSFがネックになるかも
  + StrutsやSeasar経験者的には中々なじめないかもしれない
+ RDBMS以外を使うならSpringの方がいい
  + オンプレミスじゃああまりないと思うけど・・・

### クラウド

+ Springにアドバンテージ
  + PaaS親和性
  + RDBMS以外との接続
+ 設計・実装していく過程でマイクロサービス化していく可能性があるならSpring一択
AWRに格納された過去のSQL監視結果をレポートする

SQL MonitorはSQL性能を分析するのに欠かせない機能で、SQLが流れたそばから、なんなら流れている最中からでも待機イベントやカーディナリティ、パラレルクエリの処理の偏り具合などがわかる超便利機能ですが、監視データがメモリ上の循環バッファにあるため一定数以上たまると古いものから消えてしまい、DB再起動ですべて消えてしまうのがOracle Database 11gの頃の難点でした。
 
Oracle Database 12cでは、意外と知られていないようなのですが、SQL Monitorの監視データもAWRに格納されるようになっています。つまり履歴がディスクに残ります。すべての結果が必ずしも残るわけではありませんが、過去のSQL性能トラブルを分析する際にとても便利で、筆者自身もある障害対応で、「とあるSQL文が過去数日間のあいだ、どれくらいの頻度で実行されていたか」を特定するのに成功しました。

以下は、調べたいSQLのSQL_IDがわかってる場合の例

```sql
SQL> select report_id, GENERATION_TIME, key1 from dba_hist_reports where component_name='sqlmonitor' and key1='5j5wp4d5s9pqz';


 REPORT_ID GENERATION_TIME     KEY1
---------- ------------------- --------------------
       382 2015-07-01 02:51:59 5j5wp4d5s9pqz
       531 2015-07-01 10:51:33 5j5wp4d5s9pqz
       
       
SQL> select dbms_auto_report.report_repository_detail(382, 'TEXT') report from dual;

REPORT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Monitoring Report
：
：
：
```

なお、SQL MonitorはTuning Packの機能です。
WPFのある生活（１日目）

# まずはコードを眺める
今現在、運用の仕事をしており、C#やらjavascriptやらのナウいプログラミングとは無縁の生活を送ってます。

最近ムラムラとしたプログラミング欲が、ムクムクと頭をもたげ私を襲うので、コードを眺めて欲情を抑えたいと思います。

職場はネット禁止のため、休憩時間にスマホで自分を慰めます。

# VisualStudioが作ってくれたコード

## xaml
```xml:App.xaml

<Application x:Class="WpfSample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfSample"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

```
```xml:MainWindow.xaml

<Window x:Class="WpfSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <! ここに書く ->
    </Grid>
</Window>

```

## コードビハインド（？）
```csharp:App.xaml.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace WpfSample
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
    }
}

```
```csharp:MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

```
Objective-Cでletやvarで宣言してみる(Xcode8以上)

Xcode8 beta上でマクロを使って`let`や`var`を宣言することで、Swiftのように(primitiveな値のみ)変数を宣言することができる。

```objc
#define let __auto_type const
#define var __auto_type

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    let immutableValue = 100.0f;
    var mutableValue = 10.0f;
    
    NSLog(@"%@", @(immutableValue));
    NSLog(@"%@", @(mutableValue));

    let *view = [UIView new]; // objectなので値が変更できてしまう
}
```
NURO光の接続不良トラブル(解決？）

速度と価格につられてNURO光を契約してデベロッパとしては致命的なdeveloper.apple.comやiTunes Connectへの接続不良に悩まされてきた渡しですが、突如トラブルが解消されました。それはまさにWWDC開幕の6月14日です。どうやらAppleのサーバーになんらかの改善がなされたようです。
これまでの接続不良が嘘のようにストレスなしに接続できるようになりました。
iTunes のアプリのアップデートや購入もスムーズになりました。
一体何だったのでしょう。
PowerShellからGoogle Cloud Vision APIを使う

#はじめに
* PowerShellからGoogle Cloud Vision APIを使ってみました。
* Windowsユーザならすぐにこのスクリプトを試すことができます。
* Cloud Vision APIを利用するための手順は他の方が投稿している記事を参考にしてください。

意外と簡単に最先端の技術を体験することができますよ！

#####PowerShell スクリプト
---
``` 
# 引数に解析する画像のパス名と解析typeを指定します
param (
	[parameter (mandatory)]
	[string]$path,
	[string]$request_type = "LABEL_DETECTION"
)
# 認証用APIキー（取得したAPIキーを設定してください）
$value = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

$EndPoint = "https://vision.googleapis.com/v1/images:annotate?key=" + $value

# 画像ファイルをBase64文字列に変換する
$b64str = [convert]::ToBase64String(( get-content $path -Raw -encoding byte ))

# JSONリクエスト文字列
# 解析する画像のBase64文字列と引数で指定したTypeをセットしています
$body = @"
{
    "requests": [
        {
            "image": {
                "content": "$b64str"
            },
            "features": [
                {
                    "type": "$request_type",
                    "maxResults": 1
                }
            ]
        }
    ]
}
"@

# リクエストを投げて結果のJSON文字列表示する
Invoke-WebRequest -Uri $EndPoint -Method Post -Body $body -ContentType 'application/json' | select -ExpandProperty Content

``` 
---
RestAPIからJSONを取得するコマンドレットに関しては以下サイトを参考にしました。
tech.guitarrapc.com
http://tech.guitarrapc.com/entry/2013/03/04/210313
【読書】独習Java メモっぽいレポート　一枚目

今日は、まず第一章から

#第一章：Java基礎

1.1 背景

Javaは元々コンピュータで扱う言語とばかり思っている方が多いだろうが、元々は
家電製品をメインに扱っていた言語である。



1.2　バイトコードとJVM


(swift llvmで検索してみてください)
JavaではJVMというのでプログラムを実行しているらしい。(※swiftでいうllvmに近い)
書いたコードはバイトコードというものに変えられて（バイトコード：CPUに依存しない命令）で
実行されている。



1.3 アプリケーションとアプレット

アプレットは実行する際にWebブラウザを介する必要がある。
アプレットは一般的にサーバーから自分たちが使っているマシンへダウンロードされる。



1.4 クラスとオブジェクト

オブジェクトは状態と動作の両方を持っている。
動作は一連のメソッドと実行されるロジックによって成り立つ。
クラスはオブジェクトのテンプレートでありその鋳型（インスタンス）から生成することをインスタンス化という。



1.5 オブジェクト指向プログラミング３原則

「カプセル化」
データとデータを操作するコードと関連づけることらしく
イメージ的にはデータの周りにぐるぐるとコードが巻かれている状態。
セキュリティ面からしても安全（貴重なデータにアクセス）に
データへのアクセスを同期化することができる。

「継承」
スーパークラス（親）を継承しサブクラスを拡張する。
親が持っている能力を子へ受け継ぎその子にはそこから新たな能力をつけさせるというイメージ。

「ポリモーフィズム」
上記の継承というものが行われた時に引き継いだ入れ物は一緒だが中身を新しいものに置き換える（オーバーライド）
というイメージで物は新しく置き換えたが名前はそのままでその同じ名前の物が違う動きをすることを指す。



1.6　変数と代入
変数というものは何から値を格納することができる。

```java

1.
class hogehoge{
  int num
2.
  public void hogee(){
   int sum
  }
}
```

(1).のように定義されているのは他の言語でいえばグローバルな変数。

(2).のように定義されているのはローカルな変数。

```
int num = 514;
```
宣言と同時に値を設定しておくのが定数

1.7 文字列とキャラクタ


文字列の初期化

```java
String = "hoge"
```
二重引用符が埋め込まれた状態での文字列の出力

```java
String str = "\"hoge: how are you?\"";
```



1.8 算術演算子と式

変数への代入

```java
int num

num = 100 * 3
```
演算しながらでも可能である。

*./.%の演算子は+や-よりも優先順位度が高く設定されている。
（）をつけた場合は括弧を付けた箇所の方が優先順位が高くなる。
式の中では、空白や改行などが行える。

また、``` num = num + 114```は```num += 114 ```とも書ける。



1.9 式中の型変換

```java
char c;

int num;

float fl;

double dbl;
```
と、変数があった場合以下の式を書くと

```
dbl = c * num / fl;
```
Javaでは変換規則というものの元で整数拡張というものが行われる。
Javaは内部的にもっとっも大きな型に合わせて変換するというものを持っている。

基準としてはdouble型かfloat型か、それでもなかったらlong型か、
どれにも該当しないのであれば両方をintとして置き換えるようになっている。



1.10 代入での型変換

```java
byte b;

int num;
```
という変数がありbという変数にnumを入れるとエラーになる。
これを解決するのに型変換を扱い、これを縮小変換という。

```java
b = (byte)num
```
また、これをfloat型やdouble型でint型に入れると小数点が切り捨てられる。



1.11 コメント

```
//これはこんな時に使う
```
コメントもただコメントを書くのではなく、それぞれに意味があって書かれる。

先頭に```//```とつけるのを単一なコメント単一行コメントという。

```/* */```

スラッシュとアスタリスクで囲まれているコメントは

複数行コメントといい```/** ```では始まり

```
/*
*hogehoge
*/
```
というようになるコメントをドキュメンテーションコメントといい、このドキュメンテーションコメント
に関してはjavaDocというツールを使うときに必要になる。



1.12 一次元配列

```
String str[];
```
というように宣言ができ

```
| str[0]|
| str[1]|
| str[2]|
| str[3]|
| str[4]|
| str[5]|
| str[6]|
| str[7]|
| str[8]|
| str[9]|
```

上記のように ```String str[]``` の中に順番に入れられる。

また、

```java
String str[] = {ⅡDXRED, HappySky}
```
というように宣言と同時に中身を決めることができ、
これを配列初期化子を使用するという。
要素の数は```配列名.length ```で取得できる。



1.13 多次元配列


```java
int num[3][3];

float pos [5][5][5];
```
という形で宣言されているもののことを多次元配列という。
イメージとしては
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/84002/63183a0d-b756-4ac2-e2ec-4e0cc0f26a32.png)
この画像のように格納されている。
３次元はこの画像にある四角に奥行きが追加されたものと考える。

今日はここまで。
render :json したときのTypeError: nil is not a symbol


なぜか、以下のような形でrender :jsonしたときにTypeError: nil is not a symbol時の対処について。

```ruby
respond_to do |format|
    format.html
    format.json {render :json => result}
end
```

tableを作成したときに複合主キーを設定していてかつ、
model側で、複合主キーの設定が抜けていた場合に発生する可能性がありそう?

composite_primary_keysというgemを利用して、
modelファイルに複合主キーの設定を追記してあげることで解消しました。

手順
1.Gemfileにgem 'composite_primary_keys'を追加しbundle install
2.modelファイルに以下のような記載と追加

```ruby
   # 主キー設定
  self.primary_keys = :column_a, :column_b
```

ちなみに複合主キーをtable側に指定するMigrationファイルは以下のような感じです。

```ruby
class CreateTables < ActiveRecord::Migration
  def change
    create_table :tables, id: false do |t|
      t.string :column_a
      t.string :column_b
    end
    add_index :tables, [:column_a, :column_b], unique: true, name: 'index_name'
  end
end
```

エラー自体は解消されたんですが、理屈がさっぱりです。。。
Macのターミナル上でディレクトリ移動が楽になるzshコマンド

Macのターミナル上で前のディレクトリに戻るためには下記のようにコマンドを入力する必要があります。

```bash
$ cd ../../../
```

この入力方法は戻るディレクトリの数を数える必要もあり、かなりストレスが溜まります。

そんな悩めるディレクトリ移動を楽にしてくれるzshコマンドがあります。
それが`bd`コマンドです。

`bd`コマンドを利用すると以下のように、ディレクトリ名を指定するだけで一発で目的のディレクトリに戻ることが出来るようになります。

[Tarrasch/zsh-bd](https://github.com/Tarrasch/zsh-bd)

![animation.gif](https://qiita-image-store.s3.amazonaws.com/0/54838/4a8c8dfd-7a6e-af13-bfbe-bf0d2d202c5b.gif)

## antigenのインストール
bdコマンドをインストールするために、zshのプラグインマネージャー[antigen](https://github.com/zsh-users/antigen)を利用します。
（「antigenのインストールなんて面倒だ！」という人は、ここを読み飛ばして下記にある**antigenを利用しない場合のインストール方法**を参照してください。）

antigenのインストールはgitリポジトリをクローンするだけです。

```
$ git clone https://github.com/zsh-users/antigen.git ~/.zsh/antigen/
```

### .zshrcの設定
参考にさせて頂いた[ブログの記事](http://blog.glidenote.com/blog/2012/10/25/antigen/)のやり方が非常にスマートだったのでそちらに従って設定を記述していきます。
antigenの設定を他のファイルに分離するために`.zshrc`にはantigenの設定ファイルの読み込みだけを記述します。

```
# antigenの設定ファイルを読み込む
source ~/.zshrc.antigen
```

### antigenの設定
antigenの設定は`~/.zshrc.antigen`という設定ファイルを作成し、そこに記述するようにします。  

```
$ touch ~/.zshrc.antigen
```

公式のREADME.mdに書かれている設定の例を基に設定ファイルを記述した例です。

```
# antigen.zshの読み込み
source ~/.zsh/antigen/antigen.zsh

# Load the oh-my-zsh's library.
antigen use oh-my-zsh

# oh-my-zsh上にあるプラグインのインストール 
# Bundles from the default repo (robbyrussell's oh-my-zsh).
antigen bundle git
antigen bundle heroku
antigen bundle pip
antigen bundle lein
antigen bundle command-not-found

# oh-my-zsh以外のzshプラグインのインストール
# Syntax highlighting bundle.
antigen bundle zsh-users/zsh-syntax-highlighting

# Load the theme.
antigen theme robbyrussell

# Tell antigen that you're done.
antigen apply
```

## bdコマンドのインストール
上記で作成した`~/.zshrc.antigen`を以下のように記述します。

```
# antigen.zshの読み込み
source ~/.zsh/antigen/antigen.zsh

# zsh-bdのインストール
antigen bundle Tarrasch/zsh-bd
```

ターミナルを再起動するか、以下のコマンドで`zsh-bd`がインストールされます。

```
$ source ~/.zshrc
```

## antigenを利用しない場合のインストール方法
ターミナル上で以下のコマンドを実行して、ターミナルを再起動するか`~/.zshrc`を読み込みます。

```
$ mkdir -p $HOME/.zsh/plugins/bd
$ curl https://raw.githubusercontent.com/Tarrasch/zsh-bd/master/bd.zsh > $HOME/.zsh/plugins/bd/bd.zsh
$ print -- "\n# zsh-bd\n. \$HOME/.zsh/plugins/bd/bd.zsh" >> $HOME/.zshrc
```

## 参考
zshのプラグインマネージャーantigenでoh-my-zshの良いとこ取りをする
http://blog.glidenote.com/blog/2012/10/25/antigen/
【Xcode】Xcode8を1日使ってみた

[元ブログ 【Xcode】Xcode8を1日使ってみた - 技術は熱いうちに打て！](http://blog.dalt.me/1273)

久しぶりのブログとなってしまいましたが、Xcode8が今日公開されたので使ってみました。

その所感をまとめたいなと思います。

## 見た目

![](http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット-2016-06-14-22.05.58-632x387.png)

インターフェース的には何も大きくは変わっていなさそうです。
以前Appleが発表していた新フォントSan Fransiscoが採用されているようです。

コードを書くのにこれはちょっと見づらいような...？

また、現在選択されている行がハイライトされる様になっていました。

## Interface Builder

<a href="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット-2016-06-14-21.28.47.png"><img src="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット-2016-06-14-21.28.47-632x109.png" alt="スクリーンショット 2016-06-14 21.28.47" width="632" height="109" class="alignleft size-medium wp-image-1281" float="left"/></a><br clear="both">

普段、Interface Builderを使って開発しないのであまり詳しいことは書けませんが、
Auto Layoutの確認が
**w:Any h:Any**
の様な選び方から
端末単位で確認出来る様になりました。

より直感的になりましたね。

## 設定項目

Display Name等の設定位置が変更になっているようです。

### Display Name

<a href="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット_2016-06-14_22_03_33.png"><img src="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット_2016-06-14_22_03_33-632x149.png" alt="スクリーンショット_2016-06-14_22_03_33" width="632" height="149" class="alignleft size-medium wp-image-1279" float="left"/></a><br clear="both">

ターゲットのGeneralタブから変更出来る様になりました。

### Provisioning Profile(Deprecated)?

<a href="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット-2016-06-14-22.13.18.png"><img src="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット-2016-06-14-22.13.18-632x165.png" alt="スクリーンショット 2016-06-14 22.13.18" width="632" height="165" class="alignleft size-medium wp-image-1285" float="left"/></a><br clear="both">

今までのプロビジョニングファイルの設定がdeprecatedになっています。
なので、今までの設定でビルドすると下記のエラーが出ました。

### XXX(Target名) requires a provisioning profile. Select a provisioning profile in the Target Editor.

こんなエラーが出ました。

さて、これの解決方法ですがこれからプロビジョニングは
TargetのGeneralタブから設定しましょう。

<a href="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット_2016-06-14_21_40_19-1.png"><img src="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット_2016-06-14_21_40_19-1-632x497.png" alt="スクリーンショット_2016-06-14_21_40_19" width="632" height="497" class="alignleft size-medium wp-image-1277" float="left"/></a><br clear="both">

選択可能なプロビジョニングファイルがあればプルダウンが表示され、なければ赤枠下部のようにエラーが出ます。

また、
**Automatically manage signing**オプションにチェックを付けるとこれら設定項目が消えます。

XCodeがプロビジョニングファイルや証明書を自動作成/更新してくれるらしいですね。(そのまま笑

<a href="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット_2016-06-14_21_58_00.png"><img src="http://blog.dalt.me/wp-content/uploads/2016/06/スクリーンショット_2016-06-14_21_58_00-632x554.png" alt="スクリーンショット_2016-06-14_21_58_00" width="632" height="554" class="alignleft size-medium wp-image-1278" float="left"/></a><br clear="both">

まだ、1日しか触れていないので多くのことは書けませんでしたが、拡張機能が簡単に作れたりランタイムでスレッドの状態やビューのヒエラルキが確認出来る様ですね。

その辺もどんどん触っていければなと思います。

誰かのお役に立てば。
pythonでスクレイピングしてみる

### あるサイトを解析して特定のリンクにアクセスしてみる



```scrape.py
# -*- coding: utf-8 -*-

import lxml.html # 解析
import requests  # httpアクセス

# yahooニュースページのサイドにあるアクセスランキング記事一覧を取得
dom = lxml.html.parse('http://news.yahoo.co.jp/pickup/6203320')
linkList = dom.xpath("//div[@class='subMod subRanking'][position()=1]/ol/li/a")

# 1位のURLを取得
url = linkList[0].xpath("@href")

# アクセスしてレスポンスコード確認
res = requests.get(url[0])
print(res.statu_code)
```

このコードを実行すると、`200`が表示されます
無事にアクセスが成功していることがわかります


ちなみに以下で取得したページのhtmlが確認できます
`res.text`
Rails + Turbolinksの環境でGoogle Chartを使う

綺麗で操作性も良いグラフをすんなり出せる[Google Charts](https://developers.google.com/chart/)ですが、Railsから使おうとしたところTurbolinksまわりで少し面倒なことになってしまいました。

# Google Chartsを使うための2手順
機能が多いこともあってか、Google Chartsのロードは2段階となっています。

* `<script>`要素で`https://www.gstatic.com/charts/loader.js`を読み込んでおく
* `google.charts.load()`を呼んで、必要な種類のグラフライブラリをロードする

ここで1つ厄介なことに、現バージョンでは`google.charts.load()`はページロードごとに**一度しか呼べません**。Turbolinksの環境下では、Turbolinksでの遷移が続く範囲内で一度、ということになってしまいます。

# ローダーの読み込み方はどうする？

まず1つ目の`https://www.gstatic.com/charts/loader.js`ですが、読み込み方は2通り考えられます。

* `<script data-turbolinks-track="true">`の形で`<head>`から読み込んでしまう
* 必要に応じて`<script>`要素を動的に生成して読み込む

多くのページ、あるいはよくアクセスするページでGoogle Chartsを使う場合には、前者のように全体で読み込んでおいたほうがいいでしょう。後述の理由で専用のローダーが必要となるので、後者のように必要に応じて読み込むのもありですが、すでに読み込まれているときはバイパスが必要です。

# 二度呼び禁止！

そして、次は一度しか呼べない`google.charts.load()`ですが、こちらについてはアプリケーション内で使うチャートの種類をすべて集めて、ラッパー関数を作ってロードさせた方がいいでしょう。

```js:app/assets/application/chart_loader.js
(function(){
  var loaded = false;
  window.loadGoogleChart = function(){
    if(loaded) return;
    loaded = true;
    google.charts.load('current', {packages: ['corechart', 'bar'], language: 'ja'});
  };
})();
```

これで`window.loadGoogleChart()`を呼べば、以前にロードされていない時だけロードされるようになります。なお、上で全体に対して`loader.js`を読み込んでいる場面であれば、常に`google.charts.setOnLoadCallback()`を使えるのですが、`loader.js`も動的ロードにする場合にはこの関数が存在しない可能性があるので、そこも1工夫が必要となります。
【AWS】VPC内でPrivate DNSによる名前解決

#《課題》
VPC内でのみ名前解決をできるようにRoute 53でPrivate DNSを設定する

・Private DNSに以下の設定をする
sub.example.com A xxx.xxx.xxx.xxx


#《前提条件》
・AWSの構成
VPCにEC2インスタンスが一つ


#《手順》
##▼Route 53の設定
###・Hosted zonesの作成
プライベートホストゾーンを作成して対象のVPCに関連付ける
>####1. サイドメニュー[Hosted zones]をクリックし、[Create Hosted Zone]ボタンをクリック
####2. Hosted zonesの情報を入力し、[Create]ボタンをクリック
    Domain Name : example.com
    Comment     : 任意のコメント
    Type        : Private Hosted Zone for Amazon VPC
    VPC ID      : 対象のVPC    
NSレコードとSOAレコードが登録されたHosted zonesが作成される
####3. [Create Record Set]ボタンをクリック
####4. Record 情報を入力し、[Create]ボタンをクリック
    Name           : sub.example.com.
    Type           : A – IPv4 address
    Alias          : No
    TTL (Seconds)  : 300
    Value          : xxx.xxx.xxx.xxx（対象IPアドレス）
    Routing Policy : simple
Routing Policyで様々のルールでのルーティングが可能。simpleは通常のDNS。
詳細は「[ルーティングポリシーの選択](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy.html)」を参照

##▼VPCの設定
###・Private Hosted Zoneを利用できる様に設定
参照：[Amazon Route 53 - プライベートホストゾーンの使用]
(http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zones-private.html)
>####1. サイドメニュー[VPC]をクリックし、対象のVPCを選択
####2. [アクション]-[DNS 解決の編集]をクリックし、設定変更し[保存]ボタンをクリック
    DNS解決 : はい
    ※enableDnsHostnamesをtrue
####3. [アクション]-[DNS ホスト名の編集]をクリックし、設定変更し[保存]ボタンをクリック
    DNS ホスト名の編集 : はい
    ※enableDnsSupportをtrue

##▼名前解決の確認
VPCに属するEC2インスタンスからnslookupの実行
>```bash:設定前
$ nslookup sub.example.com
Server:         10.0.0.2
Address:        10.0.0.2#53
>
** server can't find sub.example.com: NXDOMAIN
```
>
```bash:設定後
$ nslookup sub.example.com
Server:         10.0.0.2
Address:        10.0.0.2#53
>
Non-authoritative answer:
Name:   sub.example.com
Address: xxx.xxx.xxx.xxx
```
正しく設定したIPアドレスが返ってくればOK
自分用rubyメモ 多重代入について(随時追記)

# 多重代入で色々やってみる

```rb:multiple_assignment.rb
a,b,c = 1,2  # cにはnilが入る!
p [a,b,c]

a,b,c = 1,2,3,4  # *を付けていないので4は溢れる
p [a,b,c]

a,b,*c = 1,2,3,4  # cには余った数値が配列になって代入される!
p [a,b,c]

a,*b,c = 1,2,3,4  # bに余った数値が(以下同文)!
p [a,b,c]

a,b = 0,1
a,b = b,a  # 交換処理!
p [a,b]

ary = [1,[2,3],4]
a,b,c = ary
print a,b,c
puts

a,(b1,b2),c = ary
print [a,b1,b2,c]
```

```:result
[1, 2, nil]
[1, 2, 3]
[1, 2, [3, 4]]
[1, [2, 3], 4]
[1, 0]
1[2, 3]4
[1, 2, 3, 4]
```

# 結論
* **交換処理**に``w``や``tmp``を使わないなんて…
* 変数に``*``を付けるとその変数は余った数値を**配列**として全部貰ってくる!
solidusでの実行環境を整えてみる

プロジェクト参画時の環境構築でちょっと手間取ったので纏めてみる
## 環境
  * Mac OS X El Capitan (10.11.5)
  * PostgreSQL 9.4.1

 
## rubyのバージョン管理
  * rbenvを入れ、対象バージョンのrubyをinstall 

```
$ brew install rbenv
$ rbenv install 2.2.4
```
  * .bash_profileに環境設定を入れる
  
```
$ vim ~/.bash_profile

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

$ source ~/.bash_profile
```

  * rubyのバージョンを変更

```
$ rbenv global 2.2.4
$ rbenv rehash
```

  * bundlerのinstall

```
$ gem install bundler
```

  * プロジェクトの直下でbundle installを実施する。

```
$ bundle install
```

## bundle install時のエラー対処
  * libv8
    - therubyracerと依存関係があるため、先にtherubyracerをinstallしたほうが良い

```
$ gem install therubyracer -v '0.12.2' -- --with-v8-dir
$ sudo gem install libv8 -v '3.16.14.13' -- --with-system-v8
```

  * rmagick
    * imagemagickが必要
    * pkg-configがすでにインストール済みの場合、再installする。

```
$ brew install imagemagick
$ brew install pkg-config
```

  * 再度bundle install
  * postgresを起動してDBを作成してサーバ起動

```
$ postgres -D /usr/local/var/postgres
$ rake db:create
$ rake db:migrate
$ rails s
```

### 参考
[rbenvでRubyの切り替えあるある](http://qiita.com/vnc/items/f87d91ed6c4769dd1809)
[OS X El Capitanでlibv8 / therubyracerのbundle installに失敗する問題の解決方法](http://qiita.com/ganta/items/53f616b48e94d989952f)
[Mac OS X環境にrmagickをインストールする決定版](http://qiita.com/yokozawa/items/937375aab0dd6d6ff334)
【Docker】docker-apiでexecする

[docker-api](https://github.com/swipely/docker-api)でexecするまでの手順

# 1. login
```
Docker.authenticate!('username' => 'xxx', 'password' => 'yyy', 'serveraddress' => 'zzz')
```
`Docker.authenticate!`にユーザー名、パスワード、サーバアドレスを渡してログインします。

# 2. create
```
container = Docker::Container.create(
      'Image' => '[イメージ名]',
      'name' => '[コンテナ名]',   # コンテナ名はNameではなくname
      'Env'=> [ 'HOGE=fuga', 'PIYO=bar'],
      'HostConfig' => { 'Privileged' => true },
      'Cmd': [ '[コマンド]' ]
    )
```
コンテナを作成します。
オプションを[Remote Apiのdocument](https://docs.docker.com/engine/reference/api/docker_remote_api_v1.23/#create-a-container)を見ながら指定していきます。

# 3. start
```
container.start
```

# 3. exec
```
container.exec(['whoami'], :tty => true) { |stream, chunk|
  puts "#{stream}" # => root
}
```
execでコマンドを実行します。ブロックを渡すと出力が受け取れるようです。
待望のAndroid6.0のSDカード内部ストレージ化、意味なかったorz

ただの愚痴です。

でも報告です。

# 材料
- Xperia Z2 Tablet(32GB)
- 64GB micro SDカード


# 夢
- 32GB + 64GBで1500冊を超える漫画と本を常に持ち歩く
- Amazon Primeの映画も入れちゃうべ！

# 手順
1. Z2Tを自力でOSアップデート
2. コマンド操作して、内部ストレージ化機能をあける
    * ref. [Android 6.0 MarshmallowなXperia Z5シリーズでSDカードを内部ストレージとして使用する方法](http://decoy284.net/2016/03/12/android-6-xperia-z5-sdcard-internal-storage/)

# 現実
![Screenshot_20160614-203256.png](https://qiita-image-store.s3.amazonaws.com/0/71510/cf60f3c8-52bc-7858-90b0-405897119b49.png)

![Screenshot_20160614-203226.png](https://qiita-image-store.s3.amazonaws.com/0/71510/f50e9684-e15e-bc09-7f59-0e94979bcd1a.png)

![Screenshot_20160614-203247.png](https://qiita-image-store.s3.amazonaws.com/0/71510/bfa30362-783f-3fe8-afe7-6ffa2067c5eb.png)

この通知に出ている◎!が、ストレージ上限警告です。
本当に32GBきっちりまでデータが入っていて、スクリーンショットも取れなかったので少し減らしました。


# 結果。

結局、器が大きくなっても、収められる量は一緒だった…


どこか間違えたのだろうか…
教えてエロいひと！
async/awaitをclass構文と合わせて使う

```js
class Human {
  constructor(name) {
    this.name = name;
  }
  async sayHello() {
    return await this.asyncReturnSomething(`Hello! I'm ${this.name}!`)
  }
  asyncReturnSomething(something) {
    return new Promise((resolve, reject)=> {
        setTimeout(()=> {
            resolve(something);
        }, 1000);
    });
  }
}

(async ()=> {
  const greeting = await new Human('John').sayHello();
  console.log(greeting);
  console.log('Done!');
})();
```
=> 1000ms後に
`Hello! I'm John!`
さらにその後に
`Done!`

`await`は`async`で修飾された関数内でしか使えない模様です。
上の例からは`class`のメソッド自体に`async`をつけることが可能だとわかる。
[playground](https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Cstage-0&experimental=false&loose=false&spec=false&code=class%20Human%20%7B%0A%20%20constructor(name)%20%7B%0A%20%20%20%20this.name%20%3D%20name%3B%0A%20%20%7D%0A%20%20async%20sayHello()%20%7B%0A%20%20%20%20return%20await%20this.asyncReturnSomething(%60Hello!%20I'm%20%24%7Bthis.name%7D!%60)%0A%20%20%7D%0A%20%20asyncReturnSomething(something)%20%7B%0A%20%20%20%20return%20new%20Promise((resolve%2C%20reject)%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20setTimeout(()%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20resolve(something)%3B%0A%20%20%20%20%20%20%20%20%7D%2C%201000)%3B%0A%20%20%20%20%7D)%3B%0A%20%20%7D%0A%7D%0A%0A(async%20()%3D%3E%20%7B%0A%20%20const%20greeting%20%3D%20await%20new%20Human('John').sayHello()%3B%0A%20%20console.log(greeting)%3B%0A%20%20console.log('Done!')%3B%0A%7D)()%3B%0A)
"リトライ"の実装: Truncated Binary Exponential Backoff

**exponential backoff** はシステムが許容可能な速度を見つけるために各処理の実行速度を遅延させるためのアルゴリズムです。簡単に言えば最適なリトライ ─ 例えば通信が切断された時に自動で再接続するまでの遅延時間を計算する方法のこと。exponential backoff は連続失敗回数を $n$ とした時に $0$ から $x^{n-1}$ までの間の乱数を使用する。

よく使われているアルゴリズムは $2$ のべき乗で計算する *binary exponential backoff* というもの。

$t = a \times 2^{n-1}$

$t$, $a$ を秒とした場合、1回目のリトライは $0～a$[sec]、2回目のリトライは $0～2a$[sec]、3回目のリトライは $0～4a$[sec]、... の間のランダムに選んだ時間をおく。

ただこの式だけでは $t$ がすぐに膨大な値になってしまうことが容易に想像がつくだろう。値がオーバーフローしたり、ネットワークが復旧したにも関わらずリトライが数ヶ月後に設定されていては自動復旧を実装する意味がないので $n$ に上限を与えて遅延時間がある一定値以上とならない条件を追加します。　

$n' = \min(n, N)$
$t = a \times 2^{n'-1}$
$T = a \times 2^{N-1}$

これを *truncated binary exponential backoff* と呼び、まぁここらへんが実用的な実装方針です。上限 $N$ と最大遅延時間 $T$ が決まれば $a$ を求めるのは簡単。

$a = \frac{T}{2^{N-1}}$

例えば「10回連続で失敗したら一時的・瞬間的な問題ではないためそれ以上は遅延を増加させない」「復旧後は10秒以内に再接続を実行する」と要件設定するのであれば $N=10$, $T=10$ から $a = 0.0195$[sec] で実装すれば良いことが分かります。

## サンプルコード

Scala です。処理をブロックしても全体に影響が出ない Single Thread アプリであれば単純にループや再帰と  `sleep()` を使用して再試行を実装すればよい。ここでシフト演算子が行っている `1 << (n-1)` は $2^{n-1}$ と等価だが `Int` 幅の制約のため `n=32` を超える場合は `Long` にするか `math.pow(2, n-1)` に変更する必要がある。

```scala
def retry[T](n:Int = 10, t:Long = 10000)(doSomething: =>T):T = {
  val a = t.toDouble / (1 << (n-1))
  @scala.annotation.tailrec
  def _retry(error:Int):T = try {
    doSomething
  } catch {
    case ex:Throwable => 
      val e = math.min(error+1, n)
      val interval = (a * (1 << (e-1)) * math.random).toInt
      println(f"$e%d: $interval%,d / ${(a * (1 << (e-1))).toInt}%,d")
      Thread.sleep(interval)
      _retry(e)
  }
  _retry(0)
}

// 13回目に成功する処理をリトライするまで実行する
var x:Int = 0
retry(){
  x += 1
  if(x==13) "hello" else throw new Exception()
}
```

サーバサイドなど多くの処理が計算リソースを共有している環境では非同期で実装した方が良いですね、ということで `Timer` と `Future` を使ったサンプル。`timer` スレッドを一つの処理で占有すると他の処理を巻き添えにするので実行スレッドを起動するのみに留めております。

```scala
import java.util.{Timer,TimerTask}
import scala.concurrent.{ExecutionContext,Future,Promise}
import scala.util.Try

val timer = new Timer(true)

def retry[T](n:Int = 10, t:Long = 10000)(doSomething: =>T)(implicit _ctx:ExecutionContext):Future[T] = {
  val a = t.toDouble / (1 << (n-1))
  val promise = Promise[T]()
  def _retry(error:Int):Unit = Future{
    try {
      promise.success(doSomething)
    }catch {
      case ex:Throwable => 
        val e = math.min(error+1, n)
        val interval = (a * (1 << (e-1)) * math.random).toInt
        println(f"$e%d: $interval%,d / ${(a * (1 << (e-1))).toInt}%,d")
        timer.schedule(new TimerTask(){
          def run() = _retry(e)
        }, interval)
    }
  }
  _retry(0)
  promise.future
}

// 13回目に成功する処理をリトライするまで実行する
import scala.concurrent.ExecutionContext.Implicits.global
var x:Int = 0
retry(){
  x += 1
  if(x==13) "hello" else throw new Exception()
}.onSuccess{ case msg => println(msg) }
```

実行すると想定通りにこんなものが表示されます。

```
1: 13 / 19
2: 19 / 39
3: 25 / 78
4: 35 / 156
5: 50 / 312
6: 216 / 625
7: 564 / 1,250
8: 635 / 2,500
9: 4,056 / 5,000
10: 7,238 / 10,000
10: 9,815 / 10,000
10: 6,159 / 10,000
hello
```
Composer のオートロードを自作関数に閉じ込めて使う

```php
// 通常
// require_once __DIR__ . 'path/to/vendor/autoload.php';
my_composer_autoloader();

/**
 * @return Composer\Autoload\ClassLoader
 */
function my_composer_autoloader() {
	static $loader;
	return $loader ?: $loader = require __DIR__ . '/path/to/vendor/autoload.php';
}

// composer.json を記述するほどでは無いクラスなど
$loader = my_composer_autoloader();
$loader->setPsr4( 'MyClass\\', __DIR__ . '/my/class' );
```

https://getcomposer.org/apidoc/master/Composer/Autoload/ClassLoader.html
自分用rubyメモ メソッドについて(随時追記)

# メソッドの使い方や多重代入等
```rb:method.rb
def hello
    p "Hello!"
end

def bye(name)
    p "bye,#{name}!"
end

def get_age
    20
end

def get_multi
    return 10,20
end

hello()
bye("daiki")
p get_age
a,b = get_multi
p a,b
```

```text:result
"Hello!"
"bye,daiki!"
20
10
20
```

# メソッドの分類
以下の3種類がある。

1. インスタンスメソッド
2. クラスメソッド
3. 関数的メソッド

## インスタンスメソッド

インスタンスをレシーバとするメソッド
"10,20,30".**split(",")**

## クラスメソッド

クラスをレシーバとするメソッド
Array.**new**(Array::newという書き方もある)

## 関数的メソッド

レシーバに該当するものが無い(省略されているだけ)メソッド
**print** "Hello!"

# メソッド定義や引数について

```rb:argument.rb
def hello(name="Ruby")   # デフォルト値に"Ruby"を設定しておく
    puts "Hello, #{name}."  # 注:複数の引数を持つ場合は、右端から順にデフォルト値を指定しないとだめ
end

hello()          # 引数を省略
hello("foo")

def three_loop
    for i in 1..3  # 何故かtimesメソッドだとエラーがでた。後日また検証する。
        yield
    end
end

num = 1
three_loop do
    print "#{num} "
    num *= 3
end
puts

def a(a,*b,c)  # 引数の数が不定な場合*を使用。今回は最低2つ引数が必要。
    [a,b,c]
end

p a(1,2,3,4,5)
p a(1,2)

def keyword_hash(a: 0,b: 0, c: 0, **args) # 引数リストに存在しないキーをもつハッシュオブジェクトが**をつけた変数に代入される
    [a,b,c,args]
end

p keyword_hash(a: 1,b: 2, c: 3, z: 4)

hash = {a: 1,b: 2, c: 3}
p keyword_hash(hash)         # ハッシュのキーとメソッドの引数の変数名が一致しているかチェックされる
```
```text:result
Hello, Ruby.
Hello, foo.
1 3 9 
[1, [2, 3, 4], 5]
[1, [], 2]
[1, 2, 3, {:z=>4}]
[1, 2, 3, {}]
```

# 結論
* ``return``が無くても**最後の~~1行~~処理**を戻り値として返す。
* メソッドの戻り値を明示的に``return foo,bar``とし、``foo,bar = メソッド``と呼び出す事で変数foo,barそれぞれに値が入る。
* メソッドはレシーバによって3種類に分けられる。
* キーワード引数を使うと使用可能な**キーを制限**したり、**デフォルト値**を与えたり出来る！