OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】UITableViewのセルにチェックマークを入れる方法

# 単一選択

## デモ
![select.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/869501a6-997c-b447-f3f9-dca1e518a30d.gif)


## コード
```ViewController.swift
import UIKit

class CustomerSettingViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let fruits = ["Orange","Lemon", "Peaches", "Raspberry", "Papaya", "Avocado", "Blueberries", "Apricot", "Mango"]
        
    override func viewDidLoad() {
        super.viewDidLoad()

        let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
        let displayWidth: CGFloat = self.view.frame.width
        let displayHeight: CGFloat = self.view.frame.height
        let tableView: UITableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        
        tableView.dataSource = self
        tableView.delegate = self
        
        // trueで複数選択、falseで単一選択
        tableView.allowsMultipleSelection = false

        tableView.tableFooterView = UIView(frame: .zero)
        
        self.view.addSubview(tableView)
    }
    
    // セルが選択された時に呼び出される
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at:indexPath)

        // チェックマークを入れる
        cell?.accessoryType = .checkmark
    }
    
    // セルの選択が外れた時に呼び出される
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at:indexPath)

        // チェックマークを外す
        cell?.accessoryType = .none
    }

    // セルの数を返す
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return fruits.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "\(fruits[indexPath.row])"
       
        // セルが選択された時の背景色を消す
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        return cell
    }
}

```


# 複数選択

## デモ
![multiselect.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/505add17-9c1b-8acc-1d52-eed099cae23c.gif)


## コード
上記コードの```tableView.allowsMultipleSelection = false```を```true```に変更するだけ。
ExoPlayer(ver2)をとりあえず動かしたい人用全部デフォルトコード

詳しい説明は[こちら](http://qiita.com/sonken625/items/11f4c47a7d23786c95db)

とりあえずガイドを翻訳したのは上にあげたんですけどそんなのいいから動かしてみたいって人いるきがしたので（というか一番最初に僕が思ったことなので）ExoPlayerのVer2を一番簡単に動かすコード上げます。mp4とかmp3とか再生するだけならこれで十分じゃないですかね。あとはTextureView改造すればいい気がします。

最後Textureviewに入れてますが、このようにonFurfaceTextureAvailableより後でやらないと確かできなかった気がします。surfaceを設定することもできた気がします。

```java

 @Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

           DefaultBandwidthMeter defaultBandwidthMeter =new DefaultBandwidthMeter();
            TrackSelection.Factory videoTrackSelectionFactory =
                    new AdaptiveVideoTrackSelection.Factory(defaultBandwidthMeter);
            TrackSelector trackSelector =
                    new DefaultTrackSelector(mainHandler, videoTrackSelectionFactory);

            // 2. Create a default LoadControl
            LoadControl loadControl = new DefaultLoadControl();

            // 3. Create the player
            player =
                    ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl);

            // Produces DataSource instances through which media data is loaded.
            DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,
                    Util.getUserAgent(context, context.getString(R.string.app_name)), defaultBandwidthMeter);

            // Produces Extractor instances for parsing the media data.
            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();


            // This is the MediaSource representing the media to be played.
            MediaSource videoSource = new ExtractorMediaSource([再生したいメディアのUri(Uri.parse(URL文字列)でおけ)],
                    dataSourceFactory, extractorsFactory, null, null);



            // Prepare the player with the source.
            player.prepare(videoSource);

            player.setVideoTextureView(textureView);

}

```

ちなみにこれTextureView使ってますがもっと簡単な方法でSimpleExoPlayerViewを使う方法があります。再生ボタンとかまでぜんぶ作ってくれます。再生ボタンとか無効にして自分のオリジナルボタン作るのでもいいかもです。

```java:xml

  <com.google.android.exoplayer2.ui.SimpleExoPlayerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/playerView"/>

```

って適当にxmlに専用のViewが置けて、さっきのコードの最後を

```java

 player.prepare(videoSource); 

 SimpleExoPlayerView playerView =findViewById(R.id.playerView);

 playerView.setPlayer(player);

```
ってするだけです。なんて簡単。


で、ちなみになんですが、ExoPlayerは全部Javaで書かれてるからいろいろなところを変更できるよ！！って言ってたのでいいね！と思ったのですが、__interface以外のクラスが全部finalになってまして...__（これって普通なのかな...）

あーちょっとここ変えたいなぁオーバーライドしよ！！っておもってやってみると、それ以外のロードだったりレンダリングだったりの部分の膨大なコードを自分で実装しなきゃいけなかったりします。このデフォルトコード以外で簡単に変更できるのは正直bandwidthmeterだけなんじゃないかなぁとか思いました。
作者は正しい方向で使ってもらうために全部finalにしたよ！！みたいなこと言ってましたが...それっていいことなんですかね。そこら辺の常識に疎いです。

まあなのでよほどの変なことしないかぎりこのコードで十分な気もします。（僕は今そのよほど変なことをスルために苦戦してます。技術力がないだけな気がしますが。）
【質問】jqueryのプラグイン「mix it up」のクッキー保存について

質問です。
現在作成中のサイトで、jqueryのプラグイン「mix it up」を使用し、記事の絞り込み機能を搭載しております。

いくつかのタグボタンを用意し、そのボタンを押せば、そのタグがついた記事が絞り込まれるという仕組みです。

ページを更新すれば絞り込んだ内容がリセットされてしまうのですが、これを解決するため、クッキーを保存するプラグイン「jquery.cookie.js」を活用しようと考えておりますが、コードの書き方がわからず困っております。

```sample.html
<div class="style1">
　<div>
　　<div class="filter style2" data-filter=".a">青</div>
　　<div class="filter style2" data-filter=".b">赤</div>
　　<div class="filter style2" data-filter=".c">黄</div>
　</div>
</div>
<dl>
　<dd class="sort" data-sort="default">新着順</dd>
　<dd class="sort" data-sort="myorder:desc">価格の高い順</dd>
　<dd class="sort" data-sort="myorder:asc">価格の低い順</dd>
　<dd class="sort" data-sort="random">ランダム</dd>
</dl>
<div class="style3">
　<div class="mix a">青</div>
　<div class="mix b">赤</div>
　<div class="mix c">黄</div>
</div>
```

```sample.js
$('.style3').mixItUp({
	controls: {
		toggleFilterButtons: true,
		toggleLogic: 'and',
	},
	animation: {
		duration: 0,
	},
});

$('.style2').on('click', function(){
	$(this).toggleClass('style2b');
});
```

.style2のタグをクリックすると.style3の記事が絞り込み検索される仕組みです。
.style2をクリックすると同時に.style2bが付与され色が反転し、どのタグが選択されているか目視できるようにしています。
.mixにはdisplay:none;がかかっています。

このクッキーを保存して、ページが更新された場合に絞り込み検索および付与された.style2bが残っている状態にしたいと考えております。

独学で作成していて壁にぶつかっております。どうかご教授お願い申し上げます。
技術英語 > the tests actually could be performed [in any order] / in order of increasing importance

@ Code Complete (No. 14715 / 36077)

> the tests actually could be performed <font color=red>in any order</font>.

一方で、注意があるテストは「順番固定となったもの」。
その順番から変更した時にテストが壊れる(そして何故壊れたか分かりにくいソースとなっている場合がある)。

<hr>
関連して思い出したのは

in order of importance

自分の過去の質問とその回答
http://oshiete.goo.ne.jp/qa/8740542.html
「優先順位が低いものから」という言い方についての質問

> (1) in order of increasing importance

など色々な回答をいただいた。

http://english.stackexchange.com/questions/129563/name-for-phrase-of-words-in-increasing-significance
>  an arrangement in order of increasing importance.
標準出力と標準エラー出力

標準出力(std) 1
標準エラー出力(std_err) 2
aの出力先をbの出力先にマージする a>&b

標準出力のlogへのリダイレクト

```shell-session
bash script.sh > log
bash script.sh 1> log
```

標準エラー出力のlogへのリダイレクト

```bash
bash script.sh 2> log
```

標準出力→標準エラー出力の順でlogに一括してリダイレクト

```bash
bash script.sh > log 2>&1
```

1. 標準出力をlogにリダイレクト
2. 標準エラー出力のリダイレクト先を標準出力のリダイレクト先にマージ
3. 結果としてstd_errはlogに出力される
RedmineのMarkdownでTask listを使えるようにする


Redmine2.5からTextileに加えてMarkdownを選べるようになりましたが、GithubのMarkdownと比べてしまうと機能が少なくて物足りなさを感じていました。
Githubの`Github Flavored Markdown`は、Redmineが使っている`Redcarpet`をベースにしたようですが、今現在は全く別の道に進化が進んでいるようで機能差が出ているようです。  
自分にとって、タスクリストが使えないが特に不便に感じていたので、自作でプラグインを作ってみました。  

https://github.com/eichisanden/redmine_markdown_task_list


インストール
------------------------

1. cd $REDMINE_ROOT/plugins
1. git clone git@github.com:eichisanden/redmine_markdown_task_list.git
1. Redmineを再起動する.


アンインストール
------------------------

1. $REDMINE_ROOT/plugins/redmine_markdown_task_listを削除
2. Redmineを再起動する.

使い方
------------------------
やっていることは至ってシンプルで、`[x]`や`[ ]`をchekboxタグに置換して表示するだけです。
チケットでもWIKIでもマークダウンが書けるところならどこでも使えます。

```
- [x] Finish my changes
- [ ] Push my commits to GitHub
- [ ] Open a pull request
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/387/22c2a5ed-c964-2b41-76f3-f1bc325f4b58.png "image.png")

自分はチケットを別に切るほどでもない、簡易なタスクはこれで管理しています。
[Python]Numpyデータの行と列の入れ替え


### 前提
全てにおいて下記を実行しているとする

```ipython
import numpy as np

```

#### 3x3行列の作成

```ipython
arr = np.arange(9).reshape((3,3))

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
```

#### 行列の転置

```ipython
arr.T

array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
```

##### 行と列を入れ替えるtranspose

```ipython
arr.transpose()

array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
```


```ipython
arr.transpose((1,0))

array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
```

##### 軸を入れ替えるsapaxes
２つの軸に関して入れ替えるときに使用

```ipython
arr.swapaxes(1,0)

array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])

