OmniAICreator/Qiita-1.07M huggingface dataset:
CALayer の anchorPoint を変更しつつ表示位置は維持する

# CALayer の anchorPoint を変更しつつ表示位置は維持する

わかりにくい表題になってしまっていますが、CALayer の基準点である anchorPoint をずらすと表示位置もずれてしまうのをなんとかするための方法です。回転軸をずらしたいけど表示位置は維持したい、とかそういった場面に向いています。anchorPoint あるあるなのでわかる方にはわかるかと。

Stackoverflow 先生で以下の素晴らしいコードを見つけました。

```swift
func setAnchorPoint(anchorPoint: CGPoint, forView view: UIView) {
    var newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y)
    var oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y)

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform)
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform)

    var position = view.layer.position
    position.x -= oldPoint.x
    position.x += newPoint.x

    position.y -= oldPoint.y
    position.y += newPoint.y

    view.layer.position = position
    view.layer.anchorPoint = anchorPoint
}
```
http://stackoverflow.com/questions/1968017/changing-my-calayers-anchorpoint-moves-the-view

このように使えます。

```swift
setAnchorPoint(CGPointMake(1.0, 1.0), forView: aView)
```

`aView` の anchorPoint を `(1.0, 1.0)` に移動させますが、例えば回転アニメーションを適用すると表示位置はそのままで(※)右下を中心に動くようになります。求めていたのはコレでした。

※実際には anchorPoint の移動に合わせて相応の量を position で移動させて相殺しています。

# 追記：extension にした

```swift:CALayer+AnchorPoint
extension CALayer {
	func setAnchorPoint(newAnchorPoint: CGPoint, forView view: UIView) {
		var newPoint = CGPointMake(self.bounds.size.width * newAnchorPoint.x, self.bounds.size.height * newAnchorPoint.y)
		var oldPoint = CGPointMake(self.bounds.size.width * self.anchorPoint.x, self.bounds.size.height * self.anchorPoint.y)
		
		newPoint = CGPointApplyAffineTransform(newPoint, view.transform)
		oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform)
		
		var position = self.position
		position.x -= oldPoint.x
		position.x += newPoint.x
		
		position.y -= oldPoint.y
		position.y += newPoint.y
		
		position.x = newPoint.x
		position.y = newPoint.y
		
		self.anchorPoint = newAnchorPoint
		self.position = position
	}
}
```

# 追記：position がリセットされる謎現象

とあるビューのサブビューにこのアンカーポイントずらし技を適用したまでは良かったのですが、同一階層の別ビューで何か Auto Layout が実行されるとこっちのレイヤーの position がなぜかリセットされるという、説明するのも一苦労な謎現象に悩まされました。

結果的にはコードを以下のように改変してから、『とあるビュー』で `layoutSubviews()` をオーバーライド、そこで『サブビュー』に対してアンカーポイントを再設定する、という荒技でなんとか解決しました。

```swift:CALayer+AnchorPoint_2
extension CALayer {
	func setAnchorPoint(newAnchorPoint: CGPoint, forView view: UIView) {
		var newPoint = CGPointMake(self.bounds.size.width * newAnchorPoint.x, self.bounds.size.height * newAnchorPoint.y)
		
		newPoint = CGPointApplyAffineTransform(newPoint, view.transform)
		
		var position = self.position
		
		position.x = newPoint.x
		position.y = newPoint.y
		
		self.anchorPoint = newAnchorPoint
		self.position = position
	}
}
```

```swift
override func layoutSubviews() {
    super.layoutSubviews()
		
    // ここでアンカーポイントを再設定しないとたまに position がずれてしまう
    subView.layer.setAnchorPoint(anchorPoint, forView: subView)
}
```
```swift
// レイアウトが変わりそうな場面でこれを実行
layoutIfNeeded()
```
LocalServer


##node.js (http-server)
https://www.npmjs.com/package/http-server

```
$ npm install http-server -g
```

###Usage
```
$ http-server [path] [options]

Starting up http-server, serving ./
Available on:
  http://XXX.X.X.X:8080
  http://XXX.XX.X.XXX:8080
Hit CTRL-C to stop the server
```

###Available Options:

-p Port to use (defaults to 8080)

-a Address to use (defaults to 0.0.0.0)

-d Show directory listings (defaults to 'True')

-i Display autoIndex (defaults to 'True')

-e or --ext Default file extension if none supplied (defaults to 'html')

-s or --silent Suppress log messages from output

--cors Enable CORS via the Access-Control-Allow-Origin header

-o Open browser window after starting the server

-c Set cache time (in seconds) for cache-control max-age header, e.g. -c10 for 10 seconds (defaults to '3600'). To disable caching, use -c-1.

####Example
```
$ http-server /htdocs -o
```


##Python (SimpleHTTPServer)
```
$ python -m SimpleHTTPServer[port]
```
####Example
```
$ python -m SimpleHTTPServer 8000
```


##PHP (Built-In Web Server)
```
$ cd ~/public_html
$ php -S localhost:8000 [-t path]
```
####Example
```
$ php -S 0.0.0.0:8000 -t /htdocs
```
.Net Coreのコンソールアプリで設定ファイルを読み込む

Windowsの開発環境ができるまでMacで開発していたが、
設定ファイルの読み込み方が.NET Frameworkと違ってつまづいたのでメモ。

## 手順
.NET Coreの場合、設定値はJSONファイルに保存します。

### 適当なjsonファイルを作る
appConfig.jsonなど、名前はなんでも良いです。

2.設定値を書く

```json:appConfig.json
appsettings: {
    frameworkName: ".NET Core"
}
```

セクションがいらなければ、オブジェクトにする必要はありません。

```json:appConfig.json
frameworkName: ".NET Core"
```

3.設定値を読み込む
プロジェクト直下に設定ファイルを作った場合

```csharp:sample.cs
using Microsoft.Extensions.Configuration;

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddJsonFile(@"appConfig.json");
builder.AddEnvironmentVariables();
var config = builder.Build();

var value = config["appSettings:frameworkName"]
Console.Write($"Hello, {value}") // "Hello, .NET Core"
```

## まとめ
わざわざWindowsの仮想マシンを立ち上げてVisual Studioを
起動しなくてもよくなるし、何よりmacだけで開発できるのは素晴らしいですね！
正規分布の検証

# これなに

データが、正規分布かどうかの検証を docker で簡単にできるようにしました。

## 使い方

### ダミーデータでテストする場合

```bash:bash
python -c "import numpy; print(str(list(numpy.random.normal(size=100)))\
  .strip('[]'))" | docker run -i --rm tsutomu7/test_normal > test.htm
firefox test.htm
```

上記のようにすると、下記のように表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/b2d7b127-f4a7-fae5-b6c0-60e01d6cb9c1.png)

### ファイル(data.csv)からテストする場合

```bash:bash
docker run -i --rm tsutomu7/test_normal < data.csv > test.htm
firefox test.htm
```

# やっていること
- データ数の確認(十分多いか)
- ヒストグラム表示(釣り鐘型か)
- QQプロット表示(直線上に並ぶか)
- シャピロウィルク検定

下記のように一様分布を使うと、正規分布と判定されません。

```bash:bash
python -c "import numpy; print(str(list(numpy.random.random(size=1000)))\
  .strip('[]'))" | docker run -i --rm tsutomu7/test_normal > test.htm
firefox test.htm
```

以上
SoftLayer ネットワーク レイテンシー

