OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Summit Tokyo 2016 - クラウドとマイクロサービスによる音声操作の新時代 － Amazon Echo & Alexa

# セミナーの基本情報
 * 時間
    * 13:20 ～ 14:00
 * 場所
    * グランドプリンスホテル新高輪　飛天
 * 発表者
    * Amit Jotwani（Senior Evangelist, AVS（Alexa Voice Service））
 * 概要：
  * 音声操作の新しい時代が来て、AWS クラウド上で Amazon Alexa と連携するマイクロサービス開発などについての話

# 内容

## コントロールインターフェース
* 【むかし】クリック
    * キーボードやマウスをクリックして、操作する
* 【現在】タッチ
    * スマホ画面をタッチして、操作する
* 【未来】音声
    * 直接的に話して、操作する


## Amazon Echoとは
* ![51-0fvyu5ML._SL1000_.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/6156dc6f-4a5a-e83e-4ef0-32f73940386f.jpeg)
* Amazon Echoとは据え置き型のSiriのようなもので、音声を使って天気やニュースを聞こえる

## Amazon Echoのファミリー
* Echo Dot
* Tap
* FireTV
* 参照
    * http://www.gizmodo.jp/2016/03/amazon_echoecho_dotamazon_tap.html

## 何かできるか
* 音声でsmart homeをコントロールする
    * ライトをON/OFF
    * 天気を聞く
    * など

## Alexaとは
* AlexaはAmazon Echoのファミリーに採用されているクラウドベースの音声認識サービスである


## AVSとは
* Alexa Voice Serviceの略称である
* サードパーティのデバイスメーカーやアプリケーション開発者がAlexaを自社製品に追加可能になる

## Alexaプラットフォームと仕組み
* プラットフォーム
    * ASR（EC2）：自動音声認識
    * NLU（EC2）：自然言語認識
    * TTS（EC2）：テキストを音声に変換
    * Skills（EC2, Lambda）：機能、スキル
    * Learning（EC2）：機械学習
* 仕組み
    * ASR：認識→認識結果
    * NLU：認識結果→意図
    * Skills：意図→会話の指示 
    * TTS：テキスト/SSML→Alexaの声

## ライブコーディング
* Skillを作成
* Skillデプロイ
* developer.amazon.comのシミュレーターでの確認
* echosim.io を使って確認
InstagramをRubyでスクレイピングする

Instagramの規約が2016/6/1から厳格になり、APIの使用に制限がかかりました。
趣味で運用していたサービスが動かなくなったので、Instagramの本サイトからスクレイピングできないかやってみました。そうしたところ、できたのでコードを共有します。

##コード
open-uriとJSONを使っています。Instagramのuser_idを引数に入れて使います。ユーザー情報と最新の画像が取得できます。

```
require 'open-uri'
require 'JSON'

def scrape_instagram(user_id)
  begin
    instagram_source = open("https://www.instagram.com/#{user_id}").read
    content = JSON.parse(instagram_source.split("window._sharedData = ")[1].split(";</script>")[0])
    return content['entry_data']['ProfilePage'][0]['user']
  rescue Exception => e
    return nil
  end
end
```

##Usage
使い方です。
```
scrape_instagram("nyanchan22")
```

Githubでコードを公開しているので、もしよければスターして下さい。
https://github.com/naoya0731/scrape_instagram_ruby
Mac OS X El Capitanで最初の設定やアプリインストール（プロビジョニング）をシェルスクリプトやAnsibleでしたメモ


# 前置き
作りかけのメモです。しかも自分用です。


# 概要・趣旨
Mac OS Xは、BSDベースのOSでありCUI（ターミナル）にて各種設定を行うことができます。また、HomeBrewを導入することで各種アプリケーションもインストールが可能です。
すなわち、Macを購入したり、Mac OSを再インストールしたりしたあとの最初の設定とアプリケーションのインストールをコマンドラインで一括で行う事が可能になります。

ネット上に情報がすでにありますが、El Capitanに対応してなかったりするものを修正して利用しています。

下記レポジトリにソースを公開しています。


# GitHubレポジトリ
- amaranthinekt/MacOS_Initial_Provisioning: Script etc about MacOS Initial Provisioninig for me https://github.com/amaranthinekt/MacOS_Initial_Provisioning


# 上記ソースの内容
1. README.md
 - GitHubレポジトリ用readme.markdown
2. Terminal_Profile_Basic_Customized.terminal
 - 自分用ターミナルアプリ用設定エクスポートファイル
3. _.vim
 - 自分用vim設定ファイル用ディレクトリ
4. _.vimrc
 - 自分用vim設定ファイル
5. ansible_playbook
 - Ansible用ファイル
6. macos_settings.sh
 - Mac OS Xで各種設定を行うシェルスクリプトファイル
7. softs_install.sh
 - Ansibleで各種アプリインストールを行うためのシェルスクリプトファイル

# 上記ソースの使い方
1. GitHubからレポジトリをclone
 - git clone https://github.com/amaranthinekt/MacOS_Initial_Provisioning.git (任意のフォルダ)
2. cd [MacOS_Initial_Provisioning|(任意のフォルダ名)]
3. bash macos_setings.sh #再起動が入ります
4. bash softs_install.sh

※sudoパスワードを求められたり、ライセンス認証を求められる時があります。


# 注意点
- 性質上、メンテはたまに行います。
- 完全に自分用の設定なので、他の人にも良いかは分かりません。
- defaultsコマンドを利用せずAnsibleで設定を統一すべきな気がします。（OSアップデートでdefaultsコマンドの仕様などが変更されても対応されるであろうことから。）
StackdriverのUptime Checkの接続元IPアドレスが知りたい


ファイアウォールルールで接続元のIPを絞ってると、対象のインスタンスへStackdriverのUptime Checkが通らなくて悲しい気持になります。
そしてIPアドレスのリストどっかにないかと思って探した結果、ここにありました。（まあ教えてもらったんですが）