```

```ipython
arr.swapaxes(0,1)

array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
```

#### 行列の掛け算

```ipython
np.dot(arr.T,arr)

array([[45, 54, 63],
       [54, 66, 78],
       [63, 78, 93]])
```

#### 3次元の行列入れ替え

2x2の行列が3つ積み上がってる

```ipython
arr3d = np.arange(12).reshape((3,2,2)) 
arr3d

array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])

```

```ipython
arr3d[0]

array([[0, 1],
       [2, 3]])
```

##### 3次元行列にたいしてtransposeを使ってみる

第1引数:0 → 2x2の行列が3つ積み上がっていることに対してはなにもしない
第2引数:2 → 2x2の行列の転置
第3引数:1 → 2x2の行列の転置

```ipython
arr3d.transpose((0,2,1))

array([[[ 0,  2],
        [ 1,  3]],

       [[ 4,  6],
        [ 5,  7]],

       [[ 8, 10],
        [ 9, 11]]])
```
ウィキデータの紹介#7

これまで主にデータを入力する話をしてきましたが、ここからようやく出力側の話です。
# [Ask me anything](https://askplatyp.us/?lang=en&q=Who+is+the+mayor+of+Tokyo%3F)
ウィキデータを利用したアプリケーションのひとつで、自然言語で質問すると（うまく行けば！）答えが返ってきます。いまのところまだアルファ版で英語にしか対応していないので「Who is the mayer of Tokyo?」と入れてみましょう。

![Who is the mayor of Tokyo  — Platypus.png](https://qiita-image-store.s3.amazonaws.com/0/35320/b750e478-fe33-754c-1007-fe41733bdea2.png)

回答とその補足説明が表示されました。質問欄左側にある「X」に似たボタンを押すと、ランダムに質問サンプルが表示されるのでよろしければ[お試し](https://askplatyp.us/?lang=en&q=Who+is+the+mayor+of+Tokyo%3F)ください。発音に自信のある方はマイクのボタンを押して質問を英語でしゃべってみてください。（私はあきらめました）

ウィキデータでは項目に対してプロパティと値で属性、カテゴリ、関係性といったものを付加していきますので、このように意味的な解釈をして回答することができるのです。
正しい答えが返って来ない場合、データの方は自分でチューニングできるのでこれだけでも結構楽しいです :) この質問の回答は当初舛添さんだったので[「東京都」](https://www.wikidata.org/wiki/Q1490)という項目の[「地方行政府の長」](https://www.wikidata.org/wiki/Property:P6)というプロパティに小池さんを値として追加しました。

![東京都_地方行政府の長.png](https://qiita-image-store.s3.amazonaws.com/0/35320/d81362fc-bd83-548e-e266-27785b372438.png)

データをミラーして使っているようで、私の場合は反映されるまでに1週間ほどかかりました。

# [Reasonator](https://tools.wmflabs.org/reasonator/?)
ウィキデータの項目のブラウザとして割とスタンダードになっているのがこのアプリケーションです。
![Reasonator.png](https://qiita-image-store.s3.amazonaws.com/0/35320/8d98be27-aec9-b74b-ec7a-449cdd28321a.png)
中央下部にあるサンプルを選んだり、右上の検索窓で項目名を入れるとその内容をビジュアルに表示してくれます。英語がデフォルトなので右上のOtherをクリックして個人設定しておけば自分が使える言語で初期表示してくれます。

![Reasonator_personal_setting.png](https://qiita-image-store.s3.amazonaws.com/0/35320/878ea3ff-39ef-6042-1758-b6f5dc78d13d.png)

個人設定を右上の✕で閉じて右上の検索窓で「東京都」と入れてみましょう。

![Reasonator_東京都_一覧.png](https://qiita-image-store.s3.amazonaws.com/0/35320/6eecefbb-baa9-c127-a04c-4f0beb7d9b66.png)

リスト1番目の「東京都」を選ぶと、東京都の情報のうち、代表的なものが[ビジュアルに表示](https://tools.wmflabs.org/reasonator/?&q=1490)され、たいていの情報にリンクが張られています。

![東京都_all_Reasonator.png](https://qiita-image-store.s3.amazonaws.com/0/35320/08f89f74-62bd-7f65-c43d-ca6f69844b2f.png)

これが[ウィキペディア](https://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E9%83%BD)との違いです。人間に理解できるインタフェースを使いながら、情報を機械にも理解できる形式で入力しているからこそ、こういった表現ができるのです。情報はそれぞれ意味を持つデータとして分割され、機械が解釈できる限りそのつながりをたどって様々な他のデータを自動的に探すことができます。オープンデータを機械可読な形式で出すと良いのはなぜか、そのビジュアルな回答のひとつであるといえるでしょう。

[ウィキデータの紹介#6](http://qiita.com/higa4/items/f050d68e52039a2a607b) | [ウィキデータの紹介#8](http://qiita.com/higa4/items/daeca854c3d666233811)
kobo電子書籍リーダーの初期セットアップをスキップする方法

# 全体概要
koboの初期セットアップをスキップするには，本体内のsqliteデータベースファイルにレコードを追加する必要があります．

本体内のデータベースファイルは，koboをPCに接続した時にマウントされるドライブに格納されています．ですから，この状態でPCからレコードを追加することができます．

レコードを追加してPCとの接続を解除するとkoboは初期セットアップを済ませた状態と同様の，ホーム画面を表示する状態に遷移します．

以降，通常の操作ができるようになります．

# 用意するもの
* kobo本体
* PC (OSはお好みのものを)
* kobo本体と用意したPCを接続するUSBケーブル
* 用意したPCで動作する，sqliteのデータベースファイルを操作できるソフトウエア

今回はOSにWindows 10 Professional 64bitを，データベースファイルを操作するソフトウエアに[DB Browser for SQLite](http://sqlitebrowser.org/)を用いて説明します．

ソフトウエアはあらかじめインストールしておき，使える状態にしておいてください．

# 作業手順
1. koboをPCに接続します．
2. DB Browser for SQLiteを起動します．
3. 「Open Database」ボタンを押下して，本体内のデータベースファイルを選択し，「開く」ボタンを押下します．`(ドライブレター):/.kobo/KoboReader.sqlite`がデータベースファイルです．
![kobo_regskip01.png](https://qiita-image-store.s3.amazonaws.com/0/145505/9485f591-ceb8-5caf-38d1-6153357d3456.png)

4. 「Browse Data」タブを選択し，「Table」には「user」を指定します．
![kobo_regskip02.png](https://qiita-image-store.s3.amazonaws.com/0/145505/8bd878ef-742f-3e3c-4a60-bcc410e3749c.png)

5. 「New Record」ボタンを押下し，新しいレコードを生成します．
6. 新しいレコードに値を入れていきます．
    7. 昔からよく使われている値は「名称と同じもの」です．`UserID`には`UserID`と入力する，ですね．
    7. ただし`__DeviceID`には，何も入力しないでください．3.19.5613以降のバージョンではここを空にしないと，一度もサーバと同期していない旨のメッセージが表示され，データベースファイルが初期化されます．
![kobo_regskip03.png](https://qiita-image-store.s3.amazonaws.com/0/145505/cb417a67-c12d-69b5-be9f-7168f6a90782.png)

7. 「Write Changes」ボタンを押下し，変更をデータベースファイルに反映させます．
![kobo_regskip04.png](https://qiita-image-store.s3.amazonaws.com/0/145505/41744a28-562b-b5b0-3d45-19f4390a5ff5.png)

8. DB Browser for SQLiteを終了します．
9. koboとPCの接続を解除します．

以上でホーム画面が表示されます．

# おわりに
本手順は，ずいぶん前から広く知られているものです(3.19.5613での仕様変更を除き)．ですから改めて書く必要性は低いわけですけれども，自分向けのメモの意味合いが強いです．

# 参考文献
- [Kobo Touch Hacking](http://wiki.mobileread.com/wiki/Kobo_Touch_Hacking)
- kobo (E Ink) hacking スレ Part.8 #987
Vim の Python 3 インターフェイスとして embeddable な Python を使う

#問題

Windows の話。
ふだん Python 環境は Anaconda に頼っているので、当然 Vim の Python 3 インターフェイスとしても Anaconda の Python 3.5 を参照させたいが、VC10 (Vim)、VC14 (Anaconda) とVCのバージョンが違うため gVimから Anaconda の `python35.dll` を使おうとすると Vim 起動時に落ちてしまって出来ない。

Vim を VC14 でコンパイルすれば解決するかもしれないが、Kaoriya さん配布のバイナリが使えないのはつらいので、Anaconda ではない素の Python (こちらはVC10) を別途インストールして凌いでいた。

しかし、Anaconda が圧倒的に便利で、素の Python は使わないため、できればインストールしたくない。

#対応

https://www.python.org/downloads/windows/
上記で配布されている **Windows x86 embeddable zip file** をダウンロードして、
Vim のインストールディレクトリに以下の2ファイルを置く。

- `python35.dll`
- `python35.zip`

一種のインストールと言えなくもないが、2ファイル置くだけだし、コンパイルもパスを通す必要もない。これで Python インターフェースが使えるようになる。

`netupvim` や `diff`、`pt` なんかも置いてあるので、この際 Vimのディレクトリが汚れるのは気にしない。

#その他

後は、これまで同様に、こちらなどを参考に `jedi.vim` から Anaconda が見えるよう `ftplugin/python.vim` を設定しておく。
http://qiita.com/repli/items/2bc6986f0be94555348a

Mac の場合は、`brew install python3` し、
`pythonthreedll` と `pythonthreehome` を設定する。

```viml:.vimrc
if has('vim_starting')
    if has('macunix')
        " brew install python3
        set pythonthreedll=
            \/usr/local/Cellar/python3/3.6.4_2/
            \Frameworks/Python.framework/Versions/3.6/Python
        set pythonthreehome=
            \/usr/local/Cellar/python3/3.6.4_2/
            \Frameworks/Python.framework/Versions/3.6

    elseif has('win32')
        " embed 版のpython をダウンロードして vim と同じフォルダに置く。
        "   python35.dll
        "   python35.zip

    endif
