OmniAICreator/Qiita-1.07M huggingface dataset:
awscli で入れ子の AWS CloudFormation を楽にデプロイする

# 結論

aws cli のコマンド ``package`` で出来るよ!!!
[package — AWS CLI 1.11.91 Command Reference](http://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html)

# 発端

CloudFormation の仕組みとして入れ子、つまり CloudFormation から CloudFormation をデプロイするができますが、その子供のほうが S3 に上がっている必要があります。
この S3 に上げるツールが色々あったり、自作できるレベルと思いつついやしかし…と考えていました。

# 解決策

その解決策して、冒頭に上げたコマンドがあります。
CHANGELOG を見る限りバージョン [1.11.19](https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst#11119)、去年の11月に追加されたみたいです。

使い方です。
フォルダ構成が以下のようになっている、とします。

```
.
├── README.md
├── sub
│   └── child.template
└──root.yaml
```

`` root.yaml`` が纏める CloudFormation です。
その中に ``child.template`` の情報が書いてあります。
実際にはこんな感じ。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: ./sub/child.template
      TimeoutInMinutes: '60'
Outputs:
  StackRef:
    Value: !Ref myStack
```

この状態で、以下のコマンドをたたきます。

```bash
aws cloudformation package --template-file root.yaml --s3-bucket hogehoge-cfn
```

すると、``TemplateURL: ./sub/child.template`` でおいていた子供のテンプレートが S3 にアップされて、それを適用するためのテンプレートが標準出力されます。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Outputs:
  StackRef:
    Value:
      Ref: myStack
Resources:
  myStack:
    Properties:
      TemplateURL: https://s3.amazonaws.com/hogehoge-cfn/265b570db3b28df28e47c3f8e5032e65.template
      TimeoutInMinutes: '60'
    Type: AWS::CloudFormation::Stack
```

これでデプロイができます。
PowerShellでConvertTo-Htmlの出力を贅沢にする

# ConvertTo-Htmlって
PowerShellはコマンドの出力がオブジェクトの羅列で出力されます。
それを色々な形に成形するためのコマンドレットが搭載されているのですが、
中でも見栄えがしそうなのがHTML出力をやってくれる「ConvertTo-Html」です。

参考サイトにも載っていますが

```ps1:ps-table.ps1
ps | ConvertTo-Html | Out-File -FilePath C:¥file¥to¥path¥ps.html
```

こんな感じでコマンドの結果にConvertTo-Htmlをパイプで通すことで
オブジェクトの羅列をtableタグに記録したHTMLファイルが吐き出されます。

で、これだけだと味気ないんですがこのHTMLの出力についてオプションである程度コントロールができます。

例えば

- headタグに色々入れる
- h1タグの挿入

などなど。

こういうことができるのであればやる事は
「テーブル制御できるJavaScriptを読み込ませてリッチにやってみる」ですよねー

# やってみた

```ps1:sortabletable.ps1
$title = "ps結果：{0}" -f (Get-Date -Format "yyyy/mm/dd hh:MM:ss")
$header = "<link rel=`"stylesheet`" href=`"https://cdn.jsdelivr.net/g/jquery.tablecloth@1.0.0(css/bootstrap-tables.css+css/tablecloth.css),tablesorter@2.28.9(css/dragtable.mod.min.css+css/filter.formatter.min.css)`">`n<script src=`"https://cdn.jsdelivr.net/g/jquery@3.2.1,jquery.metadata@2.0(jquery.metadata.js),tablesorter@2.28.9,jquery.tablecloth@1.0.0`"></script>`n<script type=`"text/javascript`"> `$(document).ready(function(){`$(`"table`").tablecloth({ theme: `"paper`", striped: true, sortable: true });});</script>"
ps | ConvertTo-Html -Head $header -Title $title |% { $_ -replace "<tr><th>","<thead><tr><th>" }| % { $_ -replace "</th></tr>","</th></tr></thead>" }|Out-File -FilePath C:¥file¥to¥path¥ps-js.html
```

PowerShellが実行できる環境でPowerShellISEなどにコピペして実行してください。
出力先のパスは環境に合わせて適宜修正して頂ければと。

# やってること

後で書く。CDNから適当にライブラリ選定してコピペしてるだけですが。

# これだけだとつまらないので

今の段階ではやっつけで作っただけなので上手い応用があれば記載します。

# 参考
- [PowerShellのConvertTo-Htmlが便利そうなので調べてる](http://m0t0k1x2.tumblr.com/post/119385103219/powershell%E3%81%AEconvertto-html%E3%81%8C%E4%BE%BF%E5%88%A9%E3%81%9D%E3%81%86%E3%81%AA%E3%81%AE%E3%81%A7%E8%AA%BF%E3%81%B9%E3%81%A6%E3%82%8B "PowerShellのConvertTo-Htmlが便利そうなので調べてる")
- [ConvertTo-Html コマンドレットの使用(MS Technet)](https://technet.microsoft.com/ja-jp/library/ee156817.aspx "ConvertTo-Html コマンドレットの使用")
VSCode debugger + Jest



* やりたいこと: create-react-app-typescript で作った TypeScript プロジェクトの単体テストを Visual Studio Code でデバッグしたい。
* 出来たこと: Javascript と Jest の組み合わせ
* 出来なかったこと: Typescript と Jest の組み合わせ。create-react-app の組み合わせ。

適当に始めて vscode の typescript デバッガが使えない事に悩んでいたが、もう一度心を落ち着けて最初からチュートリアルをやってみることにした。

## Javascript の開発とデバッグ

まずは、vscode を使ったデバッグに最低限必要な物を確認するため、 [Node.js Tutorial in VS Code](https://code.visualstudio.com/docs/nodejs/nodejs-tutorial) のチュートリアルを試す。

この記事によると以下が必要という事になる。

* Javascript インタプリタ node.js をインストールしておく
* Debug 起動設定ファイル .vscode/launch.json で実行ファイルを指定する。

### .vscode/launch.json なしでデバッグしてみる。

    $ mkdir hello
    $ cd hello
    $ code hello.js

    var msg = 'hello world';
    console.log(msg);

    $ node hello.js 
    hello world

* Breakpoint 設定
* View > Debug > 再生ボタン > node.js を選ぶ
* これで今開いている js ファイルを node.js が実行する。

### .vscode/launch.json を使ってデバッグ

View > Debug > 歯車ボタンで Debug 設定ファイル .vscode/launch.json の編集を行う。

```
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${workspaceRoot}/hello.js"
        }
    ]
}
```

デフォルトで実行プログラムは `"program": ${file}` になっているが、これは開いているファイルの意味。ここを例えば

    "program": "${workspaceRoot}/hello.js"

に変えれば再生ボタンを押した時に必ず hello.js を実行する。

* launch.json の中で使える変数など: https://code.visualstudio.com/docs/editor/debugging

## vscode と jest の連携

テスト用のプログラムを作る

    mkdir jesttest
    cd jesttest
    yarn init
    yarn add --dev jest

    code hello.test.js

```
function add(a, b) {
  return a + b;
}

test('3 + 4 = 7', () => {
  expect(add(3, 4)).toBe(7);
});
```

package.json に登録すると、yarn test でテストを実行出来る。

    code package.json

```
  "scripts": {
    "test": "jest"
  }
