OmniAICreator/Qiita-1.07M huggingface dataset:
Async/Await + 同期関数の非同期関数化

## はじめに

`Async/Await`により同期処理と非同期処理の垣根が低くなり、可読性の高いコードを実現できるようになりました。
しかしサードパーティのライブラリを眺めても、同期関数と非同期関数が全く同じような書き方で書ける方法はなかなか存在しません。そこで同期関数を非同期関数化することにより、`Async/Await`を用いてほぼ同じ書き方で可読性の高いコードを実現する方法を紹介します。

## 同期関数の非同期関数化

今回は同期処理でおなじみの[`Lodash`](https://lodash.com/)を[`Aigle`](https://github.com/suguru03/aigle)を用いて非同期化します。
今回のゴールは、`Lodash`の関数を非同期化することにより、`Lodash`と同じ使い方で非同期処理をすることです。

今回使用するライブラリをインストールします。

```bash
$ npm install -S lodash aigle
```

次に`Lodash`の関数を非同期化します。

```js
const _ = require('lodash');
const Aigle = require('aigle');
Aigle.mixin(_);
```

以上で非同期化されました。

## 例

非同期関数のサンプルとして`delay`という関数を定義します。この関数は`ms`後に`result`を返す非同期関数です。

```js
function delay(ms, result) {
  return new Promise(resolve => setTimeout(resolve, ms, result));
}
```


### `Lodash.map`

`Lodash.map`を非同期関数化した例です。`Aigle.map`は10ms後にそれぞれの`result`を返し、全てのarrayの`result`が揃い次第結果を返します。

```js
const array = [1, 2, 3];

const syncResult = _.map(array, n => n * 2); // [2, 4, 6];

const asyncResult = await Aigle.map(array, n => delay(10, n * 2)); // [2, 4, 6]
```

### `Lodash.find`

`Lodash.find`を非同期関数化した例です。`Aigle.find`は`truthy`を受け取り次第結果を返します。

```js
const array = [1, 2, 3];

const syncResult = _.find(array, n => n === 2); // 2

const asyncResult = await Aigle.find(array, n => delay(10, n === 2)); // 2
```

### `Lodash.chain`

`Aigle`では`Lodash.chain`のようにメソッドチェインを使用することが可能です。メソッドチェインでは`Lodash.chain`と同様に直前の関数の結果を次の関数に渡します。

```js
const array = [1.1, 1.4, 2.2];

const syncResult = _.chain(array)
  .map(n => n * 2) // [2.2, 2.8, 4.4]
  .uniqBy(Math.floor) // [2.2, 4.4]
  .sum() // [6.6]
  .times() // [0, 1, 2, 3, 4, 5]
  .value();

const asyncResult = await Aigle.resolve(array)
  .map(n => delay(10, n * 2)) // [2.2, 2.8, 4.4]
  .uniqBy(Math.floor) // [2.2, 4.4]
  .sum() // [6.6]
  .times(); // [0, 1, 2, 3, 4, 5]
```

また`Aigle`の各関数は同期処理・非同期処理双方の処理が可能です。[サンプルコード](https://gist.github.com/suguru03/9c219197887764467e3cf93f420b7071) はこちらにも載せておきました。

## まとめ

`Aigle.mixin`は`Lodash`以外の関数・ライブラリにも使用することができます。また`Aigle`は可読性の高いコードを提供するだけでなく、[高パフォーマンス](https://github.com/suguru03/aigle/tree/master/benchmark#benchmark)のコードを実現しています。興味ある方は下記の記事も読んでいただけたら嬉しいです。すでに本番環境でも使用しています、是非使ってみてください。

## リンク
- [最速のPromiseライブラリを作る方法](http://qiita.com/suguru03/items/17be3826eae65602ff88)
- [`Aigle` vs `Bluebird`](http://qiita.com/suguru03/items/aeedd3931557ffa56e72) 
- [`Lodash`](https://lodash.com/)
- [`Aigle`](https://github.com/suguru03/aigle)
ネットワーク設定メモ

# はじめに
[特殊なデバイス](http://espressobin.net)
でブート時にネットワーク有効化するのにはまったのでメモ。

最終的には以下のような環境を構築したかった

```
ria@localhost:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr f0:ad:4e:XX:XX:XX  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72 errors:0 dropped:0 overruns:0 frame:0
          TX packets:55 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:532 
          RX bytes:7562 (7.5 KB)  TX bytes:7731 (7.7 KB)
          Interrupt:9 

lan0      Link encap:Ethernet  HWaddr f0:ad:4e:XX:XX:XX  
          inet addr:192.168.1.212  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72 errors:0 dropped:0 overruns:0 frame:0
          TX packets:55 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:5978 (5.9 KB)  TX bytes:7291 (7.2 KB)
```

# 構成
eth0に、lan0, lan1, wanの3つがぶら下がっており、eth0を立ち上げてからでないとlan0以下のポートがup出来ない環境となっていた。

# 失敗例
・ lan0だけ立ち上げてみる

```/etc/network/interface
#iface lan0 inet dhcp
iface lan0 inet static
address 192.168.1.212
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 8.8.8.8
auto lan0

```
eth0が立ち上がってないのでネットワーク起動エラー。

・eth0も立ち上げてみる

```/etc/network/interface
iface eth0 inet manual
auto eth0

#iface lan0 inet dhcp
iface lan0 inet static
address 192.168.1.212
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 8.8.8.8
auto lan0

```
eth0とlan0が同時に立ち上がるらしくこれまたネットワーク起動エラー。

# 暫定解決策
起動順番を指定するオプション替わりとして、以下のように対処。

```/etc/network/interface
iface eth0 inet manual
post-up ifconfig lan0 up
auto eth0

#iface lan0 inet dhcp
iface lan0 inet static
address 192.168.1.212
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 8.8.8.8
auto lan0

```

ようやくブート時にネットワーク有効化できるようになった。
AndroidでViewを他のアプリの上に表示する (APIバージョン別 対応方法まとめ)

久しぶりにAndroidのコードを書いていたら、ビューを他のアプリに重ねて表示しようとして盛大に躓いたのでメモ。
要点だけ抜き出しているので、細かなコードは参考サイトとして挙げているリンク先を参照のこと。

# Android 4.0 ～ 5.0 (APIレベル 14～22)
* AndroidManifestにパーミッションを記述する

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
```

* WindowManager#addViewする

LayoutParams生成時のレイヤータイプ(コンストラクタの```int _type```変数)に、```WindowManager.LayoutParams.TYPE_SYSTEM_ALERT``` を渡す。

参考サイト : [画面上にアプリの情報を常時表示する](http://techbooster.org/android/ui/13182/)

# Android 6.0 ～ 7.1.1 (APIレベル 23～25)
Android 5.0までの対応に加えて以下の対応が必要。

* RuntimePermissionに対応させる

APIが更新され、一部のパーミッションは個別にユーザが許可を出すことを求められるようになった。

まずは、```Settings#canDrawOverlays``` を呼び出して、アプリの権限をチェックする。

権限がない場合は、オーバーレイ権限を変更する為の画面を呼び出す。
Intentには ```Settings.ACTION_MANAGE_OVERLAY_PERMISSION``` と、自アプリのパッケージ名を指定する。
(ユーザに対して表示して、利用開始時に権限設定を許可してもらう)

権限設定画面から自アプリに制御が戻ったら再度権限を確認し、権限が有効になっていたらAndroid 5.0までと同じ方法でビューを追加する。

参考サイト : [MarshmallowでSYSTEM_ALERT_WINDOWの権限の扱いが変わった](http://qiita.com/chibatching/items/add5e50921c2da5ee1c7)

# Android 8.0 ～  (APIレベル 26～)
Android 7.1.1までの対応に加えて以下の対応が必要。

* WindowManagerでTYPE_APPLICATION_OVERLAYレイヤーを使う

APIが更新され、TYPE_SYSTEM_ALERTレイヤーは利用できなくなった。
よって、今まで通りのレイヤータイプ ```WindowManager.LayoutParams.TYPE_SYSTEM_ALERT``` を使用するとエラーとなる。
(下記の例外が発生する。この例外で検索しても情報が見つからなくて困った)
```java.lang.RuntimeException: Unable to start service com.example.app.TestService@57b8b88 with Intent { cmp=com.example.app/.TestService }: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@4938b2b -- permission denied for window type 2003```

これを回避する為にはAPIレベルが26以上の場合に、LayoutParams生成時のレイヤータイプに ```WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY``` を渡すようにする。

参考サイト : [Android O で WindowManager の振る舞いが変わる](http://keithyokoma.hatenablog.com/entry/2017/03/22/190000)
pyenv + anaconda3でjupyter notebookを使ったときにNo module named ipykernel_launcherというエラーが出た場合の対処法

`$ pyenv local anaconda3-2.4.0`でanaconda3をカレントディレクトリで有効化。
`$ ipython notebook`でjupyter notebookを起動したところ、以下のようなエラーが出ました。

```
[W 00:12:25.082 NotebookApp] Timeout waiting for kernel_info reply from 41fbb93f-01d7-49a6-bdf2-c78ad52a9364
[I 00:12:27.023 NotebookApp] KernelRestarter: restarting kernel (4/5)
WARNING:root:kernel 41fbb93f-01d7-49a6-bdf2-c78ad52a9364 restarted
/currentdir/anaconda3-2.4.0/bin/python: No module named ipykernel_launcher
```

ipykernel_lancherというのがないようなので、以下のコマンドでインストール。

```
$ conda install ipykernel
```

正常に動作するようになりました。

```
[I 00:49:53.062 NotebookApp] Kernel started: 77adaab9-d049-4d78-a602-b43a70c5b8f4
[I 00:49:54.652 NotebookApp] Adapting to protocol v5.1 for kernel 77adaab9-d049-4d78-a602-b43a70c5b8f4
```
多数ゲストOS上のrails serverでToo many open filesエラーが出たときの対処

ホスト上に、仮想化などして多数のRails Serverを起動しようとすると、以下のようなエラーがでることがある。

```
# rails s

/root/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.8/lib/rb-inotify/notifier.rb:58:in `initialize': Too many open files - Failed to initialize inotify: the user limit on the total number of inotify instances has been reached. (Errno::EMFILE)
	from /root/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/listen-3.0.8/lib/listen/adapter/linux.rb:31:in `new'
	from /root/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/listen-3.0.8/lib/listen/adapter/linux.rb:31:in `_configure'
	(以下略)
```

/rb-inotify/notifier.rb　で上限以上のファイルを開いているということなので、上限の設定を変更する。
例えば

```
# cat /proc/sys/fs/inotify/max_user_instances
128
```

とかだとしたら、

```
# echo 256 > /proc/sys/fs/inotify/max_user_instances
```

などとしてみる。

これでrails sを試して、成功したらいちいち上記の変更を行わずに済むように/etc/sysctl.confに以下を追記する。

```
# echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf
```
clara-rulesの世界(1)

[clara-rules](https://github.com/cerner/clara-rules)というライブラリがにわかに自分の中で話題になっていたのでさっとまとめてみた。

## 概要・特徴
- ルールエンジンの実装を提供するライブラリ
- ドメインの知識をコードから分離する
- clj/cljs両方で利用できる
- Javaからも自然に利用できる
- 作者本人による講演のビデオもある [[1]](https://www.youtube.com/watch?v=Z6oVuYmRgkk) [[2]](https://www.youtube.com/watch?v=zs5Rueo42TA)
- [より最近の講演のビデオもある](https://www.youtube.com/watch?v=Q_k5MkZmd-o)

## ルール？エンジン？
- エキスパートシステムに出自がある
    - プログラマーが足り無い状況で、ビジネスユーザーがプログラマーを介することなく問題を解決できることが魅力で一時期流行ったが限界があった
    - clara-rulesは現実的にどのようなルールでもコードであるという視点で、ビジネスユーザーではなくプログラマーをターゲットにしている

## 解決できること
- 何かロジックがあったとして、関数の呼び出しとして表現すると、そのロジックが必要とする情報を渡す/受けとることを明示的に書く必要がある
    - ロジックが求める情報が変化する→必然的にリファクタリングが必要になる
- ルールを介することで情報を渡す/受けとる記述をする必要が無くなる

## session
- 状態を表現する
- insert/retractでファクトを追加したり取り消ししたりする
    - factはClojureレコードのインスタンスで表現する
- fire-rulesでセッションに追加されたファクトに対してルールを適用する
- イミュータブルな値(insert操作を行うと新しいセッションが返ってくる。古いセッションもそのまま残っている)
    - Clojureっぽい
    - 事実スレッディングマクロで操作することを想定した作りになっている
- mk-session(Clojure only)
    - 引数無しの場合現在のネームスペースにあるルールを適用する
- defsession(ルールがあるネームスペースを指定する)

### `defrule`マクロ
- ルールを記述するためのマクロ
- 右辺と左辺がある
    - `=>`で区切られる
- 左辺には何らかの判定ロジックを記述する(複数記述できる)
- 右辺には判定がtruthyになった時に起こる事を記述する
    - 副作用を起こせる
    - 現在のセッションにファクトを追加することもできる

簡単な例

```clj
(defrecord Num  [number])
(defrule is-two
  [Num (= number 2)] => (println "Two!"))

(-> (mk-session)
    (insert (Num 4)))
    (fire-rules))
;;Two!
```

## クエリ？
- 元気がある時に調べる!
    - 編集リクエストも。。。？

## その他雑感等
- 明記はされていないが、clara-rulesという作りたい物が先にあって、その実装にClojureを選んだという雰囲気を感じる
- 簡単な例だけだと嬉しさが分らないのでまだまだ学習する必要がある
- JavaScriptにはnools,Rubyにはwongiという物があるらしい
- 動的にルールを生成するのはサポートされていない雰囲気を感じた
- defruleにおいて、左辺の型のプロトコルメソッドを使えるかどうか疑問に思ったが、作者の方にslackで可能だと教えてもらえた

Thanks for the clarification [ryanbrush](https://twitter.com/ryanbrush)!

```clj
(defprotocol IFoo
  (test-foo [this]))

(deftype Foo []
  IFoo
  (test-foo [this] true))

(defrule is-foo
  [Foo (test-foo this;;スコープ内で自動的に束縛されるシンボルっぽい
        )]
  => (println "is a foo"))

(-> (mk-session)
    (insert (Foo.))
    (fire-rules))
;;is a foo
```

[続編](http://qiita.com/iku000888/items/17ad5f7fa2f0da069997)
nodemailerでGmailから送信するための方法



自分用メモ

## nodemailerでの設定


```javascript
    var smtpConfig = {
        host: 'smtp.gmail.com',
        port: 465,
        secure: true, // SSL
        auth: {
            user: 'なんとか@gmail.com',
            pass: 'パスワード'
        }
    };
    this.transporter = mailer.createTransport(smtpConfig)
```




## Gmailの設定

1. 二段階認証がONの場合: アプリパスワードみたいなもので認証
2. 二段階認証がOFFの場合: 安全性の低いアプリの許可を有効にする?


以下のようなエラーが出る場合

```
  response: '534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbun\n534-5.7.14 Js5HEiTBKrTKTK_QrftVcMYM7AL6D5RBOq79Zfhx7K7hvX_oLs3DIFeC6V7DDvoMWK2tgV\n534-5.7.14 6y7yhKzKLI1szpaK-KH7eZiYfgQJ8AHYF-IdkqhzCZxMUD_SKf-yvY3lzbER8pxAZQ_SKb\n534-5.7.14 OVeT5VVCmErNorFMolwRaBy-eIW1GUkGLnJ5uVCV6WAsPKT1GpsRJzWvfOTfOplIxQSsvG\n534-5.7.14 wCHdBa8IFUCmxFBu5qusCY5EHGRLk> Please log in via your web browser and\n534-5.7.14 then try again.\n534-5.7.14  Learn more at\n534 5.7.14  https://support.google.com/mail/answer/78754 64sm24768128pff.168 - gsmtp',
  responseCode: 534,
  command: 'AUTH PLAIN' }
(node:14969) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Error: Invalid login: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbun
534-5.7.14 Js5HEiTBKrTKTK_QrftVcMYM7AL6D5RBOq79Zfhx7K7hvX_oLs3DIFeC6V7DDvoMWK2tgV
534-5.7.14 6y7yhKzKLI1szpaK-KH7eZiYfgQJ8AHYF-IdkqhzCZxMUD_SKf-yvY3lzbER8pxAZQ_SKb
534-5.7.14 OVeT5VVCmErNorFMolwRaBy-eIW1GUkGLnJ5uVCV6WAsPKT1GpsRJzWvfOTfOplIxQSsvG
534-5.7.14 wCHdBa8IFUCmxFBu5qusCY5EHGRLk> Please log in via your web browser and
534-5.7.14 then try again.
534-5.7.14  Learn more at
534 5.7.14  https://support.google.com/mail/answer/78754 64sm24768128pff.168 - gsmtp
```


自分のGmailアカウントで、以下を設定。
「安全性の低いアプリの許可:」を有効にする

https://myaccount.google.com/lesssecureapps
[クイズ]javascriptと仲良くなるための一歩　第９話「if文の条件式」


#問題

?は何になるでしょう？？:thinking:

```js
if ("hoge") {
  "T"
}else {
  "F"
}
//=> ?

if ("") {
  "T"
}else {
  "F"
}
//=> ?

if (1) {
  "T"
}else {
  "F"
}
//=> ?

if (0) {
  "T"
}else {
  "F"
}
//=> ?

if (null) {
  "T"
}else {
  "F"
}
//=> ?

if (undefined) {
  "T"
}else {
  "F"
}
//=> ?

if (NaN) {
  "T"
}else {
  "F"
}
//=> ?

if (hoge) {
  "T"
}else {
  "F"
}
//=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:


#答え

if文の条件式ではブーリアン型に型変換されるので以下のようになります:hugging_face:

```js
if ("hoge") {
  "T"
}else {
  "F"
}
//=> true

if ("") {
  "T"
}else {
  "F"
}
//=> false

if (1) {
  "T"
}else {
  "F"
}
//=> true

if (0) {
  "T"
}else {
  "F"
}
//=> false

if (null) {
  "T"
}else {
  "F"
}
//=> false

if (undefined) {
  "T"
}else {
  "F"
}
//=> false

if (NaN) {
  "T"
}else {
  "F"
}
//=> false

if (hoge) {
  "T"
}else {
  "F"
}
//=> VM208:1 Uncaught ReferenceError: hoge is not defined
//   at <anonymous>:1:1
```
数学文書でi要素の使い道を考える（HTML5）

#数学文書でi要素の使い道を考える

私の知識は古く，てっきり HTML5 になっていわゆる物理要素だった `b`要素や`i`要素は消滅していたのかと思っていたのですが，ちゃんと生き残っていました．

##専門用語に使えるi要素

[i 要素 - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/i)の引用ですが`i`要素の概要は次の通りです．

>オフセットテキスト（或いはイタリック）要素（&lt;i&gt;）は、技術用語、外国語のフレーズ、または架空の人物の思考など、何らかの理由で他のテキストと離して配置して区別されるテキストの範囲を表します。英文においては通常斜体で表示される事の多い部分であり、殆どの場合、ブラウザはこの要素に対しイタリック体のデフォルトスタイルを指定しています。

技術用語というのが一つ目を引くのですが，似たような要素に`dfn`要素があります．次は[dfn 要素 - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/dfn)からの引用です．

>HTML 定義要素 (&lt;dfn&gt;) は、用語の定義を表します。

ある専門用語が初めて出てきたときは`dfn`要素を用いてその語の説明をして，それ以降は`i`要素を使う，という趣旨でよろしいでしょうか．

```html
<p> $\lim_{n\to\infty}(1+1/n)^n$ は収束する．この極限値を<dfn id="Napier-number">ネイピア数</dfn>といい，$e$ で表す．<i>ネイピア数</i>は無理数であることが知られている．</p>
```

一つの用語に対して`dfn`要素は一回しか使わないべきですから，なるほどといった感じです．

##数式記号に使える？

一つ思ったのですが，数学では「○○を△△とよび，□□と表す」のような言い回しをよくします．△△は用語ですから`dfn`要素が適任だと思いますが，□□も新しく定義された記号ですので，ここにも何らかのマークアップをしてもよいのではないかと．用語ではないのでここにも`dfn`を使うのは違う気がします．で，再び[i 要素 - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/i)より．

>より適切なセマンティクスを持つ要素が無い場合のみこの要素を使用するべきです。

これに加えて

>英文においては通常斜体で表示される事の多い部分であり、殆どの場合、ブラウザはこの要素に対しイタリック体のデフォルトスタイルを指定しています。

です．数式はイタリック体で表すことが多いですし，ある意味で外国語ですから，新しく登場した数学記号を`i`要素でマークアップするのはありなのではないかという案が一瞬よぎりました．

```html
<p> $\lim_{n\to\infty}(1+1/n)^n$ は収束する．この極限値を<dfn id="Napier-number">ネイピア数</dfn>といい，<i>$e$</i> で表す．</p>
```

新しく定義した数式記号だけをあとで抽出したいこともあるかもしれないので，

```html
<i class="dfn"> $e$ </i>
```

などの専用の属性を設定するといいかもしれません．あるいは，新しい数式記号も用語ととらえて

```html
<dfn class="formula"> $e$ </dfn>
```

などとした方がいいのかもしれません．

まあ，マークアップしても誰も気付かないレベルで，ほとんど自己満足でしかありません．ウェブブラウザですらなんでマークアップしてんの？　くらいに思われるかもしれません．

何か良いアイディアがあったらお待ちしております．
参照設定の一覧をExcelに出力する


タイプライブラリのGUIDが欲しいことがあったため、Excelに一覧を出力するマクロを作成した。

# 動作

アクティブなブックの参照設定の一覧を、新規ブックのワークシートにテーブルとして出力する。

![結果イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/142842/7531b228-7b4c-cf1a-9d7d-9d90e4579cc4.png)


# 事前準備

このマクロでは参照設定の情報を取得するために`VBIDE.VBProject`などにアクセスしている。

しかし、このオブジェクトへのアクセスはデフォルトでは禁止されているため、Officeのセキュリティ設定を変更する必要がある。

なお、**この変更によりいわゆる「マクロウィルス」に弱くなるため、開くファイル・実行するコードが問題無いか注意する**こと。

```text:セキュリティ変更内容
オプション
>セキュリティセンター
  >セキュリティセンターの設定
   >マクロの設定
    >開発者向けのマクロ設定
     >「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」 にチェック
```

![セキュリティ変更1.png](https://qiita-image-store.s3.amazonaws.com/0/142842/83e4e126-87cc-6587-16cf-47d78d06d194.png)

![セキュリティ変更2.png](https://qiita-image-store.s3.amazonaws.com/0/142842/1169c332-26f7-51c1-7755-e13beaab5ae9.png)


# コード

Excelの任意のモジュールに貼り付けて、`CreateReferenceTable`を実行する。

追加の参照設定は不要。

```vb
Option Explicit

'出力するテーブルの列番号
Private Enum RefColumnNo
    rcnName = 1
    rcnDesc
    rcnPath
    rcnGUID
    rcnVer
End Enum

'列の数
Private Const COL_COUNT& = RefColumnNo.rcnVer

'出力するテーブルのヘッダー。"|"区切りで指定。
Private Const TABLE_HEADER$ = "Name|Description|FullPath|GUID|Version"


Private Sub CreateReferenceTable()
    
'参照設定の情報取得
    
    '※セキュリティ設定を解除していないとここでエラー
    Dim tgtRefs As Object 'As VBIDE.References
    Set tgtRefs = Excel.ActiveWorkbook.VBProject.References
    
    Dim oTable() As String '配列は1開始前提
    ReDim oTable(1 To tgtRefs.Count, 1 To COL_COUNT)
    
    Dim ref As Object 'As VBIDE.Reference
    Dim r As Long: r = LBound(oTable, 1)
    For Each ref In tgtRefs
        
        With ref
            oTable(r, rcnName) = .Name
            oTable(r, rcnDesc) = .Description
            oTable(r, rcnPath) = .FullPath
            oTable(r, rcnGUID) = .GUID
            oTable(r, rcnVer) = .Major & "." & .Minor
        End With    'ref
        
        r = r + 1
    Next ref
    
    
'新規ブックにテーブルとして出力
    
    Dim destWs As Excel.Worksheet
    Set destWs = Excel.Workbooks.Add.Worksheets.Item(1)
    
    With destWs.Range("A1").Resize(UBound(oTable, 1), UBound(oTable, 2))
        'まずはデータを出力
        .Value = oTable
        
        'テーブルに変換して整形
        With destWs.ListObjects.Add(xlSrcRange, .Cells, , xlNo)
            .ShowHeaders = True
            .HeaderRowRange = VBA.Split(TABLE_HEADER, "|")
            
            With .Range 'テーブル全体
                .Rows.AutoFit
                .Columns.AutoFit
            End With '.Range
            
        End With 'destWs.ListObjects.Add(～
        
    End With 'destWs.Range("A1").Resize(～
    
End Sub
```

# 自分用

[\<reference> 要素 (Windows Script Host)](https://msdn.microsoft.com/ja-jp/library/cc392550.aspx "<reference> 要素 (Windows Script Host)")

```text:ワークシート関数
="<reference guid="""&[@GUID]&""" version="""&[@Version]&""" /> <!-- "&[@Description]&" -->"
```
[Elixir]キューを実装してみた

実装してみたってほどじゃないけど
ちょっとした練習を兼ねて書いてみた.

`Queue.add job` で jobを追加
`Queue.pop` で先頭のjobを取り出す
するものを書く.


## 書いてみた
```ex:queue.ex
defmodule Queue do
  @name __MODULE__

  def start_link, do: Agent.start_link(fn -> [] end, name: @name)
  def add(job), do: Agent.update(@name, fn queue -> queue ++ [job] end)
  def pop, do: Agent.get_and_update(@name, fn [head | tail] -> {head, tail})

end
```

```
iex(1)> QueueEx.Queue.start_link
{:ok, #PID<0.124.0>}
iex(2)> QueueEx.Queue.add 1
:ok
iex(3)> QueueEx.Queue.add 2
:ok
iex(4)> QueueEx.Queue.add 3
:ok
iex(5)> QueueEx.Queue.add 3
:ok
iex(6)> QueueEx.Queue.pop
1
iex(7)> QueueEx.Queue.pop
2
iex(8)> QueueEx.Queue.pop
3
```



次は優先度つきキューかスタックを実装してみる
関数ポインタ小さなメモ（構造体）

#コード

```
#include "stdio.h"

struct fp {
        int (*kuref1)(int);
        int (*kuref2)(int);
};

int test(int i){
        int t = i + 1;
        return t;
}

int main(int argc, char* argv[])
{
        struct fp f = {
                .kuref1 = test,
                .kuref2 = test
        };
        printf("%d\n%d\n", f.kuref1(1), f.kuref2(1));

        return 0;
}
```

#実行

```
ubuntu# gcc kansu-pointer.c
ubuntu# ./a.out
2
2
```
関数ポインタ小さなメモ

# コード

```c:test.c
#include "stdio.h"

int (*kuref)(int);

int test(int i){
        int t = i + 1;
        return t;
}

int main(int argc, char* argv[])
{
        kuref = test;
        printf("%d\n", kuref(1));
        return 0;
}

```

# 実行

```
#gcc test.c
# ./a.out
2
```
File APIを利用し、inputで選択された画像をサーバーにアップロードせずに表示

## File API
`<input type="file">` で選択された画像ファイルをプレビュー表示したい！
javascript で value を取得して・・・　あれ？という経験はないだろうか。
残念ながら、input タグの value から選択された画像を表示することはできない。

そこで利用するのが、HTML5の**File API**である。
File API の **FileReader** インターフェースから、ユーザーのローカル環境にある画像ファイル等を非同期的に読み込み、表示することを実現する。

[File API （日本語訳）](https://triple-underscore.github.io/File_API-ja.html)
[FileReader - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/FileReader)


## サンプルコード

javascript 部分のサンプルコードは以下。
なお今回は jQuery も利用している。

```js:
$(function() {
    $('input:file').on('change', function() {
        var fileReader = new FileReader();

        fileReader.onload = function(event) {
            var loadedImageUri = event.target.result;
            $('body').append('<img src=' + loadedImageUri + '>');
        };

        fileReader.readAsDataURL(this.files[0]);
    });
});
```


**FileReader.onload**
load イベントのハンドラ。読込が成功したときにイベントが発生。

**FileReader.readAsDataURL**
指定された Blob オブジェクトを読み込む。終了後の result プロパティにはファイルの Data URI Schemeを格納する。

取得した Data URI Scheme を src とした img タグを動的に生成することで、以下の様に選択された画像ファイルを動的にプレビュー表示することができた。

![124.PNG](https://qiita-image-store.s3.amazonaws.com/0/151404/5c758fc0-65f6-b9d5-9500-b5d905fb4c96.png)
[Vue.js] htmlタグと重複するコンポーネント名の命名規則をどうするか

Vue.jsでコンポーネントを作成するときにHeader.vueなどhtmlタグとかぶってしまうコンポーネント名をつけたいときにどうすれば良いのか困ったので調べてみました。

調べた限りだと以下の3つのパターンが存在します。

### 1. htmlタグとかぶるコンポーネントはそもそも作らない

Vue.jsの公式でも紹介されている[vue-hackernews-2.0](https://github.com/vuejs/vue-hackernews-2.0)をみて見ると、headerなどのhtmlと被りそうなコンポーネントは存在しません。

https://github.com/vuejs/vue-hackernews-2.0/blob/master/src/App.vue

個人プロジェクトや小規模の案件だと問題なさそうですが、ヘッダーやフッターをコンポーネントに切り出したい場合もあると思うのでちょっと微妙です。

### 2 . AppNameHeader.vueのようにprefixをつける

` App ` や ` AppName ` のようにprefixをつければhtmlタグとの名称の衝突を回避できます。

ただ、すべてのコンポーネントにprefixをつけるのもめんどくさく、htmlタグと重複するものだけにprefixをつけるのも微妙ですね・・・

### 3. htmlタグと重複したコンポーネント名を許容しつつコンポーネントを読み込むときに任意の名前をつける

` Header.vue` を作成して、コンポーネントを読み込むときに ` v-header ` などとします。
App.vueを以下のようにするイメージです。

```
<script>
import Header from '@/components/Header'
export default {
  name: 'app',
  components: {
    'v-header': Header
  }
}
</script>
```

> AppNameHeader.vueのようにprefixをつける

と発想は同じですが、こちらの方がコンポーネント名もすっきりするので今のところこの方法が1番良いかなと思っています。（ ` v- ` とするとVue.jsの機能かな？と読み手が感じるケースがあるかもしれません）

この3つ以外の方法があったり、これがベストプラクティスだ！という方法があれば教えて欲しいです。

---

この記事は[[Vue.js] htmlタグと重複するコンポーネント名の命名規則をどうするか](http://tackeyy.com/blog/how-to-name-vuejs-component-name-when-component-name-is-same-as-html-tag-name)からの転載です。
cisco 2960 デフォルト設定メモ(さくせいちゅう。。。。)

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。


####**2960デフォルト値のメモ       Rel. 12.2(40)SE参照**


ip　　　　　　　　　　　　　　　0.0.0.0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
mask　　　　　　　　　　　　　　0.0.0.0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
GW　　　　　　　　　　　　　　　0.0.0.0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
ドメイン名　　　　　　　　　　　null　　　有効　　　　　　　　　　　　　　　
DHCPserver　　　　　　　　　　　1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
DHCPcliant　　　　　　　　　　　1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
DHCPリレーエージェント　　　　　1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
スイッチクラスタ　　　　　　　　 0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
PW　　　　　　　　　　　　　　　null　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
システム名　　　　　　　　　　　Swith　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
NTP　　　　　　　　　　　　　　 1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
DNS　　　　　　　　　　　　　　 1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
TACACS+　　　　　　　　　　　　 0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
RADIUS　　　　　　　　　　　　　0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
HTTP　　　　　　　　　　　　　　1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
HTTPS　　　　　　　　　　　　　 1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
IEEE 802.1x　　　　　　　　　　 0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
ポート　　　　　　　　　　　　　auto,auto　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
Auto-MDIX　　　　　　　　　　　 1　　　　　 どのような機器とケーブルの組み合わせでも通信が確立
フロー制御　　　　　　　　　　　0　　　　　 通信の向きの自動制御、輻輳時に使用
SmartPort 　　　　　　　　　　　未定義　　　ポートの自動設定の定義化・配布化
VLAN　　　　　　　　　　　　　　1（defoultVLAN)　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
VLANtrunk　　　　　　　　　　　 dynamic auto　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　　  カプセル化はネゴシエーション　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
VTPサーバ　　　　　　　　　　　 1　　　　　　ドメイン全体に設定を反映する操作ができる
VTPクライアント　　　　　　　　 0　　　　　　設定の変更不可、通信の動作はVTPサーバと同じ
STP、PVST+　　　　　　　　　　　VLAN 1 + connectPort　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
MSTP　　　　　　　　　　　　　　0　　　　　　MSTP は複数の VLAN を同一のスパニング ツリー インスタンスにマッピング
オプションのスパニング ツリー　 0　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
Flex Link　　　　　　　　　　　 0　　　　　　スパニングツリーの可用性機能、一方が落ちても再検索なしでツリーを維持
　　　　　　　　　　　　　　　　　　　　　　 MACアドレスのテーブルも移動してくれる
DHCP スヌーピング　　　　　　　 0　　　　　　信頼できないホストと DHCP サーバの間でファイアウォールに似た役割
IGMP スヌーピング　　　　　　　 0　　　　　　マルチキャスト トラフィックのフラッディングを制限
IGMP スロットリング　　　　　　 設定拒否　　 IGMP グループの最大数を設定、指定数に達すると上書きされていく
IGMP スヌーピング クエリア機能　0　　　　　  マルチキャスト トラフィックのフラッディングを制限のアドレス範囲設定
MVR　　　　　　　　　　　　　　 0　　　　　　イーサネット リング ベースのマルチキャスト ストリームへの加入および脱退
ポートベース トラフィック　　　 ストーム制御はディセーブル　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　　  フラッディング（氾濫）はブロックされない　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　　  セキュア ポートは未設定　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
CDP　　　　　　　　　　　　　　 1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
UDLD　　　　　　　　　　　　　　0　　　　　　 光ケーブルなどの物理設定をモニタ
SPAN　　　　　　　　　　　　　　0　　　　　　 モニタ用にパケットをコピーし配布する機能
RSPAN　　　　　　　　　　　　　 0　　　　　　 モニタ用にパケットをコピーし配布する機能
RMON　　　　　　　　　　　　　　0　　　　　　 リモートモニタ用の監視ツール
Syslog 　　　　　　　　　　　　 1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
SNMP　　　　　　　　　　　　　　1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
ACL　　　　　　　　　　　　　　 未設定　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
QoS　　　　　　　　　　　　　　 0
JenkinsのPipelineでSVNのChangesが二重に記録される問題と対処法

# 状況

JenkinsのPipelineを下記設定で作成してジョブを実行すると、変更履歴が1コミットに対して2つ記録されてしまう。

- Pipeline script from SCM
- SCMはSubversionを使う
- プロジェクト直下にJenkinsfileを配置
- JenkinsfileはDeclarative Pipeline構文

# 原因
「Pipeline script from SCM」でジョブを作成した場合、Jenkinsfile自体を更新するPipelineJobのワークスペースと、Jenkinsfileを実行するSandboxのワークスペースが別になっているっぽい。
それぞれのワークスペースで`svn update`が合計2回実行されて、そのぶん二重にChangesが記録されてしまう。

一応バグ報告は上がっているみたいだけどStatusがOPENのままなので解決していないみたい。
SCMにgitを使っている場合は発生しないのかな。

[\[JENKINS\-38204\] SVN plugin show all checkouts twice in pipeline project \- Jenkins JIRA](https://issues.jenkins-ci.org/browse/JENKINS-38204)

# 対処法
Jenkinsfileに下記2つを設定する。

- `options`ディレクティブに`skipDefaultCheckout（）`の設定を追加
- `stages`ディレクティブの最初に`checkout`を`changelog:false`指定で実行

デフォルトのチェックアウト処理は細かい設定ができないので、それをskipして自前でチェックアウトするように設定する。`checkout`の引数については`scm`変数が使えるのでそれを使うとシンプルに書ける。

```groovy
pipeline {

    agent any

    options {
        skipDefaultCheckout()
    }

    stages {
        stage('checkout') {
            checkout changelog: false, scm: scm
        }

        stage('build') {
            sh './gradlew build'
        }

        // omitted...
    }
}

```
Unity IL2CPP Il2CppCodeGenString から文字列を出力する

結構、後ろ向きなテクニックでアレです。

# 動作確認環境

- Xcode 8.3.3
- Unity 2017.1.0f3

多分、Unity 5.5.x 以上なら動きます。

# 方法

文字列リテラルは、大抵の場合は ___stringLiteralxxxx__ の様な変数名に格納されている。
型は Il2CppCodeGenString のポインタで定義されており、API として文字列長と最初のキャラクターのアドレスを取得する手段が設けられているので、最初のアドレスから文字数分イテレートを回してあげれば OK。
尚、下記サンプルはマルチバイトは考慮していません。

```
Il2CppChar* c = _stringLiteralxxxx->get_address_of_m_firstChar_1();
for (int i = 0; i < _stringLiteralxxxx->___m_stringLength_0; i++) {
    printf("%c", *(c+i));
}
```
実行しているファイルが格納されているディレクトリのパスを取得したい。


タイトル通り、実行したファイルが格納されているディレクトリのパスを取得したいという場合、Python3ではどのように書くべきでしょうか?  まずは[`os.path`](https://docs.python.jp/3/library/os.path.html)を利用する場合。取得パスが相対パスでよいというときは次のように書きます。

```py3
import os.path
directory = os.path.dirname(__file__)
```

相対パスではなく、絶対パスがほしい場合は次の通りです。

```py3
import os.path
directory = os.path.dirname(os.path.abspath(__file__))
```

次にファイルパスを抽象化したクラスである[`pathlib.Path`](https://docs.python.org/3/library/pathlib.html)を利用する場合を考えます(`os.path`ではファイルパスを文字列で扱う)。

まずは相対パスの場合。

```py3
import pathlib
directory = pathlib.Path(__file__).parent
```

次に絶対パス。

```py3
import pathlib
directory = pathlib.Path(__file__).parent.resolve()
```

`os.path`にしろ`pathlib`にしろ、とてもシンプルに書けますね(´・ω・｀)
Ansibleでsudoのコマンドを実行する

ansibleでは become: yes とかけばsudoでコマンド実行ができますが、そのためにはユーザーにsudo権限がついていないといけません。

今回Vagrantで構築したUbuntuに対して、vagrant以外のユーザーでAnsibleを叩きたいと思います。


<!-- ちなみに、デフォルトのvagrantユーザーならなんの問題なくsudo権限の処理ができるんですよね。                                                                   -->
<!-- ですが、今後EC2などでも同様にAnsibleで構築する場合等、Ansible用ユーザーを指定したい場合などはこの方法が使えるんじゃないか…と思います。 -->


# 環境
Vagrant 1.9.7
Ubuntu 14.04
(vm: "ubuntu/trusty64")
ansible 2.3.1.0

# sudo権限を付ける
ubuntu という名前のユーザーを作り、sudo権限を付けます。

まずログイン

$ vagrant ssh

ここからはubuntu内の操作です。
 ubuntuという名前のユーザーがいないなら作っておきます。

$ adduser ubuntu

適当なパスワードを入力してあとはEnter。

ubuntuでエディタをviにします。やらなくてもいいですがnanoが使いにくかったので。

$ sudo update-alternatives --config editor

選択肢がでますが、3を入力します。

 ubuntuにsudo権限を付けます。

$ sudo visudo

末尾に以下を追加。
ubuntu   ALL=(ALL) NOPASSWD: ALL

これで、`su ubuntu`でubuntuになり、`sudo ls`などが実行できるか確認します。

だいたいこれでOKです。


あとは、1. ansibleのプレイブックでユーザーを指定するか、2. hostsファイルにユーザーをかけばOKです。


1. プレイブック内に、user:でubuntuを指定します。

```
- hosts: dev
  user: ubuntu
  become: yes
  tasks:
    - name: whoami
      command: whoami

```

2. hostsファイルにansible_ssh_userで指定します。

```
[web]
192.168.33.10 ansible_ssh_user=ubuntu
```

# 参考

[Ubuntuで、デフォルトエディタを変更する | WWWクリエイターズ](http://www-creators.com/archives/358)

[linux - Ansible sudo without password - Stack Overflow](https://stackoverflow.com/questions/37434598/ansible-sudo-without-password)
Android Studio 2.3.3 for Linux の消費ディスクスペースは公式情報より何倍もデカい

#はじめに

久しぶりに Android 開発環境を構築してみて、ディスクスペースに難儀したので記録に残します。

たぶん 2011 年に構築したのが最後で、その時は Android Studio は存在していなくて Eclipse Plugin だった気がしますし、こんなに難儀した記憶がありません。


#結論

空きディスクスペースは 20GiB くらい必要です。


#試行環境

Ubuntu 16.04 x86_64 での結果です。


#公式情報

[公式情報](https://developer.android.com/studio/index.html)では、必要ディスクスペースは「最小が 2GB で推奨は 4GB」と書いてあります。
（"GB" は "GiB" のことかと思います。）

そんなんでは、ぜんぜん足りないと思います。


#実測

以下、実測した消費ディスクスペースです。

|用途|サイズ|
|:--|:--|
|Android Studio|857MiB|
|~/.android|55MiB|
|Android Sdk|1.4GiB|
|API 25 x86_64 Emulator|4.1GiB|
|API 16 x86 Emulator|6.8GiB|
|/tmp/PackageOperation0[1-9]|5GiB以上|

エミュレータは実際には分散して存在します。上記は合算値です。

|パス|内容|
|:--|:--|
|Sdk/system-images|イメージのコア部分|
|~/.android/avd|画面サイズ等やストレージを含む起動可能なエミュレータ|

PackageOperation0[1-9] はエミュレータ・イメージ（zip ファイル）のダウンロードや展開で一時的に利用されます。一時的と言っても、数 GiB もある zip ファイルと、その展開された中身が、Android Sdk 以下などに移動されるまでココに置かれます。


#実機開発の可否で雲泥の差

上述のとおり大きいのはエミュレータです。インストール過程で 10GiB 弱も必要になります。もし運良く実機で開発出来れば、これが不要になります。おめでとうございます。

運悪く targetSdkVersion と minSdkVersion の２環境とも実機が確保できない場合は、20GiB くらい余ってないと開発を進められないかと思います。


#仮構成

手元では、Android 開発環境全体でのディスク消費量を把握したい、というか、開発環境を閉じ込めたいので、取り敢えず下記ディレクトリ構成で作業しています。

|パス|内容|
|:--|:--|
|Android Studio|文字通り|
|PackageOperation00|/tmp/PackageOperation01 へ symlink|
|users/me/.android|~/.android へ symlink|
|users/me/sdk|個人の Android Sdk|
struct,typedef小さなメモ

# コード

```c:test.c
#include "stdio.h"

struct kure{
        int k;
};

typedef struct {
        int k;
} kures;

int main(int argc, char* argv[])
{
        struct kure kure_ = {10};
        printf("%d", kure_.k);

        kures kure1 = {10};
        printf("%d", kure1.k);

        return 0;
}
```

# 実行

```
# gcc test.c
# ./a.out
1010
```
All About ACS: IBM i Access Client Solutions - Base Package の専用ページからのダウンロード(Base, EHLLAPI)

# IBM i Access Client Solutions - Base Package の専用ページからのダウンロード
ここでは ACS の中心となる Base Package のダウンロード方法を紹介します。
[IBM i Access Client Solutionsの入手方法](http://qiita.com/6onoda/items/dc876dae8330c1960617)でおすすめした[専用ダウンロードページからダウンロード](http://qiita.com/6onoda/items/dc876dae8330c1960617#%E5%B0%82%E7%94%A8%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8B%E3%82%89%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)での方法です。
5250 API である EHLLAPI をACS でも利用する EHLLAPI Enablement Tool は、ここからしか入手できません。

下記のサイトに接続します。

https://www.ibm.com/services/forms/preLogin.do?source=swg-ia

IBM ID でログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/bea71a49-38f2-c4fe-8178-5b05b9610529.png)

「同意します」をチェックし「承認します」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/b9ecc910-bcfe-55fb-03af-c5bee896b16c.png)

デフォルトは、Java アプレット「Download Director」でのダウンロードです。
ダウンロードしたいものにチェックを入れて「Download now」をクリックすると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/e189fb1d-b1de-e3df-5d5d-415343e42945.png)

Javaが導入されている環境では Java Web Start が起動しダウンロードされます。
複数セッションで分割・並行ダウンロートされるので短時間でダウンロード可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/1f9876f0-b18c-e771-0310-74d4aa0b0aea.png)

ダウンロードにJavaを使いたくない場合は「Download using http」のタブをクリックします。
各ファイルの「Download now」がダウンロードのリンクになっているのでクリックするとブラウザーのダウンロード機能でダウンロードできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/cdfb1df5-bbbe-d286-7869-d8ce85fdb1c0.png)

## KEY_NOT_FOUND と出たら
下記のように「KEY_NOT_FOUND-key....」とダウンロードファイルが認識できない場合があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/7d7b32ab-254c-7cda-a2a3-c890ca87d1b8.png)

この場合、IBMへの接続言語を英語にしてみてください。

ひとつめの回避方法はブラウザーのクッキーをすべてクリアして再度トライすることです。言語設定のクッキーも忘れるので、自動的にIBMの接続言語が英語になります。
もう一つは、IBMの接続言語を明示指定することです。
ページの右上に接続言語に応じた国が表示されています。この例では「Japan」になています。これをクリックして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/9e027771-0759-48e1-0a24-4dc2d4da52e1.png)

「United States - English」を選択したうえで
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/ed8f4313-a41d-acba-16b9-c0b0eca0d449.png)

https://www.ibm.com/services/forms/preLogin.do?source=swg-ia に再度、接続してみてください。

サイトは英語で表示されるはずです。内容は日本語と同じですので難しくはありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/0d29c53e-1d99-e3ae-5ab9-ba3933c497b8.png)

今後は、正常に表示されているはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/71f50d26-b13a-5fc3-0b58-1a27e0fcf891.png)

ACS のダウンロードが終わったら、言語を「Japan - Japanese」に戻してもよいでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/13326ec3-5b98-b2f1-095d-0572eef96b4d.png)

***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
じぇねらるたんシールの注文方法

## 概要

ADPRINTというサービスを使って誰でもじぇねらるたんの形のシールを作ってもらうことができる。値段は1枚あたり約12円[^注1]。

![BwPwIM-CYAAZtp0.jpg](https://qiita-image-store.s3.amazonaws.com/0/8169/7d935ab9-4b59-a750-95db-90ea9a495df4.jpeg)

### ProofGeneral とは

じぇねらるたんは [ProofGeneral](https://proofgeneral.github.io/)というツールの公式キャラクターであるが、このツールはCoqなどの対話的証明支援器で証明を対話的に開発するための [Emacs](https://www.gnu.org/software/emacs/) プラグインである。


## 手順

ADPRINTではじぇねらるたんのデータを入校する前に、シールの大きさやタイプを指定して注文を先にする必要がある。

### 注文方法

1. まずADPRINTの注文画面へアクセス: http://www.adprint.jp/OrderMall/Order/TotalOrder.aspx
1. 画像を参考に項目を入力
    - 左上から順に「シール・ステッカー」「一般接着(ラミネートなし)」「横 50mm x 縦 60mm」
    - 裁断は「特殊系」
    - 数量は欲しい枚数を (500枚以上がおすすめ)
1. 「カートに入れる」 -> 注文手続きへ

<img width="829" alt="スクリーンショット 2017-07-25 21.09.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/8169/0309cd3f-2c5a-7323-d119-8b587f199ba5.png">

### データ入校

シールのためのデータは @mzp さんが作ってくれた chibi-generaltan-sticker.ai を使う。(mzpさんに感謝すべし)

- https://github.com/yoshihiro503/generaltan/tree/master/sticker

1. 上記からaiデータをダウンロード
1. ADPRINTのマイページから該当する注文を選択
1. 「データ入稿はこちらから」から「データ入稿」ボタンを押して上記のaiファイルを指定する

![adprint_nyuko.png](https://qiita-image-store.s3.amazonaws.com/0/8169/9757d7bc-f84d-1c42-c0fe-28e2970335cf.png)

## 環境

以下の環境で実際に注文した

- Mac OS X Sierra (10.12.6)
- Google Chrome 59.0.3071.115

## 参考リンク

- [萌えキャラを作ってみたよ: Making of じぇねらるたん - みずぴー日記](http://mzp.hatenablog.com/entry/2012/09/26/232857)
- [コミュニティとしてのcodefirst その1: オリジナルステッカーの作り方 - codefirst::blog](http://blog.codefirst.org/post/33072554269/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AEcodefirst-%E3%81%9D%E3%81%AE1-%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%82%B9%E3%83%86%E3%83%83%E3%82%AB%E3%83%BC%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9)

## 注釈

[^注1]: 500枚注文した場合1枚11.98円(送料は除く)
Rails 5.1.1 で、テスト環境のときだけ manifest-test.json がないとか言われるときの対処法

Rails 5.1.1 でテストを実行するとビューの `javascript_pack_tag "application"` で

```
ActionView::Template::Error:
  Can't find application.js in public/packs/manifest-test.json. Is webpack still compiling?
```

とか言われました。

これは `config/webpack/paths.yml` の次の部分が影響しているっぽいです。

```
test:
  <<: *default
  manifest: manifest-test.json
```

なので、ためしに `manifest` 行を消してやれば通るようになりました。

なお Rails 5.1.2 で `rails new` すると、この部分を含め `config/webpack*` 関連がけっこう変わっていたので、
なんかおかしかったら深追いせずに、最新版にするなり `rails webpacker:install` するなりした方がよさそうです。

(追記) あとでわかったのですが Rails 5.1.2 だからというより `webpacker gem` の `1.2` と `2.0` の差だとわかりました。つまり、なんかおかしかったら、まずは `bundle update webpacker && rails webpacker:install` ですね。
node-gypでc言語連携つくるときにハマった点

# 概要

以前、c言語でつくったライブラリをgoで使えるようにしたときの記事をかきましたが
http://qiita.com/taktod/items/0d87e511388fde7ffe2d
http://qiita.com/taktod/items/278255153b6bba68e95f

今回はそのnodeバージョンのプログラムをさわったときハマったので、記事にしておきます。

いじったのはコレ
https://github.com/taktod/ttLibJsGyp

では、ハマった点をどぞ

# 日本語を使いたかったらUTF8-BOMにする

CやC++のソースの中で日本語をいれたかったらUTF8ではなくUTF8-BOMにして利用する
自分が利用しているvisual studio codeだったら

![スクリーンショット 2017-07-25 21.52.31.png](https://qiita-image-store.s3.amazonaws.com/0/6246/2d6c2610-97db-8136-2f0d-097dfc0762f3.png)

このUTF-8の部分をクリックして
エンコード付きで保存
UTF-8 with BOM
を選択すればOK

これをしないと、windowsのnode-gypのコンパイルでソースコードが正しく認識されず、動作しなくなる。
BOM付きにしても、MacやLinuxでは問題ない模様

なお、日本語をいれなければ、BOMにしなくてもOK

この問題があったため、
submoduleで利用しているttLibCからは日本語を排除
ttLibJsGypのcsrcの中身については、BOM付きに変更しました。

# パスをきっていても同名のファイルを作ってはいけない。

これもwindowsの制限
csrc/decoder/mp3lame.cpp
と
csrc/encoder/mp3lame.cpp
は両方ともコンパイル結果がmp3lame.oに保存されます。binding.gypでソースコード指定で先にしてある方は、あとから指定された側で上書きされてしまうため
最終的なプログラムのリンク時に、動作の実体がないと怒られるみたいです。

というわけで
csrc/decoder/mp3lameDecoder.cpp
csrc/encoder/mp3lameEncoder.cpp
と、リネームしておきました。

なお、どうしても同名を使いたい場合は
static_libraryとして別々にコンパイルしてから、dependencies指定で
依存させるという形にすれば、なんとかなります。

この２点、今日プログラミングしてたら、ハマりました。
デンドログラムのラベル操作や回転

当初の問題が自己解決してしまったけど悔しいので調べたことを書く。

# ラベルの編集

普通にデンドログラムをプロットするとこんな感じになる。

```r
data("UScitiesD")
hc <- hclust(UScitiesD)
plot(hc)
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/109348/566bffd2-f6cf-8170-1eaf-f7ea54d93e17.png)

それぞれの項目を指すラベルは書き換えることができる。例えばhclustオブジェクトをそのまま`plot()`に渡す場合は、`labels=`引数で任意のラベルを指定することができる。

```r
plot(hc, labels = 1:10)
```

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/109348/2b3666a2-7819-aa4a-6a06-bae6f2307d31.png)

# 回転

デンドログラムを回転させるには、一旦dendrogramオブジェクトに変換した後に`plot()`に渡し、`horiz=`引数に`TRUE`を指定してやる必要がある。

```r
plot(as.dendrogram(hc), horiz = TRUE)
```

![Rplot02.png](https://qiita-image-store.s3.amazonaws.com/0/109348/8cce6bdb-da04-be1e-6447-62aa300fdb30.png)


# 回転+ラベル指定

ここで若干ハマった。これを普通にやろうとするとhclustオブジェクトかdendrogramオブジェクトのラベルを先に書き換えておく必要がある。

## hclustオブジェクトのラベルを書き換える場合

これは簡単で`$labels`の中身を書き換えれば良い。

```r
hc$labels <- 1:10
plot(as.dendrogram(hc), horiz = TRUE)
```

## dendrogramオブジェクトのラベルを書き換える場合

一度dendrogramオブジェクトにしてしまうとラベルを操作するのが多少面倒で、`dendextend`パッケージの`labels()`関数を使うことになる。また、ラベルの順序もクラスタリング後のものに合わせて並び替えておく必要がある。クラスタリング後の順序はhclustオブジェクトの`$order`から参照できる。

```r
de <- as.dendrogram(hc)
dendextend::labels(de) <- (1:10)[hc$order]
plot(de, horiz = TRUE)
```

## 「当初の問題」とやら

そもそもやりたかったのは

- 文字列間の編集距離を計算
- 距離に基づいてクラスタリングし、デンドログラムを描く
- デンドログラムはラベルが水平になるように回転させる

ということだった。文字列間の編集距離行列は`stringdist`パッケージの`stringdistmatrix()`などで計算できるので、これを`hclust()`に渡せばクラスタリングができるのだが、`stringdistmatrix()`はデフォルトでラベルを数字に置き換えてしまうので、プロットするとこんな感じになる。

```r
w <- c("aaa", "aab", "aba", "bbb", "bab", "aaaa", "ccc", "abb", "ccccc")
plot(hclust(stringdist::stringdistmatrix(w, method = "dl")))
# dl: Damarau-Levenshtein距離
```

![Rplot03.png](https://qiita-image-store.s3.amazonaws.com/0/109348/942b678f-bd58-6634-714e-a7dff30d11bb.png)


そこでラベルをつけないといけないなと思ってロクにドキュメントも読まずに(よくない)色々調べてたんだけど、改めてヘルプ確認してみたらそもそも`stringdistmatrix()`は`useNames=`で出力にもとの文字列を使うよう指定できたので、結局あまり意味がなかった。

```r
plot(hclust(stringdist::stringdistmatrix(w, method = "dl", useNames = "string")))
```

![Rplot04.png](https://qiita-image-store.s3.amazonaws.com/0/109348/3fe73409-0fce-c34a-31ce-b4d5ff8736f7.png)


## 参考

- [文字列の類似度を測る - langstat blog](http://langstat.hatenablog.com/entry/20141007/1412607600)
- [[R] How to change dendrogram labels in r - CodExample](https://codexample.org/questions/823080/how-to-change-dendrogram-labels-in-r.c)
SCPコマンドでEC2へファイルのアップロード＆ダウンロード

# サーバーからダウンロード

ファイルをダウンロード

```
$ scp　-i ~/.ssh/{***.pem} ec2-user@{IPアドレスorドメイン}:/tmp/{file_path} .
```

ディレクトリをダウンロードする場合、``-r``をつける

```
$ scp　-i ~/.ssh/{***.pem} -r ec2-user@{IPアドレスorドメイン}:/tmp/ .
```

# サーバーへアップロード

ファイルをアップロード

```
$ scp　-i -r ~/.ssh/{***.pem} files/ ec2-user@{IPアドレスorドメイン}:/tmp/ .
```
git cloneしようとした時でたエラーと戦った話

##gitからcloneしてこようとしたら下のようなエラーがでた

```
$ git clone git@github.com/---.git
Cloning into '---'...
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
```
これは（無いに等しい）経験上これは、自分のMacBookとGITがうまく噛み合ってないと考えた
そこでgitにsshkeyを設定することにした。

##SSH keyを設定しましょう。

```
$ ls ~/.ssh

id_rsa      id_rsa.pub  known_hosts
```
``id_rsa.pub``　があれば問題ありません。
何も帰ってこない可能性もある。
何も帰ってこなければ、ん〜
（時期に書きます）


##SSH keyをGITに設定しよう。
次にssh keyをコピーして、gitの[setting] から [SSH and GPG keys]にいき[New SSH key]をクリックし
titleとkeyを設定します。
titleはわかりやすい名前をつけましょう。

次にkeyを打ち込みます。
コピペしようと下のコードを打つ。

```
$pbcopy < ~/.ssh/id_rsa.pub
```
上のコードでいけると思ったのですが、全然うまくコピーされなかったので、仕方なくvimで、、、

```
$vim  ~/.ssh/id_rsa.pub
```
面倒だがわざわざコピーしに行って
それをkeyのところに貼り付けます。
そして、[add SSH key]をクリックし設定は終わりです。

##git cloneを再度試してみる
```
$ git clone git@github.com/---.git
remote: -------
remote: -------
remote: -------
Receiving objects: 100% --------
Resolving deltas: 100% --------
```

うまくcloneできました。



※-----のところはcloneしてくるもの次第で変わります。
Monaca(js)でAPIを叩く

#### OpenWeatherMapのAPIを叩く

前準備として、OpenWeatherMapのサインアップをする必要があります。
このidは東京都のidですね。自分の地区のidは
https://openweathermap.org/city/1850147
ここから検索すると取れます。
weatherの部分を変えることで、違ったjsonを取ることができます。

```html:page.html
<div style="text-align: center" class="page2main"></div>
```


```js:main.js
  var URL = "http://api.openweathermap.org/data/2.5/weather?id=1850147&unit=units&APPID=<<MYAPPID>>"
  $.getJSON( URL, function( data ) {
    res = data;
    var temp = res['weather'][0]
    console.log(temp.main);
    
    var df = document.createDocumentFragment();
    var item = document.createElement('div');
    item.innerHTML = temp.main;
    
    var images = document.createElement('img');
    images.setAttribute("src", "http://openweathermap.org/img/w/" + temp.icon + ".png");
    
    df.appendChild(images);
    df.appendChild(item);
    $(".page2main").empty()
    var mainNode = document.getElementsByClassName('page2main')[0];
    mainNode.appendChild(df)
  }
```


Monaca要素が皆無でしたね(笑)
MonacaでProgressBarを表示


まず、HTMLにProgressBarを表示する場所を用意しておく。

```html:page.html
<div class="progressbar"></div>
```

続いてJavaScriptでProgressBarを表示する。
処理をしている間だけ表示をさせるために、処理を挟むように下記の二つを書く。

```js:main.js
$(".progressbar").append($("<ons-progress-bar indeterminate>"));

// 処理

$(".progressbar").empty();
```

処理が軽すぎると、ProgressBarが少しだけ表示されて消えるので、少し気持ち悪い。
これを直す必要があるかも
イベントソーシングで楽観ロックはどう実装したらいいか？

これは「コードを書いていて困ったときに、suinがチャットで質問に答えたり相談に乗る[suinのプログラミング相談室(仮)](https://help.suin.io/)」で頂いた質問と僕の回答の要約です。

## 質問

イベントソーシングで楽観ロックを実現するにはどうしたら良いでしょうか？ 同時に変更がなされたとき、画面に変更が保存できなかった旨を表示したいです。なぜそうしたいかというと、他の人がせっかく作ったデータを知らずのうちに古いデータで上書きするようなことを避けたいからです。

例えば、本文が「X」の集約ルート(Aggregate Root)をAさんが「Y」に、Bさんが「Z」に変更する操作を同時に行ったとします。このとき、Aさんの変更は受付られますが、Bさんには保存する前にAさんが行った変更を確認してもらえるようにしたいです。

## suinの回答

イベントソーシングで作られたシステムということは、集約ルートにストリームバージョンがついています。ストリームバージョンは集約ルートに対して操作(Command)があるたびに1ずつ加算されていきます。もし、あらゆる操作において楽観ロックを実現したいのであれば、ストリームバージョンを手がかりにするのも一つの方法です。

ストリームバージョンを活用できないケースも考えられます。ストリームバージョンは集約ルートに対する操作全てで加算されるので、ざっくりとした楽観ロックを手軽に実装するには向いていますが、特定の操作に対してのみ楽観ロックを行いたい場合は、ストリームバージョンでは荒すぎます。

例に、ブログの記事集約ルートを考えてみます。記事にはタイトル、本文、ページビュー数の状態があり、操作はタイトルを変更する、本文を変更する、ページビュー数を+1するがあるとします。

* 記事集約ルート
    * 状態
        * タイトル　: String
        * 本文 : String
        * ページビュー数 : Int
    * 操作
        * タイトルを変更する
        * 本文を変更する
        * ページビュー数を+1する


このとき、タイトルや本文では楽観ロックをしたく、ページビュー数を+1する操作は楽観ロックの範囲外にしたい。その場合は、ストリームバージョンでは次のシナリオで意図しない楽観ロックがかかってしまいます。

* ストリームバージョン1の記事について、AさんとBさんが同時に操作しようとしています。
* サイト訪問者のAさんが記事を閲覧する。つまり、記事のページビュー数を+1する。Aさんの操作は受け付けられ、記事のストリームバージョンは2になります。
* 同時にBさんが記事のタイトルを変更する。Bさんの変更はストリームバージョン1に対して行おうとしたので、警告を受け変更は拒絶されます。

ストリームバージョンに頼るとかえって意味のない警告を執筆者に伝えてしまい、ユーザ体験としてはよくありません。執筆者が関心を持っているのは、集約のバージョンがあがったことではなく、共同執筆者の間で相手の創作を意図せず上書きしていないかどうかです。

こうしたケースでは、ストリームバージョンとは別にバージョンをドメインモデルに持つべきでしょう。例えば、記事であれば「版」といった属性を持つようにします。記事のコンテンツに関連する属性が変更されるたびに付随して初版、第二版、第三版と言った具合にバージョンが加算される属性です。

* 記事集約ルート
    * 状態
        * タイトル　: String
        * 本文 : String
        * ページビュー数 : Int
        * 版: Int
    * 操作
        * タイトルを変更する … この操作は版を+1する
        * 本文を変更する … この操作は版を+1する
        * ページビュー数を+1する … この操作は版に影響しない
ローカル座標と世界座標

[三角形の回転と座標(1) | three.js](http://labo.project-nya.jp/threejs/triangle1/)
三角形の数を減らして、座標の下調べ（ローカル座標と世界座標）

object.localToWorld(vector);
だけでなく、
object.worldToLocal(vector);
も必要かも。
lsofコマンド入門

## はじめに
サーバーで特定のポート番号を待ち受けているかどうか、指定ファイルは誰が読み込んでいるのかを調べたいときがあります。その際に役立つlsofコマンドについて調べてみました。

## lsofコマンドとは
プロセスが開いているファイルを表示するコマンドです。

## オプション

オプション|意味
---|---
-P|ポート番号をサービス名に変換しない
-c|プロセス名を指定する
-i|ネットワークソケットファイルを指定する
-n|IPアドレスを表示する（名前解決しない）
-p|プロセスIDを指定する
-u|ユーザー名を指定する

## 出力されている情報

項目|意味
---|---
COMMAND|実行されているコマンド
PID|プロセスID
USER|実行ユーザー
FD|ファイルディスクリプタ
TYPE|タイプ
DEVICE|デバイス
SIZE/OFF|ファイルサイズ
NODE|プロトコル
NAME|ファイル又はポート

### NAME
* (LISTEN): 待ち受け状態

## 利用方法

### 全プロセスを表示する

オプションを付与しないと全てのプロセスについて表示する

```console
$ lsof
```

### 特定のポート番号で実行中のプロセスを調べる

```console
$ lsof -i:80 -P 
```

### 特定のファイルを開いているプロセスを特定する

```console
$ lsof /var/log/httpd/access_log
```

### コマンドを指定する

```console
$ lsof -c httpd
```

### ユーザーを指定する

```console
$ lsof -u nginx
```

### ネットワークコネクションを出力する

```sh
$ lsof -i
```

#### ポート番号を指定する

```sh
$ lsof -i:80
```

複数ポート番号を指定できる

```sh
$ lsof -i:80,8080
```

## まとめ

lsofコマンドは多機能なので全てを使いこなすのは難しそうですが、普段の運用で利用するのはほんの一握りの機能でも十分です。まずは基礎を覚えるだけでも、調査と原因究明が捗るようになるので、是非今後も利用していきたいです。

## 参考
* [ネットワーク管理の基本Tips：このポートで実行中のプロセスはどれ？ lsofコマンドの使い方 \- ＠IT](http://www.atmarkit.co.jp/ait/articles/1510/05/news014.html)
* [lsofの使い方 \- プロセスが使用中のファイルを調べる \- うまいぼうぶろぐ](http://hogem.hatenablog.com/entry/20070223/1172221315)
* [lsofコマンドで覚えておきたい使い方9個 \| 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2016/04/lsof%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B99%E5%80%8B/)
ViewControllerをPicture in Pictureで簡単に表示するフレームワーク作った

## 作ったもの
[CocoaPods](https://cocoapods.org/pods/PictureInPicture)

![screenshot](https://raw.githubusercontent.com/malt03/PictureInPicture/master/README/Screenshot.gif)

こんなかんじで、ViewControllerをそのまま小さくワイプ表示するやつです。
実際に動かしてみたい方は、appetize.ioで動かせます。[こちら](https://appetize.io/app/6pq8wc4hj2ufuypbgpxmb3e9g4)。

是非使ってください！
プルリク大歓迎。

## 使い方
### 使える関数
```swift
PictureInPicture.shared.present(with: viewController) // 表示する
PictureInPicture.shared.dismiss()                     // 閉じる
PictureInPicture.shared.makeSmaller()                 // 小さくする
PictureInPicture.shared.makeLarger()                  // 大きくする
PictureInPicture.shared.presentedViewController       // 表示中のViewController
```

### 設定
```swift
// 影の設定
let shadowConfig = PictureInPicture.ShadowConfig(color: .black, offset: .zero, radius: 10, opacity: 1)
PictureInPicture.configure(movable: true,      // 小さくしたやつを動かせるかどうか
                           scale: 0.3,         // 小さくしたときのスケール
                           margin: 10,         // 小さくした時の上下左右のマージン
                           defaultEdge: .left, // 小さくした時に左右どちらに行くか
                           shadowConfig: shadowConfig)
```

### Notification
|Name                                 |いつ飛ぶか     |
|:-----------------------------------:|:------------|
|PictureInPictureMadeSmaller          |小さくなったとき  |
|PictureInPictureMadeLarger           |大きくなったとき  |
|PictureInPictureDidBeginMakingSmaller|小さくし始めたとき|
|PictureInPictureDidBeginMakingLarger |大きくし始めたとき|
|PictureInPictureMoved                |動かしたとき    |
|PictureInPictureDismissed            |閉じたとき      |

#### UserInfo
PictureInPictureMovedだけUserInfo内にデータがあります。

|Key|型|説明|
|:-:|:--|:--|
|PictureInPictureOldCornerUserInfoKey|PictureInPicture.Corner|移動元の角|
|PictureInPictureNewCornerUserInfoKey|PictureInPicture.Corner|移動先の角|

### その他定数

|定数名|説明|
|:-:|:--|
|UIWindowLevelPictureInPicture|Picture in Pictureを表示しているWindowLevel。<br>現状はUIWindowLevelDefault + 1|

### インストール
```ruby:Podfile
pod "PictureInPicture"
```

```ruby:Cartfile
github "malt03/PictureInPicture"
```
Error running Android Debugger - Unable to open debugger port


Android Studio でデバッグしようとした時に次のエラーがでた。

```
Error running Android Debugger (8700):
Unable to open debugger port (localhost:8700): java.io.IOException "handshake failed - connection prematurally closed"
```

<div align="center"><img src="https://qiita-image-store.s3.amazonaws.com/0/33505/ac2399ef-4c66-c962-206d-49d9407dd14e.png" width=100%></div>

## 対処方法

Android Studio > Tools > Android > Enable ADB Integration でチェックを外し、再度実行する
<div align="center"><img src="https://qiita-image-store.s3.amazonaws.com/0/33505/d91977e0-9785-60a5-b881-42b4bdcfad50.png" width=60%></div>


デバッグできるようになった。