SoftLayerネットワークのレイテンシーに関してまとめてみました。
レイテンシーを考慮する際には下記の３パターンがあると思います。
（ちなみに、③は提供プロバイダーへ個別ご相談となります。）
![Slide1.PNG](https://qiita-image-store.s3.amazonaws.com/0/130492/6154f9d7-fdf3-358e-73c7-9206d714c4cb.png)

#ケース①データセンター間について
こちらのサイトからデータセンター間（正確にはPop間）のレイテンシーを調べることができます。五分毎に随時更新されているそうで、最新の状況を確認できるようになっております。
http://lg.softlayer.com/
![Slide4.PNG](https://qiita-image-store.s3.amazonaws.com/0/130492/3f5b7305-948e-f3c7-7971-be2019005bd1.png)
#ケース②インターネット経由について
こちらのリンクからデータセンターからファイルをDLしたりして速度を試せます。
http://www.softlayer.com/jp/data-centers
データセンターを選んで「SpeedTestの起動」のアイコンをクリックすると
![Slide2.PNG](https://qiita-image-store.s3.amazonaws.com/0/130492/49649767-0d58-ab67-f54e-327dabc5944b.png)
このような測定器にレイテンシーや回線の上りや下りの速度が表示される
![Slide3.PNG](https://qiita-image-store.s3.amazonaws.com/0/130492/b2bf6605-5b8f-a02e-51b8-daa250d5290d.png)





あら、便利！！！(｀・ω´・)+
【three.jsのヘルパー解説集】 ②AxisHelperの使い方


## AxisHelper
継承：THREE.Line
解説：X、Y、Zの三軸を可視化してくれるヘルパーです。Xが赤、Yが緑、Zが青で表示されます。__カメラやオブジェクトがどちらを向いているか分かりにくい際に表示させると便利です。__

### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/47daca33-8896-74bc-d5cb-3762d2c87c98.gif)

- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/YLmI)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/AxisHelper.ts)　

### 実装例

```js:javascript
var axisHelper = new THREE.AxisHelper( 5 );
scene.add( axisHelper );
```

AxisHelper(size)

- size：軸の大きさ
【個人的メモ】Elasticsearchの概念と用語

# はじめに
![image](https://qiita-image-store.s3.amazonaws.com/0/37467/b99dbfd1-1e15-4edf-f494-a9edf6cd0ead.png)

Elasticsearchの用語や概念が幾分わかりにくくて個人的によく混乱するので、簡単にまとめてみました。

## 物理的なインデックス構成要素

## クラスタ(Cluster)
n個のノードから構成されるノードの集合体、およびそれを構成するサーバー群のこと。設定ファイルにある`cluster.name`が同じなら同一クラスタと判定される。

## ノード（Node）
Elasticsearchのプロセス単位にある実体（インスタンス）。基本的にはノード数＝サーバ数となる。AWSがサポートしているAmazon Elasticsearch Service(Amazon ES)でもノード数＝インスタンス数となっている。複数のサーバ群をクラスタ、個々のサーバー（ここでいうインスタンス）をノードという。

## シャード(Shared)
多くのデータを処理する際、ノードのメモリ等が足りなくなる場合がある。その場合、シャードがインデックス（※後述）を分割して複数のサーバーに格納することでデータ処理を分散できる。

### プライマリーシャード（Primary Shared）
インデックスの書き込みと参照処理で使用される。デフォルトでは5つのプライマリーシャードが作られる。

### レプリカシャード(Replica Shared)
シャードのコピー。1シャードにつき1つのレプリカシャードを保持。プライマリーシャードが消えてしまった場合、該当のレプリカシャードが昇格する。同一プロセス上に同一シャードのレプリカとプライマリが乗らないようになっている

## 論理的なインデックス構成要素

## インデックス(Index)
データを保存する場所。RDBでいうところのデータベースに相当。n個のシャードから構成され、シャード単位でノードに配置することで分散可能になる。

## タイプ（Type）
RDBでいうところのテーブルに相当。

## ドキュメント（Document）
RDBでいうところのレコードに相当。

## フィールド(Field)
RDBでいうところのカラムに相当。


## 参考
- https://medium.com/hello-elasticsearch/elasticsearch-afd52d72711#.qd5yikuc5
- https://www.elastic.co/guide/index.html
- http://huge.mints.ne.jp/12/2014/it_technique/1451/
- http://blog.johtani.info/images/entries/20130830/IntroductionES20130829.pdf
cssで中央ぞろえ、横並び等

## 中央ぞろえ

![center2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/520c01b1-c96f-e13d-9f94-1dd6f3eb2576.png)

```html
<div class="wrap">
    <div class="content"></div>
</div>

<style>
div.wrap {
    text-align: center;
}
div.content {
    text-align: left;
    width: 400px;
    margin: 0 auto

    background-color: #ddd;
}
</style>
```

## 勝手に入ってるmarginをなくす

![center.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4e443ae7-6cb8-3c7b-0eb8-c39e884210d3.png)

```css:
* {
    margin: 0; /* IE6でmarginが入る問題対応 */
}
```

## 横並び

* [CSSで要素を横並びにする方法まとめ | HALAWATA.NET](https://www.halawata.net/2011/10/css-float-display-box/)

![left.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b3b72307-ae3c-e0c4-fa43-3eba61ed3c15.png)

```html:
<div class="container">
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
    <div class="box">4</div>
</div>

<style>
div.container {
    overflow: hidden;
}
div.box {
    float: left;

    width: 40px;
}
</style>
```

## 全体から特定の要素のみ除外

* [CSS3で追加されたセレクタ「:not()」について考えてみました｜Webpark](http://weboook.blog22.fc2.com/blog-entry-382.html)

![center4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e5b97405-0bea-65d4-6387-edc25f48394f.png)

```html:
<div class="content">aaa</div>
<style>
:not(body) {
    background-color: #ddd;
}
.content {
    background-color: white;
}
body {
    background-color: white;
    max-width: 400px;
    margin: 0 auto;
}
</style>
```
curlでwebページへアクセスしてコンテンツ取得(php)


■curlでwebページへアクセスしてコンテンツを取得

```
<?php
$USER_AGENT			 = 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';
$CON_USLEEP			 = 1500000;
$ACCESS_URL			 = 'https://www.sample_nishi.com';

$LIST_CURL_OPT		 = array(
	CURLOPT_HEADER			 => 0,
	CURLOPT_SSLVERSION		 => 1,
	CURLOPT_SSL_VERIFYPEER	 => 0,
	CURLOPT_SSL_VERIFYHOST	 => 0,
	CURLOPT_TIMEOUT			 => 15,
	CURLOPT_COOKIEJAR		 => "cookie",
	CURLOPT_COOKIEFILE		 => "cookie",
	CURLOPT_RETURNTRANSFER	 => 1,
	CURLOPT_FOLLOWLOCATION	 => 1,
	CURLOPT_USERAGENT		 => $USER_AGENT,
//	CURLOPT_HTTPHEADER		 => 'Expect:'
);

$LIST_LOGIN_PARAMS	 = array(
	'user_name'	 => 'sample',
	'password'	 => 'sample'
);


$LIST_PARAMS	 = array(
		'sample1'	 => 1,
		'sample2'	 => 2,
		'sample3'	 => 3
);

例１
$cnt_source = getAccessSource($CON_USLEEP,$ACCESS_URL);

例２
$cnt_source = getAccessSource($CON_USLEEP,$ACCESS_URL,'post',$LIST_LOGIN_PARAMS);

例３
$cnt_source = getAccessSource($CON_USLEEP,$ACCESS_URL,'session',$LIST_LOGIN_PARAMS);


function getAccessSource($con_sleep = 1000000,$url = null,$mode = null,$params = null){
	global $LIST_CURL_OPT;

	usleep($con_sleep);

	if( $mode == 'session' ){
		$LIST_CURL_OPT[CURLOPT_POST] = 1;
	}elseif( $mode == 'post' ){
		$LIST_CURL_OPT[CURLOPT_POST] = 1;
		$LIST_CURL_OPT[CURLOPT_POSTFIELDS] = $params;
	}

	$FP = curl_init($url); 

	curl_setopt_array($FP, $LIST_CURL_OPT);

	$content = curl_exec($FP); 
	if( $content === false ){
		print "curl error:".curl_error($FP)."\n";
		print "retry access\n";
		$content = getAccessSource($con_sleep,$url,$mode,$params);
	}
	$check_flg = curl_close($FP);

	$content = mb_ereg_replace("\n","",$content);
	return $content;
}
?>
```
自分の環境のみGit管理対象外を指定する

#リポジトリ単位での指定
下記のファイルにignoreするファイル、フォルダを記述する

```
.git/info/exclude
```

#ローカル全体での指定
下記のファイルにignoreするファイル、フォルダを記述する

```
<Home>/.git/info/exclude
```
テキストエディタ Atom の導入（Windows7 32bit）

# ダウンロード方法

##### 1. [ATOM](https://atom.io/) にアクセス

##### 2. [Download Windows Installer] をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/9e97f0d1-05d5-929b-482e-ce3597f582fe.png)



# インストール方法

##### 1. ダウンロードした AtomSetup.exe を実行

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/bd9a0939-43df-5adf-5d57-94919ac56aa8.png)

##### 2. インストール中...

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/3358354c-020c-2a78-b08d-3fbe113bfc0a.png)

##### 3. インストールが完了すると、起動する

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/947789f1-78c9-f059-47a8-fd5747d97094.png)



# 日本語化

##### 1. メニューから [File]-[Settings] を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/48a27f3d-4964-c6f2-01dc-3950b3fb9619.png)

##### 2. Settings より、[Install] を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/f6116c8f-c4a6-756b-6a16-38fadea26a91.png)

##### 3. [Install Packages] に『japanese-menu』と入力し、[Enter] キーを押す

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/0f12a655-b4e3-0d60-355d-61eb92b5dd57.png)


##### 4. 検索結果から『japanese-menu』を選択し、[Install] ボタンを押す

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/671f543e-7ad5-8216-22be-3033aefc28e2.png)


##### 5. インストール完了後、メニューが日本語に変わる

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/e2e37869-f8a6-c75c-408d-06c2dd5f76c5.png)


# プロキシの設定

Atom のホームフォルダ？にプロキシ設定を記載した『.apmrc』ファイルを生成して設定するみたい。

##### 1. %USERPROFILE% 配下の .atom フォルダを開く

>コマンドプロンプトから `set` コマンドを実行すれば、確認できる。

##### 2. 『.apmrc』という名前のファイルを生成する

>Windows エクスプローラーでピリオドから始まるファイルを生成しようとすると、エラーメッセ時がひょうじされる。
>対応として、コマンドプロンプトから生成する方法もあるけど、ファイル名を『.apmrc.』にするとエクスプローラーから生成できるようす。