```

    $ yarn test

これを vscode の debugger で動かすには .vscode/launch.json を以下のように設定する。program で jest のフルパスを指定するのと、--runInBand を指定するのがコツ。ブレークポイントも動く。

```
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${workspaceRoot}/node_modules/jest/node_modules/.bin/jest",
            "args": ["--runInBand"]
        }
    ]
}
```
SambaサーバのOffice文書を「保護されたビュー」無しで開く



# はじめに

社内のSamba(SMB)サーバに、Excelファイル等を配置していると、ファイルを開くたびに以下のような表示がされ、編集ができない状態になっています。

![protected.png](https://qiita-image-store.s3.amazonaws.com/0/91520/98d06b78-01ad-d8f7-e1ad-891ea5339eaa.png)


社内のSamba(SMB)サーバを信頼済みサイトとして登録することで、「保護されたビュー」でない状態でファイルを開くことができます。

# 信頼済みサイトの登録をする

`インターネットオプション`→`セキュリティ`→`信頼済みサイト`→`サイト`

と選択します。

![site1.png](https://qiita-image-store.s3.amazonaws.com/0/91520/3ab59f02-b237-eec7-0941-92034a02bf6e.png)

「このWebサイトをゾーンに追加する」にSamba(SMB)サーバを登録します。

![site2.png](https://qiita-image-store.s3.amazonaws.com/0/91520/a346857c-aa96-eaaa-a21f-1aae1eba58f6.png)


例えば、以下のように入力します。

    file://10.20.30.40

追加ボタンを押下します。

Webサイトに、先ほど入力したURLが追加されます。

![site3.png](https://qiita-image-store.s3.amazonaws.com/0/91520/9496d795-619f-61b6-c8ac-3a8c29c1e9d0.png)


# おわりに

Officeの設定と全然違うところの設定なので、発見に手間取りました。
もうちょっとなんとかならなかったのか？と思います。
Cocos2d-xのTransitionSceneを使用したScene切り替えにご用心

Cocos2d-xのScene切り替えで少しハマったのでメモ。

シーンの切り替えには`Director::getInstance()->replaceScene()`を使用します。
この際に既存のシーンと切り替える新しいシーンは、以下のような流れでメソッドが呼ばれます。

```
Director		Old Scene							New Scene
					constructor
					init()

					onEnter()
					onEnterTransitionDidFinish()

														constructor
														init()
ReplaceScene()

SetNextScene()
					onExitTransitionDidStart()
					onExit()
					cleanup()
					release()
					destructor()
														onEnter()
														onEnterTransitionDidFinish()
```
Sceneクラスを生成した場合、init()が呼ばれます。
その後、replaceScene()でシーン切り替えが予約され、SetNextScene()で切り替え処理が行われます。
replaceScene()とSetNextScene()の間には、ほんの少しだけ間があります。
そしてこの時点ではまだ既存のシーンが生きている状態です。
なのでinit()では、自身のシーン内の初期化などを行うだけにします。
間違っても大きなメモリを確保したり、２つのシーンで共有するマネージャやリソースにアクセスするのは少し危険です。
例えば、古いSceneのonExit()で既存のイベントハンドラを全部リリースするような多少乱暴な操作を行っている場合、init()で設定したイベントハンドラも意図せずリリースしてしまうことになります。
反対にinit()の中で解放し忘れのイベントハンドラを全部リリースするつもりで何らかの操作を行うと、古いSceneのonExit()あたりで二重解放を行ってしまうことになります。

新しいSceneのOnEnter()が呼ばれた時点で、古いSceneクラスは破棄されています。
ですので、マネージャなどへの登録処理などはOnEnter()で行いましょうということになります。

しかし、これがTransitionSceneを使用すると、少々話が違ってきます。
TransitionSceneは、２つのSceneをフェードで切り替えるなどといった、切り替え時のちょっとした演出を行ってくれる便利なSceneクラスです。
TransitionSceneを使用すると、２つのSceneは以下のような順番で呼び出されるようになります。

```
Director		Old Scene							New Scene
					constructor
					init()

					onEnter()
					onEnterTransitionDidFinish()

														constructor
														init()
ReplaceScene()

SetNextScene()
					onExitTransitionDidStart()
														onEnter()

					onExit()
														onEnterTransitionDidFinish()
					cleanup()
					release()
					destructor()
```
大きな違いは、古いシーンの生存期間です。
新しいシーンのonEnterTransitionDidFinish()が呼び出された段階でも、まだ古いシーンが生きています。

この呼び出され順の変化が大きな影響を与える場合があります。
（瞬間的にメモリ確保が増えるなど）

TransitionSceneを使いつつ、新しいSceneのonEnter()時に古いSceneが消えているようにするには、新しいSceneに繋ぐ為のSceneを作ってやり橋渡しをしてやるか、TransitionSceneのOnExit()をオーバーライドして、古いシーンのcleanupやらreleaseを新しいSceneのonEnterTransitionDidFinish()の前に行ってやるなどがあります。

「使った分は自分で片付ける」を徹底していれば、さほど大きな影響はありませんが、Sceneにぶら下がったNodeの開放をSceneのreleaseで任せていたり、強引な解放処理を行っているような場合は思わぬ事故につながりますので注意しましょう。
Snapkit, Better than Autolayout?

##The Problem
When using Autolayout in a team there is nothing worse than storyboard/nib conflicts. While not impossible to fix, regressions are inevitable. Recently my team in an effort to remove those conflicts(or at least make them a snap(ha, get it?) to fix we decided to give Snapkit a try.

##Snapkit
Snapkit is the swift version of the popular Autolayout wrapper Masonry. Our teams mission at the moment is to slowly write everything that once was Objective-C into swift and Snapkit fits perfectly. We were seeing some performance hits with dequeuing complex cells in nibs/storyboards.

##Adding Playgrounds
Setting up a Playground to use while building up your viewController doesn't take much. We just followed the simple tutorial [here](https://medium.com/@LogMaestro/adding-playgrounds-to-your-xcode-project-79d5ea0c7087).

##Conclusion
* Pros
    * Conflicts are easily manageable
    * Powerful/Better than the GUI used for Autolayout(with Playgrounds)
    * Easy to write
* Cons
    * managing file size is a bit of a pain

While minimizing clutter is a bit of a pain especially with complex layouts. It is alot more flexible and easy to make small tweaks without worrying about breaking everything.

I would recommend it to anyone who is tired of storyboard/nib conflicts or just don't want to use them altogether. 

When combined with Playgrounds it becomes an even more powerful tool that me and my team are going to continue with for the foreseeable future.
ncatのブローカーモードの代替としての StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

### ncatのブローカーモードの代替としての StreamRelay.jar

「local」側が tcp/90 で待機して、受信データは、接続クライアント全部へ転送するブローカーモードとなるのは、以下のコマンド

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 0 -Broker`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
ncatのブローカーモードの代替としての StreamRelay.NET.exe

ncat のブローカーモード(簡易チャットサーバ化)にも対応している

### ncatのブローカーモードの代替としての StreamRelay.NET.exe

「local」側が tcp/90 で待機して、受信データは、接続クライアント全部へ転送するブローカーモードとなるのは、以下のコマンド

`StreamRelay.NET.exe -LocalPort 90 -RemotePort 0 -Broker`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
t-SNE



## 3次元の配列を2次元にする

```
import numpy as np
from sklearn.manifold import TSNE

# 3次元の配列を2次元にする
X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])

model = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
result = model.fit_transform(X) 

print( result )
```

> ```
> [[ 0.00017599  0.00003993]
>  [ 0.00009891  0.00021913]
>  [ 0.00018554 -0.00009357]
>  [ 0.00009528 -0.00001407]]
> ```

## n次元の配列を3次元にする

```
import numpy as np
from sklearn.manifold import TSNE

# 5次元の配列を3次元にする
X = np.array([[0, 0, 0, 0, 0], [0, 1, 1, 0, 0], [1, 0, 1, 0, 0], [1, 1, 1, 0, 0]])

model = TSNE(n_components=3, random_state=0)
np.set_printoptions(suppress=True)
result = model.fit_transform(X) 

print( result )
```

> ```
> [[ 0.00017664  0.00004092  0.00010137]
>  [ 0.00022378  0.0001879  -0.00010256]
>  [ 0.00009511 -0.00001756 -0.00001262]
>  [ 0.00004055  0.00001404  0.00014699]]
> ```

sklearn.manifold.TSNE — scikit-learn 0.18.1 documentation
http://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html
xcodeが予期しない理由で終了しました

#「xcodeが予期しない理由で終了しました」と出て xcode が開けない
大量のログやステータスらしきものが吐かれるけど、なにがエラーメッセージでどうなっているのかさっぱりわからない。

ググっていろいろ試してみた結果、下記ファイルを削除すると開けるようになった。
何が原因でこうなったのか、知りたい・・・。

プロジェクト名.xcodeproj/project.xcworkspace/xcuserdata/ユーザー名.xcuserdatad/UserInterfaceState.xcuserstate
perlメモ

# Perl開発で使用している技術のメモ

