OmniAICreator/Qiita-1.07M huggingface dataset:
UITableViewCell内のラベル高さに応じて当該セルの高さを可変にする方法

チャットアプリを作成する際に考えたので、自分用にメモ

Storyboard上
1. 普通にテーブルビューを設置
2. xibでカスタムセルを作成する
3. カスタムセル内にラベルを設置する
4. ラベルに対してAutolayoutで上、下、右、左にマージンを設定する
5. ラベルに対してAutolayoutで高さを設定する。最小の高さを設定すること（ここが大き過ぎると異様にセルが高くなってしまう）
6. 5番で設定したラベルの制約を、Equalから、GreterThanEqualに変更する。

xibのSwiftファイル上
7. cellを呼び出される際に、labelにテキストを入れ、かつsizeToFitメソッドを呼ぶようにする

ViewController
8.ViewDidLoadあたりで、セルの高さを可変にするという宣言をする
```
TableView.estimatedRowHeight = 20
TableView.rowHeight = UITableViewAutomaticDimension
```
[Swift] guard 条件をカンマ区切りで連続して書く

### カンマ演算子を使おう

例えば[Any]な配列を受け取るが要素の型が特定のもので、なおかつ1番目の要素のみが必要なとき

```swift

guard let array = getArray() as? [Int],
    let first = array.first
    else { return }

````


```swift

guard let array = getArray() as? [Int],
    let first = array.first
    else {
        print("error")
        return
}

````

```swift
guard let array = getArray() as? [Int],
    let first = array.first
    else { return print("error") }  // 返値が不要な場合はこうとも書けます

```

（Xcodeでcontrol+iで整形すると上記のインデントになります。）

条件をカンマ演算子で連続して書くと ある条件がfalseとなったらそれ以降を無視してelse句に処理が移動します。

ややこしいデータ構造の場合はよりわかりやすくなる
[String:Any] の中に [String:Any]があり、その中に[Int]があるとき

```swift
guard let dataofkey = data["key"] as? [String:Any],
    let array = dataofKye["secondaykey"] as? [Int],
    let first = array.first
    else { return }
```


### if文でも使えます

```swift
if let dataofkey = data["key"] as? [String:Any],
    let array = dataofkey["secondaryKey"] as? [Int],
    let first = array.first
    { print(first) }
```


### メリット
- ひとかたまりの複数の条件をまとめられる

### デメリット
- 見た目が拒絶される場合がある
- どこでelse句に飛んだのかわからない
[iOS] Keychainのバックアップについて調べた

## 概要
iOSアプリでは暗号化に使ったキーをKeychainに保存するケースはあると思います。
あるユーザが機種変更で「バックアップから復元したらアプリ起動できなくなった」という出来事に遭遇しました。
それは、Keychainに保存してあったキーがバックアップされてなかったことが原因でした。

Keychainのバックアップがどうなっているのか調べた結果をまとめました。

## iTunesバックアップの場合

iTunesバックアップから復元する時、暗号化してバックアップした場合とそうでない場合にKeychainが対象となるかが分かれるようです。デフォルトは暗号化オフの状態になっています。

|バックアップ方法 |結果  |
|:-------|:------|
|暗号化してバックアップ | Keychainは対象となる  |
|暗号化せずにバックアップ | Keychainは対象とならない |

但し、Keychain の kSecAttrAccessible が以下のどれかである場合のみのようです
- kSecAttrAccessibleWhenUnlocked
- kSecAttrAccessibleAfterFirstUnlock
- kSecAttrAccessibleAlways

kSecAttrAccessibleXXXThisDeviceOnlyを付けた場合は他の端末ではアクセスできなくなります。

## iCloudバックアップの場合

KeychainをiCloudバックアップの対象とするには、iOS7以上でアプリ側で以下の設定を行う必要があるようです。

> *Synchronizing Keychain items*
> ・ *Items without kSecAttrSynchronizable = kCFBooleanTRUE are not synchronized (default)*
> ・ *Limited to passwords (kSecClassGenericPassword and kSecClassInternetPassword)*
> 
> *Security and Privacy in iOS 7 <https://developer.apple.com/videos/play/enterprise/17/>*

また、ユーザがiCloudの設定でiCloudキーチェーンを有効にしていないとKeychainはバックアップされません。

<img width="200" alt="IMG_0324 (1).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13703/2795d0d4-071c-7950-77d2-ae0a51ce63b3.jpeg">


## Keychain OSSライブラリ

Keychainを操作したい場合にOSSライブラリを使うことが多いと思いますが、それぞれ有名なOSSがどうなっているか調べてみました。

