OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryで楽になる部分、楽にならない部分、顧客が本当に必要だったもの


俺も昔はお前のような jQueryスパゲッティジェネレーターだったのだが、膝にReactを受けてしまってな…

## 基本的な方針

とくにライブラリ設計者において、小さなモジュールを単機能で分割する以上、ライブラリ設計者は可能な限り依存を減らすことを求められます。node環境ならdependency hellの回避のため、フロントエンド環境ならファイルサイズを減らすためです。

ライブラリ設計者ならずともコードのポータビリティを維持するため、できるだけライブラリに依存しないコードを書くのが望ましいです。

Githubみてる限り、最近書かれるJSのライブラリの多くはjQuery非依存です。ユーザーから見る限りは、jQueryElement渡すかHTMLElement使うかぐらいの違いですけどね。

また、Angular, React等のSPAをスクラッチで設計する場合、気づいたらjQueryを使っていない、ということは十分にありえます。

React 127k, jQuery 120k, underscore 42k みたいな世界なので、両方入れるのは嫌だな、といった具合です。ちょっとしたライブラリなのにjQuery依存あって全体に +127k となるのは嬉しくない。

## You Don't Need jQuery を読みなおしてわかること

[You Don't Need jQuery - Qiita](http://qiita.com/tatesuke/items/b9548dd484b01b139b74 "You Don't Need jQuery - Qiita") のコメントは「生DOM操作は冗長なコードが多く、jQuery の良さを再確認した」という意見が多かったですが、↑の記事をよく読むと分かるのですが、冗長な部分は「座標計算」、「親方向の探索」に多いです。

`$.fn.heght/width/offset/position/scrollTop` その辺の「座標計算」の複雑さは、というかGUIの座標系は本質的に面倒くさいです。とはいえ、jQueryの本来の用途であるDOM操作の本質からはやや離れます。

「親方向への探索」はそもそもViewのモジュラリティを破壊するコードで、行儀が悪いコードだと思います。closest/sibling/next/prev 等を乱用したコードを想像してみてください。やっつけで書かれたjQueryで、Webエンジニアなら発狂したことはないですか？これらが標準機能として提供されない意図は、ライブラリ提供する側としては、理解できるでしょう。

## 本当に必要だったものは document.querySelector

結局、基本的にほとんどの人が必要としたのは `document.querySelctor`/`document.querySelectorAll` なんじゃないでしょうか。それに付随して頻出する操作は、 `$.fn.css` や `$.fn.attr` を対応するプロパティへ置き換えるだけで、これらはアクセッサが違うだけで、難しいとは聞いたことがありません。


## 座標計算系の難しさ

画面設計で僕もよく連立方程式を解いたりしてるんですが、ブラウザで値がぶれたりすると非常にデバッグが面倒です。これらを吸収してくれるjQueryは確かに助かります。

jQuery本体の以下のコードを読んでみてください。涙ぐましい努力が滲んでいます。

- https://github.com/jquery/jquery/blob/master/src/dimensions.js
- https://github.com/jquery/jquery/blob/master/src/offset.js

とはいえ、決定版といえる座標系ライブラリがないので妥協してjQuery使ってるだけで、将来的には僕も非推奨だと言ってる可能性が高い気がします。

## jQueryのセレクタを使う場合は下方向の探索(find)のみを使う

closest や sibling の親・兄弟への探索は複雑なので、jQuery どうこう以前に、集団開発では避けたほうがいいです。僕は自分以外がclosest/sibling使って書いてたら基本的に読むのは諦めてスクラッチします。

僕がjQueryセレクタを使う場合は、基本的にコンポーネント要素のルートからの find のみとしています。DOMの相対座標に依存したコードは、とにかく変更に弱く、改修も困難です。頼む、やめてくれ。40000行のbackboneを管理した経験からそう言っています

## 結論

座標系は難しい
Windows上でpiculetを動かす方法

piculetはEC2のセキュリティーグループをコマンドラインで設定するためのツールです。
https://github.com/winebarrel/piculet

* Rubyのバージョンを2.0以上にする
* 環境変数を指定する

```
$ SET AWS_ACCESS_KEY_ID=[...]
$ SET AWS_SECRET_ACCESS_KEY=[...]
$ SET AWS_REGION=ap-northeast-1
```

* piculet を実行する

```
piculet -e -o setting.txt  # ファイルに設定を書き出す
piculet -a --dry-run       # 実行できるか確認
piculet -a                 # Groupfile の内容を設定に反映
```
Redbear DUOのBluetoothについて調べた

Redbearのボード Redber Duo ( http://redbear.cc/duo/ )のWi-FiとBlueotooth の HWとSWのことを調べてみました。

ソースを眺めてみたけどArduinoやParticleで使えるようにするのは手間が掛かるなぁという印象。

#HW
## 概要
* STMicroelectronics STM32F205 ARM Cortex-M3 @ 120 MHz, 128 KB SRAM, 1 MB Flash
* AMPAK AP6212A (Broadcom BCM43438 chip), Wi-Fi 802.11n (2.4 GHz only) + Bluetooth 4.1 (Dual Mode) combo module (With an upgrade path to Bluetooth 4.2)
* On-board 16 Mbit (2 MB) SPI Flash

## 回路図
* 回路図 https://github.com/redbear/Duo/blob/master/schematic/DUO_1.0_20151207.pdf
* MCUとWi-FIの接続はSDIO : SDIO(CLK, CMD, D0, D1, D2, D3) + GPIO(WLAN_REG_ON)
* MCUとBTの接続はUART : UART(RXD, TXD, CTS, RTS) + GPIO(BT_POWER, BT_WAKE, BT_HOST_WAKE)

## AP6212A
* モジュールメーカー AMPAK http://www.ampak.com.tw/
* Broadcom BCM43438が載っているらしい。(RPi3と一緒のチップ)
* taobaoだとAP6212A １個 約15-20元(250-330円)

# SW
* https://github.com/redbear/Duo
* ドキュメントと各種FWのバイナリが置いてある。

## FW source
* https://github.com/redbear/firmware
* Broadcom WICED と Particle の sparkをベースにしている

## HAL
* https://github.com/redbear/firmware/tree/duo/hal/src/duo
* OS : FreeRTOS バイナリのみ srcはWICEDにある？
* TCP/IP : lwIP バイナリのみ srcはWICEDにある？

## HAL porting
* https://community.particle.io/t/port-bcm43438-wifi-ble-to-photon/14092
* Port BCM43438(WiFi+BLE) to Photon
* 移植しはじめたころの質問

## HAL 1st commit
* https://github.com/redbear/firmware/commit/e6ec7bce66e1d24f66cb39d8e5151112d9b470c8
* DUO用HALの最初のcommit

## DCT (Device Configuration Table)
* WICED由来のデバイス設定管理のしくみ
* https://github.com/redbear/firmware/blob/duo/hal/src/duo/platforms/BCM43438A1/platform.h
* https://github.com/redbear/firmware/blob/duo/hal/src/duo/wiced/platform/include/platform_dct.h

# Bluetooth
* redbearのswを使う場合はBLEのみサポート
* Bluetooth dual modeを使う場合は自力でがんばれ

## HCI transport
* https://github.com/redbear/firmware/blob/duo/hal/src/duo/libraries/btstack/port/hci_transport_h4_wiced.c
* HCI transport is H4

## UART
* https://github.com/redbear/firmware/blob/duo/hal/src/duo/libraries/btstack/port/btstack_config.h
* BAUDRATE is 115200

## Bluetooth stack
* https://github.com/redbear/firmware/tree/duo/hal/src/duo/libraries/btstack
* btstack

## btstack porting
* https://github.com/redbear/btstack/tree/duo-arduino
* https://github.com/redbear/btstack/commit/dda3268172f341b2f6ac665e30b00884e6ad4c30
* こちらのレポジトリが先

* 実際の機種依存のコードは下記にある
 * https://github.com/redbear/firmware/tree/duo/hal/src/duo/libraries/btstack/port
 * https://github.com/redbear/firmware/tree/duo/hal/src/duo/
  * btstack_hal.c btstackの起動処理
  * hci_usart_hal.c UARTの読み書き UART割り込んハンドラ

# Wi-Fi
* 下回りはほぼWICEDのままのような気がします。


# その他
* WICEDのライセンス的にソースコードをgithubに置いていいのかが謎
* WICEDのSDKをそのまま置いていると消されている例を見たことがあります。 許容される範囲があるみたいです。
OpsWorks と CodeDeploy を組み合わせて使う

# OpsWorks + CodeDeploy = Useful !?
AWSにはアプリケーションのデプロイが実施できるサービスととして Elastic Beanstalk をはじめ、OpsWorks や CodeDeploy があり、それぞれ特徴があるためどれを選択するか悩みどころとなります。

それぞれのサービスには良い点があるため一つに絞り込むことができない、とお嘆きの場合、いっその複数のサービスを組み合わせて使うのはいかがでしょう。
本ドキュメントでは、OpsWorks + CodeDeploy の組み合わせについて、メリットをまとめました。また、実際の使い方について一例を挙げさせていただきましたので、ご参考になれば幸いです。

# メリット・デメリット
OpsWorks + CodeDeployを組み合わせるメリットとしては、次のような使い方ができるようになります。

- インスタンスのOS設定やミドルウェア設定については、supermarket.io のパブリック Cookbook や独自の Cookbook が使用できる。既に Chef 資産を持っている場合は、そのまま活用することができる
- CodeDeployのデプロイ機能には OneAtTime や AllAtTime など、豊富なオプションを選択できる。appspec.yml によるデプロイはスクリプトを走らせるだけのシンプルな構成のため、blue/green Deployment によるシンプルなアプリのデプロイには十分であり、扱いやすい場合もある

デメリットとしては、次のような点が考えられます。

- OpsWorks と CodeDeploy の使い方を両方マスターする必要があるため、学習コストが増加するかもしれない
- インスタンス上に opsworks-agent と codedeploy-agent の2つがインストールされるため、何となくリソース消費の観点ではもったいない (どちらも、それほどリソースを消費するソフトウェアではありませんが..)

# 構築手順
Opsworks + CodeDeploy の構築手順について解説します。
基本的な考え方としては、インスタンスのOS設定やミドルウェア設定については OpsWorks の Chef recipe にて実施し、アプリのデプロイについては CodeDeploy を用います。OpsWorks ではインスタンスに tag が設定されるので、こちらを用いて CodeDeploy のデプロイ先を識別させます。

## codedeploy-agent インストールのレシピを作成
codedeploy-agent のインストールについては、Chefレシピで実施します。
次のような Cookbook を作成します。なお、本ドキュメントでは Chef12 を使用します。おそらく、Chef11.x系についても同様の構成で動作すると思います。

```
codedeploy/
├── Berksfile
├── metadata.rb
└── recipes/
    └── agent-install.rb
```

```bash:Berksfile
source "https://supermarket.getchef.com"
```

```ruby:metadata.rb
name 'codedeploy'
recipe 'codedeploy::agent-install', 'Fetches, installs, and starts the AWS CodeDeploy host agent'
```

```ruby:codedeploy/recipes/agent-install.rb
remote_file "#{Chef::Config[:file_cache_path]}/codedeploy-install.sh" do
    source "https://s3.amazonaws.com/aws-codedeploy-us-east-1/latest/install"
    mode "0744"
    owner "root"
    group "root"
end

execute "install_codedeploy_agent" do
  command "#{Chef::Config[:file_cache_path]}/codedeploy-install.sh auto"
  user "root"
end

service "codedeploy-agent" do
  action [:enable, :start]
end
sogabe@sherco:~/cloud/aws.int/ops
```
上記ファイルを作成したら、zipコマンドにて固めて S3 にアップロードします。または、github へアップロードしても構いません。

```
zip -r codedeploy-cookbooks.zip codedeploy
aws s3 cp codedeploy-cookbooks.zip s3://(bucketname)/codedeploy-cookbooks.zip
```

## OpsWorks StackおよびLayerの作成
つぎに、OpsWorksマネジメントコンソールにてStackおよびLayerを作成します。Custom Cookbook には、先ほど作成したリポジトリを指定します。また、Layer の設定にて、Setup に "codedeploy::agent-install" を追加します。

インスタンスを追加して起動すると、codedeploy::agent-install のレシピが実行され、codedeploy-agent がインストールされます。

## CodeDeployによるデプロイの実施
つぎに、CodeDeployの設定をします。CodeDeployについては、特に特別な設定をする必要はなく、デプロイグループの設定にて次のような tag を指定します。

- キー
  - opsworks:stack
- 値
  - (Stack name)

上記の例では Stack name を用いましたが、Layer name を使用することもできます。


# 参考情報
[:HIPSTER_DEV_BLOG Integrating OpsWorks and CodeDeploy](http://hipsterdevblog.com/blog/2014/11/23/integrating-opsworks-and-codedeploy/)
Eclipseとファイルシステムの同期がとれなくて困った件


# はじめに
前はずっとvimを使ってたのですが、最近Eclipseを使っています。慣れるととても使いやすい！だがしかし経験不足ゆえよくわからないことにもそれなりにぶつかります。

# 困ったこと
1.Eclipseでプロジェクトを開きつつ、terminalでとあるファイルをmv
2.Eclipseに戻ると、ファイルの更新内容が反映されていることを期待
3.Eclipseに更新内容が反映されてない
4.困った＼(^o^)／

# 対応をぐぐってみると
「Menu->File->Refresh」で更新が反映されるとのこと。試してみるが一向に反映されない。これは困った。

# 結局どうしたか
隣の人に聞いてみた。反映したいディレクトリを右クリックしてRefreshを選ぶとのこと。やってみるとできた。こんな些細なことですらつまるとは汗

# さいごに
最近投稿してなかったので、とりあえず投稿してみた感じです笑
Eclipseで快適エンジニアライフを目指します(^ ^)
Airflowにユーザー認証機能を作成する

airflowにはデフォルトのwebserverの設定だと認証機能がONになっていない。
運用的に外部からのアクセスはないとはいえ、つけておきたい！
っていう人もいると思うのでその方法。
というか基本はドキュメントに書いてあるのでこちらを見ればすべて出来る。
https://pythonhosted.org/airflow/security.html

LDAPとかGHEとかあるけど今回は一番basicなemail,pass

## 事前準備

まずは認証を使用する際には`flask_bcrypt`が必要なので、インストール

```
pip install flask_bcrypt
```

後は標準で入っているもので対応できるはず

## airflow.cfgの変更
`authenticate`は最初はFalseになっているのでコメントアウトするなりTrueにする。

```
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
```

## ユーザーの作成
ユーザーの作成にはコマンドラインから行う。

`python`コマンドでコンソール開いて下記のユーザー情報変更してEnterでユーザー作成完了

```
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = '[任意のユーザー名]'
user.email = '[任意のEmailアドレス]'
user.password = '[任意のパスワード]'
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
```

これでwebserverを再起動すれば下記画面になるはず

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/44247/513401b1-5b2c-abea-a985-4e8173f264b0.png)


## 最後に
権限周りの設定はどうやらできないっぽい？？
kubernetes: volumeをホストに指定するとPermission Denied

kubernetesでvolumeをホスト上のディレクトリに指定してPod(rc)を起動したところ、該当ディレクトリにコンテナからアクセスするとPermission Deniedエラーとなる事象に遭遇。

ホスト側のマウント先ディレクトリの権限は777にしていたがダメだった。

原因は SELinux。

SELinuxとはセキュリティ管理モジュールで、SELinux はデフォルトでは、Kubernetes がその共有ディレクトリーにアクセスすることをブロックする。

ホスト上でSELinuxが動作しているかは以下のコマンドで確認できる。

`getenforce`

```
enforcing　：　SELinux機能、アクセス制御が有効
permissive　：　SElinuxは警告を出力するが、アクセス制限は無効
disabled　：　SElinux機能、アクセス制御が無効
```

## SElinuxの無効化

`/etc/selinux/config` の `SELINUX=disabled` と編集して再起動すると無効化できる

## SElinuxの一時的無効化

`setenforce 0` コマンドでい時期的に無効化（permissive）に変更できる
`setenforce 1` で再有効化

## 指定ディレクトリを許可
無効化はせず、コンテナ稼働ホスト（Minion）上で以下を実行すると、SELinuxは、指定したホストマウント先ディレクトリへの読み書きを許可する設定にできる。

`sudo chcon -R -t svirt_sandbox_file_t <マウント先ディレクトリ>`


参考）
https://access.redhat.com/documentation/ja/red-hat-enterprise-linux-atomic-host/7/getting-started-with-containers/chapter-6-get-started-provisioning-storage-in-kubernetes
http://rfs.jp/server/security/selinux01.html
http://kubernetes.io/docs/user-guide/security-context/
Mavenプロジェクトの成果物をsbtで使う時


ちょっと困ったのでメモ程度だけど。

### mvn の世界

* いい感じで　pom.xml を作成する
* 何も考えず、`mvn clean install` する

この時、sbt の世界は考えなくてよい。これで、

	$ mvn clean install
	[INFO] Scanning for projects...
	[INFO]
	[INFO] ------------------------------------------------------------------------
	[INFO] Building hogemogeo-special 1.0-SNAPSHOT
	[INFO] ------------------------------------------------------------------------
	Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.4/maven-install-plugin-2.4.pom
	＜略＞
	[INFO] ------------------------------------------------------------------------
	[INFO] BUILD SUCCESS
	[INFO] ------------------------------------------------------------------------
	[INFO] Total time: 8.784s
	[INFO] Finished at: Tue Apr 19 14:18:40 JST 2016
	[INFO] Final Memory: 15M/206M
	[INFO] ------------------------------------------------------------------------

とか表示され、~/.m2/repository の下に色々できる。

### sbt の世界

* ivy の世界から逸脱しない(軸足は ivy)
* build.sbt の dependency を解決する

こんな感じ。

	resolvers += "Local Maven Repository" at "/home/hogemogeo/.m2/repository"
	libraryDependencies += "com.ufufu.fugaufga" % "hogemogeo-special" % "1.0-SNAPSHOT"


### 結論

maven だ! ( ﾟДﾟ)ｳﾋｮｰ! と身構えていたら、単なる外部ライブラリの参照解決じゃん。
でも、`mvn clean install` からの流れが `sbt publish-local` 的にできるので、成果があったことにしておきます。
Rails | i18n で translation missing を防ぐデフォルト値を渡す

`default:` を渡すだけで良い。

例:

```rb
I18n.t('activerecord.attributes.cleature.today', default: 'カエル')
```

この場合。

YAMLに定義がある場合は、その値が返る。
定義がない場合は、`カエル` が返る。 

# 環境

- Rails 4.2.6



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
JWT(Json Web Token) をPHPで生成する


# tl;dr

![jwt.png](https://qiita-image-store.s3.amazonaws.com/0/32215/853534d7-e717-6622-5e70-ef3c4c89847d.png)

https://jwt.io/

JWTをPHPで生成してみた。
環境はdockerで作って、そこでお試しして、トークン作成。



# 環境

## Dockerfile作成

```docker
FROM php:7.0.5-apache
COPY src/ /var/www/html/

RUN apt-get update && apt-get install -y vim git curl

RUN curl -sS https://getcomposer.org/installer | php

RUN mv composer.phar /usr/local/bin/composer

RUN composer require lcobucci/jwt

EXPOSE 80
```

## コンテナ作成

```bash

docker build -t composer-php .
docker run -d --name my-test composer-php
```
-composer.json

```
{
 "require": {
 "lcobucci/jwt": "^3.1"
 }
}
```
### コンテナの中身

```
/var/www/html/src
composer.json
token.php
vendor
 autoload.php
 composer
 lcobucci
```


## トークンを作成するライブラリ（token.php）

lcobucci/jwtを使いました。
https://github.com/lcobucci/jwt

JWTのサイトで全てチェックOKだったので。

![php.png](https://qiita-image-store.s3.amazonaws.com/0/32215/3319ef40-8b96-5f57-feef-188c2091ba14.png)


名前空間を利用するために、autoload.phpをrequireしています。

```php

<?php
require_once('vendor/autoload.php');

use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;


$signer = new Sha256();

$token = (new Builder())->setIssuer('http://example.com') // Configures the issuer (iss claim)
                        ->setAudience('http://example.org') // Configures the audience (aud claim)
                        ->setId('4f1g23a12aa', true) // Configures the id (jti claim), replicating as a header item
                        ->setIssuedAt(time()) // Configures the time that the token was issue (iat claim)
                        ->setNotBefore(time() + 60) // Configures the time that the token can be used (nbf claim)
                        ->setExpiration(time() + 3600) // Configures the expiration time of the token (exp claim)
                        ->set('uid', 1) // Configures a new claim, called "uid"
                        ->sign($signer, 'testing') // creates a signature using "testing" as key
                        ->getToken(); // Retrieves the generated token


$token->getHeaders(); // Retrieves the token headers
$token->getClaims(); // Retrieves the token claims

echo $token->getHeader('jti'); // will print "4f1g23a12aa"
echo "\r\n";
echo $token->getClaim('iss'); // will print "http://example.com"
echo "\r\n";
echo $token->getClaim('uid'); // will print "1"
echo "\r\n";
echo $token; // The string representation of the object is a JWT string (pretty easy, right?)
echo "\r\n";
```

```bash

php ./token.php
```

トークンが標準出力に出ました。

トークンの生成については、暗号化のパターンを含め、いくつかあるので仕様に合わせて選択する。
https://github.com/lcobucci/jwt
pyenvとvirtualenvで環境構築した時にmatplotlib.pyplotが使えなかった時の対処法

#はじめに
こういった問題は環境によって対処できない場合があるので，あくまで一例だと思ってください．

#環境
MacOSX Yosemite

#pyenvとvirtualenv
仮想環境を構築する便利なものです．
使い方等は過去記事参照：[pyenvとvirtualenvで環境構築
](http://qiita.com/Kodaira_/items/feadfef9add468e3a85b)

#エラー
```
$ pyenv install 3.5.1
$ pyenv virtualenv 3.5.1 mpl35
$ pyenv activate mlp35
$ pip install matplotlib numpy scipy
$ python -c "import matplotlib.pyplot"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/kodairatomonori/.pyenv/versions/mpl35/lib/python3.5/site-packages/matplotlib/pyplot.py", line 114, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/Users/kodairatomonori/.pyenv/versions/mpl35/lib/python3.5/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/Users/kodairatomonori/.pyenv/versions/mpl35/lib/python3.5/site-packages/matplotlib/backends/backend_macosx.py", line 24, in <module>
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are Working with Matplotlib in a virtual enviroment see 'Working with Matplotlib in Virtual environments' in the Matplotlib FAQ
```
こんな感じでエラーがでてしまう．．．

#解決できた方法
[virtualenv環境でPILとmatplotlibをインストールしようとしたら盛大にドハマりした件
](http://qiita.com/who_you_me/items/3d88e54bd2aedb7495a6)
これみると，backendってところを変更すればいいはず

matplotlibrcの38行目の
`backend      : macosx`
これを
`backend      : Tkagg`
と変更させると解決できた！

`matplotlibrc`の場所は，

```
$python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
```
で確認できます．


#探した際に見たサイト
最終的にはこのサイトを見て解決：[virtualenv環境でPILとmatplotlibをインストールしようとしたら盛大にドハマりした件
](http://qiita.com/who_you_me/items/3d88e54bd2aedb7495a6)

matplotlib公式:[Working with Matplotlib in Virtual environments](http://matplotlib.org/faq/virtualenv_faq.html)
matplotlib公式:[Customizing matplotlib](http://matplotlib.org/users/customizing.html)
pyenv-virtualenvのissues[pyenv virtualenv not work for matplotlib #140](https://github.com/yyuu/pyenv-virtualenv/issues/140)
ConoHa VPSのポート開放でハマったお話

ConoHaでRailsテンプレートを使ってRailsアプリケーションのテストをしていました。アプリケーション自体はいい感じになってきたので、後回しにしてきたセキュリティをちょっと見直すことにしました。SSHのポートくらいは変えようかなぁ...と。


>ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で！
>http://qiita.com/ongaeshi/items/bb17ebfbd4d22057c8fd


こういう記事を参考にポートの設定をしようと思ったのですが、そもそも `/etc/sysconfig/iptables`が見当たらず、ポートの開放設定ができませんでした。ひょっとしてファイアウォールが設置されておらず、全てのポートにアクセスできるのでは？と考えましたが、[外部ツール](https://www.cman.jp/network/support/port.html)を使って接続可能なポートを調べたところ、80番ポートや22番ポートは空いてるけどその他のポートはちゃんと閉じているようでした。



# 接続許可ポート
<img width="525" alt="スクリーンショット 2016-04-19 13.36.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/106258/f8bba387-b265-4c9a-61a2-4aead375a07e.png">
原因は接続許可ポートの**「全て許可」**にチェックしてなかったからでした :raised_hands: 

「全て許可」にチェックしないと、選択していないポートへのアクセスは OS に到達する前に弾かれてしまうようです。もしSSHのポートを変更する場合や、開放するポートを自分で管理する場合は、**「全て許可」** にチェックを入れておきましょう。
Mac OS XでMAMP内のPHPをコマンドラインから実行する

1. ```~/.bashrc```を開く <br>
```vim ~/.bashrc```
2. 下記を記述 <br>
```alias php="/Applications/MAMP/bin/php/php5.6.10/bin/php"``` <br>
※PHP7を実行したい場合は```php5.6.10```を```php7.0.0```に変更すること
3. ```~/.bashrc```を読み込む <br>
```source ~/.bashrc``` <br>
4. コマンドラインからMAMP内のPHPを実行出来ているか確認する <br>
任意のディレクトリにinfo.phpファイルを作成しphpinfo()を記述。 <br>
コマンドラインから下記を実行する <br>
```php info.php | grep 'Loaded Configuration File'``` <br>
これで <br>
```Loaded Configuration File => /Applications/MAMP/bin/php/php5.6.10/conf/php.ini``` <br>
と出ていればOK。
STLのmapでメモリリーク

#valgrindのチェックでひっかかった

```cpp
mapTmp[key] = value;
```

みたいな使い方をしていたらおこられたので

```cpp
auto find = mapTmp.find(key);
if(find == mapTmp.end()){
     mapTmp[key] = value;
}else{
     find->second = value;
}
```
こうした。
でもまだおこられてたので

```cpp
auto find = mapTmp.find(key);
if(find == mapTmp.end()){
     mapTmp.insert(std::make_pair(key,value));
}else{
     find->second = value;
}
```
結局こうなった。
valgrindをつかってみた

環境は　CentOS Linux release 7.2.1511 (Core)

#インストール
```
yum search valgrind
yum install valgrind.x86_64
```

#使ってみる
```
valgrind --leak-check=full hogehoge piyo
```
hogehogeはチェックしたいプログラム
piyoはプログラムに対する引数

#プログラムの終了
Ctrl+Cするか普通に終了するのを待つ

#結果
##Invalid read of size X
読んではいけないメモリ領域を読んだ時に出る。
メッセージ以下に出てくるのはスタックトレース？

##Invalid write of size X
書き込んでは行けないメモリ領域に書き込んだ時に出る

##Conditional jump or move depends on uninitialised value
未初期化の変数が条件分岐に使われている

##Mismatched free() / delete / delete []
単体でnewしたのにdelete[]してる。もしくは逆
mallocしたのにdeleteしているもしくは逆

##X bytes in X blocks are definitely lost in loss record
メモリ確保したのに解放してない


#その他
-公式　http://valgrind.org/docs/manual/mc-manual.html
-チェック中は動作が遅くなるので注意
Androidブラウザで、jQueryで数値を変更するときの単位

コミュニケーションって難しい！！！！！

w

今回起きた問題、一部Androidでヘッダー固定されない。

原因は簡単で、

```js
var pos = 100;
$('header').css({'top':pos});
```

この記述。

```js
var pos = 100;
$('header').css({'top':pos + 'px'});
```

これで解決。（略しすぎてすみません。）

私の私物のAndroid 5.1.1では問題なく動いていたので、全く気づかなかった。
おそらくiOSでも問題なく。
現在わかっているのは、

4.4.2 標準ブラウザ
4.4.2 Chrome
5.0.2 Chrome

おそらくこれ以下で起きているみたいだ。
Kernel-Zone のディスク容量拡張

# はじめに
Solaris 11 の Kernel Zone ではその OS 領域に ZFS の ZVOL が割り当てられます。
後々容量が不足した時の拡張手順について記載します。

# 拡張手順
## 現状確認
ZVOLのサイズを確認します。
zone/kz01-zone が872Gです。

```lang:Global-Zone
# zfs list -t vol
NAME             USED  AVAIL  REFER  MOUNTPOINT
zone/kz01-zone   872G   764G   872G  -
rpool/dump      65.8G   393G  63.8G  -
rpool/swap      4.13G   391G  4.00G  -
```

## ZVOLの拡張


```lang:Global-Zone
# zfs set volsize=1T zone/kz01-zone

# zfs list -t vol
NAME             USED  AVAIL  REFER  MOUNTPOINT
zone/kz01-zone    1.03T   764G   872G  -
```

## kernel-zone の pool 拡張
kernel-zone 上でDiskサイズが変わっていることを確認します。

```lang:Kernel-Zone
# echo | format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c1d0 <kz-vDisk-ZVOL-1.00TB>
          /kz-devices@ff/disk@0
Specify disk (enter its number): 
```

Diskサイズが拡張されたので、ZFS のPoolサイズを拡張します。

```lang:Kernel-Zone
# zpool online -e rpool c1d0
# reboot
```

## 確認
Poolのサイズが拡張されたことを確認します。

```lang:Kernel-Zone
# zpool list
NAME    SIZE  ALLOC  FREE  CAP  DEDUP  HEALTH  ALTROOT
rpool  1020G   842G  178G  82%  1.00x  ONLINE  -
```
Jackson scala moduleでjsonのparse


- case classでobjectを定義してparse
- ようわからんやつは無視指定

```LogParser.scala
import com.fasterxml.jackson.annotation.{JsonIgnoreProperties, JsonProperty}
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule

@JsonIgnoreProperties(ignoreUnknown = true)
case class LogItem(info: String)

@JsonIgnoreProperties(ignoreUnknown = true)
case class Log(@JsonProperty("log_id") logId: Int,
               items: Seq[LogItem])

object LogParser {
  private val parser = new LogParser

  def parse(json: String): Log = {
    parser.parse(json)
  }
}

class LogParser {
  private val mapper = new ObjectMapper
  mapper.registerModule(DefaultScalaModule)

  def parse(json: String): Log = {
    mapper.readValue(json, classOf[Log])
  }
}
C言語のreturn 0の有用性が今更わかった話


`return`で0を返せば正常終了、0以外なら異常終了と知っていただけで、
その0など戻り値を利用する機会がなかったのですが、やった有用性がわかりました

C言語やり始めのときは`main`の中の`return`ってどこに返してるのって疑問に
持つので、疑問に思っている人は参考にしてみてください

## 検証プログラム ##

`0`を返すのと`1`を返すプログラムです

```c:ok.c
int main(){return 0;}
```

```c:ng.c
int main(){return 1;} // 1を返して異常終了
```

上記のプログラムをターミナル上などでコンパイルして、
`./a.out && echo "OK"`と実行してみます

```sh
$ gcc ok.c
$ ./a.out && echo "OK"
#  「OK」 と出力
```

```sh
$ gcc ng.c
$ ./a.out && echo "OK"
# なにも出力されない
```

## `&&`の意味 ##

`&&`は前のプログラムが正常終了したら、次のプログラムを実行するというものなので、
今回の場合`./a.out`が正常終了したら、次の`echo`をするってことです。


## おまけ: 戻り値の値を確認する方法 ##

`echo $?`を使うと戻り値が確認できるみたいです

```sh
$ gcc ok.c
$ ./a.out
$ echo $?
# 「0」と出力
```

```sh
$ gcc ng.c
$ ./a.out
$ echo $?
# 「1」と出力
```
Pythonによる最適化関連の投稿一覧をdockerに

# はじめに
私の組合せ最適化関連のいくつかの投稿をdockerにまとめました。
下記のように実行してJupyter上で確認できます。

## Windows & Mac
Kitematic で"tsutomu7/qiita-demo"を検索し、CREATEしてWEB PREVIEWの下をクリックしてください。

## Linux
```bash:bash
docker run -it -d -p 8888:8888 --name qiita-demo tsutomu7/qiita-demo
firefox 127.0.0.1:8888
# コンテナの削除
docker rm -f qiita-demo
```

Jupyterの一覧から、いずれかを選んでクリックすると、別画面が開きます。そこで、順番に「Shift+Enter」を押して実行できます。

# Dockerと投稿一覧
DockerHub: [tsutomu7/qiita-demo](https://hub.docker.com/r/tsutomu7/qiita-demo/)

1. 「因子の部屋」を組合せ最適で解く
- 「基礎からのベイズ統計学」の入社試験問題で考えたこと
- お釣りの枚数を計算する
- サイコロ勝負
- ナップサック問題の結果の図示
- フィボナッチ数列の計算の高速化(Python版)
- ミニサムとかミニマックスって何ですか？
- モンテカルロ法を用いた最短路の計算
- レストランの売上を組合せ最適化で最大化する
- 全域木を列挙する
- 双対問題を調べる
- 取得データ量を最大化するセンサー設置箇所を求める
- 巡視船の航路を最適化で求める
- 待ち行列について
- 数独を組合せ最適で解く
- 最適化でバラバラの写真を復元せよ！
- 最適化で道路設置
- 献立を組合せ最適化で考える
- 研修医配属問題をPythonで解いてみる
- 確率の問題
- 秘書問題（あるいは お見合い問題、あるいは浜辺の美女問題）
- 組合せ最適化で4色問題を解く
- 組合せ最適化でPyCon JP 2016の講演を決めよう
- 組合せ最適化で学会プログラムを作成する
- 組合せ最適化で道路を舗装せよ
- 組合せ最適化で録画番組を決める
- 組合せ最適化で麻雀のあがりを判定する
- 組合せ最適化による研磨回数の最小化

# おまけ
Arukasでサービスしてみました。(しばらくしたら消します)  
[qiita-demo on Arukasサーバー](https://qiita-demo.arukascloud.io/)

# 追記
- SaitoTsutimuのPythonの記事直近20を自動で表示するようにしました。
    - https://hub.docker.com/r/tsutomu7/qiita-jupyter/
        - ポータルのflaskのポートを5000にしています。
        - サブのJupyterのポートは8888にしています。
            - Kitematicのときは、8888に戻してください。
- 一時的にArukasで公開しました。
    - https://qiita-jupyter.arukascloud.io/

以上
Wall-e project (ジョニー ファイブの復元)ー駆動部 #3

# 部品を注文しました。

## raspberry pi 3

arduino + raspberry pi 2 で動かそうとしましたが、
-->raspberry pi 一つでコントロールします。

PWMポートがありますので、なんとかなりそうです。

pi3からは、bluetoothもwifiも内臓しているので、拡張しやすいと思います。

(プレステのコントローラーを使いたいんですね、IOT CLOUDも、、）

[raspberry pi 3] (http://www.aliexpress.com/item/Raspberry-Pi-3-Model-B-1GB-RAM-Quad-Core-1-2GHz-64bit-CPU-WiFi-Bluetooth-element/32635670855.html)


![Pi3+Breakout+Feb+29+2016.png](https://qiita-image-store.s3.amazonaws.com/0/73662/9370c3ba-75b5-070b-1055-aa5451514dcc.png)


## battery

12vが必要になります。18650充電池を使って12vのパワーを出せるパーツになります。

うまく動作するかは、届いたら報告します。

[12v battery] (http://www.aliexpress.com/item/Universal-5V-9V-12V-6-x-18650-Dual-USB-Portable-External-Power-Bank-Battery-Charger-Box/32242946314.html)

[18650 lithium-ion battery] (http://www.aliexpress.com/item/Sanyo-6pcs-lot-original-18650-lithium-ion-battery-2600mAh-UR18650ZY-3-7V-battery-free-shipping/32353900818
)

![Universal-5V-9V-12V-6-x-18650-Dual-USB-Portable-External-Power-Bank-Battery-Charger-Box.jpg](https://qiita-image-store.s3.amazonaws.com/0/73662/39971a73-b445-857f-c246-4ba6d19834a2.jpeg)


![-Sanyo-6pcs-lot-original-18650-lithium-ion-battery-2600mAh-UR18650ZY-3-7V-battery-free-shipping.jpg_640x640.jpg](https://qiita-image-store.s3.amazonaws.com/0/73662/4b92bb14-a7e1-09a4-7f4b-4ea04b53f446.jpeg)


## DC Motor Driver

arduino motor shieldを使いましたが、サイズが大きすぎで、アマゾンで購入しました。

![Z.jpg](https://qiita-image-store.s3.amazonaws.com/0/73662/98c42a53-0bdf-f4b2-caff-157163efe92a.jpeg)

[EasyWordMall L298N] (http://www.amazon.co.jp/EasyWordMall-L298N-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC-%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99-Arduino/dp/B0117G79WM?ie=UTF8&psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00)


今日は以上です。
[C++] 時間を日本語で出力する

普通strftimeを使いましたら

```cpp
time_t current;
time(&current);
struct tm* current_tm = localtime(&current);
char buf[256];
strftime(buf, 255, "%c", current_tm);
cout << buf << endl;
```

こうな感じになります

```cpp
Tue Apr 19 11:47:16 2016
```

曜日は`Tue`になります。

もしロケールを設定したら。

```cpp
setlocale( LC_TIME, "ja_JP" );
time_t current;
time(&current);
struct tm* current_tm = localtime(&current);
char buf[256];
strftime(buf, 255, "%c", current_tm);
cout << buf << endl;
```

結果：

```
火  4/19 11:50:14 2016
```

曜日は`火`になります。

他のフォーマットに関して、[ここ](http://www.cplusplus.com/reference/ctime/strftime/)で参考できます。
APIGatewayへのimportの話

API Gatewayの管理コンソールが新しくなってて、swaggerのインポートが簡単にできるようになっていました。4/5のアップデートですね。
これで[aws-apigateway-importer](https://github.com/awslabs/aws-apigateway-importer)を使わずに済む！

[本家も公式行ってね](https://github.com/awslabs/aws-apigateway-importer/commit/92ed392fd4d2ef0e94053d07e9e4f2c4dee48482)、とアナウンスしておりますので、喜び勇んでCLIからインポートするように。
CLIを1.10.20に上げて、


```
>aws apigateway import-rest-api help

import-rest-api
^^^^^^^^^^^^^^^


Description
***********

A feature of the Amazon API Gateway control service for creating a new
API from an external API definition file.


Synopsis
********

     import-rest-api
   [--fail-on-warnings | --no-fail-on-warnings]
   [--parameters <value>]
   --body <value>
   [--cli-input-json <value>]
   [--generate-cli-skeleton]


Options
*******

"--fail-on-warnings" | "--no-fail-on-warnings" (boolean)

   A query parameter to indicate whether to rollback the API creation
   ("true" ) or not ("false" ) when a warning is encountered. The
   default value is "false" .

"--parameters" (map)

   Custom header parameters as part of the request.

Shorthand Syntax:

   KeyName1=string,KeyName2=string

JSON Syntax:

   {"string": "string"
     ...}

"--body" (blob)

   The POST request body containing external API definitions.
   Currently, only Swagger definition JSON files are supported.

"--cli-input-json" (string) Performs service operation based on the
JSON string provided. The JSON string follows the format provided by
"--generate-cli-skeleton". If other arguments are provided on the
command line, the CLI values will override the JSON-provided values.

"--generate-cli-skeleton" (boolean) Prints a sample input JSON to
standard output. Note the specified operation is not run if this
argument is specified. The sample input can be used as an argument for
"--cli-input-json".


Output
******

id -> (string)

   The API's identifier. This identifier is unique across all of your
   APIs in Amazon API Gateway.

name -> (string)

   The API's name.

description -> (string)

   The API's description.

createdDate -> (timestamp)

   The date when the API was created, in ISO 8601 format .

warnings -> (list)

   (string)
```

・・・あれ、jsonサポートのみ？yamlサポートしてないっすか？
仕方ない、yaml管理してたのをjsonに直して、、

```
aws apigateway import-rest-api --body test.json

A client error (BadRequestException) occurred when calling the ImportRestApi ope
ration: Invalid Swagger 2.0 input.
```

え？このjsonファイル、管理コンソールからだと通るんだけど、、、
教えて[偉い人](https://forums.aws.amazon.com/thread.jspa?messageID=714556)！

ということで上記の通り、

```
aws apigateway import-rest-api --body file://test.json
```

ってしたらうまくいきました。
後はupdate-rest-apiとかput-rest-apiとか組み合わせればよいのね。

満足！
Sublime Text3 認証Proxy配下で環境構築

# インストール
Sublime Text3を公式サイトから入手。導入時はbuild 3103
https://www.sublimetext.com/3

# パッケージコントロール追加
パッケージコントロールをインストールする。まずは、下記サイトにアクセスする。

https://packagecontrol.io/installation

コンソールに張り付けするテキストが表示されているので、それを複写。ただし、認証Proxy配下ではそのままでは使えないので以下を参考に修正する。

```
import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler({"http": "http://[username]:[password]@[proxy_address]:[port]", "https": "https://[username]:[password]@[proxy_address]:[port]"})) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
```
認証proxyへのid/pass部分を変更する(hash値が変わる場合があるので、それはサイトの最新を利用すること)

上記を修正したら、メニューの「view」-「show console」を選択し、その部分に貼り付ける。

定義が正しければこれでパッケージコントロールが導入される。

# 定番設定導入
インストール済みのパッケージを利用するには、以下の順で選択する

> 1.「Preferences」-「Package Control」を選択。
> (日本語化後は「基本設定」-「Package Control」)
> 2.「Package Control: Install Package」を選択。

2の後に利用するパッケージを選択する。以下の処理は全て上記を行った上で選択している。

## 日本語化
パッケージの選択で「Japanize」を選択する。これを選択した後は、全てのメニューが日本語化されるので注意

## IME制御
Windowsでは日本語入力がインラインでできないのでIME制御を行うために「IME supportを利用する」

## Markdown系
* OmniMarkupPreviewer - リアルタイムプレビュー
* Monokai Extended - シンタックスハイライトする
* Markdown Extended - コードをシンタックスハイライトする

PreviewはCTL+ALT+oでリアルタイムプレビュー用にブラウザーが表示される
VS Codeの表示を英語に戻す

ここに書いてある
https://code.visualstudio.com/docs/customization/locales

VS Code日本語化されたのはいいんだけど、~~`Ctrl+Shift+P`でコマンド打とうと思ったら日本語で打たなきゃいけないのがつらいので仕方なく英語に戻すことにしました。~~現在は修正されていますが、なんとなく日本語よりも英語表示にしておきたい方向け。

やり方は簡単。`locale.json`というファイルをVS Codeフォルダの中に作って、次のように書いておく

```js
{
    "locale":"en-US"
}
```

VS Codeフォルダというのはキーボードショートカットとかの設定ファイルが保存されている場所で、Windowsなら`C:\Users\ユーザー名\AppData\Roaming\Code\User`というパスです。
ESXi上でOpenStack（KVM）を動かす！ OpenStack(KVM) on ESXi5.5 Nested Virtualization

# はじめに
少し前に[中井悦司さんのquickrdo](http://enakai00.hatenablog.com/entry/2015/12/03/181845)を利用して、ESXi5.5上にOpenStack(KVM) Libertyを構築した際にNested Virtualization環境のためにいくつかハマッた内容を記載します。
時間があればOSXのVirtualBox上で同様にOpenStack（KVM）を動かす方法を別途記載予定です。

## 環境
+ ESXi5.5u2
+ CentOS7
+ [OpenStack Liberty (quickrdo)](https://github.com/enakai00/quickrdo/tree/centos7-liberty)

## 仮想マシンのハードウェアバージョン
+ CPU/MMU仮想化のオプションを変更するためにOpenstackをインストールするVMのハードウェアバージョンが9（5.1以上互換であること）以上であることを確認します。
  + バージョンが8以下の場合、ハードウェアバージョンを9以降に上げます。
    + vsphereクライアント上で仮想ハードウェアのアップグレードをすると、バージョンが選択できません（この環境ではバージョン10となる）ので、バージョン選択をしたい場合はvsphere web clientでの操作を推奨します。
      + VMのプロパティから[全てのvCenterアクション]-[互換性]-[仮想マシンの互換性のアップグレード]
    + なお、ハードウェアバージョン10以降を選択すると、設定の編集などをvsphere web clientからしか操作できなくなるなので、vsphereクライアントを利用している人は注意してください!

## CPU/MMU仮想化の設定
+ OpenstackをインストールするVMの[設定の編集]-[オプション]タブで CPU/MMU仮想化を以下の通り変更します。

![option.jpg](https://qiita-image-store.s3.amazonaws.com/0/117986/45df30ba-0198-5ad3-e17a-4325a49e7633.jpeg)

## NWポートグループをプロミスキャス（無差別）モード
+ Openstackホストの接続ポートの設定をプロミスキャス（無差別）モードに変更します。この設定がないと、OpenStack上のゲストVMと通信ができません！！
ESXiホスト-[構成]-[ネットワーク]-[対象vswitch/dvswitch]のプロパティから対象ポートグループのセキュリティ設定を以下のようにします。

![portgroup.jpg](https://qiita-image-store.s3.amazonaws.com/0/117986/6cb6ca69-3348-11b3-7a34-d34e31557982.jpeg)

##

以上でESXiホスト側の準備は完了のため、あとはOpenStack側のインストールを進めればOKです。
yumに失敗する時どうする？

#pingしてみる
"www.yahoo.co.jp"
あたりにpingしてみる
応答があるようなら良し
→DNSの動作と外部に出ていけるかをチェック

#resolv.confを見る
/etc/resolve.confを参照して
nameserver 192.168.1.1
みたいに有効なDNSが指定されているかチェック

#デフォルトゲートウェイをチェック
/etc/sysconfig/network-scripts/ifcfg-eth0
とか接続してるデバイスの設定をチェック
特にデフォルトゲートウェイが正しいかどうか
外に出られるアドレスを指しているか

#LANケーブルをチェック
たまにあるんだけど、そもそもLANケーブルささってない

#curlで直接とってみる
普通のブラウザとかなんでもいいんだけど
できればインターネット繋がってるのがはっきりしている端末から試す。
エラーログで出てくるURLから直接指定してみる。
取得できるようならその接続先は生きてるのでこっちの問題。
##なにをとるんや？
　/etc/yum.repo.dの中に入ってるファイルに書いてあるURL。
　だいたいmirrorlist=なんたら　ってかいてある。
routesを爆速で確認する方法


以下のコマンドでroutesを確認していたのですが、
routesが表示されるまで時間がかかると思っていました。

```command
bundle exec rake routes
```

最近知ったroutesを確認する2つの方法についてのメモです。

１. rails s 実行中に以下のURLをたたく

```brower
http://localhost:3000/rails/info
```

２. rails consoleで確認

```console
rails c
show-routes
```

以上。
[URL正規化] mod_rewriteなどでindex.phpなど簡略化している際に重複コンテンツと判断されないようにSEO対策

mod_rewriteなどを使ってURLを簡略化している人は多いと思います。

`http://www.example.com/index.php`　⇒　`http://www.example.com/`
`http://www.example.com/index.php/login`　⇒　`http://www.example.com/login`
`http://www.example.com/index.php/blog/5`　⇒　`http://www.example.com/blog/5`

しかしこれがよろしくない場合があるらしい。
以前SEO会社から聞いた話だと、表示される内容が同一であっても、検索エンジンではURLが異なる場合は別ページと見なされる可能性がある。
その際に、重複コンテンツと判断されることによりマイナス評価を受ける可能性がある為、検索エンジンにインデックスされているURLを統一し、正規化を図ったほうがいい。
ということらしいです。

以下はその時結局実施しませんでしたが、作った設定です。

```apache:.htaccess
  RewriteCond %{HTTPS} off
  RewriteCond %{REQUEST_URI} ^/index\.php
  RewriteRule ^index.php/(.*)$ http://%{HTTP_HOST}/$1 [L,NE]

  RewriteCond %{HTTPS} on
  RewriteCond %{REQUEST_URI} ^/index\.php
  RewriteRule ^index.php/(.*)$ https://%{HTTP_HOST}/$1 [L,NE]

  RewriteCond %{THE_REQUEST} ^.*/index\.php
  RewriteRule .* http://%{HTTP_HOST}/ [L,NE]
```

HTTPとHTTPSでそれぞれあるので同じページがあるので、HTTPへ統一します。

`http://www.example.com/index.php`
`https://www.example.com/index.php`

これらを

`http://www.example.com/`

に統一。
なんかもっとスマートにする方法があるかもしれないですが、とりあえず目的は果たせます。
PHP CodeSnifferでコーディング規約を守れているかチェックしてみる。


PHP_CodeSnifferを取ってくる。

``` bash
git clone https://github.com/squizlabs/PHP_CodeSniffer.git phpcs
```

WordPressのコーディング規約の追加

``` bash
git clone -b master https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git wpcs

cd phpcs

./scripts/phpcs --config-set installed_paths ../wpcs
```

チェックできるコーディング規約の一覧を確認

``` bash
$ phpcs -i
The installed coding standards are Squiz, Zend, PSR1, PSR2, PHPCS, MySource, PEAR, WordPress-Extra, WordPress-Docs, WordPress, WordPress-VIP and WordPress-Core
```

コーディン規約のチェック

- ディテクトリ単位

 ``` bash
phpcs --standard=WordPress --report=summary  htdocs/wp-content/themes/origin_theme
```

- ファイル単位

 ``` bash
phpcs --standard=WordPress htdocs/wp-content/themes/origin_theme/index.php
```

デフォルトのコーディング規約の変更

``` bash
phpcs --config-set default_standard WordPress
```

参考：URL
- https://github.com/squizlabs/PHP_CodeSniffer/wiki
- https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
Nokogiriを使ってるとよく出るエラー lib/nokogiri/xml/node_set.rb:164:in `attr': undefined method `attribute' for nil:NilClass (NoMethodError)

※解決できたけど根本原因わからず。

※追記：コメントで@scivolaさんが解説してくださいました。

```undefined method `attribute' for nil:NilClass (NoMethodError)```
このエラーは初心者がnokogiriを使っている時によく出る。

```rb
html = open(URL,"User-Agent" => UserAgnet).read
doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
doc.css(".hoge").each do |row|
 puts row.css(".hogehoge img").attribute("src").value
end
```
こんな感じで img src を取ってくるときに、row.css(".hogehoge img") がnilだとNilClassにattributeメソッドが無いからエラーになると認識している。※間違ってたら教えて下さい。

大体こんな感じで書いてみるんだけど全然解決できない。

```rb
html = open(URL,"User-Agent" => UserAgnet).read
doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
doc.css(".hoge").each do |row|
  next if row.css(".hogehoge img").nil?
  begin
    puts row.css(".hogehoge img").attribute("src").value
  rescue => e
    p e
  end
end
```

```#<NoMethodError: undefined method `attribute' for nil:NilClass>```

どうしてだー。
解決方法を先に言うと、nil? でなく empty? でチェックできる。

```rb
html = open(URL,"User-Agent" => UserAgnet).read
doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
doc.css(".hoge").each do |row|
  next if row.css(".hogehoge img").empty?
  puts row.css(".hogehoge img").attribute("src").value
end
```
"nil:NilClass" これはNilクラスにattributeメソッド無いよーって言っているんじゃないのか？

```rb
html = open(URL,"User-Agent" => UserAgnet).read
doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
doc.css(".hoge").each do |row|
  p row.css(".hogehoge img").class if row.css(".hogehoge img").empty?
  puts row.css(".hogehoge img").attribute("src").value
end
```
emptyの時はclassを調べてみた。

```
Nokogiri::XML::NodeSet
```

まあそうなるか。。この辺がよくわからん。もっと勉強しなくては。
jQuery Mobile で iPhone 等でだけなぜかズームができない（PCだとできるのに）時

ちょっとハマりましたので自分自身への備忘録として

ヘッダーとかフッターに ***data-disable-page-zoom="false"*** をつけましょう！
header や footer で data-position="fixed" にすると自動的に拡大縮小も禁止されてしまうようです

参考:
[JQuery Mobile リファレンス](http://www.webcreativepark.net/jquerymobile/fixed/data-disable-page-zoom/)
Dockerを使いOpenJDK9をビルド

開発中のOpenJDK9を手元の環境でビルドしてみたので手順をメモ。手元の環境はWindows機なので、Dockerを使いCentOS7上でビルドしています。ビルドに時間はかかるけど特に詰まらず簡単でした。

# 前提
Dockerの環境がインストール済み。[Docker Toolbox](https://www.docker.com/products/docker-toolbox)を入れておけばOK。

# Dockerイメージ取得
DockerHubに公開されているCentOS7の最新版(2016/04/18時点)である7.2.1511を今回は利用。

```bash
docker pull centos:7.2.1511
```

# ビルドに必要なライブラリをインストール
yum でさくっとインストール。

```bash
yum install -y autoconf automake bison \
 flex gcc gcc-c++ gcc-gfortran kernel-devel \
 make m4 patch tar bzip2 gzip xz file gmp-devel \
 mpfr-devel wget rsync unzip zip java-1.8.0-openjdk-devel \
 libXtst-devel libXt-devel libXrender-devel \
 cups-devel alsa-lib-devel freetype-devel which ccache
```

※必要なライブラリは[Cent OSでのOpenJDKのビルド方法](http://qiita.com/informationsea/items/64fd10329ba8539c3b14) を参考とした。ただし、Java 7ではなくJava 8を使うようにした。
※これが必要最低限のライブラリかどうかまでは未調査。

# OpenJDK9のソース取得

OpenJDKは[Mercurial](https://www.mercurial-scm.org/)をソース管理に使っているのMercurialをまずインストール。これもyumで入る。

```bash
yum install mercurial
```

後は`hg clone`コマンドで取得。

```bash
hg clone http://hg.openjdk.java.net/jdk9/jdk9 OpenJDK9
```

これ自体は一瞬でcloneは完了する。取得されたファイルの中に`get_source.sh`があるので、これを実行して各サブリポジトリのソースをまとめてcloneする。

```bash
cd OpenJDK9
sh get_source.sh
```

ネットワーク回線次第だがここで少し時間がかかる。

# OpenJDK9のビルド
clone完了後は`configure`を実行して`make`するだけ。デバッグ版としたかったので、`configure`に`--enable-debug`オプションを付けている。

```bash
sh configure --enable-debug
make all
```

自分の環境(Intel Core i5-4300U CPU @ 1.90GHz)だと、大体1時間ちょっとでビルドは完了。VirtualBoxの仮想OSにはCPU1つしか割り当てていなかったので、複数割り当てるともうちょっと速くなるかも？ メモリーは4GBを仮想OSに割り当てている。

# 動作確認
`(cloneディレクトリ)/build/linux-x86_64-normal-server-fastdebug/images/jdk`にビルドされている。
`-version`で動作確認。

```bash
[root@08e244062a9d OpenJDK9]# ./build/linux-x86_64-normal-server-fastdebug/images/jdk/bin/java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (fastdebug build 9-internal+0-2016-04-18-083249..OpenJDK9)
OpenJDK 64-Bit Server VM (fastdebug build 9-internal+0-2016-04-18-083249..OpenJDK9, mixed mode)
```
Xamarinでボタンとかを横並びにしたいとき

LinearLayout(Horizontal)を使う
コードはこんな感じになる
```lang:Main.axml
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linearLayout1">
        <Button
            android:id="@+id/Button7"
            android:text="7"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
        <Button
            android:id="@+id/Button6"
            android:text="6"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
    </LinearLayout>
```
Unityコトハジメ（ダウンロードからインストール、チュートリアル着手まで）

# 1. Unityをダウンロードする

https://unity3d.com/jp/get-unity/update

にアクセスします。

# 2. 最新版をダウンロードする
バージョンは適宜最新版を選択ください。

<img width="724" alt="スクリーンショット 2016-04-19 9.31.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/8a86ace8-939e-adcb-8de5-404723a0fc37.png">

# 3. ダウンロードを確認する
以下の名前でダウンロードされているので確認してください。

<img width="132" alt="スクリーンショット 2016-04-19 9.34.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/815284b7-3dcb-6be3-c593-003644af9d63.png">



# 4. インストール 
UnityDownloadAssistand-X.X.X.dmgをダブルクリックしインストール開始。

<img width="613" alt="スクリーンショット 2016-04-19 9.31.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/91081f8c-5143-e82a-6182-10240c964847.png">

Unity Download Assistantを選択します。

<img width="601" alt="スクリーンショット 2016-04-19 9.32.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/4c4167eb-c67d-ec2d-3ce2-2db6a3db596b.png">

- Mac Build Supportを外す（Macでバイナリを作る人はそのままでもOK）
- Android / iOS Build Supportにチェックいれる（AndroidやiOSに書き出せるようになります） 
- その後、Continueをクリック

# 5. インストール完了

<img width="599" alt="スクリーンショット 2016-04-19 9.33.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/a4e9f222-23b9-ace9-bb25-2aa4b3fb9046.png">

UnityをクリックするとUnityが起動します

# 6. ここから始めよう
以下のチュートリアルがよくまとまっているので一度はやってみることをオススメします。

- 6.1 はじめてのUnity（シンプルなゲームをつくってみましょう）
https://github.com/unity3d-jp/FirstTutorial/wiki
 操作方法がわからない方は以下も参照ください。
http://tutorial.unity3d.jp/archive/basic/


- 6.2 2Dシューティングゲーム
https://github.com/unity3d-jp-tutorials/2d-shooting-game/wiki

# その他参考書籍/サイト
- [ドットインストールUnity入門 (全26回) ](http://dotinstall.com/lessons/basic_unity)

- [Unity5入門 最新開発環境による簡単3D&2Dゲーム制作（通称ひよこ本）](http://www.amazon.co.jp/Unity5%E5%85%A5%E9%96%80-%E6%9C%80%E6%96%B0%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%88%E3%82%8B%E7%B0%A1%E5%8D%983D-2D%E3%82%B2%E3%83%BC%E3%83%A0%E5%88%B6%E4%BD%9C-%E8%8D%92%E5%B7%9D-%E5%B7%A7%E4%B9%9F/dp/4797384433/ref=sr_1_1?ie=UTF8&qid=1463478098&sr=8-1&keywords=unity)
SMTPコマンド/応答コード　[ 自分用メモ]

SMTPコマンド/応答コード

参考サイト
http://e-words.jp/p/r-smtp.html
http://sol.panasonic.biz/security/netwkcam/support/technic/smtp-ftp_errorcord.html
http://www.atmarkit.co.jp/fnetwork/rensai/netpro10/ftp-responsecode.html
AWS VPN接続ステータスグラフをCloudWatchカスタムメトリクスで表示する

# VPN接続のステータスをグラフで確認したい
AWSのVPCにてVPN接続をする場合、現在の接続状況についてはマネジメントコンソールやAPIで確認することができます。しかしながら、過去の記録については確認する方法が提供されていません。
このため、過去の接続状況を確認するためには、カスタマーゲートウェイ(CGW)側のログ確認やSNMPを用いたグラフ作成を別途する必要があります。

障害の切り分けをするためにCGWのログを確認するのは仕方ないとしても、CloudWatch Alarm + SNSを用いた障害通知等は別サーバを用意せずに実現したいものです。

本ドキュメントでは、AWS Lambda を用いてVPN接続のステータスを CloudWatchカスタムメトリクスとして作成する方法について解説します。

# 構成
はじめに、全体的なシステム構成について解説します。

- Lambda Function
  - VPN接続のステータスを取得し、CloudWatchカスタムメトリクスにPutします
  - Event sourceとして、CloudWatch Events(Schedule)を利用します。5分毎に、Lambda Functionを実行します
- CloudWatch Custom Metrics
  - Lambda FunctionからPutされたカスタムメトリクスを、CloudWatchのマネジメントコンソールにて表示することができます


## CloudWatchカスタムメトリクス
CloudWatchカスタムメトリクスって何?という人は、こちらのドキュメントをご参照いただくと良いと思います。
[【AWS発表】 クラウド監視サービスAmazon CloudWatchでカスタムのメトリクスが使用可能に](http://aws.typepad.com/aws_japan/2011/05/new-custom-metrics-for-amazon-cloudwatch.html)
ザックリと説明すると、CloudWatchカスタムメトリクスは、ユーザ側で自由にCloudWatchのメトリック(グラフ)を作成できる機能です。昔ながらのサーバ管理ではSNMP+MRTG(Cacti等)を用いたグラフの作成が一般的でしたが、CloudWatchを使えば、同等の機能を簡単に実現できます。
2015年10月からはCloudWatch Dashboardの提供も開始され、Mackerel風な、見た目の格好良いダッシュボードでサービスの一括監視をすることもできるようになりました。CloudWatchは、うまく使いこなせば他のサーバ管理ソフトウェアが不要になるくらい便利なサービスだと思います。

[【AWS発表】CloudWatch Dashboards – メトリックビューのカスタマイズ](http://aws.typepad.com/aws_japan/2015/10/cloudwatch-dashboards-create-use-customized-metrics-views.html)

# 構築手順
VPN接続のステータスグラフを作成する手順について解説します。

## IAM Roleの追加
はじめに、Lambda Functionを実行するためのIAM Roleを作成します。IAMマネジメントコンソールにログインし、次のようなRoleを作成します。

- ロール名
  - lambda-vpn
- アクセス許可
  - AmazonEC2ReadOnlyAccess (VPN接続のステータスを確認するために用います)
  - CloudWatchFullAccess (CloudWatchカスタムメトリクスへPutするために用います)

## Lambda Function
つぎに、Lambda Functionを作成します。
2016年4月からは Node v4.3.2 が使用できるようになりましたので、0.10を使っている人は次のように、nvmコマンド等にて新バージョンに移行する方が良いと思います。

```
$ nvm install 4.3.2
$ node --version
v4.3.2
```
Lambda Functionのソースコードについては、github上にアップロードしております。

- [aws-vpn-status](https://github.com/sogabe/aws-vpn-status)

次のコマンドにて、Lambda Functionのアーカイブを作成します。

```
$ git clone https://github.com/sogabe/aws-vpn-status.git
$ cd aws-vpn-status
$ npm install -save async
$ zip -r ../vpn-status.zip .

$ aws s3 cp ../vpn-status.zip s3://(bucket-name)/vpn-status.zip
  (S3からアプリをアップロードする場合のみ実行します。ローカルPCからアップロードする場合は不要です。)
```

アプリのzipファイルを作成したら、つぎにLambdaマネジメントコンソールにて Lambda Function を登録します。
つぎのパラメタを用いてLambda Functionを追加すると良いです。

- Runtime
  - Node.js 4.3
- Handler
  - vpnstatus.handler
- Role
  - lambda-vpn (IAMコンソールにて作成したlambda実行用のRole名)
- Advanced Settings
  - Timeout を10秒に設定します(Defaultの3秒だと、時間内にFunctionの実行が完了しない可能性があります)

Lambda Functionの登録後、Testボタンを押して、LogにVPNステータスが出力されることを確認します。

つぎに、Event sourceを登録します。
Event sourcesタブを選択し、"Add event source"をクリックします。Event source typeとして "CloudWatch Events - Schedule"を選択し、Schedule expressionとして "Rate (1 minute)" を選択します。Lambdaのコストを抑えたい場合は、Rateを 5 minutes にすると良いでしょう。

## VPN接続ステータスグラフを確認
しばらく待つと、CloudWatchマネジメントコンソールに "vpn_status" という名前のカスタムメトリックが現れます。こちらを選択すると、各VPN接続のステータスグラフを見ることができます。

![cloudwatch-custom-metric-vpn.png](https://qiita-image-store.s3.amazonaws.com/0/96389/d15c8ac8-cd93-4269-7eb1-2cb9557aaeeb.png)
リポジトリ配下のディレクトリを別のリポジトリへコピーするスクリプト

- 基本はsvnadminのdump&load
- svndumpfilterでダンプするディレクトリの絞り込み
- sedでディレクトリの書き換え

書き換え後の親ディレクトリが存在しない場合は'svn mkdir'するためコピー先リポジトリに書き込み権限があるアカウントが必要。

```sh:repocopy.sh
#!/bin/sh
export LANG=
export LC_ALL=
export LC_CTYPE=

# リポジトリの場所
SVN_ROOT=/usr/local/svn

# svndumpfilterのオプション(適宜調整すること)
FILTER_OPT="--drop-empty-revs --renumber-revs"

if [ $# -ne 4 -a $# -ne 5 ]; then
 echo 'Usage: $0 <user name> <src repo> <src dir> <dst repo> [dst dir]'
 echo ''
 echo '<user name>は<dst repo>の書き込み可能なアカウント'
 echo '<src repo>内の[src dir]を<dst repo>にコピー'
 echo '[dst dir]を指定した場合は[src dir]をリネーム'
 echo ''
 echo '※src dir/dst dir 共に"#"を含むパスは不可'
 echo ''
 exit 1
fi

username=$1
src_repo=$2
src_dir=$3
dst_repo=$4
if [ $# -ne 5 ]; then
 dst_dir=$src_dir
else
 dst_dir=$5
fi

# リポジトリの存在チェック
svnadmin lslocks $SVN_ROOT/$src_repo > /dev/null 2>&1
if [ $? -ne 0 ]; then
 echo "リポジトリが見つかりません($src_repo)"
 exit 2
fi
svnadmin lslocks $SVN_ROOT/$dst_repo > /dev/null 2>&1
if [ $? -ne 0 ]; then
 echo "リポジトリが見つかりません($dst_repo)"
 exit 3
fi

# コピー先のリポジトリに親ディレクトリを作成
dst_base=`dirname $dst_dir`
if [ "$dst_base" != "" ]; then
 svn mkdir --parents -m "create base directory" --username $username svn://localhost/$dst_repo/$dst_base
fi

# dump -> filter -> change path -> load
svnadmin dump $SVN_ROOT/$src_repo | svndumpfilter include $FILTER_OPT "$src_dir" | sed -e "s#Node-path: $src_dir#Node-path: $dst_dir#" | svnadmin load $SVN_ROOT/$dst_repo
```
エクセル関数メモ

いつもその都度しらべてるので、メモ的な
## 今日の日付をYYYYMMDD
文字列結合内で使いたいとかに

```
=YEAR(TODAY())&IF(MONTH(TODAY())<10,"0"&MONTH(TODAY()),MONTH(TODAY()))&IF(DAY(TODAY())<10,"0"&DAY(TODAY()),DAY(TODAY()))
```
Rails PV数(閲覧数)を確認する　[ 自分用メモ ]

検索キーワード
rails pv数(閲覧数) カウント

[ 参考サイト ]
http://qiita.com/u651601f/items/a0624601047db4f02808

http://qa.atmarkit.co.jp/q/3335

※なにをもって１件とするかが他のやり方でまかなえる、且つ当日分の集計が不要であればWebサーバーのアクセスログを別途集計してもいいかもしれない。アクセスログは別途保存したほうが良い。Webサーバの機能にあるかもしれない。
CircleCI で GKE にデプロイするときのはまりポイント


CircleCI で GKE(Google Container Engine) にデプロイしようと思っても、(案の定)現状のドキュメントのままやってもうまくいかないところがあります。その辺りのポイントをまとめます。

## ベースとなるドキュメント

https://circleci.com/docs/docker/

Docker を利用する部分は、ここをベースに作ります。Kubernetes を使う部分は、GCE(Google Compute Engine) に Kubernetes をインストールして導入する手順となっているので、このまま使えません。GKE の場合は、もっと簡単に使うことができます。

## GCP との連携

GCP(Google Cloud Platform) の CLI である `gcloud` コマンドは、既に導入された状態になっていますが、操作するためには認証を通す必要があります。この辺は、このドキュメントのまま使えます。

https://circleci.com/docs/google-auth/

`set project` する前に、 `set compute/zone` もしておいたほうがいいでしょう。

## はまりポイント

### `gcloud` で `component update` しようとするとこける

ドキュメントにはありませんが、 `sudo` する必要があります。

https://discuss.circleci.com/t/gcloud-permissions-error/2631

ログの出力先を `chmod` してますが、これをやっておかないとログが出力できずにこけます。

### `docker build` 中にエラーがでる

こんなエラーです。

```
Error removing intermediate container 1f3a1d541241: 
Driver btrfs failed to remove root filesystem 
1f3a1d541241e757d48f34329508253e9ee139380b7b914a3b1104677eb0e8ee: 
Failed to destroy btrfs snapshot: operation not permitted
```

根本的な解決にはなっていませんが、エラーがでる処理をスキップします。

https://discuss.circleci.com/t/docker-error-removing-intermediate-container/70

エラーがでていても、処理は進んでいくので、気になる人はオプションをつけておくといいかなと思います。