OmniAICreator/Qiita-1.07M huggingface dataset:
iOSのGoogleMapでマーカーをドラッグできる機能を実装する


textFieldに入力された住所やキーワードを元にして、地図の初期表示の位置を決定し、その後にマーカーの微調整ができるmapを実装します。 
view周りの実装は省略しています。

## 環境
* iOS7以降を想定
* GoogleMapsを使用


## 実装方法
#### mapの初期表示をviewDidLoadで設定する
```objectivec:viewDidLoad
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>

- (void)viewDidLoad {
	[super viewDidLoad];
	_mapView.delegate = self; // .hにもdelegateの実装をする宣言を忘れないようにする
	_hogeTextView.delegate = self;

	// mapの初期表示をとりあえず東京駅にする
	GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:35.681382
                                                            longitude:139.766084
                                                                 zoom:17];
    _mapView.camera = camera;
}
```

#### textFieldが編集完了したタイミングでgeocoderを使って緯度経度を取得する
```objectivec:viewDidLoad
- (void)textFieldDidEndEditing:(UITextField *)textField
{
	CLGeocoder *geocoder = [CLGeocoder new];
    [geocoder geocodeAddressString:textField.text
                 completionHandler:^(NSArray *placemarks, NSError *error) {
                     CLPlacemark *placeMark = [placemarks objectAtIndex:0];
                     CLLocationCoordinate2D coord = placeMark.location.coordinate;
                     
						_latitude = placeMark.location.latitude;
						_longitude = placeMark.location.longitude;
                     [self createMarkerFromLocation:coord.latitude
                                          longitude:coord.longitude];
                 }];
}

// 指定した緯度経度にマーカーを作成するメソッド
- (void)createMarkerFromLocation:(float)latitude
                       longitude:(float)longitude
{
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:latitude
                                                            longitude:longitude
                                                                 zoom:17];
    _mapView.camera = camera;
    
    // マーカーを初期化してから作成
	// 初期化しないとどんどんmarkerが増えていく
    marker.map = nil;
    marker = [[GMSMarker alloc] init];
    marker.position = camera.target;
    marker.appearAnimation = kGMSMarkerAnimationPop;
    marker.map = _mapView;
}
```

#### マーカーをドラッグした後の処理
```objectivec:didEndDraggingMarker
// ドラッグし終わったタイミングで呼ばれるdelegateメソッド
- (void)mapView:(GMSMapView *)mapView didEndDraggingMarker:(GMSMarker *)marker
{
	// マーカーを移動した位置の緯度経度を取得
	_latitude = marker.position.latitude;
	_longitude = marker.position.longitude;

	// マーカーを移動した地点を地図の中心にする
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:_latitude
                                                            longitude:_longitude
                                                                 zoom:_mapView.camera.zoom];
    _mapView.camera = camera;
}
```