endif
```
PostgreSQLで緯度経度指定の２点間の距離を求める関数※地球を平面と仮定した式なので近距離用

PostgreSQLで緯度経度指定の２点間の距離を求める関数を作りました。

実際には以下のサイトのPHPコードを移植したものです。
[緯度経度より距離を求める方法・備忘録 ｜ 地球は丸い！](https://web.archive.org/web/20150104145354/http://www.kiteretsu-so.com/archives/1183)
※ 残念ながら現在サイトが閉鎖されてしまいましたのでインターネットアーカイブへのリンクです。

# コード(plpgsql)
```plpgsql

CREATE OR REPLACE FUNCTION latlon_to_dist(lat1 float,lon1 float,lat2 float,lon2 float) RETURNS float AS $$
-- 2地点間の距離を求める (Km)
-- lat1,lon1:地点1の緯度,経度
-- lat2,lon2:地点2の緯度,経度
DECLARE diffLatitudeRad float;
DECLARE diffLongitudeRad float;
DECLARE r float;
DECLARE diffLatitudeKm float;
DECLARE diffLongitudeKm float;
BEGIN

diffLatitudeRad := (lat1-lat2) * pi()/ 180.0; -- 緯度差(RADIAN)
diffLongitudeRad := (lon1-lon2) * pi() / 180.0; -- 経度差(RADIAN)
r := 6378.137; -- 地球の半径
diffLatitudeKm = diffLatitudeRad * r;
diffLongitudeKm = cos( lon1*pi()/180.0) * r * diffLongitudeRad ; -- 緯度方向の距離(Km)
RETURN sqrt(diffLatitudeKm*diffLatitudeKm + diffLongitudeKm*diffLongitudeKm); -- ２地点間の距離(Km)
END;
$$ LANGUAGE plpgsql;
```

# 利用例
```
select latlon_to_dist(35,139,36,140);
-- 
139.464554992979
```

(緯度:35,経度:139）から(緯度:36,経度:140）までの距離を求めています。
結果は139.464554992979Kmとなりました。
JavaScriptで月の加算

加算前の日付が月末だと、単純に月の加算をすると意図した結果にならない。
意図する結果については場合によると思うが、今回は加算した月の末日としたい場合。
例えば、`2016/01/31`に１ヶ月後を取得したら`2016/02/29`としたいが、以下のように単純に月を加算すると、実行結果は`2016/03/02`となる。

```JavaScript
function addMonths(date, months) {
    var resultDate = new Date(date.getTime());
    resultDate.setMonth(date.getMonth() + 1);
    return resultDate;
}

var date = addMonths(new Date("2016/01/31"), 1);
```

これは月を加算すると`2016/02/31`となり、2月は29日（2016年は閏年）までしかなく、2日はみ出てしまうから。

月末日に調整したい場合は、以下のように日にちを判定して補正してあげれば`2016/02/29`となる。
（`setDate(0)`は前月の月末となる）

```JavaScript
function addMonths(date, months) {
    var resultDate = new Date(date.getTime());
    resultDate.setMonth(date.getMonth() + 1);
    if (date.getDate() > date.getDate()) {
        resultDate.setDate(0);
    }
    return resultDate;
}

var date = addMonths(new Date("2016/01/31"), 1);
```
PowerShellメモ　別のユーザーとして実行、管理者として実行

# 概要
別のユーザーとして実行する方法と管理者として実行する方法。

# 書式
```PowerShell
# 別のユーザーとして実行
Start-Process 【コマンド】 -Verb RunAsUser

# もっと短く
start 【コマンド】 -verb runasuser
```

```PowerShell
# 管理者として実行
Start-Process 【コマンド】 -Verb RunAs

# もっと短く
start 【コマンド】 -verb runas
```

# 実行例
```PowerShell
start 'C:\Program Files\Internet Explorer\iexplore.exe' -verb runasuser
```

# 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)
【大枠】button_toはデフォルトでpostでHTTPメソッドを飛ばす

#button_toはデフォルトでHTTPメソッドがpostになる。
userの編集ボタンを実装している際に、ハマってしまった。
button_toは、きちんとルーティングが指定されていてもデフォルトでHTTPメソッドpostを使用するようになっているため、下記の記述ではエラーが発生する。

`= button_to '編集', edit_user_path(shibuya)`

編集するためにHTTPメソッドgetを使用したいので指定する記述を書く必要がある。

`= button_to '編集', edit_user_path(shibuya), method: :get`

method: :getと記述し、HTTPメソッドを指定してあげることでエラーが解決した。
**指定しなければbutton_toはHTTPメソッドがpostになると覚えておこう!**
レスポンシブフォントサイズの練習と疑問

# はじめに
viewportに比例してフォントサイズが変動する奴です。
※このテクニックの一般的な名称が不明。

## 1
とりあえずこれだけでもいける。

```
html {
  font-size: calc(100vw * .03126);
}

/* min */
@media(max-width: 320px) {
  html {
    font-size: calc(320px * .03126);
  }
}

/* max */
@media(min-width: 521px) {
  html {
    font-size: calc(520px * .03126);
  }
}
```

[Demo](https://codepen.io/torosalmon/pen/RjpyQb)

この方法ではviewportのサイズ変更に完全連動した動きになります。
「これ以上フォント大きくならなくていいよ」の点にメディアクエリを置く考え方。
フォントサイズが大きすぎたので補正値を掛けていますがこれは320px時に1.6remを指定した要素が16pxになったので0.03126としました。
フォントの拡大が極端すぎるようにも見えますが、「一行あたりの文字数」のバランスを崩したくないシチュエーションであればこれはこれで使えるのかも。

## 2 
http://fvsch.com/code/css-locks/
http://coliss.com/articles/build-websites/operation/css/font-size-value-for-responsive.html
こちらの記事では
「viewport〇〇px時にfont-size〇〇」←→「viewport△△px時にfont-size△△」
「その中間をリニアにfont-sizeが遷移していく」と、更に汎用性の高いロジックが紹介されてました。すごい！
この方法は1のパターンよりも精密なサイズ指定が可能になりますね。

## 3
で、
「62.5%をルートに指定して子要素をremで記述しているサイト」に対し、
「各子要素の個別指定font-sizeをなるべく再調整しない形」で
上記サイトのテクニックを導入してみたいと思います。

```
html {
  font-size: calc(.78125vw + 7.5px);
}

