OmniAICreator/Qiita-1.07M huggingface dataset:
Animate CCで書きだしたCreateJSのグラフィックスの色をプログラム上から変更する



##使用したバージョン
- Animate CC 2015
- CreateJS 8.0.2
- Chrome  48.0

# Animate CCから書き出されるCreateJSのMovieClipの構造
変数として書き出される名前はAnimate CC側でつけたインスタンスの名前と同じ名前が付く（タイムラインに分割して配置されると、_1といった連番の番号が後ろに付く)

```myShapeColor.js抜粋
(lib.FaceBase = function(mode,startPosition,loop) {
	this.initialize(mode,startPosition,loop,{});

	// レイヤー 1
	this.shape = new cjs.Shape();
	this.shape.graphics.f("#CCCCCC").s("#D4D4D4").ss(1,1,1).de(-61.9,-61.9,123.8,123.8);
	this.shape.setTransform(61.9,61.9);

	this.timeline.addTween(cjs.Tween.get(this.shape).wait(1));

}).prototype = p = new cjs.MovieClip();
p.nominalBounds = new cjs.Rectangle(-1,-1,125.8,125.8);

...略

(lib.MyFace = function(mode,startPosition,loop) {
	this.initialize(mode,startPosition,loop,{});

	// mouth
	this.mouth = new lib.Mouth();
	this.mouth.setTransform(62.2,113.4,1,1,0,0,0,26.7,26.7);

	this.timeline.addTween(cjs.Tween.get(this.mouth).wait(8));

    ...略

	// レイヤー 6
	this.faceBase = new lib.FaceBase();
	this.faceBase.setTransform(61.9,61.9,1,1,0,0,0,61.9,61.9);

	this.timeline.addTween(cjs.Tween.get(this.faceBase).wait(8));

}).prototype = p = new cjs.MovieClip();
p.nominalBounds = new cjs.Rectangle(-0.5,-0.5,124.8,124.8);

```

# MovieClipの構造をたどるには？

`Object.keys`等でコンテナ内のプロパティを辿ることが出来る。`createjs.MovieClip`の時に再帰的に同じ関数を呼び出すことで、更に奥深くの`createjs.MovieClip`を取得することが出来る。

```
function searchHierarchy(container) {

  Object.keys(container).forEach(function (key) {
    if (container[key] instanceof createjs.Shape) {
      // Shapeの時の処理
    }
    if (container[key] instanceof createjs.MovieClip) {
      // MovieClipの時は同じ関数を呼び出して、更に深い階層を取得する
      searchHierarchy(container[key]);
    }
  });
}
```

# シェイプの色を変えるには？

`createjs.Shape`はグラフィックスを描画した時のコマンドを保持している。
`shape.graphics.instructions`プロパティーに描画したグラフィックスの配列が入っているので、グラフィックスの中身を直接編集することで色を変更することが可能。

```
function changeColor(shape, color) {
  var instructions = shape.graphics.instructions;
  if (instructions && instructions.length > 0) {
    for (var i = 0; i < instructions.length; i++) {
      var cmd = instructions[i];
      if (cmd instanceof createjs.Graphics.Fill) { // 塗りのとき
        cmd.style = color;
      } else if (cmd instanceof createjs.Graphics.Stroke) { // 線のとき
        cmd.style = color;
      }
    }
  }
}
```

# まとめ

MovieClipの構造を辿り、シェイプの色を変更することで、Animate CCで描いたシェイプの色を変更することが出来る。

例えば、とある名前のインスタンスのムービークリップの色だけを変えるといったことが可能で、応用することで自由に色を変えられるようなアバターシステムのようなものが作成できる。はず。