### リンク
[Google Maps SDK for iOSの公式ドキュメント](https://developers.google.com/maps/documentation/ios/reference/index)
[GMS関連のdelegate一覧](https://developers.google.com/maps/documentation/ios/reference/protocol_g_m_s_map_view_delegate-p)
Zabbixのログ監視にて、指定時間内に複数回検知した場合

Zabbixのログ監視にて、規定秒数内に特定文字列が発生した場合
↓のURLにて、countで確認すれば良い、とあるが
いざ実際に試した所、はまってしまった箇所があった為のメモ
http://www.zabbix.jp/node/1904


<br>
####条件####
「**/var/log/messages**」の中で文字列"**error**"を**10分間で5回以上検知**した場合にイベント発生

上記URLには以下のように記述されている
`{Template OS Linux:log[/var/log/messages,,,,skip].count(600,"error")}>4 and {Template OS Linux:log[/var/log/messages,,,,skip].nodata(30)}=0`


実際に使っているのは以下
`{Template OS Linux:log[/var/log/messages,,,,skip].str(error)}=1 and {Template OS Linux:log[/var/log/messages,,,,skip].count(600,"error")}>4 and {Template OS Linux:log[/var/log/messages,,,,skip].nodata(30)}=0`


<br>
####理由####
URLを参照した条件のみだと10分間で5回以上検知した場合にアラートが発生してしまう為、5回以上検知した後に別のログが追記されても関係無いログをアラートとして検知してしまう。

その為、下の条件式には"error"文字列を検知した場合の条件を追加した。
些細な事だった為、1日経って気付いたのでメモ。
Google Speech APIをRubyから使う

# githubにソースあり
https://github.com/github0013/google_speech_v2

## やっていること
1. 指定秒数間の音声をマイクから拾ってwavにする
2. wavをflacにする
3. APIを使いGoogleに問い合わせる
4. 結果が返ってくる
5. 結果から最適であろう音声認識テキストをブロックへ返す

## 事前事項
1. ruby2である事
2. `arecord`  `flac` コマンドがあること  
   元々 Raspberry Piで使うために作ったので、OSXでは`arecord`が無いので使えません  
   代わりに`sox`を使えば出来そうですが、確認していません
3. SpeechAPIを使うために、まず https://console.developers.google.com でプロジェクトを作る
4. Speech APIを有効にする
   1. デフォルトではこのAPIは表示されないのでhttp://www.chromium.org/developers/how-tos/api-keys を読む
   2. chromium-devグループに[参加する](https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-dev) とSpeech APIが使えるようになるので、メール受信なしでいいので参加する
   3. google developer コンソールに戻ってSpeechAPIを有効にする
5. ブラウザキーを作る
   1. 認証情報リンク
   2. 認証情報を追加
   3. APIキーを選択
   4. ブラウザキーを選択
   5. キーが発行

# 注意事項
## API
* このAPIは実験段階のようで、1日のアクセス制限は50回程度のよう
* 1回の音声変換は10-15秒が最長のよう

## gem
`#speech_to_text`は音声が届いている間をテキストにするのでは無く、指定秒数の音声のみを拾います。
`#speech_to_text`は指定秒数間程度、完全にスレッドが同期ブロックされます。非同期にしたいなら、別スレッドを作ってその中で実行するなどの工夫が必要です。
外部プラグインなしで簡単にリッチテキストエディタを実装

いわゆるwysiywgですね。
html5のcontentEditableというものを使うと簡単にできます。
こんな感じです。

```lang:
<button type='button' onclick='return bold()'>太字</button>
<button type='button' onclick='return underline()'>下線</button>

<div contentEditable='true' style='width:200px; height:100px; border:solid 1px #ddd'></div>

<script>
  function bold() {
    document.execCommand('bold', false);
  }
  function underline() {
    document.execCommand('underline', false);
  }
</script>
```

そのほかにも色をつける、リンクを作成、画像挿入などもでき、一般的なリッチテキストエディタの機能は実装可能です。
activesupport のｔｒｙメソッドは便利！

よくあるviewのエラーで関連テーブルのレコードが削除されちゃって

```ruby
@hoge.user.name
```

の箇所で例外吐くので

`NoMethodError: undefined method `name' for nil:NilClass`

なんてなったりします。

今までは

```ruby
@hoge.user.name unless @hoge.user.blank?
```

とか

```rust
@hoge.user.blank? ? "不明" : @hoge.user.name
```

とかで対応していたが、最近tryメソッドの存在を知った。
tryを使うと以下のように書ける

```rb
@hoge.user.try(:name)
```

とか

```rb
@hoge.user.try(:name) || "不明"
```

なんて書けて便利！
【JS】YouTubeのiframe埋め込み動画をJSでコントロール


YouTubeの埋め込みコードで動画をWebサイトに埋め込むことが出来ますが、再生や停止をJSでコントロールしたい場合があり、調べてみました。

ちなみにYouTubeはie8のサポートはもうしていないみたいです。ie8でYouTubeにアクセスすると以下のような画面になります。

![スクリーンショット 2015-09-01 10.22.54.png](https://qiita-image-store.s3.amazonaws.com/0/48677/b3b11319-f95e-9459-b865-1c3f503d7a25.png "スクリーンショット 2015-09-01 10.22.54.png")


## 実装
### <a href="http://codepen.io/konweb/full/epYNbj" target="_brank">Sample Page</a>

### HTML
HTMLでポイントなのは、iframeのsrcにenablejsapi=1というパラメーターを付加することです。
enablejsapiに1を設定することでプレーヤー<a href="https://developers.google.com/youtube/player_parameters?hl=ja" target="_brank">JavaScript API</a>が有効になります。

その他のパラメーターはこちらを参照 → <a href="https://developers.google.com/youtube/player_parameters?hl=ja#Parameters">YouTube IFrame API Parameters</a>

```index.html
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  <title>Document</title>
</head>
<body>
  <iframe class="video" id="popup-YouTube-player" width="560" height="315" src="https://www.YouTube.com/embed/13S9kfvkchA?enablejsapi=1" frameborder="0" allowfullscreen></iframe>
  <button id="play">play</button>
  <button id="pause">pause</button>
  <button id="stop">stop</button>
  <button id="clear">clear</button>
</body>
</html>
```

### JS(jQuery)
JSでは、iframeのwindowにpostMessageでイベントを渡してあげるだけです。
これだけで、再生、停止、ストップをコントロールすることができます。
クリアはなんか上手くいかなかった。。

<a href="https://developers.google.com/youtube/js_api_reference?hl=ja#playVideo" target="_brank">YouTube IFrame API 再生の制御</a>

```script.js
$(function(){
  $("#play").on("click", function(){
　　videoControl("playVideo"); 
  });
  
  $("#pause").on("click", function(){
    videoControl("pauseVideo");
  });
  
  $("#stop").on("click", function(){
    videoControl("stopVideo");
  });
  
  $("#clear").on("click", function(){
    videoControl("clearVideo");
  });
  
  function videoControl(action){ 
    var $playerWindow = $('#popup-YouTube-player')[0].contentWindow;
    $playerWindow.postMessage('{"event":"command","func":"'+action+'","args":""}', '*');
  }
});
```

### postMessageの参考
- <a href="http://caniuse.com/#search=postMessage" target="_brank">Can I use postMessage</a>
- <a href="https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage" target="_brank">window.postMessage</a>
- <a href="http://the-zombis.sakura.ne.jp/wp/blog/2013/10/15/post-2031/" target="_brank">PostMessageを使ったクロスドメイン通信によるメッセージの送受信を試してみた！</a>
- <a href="http://qiita.com/yasumodev/items/d339a875b4b9bf65d156" target="_brank">postMessage｜JavaScriptでクロスドメインメッセージ通信</a>
DatadogのProcess Checkを使う際の注意点


Datadogが提供するProcess Checkは非常に強力です、サーバー内で動作しているProcessの状況をメトリクスとして集めてくれるます。しかしながら、yamlを設定する際に注意して欲しい点があります。

まず、サンプルyamlのオプションの部分を見てください。

```
#  - name: (required) STRING. It will be used to uniquely identify your metrics as they will be tagged with this name
#    search_string: (required) LIST OF STRINGS. If one of the elements in the list matches,
#                    return the counter of all the processes that contain the string
#    exact_match: (optional) Boolean. Default to True, if you want to look for an arbitrary
#                 string, use exact_match: False
#    cpu_check_interval: (optional) CPU percent check interval: 0.1 - 1.0 sec.
#    ignore_denied_access: (optional) Boolean. Default to True, when getting the number of files descriptors, dd-agent user might
#    get a denied access. Set this to true to not issue a warning if that happens.
#    thresholds: (optional) Two ranges: critical and warning
#         warning: (optional) List of two values: If the number of processes found is below the first value or
#                  above the second one, the process check will return WARNING.
#         critical: (optional) List of two values: If the number of processes found is below the first value or
#                   above the second one, the process check will return CRITICAL.
#     In this example, process check will return OK for 3 to 5 process. WARNING for 1, 2, 6, 7 processes and Critical below 1 or above 7.
#     CRITICAL is always dominant in case of overlapping.
```

**この中の、 `exact_match` を`false`で記述しておくことをおすすめします。**

説明にも書かれていますが、このオプションが設定されていないと、`search_string`に記述した文字列に完全一致したprocessを抜き出してきます。`search_string`とその前後に文字列がある場合、それらのprocessは検索結果に含まれません。

Process checkを設定してみて、実際にprocessが実行されているのに検索している結果が`0`出ている場合は、yaml設定ファイルに`exact_match: False`を設定してみてください。

記述例:

```
  - name: postgres
    search_string: ['postgres']
    ignore_denied_access: True
    exact_match: False    
```


ドキュメントのアップデートが完了するまでは、Qiitaで対応させていただきます。
申し訳ありません。
Pythonで遊ぼう 入力フォームのテキストを受け取って保存・表示

Pythonにしろ何にしろ、とりあえず何か動くものを作らないと面白くないし続きません。さくらインターネットなど、PythonスクリプトがCGIで動作するレンタルサーバーで簡単な送信フォームを作ってみましょう。

```sendtext.cgi

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
from datetime import datetime
import cgi
import csv

print "Content-Type: text/html\n"


print """

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
"""

print """
</head>
<body>
"""

try:
    form = cgi.FieldStorage()
    words = form["word"].value
    words = unicode(words,"utf-8")
    today = datetime.now().strftime("%Y/%m/%d %H:%M:%S")

    f = open("date.txt", "ab")
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)
    writer.writerow([words,today])
    f.close()

    print "<p>"+ words + ": " + today + "</p>"

except (TypeError, KeyError):
    print "<p>"+u"入力項目にエラーがあります"+"</p>"

print """
</body>
</html>
"""

```

こんなイメージでPythonスクリプトを書きます。CGIで動かすことを前提にしているので拡張子は.cgiとしています。index.htmlから送られたフォームを受け取って、そこに送信した日時をくっつけて.txtにCSV形式で保存する簡単なスクリプトです。

HTMLファイルは、

```
<form method="POST" action="cgi-bin/index.cgi">
  <textarea name="word"></textarea>
  <p><input type="submit" value="送信"></p>
</form>
```

こういうイメージでOKでしょう。
IntelliJ IDEAでECMAScript 6を書きたい

ECMAScript 6のコードがうまくハイライトされなくてどうするんだろ、って思ってたらできた。

![](https://qiita-image-store.s3.amazonaws.com/0/5218/c3fd8a87-d93f-a01e-d36d-d7ecffa3c062.png)

ここでバージョンを選択できる。
さくらVPSでRuby on Rails

ど素人の私自身のためのメモです。

<h1>①さくらのVPS　サーバの初期設定ガイド</h1>
https://help.sakura.ad.jp/app/answers/detail/a_id/2429/session/L3RpbWUvMTQ0MTA3MDU1My9zaWQvdnBsVC1rdm0%3D

【補足】
<h2>ログイン</h2>
$ ssh root@160.16.122.124

<h2>鍵認証</h2>
<h3>VPSでの鍵の受け入れ</h3>
<b>$ mkdir ~/.ssh</b>
<b>$ chmod 700 ~/.ssh</b>

<h3>macでの鍵の作成・送信</h3>
<b>$ ssh-keygen -t rsa -v</b>
Overwrite (y/n)?　　【→　yと入力】
Enter passphrase (empty for no passphrase): 　　【→　EnterでOK】
Enter same passphrase again: 　　【→　EnterでOK】

<b>$ chmod 600 ~/.ssh/id_rsa.pub</b>
パーミッションを変える。

<b>$ scp ~/.ssh/id_rsa.pub ｛ユーザー名｝@｛IP｝:~/.ssh/authorized_keys</b>
<b>$ ssh -i ~/.ssh/id_rsa ｛ユーザー名｝＠｛IP｝</b>
鍵をサーバーに送る。

<h2>ファイヤーウォール</h2>
<b># vim /etc/sysconfig/iptables</b>
の中に記述。

<h3>iptablesの中に書くために参考になったサイト。</h3>
http://qiita.com/shimohiko/items/ec672655edb84578a82e
http://www.さくらvps.com/6.html
http://dotinstall.com/lessons/basic_sakura_vps/8010
http://qiita.com/chkk525@github/items/a62e73d0d57570614ed7


<h1>②Rubyなどをインストール</h1>
<h2>Gitを入れる</h2>
http://www.kakiro-web.com/memo/centos-git-server.html

<h2>Ruby/Ruby on Railsを入れる</h2>
http://qiita.com/murachi1208/items/f3f15b41d6651cc57368


<h1>③Railsアプリをつくる</h1>
rails newする。

<h2>turbolinksをオフにする</h2>
初心者には扱えない代物なので、さようなら。
http://qiita.com/kazz187/items/12737363d62b9c91993c

<h2>Mysql周りのトラブル</h2>

<h3>壊れた？</h3>
http://www.vpswordpress-admindocs.com/wp/trouble/mysql-04

<h3>socketがない</h3>
http://blog.dacelo.info/mysql/entry-9.html

<h3>Access denied for user</h3>
http://qiita.com/kazfoy/items/321fd8c97875de0a1c62

<h1>④Phusion Passengerを入れる</h1>
http://redmine.jp/tech_note/apache-passenger/

http://togattti.hateblo.jp/entry/2014/05/02/230439

CentOSの場合はここに記述。
$ sudo vim /etc/httpd/conf/httpd.conf

動いた！


<h1>⑤devise</h1>

deviseを
<b>$ rake db:migrate RAILS_ENV=production</b>
すると、
NameError: uninitialized constant Devise
が出る。

/xxx/config/initializers/devise.rb
に
require 'devise'
を追記。

もう一度
<b>$ rake db:migrate RAILS_ENV=production</b>

config.secret_key = 'cccbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
と出力されるので、

/xxx/config/initializers/devise.rb
に追記。

もう一度
<b>$ rake db:migrate RAILS_ENV=production</b>

できた！
4対3の相対画像

/* 4:3 の画像 */
.three-quarters {
	background-color: #f3f3f3;
	position:relative;
	width: 100%;
	height: auto;
	background-position:center center;
	background-size: cover;
	background-repeat: no-repeat;
}
.three-quarters:after {
	content: "";
	display: block;
	padding-top: 75%;
}
よく使うnpmコマンド


## セットアップ

### package.jsonを生成

```
npm init
```

### パッケージをまとめてインストール/アップデート

```
npm update
```

### パッケージをインストール

```
npm install hoge
```

### パッケージをアンインストール

```
npm remove hoge
```

## 確認

### インストール済みパッケージを一覧表示（依存パッケージは非表示）

```
npm ls --depth=0
```

### インストール済みパッケージを一覧表示（依存パッケージも含めて表示）

```
npm ls
```

### npmのバージョンを表示

```
npm -v
```

## 整理する

### 最新になっていないパッケージを一覧表示
```
npm outdated
```

### 未使用パッケージを削除

```
npm prune
```

## 操作する

### ローカルのバイナリを実行

```
`npm bin`/hoge
```

### テストを実行
※package.jsonのscriptsにテストコマンドを記述しておく

```
npm test
```

## 探す

### パッケージを検索

```
npm search hoge
```

### パッケージの詳細を表示

```
npm show hoge
```

## グローバル環境

### npm自体のアップデート

```
npm update -g npm
```

### -gオプションであれこれ

```
npm install -g hoge
npm remove -g hoge
npm ls -g
npm outdated -g
```
Python の yield from をつかって flatten する

`yield` はわかったのですが `yield from` ってなんだよということで調べて generator の評価をうけとる仕組みかなという理解になりました  
その理解で flatten 書いてみた  

```py3
def flatten(x):
    if hasattr(x, '__iter__') and not isinstance(x, str):
        for y in x:
            yield from flatten(y)
    else:
        yield x
```
この `yield from` を `yield` にすると 単に generator が返ってくるのでまあ理解あってるかなとなる  

```py3
In : ls = [1,2,3,[4,5],[6,[7,8,[9,10,11],12]]]

In : list(flatten(ls))
Out: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
```

つかいこなせるかというとよくわからない
scpコマンドでファイル送る、とってくる

#はじめに
・今回の状況
scpコマンドでサーバーBからサーバーAにファイルを送りたい。
↓
サーバーAからサーバーBにはsshできるがBからAにはsshできない。
↓
scpで送れない。。
↓
困った。。

#ファイルおくる
・サーバーBからサーバーAに送ろうとしたができなかった(sshの設定が必要)。

scpコマンドを使ってリモートのサーバーにファイルを送ります。


`scp　ファイル名　送信先のアドレス：ファイルを保存するディレクトリ`

#ファイルとってくる
・サーバーA上でサーバーBからとってくる。

scpコマンドを使ってリモートのサーバーからファイルをとってきます。

`scp　とってくるところのアドレス：ファイル名　ファイルを保存するディレクトリ`

#scpコマンドのその他の使い方

・scpコマンドのその他の使い方紹介。ちなみにファイルを送るほうのコマンドです。

##ユーザ名を指定してscp

・指定したユーザーの指定したディレクトリに送信します。

`scp　ファイル名　ユーザー名@コピー先ホスト：ファイルを保存するディレクトリ`

##ssh鍵を指定してscp

・ssh接続の際に使用する鍵を指定して送信します。

`scp　-i　秘密鍵ファイル　ファイル名　送信先のアドレス：ファイルを保存するディレクトリ`

##ssh configを指定してscp

・ssh接続の際にconfigファイルを指定して送信します。


`scp　ファイル名　-F　configファイル名(test_config)　ホスト名(test_host)：ファイルを保存するディレクトリ`


```lang:test_config
Host test_host
  User test_user
  IdentityFile "~/.ssh/test_rsa"
  HostName XX.XXX.XXX.XXX

```

##ディレクトリのコピー

・ファイルではなく、ディレクトリ全体を送信します。

`scp　-r　ディレクトリ名　送信先のアドレス：ファイルを保存するディレクトリ`

#おわり
送るではなく、とってくることで、無事置きたいサーバーにファイルおけました。
Google App Engine for Python & PHP入門

## 参考

* https://console.developers.google.com/project/projecthoge/start/appengine

![gae.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5d84103b-fb38-f2a1-41a8-41c1012ced37.png)

* [Uploading, Downloading, and Managing a Python App - Python — Google Cloud Platform](https://cloud.google.com/appengine/docs/python/tools/uploadinganapp)

## SDK for Pythonをダウンロード

* [Download the Google App Engine SDK - App Engine — Google Cloud Platform](https://cloud.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Python)

```bash:
unzip google_appengine_1.9.25.zip
mv google_appengine ~/bin/
```

* PATHを追加しておく

```bash:~/.bashrc
export PATH=$PATH:$HOME/bin/google_appengine
```

## ソース

```bash:
wget https://console.developers.google.com/project/プロジェクトID/start/appengine
unzip master.zip
cd appengine-try-python-bottle-master/
appcfg.py -A プロジェクトID update .
```

WEBブラウザが起動し「The authentication flow has completed.」と表示される。

* http://プロジェクトID.appspot.com/ にアクセスし

「Hello World!」と表示されれば成功。


## 修正反映方法

```diff:main.py
 def hello():
     """Return a friendly HTTP greeting."""
-    return 'Hello World!'
+    return 'こんにちは'
```

```bash:
appcfg.py -A プロジェクトID update .
```

「こんにちは」と表示されれば成功

---

# PHP

* PythonのSDKにPHPのSDKも含まれています。

```bash:
wget https://github.com/GoogleCloudPlatform/appengine-try-php/archive/master.zip
unzip master.zip
cd appengine-try-php-master
```

```bash:
appcfg.py -A プロジェクトID update .
```

「Hello World!」と表示されれば成功。

## 修正反映方法

```diff:helloworld.php
 <?php
-  echo 'Hello, world!';
+  echo 'こんにちはPHP';
```

```bash:
appcfg.py -A プロジェクトID update .
```

「こんにちは」と表示されれば成功

* `$_SERVER["REMOTE_ADDR"]` 変数とか普通に使えるのでアクセス制限できて便利そう

## ルーティングの追加

```diff:app.yaml
 handlers:
-- url: /.*
-   script: helloworld.php
+- url: /
+  script: index.php
+- url: /1
+  script: 1.php
```

こうしておくと、/にアクセスが来た時 index.php
/1 にアクセスが来た時1.phpが処理される。

----

# データの保存

* 参考: [Blog @vierjp : 30.Google App Engine for PHPにおけるポータビリティを考える](http://blog.vier.jp/2013/05/30google-app-engine-for-php.html)

## 準備: Bucketを作る

* ストレージ＞Cloud Storage＞ブラウザ
* Bucketを作成。一意の名前をつける。

## データの保存方法

```php:helloworld.php
define(BUCKET, "gs://mybucket");

# text/plain で保存
$options = [ "gs" => [ "Content-Type" => "text/plain" ]];
$ctx = stream_context_create($options);
file_put_contents(BUCKET."/hello.txt", "データ1", 0, $ctx);

# binaly/octet-stream で保存
$fp = fopen(BUCKET."/hello2.txt", "w");
fwrite($fp, "データ2");
fclose($fp);
```

バケットにデータが保存されたことを確認。

![スクリーンショット 2015-09-01 11.14.14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/999f4df1-3c98-b9b5-92c3-88a744f6eeca.png)
GCEとAWSの比較(2015/8末時点)

今までずっとAWSを使ってきましたが、高止まりしている価格とメンテナンスリブートの心配という点から、GCEも使い始めてみました。
r3.2xlarge (AWS) -> n1-highmem-8 (GCE) への移行で、性能的にはメモリが若干減少、IOPSはそこそこ向上でトータルではほぼ同じぐらいかなあという感じです。

**良かったところ**:

* コストが削減できた
* リザーブドインスタンスを事前購入しなくても自動的に割引になっていくのでキャッシュフローにやさしい
* Web UIの使い勝手が良い

**悪かったところ**:

* 運用をはじめて三日目、突然インスタンスがrebootした。レアイベントを引いたのかもしれないが、こんなことを心配しなければいけないのでは AWS の事前告知のあるメンテナンスリブートより悪い。
* Web UIの操作中突然開発環境のネットワークからインスタンスのネットワークへの通信が遮断され、アクセスできなくなった。外部環境からのアクセスは可能なので大きな被害にはならなかったが、いちいち踏み台を経由してアクセスしなくてはならなくなって不便極まりない。ファイアーウォールの設定とは別に通信を遮断する仕組みがあるようで、何がどうなってこういう状況になっているのか検討がつかない。
* 上記のようなトラブルに対するテクニカルサポートは有料で、それ込みで考えるとAWSのほうが安いかも。

Local SSDのパーマネント化など、将来への期待は大きいですが、現時点ではAWSにはないトラブルに遭遇するリスクは思ったより高く、手の届かない部分で発生するトラブルに対処するためにテクニカルサポート費用を払うことを考えるとどうなんだろうなあ、という感じですね。
[備忘録] WAPM-APG300Nの初期設定


### 備忘録ナレッジ
* 該当機種を触る機会があったので、ナレッジ化

* 該当機種
[Buffalo wapm-apg 300n](http://buffalo.jp/products/catalog/network/wapm-apg300n/)
![photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/25582/3d9056df-da76-d4ea-deb7-75c90c9234e6.jpeg)


### 初期化のやり方

* 蓋を開けて、RESETボタンを長押し

### 初期設定

* 初期IP
    * 192.168.11.100
    * [公式HP](http://buffalo.jp/php/lqa.php?id=BUF91)
    
* アクセス方法
    * 同一セグメントに入り、ブラウザからログイン
    * 初期ユーザ/パスワード
        * root/無し
Electronでコストを掛けず綺麗なアプリケーションをつくる


#**概要**

ElectronでReact+ES6あたりを実装したいが、自分で構成考えるのも二番煎じ感があるので、既にあるboilerplateでサクッといい感じのストラクチャをつくる。**ほぼ頭を使わずにまあまあ綺麗な設計でかく**というのを目標とした。

つくったものは、(会社で使っている何種類かの)<a href="http://blog.mmmcorp.co.jp/blog/2015/08/11/pull_request_format/" target="_blank">プルリクのテンプレート</a>をコピペできるという簡単なデモ。

* <a href="https://github.com/okmttdhr/pull-request-templates" target="_blank">okmttdhr/pull-request-templates</a>

以下な感じで選択、コピペが出来る。

![スクリーンショット 2015-08-31 22.23.28.png](https://qiita-image-store.s3.amazonaws.com/0/22875/4a5258ea-4ea5-a6d6-6639-4f4c58946b54.png)





#**electron-react-boilerplate**

いろいろ探した結果、↓のようないい感じのストラクチャの中で1番よさ気でstarも多いのが<a href="https://github.com/chentsulin/electron-react-boilerplate" target="_blank">chentsulin/electron-react-boilerplate</a>だった。

##**アプリケーション構成**

* React
* React Router
* Flux
* Babel
* Webpack
* Electron

##**フォルダ構成**

```bash
├── app
│   ├── actions
│   ├── api
│   ├── app.css
│   ├── app.html
│   ├── app.icns
│   ├── bower.json
│   ├── bower_components
│   ├── components
│   ├── constants
│   ├── containers
│   ├── dispatcher
│   ├── hot-dev-app.html
│   ├── mainApp.jsx
│   ├── routes
│   │   ├── async.js
│   │   ├── router.js
│   │   └── routes.jsx
│   ├── stores
│   └── utils
├── dist
├── erb-logo.png
├── main.js
├── package.js
├── package.json
├── release
└── webpack
    ├── loaders-by-extension.js
    ├── make-webpack-config.js
    ├── webpack-dev-server.config.js
    ├── webpack-hot-dev-server.config.js
    ├── webpack.config.js
    └── webpack.config.production.js
```

#**やったこと**

たいしたことは追加しておらず、元々の設計に従った。

##**Bootstrap**

ElectronにBootstrapを導入した。`app/mainApp.jsx`でcssを読んでる感じだったので、`bower`でBootstrapをいれて、以下のように直接読み込んだ。

```js
import './bower_components/bootstrap/dist/css/bootstrap.min.css'
```


##**Component**

Componentは<a href="https://github.com/kriasoft/react-starter-kit/blob/master/docs/react-style-guide.md" target="_blank">react-starter-kit</a>に従って作成した。CSSのBEM設計も同じく<a href="https://github.com/kriasoft/react-starter-kit/blob/master/docs/react-style-guide.md" target="_blank">react-starter-kit</a>を参考にしている。


##**Flux**

Fluxは<a href="https://github.com/facebook/flux/tree/master/examples/flux-todomvc" target="_blank">flux-todomvc</a>な感じで実装した。元のコードで必要ない部分は少し変更している。


##**パッケージング**

アプリとして誰でもダウンロードできるようにする。これも、<a href="https://github.com/chentsulin/electron-react-boilerplate#package" target="_blank">electron-react-boilerplate</a>に従い以下コマンドを打つだけである。

```
npm run package
```



#**まとめ**

コストを掛けずに綺麗な設計を実装できた(と思う)。Electronおもしろい。

ご意見いただけますと嬉しいです。
技術英語 > 出荷前検査 > pre-shipment inspection


[出荷前検査 @ weblio](http://ejje.weblio.jp/content/%E5%87%BA%E8%8D%B7%E5%89%8D%E6%A4%9C%E6%9F%BB)

> 出荷前検査
pre-shipment inspection

ふと思った疑問は、shipmentという用語がつくようになった理由。

昔(車が普及する以前)は船で荷物を運ぶことが多かったということだろうか。

[出荷 @ weblio](http://ejje.weblio.jp/content/%E5%87%BA%E8%8D%B7)
ではforwarding も出てくるが、僕自身はあまりforwading が使われている説明を目にした憶えはなく、shipmentがほとんどの気もする。
Apacheの子プロセスの数を減らす(raspberrypi用)

## 参考

* [転ばぬ先のApacheチューニング（〜中規模） - Qiita](http://qiita.com/kou/items/acb3dcf1dcb428d7a3ec)

## 設定

* RaspberryPiはスペックが低いため減らしておきたい。

```bash:10個居る
$ ps -ef | grep apache | grep www-data
www-data  5199   713  0  8月30 ?      00:00:01 /usr/sbin/apache2 -k start
www-data  5412   713  0  8月30 ?      00:00:03 /usr/sbin/apache2 -k start
www-data  5552   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  5610   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  5618   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  5630   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  5631   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  5632   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  5664   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
www-data  7156   713  0  8月30 ?      00:00:00 /usr/sbin/apache2 -k start
```

```diff:/etc/apache2/mods-enabled/mpm_prefork.conf
  # prefork MPM
  # StartServers: number of server processes to start
  # MinSpareServers: minimum number of server processes which are kept spare
  # MaxSpareServers: maximum number of server processes which are kept spare
  # MaxRequestWorkers: maximum number of server processes allowed to start
  # MaxConnectionsPerChild: maximum number of requests a server process serves

  <IfModule mpm_prefork_module>
-	StartServers            5
-	MinSpareServers         5
-	MaxSpareServers         10
-	MaxRequestWorkers       150
-	MaxConnectionsPerChild  0
+	StartServers             4
+	MinSpareServers          4
+	MaxSpareServers          4
+	MaxRequestWorkers        4
+	MaxConnectionsPerChild   1000
  </IfModule>
```

* apacheを再起動。

```bash:減ったことを確認
$ ps -ef | grep apache | grep www-data
www-data 13220 13199  0 05:56 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 13221 13199  0 05:56 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 13222 13199  0 05:56 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 13223 13199  0 05:56 ?        00:00:00 /usr/sbin/apache2 -k start
```

## Apache設定の確認

```bash:
/usr/sbin/apachectl -V
```

* Prefork か Worker かの判別ができる。通常Prefork

## 通常時のプロセス数把握しておく

```bash:
mkdir -p $HOME/cron/apache_procs/
touch $HOME/cron/check_apache_procs.sh
```

```bash:$HOME/cron/check_apache_procs.sh
#!/bin/sh
LANG=C
set -eu

# PROCS=`ps -ef | grep http[d] | wc -l`
PROCS=`ps -ef | grep apache[2] | wc -l`
NOW=`date +'%H:%M'`

cd $HOME/cron/apache_procs/
echo "${NOW} ${PROCS}" >> `date -I`.txt
```

```bash:crontab&nbsp;-e
* * * * * /bin/sh $HOME/cron/check_apache_procs.sh
```
Rhinoceros / Grasshopper / GHPythonで球状グリッドを作ってみる


##はじめに
指定した数に応じて、球状にグリッドを作り、そこに３Dオブジェクトを配列するスクリプトを書きました。その方法を書き残しておきます。

##データ

[インプット]
name: obj, Data Access: Item Access, Type hint: GeometryBase, desc: 配列するオブジェクト
name: num, Data Access: Item Access, Type hint: int, desc: グリッドの数
name: rad, Data Access: Item Access, Type hint: float, desc: 球の半径
[アウトプット]
name: objs, desc: 球上に配列されたオブジェクト
name: pts, dec: 球状に配列されたポイント

```python
import ghpythonlib.components as ghcomp
import Rhino
import math

objList = []
ptList = []
for i in range(num):
    #球状に配列する
    y = i * 2 / num - 1 + (1 / num)
    r = math.sqrt(1 - y * y)
    phi = i * math.pi * (3 - math.sqrt(5));
    x = math.cos(phi) * r;
    z = math.sin(phi) * r;
    
    #半径に応じてスケール
    x = x * rad;
    y = y * rad;
    z = z * rad;
    position = Rhino.Geometry.Point3d(x, y, z);
    ptList.append(position)
    
    #オブジェクトを配置
    clone = obj.Duplicate()
    center = clone.GetBoundingBox(True).Center
    dir = Rhino.Geometry.Vector3d(position) - Rhino.Geometry.Vector3d(center)
    dir.Unitize()
    clone = ghcomp.OrientDirection(clone,center,Rhino.Geometry.Vector3d(0,0,1),position,dir)[0]
    
    objList.append(clone)

objs = objList
pts = ptList
```
![Screen Shot 2015-09-01 at 04.55.21.png](https://qiita-image-store.s3.amazonaws.com/0/42909/97634044-79ab-6246-32a5-4ccd5b929637.png "Screen Shot 2015-09-01 at 04.55.21.png")
![Screen Shot 2015-09-01 at 04.55.47.png](https://qiita-image-store.s3.amazonaws.com/0/42909/2c2ccd88-a77c-ebb8-4a53-40a3b0e116b7.png "Screen Shot 2015-09-01 at 04.55.47.png")



##解説

```python
import ghpythonlib.components as ghcomp
import Rhino
import math

objList = []
ptList = []
...
```

今回つかうライブラリをインポートして、空っぽのリストを２つ作っておく。
　

```
...

for i in range(num):
    #球状に配列する
    y = i * 2 / num - 1 + (1 / num)
    r = math.sqrt(1 - y * y)
    phi = i * math.pi * (3 - math.sqrt(5));
    x = math.cos(phi) * r;
    z = math.sin(phi) * r;
...
```

メインはこの部分で、ここで球状のグリッドのベースを作っています。
　

```
...
    #半径に応じてスケール
    x = x * rad;
    y = y * rad;
    z = z * rad;
    position = Rhino.Geometry.Point3d(x, y, z);
    ptList.append(position)
```
ベースを半径のサイズに応じてスケールしています。そのあと、ptListに作ったポイントを入れています。
　

```
...
    #オブジェクトを配置
    clone = obj.Duplicate()
    center = clone.GetBoundingBox(True).Center
    dir = Rhino.Geometry.Vector3d(position) - Rhino.Geometry.Vector3d(center)
    dir.Unitize()
    clone = ghcomp.OrientDirection(clone,center,Rhino.Geometry.Vector3d(0,0,1),position,dir)[0]
    
    objList.append(clone)
...
```
ベースのオブジェクトを複製して、先ほど作ったグリッドの点にGHコンポーネントのOrient Directionを使ってオリエントしています。最後にリストに複製したオブジェクトを追加する。
　

```
...
objs = objList
pts = ptList
```

最後にリストをアウトプットします。

##ダウンロード
[SphericalGrid.gh](orangejellies.com/resources/gh/SphericalGrid.gh)
SwiftでRubyの宇宙船演算子を実装した

宇宙船演算子 <=>
> 「<=>」は、その形状から「宇宙船演算子」と呼ばれる演算子で、「左辺 < 右辺」であれば-1を、「左辺 > 右辺」であれば1を、等しければ0を返す演算子です。

```rb
100 <=> 500 # -1
100 <=> 100 # 0
500 <=> 100 # 1
```

例えば、sort処理に使う[^1]
[JunkBox～主に個人的防備録～: RubyのUFO演算子を利用したソート処理について](http://akira-junkbox.blogspot.jp/2013/11/rubyufo.html)

swiftは演算子のオーバーライド、カスタム演算子を簡単に記述できるので、宇宙船演算子を実装してみた。

- 参考
    - [Swift Operators - NSHipster](http://nshipster.com/swift-operators/)


```Operators.swift
infix operator <=> { associativity left }

public func <=> <T: Comparable>(lhs: T, rhs: T) -> Int {
    switch (lhs, rhs) {
    case let (l, r) where l < r:
        return -1
    case let (l, r) where l > r:
        return 1
    default: 
        return 0
    }
}
```

```OperatorsTests.swift
func testSpacshipOperator() {
    XCTAssertEqual(1 <=> 2, -1)
    XCTAssertEqual(1 <=> 1, 0)
    XCTAssertEqual(2 <=> 1, 1)
}
```

[^1]: Rubyのarray.sort関数は、要素の順番比較として<=>演算子が使われています [sort, sort! (Array) - Rubyリファレンス](http://ref.xaio.jp/ruby/classes/array/sort)
macのvagrantでlocalhost:8080としていたところをlocalhostのみでブラウザアクセスする

vagrantを利用するときゲストの80番ポートをホストの8080番ポートにポートフォワーディングしています。
すると、ブラウザにアクセスするとき`lolcalhost:8080`とすることになります。
ここを`localhost`とポート番号を書かずにアクセスするためにpfを利用してみます。


## 使い方

まずはポートフォワードの許可にします。

```
$ sudo sysctl -w net.inet.ip.forwarding=1
```

有効

```
$ echo 'rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080' | sudo pfctl -ef -
```

これで今まで`localhost:8080`としていたところが`localhost`とアクセスできるようになります。

無効

```
$ sudo pfctl -ef /etc/pf.conf
```

確認

```
$ sudo pfctl -sn
```


## pfとは？

- [新・OS X ハッキング! (111) Yet Anotherなファイアウォール「PF」をラクに使う | マイナビニュース](http://news.mynavi.jp/column/osxhack/111/)
Selenium+PhantomJS+Pythonでdivの横幅をサーバ側で取得

今更ネタですが。

divの横幅(px)が欲しい。
ブラウザ側ならJS使って簡単にとれるけど、今回はサーバ側で欲しい。
divの横幅なので、決まるのはレンダリング後だったりすることもある。
なので、サーバ側でレンダリングする。
サーバにFirefoxを入れてSeleniumでなんとか、というのも昔やったけど、Firefoxのインストール時、ディスプレイ周りで時間かかったいやな思い出があるので、今回はブラウザとしてPhantomJS使ってみた。

http://phantomjs.org/

>PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

だそうです。すごいね。

## PhantomJSいれる
PhantomJSのビルドはこれのとおりやればいい
http://phantomjs.org/build.html
今回のサーバがCentOS5だったせいか、 うまく通らず、 `git checkout 1.9` に変えたらすんなりいった。急いでるのでひとまずこれでいいか……

## Seleniumいれる
次に、これをSeleniumから叩きたいので

```zsh
pip install selenium
```

## seleniumからPhantomJSをいじる

```py
from selenium import webdriver
url = 'http://hoge'
driver = webdriver.PhantomJS()
driver.get(url)
e = driver.find_element_by_xpath("//*[@class='hoge']")
print(e.size)
>>> {'width': 602, 'height': 2098}
```

手持ちのChromeでの表示結果とあってたのでこれでよさそう。
おしまい
OpenShiftでnode.jsとnpmを最新にし、bower installする


## 追記 2015/09/01

[@nekop](https://twitter.com/nekop)さんに、ご指摘いただいてOpenShiftではscl（Software Collections）を利用できるため、node v0.10.35がデフォルトで利用可能でした。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/zaru">@zaru</a> OpenShift OnlineではnodejsはOS標準のではなくsclのものを利用できます。scl enable nodejs010 -- node -vするとv0.10.35です。sclの一覧はrhc sshしてscl -lしてみると確認できます。</p>&mdash; Takayoshi Kimura (@nekop) <a href="https://twitter.com/nekop/status/638549491491041281">2015, 9月 1</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

sclで利用可能なパッケージはこんな感じ。

```
> scl -l
mongodb24
mysql55
nodejs010
php54
postgresql92
python27
python33
ror40
ruby193
ruby200
v8314
```

これを使えば、あとは`bower install`をデプロイ時に自動実行するようにすればOKですね。@nekopさんありがとうございました。

## ここから以前の記事

[OpenShiftでRuby, Sinatraを動かしてみた（Herokuの代わりに）](http://qiita.com/zaru/items/150f60a3614eb196555b)で紹介したRedHat社のPaaS、OpenShiftですがデフォルトで入っているnode.jsがv0.6.20とかなり古く、このままだとまともに動かないnode.js系のツールがあります。そう、bowerとか。なので、今回はnode.jsのバイナリファイルを直接おいて、無理やりそっちを使うことにしてみました。

なお、アプリケーションのタイプがnode.jsの場合はアップデートが可能っぽいです。今回はruby-2.0のタイプを使用したため、node.jsのアップデートができず苦肉の策です。

# アプリケーションを作成する

```
$ rhc create-app samplebower ruby-2.0
$ cd samplebower
```

# デプロイ時にnode.jsを配備する

`.openshift`という隠しディレクトリに、アクションフック用のスクリプトが設置できます。今回はデプロイ時に指定したnode.jsのファイルがあればそれを使用し、なければダウンロードして、npmでbowerをインストールするようにしました。

## .openshift/action_hooks/deploy

```.openshift/action_hooks/deploy
#!/usr/bin/env bash

HOME=$HOME/app-root/runtime

NODE_V='v0.12.7'
NODE_BIN=$HOME/node-$NODE_V-linux-x64/bin/node

cd ~/

if [ ! -e $NODE_BIN ]; then
    wget https://nodejs.org/dist/$NODE_V/node-$NODE_V-linux-x64.tar.gz
    tar zxvf node-$NODE_V-linux-x64.tar.gz
    ./node-$NODE_V-linux-x64/bin/npm install bower
fi

export PATH=$HOME/node-$NODE_V-linux-x64/bin:$PATH
cd ./repo
../node_modules/.bin/bower install
```

実行権限も与えておきます。

```
$ chmod 755 .openshift/action_hooks/deploy
```

# bowerの初期設定

```
$ bower init
$ bower install jquery --save-dev
```

# OpenShiftへの反映

```
$ git add .openshift/action_hooks/deploy bower.json
$ git commit -m 'first commit'
$ git push origin master
```

これで、`.openshift/action_hooks/deploy`と`bower.json`をOpenShiftにアップロードすると、node.jsをダウンロードしてbower installまでやってくれます。
RDS(MySQL)における直線性能の検証

# 検証においての前置き
## なぜこの検証を実施したか

MySQL利用の際に並列度を上げればある程度qps(commit per sec?)はあげられます。
今回はアプリケーション実装やシステム環境の制約により、1接続にて順次データを導入していく必要性がありました。
次の節にて要件および制約条件を書きます。

## 制約条件・要件

- 挿入・更新を実施するMySQLは1つだけ・参照系は複数接続あり
- RDSリードレプリカの利用は想定しない
- 速度的に問題なければバイナリログ関連設定の変更は行いたくない
- PITRなどへの影響は最小限にしたい

# 検証
## 調整内容

以下2点に絞って検証しました。

- InnoDB xaサポートの無効化(innodb_support_xa=0)
- InnoDB ログフラッシュ時のsync(innodb_flush_log_at_trx_commit=2)

## 結果

3回実施の中間値です。

| |Mangetic|gp2|PIOPS1000|
|---|---|---|---|---|
|None|3.551|2.278|2.142|
|xa|1.370|1.029|1.022|
|flush|2.074|1.290|1.086|
|xa+flush|1.357|1.276|1.046|

- xa = innodb_support_xa=0
- innodb_flush_log_at_trx_commit=2

余談ですが、この結果より `innodb_support_xa=0` を適用することにしました。

## 考察

PIOPSをもっと大きく(例:PIOPS10000)などにすると結果が変化するかもしれません。


## 検証方法

mysqlslapで、ひたすら直線的にinsertを行う方法で実施しました。

```
time mysqlslap \
  --user=${USER} \
  --password=${PASSWD} \
  --host=${RDSHOST} \
  --port=3306 \
  --engine=innodb \
  --auto-generate-sql \
  --auto-generate-sql-load-type=write \
  --auto-generate-sql-add-autoincrement \
  --number-char-cols=5 \
  --number-int-cols=10 \
  --number-of-queries=1000 \
  --concurrency=1 \
  --iterations=10
```
RubyMineでeslint

# RubyMineで文法チェック
`eslint`で文法チェックをしましょう。

# eslintを入れよう
http://eslint.org/docs/user-guide/getting-started
に書いてある手順通り`npm`で進める。

インストールされたら、
`eslint --init`
を実行。質問が表示されるが、表示された英語をじっくり読むと
矢印キーで選んでねって感じのすごいやさし英文が表示されてるのに気づくので、矢印キーでそっと選ぶ。

`~/.eslintrc`
という設定ファイルができあがる。

# RubyMineの設定
![Screen Shot 2015-08-31 at 11.57.30 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/5cbb811a-2182-9fac-434f-f3d8050b28c2.png)
いい感じにパスを設定する（勝手に入ってたりもする）

# ハマったこと
`eslint`で文法チェックしたところ。
`export default class` を書いてると、
`error  Illegal export declaration`とeslintが教えてくれる。
でもこれ、エラーじゃない。困った。

https://github.com/eslint/eslint/issues/2112
にたどりつく。

`ecmaFeatures: { modules: true }`
足したらどうだい？的な英語があるので、
`eslint --init`でできた

```
{
    "rules": {
        "indent": [
            2,
            4
        ],
        "quotes": [
            2,
            "single"
        ],
        "linebreak-style": [
            2,
            "unix"
        ],
        "semi": [
            2,
            "always"
        ]
    },
    "env": {
        "es6": true,
        "browser": true
    },
    "extends": "eslint:recommended",
}
```

に足してみるも全くうまくいかない。

`babel-eslint` 入れてみるといいんじゃない？みたいなことも書いてあるのを見たので、入れてみるも、別のエラーが出たりする。

## 解決方法
やはりはじめにたどりついた
https://github.com/eslint/eslint/issues/2112
をもう一度じっくり読む。そして
質問者と解答者の英語をじっくり読む！

そこでひらめいた。

`eslint --init`で作ったファイルの内容はまるっと消して、
質問者と解答者の答えを合わせた内容を`~/.eslintrc`に貼り付ける

```
{
  "ecmaFeatures": {
    "jsx": true,
    "modules": true
  },
  "env": {
    "browser": true,
    "node": true,
    "es6": true
  },
  "rules": {
    "strict": 0,
    "no-underscore-dangle": 0,
    "quotes": [
      2,
      "single"
    ]
  }
}
```

エラーは消えました。どこが悪さしてたのかは、よくわからん。
結局 `babel-eslint`も今回は必要なかったぽい。
vimの練習帳　その１

# vimの練習帳　その１

vimのTIPSは、知った時は「なるほど〜便利だな」と思うのですがしばらく使わないと忘れちゃいます。
というわけで、「10分くらいで、TIPSをまとめて復習できる練習が作れないかな」と考えました。
こういうのって、何て呼べばいいんですかねぇ。バイエルじゃないしなぁ。

---

##### .vimrcなしで起動
`vim -u NONE -N`

`:e test.txt`

##### 準備
`ione two three four five<C-[>`
##### 移動基本
`0wwwwbbbbeeeegegegege`

##### ピリオドで繰り返しその１
`0~w.w.w.w.`

##### ピリオドで繰り返しその２
`0ea_hoge<C-]>e.e.e.e.`

##### fの繰り返し、前後ろ
`0f_;;;;,,,,`


##### 削除 to  
`0dt_u`

##### 削除 f
`0df_u`

##### 基本のdaw
`$dawu`

##### 基本のciw
`$ciwhoge<C-]>u`

##### ピリオドで繰り返しその3
`0f_s<C-]> of  ;.;.;.;`

##### 置換
`:s/hoge/dog/`

##### 置換繰り返し
`&&&&`

##### 検索
`0fd*nnnNNN`

##### 検索後cとn.で置換繰り返し
`cwcat<C-[>n.n.`
iTunesで聴いている曲をSlackに通知するアプリをElectronで作った

> PCアプリ開発者はWeb技術を見くびらないほうがいい、あなたの仕事は今にも失われつつある。

https://github.com/uiureo/playing

![](https://i.gyazo.com/1fb3fdb923d244ed86557f8b4f1066ba.png)

会社のチャットにサーバーアラートを流している部屋があるのだけど、最近ノイズが激しくて見ているだけで心が荒れてくる。そこで、全然関係ない情報を流したらかえって良くなるのではないかと思って、iTunesの曲の情報を流すようにしてみたら案外評判が良かった。スクリプトをNode.jsで書いていたので、Electronでアプリ化すれば簡単に他の人でも使えると思って作った。

Last.fmでもいいのだけど、アートワークがアイコンとして表示されたり、iTunesのURLがリンクになっていたりするところをこだわってる。



## 使いかた
https://github.com/uiureo/playing#usage

SlackでIncoming Webhookを追加して、WebhookのURLを手に入れます。
https://slack.com/services/new/incoming-webhook

アプリを起動するとメニューバーにアイコンが現れるので、クリックして設定画面を開きます。Slackから取得したURLをテキストフォームに貼り付けると設定完了です。

![](https://i.gyazo.com/3213dad4d3a0663b1a9f60dc50781462.png)

あとはiTunesで好きな曲を再生するだけ！

[playingを今すぐダウンロード](https://github.com/uiureo/playing/releases)

## 仕組み

仕組みは単純で、おおまかにはこういう感じ。Electronなので、基本JavaScriptで書かれている。

* Apple scriptでiTunesの再生中の曲を取得する
* iTunes APIから曲の詳細な情報を取得する
* SlackのIncoming Webhooksを利用して通知する

メニューバーにアイコンを表示するために、menubarというモジュールを使った。
https://github.com/maxogden/menubar

ちょっとハマったのは、画面内のフォームにCommand+vで貼り付けたりできなかったこと。ショートカットキーなどはわざわざ設定する必要があるらしい。便利モジュールを使って対処した。
https://github.com/azu/electron-template-menu

## 感想
Electronは、趣味のスクリプトを手軽にネイティブアプリ化するのに便利だと実感した。ただアプリ化できるだけでなく、クロスプラットフォームに動かせるので余計な手間がない。

以前のエントリでElectronを使えばより素早くより自由にPCアプリを作れると書いたけれど、今回小さなアプリを作った経験でその確信はより強まった。

PCアプリ開発者はWeb技術を見くびらないほうがいい、あなたの仕事は今にも失われつつある。
One thing I expect programing language to do

# Computers are unintelligent

Computers are unintelligent as they do not understand what humans do not teach them. A computer must be provided with clear instructions as it cannot read between the lines. Computers are superior to humans in terms of logical thinking, however, humans are superior to computers in terms of intelligence. Because of these differences, many humans are uncomfortable with talking to a computer because it feels as if they are talking to an unintelligent friend. 

# Silver bullet
The requirements for a programming language are completely dependent upon it’s application. I don’t believe in the existence of a “silver bullet” which all users will love without any complaints. However, one thing I expect from a programming language is that it makes you feel as if you’re talking to a human. To date, all programming languages have been created by humans and throughout each codebase, you feel as if you are talking to the programming language’s author. Once you look at it from this perspective, a human who is talking to a computer will feel as if they are talking to a friend, rather than an unintelligent computer.
CakePHP3をComposer無しにダウンロードしてきてインストールする

CakePHP3は建前上Composerが必須になって、公式のリファレンスもComposerからインストールしてくださいみたいな感じになってしまいました。

知っている人は知っていると思いますが、同様の悩みがある人のために検索にかかりやすくするように一応記述しておきます。

CakePHP.jpのトップページからのダウンロードでもソースコードだけ（CakePHP2系で言うcake/lib側のファイルのみ）なのでダウンロードしてもファイル置いて開始ってことにはなりません。

Composerは確かに便利です。
業務では使ってますが、個人でとりあえずCakePHP3を使うにはわざわざ使わなくていいやーという人もたくさんいると思います。
ただCakePHP3を試してみたい、趣味で触ってみたいとかの場合、学習コストをComposerに割くのはまだいいや、ファイル解凍してFTPでアップロードするでいいやーという人も多いとおもいます。

では、ダウンロードのための場所を記して起きますね。
https://github.com/cakephp/cakephp/tags

3系のみDownloadsというリンクが増えています。
欲しいバージョンのDownloadsをクリックして、画面移動
下の方に行くとファイルへのリンクが3つあります。

この内、Source code では無い奴ものをクリックしてダウンロードして下さい。
CakePHP-3-バージョン名.zip みたいになっているリンクですね。

Sourceは上記のCakePHP.jpのトップのダウンロードと同じような物で、2系でいうcake/libだけの中身のようなものです。
CakePHP-3-バージョン名.zip みたいになっている方はComposerで取ってくるように色々なファイル、フォルダ、DebugKitみたいな物等々オールインワンになってるっぽい物です。

あとは、config/app.phpを書き換え、FTP等でアップロードしパーミッションの設定をすればOKとなります。

2系で言うdatabase.phpは廃止されapp.phpに統合されました。
DB設定は若干記述方法変わっていますが、多分分かると思います。
security.saltも配列で設定する箇所があるので、変更してください。
2系の時は文字列の長さ的にデフォルトではsha1程度の長さでしたが、3ではsha256の長さになっているようです。
cakephp2の頃のようにデフォルトのままでも警告がでなくなっているようなので、忘れずに変更するようにしてください。
security.cipherは廃止されたようです。

macにインストールする場合は、intlのモジュールエラーが出る場合があるかもしれませんがそれはcomposerでインストールしてもなりうるし、また別の話なので機会があれば・・・。。（linuxには実はまだ試してません。）
Crystal - BitArray

Crystalの標準ライブラリのBitArrayクラスについて

## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
BitArrayは内部的にはBoolの配列です。
デフォルトはfalseでビット列が初期化され、
オプショナルでtrueに設定することも可能です。
`BitArray#invert`で全体を反転。
`BitArray#toggle(index)`で任意のビットを反転。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
```ruby
require "bit_array"
ba1 = BitArray.new(8)
pp ba1.to_s
ba1.invert
pp ba1.to_s
pp ba1.toggle(2)
pp ba1.to_s
pp ba1.toggle(2)
pp ba1.to_s

ba2 = BitArray.new(16, true)
pp ba2.to_s

ba1.each_with_index { |e, i|pp "#{i}: #{e}" }
converted = ba1.map_with_index { |e, i|i.odd? ? true : false }
pp converted
```

### <i class="fa fa-files-o" style="font-size:1em;"></i> 出力
```ruby
ba1.to_s = "BitArray[00000000]"
ba1.to_s = "BitArray[11111111]"
ba1.toggle(2) = 4294967291
ba1.to_s = "BitArray[11011111]"
ba1.toggle(2) = 4294967295
ba1.to_s = "BitArray[11111111]"
ba2.to_s = "BitArray[1111111111111111]"
"#{i}: #{e}" = "0: true"
"#{i}: #{e}" = "1: true"
"#{i}: #{e}" = "2: true"
"#{i}: #{e}" = "3: true"
"#{i}: #{e}" = "4: true"
"#{i}: #{e}" = "5: true"
"#{i}: #{e}" = "6: true"
"#{i}: #{e}" = "7: true"
converted = [false, true, false, true, false, true, false, true]
```

## <i class="fa fa-github-square" style="font-size:1em;"></i> GitHub
CrystalのBitArrayの実装が気になる方はこちら。

<i class="fa fa-external-link" style="font-size:1em;"></i> [src/bit_arra.rb - crystal - GitHub](https://github.com/manastech/crystal/blob/master/src/bit_array.cr)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [BitArray - Crystal Docs](http://crystal-lang.org/api/BitArray.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [src/bit_array.cr - crystal - GitHub](https://github.com/manastech/crystal/blob/master/src/bit_array.cr)
Phoenixに自作のテンプレートエンジンを追加する


nantoka.foo を踏んだら発火するテンプレートエンジンを自分で実装したいと思った。

## やり方

Phoenix.Template.Engine のbehaviour を備えて compile/2 を実装する。

```elixir
defmodule FooEngine {
  @behaviour Phoenix.Template.Engine
  def compile(_path, _name) do
      {:safe, "Foo"}
  end
}
```

config/config.ex に追記

```
config :phoenix, :template_engines,
  foo: FooEngine
```

これで拡張子fooを踏んだら何でもFooを返す

```
web/templates/nantoka.foo
```

## 仕組み

基本的にはpathnameみてFile.read! してコンパイラ切り替えたりする。
calliope っていう elixirでのhaml 実装があって、 これを使ったphoenix-hamlがある

[nurugger07/calliope](https://github.com/nurugger07/calliope "nurugger07/calliope")

[chrismccord/phoenix_haml](https://github.com/chrismccord/phoenix_haml "chrismccord/phoenix_haml")


たとえば phoenix_haml の Engineの定義はこうなってる

```elixir
defmodule PhoenixHaml.Engine do
  @behaviour Phoenix.Template.Engine

  @doc """
  Precompiles the String file_path into a function defintion, using Calliope engine
  """
  def compile(path, _name) do
    path
    |> read!
    |> EEx.compile_string(engine: Phoenix.HTML.Engine, file: path, line: 1)
  end

  defp read!(file_path) do
    file_path |> File.read! |> Calliope.Render.precompile
  end
end
```

学びがあった
Git ふたつ以上前のコミットには commit --amend できないの？

ひとつまえのコミットは ```$ git commit --amend``` で簡単に書き換えられる。
「だが二つ以上前のコミットを書き換える」という簡単なコマンドはない。（みたいだ）

なぜないんだ。あったら良いのに。と、思っていた。

だがこれはあくまで、 ```$ git commit --amend``` が「ひとつ前のコミット」と「そこからの変更状態(HEAD)」を扱うコマンドだからだ、と理解している。

仮に、二つ前のコミットを書き換えるとすると。
「ひとつ前のコミットの状態」と「ふたつ前のコミットの状態」と「変更状態」という。三つの状態を扱わなければいけない。

だから簡単にコミットを書き換えるコマンドが存在しないのだろう。
（まだ厳密にはよく分かっていない）

なので、二つ以上前のコミットを書き換えるには。リベースのインタラクティブモードを使うこと。

```$ git rebase -i HEAD~3``` みたいなコマンドで。特定のコミットを edit するモードに入る。
そこから ```$ git commit --amend``` すると良い。

(その後、```$ git rebase --continue ``` でリベースを完了させることを忘れずに)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Elixir]自作マクロでdo～end記述をできるようにする

#Goal
マクロでdo～endを展開する。

#Dev-Environment
OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4

#Wait a minute
ふと思ったんです。

自分で定義するマクロで、
do～endの記述をできるようにするには・・・どうしたらいいのか？

以下のような記述がしたい。

```elixir
macro_name do
  関数や処理
end
```

#Index
do ～ end in your own macro
|> Create example
|> Let's run!
|> Extra

##Create example
まずは簡単な例を作成します。

どうやってやろうかと思いましたが・・・

if文でやってんだから、
if/2マクロをコピペして真似ればできるんじゃね？

####Example:

```elixir
defmodule Sample do
  defmacro hoge(clauses) do
    do_clause = Keyword.get(clauses, :do, nil)

    quote do
      IO.puts unquote(do_clause)
    end
  end
end
```

if/2マクロのdoに該当する部分だけコピペしてきた。

ただ、do部分を受け取って、内容を表示するだけのマクロ。

##Let's run!
それでは使ってみます。

####Result:

```elixir
iex> require Sample
nil
iex> Sample.hoge do
...>   "do block"
...> end
do block
:ok
```

やった！
成功です。

##Extra
do以外にもできるのかなと思いやってみました。
(無理だと思いますが・・・一応)

####Example:

```elixir
defmodule Sample do
  defmacro hoge(clauses) do
    foo_clause = Keyword.get(clauses, :foo, nil)
    bar_clause = Keyword.get(clauses, :bar, nil)

    quote do
      IO.puts unquote(foo_clause)
      IO.puts unquote(bar_clause)
    end
  end
end
```

####Result:

```elixir
iex> Sample.hoge foo
** (FunctionClauseError) no function clause matching in Keyword.get/3
    (elixir) lib/keyword.ex:118: Keyword.get({:foo, [line: 4], nil}, :foo, nil)
             expanding macro: Sample.hoge/1
             iex:4: (file)
```

当然ですが、できませんね。

#Speaking to oneself
Elixirすげぇな！！(信仰)

#Bibliography
[Github - v1.0.5 elixir-lang - Kernel.if/2 (source)](https://github.com/elixir-lang/elixir/blob/v1.0.5/lib/elixir/lib/kernel.ex#L2157)
Excel VBAでのクラスモジュール、標準モジュールのスコープまとめ(Friend, PublicNotCreatableなど)

#まえがき
自ブック（プロジェクト内）でコードを書く分にはあまり意識することはありませんが、下請けクラスやモジュールをぱんぱんに詰め込んだExcel VBAアプリケーションをブックごと「はいどうぞ」と提供するのは、なんとなく、ユーザに変なところまで覗き見られる気持ち悪さがあるものです。

できれば、ユーザには直接利用できるファンクションだけ公開しておいて、その他の処理は隠したい。そういう時、機能ごとにアドイン分割＋参照設定などを行います。

#いきなりまとめ
下の表は、Private, Publicなどのスコープによって参照可否がどのようにコントロールされるかをまとめたものです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/89639/fc3e2764-8354-ec82-02f4-44149acc6677.png)

##標準モジュール
標準モジュールのPublicメソッドは、クラスからでも他プロジェクトからでも、あらゆるところから無制限に見えます。

##クラスモジュール
クラスモジュールの場合、Instancingプロパティによって他プロジェクト（参照元）からの参照可否をコントロールできます。

- Privateにすると参照元からクラスを利用することはできません。
- PublicNotCreatableにすると、参照元からクラスを利用することができますが、インスタンスの生成は参照先でやる必要があります。（つまり、参照先にcreateメソッドなんかを作っておいて、生成させたインスタンスを戻り値で受ける必要がある）

クラス変数を直接ユーザーから見える場所に晒したくなければクラスモジュールはPrivateにしてしまい、処理のインタフェースとしてPublicなFunctionを用意しておく、といったやり方がありそうです。特にユーザーがサブクラスを使ってカスタマイズする可能性のあるツールなんかはPublicなFunctionをバチっと整備しておいて、その枠内でやってもらい、クラス変数は隠してしまった方がよさそうです。