OmniAICreator/Qiita-1.07M huggingface dataset:
QCompleter のサジェスト表示をQTableViewで高速化する

# ひとことで
大量のアイテムが候補になると、`QListView` の表示が遅くなるので、`QCompleter::setPopup(QAbstractItemView*)` で `QTableView` をポップアップに利用する。

## QCompleter を使った素直なサンプルでの性能問題

素直に、QCompleter で 20000 件程度の候補から選択させると、
キー入力で絞り込んだ数が多い時に、QListView の表示がもたついてしまう。

特に最初の１文字だと表示待ち時間が長い。

```cpp
#include <QApplication>
#include <QLineEdit>
#include <QCompleter>

int main(int argc, char **argv) {
    QApplication app(argc, argv);

    QLineEdit *edit = new QLineEdit;

    // サジェストに利用する候補文字列を生成
    QList<QString> candidates;
    for (int i = 0; i < 5000; ++i) {
        candidates << QString("hoge%1").arg(i, 5, 10, QChar('0'))
                   << QString("huga%1").arg(i, 5, 10, QChar('0'))
                   << QString("foga%1").arg(i, 5, 10, QChar('0'))
                   << QString("fuga%1").arg(i, 5, 10, QChar('0'));
    }

    // サジェストを提供する QCompleter を生成する
    QCompleter *comp = new QCompleter(candidates, edit)
    edit->setCompleter(comp);

    edit->show();
    app.exec();
}
```

## 対応策 QListView の代わりに、QTableView を使う

``QCompleter::setPopup(QAbstractItemView*)`` を使うと、候補のポップアップ表示に使うウィジットを設定できる。
`setPopup()` で、`QTableView`をポップアップに設定すると、表示が早くなる。
ただし、単に `new QTableView` したままのビューでは、ヘッダが表示されてしまうので、行ヘッダや列ヘッダを非表示にして、行の高さを調整する。

```cpp
QTableView *popup = new QTableView();
// 列ヘッダを非表示にする。
popup->horizontalHeader()->hide();
// 候補の右側に余計なスペースが表示されないようにストレッチモードを変更
popup->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // Qt4 だと setResizeMode()
// 行ヘッダを非表示にする
popup->verticalHeader()->hide();
// 候補１行の高さを調整
popup->verticalHeader()->setDefaultSectionSize(20);

// 候補のポップアップに QTableView を使う
comp->setPopup(popup);
```

## 実行結果の比較

### デフォルトのポップアップ
まず、デフォルトのポップアップ表示で表示した場合は、以下のようになる。
画像ではわからないが、この表示に数秒を要する。