/* 10px */
@media(max-width: 320px) {
  html {
    font-size: 62.5%;
  }
}

/* 15px */
@media(min-width: 961px) {
  html {
    font-size: 93.8%;
  }
}
```

[Demo](https://codepen.io/torosalmon/pen/gXmzda)

「320px時にルートがfont-size:10px」
「960px時にfont-size:15px」
になります。
子要素が1.6remと指定されていた場合は16px～24pxの遷移になります。

0.78125vwの式は
`(max font-size px - min font-size px) / (max viewport px - min viewport px) * 100 = vw`
で求めています。
`(15px - 10px) / (960px - 320px) * 100 = 0.78125`

これだけでは増加率が噛みあわず、閾値をまたぐ際にfont-sizeがガクっとなってしまうので、ここに7.5pxを足したらスムーズに遷移するようになりました。
しかしなぜ7.5px加算でうまくいくのか、どこから算出された数字なのかが分かりません。
（7.5pxは目分量で微調整しながらなんとなくうまくいってる数値を割りだしただけで根拠不明の数値です。）

```
font-size: calc(1.25vw + 12px);
@media(max-width: 320px) {font-size: 100%;}
@media(min-width: 961px) {font-size: 150%;}
```

16px～24pxで試した場合は+12pxでちょうどよくなりました。

```
font-size: calc(2.1875vw + 3px);
@media(max-width: 320px) {font-size: 62.5%;}
@media(min-width: 961px) {font-size: 150%;}
```

10px～24px遷移の場合、こちらは+3px
最大font-sizeの÷2かと思ったけど+3px…？

全て目分量の調節で割り出したあてずっぽうの値なので、正確には小数点以下の数値が正解なのかもしれません。
本来これはなんらかの式で割り出せるものと思われるのですが、補正値の算出法が分かる方がいらっしゃいましたら是非教えてください。

-----------------

### 参考サイト
* ロジック：http://fvsch.com/code/css-locks/
* 翻訳：http://coliss.com/articles/build-websites/operation/css/font-size-value-for-responsive.html
* font-size数値換算：http://pxtoem.com/
Youtubeの埋め込みタグを編集せずにレスポンシブ化

# はじめに
「YouTube レスポンシブ」などでググるとdivとかでiframeを囲ってiframeにposition:absolute;を掛けるやり方が出てくる。
↓
「埋め込み利用側にタグを編集する手間を掛けさせずに同機能を実現したいなぁ」

## 1
てっとりばやくレスポンシブ化というだけであればheightにvwを指定するだけで達成できました。
動画のアス比を16:9と仮定して、「9 / 16 * 100 = 56.25vw」をheightに入れます。

```css
iframe {
    width: 100%;
    height: 56.25vw;
}
```

[Demo](https://codepen.io/torosalmon/pen/QOpxja)

## 2
コンテンツの左右に余白がある場合、heightにも余白分の補正を入れる必要があります。

```css
.container {
  width: 90vw;
  margin: auto;
}

iframe {
  width: 100%;
  height: calc(56.25vw * .9);
}
```

```text
container vw / viewport = n
90vw / 100vw = 0.9

56.25% * 0.9 = height
```

[Demo](https://codepen.io/torosalmon/pen/GOWGoj)

## 3
全てのiframeにCSSが適用されてしまっては困るので特定のiframe（今回はYouTube埋め込み）だけに適用するようにしたいです。
iframeにclassを追加してしまうのが早いですが、それでは埋め込みタグ編集不要という趣旨から外れてしまうのでドメインをセレクタで引っ掛ける方法にしてみました。

```css
iframe[src*='youtube.com'],
iframe[src*='youtube-nocookie.com'],
iframe[src*='youtu.be'] {
  width: 100%;
  height: calc(56.25vw * .9);
}
```

埋め込みタグのドメインは他にもあるかもしれません。（調査してないです）
RDSに作成したMySqlのDatabaseに日本語が登録出来ない問題

# 問題
AWSのRDSにMySQLのインスタンスを作成し、RailsからDBを作成した際に、日本語が文字化けしていた。

RDSは下記の手順で作成していた

1. インスタンスの作成
2. パラメータグループの作成し、下記の項目にutf8を選択
 * character_set_client
 * character_set_connection
 * character_set_database
 * character_set_results
 * character_set_results
3. 作成したインスタンスのパラメータグループを２．で作成したパラメータグループに変更
4. インスタンスの再起動
これで日本語対応完了と思っていた。

実際にRailsのアプリからデータを投入すると、投入したデータの日本語が文字化けしている。

EC2にSSHで接続し、EC2からRDSにmysqlCommandでアクセスしてDBの状態を確認する。

`mysql -h エンドポイント -P Port -u ユーザ名 -p データベース名`

アクセス出来たら`show variables like 'char%';`で確認

```
mysql> show variables like 'char%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |
| character_sets_dir       | /rdsdbbin/mysql-5.7.11.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.01 sec)

mysql>
```
character_set_databaseが`latin1`になっている！？

インスタンスを作成する際に読み込んだパラメータグループがデフォルトであったため、再起動しても、databaseの文字コードは新しい設定になっていない模様。。。

# 解決策
下記のコマンドを実行してdatabaseの文字コードを修正

```
mysql> ALTER DATABASE データベース名 default character set utf8;
Query OK, 1 row affected (0.01 sec)

mysql> show variables like 'char%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | utf8                                      |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |
| character_sets_dir       | /rdsdbbin/mysql-5.7.11.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.01 sec)

mysql>
```

すでにテーブルも作成している場合、テーブルの文字コードも変更する必要がある
`ALTER TABLE テーブル名 CONVERT TO CHARACTER SET UTF8`


# RDSのインスタンス作成時に対応する
なお、インスタンスを作成する前にパラメータグループを作成し、utf8の設定と一緒に`skip-character-set-client-handshake`に`1`を設定する。
その後、インスタンスの作成時、パラメータグループに作成したパラメータグループを選択するようにすると、
インスタンス作成時に、`character_set_database`がutf8で作成される。

次回設定するときは、先にパラメータグループを作成してからインスタンスを作成しよう。。。
dein.vimを入れてカラースキームが反映されなくなった時の確認事項

環境
CentOS 6.7
Vim 8.0.45

Vimのプラグインマネージャーであるdein.vimを入れて、.vimrcに設定をするとカラースキーム（色付け）が反映されなくなった場合あります。

その場合は、.vimrcにおいて、dein.vimに関する設定の後に、syntax onやcolorschemeを設定するとカラースキームが反映します。

参考記事
https://teratail.com/questions/37382
ポインター間のstatic_castの実行時コスト

# 結論

一般にnullptrチェックのコストがかかると思われます．

なお，この記事では，アドレス値のコピーのコストについては議論しません．

# 詳細

C++において，ポインター間のstatic_castを行った場合，コンパイラーによって，必要なアドレスのオフセット値が算出され，その値をアドレスに加算するコードが生成されます．Cだとオフセット値を算出して加算するコードを明示的に書かないといけません（もちろん，ちょっとしたマクロを書けばタイプ量を減らすことは可能です）．

C++のstatic_castはとても便利なのですが，仕様上nullptrはキャストしてもnullptrとなるため，単純にアドレスにオフセット値を加算するわけにはいきません．

例えば，以下のようなポインター間のstatic_castを行った場合，

```cpp:test.cc
// 単一継承の場合や，Bがメンバ変数を持っていない場合（多分コンパイラー依存）などは，
// static_castのnullptrチェックは発生しないと推測されるので，ここでは扱わない
class A { int a; };
class B { int b; };
class C : public A, public B {};

int main() {
  C c;
  B* b = static_cast<B*>(&c);
  return 0;
}
```

以下のようなコードが生成されます．

```shell-session
$ clang++ -std=c++11 -S -emit-llvm test.cc  # 最適化オブションなし
```

```llvm:test.llからの抜粋
; Function Attrs: norecurse nounwind uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  %c = alloca %class.C, align 4
  %b = alloca %class.B*, align 8
  store i32 0, i32* %1, align 4
  %2 = icmp eq %class.C* %c, null
  br i1 %2, label %7, label %3

; <label>:3                                       ; preds = %0
  %4 = bitcast %class.C* %c to i8*
  %5 = getelementptr inbounds i8, i8* %4, i64 4
  %6 = bitcast i8* %5 to %class.B*
  br label %7