基本的に業務で使用していることの備忘録として書いているので、技術に偏りがある可能性もあります。細かな説明は少しずつ追記していきます。
メモなので、業務の中で何度も更新します。編集履歴見てもいいことないです。

## tinyで設定ファイルを読み込み
```
use Config::Tiny;
my $conf = Config::Tiny->read( INI_FILE );

print $conf->{hoge}->{fuga} # 第1：セクション 第2：設定
```

## ループ
### リスト
~~これ一択かな。`for`で回してもいいけど。~~
指摘があったので修正。こんな書き方できるのか

```
for my $val (@list){
    print $val;
}
```

### ハッシュ
`each`使うより、`keys`で取得して回すほうが良い
`sort`使ってキーの昇順に回すのをよくやる
こっちも指摘があったので修正

```
for my $key (sort keys( %hash )){
    my $val = $hash{$key};
}
```

## ファイルIO
2引数は悪だと思っている。3引数を推奨。
指摘があったので修正。レキシカル変数を使用する

|第2引数|状態|書き方|
|:---|:---|:---|
|<|読み込み用|open (my $fh, '<','file.txt')|
|>|書き込み用 |open (my $fh, '>',  'file.txt');
|>>|追加書き込み用|open (my $fh, '>>', 'file.txt');
|+<|<に加えて読み書き両用|open (my $fh, '+<', 'file.txt');
|+>|>に加えて読み書き両用|open (my $fh, '+<', 'file.txt');
|+>>|>>に加えて読み書き両用|open (my $fh, '+<', 'file.txt');

### ファイル読込

```
    open($fh, '<', $file) or die("can't open file");    
    while(my $line = <$fh>){
        print $line;
    }
```

### ファイル書き込み
```
    open($fh, '>', $file) or die("can't open file");    
    print $fh $hoge;
```

### ファイルの削除
```
    unlink $file;
```

## postgreSQL
### 接続
```
    my $dsn = "dbi:Pg:dbname=${db_name};host=${host};port=${port}";
    my $dbh = DBI->connect(
        $dsn,
        $username,
        $password,
        {
            AutoCommit => 0,
            RaiseError => 1,
            PrintError => 0,
        }
    ) or die("cannot connect $dsn:$!");
    $dbh->quote('');
```

### SELECT
`$sql`にSELECT用SQLを組み立てて、ステートメント取得、パラメータとともに実行する

```
    my $sth = $dbh->prepare("SELECT hoge FROM fuga WHERE hanya = ?");
    my $res = $select_sth->execute($param);
```

### INSERT
`$sql`にINSERT用SQLを組み立てて、ステートメント取得、パラメータとともに実行する

```
    my $sth = $dbh->prepare("INSERT INTO hoge (fuga1,fuga2,…) VALUES (?,?,…)");
    my $res = $select_sth->execute($param1,$param2,…);
```
### UPDATE
`$sql`にUPDATE用SQLを組み立てて、ステートメント取得、パラメータとともに実行する

```
    my $sth = $dbh->prepare("UPDATE hoge SET fuga = ? WHERE hanya = ?");
    my $res = $select_sth->execute($param1,$param2);
```
stone/stunnel の代替としての StreamRelay.NET.exe (SSLサーバ編)

「local」側が tcp/4443 でSSLサーバとして待機して、「remote」側の192.0.2.1:80 へ転送する場合、証明書は「server.pfx」(パスワードは「abcdefgh」)とする
証明書は、事前にWindowsに信頼させておく必要がある

`StreamRelay.NET.exe -LocalPort 4443 -RemoteHost 192.0.2.1 -RemotePort 80 -LocalProxy ssl:///?CertFile=server.pfx^&CertPassword=abcdefgh`

---
### オプション

- CertFile : クライアント証明書認証の際のクライアント側の証明書ファイル(事前にWindowsに信頼させる必要がある)
- CertPassword: 証明書のパスワード
- NeedClientCert: クライアントへ証明書提示を求めるかどうか
- UseCertRevocationList: 信頼破棄リストを問い合わせするかどうか
- Protocol: SSLプロトコルを明示するかどうか

---
### 方向を逆転させる