```bat:コマンド
:: aaa と記載されたファイルを生成
ECHO aaa > .apmrc

:: すでに存在するファイルをリネーム
MOVE apmrc.txt .apmrc
```
##### 3. 『.apmrc』に下記の通りプロキシ設定を記載する

```text:.apmrc
; This file is auto-generated and should not be edited since any
; modifications will be lost the next time any apm command is run.
;
; You should instead edit your .apmrc config located in ~/.atom/.apmrc
cache = C:\Users\UserName\.atom\.apm
http-proxy=http://ユーザ名:パスワード@サーバ:ポート番号/
https-proxy = http://ユーザ名:パスワード@サーバ:ポート番号/
```

>ちなみに、1 で記載した USERPROFILE は cache で定義されたフォルダ。
>しかも、.apmrc はココに置いてねとも書いてある。
>ここに記載している冒頭の部分は Atom のメニューから、[File]-[Settings] より、[Open Config Folder] ボタンを押下して開いたウィンドウから [.atom]-[.apm]-[.apmrc] に記載してある。

![image](https://qiita-image-store.s3.amazonaws.com/0/81548/48a27f3d-4964-c6f2-01dc-3950b3fb9619.png)　![image](https://qiita-image-store.s3.amazonaws.com/0/81548/98fc0f00-c0fe-a10d-f6bf-ca9c849e2272.png)


# その他必要なプラグイン





# 参考
・[Atom がヤバイ！SublimeTextを余裕で凌駕してしまっていた件](http://www.geeks-dev.com/atom-がヤバイ！sublimetextを余裕で凌駕してしまっていた件/)
【three.jsのヘルパー解説集】 ①ArrowHelperの使い方


## ArrowHelper
継承：THREE.Object3D
解説：3Dの矢印オブジェクトです。このArrowHelperを使うことで__ベクトルを可視化できるため、開発時やバグの検証時に役に立ちます__。

### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/c95aced3-1e0e-3be2-f9c6-cfe67bfe7a98.gif)

- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/2IsT)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/ArrowHelper.ts)　

### 実装例

```js:javascript
var dir = new THREE.Vector3( 1, 0, 0 );
var origin = new THREE.Vector3( 0, 0, 0 );
var length = 1;
var hex = 0xffff00;

var arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );
scene.add( arrowHelper );
```

ArrowHelper(dir, origin, length, hex, headLength, headWidth )

- dir：THREE.Vector3 矢印の向きを表すベクトル
- origin：THREE.Vector3 矢印の始点となるベクトル
- length：矢印の長さ
- hex：矢印の色
- headLength：矢印の頭の長さ
- headWidth：矢印の頭の太さ
Robolectric 3.1.1 へのアップデートガイド

# 概要