; <label>:7                                       ; preds = %3, %0
  %8 = phi %class.B* [ %6, %3 ], [ null, %0 ]
  store %class.B* %8, %class.B** %b, align 8
  ret i32 0
}
```

アドレスに対してオフセット値を加算する前に，nullとの比較を行っていることがわかります．

最適化によって，確実にnullptrではない場合は，nullptrチェックを行わずアドレスにオフセット値を加算するコードを生成する場合があります．しかし，一般的にはnullptrかどうかは実行時に判定する必要があります（動的リンクされる共有ライブラリに含まれる関数・メソッドを呼び出す場合を考えるとよいかもしれません）．そのため，仮に関数・メソッドの事後条件でnullptrでないことが保証されていたとしても，nullptrチェックがstatic_castの実行時コストとしてかかるものと考えられます．

あまり深く考えたわけではないため，間違っているかもしれませんが，多分static_castのnullptrチェックを強制的になくすようなコードを書くことはできないものと思います．もちろん，reinterpret_castを使い，オフセット値の加算を明示的に書けば，Cのようにnullptrチェックをなくせるでしょう．
Realm Object Serverで認証は通るのにSyncができないときは・・・

なんか Realm Mobile Platform を触ってみた　みたいなブログ記事は見かけるのですが、
みんなMacOS上でデバッグ鯖うごかして、「おー同期してるー」　で満足しちゃってて、
ハマりポイントにあまり触れてないので、そこだけメモっておきます。

## はまったこと

`"http://" + SERVER + ":9080/auth` で認証して、
`"realm://" + SERVER + ":9080/~/default` をSyncConfiguration.Builder に与えたら動くと思うじゃない？

端末側で**HTTPプロキシ**を設定していると、
SERVER がIPアドレスだったら動くけど、 "hogehoge.example.com" みたいなホスト名だったら、認証だけ通って、sync-serverに接続できないことがあるっぽいのです・・・！

50人に1人くらいはきっとハマるとおもいます。ぜひお気をつけ下さい。

　
## おまけ

検証用に作った[Dockerイメージ](https://hub.docker.com/r/yusukeiwaki/realm-object-server-centos6/) と[テストアプリ](https://github.com/YusukeIwaki/RealmSample2)を一応シェア。
＃完全に使い捨て用です

```
docker pull yusukeiwaki/realm-object-server-centos6
docker run -d -p 9080:9080 yusukeiwaki/realm-object-server-centos6
```
MySQL Workbench BLOB 画像ファイル登録方法

#MySQL Workbench 画像ファイル登録

1.BLOB型の画像登録用カラムを作成

2.`SELECT * FROM テーブル名；`を実行

3.FormEditorに切り替える
　BLOB型のカラムが存在する場合Viewボタンが表示される
4.画像Pathを設定

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/145627/167eee49-70b5-0203-5740-12d26b885844.png)

Pathを設定するとバイナリファイル化される
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/145627/4adc0496-8a4f-a910-16a0-89bcb5d687dd.png)

5.INSERT文実行
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/145627/5dd01b41-b910-aa28-457c-9bb3b790bf82.png)

imagesカラムに画像が登録されている
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/145627/326c37c5-3415-de59-0913-ed9504d56f24.png)
実験屋の為のノイズ合成（ガウシアンの畳み込み）

#背景
実験をやっていればノイズが必ず現れ、事前に大きさを評価したいときもある。
ノイズの原因が複数という場合があり、そのときの数学的扱いを考える。

#結論
複数の観測値のノイズの大きさが$\sigma_1,\sigma_2,\sigma_3,\cdots$のとき、観測値の和に乗るノイズは$\sqrt{\sigma_1^2+\sigma_2^2+\sigma_3^2+\cdots}$となる。
(2018/5/17：表現を変更)

#説明（ガウシアンの畳み込みを使う）
ノイズはガウシアン（正規分布）に乗るとする。この仮定は多くの場合正しい（と思う）。
2つの物理量（の線形変換）の和が求める物理量だとしよう。なので2つの独立したガウシアンに従う確率変数の和がどのような分布に従うか求める。
ガウシアンは線形変換してもガウシアンなので平均値はどちらも0とする。

2つの物理量$X_1,X_2$がそれぞれガウシアン

```math

f(X_1) = \frac{1}{\sqrt{2\pi}\sigma_1}\exp\Bigl[ -\Bigl( \frac{X_1}{\sigma_1}\Bigr)^2 \Bigr] \\
g(X_2) = \frac{1}{\sqrt{2\pi}\sigma_2}\exp\Bigl[ -\Bigl( \frac{X_2}{\sigma_2}\Bigr)^2 \Bigr]

```
に従うとする。ここで$\sigma_{1,2}^2$はそれぞれ$X_{1,2}$の分散である。


このとき新たな確率変数$Y=X_1+X_2$を定義する。

$X_1=t,X_2=Y-t$とおいて$t$が実数全体を走るとき$X_1,X_2$の和が$Y$となる事象をすべてカバーできる。
よって$t$が$t\sim t+ dt$の間に来る確率をすべての$t$について足し上げれば（＝積分すれば）$Y$に対する確率密度を求めることができる。

これが畳み込みである。

あとはガウス積分やらをなんやかんややれば良い。

```math
\begin{align}
h(Y) &= \int_{-\infty}^{\infty}f(t)g(Y-t)dt \\
     &= \frac{1}{2\pi\sigma_1\sigma_2}\int_{-\infty}^{\infty}\exp\Bigl[ -\Bigl( \frac{t}{\sigma_1}\Bigr)^2-\Bigl( \frac{Y-t}{\sigma_2}\Bigr)^2 \Bigr] dt \\
 &= \frac{1}{2\pi\sigma_1\sigma_2}\int_{-\infty}^{\infty}\exp\Bigl[ - \frac{t^2}{\frac{1}{\sigma_1^2}+\frac{1}{\sigma_2^2}} + \frac{2Yt}{\sigma_2^2} - \frac{Y^2}{\sigma_2^2}\Bigr] dt \\
&= \frac{1}{2\pi\sigma_1\sigma_2}\int_{-\infty}^{\infty}\exp\Bigl[ - \frac{1}{\frac{1}{\sigma_1^2}+\frac{1}{\sigma_2^2}} \Bigl( t - (\frac{1}{\sigma_1^2}+\frac{1}{\sigma_2^2})\frac{Y}{\sigma_2^2}\Bigr)^2- \frac{Y^2}{\sigma_1^2+\sigma_2^2}\Bigr] dt \\
&= \frac{1}{\sqrt{2\pi} \sqrt{\sigma_1^2+\sigma_2^2}} \exp\Bigl[- \frac{Y^2}{\sigma_1^2+\sigma_2^2}\Bigr]  \\
\end{align}
```

となって分散$\sigma_1^2+\sigma_2^2$、標準偏差$\sqrt{\sigma_1^2+\sigma_2^2}$のガウシアンに従うことが分かった。

つまりノイズは個々の要素の自乗和の平方根である。
これは物理的に考えても、どちらかノイズを0にしても最低もう片方のノイズ分はのることと整合する。

#おまけ
片方の寄与がもう一方の3分の1のとき、$\sqrt{X^2+(X/3)^2}=\sqrt{10/9}X \simeq 1.05X$となり5%の増加しか生じない。
ノイズを大まかに評価するときは無視してもよい。
エディタ拡張で仕切り線を描く

エディタ拡張をしていると仕切り線がほしくなることがありますが、そのような機能は残念ながら今のところありません。
しかし `GUILayout.Box` を使えばそれっぽいものを描くことができます。

`GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1));`

これだけ。高さは1にしてしまいます。

ちなみに、Boxにも `EditorGUILayout.BeginHorizontal()` と `GUILayout.Space()` は有効であるため、これらを使うことでインデントに対応できます。
コードはこちら。

```C#:EditorGUILayoutEx.cs

using UnityEngine;
using UnityEditor;

public class EditorGUILayoutEx {

    /// <summary>
    /// インデントレベル設定を考慮した仕切り線.
    /// </summary>
    /// <param name="useIndentLevel">インデントレベルを考慮するか.</param>
    public static void Separator(bool useIndentLevel = false)
    {
        EditorGUILayout.BeginHorizontal();
        if (useIndentLevel)
        {
            GUILayout.Space(EditorGUI.indentLevel * 15);
        }
        GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1));
        EditorGUILayout.EndHorizontal();
    }

    /// <summary>
    /// インデントレベルを設定する仕切り線.
    /// </summary>
    /// <param name="indentLevel">インデントレベル</param>
    public static void Separator(int indentLevel)
    {
        EditorGUILayout.BeginHorizontal();
        GUILayout.Space(indentLevel * 15);
        GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1));
        EditorGUILayout.EndHorizontal();
    }
}


```

使用例とそのコードはこんな感じです。

