OmniAICreator/Qiita-1.07M huggingface dataset:
awscliでAWS WAFのCloudWatchのメトリクスを取得する

# 概要
AWS WAFのメトリクスを、CloudWatch以外の監視システムにデータ連携する場合に、
awscliを使用してデータ取得を行ったときにちょっとはまりましたのでメモしておきます。

# regionはus-east-1固定
AWS WAFがCloudFrontに装着するようなサービスなので、regionはCloudFrontのメトリクス取得時と同じus-east-1一択です。
ところが上記を考慮してかつ--start-time、--end-time をメトリクスデータが取得できる期間に設定しても、awscliの実行結果のDatapointsはカラッポです。

```text:awscli実行
 aws --region us-east-1 cloudwatch get-metric-statistics \
 --namespace AWS/WAF \
 --metric-name AllowedRequests \
 --start-time `date -u -d '2 hour ago' +%Y-%m-%dT%TZ` \
 --end-time `date -u +%Y-%m-%dT%TZ` \
 --period 60 \
 --statistics Sum \
 --dimensions Name=Rule,Value=Default_Action Name=WebACL,Value=WebACL名
```

```text:awscli実行結果
{
    "Datapoints": [],
    "Label": "AllowedRequests"
}
```


# namespaceについて
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/aws-namespaces.html
で確認すると、namespaceはAWS/WAF となっています。
しかし以下awscliコマンド

```text
aws --region us-east-1 cloudwatch list-metrics
```
で確認すると、namespaceはAWS/WAFじゃなーい！WAFだあー！！！


# Datapointsの中身が取得できるawscliの発行


```text:awscli実行
 aws --region us-east-1 cloudwatch get-metric-statistics \
 --namespace WAF \
 --metric-name AllowedRequests \
 --start-time `date -u -d '2 hour ago' +%Y-%m-%dT%TZ` \
 --end-time `date -u +%Y-%m-%dT%TZ` \
 --period 60 \
 --statistics Sum \
 --dimensions Name=Rule,Value=Default_Action Name=WebACL,Value=WebACL名
```
を実行すると、以下が取得できます。

```text:awscli実行結果
{
    "Datapoints": [
        {
            "Timestamp": "2016-04-24T19:31:00Z",
            "Sum": 1.0,
            "Unit": "None"
        },
省略
        {
            "Timestamp": "2016-04-24T19:40:00Z",
            "Sum": 1.0,
            "Unit": "None"
        }
    ],
    "Label": "AllowedRequests"
}
```
ようやくDatapointsの中身が出力されました。
FinderとSublimeTextにscss/sass/lessファイルを認識させる

# Info.plist編集

- ApplicationsフォルダのSublimeTextを右クリック->Show Package Contents
- Contents/Info.plistをエディタで開く
- CFBundleDocumentTypesのdictがarrayで並んでる末尾に以下を追加して保存

```
    <dict>
      <key>CFBundleTypeRole</key>
      <string>Editor</string>
      <key>CFBundleTypeName</key>
      <string>SCSS</string>
      <key>CFBundleTypeExtensions</key>
      <array>
        <string>scss</string>
        <string>sass</string>
      </array>
      <key>CFBundleTypeIconFile</key>
      <string>SASS</string>
    </dict>
    <dict>
      <key>CFBundleTypeRole</key>
      <string>Editor</string>
      <key>CFBundleTypeName</key>
      <string>LESS</string>
      <key>CFBundleTypeExtensions</key>
      <array>
        <string>less</string>
      </array>
      <key>CFBundleTypeIconFile</key>
      <string>LESS</string>
    </dict>
```

# DB再構築とFinder再起動 

## LaunchServicesデータベース再構築

```
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -f -domain local -domain system -domain user
```

## Finder再起動

```
$ killall Finder
```
標準入力文字列をダブルクオーテーションで囲む