![スクリーンショット 2016-06-13 14.14.43.png](https://qiita-image-store.s3.amazonaws.com/0/8637/8a69afb4-de95-8300-6f80-7df7c733d8ce.png "スクリーンショット 2016-06-13 14.14.43.png")

StackdriverからAlerting->Uptime ChecksでAdd Uptime Checksの`…`をクリックすると、接続元IPをテキストファイルで取得できます。

http://www.stackdriver.com/important-changes-to-uptime-checks/
AWS Summit Tokyo 2016 - 面白いこと

# 1 AWS麻雀

![Cj7APLPUkAA8Lr3.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/7ba6763e-f3dc-bca3-ba77-676f30ddf90c.jpeg)




# 2 snow ball

![螻慕､ｺ莨・IMG_20160602_120821.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/6163505c-2c25-02ad-ae02-18118c25b7eb.jpeg)


* セキュアなペタバイト規模のデータ転送ソリューションのクライアント側
 * https://aws.amazon.com/jp/importexport/
* 以前は、紹介される文書や写真などを見たが、今回は、本物だ

# 3 揚水発電の監視デモシステム

![螻慕､ｺ莨・IMG_20160602_125702.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/407ea256-0df9-8e69-57af-1e0c12f74466.jpeg)
aliasメモ

自分で使っているaliasのメモ
随時追加していく。

```ruby:.bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
# 詳細表示
alias ll='ls -la --color=tty'
# grep
alias grep='grep --color'
alias grr='grep --color -r'
# find
alias f='find . -name'
# ファイルサイズ表示をわかりやすく
alias df='df -h'
# 実行中のプロセスを時系列順に
alias ps='ps --sort=start_time'

# tmux
alias t='tmux'
alias tns='tmux new -s'
alias tl='tmux ls'
alias ta='tmux a'
alias tk='tmux kill-session -t'
alias tkall='tmux kill-server'
alias trn='tmux -rename -t'
alias tat='tmux attach -t'

#-----------git-----------
# git関連に色付け
git config --global color.ui true

alias gcom='git commit -m'
alias gadd='git add .'
alias gb='git branch'
alias gba='git branch -a'
alias gbr='git branch -r'
alias gl='git log -10'
alias glns='git log --name-status -5'
alias gls='git ls-files -cdmokt|grep '
alias gst='git status'
alias gm='git merge'
alias gms='git merge --squash'
alias gch='git checkout'
alias gd='git diff'
alias gf='git fetch'

```
EBS一覧とEBSのStateによるフィルタリングをAWS CLIで


## EBS一覧とEBSのStateによるフィルタリングをAWS CLIで

`in-use`の状態の

> Filter Name Ref: http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeVolumes.html

### State毎にEBSを表示する(in-use)

```
$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,State:State}' --filter Name=status,Values=in-use | head -n10
[
    {
        "State": "in-use",
        "ID": "vol-XXXXXXXX"
    },
    {
        "State": "in-use",
        "ID": "vol-XXXXXXXX"
    },
    {
```

### State毎にEBSを表示する(available)


```bash
$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,State:State}' --filter Name=status,Values=available | head -n10
[
    {
        "State": "available",
        "ID": "vol-XXXXXXXX"
    },
    {
        "State": "available",
        "ID": "vol-XXXXXXXX"
    },
    {
```

### 未使用のEBSボリュームを一括で消すスクリプト

```rb
#!/usr/bin/env ruby

region = 'ap-northeast-1 '
not_use_ebs_list = `aws ec2 --region #{region} describe-volumes --query 'Volumes[*].VolumeId' --filter Name=status,Values=available --output text`.split(/\t/)

not_use_ebs_list.each do | ebs |
  ebs = ebs.chomp
  puts "Deleting #{ebs}"
  `aws ec2 --region #{region} delete-volume --volume-id #{ebs}`
end
```

### 未使用のEBSを消すスクリプトを実行する

```
$ ruby some.rb
Deleting vol-XXXXXXXX
Deleting vol-XXXXXXXX
Deleting vol-XXXXXXXX
```

## attachedなEBSを削除しようとした場合

```
A client error (VolumeInUse) occurred when calling the DeleteVolume operation: Volume vol-XXXXXXXX is currently attached to i-XXXXXXXX
```

となる
スマートフォン端末の加速度センサの値を取得する

# 概要
スマートフォン端末の加速度センサの値を取得する

## サンプルコード

```js:javascript
window.addEventListener("devicemotion", function(event) {
  var x  = parseFloat(event.acceleration.x);
  var y  = parseFloat(event.acceleration.y);
  var z  = parseFloat(event.acceleration.z);

  /*
     iosとAndroidとで、向きが逆。
     基準はどちらでも良いが、端末を上から見て、
       x:右方向
       y:上方向
       z:手前方向
      を正とするなら、iOS側を補正する。
  */
  if (userAgent.indexOf("iPhone") > 0 || userAgent.indexOf("iPad") > 0 || userAgent.indexOf("iPod") > 0) {
    x *= -1;
    y *= -1;
    z *= -1;
  }
}
```

## 利用できるブラウザ(2016/06/13時点)
* iOS Safari
    * 4.3以降
* Android Browser
    * 3以降
* Chrome for Android
    * 50以降
* 参照
    * http://caniuse.com/#search=devicemotion

## その他
* acceleration.x | acceleration.y | acceleration.z以外に、以下の値も取得できる
    * accelerationIncludingGravity.x | accelerationIncludingGravity.y | accelerationIncludingGravity.z
        * スマートフォン端末の加速度(acceleration)に、重力加速度が加わった値
    * rotationRate.alpha | rotationRate.beta | rotationRate.gamma
        * 端末の、各軸を中心とした回転加速度の値

# 参考
* DeviceOrientation Event Specification > 4.1 deviceorientation Event
    * https://www.w3.org/TR/orientation-event/#devicemotion
* DeviceMotionEvent
    * https://developer.mozilla.org/en-US/docs/Web/API/DeviceMotionEvent
* 方向および動きとして示されるデータ
    * https://developer.mozilla.org/ja/docs/DOM/Orientation_and_motion_data_explained
RS-232C > シリアル出力の見易さ

13項目ほどある時のシリアル出力を見やすくする工夫について

## 見にくい例
シリアル出力でよく使う方法は以下のもの

- 区切り文字をカンマとする
- 項目値(少数)とカンマを連結して出力
  - 例: 3.141,2.718,3.141,2.718,3.141,2.718,3.141,2.718

カンマと小数点がまぎらわしくN番目の項目を探しにくい

## 見やすい例
こちらの出力はN番目の項目を探しやすい
http://cranberrytree.blogspot.jp/2014/06/gy-521mpu-6050.html

- 項目の少数桁を少なくしている
- 項目ごとをスペースで離している
  - スペースが１つでなく適度に離れている
- 値の大きさによらず表示位置は固定

## 不明点

カンマ区切りでなく空白区切りとした場合の落とし穴があるだろうか。

シリアル出力をロギングしてそれを処理する場合など。
using MMMarkdown


```objectivec
    NSError *error;
    
    NSString *markdown = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Example" ofType:@"md"]  encoding:NSUTF8StringEncoding error:&error];
    
    if (error == nil) {
        NSString *html = [MMMarkdown HTMLStringWithMarkdown:markdown error:&error];
        
        if (error == nil) {
            html = [NSString stringWithFormat:@"<style>img {max-width: 100%%;max-height: 100%%;}</style> \n%@",html];
            
            [self.webView loadHTMLString:html baseURL:nil];
        }
    }
```
[メモ] Raspberry Pi : Jessie初回起動時のrootfs拡張


## Raspbian
- 2016-05-27-raspbian-jessie.img
- 2016-05-27-raspbian-jessie-lite.img

## `/boot/cmdline.txt`

- microSDにイメージを焼いた直後:`dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh`

- 一度でも起動した後: `dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait`


- <font color='red'>**差分**</font>:` quiet init=/usr/lib/raspi-config/init_resize.sh`


```bash:/usr/lib/raspi-config/init_resize.sh
...
main () {

...

if ! parted -m $ROOT_DEV u s resizepart $ROOT_PART_NUM $TARGET_END; then
    FAIL_REASON="Root partition resize failed"
    return 1
  fi

  return 0
}

mount -t proc proc /proc
mount -t sysfs sys /sys

mount /boot
sed -i 's/ quiet init=.*$//' /boot/cmdline.txt
mount /boot -o remount,ro
sync

echo 1 > /proc/sys/kernel/sysrq

...

if main; then
  whiptail --infobox "Resized root filesystem. Rebooting in 5 seconds..." 20 60
  sleep 5
else
...
```
- `sed`で`/boot/cmdline.txt`ファイルの、quiet から文末まで削除してる
- main()で、`parted`を呼び出している
組み込み系の友人からArduino/Raspberry Piを習い始めた人のメモ

# この記事は？
IoTな仕組みを作るため、組み込み系の友人からArduinoについて1日ほど習いました。(Raspberry Piはこれから)
やったこと、気づいたことをさらっと整理したものになります。
自分用メモの意味合いが強いため詳細は省いています。興味が有ることがあれば遠慮なくご連絡ください。

# 使ったもの
- PC(Mac/Winどちらでも)
- [ESPr One（Arduino Uno同一形状 ESP-WROOM-02開発ボード）](https://www.switch-science.com/catalog/2620/) : Wifiが使えるArduino互換ボード
- [シャープ測距モジュール　ＧＰ２Ｙ０Ａ２１ＹＫ](http://akizukidenshi.com/catalog/g/gI-02551/)
- [圧力センサーFSR406](http://akizukidenshi.com/catalog/g/gP-04158/)
- [Arduinoをはじめよう 第3版 (Make:PROJECTS)](http://www.amazon.co.jp/gp/product/487311733X/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=487311733X&linkCode=as2&tag=nntg-22) ＆ [Arduinoをはじめようキット](http://www.amazon.co.jp/gp/product/B0025Y6C5G/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B0025Y6C5G&linkCode=as2&tag=nntg-22): ジャンパワイヤーや抵抗、ブレッドボードとArduino UNOのセットです。今回はこれで充分でした。


# やったこと
 - Lチカ(プログラミング無し)
 - Lチカ(プログラムで点滅タイミング(=HIGH/LOW)制御)
 - Analogポート(ADC)からのデータ取得＆Serialコンソールへの表示
 - 測距モジュールからのデータ取得＆Serialコンソールへの表示
 - Visual Microのセットアップ(Arduino用インテリセンスを使いたいため)
 - ESP-WROOM-02経由でWiFi接続＆WebAPIからJSON取得＆Serialコンソールへの表示
 - AVRによる電力管理(まだ理解しきれていない)

# 次やること
 - 重量検知

# 気づいたこと/知ったこと
 - 回路全体で電位を合わせることを意識しよう
 - 電気/通信/組み込み業界の慣習では、GNDに使用するジャンパワイヤーの色は黒。
 - データシートの読み方(特性や性能)
 - Arduino IDEにはインテリセンスがない
 - インテリセンスが欲しい場合はVisual Studioのextention: Visual Microを使う。ただし一長一短あり
 - Serialコンソールでのデバックめっちゃ便利
 - Raspberry PiよりArduino/Arduino互換ボードの方が使い勝手◎、コスト◎
 - 太陽電池は思ったより制御が難しい=電力をどうやってためるか？長期間日照が悪い場合どうするか？などなど考える事が山積みにある
node.jsによるコマンドラインツール 導入

node.jsのスクリプトをコマンドラインツールとして動作させる手順。

linux(OS Xも？)だと[envコマンド](https://linuxjm.osdn.jp/html/gnumaniak/man1/env.1.html)というのがあって、shellを介してこれと連携すれば簡単にできる。

スクリプトの先頭に、

```js
#!/usr/bin/env node
```

と書いてスクリプトに実行権限を付与するだけ。



```js:hello_cls.js
#!/usr/bin/env node
/*
node.jsのスクリプトをコマンドラインツールとして動作させる
 */
'use strinct';
console.log("Hello, CLI.");
```

ならば、スクリプトがあるディレクトリで、

```shell-session:hello_cli.jsを実行

 $ ./hello_cli.js
 Hello, CLI.
 $
```

しかしこれだとPathが通っていなければそのディレクトリでしか実行できない。
スクリプトは実行単位(といえばいいのか)ごとにディレクトリ切ることが多いはずだからPathを通すのは現実的でない。

で、どうするかというと、npmでglobalインストールする。

インストールの設定のためにpackage.jsonファイルを作成する。

```json:package.json
{
		"name": "hello_cli",
		"version": "0.0.1",
		"description": "First node.js script for CLI.",
		"author": "Lin Quan Studio.",
		"engines": {"node": ">=0.10"},
		"dependencies": {},
		"bin": {"hello_cli": "hello_cli.js"}
}
```

`"bin"`にインストールするコマンド名とスクリプトのペアを指定する。

書いたらそのディレクトリで、

```shell-session:グローバルインストール
 $ sudo npm install -g

```

でインストールすればコマンドとして実行できるようになる。

DOS(Windows)のコマンドプロンプトでは、envコマンドがなければスクリプトを直接実行はできないが、グローバルインストールすれば実行できるようになるので便利。

* [GitHub](https://github.com/hayashiisme/node.js-cli/tree/master/hello_cli)
Linux | xargs の -I オプションで 後続コマンドに引数を渡す(的なことをする)


xargs に -I オプションをつけると「後続のコマンドに対して値を渡す」的なことが出来る。

 ( 大文字のアイ ) 

# 例

たとえば、ディレクトリに次のファイルが存在する場合。

- File_A 
- File_B 
- File_C

`ls | xargs` に `-I FILE` を渡すと。
後続の `echo` の中で、 `FILE` と書いた部分が、実際のファイル名に変換されているのが分かるだろう。

```
$ ls | xargs -I FILE echo "FILE exists."

./ exist.
../ exist.
File_A exists.
File_B exists.
File_C exists.
```

# ちなみに

`echo` する内容を引用符 `""` で囲わなくても、動作は同じだった。

```
$ ls | xargs -I FILE echo FILE exists.

./ exist.
../ exist.
File_A exists.
File_B exists.
File_C exists.
```

これは「後続のコマンドに対して、引数が展開される」のではなくて。
「xargs の後に続く **文字列自体** が、いちど **テキスト変換** されてから、後続のコマンドが実行される」という動作のような気がした。

# 補足

ここに明確に `replace-str` って書いてあった。
https://www.gnu.org/software/findutils/manual/html_node/find_html/xargs-options.html

>-i[replace-str]
>Replace occurrences of replace-str in the initial arguments with names read from standard input. Also, unquoted blanks do not terminate arguments; instead, the input is split at newlines only. If replace-str is omitted (omitting it is allowed only for ‘-i’), it defaults to ‘{}’ (like for ‘find -exec’). Implies ‘-x’ and ‘-l 1’. The ‘-i’ option is deprecated in favour of the ‘-I’ option. 

# 参考

- https://www.gnu.org/software/findutils/manual/html_node/find_html/xargs-options.html
- [xargsで、引数を任意の場所に埋め込む](http://d.hatena.ne.jp/iww/20111007/xargs)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
OPcache が有効で且つ PHP-FPM を使用した ウェブサーバで、Symlink ベースのデプロイするとコードが反映されない


## 現象

表題の通りですが、現象を噛み砕いて説明します。

筆者は Symlink ベースのデプロイツール ( Ansistrano ) を使用してデプロイをしています。

※ Symlink ベースのデプロイツールは Capistrano や、Deployer なども含まれます。

デプロイが完了したサーバ側のディレクトリ構造は以下のようになります。

```tree:tree
.
├── current -> ./releases/20160530055905
├── releases
│   ├── 20160530055905
│   ├── 20160530055658
│   └── 20160530050508
└── shared
```

デプロイされると、 `current` ディレクトリはシンボリックリンクとなっており、 `releases` 以下に、デプロイされた最新のアプリケーションコードを指します。
ウェブサーバやアプリケーションサーバの設定ではドキュメントルートに `current` ディレクトリを指してます。

この時、 OPcache が有効で且つ PHP-FPM を使用した Web サーバーではコードが反映されないという現象が発生しました。

## 原因

PHP5.5 以降のコードキャッシュは APC から OPcache を使うようになりました。
APC は、ファイルをキャッシュするために、 inode を用います。 inode はシンボリックを解決し、参照するように働きます。しかし OpCache は inode ベースではありません。 OpCache は、キャッシュする前に絶対ファイルパスを見つけるためにシンボリックリンクを評価するのでデプロイする前のパスを覚えています。

つまり、 **PHP がデプロイされた最新のアプリケーションコードへシンボリックリンクを参照せず、その一つ前の世代のアプリケーションコードを参照している** ということです。

## 解決方法

* Web サーバーのドキュメントルートの設定を直接書き換える
* OPcache をリセットする
* PHP-FPM を再起動する

## ウェブサーバに nginx を利用している場合の解決方法

nginx は、シンボリックリンクを解決できるように設定することが可能です。
nginx の構成では、おそらく以下のような設定となってます。
以下のような設定の場合、 `$document_root` は `current` ディレクトリのシンボリックリンクを解決せずに参照します。

```nginx:/etc/nginx/nginx.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;
```

以下のように `$document_root` から `$realpath_root` を指定するように設定を変更します。
そうすることで `current` ディレクトリのシンボリックリンクを解決し、 `release` ディレクトリ配下のアプリケーションコードの絶対パスを参照できるようになります。

```nginx:/etc/nginx/nginx.conf
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
```

## 参考文献

[PHP's OPcache and Symlink-based Deploys](https://ma.ttias.be/php-opcache-and-symlink-based-deploys "PHP's OPcache and Symlink-based Deploys")
GraphQL, Relay開発を助けてくれそうなツール等

先日、某勉強会で、<a href="https://quramy.github.io/angular2-graphql-note/#/" target="_blank">GraphQLとRelay</a> 関連のネタについてLTをしたのですが、時間切れで最後の方まで語れませんでした。
GraphQL, Relayを学ぶ上で役だったツールやリソースの紹介をしようと思っていたのですが、折角なのでQiitaの方で書いてみようと思います。

## Web Service

### Learn GraphQL

<a href="https://learngraphql.com/" target="_blank">Learn GraphQL</a>

GraphQLの基本をonline で1から学べるworkshopです。GraphQLのクエリの記法や、Relayを学ぶ上で必要不可欠となるFragment, Mutationの概念についても step by stepで学習できます。

取りあえずGraphQLを触ってみたい、という人は一通り叩いてみることをオススメします。

### GraphQL Hub

<a href="https://www.graphqlhub.com/" target="_blank">GraphQL Hub</a>
GithubやReddit, Giphyなど、いくつかのWebサービスのAPIをGraphQLでラップしたエンドポイントです。

### Reindex

<a href="https://www.reindex.io/" target="_blank">Reindex</a>

ReindexはGraphQLのBaaS(Backend as a Service)です。

GraphQLのObject Typeを定義したSchemaのJsonファイルをpushするだけで、そのSchemaに対応したGraphQLのエンドポイントが利用可能になります。

また、自分で定義したTypeに対応したConnectionやEdge等が自動で定義されたり、最初からトップレベルのクエリにviewerが用意されている等、Relayフレンドリーです。
もし貴方がGraphQL/Relayのクライアント部分を手軽に作ってみたい、と思っているのであればうってつけのサービスです。

### Graph.cool

<a href="https://graph.cool/" target="_blank">GRAPHCOOL</a>

Graph.coolもGraphQL/RelayのBaaSです。Reindexは、手元のエディタでSchemaのJSONを編集してpushしますが、Dashboard上でModel定義を編集します。

## Tools

### graphiql-app
<a href="https://github.com/skevy/graphiql-app" target="_blank">graphiql-app</a>

GraphQLの対話コンソール, graphiql(ぐらふぃくる、と発音するようです)をElectronでラップしたアプリ。

複数のクエリを保存しておけるので、特にServer Sideの開発中に便利です。

### GraphQL Network
<a href="https://chrome.google.com/webstore/detail/graphql-network/igbmhmnkobkjalekgiehijefpkdemocm?hl=en-GB" target="_blank">GraphQL Network</a>

Chromeの開発者ツールにGraphQLの通信内容の詳細が表示されるようになります。

### vim-graphql

<a href="https://github.com/jparise/vim-graphql" target="_blank">vim-graphql</a>

GraphQLのsyntax highlight用プラギンです。

以前、JSのTemplate Stringsに任意のsyntax highlightを当てるプラギン <a href="https://github.com/Quramy/vim-js-pretty-template">vim-js-pretty-template</a> を作っているので、Relayのコード中のGraphQLをvimで綺麗に表示できて便利です。

```js
export const UserContainer = Relay.createContainer(UserComponent, {
  fragments: {
    // ↓にhighlightが当たる
    user: () => Relqy.QL `
      fragment on User {
        id, name
      }
    `,
  },
});
```

## 勉強する上で注意した方が良いこと

僕はてっきり、「GraphQLに対応したServerを用意すればRelayから接続できるようになる！」と思っていましたが、これには若干の勘違いがありました。

Relayのドキュメントに <a href="https://facebook.github.io/relay/docs/graphql-relay-specification.html#content" target="_blank">GraphQL Relay Specification</a> という章があり、ここを読むと詳細が書いてあるのですが、**RelayはGraphQLのEndpointに対して、Schemaに幾つかの約束事を強制します**。 例えば、「1対多のリレーションを表現するときはConnectionというTypeを使うこと」といった具合です。

これはRelayが効率的にMutationやPagingを処理するため必要とされているのですが、GraphQL関連の資料だけを読み込んでいてもこの話は触れられないことが多いです。

もし、RelayからGraphQLを使ってみたい、と考えているのであれば、早めに上記RelayのGuideに目を通しておくことをお勧めします。
Macの環境構築をAnsibleに任せる


今までMacで開発環境を構築するたびにブログなどに書いておいた一連の手順を追いながらひとつひとつ作業していましたが、それも面倒なのでこれからは「動くドキュメント」としてAnsibleのPlaybookを書いておいてそれを流すだけで構築できるようにしようと思います。

## 事前準備

まずはAnsible自体をインストールしなければならないので、そのために自分の場合はhomebrewを入れておきます。homebrewを入れるためにXcodeとXcodeのCommand Line Toolを入れておきます。

## ローカル環境構築の設定[^1]

```hosts.ini
[default]
localhost
```

```playbook.yml
- hosts: localhost
  connection: local
```

## ローカル環境でよく使いそうなmodule

### homebrew

Ansibleにはhomebrewモジュールがあり、homebrewでインストールするライブラリを管理できます。

```playbook.yml
- name: Update homebrew itself first
  homebrew: update_homebrew=yes
```

```playbook.yml
- name: Install homebrew packages
  homebrew: name={{ item }}
  with_items:
    - git
    - ag
    - tree
```

### homebrew_cask

homebrew caskを使えばDropboxやEvernoteなど、GUIアプリケーションもコマンドラインから管理できます。そしてbrew caskのモジュールもAnsibleには用意されています。

下の例では、まずhomebrew_tapでhomebrew cask用のリポジトリを追加し、その後に各アプリケーションをインストールしています。


```playbook.yml
- name: Add homebrew tap repositories
  homebrew_tap: tap={{ item }} state=present
  with_items: 
    - caskroom/cask
```

```playbook.yml
- name: Install Homebrew cask packages
  homebrew_cask: name={{ item }}
  with_items:
    - dropbox
    - evernote
    - coteditor
```

### git

gitはサーバー環境設定でもよく使うと思いますが、 ローカルでもdotfileをpullしてきたりgithub上のリポジトリをcloneしてきたりと 使う場面が多いと思います。

下の例では、自分のgithubアカウントなどにあらかじめpushしておいたdotfilesをpullし、更新があればホームディレクトリにコピーしています。 `force=no`となっているので既に存在していればコピーはされないようになっていますがこの辺は好みですかね。

```playbook.yml
- name: Pull dotfiles
  git: repo=git@github.com:foo/dotfiles.git dest=/path.to/tmp/dotfiles
  register: pull_dotfiles_result
```

```playbook.yml
- name: Copy dotfiles
  copy: src=/path.to/tmp/dotfiles/{{ item }} dest=~/{{ item }} force=no
  with_items:
    - '.bashrc'
    - '.vimrc'
    - '.gitconfig'
  when: pull_dotfiles_result | changed
```

## そのほかやりたい事

### Karabinerの設定を同期したい

Macのキーボード設定の定番となっているKarabinerも同期したいと思います。事前準備として、あらかじめKarabinerの設定をスクリプト化して、githubなどに上げておきます。

```
/Applications/Karabiner.app/Contents/Library/bin/karabiner export > /path.to/karabiner-import.sh
```

このスクリプトを実行すれば設定をimportできるのでansibleのscriptモジュールを使って実行します。

```playbook.yml
- name: Pull karabiner settings
  git: repo=git@github.com:foo/karabiner-settings.git dest=/path.to/tmp/karabiner version=master
  register: pull_karabiner_settings_result
```

```playbook.yml
- name: Import Karabiner settings
  script: /path.to/tmp/karabiner/karabiner-import.sh
  when: pull_karabiner_settings_result | changed
```

### システム環境設定を変更したい

トラックパッドの設定やDockの設定など、Macのシステム環境設定を変更したいですが、今のところまだできていません。Apple Scriptでできたりしないか検討中です。

## 参考

- [Mac の開発環境構築を自動化する (2015 年初旬編)](http://t-wada.hatenablog.jp/entry/mac-provisioning-by-ansible)
- [Ansible Documentation](http://docs.ansible.com/ansible/)

[^1]: ローカルで動かす場合はこれらの記述はなくても動くかもしれませんが未検証です
mysql5.7でパスワードを変更する

## 環境
CentOS7.1 (Vagrant)
MySQL 5.7.13
インストールは[こっち](http://qiita.com/RyochanUedasan/items/fc0d0aa4a88a7aa1324d)

## 問題
MySQLをインストールして、`$ mysql -uroot -proot` で入ろうとしたら以下のエラー

```bash
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

MySQL5.7では初期パスワード（ランダム文字列）が発行されているらしい。面倒くさいので、rootユーザーのパスワードをrootに変更したい。

## 手順
初期パスワードは/var/log/mysqld.logに出力されている。

```bash
[vagrant@localhost ~]$ sudo cat /var/log/mysqld.log | grep "temporary password"
... 
..temporary password is generated for root@localhost: ********
...
```
このパスワードを利用してrootでmysqlに入る。

```sql
mysql> SHOW VARIABLES LIKE 'validate_password%'; # パスワードの設定を確認
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
```
と思ったら、先にパスワード変更を求められるので、

```sql
mysql> set password for root@localhost=password('root');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```
とするとこれも怒られる。どうも、[ここ](https://dev.mysql.com/doc/refman/5.6/ja/validate-password-plugin.html)によれば、validate_password_policyの初期値はMEDIUMで、パスワード設定に必要な条件は

> MEDIUM ポリシーは、パスワードが最低 1 つの数値文字を含み、1 つの小文字および大文字を含み、1 つの特殊文字 (英数字以外) を含む必要があるという条件を追加します。 

らしい。ので、適当な文字列を作成して、

```sql
mysql> set password for root@localhost=password('passwordPASSWORD@999');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW VARIABLES LIKE 'validate_password%'; # 再度パスワードの設定を確認
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
6 rows in set (0.01 sec)
```
パスワードをrootにするには、validate_password_length = 4 に、validate_password_policy = LOW にする。

```sql
mysql> SET GLOBAL validate_password_length=4;
mysql> SET GLOBAL validate_password_policy=LOW;
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
6 rows in set (0.00 sec)
mysql> set password for root@localhost=password('root');
```
これで、rootに変更！

参考リンク：
[MySQL 5.7 をインストールしたら最初に行うセットアップ](http://weblabo.oscasierra.net/mysql-57-init-setup/)
[mysqlのパスワード変更ができない！！！](http://music431permemo.blogspot.jp/2016/01/mysql.html)
Parallelを使って並列処理してその結果をactiverecord-importでupdateする

Rubyで並列処理を書くときに便利な[Parallel](https://github.com/grosser/parallel)で何か処理してその結果を[activerecord-import](https://github.com/zdennis/activerecord-import)でbulk updateする方法について。

例ではImageモデルに紐づく画像をParallelでダウンロードしてきて、Imagemagickなどで処理を施し、結果をbulk updateする場合を扱う。

# threadを使う場合

必要な処理の部分だけ端折って書くとこんな感じ。

並列にしたい部分をParallelで囲むだけ。

```rb
require 'parallel'
require 'activerecord-import'

columns = [:id, :status]
Image.find_in_batches(batch_size: 1000) do |images|
  Parallel.each(images, in_threads: 4) do |image| 
    # 画像をdownloadしてrmagickなどで処理をしてどこかにアップロードする処理など
    ...

    # updateしたいカラムの更新(準備)。
    # ここでは処理済みの画像に完了フラグを立てる。
    image.status = 1
  end

  # bulk updateの実行
  values = images.map{|u| [u.id, u.status]}
  Image.import(columns, values, on_duplicate_key_update: [:status], timestamps: false, validate: false)
end
```


# processを使う場合

threadで並列実行する際の問題点としては、マルチコア環境でコアをすべて使い切れないこと。

Rubyでthreadを使う場合はGVLがあるのでコア数分だけthreadを動かすということができないらしい。

今回の例だとダウンロードやアップロードがボトルネックになる場合はthreadでもprocessでもあまりスピード差はでない。けれど、rmagickでの処理で結構重たいことをやる場合、つまりCPUバウンドなときなどはコアをフルで使い切れるprocessを使ったほうが速度がでることが多い。

ただ、threadのときと違い、processを利用する場合はimagesを直接updateできないので少し工夫が必要になる。

```rb
require 'parallel'
require 'activerecord-import'

columns = [:id, :status]
Image.find_in_batches(batch_size: 1000) do |images|
  # mapを利用して更新した結果をprocessから受け取る
  results = Parallel.map(images, in_processes: 4) do |image| 
    # 画像をdownloadしてrmagickなどで処理をしてどこかにアップロードする処理など
    ...

    # updateしたいカラムの更新(準備)。
    # ここでは処理済みの画像に完了フラグを立てる。
    image.status = 1

    image # mapに更新したオブジェクトを返す
  end

  # bulk updateの実行
  # parallelから返された結果を利用する
  values = results.map{|u| [u.id, u.status]}
  Image.import(columns, values, on_duplicate_key_update: [:status], timestamps: false, validate: false)
end
```

# 参考

[Rubyでforkを利用したマルチプロセスでコアを使い切りたい気持ち](http://qiita.com/yuroyoro/items/92c5bc864fa9c05127a9)
ノーツ(LotusScipt)で、任意のネットワーク共有フォルダ・ファイルを開く

OS（Windows または Macintosh）にあわせてネットワーク共有 (SMB) されているフォルダや、その中のファイルを開くスクリプトです。ファイルを指定した場合、いわゆる「既定のプログラム」として登録されているアプリケーションで開かれます。
#スクリプト
```vbnet
Public Function OpenFolder(ByVal pathUNC As String) As Boolean
	Dim ss As New NotesSession
	
	Dim platform As String
	platform = ss.Platform

	Dim ret As Integer
	
	If platform Like "Windows*" Then
		ret = Shell(|explorer.exe "| + pathUNC + |"|, 1)			
	Elseif platform Like "Macintosh*" Then
		Dim pathSMB As String
		pathSMB = Replace(Replace(pathUNC, "\\", "smb://"),"\","/")
		ret = Shell(|open "| + pathSMB + |"|, 1)			
	End If
	
	If ret = 33 Then
		OpenFolder = True
	End If
End Function
```

#補足
+ [NotesSession](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_NOTESSESSION_CLASS.html) オブジェクトの [Platform](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_PLATFORM_PROPERTY.html) は、動作している OS の種類を返します。例：Windows/32, Macintosh/64（Notes 8.5 くらいまでは Macintosh と返していたけれども、Notes 9.0.1 では現況で Macintosh/64 のように返します。よって公式ヘルプはちょっと間違いアリ）
+ [Shell](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/com.ibm.designer.domino.main.doc/LSAZ_SHELL_FUNCTION.html) 関数の第2引数は、ウインドウをどのように開くかを指定します。通常＆フォーカスなら 1、最大化するなら 3です。戻り値が 33 の場合は、処理成功だそうです。
+ 念のために、フォルダパスは二重引用符でくくっています。万能かは不明ですが、私の環境では全角文字も大丈夫でした。
+ Linux などの場合は、open でいけるのでしょうかね...
`rails s -b 0.0.0.0`の代わりに`rails s`を使いたい

stackoverflowに乗ってた。

http://stackoverflow.com/questions/27627286/cant-connect-localhost3000-ruby-on-rails-in-vagrant

# 解決方法

config/boot.rbに以下を追記してください

```rb
require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => '0.0.0.0')
    end
  end
end
```
PHPのビルトインサーバとHomebrewでインストールしたMySQLについて

PHP5.4.0から簡易的にWEBサーバを立てれる機能が追加されましたね。

[PHP公式](http://php.net/manual/ja/features.commandline.webserver.php)

この機能、とても使えます。

PHPをにわか程度にしか使っていないので、バリバリ書いている人の感想はわかりません。

僕は、APIを扱う時やajaxでクロスドメイン制約を考慮した時などに使ってきました。

MySQLはHomebrewでインストールしています。

# 問題

ある日、PHPとMySQLを使って簡易的なシステムを作ることになりビルトインサーバでやれば簡単だし、mysqlへはPDOを使えば楽勝だと。

その日は思っていました........

この機能ほんと便利で、ディレクトリをそのアプリのルートに移動して

```
php -S localhost:8888
```

とかしてやれば、localhost:8888にそのディレクトリがルートのwebサーバが立ち上がります。

PDOにも慣れてきて、コードを書き進める手が休むことを知りません。

「さて、見てみるか。」

***No such file or directory***


は？( ? _ ? )

DB接続に関しては、同じコードなので間違えてはないぞ。。

なぜだ、、、、

調べてみました。

**「ビルトインサーバからデータベース接続はエラーが出ます。」**

どうやら、超便利なビルドインサーバですが、DB接続は初期のままだとエラーが出るらしい。

では解決法。

# 解決

いくつか方法はあるようです。

- php.iniでパスを書き換える
- MAMPに変える

この２つを僕自身が検証したので、この２つを紹介したいとおもいます。

ではまず、「php.ini」を書き換える方法

## php.iniを書き換える

まずmysqlソケットプロセスのパスを確認します。

```
$ mysql_config --socket
> /tmp/mysql.sock
```

僕の場合は、`/tmp/mysql.sock`でした。

ではPHPはどこを目指しているか。

```
$ php -i | grep socket
> mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
  mysqli.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
  pdo_mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
```

この3つも見てもらうと分かりますが、

PHPは`/var/mysql/mysql.sock`
MySQLは`/tmp/mysql.sock`

になっています。

では、php.iniに変更をかき加えよう。

php.iniを開き

`mysql.default_socket`,`mysqli.default_socket`,`pdo_mysql.default_socket`の3つを、`'/tmp/mysql.sock'`に合わせてみましょう。


ここまでしたら、

```
$ php -i | grep socket
```

先ほどと同じように確認すると同じになっているのが確認できると思う。

## MAMPを導入する

正直、これが一番楽だし管理も簡単です。

MAMPというソフトをダウンロードしてきます。

[MAMP](https://www.mamp.info/en/)

インストールしたら開いて設定をしましょう。

![スクリーンショット 2016-06-13 11.53.21.png](https://qiita-image-store.s3.amazonaws.com/0/90347/ade2bea7-496c-0528-c807-f68259a6ed4a.png)

この設定の上のタブからWEBサーバを選びます。

ApacheとNginxというWEBサーバが用意されていますが、apacheのままで大丈夫です。

ドキュメントルートという文字の横のフォルダのマークをクリックして、

`php -S localhost:8888`を実行していたディレクトリを選択してください。

そのあとサーバ起動というボタンで、apacheとmysqlが立ち上がります。

mysqlのユーザとパスワードですが、デフォルトでは

```
user-> root
password-> root
```

になっています。

サーバ起動ボタンを押すと、webページが開くと思います。

そこからphpmyadminを開けば、視覚的にデータベースを操作できます。

windowsではxampと言われるものがあったりするので、参考程度にしてください！
チームビルディングのためのエンジニア合宿

ハッカソンのための開発合宿の記事はよく見かけるのですが、チームビルディングのためのエンジニア合宿はあまり見かけないですよね。話を聞いてみると[トレタ](http://tech.toreta.in/)では定期的にやっているみたいなので他でもクローズドでやっているのかもしれませんね。

シリコンバレーだとけっこうやっていて成果が出ているらしいからというのもあるんですが、私は個人的にメリットが多いと思っているので、チームビルディング合宿のことを書いていきます。

エクスペリエンスを知りたい方は開発者ブログ（[チームビルディングのためのエンジニア合宿をしてきました！](http://tsukuru.leadingmark.jp/entry/2016/06/13/113342)）に投稿してありますので、そちらを参照してください。この記事ではスペックを書いていきます。

#なぜチームビルディング合宿をしたのか
私が今の会社にジョインしたのが3月で、それまではエンジニア2名体制でやっていましたが、レクミーのサービス検証フェーズが終わり、拡大フェーズに入っていくタイミングで私と同時期に2名のエンジニアがジョインして、チームの人数が5名になり倍以上になりました。過半数以上の人が別々のカルチャーを持っていたらそれはもう今までとは別のチームです。

「なにをするか」よりも「どうあるべきか」を決めなければまずいと思い、3月1日に入社して、3月14日には合宿に行きました。組織改善でCMMIをやるところは多いと思いますが、失敗例として多いのが「どうあるべきか」をないがしろにして「なにをするか」で進めてしまうことです。腹落ちしていないのにやるべきことを羅列して進めると最初はうまくいっても続かないことが多いですね。

![合宿プログラム.jpg](https://qiita-image-store.s3.amazonaws.com/0/39597/082c54d7-0c7b-3ed6-b3bd-0bda8530933a.jpeg)

チームビルディングでは基本的な考え方だと思いますが、Be→Do→Haveの順で決める必要があるということです。

#チームビルディングの流れ
Be→Do→Haveの順で進めたわけですが、実際にどういった流れで進めたいったかと言うと。

##Be
![合宿プログラム のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/39597/52b975b9-c60a-0a3a-2a1f-8fd4513881ac.jpeg)

まず相互理解のためにお互いの「強み」を他己紹介形式でやったり、各人がどういったことをやりたいと思っているのかを共有しました。

次に、各人に理想のチームとはどんなものかを挙げてもらったのですが、箇条書きよりは実際にどんなチームなのかイメージしやすいように、絵や図にして描いてもらい、それを元に皆に共有する形式でやりました。

最後に理想のチームで出た意見をまとめて行動規範としました。

![ITEチームビルディング のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/39597/fcc1c350-97d2-9246-7679-d2e6baa46e30.jpeg)

GoogleのHRTは本当によくできていて、自己・他者・関係についていくつか意見は出たのですが、自己＋他者＝関係と形で分類してまとめることができました。自己がどうあるべきかと、他者に対してどう接するべきか、その結果として関係が構築されるということですね。

##Do
![合宿プログラム のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/39597/e4a9a0ad-a98d-8b83-8f97-6555e644ce2a.jpeg)

このあたりのナレッジはもう語り尽くされていると思うので簡単に説明すると、スクラム＋CMMIという感じですね。KPTでProblemとTryを洗い出して、CMMIに落とし込んでいくという感じです。

##Have
![合宿プログラム のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/39597/3b454ea2-2a8c-4273-a094-7edeffcb5c6f.jpeg)

KPTで出た「現状強み」と「課題を解決できたときにできる強み」を元に技術的ビジョンと組織的ビジョンに分類し、画像では戦略に落としこむことになっていますが、結果として１つのビジョンにまとまったので、それを目標とすることで認識の共有ができました。

![ITEチームビルディング のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/39597/2ac20635-e8c7-4a63-ddb2-5d6c4e2948f5.jpeg)

エンジニアリングではよくある、品質・納期・コスト・スコープの４つの変数と似ていますね。フレームワークの再発明というか、フレームワークを作る過程を体験することでよりフレームワークに対する理解が深まる結果となりました。

正確には品質＝品質、納期＝スピード、コスト＝成長、スコープ＝集中ということで、「最高の品質のプロダクトを最速のスピードでユーザーに届ける」という技術的ビジョンと、「エンジニアとして成長し続け、やるべきことに集中できる環境を作る」という組織的ビジョンに分類されます。そのために必要なのがBeで決まった信頼関係の構築が必要だという結果になりました。

#チームビルディング合宿をやってみて
合宿の成果としては「どうあるべきか」と「目指すべき姿」の認識の共有ができたことが一番大きかったですね。その後の目標設定や振り返りのベースとなる軸が作れたことでブレないチームになりました。

新規事業も始まりエンジニアが圧倒的に足りない状況なので積極的に採用していますが、メンバーが増えた際にはまた認識を共有するために定期的にチームビルディング合宿をやろうと思っています。
【appium】[Android]画面外の要素までスクロールしてclick


# 1. はじめに
androidのテスト自動化で、アプリの画面外要素を拾う時に
「swipeじゃ嫌です」

って言われました。
それまではこんな感じでした。

```rb:swipeのサンプルコード

sleep(2)
swipe :start_x => 500, :end_x => 500, :start_y => 700, :end_y => 400, :duration => 300
sleep(2)
swipe :start_x => 500, :end_x => 500, :start_y => 400, :end_y => 700, :duration => 300
sleep(2)
swipe :start_x => 500, :end_x => 500, :start_y => 400, :end_y => 700, :duration => 300
```

微笑ましいを通り越して、ダサいと思ったので、
公式ドキュメントを一生懸命読みましたら、なんとか解決しましたので投稿します。

# 2. 実行環境

|items|version|notes|
|---|---|---|
|appium|1.5 or later|locatorにnameが使えなくなってるが克服済|
|Android|4.2 or later|selendroid守備範囲外|
|Ruby|2.3 or 2.1.5|windowsの場合2.1.5で|
|設定アプリ|-|サンプルコードはAndroidのプリイン「設定」アプリで動かしています|

# 3. サンプルコード
(1) やりたいこと
Androidの設定アプリを起動して、
画面外の「画面設定」項目までスクロールしてタップ。

(2) スクロールしてタップ。の部分のコード

```rb:画面外要素「画面設定」までスクロールしてタップ
find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).getChildByText(new UiSelector().className("android.widget.TextView"), "画面設定")').click
```

(3) 解説
出処はappium.ioなんですね(公式最強説)
http://appium.io/slate/en/master/?ruby#uiautomator-uiselector

appiumは要素の拾い上げにUiSelector, UiScrollableをサポートしてる
そうなので、画面外要素を見つけに行くためUiScrollableを利用します。
んで、公式のサンプルを真似っこして上記のコードを作成。

```rb:コードの解説
find_element
 (:uiautomater,
  'new UiScrollable(
    new UiSelector().scrollable(true).instance(0))
    .getChildByText(
    new UiSelector().className("android.widget.TextView"), "画面設定")').click

【解説】
1行目: 要素を探すfind_element
2行目: UiAutomater属性で検索
3行目: UiScrollableオブジェクトを生成
4行目: UiScrollableのなかでUiSelectorオブジェクトを生成、スワイプしつつアイテム検索できるオブジェクトにする
5行目: 検索用のオブジェクトを渡すメソッド
6行目: android.widget.TextView要素の値が「画面設定」の要素を探してクリック。
```

(4) コード全体

```rb:端末のスリープ設定値が30秒であることをテスト
# viva test automation

# require gems
require 'rubygems'
require 'spec'
require 'appium_lib'
require 'sauce_whisk'
require 'selenium-webdriver'

# capabilities
describe 'pre in app update' do
  def desired_caps
    {
      caps:  {
        platformName:     'Android',
        deviceName:       'adb devices | grep -e "device$" | sed -e "s/device//"',
        appPackage:       'com.android.settings',
        appActivity:      '.Settings'
      },
      appium_lib: {
        wait: 10
      }
    }
  end

  before do
    Appium::Driver.new(desired_caps).start_driver
  end

  after do
    driver_quit
    sleep(5)
  end

  it 'screen settings' do
    Appium.promote_appium_methods Object
    find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).getChildByText(new UiSelector().className("android.widget.TextView"), "画面設定")').click
    sleep(3)
    find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).getChildByText(new UiSelector().className("android.widget.TextView"), "スリープ")').click
    check = find_element(:xpath, "//android.widget.CheckedTextView[@checked='true']").text
    expect(check).to include ("30秒")
  end

end

```

# 4. あとがき

特に解説部分なんか、
オブジェクトとかクラスとかメソッドとかちゃーんと理解できてない気がするので
きっと後から「バカなこと書いてんなー」と思うんだろうな…

勉強します。ハイ。
Tensorlflowを使ったx個の素性からy個に分類するdeeplearning

inputデータは,np.arrayで用意してください

trainデータは、毎回変わるようにするか、バッチで抽出するようにして、学習させる方が良いです。
隠れ層の数は何が適切でわからないので、もう１段for文を加えて比較するとかが良いかと思います

```
#x個の素性からy個に分類するdeeplearning
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
 
#inputデータは,np.arrayで用意してください

#あらかじめ決める値
NUM_IMPUT = 45
NUM_HIDDEN1 = 15
NUM_OUTPUT = 3
TRAIN_TIMES = 101
#関数
def inference(x_placeholder):
    with tf.name_scope('hidden1') as scope:
        hidden1_weight = tf.Variable(tf.truncated_normal([NUM_IMPUT, NUM_HIDDEN1], stddev=0.1), name="hidden1_weight")
        hidden1_bias = tf.Variable(tf.constant(0.1, shape=[NUM_HIDDEN1]), name="hidden1_bias")
        hidden1_output = tf.nn.relu(tf.matmul(x_placeholder, hidden1_weight) + hidden1_bias)
    with tf.name_scope('output') as scope:
        output_weight = tf.Variable(tf.truncated_normal([NUM_HIDDEN1, NUM_OUTPUT], stddev=0.1), name="output_weight")
        output_bias = tf.Variable(tf.constant(0.1, shape=[NUM_OUTPUT]), name="output_bias")
        output = tf.nn.softmax(tf.matmul(hidden1_output, output_weight) + output_bias)
    return output
def loss(output, y_placeholder, loss_label_placeholder):
    with tf.name_scope('loss') as scope:
        loss = tf.reduce_mean(-tf.reduce_sum(y_placeholder * tf.log(output), reduction_indices=[1]))
    return loss
def training(loss):
    with tf.name_scope('training') as scope:
        train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
    return train_step
 
y_placeholder = tf.placeholder("float", [None, NUM_OUTPUT], name="y_placeholder")
x_placeholder = tf.placeholder("float", [None, NUM_IMPUT], name="x_placeholder")
loss_label_placeholder = tf.placeholder("string", name="loss_label_placeholder")
output = inference(x_placeholder)
loss = loss(output, y_placeholder, loss_label_placeholder)
training_op = training(loss)
correct_prediction = tf.equal(tf.argmax(output,1), tf.argmax(y_placeholder,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
best_loss = float("inf")
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
#実行

for step in range(TRAIN_TIMES):
    x_train,y_train=xxxxxxxxxxxxxx
    feed_dict_train={y_placeholder: y_train,x_placeholder: x_train,loss_label_placeholder: "loss_train"}
    if step%20 == 0:print "step %d, train accuracy %g"%(step,accuracy.eval(feed_dict=feed_dict_train))
    sess.run(training_op, feed_dict=feed_dict_train)

x_test,y_test=xxxxxxxxxxxxxxxxxxx
feed_dict_test={y_placeholder: y_test,x_placeholder: x_test,loss_label_placeholder: "loss_test"}
print "test accuracy %g"%(accuracy.eval(feed_dict=feed_dict_test))
y_pred = sess.run(output, feed_dict=feed_dict_test)
print y_pred
 
#a=[y_pred[:,0],y_pred[:,1],y_pred[:,2],y_test[:,0],y_test[:,1],y_test[:,2]]
#with open('pred.csv', 'w') as f:
#    writer = csv.writer(f)
#    writer.writerows(a)

```
これいい
http://dev.classmethod.jp/machine-learning/tensorflow-math/

パラメータチューニングのコツ
http://www.atmarkit.co.jp/ait/articles/1512/16/news020.html
Ajaxなどで変更したDOMに対するイベント

メモ書き程度に書いておきます。

ajaxなどで変更したDOMに対するイベントとは。

例えば以下のような時です。

```js
$.ajax({
  url: "ex.php",
  type: "GET",
  data: {
    id: 1
  },
  success: function(data){
    $("ul").append("<li>"+data+"</li>");
  }
});
```

jQuery Ajaxの書き方はそれぞれあると思うので、ここでは触れません。

とても適当な例ですが、`ex.php`に対してGETメソッドを使い、id=1を送っています。

その結果が`success`の`data`に返ってきます。

そのdataをli要素としてulに追加している。という状態です。

この時に、ulはもともと書かれていますが、li要素はajaxでとってきてから初めてDOMに反映されます。

これを**ajaxなどで変更したDOM**と今回はさせていただきます。

ではこのli要素をクリックしたら`alert()`で中身を出力したいと思います。

よくある例として

```js
$("li").on("click",function(){
  alert($(this).text());
});
```

`on`を利用したイベントバインドですね。

ですが、このコードは先ほどの**ajaxなどで変更したDOM**の場合動きません。

***じゃあどうしたらいいんだよ！！！***と。

こうしましょう

```js
$("ul").on("click","li",function(){
  alert($(this).text());
});
```

`on`はul>liを監視するようになります。

これはulを見に行ってからliを探すので、見つかるというわけですね。

リファレンスにもこのように書かれています。

>.on()では選択要素とセレクターがありますが、選択要素は.onメソッドが呼ばれる前にページ上に存在している必要があります。 .on()のような委任タイプのイベントの利点として、もし新しい要素が後からjavaScriptの動的な処理によって選択要素内に追加されたとしても、 セレクタにマッチしていればその新しい要素に対してもイベントハンドラが有効になります。

子要素のイベントを親要素、その親要素とどんどん繋がっていってしまうことがあります。

これを**イベントバブリング**と言います。

このイベントバブリングを利用した手段というわけですね！

もっと詳しく知りたい方は下のURLから参照してください。

[JavaScript初級者から中級者になろう](http://uhyohyo.net/javascript/3_3.html)

[[jQuery]イベントのバブリングって何？](http://taneppa.net/jquery-bubbling/)
magitで変更したファイルを元に戻す(コミットを戻すんじゃないよ)

- コミット単位で戻すなら `magit-reset` とかだと思うけど、ファイル単位なら `magit-file-checkout`
- `magit-status` のバッファで、戻したいファイルの上で `M-x magit-file-checkout`
- キーは割り当てられてないみたい
- 最初に戻したい revision を聞かれるけど、大体デフォの master でいいと思う
- `Untracked files`, `Unstaged changes`, `Staged changes` どれでも効いた
Unity+ニフティクラウドモバイルバックエンドでINSTALL_PARSE_FAILED_MANIFEST_MALFORMEDエラー

Unityにニフティクラウドモバイルバックエンドを導入したらAndroidデバイスへビルドできなくなった

ドキュメントには見当たらなかったのでメモとしてここへ

``` log:エラー内容
Installation failed with the following output:
	pkg: /data/local/tmp/Package.apk

Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]
```

Assets/Plugins/Android/AndroidManifest.xml
ファイルの`YOUR_PACKAGE_NAME`の部分を自分のパッケージ名に修正(複数個所あり)したら治った。


パッケージ名は、`Build Settings` > `Android` > `Player Settings` > `Bundle Identifier` に書いてあった
ubuntuでmatplotlibのfontを設定

# UbuntuにあるFontをチェック

https://wiki.ubuntulinux.jp/UbuntuTips/Desktop/InstallFont#A.2BYktS1TBnMKQw8zC5MMgw.2FDDrMFkwiw-

フォントの一覧表示

```bash
fc-list|less
```

自分が使いたいフォントがあるかどうかをチェック

例：`Takao`を含むフォントがあるかどうか

```
fc-list|less | grep Takao
```


#必要なフォントをダウンロード

https://github.com/blagarde/midori/blob/master/fonts-japanese-gothic.ttf
https://github.com/marcan/blitzloop/blob/master/TakaoPGothic.ttf <- これがなくなってたので以下のを試した(2017/10/07)

https://github.com/byrongibson/fonts/blob/master/backup/truetype.original/takao-gothic/TakaoPGothic.ttf

今回はこの2つをダウンロード

#ダウンロードしたフォントを配置

上の2つを置いてあるディレクトリ上で、以下を`/usr/local/share/fonts/`へコピー

```bash
cp *ttf /usr/local/share/fonts/
```


# matplotlibの設定ファイルにfontを設定

設定ファイルの位置は以下で確認

```python
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
'/home/foo/.config/matplotlib/matplotlibrc'

```

`~/.config/matplotlib/matplotlibrc`に以下を書けば良い、

```
font.family: (自分の使いたいフォント)
```

今回は、

```
font.family: TakaoPGothic
```

とした。

# MatplotlibのFontキャッシュ削除

最後に、[matplotlibで日本語を描画 on Ubuntu](http://qiita.com/conta_/items/4b031a44acceb137ec73) の記事であった大事なこと！

Fontのキャッシュを削除
```
rm ~/.cache/matplotlib/fontList.cache
```

ファイル名が異なる場合もあるので、`~/.cache/matplotlib/`以下でfontListがついてるファイルを見つけて削除する
.htaccessの設定メモ

ubuntu14.04 さくらサーバーでのhtaccess設定メモ　備忘録。

## .htaccessを作成

アクセス制限をかけたいディレクトリに移動

```
vim .htaccess
```

以下を記述

```
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /home/ubuntu/.htpasswd "#.htpasswdを好きな場所に置き指定"
require valid-user
```

## .htpasswdを作成

以下のようなhtpasswd作成ツールを使用すると楽

.htpasswdファイル生成(作成)

>http://www.luft.co.jp/cgi/htpasswd.php

<img width="659" alt="Screen Shot 2016-06-13 at 10.23.08 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/119345/5ce4a763-48e5-e6ae-e98b-bc5ac2511537.png">

<img width="668" alt="Screen Shot 2016-06-13 at 10.23.16 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/119345/9bb8569b-25eb-3746-8da3-35319e337382.png">

.htpasswdの部分をコピーする。

先ほど指定したhtpasswdを設置するディレクトリに移動し

```
vim .htpasswd
```

コピーしたパスワードをペースト

```
test:t7m7HYtyrrr/g
```

## VirtualHostの設定

AllowOverride をAllに設定する

```
<Directory /var/www/html/>
        AllowOverride All
</Directory>
```


## Apacheを再起動

```
/etc/init.d/apache2 restart
```

動作確認できた。

<img width="395" alt="Screen_Shot_2016-06-13_at_10_29_33_AM.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/119345/60e455bd-9658-d2db-2e6b-1c544913a252.jpeg">

## IP制限の掛け方

.htaccessに以下を追記する。

```
order deny,allow
deny from all          #全てのホストを拒否する
allow from 許可したいIP1  #許可するホストだけ指定
allow from 許可したいIP2  #追加する分は追記
```

以上。
暗号プロセッサのオープンソースハードウェア OpenICF3

:::note warn
警告
2016年に初公開したときはオープンソースハードウェアでしたが、結局、暗号プロセッサであるため、お金をかけて輸出規制などの問題を考えて無料公開することができず、個別対応のオープンソースになっています。
:::
:::note info
参考
暗号プロセッサICF3を8bit CPUにしたICF3-Zをオープンソースとして公開しています。
[https://icf3z.idletime.tokyo/](https://icf3z.idletime.tokyo/)
:::

## 暗号プロセッサ
楕円暗号を処理するためには、ある程度、複雑な処理が必要である。
専用演算器にCPUを組み合わせることでも暗号演算は可能だが、セキュリティがない。
そこでCPUの支援なく暗号演算が可能な暗号プロセッサが必要になってきた。

## OpenICF3
1999年 日立製作所のメインフレームMP5600EXの内蔵暗号装置にICF3という暗号LSIがあった。
RSA演算器、SHA-1演算器、Multi2演算器、DES演算器を搭載していた。
**当時、世界最高速でRSA暗号を演算できた。**
OpenICF3は、このICF3をベースにRSA演算器を中心としたオープンソースハードウェア。

## OpenICF3のRSA演算器
OpenICF3はICF3のRSA演算器と同一です。RSA演算器の内部に簡素なCPUを持っているため、RSA演算器を暗号プロセッサと呼んでいます。ICF3は1999年製なので現時点で安全な鍵長の暗号を演算できるか？という質問をするなら「演算できます」が答えになります。
演算器は1024bitですがRSA暗号では中国人剰余定理を使うことで2048bitが演算できます。
楕円暗号も安全な鍵長は長くなっていますが521bit程度なので、むしろ1024bitの演算器が、ちょうど良い感じになっています。
**性能はかなり落ちますが中国人剰余定理を使わないRSA 2048bitや、中国人剰余定理を使ったRSA 4096bitも可能**


## OpenICF3の設計思想
- 極めて簡素なハードウェアでありながら、組み合わせで多様な機能を作れること
- いろいろな実装系に移植することが容易であること

AND演算器やXOR演算器すらありませんが、実質ゲート数ゼロのOR演算器と引き算用のNOT演算器を使ってマイクロコードで実現できます。
LSIに実装するためには論理ゲートをブロックに分割してLSI平面上に配置しますが、ブロックの種類が少なく、配置が容易です。
配置が容易な理由は、16bitのプロセッサを64個並べて1024bitのプロセッサとして動くような実装であるためです。
**大演算器なのでLSI平面上の広い面積に配置しなければいけないが、暗号演算において隣接する近いデータだけでいいような構造を作ることができたのも配置が容易な理由。**ただし厳密には注意しなければいけないディレイがいくつかある。

**この結果、高い移植性が実現されるのです。**

## OpenICF3の命令コード
命令コードは32bit長で極端な水平コードになっています。水平コードなので組み合わせで多用な機能が実現できます。楕円暗号は難解なのでOpenICF3向けに開発された楕円暗号のコードを利用できるメリットはあると思います。また独自の暗号アルゴリズムをOpenICF3の命令コードで開発すれば、多くの実装系に移植されるであろう??? OpenICF3のLSIで動作することになります。

# OpenICF3のサイト
[https://openicf3.idletime.tokyo/](https://openicf3.idletime.tokyo/)
サイトにはシミュレータのWebアプリがあります。RSA暗号や楕円暗号のコードを試すことが可能です。
Rubyでライムを作る話（ラップ、韻）

#**概要・目的**
社会通念として、重要な問題提起がされているのに、本質的な問題提起の内容の俯瞰的な理解が難しいケースがあると考えられる。例えば、先日公開されたニュース記事では、次の記事があった。地区の名前は、日本人にとってなじみのあるキーワードかもしれない。

<a href="http://www.newsweekjapan.jp/stories/world/2016/06/windows10ngo.php">**「Windows10の自動更新プログラム、アフリカのNGOを危険にさらす」**
<a href="http://www.newsweekjapan.jp/stories/world/2016/06/windows10ngo.php">![lgf01a201308012200.jpg](https://qiita-image-store.s3.amazonaws.com/0/89222/ad435127-d05b-9a94-2977-940d1f0321f6.jpeg)

写真出展:jamesjoel


この記事と、最近公開された下記の文章の韻を作成する形態素解析Ruby gemを用いて、新たな文章を組成し、俯瞰的理解が深まるかを試すことを目的としたい。
http://qiita.com/suzuki86/items/2a2801944a3e393464c7

#**具体的なインストール・結果抽出プロセスのTips**
ニュースのテキスト内容をRubyで解析し結果を抽出した。一部のテキストを後付けで編集した。また、当該gemの作動について、64bit Windows10マシンでは、上記のリンクで示されている内容の追加の作業が必要と思われるので、32bit Windows7 マシンで作業を遂行した。筆者はRuby初心者であるが、32bitマシンでのインストールプロセスと、結果抽出は簡易に遂行することができた。

#**リズムを感じるテキストの価値**
あるニュースを韻で読むことは、そのニュースの理解を深めることに作用すると思われる。下記のテキスト内容を読むと、韻を踏むことによって、テキストの内容にリズムが存在するかのように感じることができた。

#**結果**
数千年を経てなお自然 アメリカとは別の次元
安全で高性能なソフト利用 ウィンドウズ10の自動更新
NGOには高性能 安全高性能なソフト利用

ご存じウィンドウズ10　自動更新 安全で高性能なソフト利用更新
衛星のネット接続は高額 資金不足による資金調達
こともできる広がる共感 揶揄されるほど評判

衛星のネット接続は高額 中止するプロジェクトの統括
ウィンドウズ10　の自動高性能な　安全ソフト利用
この機会に安全なソフト ご存じWindows10マイクロソフト

これだけ多く 強制アップ
思わぬ捕食 これだけ多く
希望すれば更新日を変更 ネットや諸々の経費の弁償
あったと回答 何と言っても最強
アフリカ大陸中央 密猟者応戦メンバーを誘導
うちに17.4ギガバイト ダウンロードが最後

慢性的な資金不足 高額の衛星ネット接続
武装した密猟者に応戦 この機会に安全 ソフトで応戦
野生動物の保護活動 一人は自動更新の手法

ここで野生 ネット接続は高額の衛星
ここで野生 資金不足は慢性的で固定

数千年を経てなお自然 この機会に安全なソフトで応戦
数千年を経てなお自然 武装した密猟者に応戦

#**まとめ**
韻を使って文章を作ることは、面白いと感じています。今回のgemの作者であるsuzukiさんには大変な感謝をしています。

#**レファレンス**
http://qiita.com/suzuki86/items/2a2801944a3e393464c7
https://github.com/suzuki86/rhymer
これでハマらない Movable Type.net と githubの連携

# はじめにマニュアル

マニュアルを読んでみた。

> GitHub 連携
> https://movabletype.net/support/design/GitHub.html

> GitHub連携でデザインを管理する
> https://movabletype.net/blog/2014/11/github.html

# 疑問と調査結果

1. テーマも初期ファイルはどこから持ってきたら良いのか？  
テーマをエクスポートする  
https://movabletype.net/support/design/exrpot-theme.html
1. ディレクトリの構造・・・教えて欲しい。   
マニュアルには適当にしか書いてない・・・ブログを読んでみた。   
> GitHub連携機能でウェブサイトと配下のブログのテーマをまとめて管理する  
> https://movabletype.net/blog/2014/12/github.html  
1. 同じような構造で作ったのに連携されない！  
当初、構造が合致していたら反映されるものと思っていたんだけど  
どうやら「theme.yaml」が場所とファイル名を連携してくれている見たいだ。  
とりあえず、「１」でエクスポートしたものを全部gitにpushしたらイケる！
1. ブランチって関係あるの？普通に考えると「master」ブランチと連携して欲しいんだけど。  
「develop」ブランチを作ってそこにpushして反映されるか実験してみた。  
どうやら「master」ブランチのみを反映してくれるようです。  
おりこうさん。

# 感想
Bitbucketにも対応して欲しい。
というかお願いします。Bitbucketならプライベートリポジトリが無料でいけるやんかぁ？
めざせpythonライブラリマスター （55）namespaces

#【ライブラリ説明】
　クラスメンバーに対してのgetとset可不可

#【プログラム】
```py:namespaces.py
# -*- coding: utf-8 -*-

import namespaces

ns = namespaces.Namespace(a=1, b=2)
fns = namespaces.FrozenNamespace(ns)
print fns.b
# 2
ns.c
# AttributeError: 'Namespace' object has no attribute 'c'
ns.c = 3
print ns.c
# 3
fns.c = 3
# AttributeError: 'FrozenNamespace' object has no attribute '__setattr__'
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/namespaces/1.0.0)
　[github](https://github.com/pcattori/namespaces)