- [SAMKeychain](https://github.com/soffes/SAMKeychain)
- [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess)
- [LUKeychainAccess](https://github.com/TheLevelUp/LUKeychainAccess)

| OSS名 | kSecAttrSynchronizable | kSecClass | kSecAttrAccessible |
|:-:|:-:|:-:|:-:|
| SAMKeychain  | ◯ デフォルトでON  |  ◯ kSecClassGenericPasswordのみ | ◯ 指定可 |
| KeychainAccess | ◯ 指定可  | ◯ kSecClassGenericPassword, kSecClassInternetPasswordのどちらか | ◯ 指定可 |
| LUKeychainAccess  | ✕ OFFのみ |  ◯ kSecClassGenericPasswordのみ | ◯ 指定可 |


LUKeychainAccessは kSecAttrSynchronizable の指定が出来ませんでした。

## まとめ
- iTunesバックアップ と iCloudバックアップ では Keychain が対象になる条件が異なる
- Keychainをバックアップする目的で使うなら、OSSは SAMKeychain または KeychainAccess が良さそう
- そもそもユーザ操作による影響が大きいので、Keychainにいれたデータは失われるものとしてアプリを設計するのが吉

## 参考
- [iOS Keychain - iTunes backup vs iCloud sync ](https://gist.github.com/scotopic/fff4671c8421be6b2a42)
- [Security and Privacy in iOS 7](https://developer.apple.com/videos/play/enterprise/17/)
Yahoo! UIのOverlayについて

ボタンやアイコンをクリックすると、メニューリストを展開できるようにする。

1.必要なYahoo! UIのCSSやJSをインクルードしておく。

2.紐付ける為にSPANタグ等を用意する。IDをつけ忘れないようにする。
```html:sample.html
<SPAN id="menu"></SPAN>
```

3.javascript側でメニューの設定を行う。
```javascript:sample.html
	(function () {
		var Event = YAHOO.util.Event;

		Event.onDOMReady(
			function () {
				var oIconMenu = new YAHOO.widget.Overlay('iconmenu', { visible: false });
				var oButton = new YAHOO.widget.Button({
				    type: 'menu',
					id: 'iconpicker',
					label: 'メニュー',
					menu: oIconMenu,
					container: 'menu'
				});

				oButton.on(
					'appendTo', function () {
						oIconMenu.setBody(
                            // メニュー内のHTMLを設定
							"<table border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"80px\" >" + 
							"<tr><td>メニュー項目1</td></tr>" + 
							"<tr><td>メニュー項目2</td></tr>" + 
							"</table>"
						)
					}
				)

				var onOverlayClick = function (p_oEvent){
				oIconMenu.hide();
			};
		
			Event.on(oButton.getMenu().element, 'click', onOverlayClick);
		}
	);
}());
```
pip でpyaudioのインストールできなかった時の対処法 #Python

こんなエラーがでてインストールできない

```
src/_portaudiomodule.c:29:10: fatal error: 'portaudio.h' file not found
    #include "portaudio.h"
             ^
    1 error generated.
    error: command '/usr/bin/clang' failed with exit status 1
```

homebrewで"portaudio.h"インストールしてから行うと成功した人もいるみたいだが、私はできなかった。

```
brew install portaudio
```

同じ様な問題を抱えている人を発見！[Stackoverflow](http://stackoverflow.com/questions/33513522/when-installing-pyaudio-pip-cannot-find-portaudio-h-in-usr-local-include)

以下のコマンドで無事インストールできました！ライブラリ指定がおかしかったみたいです。

```
$pip install --global-option='build_ext' --global-option='-I/usr/local/include' --global-option='-L/usr/local/lib' pyaudio
```
Pact Brokerにpact file(json)を置く方法

[公式サイト](https://github.com/bethesque/pact_broker)によると

>The generated pact is then published to the Pact Broker. This is simply a PUT to a resource that specifies the consumer name and version, and the provider name. eg http://my-pact-broker/pacts/provider/Animal%20Service/consumer/Zoo%20App/version/1.0.0

ということなので、curlでこんな感じにすれば、jsonを配置できる。

````
curl  -T 1.0.0.json --header 'Content-Type: application/json' -s http://my-pact-broker/pacts/provider/Animal%20Service/consumer/Zoo%20App/version/1.0.0 -D -
````
[Unity] 初心者から見たはじめてのコルーチン

#コルーチンとは何か？
詳細はネットのページを見て欲しい。（というのも自分がそんなに理解してないので説明できない）
「とりあえず処理を分割して、ちょっとずつ進めてくれる」という仕組みに見える

#どういうときに使える？

関数内で大規模なfor文まわしたときに、フリーズに近い状態になり、進行状況が分からなくなる。
そのときにコルーチンを使うと、逐一updateされる。


#書き方
とりあえず戻り値にIEnumeratorを設定して、中にyield return nullを書いて
呼び出すときにStartCoroutine(関数呼び出し);とやればいい模様。

```
//呼び出し側
StartCoroutine(KansuuMei());

//コルーチンを使う関数側
public IEnumerator KansuuMei(){

     //好きな場所に入れる
     yield return null;
}
```

#実際の例
以下はボタンを押すとfor文を回す処理。
for文の途中でcurrent_processを設定しており、そこで進行状況を逐一updateする。
ところがコルーチンを使わないと、画面上ではフリーズに近い状態になり、処理が終わるまで進行状況は出てこない。（つまりボタンを押すと、フリーズして、最後に終わったと教えてくれる。それでは意味がない）

以下のようにコルーチンを使うと、進行状況が逐一報告されるようになる。

```example.cs

public class CoroutineTest : MonoBehaviour {

public Text current_process_;

//ボタンをクリックしたとき
public void ButtonPushedByManual(){
        StartCoroutine(Compare(result_before, result_after));
}

public IEnumerator Compare(ReadCSV csv_before, ReadCSV csv_after)
{
        for (int i = 0; i < 100000; i++){

            for (int j = 0; j < 100000; j++){
                 public Text current_process_ = i.ToString() + "," j.ToString();
                 yield return null;
            }
        }
}
```

#処理速度
for文に使ってみて気づいたが、入れる場所によって処理スピードがぜんぜん違う。

外側のfor文(浅い)に入れるほど早くなる(呼び出される回数が減るから？）
内側のfor文(深い)に入れるほど遅くなる(呼び出される回数が増えるから？）

「どのレベルまで更新情報が必要か」と
「どのレベルまで処理速度が必要か」の天秤なのかも。

#匿名の知人からのアドバイス
「yield return すると、「そのフレームでの処理」はそこで終了するので、外側の for に入れると 1フレームでの処理が増える事になって、早く処理が終わる事になります。ただ、逆にフレームに費やす時間は増えるので、固まった様に見えるかもしれません。
天秤ですね。
固定で yield return するの微妙なので、1フレームで何秒まで処理させていいかという値を決めておいて、それを超えそうだったら yield return する、みたいな形にすると安定すると思います。」

#その他の教訓
コルーチンは連呼しないほうがいい。
【CSS】複数行で3点リーダーにするline-clampは、中にaタグがあったり、aタグに指定すると、3点リーダーを入れる箇所が末尾ではなく中央になるらしい？

2行で3点リーダーで省略しようとして、下記のように組んだら、

```HTML
<div>
  <a href=""><img src="" alt=""></a>
  <h3 class="item-title">
    <a href="">名前が入ります</a>
  </h3>
</div>
```

```CSS
div {
  width: 200px;
}
.item-title {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
```

3点リーダーが末尾ではなく、中央にきてしまった。
末尾にしたい。



##確認したブラウザ

| 1 | 2 |
|:-:|:-:|
| Android 4.0 Chrome  | iPhone6 iOS10.2 Safari  |




##とりあえず処置

HTMLはそのままで、中のaタグにline-clampかけたら、末尾になった！
ただし、Safariだけ。。。Chromeがならない。

```css
div {
  width: 200px;
}
.item-title {
}
.item-title a {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
```

##結局どうしたか

```html
<div>
  <a href="">
    <img src="" alt="">
    <h3 class="item-title">
      名前が入ります
    </h3>
  </a>
</div>
```

```css
div {
  width: 200px;
}
.item-title {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
```

###やってみたキャプチャ（Safari）
Chromeもやったけど、人の借りたんでキャプチャ取れなかった。。。

![テスト表示例.png](https://qiita-image-store.s3.amazonaws.com/0/40940/0b538599-7736-104b-d482-903ba04db03e.png)


&lt;a&gt;タグなのか、それとも他の要因なのか？
どういう仕様でこうなっているのか.........知りたい。。。
gogo: A fish-shell function to jump to go project dir

最近golangを使っているうちになかなか良い言語だなあと思い始めてきた感じがしますが、GOPATH以下のディレクトリ階層の深さがJavaか大江戸線かというぐらいにひどくて辟易しております。面倒なので以下のようなfish-shell関数を使ってjumpできるようにしました。

`~/.config/fish/functions/gogo.fish`

```fish-shell
function gogo
  test (count $argv) -ge 1; and set TO $argv[1]
  test (count $argv) -ge 2; and set IDX $argv[2]

  if test -z "$TO"
    echo "target is required" >&2
    return 1
  end

  set L (find $GOPATH -type d | grep -v vendor | grep "$TO\$\|/$TO""[^/]*\$")
  set N (count $L)
  switch $N
  case '0'
    echo "Not found" >&2
    return 1
  case '1'
    cd $L
  case '*'
    if test -n "$IDX"
      cd $L[$IDX]
    else
      for I in (seq (count $L))
        echo "$I: $L[$I]"
      end
    end
  end
end
```

USAGE:

```
x> gogo grafana/grafana

x> gogo grafana
1: /GO/PATH/src/github.com/grafana
2: /GO/PATH/src/github.com/grafana/grafana
3: ... (snip) ...
x> gogo grafana 2
```
eZ Publish で子アイテムを2列に並べたい時のテンプレート処理

eZ Publish 4.x/5.x Legacy で子アイテムを2個単位でグルーピングしたい時のテンプレート処理。

## テンプレートの記述例
```smarty
<div class="level-1">
{foreach $node.children as $key => $child}
{if eq( $key|mod( 2 ), 0 )}

  <div class="level-2">
{/if}

    <div class="level-3">{$child.name|wash()}</div>
{if or( ne( $key|mod( 2 ), 0 ), eq( $key, $category.children_count|dec ) )}

  </div>
{/if}
{/foreach}
</div>
```

## 出力 HTML
```html
<div class="level-1">
  <div class="level-2">
    <div class="level-3">アイテム1</div>
    <div class="level-3">アイテム2</div>
  </div>
  <div class="level-2">
    <div class="level-3">アイテム3</div>
    <div class="level-3">アイテム4</div>
  </div>
  <div class="level-2">
    <div class="level-3">アイテム5</div>
  </div>
</div>
```

## 解説
子アイテムを `{foreach}` でループし、キーが偶数ならヘッダー処理、奇数か最後尾ならフッター処理、という流れになっている。
最後尾の判定は、子アイテムの数を `$node` オブジェクトの `children_count` 属性から取得して、`dec` オペレーターでデクリメントした値を使っている。

## リファレンス
* [{foreach}](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Template-control-structures/Looping/foreach) 配列の繰り返し処理
* [{dec()}](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Template-operators/Mathematics/dec) デクリメント（1減算）
* [{mod()}](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Template-operators/Mathematics/mod) 割算の余り
gitのcommitを綺麗にするコマンド

## ファイル差分の一部だけをstageにあげたい

```
$ git add -p hoge.php
```

- ファイルで差分がある箇所を分割してcommitすることができます
- ファイル内の差分ごとにcommitする場合に便利です

## commitしたくないけどcheckoutしたい

```
$ git stash
$ git stash pop
```

- ステージに上っていない変更をスタックに入れて隠蔽できます
- checkoutしても`git stash pop`で隠蔽した変更を取り出せます

## 1つ前のcommitを上書きしたい

```
$ git commit --amend -m “message”
```

- 直前のcommitを上書きします
- もし上書きする前のものをpushしていたら”git push -f …”で強制的にremoteも上書きできます

## 歴史を変えたい

```
$ git rebase -i HEAD^^
$ git rebase --continue
```

- キャレッド(またはチルダ)の数は戻したい数+1
- `git rebase --continue`で戻れます

## まとめ

上記コマンドを下記のような手順で使ってcommitを上書きします

```
$ git stash
$ git rebase -i HEAD^^
$ git stash pop
$ git add -p hoge.php
$ git commit --amend -m "commitを上書き"
$ git stash
$ git rebase --continue
```
Adobe Animate CC 2017.1のグローバルスクリプトとサードパーティスクリプト

Adobe Animate CC 2017.1で「[グローバルスクリプトおよびサードパーティスクリプトの追加](https://helpx.adobe.com/jp/animate/using/creating-publishing-html5-canvas-document.html#グローバルスクリプトやサードパーティスクリプトの追加)」が行われました。Adobeサイトの説明だけでは少し簡単すぎるので、補足しつつご紹介します。

# [アクション]パネルに[グローバル]階層が加わった
[アクション]パネルを開くと、左ペイン(カラム)に[グローバル]という階層が加わりました。そして、[インクルード]と[スクリプト]が含まれています。

#### 図001■[アクション]パネルの[グローバル]階層
![global in the actions panel](https://qiita-image-store.s3.amazonaws.com/0/128949/76443061-04a4-3378-5400-f9e0815565b5.png)

# [インクルード]でサードパーティのJavaScriptライブラリを読み込む
[グローバル]階層から[インクルード]を選ぶと、サードパーティのJavaScriptファイルを読み込めます。[+]ボタンで追加、[-]ボタンは削除です。[↑][↓]で読み込みの順番が変わります。URLかファイルを選んで、JavaScriptライブラリが加えられます。[グローバルスクリプト]も含めて、この順番に実行されることにご注意ください。

#### 図002■[インクルード]で読み込んだサードパーティのJavaScriptライブラリ
![include in the actions panel](https://qiita-image-store.s3.amazonaws.com/0/128949/341c545b-9d93-2d7a-9286-df48c1a2e6d1.png)


図002では、[jQuery 1.12.4](https://code.jquery.com/)とプラグインの[Backstretch](http://srobbin.com/jquery-plugins/backstretch/)を、ともにCDNで読み込みました。

# [スクリプト]でグローバルなJavaScriptコードを書く
[グローバル]階層で[スクリプト]を選ぶと、タイムラインのフレームに依存しないグローバルなJavaScriptコードが書けます。

#### 図003■[グローバル]の[スクリプト]に書いたJavaScriptコード
![script in the global](https://qiita-image-store.s3.amazonaws.com/0/128949/2f904d2d-5107-f2eb-ca23-c990bf6da9da.png)

図003では、jQueryとプラグインBackstretchで、5つの背景画像のスライドショーを定めました。書いたスクリプトはつぎのコード001のとおりです。なお、Backstretchの使い方とオプションについては、GitHubの[README.md](https://github.com/srobbin/jquery-backstretch#backstretch)(英語)をご覧ください。

#### コード001■jQueryとプラグインBackstretchで背景画像をスライドショーさせる
```js
$(function() {
	$.backstretch(
		[
			"http://jsrun.it/assets/6/K/N/2/6KN2E.png",
			"http://jsrun.it/assets/y/7/F/F/y7FFD.png",
			"http://jsrun.it/assets/E/y/a/m/EyamI.png",
			"http://jsrun.it/assets/c/i/X/a/ciXam.png"
		],
		{
			duration: 3000,
			fade: 750
		}
	);
});
```

# [グローバル]の設定はHTMLドキュメントに加えられる
これらの[グローバル]の設定は、パブリッシュされるHTMLドキュメントに加えられます。ご参考までに、HTMLドキュメントの`<head>`要素の記述を、つぎのコード002に抜き書きしました。[グローバル]設定は、CreateJSの初期化より先に行われています。パブリッシュした[HTMLドキュメント](http://fumiononaka.com/samples/animate/global_javascript.html)と[JavaScriptファイル](http://fumiononaka.com/samples/animate/global_javascript.js)も併せてアップロードしました。なお、ステージ(`<canvas>`要素)は使いませんので、透明にしてあります。

#### コード002■HTMLドキュメントに加えられた[グローバル]の設定
```html
<script src="https://code.createjs.com/createjs-2015.11.26.min.js"></script>
<script src="global_javascript.js?1486103454264"></script>
<script type='text/javascript' src='https://code.jquery.com/jquery-1.12.4.min.js'></script>
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/jquery-backstretch/2.0.4/jquery.backstretch.min.js
'></script>
<script>
// Global Scripts
	$(function() {
	$.backstretch(
		[
			"http://jsrun.it/assets/6/K/N/2/6KN2E.png",
			"http://jsrun.it/assets/y/7/F/F/y7FFD.png",
			"http://jsrun.it/assets/E/y/a/m/EyamI.png",
			"http://jsrun.it/assets/c/i/X/a/ciXam.png"
		],
		{
			duration: 3000,
			fade: 750
		}
	);
});</script>
<script>
var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation;
function init() {
	// ...[略]...
}

</script>
```
MacでAtomのツリービューのショートカットキーがうまく機能しない

Macを使っていて、Atomのツリービューのショートカットキーがうまく機能しなかったのを
強引に回避したので、備忘録として残しておきたいと思います。

# 環境
- MacBookAir(Mid2012)
- Sierra 10.12.3
- Atom 1.13.1
- Mac側の設定で"¥"で入力する文字を"\"に代えてあります。(結果はどちらも変わりませんでした。)

# 症状
デフォルトでツリービューのショートカットはcmd + \なのですが
自分の環境だとツリービューだと展開されませんでした。

キーバインドを見ても
![い.png](https://qiita-image-store.s3.amazonaws.com/0/132630/f277b1ec-acd7-6eee-a2ac-31a5fc1b1387.png)

この通り割り当てられています。
ちなみに初期状態でもcmd + shift + \で__展開のみ__できました。
閉じることはできません。

# 解決策
強引ではありますが、キーマップファイルにでツリービューの操作を
cmd + shift + \に割り当てることで開くことも閉じることもできるようになりました。
![スクリーンショット 2017-02-03 15.52.36.png](https://qiita-image-store.s3.amazonaws.com/0/132630/e2af8d75-6399-d095-8bc4-76ba1a904ef1.png)

ちなみにKeybindings Resolverで実行されているショートカットを見てみると
![スクリーンショット 2017-02-03 15.48.25.png](https://qiita-image-store.s3.amazonaws.com/0/132630/3b11b767-bd17-4cde-375c-bd66bc51f6f4.png)

cmd + \を押してもcmd + shift + \を押しても　cmd + ¥で実行されています。

私には原因が分かりませんので、
誰か知っている方はコメントで教えていただけると嬉しいです。
Ruby 2.3.1でbundle installしたらAn error occurred while installing eventmachine (1.2.2)

# 環境
[root@localhost example]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 

[root@localhost example]# ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

[root@localhost example]# gem -v
2.5.1

[root@localhost example]# bundler -v
Bundler version 1.14.3

# エラーメッセージ

````
An error occurred while installing eventmachine (1.2.2), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.2.2'` succeeds before bundling.
````

# 原因
g++がインストールされてない。

# 対策
g++をインストール

````
[root@localhost example]# yum install gcc-c++
````
golangによる境界線追跡


* ここにソースと学習の変遷は書かれています。(https://github.com/kaepa3/effector)



画像の境界を探索します。

#　処理の概要
1. 内側or外側の線の起点を見つけます
2. そこから画素をガンガン走査していって（どうやらこれがラスタ走査）境界の次の箇所を見つける
3. ワークの画素にプロットしていく
4. 画像を出力する。

考え方で難しいのは
「すでに外枠としてプロットしている箇所は追跡を開始しない」
くらいかと思う。

#ソースコード

```go
func BoundaryTracking(srcImg image.Image) image.Image {
	workImg := image.NewRGBA(srcImg.Bounds())
	//キャンパスを真っ白にする。
	icom.ImageLoop(workImg, func(x int, y int) {
		workImg.Set(x, y, color.RGBA{math.MaxUint8, math.MaxUint8, math.MaxUint8, math.MaxUint8})
	})
	//探索開始
	icom.ImageLoop(srcImg, func(x int, y int) {
		if true == isCheckValue(x, y, srcImg) {
			r, _, _, _ := srcImg.At(x, y).RGBA()
			wR, _, _, _ := workImg.At(x, y).RGBA()
			//	元画像が黒かつ、ワークが白（既に走査済みの線の可能性もこれで排除）
			if r == 0 && wR != 0 {
				//外枠か内枠かを操作する
				code := getCode(x, y, srcImg)
				if code != -1 {
					imgChase(x, y, code, srcImg, workImg)
				}
			}
		}
	})
	return workImg
}
```

キャンパスを真っ白にしておかないといけません。

考えが難しいPOINT

```go
if r == 0 && wR != 0 {
```
既に境界線を走査した場合、wRはimgChase関数内で黒くなっている可能性がある。
同じ処理を動かさないように必要なんですね。

### getCode

現在の走査点の左が白なら外枠と判別する、右側なら内枠と判別する。
中身がくりぬかれるのもこの論理の効能である。

```
func getCode(x, y int, img image.Image) int {
	r, _, _, _ := img.At(x-1, y).RGBA()
	if r != 0 {
		//	外枠の走査開始
		return 0
	}
	r, _, _, _ = img.At(x+1, y).RGBA()
	if r != 0 {
		//	内枠の走査開始
		return 4
	}
	return -1
}
```

### imgChase
基本的には左、下、右、上の順番に探して、見つかったら黒にするだけ。
ちなみに見つからなかったらとりあえず黒くせず移動する辺りちょっと賢いなと思った。

```
func imgChase(x, y, code int, srcImg image.Image, workImg *image.RGBA) {
	xStart := x
	yStart := y
	fhase := func(xPos, yPos, a, b int) int {
		r, _, _, _ := srcImg.At(xPos, yPos).RGBA()
		if r == 0 {
			return a
		}
		return b
	}
	var x2, y2 int
	//	探索を開始して最初の位置に戻ってくるまで
	for x2 != x || y2 != y {
		x2 = xStart
		y2 = yStart
		switch code {
		case 0: //基準点から下
			y2++
			code = fhase(x2, y2, 6, 2)
		case 2: //基準点から右
			x2++
			code = fhase(x2, y2, 0, 4)
		case 4: //基準点から上
			y2--
			code = fhase(x2, y2, 2, 6)
		case 6: //基準点から左
			x2--
			code = fhase(x2, y2, 4, 0)
		}
		r, _, _, a := srcImg.At(x2, y2).RGBA()
		if r == 0 {
			workImg.Set(x2, y2, color.RGBA{0, 0, 0, uint8(a)})
			xStart = x2
			yStart = y2
		}
	}
}
```

#　出力結果

###元画像
![test_vari_th.png](https://qiita-image-store.s3.amazonaws.com/0/51009/eeb4b06c-b422-37d3-09db-8eb708469ee8.png "test_vari_th.png")

###出力結果
![test_boundary.png](https://qiita-image-store.s3.amazonaws.com/0/51009/acf7d8bd-6ae2-9def-77ba-0fd1f413889a.png "test_boundary.png")


良い感じですね、機械学習(ry
docker stackをまとめて削除する方法

docker stack rmコマンドで指定できるstackがひとつだけで、ごみスタックが溜まった際に消すのがめんどくさそうなので、一発で消せるワンライナーをメモしておく。

```
for stack in $(docker stack ls | awk '{print $1}'); do docker stack rm ${stack}; done
```

たぶんアップデートされればこんなの使わなくても良いようになるはず。。。
PowerShellでWebサイトの更新チェックを行う

# はじめに
利用しているWebサービスのメンテナンス情報をチェックしたい！！
でも、専用のWeb APIもなけりゃRSSも提供されていない。
毎日確認しに行くのはかったるいし、絶対忘れる。
そんな作業を自動化するために、PowerShellで自動化スクリプトを作成しました。

# やりたいこと
1. 所定のWebサイトのソースを取得する。
1. 前回実施した結果と比較する。
1. 違っていた場合はメッセージ通知。

# 環境
- Windows7
- Internet Explorer11
- PowerShell2.0

# PowerShellコード
```sample.ps1
# Webサイトソース保存先
$OUTPUT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
$CURRENT_FILE = $OUTPUT_DIR + "\current-website.txt"
$BEFORE_FILE = $OUTPUT_DIR + "\before-website.txt"

# 前回実行したファイルが存在する場合、コピーする
if (Test-Path $CURRENT_FILE) {
    copy $CURRENT_FILE $BEFORE_FILE
}

# Webサイト情報取得
$wc = new-object System.Net.WebClient
$wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko")
$wc.Headers.Add("Accept-Language", " ja-JP")
$wc.DownloadFile("http://www.hogehoge.co.jp", $CURRENT_FILE)

# 今回と前回の差分を取得する
if ($(diff $(cat -Encoding UTF8 $CURRENT_FILE) $(cat -Encoding UTF8 $BEFORE_FILE)).Length -gt 0) {
    $wsobj = new-object -comobject wscript.shell
    $wsobj.popup("Webサイト更新あり") >$null 2>&1
    exit 1
} else {
    exit 0
}
```

# 解説
    if (Test-Path $CURRENT_FILE) {
        copy $CURRENT_FILE $BEFORE_FILE
    }
ファイルが存在するかどうかのチェックは、Test-Pathコマンドレットを利用します。
引数のファイル（ディレクトリでも可）が存在した場合、Trueが返ります。
存在しない場合は、Falseです。

    $wc = new-object System.Net.WebClient
    $wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko")
    $wc.Headers.Add("Accept-Language", " ja-JP")
    $wc.DownloadFile("http://www.hogehoge.co.jp", $CURRENT_FILE)
WebClient.DownloadFile メソッドを利用して、ファイルをダウンロードします。
第一引数は、ダウンロード元URL
第二引数は、保存先パス
を指定します。
WebClient.Headers.Addメソッドを利用することでHTTPリクエストヘッダにパラメータを追加することが出来ます。

    if ($(diff $(cat -Encoding UTF8 $CURRENT_FILE) $(cat -Encoding UTF8 $BEFORE_FILE)).Length -gt 0) {
前回ダウンロード結果と今回ダウンロード結果をDIFF比較しています。
DIFF結果の文字列長が0より大きい場合は差異があると判断しています。
もう少しいい方法がありそうな予感…

    $wsobj = new-object -comobject wscript.shell
    $wsobj.popup("Webサイト更新あり") >$null 2>&1
wscript.sheel.popupはボタン押下結果を標準出力するため、nullに捨てています。

# おわりに
Webサイト更新があった場合にポップアップを表示していますが、その後ブラウザを起動してWebサイトを表示するように修正しました。
PowerShell楽しいです(^q^)

# 参考サイト
* [「 Linux ならできるのに、だから Windows は...」「それ PowerShell でできるよ」](http://qiita.com/cd01/items/da9a36582372e7d0a7f6)
swift_grammar_refsを使って、Swiftプログラムの書き方を納得する方法

昨日のmacOSアプリの更新です。

https://github.com/Arczzir/swift_grammar_refs

macOS アプリ: [4_view_db_in_app_SwiftGrammarRefs_v1.zip](https://github.com/Arczzir/swift_grammar_refs/raw/master/4_view_db_in_app_SwiftGrammarRefs_v1.zip) 


使い方をちょっと説明させていただきます。
例えば、switch statementを書くときのレファレンスは↓
![Screen Shot 2017-02-03 at 1.52.43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/163219/adf12c18-d95f-8b18-cbf8-856c6a2a4b57.png)
それを見ると、「なるほど、case pattern : の中に pattern はこういうことなんだ」と納得する可能性があるでしょう。
macでHHKBを使用するときの困ったこと&解決法まとめ

HHKB(日本語配列)を購入し、最初の困ったことがあったのでメモ。

#困ったこと
- 1.今回購入したキーボードをmacに繋げたのだが、純正キーボードの方もキーが使えてしまう。
- 2.F1~F12までの音量調節や、画面の明るさ変更ができない。

##解決策
- まず「karabiner」というアプリをインストールする。https://pqrs.org/osx/karabiner/index.html.ja
- Change F1と検索すると画像のような項目が現れるので使用するであろう項目にチェックする。(自分の場合は明るさ調節、音量調節しか使わないので2箇所だけ)
![スクリーンショット 2017-02-03 14.56.33.png](https://qiita-image-store.s3.amazonaws.com/0/163415/60a6f89b-9b94-7a09-08e3-7200125be2dd.png)

-キーボードが接続されてるときは純正キーボードを使えなくする設定はinternal keyboardなどで検索すると画像のような項目が現れるのでこちらをチェックする。
![スクリーンショット 2017-02-03 14.59.57.png](https://qiita-image-store.s3.amazonaws.com/0/163415/a39c2341-ef9a-97c1-3e79-890abf13ee40.png)
JSF自作タグの作成方法まとめ


xhtmlファイルで実装その1(ui:compositionタグ利用)
https://www.tutorialspoint.com/jsf/jsf_custom_tag.htm

→ui:decorateで取り込むパターン
http://d.hatena.ne.jp/terazzo/20080729

xhtmlファイルで実装その2(compositeタグ利用)
https://www.tutorialspoint.com/jsf/jsf_composite_components.htm

UIComponentクラスを継承して実装
http://d.hatena.ne.jp/Yosuke_Taka/20120219/1329646586
普通のpython実行ファイル(argparseを含むファイル)をJupyter notebookで実行するときのメモ書き

普通に
https://github.com/pfnet/chainer/blob/master/examples/mnist/train_mnist.py
などサンプルpythonファイルをjupyterで実行すると下記のようなエラーが出る．

```実行結果
usage: __main__.py [-h] [--batchsize BATCHSIZE] [--epoch EPOCH] [--gpu GPU]
                   [--out OUT] [--resume RESUME] [--unit UNIT]
__main__.py: error: unrecognized arguments: -f /run/user/2049/jupyter/kernel-84d4df02-bc59-4802-9d99-c3228bb4e71f.json
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2


/home/mil/watanabe/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/IPython/core/interactiveshell.py:2889: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
```

このようにargsまわりでエラーが出る．

そんなときは"easydict"を入れて，

```
pip install easydict
```

下記のように変更すれば手っ取り早く試せる．

```sample.py
# parser = argparse.ArgumentParser(description='Chainer example: MNIST')
# parser.add_argument('--batchsize', '-b', type=int, default=100,
#                     help='Number of images in each mini-batch')
# parser.add_argument('--epoch', '-e', type=int, default=20,
#                     help='Number of sweeps over the dataset to train')
# parser.add_argument('--gpu', '-g', type=int, default=-1,
#                     help='GPU ID (negative value indicates CPU)')
# parser.add_argument('--out', '-o', default='result',
#                     help='Directory to output the result')
# parser.add_argument('--resume', '-r', default='',
#                     help='Resume the training from snapshot')
# parser.add_argument('--unit', '-u', type=int, default=1000,
#                     help='Number of units')
# args = parser.parse_args()
import easydict
args = easydict.EasyDict({
        "batchsize": 100,
        "epoch": 20,
        "gpu": 0,
        "out": "result",
        "resume": False,
        "unit": 1000
})
```
ノンプログラミングでLINE BOT

最近、シチズンデベロッパーの活躍が目立つようになってきましたが、ちょっとした連携ってノンプログラミングで実現したいですよね。そこで、2つのサービスを連携できる[IFTTT](https://ifttt.com/)というサービスと[LINE](https://line.me/)を繋いで遊んでみようと思います。

こんな感じ。
<img width="375" alt="IMG_9780.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/100494/345b7831-d28a-4cc9-365f-3f71eac45ef3.png">


# やりたいこと
- 出かける前に、今日の天気が気になるので、LINEで勝手に教えてほしい
- 明日、雨予報ならこれまた勝手に教えてほしい

# なぜ、LINEとIFTTTなのか
- bot専用のアプリを入れたくなかった（日常で利用しているアプリにしたかった）
- なるべくプログラミングしたくなかった

# それぞれのサービス概要
- [LINE](https://line.me/)：日本では月間アクティブ率が7割を超え、利用頻度が高まっているソーシャルメディア
国内ユーザー数：6,800万人（2016：LINE 2016年10月-2017年3月媒体資料）
（参照元：http://ad-center.line.me/mediaguide/）
- [IFTTT](https://ifttt.com/)：「if this then that」というシンプルなコンセプトで、数あるWebサービス（Facebook、Evernote、Weather、Dropboxなど）同士で連携することができるWebサービスで、マウス操作だけでほとんどの連携が簡単にできる。

# 準備
## LINE
スマートフォンでLINEを使っている方

- グループ（ここでは「かぞく」）を作る
- LINEの公式アカウントから「LINE Notify」を探して、そのグループに追加
- そのグループに、仲の良い人（妻とか）を追加 ※botが成功した後でも良いかもしれませんね。

## IFTTT
- [IFTTT](https://ifttt.com/) にアクセスし、サインアップしておきましょう

# 作ってみる
## IFTTT
- [IFTTT](https://ifttt.com/search) で「LINE」を入力&検索し、Servicesで「LINE」を選択
- 「LINE Connect」して自分のLINEアカウントにログイン ※LINEでの本人認証がある
- 「毎朝6時に天気予報をお届け」を選択

![20170203-13-38_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/100494/a9bb069e-6318-9418-457e-bd4953969cd0.png)

- 「Turn On」して Configure画面で次のように改良して、保存

| タイトル                 | 送信時間 | グループ    |
|:------------------------|---------:|:----------:|
| 毎朝**7**時に天気予報をお届け |  AM **7**:00 |   **かぞく**   |


- 「On」になっていればOK
- 右上の歯車アイコンでメッセージのカスタマイズも可能
![20170203-13-55_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/100494/29151a61-66e8-9703-681c-192307732e33.png)


- メッセージのカスタマイズ例
日本語部分を変更してみました。

```html:
本日の天気です。<br><br>
天気:{{TodaysCondition}}<br>
最高気温: {{HighTempCelsius}} ℃<br>
最低気温:{{LowTempCelsius}} ℃<br><br>
日没時間:{{SunsetAt}}<br><br>
良い一日を過ごしましょう♪
```
 

# さいごに
いかがでしょうか。
同様に「明日、雨予報ならこれまた勝手に教えてほしい」場合には、「明日の天気が雨の時にLINEでお知らせ」のAppletsを選択して同様に作ってみるとよいでしょう。

## 気になったこと
- TodaysCondition は日本語にならないのか
- どの地域レベル（都道府県？市区町村？）の天気情報を取得しているのか
D言語でdubを使ってビルド時に、最新のコミットのハッシュをバイナリに組み込む

こんにちは。
タイトル通りですが、D言語でビルド時のコミットのハッシュをバイナリに組み込みたいという事になった場合に、どうすればいいか、ということについて書きます。

dubには様々なオプションが存在します。ここで使うのは`preGenerateCommands`を使います。
これは、dubでビルドする前にシェルのコマンドを叩くことができるオプションです。
これを使います。
また、最新のコミットのハッシュを得るには`git rev-parse --short HEAD > version`というコマンドを用います。
したがって、イメージとしてはビルドに際して

1. `preGenerateCommands`を用いて`git rev-parse --short HEAD > version`を実行する。
2. D言語にはstring importと言うものが有り、それを用いて`version`というファイルを読み込む。
3. これでバイナリにハッシュを組み込める！！！

という感じになります。

string importとは(これが正しい名前だったかは忘れてしまったのですが)、ビルド時に、`string value = import("filepath");`とすることで、`filepath`のファイルの中身をvalueに読み込むことができる機能です(なお、これを使うには`dmd`でビルドする時に`-J`オプションで、`filepath`のあるパスを指定する必要があります。)

以上をまとめると、次のようなコードで組み込む事ができます。

```json:dub.json
{
  "name": "test_git",
  "authors": [
    "Akihiro Shoji"
  ],
  "description": "A minimal D application.",
  "copyright": "Copyright (c) 2017, Akihiro Shoji",
  "license": "MIT",
  "preGenerateCommands": ["bash getLatestCommitHash.sh"],
  "dflags":["-J."]
}
```

```d:source/app.d
import std.stdio;

enum string _version = import("./version");

void main() {
  writeln("version : ", _version);
}
```

```bash:getLatestCommitHash.sh
git rev-parse --short HEAD > version
```

このようにして書くと、ビルド時にバイナリに、最新のコミットのハッシュを埋め込むことが出来ます。
DjangoでMarkdown出力をする

pipでCommonMarkかMarkdownをインストールして、このtemplatetagを使えばいいと思いました

```Bash
pip install CommonMark
```

```python:templatetag.py

import CommonMark
from django import template
from django.template.defaultfilters import stringfilter
import re

register = template.Library()


@register.filter
@stringfilter
def mark2html(value):
    plain_text = CommonMark.commonmark(value)
    return re.sub(r'<[sS][cC][rR][iI][pP][tT][\s\S]+?/[sS][cC][rR][iI][pP][tT]>', '', plain_text)
```

正規表現周りに自信が無いので、問題点があれば指摘下さい、お願いします


# 追記
疲れててdecoratorとtemplatetagを間違えました、失礼しました
RSpecでテストを書いていたら別ファイルのhelperメソッドの呼び出しが undefined method になって困った時

テスト対象のファイル以外に自分で記述したhelper methodが呼べない！と怒られた時の解決策。

- ```sample_helper.rb``` で定義したメソッドをテストしたい
- テスト対象のメソッドが別のファイル(```util_helper.rb```)で定義したメソッドを使ってたりすると・・・ 

### コード

```app/helpers/util_helper.rb
module UtilHelper
  def my_useful_method
    'very useful'
  end
end
```

```app/helpers/sample_helper.rb
module SampleHelper
  def my_sample_method
    "#{my_useful_method} sample_method"
  end
end
```

### スペック

```helpers/sample_helper_spec.rb
require 'rails_helper'

RSpec.describe SampleHelper do
  describe "my_sample_method" do
    it { expect(my_sample_method).to eq 'very useful sample_method' }
  end
end
```

### 実行すると・・・

こんな感じのエラーになってしまう

```
NameError: undefined local variable or method `my_useful_method' for #<RSpec::ExampleGroups::SampleHelper::MySampleMethod:0x007ff1f93e06a0>
```

ぐぬ・・

## 解決策

使いたいメソッドが定義されている helper module をインクルードしてあげれば良い。

```helpers/sample_helper_spec.rb
require 'rails_helper'

RSpec.describe SampleHelper do
  describe "my_sample_method" do
    include UtilHelper ## ここ
    it { expect(my_sample_method).to eq 'very useful sample_method' }
  end
end
```

### 解決策引用元

[How to call an app helper method from an RSpec test in Rails? - Stack Overflow](http://stackoverflow.com/questions/14402067/how-to-call-an-app-helper-method-from-an-rspec-test-in-rails)

- - -

普通にviewで使ってる分には、どこのファイルに書いてあっても呼べちゃう helper method だけに、うっかり別々のファイルに分かれてしまっていると、specの時だけなぜかメソッドないとか怒られて悲しいことになる・・
Bash on Ubuntu on WindowsでAnsible1.9系をインストールする手順

# Bash on Ubuntu on WindowsでAnsible1.9系をインストールする手順

元が1.5と古いのでPPAを追加してインストールします。

```shell-session
$ sudo add-apt-repository ppa:ansible/ansible-1.9
$ sudo apt-get update
$ sudo apt install ansible
```
.Net Runtime　エラー

.NET Runtime version 4.0.30319.0 - プロファイル API のアタッチ インフラストラクチャの初期化中にエラーが発生しました。  このプロセスでは、プロファイラーをアタッチできません。  HRESULT: 0x80004005。  プロセス ID (10 進数): 3456。  メッセージ ID: [0x2509]。

がいっぱいログに溜まってる……

解決するのを忘れないためメモ失礼します。
Digdagで_exportは同階層に2回書けないけどincludeすると書ける

```
$ cat export2.dig
_export:
  a: aaa
_export:
  b: bbb

+env:
  echo>: ${a} ${b}
$ digdag run export2.dig
2017-02-03 12:54:11 +0900: Digdag v0.9.3
error: Validating project failed
workflow /tmp/export2.dig Duplicated keys: [_export] (model validation)
```

```
$ cat export1_parent.dig
_export:
  a: aaa

!include : export1_child.dig

+env:
  echo>: ${a} ${b}
$ cat export1_child.dig
_export:
  b: bbb
$ digdag run export1_parent.dig
2017-02-03 12:57:35 +0900: Digdag v0.9.3
～略～
2017-02-03 12:57:42 +0900 [INFO] (0016@+export1_parent+env): echo>: aaa bbb
aaa bbb
```

ちなみに、正しいdigを実行しようとしても、正しくないdigが同一ディレクトリにあると実行できない

```
$ ls *.dig
export1_child.dig  export1_parent.dig  export2.dig
$ digdag run export1_parent.dig
2017-02-03 13:00:04 +0900: Digdag v0.9.3
error: Validating project failed
workflow /tmp/export2.dig Duplicated keys: [_export] (model validation)
```
Closure Compiler を使ってみた

CreateJS を使おうと思ってたんだけど、そういえば FlashDevelop に CreateJS のプロジェクトがあったなぁと試してみたらハマッたので共有。

## 準備
1. FlashDevelop をインストールする
1. FlashDevelop を起動
1. 「メニュー」→ 「Tools」→「Software Install」→ AppMan を起動
1. Compilers の Closure Compiler にチェックを入れてインストール
1. 「メニュー」→ 「Project」→「New Project」→「CreateJS App」

このプロジェクトは　Closrue Compiler を使用するらしい。

## コンパイルしてみる
プロジェクトの bin の中に プロジェクト名.js ができればおｋ。
できない場合は大体 Output パネルにエラーが出ている。

> Unable to access jarfile 

分かり難いけどこんなエラーの場合は原因が二つ考えるので以下を試してみる。
1. JRE が対応してない可能性があるのでアップデートする。JRE7 以降なら大丈夫そう。
2. compiler.jar が違う名前でインストールされている可能性があるので名前を変える。「メニュー」→「Tools」→「User Config Files」→「App」→「closure」→「(バージョン)」closure-compiler.jar のような名前が付いた jar ファイルをコピーしてcompiler.jar を作っておく。
3. FlashDevelop に戻ってもう一度コンパイルしてみる。

エラーが消えていればおｋ。

## 蛇足
build.cmd の中を見てみると

```bat
Jexec.cmd closure compiler.jar %*%params%
```

こんな記述がありますが、`Jexec.cmd` は AppMan がインストールしたプロジェクトを Java で実行するためのやつっぽい。

```bat
Jexec.cmd プロジェクト名 実行する.jar [引数]
```

のように使うらしい。
上のエラーが出て時に、ここの compiler.jar を変更して対処しても良いが毎回変えないといけないので面倒だと思う。
Simulator のスクリーンショット機能がクラッシュするのでコマンドで代替する

iOSのSimulatorでスクリーンショットを撮影するとほぼクラッシュするようになってしまいました。これだと非常に困るわけで、コマンドを利用して代替できるようにしてみました。

```bash
$ xcrun simctl io booted screenshot ~/Desktop/Simulator-`date +%Y-%m-%d_%H.%M.%S`.png
```

これでデスクトップに画像ができあがります。

しかし毎回コマンドを叩くのも面倒なので、Automatorで自己実行型ワークフローにしてみます。

新規から「アプリケーション」を選んで…
![](https://qiita-image-store.s3.amazonaws.com/0/3603/91f3dd3e-01ac-487c-4b37-4393695ce615.png)

シェルスクリプトを実行するアクションを記述して完成です。
![](https://qiita-image-store.s3.amazonaws.com/0/3603/2480836e-cbb3-59de-2a1f-6f6b6bb5d0ca.png)

Dockに置いておくと便利です。

<img width="384" src="https://qiita-image-store.s3.amazonaws.com/0/3603/5d332e5e-b6b2-124f-bd83-ad0f8eda0a4a.png">

以上。
React Nativeで外部リンクをブラウザで開く

# 概要

アプリから特定のURLをブラウザで開く方法についてのメモです。

# 実装

Linking APIを使用します。

```javascript
Linking.openURL(url).catch(err => console.error('URLを開けませんでした。', err));
```

URLを開く前にURLが有効かを判別したい場合以下のように書きます。

```javascript
Linking.canOpenURL(url).then(supported => {
  if (!supported) {
    console.log('無効なURLです: ' + url);
  } else {
    return Linking.openURL(url);
  }
}).catch(err => console.error('URLを開けませんでした。', err));
```

# 参考

- https://facebook.github.io/react-native/docs/linking.html
	- Deep linkのハンドリングについても解説されています。
SourceTreeでgithubからクローンできない問題(ssh接続)

## 環境
windows7
SourceTree 1.9.10.0
git 2.10.2.windows.1

## 問題
SourceTreeがgithubのリポジトリを認識してくれず、sshでクローンできない

## 前提
黒い画面が使えないディレクターさんのために、SourceTreeを導入した。
はじめにSourceTreeのGUIからkeyを作成してもらった。

参考
http://qiita.com/redamoon/items/5928ecab7e36f23b81ee

このような手順でやってもらったが、鍵がうまく生成できなかった。公開鍵がssh-rsa AAAAから始まっていなかった。
もしかしたらうまくいくかも...と思ってgithubに公開鍵、SourceTreeに秘密鍵を登録してみたが、やっぱりダメでエラーが出た。

このためターミナルからコマンドで作り直してもらった。
...すると表題の問題が発生した。

## 原因
1度目につくった秘密鍵をSourceTreeに登録した際のキャッシュと思われるものが残っていた
参考
http://sbkro.hatenablog.jp/entry/2013/04/23/231312

こちらのサイトの通りでした。

## 作業手順
### 1.キャッシュを消す
▼「ターミナル」から黒い画面を立ち上げる

▼vi（テキストエディタ）で、known_hostsというファイルを開く
ここにキャッシュが残っている。
`vi ~/.ssh/known_hosts`

▼「github.dip-net.co.jp...」から始まる一行を削除する 
github.dip-net.co.jp...の上にカーソルを置いた状態で

`dd`
と入力して削除

▼保存して終了する

`:wq`

### 2.SourceTreeに秘密鍵を登録しなおす
「メニュー」 → 「オプション」 → 「sshクライアントの設定」
id/rsa.ppkを選択して保存する

### 3.リポジトリをクローンする
JSを使ったDigdag変数を他の変数から参照する際、参照元の階層が2レベル目以上だとJSが実行されない

```
$ cat a.dig
_export:
  a11: abc
  a21: a21_${a11}
  a31:
    a32: a32_${a11}

  b11: ${session_date}
  b21: b21_${b11}
  b31:
    b32: b32_${b11}
  b41:
    b42: b42_${session_date}

  c11:
    c12: ${session_date}
  c21: ${c11.c12}
  c31:
    c32: ${c11.c12}

+env:
  sh>: env | sort
```

```
$ digdag run a.dig
2017-02-03 11:11:54 +0900: Digdag v0.9.3
2017-02-03 11:12:00 +0900 [INFO] (0016@+a+env): sh>: env | sort
a11=abc
a21=a21_abc
a31={"a32":"a32_abc"}             ← 参照先がJSを使っていなければ問題ない
b11=2017-02-03
b21=b21_2017-02-03                ← 参照先がJSを使っていても1レベル目なら問題ない
b31={"b32":"b32_${session_date}"} ← 参照先がJSを使っている＆2レベル目以降だとJSが実行されない！
b41={"b42":"b42_2017-02-03"}      ← 参照元と同じJSを重複記述して回避 orz
c11={"c12":"2017-02-03"}
c21=2017-02-03
c31={"c32":"${session_date}"}     ← 参照先が2レベル目以上でも同じ
```
gitでカンバン管理をする

![スクリーンショット 2017-02-03 午前11.30.08.png](https://qiita-image-store.s3.amazonaws.com/0/87607/f0eca9e1-f7d9-c376-b5ec-4417adc4dbc4.png)

#使い道
作業の可視化

#導入方法
cromeからしか使えないが、
zhb.io/chrome
をURLに打ち込むだけで導入できる

#使用例
こちらのサイトを運用しているので、こちらからみることができると思います。
※golangのライブラリを作っているのでよかったら、みてみてください

https://github.com/agato/nlog#boards?repos=80710886



#参考
http://qiita.com/yoheimuta/items/ddf4b278f3db79ce2a8f
What happens when accessing HTTP from HTTPS pages



# Chrome

|element|HTTP Request|Secure Key Icon|
|---|---|---|
|SCRIPT|blocked||
|IMG   ||broken|
|LINK type="text/css"    |blocked||
|IFRAME   |blocked||
| new Image   ||broken|
| createElement('img')   ||broken|
|XMLHttpRequest|blocked||
|navigator.sendBeacon|blocked||

most requests are blocked and the icon stays green. seems only images break the key.

# mobile safari on ios10

|element|HTTP Request|Secure Key Icon|
|---|---|---|
| new Image   ||broken|
| createElement('img')   ||broken|
|XMLHttpRequest|blocked||
標準偏差を求める関数 stddev_pop と stddev_samp の違い

### 注意

内容が間違ってるそうなのでコメントを参照してください。

----

Railsのプロジェクトで偏差値を求めたかったので標準偏差が必要になったので調べてみたらPostgresの関数に `stddev_pop` と `stddev_samp` があってそれぞれが`population standard deviation` と `sample standard deviation`らしいんだけど、よくわからない。

https://www.postgresql.org/docs/9.5/static/functions-aggregate.html

日本語ではそれぞれ`(母)標準偏差`、`標本標準偏差`と言うらしい。

### 2つの違い

標準偏差が全部の数値を使った計算で、標本標準偏差は適当にサンプルとして抜いた値で求める方法とのこと。つまり簡単に特性だけ述べると

stddev_pop(標準偏差): 遅い、正確
stddev_samp(標本標準偏差): 速い、不正確

ということです。更に詳しくは参考を見てください。

### 参考

http://math.stackexchange.com/questions/15098/sample-standard-deviation-vs-population-standard-deviation

https://www.mathsisfun.com/data/standard-deviation-formulas.html
rails-dev-box内部でのDBユーザーは？(2017/2時点)

# これを読んでわかること
- Box内のDBたちへの接続初期ユーザ

# [rails-dev-box](https://github.com/rails/rails-dev-box "rails-dev-box")とは
Vagrant用に提供されているRails開発用に必要なサービスやツール一式が詰め込まれた仮想マシンです。素から構築する場合より余分なものが入ってしまいますが、`git clone`して`vagrant up`するだけで一式揃ってしまうお手軽さ。特にOS指定や細かいバージョン指定が無く、最新(に近いもの)を利用して開発する場合はとても便利です。

# 便利すぎるがゆえに
とても楽ちんに開発環境構築出来ますが、楽ちんがゆえにぱっと分からない部分があります。DBへの接続ユーザ情報なんかはREADMEに書いてないので、初学者がサンプル試そうとする場合なんかに「DBへの接続ユーザ、どうなってるの？」となりがちかもです。

# では情報はどこにあるか？
GitHubにある[構築ファイル](https://github.com/rails/rails-dev-box/blob/master/bootstrap.sh)の中身を見てみましょう。

## mysqlの接続ユーザ

```bash
debconf-set-selections <<< 'mysql-server mysql-server/root_password password root'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password root'
```

```sql
CREATE USER 'rails'@'localhost';
```

という記述があるので、rootとrailsでユーザーが作成されていることがわかります。

## postgresqlの接続ユーザ

```bash
sudo -u postgres createuser --superuser ubuntu
```
という記述があるので、ubuntu(SSHした時のユーザ名と同じ)でユーザが作成されていることがわかります。

# おわりに
まぁ、こんな感じで「読めばわかる」ものではあるのですが、READMEに書いてあったほうが親切かなー、という気がしないでもないです。少し詳しい人はすぐわかると思いますが、せっかくなのでメモとして残しておきます。
画像を効率的に読み込む(from Assets)

# ScriptModで画像を効率的に読み込んでみよう

端末の解像度より大きい画像を準備していてそのまま読み込むと無駄が出ますよね？(メモリにも優しくないですし)
~~あなたはSですか？~~

## 今回は テクスチャから効率的に読み込む方法を紹介します。


```javascript:decodeAssets.js

function decodeAssets(url,width,height){
    const byte=ModPE.getBytesFromTexturePack(url);
    // テクスチャからバイト配列を取得
    if(byte===null)return null;
    const options=new android.graphics.BitmapFactory.Options();
    options.inJustDecodeBounds=true;
    // Bitmapを読み込まないように設定
    android.graphics.BitmapFactory.decodeByteArray(byte,0,byte.length,options);
    const bitmap_height=options.outHeight-0;
    // 高さ取得
    const bitmap_width=options.outWidth-0;
    // 幅取得
    let inSampleSize=1;
    if(bitmap_height>height||bitmap_width>width){
        if(bitmap_width>bitmap_height)
            inSampleSize=Math.round(bitmap_height/height);
        else
            inSampleSize=Math.round(bitmap_width/width);
    }
    options.inSampleSize=inSampleSize;
    // 指定のサイズより大きかった場合リサイズして読み込むように設定
    options.inJustDecodeBounds=true;
    // Bitmapを読み込むように設定
    return android.graphics.BitmapFactory.decodeByteArray(byte,0,byte.length,options);
}
```
###例
横1920 縦1080 の画像を用意したします。
しかし、端末の解像度は 960 540 しかありません。
`decodeAssets("images/test.png",960,540);`
組合せ最適化で「キューブの中のキューブ」を解く

# キューブの中のキューブ

パズルコレクション12号「キューブの中のキューブ」を解いてみます。
<img src="https://hcj.ncss.nifty.com/3dpuzzle2016/assets/img/home/content02/item/item01.jpg" width="240">

54個の下記の木の部品を、6×6×6のサイズの立方体の空間にすきまなく詰めます。
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/1e5c0b27-41be-c665-beba-5d8bb0c9342c.png)

# Pythonで解く

## 候補の列挙
全部で、6*4*5*12=1440 候補になります。

```py3:python3
import numpy as np
from itertools import cycle, product
from more_itertools import take
def rotx(a):
    n, b = a.shape[0], np.zeros(a.shape)
    for i,j,k in product(range(n),range(n),range(n)):
        b[i,j,k] = a[i,n-1-k,j]
    return b
def roty(a):
    n, b = a.shape[0], np.zeros(a.shape)
    for i,j,k in product(range(n),range(n),range(n)):
        b[i,j,k] = a[n-1-k,j,i]
    return b
def rotz(a):
    n, b = a.shape[0], np.zeros(a.shape)
    for i,j,k in product(range(n),range(n),range(n)):
        b[i,j,k] = a[n-1-j,i,k]
    return b
def cands():
    cc = []
    for i,j,k in product(range(6),range(4),range(5)):
        a = np.zeros((6,6,6))
        a[i,j,k]=a[i,j+1,k]=a[i,j+1,k+1]=a[i,j+2,k]=1
        for f in take(12, cycle([rotx, roty, rotz])):
            cc.append(a.flatten())
            a = f(a)
    return np.array(cc, dtype=int)
```

## [集合分割問題](http://qiita.com/Tsutomu-KKE@github/items/22ec0e42999141a0ba1e)に定式化して解く

```py3:python3
from pulp import *
from ortoolpy import addbinvars
cc = cands() # 全候補
m = LpProblem() # 数理モデル
v = addbinvars(len(cc)) # どの候補を選ぶか
for i,c in enumerate(cc.T):
    m += lpDot(c.tolist(), v) == 1
m.solve()
```

## 解の表示

```py3:python3
%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.colors import hex2color, CSS4_COLORS
plt.rcParams['figure.figsize'] = 12, 8
cols = list(CSS4_COLORS.values())
def show(v, n=6):
    r = np.zeros((6,6,6), dtype=int)
    j = 0
    for i, x in enumerate(v):
        if value(x):
            j += 1
            r += cc[i].reshape((6,6,6))*j
    for k in range(n):
        plt.subplot((n+2)//3,3,k+1)
        plt.imshow([[hex2color(cols[i]) for i in j] for j in r[k]])
show(v)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/944259a5-cc47-7ffb-8024-9c9b0692d5e9.png)

## 別解
調べてみると、2段ずつできるみたいです。やってみましょう。

```py3:python3
m = LpProblem()
v = addbinvars(len(cc))
for i,c in enumerate(cc.T):
    m += lpDot(c.tolist(), v) == (1 if i < 72 else 0)
m.solve()
show(v, 2)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/1ac48b97-2666-1910-dc0f-33ff3110f3ec.png)


以上
[メモ] (インストール) GitLab-CE on Virtualbox (Virtualbox, Vagrant)




![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/6e7a99e6-6940-6680-cc2e-3893d90bc0b2.png)


## 概要
- GitLab-CEをVagrantをつかって、Virtualboxへインストール。

## 環境

- ホスト
    - Windows 10 64bit
    - VirtualBox 5.1.14
    - Vagrant 1.9.1

## 手順
### その１
https://about.gitlab.com/installation/ の Vagrant option by Tuomo Tanskanen
<br>...なんか、うまくうごかなかった... `gitlab.rb`をうまく編集しないといけない??

1. ぎっとくろーんして、ヴぇいぐらんとあっぷ.

    ```bash:Shellにて.
git clone https://github.com/tuminoid/gitlab-installer.git
cd gitlab-installer
cp gitlab.rb.example gitlab.rb
# gitlab.rbを適当に編集するといい。(が、手をつけず..
vagrant up
```
2. http://localhost:8443/ にブラウザでアクセス... はず..


### その2
https://about.gitlab.com/downloads/#ubuntu1604 にそったVagrantfile作成

1. 適当なフォルダに、`Vagrantfile`作成

    ```rb:Vagrantfile
	# Vagrantfile
	# :: mt08

	VB_NAME="GitLab-CE"
	#
	VM_MEMORY=2048
	VM_CORES=2
	VM_HOSTNAME="gitlab1.localdomain"
	#VM_BASE_BOX="ubuntu/xenial64"
	VM_BASE_BOX="bento/ubuntu-16.04"

	Vagrant.configure("2") do |config|
		config.vm.box = VM_BASE_BOX
		config.vm.network "forwarded_port", guest: 80, host: 8888
		#config.vm.network "public_network", bridge: 'Intel(R) Ethernet Connection I217-LM'
		config.vm.hostname = VM_HOSTNAME

		config.vm.provider "virtualbox" do |vb|
			#   vb.gui = true
			vb.name = VB_NAME
			vb.memory = VM_MEMORY
			vb.cpus = VM_CORES
		end

		config.vm.provision "shell", inline: <<-SHELL
			#echo 'Acquire::http::Proxy "http://apt-cache-server:3142";' | tee /etc/apt/apt.conf.d/02proxy
			#
			apt-get -q update -q
			DEBIAN_FRONTEND=noninteractive apt-get -q -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
			DEBIAN_FRONTEND=noninteractive apt-get -q install -q -y curl openssh-server ca-certificates postfix
			[ -f /etc/apt/apt.conf.d/02proxy ] && rm -fv /etc/apt/apt.conf.d/02proxy
			#
			curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
			# Installing GitLab Community Edition
			apt-get -q install -q -y gitlab-ce
			#
			gitlab-ctl reconfigure
		SHELL
	end

	```

2. `vagrant up`<br>待つ
3. インストールが終わったら、ホストのブラウザを開いて、`http://localhost:8888/` にアクセス。初回時、rootのパスワード設定画面が出てくる。

#### その他
1. `VM_BASE_BOX` で ubuntu公式か、bentoさんのを選ぶ
2. ホスト 8888番ポートを、ゲスト 80番(http)にポートフォワードしてる。
3. `public_network`を設定すれば、他のPCからもアクセス可能
4. だが、`https`でないよ.
4. apt-cacheサーバがあれば、設定するとやり直しが多いときはいいかも。
5. Gitlabパッケージは、エラーが出てしまうので、インストール前にキャッシュ設定を消してる.<br>`/vagrant`フォルダとかに、debファイルをDownloadしてくるとかのほうがええかな？
6. postfixの設定は、`No Configuration`になってるので、あとでするなら、<br>`sudo dpkg-reconfigure postfix` で。
macにmecabをインストール

**無駄にスライドモードにしてみた**

いつもbrewで入れられるんだっけ？とか、ソースはどこだっけ？とか、辞書ファイルがないとか忘れるのでメモ。
macでこれを実行しさえすればいい。

---

## mecabコマンドまで
```
cd /tmp
wget -O mecab-0.996.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE"
tar xzf mecab-0.996.tar.gz
cd mecab-0.996
./configure
make
sudo make install

cd ..

wget -O mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM"
tar xzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
sudo make install

cd ..
rm -rf /tmp/mecab-*
```

---

## test
```
echo '世の中ね顔かお金かなのよ' | mecab

世の中  名詞,一般,*,*,*,*,世の中,ヨノナカ,ヨノナカ
ね      助詞,終助詞,*,*,*,*,ね,ネ,ネ
顔      名詞,一般,*,*,*,*,顔,カオ,カオ
か      助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
お金    名詞,一般,*,*,*,*,お金,オカネ,オカネ
か      助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
な      助詞,終助詞,*,*,*,*,な,ナ,ナ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
EOS
```

---

## pythonでつかう mecab-python

```
pip install mecab-python==0.996
```

```
python -c "import MeCab; print(MeCab.Tagger().parse('世の中ね顔かお金かなのよ'))"

世の中  名詞,一般,*,*,*,*,世の中,ヨノナカ,ヨノナカ
ね      助詞,終助詞,*,*,*,*,ね,ネ,ネ
顔      名詞,一般,*,*,*,*,顔,カオ,カオ
か      助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
お金    名詞,一般,*,*,*,*,お金,オカネ,オカネ
か      助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
な      助詞,終助詞,*,*,*,*,な,ナ,ナ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
EOS
```
NodeやGulpでhost: "0.0.0.0" を指定してサーバーを立ち上げたとき、 listen EADDRINUSE というエラーが出た場合の対応

# 環境
- macbook Pro(ElCapitan)
- node: v6.9.2
- gulp cli: 3.9.0
- npm: 4.0.5

# 状況
- GulpやNodeでサーバーを立ち上げますが、同じローカルネットワーク内の別端末（スマホとか）からもデバッグのために閲覧したいのでgulpflieを以下の様にしました。

```js
gulp.task("webserver.dev", () => {
    gulp.src("hoge")
        .pipe(webserver({
            host: "0.0.0.0",
            livereload: true,
            port: 8080
        }));
});
```

通常これで👆の目的は適う様なのですが、今回は以下のエラーがでました。

```
listen EADDRINUSE 0.0.0.0:8080
listen EADDRINUSE 0.0.0.0:35729
```

悲しいことに **livereloadの方も** でした

# 原因
👆のエラーはこのIP, Portは使われていますよということですので、実際に確認します。

## netstat
コマンドなど普段の開発フローでサーバーが立ち上がっていないことを確認します。
`netstat -an` をします。

するとtcp4でみたくないものを発見しました

```
tcp4       0      0  *.8080                 *.*                    LISTEN
tcp4       0      0  *.35729                *.*                    LISTEN
```

ポートの8080と35729がLISTEN状態のままでした。

おそらく、立ち上げたサーバーが、開発中の何らかの理由で、ちゃんと終了されなかったということにあると思います。

# 対応
この問題の解決方法はいくつかあると思います。

- 1. 別のPortを振ってあげる（暫定的な対応）
- 2. このIP/Portを使っているプロセスをkillして、開放する

1をやっても、同じ問題が繰り返されるだけの可能性もあるので、今回は2の方法をとります。

## 上のPIDを探る
PIDが分かればkillすることが出来ます。（おそらく）
なので、以下のコマンドをとります。

```
$ lsof -n -P -i :8080
```

するとPIDが表示されると思います。

### 追記
netstatでもPIDを表示できるようです。

> root権限があるのであればnetstatコマンドでも-pオプションでPIDとプログラム名が表示できます。

## PIDをkillする

```
kill {PID}
```

してあげればOKです。

# 参考までに
## nodeが犯人であることが多い様です
nodeがポートを保持し続けてしまうことが原因であることが多いようです。
なので

```
ps aux | grep node | grep -v grep
```

とかしてあげると、nodeのプロセスが出てきます。
動かしているはずがないのに、生きているプロセスがあったらそいつを殺してあげるといいです。

### electron系のアプリはnodeをバンバンつかっています
なお、slackアプリなどを使っている場合は、nodeのプロセスがたくさん立ち上がっていると思いますので、 `killall node` はしないほうがいいと思います。

## 私の場合には Nginx が犯人でした
nginxでリバースプロキシをmac内に立ち上げていたのですが、そいつが悪さををしていました。nginxが正しく動いていなかったことが問題だったようです。
これも `netstat` や `ps` で探っていったらなんとかなりました。

# References
- http://www.codingdefined.com/2015/09/how-to-solve-nodejs-error-listen.html
- http://qiita.com/tksmaru/items/d4951b5394aeee8c3cbc
- http://blog.ch3cooh.jp/entry/20160421/1461218527