ファイル名に半角空白が入ってたりしてヽ(｀Д´#)ﾉ ﾑｷｰ!!ってなったことありませんか？

## 課題

```bash
touch "hoge fuga"
ls | xargs zip -r hoge
```

とかやってzip圧縮したいのに、スペースが混じるせいで

```
zip warning: name not matched: hoge
zip warning: name not matched: fuga
```

とか怒られてしまう。

## 解決

```bash
ls | xargs -I {} echo '"{}"' | xargs zip -r hoge
```
CentOSにちょっと古いバージョンのNginxをインストールする

# はじめに

yum で Nginx の 1.9.4 をインストールしたい。
2016/4/25現在の最新バージョンは 1.9.15 でした。

OS は CentOS 6.7 です。

# 1.9系のインストール準備

デフォルトで `yum install nginx` すると 1.8系 がインストールされるので、下記のURLを参考に設定します。

http://nginx.org/en/linux_packages.html#mainline

```console:yumの設定
$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sed -i -e "s/packages\/centos/packages\/mainline\/centos/" /etc/yum.repos.d/nginx.repo
```

# インストール可能なバージョンの確認

```console:バージョンの確認
$ yum --showduplicates list nginx
　：
Available Packages
nginx.x86_64                                                1.9.0-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.1-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.2-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.3-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.4-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.5-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.6-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.7-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.8-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.9-1.el6.ngx                                                  nginx
nginx.x86_64                                                1.9.10-1.el6.ngx                                                 nginx
nginx.x86_64                                                1.9.11-1.el6.ngx                                                 nginx
nginx.x86_64                                                1.9.12-1.el6.ngx                                                 nginx
nginx.x86_64                                                1.9.13-1.el6.ngx                                                 nginx
nginx.x86_64                                                1.9.14-1.el6.ngx                                                 nginx
nginx.x86_64                                                1.9.15-1.el6.ngx                                                 nginx
```

1.9.4 があります。

# インストール

バージョンを指定してインストールします。

```console:インストール
$ yum install --enablerepo=nginx nginx-1.9.4
```

無事インストールされました。

```console:確認
$ nginx -v
nginx version: nginx/1.9.4
```
mampの<?でハマった時のメモ

[原因]
<? が原因でエラーになってdocumentの上にかかれていたので表示されない。
php.iniに設定可能なshort_open_tagがdefaultだとOnになってる。
[解決方法]
<?php phpinfo(); ?>
で吐き出す。

Configuration File (php.ini) Path
Loaded Configuration File
ここの部分のパスを確認。

そのパスのphp.iniを編集
onをoffに。

apacheを再起動(*´꒳`*)
bioinformaticsのツールをvirtualbox内で動かす時の注意点、メモリ割当編

# 概要

デフォルトの設定では、メモリの割当がbioinformaticsのツールに対して少なく、
増やしておかないと、メモリ不足でうまく動かないことがある。

# 結論

メモリの設定を増やす。
実際に動かす前に、正しくふえていることを確認する。

```
top
```

とか

```
cat /proc/meminfo
```

など。

# その他

ホストマシンとデータを共有するときはその方式を考えたほうがよいかもしれない。
vboxfsだと、おそいかもしれない。最近確認していないのでわからないので、余裕があったら調べる。
Linuxだと、NFSの方がよいかもしれない。これも確認したほうがよい。
Mac や　windows がホストの場合、最近は状況がかわってきているかもしれないので、このあたりも余裕があったら調べる。
VPC ハイブリットクラウド利用の際の注意点　DHCPやDNSについて

AWSでVPCを立てても、DHCPとDNSを構築しなくても動く。
では、既存のDNSやDHCPがある際に、それらを参照するときに何を注意すればいいのか？
そんな記事です。

##DNS関連
- VPCで提供されるDNSはAmazonProidedDNSという
- DNSサーバのIPアドレスはネットワークの先頭+2
- そのDNSサーバではサーバのホスト名とプライベートIPで名前解決をしてくれる
- PublicDNSからPrivateIPアドレスを解決できる
- オンプレからAmazonProidedDNSを参照して名前解決できません ←重要
- VPCのDNSサーバはVPCのDHCPオプションに設定する

###DHCP
よくわからん

##DirectConnect
Directconnectの冗長化について。
AWS側のエンドポイントVGWは冗長化されている。
AWSから見たユーザ側のエンドポイントであるCGWは冗長化されていない。
ただし通信経路は冗長化されている。
そのため、完全に冗長化するためにはCGWとなるルータを２つ設置して冗長化の設定をする。

###おまけ
- NSレコードはドメイン名をどのDNSサーバ（FQDNで記載）で名前解決するか記載する
- そのドメインにはDNSサーバのAレコードが必要
プロセスの ulimit -n の値を増やした話

参考: https://underyx.me/2015/05/18/raising-the-maximum-number-of-file-descriptors

ulimit -n の値は、オープンできるファイル数の上限を表します。オープンしているファイル数がこの上限に達すると、それ以上はソケットも開けなくなるので、通信もできなくなります。
今回、supervisordでデーモン化している process-x プロセス(仮名)の ulimit -n 値を増やした時の手順を記します。

#### 環境チェック

```shell-session
$ cat /etc/issue
Ubuntu 14.04.2 LTS \n \l

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
```

#### デフォルト値

```shell-session
$ ulimit -n
1024
$ ulimit -Sn
1024
$ ulimit -Hn
4096
```

#### 設定

##### /etc/security/limits.conf に追加

```text:/etc/security/limits.conf
*    soft nofile 65536
*    hard nofile 65536
root soft nofile 65536
root hard nofile 65536
```

##### /etc/pam.d/common-session に追加

```text:/etc/pam.d/common-session
# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so
```

##### /etc/pam.d/common-nonsession に追加

```text:/etc/pam.d/common-nonsession
# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so
```
* 開発環境の`Ubuntu 14.04.3`では、上の追加部分はコメント行として存在していました。
* ここまでで、各ユーザーがログインしなおすと、設定が更新されています。

```shell-session
$ ulimit -n
65536
```

##### /etc/supervisor/supervisord.conf に追加

```text:/etc/supervisor/supervisord.conf
[supervisord]
minfds=65536
```

supervisord 再起動

```shell-session
$ sudo service supervisor restart
```

* daemonは起動スクリプト中で、 `ulimit -n` の呼び出しが必要。今回は`superversord`の設定により同等の内容となっています。

* 実行中のプロセスに変更が適用されているかどうかの確認
    * PIDを取得
    * cat /proc/{PID}/limits

```shell-session
$ ps -ef | grep process-x | grep -v grep
www-data 15322 22208  0 07:44 ?        00:03:03 /**/process-x
```

```shell-session
$ cat /proc/15322/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             31534                31534                processes 
Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       31534                31534                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us 
```
python スクリプトを import する

# 問題

普通だと import できないファイル名の python スクリプト、
例えば　``zz-myscript-01.py``
みたいなやつの内部で実装されている関数をインポートしたい。
しかし、

```py
import zz-myscript-01
```
みたいな書き方はできない (Syntax Error)

名前を変えずにロードしたい。

# 解決方法

``imp`` を使う。例えば、上記スクリプトを、 ``mymodule``  という名前でロードするには
以下のようにすれば OK。

```py
def customImport():
  import imp
  global mymodule
  fp, name, desc = imp.find_module("zz-myscript-01")
  mymodule = imp.load_module("mymodule", fp, name, desc)

customImport()
```

# なぜうまく行くのか

``imp`` は、 Python の import 文の実装へのインタフェースなので、
それを使って独自に import をしているから。

# 参考
http://docs.python.jp/2/library/imp.html#examples-imp
Macbookを純正以外のUSB ACアダプタでも充電できるか？

MacBook (Retina, 12-inch, Early 2016) は半日くらいしか電池が持ちません。
手持ちの AC アダプタでも、この Macbook を利用・充電できるかを検証してみます。

### （その１）　純正　AC アダプタ利用

Macbook 付属の [純正 29W AC アダプタ](http://www.apple.com/jp/shop/product/MJ262J/A) と、[純正 USB Type-C / Type-C ケーブル](http://www.apple.com/jp/shop/product/MJWT2AM/A) で直結した場合、29W でバッテリ充電可能。（これが正しい充電方法）

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/12419/1e4af0ee-c326-b866-89e8-d94b55064e24.jpeg)

<img width="321" alt="29W-Original.png" src="https://qiita-image-store.s3.amazonaws.com/0/12419/7456360e-164f-885a-cb53-4644ee295335.png">

### （その２）　iPad AC アダプタ流用

iPad 付属の 10W AC アダプタと、Anker の [USB-3 / Type-C ケーブル](http://amzn.to/1SGH5IM) で直結した場合、10W で充電可能。Macbook を使いながらだと、充電完了まで標準の８倍くらいの時間がかかりそう。（なお、最近の iPad なら 12W AC アダプタが付属してるので、少しは速くなるが大差ない）

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/12419/f805979b-4723-46a6-afa8-d5657c5d73c2.jpeg)

<img width="131" alt="USB3-Type-C-Cable.png" src="https://qiita-image-store.s3.amazonaws.com/0/12419/9575291c-778d-17ec-3a7f-feac144511d4.png">

### （その３）　 MicroUSB／Type-C 変換アダプタ利用

iPad 付属の 10W AC アダプタと、Android 用のありがちな USB-2 / Micro USB ケーブルに、Anker の [USB Type-C 変換アダプタ](http://amzn.to/1SGH0ol) をかました場合、利用できるが、充電はできない。（おそらく USB-2 の容量制限）

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/12419/c1d6945c-de01-adb4-b630-4907f4899dcb.jpeg)

<img width="142" alt="USB2-Cable-Plus-Adapter.png" src="https://qiita-image-store.s3.amazonaws.com/0/12419/ac66a88a-56a3-107d-8e11-aa000a4e9d98.png">

### （その４）　実験

試しに、iPad 付属の 10W AC アダプタに、Apple 純正の [USB-C / USB メス ケーブル](http://www.apple.com/jp/shop/product/MJ1M2AM/A) と、Anker の [USB-3 オス / Type-C ケーブル](http://amzn.to/1SGH5IM)を連結した場合、なぜか 12W 表記になって、充電可能。（危険なのでやめておけ）

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/12419/c3213127-ad4e-fcac-ebd2-55a2e0d63dce.jpeg)

<img width="138" alt="Type-C-Adapter-Type-C.png" src="https://qiita-image-store.s3.amazonaws.com/0/12419/0b2725e8-4e0c-5b5f-04cf-90902c6d688e.png">

### （その５）　Anker で済ませる

Anker の [40W AC アダプタ](http://amzn.to/21bnYGK) に、Anker の [USB-3 / Type-C ケーブル](http://amzn.to/1SGH5IM) で直結した場合、12W で充電可能。（これはサブ用途ならありだな）

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/12419/5c555f13-5aee-0914-93c7-18cc47471452.jpeg)

<img width="130" alt="Anker-USB3-Type-C.png" src="https://qiita-image-store.s3.amazonaws.com/0/12419/dac0a981-d1dd-3f49-c468-d78bd6c5e19d.png">

### （まとめ）

- 通常利用時は、Macbook 純正 AC アダプタ＋純正 Type-C ケーブルを使う。
- 出先でも AC アダプタを置いておきたいが、純正 AC アダプタは持ち歩きたくない場合、[USB-3 / Type-C ケーブル](http://amzn.to/1SGH5IM) を持っておくのはアリ。（ゆっくりだが充電もできる）
- エマージェンシー用に [USB Type-C 変換アダプタ](http://amzn.to/1SGH0ol) をカバンの隅に常備しておくのは、保険になるかも。（とにかく小さい。充電はできないが、利用はできる）
SimStringをLinuxで動かす際の注意点

類似文字検索のために[SimString][simst]をLinux上で動かそうとした際に以下のような文が含まれるエラーがでてしまった場合の対処方法のメモ.

```
g++ -DHAVE_CONFIG_H -I. -I.. -I../include -03 -ffast-math -03 -ffast-math -MT main.o -M -MF .deps/main.Tpo -c -o main.o main.cpp
In file included from ../include/simstring/memory_mapped_file.h:62:0,
　　　　　　　　　　from ../include/simstring/simstring.h:52
　　　　　　　　　　from main.cpp:43 
```

**対処方法**
1.次のファイルを適当なエディタで編集.
`simstring/include/simstring/memory_mapped_file_prosix.h`

2.以下の文をmemory_mapped_file_profix.hに追加
`#include <unistd.h>`

あとは[こちらのページ][simst]の通り、

```
./configure
make
make install
```

とすることで、frontend/simstring に実行ファイルが作られます.


[simst]:http://www.chokkan.org/software/simstring/index.html.ja
組み込み(Embedded)インストールをしたNAS4FreeでSSHの公開鍵認証をする

NAS4Freeは組み込み(Embedded)インストールをするのが一般的ですが、これだとSSHの公開鍵を設置しても再起動したときに消えてしまいます。

そこでウェブインターフェースの システム|高度な設定|Command Scripts (system_rc.php) からPreInitに次のコマンドを設定することで、毎回起動時に公開鍵を設置を設置します。
```mkdir -m 700 -p /root/.ssh && echo 'ssh-rsa key1' > /root/.ssh/authorized_keys && echo 'ssh-rsa key2' >> /root/.ssh/authorized_keys && echo 'ssh-rsa key3' >> /root/.ssh/authorized_keys```
秘密鍵でログインできることを確認したら、SSH設定の「キーボードインタラクティブでの認証を有効にします。」をオフにします。

改行コードはもっとスマートに解決したかったのですが、printfでやっても\nが空白文字になってしまうため、このような対処療法になっています。
ConfigSlurperでパース後の値は、GStringで指定できるよって話

```groovy:config.groovy
user {
	name = "cat"
	type = "mike"
}
```

```groovy:readConfig.groovy
def config = new ConfigSlurper().parse(new File('config.groovy').toURL())
assert config instanceof Map

assert 'cat' == config.user.name
assert 'cat' == config.user.'name'

def attr = ['name', 'type']
assert 'cat'  == config.user."${attr[0]}"
assert 'mike' == config.user."${attr[1]}"
```

実行

```bash
groovy readConfig.groovy
```

調べてみて知ったのですが、パース後はMapになるのだそうで。
http://npnl.hatenablog.jp/entry/20101121/1290356773
[Git]マージ済みのリモートブランチを一括削除

何番煎じだっていうネタを自分用にメモ。
毎回組み立ててるので、エイリアスに登録すればいいんだけど
いまいち腰が重い。


```bash
git checkout master
git branch -r --merged | grep -v master | sed -e "s|origin/||" | xargs git push --delete origin 
```

```bash
git branch -r --merged #現在いるブランチにマージ済みのリモートブランチを表示
grep -v master  #masterを含む行を除外(場合によってはdevelopも追加する
sed -d "s|origin/||"  #origin/ を置換
 git push --delete origin foo    #fooブランチを削除
```
今入ってる VirtualBox Guest Additions のバージョンを確認する

VirtualBox がたびたび更新される。

それは良いことなのだけど、本体を更新するたび、追加機能をサポートする Guest Additions を仮想環境ごとにインストールし直さないといけないのが少し面倒くさい。

仮想環境を複数扱っていると、この環境には新しいバージョンを入れたのか曖昧になることがある。まあいいか、と気にせずに使っていると Guest Additions の機能が必要な場面にぶち当たって作業中断。インストール作業自体は数分で終わるものだが、再起動を伴うので不意打ちを食らうと結構面倒くさい。

事前に解決できることは事前に解決しておきたい。

しかし、たまにしか更新しないこともあって、インストールされている Guest Additions のバージョンの確認方法をよく忘れる。

今回はそのメモ。

…。

ちなみに、仮想環境が一般的なデスクトップ環境の場合は、適切なバージョンの Guest Additions が入っていないと通知が来る模様。便利。

環境
----

- VirtualBox 5.0.16
- VirtualBox Guest Additions 5.0.16
- Ubuntu 15.04

参考
----

- [apt - virtualbox guestaddition version from VM client - Ask Ubuntu](http://askubuntu.com/questions/498579/virtualbox-guestaddition-version-from-vm-client)

確認 (modinfo)
----

Guest Additions は Linux のカーネル・モジュールとして登録されている。その詳細情報を `modinfo` で得る。

~~~bash
$ modinfo vboxguest
filename:       /lib/modules/3.19.0-58-generic/misc/vboxguest.ko
version:        5.0.16
license:        GPL
description:    Oracle VM VirtualBox Guest Additions for Linux Module
author:         Oracle Corporation
srcversion:     6B7D24280DBF204B19C8E80
alias:          pci:v000080EEd0000CAFEsv00000000sd00000000bc*sc*i*
depends:        
vermagic:       3.19.0-58-generic SMP mod_unload modversions 
~~~

この version の値が、現在使用している Guest Additions のバージョン。

確認 (ls)
----

### /usr/\*/VBoxG\*

現在使用中のバージョンに _/usr_ 下からシンボリック・リンクが張られている。

~~~bash
% ls -l /usr/*/VBoxG*
lrwxrwxrwx 1 root root 53 Apr 15 17:22 /usr/lib/VBoxGuestAdditions -> /opt/VBoxGuestAdditions-5.0.16/lib/VBoxGuestAdditions/
lrwxrwxrwx 1 root root 55 Apr 15 17:22 /usr/share/VBoxGuestAdditions -> /opt/VBoxGuestAdditions-5.0.16/share/VBoxGuestAdditions/
~~~

ディレクトリ名の数字がバージョンの値。

### /opt/VBox\*

上記のシンボリック・リンクが示す通り、 Guest Additions は _/opt_ 下にインストールされる。

~~~bash
$ ls /opt/VBox*
/opt/VBoxGuestAdditions-4.3.0:

/opt/VBoxGuestAdditions-5.0.10:

/opt/VBoxGuestAdditions-5.0.16:
bin/   installer/  LICENSE       sbin/   src/
init/  lib/        routines.sh*  share/  uninstall.sh*
~~~

_VBoxGuestAdditions_ から始まるディレクトリは複数あるが、最後にインストールしたバージョン以外の中身は空っぽ。

少し行儀が悪い感じもするけど、バージョンの履歴としてあえて残しているのかもしれない。
Angular1.5で与えられた変数によってcomponentを切り替える

変数によってcoponentを切り替えたいときどうするのが良いでしょうか。たとえば、与えられた変数によって、inputフィールドを、文字列、数値、日付、別のデータへの参照・・・などを切り替えたいというケースです。こういう時、それぞれ別のcomponentにして、変数の値に応じて切り替える設計にするのが自然です。

素直に考えると、1. ng-includeで、切り替えたいcomponentの数だけtemplateを作る。2.ng-switchで、切り替えたいcomponentの数だけ分岐するということになりそうですが、無駄なコードが増えるのでメンテナンス上、好ましくありません。何よりcomponent指向っぽくありません。

直感的には、以下のような感じにしたいところです。ただ、AngularJSのテンプレートでは、要素名を変数にすることができないため、これでは動作しません。

```html
{
    template: <{{componentName}}></{{componentName}}>
}
```

となると、template: function(element, attr){}の中で、attrを読んで切り替えることを検討したくなりますが、これだとscopeを反映してattrの中身をparseすることができません。

こういう場合は、以下のコードように自前で$compileしてやれば良いです。これなら動きます。

で、問題は、どうすればこのコードをAngular2に移行できるかということです。DynamicComponentLoaderを使うのが良いのか？もっとエレガントな方法はないのか？そのあたり、詳しい人に聞いてみたいところです。


```js
    .directive('inputElement', function($compile, $parse) {
        return {
            scope: {
                value: '=',
                param: '=',
                type: '=',
            },
            link: function(scope, element, attr){
                scope.$watch('type', function(type){
                    var componentName = 'input-' + type;
                    var template =  `
                        <${componentName} value="value" param="param"></${componentName}>
                    `;
                    var contents = angular.element(template)
                    $compile(contents)(scope);
                    element.html(contents)
                })
            }
        };
    })
    .component('inputString',{
        template: `
           <input type="text" ng-model="$ctrl.value" class="form-control" ></input>
        `,
        bindings: {
            value: '=',
            param: '=',
        }
    })
    .component('inputInteger',{
        template: `
            <input type="number" ng-model="$ctrl.value" class="form-control" ></input>
        `,
        bindings: {
            value: '=',
            param: '=',
        }
    })
    .component('inputDate',{
        template: `
            <input type="date" ng-model="$ctrl.value" class="form-control" ></input>
        `,
        bindings: {
            value: '=',
            param: '=',
        }
    })
```
特定の文字を含まない行を削除する


良く使うのでメモ。
EclipseやAtom等、正規表現の [否定先読み] が使える場合、以下の正規表現置換で出来ます。

> Emacs以外は大体出来るきがする...

## やり方

``XXX`` を含まない行を消してみます。
各Editorで置換する時に以下の置換対象/置換後を指定します。

置換対象 (正規表現):

```
^(?!.*XXX).*\r\n
```

置換後:

```
(空欄)
```

## Macはこう

```
^(?!.*XXX).*\n
```

> 改行 ``\n`` は正規表現の記法ではないので、OS/Editorによってまちまち。
> 
> * Windows
>     * ```^(?!.*XXX).*\r\n```
> * Mac
>     * ```^(?!.*XXX).*\n```
> * Eclipse
>     * ```^(?!.*XXX).*\R```
>     * ※ ``\R`` はPlatform independentな改行を表すEclipseの特殊文字.


[否定先読み]: http://d.hatena.ne.jp/satosystems/20100519/1274237784
.NETの色見本

# System.Drawing.Color 構造体

* [Color Table](http://msdn.microsoft.com/ja-jp/library/ms531197(en-us,VS.85).aspx)
* [Colors by Name](http://msdn.microsoft.com/ja-jp/library/aa358802(en-us,VS.85).aspx)
* [Colors by Hue](http://msdn.microsoft.com/ja-jp/library/aa358800(en-us,VS.85).aspx)
* [Colors by Lightness](http://msdn.microsoft.com/ja-jp/library/aa358801(en-us,VS.85).aspx)
* [Colors by Saturation](http://msdn.microsoft.com/ja-jp/library/aa358803(en-us,VS.85).aspx)
ES6の import / export


## 結論
* 基本的には`export default`を使う
* 複数のモジュールを`export`するときは`export`を使う
* 受け取り側は`import`を使う

## Default exports
１つのモジュールを`export`する時。
こちらが推奨されている。

```js
//------ myFunc.js ------
export default function () { ... };

//------ main1.js ------
import myFunc from 'myFunc';
myFunc();
```

classの場合は下記。

```js
//------ MyClass.js ------
export default class { ... };

//------ main2.js ------
import MyClass from 'MyClass';
let inst = new MyClass();
```

`export default`は`export`に`default`という特殊な名前が付いたケースと同じこと。

```js
import { default as foo } from 'lib';
import foo from 'lib';
```

### Default exportsが推薦されている理由

[David Herman](https://esdiscuss.org/topic/moduleimport#content-0)の言葉を引用。

>
ECMAScript 6 favors the single/default export style, and gives the sweetest syntax to importing the default. Importing named exports can and even should be slightly less concise.

より簡潔な方がいいよねということ。

## Named exports
複数のモジュールを`export`する時。
個別に名前を付けて`export`する。

```js
//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

//------ main.js ------
import { square, diag } from 'lib';
console.log(square(11)); // 121
console.log(diag(4, 3)); // 5
```

こういう風にまとめても使える。

```js
//------ main.js ------
import * as lib from 'lib';
console.log(lib.square(11)); // 121
console.log(lib.diag(4, 3)); // 5
```

## 参考
[ECMAScript 6 modules: the final syntax](http://www.2ality.com/2014/09/es6-modules-final.html)
コールバック関数作成

##コールバック関数とは
処理が終わった後に実行される関数。
非同期処理の完了後実行したいとき等に使う。

```lang:javascript
function example() {
  console.log('callBack!!');
}

setTimeout(example, 5000); //5秒後に「callBack!!」
```

##自分でコールバック関数を作る

```lang:javascript
function example() {
  console.log('callBack!!');
}

function custom(_callback, _time) {
  setTimeout(_callback, _time);
}

custom(example, 5000); //5秒後に「callBack!!」
```

###コールバック関数に外部からの引数がある場合

```lang:javascript
function example(_msg) {
  console.log(_msg + ' callBack!!');
}

function custom(_callback, _msg, _time) {
  setTimeout(()=> {
    _callback(_msg);
  }, _time);
}

custom(example, 'argument!!', 5000); //5秒後に「argument!! callBack!!」
```
iOSでしかCarthageで導入できないライブラリをOSX,tvOS,watchOSにも対応してもらいたい時にすること

## iOS以外でもCarthageが使いたい

SwiftでCSVを扱うコマンドラインツールを作るために、@naoty_k さんの[SwiftCSV](https://github.com/naoty/SwiftCSV)を使わせていただこうと思ったのですが、
`carthage update`を実行した時に以下のようなエラーでビルドに失敗しました。

```
Dependency "{ライブラリ名}" has no shared framework schemes for any of the platforms: {指定したプラットフォーム名}
```

これは、指定したプラットフォーム向けのSchemeがライブラリに存在しないため発生するエラーです。
内部で`UIKit`を使用していないライブラリなら、簡単に他のプラットフォームに対応できるので、やってみました。

# 手順

## Targetを追加する

* Cocoa Framework
* TV Framework
* Watch Framework

Product Nameは"{ライブラリ名} {プラットフォーム名}"にしましょう。
OrganizationとBundle Identifierは元からあるターゲットと同じものを指定しましょう。
(Optional) Inclide Unit Testsにチェックを入れます。(watchOSはTest Targetを作らなくて良いです)

<img width="728" alt="スクリーンショット 2016-04-17 14.58.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/2a1bd264-aea2-5c0c-6167-b1621011c3d7.png">

## Targetごとのフォルダを削除

Targetごとのフォルダは不要なのでMove to Trashしてしまいましょう。

<img width="259" alt="スクリーンショット_2016-04-17_15_02_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/352c093c-7432-c8aa-1861-460516e1ff68.png">

## Compile Sourcesを追加

"{ライブラリ名} {プラットフォーム名}"Targetと"{ライブラリ名} {プラットフォーム名}Tests"TargetのBuild Phases > Compile Sourcesにコンパイル対象のファイルを追加します。


<img width="873" alt="スクリーンショット_2016-04-17_15_05_28.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/2476761d-db90-5e76-08dd-1da8f4772bc5.png">

↓

<img width="874" alt="スクリーンショット_2016-04-17_15_07_08.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/05aba08d-a035-c0ba-b284-c252b4700794.png">

## Product Nameを修正

"{ライブラリ名} {プラットフォーム名}"Targetと"{ライブラリ名} {プラットフォーム名}Tests"TargetのBuild Settings > Packaging > Product Nameがデフォルトで
"{Target名}"になっているので"{ライブラリ名}"に変更します。

※ターゲット名にスペースを含んでいなければ修正しなくてもいいです。

## Plistの指定

"{ライブラリ名} {プラットフォーム名}"Targetと"{ライブラリ名} {プラットフォーム名}Tests"TargetのBuild Settings > Packaging > Info.plist Fileを、元からあったTargetと同じものを指定します。
Test TargetとそうでないTargetは異なる値です。

<img width="782" alt="スクリーンショット 2016-04-17 15.21.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/0cc22e88-d4ec-60aa-3e00-16da913db8fa.png">

## Share 

スキーム名 > Manage Schemes...からScheme一覧を開き、追加したSchemeのSharedにチェックを入れます。

<img width="245" alt="スクリーンショット 2016-04-17 15.45.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/0ab9428b-8d2f-fe8f-a281-27aee38e4d36.png">

↓

<img width="763" alt="スクリーンショット_2016-04-17_15_46_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/8093/f8a22f0c-61a3-5e40-901e-a94f12ea968d.png">

## Deployment Targetの確認 (Optional)

"{ライブラリ名} {プラットフォーム名}"TargetのGeneral > Deployment Info の情報を確認しておきます。
デフォルトで最新のプラットフォームのバージョンが指定されていると思います。
(どのバージョンを指定するべきかはリポジトリのオーナーと相談するべきかもしれません。)

## ビルドできるか確認

すべてのSchemeでビルドを実行してみて、エラーが発生しないことを確認します。

## 試しにCarthageで導入してみる

- ローカルにgitリポジトリを作ります。
- 作業結果の差分をローカルのgitリポジトリにpushします。
- 導入するサンプルのプロジェクトを作成し、Carfileに以下のように記述します。

```
git "file:///path/to/loal/repo.git" "{作業中のブランチ名}"
```
- `carthage update`します。
- サンプルプロジェクトでライブラリが使用できることを確認します。

## Pull Requestを送る

Pull Requestを送って、Mergeされるのを待ちましょう。

実際に送ったPull Requestはこちら
[Support OSX, tvOS, and watchOS with Carthage by haranicle · Pull Request #35 · naoty/SwiftCSV](https://github.com/naoty/SwiftCSV/pull/35)

おつかれさまでした :tada:
PMBOK-ステークホルダー特定

# 声の大きな人っていますよね

プロジェクト進行中に思わぬところからステークホルダーが現れてひっくり返されることがありますねよ。
プロジェクト初期からステークホルダーと良い関係を持つためにもステークホルダーの特定は大事です。
とはいえ途中から新たなステークホルダーが登場することもあるわけで、そういうときは慌てず騒がずこのプロセスをやり直しましょう。
そもそも何か意見を言ってくるときは、表面に現れている事象を指摘している場合は多いので、その事象が起きてしまっている原因や事象に至るまでのプロセスを見直すことが大事です。

# ステークホルダー特定のプロセス

|インプット|ツールと技法|アウトプット|
|:---|:---|:---|
|プロジェクト憲章<br/>調達文章<br/>組織体の環境要因<br/>組織のプロセス資産|ステークホルダー分析<br/>専門家の判断<br/>会議|ステークホルダー登録簿|

PMBOKではステークホルダーの分類モデルとして、以下の4つのモデルを記述しています。

* 権力と関心度のグリッド
プロジェクトの成果に関する権限レベル（権力）と利害レベル（関心度）に基づいて、ステークホルダーを分類するモデル。
* 権力と関与度のグリッド
プロジェクトに関する権限レベル(権力)とプロジェクトへのの度合い(関与度)に基づいて、ステークホルダーを分類するモデル。
* 関与度と影響度のグリッド
プロジェクトヘの積極的参加の度合い（関与度）とプロジェクトの計画や実行の変更に影響する能力(影響度)に基づいて、ステークホルダーを分類するモデル。
* セイリエンス・モデル
ステークホルダーの分類を権力(自分の意志を通す力)、緊急性(直ちに対処する必要性)、正当性(参加の妥当性)に基づいて、ステークホルダーを分類するモデル。

それぞれについて以下のマトリクスのどこに位置するかを判断します。

![権力と関心度のグリッド](https://qiita-image-store.s3.amazonaws.com/0/114529/fdc909f1-791f-3dc5-43ac-6cdad4592341.png)

ステークホルダー登録簿には連絡先や役割といった一般的な情報に加え、上記のように定性的・定量的な情報を調べると役に立ちます。
ステークホルダーを制約と見なさず、ステークホルダーからの支援を増加させ、 潜在的なマイナスの影響を緩和するために、ステークホルダーに働きかける方法を計画することに繋げていきます。
HTML5 SVG + CSS + JS で柔軟なマウス領域を実現

HTML5でサポートした `<svg>` 要素と、CSS、JavaScriptを組合せて、マウス処理する複雑な形の領域を作ります。次のような関東地方の地図のデモを作成しました。都道府県の形に沿ってマウスイベントが発火するのが、確認できるかと思います。


[![kanto.png](https://qiita-image-store.s3.amazonaws.com/0/102667/2e2f41f4-b79b-066f-d799-2028287bab32.png)](http://codepen.io/ueokande/pen/aNjjmJ)
[Kanto SVG map - CodePen](http://codepen.io/ueokande/pen/aNjjmJ)

<i class="fa fa-map-signs"></i> はじめに
----------------------------------------

HTML5でサポートした `<svg>` 要素により、HTMLドキュメント内にSVGを描画できるようになり、従来の矩形（`<div>`など）だけでは難しかった複雑な形の要素も配置できるようになりました。SVG画像を描画するだけでなく、`<svg> ... </svg>` 内の要素（`<path>` や `<rect>`）に、これまでのHTML文章同様、CSSによるスタイルの指定や、JavaScriptによる要素の変更、イベントリスナの登録が可能となります。

これまで `<area>` タグで指定していたマウスの処理の範囲も、SVGから作成することができます。SVGだとInkscapeのような視覚的にわかりやすいツールを使って、パスを作成できます。

<i class='fa fa-html5'></i> HTMLの記述
--------------------------------------

HTMLに埋め込むSVGを用意するのは、Inkscapeを使うのが手っ取り早いです。SVGで適当なパスを作成し、出力ファイル形式をPlain SVGとしてファイルに書き出します。Plain SVGはInkscapeが使用するデータを削除したSVG形式です。しかしそれでも不要なメタ情報などが付与されるので、テキストエディタで削除してからHTMLに貼り付けます。

```html
<!DOCTYPE html>
<html>
  <body>
    <svg width='240' height='262' >
      <path data-name='Ibaraki'  d='...' />
      <path data-name='Chiba'    d='...' />
      <path data-name='Tokyo'    d='...' />
      <path data-name='Kanagawa' d='...' />
      <path data-name='Tochigi'  d='...' />
      <path data-name='Gumma'    d='...' />
      <path data-name='Saitama'  d='...' />
    </svg>
  </body>
</html>
```

各要素に指定される `style` 属性も、今回はCSSにから一括で指定するので削除します。InkscapeにはXMLエディタもついており、描画結果を確認しながら不要な要素の掃除もできて便利です。

`data-name`属性には都道府県名を記述して、後にJavaScriptから参照します。

<i class='fa fa-css3'></i> CSSの記述
------------------------------------

続いてCSSでスタイルを記述します。CSSを使用すると他の要素と同様に、セレクタを指定してスタイルを設定できます。

```css
path {
  fill: #5fd35f;
  stroke: #165016;
  stroke-width: 1;
  transition-duration: 200ms;
  cursor: pointer;
}
path:hover {
  fill: #2ca02c;
}
```

ここで `fill` や `stroke` など、普段見ないプロパティ名がたくさんあることに気づきます。これはSVGで使用するスタイルです。その他の使用可能なプロパティは[W3C](https://www.w3.org/TR/SVG11/styling.html)から確認できます。

そして通常のHTMLドキュメント同様、`path:hover` セレクタや `transition-duration` プロパティも使用できます。これでCSSのみで、ホバー時に色の変化をつけることができました。

<i class='fa fa-terminal'></i> JavaScriptの記述
------------------------------------

JavaScriptの記述も、従来のHTML要素と同じようにSVG内の要素を扱うことができます。

```javascript
function alertName(e) {
  alert('Welcome to ' + e.target.getAttribute('data-name'));
}

window.onload = function() {
  paths = window.document.querySelectorAll('path');
  for (i = 0; i < paths.length; ++i) {
    paths[i].onclick = alertName;
  }
};
```

`window.onload` 時に、すべての `<path>` 要素に対して、クリック時のイベントを記述しています。このイベント内では、ターゲットの`data-name` 内のデータ参照し、 `alert` で表示しています。

<i class="fa fa-hand-o-right"></i> おわりに
-------------------------------------------

SVGを使うことで、`<area>` タグに変わる方法で、柔軟かつ容易にマウス処理の範囲を指定することができました。

ただ、CodePenで動作は確認できたのですが、HTMLの仕様として合法かどうかまでは確認できていないんので、仕様書をもう一度確認する必要があります。
CentOS6でGeminaboxを構築するshell


```ruby
#!/bin/bash -ex

RUBY_VERSION=2.1.9
INSTALL_DIR=/usr/local
SELF_IP=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`

# proxy configuration
# PROXY_HOST=192.168.56.102
# PROXY_PORT=3128
# NO_PROXY=localhost,127.0.0.1
# export http_proxy="http://${PROXY_HOST}:${PROXY_PORT}"
# export https_proxy="http://${PROXY_HOST}:${PROXY_PORT}"
# export no_proxy="${NO_PROXY}"

# [CentOS6] initialize package repositories
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

# install packages
yum install -y --enablerepo=epel git gcc bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel

# install ruby
git clone https://github.com/sstephenson/rbenv.git ${INSTALL_DIR}/rbenv
mkdir ${INSTALL_DIR}/rbenv/shims ${INSTALL_DIR}/rbenv/versions
groupadd rbenv
chgrp -R rbenv ${INSTALL_DIR}/rbenv
chmod -R g+rwxXs ${INSTALL_DIR}/rbenv
git clone https://github.com/sstephenson/ruby-build.git ${INSTALL_DIR}/rbenv/plugins/ruby-build
cat <<EOS > /etc/profile.d/rbenv.sh
export RBENV_ROOT="${INSTALL_DIR}/rbenv"
export PATH="${INSTALL_DIR}/rbenv/bin:$PATH"
eval "\$(rbenv init -)"
EOS
source /etc/profile.d/rbenv.sh
CONFIGURE_OPTS="--disable-install-rdoc" rbenv install -v ${RUBY_VERSION}
rbenv rehash
rbenv global ${RUBY_VERSION}

# install geminabox
gem install unicorn --no-ri --no-doc
gem install geminabox --no-ri --no-doc
mkdir ${INSTALL_DIR}/geminabox
mkdir -m 777 /var/geminabox-data
cat <<EOS > ${INSTALL_DIR}/geminabox/config.ru
require "rubygems"
require "geminabox"
Geminabox.data = "/var/geminabox-data"
Geminabox.rubygems_proxy = true
Geminabox.allow_remote_failure = true
run Geminabox::Server
EOS

# launch geminabox
rackup ${INSTALL_DIR}/geminabox/config.ru -o ${SELF_IP} --daemonize

# install yard server
gem install yard --no-ri --no-doc
yard server --gems --bind ${SELF_IP} --daemon

```
lxdコンテナにホストのフォルダをマウント

## フォルダ構成

* /var/lib/lxd/containers/コンテナ名/rootfs/{bin,boot,dev,etc,..}/

例:コンテナ名がubuntuの場合

* /var/lib/lxd/containers/ubuntu/rootfs/

## ホストのフォルダをマウント(lxcコマンド)

* [lxd/configuration.md at master · lxc/lxd](https://github.com/lxc/lxd/blob/master/doc/configuration.md)
* [LXD 2.0: リソースの管理 [4/12] - Qiita](http://qiita.com/m-shibata/items/3b954c7768212711ea09)

```bash:
mkdir /media/ubuntu
chmod 777 /media/ubuntu
```


```bash:マウント
lxc config device add ubuntu vagrant disk \
  source=/media/ubuntu \
  path=/vagrant
```

* コンテナは動作したままマウントできる。

```bash:確認
$ lxc config device show ubuntu
vagrant:
  path: /media/ubuntu
  source: /vagrant
  type: disk
root:
  path: /
  type: disk
```

```bash:削除
lxc config device remove ubuntu vagrant disk
```
python > Link > PyUserInput package | 使用例を教えていただきました

pythonからVK_SPACEなどのキーを入力するパッケージ
http://pydoc.net/Python/PyUserInput/0.1.4/pykeyboard.mac/

Mac OS Xのターミナルから使えるかは未調査。

使用例のコードがないので、使い方がいまいち分からない。

<hr>

こちらの方が簡単な気がする。
http://qiita.com/tukiyo3/items/127c3a57bb283bd548c7

<hr>
(追記 2017/06/13)

@tukiyo3さんの[コメント](http://qiita.com/7of9/items/ea8a6b655b98b02b6087/#comment-16778a1f0d78a4c4212f)にてPyUserInputの具体的な使用例を教えていただきました。

情報感謝です。
DjangoでViewのデコレーターをurls.pyに書くと一覧性が高くなる

DjangoでViewのデコレーターは通常views.pyに書きますが、これをurls.pyに書くようにすると一覧性が高くなるのでお勧めです。

# 通常の使い方(views.pyでデコレーターを指定)
複数のViewがあって各Viewの実装が大きくなってくると、どのViewにどんなデコレーターが指定されているのかが確認しにくくなってきます。

```py3:views.py
def view1(request):
    :
    # 長〜い処理
    :

@login_required
@staff_member_required
def view2(request):
    :
    # 長〜い処理
    :

@login_required
@has_permission('xxx')
def view3(request):
    :
    # 長〜い処理
    :

@login_required
@has_permission('xxx')
def view4(request):
    :
    # 長〜い処理
    :

```

※説明を簡略化する為、あえて関数ベースViewで書いています。

# urls.pyでデコレーターを指定する

urls.pyは基本的にView１つに対して1行のコードを書くだけなので、ここでデコレーターを指定できると一覧性が高そうです。
urls.pyでデコレーターを指定するには次のように書きます。

```py3:urls.py
urlpatterns = [
    url(r'^$', login_required(has_permission('xxx')(views.view4)))
]
```

このままだと複数のデコレーターを使用する場合に入れ子になって読みにくいので、デコレータ指定用の関数を作成して使用します。

```py3:urls.py
def decorate(view_func, decorators):
    for decorator in reversed(decorators):
        view_func = decorator(view_func)

urlpatterns = [
    url(r'^$', decorete(views.view4, [login_required, has_permission('xxx')]))
]
```

更に、デコレーターの指定は同じ組み合わせを使うことが多いので、これらのパターンを定数として定義しておきます。

```py3:
# ログインなしでアクセス可能
PUBLIC = []

# 中の人のみアクセス可能
STAFF_ONLY = [
    login_required,
    staff_member_required,
]

# 権限xxxを持つ人のみアクセス可能
XXX = [
    login_required,
    has_permission('xxx'),
]
```

これで各Viewの指定を確認しやすくすることが出来ました。

```py3:urls.py
urlpatterns = [
    url(r'^view1/$', decorate(views.view1, PUBLIC)),
    url(r'^view2/$', decorate(views.view1, STAFF_ONLY)),
    url(r'^view3/$', decorate(views.view2, XXX)),
    url(r'^view4/$', decorate(views.view3, XXX)),
]
```

# こんなのもありました

https://github.com/vorujack/decorate_url

こちらはinclude()に対してもデコレーターを指定できるようです。
技術英語 > There’s leeway here,

@ [You must stop coding, you must keep coding](http://bjk5.com/post/50847975319/you-must-stop-coding-you-must-keep-coding)

> There’s leeway here,

http://eow.alc.co.jp/search?q=leeway
> 2. 〔自由裁量の〕余地
LINE BOT APIをPHPで一通り動かした。

LINE BOT API trial版をPHPで。

環境は、
・AWS cloudfront でSSLオフロード
・CentOS6.6 + Apache,PHP

LINE BOT APIでできることを一通り試した上で、
IoTシステムと連携して使うなら、というサンプル。
![2016-04-25 (1).png](https://qiita-image-store.s3.amazonaws.com/0/97877/c64f7984-9851-b828-20f7-7db32172fec2.png)

ソースは以下に。
https://github.com/nilesflow/linebot-php

トライアル申し込み終わってるので、
トライアルアカウントなければ、正式サービスインまで使えなそう。
monitで監視項目ごとに監視間隔を設定する

# ■ monitとは

ｍonitは、オープンソース・ソフトウェア監視ソフト。
手軽にファイル・システムの監視を行える。

http://www.moongift.jp/2007/11/monit/

# ■ monitの設定ファイル

monitの設定ファイルは"/etc/monitrc"にある。
詳細は[公式](https://mmonit.com/monit/documentation/monit.html#THE-MONIT-CONTROL-FILE)のTHE MONIT CONTROL FILEを参照。
 
ここに、下記のような記載があるはずだ。

```
SET DAEMON <seconds>
```

<seconds>で監視間隔の設定を行っている。
"SET DAEMON 60"なら60秒間隔となる。

# ■ 監視項目を分ける

"/etc/monitrc"に以下の様に記載する。

```
include /etc/monit.d/*.conf
```

これで、/etc/monit.d/以下に監視項目ごとに
●●.confファイルを用意することで、監視項目を分けられるようになる。

```
■ 例 : apache.conf
=====================================================
 check process apache with pidfile /var/run/httpd.pid
       start = "/etc/init.d/httpd start"
       stop  = "/etc/init.d/httpd stop"
=====================================================
```

# ■ 項目別監視間隔の変更

監視間隔の設定は、"SET DAEMON"だが、
monitデーモンの監視間隔で、/etc/monit.d/*.confに書いても、
他の監視間隔の設定も変更されてしまう。

個別の設定の仕方は[公式](https://mmonit.com/monit/documentation/monit.html#THE-MONIT-CONTROL-FILE)のSERVICE POLL TIMEに書いてある。

3つの設定方法があるようだ。

* 基準間隔 * 倍数の間隔で監視する

```
 check process nginx with pidfile /var/run/nginx.pid
       every 2 cycles
```

SET DAEMONで設定した間隔*[number]の間隔で監視する。


* 指定時刻に監視する方法

```
 check program checkOracleDatabase
        with path /var/monit/programs/checkoracle.pl
       every "* 8-19 * * 1-5"
```

[cron](https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html)に類似する形式で監視する時刻を指定するタイプ。
ただし、cronにある間隔値の設定などは使えない模様。

```
[/]の後ろが間隔値
0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg
```

あくまで、公式のExampleにあるような形式でしか利用できないようだ。

* 指定した時刻に監視しないようにする設定

```
 check process mysqld with pidfile /var/run/mysqld.pid
       not every "* 0-3 * * 0"
```

指定した時刻に監視しないようにする設定。
設定の形式は上のものと同じ。
Objective-C:ファイルシステムの空き容量を取得する

iOSのファイルシステム空き容量を調べます。

ユーザーは色んなアプリをインストールしていると思われます。
更にそれらのセーブデータ等でも容量は減っています。
自分が制作したアプリのセーブデータ、ダウンロードファイルなどを保存したい場合、
足りるかどうか先に空き容量を調べることがあるかと思います。

以前は「fileSystemAttributesAtPath」というものを使い取得していましたが、
今これを使用しビルドすると「deprecated（非推奨）」とwarningがでます。
(とりあえずfileSystemAttributesAtPathでも読みだすことは可能ですが
いつSDKから完全削除になるかはわかりません)

fileSystemAttributesAtPathを使用しない別の取得方法。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSDictionary *dic = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error:nil];
    
    float free = 0.0; //空き容量が入る   
    if (dic) {
        float MB = 1024.0 * 1024.0; //メガバイトで計算
        free = [dic[@"NSFileSystemFreeSize"] floatValue] / MB;
    }

上記、freeにメガバイト単位で空き容量が入ります。
アプリにもよるかと思いますが、
取得した容量が少ないようならダイアログなどを表示してユーザーに注意を促すのがよいかと思います。
Animatable なプロパティの実装

iOS の API には 以下のように事実上一つのプロパティでもアニメーションするか否かで、複数のAPI が用意されている場合があります。それを独自に実装する為の Tips です。

```.swift
func setNavigationBarHidden(_ hidden: Bool, animated animated: Bool)
var navigationBarHidden: Bool
```

```.swift
func setToolbarItems(_ toolbarItems: [UIBarButtonItem]?, animated animated: Bool)
var toolbarItems: [UIBarButtonItem]?
```

説明をシンプルにするように次のような仕様を想定してみます。`MyView` は `UIView` のサブクラスで `margin` というプロパティを持つ事とします。`margin` を `CGFloat` で指定すると `MyView` の内側に `margin` で指定された幅の内枠ができるものとします。

<img width="470" alt="Screen Shot 2016-04-21 at 5.06.23 PM copy.png" src="https://qiita-image-store.s3.amazonaws.com/0/65634/513025eb-c672-f438-f252-d249ca092098.png">

この外枠の太さ（マージン）を変化させるアニメーションするメソッドを考えてみる事にします。先ほどの例を参考にすると、以下のようなAPIに設計したいと思います。

```.swift
	var margin: CGFloat
	func set(margin margin: CGFloat, animated: Bool)
```

`margin`を直接設定した時は、アニメーションオフで、`set(margin:animated:)` では引数でアニメションのオンオフを指定するようにしたいと思います。この二つの挙動が成立するようにする為には、`margin`プロパティは Computed Property などで実装して、実際の`margin`は別のプロパティで管理する必要が出てきます。

コピペで使える部分は少ないと思いますが、アニメータブルなマージンを設定可能な、`MyView` のサンプルコードを紹介します。

```.swift
class MyView: UIView {

	lazy var coreView: UIView = {
		let coreView = UIView()
		coreView.backgroundColor = UIColor.lightGrayColor()
		self.addSubview(coreView)
		return coreView
	}()

	private var _margin: CGFloat = 5.0
	
	var margin: CGFloat {
		get { return _margin }
		set { self.set(margin: newValue, animated: false) }
	}

	func set(margin margin: CGFloat, animated: Bool) {
		let closure: ()->() = {
			self.coreView.frame = CGRectInset(self.bounds, margin, margin)
			self._margin = margin
		}
		if animated {
			UIView.animateWithDuration(0.33) {
				closure()
			}
		}
		else {
			closure()
		}
	}

	override func layoutSubviews() {
		super.layoutSubviews()
		self.setup()
		self.backgroundColor = UIColor.grayColor()
		self.coreView.frame = CGRectInset(self.bounds, _margin, _margin)
	}

	lazy private var setup: ()->() = {
		let selector = #selector(MyView.tapAction(_:))
		let gesture = UITapGestureRecognizer(target: self, action: selector)
		self.addGestureRecognizer(gesture)
		return {}
	}()

	func tapAction(sender: UITapGestureRecognizer) {
		let value = CGFloat(arc4random_uniform(50))
		self.set(margin: value, animated: true)
	}

}
```

`setup` や `tapAction(_:)` は動作確認用のコードで、`MyView`をタップした際にランダムなマージンをアニメーションしながら設定する事を確認する為のコードです。

では、 Playground で実際に確認してみましょう。`MyView` の中身は省略してあります。

```.swift
import UIKit
import XCPlayground

class MyView: UIView {
	// ...
}

let myView = MyView(frame: CGRectMake(0, 0, 200, 200))
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
XCPlaygroundPage.currentPage.liveView = myView
myView.setMargin(90.0, animated: true)
```

GitHub にも Playground を上げました。
https://github.com/codelynx/animated-property-sample

Have a nice coding!!
Linuxの権限確認と変更(chmod)（超初心者向け）

# ファイル・ディレクトリの権限（パーミッション）の確認方法と変更方法
以下のようなコマンドの謎の数字や

```
$ chmod 777 hoge.txt
```

以下のような一覧のrやwなど謎の英文字について

```
-rw-r--r--  1 user user      9  1月 1 00:00 hoge.txt
```

パーミッションに関するコマンドの読み方や変更の方法をまとめてみる。
誰かの役に少しでも立てば・・・
そしてたまに忘れる自分へ・・・・

## パーミッションの確認


Linuxコマンドでカレントディレクトリ内のファイルやディレクトリの情報を確認する。

```
$ ll
```
または

``` 
$ls -l
```

上記のコマンドを実行すると、以下のような一覧が表示されるかと思います。

```
-rw-r--r--  1 user group      9  1月 1 00:00 hoge.txt
drwxr-xr-x  6 user group  20480  1月 1 00:00 ダウンロード
```

### パーミッションの読み方

「-rw-r--r--」や「drwxr-xr-x」の先頭の謎の10文字についてですが、
最初の１文字目はファイル種別を表しています。
**-**rw-r--r--

| 種別 | 意味 |
|-----|---------|
| - | ファイル | 
| d | ディレクトリ | 
| l | シンボリックリンク | 

2文字目から4文字目はファイルの所有者に対する権限を表し、
5文字目から7文字目はファイルの所有グループに対する権限を表し、
8文字目から10文字目はその他に対する権限を表しています

上記から`-rw-r--r--`は、
「ファイル種別」が「ファイル」であり、
「所有者」に「読み取り」と「書き込み」の権限があり、
「所有グループ」に「読み取り」の権限があり、
「その他」に「読み取り」の権限があることを示しています。

`drwxr-xr-x`は、
「ファイル種別」が「ディレクトリ」であり、
「所有者」に「読み取り」と「書き込み」と「実行」の権限があり、
「所有グループ」に「読み取り」と「実行」の権限があり、
「その他」に「読み取り」と「実行」の権限があることを示しています。


## アクセス権限の変更

続きましてアクセス権限を変更する方法について記載します。

パーミッションの変更にはchmodコマンドを使用します。
### 数値で指定する
```
$ ls -l　
-rw-r--r--  1 user group      9  1月 1 00:00 hoge.txt
$ chmod 764 hoge.txt
$ ls -l
-rwxrw-r--  1 user group      9  1月 1 00:00 hoge.txt
```

上記のコマンドはhoge.txtに対してパーミッションの確認→変更→確認を行っています。

```
$ chmod 764 hoge.txt
```
に関して説明していきます。

ファイルのパーミッションの変更は以下の通りコマンドを実行すれば可能です。

```
chmod モード 対象ファイル名
```

モードの数字について説明します。

| モード(数字)| モード(アルファベット) | 権限 |
|:----------|-----|------------------|
| 4 | r         | 読み取り |
| 2 | w         | 書き込み |
| 1 | x         | 実行 |


上記の合計値を「所有者」「所有グループ」「その他」の順で入力することでパーミッションを変更することができます。
要するに上記の「764」は
「所有者」に対して「読み取り」「書き込み」「実行」を、
「所有グループ」に対して「読み取り」「書き込み」を、
「その他」に「読み取り」を付与しています。

### アルファベットで指定する
パーミッションをアルファベットで指定することもできます。
こちらの方が直感的で好む方もいるかと思います。

まずは数値で指定した時と同じ内容をアルファベットで指定する方法で実行してみます。

```
$ ls -l
-rw-r--r--  1 user group      9  1月 1 00:00 hoge.txt
$ chmod u+x hoge.txt
$ ls -l
-rwxr--r--  1 user group      9  1月 1 00:00 hoge.txt
$ chmod g+w hoge.txt
$ ls -l
-rwxrw-r--  1 user group      9  1月 1 00:00 hoge.txt
```
アルファベットでパーミッションを変更するには以下の通りにコマンドを実行します。

```
chmod 変更対象 変更方法 変更内容 対象ファイル
```
例に以下のコマンドで確認していきます。

```
$ chmod u+x hoge.txt
```
uが変更対象、+が変更方法、xが変更内容となります。

変更対象については以下のいずれかになります。

| 変更対象 | 意味 |
|----------|-----|
| u | ユーザー |
| g | グループ |
| o | その他 |
| a | すべて |


変更方法については以下のいずれかになります。


| 変更方法 | 意味 |
|----------|-----|
| = | 指定した権限にする |
| + | 指定した権限を付与する |
| - | 指定した権限を除去する |

変更内容については上記でも記した通りです。

| 変更内容 | 意味 |
|----------|-----|
| r | 読み取り |
| w | 書き込み |
| x | 実行 |

なので、


```
$ chmod u+x hoge.txt
```
はhoge.txtに対して所有者の実行権限が付与しています。

もちろん複数指定もできます。

```
$ chmod go+w hoge.txt
```
や

```
$ chmod a-wx hoge.txt
```
と実行することもできます。

数値で指定とアルファベットで指定のどちらを使用するかは、
好みな方、間違わない確実な方を使用していきましょう。

以上になります。
最後までお読みいただきありがとうございました。
Siriみたいな声でテキストを読み上げて貰う


[GetWild退勤的なセンサーアプリを簡単に作れるフレームワークを作ったのでiPhoneに歯痛を心配されたり色々する](http://qiita.com/oubakiou/items/218b6ed08a6faaf5ee8b)

で得た知見シリーズ

```swift
let talker = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: "こんにちわ")
utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
talker.speakUtterance(utterance)
```

喋らせるだけなら特に難しい点は無い。iOS7以降であればAVFoundation.frameworkを追加してimportするだけで使える。languageにja-JPを設定した状態で"don't touch me"みたいに英語を渡すとちゃんと？日本語で「どんとたっちみー」と喋ってくれる。

# ビルド可能なサンプル

https://github.com/oubakiou/openSensorAppIos/commit/92787bc141753d5b0164a3efdedb6a8063af90f5

iPhoneに顔を近づけると拒絶されるようになって悲しい。

# 参考にしたもの

+ [AVSpeechSynthesizer](https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVSpeechSynthesizer_Ref/)
+ [AVSpeechUtterance](https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVSpeechUtterance_Ref/)
+ [AVSpeechSynthesisVoice](https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVSpeechSynthesisVoice_Ref/#//apple_ref/occ/clm/AVSpeechSynthesisVoice/voiceWithLanguage:)
+ [AVSpeechSynthesizerで読み上げ機能を使ってみる](http://dev.classmethod.jp/smartphone/iphone/swfit-avspeechsynthesizer/)
+ [iOSで使える日本語OKな音声読み上げエンジン8種](http://qiita.com/shu223/items/223492e4f061032e652e)
[Android] RxJavaのストリームで複数種の値を流す(Tuple)


メソッドの返り値の型を `Observable<T>` でくるむようにアプリケーション開発していたりすると、要件によってはストリームに複数種の値を流したくなることがあります。

Java(Android) に `Tuple` は無いのですが、任意の型かつ複数種の値を保持できるクラスを独自に用意しておくと便利です。

例として２つの値を扱う場合は次のようになります。

```java:Tuple2.java
public class Tuple2<T1, T2> {
    private final T1 t1;
    private final T2 t2;

    private Tuple2(T1 t1, T2 t2) {
        this.t1 = t1;
        this.t2 = t2;
    }

    public T1 get1() {
        return t1;
    }

    public T2 get2() {
        return t2;
    }

    public static <T1, T2> Tuple2<T1, T2> create(T1 t1, T2 t2) {
        return new Tuple2<>(t1, t2);
    }
}
```

## 利用例

例として、返り値が `Observable` なメソッドで `List<String>` と `Integer` を返すコードは次のようになります。

> Java 8 と [Retrolambda](https://github.com/orfjackal/retrolambda) を利用しています。

```java:
public Observable<Tuple2<List<String>, Integer>> getSomeAsync() {
    return Observable.create(subs -> {

        List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("efg");
        list.add("hij");

        subs.onNext(Tuple2.create(list, 999));
        subs.onCompleted();
    });
}
```

値の取り出しは次のようになります。

```java:
getSomeAsync().subscribe(aListIntegerTuple2 -> {

    Log.d("tuple:1", aListIntegerTuple2.get1().get(0)+""); // abc が出力される

    Log.d("tuple:2", aListIntegerTuple2.get2()+""); // 999 が出力される

});
```

> ちなみに私は Retrolambda を使う場合、型が分からなくなるので上記のように `a型名` のような変数名をつけるようにしています。

## ほか

同様に `Tuple3` `Tuple4` は次のようになります。

```java:Tuple3.java
public class Tuple3<T1, T2, T3> {
    private final T1 t1;
    private final T2 t2;
    private final T3 t3;

    private Tuple3(T1 t1, T2 t2, T3 t3) {
        this.t1 = t1;
        this.t2 = t2;
        this.t3 = t3;
    }

    public T1 get1() {
        return t1;
    }

    public T2 get2() {
        return t2;
    }

    public T3 get3() {
        return t3;
    }

    public static <T1, T2, T3> Tuple3<T1, T2, T3> create(T1 t1, T2 t2, T3 t3) {
        return new Tuple3<>(t1, t2, t3);
    }
}
```

```java:Tuple4.java
public class Tuple4<T1, T2, T3, T4> {
    private final T1 t1;
    private final T2 t2;
    private final T3 t3;
    private final T4 t4;

    private Tuple4(T1 t1, T2 t2, T3 t3, T4 t4) {
        this.t1 = t1;
        this.t2 = t2;
        this.t3 = t3;
        this.t4 = t4;
    }

    public T1 get1() {
        return t1;
    }

    public T2 get2() {
        return t2;
    }

    public T3 get3() {
        return t3;
    }

    public T4 get4() {
        return t4;
    }

    public static <T1, T2, T3, T4> Tuple4<T1, T2, T3, T4> create(T1 t1, T2 t2, T3 t3, T4 t4) {
        return new Tuple4<>(t1, t2, t3, t4);
    }
}
```
H2 DB Installation in SpringBoot

インメモリで動かすH2DBを入れてみよう

Spring Bootはいつもの手順でプロジェクトを作成しておきます。

# 1. gradleの設定
```javascript:build.gradle
dependencies {
.......
//	H2
compile('org.springframework.boot:spring-boot-starter-data-jpa:1.3.3.RELEASE');
compile('com.h2database:h2:1.4.191');
.......
}
```

# 2. 依存関係の更新
![スクリーンショット 2016-04-25 01.11.06.png](https://qiita-image-store.s3.amazonaws.com/0/89997/97b59d53-4500-b564-56b8-5a3f922a3bce.png)

# 3. application.properties
```text
spring.datasource.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
```
# 4. 起動確認
http://localhost:8080/console/