[前回のアップデート](http://qiita.com/KeithYokoma/items/dc4bf36149d729dc72bf)から一ヶ月ほど経ちましたが、しれっと Robolectric 3.1.1 がリリースされています。[今回の差分](https://github.com/robolectric/robolectric/compare/robolectric-3.1...robolectric:robolectric-3.1.1?expand=1)は ウェブ上でも確認できるほどのサイズですが、例によって破壊的変更が入っていますので、バージョン番号を上げるだけでは動かない場合があります。

# RobolectricGradleTestRunner は deprecated

代わりに、`RobolectricTestRunner`を使いましょう。

# DefaultPackageManager のコンストラクタ

以前は`ShadowsAdapter`のインスタンスを渡していましたが、3.1.1 から`ResourceLoader`を渡すように変更されました。
`ResourceLoader`は`RuntimeEnvironment`が提供しているものを使用できます。

よって、次のように変更をする必要があります。

```java

// 3.1 まで
DefaultPackageManager pm = new DefaultPackageManager(Robolectric.getShadowsAdapter());

// 3.1.1 から
DefaultPackageManager pm = new DefaultPackageManager(RuntimeEnvironment.getAppResourceLoader());
```

# RoboAttributeSet も deprecated

代わりに`Robolectric.buildAttributeSet()`を使うようにします。

# まとめ

しれっと[3.0から3.1への公式アップデートガイド](https://github.com/robolectric/robolectric/wiki/3.0-to-3.1-Upgrade-Guide)に3.1.1の項目が入ってて白目をむきそうになりましたが、ここに書いてある以外にも変更が必要なことに気がついて白目をむきました。

他にもあれば追記しようと思います。
Vivaldiなるブラウザのここが便利

[Vivaldi](https://vivaldi.com?lang=ja_JP)とはオペラ・ソフトウェアの元CEOであるヨン・スティーブンソン・フォン・テッツナー(愛称はてっちゃんらしい)が中心になって作り出したブラウザです。

5年ほど前まではOperaユーザーだった身として注目してたのですが、使ってみたらこれがかなり便利だったので、特に気に入った機能を紹介しようと思います。
(Operaから離れたのは就活時にOperaだとWebテストが受けられなかったからです。)

# タブスタッキング

Vivaldiでは複数のタブをひとまとめに扱うことができます。
そしてこんな感じで画面を分割して表示したりできるわけです。
資料を見ながらブログの記事を書いたりするのがはかどりますね。

![タブタイリング.JPG](https://qiita-image-store.s3.amazonaws.com/0/116434/64dcdd1a-00ea-7adf-ec61-86f73eded8ce.jpeg)

※調子に乗って大量のページを同時に表示するとすこぶる見づらくなるので注意

# ブックマークにニックネーム

ブックマークが増えてくると「ブックマークを探すのがめんどくせぇ...」ってなりませんか？
Vivaldiではブックマークごとにニックネームをつけることでそれを解消できます。

例えばQiitaのマイページをブックマークして「qiita」にしたとします。
あとはアドレスバーに「qiita」と打ち込めばサジェストされるわけです。

![ニックネーム.JPG](https://qiita-image-store.s3.amazonaws.com/0/116434/caa468ed-e96f-e8b8-5a7e-70990e3b4463.jpeg)

これでブックマークの中を探し回る手間が省けますね。
日本語でニックネームをつけると変換が面倒なので、半角英字でつけるのを推奨します。

# ショートカットやコマンドが豊富

F2キーを押したら大量に出てくるので覚えるのは一苦労ですが、慣れればキーボードだけで一通りの操作はできます。

# 充実のマウスジェスチャ

ChromeやFire foxでもプラグインで追加できますが、Vivaldiはデフォルトでマウスジェスチャに対応しています。
この辺はOperaから受け継がれているみたいですね。(思えばOperaを使い始めたのもマウスジェスチャに惚れたからでした。)

「キーボードだけで操作とかキツいっすわ」という方も安心してください


# その他

と、特に気に入った機能を挙げましたが、ほかにも気になる方は[こちら](http://brian.hatenablog.jp/entry/try-vivaldi)の記事に熱心に紹介されているのでご覧ください。

Vivaldi最強伝説始まったな...
【備忘】myBatisのjdbcType=DATEは時刻を切り捨てる

myBatisを使う時に、SQLのDATETIME型をJavaのDate型にマッピングしようとして

```xml:hogeMapper.xml
<resultMap id="hogeResultMap" type="com.example.app.models.HogeViewModel">
	<id column="ID" property="id" />
	<result column="HOGE_START_DATETIME" jdbcType="DATE" property="hogeStartDateTime" />
	<result column="HOGE_END_DATETIME" jdbcType="DATE" property="hogeEndDateTime" />
</resultMap>
```

などと書くと、マッピングされるhogeStartDateTimeやhogeEndDateTimeの時刻部分は切り捨てられる。
日付と時刻両方の値を使いたい場合は、jdbcTypeを書かないようにする。
Ubuntu Xenial Xerus 16.04  で tigervnc server(nightly-build:1.6.8) を使う方法

Ubuntu Wily Werewolf(15.10) で tigervnc server(nightly-build:1.6.8) を使う方法 - Qiita
http://qiita.com/ynott/items/59bbeb0cc24b6fef1148
を紹介したのですが、Ubuntu 15.10 を Upgradeして 16.04 LTSにしたのでその時のログです。

Tigervnc Server は、1.7.0 Beta てのが出てます。今回はこちらは利用しません。
1.6.8 をインストールします

## 1. 事前準備
```lang:bash
$ wget http://tigervnc.bphinz.com/nightly/ubuntu-12.04LTS/amd64/tigervncserver_1.6.80+20160628git168b92c7-3ubuntu1_amd64.deb
$ sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 4582A460
```
## 2. インストール
```lang:bash
$ sudo apt-get install libtasn1-3-bin libtasn1-bin
$ sudo apt install ./tigervncserver_1.6.80+20160628git168b92c7-3ubuntu1_amd64.deb
```
## 3. しかし、そのままでは動かないので追加 GNOME をインストール
Unity3Dが....
お好きな方はMateでもよいかと。

```lang:bash
$ sudo apt-get install gnome-core gdm
```


## 4. xstartup を修正
http://qiita.com/ryunosinfx@github/items/b28e23f65c74a0f59d03
にそって修正
OSX で NAS を /Volumes 配下に自動マウントする

# 方法

1. マウントする NAS を列挙したファイル `/etc/auto_smb` を設置する.

    ```text:/etc/auto_smb
    /../Volumes/mountpoint_name -fstype=smbfs,soft ://user:password@host/directory_name
    ```

1. `/etc/auto_master` に追記する.

    ```text:/etc/auto_master
    #
    # Automounter master map
    #
    +auto_master            # Use directory service
    /net                    -hosts	       	-nobrowse,hidefromfinder,nosuid
    /home                   auto_home       -nobrowse,hidefromfinder
    /Network/Servers        -fstab
    /-                      -static
    /-                      auto_smb        -nosuid
    ```

1. `automount` コマンドを実行する

    ```bash
    sudo automount -vc
    ```

# 備考

* `/etc/auto_master` の一番下の行の `auto_smb` が `/etc/auto_smb` ファイルを指している. auto_smb は別の名前でも OK のはず.
* `/etc/auto_smb` は, `/Volumes/mountpoint_name` と書かずに `/../Volumes/mountpoint_name` と書くのがポイント.
    `/Volumes/mountpoint_name` と書いてしまうと `sudo automount -vc` した時に,

    ```
    automount: /Volumes/mountpoint_name: mountpoint unavailable
    ```
というなエラーが出るので, 事前に `mkdir /Volumes/mountpoint_name` しておく必要があった.
`/etc/auto_smb` に `/../Volumes/mountpoint_name` と書いておくと `mkdir` する必要はなく, 自動でマウントされる.
* `/etc/auto_smb` で `-fstype` の所を `,soft` を付けずに `-fstype=smbfs` としてしまうと, Mac を起動した時にログイン画面の手前で停止してしまう. `,soft` を付けると回避できる.

# 参考

* https://gist.github.com/L422Y/8697518
【構想編】pythonでデータを分析して、株主優待後の下落を狙って儲ける作戦

# 背景
データをうまく分析して、株主優待の前後で論理的におかしな動きをしてるやつを見つけて、そのタイミングでお金儲けができるんじゃないかと、分析を進めている。

いま、2000年以降の全ての株価データを引っ張ってきてる途中で、待ちが発生してるので、その間に優待の仕組みについて見てみる。で、分析手順と狙い所を見てみる。

ちなみに株は、好きな会社だけ買ってるほぼ初心者です。そして、題名にもある様にあくまで**構想**なので、実際のコードは出てきません。

運営しているブログはこちら:[努力1mm](http://www.doryoku-1mm.tech/)

# 儲けられるポイント

はじめに考えた儲けられるポイントは次の２つ。

- 株主優待の権利確定日に信用売り。落ち日に回収。
- 株主優待の権利落ち日に、買い注文。次の権利確定日間近で売り注文

１だと信用売りによるリスクは大きくなるけどただ、株を中期で持ち続けることのリスクも同じくらい大きそうなので（中国のバブル崩壊とか、諸々もたくさんあるし）、期間が短い方が成果が見えて楽しいので、１でやってみる。

２の方も同じロジックで組み立てられるから、実装してみるといいかも。株式を中期で保有するリスクはもちろんあるけどね

# データ分析で何をするのか

ここまで書くと**「データで分析しなくても、できるじゃん」**って声が聞こえてくる気がする。そういう事ではないんです。。

金融の世界では３つの大事な指標があって、それぞれリスク、リターン、リターンの期待値（理論値）みたいなものがあるんですね。で、データを分析すると、**リスクを最小にして、リターンが理論値に一番近い銘柄**が抽出できる。

もっと噛み砕いていうと、**ほぼ確実に儲かる銘柄をリスト化**することが可能になる。僕の場合は、資金とか取れるリスクが有限だから、こういうことをしないといけないんです。。

だから今回も儲けやすそうな銘柄を探すための分析。

# 何をやろう

僕の知っている中で一番良さそうなのは、リターンインデックスを日経平均のリターンインデックスで基準化してあげて、優待日前後の変動の周期を見る。で、**優待日前のある日と、優待日後のある日で差分がでかい日を抽出**。

その変動幅と最低取引数とかを考慮して、リターンの期待値（平均値）とリターンのボラティリティ（分散・ばらつきの度合い）を出してあげる。

この分析によって得られるデータは、

- 買うべき日
- 売るべき日
- リターンの期待値
- リターンのボラティリティ（リスク）

かな？

あとは、自分の欲しいリターンと、リスクを勘案して購入すればOK。目でやるのが面倒くさそうだったら、標準正規分布にあてはめてあげる予定

理想的には、買うべき日と売るべき日の分散も出してあげて、そこも勘案して計算するのがいいのかな。

ここまで自動化できれば大満足。日経平均の上下によるリスクみたいなのは排除できていないんだけど、そこは甘んじて受け入れるしかないかなぁ。。
さくっと簡易Webサーバを立てる

## はじめに

最近以下の様なReactとかいろんな記事が出ていて試そうと思うけど、

[生のReactを知ろう – JSX、Flux、ES6、Webpackを使わず… | プログラミング | POSTD](http://postd.cc/learn-raw-react-no-jsx-flux-es6-webpack/)

Webサーバどう立てようのようなことがちょくちょくあり、普通にApacheとかnginxを立ててやってもいいんですが、少しだけ写経したいとかの時にわざわざ設定するのも面倒だなという方向けの記事です。

-----------

## 簡易Webサーバをコマンド化

### 前提条件

PHP5.3以上で使えるビルトインサーバを使う想定です。
RubyやPythonなどでもコマンドから起動することは出来ますが、たまにPHPも一緒に動かしたい時があったりするので、 **PHP５．３以上** が入っていることを前提とします。

-----------

### スクリプトについて

以下のシェルスクリプトを **`serve`** という名前で PATH の通っているところへ配置したとします。

#### 実行方法

```
カレントディレクトリをドキュメントルートとして8080ポートで起動
$ serve 

オプション
-t path/to/public : /path/to/public をドキュメントルートとして起動
-p 4000           : ポートを4000として起動
```

オプションを何も指定しなければ、 **`http://localhost:8080`** でアクセスできます。

-------

#### スクリプト本体

```
#!/bin/sh

usage_exit() {
  echo "Usage $0 [-h] [-t target-dir=.] [-p port=8080]"
  exit 1
}

# デフォルト値
target="."
port=8080

while getopts ht:p: option; do
  case $option in
    h)  usage_exit
        ;;
    t)  target=$OPTARG
        ;;
    p)  port=$OPTARG
        ;;
    \?) usage_exit
        ;;
  esac
done

shift $((OPTIND - 1))

### exec
## php5.3+
php -S localhost:$port -t $target

## rubyのwebrickを使う方法
# ruby -run -e httpd $target -p $port
```

-------

## 注意事項

条件付きGET や 部分GET など特殊なリクエストヘッダの機能を利用したアプリケーションの場合は、素直に nginx や Apache を立ててやった方がいいかもしれません。
部分GET を試した時は 206 のステータスにならず、若干ハマりました。。。
有意思的代码：

1  循环取map里的value：eg:  map {k1 : {k2:v2}}
   input:  map   k1 , k2  output: v2 
  ```
  public static Object getValue(Map map, String... keys) {
        if (map == null) {
            return null;
        } else {
            for (int i = 0; i < keys.length - 1; ++i) {
                if (!map.containsKey(keys[i]) || map.get(keys[i]) == null || map.get(keys[i]) == JSONObject.NULL) {
                    return null;
                }
                map = (Map) map.get(keys[i]);
            }
            if (map.containsKey(keys[keys.length - 1]) && map.get(keys[keys.length - 1]) != null && map.get(keys[keys.length - 1]) != JSONObject.NULL) {
                return map.get(keys[keys.length - 1]);
            } else {
                return null;
            }
        }
    }```
AWS EC2でLaravel5.2のインストール・本番環境の構築（LAMP環境）

今回は、gitでcloneする形でLaravel5.2の本番環境の構築を行います。
インスタンスの設定・立ち上げ（Amazon Linux AMI 2016.03.3）が終わったところからスタート
Amazon EC2(Amazon Elastic Compute Cloud)のインスタンス（Amazon Linux AMI 2016.03.3）の設定および立ち上げが終わったところから手順のご案内をスタートします。

#１、LAMP環境の構築

まずは、下記コマンドでルートユーザーに変更するとともに、yumでインストールしたパッケージのアップデートを行います。

```
$ sudo -i
$ yum update
```

その後、下記の通り、AWS EC2にLAMP環境を構築していきます。

##　1-1、Apacheのインストール
今回は、Apache2.4のバージョンをインストールします。

```
$ yum install -y httpd24
$ chkconfig httpd on
$ service httpd start
```

##　1-2、PHPのインストール
次はPHPをインストールします。今回インストールするPHPのバージョンは5.6です。

```
$ yum install -y php56
```

##　1-3、MySQLのインストール
下記コマンドで、MySQLは最新のバージョンがインストールされます。

```
$ yum install -y mysql-server
$ chkconfig mysqld on
$ service mysqld start
```

## 1-4、拡張ライブラリーのインストール
Laravel5のプロジェクトを作成するために必要な拡張ライブラリーをインストール済ます。

```
$ yum install -y php56-mbstring php56-pdo php56-mysqlnd
```

詳しくは、ドキュメントのサーバー要件を確認してください。
他にも、多少のシステム動作要件があります。

#2、Laravel5のインストール

## 2-1、composerのインストール
gitでLaravel5のプロジェクトをインストールするためにはgitが必要で、gitをインストールするためにcomposerのインストールが必要になります。

```
$ curl -sS https://getcomposer.org/installer | sudo php
$ mv composer.phar /usr/local/bin/composer
$ ln -s /usr/local/bin/composer /usr/bin/composer
```

## 2-2、gitのインストール

```
$ yum install git
```

## 2-3、Laravel5のインストール
今回は、var/wwwディレクトリの直下に配置します。その後、作成したプロジケクト内でcomposerをインストールします。

```
$ cd /var/www/
$ pwd
/var/www
$ git clone https://github.com/laravel/laravel.git
$ cd laravel
$ composer install
```

すると、vendorディレクトリーができ、その中にライブラリーがインストールされます

## 2-4、データベースの作成とその設定

```
$ mysql -u root -p
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
mysql> CREATE DATABASE laravel;
```

その後、作成したユーザーに対して、該当データベースへの権限を付与する

```
$ GRANT ALL PRIVILEGES ON laravel.* TO "user"@"localhost";
$ FLUSH PRIVILEGES;
$ exit
```

【.envファイルの作成とデータベース情報の設定】
gitでクローンしたものには、.envがないので、.env.exampleをコピーして作成する

```
$ cp .env.example .env
$ vi .env
```

.envファイルの10行目付近から、下記に記載したデータベース情報の設定項目を変更する

```ruby:.env
DB_DATABASE=laravel
DB_USERNAME=user
DB_PASSWORD=password
```

６、パーミッションの付与

```
$ chown -R apache.apache /var/www/laravel
$ chmod -R 755 /var/www/laravel
```

７、キーの生成

```
$ php artisan key:generate
```

８、ドキュメントルートの変更

```
$ vi /etc/httpd/conf/httpd.conf
```

```ruby:httpd.conf
ServerName  サーバー名
DocumentRoot "/var/www/laravel/public"
AllowOverride All
```

に変更すると、ブラウザでドップページにアクセスすると、Laravel5が表示される

なお、作成したプロジェクトのディレクトリ直下で下記コマンドを実行すると、
・create_users_table
・create_password_resets_table
の２つのテーブルが作成されることが確認できる

```
$ php artisan migrate 
```




とりあえず、ざっくりとここまで。
Docker containerのJenkins2を最初からGoogle Login pluginが有効な状態で起動する

# tl;dr

dockerでjenkinsを立ち上げた時点でgoogle login pluginが有効になった状態にした
他の認証に関しては調べてないけど多分なんでもできる

https://github.com/Sho2010/docker-jenkins2

# 概要

dockerで簡単にjenkinsが立ち上がるのはいいんだけど
ユーザとか初期設定がめんどくさいのでそれもDockerfileに含めちゃう。

1. plugins.txt書いてDockerbuild時に必要なjenkins pluginを入れておく
1. custom.groovyを書いておくと初回起動に実行してくれるのでそこに認証設定を書く

# 認証設定

[custom.groovy](https://github.com/Sho2010/docker-jenkins2/blob/master/custom.groovy)


### 通常の認証

~~~groovy
def instance = Jenkins.getInstance()

def hudsonRealm = new HudsonPrivateSecurityRealm(false)
hudsonRealm.createAccount("hoge","your_password")
instance.setSecurityRealm(hudsonRealm)
instance.save()
~~~

### Google Login plugin

GCPでclientIDの作成とかcallback uriの設定とかは済んでる前提

~~~groovy
def instance = Jenkins.getInstance()

// google login settings
def clientId = "YOUR_GOOGLE_APP_CLIENT_ID"
def clientSecret = "YOUR_GOOGLE_APP_SECRET"
def domain = "google.com"

def googleRealm = new GoogleOAuth2SecurityRealm(clientId, clientSecret, domain)
instance.setSecurityRealm(googleRealm)
instance.save()
~~~

- - -

# 権限設定
このままだとユーザーは存在するが何の権限もない何もできないユーザなので
permissionを設定する。


~~~groovy
def strategy = new GlobalMatrixAuthorizationStrategy()
strategy.add(Jenkins.ADMINISTER, "sho20100@gmail.com")
instance.setAuthorizationStrategy(strategy)
instance.save()
~~~

### 参考資料

google login pluginの設定例
https://github.com/ridecharge/curbkins/blob/master/src/main/groovy/com/gocurb/curbkins/jobs/InstanceSecurity.groovy

LDAP認証とかPermissionを細く設定してる
https://github.com/hayderimran7/useful-jenkins-groovy-init-scripts/blob/master/init.groovy
vagrant box add で `unlink': Permission denied と言われました。

Vagrantでboxの追加ができないとエラーがでました。

# boxの追加でエラー

```bash:box追加でエラー
vagrant box add CentOS7 ./Downloads/box177fd765754acf8ec003019166ee7d1b0efa8775 
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'CentOS7' (v0) for provider: 
    box: Unpacking necessary files from: file:///Users/pugiemonn/Downloads/box177ad765754acf8ec003019166ee7d1b0efa8115
/opt/vagrant/embedded/lib/ruby/2.0.0/fileutils.rb:1439:in `unlink': Permission denied - /Users/pugiemonn/.vagrant.d/tmp/vagrant-box-add-temp-20160712-1431-1f3a7k8/EFI/BOOT/BOOTX64.EFI (Errno::EACCES)
    from /opt/vagrant/embedded/lib/ruby/2.0.0/fileutils.rb:1439:in `block in remove_file'

以下略
```
これは、boxが正しくないとエラーになるみたいです。例えばisoをboxとして追加しようとするとこうなります。

# 解決方法
boxを落として`vagrant box add`すると成功しました。
boxは http://www.vagrantbox.es/ から落とします(☝ ՞ਊ ՞)

# 参考
https://github.com/mitchellh/vagrant/issues/2812
バックエンドサーバー停止時にNginxが返却するレスポンスコード(502)を503にする方法

Nginxの[プロキシ機能](https://www.nginx.com/resources/admin-guide/reverse-proxy/)は、バックエンドサーバーが停止していると502(Bad Gateway)を応答する仕様のようです。Bad Gatewayは「ゲートウェイ／プロキシとして動作しているサーバ（Nginx）が、要請の履行を試みているときに，自身がアクセスした内方サーバ（バックエンドサーバー）から妥当でない応答を受信した。」という定義なので、動きとしては正しいそうです。
ただし、このようなケースでは、503(Service Unavailable)を返却したいと思うエンジニアの方も結構いるのではないでしょうか？
特にApacheのプロキシ機能(mod_proxy)を使っていたエンジニアの方は、503(Service Unavailable)になるものと決めつけているかもしれません・・・というか、私がその一人でした :sweat_smile: 

```text:デフォルトのレスポンス
$ curl -D - http://localhost:18080/spring-boot/
HTTP/1.1 502 Bad Gateway
Server: nginx
Date: Tue, 12 Jul 2016 07:02:31 GMT
Content-Type: text/html
Content-Length: 537
Connection: keep-alive
ETag: "56a7852a-219"

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>
```

# ってか503(Service Unavailable)にすべき？

これは議論がわかれるところな気がしますね。
個人的には、できるだけデフォルトの動き使うのが好きなので502のままでよい気がしているのですが、一方で微妙に内部の構成を外部に晒している感がある＋利用者目線で考えると502(Bad Gateway)より503(Service Unavailable)の方が直感的なエラーであることから、503(Service Unavailable)にしたい気もします（つまり、どっちつかずの優柔不断野郎です :grin: ）


# レスポンスコードを503(Service Unavailable)にしてみよう！！

503(Service Unavailable)派の方は、Nginxの[エラーページ機能](https://www.nginx.com/resources/admin-guide/nginx-web-server/#errors)(`error_page`ディレクティブ)を使ってレスポンスコードを変換することができます。

```text:nginx.conf
http {
    server_tokens off;
    server {
        listen       18080;
        server_name  localhost;
        location /spring-boot/ {
            proxy_pass http://localhost:8080/;
            error_page 502 =503 /50x.html; # 追加： 502を503に変換してエラーページ(`/50x.html`)をレスポンスする
        }
        # ...
    }
}
```

Nginxを再起動した後にアクセスすると、以下のようなレスポンス

```text:レスポンス
$ curl -D - http://localhost:18080/spring-boot/
HTTP/1.1 503 Service Temporarily Unavailable
Server: nginx
Date: Tue, 12 Jul 2016 06:57:01 GMT
Content-Type: text/html
Content-Length: 537
Connection: keep-alive
ETag: "56a7852a-219"

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>
```

# まとめ

無理に503(Service Unavailable)にする必要はないと思います。何かしらの制約により503(Service Unavailable)を応答する必要がある場合は、本記事で紹介した方法が使えると思います。


# 参考サイト

* https://www.nginx.com/resources/admin-guide/reverse-proxy/
* https://www.nginx.com/resources/admin-guide/nginx-web-server/#errors
Python IDEのSpyderを使う


知り合いのデータサイエンティストが、Spyderを便利に使っていたから自分も使おうと思った

# 前準備

condaをいれておく

# spyderをインストールする

```
$ conda install spyder
```

# 起動

```
$ spyder
```

# 便利

`fn + F9`で指定した行の部分だけ実行してくれる。
この機能が便利だから、Spyderを使っていると聞いた

![Spyder__Python_2_7__と_contents-studio-dev_—_spyder_—_spyder_—_python2_7_—_194×50.png](https://qiita-image-store.s3.amazonaws.com/0/2432/5d191310-2737-63ca-44f2-5d17655572c3.png)

# まとめ
iPython notebookより、ステップごとの確認がしやすい

# Tips

[Python開発環境(Anaconda3+spyder)の操作の小技](http://dededemio.blog.fc2.com/blog-entry-31.html)
NodeJSから外部コマンドに連想配列（ハッシュオブジェクト）を渡したい時にハマったメモ


NodeJSから外部コマンドに連想配列（ハッシュオブジェクト）を渡す時に引数で連想配列（ハッシュオブジェクト）を渡そうとしてハマった内容のメモ

# ファイル構成

実際にはNodeJSからPhantomJSを実行する時にハマりましたが、本ページではNodeJSからNodeJSを外部コマンドを実行した内容を記載します。

workspace
┃
┣main.js
┃
┗child.js

# ダメなパターン

```Javascript:main.js

// 外部コマンドに引数で渡したい連想配列
var rows = [ {
	col1 : 'id01',
	col2 : 'name01'
}, {
	col1 : 'id02',
	col2 : 'name02'
}, {
	col1 : 'id03',
	col2 : 'name03'
} ];

// そのまま標準出力
rows.forEach(function(colback, num) {
	console.log('before= col1: ' + rows[num].col1 + ' col2: ' + rows[num].col2);
	num++;
})

// 環境変数を取得してnodeコマンドを作成 「~/.nodebrew/current/bin/node」
var cmd;
var exec = require('child_process').exec, cmd;
var nodecmd = process.env.HOME + '/.nodebrew/current/bin/node';

// 引数に連想配を指定して外部コマンドを実行
cmd = nodecmd + ' nodejschild.js "' + rows + '"';

// 外部コマンドを実行する
exec(cmd, function(err, stdout, stderr) {
	if (!err) {
		console.log(stdout);
		console.log(stderr);
	} else {
		console.log(err);
	}
});

```

```Javascript:child.js

// 引数を取得
var argv = process.argv;

// argv[0]はnodeコマンドのパス
// argv[1]は「child.js」
// argv[2]が連想配列

var rows = argv[2];

console.log('childstdout= ' + rows);


```

```Bash:ターミナル

$ node main.js
before= col1: id01 col2: name01
before= col1: id02 col2: name02
before= col1: id03 col2: name03
childstdout= [object Object],[object Object],[object Object]

```

連想配列が「 〜 Object 〜 」と文字列になってしまいます。
きっと連想配列がオブジェクトだからなんでしょう。
外部コマンドを実行する時の引数は配列でないといけないと思われます。

# 修正後

引数の連想配列をJSON文字列に変換します。

```Javascript:main.js

// 外部コマンドに引数で渡したい連想配列
var rows = [ {
	col1 : 'id01',
	col2 : 'name01'
}, {
	col1 : 'id02',
	col2 : 'name02'
}, {
	col1 : 'id03',
	col2 : 'name03'
} ];

// そのまま標準出力
rows.forEach(function(colback, num) {
	console.log('before= col1: ' + rows[num].col1 + ' col2: ' + rows[num].col2);
	num++;
})

// 環境変数を取得してnodeコマンドを作成 「~/.nodebrew/current/bin/node」
var cmd;
var exec = require('child_process').exec, cmd;
var nodecmd = process.env.HOME + '/.nodebrew/current/bin/node';

// JSON文字列に変換
json = JSON.stringify(rows);

// 引数に連想配を指定して外部コマンドを実行
cmd = nodecmd + ' nodejschild.js "' + json + '"';

// 外部コマンドを実行する
exec(cmd, function(err, stdout, stderr) {
	if (!err) {
		console.log(stdout);
		console.log(stderr);
	} else {
		console.log(err);
	}
});

```

引数をJSON文字列として処理します。

```Javascript:child.js

// 引数を取得
var argv = process.argv;

// argv[0]はnodeコマンドのパス
// argv[1]は「child.js」
// argv[2]がJSON文字列

var rows = argv[2];
// JSON文字列として解析してオブジェクトを取得します。
rows = JSON.parse(rows);

console.log('childstdout= ' + rows);

rows.forEach(function(colbak, num) {
	console.log('after= col1: ' + rows[num].col1 + ' col2: ' + rows[num].col2);
	num++;
})

```

```Bash:ターミナル

$ node main.js
before= col1: id01 col2: name01
before= col1: id02 col2: name02
before= col1: id03 col2: name03
after= col1: id01 col2: name01
after= col1: id02 col2: name02
after= col1: id03 col2: name03

```

ただしく引数を取得して処理できるようになりました。

# まとめ

・ 外部コマンドの引数でオブジェクトで渡したい場合はJSON文字列に変換して実行する。
・ 呼び出された方のスクリプトでJSON文字列として処理する。

・ 引数にJSON文字列を渡す場合はJSON文字列の前後にシングルクォートを付ける。付けないとJSON文字列の途中で配列として分割されてしまう可能性があります。
パフォーマンス測定(ApacheBench)



・Apacheに付属しているabコマンドを使う
	例：ab -n 1000 -c 10 "http://localhost/?url=www.webike.net&w=140&h=87&ver=2&f="


-n 数値 テストで発行するリクエストの回数を数値で指定 
-c 数値 テストで同時に発行するリクエストの数を数値で指定 
-t 数値 サーバからのレスポンスの待ち時間（秒）を数値で指定 
-p ファイル名 サーバへ送信するファイルがある場合に指定 
-T コンテンツタイプ サーバへ送信するコンテンツヘッダを指定 
-v 数値 指定した数値に応じた動作情報を表示 
-w 結果をHTMLで出力（出力をファイルに保存すればWebブラウザで表組みされたものが見られる） 
-x 属性 HTML出力のtableタグに属性を追加（BORDERなど） 
-y 属性 HTML出力のtrタグに属性を追加 
-z 属性 HTML出力のtdまたはthタグに属性を追加 
-C 'Cookie名称=値' Cookie値を渡してテストする 
-A ユーザー名:パスワード ベーシック認証が必要なコンテンツにテストする 
-P ユーザー名:パスワード 認証の必要なプロキシを通じてテストする 
-X プロキシサーバ名:ポート番号 プロキシ経由でリクエストする場合に指定 
-V abのバージョン番号を表示 
-k HTTP/1.1のKeepAliveを有効にしてテストする 
-h abのヘルプを表示 


●abを実行するコンピュータの位置
	abがインストールされているコンピュータとなると、まずはWebサーバそのものということになるだろう。
	しかし、Webサーバでの実行は、効果測定に適しているとはいい難い。
	なぜなら、それは計算時間を測定しているだけであって、接続に要する時間などを測定できるわけではないからである。
	abは、少なくともWebサーバとは別のコンピュータで実行したい。
	できれば、ルータの直前か直後（図1）がいいだろう。そうすることで、より現実的なパフォーマンスを測定できるからである。

●発生させる同時接続数量
	リクエスト数はサンプリング数量だから、あまり多過ぎない程度に大きめの値を指定すればいい。
	それに対し、同時接続数の指定は慎重に選択したい。
	そのWebサーバへの同時接続数があらかじめ予測できるようであれば、その数値の前後30％程度の範囲で測定すればいいだろう。
	予測がつかない場合は広い範囲で測定するしかないが、どちらにしても同時接続数の限界を測るのも重要なポイントの1つだ。

	また、1台のコンピュータが発生させられる同時接続数についても注意したい。
	例えば、高性能なUNIXサーバに対して測定する場合、相当な数の同時接続を発生させる必要がある。
	しかし、普通のPCサーバで発生させられる同時接続数には、おのずと限界がある。
	従って、複数台のコンピュータにabを入れて測定しなければならない。たとえ、1台のコンピュータでこなせる数だとしても、複数台での測定も試してみることを勧める。

●リクエストするURL
	最後に、リクエストするURLであるが、これも十分に検討するべき項目だといえる。
	先にも述べたとおり、1つのWebページを表示するには、HTMLファイルとともに画像ファイルなども必要になる。
	しかし、abは単一かつ同一のファイルをリクエストすることしかできない。

	これは、Webサーバにとって有利な条件での測定となってしまう。
	そこで、複数台のコンピュータから、それぞれ別なファイルをリクエストするなどの工夫をしてみたい。
	また、リクエストするファイルの容量によって、どのような変化があるかなども、測定してみるといいだろう。

	さらには、静的なファイルだけでなく、プログラムを実行して作成されるページへのリクエストも測定したい。
	これも、単純なプログラムから、複雑なプログラムまで測定しておく。
	どんな場合でもいえることだが、さまざまなパターンの測定を、より多く集めた方が、結果の分析も多角的に行えるものである。
メモリ解放

■メモリ開放
※kernel の 2.6.16 以降

ページキャッシュを解放
\# echo 1 > /proc/sys/vm/drop_caches

dentry,inodeを解放する
\# echo 2 > /proc/sys/vm/drop_caches

ページキャッシュ,dentry,inodeを解放
\# echo 3 > /proc/sys/vm/drop_caches

・手順

free(事前にメモリの状況を把握する)
sync
echo 3 > /proc/sys/vm/drop_caches
free(メモリが開放されたのか確認する)

※syncコマンド
機能：バッファ(メモリ上のデータ)の内容を強制的にディスクに書き込みます。
システムを停止する前に、バッファ内に蓄積されているデータで、
まだハードディスクに書き込まれていないものは、このコマンドで書き込んでおく必要があります。



■カーネル内部のパラメータ

	・カーネル内部のすべてのパラメータ
		sysctl -a

	・メモリのパラメータを取得
		sysctl -a | grep vm.

	・ファイルシステムのパラメータを取得
		sysctl -a | grep -i fs.


	・ネットワークのパラメータを取得
		sysctl -a | grep -i net.


■カーネルパラメータの変更方法
	カーネルパラメータは「/proc/sys」ディレクトリ以下に設定されています。
	各項目に直接値を入れることで動的に変更することが可能です。
	例：
		# echo 512 > /proc/sys/kernel/msgmni
		# echo 50 > /proc/sys/vm/swappiness
		または
		# sysctl -w kernel.msgmni=512

	この2種類の方法は一時的な変更だけで、OSを再起動すると設定した値が元に戻ってしまいます。
	再起動しても常に設定値を反映させるには以下の方法で設定します。
	↓
	「/etc/sysctl.conf」ファイルに設定 
		「/etc/sysctl.conf」はカーネルパラメータを記述する設定ファイルです。
		このファイルにパラメータを追加し「sysctl -p」を実行するとファイルが読み込まれ値が設定されます。
		OS起動時には「/etc/rc.sysinit」の処理中に「sysctl -p」が実行されますので、
		再起動をしても同じ値が設定されることになります。

■カーネルのメモリ関連のチューニング項目
	vm.swappiness					スワップの動作に関するパラメータです。値が大きいほどより積極的にスワップを使用する動作となります。
	vm.dirty_ratio					メモリに対する割合で、ダーティなページがこの割合に達するとpdflushが動作します。
	vm.ditry_background_ratio		メモリに対する割合で、この割合に達するとバックグラウンドでpdflushが動作します。
	vm.ditry_writeback_centisecs	pdflushデーモンは定期的に起動してダーティなデータをディスクに書き出します。このパラメーターはpdflushデーモンが起動する間隔を指定します。単位は100分の1秒です。
	vm.dirty_expire_centisecs		ダーティなデータがディスクに書き出すために十分に古くなるまでの時間を指定します。この値より長時間メモリ上に存在するダーティなデータはpdflushによってディスクに書き出されます。単位は100分の1秒です。
	vm.min_free_kbytes				最低空き容量(この容量をした回ったときページキャッシュが開放される)
	vm.dirty_expire_centisecs		これは、キャッシュ上に存在しているページの存在時間がこの値を過ぎた場合にライトバックされます。デフォルト値は3000です(単位は10m/s)
	vm.dirty_writeback_centisecs	これは、pdflushの起動間隔を指定するパラメータです。デフォルト値は500です(単位は10m/s)

■カーネルのネットワーク関連のチューニング項目
	net.ipv4.tcp_mem				
	net.ipv4.tcp_wmem
	net.ipv4.tcp_rmem
	net.core.wmem_default
	net.core.wmem_max
	net.core.rmem_default
	net.core.rmem_max

■プロセスとユーザの制限値を取得
	ulimit -a



■カーネル内部でのシェアードメモリなどに関係する設定
	ipcs -u
	ipcs -l


■Linuxのブート情報を取得
	dmesg
業務で必要なシステムコマンド

■業務で必要なシステムコマンド

	cat /proc/meminfo			//メモリ搭載量を調べる(Linux)
	cat /proc/cpuinfo			//LinuxでCPUの性能・スペックを調べる
	less /etc/issue				//OS情報
	vmstat						//仮想メモリの統計をレポートする
		※	「r」の項目がrun queue
			「b」の項目がwait queue
			swapの項目
				si：スワップ領域から読み込んでメモリに展開したデータの量（スワップ・イン）
				so：メモリからスワップ領域に書き込んだデータの量（スワップ・アウト）
				swapについては基本的にはsiとsoは0で有り続けることを至上命題にすべきです
				ただ、一時的に目をつむるケースも出てくるかもしれません。
				例えばデータのバックアップとかファイルの整理などで一時的に大きなプログラムを動かさなければならない時とか。

	free						//システムの空きメモリと使用メモリの量を表示する 
	sysctl -w vm.drop_caches=1	//バッファやキャッシュを開放する
	cp -cp /dev/null ファイル名	//ファイルサイズを０にする
	:> ファイル名				//ファイルサイズを０にする
	du							//ディスク容量を調べる(調べたいディレクトリを調べられる)
		-h						//-hでサイズを表示
		--max-depth=1			//--max-depth=で調べる階層を指定
	ifconfig					//ネットワーク環境を確認する
		※	RX：受信パケット	送受信パケット数、エラーパケット数、破棄パケット数、オーバーランパケット（処理が間に合わなかったパケット）数
			TX：送信パケット	送受信パケット数、エラーパケット数、破棄パケット数、オーバーランパケット（処理が間に合わなかったパケット）数
			UP：インターフェイスの起動状態を表す。UPは現在正常に稼働
			RUNNING：インターフェイス準備の状態を表す。。「RUNNING」はドライバが正 常にロードされメモリへのリソース割り当てが行われている状態を示す。
	uptime						//システムの起動時間を表示するコマンドですが、同時に、システムの負荷の目安となる「load average」を表示できます。
		※	「load average」は、run queueに入っているジョブの数を表しています。
			run queueとはCPUに割り当てられたジョブが入れられる待ち行列のことで、CPU数が1つのときに「2」と表示された場合、
			CPUは2つのジョブを実行しています。この平均値が「load average」であり、左から1分、5分、15分間のrun queueにあるジョブ数となります。
			例えば、「load average」が「1.0」ならば、直近の1分間で常時1個のジョブがCPUに割り当てられていることを意味します。
			また、CPUリソースの割り当てを待っている状態のジョブは、run queueの前段階であるwait queueに入ります。
			これらのqueueの値が大きい状態であればサーバの負荷は高く、間断なく大量のジョブが発生している、
			あるいは1つのジョブの実行に時間やCPUリソースが大量に消費されていると考えられます。

	source ~/ファイル名			//例えば、~/.cshrc を書き変えたあと、その設定を有効にするために実行すると反映される
	uname	-m CPUのタイプを表示する 
			-n PCのホスト名を表示する 
			-r カーネルのバージョンを表示する 
			-s OS名を表示する 
			-v OSのリリース日を表示する 
			-a すべての情報を表示する 

	iconv	ファイルの中の文字コードを変換する
			例：iconv -f EUC-JP -t Shift_JIS < infile.txt > outfile.txt
			⇒ infile.txt の文字コードを EUC-JP とみなし、Shift_JIS に変換して outfile.txt に出力する。

	nkf		ファイルの中の文字コードを変換する
			-j JIS (ISO-2022-JP) コードに変換
			-s SJIS (Shift_JIS) コードに変換
			-e EUC-JP (EUC-JP) コードに変換
			例：nkf -e infile.txt > outfile.txt


■ネットワーク関連コマンド

	・サーバーのDNS設定(ドメインの名前解決をさせる設定)
		１．/etc/resolv.confに以下を設定
			serach ホスト名(クライアントが通信を行うときに、通信相手をドメイン名を除いたホスト名のみで指定できるようにする)
			nameserver DNSサーバーのIP１
			nameserver DNSサーバーのIP２

		２．ネットワークとApache(Apacheにも反映させたいとき)を再起動する
			ネットワークの反映：service network restartを実行
			Apacheの反映：
				/usr/local/apache2/bin/apachectl stop
				/usr/local/apache2/bin/apachectl start
				※/usr/local/apache2/bin/apachectl restartだと反映されない
ZabbixでSoftwareRAIDを監視する

ZabbixエージェントにUserParameterを設定してSoftwareRAIDの状態を監視します。エージェント側はCentOSです。

# SoftwareRAIDの状態を確認する
RAIDの状態は`/proc/mdstat`を見ることで確認できます。RAID1で健常であれば下記のように表示されます。

```text:/proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdb1[1] sda1[2]
      511988 blocks super 1.0 [2/2] [UU]
      
md1 : active raid1 sdb2[1] sda2[2]
      976247676 blocks super 1.1 [2/2] [UU]
      bitmap: 5/8 pages [20KB], 65536KB chunk
```

もし健常でない場合は、[UU]の部分が[U_]などになります。今回は、この"[ ]"内を監視するように設定します。

# エージェントの設定
すでにエージェント監視が行われているとします。
エージェントの設定ファイルの下記のパラメータを追加します。なお、パラメータ名は任意です。パラメータを追加したらエージェントを再起動します。

```text:/etc/zabbix/zabbix_agentd.conf
UserParameter=raid.healthy,egrep '[0-9]+ blocks (.* )?\[[0-9]+/[0-9]+\] \[U+\]' /proc/mdstat|wc -l
```

# 監視テンプレートの作成
Zabbixの「設定」->「テンプレート」でテンプレートの一覧が表示され、右上の`テンプレートの作成`から作成できます。

テンプレート名と適切なグループを設定し、`追加`します。

## アイテム
作成したテンプレートのアイテムを選択し`アイテムの作成`から作成します。

<img width="822" alt="スクリーンショット 2016-07-12 15.19.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/48446/9f882348-dfba-30d8-0556-8d9b5e9d2bd4.png">

## トリガー
RAIDに障害が起きた際アラートがなるように設定します。同じようにテンプレートのトリガーを選択し`トリガーの作成`から作成します。
条件式は一例ですのでその他の設定と合わせて状況に応じて設定してください。下記はRAID1の場合。

<img width="621" alt="スクリーンショット 2016-07-12 15.13.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/48446/24e6be37-c458-366f-9074-71c451c7058b.png">


## グラフ
必要であれば設定します。

# 参考
- [Zabbixエージェントで LinuxのソフトウェアRAIDを監視する - ブログ - ワルブリックス株式会社](http://goo.gl/AoxyLE)
ディレクトリ間の差分ファイル一覧取得をbash scriptで実現させる

## 今回の目的
Gitを使わずに2つのディレクトリの差分ファイル一覧を取得したい。

## なぜやるのか
もちろん大抵のGitが導入されているプロジェクトであれば```git diff --name-only```でファイル名一覧の差分を取得することが出来ると思います。

ただ、例えば
```本番サーバーではセキュリティ面を考えて、git pullは使わずにscpを利用している。```
といことでした。そのため、gitを使わずにファイル一覧の差分を取得する必要があったわけです。

### diffコマンドを試してみる
gitがダメなら次に考えられるのがdiffコマンドです。
div、div_proという2つのディレクトリがあるとします。
divとdiv_proを単純にdiffコマンドでファイル一覧を取得すると以下のようになります。

```
$ diff -qr ./div ./div_pro/
Only in ./div: .DS_Store
Files ./div/css/style.css and ./div_pro/css/style.css differ
Only in ./div/images: .DS_Store
Only in ./div/images: uber.png
Files ./div/index.html and ./div_pro/index.html differ
Files ./div/js/sample.js and ./div_pro/js/sample.js differ
```
#### diff Option
-q : 差分のあったファイル名を表示する(ファイル名のみではない)
-r : 2つのディレクトリを再帰的にたどって、すべてのファイルを比較する

Onlyから始まる　→　新規ファイル
Filesから始まる　→　修正(差分)があったファイル

見た通り差分がすぐわかると思います。
ただ、今回の欲しい情報は```git diff --name-only```のようなファイル名一覧のみです。

なので、上記のコマンドを元に欲しい情報へ整形させます。
それを実現させるためのscriptを書きました。

## 結論

```bash
#  $1 $2はinput値です。ここではディレクトリ名を入れます。
output=$(diff -qr $1 $2)
array=()
while read -r line; do
  string=$(echo "$line" | awk '{print $1}');
  if [ $(echo $string | grep -e 'Only') ]; then
	path=$(echo "$line" | awk '{print $3}' | sed -e "s/\:/\//");
    fileName=$(echo "$line" | awk '{print $4}');
    # .DS_SToreはMacのみなので、必要がなければ削除してください
	if [ $fileName != '.DS_Store' ]; then
	  echo ${path/$1/$2}$fileName;
	  array+=(${path/$1/$2}$fileName);
	fi
  else
    echo $(echo "$line" | awk '{print $4}');
	array+=($(echo "$line" | awk '{print $4}'));
  fi
done <<< "$output"
```
#####Command

```
$ sh script.sh ./div ./div_pro
./div_pro/css/style.css
./div_pro//images/uber.png
./div_pro/index.html
./div_pro/js/sample.js

```

これで差分のあったファイルに何か処理をさせるといったことも出来るようになりました。

※間違いの指摘やもっと他にいい方法があればぜひ教えてほしいです！！
SSH関連資料

■SSH接続

■鍵作成(接続元サーバー)

	１．ssh-keygen -t rsa
		１．Enter file in which to save the key (/root/.ssh/id_rsa):
			→そのまま空白でEnterする

		２．Enter passphrase (empty for no passphrase):
			→そのまま空白でEnter

		３．Enter same passphrase again:
			→そのまま空白でEnter

		４．完了

	２．
		vi /etc/ssh/sshd_config

		１．下記のコメントアウトを外す
			Protocol 2
			PermitRootLogin no
			RSAAuthentication yes
			PubkeyAuthentication yes
			ChallengeResponseAuthenication no

		２．文法チェック→ /usr/sbin/sshd -t

		３．再起動→/sbin/service sshd restart

	３．接続先サーバー上で接続するユーザー権限で.sshディレクトリを作成する
		mkdir .ssh

	４．scp id_rsa.pub(接続元サーバー) 接続先ユーザー名@接続先IP:.sshまでのパス

	５．接続先サーバーへコピーしたscp id_rsa.pubの名前をauthorized_keysに変更する。
		cat id_rsa.pub >> authorized_keys

	６．chmod 600 authorized_keys(接続先サーバー)

	７．chmod 700 .ssh(接続先サーバー)

	８．接続元サーバーから接続先サーバーへ接続できるのかテスト
		ssh 接続先ユーザー名@接続先IP

	９．接続されれば完了
SSH/SCPでパスワードなしでログインする手順

■SSH/SCPでパスワードなしでログインする手順

１．/home配下のユーザーディレクトリに.sshディレクトリがなければ作成
	mkdir .ssh
	chmod 700

２．キーの作成
	ssh-keygen -t dsa 
	※何も入力せずenter

３．.sshディレクトリ内に作成されるid_dsa.pubがキー
	作成されるすべてのファイルのパーミッションを600にする

４．id_dsa.pubをリモート先サーバーの.ssh内にコピーする

★↓ここからリモート先サーバーの設定↓★

５．コピーしたid_dsa.pubから以下のコマンドを実行
	cat id_dsa.pub >> authorized_keys
	chmod 600

６．id_dsa.pubを削除

以上でローカルサーバーから以下のコマンドを実行すると
パスワード入力なしに接続できます。

例：scp nishizawa@192.168.0.240:/home/nishizawa/.ssh/test.txt ./
(オプションなしでも大丈夫)
nobody権限でのSSH設定

■/ect/ssh/ssh_config内に下記を追加
StrictHostKeyChecking=no

SSH設定したユーザーのファイルを指定
/sbin/.ssh/id_rsa

権限もnobodyに変更する

■SSHコマンド
sudo -u nobody ssh -i /sbin/.ssh/id_rsa nishizawa@192.168.1.32 hostname
BASIC認証の設定

【説明】
apacheのベーシック認証のパスワードを設定する際に使用します。

htpasswdコマンドを使って、apacheベーシック認証用のファイルを作成します。
最初はパスワードファイルを作成するために「-c」オプションが必要です。
「-c」オプションの後にはパスワード情報を格納するためのファイルを指定します。
「-b」オプションを指定した場合、コマンドラインからパスワードが設定できます。
「-n」オプションを指定した場合、パスワードファイルを指定する必要はありません。


【構文】
htpasswd　［オプション］　［パスワードファイル］　［ユーザ名］　［パスワード］

例　testユーザのベーシック認証パスワードを設定します。
[root@localhost xinetd.d]# htpasswd -cb passfile test testpasswd
Python: オブジェクトのメソッド一覧を取得する

Pythonでオブジェクトのメソッド名を全て取得する方法です。

```python
print type(obj)
for x in inspect.getmembers(obj, inspect.ismethod):
  print x[0]
```

```text:出力例
<class 'nfc.tag.tt3_sony.FelicaStandard'>
__init__
__str__
_format
_is_present
authenticate
dump
dump_service
format
polling
protect
read_from_ndef_service
read_without_encryption
request_response
request_service
request_system_code
search_service_code
send_cmd_recv_rsp
write_to_ndef_service
write_without_encryption
```

dirを使った方法もコメントにて紹介いただきました。

```py
for x in dir(obj):
    print x, ':', type(eval("obj."+x))
```

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)