![2016-10-23_00h43_39.png](https://qiita-image-store.s3.amazonaws.com/0/31480/2c7fdcbb-abc4-bf07-219a-79abc4aebbb2.png)

```C#:SampleClass.cs

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(SampleClass))]
public class SampleClassInspector : Editor {

    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        EditorGUI.indentLevel = 1;
        GUILayout.Label("----- 以下インデントレベル1 -----");

        EditorGUILayoutEx.Separator();
        EditorGUILayout.PrefixLabel("↑ レベル無視インデント0");
        EditorGUILayoutEx.Separator(true);
        EditorGUILayout.PrefixLabel("↑ レベルに従う");

        GUILayout.Space(10);

        EditorGUI.indentLevel = 0;
        GUILayout.Label("----- 以下インデントレベル0 -----");

        EditorGUILayoutEx.Separator(2);
        EditorGUILayout.PrefixLabel("↑ レベル無視インデント2");
        EditorGUILayoutEx.Separator(3);
        EditorGUILayout.PrefixLabel("↑ レベル無視インデント3");
    }
}

```

参考：http://answers.unity3d.com/questions/216584/horizontal-line.html (ベストアンサーのコメント末尾)
無料でHTTPS対応！Let’s EncryptでSSL/TSLに対応する

概要
-------
[Let's Encrypt](https://letsencrypt.org/)は[GoogleやCiscoなどメジャーな企業がスポンサーをしている](https://letsencrypt.org/sponsors/)信頼性のあるオープンで無料のTSL(SSL)認証局(CA)。
しかも、ツールが提供されており、簡単に証明書をインストールできる。
つまり、**簡単**に**無料**でオレオレ証明書を卒業して、サーバでhttpsが使えるということ！

ここでは、ubuntu x apacheを前提にする。

### 手順
* はじめはマニュアルでcertbot-autoを実行してインストール。
* あとはrenewサブコマンドをcronで毎日実行する。

これで、毎日のrenew実行で、サーバにインストールした証明書の内、更新がものだけ更新してくれる。

準備
--------------------
対象となるドメインがhttpでアクセス可能である必要がある。
細かいことは、この記事を見ている時点でわかっていると思うので割愛する。

* 対象のドメインが目的のサーバに向くようにレコードを設定する
* `/etc/apache2/sites-available`に通常のhttpでの設定ファイルを作成
* サイトを有効にする  

```bash
$ sudo a2ensite 000-your-site.conf
```

* アパッチを再起動する（なぜか`restart`ではだめだった）  

```bash
$ sudo apache2ctl stop
$ sudo apache2ctl start
```

ブラウザでドメインにアクセスして配置した.htmなどが表示されればOK。

ここからが、本題。

証明書のインストール
--------------------
### ツールのインストール
どこでもいいが、とりあえずホームディレクトリにインストールする

```bash
$ cd
$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
```

### 証明書インストール＆設定修正
全部自動でやってくれる！

```bash
$ ./certbot-auto --apache
```
`/etc/apache2/sites-available`からサイトを自動検出するので、SSLを導入したいサイトに`*`をつける。
スペースキーで`*`のON/OFF切り替えが可能。

![certbot1.png](https://qiita-image-store.s3.amazonaws.com/0/138322/3f5d9059-094b-1e59-49cf-e2b751b3fda4.png)


easyとsecureのどちらでやるか聞かれるが、secureを選んでも特にやることはない。

これでhttpsでアクセスできるようになった。
下記のURLで`d=`以降にSSLを導入したドメインを指定してブラウザで読み込むと、httpsのステータスレポートを見ることができる。
`https://www.ssllabs.com/ssltest/analyze.html?d=your-site.com`

<img width="1000" alt="certbot2.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/5598ed40-bc16-12c2-caab-db7ae222f17d.png">

うん、安全そうだw

ちなみに、`/etc/apache2/sites-available`の.confファイルを見ると、httpsの設定のための修正がされていることがわかる。もし、勝手にファイルを修正されたくなければ、`certbot-auto`コマンドに`certainly`サブコマンドを付けてやれば、設定を変更せずに証明書のインストールだけやってくれる。

証明書の自動更新設定
--------------------
`certbot-auto renew`コマンドをcronで定期的に実行することで、証明書を自動更新してくれる。
有効期限が30日以下の証明書のみを判別して更新してくれる。

`crontab -e`コマンドで下記のように設定する。
この例では毎日12:34に`certbot-auto`コマンドを実行させている。

```
34 12 * * * /home/ubuntu/certbot-auto renew --quiet --no-self-upgrade >> /tmp/cron.log 2>&1
```
自動更新設定はこれだけ。

### cronのトラブルシューティング
話がそれるがハマったので注意点を幾つか。

* Linuxディストリビューションによっては、`crontab`の設定で出力をリダイレクトしないと実行されない場合がある。  
上記の例では`2>&1`でエラーを標準出力にリダイレクト、標準出力を`/tmp/cron.log`に吐き出している。
* `/etc/letsencrypt/cli.ini`にドメインなど、設定を記述することで非インタラクティブなインストールが可能だが、ここでドメインを指定してしまうと、今のバージョンでは`certbot-aut renew`でエラーになってしまう（[参考](https://community.letsencrypt.org/t/cert-renewal-error/11278/4)）。なので、`.ini`ファイルを使用することはおすすめしない。
* ログは`/var/log/letsencrypt/letsencrypt.log`に吐かれるので、動作しないようならこちらをチェック。
Open xINT CTF Writeup

# Open xINT CTF Writeup

AVTOKYO 2016の会場で行われた、Open xINT CTFに参加してきた。
http://xintctf.wpblog.jp/

SNSで情報収集したり、リアルでターゲットの人物に接触したりと珍しい内容。

終了直前のランキングでは確か700点・7位。
Challenge 6,7を解いた人は誰もいなかった。

## Challenge 1

> ハッカーが運営しているWebサイトは、http://pinja.xyz だ。
そこからハッカーのメールアドレスを探し、入力せよ。

ページには「闇」の一文字。ソースを見ても何もない。
pinja.xyzをwhoisしたら、ドメイン管理者情報にあった。

```
flag: yuuki.masaaki@gmail.com
```

## Challenge 2

> ハッカーはFacebookのアカウントを持っているようだ。
そのアカウントのアドレスを入手し、入力せよ。
アドレスは https:// を含む形で入力すること。

問1のメアドをFacebookで検索するだけ。

```
flag: https://www.facebook.com/profile.php?id=100013327635607
```

## Challenge 3

> ハッカーのFacebookを見ていると、食事の写真が投稿されている。どうやら誰かと食事をしているようだ。その人物から何か情報を引き出せるかもしれない。
まずは、その写真の飲食店を特定し、飲食店の座標を「Nxx xx xx:Exxx xx xx」の形式で入力せよ。
例. N35°41′35″E135°0′11″の場合、回答は「N35 41 35 E135 0 11」

画像のEXIFにはGPS情報はない。
リアルの投稿ではなくCTFなので、食べログあたりの拾い画かと思って画像検索したがヒットしない。
以降の問題に関係もなさそうなのであきらめ。

追記: [1位のSh1n0g1さんの解法](https://twitter.com/Sh1n0g1/status/789869780123525120)

## Challenge 4

> どうやらハッカーと一緒に食事をしている人物は、私たちと同じくハッカーを調査しているようだ。その人物のFacebookアカウントを探し、アドレスを入手し、入力せよ。
アドレスは https:// を含む形で入力せよ。

問2のアカウントの友達が10人しかいなかったので、総当たりで入力したらヒット。想定解法じゃないと思う。

```
flag: https://www.facebook.com/profile.php?id=100013834444055
```

## Challenge 5

> Facebookに投稿された情報から推測される人物に接触し、うまく信用させて情報を引き出せ。
その情報を入力せよ。

信用させる、かぁ。とりあえずメッセージでも送ろうと友達申請。すぐ承認された。
すると、友達限定公開の投稿でこんなものが。

> スマホで　３７５８４　を見せてね。いいこと教えちゃうちゃう。

なるほどそれなら確実だ。

では人物の特定。会場内にいるはず。
今日の日付の投稿で、チェック柄の布の写真。服装はこれか。
しかし画像が不鮮明だし、似たような服の人は何人もいる。
似た格好でスタッフっぽい人に声をかけてみるが外れ。

名字が高嶺、出身が姉ヶ崎高校。ラブプラスか。
会場を回ってみたが、キャラグッズを身につけてるような人はいない。

この時点で正解者0人。後から参加した人が追いつけるように、まだフロアに出てないとかだろうか。
しばらく講演を聞く。正解者が1人出た。来たか。

ん、誕生日が1965年6月7日。51才。会場は比較的若い人が多かったので、それなら絞り込める。

それらしい人がいた。声を掛ける。正解。
直球で聞いてしまったので、「スパイらしさ」加点はたぶん入ってない。もっとノリ良く演技するべきだったなぁ。

もらったカードに書いてある文字列を入力。

```
flag: 1D608C94-6285-4326-AE88-27F4E93FE88A
```

## Challenge 6

> もらった情報から推測される「モノ」を回収して調査、得られる適切な情報を入力せよ。

問5でもらったカードには、上記の文字列とbluetoothのアイコン。
とりあえずbluetoothデバイスをスキャンしてみる。それらしいデバイスは出てこない。

文字列はフォーマット的にUUIDっぽい。ググっても何もヒットしない。
bluetoothではプロトコルにUUIDが割り当てられているらしい。標準プロトコルのUUIDとは違うので、独自のプロトコル？

通信以前に、「モノ」のありかのヒントが見つからない。あきらめ。

追記: [会場の外に出てMAMORIOで探す](http://pinksawtooth.hatenablog.com/entry/2016/10/24/010049)問題だったらしい。マジか。

## Challenge 7

> 「モノ」を調査した結果、闇サイト運営者のハッカーの正体が分かる。早速その「モノ」に罠ファイル（リンク貼る）を仕掛けろ。その後、ハッカーに接触して、不審に思われないよう「モノ」を渡せ。
その人物から渡された「ご褒美ワード」を入力せよ。

手つかず。これこそ面白そうなんだけどなぁ。
golangで書くunix domain socketを使ったserver/clientのサンプルコード

golangでunix domain socketを使って server/client 通信させるサンプルコードがあまりなくて、あってもサーバーからのレスポンスをハンドリングしてなかったりというのしか見つけられなかったので、サンプルでこのしておきます。

# サーバー

この間書いた記事の簡易版です。
受信した文字列を２回繰り返したものを返却します。
また、受信・送信時に標準エラー出力にその内容を出力します。

```go:server.go
package main

import (
	"io"
	"log"
	"net"
	"os"
)

func main() {
	log.SetFlags(log.Lshortfile)
	file := "/tmp/uds-sample-server.sock"
	// 削除はdeferで予約しておく
	// シグナルハンドラ定義しないと終了時に呼ばれない？
	defer os.Remove(file)
	listener, err := net.Listen("unix", file)
	if err != nil {
		log.Printf("error: %v\n", err)
		return
	}
	for {
		conn, err := listener.Accept()
		if err != nil {
			break
		}
		go func() {
			// Closeはdeferで予約しておく
			defer conn.Close()
			data := make([]byte, 0)
			for {
				// サンプルコードなのでバッファサイズを小さめに
				buf := make([]byte, 10)
				// 全データ受信後EOFがこない限りここで止まる
				nr, err := conn.Read(buf)
				if err != nil {
					if err != io.EOF {
						log.Printf("error: %v", err)
					}
					break
				}
				// 実際に読み込んだバイト以降のデータを除去したデータに変換
				buf = buf[:nr]
				log.Printf("receive: %s\n", string(buf))
				// slice同士の結合は二つ目のsliceの後ろに...をつける
				data = append(data, buf...)
				// レスポンスデータ送信
			}
			conn.Write(data)
			conn.Write(data)
			log.Printf("send: %s\n", string(append(data, data...)))
		}()
	}
}
```

# クライアント

指定した文字列を送信して、返却された文字列を出力します。
また、送信・受信時に標準エラー出力にその内容を出力します。

```go:client.go
package main

import (
	"fmt"
	"log"
	"net"
	"os"
)

func main() {
	log.SetFlags(log.Lshortfile)
	if len(os.Args) != 3 {
		return
	}
	file := os.Args[1]
	message := os.Args[2]
	conn, err := net.Dial("unix", file)
	if err != nil {
		log.Printf("error: %v\n", err)
		return
	}
	defer conn.Close()
	_, err = conn.Write([]byte(message))
	if err != nil {
		log.Printf("error: %v\n", err)
		return
	}
	log.Printf("send: %s\n", message)
	// これをしないとEOFが通知されずにレスポンスの処理まで進んでくれない
	err = conn.(*net.UnixConn).CloseWrite()
	if err != nil {
		log.Printf("error: %v\n", err)
		return
	}
	data := make([]byte, 0)
	for {
		// サンプルコードなのでバッファサイズを小さめに
		buf := make([]byte, 10)
		nr, err := conn.Read(buf)
		if err != nil {
			break
		}
		buf = buf[:nr]
		// 受信データのログ出力
		log.Printf("receive: %s\n", string(buf))
		data = append(data, buf...)
	}
	// 受信データの出力
	fmt.Printf("%s\n", string(data))
}
```

# 出力

```bash:server
$ go run server.go
# 以下はクライアントからデータを受信しての出力
server.go:43: receive: 0123456789
server.go:43: receive: abcdefghij
server.go:43: receive: klmnopqrst
server.go:43: receive: uvwxyz
# 以下はクライアントがWriteClose()してからの出力
server.go:50: send: 0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
```
```bash:client
$ go run client.go /tmp/uds-sample-server.sock 0123456789abcdefghijklmnopqrstuvwxyz
# サーバーへの送信データ
client.go:28: send: 0123456789abcdefghijklmnopqrstuvwxyz
# サーバーからの受信データ
client.go:44: receive: 0123456789
client.go:44: receive: abcdefghij
client.go:44: receive: klmnopqrst
client.go:44: receive: uvwxyz0123
client.go:44: receive: 456789abcd
client.go:44: receive: efghijklmn
client.go:44: receive: opqrstuvwx
client.go:44: receive: yz
# 標準出力への表示
0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz
```
OverloadedStringsプラグマ

自分がハマったのでメモ。

`Data.Conduit.Network`の`serverSettings`関数は引数に`HostPreference`を要求するのだが、`HostPreference`のデータコンストラクタは`Data.Streaming.Network`からエクスポートされておらず使うことができない。`Data.Streaming.Network.Internal`を直接インポートすれば使えるが、とても見栄えが悪い。 `Data.Conduit.Network`の説明には文字列（`"*"`など）を引数に使うようなことが書かれているが、型エラーでコンパイルが通らない。

解決には、GHC拡張のひとつOverloadedStringsを使えばよい。プラグマ`{-# LANGUAGE OverloadedStrings #-}`をソースコードの冒頭に記述する。



この拡張は、コンパイル時にGHCが文字列の型エラーを検出すると、あるべき型が`Data.String`の`IsString`型クラスのインスタンスであるとき、`fromString`メソッドを暗に呼んで型を変換してくれる（したがって、`fromString`メソッドを陽にインポートして使えば拡張を使わずとも実装できる）。

恥ずかしながら`Data.Streaming.Network`のエクスポートのミスだと思って[作者のSnoyman氏に問い合わせたところ、1分で返事が来て解決した](https://github.com/fpco/streaming-commons/issues/35)。Snoymanは神。
【Swift】メモ帳アプリのサンプルコード（インクリメンタルサーチ）

# 概要
メモ帳アプリのサンプルコードです。

# 機能
* メモ追加
* メモ編集
* メモ削除
* メモ数表示（追加、削除、検索時に変更）
* メモ追加時間表示
* メモ検索（インクリメンタルサーチ）

# [前回](http://qiita.com/menomoto/items/bb58cc2ebf0302e12147)からの変更点
* メモ検索（インクリメンタルサーチ）追加
* リファクタリング

# github
https://github.com/menomoto/Sample_Apps/tree/master/incrementalSearch

# 結果
![サンプル](http://i.imgur.com/DRJoA2t.gif)
名前解決とDNS

#名前解決とは
コンピュータやネットワーク機器につけられた名前(ドメイン)からアドレス(IPアドレスやMACアドレス)を割り出すことや、その逆のこと。
```
yahoo.co.jp ⇄　183.79.196.239
```
左がドメインで右がIPアドレスであるが、
これらを相互に変換することを**名前解決**という。

#なぜ名前解決をするか
IPアドレスは数字の羅列であるため、人間が扱うには覚えにくく間違えやすい。
そのままIPアドレスを使用して操作を行うには扱いにくいため、人間が扱いやすいようにアルファベットに置き換えた。
置き換えたものがドメインと呼ばれるもの。

#そもそもドメインとかIPアドレスとか何よって話
##ドメイン
インターネット上に定められた部分領域のことで、インターネット上の**「住所」**にあたる。
住所なのでもちろん同じものは存在しない。
お名前.comによると、正確には**「インターネット上の住所を分かりやすく見せるもの」**だそう。

IPアドレスが実際には住所であって、それを人間が扱いやすくするためにドメインを使用しているので、「インターネット上の住所を分かりやすく見せるもの」という表現が正しいのかもしれない。

###ドメインの種類
```
◯◯.com
◯◯.co.jp
◯◯.org
```
上記のような種類がドメイン名が存在する。
◯◯の部分はそれぞれのサイトによって変わる部分で、この部分を第二レベルドメインと呼び、「.com」の部分を第一レベルドメインと呼ぶ。
yahoo.co.jpが2つ存在することはできないが、yahoo.co.jpとyahoo.comのようにドメイン名が違う分には問題がない。

既に使用されているドメインをこれから申請をしても使えない。


#IPアドレス
こっちがいわゆるネット上の住所に当たるもの。
「183.79.196.239」のように0～255の数字を４つ組み合わせて表現されている。
インターネットに接続する際、プロバイダなどによってコンピュータに割り当ている。
こちらもIPアドレスが重複することはない。

IPアドレスには2種類存在する。

##グローバルIPアドレス
インターネットに接続している機器一台につき一つ割り当てられる住所（＝IPアドレス）のこと。
契約をしているプロバイダからグローバルIPアドレスが割り振られている。

##プライベート(ローカル)IPアドレス
ルーターから見て、各パソコンを識別するための番号のことを「プライベートIPアドレス」と呼ぶ。

###ルーターとは
会社などで複数のPCを同時にインターネットにアクセスさせるために使用するもの。
ルーターがインターネットと通信をしており、そのルーターを通じて複数のPCが通信を行えるようになる。

そのルーターに対してグローバルIPアドレスが存在しているが、ルーターから各PCへレスポンスを返す際にPCを識別する番号が必要になり、それがプライベートIPアドレスである。

#どうやって名前解決をするか？
##DNS
ドメインとIPアドレスの間で名前解決を行うシステムのことをDNS（domain name system）と言う。
例えば「yahoo.co.jp」へアクセスした際に、DNSが「yahoo.co.jp」ってことは「183.79.196.239」へアクセスをすれば「」yahoo.co.jp」が表示されるぞと名前解決を行ってくれているため、指定したドメインでアクセスができている。

##自分のPCでDNSを設定するには
「hosts」ファイルはに記載することで設定を加えるができる。
IPアドレスに対するホスト名を登録できます。
```
IPアドレス  　ホスト名
127.0.0.1       localhost
```
デフォルトではlocalhostが設定されているが、他にも設定を加えたい場合この形式で書き込むことで設定ができる。
Erlangのrpcを試してみる。

これの続きです：http://qiita.com/syuhei/items/70fc971ce7ce40dee439

前回はHello Worldプロジェクトを作成しました。今回は分散プログラミングの基本となる、rpcモジュールを使ってみます。

myproject_app.erlにhello関数を追加します。exportに追加するのも忘れずに。

```erlang
-export([start/2, stop/1, hello/1])
.
.
.

hello(Str) ->
	"Hello "++Str.
```

testフォルダを作成し、myproject_SUITE.erlを作成します。

このテストではrunner@{host名}からcluster_test@{host名}のjoin関数を呼び出しています。start_node関数が、新しくテスト用のノードを起動する関数です。


```erlang
-module(myproject_SUITE).

-compile(export_all).

all() ->
	[cluster_test].

init_per_suite(_Config) ->
    {ok, Hostname} = inet:gethostname(),
    case net_kernel:start([list_to_atom("runner@"++Hostname), shortnames]) of
        {ok, _} -> ok;
        {error, {already_started, _}} -> ok
    end,
    _Config.

end_per_suite(_Config) ->
    application:stop(lager),
    _Config.

cluster_test(_Config) ->
    Node = start_node(cluster_test),
    R = rpc:call(Node, myproject_app, hello, ["World"]),
    ct:log("Result:~p, ", [R]),
    ct_slave:stop(Node).




start_node(Name) ->
    CodePath = lists:filter(fun filelib:is_dir/1, code:get_path()),
    NodeConfig = [
            {monitor_master, true},
            {startup_functions, [
                    {code, set_path, [CodePath]}
                    ]}],
    case ct_slave:start(Name, NodeConfig) of
        {ok, Node} ->
		    rpc:call(Node, application, ensure_all_started, [myproject_app]),
		    Node;
		{error, already_started, Node} ->
            ct_slave:stop(Name),
            start_node(Name);
		{error, Reason, Node} ->
			io:format("error ~p~n", [Reason])
	end.


```

テストコマンドを打ちます。

```
$ ./rebar3 ct
===> Running Common Test suites...
%%% myproject_SUITE ==> cluster_test: OK
All 1 tests passed.
```

ちなみにログフォルダにテスト結果のHTMLもあります。```./_build/test/logs/```

runner@{host名}から"World"を送って、cluster_test@{host名}で"Hello "と連結すして、"Hello World"をrunner@{host名}に返しています。

<img width="564" alt="スクリーンショット 2016-11-11 23.17.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/8b4c47b2-24d0-8ef9-7041-e0ca7857e3af.png">

以上、簡単なrpcモジュールの使い方でした。
Serverlessを使ってAPI GatewayとLambdaでCORSを有効にする

公式ドキュメントに書いてあるままなのですがドハマリしたのでメモ :joy:
https://serverless.com/framework/docs/providers/aws/events/apigateway#enabling-cors

`sls create --template aws-node` でプロジェクトを作って…

### serverless.yml で `cors: true` を設定する

```yaml
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: user/create
          method: get
          cors: true
```

### lambdaのレスポンスの `headers` に `Access-Control-Allow-Origin` を設定する

```js
exports.handler = function(event, context, callback) {

    const response = {
      statusCode: 200,
      headers: {
        "Access-Control-Allow-Origin" : "*" // Required for CORS support to work
      },
      body: JSON.stringify({ "message": "Hello World!" })
    };

    callback(null, response);
};
```

これだけです！ :joy:
serverless.ymlに `cors: true` を設定したのでServerlessでのCORS設定はちゃんとしたと思いこんでたら、lambdaのレスポンスにもCORSヘッダを設定しないといけなかった…！
serverless.ymlのほうはAPI Gatewayで、lambdaのCORS設定はlambdaのソース内に書くと考えれば納得かも？
ついでにその他にもハマったポイントも書いておきます。

### lambdaのレスポンスは `statusCode`, `headers`, `body` が無いとダメ

よくあるHTTPクライアントと違って、`callback(null, response);` の `response` にbodyになるものを適当に突っ込んでおけば良いって感覚じゃダメなんですね。

### lambdaのレスポンスの `body` は `string` じゃないとダメ

```diff
const response = {
      statusCode: 200,
      headers: {},
-      body: { "message": "Hello World!" }
+      body: JSON.stringify({ "message": "Hello World!" })
    };
```

↓みたいなエラーがAPI Gatewayで出たら、`body` にJSONをそのまま突っ込んでいるかも。

```
Execution failed due to configuration error: Malformed Lambda proxy response
Wed Oct 26 01:35:28 UTC 2016 : Method completed with status: 502
```

lambdaとして有効でもAPI Gatewayとつなぐには良くないコードだったりするのがややこしいのかな :thinking:
Xcode8に移行してビルドが遅くなったのを直す

# 結論
HEADERMAP_USES_VFSというオプションをYESにすると差分ビルドが効く様になり、ビルドが速くなりました。

# 概要
Xcodeのversionを8に上げてから、自分のプロジェクトでは差分ビルドが全然効かず、少し変更を加えただけでフルビルドが掛かってしまう状態でした。

そこで直し方を調べたところHEADERMAP_USES_VFSというオプションをYESにすると差分ビルドが効く様になるということでした。

自分の環境は

- Xcode Version 8.0 (8A218a)
- Swift2.3

です。

# やり方

XcodeのBuild Settingsを開きます。

HEADERMAP_USES_VFSのオプションは、元からあるわけでは無いので、自分で追加します。

![スクリーンショット 2016-11-11 21.16.40.png](https://qiita-image-store.s3.amazonaws.com/0/47882/d5b8be87-e436-0aa6-6953-0883b7aa33cd.png)

開発時に差分ビルドが効けば良いのでdebugのときだけYESにしました。

<img width="950" alt="スクリーンショット 2016-11-11 23.08.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/526970f5-f063-e928-be19-e97f4f288215.png">


これでビルドが速くなります。
理由については調べきれてません。

# 参考

- https://forums.developer.apple.com/thread/62737


apple社員の回答

```
ddunbar
Oct 18, 2016 2:05 PM
(in response to aandrewc)
My apologies to everyone experiencing this problem, we are actively trying to get to the bottom of this issue.
 
If anyone experiencing this problem is in a position where they can share their entire project, as well as a video of experiencing the bug (ideally multiple times) via a screen recording, that would be immensely valuable to us.
 
In the meantime, we believe that setting:
 
  HEADERMAP_USES_VFS = YES
 
to true in your project (or for all your targets) may be an effective workaround for many people. This is not guaranteed to work (which is the reason it isn't already on by default), but it should work for most projects.
```