![StreamRelay019.png](http://rocketeer.dip.jp/sanaki/free/StreamRelay019.png)

既定では、TCPのハンドシェイクの方向と、SSLのハンドシェイクの方向は同じだが、反対にすることができる

`StreamRelay.NET.exe -LocalPort 0 -RemoteHost 192.0.2.1 -RemotePort 4443 -RemoteProxy ssl:///?Server^&CertFile=server.pfx^&CertPassword=abcdefgh`
`StreamRelay.NET.exe -LocalPort 4443 -RemotePort 0 -LocalProxy ssl:///?Client`
の二つの接続は、SSL で保護されるが、TCPのハンドシェイクの方向とSSLのハンドシェイクの方向は逆になる。
逆なので、TCPクライアント側がSSLサーバとなっているので、そちら側はSSLサーバなので証明書が必要。

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
機械学習のための開発環境作成

# 今回入れるもの
tensorflowのインストール

* 学習の参考にさせてもらったサイト
http://qiita.com/bohemian916/items/4f0736dcea932a162d9e
http://qiita.com/hatapu/items/054dbab03607c47cb84f →基本的にはこちらのサイトを真似させてもらいました。

# 自分の思ったこと用メモ
自分が今日コマンドをうっていて思ったことを入れてるだけであり、それが正しいかどうかは定かではない。

pyenvとはパソコンに入ってるpythonの状態を変更するためのもの
pyenv versions→pyenvに入ってるもの全部がわかる
pyenv version →今設定されているpythonの状態を変更するもの
pyenv global ~~ で pyenvに入っている　~~に設定する
何かダウンロードしたら pyenv rehashしたほうがいいらしい

tensorflowが入ったかどうか試すためのコード

```
(tensorflow0.9.0) $ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>> 
```

# 追加6/4
matplotlibを入れたかったので

pyenv global py351tensorflow　とうち
このバージョン内で

pip install matplotlib　を行なった
　
→無事成功。

# 疑問6/14
pipでインストールしたものは、
pyenvのバージョン内において同一のバージョンでしか適用されないのか？
それとも全てのバージョンにおいて適応されるのか未だ不明
→多分全てのバージョンなきがするけれど,,,


# 追記 7/15 
matlibplotが正常に動いていなかったので
http://qiita.com/katryo/items/918667f28301fdec89ba
を使って正常に動くように修正した
【Swift3】配列同士の足し算、引き算

## 足し算
- 普通に足す

```swift
let array1 = ["a","b","c","d"]  
let array2 = ["b","c","e"] 

print(array1 + array2)
// ["a", "b", "c", "d", "b", "c","e"]
```

- 重複を省いて足す 

```swift
let array1 = ["a","b","c","d"]
let array2 = ["b","c","e"]

//重複を省いて、array1 + array2 をするメソッド

func addArrays(array1: [String],array2: [String]) -> [String] {
    var resultArray = array1
    let addArray = array2
    
    addArray.forEach { (li) in
        if array1.index(of: li) == nil {
            resultArray.append(li)
        }
    }
    
    return resultArray
}

print(addArrays(array1: array1, array2: array2))
//["a", "b", "c", "d", "e"]

```

**※2017年05月26日追記**

重複をさせたくないだけなら、こんな方法もありました

```swift
let array1 = ["a","b","c","d"]
let array2 = ["b","c","e"]
let values = array1 + array2

let orderedSet = NSOrderedSet(array: values)
let uniqueValues = orderedSet.array as! [String]

print(uniqueValues)
//["a", "b", "c", "d", "e"]
```

参考サイト:[【Swift】配列内で重複する要素を除去する](http://qiita.com/ariiyu/items/55d08bfae02e586d6ff8
)

## 引き算

```swift
let array1 = ["a","b","c","d"]  //引かれる配列
let array2 = ["b","c"]          //引く配列


//array1 - array2　をするメソッド

func subtractionArrays(array1: [String],array2: [String]) -> [String] {
    var resultArray = array1
    let subArray = array2
    subArray.forEach { (a) in
        if resultArray.index(of: a) != nil {
            resultArray.remove(at: resultArray.index(of: a)!)
        }
    }
    return resultArray
}

print(subtractionArrays(array1: array1, array2: array2))
// ["a","d"]
```


足し算は直感的にできますが、引き算は少し難しいですね(汗

**※2017年05月26日追記**

@hmhmsh さんと @elzup さんにコメントを頂きました


* setを使う方法

```swift
let array1 = ["a","b","c","d"]
let array2 = ["b","c","e"]

//重複を省いて、array1 + array2 をするメソッド

func addArrays(array1: [String],array2: [String]) -> [String] {
    return Array(Set(array1 + array2))
}

print(addArrays(array1: array1, array2: array2))
//["b", "e", "a", "d", "c"]


//sorted()をかけるとアルファベット順にしてくれる
print(addArrays(array1: array1, array2: array2).sorted())
//["a", "b", "c", "d", "e"]
```


* filterを使う方法

```swift
let array1 = ["a","b","c","d"]  //引かれる配列
let array2 = ["b","c"]          //引く配列

let res = array1.filter { v in return !array2.contains(v) }
print(res)
// "["a", "d"]\n"
```

以上になります。コメントしてくださった方、ありがとうございました！
centosのLAMP環境にphpMyAdminをインストールする


centosの仮想環境にMySQLを導入してセットアップしましたが基本的にはコマンドベースでの操作となります。MySQLには古くからphpMyAdminというPHPベースのMySQL管理ツールがあるのでそれをダウンロードしてLAMP環境にセットアップしてみます。

#ダウンロード
下記URLへアクセスしてphpMyAdminをダウンロードします。
https://www.phpmyadmin.net

![スクリーンショット 2017-05-16 2.12.27.png](https://qiita-image-store.s3.amazonaws.com/0/89268/7264a529-d0d0-6f98-6785-ba639cf33d54.png "スクリーンショット 2017-05-16 2.12.27.png")

セットアップしたときはV4.7.0でした。
モジュールをダウンロードしたら既に展開されていた(-_-;)

#インストール
インストールと言っても難しいことはなくApacheのドキュメントルートにダウンロードしたモジュールを配置するだけになります。
今回は、ホストOS側のMacでダウンロードしたのでこれをvegrantのcentos側へ運びます。

自分の環境では、ホスト側（mac)の
/Vagrant/Centos70ディレクトリと、ゲスト側（centos)の/vargrantディレクトリが共用されているので、ここに展開したphpMyAdminをFinderを使ってコピーします。

phpMyAdmin-4.7.0-all-languagesという長い名前だったので、phpMyAdminという名前に変更します。

ゲスト側でApacheのドキュメントルートへコピーします。

```
$ sudo mv phpMyAdmin /var/www/html/
$ cd /var/www/html
$ ls
phpMyAdmin
```
これでインストール完了です。

#設定作業
ゲストOS側でApacheとMySQLを起動してからホスト側のブラウザでアクセスしてみます。

http://localhost:8080/phpMyAdmin/

![スクリーンショット 2017-05-16 14.53.35.png](https://qiita-image-store.s3.amazonaws.com/0/89268/bb73a826-4b82-0c1f-18cd-c4dba5f0a282.png "スクリーンショット 2017-05-16 14.53.35.png")


エラーになりました。
mysql拡張がないとか言っています。これってPHPのmysql拡張が導入されていないってことみたいです。
確かめてみます。

```
$ php -m|grep mysql
```
何も表示されないのは入っていないことになります。

```
$ sudo yum install --enablerepo=remi,remi-php56 php-mysql
```

```
[vagrant@localhost html]$ php -m|grep mysql
mysql
mysqli
mysqlnd
pdo_mysql
```

apacheを再起動してから再度ホスト側のブラウザからアクセスします。

```
$sudo apachectl stop
$sudo apachectl start
```


http://localhost:8080/phpMyAdmin/
![スクリーンショット 2017-05-16 15.42.10.png](https://qiita-image-store.s3.amazonaws.com/0/89268/485a9312-036e-c3ab-bc3b-ecf2a926caa4.png "スクリーンショット 2017-05-16 15.42.10.png")


あらかじめ作成しておいたユーザーでログオンします。
無事にログオンできました。

![スクリーンショット 2017-05-16 15.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/89268/e13c10a0-b765-439a-886b-0c2f3cf3822a.png "スクリーンショット 2017-05-16 15.42.49.png")


この画面あんまり使いやすくはないですがMySQLを使う上での基本操作画面ということでセットアップ完了です。

#備考
今回利用した環境ではvagrantとVirtualboxでcentos7のセットアップ済みで、PHP, MySQL, ApahceのLAMP環境も構築済みでした。
また、ホスト側からゲスト側へはポートフォワーディングで、ホスト側8080ポートがゲスト側の80ポートへ転送されるように設定済みです。
この設定は下記のシリーズを確認してください。
***
## シリーズ一覧 (vagrant centos LAMP環境構築）
1.[macにvagrantでcentos7の仮想環境を構築したときの初期設定](http://qiita.com/saboten10/items/40a1331b69536534b7dc)
2.[mac上の仮想環境に構築したcentos7にPHPを導入する](http://qiita.com/saboten10/items/7026539e47093a62673c)
3.[mac上の仮想環境に構築したcentos7でPHPのビルトインサーバーを利用する](http://qiita.com/saboten10/items/e916bd2cd33c059f266b)
4.[mac上の仮想環境に構築したcentos7にapahceを導入する](http://qiita.com/saboten10/items/4bf506c81b5eed3aae78)
5.[mac上の仮想環境に構築したcentos7にmysqlを導入する](http://qiita.com/saboten10/items/298e884c953255708a61)
6.[centos7に導入したMySQL5.6の初期設定と動作確認](http://qiita.com/saboten10/items/4d2c79d507d1eae00d1b)
PostCSS + Webpack でグローバルなCSS変数

PostCSS + Webpack で、レスポンシブなサイトを作っている。

下記のようにグローバルな変数を定義して、

```ruby
$desktop: "only screen and (min-width: 769px)";
```

こういうふうに使いたい。

```ruby
@media $desktop {
  display: none;
}
```

PostCSSの`@import` とかでつまづいたので、結局、postcss.config.jsに直接書いて解決した。

```js:postcss.config.js
module.exports = {
  plugins: [
    require('precss'),
    require('autoprefixer'),
    require('postcss-simple-vars')({
      variables: require('./src/css/variables.css.js')
    }),
  ]
}
```

```js:src/css/variables.css.js
module.exports = {
  desktop: 'screen and (min-width: 769px)',
}
```


# 参考

- https://github.com/postcss/postcss-simple-vars
- http://qiita.com/naru0504/items/5427f3795171c540ed91
stone/stunnel の代替としての StreamRelay.jar (SSLクライアント編)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

TCPサーバとして待機しつつ、SSLクライアントとしてSSLサーバへ転送する場合

---
### stone/stunnel の代替としての StreamRelay.jar

「local」側が tcp/90 で待機して、「remote」側の192.0.2.1:443 へSSLクライアントとして転送

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRealy.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 443 -RemoteSSL`

---
### RemoteSSLオプションとRemoteSSLAfterProxyConnectionオプション

![図](http://rocketeer.dip.jp/sanaki/free/StreamRelay011.png)

つまりProxyオプションを先に実施するのか、SSLにしてから実施するのかの違い

Java は [Socket](https://docs.oracle.com/javase/jp/6/api/java/net/Socket.html)を継承した [SSLSocket](https://docs.oracle.com/javase/jp/6/api/javax/net/ssl/SSLSocket.html)なので、このようにした。
(.NET Framework は[Stream](https://msdn.microsoft.com/ja-jp/library/system.io.stream(v=vs.110).aspx)を継承した[SSLStream](https://msdn.microsoft.com/ja-jp/library/system.net.security.sslstream(v=vs.110).aspx)なので、より自由に組み合わせられる)

---
### オプション

- RemoteSSLMode [SSL|TLS]
- RemoteSSLName サーバ側の証明書をチェックする場合、コモン名を指定する
- DisableSNI Java7から既定で有効のTLS SNIを無効にする
- UseWeakAlgorithm Java7から既定で弱い暗号や証明書が無効になったものを有効化する
- UseAllSSLProtocols SSLプロトコルは任意
- UseSSLProtocol SSLプロトコルを明示する
- RistrictSSLProtocol 明示したプロトコルだけ拒否する
- UseAllSSLCipherSuites 暗号スイートは任意
- UseSSLCipherSuites 暗号スイートを明示する
- RistrictSSLCipherSuite 明示した暗号スイートだけ拒否する

いろいろ細かくオプションが指定できるJavaのSSLCocketクラスだけど、あまり使わないと思う

---
### 暗号スイートの一覧

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListSSLCipherSuite`

---
### 暗号プロトコルの一覧

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListSSLProtocol`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
[AWS][Lambda] Lambda で Typetalk に投稿するサンプル

弊社では社内コミュニケーションツールとして [Typetalk](https://typetalk.in/) や Slack を使っています。
Backlog との連携が簡単なんで Typetalk の方がよく見られてるのですが、今までは Backlog 連携以外ではあまり使ってなかったのでした。
そんなわけで AWS CloudWatch からの Notification とか、SES 経由で受信したメールを Typetalk に流したいなーと思って、こんなん書きました。

deploy とかめんどくさいので [Serverless framework](https://serverless.com/) 使いましょうかね。
こんな感じになると思います。

```js:handler.js
'use strict';

module.exports.hello = (event, context, callback) => {
    const https = require('https');
    const querystring = require('querystring');
    const typetalk_talken = process.env.TYPETALK_TOKEN;
    const typetalk_room = process.env.TYPETALK_ROOM;

    const options = {
        hostname: 'typetalk.in',
        path: '/api/v1/topics/'+typetalk_room+'?typetalkToken='+typetalk_talken,
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    };

    let req = https.request(options, (res) => {
        let response = {
            statusCode: res.statusCode,
            body: JSON.stringify({
                statusCode: res.statusCode
            })
        };
        console.log('STATUS: ' + res.statusCode);
        callback(null,response);
    });
    req.write(querystring.stringify({'message': 'Hello Typetalk!'}));
    req.on('error', (err) => {
        callback(err);
    });
    req.end();
};
```

```yaml:serverless.yml
service: post-typetalk

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: ap-norhteast-1
  environment:
    TYPETALK_TOKEN: '<string>__TYPETALK_TALKEN_HERE__'
    TYPETALK_ROOM:  '<number>__TYPETALK_ROOM_NO_HERE__'

functions:
  hello:
    handler: handler.hello
```
[Linux][sshfs] SSH でアクセスできるリモートシステムをローカルフォルダにマウント

SSHで接続している先の、特定ディレクトリをマウントしたい場合メモ

# sshfsのインストール

```bash:apt
$ sudo apt-get install sshfs
```

# 使用方法

```bash:マウント
$ sshfs USERNAME@HOSTNAME_OR_IP:/REMOTE_PATH LOCAL_MOUNT_POINT SSH_OPTIONS
```

```bash:アンマウント
$ fusermount -u LOCAL_MOUNT_POINT
```

# 使用例

```console:sshfsを利用したディレクトリのマウント
$ mkdir share_dir
$ sshfs user@192.168.12.345:/target_dir share_dir/
user@192.168.12.345's password:
$ mountpoint share_dir/
share_dir/ is a mountpoint
$ fusermount -u share_dir
$ mountpoint share_dir/
share_dir/ is not a mountpoint
```

# 参考
[Sshfs - ArchWiki](https://wiki.archlinuxjp.org/index.php/Sshfs)
[ssh越しにフォルダをマウントできる『sshfs』コマンド | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/01/ssh%E8%B6%8A%E3%81%97%E3%81%AB%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%8Esshfs%E3%80%8F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/)
stone/stunnel の代替としての StreamRelay.NET.exe (SSLクライアント編)

TCPサーバとして待機しつつ、SSLクライアントとしてSSLサーバへ転送する場合

---
### stone/stunnel の代替としての StreamRelay.NET.exe

「local」側が tcp/90 で待機して、「remote」側の192.0.2.1:443 へ転送
その際にプロキシオブジェクトのSSLを挟んであげればいい

`StreamRelay.NET.exe -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 443 -RemoteProxy ssl:///?`

---
### オプション

- Host: SSLサーバ側の証明書チェックをしたい場合の証明書のコモン名を記述する
- CertFile : クライアント証明書認証の際のクライアント側の証明書ファイル(事前にWindowsに信頼させる必要がある)
- CertPassword: 証明書のパスワード
- UseCertRevocationList: 信頼破棄リストを問い合わせするかどうか
- Protocol: SSLプロトコルを明示するかどうか

Javaに比べて、あまり細かく指定できない .NET Framework の SSLStreamクラス

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
slackのランダム・アバター画像生成をimagemagickで再現する

用意したパターン画像から、部分的に切り抜く方法で擬似的に再現します。
テクスチャ自体を生成する方法はまた今度✌️

# 環境
imagemagickをインストールします。

```command:command
brew install imagemagick
```

# diecut関数を作成
```zsh:.zshrc
diecut(){
  r=$((RANDOM % -5))
  x=$((RANDOM % 600))
  y=$((RANDOM % 50))
  command convert -rotate $r -crop 100x100+$x+$y -background none $1 $r$z$y$x.png
}
```

# diecutの使用方法

> __origin.png__
![origin2.png](https://qiita-image-store.s3.amazonaws.com/0/34660/0c0c6ff9-de16-4ade-4106-ecf791570fc4.png)



実行したいパスに切り抜き元のパターン画像(origin.png)を配置して__diecut__コマンドを実行します。

```zsh:.zshrc
cd ~/Desktop/
diecut origin.png
```

## 処理内容

- -5〜0度回転
- ~~100〜200%拡大~~
- 0〜50px*0〜600pxの起点
- 100*100pxサイズで切り抜き
- 👆プロパティに紐付いたファイル名で書き出し

![a.png](https://qiita-image-store.s3.amazonaws.com/0/34660/d13a8748-a6a7-5ae8-b129-380f6d436a58.png)

## 処理結果

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/34660/23b89a2d-2725-d76f-abbf-b84f2d25b323.png)


# 課題

切り抜き元のパターン画像のサイズによっては処理後に余白が生じてしまうので
ちょうど良い感じのサイズでパターンを用意しないといけない。
Microsoft Edgeでブラウザバックをした時ラジオボタンのチェックが外れる問題

#Microsoft Edgeでのラジオボタンの挙動について
この記事を書いている時のバージョン（40.1563）において、ブラウザバックした時に、ラジオボタンのチェックが外れる現象が起きています。

- Windows10、Edge環境において、以下の最小と思われる要素のみで実験した
 - ラジオボタン２つ（name属性値は同じもの）、submitボタン１つ、form要素でリクエスト先を設定しただけのもの
 - ラジオボタンの片方には「checked」を設定
 - 「checked」を初期に設定されているラジオボタンに「check」がついている場合→送信→ブラウザバック→問題なし
 - 「checked」を初期に設定していないラジオボタンに「check」がついている場合→送信→ブラウザバック→ラジオボタン2つともチェックが外れる

参考までに、ラジオボタンが外れている状態で送信をしてみましたが、ラジオボタンのデータは送信されていませんでした。（レンダリング上ラジオボタンが外れているように見えているのではなく、構造上チェックが付いていないということと考えます）

#不可解な挙動
HTMLとしてラジオボタンの属性checkedがついているものが選択されている時はブラウザバックしても問題なく、checkedが設定されていないものが選択されている場合にブラウザバックをした時に問題が起きています。

HTMLにcheckedがついているラジオボタンのチェックが、ブラウザバック時に外れたレンダリングがされていると言うことは、現在選択されていないことが、ブラウザとしては認識しているわけで、挙動としては不可解（理に合わない、バグである）と感じます。

#代替的な復帰方法
そもそもラジオボタンの選択済みの状態が保持されるのはブラウザ側の処理なので、保持されないことを設定することはできないと考えます。(アップデートによる修正を待ちましょう。)

代替的な復帰方法としては、Cookieやローカルストレージ等、情報を保持するものを利用して、ページ毎に常にラジオボタンの挙動を保存し、ページに戻ってきた時に、保存された値を元に復帰することが、代替的な方法と考えます。

#jQueryとhiddenフィールドを使った簡易的な復帰方法
Cookie等の処理をしたくない人に、簡易的な復帰方法を検討しました。

(1)ラジオボタングループ毎に、隠しフィールドを作成
(2)隠しフィールドには、data-name属性を設定する
(3)data-name属性値には、ラジオボタングループのname属性値と同じ属性値を設定
(4)JavaScriptで、ラジオボタンのチェックが変わる度に、隠しフィールドに選択したラジオボタンのvalue値を入力
(5)ブラウザバック時（ページ表示初期時）に、隠しフィールドに値がある場合はその値と同じ値を持つラジオボタンの要素に対して、checkedを設定する


```html
<form action="https://www.google.co.jp/">
  <input type="radio" name="fooData" value="0">
  <input type="radio" name="fooData" value="1" checked>
  <input type="hidden" data-name="fooData">
  <input type="submit">
</form>
```
↑隠しフィールドをラジオボタングループ毎に作成し、data-name属性値を設定。属性値を、ラジオボタングループのname属性値と一緒にした例

```js:JavaScript　code
$(function () {
    var $radioButton = $('input[type=radio]');
    var $dataSaveField = $('[data-name]');

    //各ラジオボタンの設定（value値記録）
    $radioButton.on('change', function (e) {
        var $self = $(this);
        var valueData = $self.val();
        var nameData = $self.attr('name');
        var $myDataSaveField = $('[data-name=' + nameData + ']');
        $myDataSaveField.val(valueData);
    });

    //隠しフィールドの値から復帰処理
    $dataSaveField.each(function () {
        var $self = $(this);
        var valueData = $self.val();
        if(valueData === '') return false;
        var nameData = $self.attr('data-name');
        var $groupRadioButton = $('input[name=' + nameData + ']');
        $groupRadioButton.each(function () {
            var $self = $(this);
            if ($self.val() === valueData) {
                $self.prop('checked', true);
            }
        });
    });

});

```
↑JavaScriptでは、各ラジオボタンにチェックした時に値を隠しフィールドに入れる処理と、復帰時に隠しフィールドの値を元にラジオボタンにチェックを入れ直す考え方です。
ポートフォワーダとしてのStreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

---
### ポートフォワーダとしてのStreamRelay.jar

「local」側が tcp/90 で待機して、「remote」側の192.0.2.1:80 へ転送

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
ポートフォワーダとしての StreamRelay.NET.exe

---
### ポートフォワーダとしてのStreamRelay.NET.exe

「local」側が tcp/90 で待機して、「remote」側の192.0.2.1:80 へ転送

`StreamRelay.NET.exe -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 80`

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
再说 rabbitmq 续3


# 路由

之前我们创建的 fanout 类型的 exchange 它会把所有的 message 都收集并发送, 而我们这里希望能够添加一个 feature 就是我们只 care 错误级别较高的 log. 我们怎么办呢.

### 先来回顾绑定

在之前的例子里是这样使用绑定的:

```
q.bind(exchange_name)
```

所谓绑定就是连接了 exchange 和 queue, 这样理解也就是说这个 queue 它只对这个 exchange 来的消息感兴趣. 绑定同时它可以传递另外一个参数就是`: routing_key` 为了不和` Bunny::Exchange#publish` 混淆,这里称之为绑定键. 我们这样使用它:

```
q.bind(exchange_name, :routing_Key => "black");
```

而绑定键的意义是取决于不同的 exchange 类型的.

#### Direct exchange

在之前例子我们希望能够将所有的消息发送给所有的 consumer. 而现在我们却想着过滤一些想要的而避免像第一个 consumer 写入所有的 log 到磁盘而避免浪费. 而之前使用的` fanout` 类型 exchange 它是完全不能够定义而是盲从的广播.

我们取而代之使用了` direct` 类型的 exchange 来取代. 而direct 背后的路由算法是很简单的.

 - 就是直接用来匹配到 queue 的绑定键和  message 的路由键的.


![Kobito.Uvy9ab.png](https://qiita-image-store.s3.amazonaws.com/0/56713/76a0e63f-a3fb-3e2b-dc45-e81ea0819428.png "Kobito.Uvy9ab.png")


这个例子说明上面的描述, 一个 direct 类型的 exchange 绑定了2个 queue, 第一个 queue 的绑定key 是` orange`, 而第二个绑定了2个 queue, 分别是` black` 和` greeen`. 这个情况下如果 message 的路由 key 是 orange 就会发送到 Q1,而 black 和 green 就会到 Q2, 其他的都会被丢弃.


#### 多绑定

对于 rabbitmq 来说多重绑定也是完全允许的. 完全可以在 x 和 q1于 q2之间建立绑定. 这个情况下, direct 类型的 exchange 就会表现的想 fanout 广播所有的消息到匹配的 queue 上. 带有 black 路由键的 message 就会被推送到 Q1 和 Q2.


#### 分发 log

我们这里就会使用上面提到的模型来分发 log. 我们创建一个 direct 类型的 exchange. 然后通过 log 的错误级别来作为路由键.

```
ch.direct("logs");
# And we're ready to send a message:

x = ch.direct("logs")
x.publish(msg, :routing_key => severity)

```


####订阅


```
q = ch.queue("")
ARGV.each do |severity|
  q.bind("logs", :routing_key => severity)
end

```


![Kobito.c1BrvA.png](https://qiita-image-store.s3.amazonaws.com/0/56713/68e968dd-948c-064b-96a3-3a6c0c3b2c61.png "Kobito.c1BrvA.png")

### 总结


```
#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"

conn = Bunny.new
conn.start

ch       = conn.create_channel
x        = ch.direct("direct_logs")
severity = ARGV.shift || "info"
msg      = ARGV.empty? ? "Hello World!" : ARGV.join(" ")

x.publish(msg, :routing_key => severity)
puts " [x] Sent '#{msg}'"

conn.close


############ The code for receive_logs_direct.rb:

#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"

if ARGV.empty?
  abort "Usage: #{$0} [info] [warning] [error]"
end

conn = Bunny.new
conn.start

ch  = conn.create_channel
x   = ch.direct("direct_logs")
q   = ch.queue("", :exclusive => true)

ARGV.each do |severity|
  q.bind(x, :routing_key => severity)
end

puts " [*] Waiting for logs. To exit press CTRL+C"

begin
  q.subscribe(:block => true) do |delivery_info, properties, body|
    puts " [x] #{delivery_info.routing_key}:#{body}"
  end
rescue Interrupt => _
  ch.close
  conn.close
end
```
StoryboardでUILabelの文字に黒影つけたいよね

こうしてこう

<img width="608" alt="スクリーンショット 2017-05-24 14.37.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/86930/95296e7d-c890-cc13-e502-414cd029959c.png">


各プロパティの詳細はこちらが華麗に紹介してくださっている、画像付きで分かりやすい
[画像に影を付けたいのでいろいろプロパティをいじってみた](http://ringsbell.blog117.fc2.com/blog-entry-494.html)
UILabelというかCALayer(layer)につけるときの見え方は一緒。


...上の記事を言葉でまとめると

##shadowOpacity
**影の濃さを調節**
0.0から1.0の間で黒影の濃さを決めている
とりあえず1にして後で下げながら調節

##shadowOffset 
**影の位置を調節**
0,0をセンター（layerと真正面からかぶる）とし、x座標とy座標になってる。
影なら大体 -4 から +4　の間で調節。
影をlayerの右下にややずれさせるならば
`（2,2）　`くらい
右下がプラスで左上がマイナス
shadowOpacityを広めに取ってるなら`(0,0)`でもいい感じに全体に影が広がるからそっから調節

##shadowRadius
**影のぼかし具合を調節**
0だとNOぼかし。昭和の影。
3くらいで様子見。
影として使うんなら、上限いっても5くらいまでだと思う。



#こんなところでハマらないでくれ

###UILabelの文字に影つけようとしてこっちにいった哀れな子羊はいませんか。

<img width="338" alt="スクリーンショット 2017-05-24 14.40.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/86930/dca78af9-8fbf-4a6f-2a6f-ed16620382e3.png">

こっちは罠だ。
ぼかしのつかない昭和な影しか作れない。
見た目キモいしやめなよと思う。


###影色黒はいやだ
<img width="340" alt="スクリーンショット 2017-05-24 14.11.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/86930/608a86c2-108b-f460-460f-195c5d61038a.png">

だまされるな。
ColorなんてかいてあるがそいつはUIColorだ。
CGColorで指定しなきゃいけないんだ。
コードでいけ。
[参考リンク](https://stackoverflow.com/questions/14792238/uiviews-border-color-in-interface-builder-doesnt-work)


###Cellとかにやらせると挙動ガクガクする
文字のレイヤー取得して影作って、という挙動はCellの描画が重くなる原因になってたのでどうにかすることにした
ボタンに影つけるとかはなんてことないんだけど、都度描画されるLabelの文字にLabelにあった影を作るとガクガクするようになってしまった。
悲しみ
結局影っぽい画像を作った。


###ああねむい
簡易的にdelegateをBlockで実行する方法

delegateの場合は、callbackがソース上で離れてしまい、コードが追いにくくなるという欠点があります。
使用するSDK等にdelegateしかない場合等にblockで実行する方法を考えてみたいと思います。

※今回はわかりやすくするため、selectorを使って解説します。

# saveInBackgroundWithTarget

mBaaSのsaveInBackgroundWithTargetはselectorでcallbackのメソッドを呼び出します。
こちらの処理をblockで実行するように変更してみましょう。

```objc:処理を実行するメソッド内の処理
//testクラスのNCMBObjectを作成
NCMBObject *object = [NCMBObject objectWithClassName:@"test"];

//オブジェクトに値を設定
[object setObject:@"value" forKey:@"key"];

//データストアへの登録を実施
[object saveInBackgroundWithTarget:self selector:@selector(saveEvent:)];
```

```objc
- (void)saveEvent:(NSError *)error{
    if (error){
        //保存に失敗した場合の処理
    } else {
        //保存に成功した場合の処理
    }
}
```

# saveInBackgroundWithTargetをblockで実行する

```objc:プロパティ
@property(nonatomic) void (^resultBlock) (NSError *error);
```

```objc:処理を実行するメソッド内の処理
//testクラスのNCMBObjectを作成
NCMBObject *object = [NCMBObject objectWithClassName:@"test"];

//オブジェクトに値を設定
[object setObject:@"value" forKey:@"key"];

//データストアへの登録を実施
[self saveInBackground:object withBlock:^(NSError *error) {
    if (error){
        //保存に失敗した場合の処理
    } else {
        //保存に成功した場合の処理
    }
}];
```

```objc
-(void)saveInBackground:(NCMBObject*)object withBlock:(void (^)(NSError *error))block {
    self.resultBlock = block;
    [object saveInBackgroundWithTarget:self selector:@selector(callBlock:)];
}
```

```objc
-(void)callBlock:(NSError *)error{
    self.resultBlock(error);
}
```

# Swiftの場合

Swiftの場合は、クロージャを設定します。

```swift:プロパティ
var resultBlock: ((Error?) -> Void)?
```

```swift:処理を実行するメソッド内の処理
//testクラスのNCMBObjectを作成
let object = NCMBObject.init(className: "test")

//オブジェクトに値を設定
object?.setObject("value", forKey: "key")

//データストアへの登録を実施
self.saveInBackground(object: object) { (error) in
    if error != nil {
        //保存に失敗した場合の処理
    } else {
        //保存に成功した場合の処理
    }
}
```

```swift
func saveInBackground(object:NCMBObject?, block:((Error?) -> Void)?) -> Void {
    self.resultBlock = block
    object?.saveInBackground(withTarget: self, selector: #selector(callBlock(error:)))
}
```

```swift
func callBlock(error:Error?) -> Void {
    self.resultBlock?(error)
}
```
再说 rabbitmq 续2


之前我们提到的 rabbitmq 的例子基本上都是对于 message 和 worker 来说一对一的, 也就说在 message 它的生命周期里面有一个 publisher 发出到了某个 queue 里待一会儿然后就去了一个 worker 里, 然后就没有然后了( rabbitmq 就从它哪里移除了). 而其实 rabbitmq 同时考虑到这样一个情况, 一个 message 很有价值的 message 不应该是一生只配一个 worker, 它应该有多个 worker来消费处理. 这里讲到的就是` publish/subscribe` 的模式.

为了演示这个模式,我们创建一个 log 系统. 它又2部分组成,一个是分发 log. 而另外一个是接收并打印 log. 在这个 log 系统里第一个接收 log 的系统都会拿到 message. 这样就可以拿到 log 被存储到硬盘. 同时我们要用另外一个 worker 来接收并在屏幕显示它.

而首先需要在 publish 消息的时候它要广播奥所有的接收者哪里.

### exchange

这里先说说 rabbitmq 里的消息模型了. 开说之前我们先回顾下我们已经接触到的:

- producer 用来发消息的
- queue 用来存放消息的
- consumer 用来接收处理消息的

在 rabbitmq 的设计思想里面,对于 producer 来说, **它是永远不会直接发送消息到 queue 里面的. 甚至对于它来说它都不知道消息是要被发往 queue 的**.

而取而代之的是对于它来说, 消息是只能发送到的` exchange` 这个东西的. 而 exchange其实是一个很简单的东西,它一方面会接受来自 producer 的消息,另一方面会将消息发往 queue. 对于 exchange 来说它要非常清楚如何处理拿到的消息. 它应该去特定的 queue 还是一些 queue 呢. 这个 rule 就是来源于 **exchange 的 type**

![Kobito.GnCuN2.png](https://qiita-image-store.s3.amazonaws.com/0/56713/2b89afe4-4a09-7f83-81d6-40ea2d791e13.png "Kobito.GnCuN2.png")

而 exchange 的 type 就是下面这些:

- direct
- topic
- headers
- fanout

我们先来说` fanout`, 老样子, 建立连接, 创建 channel, 然后创建 exchange.

```ch.fanout("logs")```

这个 **fanout(扇出)** 的 exchange 是非常简单的.它就是将拿到的所有 message 然后分发到所有可知的 queue 里面.

```
x = ch.fanout("logs")
x.publish(msg)

```
### 临时queue

之前我们用到了如` hello` 或者` task_queue` 诸如此类的名字来做 queue 的 name, 要知道可以给 queueu 命名也是对于我们来说很重要的. 因为我们需要在给特定名字的 queueu 里塞东西的同时还是需要连接到特定的 queue 上拿 message. 但是对于我们当下这个例子里, 我们似乎不必担心如何取名字, 而只是需要拿到所有的 log message. 接下来我们想要做的事情是这样的:

每次我们都想要连接一个干净的 queue. 这个情况下我们就可以创建一个随机的 queue name, 甚至我们都可以让 server 直接给我们一个随便的名字. 另外,一旦我们断了这个连接它应该自动删除的.

对于` bunny` 这个客户端来说,如果我们给一个 queue name 是一个空字符串,我们就可以创建一个不持久的随机的 queuename 的 queue.

```
q = ch.queue("", :exclusive => true)
```

这个执行之后就会返回一个随机的 queue name, 而且连接断了之后 它会被自动删除,因为我们给了它一个` exclusive` 为 true 值的参数设定.

### 绑定

我们已经创建了 fanout 类型的 exchange 和 queue. 现在我们可以让 exchange 发 message 到 queue 了. 而对于 exchange 和 queue 之间的关系我们称之为 **`绑定`**

```
q.bind('logs')
```

### 总结


```
#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"

conn = Bunny.new
conn.start

ch   = conn.create_channel
x    = ch.fanout("logs")

msg  = ARGV.empty? ? "Hello World!" : ARGV.join(" ")

x.publish(msg)
puts " [x] Sent #{msg}"

conn.close

################The code for receive_logs.rb:

#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"

conn = Bunny.new
conn.start

ch  = conn.create_channel
x   = ch.fanout("logs")
q   = ch.queue("", :exclusive => true)

q.bind(x)

puts " [*] Waiting for logs. To exit press CTRL+C"

begin
  q.subscribe(:block => true) do |delivery_info, properties, body|
    puts " [x] #{body}"
  end
rescue Interrupt => _
  ch.close
  conn.close
end
```
Xamarin.FormsでListViewのイベントをViewModelにバインドする


ListView には Command プロパティが無いみたいで、タップ時のイベントをどうやって ViewModel で処理するのか分かりませんでした。

しかし、なんとかやり方が判明したのでメモを残しておきます。

## コード

Behavior というものを定義して、それをXAML経由で ListView に割り当てるようです。
Command をバインド可能プロパティにしておかないと、実行時に"そんなプロパティ無い"と言われます。

あと、Behavior の BindingContext にイベント発生元（ListView）の BindindContext を指定しておきます。
こうしておかないと XAMLでバインドした Command が Behavior まで渡ってきません。

```c#:Behavior
using System.Windows.Input;
using Xamarin.Forms;

namespace MyApp.Behaviors
{
    public class ItemTappedBehavior : Behavior<ListView>
    {
        public static BindableProperty CommandProperty = BindableProperty.Create(
            "Command", typeof(ICommand), typeof(ItemTappedBehavior), null
        );

        public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }

        protected override void OnAttachedTo(ListView bindable)
        {
            base.OnAttachedTo(bindable);

		 	 //	↓↓↓ これ重要	
            bindable.BindingContextChanged += (sender, e) => {
                this.BindingContext = ((ListView)sender).BindingContext;
            };
		 	 //	↑↑↑ これ重要	
                
            bindable.ItemTapped += (sender, e) => {
                this.Command.Execute(e.Item);
            };
        }
    }
}
```

```xml:XAML
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:vm="clr-namespace:MyApp.ViewModels"
    xmlns:b="clr-namespace:MyApp.Behaviors"
    Padding="30"
    x:Class="MyApp.Views.MainPage">

    <ContentPage.BindingContext>
        <vm:MainPageViewModel />
    </ContentPage.BindingContext>

    <ListView ItemsSource="{Binding Items}">
        <ListView.Behaviors>
            <b:ItemTappedBehavior Command="{Binding ItemTappedCommand}"/>
        </ListView.Behaviors>
    </ListView>

</ContentPage>
```

```c#:ViewModel
using System.Collections.Generic;
using System.Windows.Input;

using Xamarin.Forms;

namespace MyApp.ViewModels
{
    public class MainPageViewModel
	{
        public List<string> Items { protected set; get; } = new List<string>();

        public ICommand ItemTappedCommand { get; set; }

        public MainPageViewModel()
        {
            Items.Add("First Item");
            Items.Add("Second Item");

            this.ItemTappedCommand = new Command<string>((item) => {
                System.Diagnostics.Debug.WriteLine(item);
            });
		}
    }
}
```

## 結果

タップしたセルの内容がログに出力されました。
OKなようですね。

![output.png](https://qiita-image-store.s3.amazonaws.com/0/169798/2047727f-6400-7e3c-3aac-f811fb856e1d.png "output.png")


とりあえずは以上です。


## こちらを参考にしました
http://blog.okazuki.jp/entry/2016/12/14/170430
https://forums.xamarin.com/discussion/44900/bind-to-bindable-property-in-behaviour
npm の dotenv のファイルにはコメントをかけない

## 概要

以下のような設定をすると、`NODE_ENV` が `hoge # NODE_ENV = invalid` になります。

```ini:.env
# invalid configuration line
NODE_ENV = hgoe NODE_ENV = invalid

# ここは、ちゃんとコメントになる
; これもコメント
; こういうのも = コメント
// これもコメントになる
; FOO = FOOFOO 
#  ↑ これもコメントアウトできてる

BAR = BARBAR # this is comment
# ↑ これは、ちゃんと BAR = BARBAR として解釈される
```

## 原因
[該当箇所のソースコード](https://github.com/motdotla/dotenv/blob/2d84b5aa0fa5b03204387560206fb5115b6e731b/lib/main.js#L16)見ればわかるので、みてください。

### 注意：そもそも、インラインのコメントは、"考慮されて い な い"

インラインのコメント（設定と同じ行にあるコメント）には[対応しない](https://github.com/motdotla/dotenv/pull/166)らしいので、 **設定と同じ行にコメントを書いては い け ま せ ん**
コンポジションの中のレイヤーサイズを基にコンポジションサイズをフィット

#まえがき
今回はすごく簡単なプログラムですが、これこそプログラムの基本って感じました(笑)
こうゆう手作業でやると大変な作業もクリック一回。

#やりたい事
コンポジションサイズをレイヤーサイズにフィットさせたい。
※レイヤーサイズをコンポジションサイズに合わせるのでなく、コンポジションサイズをレイヤーサイズに合わせる

以上でございます(笑)

説明するまでも無いのでメモ用です。

```js
var myComp=app.project.activeItem;
var myLayer=app.project.activeItem.selectedLayers[0];
var lw=myLayer.width;
var lh=myLayer.height;

myComp.width=lw;
myComp.height=lh;
myLayer.property("ADBE Transform Group").property("ADBE Position").setValue([lw/2,lh/2])
```


2017/10/10　追加

シェイプレイヤー長方形パスにフィットさせる場合

```js
var myComp=app.project.activeItem;
var myLayer=app.project.activeItem.selectedLayers[0];
var rect=myLayer.property("ADBE Root Vectors Group").property("ADBE Vector Shape - Rect").property("ADBE Vector Rect Size").value;

lw=rect[0];
lh=rect[1];

myComp.width=lw;
myComp.height=lh;
myLayer.property("ADBE Transform Group").property("ADBE Position").setValue([lw/2,lh/2])
```

#2018/12/09 更新記事
前回のスクリプトではスケールに関しては入ってなく、先ほど使ってみたらドエライ事になったので
スケール分も考慮した更新版を張っておきます。

```jsx
var myComp=app.project.activeItem;
var myLayer=app.project.activeItem.selectedLayers[0];
var myLW = myLayer.width;
var myLH = myLayer.height;
var myLS = myLayer.transform.scale.value;

var a = myLS[1]/100;
var resultW = myLW*a;
var ResultH = myLH*a;

$.writeln(resultW)
$.writeln(ResultH)


myComp.width=resultW;
myComp.height=ResultH;

```

とりあえず、参照したレイヤーのポジションなどはそのままになっているので、
あとからコンポジション内のレイヤーの整列は必要になります。
LaTeXで生成したPDFが macOSのプレビューやクイックプレビューで開けなくなった時の対処法

## 症状
<img width="500" alt="SS 2017-05-24 at 12.43.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/86078/f6a1a1e6-6c9d-9f76-6112-e643ca019823.png">

- LaTeXで生成したPDFをクイックプレビューしたり，プレビュー.appで開こうとするとフリーズする。
- Texpadでコンパイルした時，右のプレビューパネルが有効になっていると，コンパイルが終わった瞬間（おそらく，問題のPDFを開こうとして）フリーズする
- Acrobat Pro DC，Google Chrome，Safariでは開ける

## 環境
- macOS 10.12.5 Sierra
    - MacBook Pro Retina, 13-inch, Early 2015
    - macOS 10.12.4 でも症状を確認
    - 同OSの別端末でも症状を確認
    - macOS 10.12.3 では症状出ず
- pdfLaTeX
    - Version 3.14159265-2.6-1.40.17 (TeX Live 2016)
- Preview.app
    - Version 9.0


## 問題のLaTeXファイルの情報
- 学会が提供するフォーマット（本文英語）
    - ACM SIGGRAPH http://www.siggraph.org/learn/instructions-authors
    - ACM SIGCHI  http://www.sigchi.org/publications/chipubform
- 図・表などを含む一般的な論文
- 使用している図
    - PDF
    - Illustrator CC 2017.1で作成
    - PDFの書き出しプリセット「高品質印刷 (High Quality Print)」で，「イラストレーターの編集機能を保持」のチェックを外したもの


## 解決策
- Illustratorで書き出し設定をする時に，出力>カラー>プロファイルの埋め込みで，**プロファイルを含めない (Don't Include Profiles)**に設定する。
<img width="786" alt="SS 2017-05-24 at 12.52.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/86078/e5539d45-30c6-7ef9-4664-4dbea2ae61b1.png">


## まとめ
- もしかしたら他の部分に問題があるかもしれませんが，暫定的にはこれで問題ありませんでした。
    - *検索しても全然同様の症状が出てこなかったので，自分の環境に何かに問題が…？*
- 色の変化も今のところ見られないので，多くの場合は問題無さそう。