- [作成したサンプル](https://nyamogera.github.io/CreateJS-Sample/sample-color-change-face/index.html)
- [作成したサンプルのソースコード](https://github.com/nyamogera/CreateJS-Sample/tree/gh-pages/sample-color-change-face)
Implementing functional languages を頑張って読む.14日目

# 14日目

やるき

## Taking a step

スタックトップを見てヒープに展開し,dispacthで適した関数を呼ぶ.
スタックってなんだっけ.
→要素はヒープのアドレス.
ヒープってなんだっけ.
→utilsに入ってる.nodeを格納できる.
Rule 2.1をわすれた.

|a : s|d|h[a : NAp a1 a2]|f|
|:-:|:-:|:-:|:-:|
| a1 : a : s|d|h|f|

うん,たしかにRule2.1通りだ.

おわり

**rule 2.1を見た.明日はApplying a supercombinatorを読む**
CircleCIでライセンスに同意できずに失敗する場合の対処方法


# 追記
* Andorid N Previewの公開が原因のようでした。
	* [参考](http://techbooster.org/android/17335/)

# 概要
今日(2016/03/09)CircleCIでビルドする際に以下のようにライセンスの同意に失敗し、ビルドがfailedしていた。

```bash
Do you accept the license 'android-sdk-license-ed0d0a5b' [y/n]: 
Unknown response ''.
Do you accept the license 'android-sdk-license-ed0d0a5b' [y/n]: 
Unknown response ''.
Do you accept the license 'android-sdk-license-ed0d0a5b' [y/n]: 
Unknown response ''.
Do you accept the license 'android-sdk-license-ed0d0a5b' [y/n]: 
Unknown response ''.
Do you accept the license 'android-sdk-license-ed0d0a5b' [y/n]: 
Unknown response ''.
Do you accept the license 'android-sdk-license-ed0d0a5b' [y/n]: 
Unknown response ''.
```

# 原因
認証するライセンスの数が2つに増えたのが原因

# 対処方法

以下のように`sleep`を利用してライセンスの同意を行えば取り敢えず上手くアップデートできた。

```bash
(while :
do
  echo 'y'
  sleep 3
done) | android update sdk --no-ui --all --filter "android-23,build-tools-23.0.2,extra-google-m2repository,extra-android-m2repository"
```

# 参考
* https://github.com/JakeWharton/sdk-manager-plugin/issues/101
schema_migrations table

schema_migrations table 所有run过的migration

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| c9                 |
| irm_dev            |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

mysql> use irm_dev
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> desc schema_migrations;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| version | varchar(255) | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> select * from schema_migrations
    -> ;
+----------------+
| version        |
+----------------+
| 20160309111823 |
+----------------+
1 row in set (0.00 sec)

mysql> 
```
rails3 mysql2 activation error

 ```
invoke  active_record
/usr/local/rvm/gems/ruby-1.9.3-p551@global/gems/bundler-1.7.6/lib/bundler/rubygems_integration.rb:266:in `block in replace_gem': Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (can't activate mysql2 (~> 0.3.10), already activated mysql2-0.4.3. Make sure all dependencies are added to Gemfile.) (LoadError)

```

gemfile里
gem 'mysql2', '~> 0.3.10'

gem uninstall mysql2

bundle update
rails3 warning

        SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
        This poses a security threat. It is strongly recommended that you
        provide a secret to prevent exploits that may be possible from crafted
        cookies. This will not be supported in future versions of Rack, and
        future versions will even invalidate your existing user cookies.

        Called from: /usr/local/rvm/gems/ruby-1.9.3-p551/gems/actionpack-3.2.0/lib/action_dispatch/middleware/session/abstract_store.rb:28:in `initialize'.


https://ruby-china.org/topics/7858
Stringの文字列長の取得はextensionでラップしておく

役に立つかどうかよくわからないTipsシリーズ

swiftで文字列の長さをとるには、下記のように書きます

```swift
"文字列".characters.count
```
になるらしいです
昔は煩わしかった絵文字なんかも吸収してくれてます

でもこれは swift2.0 からなんだそうです
しかも、1.0系の中でも色々と仕様が変わってきた歴史があるんだとか・・・

2.0系から swift を触りだした人間としては、その苦労は肌に感じたことないのですが、
これからもそういう事が起きるやもしれません

これから先もソースを再利用していくならば
文字列長を取得するメソッドを自分で決めておくようにしてしたほうがいいかもしれません

たとえば
`String`には、ありそうでなかった `length`というプロパティがありません
なので、extension で作ってしまいます

```swift
public extension String {
    
    /// 文字列長
    ///
    ///     "⏩".length // 1
    ///     "😻".length // 1
    ///     "123".length // 3
    ///     "ABC".length // 3
    ///     "あいう".length // 3
    public var length: Int {
        return self.characters.count
    }
}
```

こうしておけば
> 「`self.characters.count`で文字列長が取れなくなった・・！」
> 「じゃあ、全部の文字列長を取得する箇所を直さないと！」

みたいな作業がなくなるかも
nginxでステータス200以外でもヘッダーを付けたい

nginxでレスポンスコード200以外(4xxとか5xx)でもレスポンスヘッダーを付けたいことありますよね。  

そんな時、`always` を付与すると、ステータスコードにかかわらずレスポンスヘッダーを付与することが出来ます。

```nginx
add_header 'Access-Control-Allow-Origin' '*' always;
```

## 対応バージョン

1.7.5移行であれば利用できるようです。
http://nginx.org/en/docs/http/ngx_http_headers_module.html

## 非対応バージョン

headers-more-nginx-moduleを利用すると実現できそうです。
https://github.com/openresty/headers-more-nginx-module#synopsis
`pip install pygraphviz`がgraphvizの発見に失敗する

pygraphviz (1.3.1) をインストールするときに、`library_dirs`と`include_dirs`が見つからないというエラーが出た。


#環境
+ Debian jessie (on VirtualBox)
+ Python 3.5.1


# 解決法

graphvizを入れていなかったのでインストールした。

```sudo aptitude install graphviz graphviz-dev```

-> ついでにdevも入れてみたけどこれだけじゃ解決しなかった。

`setup.py`のコメントを外したらライブラリパスをみつけられるよっていうもの[pygraphvizのインストールでエラー - 雑記](http://d.hatena.ne.jp/yuheiomori0718/20111217/1324110664)を発見。

で、`setup.py`を読んで、
```sudo aptitude install pkg-config```
をしたらうまくいった。
せっかく`pip`でインストールしてるのに`setup.py`をいじるのめんどくさいからね。


# 参考：エラーメッセージ

```
vagrant@debian-jessie:~/$ pip install pygraphviz
Collecting pygraphviz
  Using cached pygraphviz-1.3.1.tar.gz
Installing collected packages: pygraphviz
  Running setup.py install for pygraphviz ... error
    Complete output from command /home/vagrant/.pyenv/versions/3.5.1/envs/sitegraph/bin/python3.5 -u -c "
import setuptools, tokenize;__file__='/tmp/pip-build-g95csk3x/pygraphviz/setup.py';exec(compile(getattr(t
okenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/
pip-5vp5ruci-record/install-record.txt --single-version-externally-managed --compile --install-headers /h
ome/vagrant/.pyenv/versions/3.5.1/envs/sitegraph/include/site/python3.5/pygraphviz:
    running install
    Trying pkg-config
    Failed to find pkg-config
    Trying dotneato-config
    Failed to find dotneato-config
    Failed to find dotneato-config

    Your Graphviz installation could not be found.

            1) You don't have Graphviz installed:
               Install Graphviz (http://graphviz.org)

            2) Your Graphviz package might incomplete.
               Install the binary development subpackage (e.g. libgraphviz-dev or similar.)

            3) You are using Windows
               There are no PyGraphviz binary packages for Windows but you might be
               able to build it from this source.  See
               http://networkx.lanl.gov/pygraphviz/reference/faq.html

            If you think your installation is correct you will need to manually
            change the include_dirs and library_dirs variables in setup.py to
            point to the correct locations of your graphviz installation.

            The current setting of library_dirs and include_dirs is:
    library_dirs=None
    include_dirs=None

    error: Error locating graphviz.

    ----------------------------------------
Command "/home/vagrant/.pyenv/versions/3.5.1/envs/sitegraph/bin/python3.5 -u -c "import setuptools, toke$
ize;__file__='/tmp/pip-build-g95csk3x/pygraphviz/setup.py';exec(compile(getattr(tokenize, 'open', open)($
_file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-5vp5ruci-record/inst
all-record.txt --single-version-externally-managed --compile --install-headers /home/vagrant/.pyenv/versi
ons/3.5.1/envs/sitegraph/include/site/python3.5/pygraphviz" failed with error code 1 in /tmp/pip-build-g9
5csk3x/pygraphviz
```
ローマ字打ち方一覧表

Win7で確認、多分これで全部だと思います。
タイピングゲームを作るときの参考などに。

####一字 or 二字タイプするの
||a|i|u|e|o|ぁゃ|
|:--|:--|:--|:--|:--|:--|:--|
||あ|い|う|え|お||
|k|か|き|く|け|こ|
|q|くぁ|くぃ|__く__|くぇ|くぉ|ぁ|
|c|か|__し__|く|__せ__|こ|
|s|さ|し|す|せ|そ|
|t|た|ち|つ|て|と|
|n|な|に|ぬ|ね|の|
|h|は|ひ|ふ|へ|ほ|
|f|ふぁ|ふぃ|__ふ__|ふぇ|ふぉ|ぁ|
|m|ま|み|む|め|も|
|y|や|__い__|ゆ|_いぇ_|よ|ぁ|
|r|ら|り|る|れ|ろ|
|w|わ|__うぃ__|_う_|__うぇ__|を|ぁ|
|g|が|ぎ|ぐ|げ|ご|
|z|ざ|じ|ず|ぜ|ぞ|
|j|じゃ|__じ__|じゅ|じぇ|じょ|ゃ|
|d|だ|ぢ|づ|で|ど|
|b|ば|び|ぶ|べ|ぼ|
|p|ぱ|ぴ|ぷ|ぺ|ぽ|
|v|ヴぁ|ヴぃ|__ヴ__|ヴぇ|ヴぉ|ぁ|

####小さいの
||a|i|u|e|o|
|:--|:--|:--|:--|:--|:--|
|l, x|ぁ|ぃ|ぅ|ぇ|ぉ|
|ly, xy|ゃ|**ぃ**|ゅ|**ぇ**|ょ|
|lt, xt|||っ|||
|lw, xw|ゎ||||
|lk, xk|ヵ|||ヶ||

####ん
|xn, nn(, n)|ん
|:--|:--|

####三字タイプするの
||a|i|u|e|o|ぁゃ|
|:--|:--|:--|:--|:--|:--|:--|
|wh|うぁ|うぃ|**う**|うぇ|うぉ|ぁ|
|ky|きゃ|きぃ|きゅ|きぇ|きょ|ゃ|
|qw|くぁ|くぃ|くぅ|くぇ|くぉ|ぁ|
|kw|くぁ|||||ぁ|
|qy|くゃ|くぃ|くゅ|くぇ|くょ|ゃ|
|sy|しゃ|しぃ|しゅ|しぇ|しょ|ゃ|
|sh|しゃ|**し**|しゅ|しぇ|しょ|ゃ|
|sw|すぁ|すぃ|すぅ|すぇ|すぉ|ぁ|
|cy, ty|ちゃ|ちぃ|ちゅ|ちぇ|ちょ|ゃ|
|ch|ちゃ|**ち**|ちゅ|ちぇ|ちょ|ゃ|
|ts|つぁ|つぃ|**つ**|つぇ|つぉ|ぁ|
|th|てゃ|てぃ|てゅ|てぇ|てょ|ゃ|
|tw|とぁ|とぃ|とぅ|とぇ|とぉ|ぁ|
|ny|にゃ|にぃ|にゅ|にぇ|にょ|ゃ|
|hy|ひゃ|ひぃ|ひゅ|ひぇ|ひょ|ゃ|
|fy|ふゃ|ふぃ|ふゅ|ふぇ|ふょ|ゃ|
|fw|ふぁ|ふぃ|ふぅ|ふぇ|ふぉ|ぁ|
|my|みゃ|みぃ|みゅ|みぇ|みょ|ゃ|
|ry|りゃ|りぃ|りゅ|りぇ|りょ|ゃ|
|gy|ぎゃ|ぎぃ|ぎゅ|ぎぇ|ぎょ|ゃ|
|gw|ぐぁ|ぐぃ|ぐぅ|ぐぇ|ぐぉ|ぁ|
|zy, jy|じゃ|じぃ|じゅ|じぇ|じょ|ゃ|
|dy|ぢゃ|ぢぃ|ぢゅ|ぢぇ|ぢょ|ゃ|
|dh|でゃ|でぃ|でゅ|でぇ|でょ|ゃ|
|dw|どぁ|どぃ|どぅ|どぇ|どぉ|ぁ|
|by|びゃ|びぃ|びゅ|びぇ|びょ|ゃ|
|py|ぴゃ|ぴぃ|ぴゅ|ぴぇ|ぴょ|ゃ|
|vy|ヴゃ|ヴぃ|ヴゅ|ヴぇ|ヴょ|ゃ|

####二回タイプ+aiueoで っ が出来るの
例)bba→っば
b, c, d, f, g, h, j, k, l, m, p, q, r, s, t, v, w, x, y, z
パワポのオブジェクトをフォトショップのレイヤーみたく管理する方法

# よく忘れるので備忘録

* 「ホーム」リボンより「選択」をクリックする
* メニューからの「オブジェクトの選択と表示」をチェックする
* できやがり![a.png](https://qiita-image-store.s3.amazonaws.com/0/71261/85836fe0-3032-df43-fbf3-9cc7f6d696bb.png)
Ruby Array of HashをCSVに変換


以下のように順番も必須項目もばらばらのハッシュ配列をCSVに変換したい.

```rb
[
	{ name: "Newton", age: 84, from: "England", gender: "male" },
	{ name: "Planck", age: 89, role: "physicist" },
	{ from: "Russia", age: 53, name: "Tchaikovsky", role: "composer" },
	{ from: "Czech", name: "Nedved", tel: "00-0000-0000", role: "soccer player" },
]
```

想定の変換CSV

```csv
name,age,from,gender,role,tel
Newton,84,England,male,,
Planck,89,,,physicist,
Tchaikovsky,53,Russia,,composer,
Nedved,,Czech,,soccer player,00-0000-0000
```

ざっと探したところ標準の方法はないみたいだったので作った.

```rb
def hash_list_to_csv_array( list, key_order=nil )
  key_order ||= list.map(&:keys).flatten.uniq
  arr = list.map do |hash|
    key_order.map{|key| hash[key]}
  end
  arr.unshift(key_order)
end

require "csv"
list = [
  { name: "Newton", age: 84, from: "England", gender: "male" },
  { name: "Planck", age: 89, role: "physicist" },
  { from: "Russia", age: 53, name: "Tchaikovsky", role: "composer" },
  { from: "Czech", name: "Nedved", tel: "00-0000-0000", role: "soccer player" },
]
puts hash_list_to_csv_array( list ).map(&:to_csv).join
  # name,age,from,gender,role,tel
  # Newton,84,England,male,,
  # Planck,89,,,physicist,
  # Tchaikovsky,53,Russia,,composer,
  # Nedved,,Czech,,soccer player,00-0000-0000

# キーの並びと項目を明示指定したいときは第２引数に指定
puts hash_list_to_csv_array( list, [:role,:name] ).map(&:to_csv).join
  # role,name
  # ,Newton
  # physicist,Planck
  # composer,Tchaikovsky
  # soccer player,Nedved
```

### Environment

```
% ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
```
underscoreコードリーディング（isFunction）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isFunctionとは


###[underscorejs.orgのisFunction](http://underscorejs.org/#isFunction)

こんな説明。
>####_.isFunction(object) 
Returns true if object is a Function.

```javascript
_.isFunction(alert);
=> true

```

------------- 
objectがFunctionの場合trueを返します。

###[underscore.isFunction](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1232)
コード的にはこのあたり。

```javascript
  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
  // IE 11 (#1621), and in Safari 8 (#1929).
  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
    _.isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }
```
/./がfunctionではないカツtypeof Int8Arrayがobjectではない場合（IE11とSafari8じゃない場合？）
_.isFunctionを以下のように宣言する。

引数はobj
typeof objが'function'の文字列と一致した場合の結果またはfalseを返す。
GitHub pagesってなんぞ？

#GitHub pagesってなんぞ？
##概要
「GitHub pages」って単語は聞いたことがあるが、実際に使った事はなかったので、
調べれ見たところ、まぁまぁそこそこ使えたのでまとめます。

##GitHub pagesとは
無料でWebページが公開できる。
Gtihubの一機能
Gtihubのアカウントさえあれば誰でも利用可能です。

公式サイト https://pages.github.com/

##使い方
1.gitでリポジトリを作成します。
```gitname.github.io```

2.リポジトリをcloneします。
```git clone https://github.com/gitname/gitname.github.io```

3."Hello World"の作成
```cd gitname.github.io
echo "Hello World" > index.html```

4.commit&push!
```git add --all
git commit -m "first commit"
git push -u origin master```

5.公開確認
http://gitname.github.io.

##補足情報
BitbucketでもGithub PagesのようにWebページを公開が可能です。
また、静的サイトジェネレータとの相性が良い
(Jekyll/Octopress/Hexo/metalsmith/assemble/)

##感想
railsやphpを使わない静的なものを取り急ぎ公開したい時に便利。そんな場面あまり無いですが。
jsのライブラリ・プラグイン等、静的なページでdemoがないgit hubを見つけたらサクッと持ってきてアップして動きの確認を簡単にできる。そんな場面あまり無いですが。

##参考文献
・http://liginc.co.jp/web/html-css/html/96453
・http://qiita.com/budougumi0617/items/221bb946d1c90d6769e9
・http://qiita.com/n0bisuke/items/8576456f2e329cb1df45
レスポンシブなイメージマップの作成

1枚の画像に複数のリンクを付けるイメージマップですが、htmlとcssだけではレスポンシブに対応できないので「jQuery RWD Image Maps」というプラグインを使用します。

**jQuery RWD Image Maps**
https://github.com/stowball/jQuery-rwdImageMaps

###実装サンプル
```html
<script type="text/javascript" src="jquery.rwdImageMaps.min.js"></script>
```

```html:html
<img src="img.png" width="800" height="115" usemap="#ImageMap">
<map name="ImageMap">
    <area shape="rect" coords="200,0,500,110" href="#" alt="" />
</map>
```

```css:css
img[usemap] {
    max-width: 100%;
    height: auto;
}
```

```js:js
$(document).ready(function(e) {
    $('img[usemap]').rwdImageMaps();
})
```

注意点は`img`タグに**画像が表示上の最大幅となる時**の`width`と`height`を指定することです。


`area`タグの座標の作成は「HTML Imagemap Generator」が便利です。
HTML Imagemap Generatorを使用する際は**表示上の最大幅**の画像を使用してください。

**HTML Imagemap Generator**
http://labs.d-s-b.jp/ImagemapGenerator/
indexメソッドでインデックスを複数個返す方法

# indexメソッドで複数個インデックスを返す方法
pythonでindexメソッドというものが存在する。このメソッドは最初の検索文字にヒットしたインデックスを返すというものだが、全てのインデックスを返すことはできなさそう。検索してもなぜか出てこない（検索の仕方が悪いのかもしれないが）。そこで自分で検索した文字列にヒットするインデックスを複数個返すindexメソッドの拡張版をざっと書いてみた。


```lang:index_multi.py
def index_Multi(List,liter):
	#Listはリスト本体・literは検索したい文字
	index_L = []
	for val in range(0,len(List)):
		if liter == List[val]:
			index_L.append(val)
	return index_L
```
Listは検索したいリスト群、literは検索したい文字列を引数として与えてやると、検索したい文字列と一致したインデックスが返ってくる。

##テスト

test_Lに入っている要素から500のインデックスを抽出する。

```lang:index_test.py
def index_Multi(List,liter):
	#Listはリスト本体・literは検索したい文字
	index_L = []
	for val in range(0,len(List)):
		if liter == List[val]:
			index_L.append(val)
	return index_L

if __name__ == "__main__":

	test_L = [500,0,0,0,0,0,0,500,200]
	print index_Multi(test_L,500)

```

```lang:実行結果
[0, 7]
```

スマートなやり方やメソッドがあった場合は本記事を削除させていただきます。

##スマートな方法

**追記**
ご指摘いただきました。この方法を使うと一行で表現できます。


```lang:index_test.py

if __name__ == "__main__":

	test_L = [500,0,0,0,0,0,0,500,200]
    index_num = [n for n, v in enumerate(test_L) if v == 500]
	print index_num

```


##参考
[要素確認 in演算子, indexメソッド, countメソッド](http://www.pythonweb.jp/tutorial/list/index10.html)
【MT】ロリポップでMovableTypeのcron設定

ロリポップのサーバーで忘れたころにcron設定し、よく動かいないのでメモします。
他のレンサバも同じように設定すれば動くと思います。
MovableTypeの「日時指定」を有効にするには、cronの設定をし、サーバー上にshというシェルスクリプトのファイルを設置する必要があります。

#そもそもcron設定とは

私もよく知らないので説明を引用します。

> cronとは、UNIX系システムの常駐プログラム（デーモン）の一種で、ユーザの設定したスケジュールに基づいて指定したコマンドやシェルスクリプトなどを自動実行してくれるプログラム。
> 
> 実行スケジュールは毎時、毎日、毎週、毎月をはじめ細かく指定でき、「crontab」というファイルに記述・保存しておく。crond（cron daemon）というプロセスがcrontabの内容に従って、決められた日時にコマンドなどを実行してくれる。

cron設定することで、指定した日時にシェルスクリプト（shファイル）を実行してくれるみたいです。
cronの設定は、ロリポップのコンパネから可能です。
順番としては、シェルスクリプト（shファイル）を作成し、サーバーへアップロードした後にcronの設定をするという流れになります。

#そもそもシェルスクリプト（shファイル）とは

これも、よく知らないので引用します。

> シェルスクリプトとは、複数の処理をまとめて行う（バッチ処理）ときに使われる、OSのシェルが直接解釈・処理できるスクリプト。

要は、このような動作をしろよって記述したコードってことですね。

シェルスクリプトに動作内容を記述し、cron設定でシェルスクリプトに記述した動作をいつ実行するのかを指定しているということですね。

#shファイルの作成＆設置

テキストエディタで<ins>文字コードを「UTF-8」に、改行を「LF」に設定</ins>して下記のコードを記述してください。
コード内にあるフルパスは `/home/users/・・・`から始まるパスになります。
ロリポップのコンパネのアカウント情報に記載してあります。
コード内にあるMTディレクトリは、MTのファイルをアップロードしたディレクトリ名になります。

~~~sh
#!/bin/sh

cd /フルパス/MTディレクトリ/
/usr/bin/perl ./tools/run-periodic-tasks

exit
~~~

ファイル名は任意で指定可能で、拡張子をshとしてファイルを保存してください。
仮にmtというファイル名にする場合は「mt.sh」となります。
このファイルをサーバーの任意の場所へアップロードし、ロリポップのコンパネからcron設定をするときにmt.shを設置したパスを記述します。
mt.shファイルのパーミッションを `700` に変更してください。

cron設定は「[cron設定 - ロリポップ](https://lolipop.jp/manual/user/cron/)」をご覧ください。
flycheckを特定のモードでだけ有効にする


## 背景と課題

Emacsのシンタックスチェックツールである`flycheck`は、[デフォルトで多くの言語に対応](http://www.flycheck.org/manual/latest/Supported-languages.html#Supported-languages)していますが、[Very quick start](http://www.flycheck.org/)や[Quickstart](http://www.flycheck.org/manual/latest/Quickstart.html#Quickstart)に書かれている以下のような有効化の方法では（当たり前ですが）対応する多くの言語で`flycheck`が有効になります。

この場合、`flycheck`によるシンタックスチェックが不要な言語では、いちいち無効化する必要がありました。

### Very quick startに書かれている有効化の方法

```lisp:init.el
(global-flycheck-mode)
```

### Quickstartに書かれている有効化の方法

```lisp:init.el
(add-hook 'after-init-hook #'global-flycheck-mode)
```


## 解決法

有効にしたい言語のモードが提供するフック(hook)に対して`flycheck-mode`を引っかけて呼んであげれば良いでしょう。

例えば、`js2-jsx-mode`[^1]では`init.el`等に以下のように書きます。

```lisp:init.el
;; .jsx のファイルで js2-jsx-mode を使う
(add-to-list 'auto-mode-alist '("\\.jsx$" . js2-jsx-mode))
;; js2-jsx-mode を使う時には flycheck-mode も使う
(add-hook 'js2-jsx-mode-hook #'flycheck-mode)
```

## 現在のバッファで有効/無効を確認する方法

ちなみに、いま開いているバッファで`flycheck`が有効化されているかどうか、何のチェックツールでシンタックスチェックしているか、この2つを`M-x flycheck-verify-setup`を実行すると確認できます。

![flycheck-verify-setup for init.el](https://qiita-image-store.s3.amazonaws.com/0/6368/f3a38736-3a23-2584-9fe9-28ccc0225815.png "screenshot of flycheck-verify-setup")

`M-x flycheck-verify-setup`を実行すると、上図のように結果がバッファに表示され、`Flycheck Mode is (enabled | disabled)`で現モードでの`flycheck`状態（有効or無効）と、シンタックスチェックに利用されるチェッカーが表示されます。
チェッカーの状態は、`predicate`が`t`であれば利用可能、`predicate`が`nil`または`executable`が`Not found`であれば利用不可です。

上手く設定できたかどうか確認するのに使ってみてください。

以上です。役に立ちそうでしたら「ストック」してもらえると嬉しいです。
それでは良いEmacsライフをお過ごしください。

[^1]: 私がJS(ES2015)でコードを書く時に使っているモード
Windows7でGit Bashのホームディレクトリと作業ディレクトリを変更する

Windows7にGitを導入した時のメモです。

私の環境

- Windows 7 Professional SP1　64bit
- Git for Windows 2.7.2　64bit（ダウンロード元：https://git-for-windows.github.io/ ）
- Gitのインストールにはインストーラ（Git-2.7.2-64-bit.exe）を使用。

# 目的
Gitの設定ファイル（.gitconfig）やSSH鍵（.ssh）は、ホームディレクトリに保存されます。
Git Bash起動時の作業ディレクトリもデフォルトではホームディレクトリです。
Windows7では通常、ホームディレクトリは「C:\Users\ユーザ名\」です。
でも、このディレクトリの直下にごちゃごちゃファイルを置かれるのはちと気持ち悪い。
そこで、これらのディレクトリを自分好みのものに変更しよう、というのがこの記事の目的です。

# 方法
## 概要
ホームディレクトリの変更は、環境変数HOMEの値を書き換えることで行います。
しかし、コントロールパネル等から環境変数を書き換えてしまうと、他のアプリケーションの動作に悪影響する可能性があります。
そこで、Windowsのコマンドプロンプト（cmd.exe）のsetコマンドを用いて、Git Bashを使用するときにのみ環境変数HOMEを書き換えるようにします。

## 条件
アプリケーションは次のディレクトリにインストールされているとします。

- Git　C:\Program files\Git\
- コマンドプロンプト　C:\Windows\System32\

ホームディレクトリと作業ディレクトリは、次のように変更するとします。

- ホームディレクトリ　D:\GitSettings\
- Git Bash起動時の作業ディレクトリ　D:\Projects\

※上記は例なので、各々の環境に合わせて適宜読み替えてください。

## 手順
1. スタートメニュー→すべてのプログラム→Git→Git Bash と辿り、Git Bashを右クリックします。
2. 現れるコンテキストメニューから「プロパティ」をクリックします。
3. ダイアログ「Git Bashのプロパティ」が開きます。
4. ダイアログの「ショートカット」タブを開きます。
5. 「リンク先(T)」欄を「C:\Windows\System32\cmd.exe /c "set HOME=D:\GitSettings&"C:\Program Files\Git\bin\sh.exe" --login -i"」とします。
6. 「作業フォルダー(S)」欄を「D:\Projects」とします。
7. ［適用(A)］ボタン、［OK］ボタンを押し、ダイアログを閉じます。
8. 設定完了です。

これで、スタートメニューからGit Bashを起動する限り、設定ファイルはD:\GitSettings\に保存され、Git Bash起動時の作業ディレクトリはD:\Projects\になります。


いちいちスタートメニューを辿るのが面倒という方は、上記設定をした**後に**、
1. スタートメニューのGit Bashを右クリック
2. コンテキストメニューから「タスクバーに表示する(K)」を選択
して、タスクバーにショートカットを置いてもよいでしょう。
（※タスクバーにショートカットを置いてから上記の設定をしても、設定は引き継がれません）

# 参考文献
[Yamamoto's Laboratoryの「バージョン管理(git)」の記事](http://www.yamamo10.jp/yamamoto/comp/git/)中の「Git Bash の設定」の項を参考にしました。
log4jsでメール送信する設定 

# 概要
- nodejs/Express/node-configと一緒に、log4jsでメールを送信する設定です。

# 方法
- smtp appenderを使います。詳細はこちら→(https://github.com/nomiddlename/log4js-node/wiki/SMTP)

# 事前準備
以下をnpm installしておきます。
- expressjs
- node-config
- log4js
- nodemailer

# サンプル
- node-configのconfig.jsonのサンプルです。

```
  "log4js": {
    "appenders": [{
      "category": "access",
      "type": "dateFile",
      "filename": "./reports/logs/access.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {
      "category": "system",
      "type": "dateFile",
      "filename": "./reports/logs/system.log",
      "pattern": "-yyyy-MM-dd",
      "backups": 3
    },
    {
      "category": "mailer",
      "type": "smtp",
      "recipients": "logfilerecipient@logging.com",
      "sendInterval": 5,
      "transport": "SMTP",
      "SMTP": {
        "host": "smtp.gmail.com",
        "secureConnection": true,
        "port": 465,
        "proxy": "proxy.hogehoge.co.jp",    // プロキシがあればここに設定
        "auth": {
          "user": "****@gmail.com",  // user
          "pass": "**********"       // パスワード
        },
        "debug": true
      }
    },
    {"type": "console"}],
    "levels": {
      "access": "WARN",
      "system": "DEBUG",
      "mailer": "warn"
    }
  },

```

- logger.jsのサンプルです。

```
var log4js = require('log4js');
var config = require('config');

log4js.configure(config.log4js);

module.exports = { 
    access: log4js.getLogger('access'),
    system: log4js.getLogger('system'),
    mailer: log4js.getLogger('mailer'),
    express: log4js.connectLogger(log4js.getLogger('access'), {level: log4js.levels.INFO})
};

```

- 実際のコード中での呼び出し方です。

```
var logger = require('logger.js');
logger.mailer.warn('test warn mail');
logger.mailer.error('test error mail');
```

メール本文に以下のように出力されます。メールタイトルは「test warn mail」などになります。

```
[2016-03-09 15:30:04.571] [WARN] mailer - test warn mail
[2016-03-09 15:30:04.587] [ERROR] mailer - test error mail
```

以上です。
Proc.new を使ってブロック引数をリレーする

# 問題

このようなクラスがあります。

```rb
class DioRejectSomething
  def self.perform(something)
    new(something).perform
  end

  def initialize(something)
    @something = something
  end

  def perform
    puts("おれは#{@something}をやめるぞ！")
    puts("おれは#{@something}を超越するッ！")
  end
end
```

```rb
DioRejectSomething.perform('人間')
```

を実行すると、以下の 2 行のセリフが標準出力に表示されます。

```
おれは人間をやめるぞ！
おれは人間を超越するッ！
```

これはクラスメソッドを自身のインスタントメソッドに委譲する形で実装しています。

ところで、2 行のセリフの間に任意の処理を挟めるようにしたいです。これは

```rb
class DioRejectSomething
  def self.perform(something, &block)
    new(something).perform(&block)
  end

  ### 略 ###

  def perform
    puts("おれは#{@something}をやめるぞ！")
    yield
    puts("おれは#{@something}を超越するッ！")
  end
end
```

あるいは

```rb
class DioRejectSomething
  def self.perform(something, &block)
    new(something).perform(&block)
  end

  ### 略 ###

  def perform(&block)
    puts("おれは#{@something}をやめるぞ！")
    &block.call
    puts("おれは#{@something}を超越するッ！")
  end
end
```

と実装することで実現できます。

```rb
DioRejectSomething.perform('人間') { puts("ジョジョーーーーッ！！！") }
```
```
おれは人間をやめるぞ！
ジョジョーーーーッ！！！
おれは人間を超越するッ！
```

ブロックを `&block` という `&` 修飾した引数を利用してクラスメソッドからインスタントメソッドにリレーすることで実現しています。

では、前置きが長くなりましたがここで問題です。`&` 修飾した引数を一切使わずに同じことを実現するにはどうすればいいでしょうか？

# 解答

```rb
class DioRejectSomething
  def self.perform(something)
    new(something).perform(&Proc.new)
  end

  def initialize(something)
    @something = something
  end

  def perform
    puts("おれは#{@something}をやめるぞ！")
    yield
    puts("おれは#{@something}を超越するッ！")
  end
end
```

このように [Proc.new](http://docs.ruby-lang.org/ja/2.3.0/method/Proc/s/new.html) を利用することで実現できます。Proc.new をリファレンスマニュアルで調べると、

> ブロックを指定しなければ、このメソッドを呼び出したメソッドがブロックを伴うときに、それを Proc オブジェクトとして生成して返します。

と説明されています。これを使えばブロックの引数をわざわざ増やさなくてもさきほどの 2 つの実装例と同じことが実現できます。
GitBucket, Gitea, Gogs

## 比較

* GitBucket
    * イメージサイズ : 320MB
    * メモリ使用量 : 567.4MiB
* Gitea
    * イメージサイズ : 158MB
    * メモリ使用量 : 175.3MiB
* Gogs
    * イメージサイズ : 93.9MB
    * メモリ使用量 : 76.13MiB


## GitBucket 

```yml:docker-compose.yml
gitbucket:
  image: gitbucket/gitbucket
  ports:
    - 8080:8080
    # ssh
    - 29418:29418
  volumes:
    - ./data:/gitbucket
    - /etc/localtime:/etc/localtime:ro
```

* http://host:8080
* root : root

## Gitea

* https://docs.gitea.io/en-us/install-with-docker/
* Gogsより良い点
    * mermaid.js対応
    * 左右に並べて編集、フルスクリーン編集
    * 簡易プレビュー
    * クリップボードの画像を張り付け可能 (issueページ)

```yml:docker-compose.yml
gitea:
  image: gitea/gitea
  restart: always
  environment:
    - USER_UID=1000
    - USER_GID=1000
    - TZ=Japan
    - SSH_PORT=10022
  ports:
    - "3000:3000"
    - "10022:10022"
  volumes:
    - ./data:/data
```

メール送信設定

https://docs.gitea.io/en-us/install-with-docker/#installation


## Gogs

### docker-compose.yml

```yaml:docker-compose.yml
gogs:
  image: gogs/gogs:latest
  restart: always
  ports:
    - "3000:3000"
    - "22:22"
  volumes:
    - ./data:/data
```

### gogsのwikiで別ページにリンク

```
[somepage](wiki/somepage)
```

### リポジトリを削除、作成しwiki.gitをpushする手順

1. gogs上からリポジトリを削除
2. gogs上からリポジトリを作成
3. gogs上からwikiのページをひとまず作成
4. 端末から`git push -u origin master -f`

### Diff data too largeへの対策

* [Diff data too large · Issue #2051 · gogits/gogs](https://github.com/gogits/gogs/issues/2051)

* 0.9.13 までは問題なかったが、それ以降は`Diff data too large`と表示されdiffが表示されなくなった。

確認したところ `conf/app.ini` の設定項目が増えていた。

```diff:
- MAX_GIT_DIFF_LINE_CHARACTERS = 500
+ MAX_GIT_DIFF_LINE_CHARACTERS = 50000
```

表示されるようになった。
[Config Cheat Sheet - Gogs - Go Git Service](https://gogs.io/docs/advanced/configuration_cheat_sheet#git-(git))


### download

* [From binary - Gogs - Go Git Service](https://gogs.io/docs/installation/install_from_binary)
* [Config and run - Gogs - Go Git Service](https://gogs.io/docs/installation/configuration_and_run)

### 起動

```bash:
./gogs web
```

* 初期設定を行う。

### ユーザアカウント作成

* Register -> ユーザ名、メールアドレス、パスワードを入力
    * 確認メールは無いので,適当なメールアドレスで良い。
* 今後ログインに必要なので忘れないこと。

### dockerで動かす

* [gogs/gogs](https://hub.docker.com/r/gogs/gogs/)

```yaml:docker-compose.yml
gogs:
  image: gogs/gogs
  restart: always
  ports:
    - "3000:3000"
    - "2222:2222"
  volumes:
    - ./data:/data
```

* 設定ファイルは `data/gogs/conf/app.ini`

```diff:data/gogs/conf/app.ini
- SSH_PORT     = 22
+ SSH_PORT     = 2222
```

### リポジトリの移行

* リポジトリを新しいグループに転送する機能はリポジトリの移行(migrate)を用いる。
* URLは`http://localhost:3000/test.git`のように自身を指定可能

![スクリーンショット_2016-03-09_17-52-42.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d885c644-5190-ea82-aa3c-dcd99d410194.png)

### wikiの移行

* ディレクトリ内のwikiを手で移行が必要。
OkHttpでサーバー証明書のないサーバーにつなげるコードを書いてみた。

# 1.サーバー証明書の発行していないサーバーにhttpsでアクセスすると…
基本的に開発中の環境とかだったり、デバッグ環境とかだとサーバー証明書なんて発行してないことが多いと思います。
ところがどっこい、証明書がないところに対して「https://」使ってリクエストすると…

```
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException:
 Trust anchor for certification path not found.
```

信頼できるサーバー証明書のありかわからないから繋ぎたくないよ！
なんて感じで怒られてしまうわけです。

# 2.じゃあ対処法

繋ぎたくないよって言ってるだけなので、無くても強制的につながせればよいのです。

原理については検索ワード　「X509TrustManager」「HostnameVerifier」　あたりでググッてみてください。

```scala
　　　　@deprecated("サーバー証明書を確認せずにつなぐClient生成")
  def createIgnoreCertPathValidationClient(): OkHttpClient = {

　　　　　　　　//X.509 証明書の管理を空実装にする
    val tm: Array[TrustManager] = Array(
      new X509TrustManager {
        def getAcceptedIssuers: Array[X509Certificate] = Array.empty

        def checkClientTrusted(chain: Array[X509Certificate], authType: String): Unit = {}

        def checkServerTrusted(chain: Array[X509Certificate], authType: String): Unit = {}
      }
    )
    val context = SSLContext.getInstance("SSL")
    context.init(null, tm, null)

    val builder = new OkHttpClient.Builder().sslSocketFactory(context.getSocketFactory)
    builder.hostnameVerifier(new HostnameVerifier {
　　　　　　　　　　　　//どんなホスト名でもつないじゃうぜ！
      def verify(hostname: String, session: SSLSession): Boolean = true
    })
    builder.build()
  }
```

危なめの関数なので、用量用法には十分気をつけて使いましょう。
MAMPでタイムゾーンの変更がどうしても上手くいかない方へ

# 基本的な設定は先達のサイトをご覧ください
　この記事は「全部ネットや教本に書いてる通りにやっているのにタイムゾーンの変更だけできない！」という方を対象にしています。

# なぜタイムゾーンの変更ができないのか
　おそらくこの記事を読んでいる方のタイムゾーンは本来のMAMPの初期設定であるベルリンではなく、グリニッジ標準時になっているものと思われます。自分の設定がどうなっているかの確認方法は先達のサイトを参考にしてください。本来であればここで表示される時差は８時間なのですが、どうしても上手くいかない方の場合は９時間になっているはずです。そうでない方はおそらくこの記事で取り扱うこと以外に原因があります。

　date.timezone = “Asia/Tokyo”

　おそらくみなさんのphp.iniの該当箇所の記述はこうなっています。「何が間違っているんだ？」と思う方もいると思います。

　正解は「“　”」です。正しくは「"　"」です。

　ダブルミニュートがダブルクウオーテーションになっていると正しく認識されません。なぜこのような変化が起こるのかはわかりませんが、タイムゾーンの変更に困っている方は一度確認してください。
Ansible:鍵とユーザ名を明示的に指定してpingする


鍵とユーザ名を明示的に指定して ping する

```
$ ansible 192.168.x.x -i hosts --private-key=~/path/to/private-key -u user -m ping
```

実行結果が以下のように success になればOK

```
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}
```
html 要素の属性はclass属性を最初に書くと見やすい個人的に

タイトルで全部書けてしまった
単に好みの問題ですので、普段はなんとなく周りに合わせます。

組んでいくときにすごい右の方に見切れてると、探すのが大変なので、
一番よく変更するのだし、先頭に入れてます。

class属性2回書いちゃって、あれ～ってなった私がアレなだけです。
AWS Certificate Managerで無料のSSL証明書を発行する


2016/01/21 に AWS Certificate Managerが発表されました。
https://aws.amazon.com/jp/blogs/aws/new-aws-certificate-manager-deploy-ssltls-based-apps-on-aws/
ELBに無料のSSL証明書を設定したので、その手順をまとめておきます。

## 発行手順
マネジメントコンソールから「Certificate Manager」を選択。(現在はバージニアリージョンでのみ利用可能)

![AWS_マネジメントコンソール.png](https://bracket.qiita.com/files/bc9e5170-430a-cf13-ce6e-4f6a68bf5bbe.png "AWS_マネジメントコンソール.png")

「証明書のリクエスト」を選択し、証明書を発行するドメインを追加します。
ここで、ワイルドカード、複数ドメインを指定することができます。

![Banners_and_Alerts_と_AWS_Certificate_Manager.png](https://bracket.qiita.com/files/18716639-de91-72f9-f5cc-86459af7d67d.png "Banners_and_Alerts_と_AWS_Certificate_Manager.png")

「確認とリクエスト」 → 「確定とリクエスト」を選択すると、認証用のメールが送信される。

![Fwd__Certificate_approval_for_stores-staging_com_-_yokota_bracket_co_jp_-_Bracket_co_jp_メール.png](https://bracket.qiita.com/files/81f31330-f42d-75fa-2ff2-ab173851f10b.png "Fwd__Certificate_approval_for_stores-staging_com_-_yokota_bracket_co_jp_-_Bracket_co_jp_メール.png")

メールはwhoisでの管理者情報のメールアドレス
![2](https://bracket.qiita.com/files/3c55422f-c54a-3d60-1680-2adbc9c86ebe.png "2")

申請ドメインの管理者のメールアドレスに送信されます
![3.png](https://bracket.qiita.com/files/c50a7cb9-3a7f-91e6-008f-054a19fe58ad.png "3.png")



このメールから認証すると発行完了です。AWS Certificate Managerでの表示が「発行済み」になります。
![AWS_Certificate_Manager.png](https://bracket.qiita.com/files/b41fd355-b811-2666-d939-ba181f4a67c5.png "AWS_Certificate_Manager.png")



## 発行できる証明書
- 暗号化方式：RSA、鍵長2048ビット、SHA-256
- 認証レベル：ドメイン認証（DV）
- 料金：無料
- 有効期限：13ヶ月
- 失効60日前に自動更新。ELB. CloudFrontでの設定変更は不要
- マルチドメイン証明書、ワイルドカード証明書も作成可能

## どこで使えるのか
- CloudFront：全リージョンで利用可能
- ELB：バージニアリージョン(us-east-1)のみ
2016/03 現在

## できないこと
 - 秘密鍵の入手はできません証明書をダウンロードしてEC2インスタンスへの組み込みなどはできません。
 - 暗号化方式、認証レベルの変更
AWSのelasticsearch serviceに独自ドメインを設定する

フルマネージドのelasticsearch service、みなさん使ってますか？私は使ってます！
今回は表題の通り、elasticsearch serviceに独自ドメインを設定する方法を記します。

# elasticsearch serviceの起動
各自設定してください。
設定項目にあるドメイン名と、独自ドメインは同じである必要はないです。

# 独自ドメインを取得する
各自、独自ドメインを取得しておいてください。
Route53で扱えるようにしておいてください。

# Route53の設定
Route53を開き、該当する（elasticsearchで設定したい）domain Nameをクリックします。
画面が遷移すると、画面上部に「Create Record Set」が表示されるので、クリックします。

設定内容は以下。

~~~
Name: (elasticsearchに付けたいドメイン名)
Type: CNAME
Value: (elasticsearchのエンドポイント 例：search-◯◯-△△.ap-northeast-1.es.amazonaws.com)
~~~

「Save Record Set」をクリックして終了です。
※反映に時間がかかる場合があります(TTLの値を確認してください)。
kintoneのレコード詳細画面で何らかのアクションを起こすケース

# 何がしたいの？
Kintoneのレコード詳細画面上で、レコードの更新を伴う処理の実施。
単に、レコードを内容を閲覧したときに「見たよ！」くらいの処理をしたいだけなんですけどね・・・。

# どうやって実現する？

kintoneの中で画面や処理をカスタマイズする場合、javascriptで記述することになります。PHP?そんなものは使えない。
（サーバサイドで、ユーザが作った処理をさせたくないのかもしれません・・・。）

1. 任意の場所にsubmitボタンを置いて
2. 押されたときに処理を実施する

という、単純な内容にはなります。

# 大まかなコード記述

```js:大まかな記述内容
(function () {
    //詳細画面が呼び出された時に実施される
    kintone.events.on('app.record.detail.show', function(event){
        // ここに、ボタンを配置する処理とリスナーを記載する
        
        //　この関数の中に、ボタンを押した時の処理を記述する
        function callAction(){
                //処理を行った上で更新する。
        }
    });

})();
```

とまあ、大体こんな感じになる。
ここで問題になるのが、レコードの値を更新する `kintone.app.record.set`という処理が、動かないこと。

```js:こんな記述はダメ
 //　この関数の中に、ボタンを押した時の処理を記述する
    function callAction(){
	    //レコードを呼び出して更新しようとしているが、書き込みができない。
            var param = kintone.app.record.get();
            param['record'][’status']['value'] = ‘check';
            kintone.app.record.set(param);

        }
```

`callAction`は、`kintone.events.on`の中にあるので、動かないようですが・・・。なぜそうした。

レコード詳細情報取得（cybozu developers network）によると

https://cybozudev.zendesk.com/hc/ja/articles/201942014#step2



>kintone.events.on のインベントハンドラ内で kintone.app.record.set および kintone.mobile.app.record.set を実行することはできません。 上記のイベントハンドラ内ではレコードデータの取得は引数のeventオブジェクトを、レコードデータの更新はeventオブジェクトのreturnを使用してください

できないようだ。ボタンを押した時などに何らかの処理を行い、レコードを更新するなんてことは頻繁にありそうですが・・・。

# Javascript API を使う

実際に撮った方法は、こっちに近い。

https://cybozudev.zendesk.com/hc/ja/articles/200295019-レコード詳細画面でワンクリックで担当者に自分を追加するワザ

こんな感じの記述になります（gist)
https://gist.github.com/rojiuratech/0e748ca7934f3d0095e9
メモリ食い過ぎてたのは、mysqlの設定が原因だった

# ここまでの経緯

- 仮想マシン上のWordPressが落ちるのはメモリが足りないからだ
- httpdのプロセスが立ち上がりすぎてたので、極力増えないようにした
- 今度はMySQLがメモリを食い過ぎてた。多分犯人はこいつだ

# 仮想マシンの環境

ハードウェアやミドルウェアについて、
この件に関係ありそうなもの

- メモリ 1GByte(1024MByte）
- Webサーバ Apache/2.2.15 (Unix)
- MySQL 5.6.25

MySQL5.6系では、メモリ消費多すぎたので設定変更した。という
主旨の情報が多数。

# table_definition_cache　の設定を変更する

table_definition_cacheの設定変更だけで、以上なメモリ消費は治まった。

/etc/my.cnf　に以下の記述をする。

```bash:my.cnf
[mysqld]
table_definition_cache=400
```

そして再起動

`# servise mysqld restart`

## メモリ消費状況

メモリ消費量は一気に減った。

```bash:設定直後
# free
             total       used       free     shared    buffers     cached
Mem:       1020288     246544     773744         92       4744      58528
-/+ buffers/cache:     183272     837016
Swap:      2064380      12996    2051384

```

```bash:しばらくブラウザアクセスしてから
# free
             total       used       free     shared    buffers     cached
Mem:       1020288     693968     326320         92       8180      70088
-/+ buffers/cache:     615700     404588
Swap:      2064380      12844    2051536

```

# メモリ使用状況

ブラウザで何度かアクセスしたのちに、各プロセスを調べる。
MySQL による消費は減った。apacheでの消費は多いけど

```bash:mysqlによる消費
# ps aux | grep mysql
mysql     2304  0.1  9.4 782832 96536 pts/0
```

```bash:mysqlによる消費
# ps aux | grep mysql
root      2334  0.0  0.0 107456   940 pts/0    S+   14:21   0:00 grep mysql
```

```bash:Apacheのメモリ消費状況
# ps aux | grep httpd
root      1697  0.0  1.1 311536 11660 ?        Ss   13:14   0:00 /usr/sbin/httpd
apache    1699  0.0  3.1 334168 32488 ?        S    13:14   0:00 /usr/sbin/httpd
apache    1700  0.0  5.1 354824 52636 ?        S    13:14   0:00 /usr/sbin/httpd
apache    1701  0.0  5.1 354844 52660 ?        S    13:14   0:00 /usr/sbin/httpd
apache    1702  0.0  5.1 354824 52636 ?        S    13:14   0:00 /usr/sbin/httpd
apache    1703  0.0  5.8 371144 59416 ?        S    13:14   0:01 /usr/sbin/httpd
apache    2009  0.0  4.0 343816 41532 ?        S    13:15   0:00 /usr/sbin/httpd
apache    2012  0.0  5.1 354808 52604 ?        S    13:15   0:00 /usr/sbin/httpd
apache    2013  0.0  5.1 354808 52600 ?        S    13:15   0:00 /usr/sbin/httpd
apache    2014  0.0  5.1 354808 52600 ?        S    13:15   0:00 /usr/sbin/httpd
apache    2015  0.0  5.1 354808 52600 ?        S    13:15   0:00 /usr/sbin/httpd
root      2336  0.0  0.0 107456   940 pts/0    S+   14:29   0:00 grep httpd

```

# 参考
MySQLでtable_definition_cacheの値を変更する

http://blog.ybbo.net/2015/12/26/change-table_definition_cache-on-mysql/
Route53で設定した内容が全然反映されないときはTTLの値を確認しよう

表題の通りです。
ぜんっぜん、反映されない！！これちゃんと設定されてるのかな？？
と、疑心暗鬼になる前に、TTLを確認しましょう。

# TTLとは

TTL(time to leave)とは、DNSに対して、パケットをキャッシュとして保持する時間を設定するパラメータです。

# どこでTTLの値を確認するの？

Route53の各レコードの設定にあります。
300秒となっていたら、5分待ってみてください。
LocationRequestについて

# 背景

FusedLocationAPIを利用して位置情報を取得する際にはLocationRequestで取得方法の詳細を設定するが、
いまいち設定方法がわからなかったので調べたメモ。

# LocationRequest

原文

- https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest

PRIORITY_HIGH_ACCURACY

- 精度: 出来る限り高精度の位置情報を表示する
- 電力: かなり消費する
- 用途: リアルタイムで位置を表示するようなアプリケーションに適切
- interval例: 5秒

PRIORITY_NO_POWER

- 精度: 受動的. (自分からはリクエストしない)
- 電力: 限りなくゼロになるる
- 用途: 電力追加なしで、できるだけ高精度を得たい場合
- 可能なときだけ位置アップデートを受け取る事が可能
- アプリ側から位置のアップデートを位置の取得をトリガーすることは無い
- ただし他のアプリケーションからトリガーされた位置情報は受け取る

PRIORITY_BALANCED_POWER_ACCURACY

- 精度: ブロックレベルの精度で得たい場合
- 電力: バランスする
- 用途: できるだけインターバルで位置取得したい場合 & 端末の状態で省電力にしたい場合
- setFastestInterval(1分) / setInterval(60分) などと組み合わせると良い
- 省電力を考慮する際には setIntervalの値が利用される
- 素早く位置を得たい場合は setFastestIntervalが利用される

PRIORITY_LOW_POWER

- 精度: 都市レベル (10km)
- 電力: 省電力
- 用途: 大雑把な位置でよく、省電力を意識したい場合

その他

- あくまで参考にされる程度の情報なので、精度も指定したものより良かったり悪かったり、リクエストしたときより早かったり遅かったりはする
dockerでsudoできるユーザを追加するdockerfile


# useradd -G sudoを行う
    FROM ubuntu:15.10
    MAINTAINER kakkyz <kakkyz81@gmail.com>

    # install sudo
    RUN apt-get update && apt-get install -y sudo
    # add user
    RUN groupadd -g 1000 yyyyy && \
        useradd -g yyyyy -G sudo -m -s /bin/bash xxxxx && \
        echo 'xxxxx:password' | chpasswd

    USER xxxxx

## build
    $ docker build -t kakkyz81/tmp .

## run
    $ docker run -it kakkyz81/tmp
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.

    xxxxx@4171d3e97dd6:/$ cd ~
    xxxxx@4171d3e97dd6:~$ ls -la
    total 20
    drwxr-xr-x 2 xxxxx yyyyy 4096 Mar  9 07:41 .
    drwxr-xr-x 3 root  root  4096 Mar  9 07:41 ..
    -rw-r--r-- 1 xxxxx yyyyy  220 Aug 31  2015 .bash_logout
    -rw-r--r-- 1 xxxxx yyyyy 3771 Aug 31  2015 .bashrc
    -rw-r--r-- 1 xxxxx yyyyy  675 Aug 31  2015 .profile
    xxxxx@4171d3e97dd6:~$ sudo ls -la
    [sudo] password for xxxxx:
    total 20
    drwxr-xr-x 2 xxxxx yyyyy 4096 Mar  9 07:43 .
    drwxr-xr-x 4 root  root  4096 Mar  9 07:43 ..
    -rw-r--r-- 1 xxxxx yyyyy  220 Aug 31  2015 .bash_logout
    -rw-r--r-- 1 xxxxx yyyyy 3771 Aug 31  2015 .bashrc
    -rw-r--r-- 1 xxxxx yyyyy  675 Aug 31  2015 .profile
    -rw-r--r-- 1 xxxxx yyyyy    0 Mar  9 07:43 .sudo_as_admin_successful
    xxxxx@4171d3e97dd6:~$
10分で終わるRailsの開発環境構築


## 構築環境 

* ホスト（ローカルマシン）とゲスト（開発サーバ）の構成で構築する。
* CentOS 6.7 + rbenv（ruby 2.3.x）+ mysql（mariadb 10.1.x）+ Vim 7.4.x（LuaJIT）+ nodejs（npm）+ Nginx 1.8.x
* その他、 Vimプラグインマネージャーであるvim-plugとRuby on Railsで開発するために必要なVimプラグイン...

## Homebrew

* ホストはMacを使っている前提で設置することを推奨する。
* Macを使っていない場合は、次のrbenv、java（jre）、virtualbox、vagrantのパッケージを手動でダウンロードして設置する必要がある。

### brew

* 本体をインストールする。

```sh
% /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### brew cask

* brew tapで公式以外のリポジトリをFormulaとして追加することができる。
* brew caskはその一つでこれを使えばGUIのプログラムまでbrewで管理することができる。
* brewのFormulaで設置されている場合、削除する。

```sh
% brew uninstall --force brew-cask
% brew update
```

* brew caskを追加する。

```sh
% brew tap caskroom/cask
```

## rbenv + java + virtualbox + vagrant

* rbenvをインストールする。
  - 詳細は[Homebrewでrbenvを設置する。](http://qiita.com/park-jh/items/4b610cc0f6cc2b373bf2)を参考。

* javaをインストールする。

```sh
% brew cask install java
```

* virtualboxをインストールする。

```sh
% brew cask install virtualbox
```

* vagrantをインストールする。

```sh
% brew cask install vagrant
```

## chef

* サーバの状態をコードで記述し管理するフレームワーク
  - 詳細は[Chefを使ってより効率的にサーバを管理しよう。...](http://qiita.com/park-jh/items/9e2e358d2e82a7736cf7)を参考。 
* vagrantを起動する必要がある。
  - 詳細は[bentoから vagrantのboxを作る。](http://qiita.com/park-jh/items/bb89dd659ce9cab2ce0a)を参考。

### リポジトリを複製

```sh
% git clone https://github.com/devtopia/chef.git chef
```

### gemを設置

```sh
% bundle install --path vendor/bundle --jobs=4 --binstubs
```

### 外部クックブックをインストール

```sh
% bin/berks vendor cookbooks
```

### 開発環境の構築

```sh
% bin/knife solo bootstrap dev -E development
```

## Tip

### railsのすべてのバージョンを確認したい場合

```sh
$ gem query -ra -n ^rails$

*** REMOTE GEMS ***

rails (4.2.4, 4.2.3, 4.2.2, 4.2.1, 4.2.0, 4.1.13, 4.1.12, 4.1.11, 4.1.10, 4.1.9, 4.1.8, 4.1.7.1, 4.1.7, 4.1.6, 4.1.5, 4.1.4, 4.1.3, 4.1.2, 4.1.1, 4.1.0, 4.0.13, 4.0.12, 4.0.11.1, 4.0.11, 4.0.10, 4.0.9, 4.0.8, 4.0.7, 4.0.6, 4.0.5, 4.0.4, 4.0.3, 4.0.2, 4.0.1, 4.0.0, 3.2.22, 3.2.21, 3.2.20, 3.2.19, 3.2.18, 3.2.17, 3.2.16, 3.2.15, 3.2.14, 3.2.13, 3.2.12, 3.2.11, 3.2.10, 3.2.9, 3.2.8, 3.2.7, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.12, 3.1.11, 3.1.10, 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.20, 3.0.19, 3.0.18, 3.0.17, 3.0.16, 3.0.15, 3.0.14, 3.0.13, 3.0.12, 3.0.11, 3.0.10, 3.0.9, 3.0.8, 3.0.7, 3.0.6, 3.0.5, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 2.3.18, 2.3.17, 2.3.16, 2.3.15, 2.3.14, 2.3.12, 2.3.11, 2.3.10, 2.3.9, 2.3.8, 2.3.7, 2.3.6, 2.3.5, 2.3.4, 2.3.3, 2.3.2, 2.2.3, 2.2.2, 2.1.2, 2.1.1, 2.1.0, 2.0.5, 2.0.4, 2.0.2, 2.0.1, 2.0.0, 1.2.6, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0, 1.1.6, 1.1.5, 1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.0, 0.14.4, 0.14.3, 0.14.2, 0.14.1, 0.13.1, 0.13.0, 0.12.1, 0.12.0, 0.11.1, 0.11.0, 0.10.1, 0.10.0, 0.9.5, 0.9.4.1, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.5, 0.8.0)
```
pyramid で zipimporter エラー

# pserve 実行したら下記の zipimpoter ほげほげエラーがでるとき

```
TypeError: zipimporter.get_filename() takes exactly 1 argument (0 given)
```

venusian は zipped egg に対応してないので、setup.py に zip_safe = False を追記する。

参考：
- https://github.com/Pylons/venusian/issues/19#issuecomment-16299063
- http://stackoverflow.com/questions/26886149/why-does-pyramid-give-exception-of-zipimporter-get-filename

enjoy python with pyramid life.
Mac で Office365 Outlookのスケジュールを Calendar に同期する


スケジューラーはOutlook。最近随分よくなったけど、でもまだMac版Outlook重い。
そんなあなたに使いかっての良い CalendarアプリでOutlookのスケジュールを確認する方法をお届け。


![Screen Shot 2016-03-09 at 16.04.06.png](https://qiita-image-store.s3.amazonaws.com/0/74328/62f6f55a-fa58-8741-bc4b-0ee638453ca4.png)
かるくていいわ〜




## アプリケーションパスワードを発行する

2段階認証を有効にしている場合のみ必要です。

https://account.activedirectory.windowsazure.com/AppPasswords.aspx

↑ここからCalendar用アプリケーションパスワードを発行しておきます。


## CalendarにOutlook用アカウントを登録する

+ Calendarを立ち上げ、メニューを操作してAccountsダイアログを表示

```
Global menu > Calendar > Preferences
````

![Screen Shot 2016-03-09 at 15.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/74328/2b5a0a83-a67a-c6b9-8873-72e774d99367.png)





+ 左下の「+」をクリックしてExchangeを追加

+ office365のユーザーIDとパスワードを入力
※2段階認証を有効にしている場合にはoffice365のパスワードの代わりにアプリケーションパスワードを入力


Good Luck!
gitのリポジトリからnpm installする

# publicリポジトリ

例：github

```:package.json
{
  "private": true,
  "dependencies": {
    "mylib" : "git://github.com/{organization}/{projectname}.git"
  }
}
```

# privateリポジトリ（鍵認証）

例：bitbucket

* デプロイ鍵を事前に登録しておく

```:package.json
{
  "private": true,
  "dependencies": {
    "mylib" : "git://git@bitbucket.org:{organization}/{projectname}.git"
  }
}
```
Zabbixでアイテムの状態がNot supported, Unknown などになったときに、通知をもらえるようにする。

# 概要

値がとれなくなると、Not Supported になるのだけど、こうなったときに
通知がないので、正常なのか、値がとれないのかがわからない

# 結論

Configuration -> Action

ここで

Event source を Internal にする。

* [3 Receiving notification on unsupported items [Zabbix Documentation 2.2]](https://www.zabbix.com/documentation/2.2/manual/config/notifications/unsupported_item)

# 現状

以下のケースを通知している

* not supported 
* low level discovery rule in "not supported"
* unknown

![Screenshot from 2016-03-09 15-59-53.png](https://qiita-image-store.s3.amazonaws.com/0/82011/299183d3-f087-b470-9dd1-025344c0e99a.png)
[Laravel]デプロイ時の最適化

# Laravelの最適化
Laravelのプロジェクトをデプロイする際にやっておいたほうがいい最適化。
至らない点もあるかと思いますので、
参考程度でご覧ください。

> 参考サイト様
> [Laravel を高速化というか最適化する](http://localdisk.hatenablog.com/entry/2015/12/05/202228)

- 最適化のコマンド実行見本

	```
	// ソースコードの配置
	.
	.
	.
	// ソースコードの配置完了後
	
	// composer.lockの内容でパッケージのインストール
	composer install
	// configディレクトリ以下の設定ファイルをキャッシュ
	php artisan config:cache
	// ルーティング定義をキャッシュ
	php artisan route:cache
	```
	
各種コマンドの説明は以下を参照

## composer install
- composer.lockにもとづいてパッケージをインストールする
- インストール後は以下を行っている
	- composer dump-autoload
	- php artisan clear-compiled
	- php artisan optimize

## composer dump-autoload
- autoloadを自動で生成してくれる
	- `autoload_classmap.php`
	- `autoload_files.php`
	- `autoload_namespaces.php`
	- `autoload_psr4.php`
	- `autoload_real.php`
- 新たなクラス定義やファイル定義を行うたびに実行する
- composer installでパッケージインストールと同時に実行される

## artisan clear-compiled
- 以下2つのファイルを削除する
	- `/bootstrap/cache/services.json`
	- `/bootstrap/cache/compiled.php`

## artisan optimize
- composer dump-autoload --optimize の実行
- フレームワークのコードを結合して一つのファイルに纏める
	- `/bootstrap/cache/compiled.php`
	- `/config/compile.php` の files ブロックににキャッシュ対象のクラスを書けば一緒に結合される

> Laravel5.5のアップグレードガイドより
[![Screenshot from Gyazo](https://gyazo.com/6450f7127848108ab01546675c157126/raw)](https://gyazo.com/6450f7127848108ab01546675c157126)

※いずれ `optimize` は削除されるようなので要注意

## artisan config:cache
- 設定ファイルをキャッシュする
- config　以下の設定ファイルを「var_export」して以下ファイルに出力
	- /bootstrap/cache/config.php

## artisan route:cache
- ルーティング定義をbase64_encodeで以下ファイルに出力
	- `/bootstrap/cache/routes.php`
- **注意点**：クロージャ定義のルーティングがあると、最適化されずエラーになる
	- `/bootstrap/cache/routes.php`　が作成されず通常のルーティングアクセス
	- アクセスできなくなるわけではない

## artisan view:clear
- Bladeのキャッシュを削除する
    - `/storage/framework/views` の中のファイルたち
パラメーターに応じて表示するページを変更する


たとえば以下のようなパラメーターがついていた場合
- 登録成功：`http://...html?result=success`
- 登録失敗（期間外）：`http://...html?result=failed&error=not_in_term`
- 登録失敗（登録済み）：`http://...html?result=failed&error=has_registered`


```javascript:javascript
'use strict';

(function(){

// パラメーター取得
var param = window.location.search.substring(1,window.location.search.length);

// successが含まれていた、もしくは空の場合
if ( param.match(/success/) || param == '' ) {
	// そのページを表示
	$('.wrapper').css('opacity', '1');
}

// failedが含まれていた場合
if ( param.match(/failed/) ) {
	var paramAry = param.split('&');

	// 存在すれば2, しなけば-1
	var not_in_term = paramAry.indexOf('error=not_in_term'); // 期間外
	var has_registered = paramAry.indexOf('error=has_registered'); // 登録済み

	if ( not_in_term > 0 ) {
		window.location.href = 'error_not_in_term.html';
	} else if ( has_registered > 0 ) {
		window.location.href = 'error_has_registered.html';
	}
}


})();
```