**図. デフォルトのポップアップで表示した場合の候補表示**
![listview.png](https://qiita-image-store.s3.amazonaws.com/0/16397/2ef89f99-94dc-6854-cb98-583deb3d5369.png)

### ポップアップに QTableView （調整なし）を使用した結果

次に、`QCompleter::setPopup()` でQTableView を指定した場合の表示は、以下のようになる。

**図. QTableView（調整なし） ポップアップで表示した場合の候補表示**
![defaulttableview.png](https://qiita-image-store.s3.amazonaws.com/0/16397/8968794d-9885-d3c7-d2b7-ce7d0981c23d.png)

### ポップアップに QTableView （調整ずみ）を使用した結果
最後に、`QCompleter::setPopup()` で ヘッダのサイズなどを調整した QTableView を指定した場合の表示は、以下のようになる。

グリッドの線が表示されてしまっているが、さらに調整すれば消せるはず。

**図. QTableView （調整後）をポップアップに表示した場合の候補表示**
![tableview.png](https://qiita-image-store.s3.amazonaws.com/0/16397/38d4ba43-8b78-0b1f-bca4-f87efd5b276d.png)
イベントリスナーのリスナー関数を引数付きbind()にした場合、イベントオブジェクトは最後の引数で渡される

備忘録。

```js
function fnc(a, b, c, d, e){
   console.log(a, b, c, d, e);
   // elmをクリックしたとき、コンソールに出力されるのは
   // > 'aaa', 'bbb', 'ccc', 'ddd', MouseEvent
   // となる
};
elm.addEventListener('click', fnc.bind(elm, 'aaa', 'bbb', 'ccc', 'ddd'), false);

```

ただ上記のようなaddEventLisner()の書き方をするとremoveEventListener()ができなくなる。
removeEventListener()もやらなければならない場合は、いったん変数に保持して変数を使って行うしかなさそう


```js
var bindFnc = fnc.bind(elm, 'aaa', 'bbb', 'ccc', 'ddd');
elm.addEventListener('click', bindFnc, false);
elm.removeEventListener('click', bindFnc, false);
```
Exception while handling service_name: "datastore_v3"とか言われたら再起動すべし

```
ERROR    2016-02-28 07:30:52,824 api_server.py:272] Exception while handling service_name: "datastore_v3"
method: "Put"
request: "\n\320\001j,j\023dev~hoge-localr\025\013\022\021AuthrizationToken\014r\032\010\007\032\011CreatedAt \000*\011\010\275\363\340\230\370\231\313\002r\032\010\007\032\011UpdatedAt \000*\011\010\275\363\340\230\370\231\313\002r\016\032\006UserID \000*\002\010\001r)\032\013AccessToken \000*\030\032\026XQ5xT1e9RtqjkRdD2laTCgr*\032\014RefreshToken \000*\030\032\026Hy7EIN9XQEiX0q1KtbU_MA\202\001\000"
request_id: "CAggbZbuys"

Traceback (most recent call last):
  File "/Users/user1/go_appengine/google/appengine/tools/devappserver2/api_server.py", line 247, in _handle_POST
    api_response = _execute_request(request).Encode()
  File "/Users/user1/go_appengine/google/appengine/tools/devappserver2/api_server.py", line 189, in _execute_request
    make_request()
  File "/Users/user1/go_appengine/google/appengine/tools/devappserver2/api_server.py", line 181, in make_request
    request_id)
  File "/Users/user1/go_appengine/google/appengine/datastore/datastore_sqlite_stub.py", line 968, in MakeSyncCall
    response, request_id)
  File "/Users/user1/go_appengine/google/appengine/api/apiproxy_stub.py", line 131, in MakeSyncCall
    method(request, response)
  File "/Users/user1/go_appengine/google/appengine/datastore/datastore_stub_util.py", line 3217, in _Dynamic_Put
    transaction, self._trusted, self._app_id)
  File "/Users/user1/go_appengine/google/appengine/datastore/datastore_stub_util.py", line 2680, in Put
    full_key = self._AllocateIds([entity.key()])[0]
  File "/Users/user1/go_appengine/google/appengine/datastore/datastore_sqlite_stub.py", line 1470, in _AllocateIds
    'ScatteredIdCounters')
  File "/Users/user1/go_appengine/google/appengine/datastore/datastore_sqlite_stub.py", line 1394, in __AllocateIdsFromBlock
    next_id = c.fetchone()[0]
TypeError: 'NoneType' object has no attribute '__getitem__'

```

こんなエラーが出たら一度サーバを止めて
再度、
```bash
goapp serve
```
しましょう。
そしたら治るはずです...
Atom入門 (概要編)

# ■ Atomとは
Githubが開発したオープンソースのテキストエディタ。
<font color="green">※Githubは開発中のプログラムなどを保管するサービスおよび、提供している組織</font>

# ■ Atomの特色

多機能なためデフォルト状態で十分使え、かつカスタマイズ性に優れていることが特色。

* [GitHubがChromiumベースのテキストエディタ「ATOM」を発表](https://osdn.jp/magazine/14/03/03/163000)

下記によると、MacでEmacs(Linuxなどで利用されている有名なテキストエディタ)のようなテキストエディタを作るという開発思想により作成されたらしい。
"誰にでも簡単に使えるMac版Emacsみたいなもの"という認識でよいようだ。

* [はじめてのAtomエディタ](http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEAtom%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF-I%E3%83%BBO-BOOKS-%E6%B8%85%E6%B0%B4-%E7%BE%8E%E6%A8%B9/dp
/4777519120/ref=sr_1_2?ie=UTF8&qid=1456644468&sr=8-2&keywords=atom)

現在はMacだけでなく、Windows、Linuxでも使用可能。

## ● 画像を見れる
画像などテキスト以外も表示できる

## ● ブラウザ技術を使用

### ○ Chromium(Google Chromeのオープンソース版) ベース  
エディタのどのページもローカルで Web ページがレンダリングされてる。 

### ○ Node.js(javascriptをローカルで実行できるようにするツール)
各ウィンドウの JavaScript 環境で自由にコードを実行できる。

* [GitHub製エディタAtomリファレンス](http://qiita.com/spesnova/items/d3096d062d70e7385e9d)

## ● コーティングに便利
シンタックスハイライト(強調表示)や、コード補完などコーディングに便利な機能が多い。また、AtomではPythonのサポート機能が特に多いらしい。

## ● マニュアルの充実
パッケージの作り方などが分かりやすく、まとめられているらしい。

* [公式 : Atomフライトマニュアル](https://atom.io/docs/latest/)
* [Github製エディタ「ATOM」、電子書籍版マニュアルをリリース](http://okisanjp.com/archives/4597)

## ● 処理が重い
多機能な分、シンプルなテキストエディタに比べ、処理が重い。
Objective-Cのメソッドを正規表現で引っかける

Objective-Cのメソッドを抜き出すための正規表現

```
^[-\+]\s*\(.+?\)[_a-zA-Z][_a-zA-Z0-9]*[a-z]+[_a-zA-Z0-9]*[ \t]*[\S\s]*?\{
```

<img width="606" alt="スクリーンショット 2016-02-28 16.44.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/115339/b29952a9-26dc-b167-4acc-35438984f7ad.png">

灰色の部分がヒットする
【非推奨】リモートデスクトップでユーザの奪い合いになったときの裏ワザ

## 気をつけたいWindowへのリモートデスクトップ接続

もう１年も前の話ですが、こんな記事を書きました。

[リモートデスクトップ接続のちょっとした工夫 - Qiita](http://qiita.com/h_kachodairi/items/5a1ac9cd02b3018940e5)

この記事は以下のような狙いで書きました。

+ Windowsで同時最大接続数が定められている場合、自分がリモートデスクトップで接続しているときに他の人がログインしてくると、自分の接続が奪われてしまうことがある
+ 重要な作業をしているときにそれをやられると凹むので、自分は少なくとも、接続するときには、接続状況を確認してから、リモートデスクトップで接続しよう！→だからバッチ化した

## こっちだって急いでいるんだ！

でも、空くのを待っていられる状況ばかりではなく、障害や不具合の対応をするときには、奪い取るしかなく、そう考えると、本来、これは、プロジェクトのルールとして、何か明文化されているべき事案。ま、障害だ、不具合だってときに、プロジェクトの有り様でケンカするほど頭が悪い話もないので、取るべき選択肢は１つ。

## 誰がつないでいるか調べてやる！
[PsTools](https://technet.microsoft.com/ja-jp/sysinternals/pstools.aspx)が使える環境であることが前提。

### PStoolsのディレクトリに移動

```bat
REM PStoolsをインストールしたディレクトリに移動
cd PStools
```

### PStoolsを経由してコマンドを打つ

```bat
PsExec.exe \\IPorHOST -u domain\user -p password netstat -ano | find "3389"
```

IPやHOST、Domain、user、passwordは調査対象に適したものに書き換えてください。要するに、接続先でnetstatします。通常、3389ポートがリモートデスクトップ接続のポート。

出力例(192.168.208.51が接続先）

```
PsExec v2.11 - Execute processes remotely Copyright (C) 2001-2014 Mark Russinovich Sysinternals - www.sysinternals.com

Starting netstat on 192.168.208.51....168.208.51...
  TCP         0.0.0.0:3389           0.0.0.0:0              LISTENING       3616
  TCP         192.168.208.51:3389    10.73.204.17:53878     ESTABLISHED     3616
  TCP         [::]:3389              [::]:0                 LISTENING       3616
  UDP         0.0.0.0:3389           *:*                                    3616
  UDP         [::]:3389              *:*                                    3616
netstat exited on 192.168.208.51 with error code 0.
```

状態がESTABLISHEDになっている行に表示されているIPアドレスの右側（上記の例では、10.73.204.17）が接続元。

この時点で誰が使っている端末か当たりがつけば、その人と会話して、接続を開放してもらえば良いし、まったく、検討がつかない場合はさらに…。

```bat
REM 接続元HOST名取得
nbtstat -A 10.73.204.17
REM 接続元への接続者特定
PsExec.exe \\接続元IPorHOST -u domain\user -p password query user
```

ちょっとやり過ぎ感もありますが。。。大抵のケースは、これで、誰がつないでいるかを推測できるレベルまで調査ができます。

## 本当にそこまでしなければならないのか

この方法が世間に浸透するのはあまり良くないと思いながら書いています。確かに、手段として、こういう調査もできるというのはお伝えしたいので書いていますが、本来はプロジェクト内で、適切な運用を行うことのほうが大事だと思います。

例えば。Slackとかでつなぐ人が「これからつなぐよー」宣言をして、何時ごろには開放できるのかも合わせて周知するといいですよね。メールやエクセルでこれを管理しはじめると、たぶん、面倒くささにかまけてルールを守らない人が出てきそうです。

ま、そもそも、適切な運用においては、PStoolsなんか使っちゃダメなんだとは思うですけどね（笑）。

くれぐれも、ご利用は計画的に。
Vagrantで構築した、Private Networkを使っている仮想マシン上のWebアプリケーションに、外部ネットワークから接続する


# 想定している状況
想定しているのは以下のような環境です。

 * PHPなどを使い、Webアプリケーションの開発を行っている。
 * 開発環境はMacである。
 * Deploy先となる開発用サーバは、vagrantで構築したLinuxの仮想マシンとなっている。
 * 仮想マシンのネットワークにはprivate networkを選択している

この環境を保ったまま、仮想マシンに対して外部からアクセスが必要になった場合のことを考えます。

例えば「Androidスマートフォンのxxという機種でアクセスしたときだけエラーが起こるので、調査してほしい」という依頼がクライアントから届き、スマートフォンの実機から普段利用している開発環境に接続する必要が出てきた場合などです。

# 普通に考えると
仮想マシンのネットワーク設定をPublic Networkに変更すれば良いのでは、ということになると思います。

しかしながら、開発環境を構築するときにhostsでホスト名を設定していなかったりすると・・・

そのWebアプリケーション自体に設定としてホスト名を持っている場合はもちろんのこと、自分のマシンからデプロイを行ったり、デバッガを接続したりするための設定まで変更をしなければならなくなります。

上記のような対応が一時的なものであるとすると、できるだけ、いつも使っている環境に手を入れたくはありません。

# ではどうするか？
仮想マシンをホストしているマシン上でapacheを起動し、そこから仮想マシンに対してmod_proxyでリクエストを転送するという方法でいかがでしょう。

ホストマシンがMacであるものとして、以下、手順を書いていきます。

# 仮想マシンのホストにインストールしたApacheから、ゲスト上で動いているWebアプリケーションにリクエストを転送する
## Apacheのインストール
予めbrewがインストールされているものとします。

その状態で、以下のようなコマンドを実行します。

```
brew tap homebrew/dupes
brew tap homebrew/apache
brew install httpd24
```

これを実行した後

```
which apachectl
```

で、「/usr/local/bin/apachectl」と表示されればOKです。

## httpd.confの書き換え
mod_proxyと、(vagrant上で動作しているサイトがhttpsを利用している場合には)mod_sslを有効にする必要があります。

また、「conf.d」フォルダに新規作成した設定ファイルが自動で読み込まれるようにする設定も追加しておきましょう。

**httpd.conf** は **/usr/local/etc/apache2/2.4** に配置されていますので、これを編集します。

まずデフォルトで無効化されているモジュールを有効化するため、コメントアウトを外します。

＊viでは、コマンドモード時に「:set number」で行番号を表示することができます。

```
#126行目のコメントアウトを外す。
LoadModule proxy_module libexec/mod_proxy.so

#129行目のコメントアウトを外す。
LoadModule proxy_http_module libexec/mod_proxy_http.so

#142行目のコメントアウトを外す。
LoadModule ssl_module libexec/mod_ssl.so
```

それが完了したら、ファイルの一番最後に下記の1行を追加します。

```
Include /usr/local/etc/apache2/2.4/conf.d/*.conf
```

なお、brewでインストールされるapacheは、listenするポートのデフォルトが「8080」となっています。
必要があればこちらも変更を行ってください。

おそらく53行目あたりに「port」という設定が書かれているはずです。

## conf.d/vagrant.conf(名前はなんでも良い)
httpd.confと同じ階層に「conf.d」というフォルダを作成し、その中に「vagrant.conf」のような名前のファイルを作成します。

ファイル名は何でも良いです。

また、面倒であればファイルを分けずとも、httpd.confに以下の内容を直接書いてしまっても良いです。

＊ファイルを分けるメリットは「見やすい」ということだけで、そうしなければ動かないというわけではない、ということです。

ファイルの内容は下記のとおりになります。

```
ProxyPass / http://[仮想マシンのIPアドレス]/
ProxyPassReverse / http://[仮想マシンのIPアドレス]/
```

また、飛ばす先のURLがhttpsである場合には、以下のように記述します。

```
SSLProxyEngine on
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

ProxyPass / https://[仮想マシンのIPアドレス]/
ProxyPassReverse / https://[仮想マシンのIPアドレス]/
```

## apache起動
apacheの起動は

```
apachectl start
```

停止は

```
apachectl stop
```

となります。

ログファイルは「/usr/local/var/apache2/log」に出力されます。

## 外部からアクセスしてみる
まずは、Mac上から

```
http://localhost:[httpd.confで指定したポート番号]/
```

にアクセスし、目的のWebアプリケーションが表示されるかどうか確認します。

これがOKであれば、外部マシンから

```
http://[仮想マシンのホストのIPアドレス]:[httpd.confで指定したポート番号]/
```

を実行してみてください。

おそらく、仮想マシン上で動作させているアプリケーションの画面が表示されるものと思われます。
SI系の開発からWEB系の開発に転向して驚いたこと。 

ひょんなことから、長年携わっていたSI系の仕事から
WEB系の仕事に転向したので簡単な感想を書いてみたいと思います。
かなり主観的な感想ですが
もし、SI系から転職を検討してる方がいたら少しでも参考になれば幸いです。

##１．開発スピードが速い
　
　これまでウォーターフォールモデルしか経験のない自分にとっては
　脅威的な開発スピードです。
　SIのころはjavaやC言語、C++で開発し、WEB系になってからはCakePHPやRuby on Railsを駆使して開発を行っています。
　大変主観的ですが、ひとつの機能を仕様からリリースまでする際、
　SI時に１週間かけていたようなものであれば、大体1、2日程度でリリースまで行っていると思います。
　言語の特徴もあるかと思いますが、ドンドン作れてしまう環境が整っている、そんな印象を持ちました。

##２．情報の共有が豊富

　技術的になにかわからないことがあったら、検索すれば大体出てくる。
　先人たちに大感謝です。とにかく検索検索ゥ！
　でも、そこから応用していけるかがカギなような気がするし、他力本願すぎるのも情けないので自分でも発信していけるようにならないと、と思います。

##３．環境が整いまくり

　WEBサービスを構築するための環境が充実していると感じます。
　昨今のクラウドサービスの充実はすさまじく、
　もはやサーバーやネットワークの知識なんてほとんど知らなくても
　WEBサービスは開発・運用できる。サーバーがなければAWSをつかえばいい。そしてAWSのインフラ力の強さを再認識させられて、畏怖の念すら抱きました。
　なにか特定の機能をもたせたいのであればAPIだったりGEMを利用することができる。しかも「こういう機能ないかな～」って調べてみるとほとんどが既にある。すごいです。


　WEB系の分野は進化が速く、開発スキルが求められるとビビっていたのですが、上記の理由もありSI系の開発経験しかない自分でもなんとかついていけそうです。
　もし、自分と同様に転向を考えている方がいれば「そんなにビビらなくてもなんとかなる！」と言えそうです。
Jbuilderでつくったフラグメントキャッシュを削除する


```ruby
json.cache! "v1.person", expires_in: 10.minutes do
  json.extract! @person, :name, :age
end
```

Jbuilderでこんな感じでフラグメントキャッシュをつくったあとに、このキャッシュを明示的に削除したいと思って`Rails.cache.delete`にキーをそのまま渡すと

```ruby
Rails.cache.delete("v1.person") # => nil
```

キャッシュにヒットしませんでした。

ソースコードを調べたところ、どうやらJbuilderの内部で`jbuilder/`という名前空間が渡されたキーに追加されているみたいです。

https://github.com/rails/jbuilder/blob/master/lib/jbuilder/jbuilder_template.rb#L108

というわけでキャッシュを削除したいときは先頭に`jbuilder/`を追加するとうまくいきます。

```ruby
Rails.cache.delete("jbuilder/v1.person") # => true
```
Python2のlambda式でprintを使う

# 背景

Pythonで関数を引数として渡す関数を書く際にlambda式を渡そうと思ったのですが、Python2では printが式 (expression)ではなく文 (statement)であるため、lambda式に入れることができませんでした。
そこで、\_\_future__モジュールをインポートして、Python3と同様に print文から print式になるよう変更を加えます。

*式と文の違いについては[StackOverFlowの投稿](http://stackoverflow.com/questions/4728073/what-is-the-difference-between-an-expression-and-a-statement-in-python) がわかりやすいです。要約すると、式(expression)はそれ自体で値を評価できますが、文(statement)は定義された手続きを終えなければ評価ができません。

# コード

```py
# Python2では定義できない (printが文であるため)
# a = lambda: print "hoge"

# Python3では定義できる (printが式であるため)
a = lambda: print("hoge")

# Python2で定義する方法
from __future__ import print_function
a = lambda: print("hoge")

```

ただし、問題点としては__print "hogehoge" をすべて print("hogehoge")に変更しなければなりません__。
Python2の中で使う場合は、メソッド内でインポートするなど限られた利用に留めた方が吉でしょう。


# appendix

*例えばC#ではラムダ式の中に文を書けたりするので、言語間で違いがあることを留意した方が良いですね。

```csharp
Action<string> act = (string x) =>
{
    if(x == "hoge") Console.WriteLine(x);
    else Console.WriteLine("hoge以外は許さん");
}
```

*あと、何気にPythonで引数なしのラムダ式の書き方が分からなかったのですが、

```py
a = lambda: 5 # 5を返すラムダ式
```

で書けるようです。

*\_\_future__モジュールについては[さりんじゃーさんのブログの内容](http://salinger.github.io/python/20140211-future-module/) にまとめられております。
Python2からPython3へ徐々に移行したい場合などに参考になるかもしれません。
Rubyのinstance_execメソッドとローカル変数

# 概要
- Rubyのinstance_execは、レシーバのインスタンス内のコンテキストで実行されるが、ローカル変数についてはブロックの外側と共有される

# 背景
- 最近Rubyな会社に入ってRSpecでテストを書き始めたのだが、itに変数を渡す際に挙動がわからずはまった
- 具体的には以下なクラスがあったとする

    ```
    class Sample
        def hello
            return "hello"
        end
    end
    ```

- 普通にテストを書くと以下な感じになると思う

    ```
    describe Sample do
        before do
            @sample = Sample.new
        end
        it { expect(@sample.hello).to eq("hello") }
    end
    ```

- が、Rspecを理解してなかったので当初は以下な感じで書こうとして、`undefined method ``hello' for nil:NilClass`とエラーになっていた。

    ```
    describe Sample do
        @sample = Sample.new
        it { expect(@sample.hello).to eq("hello") }
    end
    ```

- 上記に悩みつつ、以下な感じで書いたらエラーにならなかった。

    ```
    describe Sample do
        sample = Sample.new
        it { expect(sample.hello).to eq("hello") }
    end
    ```

- RSpecのソースコードや[この記事](http://qiita.com/joker1007/items/641961963ff459125f31)を読んで、`@sample`のときにエラーになる原因はわかった
    - describe内はRSpec::Core::ExampleGroupのサブクラスであり、it内はそのインスタンスである
        - 内部的にはインスタンスをレシーバーとしてinstance_execで実行されている
    - describe内の記述は、上記サブクラスに対するmodule_execによりサブクラスの定義式として実行されるため、`@sample`はExampleGroupクラス自身のインスタンス変数(クラスインスタンス変数)になる
    - その結果、it内では`@sample`が参照できず、nilになる
- が、ローカル変数の場合になぜうまく動作するのかわからなかった

# 結果
- instance_exec(instance_evalでも同じく）は、ローカル変数についてはブロックの外側と共有される

    ```
    irb(main):001:0> class Sample
    irb(main):002:1>   def initialize
    irb(main):003:2>     @hoge = "hoge"
    irb(main):004:2>   end
    irb(main):005:1> end

    irb(main):006:0> fuga = "fuga"
    irb(main):007:0> @hoge = "hogehoge"

    irb(main):008:0> Sample.new.instance_exec { "hoge: #{@hoge}, fuga: #{fuga}" }
    => "hoge: hoge, fuga: fuga"
    ```

- よって、ローカル変数の場合はbeforeで渡さなくてもうまく動作した
    - とはいえ、ぱっと見でわかりづらいので、RSpec的にはbeforeでインスタンス変数を渡すか、letを使うのがよいのかな
wordpressでスマホブラウザ別に表示を分岐する方法

wordpressでスマートフォンとPC、ブラウザ別に表示を分ける方法などはよく載っているのですが（例えばhttp://millkeyweb.com/if-mobile/）
スマホブラウザ別に条件を分岐する方法は調べてもなかなか出てこなかったのでメモ。


今回表示を分岐したのはSafariとLINEブラウザ、Facebookブラウザの３つです。
Safariでは通常のスマホサイトを表示し、LINEとFacebookからリンクを踏んだ際はSafariでの閲覧を促す別ページへ分岐させました。

まず、それぞれのブラウザのユーザーエージェントを調べます。
私はここのサイトを使用しました。http://www.openspc2.org/JavaScript/library/system/useragent/

以下それぞれのユーザーエージェント

Safari
Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1 

LINE
Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 Safari Line/5.10.0 

Facebook
 Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 [FBAN/FBIOS;FBAV/47.0.0.43.396;FBBV/20481971;FBDV/iPhone8,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/9.2.1;FBSS/2; FBCR/ソフトバンク;FBID/phone;FBLC/ja_JP;FBOP/5] 

この中にある特定の文字列(LINEなら「Line」、Facebookなら「FB」)を含む場合は別のhtmlを表示するという条件文を書きます。

関数はwordpressの中にあるfunctions.phpに書き込んでいきます。


```functions.php
function is_line() {
    $is_line = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'Line');
    if ($is_line) {
        return true;
    } else {
        return false;
    }
}

function is_facebook() {
    $is_facebook = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'FB');
    if ($is_facebook) {
        return true;
    } else {
        return false;
    }
}
```

その後分岐を行うブラウザに(例えばpage.php)に以下のように書き込みます。

```page.php
<?php if (is_line() and is_facebook()) : ?>
//LINEブラウザとFaebookブラウザで見たときの表示
<?php else: ?>
//それ以外での表示
<?php endif; ?>
```
Skype for Webで動くHubotをMacでサクッと動かす(要 homebrew)

## 利用するレポジトリ

https://github.com/github/hubot
https://github.com/sdimkov/hubot-skype-web

## 手順
# nodejsのインストール
```
brew install nodejs
```

# Hubotのインストール
```
npm install -g yo generator-hubot
mkdir myhubot
cd myhubot
yo hubot # 初期設定について質問される
```

# skype-web-adapter のインストール
```
npm install hubot-skype-web --save
brew install phantomjs
hubot --adapter skype-web
```

# ボット用アカウントを作る

- [Skype公式HP](http://www.skype.com/ja/) からアカウントを作る
- テスト用の窓を用意する

# 起動スクリプトを作成

起動スクリプトを作り、実行権限を付与する

```sh:bin/hubot-skype
#!/bin/sh

set -e

npm install

export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

# 必須設定
export HUBOT_SKYPE_USERNAME="ボットアカウント名"
export HUBOT_SKYPE_PASSWORD="ボットパスワード"
# オプション設定
# export HUBOT_SKYPE_RECONNECT=20 # default: 240
# export HUBOT_LOG_LEVEL="debug" # [debug|info|notice|warning|error|critical|alert|emergency], default: info
# export HUBOT_SKYPE_MAX_MESSAGE_LENGTH Integer, # The maximum length of the message, longer messages are splitted, default: 1500

exec node_modules/.bin/hubot --name "myhubot" --adapter skype-web "$@"
```

# Hello Worldテスト

下記のスクリプトを作成して、
./bin/hubot-skype でHubotを起動

```coffee:scripts/hello.coffee
# Description:
#   Test Command
#
# Commands:
#   hello - Reply with "Hello World!"

module.exports = (robot) ->
  robot.hear /hello/i, (res) ->
   res.send "Hello World!"
```

`hello`と自分のアカウントで発言して、`Hello World!`とHubotが返事をしたら成功


# 続きの情報

- [スクリプトの書き方(公式)](https://hubot.github.com/docs/scripting/)


# 開発時の推奨プラグイン

#### hubot-reload-scripts

https://github.com/vinta/hubot-reload-scripts

`<ボット名> reload`と発言すると、スクリプトを再読み込みしてくれる
俺的爆速iOSアプリ開発　サードパーティライブラリ集

# **通信系ライブラリ**
**AFNetworking** 
![68747470733a2f2f7261772e6769746875622e636f6d2f41464e6574776f726b696e672f41464e6574776f726b696e672f6173736574732f61666e6574776f726b696e672d6c6f676f2e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/100745/fdf42662-e884-1d8a-7e26-ad939953a19e.png)

https://github.com/AFNetworking/AFNetworking
ド定番中の定番のライブラリ!!
レスポンスデータの処理やエラーハンドリングがブロック構文で書けるので通信周りを実装するときは必ずこれを使っています。


**Alamofire**
![alamofire.png](https://qiita-image-store.s3.amazonaws.com/0/100745/edeb0a10-7c20-9515-9304-3880b089e1da.png)

https://github.com/Alamofire/Alamofire

これも定番中の定番の通信のライブラリ!
Swiftで記述されているのでBriging-Headerを準備する必要なし!
個人的にはまだAFNetworkingのほうが使いやすいですがこれから使っていくつもりです

**GoldRaccon**

https://github.com/albertodebortoli/GoldRaccoon

FTP通信を実装する際はこれを使っています。
クライアントからサーバーへのアップロードまたサーバーからのダウンロード処理を簡単に記述することができます。

**SDWebImage**

https://github.com/rs/SDWebImage

UIImageViewに表示する画像(UIImage)をサーバーから取得＆表示するライブラリ。
同じ画像であれば自動的にキャッシュもしてくれるので一度取得すれば次回以降の表示がすごく早くなります。

# **UI系ライブラリ**
**SVProgressHUD**

https://github.com/SVProgressHUD/SVProgressHUD

![687474703a2f2f662e636c2e6c792f6974656d732f32473146315a304d306b306832553356317033392f535650726f67726573734855442e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/100745/bed8dc75-95da-549e-83d3-a34c471e69ea.gif)

通信時や重たい処理をする際に、一発でローディングを表示した時に使っています。ObjCの頃からお世話になっているライブラリ!オプションで後ろのビューを一切押下できない状態にすることもできます。

**Toast for iOS**

https://github.com/scalessec/toast
AndroidのトーストがiOSでも実現できないかな〜と探していた時に巡りあいました。
ちょっとしたユーザへの通知に便利です。
アプリ内の設定を変更した際などに、"○○○を変更しました"的に...


**EAIntroView**

https://github.com/ealeksandrov/EAIntroView
![Screenshot01.png](https://qiita-image-store.s3.amazonaws.com/0/100745/eb1732e6-55bf-2108-a140-151b8082d631.png)

最近のアプリではよく見かける、起動時にアプリの使い方を実装するライブラリ。
近々のアプリ開発でも使用しました。ただ、画像は自分で用意してくださいね!
UIScrollViewを使用して自分で実装することもできますが、このライブラリで十分なのではと思います。

# **その他便利なライブラリ**

**ZipArchive**
https://github.com/ZipArchive/ZipArchive

Zipファイルを解凍するライブラリ。
サーバーから取得したZipファイルやバンドルしたZipファイルを一発で解凍することができます。
よく使っています。

**FMDB**

https://github.com/ccgus/fmdb

SQLITEを簡単につかうためのラッパーライブラリ。
SQLITEでデータを管理することもあると思います。その際は必ずといっていいほどFMDBが活躍します。
SQL文書さえ知っていれば簡単に扱えます。

**ACEDrawingView**

https://github.com/acerbetti/ACEDrawingView
お絵かき機能を実現するためのライブラリ。

その他まだまだ便利なライブラリがあります。
もっと良いライブラリがあれば更新していきます。
Herokuの本番環境にあるPostgreSQLのDBをCopyして、Stg環境のDBを更新する方法

はじめまして、kogepanです！
今回、趣味でherokuを使うことになりました。Stg環境を作ったけど、本番環境のDBの反映する方法が分からないって困ったので、記入しておきます。参考にしていただけると嬉しいです！

## DB更新
###　1.　本番環境からDBのBackupを作成します。
```
heroku pg:backups capture --app YOUR_APP_NAME
```
* YOUR_APP_NAME = 本番環境のheroku名

実行するとBackUpDB番号を取得できます。
![webApp_—_-bash_—_202×45.png](https://qiita-image-store.s3.amazonaws.com/0/115405/b1a9e476-fea8-7a6f-de31-52f554b0b137.png)


###　2.　Stg環境の更新
先ほどBackUpDB番号を利用して、Stg環境を最新版にします

```
heroku pg:backups restore YOUR_APP_NAME::BackUpDB番号 YOUR_STAGING_DATABASE_NAME --app YOUR_STAGING_APP_NAME --confirm YOUR_STAGING_APP_NAME

```
* YOUR_STAGING_APP_NAME　= Stg環境のheroku名
* YOUR_STAGING_DATABASE_NAME　 = Stg環境のDB名（Resource name）


これで更新完了です！！
初回なので、間違いとかあったら教えてくださいm(_ _)m

### 参考URL
https://qiita.com/kimunny/items/c841bed5df73f0f93067
Excel VBAを使ってコピー用ボタンを作成する


個人的に手順書はExcel派。
理由は、VBAを使用してコマンドのコピーの簡略化とか実行時間のエビデンスを残したりするのが簡単だから。

私が使っているコピーボタン用のコードを紹介します。

-
# 1.Excelのフォーマットイメージ

下記のようなフォーマット向けにVBAを作成します。

![kobito.1456638705.159421.png](https://qiita-image-store.s3.amazonaws.com/0/33479/e3a72153-37c2-0606-8af8-6f4b22a268d3.png "kobito.1456638705.159421.png")

VBAを使用して実現したいことは下記。
①`Copyボタン`の右側にあるコマンドをコピー
②コマンドをコピーした時間を残す

-
# 2.ソースコード

※あまりスマートなコードではないですのでご了承ください。。。

````コード
Sub CP_button()
    
    Dim waitTime As Variant
    waitTime = Now + TimeValue("0:00:03")
    
    Dim xy, hidari
    xy = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address
    hidari = Range(xy).Offset(0, 4).Value
    
    With Range(xy).Offset(0, 4)
        .Select
        .Font.Bold = True
        .Font.Color = -16776961
        .Font.TintAndShade = 0
    End With

    With Range(xy)
        .Offset(o, 4).Select
        .Offset(0, -1) = "●"
        .Offset(0, -4) = Time
    End With
    
    Dim myDO As New DataObject
    myDO.SetText hidari
    myDO.PutInClipboard
    
    Application.Wait waitTime
    
    With Range(xy).Offset(0, 4)
        .Select
        .Font.Bold = True
        .Font.Color = xlThemeColorLight1
        .Font.TintAndShade = 0
    End With
End Sub
````

-
# 3.動作検証

①実行前
![kobito.1456638883.655658.png](https://qiita-image-store.s3.amazonaws.com/0/33479/f2b4ee07-cffb-9ff9-db9e-8877923e580f.png "kobito.1456638883.655658.png")


②実行後
![kobito.1456638930.621450.png](https://qiita-image-store.s3.amazonaws.com/0/33479/4113192c-cd92-31d1-3a56-a926a8d9bd6c.png "kobito.1456638930.621450.png")


キャプチャに取れなかったですが、コピー中はコピー対象のコマンドが赤く表示されます。
きちんとコピーしていることが目視できるようにこの仕組を入れています。
MacBook使用時に便利なショートカットコマンド


＃以下は、OSXのマシンを使用している人向けです。

MacBookなどOSXのマシンを使用しているとき、大抵の人はGUIで操作することがほとんどだと思います。
ただ、私はGUI操作よりもCUI操作する場合の方が多いので、良く使っている（便利な）コマンドをまとめます。

-

# 1.基本的なもの

| コマンド             | 意味                     |
|----------------------|--------------------------|
| return               | 名前を変更する           |
| space<br>Command + y | Quick Lookする           |
| Command + delete     | 削除する                 |
| Command + c          | コピーする               |
| Command + v          | ペースト（貼り付け）する |
| Command + z          | 取り消しする             |


# 2.ファイル/ディレクトリ操作

| コマンド              | 意味                                              |
|-----------------------|---------------------------------------------------|
| Command + o           | ファイルを開く<br>ディレクトリを開く<br>APLを起動 |
| Control + Command + o | 新規ウィンドウでディレクトリを開く<br>タブ表示    |
| Command + i           | ファイル/ディレクトリの情報を表示                 |

# 3.Excel(for MAC)操作

| コマンド         | 意味                     |
|------------------|--------------------------|
| Command + t      | 参照（絶対・相対）の指定 |
| Control + b | セル値のクリア           |

-

また便利だなと思うコマンドがあれば追記していきます。。。
文系大学生のJava入門

#はじめに
こんにちは :bowtie: 
プログラミングをする文系ボディービルダーガールです :heart: （筋トレ大好きです :muscle: :grin: ）
エンジニア職希望なので、スキルを磨こうと２月の頭から、某会社でエンジニアとしてアルバイトを始めました！
業務内容はアンドロイドアプリ開発に携わったりWebサイトを作成したりしているので、自分の力をもっと発揮できるよう、Javaの勉強を本格的にやろうと決めました :triumph: :triumph: ！
では、今回から何回かに分けて、自分が得たJava知識をまとめていきたいと思います。
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ！！」というのがあれば、コメントして頂けるととても嬉しいです！！

##環境
●　OS
　 - Mac OS X El Capitan

● JDK
   - java version "1.8.0_66"

#Java基本構造

```java

1 public class HelloWorld{
2  public static void main(String[] args){
3   System.out.println("MuscleWorld!");
4  }
5}
```

1行目にある「public class」の後ろに書かれる単語は、プログラムの名前。
正式にはクラス名といい、自分で好きなクラス名をつけることができますが、いくつか**ルール**があります。


1.Javaのソースファイル名は「クラス名.java」
2.クラス名はアルファベット大文字で始めること

##変数

変数とは・・・
データを入れるための箱
数字や文字列などプログラムが扱う様々なデータを入れたり取り出したりする

型とは・・・
変数に入れることができるデータの種類


【変数を宣言する方法】
　　型　変数名;

```java

1 public class HelloWorld{
2   public static void main(String[] args){
3     int age;
4     age = 21;
5     System.out.println(age);
6   }
7 }
```

変数を宣言する際には、データの種類ごとにあった***型***を扱います。
Javaには多くの型があるが、覚えておきたい９つの型を紹介します！


```java

整数
int : 普通の整数　　　　　int age = 20;　/*利用頻度が高い*/
long: 大きな整数         
short:小さな整数
byte:shortよりさらに小さな整数
```

```java

少数
double: 普通の少数　　　　　　　/*特別な事情がない限りdoubleを使う*/　　
float: 少し曖昧でも良い少数
```

```java

真偽値
boolean: trueかfalse　　　　boolean result = true; 　/*結果は成功という意味*/
```

```java

文字
char :　一文字 「''」で表現  char gender; = '女'
```

```java

文字列
String : 文字の並び　「""」で表現　　String name; = "筋トレ"
```

###変数の初期化

変数の初期化とは、変数に値（データ）を代入すること

```
変数の初期化

型　変数名　＝　代入するデータ;
```


例えば
``
int age = 20;
``

２０をageに代入することを、変数の初期化といいます。


####定数の利用
変数には異なる値を何度でも入れることができるます。

```java

1 public class HelloWorld{
2   public static void main(String[] args){
3     int age = 21;
4     System.out.println("私は"+age+"歳です！");
5     age = 22;
6     System.out.println("今年で"+age+"歳になります！");
7   }
8 }
```

私は２１歳です！
今年で２２歳になります！
と表示されます。

プログラムを開発していくと、「絶対に上書きされたくない」「内容を書き換えられたら困る」場合があります。
こういった場合には、変数の前に***final***を加えます。

```
【定数の宣言方法】
final 型　定数名（大文字）　＝　データ;
```

```java

1 public class HelloWorld{
2   public static void main(String[] args){
3     final int AGE = 21;
4     System.out.println("私の年齢は"+AGE+"です！");
5   }
6 }
```

もしも5行目に異なる値を入れた場合、コンパイルエラーになります。
:arrow_down: :arrow_down: :arrow_down: :arrow_down: :arrow_down: :arrow_down: 


```java

1 public class HelloWorld{
2   public static void main(String[] args){
3     final int AGE = 21;
4     System.out.println("私の年齢は"+AGE+"です！");
5     AGE = 18;
6     System.out.println("私は"+AGE+"歳に戻りたいです。");
5   }
6 }
```
UIViewを、コントローラが画面遷移しても常に表示し続ける方法


## 方法
`UIViewController.view` のサブビューとして画面表示されているUIViewは、当然ながら表示中のUIViewControllerが切り替わると、表示されなくなります。

`pushViewController:`や`presentViewController:`しても常に特定のUIViewを表示し続けたい場合、__UIWindowのサブビュー__として追加することで対応できます。


```objc:SnippetAddSubViewToWindow.m
// UIWindowを取得して
UIWindow *window = ...;

// 表示し続けたいビューを追加
[window addSubview:someView];
```

## 補足1. UIWindowへのアクセス

UIWindowは、UIApplicationDelegateのサブクラスにプロパティとして保持しておくと、アクセスしやすいです。

```objc:SnippetAppDelegateToReferWindow.m
// たとえばこんなデリゲートを定義しておき
@interface YMApplicationDelegate: UIResponder <UIApplicationDelegate>
@property(nonatomic, strong) UIWindow *window;
@end

// 別クラスから、目的のビューを追加する時点で参照を得る
YMApplicationDelegate *appDelegate = [UIApplication sharedApplication].delegate;
UIWindow *window = appDelegate.window;
```

筆者はStoryBoardを使わずにUIWIndowを直接allocしていますが、
前者の場合もプロパティをIBOutletにしておき、XIBファイルからリンクすれば多分できる...と思います。
またUIApplicationやUIScreenから別の方法で取得することもできるかもしれません(未調査)。

## 補足2. 常時表示したビューへのアクセス

常時表示したビューは、画面によって表示/非表示させるなど、表示中のUIViewControllerからアクセスすることが多いです。シングルトンパターンで目的のビューを取得できるようにしておくと便利です。

```objc:SnippetViewToAccessAnywhereWithSingleton.m
// こんな感じでシングルトンアクセスできるようにしておいて
@interface YMModalView : UIView
+ (instancetype)sharedView;
@end

@implementation YMModalView
static YMModalview * __sharedView;
+ (instancetype)sharedView{
    if(!__sharedView) __sharedView = [[YMModalView alloc] init];
    return __sharedView;
}
@end

// コントローラから参照する
- (void)viewDidLoad{
    [super viewDidLoad];

    YMModalView *modalView = [YMModalView sharedView];
    // ...
}
```
Juniper SSG で情報取得できるコマンド


詳細設計書作成時や障害発生時に実機のconfig確認の際に役立つコマンドをまとめます。
※私が使ったことのあるコマンドベースなので、記載されていないものもあるかもしれません。。。

-
# 1.情報取得コマンド一覧

| 実行コマンド            | 意味                               |
|-------------------------|------------------------------------|
| get config              | 設定情報の取得                     |
| get service pre-defined | 定義済みサービスの取得             |
| get system              | OSバージョンなど基本情報の取得     |
| get zone                | ゾーン情報の取得                   |
| get arp                 | ARP情報の取得                      |
| get interface           | インタフェース情報を取得           |
| get route               | ルーティングテーブル（情報）の取得 |
| get admin               | 管理者情報の取得                   |
| get sys-cfg | トラフィックログやイベントログの設定値の取得 |


-
# 2.デバッグ関連コマンド

これまでデバックが必要な事象に遭遇していない。
下記のサイトに記載されているデバックコマンドを参照。

http://www.infraeye.com/study/juniperssg6.2.html

-
# 3.条件抽出（Linuxでいうgrep）

config を取得しても情報量が多いと、特定の設定を探すのがとても大変。
下記のコマンドを用いることで、その手間を削減出来る。

## 3.1.特定文字のみ表示

下記は `trust` というキーワードが含まれる行のみを表示する例。

````コマンド
> get config | include trust
````

## 3.2.特定文字以外表示

下記は `trust` というキーワードが含まれない行のみを表示する例。

````コマンド
> get config | exclude trust
````


-
# 4.参考サイト

- [SSG - debug command](http://www.infraeye.com/study/juniperssg6.2.html)
- [ScreenOSはコマンド](http://qiita.com/tukiyo3/items/73ee4d88de017927992d)
VSCodeでSVGをプレビューする機能拡張

# きっかけ

[サーバサイドにおけるmatplotlibによる作図Tips - Qiita](http://qiita.com/TomokIshii/items/3a26ee4453f535a69e9e)
> 無事，図形ファイルが出力できた．図形表示のツールは好みのものを使えばいいが，ここでは，Visual Studio Codeをお勧めしたい．ご承知の通りVisual Studio Codeはテキストエディタなのでテキストの扱いがメインであるが，Folder単位でopenできて，その中でアクティブにFileを切り替えながら作業を進めることができる．偶然，画像ファイル(png)を指定した（触った）ところ画像表示されたことで，この機能に気づくことができた．
...
> レンダリングされるかなと一瞬思いましたが，SVGはテキストでした．

***ならばやってみよう***

## 実装
1. HTMLのテンプレに開いているSVGファイルを埋め込む
2. 標準のHTMLプレビューで表示
3. 以上!

最初いろいろ難しく考えてしまったが、以下のサンプルを見つけて考え方変えたらぱぱっと出来た。
[vscode-extension-samples/textdocumentprovider-sample at master · Microsoft/vscode-extension-samples](https://github.com/Microsoft/vscode-extension-samples/tree/master/textdocumentprovider-sample)

### おまけ
npmで[svg2png](https://www.npmjs.com/package/svg2png)なんてちょうどいいライブラリがあったのでエクスポート機能も実装。

## Repository
[SVG Viewer | Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=cssho.vscode-svgviewer)

[cssho/vscode-svgviewer: SVG Viewerfor Visual Studio Code](https://github.com/cssho/vscode-svgviewer)

## ScreenShot

![2016-02-28 (1).png](https://qiita-image-store.s3.amazonaws.com/0/54591/5707b50b-5285-7971-f4b1-180ce9c3a5ed.png)

![2016-02-28 (3).png](https://qiita-image-store.s3.amazonaws.com/0/54591/31030791-2a8b-ca3f-04e1-9cd90b904fb0.png)

## 2016/04/25追記
### 新機能を幾つか追加
- SVGをdata URI schemeに変換し、クリップボードにコピー
- サイズを明示的に指定して、SVGをPNGに変換

![palette.png](https://qiita-image-store.s3.amazonaws.com/0/54591/8013601d-8c96-c155-2e23-dda44dd33160.png)

### [Visual Studio Marketplace](https://marketplace.visualstudio.com/VSCode)でオススメ表示されたおかげで2000 installs超え！

![image](https://qiita-image-store.s3.amazonaws.com/0/54591/31e4a368-b74e-d709-ccff-01a1fa818f59.png)

## 2016/05/06追記
### Visual Studio Codeのブログで紹介されました。
[Visual Studio Code Extensions Roundup May 2016](https://code.visualstudio.com/blogs/2016/05/04/extension-roundup-may)
Safe Navigation Operator と ActiveSupport の try, try! のベンチマーク

オブジェクトに存在するメソッドを呼び出すケース・`nil` に対して呼び出すケースをそれぞれ比較。

```rb:safe.rb
require 'benchmark'
require 'active_support/all'

N = 10_000_000
class Foo
  def foo
  end
end

foo = Foo.new
bar = nil

Benchmark.bm do |b|
  b.report('Object&.     ') do
    N.times { foo&.foo }
  end

  b.report('Object#try   ') do
    N.times { foo.try(:foo) }
  end

  b.report('Object#try!  ') do
    N.times { foo.try!(:foo) }
  end

  b.report('NilClass&.   ') do
    N.times { bar&.foo }
  end

  b.report('NilClass#try ') do
    N.times { bar.try(:foo) }
  end

  b.report('NilClass#try!') do
    N.times { bar.try!(:foo) }
  end
end
```

```
$ ruby safe.rb
       user     system      total        real
Object&.       0.610000   0.000000   0.610000 (  0.612233)
Object#try     3.440000   0.000000   3.440000 (  3.454373)
Object#try!    2.710000   0.010000   2.720000 (  2.720780)
NilClass&.     0.450000   0.000000   0.450000 (  0.446206)
NilClass#try   1.360000   0.000000   1.360000 (  1.375241)
NilClass#try!  1.370000   0.010000   1.380000 (  1.368077)
```

Safe Navigation Operator は `try` や `try!` よりかなり速いことがわかりました。
なので Ruby 2.3 以降を使っているのであれば、積極的に置き換えて行くのが良さそうですね。

なお、Safe Navigation Operator は `try!` 相当の挙動なので、オブジェクトに対して存在しないメソッドを呼ぼうとすると `NoMethodError` が発生します。
AutoLayoutを使ってないのに「Unable to simultaneously satisfy constraints」のエラーメッセージが出て困った話

# 最初に
アプリ作ってて原因がわからずはまったことがありました。それがネットで調べても見つけることができず、結局自力で解決したので他の人のためになれば、とまとめてみます。

# 困った困った
お馴染みのよくあるエラー
![image](https://qiita-image-store.s3.amazonaws.com/0/57284/a0ad1187-1039-acc6-b73e-872e0440315e.png)

AutoLayoutを使っていて、上のキャプチャのように「Unable to simultaneously satisfy constraints.」というエラーが出ることは皆さんも経験があると思います。これは単純に、同時に満たすことのできない制約をAutoLayoutで設定してしまっていることが原因なのもご存知だと思います。
AutoLayoutを使ってないのに、このエラーが出ることがありその解消にとても時間がかかってしまいました。ネットで調べてもAutoLayoutに絡んだ話しか出てこず(-_-;)
これは僕のようなひよっこiOSエンジニアにはつらい。。

# 原因
原因を結論から言うと、Macをテザリングでネットに繋げてることが原因。
iPhone実機の画面上部に表示されてる青いバーが原因です。
テザリングをやめると「Unable to simultaneously satisfy constraints」のエラーが出てきません。シミュレーターでも出ません。なんかときたまこのエラー出てるな、AutoLayout使ってないのに変だな、まぁ後で直そっか。で放置しちゃってたのですが、今日調べてみたらこの原因を発見しました。
詳しくは見てないですが、青いバーの下からアプリの表示が始まってるので、上か下のバーが本来ある位置に陣取れなくてエラー出してるんでしょうね。

![image](https://qiita-image-store.s3.amazonaws.com/0/57284/93ba8aef-02f1-bd7d-3087-5b12af612ba5.png)


# 対応方法
単純に、テザリングの時はエラーが出ても気にしないようにすればいいですね(^O^)

# 時間があったら調べたいこと
テザリングを使っていて、アプリの構造がどういう時にはこのエラーが出てしまうのか。今回使ってるアプリは、Tabbed ApplicationとNavigation Controllerを使ってるのでその辺に関係がありそうなので、ここは要調査です。
Raspberry Pi 固定IP設定

Raspberry Piに固定IPを設定する方法です。

固定IP：192.168.1.2
サブネットマスク：255.255.255.0
デフォルトゲートウェイ：192.168.1.1
の場合

```
sudo vi /etc/network/interfaces
```

```lang:interfaces
auto lo

iface lo inet loopback
#iface eth0 inet dhcp
iface eth0 inet static

address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
```
NetBeansでJava WebAPI(JAX-RS jersey)

NetBeansでJava WebAPIを作成手順です。

1.プロジェクト作成

プロジェクトタブ内で右クリック→新規プロジェクト

カテゴリはMaven、プロジェクトはWebアプリケーションで「次へ」

![jax-rs_001.png](https://qiita-image-store.s3.amazonaws.com/0/115341/c7a53902-bae3-5e49-8729-babe130c491f.png)

プロジェクト名：jaxrsWebAPIで他は任意で「次へ」

![jax-rs_002.png](https://qiita-image-store.s3.amazonaws.com/0/115341/81573753-6aff-f30b-a37d-43a232c6ae48.png)

サーバはtomcatで「終了」

![jax-rs_003.png](https://qiita-image-store.s3.amazonaws.com/0/115341/562fa042-374a-8a54-a1be-36ab1259372e.png)

2.クラス作成

作成されたプロジェクトのパッケージを右クリック→新規→クラス

名前と場所は変更なく「終了」

![jax-rs_004.png](https://qiita-image-store.s3.amazonaws.com/0/115341/288a25c4-b1a7-8707-9a98-5c66d27edd4b.png)

3.JAX-RSライブラリーを取得

「public class」の上に「@Path("/")」と記載し、Alt+Enterで表示された「javax.ws.rs.Path」をインポート

![jax-rs_005.png](https://qiita-image-store.s3.amazonaws.com/0/115341/5519c39e-6a7d-5e4b-3353-b941280faf1c.png)

しばらくするとダイアログが表示されるのでそのまま「OK」

![jax-rs_006.png](https://qiita-image-store.s3.amazonaws.com/0/115341/fb9bc5cc-0f4f-fc24-8aff-db3d298773c3.png)

web.xmlが作成される。

![jax-rs_007.png](https://qiita-image-store.s3.amazonaws.com/0/115341/3000f5da-6846-75a5-82cb-700c37d69dea.png)

4.GETメソッド作成

NewClassを下記のようにする。

```lang:NewClass.java
package javasample.jaxrswebapi;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/")
public class NewClass {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getMethod() {
        return "OK";
    }
}
```

5.WebAPI起動

プロジェクトを右クリック→実行

6.WebAPI実行

ブラウザで下記のURLにアクセスするとOKが表示される

http://localhost:8084/jaxrsWebAPI/webresources/

![jax-rs_008.png](https://qiita-image-store.s3.amazonaws.com/0/115341/d64f5d70-58f7-66d1-da39-e8d9d590802a.png)


GitHub
https://github.com/kaishero/jaxrsWebAPI
Unity5.3のAssetBundleパフォーマンス計測 

Unity5.3になり、AssetBundleの性能が改善されました。
実際どれぐらいの差があるのか簡単ですけどパフォーマンス計測してみました。

参考にした公式のAssetBundleのサイト
[Asset Bundle Compression](http://docs.unity3d.com/Manual/AssetBundleCompression.html)
[Asset Bundle Internal Structure](http://docs.unity3d.com/Manual/AssetBundleInternalStructure.html)

## LZ4形式
Unity5.3になり、一番大きな所としては、「チャンクベース」のLZ4形式をサポートした所。
どういう事かというと、今まではLZMA形式で、ひとまとまりのAssetBundleが合った時に、全体を解凍する必要があったのですが、特定のAssetのみを圧縮した状態でも解凍できることにより、圧縮したまま保存ができ、読み込み時の負荷が減りメモリ使用量が良くなるというものです。ただし、ディスク上のファイルサイズはLZMAより1.5~2倍ぐらいに膨れ上がります。

ただ、LZMA形式に関してですが、公式の説明を見ると、ダウンロード後にLZ4形式に再圧縮しているみたいな記述があるので、ダウンロード後に関してはさほど差はないかも知れません。

## LZ4形式への変換方法
AssetBundleを作成する際に指定する、BuildoptionにBuildAssetBundleOptions.ChunkBasedCompressionのフラグを追加します。

## 計測条件
しっかりと計測したわけではなく、手元の環境でにあるものを使用したので、
計測として足りない部分はあるのですが、以下の様な条件で実行しました。
・LoadFromCacheOrDownloadを使用
・compressionEnabledはtrue
・AssetBundleにするデータはFBXとテクスチャを1000ファイル程使用し、一つのAssetBundleを作成
・AssetBundleにする前の全ファイル数のサイズは300MB程
・iPhone5とXCodeを使用し計測
・ダウンロード後は、GetAllAssetNamesとLoadAssetを使用し全ファイルの読み込み

## 計測結果
|圧縮形式  |Unity4-LZMA  |Unity5-LZMA  |Unity5-LZ4  |
|---|---|---|---|
|ディスク上のファイルサイズ  |23MB  |24MB  |36MB  |
|キャッシュ後のサイズ  |66MB  |43MB  |38MB  |
|ダウンロード時間  |8.3秒  |9.7秒  |5.2秒  |
|ダウンロード時のメモリ使用量 |60.5MB  |51.7MB  |60.84MB  |
|Load時間  |Load関数が違うため未計測  |23.6秒  |25.3秒  |
|Load時のメモリ使用量  |Load関数が違うため未計測  |45MB  |47MB  |

結果としては上記のようになりました。
LZ4形式のAssetBundleがキャッシュ後のサイズ、ダウンロード速度ともに優秀でした。
メモリ使用量に関しては、LZMAの方が優れていました。Load後の数値に関しては、誤差な部分ではあると思います。

※ここに記載している数値は、AssetBundleの内容、通信環境、実行環境により変動するものであり、絶対的なものではないので、各環境上で計測していただき、参考程度に捉えて頂ければと思います。

## まとめ
LZ4形式はファイルサイズが膨れ上がりますが、パフォーマンスの向上が見込まれます。
利用するにも、AssetBundle作成時にBuildoptionを設定するだけで、既存のプログラムを変更する事なく動作しますので、移行コストはかかりません。
ですので、Unity5.3以降では、LZ4形式のAssetBundleを利用していこうと考えています。
AD2 > 付属ケーブルの問題 > ポロリと取れる > 差し込みが甘かった

```txt:動作確認
Analog Discovery 2
```

Analog Discovery 2(以下AD2)

## 問題

AD2には標準でプローブ(と言うのが正しい?)付き30ピンコネクタが付属している。

AD2特有のことかもしれないが、そのコネクタの差し込みがあまい。プローブをいじっているとAD2からポロリと取れてしまう。
これはなんとかしたいと考えている。

おそらく30ピンはMIL規格で以下のものが使えるか。
http://eleshop.jp/shop/g/gC32362/

( http://qiita.com/7of9/items/a8242ebc2b2dcc99016d で調べたことが役立った。)

しかし同じMIL規格を使うだけではコネクタ落脱問題は回避できない。
中央の突起を抑えることでこの問題は回避できそうだが、突起を抑える仕組みをAD2側に着けることになるだろうか。

あとは、コネクタ（とプローブ）を変更すると特性がどう変わるかはひっかかる。自分で測定してみる。

## 差し込みが甘かった

コネクタの差し込みが甘かったようだ。

コネクタの止まるところまで差し込んでいたが、もっと深く差し込めるようだった。
きちんと差し込んだら脱落することなる使えるようになった。

もう少し使い方をきちんとしてから情報を出せばよかった。
lvcreate での not found: device not cleared 対処

ほとんどの人が必要としない情報だろうけど･･･
MondoRescue でサーバ移行してたら、 lvm 作成時にはまったのでメモ

# lvcreate したら not found: device not cleared 

```
# lvcreate -L 1G -n testLogVol testvg
  /dev/testvg/testLogVol: not found: device not cleared
  Aborting. Failed to wipe start of new LV.
```

--noudevsync オプションをつけれたら通った。

```
# lvcreate -L 1G -n testLogVol testvg --noudevsync
  Logical volume "testLogVol" created
```

何が問題かとか全然わかんなかったのでとりあえずメモ。
めでたしめでたし。
Let's chatをDocker上で動かしてみたら。

# 検討経緯
1.会社のコラボレーションツールが使えなくなる。
まぁ、正しくは使えるんだが、使用者が制限されまして、コラボレーションツールとしての意味合いが減ってきているので別のツールを検討。
全社的な利用ではなく、あくまでチーム単位で使える程度の規模で。

2.Docker触ってみたい。
そろそろ真面目に利用を考えてみてもいいのかなと。

ということから開発環境にDockerを導入し、その上でコラボレーションツールを起動して運用してみようと画策。
色々見ていたらオンプレで利用出来るLet's Chatが良いっぽい。
これを機にメール主体のコミュニケーションからも脱却したいし。

# 導入
導入自体は至極簡単。
Docker導入からLet's Chat導入までを一気に

あ、環境はCentOS7です。

```
# docker導入/起動
yum update

cat <<EOF > /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum -y install docker
systemctl start docker

# docker compose導入
curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose --version

# Let's chat導入
docker pull mongo 
```
導入はここまで。
あとは設定して起動するだけ。

まずはDocker Composeの準備。
複数コンテナを纏めて起動したり停止してくれるので、楽ですね。

```
# docker-compose.yml準備
mkdir -p　~/letschat
cd ~/letschat
cat <<EOF > ./docker-compose.yml
app:
  image: sdelements/lets-chat
  links:
    - mongo
  ports:
    - 8080:8080
    - 5222:5222

mongo:
  image: mongo:latest
EOF

# コンテナ起動
docker-compose up
```

最後にアクセスして確認。
http://host-ip:8080/

デフォルトだとファイルアップロードやプライベートチャットルームの機能がオフになっているので、変更したい人はコンテナ上の/usr/src/app/config配下にsettings.ymlを配置する。
サンプルは/usr/src/app/settings.yml.sampleというものがあるので、それを流用。

/usr/src/app/configはすでにマウントされているので、docker inspectでホスト上のディレクトリを確認し、そこに配置。

# 一通り確認してみたら
最初のうちは普通に使えていたので、満足だったが、メッセージが増えてきた中、あるチャットルームで、ログオフ⇨オグインを実施したところ、ハング。
どうやら1ルームあたり100メッセージを超えるとハングするっぽい。
尚、Let's Chat上のルーム全体で100メッセージ超えた時点ではハングはしない。
例えば50メッセージのチャットルームが4部屋あっても問題なく使えた。
あと、1メッセージあたりのサイズも影響しないようだ。

AP層をローカルのCentOS上にgit cloneし、コンテナ上のMongoDBに接続した場合、
この事象は発生していない。
ログに出力されているLet's chatのバージョン見る限りはDocker上のものと同じなんだけど。。。Dockerの問題？調べても同様の事象が起こっているのが見つけられなかった。

2016/02/29 追記
101件目をPostした後、ログアウトするとMongoDBとのコネクションが10本中5本切れているようにみえる。
Windows10の警告音をOFFにする

Win+x→コントロールパネル→ハードウェアとサウンド→サウンド - システムが出す音の変更

プログラムイベントの中から「一般の警告音」を選択し、サウンドを「Windows Background.wav」から「なし」に変更してOK

![win10_sound_off_001.png](https://qiita-image-store.s3.amazonaws.com/0/115341/f711e3f8-7d95-c715-237a-74a4c9cde555.png)

以上！
4日目 => デザインパターン（モジュールパターン）

# はじめに
昨日に引き続き、デザインパターン。２個目。

# 説明
## モジュール
プロジェクトのコードを分割して組織化する。

### オブジェクトリテラル
オブジェクトリテラルを使うことでコードをカプセル化し、体系化できる。

[カプセル化 【 encapsulation 】](http://e-words.jp/w/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96.html)
> カプセル化とは、オブジェクト指向プログラミングが持つ特徴の一つ。 
> データとそれを操作する手続きを一体化して「オブジェクト」として定義し、
> オブジェクト内の細かい仕様や構造を外部から隠蔽すること。 
> 外部からは公開された手続きを利用することでしかデータを操作できないようにすることで、
> 個々のオブジェクトの独立性が高まる。

```js
var moduleObj = {
  // 何らかの設定
  config: {
    max: 10,
    min: 0
  },

  // 設定を使っての処理
  checkSize: function(value){
    console.log("最大値: " + this.config.max);
    console.log("最小値: " + this.config.min);

    if(value <= this.config.max && value >= this.config.min){
      console.log("範囲内です。");
    }else{
      console.log("範囲外です。");
    }
  },

  // 設定変更用
  updateConfig: function(config){
    if(typeof config === "object"){
      this.config = config;
    }
  }
}
```

でもこのままだと、`updateConfig`使わなくても直接書き換えれちゃうな。
後々そこらへんの解決策は出てくるかな。

```js
moduleObj.config = {max: 0, min: -10};
```

### モジュールパターン
アプリケーションの他の部分が使うインターフェースだけ外部公開するようにする。

```js
var module1 = (function(){
  // 設定
  var config = {
    max: 10,
    min: 0
  }

  return {
    // 設定を使っての処理
    checkSize: function(value){
      console.log("最大値: " + config.max);
      console.log("最小値: " + config.min);

      if(value <= config.max && value >= config.min){
        console.log("範囲内です。");
      }else{
        console.log("範囲外です。");
      }
    },

    // 設定変更用
    updateConfig: function(newConfig){
      if(typeof config === "object"){
        config = newConfig;
      }
    }
  }
}());
```

`config`が外側から直接変更できなくなった！
パブリックにするものだけreturnして返す。

# おわりに
外から書き換えられちゃダメなものは隠蔽したり、決まった方法でしかアクセスできないようにする。
なるほど。
もっとモダンな書き方が本の後半に出てくるらしい。

# 参考
* JavaScriptデザインパターン
繰り返し重み付き縮小法

機械学習プロフェッショナルシリーズのスパース本にのっていた繰り返し重み付き縮小法（Iteratively Reweighted Shrinkage, IRS）が簡単そうだったので逐次近似的画像再構成に組み込んでみました。

繰り返し重み付き縮小法の詳細は
http://www.amazon.co.jp/スパース性に基づく機械学習-機械学習プロフェッショナルシリーズ-冨岡-亮太/dp/4061529102

逐次近似的画像再構成に正則化を組み込む方法はいろいろあるのですが一番簡単なGreenのOne Step Late（OSL）アルゴリズムを用いました。

OSLの詳細は
http://www.maths.bris.ac.uk/~mapjg/papers/spect-TMI90.pdf

実験に用いたソースコードは
https://github.com/kibo35/reconstruction/blob/master/MAP/osl.py

実験結果

スライスあたりの計数は2M。画像サイズは160×160。逐次近似は10主反復、10サブセット。FBPのフィルターはramp。

指標はファントム画像との平方平均二乗誤差（RMSE）。パラメータ適当だけど…

![osl.png](https://qiita-image-store.s3.amazonaws.com/0/114365/8bdcbe3d-ff25-dfda-83b3-c34ba8dfafc1.png)

filterは平滑化に用いたガウシアンフィルターの半値幅。βは正則化項の強さを調整する定数。

![profile.png](https://qiita-image-store.s3.amazonaws.com/0/114365/d86212b2-f2bc-6a84-9c42-9961d07a9c1a.png)

OSL-IRSの方はL1正則化したっぽいぺたっとした画像になってますね。ファントム外縁部の白い所の画素値は落ちずにファントム内部はぺたっとなってます。
Raspberry PiでMyDNS.JPにIPアドレスを定期的に通知する

Raspberry PiでMyDNS.JPにIPアドレスを定期的に通知する方法です。

#前提事項
MyDNS.JPでアカウント取得済み
http://www.mydns.jp/

#作業内容
1.IPアドレス通知用のシェルを作成
※アカウント名:mydns99999 パスワード:abcdefg の場合

```
$ vi noticeIp.sh

#!/bin/bash

wget -O - 'http://mydns99999:abcdefg@www.mydns.jp/login.html'
```

2.シェルに実行権限付与

```
$ chmod 755 noticeIp.sh
```

3.cronにシェル実行を設定（1行追加）
※毎時30分に通知する場合
※noticeIp.shを/home/username/に配置している場合

```
$ crontab -e

30 * * * * /home/username/noticeIp.sh
```

これで定期的にMyDNS.JPにIPアドレスが通知されます。
実際に通知されているかはMyDNS.JPの※最新IP通知日時でわかります。
※タイムゾーンが日本時間になっていない場合があるので読みかえてください。

以上です。
SwiftのOptional(オプショナル)が少しややこしいのでまとめてみた


## 背景

Swiftのオプショナルは、概念としてはおなじみになってきているような気がしますが、自分も含め使い方や勘違いをしている方もそこそこいる気がするので、とりまとめてみました。


## そもそもSwiftにおけるnilとは?

* 空ポインタを意味するという意味ではない
  * 空ポインタはポインタが言語仕様上あることを前提にして、ポインタが指し示す箇所がないという意味であるから。
* しかし、変数や定数、関数の返り値、式の評価結果がエラーなどで想定されているものと違う場合その値をnilで表現する。

## オプショナル型とは？
* 通常の型だけでなく、特殊な場合にnilを値として持つことがある変数や式をオプショナル型という。
* 言い換えると、オプショナル型は特殊な場合にはnilが入ることを許容する型である。

## オプショナル型の使い方
* 型宣言の後ろにクエスチョンマークをつける
* 例えば、Int型のオプショナル型は Int?

```swift
var b: Int?
```


## オプショナルを学ぶ上で理解しにくいこと(その1)
* オプショナルとしての?はあくまで、宣言につける?のことである。実行時の?とは違う。またオプショナル(Optional)?とペアで使われるアンラップ(Forced unwrapping)!は実行時の！である。宣言時の!とは意味がことなる。今、どこの話をしているのかを頭のなかに、以下の表のマトリックスを意識すること。

具体的には以下のようなイメージである。

||宣言時|実行時|
|:---:|:---:|:--:|
|?|Optional型|Optional chaining |
|!|Implicitly Unwrapped Optional型|Forced unwrapping|

## オプショナルを学ぶ上で理解しにくいこと(その2)
* とにかくこの界隈は横文字がたくさんでくるので、それがそもそも何を意味しているかを整理する必要があります。よく出てくるキーワードは、オプショナルのアンラップ方法として整理して理解するのがよさそうです。


### オプショナルのアンラップの方法
* Forced unwrapping
* Optional chaining
* Optional binding
* 比較演算子 ※optional自体はアンラップせずに比較できるから結果をtrue,falseで取得
* Implicitly Unwrapped Optional型（有値オプショナル型）で宣言する ※そもそもアンラップしなくていいが、オプショナルの一種のアンラップ方法として
*/


## そもそも、なぜオプショナル型では条件判定をするのか？

オプショナル型の変数を選択するということはnilが入ることを許容している。
だからこそ、nilが入った場合のエラーハンドリングのためにif文の条件判定が必要。
注意としては、条件判定自体には、オプショナル型は開示指定をする必要はない。

```swift
var nagano: Int? = Int("1998")
if nagano != nil {
    print("nagano: \(nagano!)")
}
```

## if-let文は何が便利なの？
上記のようにオプショナル型の変数を条件判定をしたうえでアンラップするのはたとえば、オプショナル型が複数ある場合は、書き方が冗長になりがち。なので、もっと簡易に同じことを実現するが用意されている。それが、if-let文。オプショナル束縛(optional binding)とも呼ばれる。

```swift
let year: Int? = Int("2020")
if let y = year {
    print("あと\(y - 2016)年")
} else {
    print("エラー")
}
```

複数個のオプショナル型の値を処理するときは特に便利

```swift
let olympic: String? = "tokyo"
if let y = year, o = olympic {
    print("\(y) : \(o)")
}
```

## その他知っておいて損はないこと

### guard文
* guard文の特徴
  * 条件節に記述した条件が成立しなかった場合にelse節が実行されて、コードブロックから抜ける。
また、条件節にオプショナル束縛を記述した場合、そこで利用した変数や定数をguard文の後続の文で利用可能。

```swift
let stock = [ "01", "2", "4", "05", "8", "3", "q", "X", "10"]
for str in stock {
    guard let v = Int(str) else { //条件節が成立しない場合に実行される。if-let文だと条件節が成立する場合
        print(str + "??")
        break
    }
    print(v, terminator: "   ")
}

```

### nil合体演算子

以下のように、通常のif-let文や三項演算子より手軽に記述することができる。

通常のif-let文

```swift
var opv: String? = nil
let S = "なにか"
if let o = opv {
    print(o)
} else {
    print(S)
}
```

三項演算子

```swift
print((opv != nil) ? opv! : S)
```

nil合体演算子

```swift
print(opv ?? S)
```

nil合体演算子２つ以上に重ねることができる

```swift
let x: Int? = nil, y: Int? = nil, z: Int? = 3
let val = x ?? y ?? z ?? 0
print(val)
```

### 有値オプショナル型(implicitly optional型)
有値オプショナル型とは、暗黙的なオプショナル型は、空値（nil）をとり得るという意味では、
オプショナル型と同じですが、使用時にアンラップする必要がない。

```swift
let OlympicYear1: Int! = Int("2020") //宣言時に!を使う
print("あと\(OlympicYear1-2016)年") //アンラップの必要ない
```

よく見るケースとしては、IBOutletを設定した時の変数名が有値オプショナル型となっている。
これは、クラスがインスタンス化されたときには、IBOutletの値はnilが入っているが、その後
viewがloadされるタイミングで値が設定され、その後nilが入ることが通常ない場合ということ
なので有値オプショナル型がつかわれている。

```swift
@IBOutlet weak var myButton: UIButton!
```