OmniAICreator/Qiita-1.07M huggingface dataset:
配列に使用できるメソッド例

>> a
=> [42, 8, 17]
>> a.empty?
=> false
>> a.include?(42)
=> true
>> a.sort
=> [8, 17, 42]
>> a.reverse
=> [17, 8, 42]
>> a.shuffle
=> [17, 42, 8]
>> a
=> [42, 8, 17]

上のどのメソッドを実行した場合にも、a自身は変更されていないという点にご注目ください。配列の内容を変更したい場合は、そのメソッドに対応する「破壊的」メソッドを使用します。破壊的メソッドの名前には、元のメソッドの末尾に「!」を追加したものを使用するのがRubyの慣習です。

>> a
=> [42, 8, 17]
>> a.sort!
=> [8, 17, 42]
>> a
=> [8, 17, 42]

また、pushメソッド (または同等の<<演算子) を使用して配列に要素を追加することもできます。

>> a.push(6)                  # 6 を配列に追加する
=> [42, 8, 17, 6]
>> a << 7                     # 7を配列に追加する
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar"        # 配列に連続して追加する
=> [42, 8, 17, 6, 7, "foo", "bar"]

最後の例では、要素の追加を連鎖 (chain) できることを示しました。他の多くの言語の配列と異なり、Rubyでは異なる型が配列の中で共存できます (上の場合は整数と文字列)。

上では、文字列を配列に変換するのにsplitを使用しました。joinメソッドはこれと逆の動作です。
AWS マネジメントコンソール　＆検索

##AWSマネジメントコンソールでリソース名を&検索したい

例えばEC2で
production-tokyo-batch-01
production-tokyo-batch-02
production-tokyo-batch-03
production-tokyo-api-03
staging-tokyo-api-01
staging-tokyo-batch-01
があるときに、「api」かつ「production」をマネジメントコンソールで検索したい、そんな時。

正規化表現で以下でいける。
<pre>
^(?=.*api)(?=.*production)
</pre>
[baserCMS]WordPressとbaserCMSの共存

# WordPressとbaserCMSの共存

* 両方のインストールを完了させる
* baserCMSの配置を変更
* baserCMSをスマートURLに。
* WordPressのRewrite設定を行う。
* baserCMSの index.php を index_basercms.php に変更
* .htaccess を下記に書き換える

（例）archives 配下のみWordPressにしたい場合
<pre>
RewriteEngine On
RewriteBase /

# トップページ（baserCMS）
RewriteRule ^$ index_basercms.php [L]

# WordPress
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/archives/ [NC]
RewriteRule . /index.php [L]

# baserCMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index_basercms.php [QSA,L]
</pre>
[mac][MAMP] var_dumpで出力結果が途中で省略されてしまう時の対応方法

# var_dumpで出力結果が途中で省略されてしまう時の対応方法

* php.iniの[xdebug]セクションへ下記を追記

<pre>
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1
xdebug.var_display_max_depth = -1
</pre>

## 設定例

* /Applications/MAMP/bin/php/php5.5.18/conf/php.ini

<pre>
[xdebug]
zend_extension="/Applications/MAMP/bin/php/php5.5.18/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey=netbeans-xdebug
xdebug.var_display_max_children = -1
xdebug.var_display_max_data = -1
xdebug.var_display_max_depth = -1
</pre>

## 参考サイト
* http://mawatari.jp/archives/do-not-omit-the-result-of-var_dump
Slackで昼飯をレコメンド

昼飯を考えるのが面倒なのでslackにレコメンしてくれるよう通知
*対象店舗のデータはyelpを利用

##1.構成


サーバー : CentOS6.7
Ruby : 2.2.1

[Slack API](https://api.slack.com/)

tokenはあらかじめ取得
使用できるか確認

```
$curl -XPOST -d "token=<取得token>" -d "pretty=1" "https://slack.com/api/auth.test"
```

falseにならなければOK!


通知はWebhookを利用
slack-incoming-webhooks をインストール

```
#gem install slack-incoming-webhooks
```

Webhook URLの発行

[Webhook URL](https://api.slack.com/incoming-webhooks)


yelpのdevelopersから必要な情報を取得

[yelp](https://www.yelp.com/developers)

Manage API access より取得できる

Consumer Key
Consumer Secret
Token
Token Secret


##2. 準備


緯度(ll)と半径(radius_filter)は適時変更
半径はメートル単位

```yelp.rb
#!/usr/bin/ruby
# coding: utf-8

require 'rubygems'
require 'oauth'
require 'json'
require 'slack/incoming/webhooks'

## send slack
def send_slack(url,mesg)
     slack = Slack::Incoming::Webhooks.new url
     slack.post mesg
end

## post channel
wurl = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

#credit
consumer_key = "XXXXXXXXXXXXXXXXXX"
consumer_secret = "XXXXXXXXXXXXXXXXXX"
token = "XXXXXXXXXXXXXXXXXX"
token_secret = "XXXXXXXXXXXXXXXXXX"
api_host = 'http://api.yelp.com'

consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {:site => api_host})
access_token = OAuth::AccessToken.new(consumer, token, token_secret)


def call_yelp(access_token, off_set)

   shop_name = []
   set = off_set
   path = "/v2/search?term=food&radius_filter=850&sort=1&offset=#{set}&ll=XX.XXXXXXX,XX.XXXXXX&lang=ja"
   jresp = JSON.parse(access_token.get(path).body)
   jresp['businesses'].each do | business |
     if business['is_closed'] == false
        shop_name << business['name']
     end
   end

   return  shop_name.sample

end

def search_yelp(access_token, url, off_set, name)

   wurl, rname, set = url, name, off_set
   path = "/v2/search?term=food&radius_filter=850&sort=1&offset=#{set}&ll=XX.XXXXXXX,XX.XXXXXX&lang=ja"
   jresp = JSON.parse(access_token.get(path).body)
   jresp['businesses'].each do | business |
     if business['name'] == rname
       send_slack(wurl,"#{business['name']}\s#{business['rating']}\n#{business['url']}\n")
     end
   end

end


# recommend1
restaurant1 = call_yelp(access_token, 0)
search_yelp(access_token, wurl, 0, restaurant1)

# recommend2
restaurant2 = call_yelp(access_token, 21)
search_yelp(access_token, wurl, 21, restaurant2)
```

あとはこれをcronなどで動かせばOK!


##3.残作業

なんか一度にデータを取得できないからまどろっこしいやり方に。
limitとかで渡せばいっきにデータを取得できると思ったが、なぜかデフォルトの20件に絞られる。
他にもっといいやり方があるだろう・・。


[参考](http://www.ibm.com/developerworks/jp/opensource/library/os-extractruby/)
引数にデフォルト値を設定する

>> def string_message(str = '')
>>   if str.empty?
>>     "It's an empty string!"
>>   else
>>     "The string is nonempty."
>>   end
>> end
=> :string_message
>> puts string_message("foobar")
The string is nonempty.
>> puts string_message("")
It's an empty string!
>> puts string_message
It's an empty string!

最後の例を見ると分かるように、メソッドの引数を省略することも可能です (かっこですら省略可能です)。これは、以下のコードでは

def string_message(str = '')
引数にデフォルト値を含めているからです (この例のデフォルト値は空の文字列です)。このように指定すると、str変数に引数を渡すことも渡さないこともできます。引数を渡さない場合は、指定のデフォルト値が自動的に使用されます。
Babelの使い方① - Babel単体での利用


今更ですが、ES6の勉強を始めました。
備忘録として、環境構築方法や用語などをメモしていきます。
手始めに、Babel単体での環境を作ります。

## Babel単体での利用
[Babel built-ins -> CLI](https://babeljs.io/docs/setup/#installation)

前提として、node.jsがグローバルインストールされている状態を想定

- 適当なディレクトリを用意  

 ```terminal
$ mkdir babel_test/cap1
$ cd babel_test/cap1
```

- Babelをグローバルインストール
 
 ```terminal
$ npm i -g babel
```

- package.jsonを作成
`$ npm init`で対話的に下記のようなファイルを作成しました↓

 ```package.json
{
  "name": "babel-test-built-ins",
  "version": "1.0.0",
  "description": "hoge",
  "repository": "piyo",
  "main": "index.js",
  "scripts": {
  		"test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```
> ミスって、descriptionとかrepositoryが空になっちゃっても`sudo vi package.json`で編集出来ます。
（自分の環境だとread-onlyなpackage.jsonが生成されました）

- Babelのコマンドラインツールをインストール

  ```terminal 
 $ npm i -D babel-cli
 ```

- es2015のトランスパイル用プラグインをインストール

  ```terminal
$ npm i -D babel-preset-es2015
```

- .babelrcを作成
 
 ```terminal
 $ touch .babelrc
 $ echo '{ "presets": ["es2015"] }' > .babelrc
```

- コンパイル元のファイルを作成
デフォルトパラメータとアローファンクションを利用。

 ```src/sample_es6.js
 setTimeout((hoge = "ほげ") => {
 		console.log(hoge);
 }, 500);
 ```

- コンパイルする

 ```terminal
 $ pwd # -> ~/babel_test/cap1
 $ babel src/sample_es6.js -o dest/sample.js
```

- 一応、コンパイル結果

 ```
 'use strict';

 setTimeout(function () {
    	var hoge = 'ほげ';
    	console.log(hoge);
 }, 500);
 ```

- ディレクトリを一括指定してコンパイルする事も可能

 ```terminal
$ babel src -d lib
```

 もしくは、下記を追記して↓

 ```package.json
{
　　...略...
  　"scripts": {
    	"build": "babel src -d dest"
  　},
}
```

 ```terminal
$ npm run build 
```

- watchも出来るよ٩( ‘ω’ )و
 
 ```package.json
{
　　...略...
　　"scripts": {
　　	"build": "babel src -d dest",
　　	"start": "babel -w src -d dest"
　　	}
}
```

 ```terminal
$ npm run start 
```

 ![スクリーンショット 2016-05-18 17.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/36492/f75511b4-527a-36fa-d1e2-25fe105a61ee.png "スクリーンショット 2016-05-18 17.58.09.png")
(背景がスケスケなのはお気になさらず)

### 捕捉
npm -i: installのショートカット
npm -D: --save-dev
babel -o:--out-file
babel -d:--out-dir
babel -w:--watch
「and」「or」「not」

論理値は、&&、||、!演算子によって結合することもできます。それぞれ「and」「or」「not」

>> x = "foo"
=> "foo"
>> y = ""
=> ""
>> puts "Both strings are empty" if x.empty? && y.empty?
=> nil
>> puts "One of the strings is empty" if x.empty? || y.empty?
"One of the strings is empty"
=> nil
>> puts "x is not empty" if !x.empty?
"x is not empty"
=> nil
emacs で間違って goal column (C-x C-n) を実行してしまったときの対処法

emacs で C-n C-p とかでカーソル移動してると、あやまって `C-x C-n` してしまい、 goal column 設定されてしまうことがある。

goal column とは、行移動した時の強制移動カラムを設定する機能だが、殆どの人はその機能の恩恵ないので、ただただウザいだけで戻し方を知らないと emacs を終了するしかなくなって生産性が下がる。

戻し方
`C-u C-x C-n`

すなわち、引数付きで goal column ショートカットをたたけばいい。C-u は後続のショートカットへの引数（だいたいは 4 を渡したこととなる）

以上です。
docker-composeで立ち上げたコンテナのタイムゾーンをホストと同じにする

タイムゾーンをホストと同じにするために、 `/etc/localtime` を起動時にマウントしてしまう。

```yaml:docker-compose.yml
webpage:
  image: nginx
  volumes:
    - /etc/localtime:/etc/localtime
```

これで一応タイムゾーンがホストと一緒になったけどもなんかモヤモヤする感じ。もっといい設定方法がありそう。
画像判別タスク向けの自前データセットを作ってみた

さまざまな機械学習フレームワークのサンプルには、殆どの場合画像認識のコードを含んでいます。それらで扱うデータセットは公開されているものを使うケースがほとんどです。
手書き文字認識のMNIST、10種類のカテゴリからなる画像CIFAR-10、大規模なデータセットのImageNetあたりがよく使われているようです。

自分でもデータさえ集められればそれなりの精度で画像分類はできるはずなので、実際にデータセットを作ってみました。

https://github.com/knok/instagram-food-images

## データソース

Instagramに投稿された画像のうち、以下のキーワードで検索したものを対象としました。

* ハンバーガー
* サンドイッチ
* ホットドッグ
* 餃子
* シュウマイ

検索した結果の画像をクローリングして、目視で不適切と思われる画像を取り除きました。大体以下のような指針で実施しました。

* ある程度の大きさで対象物が写っている
* 見切れすぎていない(8割ぐらい)
* 対象としている物体が複数種写り込んでいない

1種類の画像につき、6000~7000程度あります。

## データ取得

作成したのは画像URLのリストなので、それを元にデータを取得する必要があります。wgetなどを使うと楽でしょう。

```shell-session
$ wget -i urllist_gyoza.txt --wait 60
```

Instagramは一応CDNを使っているようですが、あまりアグレッシブに取得しに行くのはどうかと思い、自分は1画像あたり60秒程度のウエイトを起きました。

## 実際に認識モデルを作る

Chainerであれば、[PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1)](http://hi-king.hatenablog.com/entry/2015/06/11/021144)という記事が参考になります。
取得したファイルにラベルIDをふったCSVファイルを用意して、訓練画像の平均値をcompute_mean.pyで計算し、学習を始めるまでの手続きが書かれています。

## 注意

個々の画像の著作権は、それぞれの撮影者にあります。データ自体のライセンスについては確認しないで収集、分類したので、画像そのものの再配布は許諾が必要なものが含まれていると思われます。

## その他のリソース

[Food-101](https://www.vision.ee.ethz.ch/datasets_extra/food-101/) 101種類の食べ物の画像を集めたデータセット
fasta file のparser snipet

# fasta file のパーサー (python3 版)

bioinformatics で配列解析をするときに必ず書くことになるfasta ファイルのパーサーです。
gzip 圧縮されたファイルもそのまま読めます。

## 関数
```{python}
from itertools import groupby
import gzip

# Fasta IO
def fasta_iter(fasta_name):
    '''
    given a fasta file. yield tuples of header, sequence
    modified from Brent Pedersen
    Correct Way To Parse A Fasta File In Python
    https://www.biostars.org/p/710/
    '''

    if((fasta_name[-3:] == '.gz') or 
       (fasta_name[-5:] == '.gzip')):
        with gzip.open(fasta_name, 'rb') as f:
            data = (x[1] for x in groupby(f, lambda line: line.decode('utf-8')[0] == ">"))
            for header in data:
                header = header.__next__().decode('utf-8')[1:].strip()
                seq = "".join(s.decode('utf-8').strip() for s in data.__next__())
                yield(header, seq)
    else:
        with open(fasta_name) as f:
            # ditch the boolean (x[0]) and just keep the header or sequence since
            # we know they alternate.
            data = (x[1] for x in groupby(f, lambda line: line[0] == ">"))
            for header in data:
                # drop the ">"
                header = header.__next__()[1:].strip()
                # join all sequence lines to one.
                seq = "".join(s.strip() for s in data.__next__())
                yield(header, seq)
```

## 使用法
- 先の関数を定義した上で，次のように使います

```{python}
fasta = '/somewhere/hg19.fa.gz'

seqs = {}
for (head, seq) in fasta_iter(fasta):
    seqs[head] = seq

print(seqs)
```

# 参考資料
- https://www.biostars.org/p/710/
- https://docs.python.org/3.5/library/gzip.html#module-gzip
USBモデム AK-020 をudevだけで制御する (WIP)

SORACOM Air対応 USBモデム ABITさんの[AK-020](http://www.abit.co.jp/press-release/458.html) のデバイス認識をudevのみでしっかり行おうという試みです

論よりコード
----------

```:/etc/udev/rules.d/40-ak-020.rules
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="/usr/sbin/usb_modeswitch --std-eject --default-vendor 0x15eb --default-product 0xa403 --target-vendor 0x15eb --target-product 0x7d0e"
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/modprobe usbserial vendor=0x15eb product=0x7d0e"
```

rulesファイルを書き換えたら 再起動 OR `$ sudo udevadm control --reload` です

AK-020を挿したら /dev/ttyUSB[0-4] が出来上がっていますので、好きにしてください

```console
$ ls /dev/ttyUSB* | cat
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/ttyUSB3
```

解説
----

AK-020は２つのUSBデバイスを持っています

* CD-ROM: idProduct = a403
* USB modem: idProduct = 7d0e

ですので、それぞれで対応するコマンドを RUN で動かすというのが主旨です

### usb_modeswitch ###

```
usb_modeswitch --std-eject \
  --default-vendor 0x15eb --default-product 0xa403 \
  --target-vendor 0x15eb --target-product 0x7d0e
```

現在が default-* で target-* なデバイスの場合は --std-eject をしろ、という意味です

--std-eject は eject コマンドを実行したのと同じになり、これで手動でejectした状態と全く同じになります

### modprobe ###

上記 usb_modeswitch により idProduct = 7d0e で(再)認識されるため、先のrulesの2行目に反応し、modprobeされるわけです (まぁ、insmodでもいいですが)

WIP;
----

デバイス名の固定化

ちなみに
-------

`/dev/ttyUSB*` は mode=0660 group=dialout となっているので `sudo gpasswd -a YOUR_ID dialout` とdialoutグループに所属していると利用しやすいかもです

ただし Ubuntuな方は ModemManagerが ttyUSB0とttyUSB1をusedしているので `systemctl stop ModemManager` をしないと resource busy となるからハマります

※rootからなら強引に奪えますけど

参考資料
-------

* [(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし) - Qiita](http://qiita.com/aquahika/items/dc7d8ad8f481414d3528)
* [UbuntuでEmobileのD21LCを利用する | Blog.37to.net](http://blog.37to.net/2009/01/ubuntuemobiled21lc/)

ごめんなさい
----------

rc.localとかobsoluteです
Android-Bootstrapで、BootstrapButtonに設定したtextSizeが反映されない


# 問題

[Android-Bootstrap](https://github.com/Bearded-Hen/Android-Bootstrap) を使って、BootstrapButton のラベルとして、以下のように fontAwesomeIcon を割り当てて、 textSize を設定するも、ラベルの大きさを変更することができない.

```activity_main.xml
<LinearLayout
    android:id="@+id/button_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="horizontal">

    <com.beardedhen.androidbootstrap.BootstrapButton
        android:id="@+id/question_button"
        app:fontAwesomeIcon="fa_question_circle"
        app:bootstrapBrand="danger"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:textSize="120sp" />

    <com.beardedhen.androidbootstrap.BootstrapButton
        android:id="@+id/check_button"
        app:fontAwesomeIcon="fa_check_circle"
        app:bootstrapBrand="success"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:textSize="120sp" />
</LinearLayout>
```

上記のレイアウトでボタンを表示すると、以下のようになる.
ラベルがちっちゃい.

![スクリーンショット 2016-05-18 16.50.35.png](https://qiita-image-store.s3.amazonaws.com/0/1329/9f002826-5e49-0df2-d51b-e015ea9ddd77.png "スクリーンショット 2016-05-18 16.50.35.png")

# 解決策

アプリケーション中から `setTextSize()` すると通る.

```MainActivity.kt
question_button.setTextSize(120.0f)
check_button.setTextSize(120.0f)
```

以下のようになる.

![スクリーンショット 2016-05-18 16.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/1329/e4e3f32c-9801-3227-62e4-28326aabcc23.png "スクリーンショット 2016-05-18 16.51.05.png")

# memo

[Issueつくって確認したところ、「こういうものだ」という回答を得た](https://github.com/Bearded-Hen/Android-Bootstrap/issues/163).
bootstrapSize だと5段階での設定しかできないので、任意サイズを設定したい場合は、このやり方になるらしい.

# 参考

* [Bearded-Hen/Android-Bootstrap: Bootstrap style widgets for Android, with Glyph Icons](https://github.com/Bearded-Hen/Android-Bootstrap)
Monaca × Wikitudeを試す

**MOONGIFTは[Wikitude](http://wikitude.grapecity.com)のブログライターを行っています。WikitudeはiOS/Android/Unity/CordovaなどをサポートしたAR（拡張現実）プラットフォームを提供しています。**

[WikitudeではCordovaプラグインを提供しています](http://download.grapecity.com/products/wikitude/wikitude-sdk-extension-cordova-514.zip)が、Cordovaを使ったWebサービスとして日本では[Monaca](https://monaca.io)が知られています。ちなみにMOONGIFTはMonacaのブログライターもつとめています。Cordovaが使えるのであれば…ということで今回はWikitudeをMonacaアプリとして試してみました。

### Monacaのプランに注意

Wikitudeはプラグインなので、Monacaのゴールドプラン以上に加入していないと任意のプラグインは入れられません。インストールは一度CordovaプラグインをダウンロードしてZipファイルとしてアップロードするのが良いようです。URL直接指定だとうまくいきませんでした。

![wikitude-monaca-5.png](https://qiita-image-store.s3.amazonaws.com/0/61833/f5b4eac0-594c-6709-c36f-b6db87beb1fc.png)

### デモプログラム

[Cordova SDK向けのサンプルがGitHubにて公開](https://github.com/Wikitude/wikitude-cordova-plugin-samples)されています。今回はこれをベースにプロジェクトを作ってみました。素のCordovaとMonacaはファイルの読み込み方が多少違うので、その点だけ変更しています。

[moongift/WiktudeMonacaSample: WikitudeをMonacaで使うためのサンプルです http://wikitude.grapecity.com](https://github.com/moongift/WiktudeMonacaSample)

これをZipファイルでダウンロードして、Monaca側でプロジェクトのインポートしてもらえれば動くはずです。なお、プラグインを使っているのでiOSまたはAndroidアプリとしてビルドも行ってください。

![wikitude-monaca-3.png](https://qiita-image-store.s3.amazonaws.com/0/61833/741e825e-75bd-1f9f-64d3-23be059a3830.png)

実際に動かすと、カメラを指定された画像に向けるとARオブジェクトが表示されます。なお、対象となる画像は[こちらのPDF](https://raw.githubusercontent.com/moongift/WiktudeMonacaSample/master/target_images_examples.pdf)や[SDKドキュメントにある画像](http://docs.grapecity.com/help/wikitude/wikitude-sdk-android/cloudrecognition.html#basicrecognitiononclick)を使ってください。

![wikitude-monaca-9.png](https://qiita-image-store.s3.amazonaws.com/0/61833/6ec222fe-53a9-3505-4883-80183934ce30.png)

### Wikitudeについて

Wikitudeでは主に、

- 画像認識型AR
- 位置情報型AR

をサポートしていて、

- 画像
- 3Dモデル
- 動画
- HTML

などがARオブジェクトとして描画できます。

----

なお、CordovaやMonacaで動くということからも分かる通り、WikitudeではARの描画の殆どがHTML5によって実現しています。カメラを起動してその上にコンテンツを表示したりする部分はネイティブのAPIを使わざるを得ないのですが、実際に開発はWeb技術で行っていくようになっています。

[Wikitude（ウィキチュード）みんなが使えるARアプリ開発ツール｜グレープシティ株式会社](http://wikitude.grapecity.com/)
自分用のTomcatインストールから設定までの確認資料

# **Tomcatについての備忘録**
## インストール
```
$ sudo apt-get install tomcat7 tomcat7-admin tomcat7-common tomcat7-docs tomcat7-examples tomcat7-user
```

## サービスの起動・終了
```
sudo /etc/init.d/tomcat start
sudo /etc/init.d/tomcat stop
sudo /etc/init.d/tomcat restart
```

## 開発環境のTomcat作成
```
tomcat7-instance-create [direcotoryname]
```
上記を実行すると以下のようなディレクトリ構成が作成されます
```
.
└── tomcat
    ├── bin
    │   ├── setenv.sh
    │   ├── shutdown.sh
    │   └── startup.sh
    ├── conf
    │   ├── Catalina
    │   │   └── localhost
    │   ├── catalina.properties
    │   ├── context.xml
    │   ├── logging.properties
    │   ├── server.xml
    │   ├── tomcat-users.xml
    │   └── web.xml
    ├── logs
    │   ├── catalina.2016-05-18.log
    │   ├── catalina.out
    │   ├── localhost.2016-05-18.log
    │   └── localhost_access_log.2016-05-18.txt
    ├── temp
    ├── webapps
    └── work
        └── Catalina
            └── localhost
                └── _
```
上記のwebappsに以下のようにディレクトリを作成し、index.htmlファイルを設定するとサーバーが稼働しているのが確認できる。
```
├── webapps
│   └── ROOT
│       └── index.html
```

## 開発環境のTomcat起動・終了
開発環境内のTomcatについては、起動・終了は、上記tree上のbin配下にある、startup.shとshutdown.shを利用する。
```
./startup.sh
./shutdown.sh
```

上記までできれば各開発環境内でのTomcatを設定できると思われます。

## 追加バグ情報

[http://askubuntu.com/questions/313103/cannot-start-tomcat-after-installing-a-private-instance](http://askubuntu.com/questions/313103/cannot-start-tomcat-after-installing-a-private-instance)

Eclipseで利用する場合は、抜けているファイルがあるので、tomcat7-instance-create [directoryname]
でできたものに対して、以下の事を実行する事。

```
// Eclipseで使用するのに足りないファイルがあるので、リンクを作成しておく。
ln -s /usr/share/tomcat7/lib [directoryname]/lib
ln -s /usr/share/tomcat7/bin/bootstrap.jar [directoryname]/bin/bootstrap.jar

// curlはデフォルトで入っていないので、必要に応じて、[sudo apt-get install curl]でインストール
curl http://bazaar.launchpad.net/\~ubuntu-branches/ubuntu/precise/tomcat7/precise/view/head:/conf/catalina.policy > [directoryname]/conf/catalina.policy
```

Eclipseでサーバ追加をしようとした際に、ブランクでキー入力が効かない場合。
[http://stackoverflow.com/questions/14791843/eclipse-add-tomcat-7-blank-server-name](http://stackoverflow.com/questions/14791843/eclipse-add-tomcat-7-blank-server-name)
上記を読めばわかる。

## 追加情報
Tomcatバージョン確認方法
```
sinaku:bash-4.3$pwd
/usr/share/tomcat7/bin
sinaku:bash-4.3$ls
bootstrap.jar       configtest.sh  setclasspath.sh  tomcat-juli.jar
catalina-tasks.xml  daemon.sh      shutdown.sh      tool-wrapper.sh
catalina.sh         digest.sh      startup.sh       version.sh
sinaku:bash-4.3$./version.sh
Using CATALINA_BASE:   /usr/share/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /usr/share/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/java-8-oracle
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.52 (Ubuntu)
Server built:   Jun 19 2015 08:54:46
Server number:  7.0.52.0
OS Name:        Linux
OS Version:     3.13.0-86-generic
Architecture:   amd64
JVM Version:    1.8.0_91-b14
JVM Vendor:     Oracle Corporation
```
Passenger（standalone）にて、ELBのHealthCheckはhttpで受けつつ残りはhttpsで通信させるようにする


standaloneなpassengerの設定があまり見つからずに苦労したのでメモしておきます。

# 前提

- elastic beanstalkで負荷分散な環境
- the internet -> elb -> ec2（passenger standalone）なイメージ
- httpで来た通信はhttpsへ301リダイレクトさせる
- ただし、Elastic Load Balancerからはhttpにてhealthcheckが来るのでこれは受ける

# 設定

/etc/init.d/passenger
を見ると、--nginx-config-template している部分があるので、この読み込むファイルをebextensionsのfiles命令で書き換えてあげればよい。

### nginx-config-template

要はX-Forwarded-Protoがhttpかつ、ELBからのhealthチェック以外は301すればよい。

ただし、nginxの設定ファイルでは、if文は使えるが、if A かつ B という構文は使えないので苦肉の策として、変数を置き、文字列結合して判定している。

```
set $redirect ''; # リダイレクト判定用文字列

if ($http_x_forwarded_proto != https) {
    set $redirect 1;
}

if ($http_user_agent !~* ELB-HealthChecker) {
    set $redirect "${$redirect}1";
}

if ($redirect = 11) {
    rewrite ^ https://$host$request_uri? permanent;
}

```

ヘルスチェックするパスが決まっている場合は、locationディレクティブで判定してあげても良いかもしれない。
Spark on YARNのエラー対応メモ


## 概要

Sparkを始めとする分散処理では、普通のアプリケーション以上にエラー対応について考えることがあります。

- 特定のノードの問題なのではないか？
- ノード間・外部リソースの問題ではないか？
- どこから処理をやり直すべきか？
- もう一度処理を繰り返してもいいのか？
- 並列で動いているタスクはどうするのか？

などなど考えることがあります。

## 前提知識

### Sparkアプリのフェーズ

Sparkには以下のフェーズがあります。

- App
  - 一番大きな単位。
  - Sparkアプリが例外などで終了すると失敗となる。
  - 失敗すると最初からやりなおす。
  - デフォルトでは１回だけやりなおす。

- Job
  - SparkContext内で実行される処理（collect, reduce, saveAsTextfile）の単位
  - 内部では複数のTaskが実行される。
  - デフォルトではtaskが３回失敗するとそのJobは失敗となる。
    - `spark.task.maxFailures` で調整
  - 失敗しても他のJobには影響しない。

- Task
  - パーティション単位で実行される。
  - 失敗したらそのタスクと同じものが再試行される。

### RDDの冗長性

RDDの実体は、各レコードとそのレコードの生成方法を記したDAGで構成されます。
レコードの方を永続化していなければ、そのレコードが使われたり消滅した場合は、DAGをたどって再計算されます。

また、RDDのレコードはデフォルトで複数マシンに分散して冗長性を担保してくれるようです。

## 個人的ポリシー

- 処理は冪等にする。
  - どんなにしっかり例外処理を施しても、アプリ外の要因で再計算されるため。
- 何度も使うRDDは永続化する。
- リトライはしてもいいがたぶんあまり必要ない。
  - EMR上でクラスタを組んだ場合
  - 不安定な外部リソースに依存しない場合
- EMR内のクラスタに状態をなるべく持たせない。

## 強制終了の方法

ある処理で失敗した場合にアプリ全体を止めたい場合は `sc.cancelAllJobs()` を呼び出してあげればOKです。
Rails で schema_migrations テーブルのレコードを削除する

ActiveRecord::SchemaMigration というクラスが ActiveRecord::Base を継承している。
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/schema_migration.rb

こいつで、 CRUD のメソッドを呼んでやればよさそうと考えたが、`destroy` メソッドが発行する SQL がおかしい。(実行例の アダプタは oracle_enhanced を使用している。)

```irb
pry(main)> ActiveRecord::SchemaMigration.order(version: :desc).first.destroy
  ActiveRecord::SchemaMigration Load (0.9ms)  SELECT * FROM (SELECT  "SCHEMA_MIGRATIONS".* FROM "SCHEMA_MIGRATIONS"  ORDER BY "SCHEMA_MIGRATIONS"."VERSION" DESC ) WHERE ROWNUM <= 1
  SQL (1.7ms)  DELETE FROM "SCHEMA_MIGRATIONS" WHERE "SCHEMA_MIGRATIONS"."" = :a1  [[nil, nil]]
ActiveRecord::StatementInvalid: OCIError: ORA-01741: 長さゼロの識別子は無効です。: DELETE FROM "SCHEMA_MIGRATIONS" WHERE "SCHEMA_MIGRATIONS"."" = :a1
from stmt.c:82:in oci8lib_230.bundle
```

ちょっと調べてみると、  `primary_key` が常に `nil` を返すようになっている。

```rb
module ActiveRecord
  class SchemaMigration < ActiveRecord::Base # :nodoc:
    class << self
      def primary_key
        nil
      end
    end
  end
end
```

このメソッドを rails console 上で上書きしてやると、 `destroy` が呼べるようになった。

```rb
module ActiveRecord
  class SchemaMigration < ActiveRecord::Base # :nodoc:
    class << self
      def primary_key
        'version'
      end
    end
  end
end
```

```irb
pry(main)> ActiveRecord::SchemaMigration.order(version: :desc).first.destroy
  ActiveRecord::SchemaMigration Load (0.9ms)  SELECT * FROM (SELECT  "SCHEMA_MIGRATIONS".* FROM "SCHEMA_MIGRATIONS"  ORDER BY "SCHEMA_MIGRATIONS"."VERSION" DESC ) WHERE ROWNUM <= 1
```

ちなみに、 Rails 5 系のコードでは、次のように `"version"` を返すようになっているため、 CRUD のメソッドが直接呼べるようだ。

https://github.com/rails/rails/commit/57155064d135d67e0624d561c2badfe018b27a3a
Slack | 編集したコメントが反映されない？ 再編集のタイムラグに対策する。

# 問題

こういうコメントがある時。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/963b4501-ac53-59d0-0489-b806e666e37f.png)

文章を追記して。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/8bf2a034-07a9-4a72-b5b5-bf92a6ea1a97.png)

変更を反映 ( SaveChanges ) して、さらにその後一瞬で再編集 (上キー) しようとすると。。。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/db5cba9c-aa7b-36c5-f314-e9413c9594a9.png)

あれ、反映されてない！！
だがここで「Cancel」を押すと。。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/a0fe6f17-e8e9-29fb-bd01-30219fa776ff.png)

編集内容が反映されている。

# 理由

これはSlackの仕様で、編集を確定させてから反映までに、少しだけタイムラグがあるせいだ。
なのでそれが「反映」されるまでに「再編集」しようとすると、「編集前の状態」から再編集を始めてしまう。

ここでさらに「変更を確定」してしまうと、元の編集状態は失われてしまう。

対策としては、編集を確定した後は、少しだけ待ってから再編集を始めること。
間違って再編集してしまった時は「Cancel」を選んで抜けてから、さらに再編集を始めること。

(画面上で編集内容が反映された後ならOK)

# 環境

- Slack 1.1.2 (Mac)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
【ワンライナー】タイムスタンプが他と違うファイルを見つけ出す

例えば.warの展開ディレクトリ内のファイルを誰かに直接変更されてしまったらしい場合に、そのファイルを見つけ出すワンライナーです。（実際はコマンド2発に分かれていますが、、、）

通常であればファイルのタイムスタンプが揃っているはずなのに、何らかの理由で１ファイルだけタイムスタンプが変わってしまっている場合に使えるかと思います。

# コマンド１：タイムスタンプ別にファイルを集計する

```
ls -lR | egrep '^(r|w|x|-){7}' | awk '{print $6 " " $7 " " $8}' | sort | uniq -c | sort -r
```

# コマンド２：指定したタイムスタンプのファイルを表示する
```
targetDate="[タイムスタンプ]" && ls -lR | egrep '^(r|w|x|-){7}' | fgrep "${targetDate}" | awk '{print $9}' | xargs -L 1 find ./ -name | xargs ls -l | fgrep "${targetDate}"
```
※ [タイムスタンプ] の部分を、コマンド１で出力したタイムスタンプで置き換えてください。

# ちょっとした解説
パイプで区切られたコマンドごとに、やっていることを説明します

## コマンド１について
* __ls -lR__
    * カレントディレクトリ以下のファイルをすべて出力します。
* __egrep '^(r|w|x|-){7}'__
    * ファイル以外の情報を表す行を省きます（ディレクトリも省きます）
* __awk '{print $6 " " $7 " " $8}'__
    * タイムスタンプ部分を切りだします。
* __sort | uniq -c | sort -r__
    * タイムスタンプで集計し、多い順に（イレギュラーの可能性が高いものが下にくるように）並び替えます

## コマンド2について
* __targetDate="[タイムスタンプ]"__
    * タイムスタンプを複数回使うため、変数に保存します
* __ls -lR | egrep '^(r|w|x|-){7}'__
    * コマンド1と同様、カレントディレクトリ以下の全てのファイルを出力します
* __fgrep "${targetDate}"__
    * 指定したタイムスタンプのファイルのみを抽出します
* __awk '{print $9}'__
    * ファイル名のみを抽出します
* __xargs -L 1 find ./ -name | xargs ls -l__
    * ここからは出力にディレクトリ名をつけるための一工夫です。
    * 抽出したファイル名で一つずつ再度findし、カレントディレクトリからのパスを含めて出力します。
* __fgrep "${targetDate}"__
    * findだけだと別ディレクトリにある同名のファイルもヒットしてしまうため、再度タイムスタンプでgrepします。


ワンライナー作ろうとするといろいろと勉強になりますね。
lsコマンドだけではファイルがどのディレクトリにあるのかを表示できないのは新たな発見でした。
sslに関連するキーワードのメモ

# はじめに
SSLを勉強するにあたり、ネット検索をすると色々と情報があるものの、いまいち釈然としない内容の物が多いので、「自分のために」メモする

SSL証明書関連の話では、鍵、証明書、暗号化などのワードが氾濫しがちになるので、多少誤解があるかもしれないが、極力文言は制限して記述する。
（matobaaさんご指摘ありがとうございます）

# 知っておくべきこと
色々とキーワードが多い。特に拡張子などのアルファベット3文字。

すぐに忘れるのでここにメモしておく。

 - key

```
鍵データのこと。ここでは秘密鍵や公開鍵のことを指す。
中には pem/der などの拡張子を持つものもあるが、これはデータフォーマットのことで、鍵かどうかとは別。
```

 - pem

```
Privacy Enhanced Mail
エンコード方式のこと。（どのようにデータが詰まっているかを意味する）
データをビットに変換し、6ビットごとにまとめて、対応する文字に置き換える。（A-Z,a-z,0-9,+,/,=）で構成される。

同じように der というエンコード方式が使われることもある。
```

 - crt / cer

```
証明書ファイル。
実際のエンコード方式はファイルを開いてみないとわからない。
公開鍵と、その持ち主の情報などを「CAの秘密鍵」で暗号化したもの。
信頼されているCAの公開鍵で復号化できるため、改ざんされていないことが約束される。
有名なCAであれば、WebブラウザにはあらかじめCAの公開鍵が内蔵されているため、これを使って復号化する。
このことこからCAには高い信頼性が求められる。

オレオレ証明書は、このCAの鍵として自分の秘密鍵を用いたもの。
自分の鍵の証明に自分の鍵を使っている時点で、なんの信頼性もないことがわかる。
```

 - csr

```
Certificate Signing Request
CA(認証局)に証明書を発行してもらうために提出するファイル。
国名や組織名などの情報や、公開鍵も含まれている。
```
[CodeIQ]「レッド・アンド・ホワイト」問題をRuby(26)で解いてみた

## はじめに
CodeIQで出題されていた[「レッド・アンド・ホワイト」問題](https://codeiq.jp/q/2812)（by @riverplus さん）をRubyで解いてみました。

問題は次の通り。
>マス目が横に直線状に並んでいます。
マス目は左右にどこまでも続いているものとします。
マス目はすべて白色で塗られています。
このうちの 1 つを赤色で塗ります。
以降、次のルールに従って、マス目の色を塗り替えていきます。
 
>1 秒後、左右隣のマス目の色が白赤または赤白となるマス目を全て赤色で塗り、
そうでないマス目（つまり左右隣が白白または赤赤）を全て白色で塗ります。
以降、同様に、1 秒ごとに赤白でマス目を塗り替えていきます。　


まずは解き方を説明する前に、提出したコードを示します。

``` ruby
p 2**gets.to_i.to_s(2).count('1')
```

コードの手順としては、

1. 標準入力から自然数を読み込む
2. それを数値化する
3. それを二進数の文字列にする
4. その中から1が何個あるか数える（個数をcとする）
5. $2^c$が答えの数字

となります。
ようするに、関数$H(x)$を$x$の二進数と0とのハミング距離、$n$を標準入力に与えられた自然数とすると、**$2^{H(n)}$**が答えとなります。
これから、なぜこのように簡潔にコードを書けるか解説をしていきます。

## とりあえず、図示する
とりあず、問題に従って図示してみました。
![rule90ca.png](https://qiita-image-store.s3.amazonaws.com/0/72064/3bf762c0-5571-ebc2-5630-80dd579059e6.png)

なんかどこかで見たことありません・・・？

そうです！これは**シェルピンスキーのギャスケット**です！
（複雑系の人とかは**ルール90の1次元セル・オートマトン**とか呼んでるらしいです。）

そしてこれは、各行についてマス同士のすきまを詰めることで、
偶数マスを白、奇数マスを赤にした**パスカルの三角形**と見ることもできます。
参考：[「ずれたセルオートマトン・パスカルの三角形・フラクタル」 - roombaの日記](http://roomba.hatenablog.com/entry/2015/02/28/010508)

パスカルの三角形の上からn番目、左からk番目のマスは、二項係数${}_n \mathrm{C} _k$に対応しています。

また、${}_n \mathrm{C} _k$は、式$(1+x)^n$の展開式の項$x^k$の係数でもあります。

つまり、最終的に私たちは${}_n \mathrm{C} _k$の偶奇を確かめ、奇数の個数を数えれば良いことになります。

## で、その偶奇とやらはどう確かめるの？

はい。${}_n \mathrm{C} _k，k=0～n$の偶奇を確かめれば簡単ですね！

・・・

これではnが増えたらトンデモないことになります。。。オーダーは$O(n^2)$ですからね

ここでは先ほど示した$(1+x)^n$の展開式の項$x^k$の係数の偶奇を確かめてみます。

そのためにまず、$n$の2進数の桁数をg、その$i$桁目数を$d_i$とすると、

``` math
n=\sum_{i=1}^{g} b_i， b_i = \begin{cases} 0 & (d_i=0) \\ 2^{i-1} & (d_i=1)\end{cases}
```

と表せることを利用し、

``` math
(1+x)^n=\prod_{i=1}^{g} (1+x)^{b_i}
```

と書き換えます。
ここで、私たちが興味があるのは，係数の偶奇についてなので、
係数の偶奇が同じ多項式を合同とみなすと（このことを「合同をとる」と呼ぶことにします）、

``` math
\begin{align}
c_i &= (1+x)^{b_i} \\
 &\equiv \begin{cases}
  1 & (b_i=0) \\
  1+x & (b_i=1)
 \end{cases}
\end{align}
```

より、

```math
\begin{align}
(1+x)^n &= \prod_{i=1}^g (1+x)^{b_i} \\
 &\equiv \prod_{i=1}^g c_i
\end{align}
```

と書けます。

このように変形していくことで、最終的に$(1+x)^n$の合同をとった多項式の項数を数えれば答えが導けることになります。

それでは、$\prod_{i=1}^g c_i$を乗算する際の**計算し終わった多項式（$F_i=\prod_{j=1}^{i} c_j$）の項数**に注目してみます。

$F_i$の項数が増える要因は何なのでしょうか。$c_i$に何か秘密がありそうですよね。

実は、$c_i$をかけた際、$L_i$の項数は$2^{d_i}$倍（これは$c_i$の定義を見てみるとわかると思います）、
すなわち$d_i$が1である度に2倍になるのです。

ここまで書くと答えが見えてきますね。

そうです。まさに冒頭で述べた$H(n)$は、ちょうど**$\sum_{i=1}^{g} d_i$**となるのです。

よって、この問題の答えは、

``` math
\prod_{i=1}^g 2^{d_i} = 2^{\sum_{i=1}^{g} d_i} = 2^{H(n)}
```

となります。

これでオーダーは$O(\log n)$になりました！めでたしめでたし。

参考：[2015年東大前期入試理系数学　大問５ - ほのぼの数学頑張ろう～](http://mathnegi.blog.fc2.com/blog-entry-236.html)

参考を見てもらえば分かりますが、
この問題は2015年東大前期入試理系数学 大問５と似た問題なのでした。おしまい

## [おまけ] ちょっとゴルフやってみたい

出来心でコードゴルフをやってみました（笑）

``` ruby
p 2**("%b"%gets).count(?1) # Ruby(26)
```

もう少し縮められそうな気がしますが、気のせいってことにしておきます。
renice は値が大きい方が優先低い


タイトルのまま。いつも忘れてしまうので。

nice いじりたい時って、重たい処理が CPU ブン回してて、ちょっと他のアプリ起動させたいって時に、重たい処理の優先度を *下げ* たいのに nice を減らしてしまってニッチもサッチもいかなくなるところまでが通常のコンボ。

```
$ renice -n +10 <pid>
```

な感じで。

普段使ってる htop でも F7/F8 に renice の -/+ があるのに、どっちにが優先落とすんだっけ？となるので。
アッカーマン関数の実装。

アッカーマン関数のC言語による実装を示します。
#実装例
call_numにackermann関数がどれだけコールされたか記録しています。

```C:ackermann.c
#include<stdio.h>
int call_num = 0;

int main(void) {
	int a;
	int n, m;
	for (n = 0; n <= 3; n++) {
		for (m = 0; m <= 3; m++) {
			call_num = 0;
			a = ackermann(n, m);
			printf("ackermann(%d, %d) = %d\n", n, m, a);
			printf("call_num = %d\n", call_num);
		}
	}
	return 0;
}

int ackermann(int n, int m) {
	call_num++;
	if (n == 0)
		return m + 1;
	if (m == 0)
		return ackermann(n - 1, 1);
	return ackermann(n - 1, ackermann(n, m - 1));
}

```
SpriteKit を用いて タモさん を神と崇める feat. Playground

# はじめに

- 前回の続きです

[SpriteKit を用いて 田代まさしを左右に動かす feat. Playground](http://qiita.com/r-fujiwara/items/31239bcc38d60fab652f)

# アニメ

- Preview.app で適当に作成した画像をループする

![tamori.gif](https://qiita-image-store.s3.amazonaws.com/0/46303/dda5874b-1436-1fae-6b34-76a450146d32.gif)


# コード

```swift:タモさん.swift
//: Playground - noun: a place where people can play

import SpriteKit
import XCPlayground

struct Constants {
    static let TamoriImages = ["tamori", "tamori1", "tamori2", "tamori3"]
}

let sceneWidth = 500
let sceneHeight = 500

internal var tamori: SKSpriteNode!

func repeatTamosan(scene: SKScene) -> Void {
    var playerTexture = [SKTexture]()
    
    for imageName in Constants.TamoriImages {
        let texture = SKTexture(imageNamed: imageName)
        texture.filteringMode = .Linear
        playerTexture.append(texture)
    }
    let playerAnimation = SKAction.animateWithTextures(playerTexture, timePerFrame: 0.2)
    let loopAnimation = SKAction.repeatAction(playerAnimation, count: 10)
    
    tamori = SKSpriteNode(texture: playerTexture[0])
    tamori.position = CGPoint(x: 250, y: 250)
    tamori.runAction(loopAnimation)
    
    scene.addChild(tamori)
}

let skView = SKView(frame: CGRect(x: 0, y: 0, width: sceneWidth, height: sceneWidth))
let skScene = SKScene(size: CGSize(width: sceneWidth, height: sceneHeight))

repeatTamosan(skScene)
skView.presentScene(skScene)
XCPShowView("Live SKView: Iitomo", view: skView)

```

# Playground

- 今回は無しで...

# Reference
Hubotのローカル実行時に、ユーザー名/IDを指定する方法



```coffee
module.exports = (robot) ->
  robot.respond /path/i, (msg) ->
	msg.message.user.name
	msg.message.user.id
	...
	
```
のように、メッセージを送ってきた相手の名前やIDを取得するような処理をローカルで確認したい場合に、任意の名前/IDを指定する方法です。

# 名前を指定
```bash
HUBOT_SHELL_USER_NAME='hoge' bin/hubot
```

# IDを指定
```bash
HUBOT_SHELL_USER_ID='xxx' bin/hubot
```

詳しくは本家ドキュメントの[こちら](https://hubot.github.com/docs/adapters/shell/#configuring)
Ruby on rails で悩んだgem, bundler, rbenv

Ruby on railsを学び始めたばかりのとき、最初に色んなコマンドが出てきて悩みました。触りながらやっと整理できてきたので、まとめておきます。

#gem
Rubyは言わずと知れたプログラミング言語。そこに必ず出てくるのがgem。
まずgemはRubyに標準で備え付けられているパッケージ管理。Rubyに関するツール等を簡単にインストールできます。
プログラミング言語にパッケージ管理が備わっていると言うのがすぐに理解できなかったのですが、最近はそれが普通なのでしょうか？しかし分かってしまえばとても便利で、Rubyをインストールして、他に必要なアプリをgemを使って入れられるので、とても便利です。別のインストーラがいらないというのが便利です。

#bundle
その次がbundle。これもパッケージ管理のような感じがするのですが、実際にはgemを管理するもののようです。Gemfileにどのgemを使うかを記載しておけば、一括でgemをインストールできるというもの。バージョンの記載もできて、開発環境を作る時もGemfileがしっかり記載されていれば簡単に作成できます。
またアプリを提供するときに、必要なgemを記載しておけばアプリの起動に必要なものが入るため、インストーラの役割に近い形でも使えます。
bundle execのコマンドで、実行すればGemfileで指定してあるバージョンのgemを使って実行してくれるので、バージョンが変わったから動かなくなったという心配もありません。

#rbenv
rbenvはRubyのバージョンを複数インストールし、切り替えながら使用できるというもの。bundleを使ってのバージョンに合わせて、Rubyのバージョンも管理できるため、バージョンによる整合性を簡単にとることができます。


railsを始めようと思っても上記のコマンドがたくさん出てくる、しかも解説サイト等ではbundleやrbenvを使っていたり、使っていなかったり、何が何だか分かりません。
この辺整理ができないとどんどん深みにはまっていくので、整理の助けになれば幸いです。
私自身もまだ勉強し始めなので、間違え等ありましたら指摘いただければ幸いです。
Androidの開発で迷った時に見るブログの記事

# LayoutInflatter.inflater の第2パラメータと、第3パラーメータについて

```
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
```

* http://y-anz-m.blogspot.jp/2012/04/android-viewgroup.html
* https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

第2引数は、 作成したViewをaddする予定の ViewGroup, 第3引数は、inflate した時点で root に addView するかどうか。
mRootLayout というメンバーを持っていたとして、下記6パターンある

1. inflate(R.layout.hoge, mRootLayout, true)
返り値の View は、mRootLayout
基本的にはこのメソッドを使用して、View を inflate する。

2. inflate(R.layout.hoge, mRootLayout, false)
返り値の View は、R.layout.hoge の root
mRootViewに のちに addView が必要。RecycleView などで、View を Attach する予定の ViewGroup を指定して、 View を作る必要があるが、View を作成した時に、View を root に Attach したくない場合に使用する.

3. inflate(R.layout.hoge, null,  true)
4. inflate(R.layout.hoge, null, false)
返り値の View は、R.layout.hoge の root
View を Add するときに、LayoutParam の調整が効かず、xml に指定した Layout 情報が無視される。
Warning もでるので基本的に使用しない。
attachToRoot が true なのに、root が nullなので意味がない？

5. inflate(R.layout.hoge, null)
inflate (int resource, ViewGroup root) は、内部で、inflate (resource, root, root != null ) を呼んでいるので、
4 と同じ

6. inflate(R.layout.hoge, mRootLayout)
inflate (int resource, ViewGroup root) は、内部で、inflate (resource, root, root != null ) を呼んでいるので、
1 と同じ

# ActionBar/ToolBar の Up と BackKey の Back をどのように実装するか迷ったら
[Android　Up の振る舞いパターンを実装する](http://y-anz-m.blogspot.jp/2012/04/androidup.html)

# ActionBar/ToolBar のカスタマイズで迷ったら
[Toolbarをカスタマイズする際にどこをいじればよいのか](http://woshidan.hatenablog.com/entry/2015/11/03/225126)
[AndroidのToolBar（新しいActionBar）メモ](http://qiita.com/kobakei/items/f17019f8b0a88c8e57f4)
[[Android]5.0Lollipopで追加されたToolbarでカスタム実装(戻るボタン・検索ボタンを追加)するところまで](http://to-developer.com/blog/?p=2022)
[ActionBar の withText で文字がでる条件はどこで決まる？](http://y-anz-m.blogspot.jp/2012/03/androidactionbar-withtext.html)


# Fragmentのコツとか
[【Android】Fragmentを使うときのコツとか色々](http://qiita.com/HideMatsu/items/ddf640899cbe1b2027ed)
[AndroidStudioの標準デザインパターンで分かるFragment入門](http://qiita.com/Hoshi_7/items/bee2588397348a4e0105)
[ActionBar の withText で文字がでる条件はどこで決まる？](http://y-anz-m.blogspot.jp/2012/04/android-fragment-fragmenttransaction.html)

# Fragment add/remove/replace ってどう使う？
[Android FragmentTransaction のまとめ](http://y-anz-m.blogspot.jp/2012/03/androidfragmenttransaction_14.html)

# CoordinatorLayoutってなんだろ。ウニョウニョ出たり入ったりしてよくわからんって時は...
[AndroidのCoordinatorLayoutを使いこなして、モダンなスクロールを実装しよう](http://techblog.yahoo.co.jp/android/androidcoordinatorlayout/)

# Resource の文字列で String.format 的な引数入れたいとか,改行とかどうするんだっけとか
[複雑な文字列をリソースで定義する](http://y-anz-m.blogspot.jp/2011/03/android-xml.html)

# RecyclerView関連
## RecyclerView vs ListView
[Master of RecyclerView](http://www.slideshare.net/yanzm/master-of-recyclerview)
## RecyclerView に divider (セルの区切り線）をつけたい
[RecyclerViewで行間に区切り線を表示する](http://qiita.com/wasabeef_jp/items/6399432b899cb5613fb1)
CodeIgniterのflashdata で存在しないキーの返り値はfalse

flashdataとは、次のサーバリクエストだけで利用可能で、その後自動的に削除されるセッションデータ。

``` php
//セッションの初期化
$this->load->library('session');

//データを保存する
$this->session->set_flashdata('item', 'value');

//データを取り出す
$itme_data = $this->session->flashdata('item');

//前のページでsetされたデータを次のページに持ち越したい時
$this->session->keep_flashdata('item');

```

そこで、存在しないキーで取得した場合は、

``` php
$tmp= $this->session->flashdata('hoge');
var_dump($tmp);//bool(false)
```

nullかなとも思ったけど、実際はfalseでした。
bool値を直接格納するのはやめたほうが良いね。


また、存在しない値で、keepを実行してもエラーなく実行できた。

```php
$this->session->keep_flashdata('hoge');
```
BootstrapのCarouselをスワイプでも操作できるようにする

個人的には、カスタマイズしやすいので、Bootstrapのcarouselは良く使う。

スマホはスワイプしたいという要望も多いので。


```js
$(function(){
        $('.carousel').carousel();
        $('.carousel').on('touchstart', touchStart);
        $('.carousel').on('touchmove' , touchMove);

        function touchStart(e) {
            var pos = position(e);
            carousel.attr('data-touchpos',pos.x);
        }
        function touchMove(e) {
            var pos = position(e);
            if( pos.x < $('.carousel').attr('data-touchpos') ){
                $('.carousel').carousel('next');
            }else{
                $('.carousel').carousel('prev');
            }
        }
        function position(e){
            var x = e.originalEvent.touches[0].pageX;
            var y = e.originalEvent.touches[0].pageY;
            x = Math.floor(x);
            y = Math.floor(y);
            var pos = {'x':x , 'y':y};
            return pos;
        }
    });
```

もっといい方法もありそうな気がする。
VS CodeをUnityで使う（OSX）

メモ。
まだ、あまり使ってないけど、軽いし、コード補完、デバッガとかも普通に使えて、Mono Developより全然よさそう。


# 1. VS Code をインストールする


# 2. VS Codeに C#の機能を追加する

OSX、Linuxでは、C#のコードはいライティングとかが、デフォルトで入ってないみたい。（[ここ](https://github.com/Microsoft/vscode/issues/5424)に書いてた）

[ここ](https://github.com/OmniSharp/omnisharp-vscode#support-for-csproj-and-mono-on-os-x-and-linux)に従って、Monoをインストールして、[Built-in Omnisharp](https://marketplace.visualstudio.com/items?itemName=ms-vscode.omnisharp) をVS Codeに入れる。

ちなみに、[C#](https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp)っていうオフィシャルのプラグインもあるけど、こっちだと、Unityのライブラリとかのコード補完が効かなかった。


# 3. Unity と VS Codeを連携する

[ここ](https://code.visualstudio.com/Docs/runtimes/unity)に書いてる。
いろんな人がプラグインを作ってくれてて、結構簡単にできる。
ExpressでShift-JISのCSVを返す

ExpressでCSVをダウンロードさせてExcelで開かせようということになりました。

まずUTF-8な環境のNode.jsなのでUTF-8でどうにかできないかと思っていると、以下の記事でUTF-16LEのTSVのファイルの拡張子がcsvならエクセルで開けるとの情報を得ました。

[Win/Mac どちらの Excel でも正しく開ける Unicode な csv の出力方法](http://qiita.com/mashiro/items/0d0b9bbb0f4a6cca620c)

UTF-16ならBufferで扱えるし、Shift-JISよりはいいじゃないかと思ったら、古いExcelでは文字化けしてしまいました。

苦悩の末Shift-JISのCSVを出力するかと思い、次の記事を参考にiconvで変換しようと試みました。

[Node.js (Express) で伝統的な CSV を出力する](http://null.ly/post/19444140566/nodejs-express-%E3%81%A7%E4%BC%9D%E7%B5%B1%E7%9A%84%E3%81%AA-csv-%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)

何か文字化けしてダメだったので、今回は上2つでダメな場合どうしたかというのをメモ書きして置こうと思います。

## 文字コード変換

node-iconvがなぜか文字を正常に変換してくれなかったので、Shift-JISに特化したモジュールを使うことにします。

[narirou/jconv](https://github.com/narirou/jconv/blob/master/READMEja.md)

インストールなどもこちらに従ってください。

## Expressの記述

Expressでsend等でデータを返すとContent-Typeのcharsetがutf-8に必ず書き換わっているようなので、上の記事と同じくwrite等を使います。

jconvと組み合わせて次のようにしました。

また今回はExcelで開くことを考慮し、Excelで中のデータが必ず文字列として表示できるよう、`="データ"`という感じでデータをまとめます(普通のCSVにしたい場合は=を削ってください)。

```js
const jconv = require( 'jconv' );

... 省略 ...

router.get('/path/to/download/csv', (req,res,next) => {
  const filename = '日本語を含むファイル名';

  // 日本語UTF-8のファイル名をダウンロードするファイル名として使う。
  res.setHeader( 'Content-disposition', 'attachment; filename*=UTF-8\'\'' + encodeURIComponent( filename + '.csv' ) );

  // Content-Typeをcsvにして文字コードもShift-JISにする。
  res.setHeader( 'Content-Type', 'text/csv; charset=Shift_JIS' );

  const data = [
    [ 'CSV', 'の', 'データ' ],
    [ 'まぁ', 'こんな', '感じで' ],
  ];

  const str = data.map( ( v ) => {
    // 普通のCSVにしたい場合は、ここの2個所の=を削る
    return '="' v.join( '",="' ) + '"';
  } ).join( "\r\n" );

  res.write( jconv.convert( str, 'UTF8', 'SJIS' ) );
  res.end();
});
```

これでめでたくShift-JISのCSVを入手できましたとさ。

## 終わりに

* ふぁっきゅーExcel
* Win/Macでのファイル読み込みくらい同じ挙動にしてくれ……orz
* 後UTF-8とかでも読み込んでorz
GPUImageの連結状況をDumpする


GPUImageで色々連結したり外したりしまくっていると、何がどうなっているか分からなくなる。
デバッグ用にDumpする仕組みを作った。

##Dumpするやつ

```swift:GPUImageDumper
protocol DumpName {
  var dumpName: String? { get set }
}

extension GPUImageOutput {
  func dumpTargets() -> String {
    return ((self as? DumpName)?.dumpName ?? String(self)) + "\n" + dumpTargets("")
  }

  private func dumpTargets(prefix: String) -> String {
    let maxIndex = targets().count - 1
    var str = ""
    for (i, child) in targets().enumerate() {
      let last = (i == maxIndex)
      let name = (child as? DumpName)?.dumpName ?? String(child)
      str += prefix + (last ? "└" : "├") + name + "\n"
      if let o = child as? GPUImageOutput {
        str += o.dumpTargets(prefix + (last ? "　" : "│ "))
      }
    }
    return str
  }
}

class GPUImageRootInstances {
  static let sharedInstance = GPUImageRootInstances()
  private var rootInstances = [GPUImageWeakInstance]()
  
  func append(instance: GPUImageOutput) {
    for i in rootInstances {
      if instance === i.instance { return }
    }
    rootInstances.append(GPUImageWeakInstance(output: instance))
  }
  
  func dumpAll() -> String {
    var str = ""
    for i in rootInstances {
      if let dump = i.instance?.dumpTargets() {
        str += dump + "\n"
      }
    }
    return str
  }
}

class GPUImageWeakInstance {
  weak var instance: GPUImageOutput?
  
  init(output: GPUImageOutput) {
    instance = output
  }
}
```

これで、`GPUImageRootInstances.sharedInstance.append`に
GPUImageVideoCameraとかGPUImagePictureとかを渡せば準備OK。

GPUImageRootInstances.sharedInstance.dumpAll()で出力される。

そのあたりをDumpNameプロトコルに準拠させてあげると、設定した名前で出力させられる。
BeagleBoneBlack Python Lチカ


今回はLチカと圧電ブザーをpythonでやってみます。

##Lチカ

以前BonescriptでLチカをやったのですが、今回pythonでLチカをやってみたいと思います。
割と簡単です。
ターミナルにて以下のとうりに行ってください。ポート番号は使用するポートに応じて変えてください

```
$ python

>>> import Adafruit_BBIO.GPIO as GPIO
GPIO.set

>>> GPIO.setup("P9_11", GPIO.OUT)
>>> GPIO.output("P9_11", GPIO.HIGH)
>>> GPIO.output("P9_11", GPIO.LOW)
>>> exit()
```

ファイルに記述して実行。

```light.py
1 import Adafruit_BBIO.GPIO as GPIO
2 import time
3
4 GPIO.setup("P9_11", GPIO.OUT);
5 GPIO.output("P9_11", GPIO.HIGH);
6 time.sleep(3);
7 GPIO.output("P9_11", GPIO.LOW);
```



##圧電ブザー
参考にさせてもらったサイトを載せておきます！

https://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/using-the-bbio-library


https://github.com/adafruit/adafruit-beaglebone-io-python

pythonは以下のコードで鳴ります。
便利なモジュールがあったものです...

もしないと言われた場合はこちらのURLの通りにやってみてください

https://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/installation-on-ubuntu

```
import time
import Adafruit_BBIO.PWM as PWM

#PWM.start("P8_13", 50, 1000, 0)
PWM.start("P8_13", 50) #50 is duty_cycle???
#PWM.set_duty_cycle("P8_13", 25.5)
PWM.set_frequency("P8_13", 1000)
time.sleep(3)

PWM.set_duty_cycle("P8_13", 2)
time.sleep(1)

PWM.stop("P8_13")
PWM.cleanup()
```
Zabbix で proc.num がどのように値を取得しているのかを調べた。Linuxの場合

# 概要

zabbixでプロセスの数を監視しようとした時に、
proc.numの最初の引数に渡すものと、第４引数に渡すものとの違いがあるようなので、
どのように調べているのかを調べた。

# 結論

zabbix 2.2.12 のlinuxでは、

```
/proc
```

以下のすべてのプロセスをループでチェックしている。

linuxのプロセスを調べているのは以下のソースコードのようである。

```
src/libs/zbxsysinfo/linux/proc.c
```


# 経緯

zabbixで特定のプロセスの数を調べたかったので、まずは以下を参考にしてみた。

* [1 Zabbixエージェント [Zabbix Documentation 2.2]](https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/zabbix_agent)

引数を１つだけにして、ps aux ででてきた値をそのままいれてみたが、うまく取得できなかった。

更に調べて

* [proc.numで指定するプロセス名について | ZABBIX-JP](http://www.zabbix.jp/node/3126)

ここをみて、特定のプロセス数を監視できるようになった。
詳しくは、上のページをみてもらったほうが良いが、
ざっくりまとめると、以下のようになるかなと思う。

* 第１引数に渡すのは、 ps -e の出力
* 第４引数に渡すのは、 ps -ef の出力
 
zabbixでは、実際どうやって調べているのか気になったので、調べてみた

最初、src/zabbix_agent 以下だけをしらべてみたが、みつからなかったので、
src において

```
grep -r "proc.num"
```

などとして、探していき
最終的に以下のファイルにたどりついた

```
src/libs/zbxsysinfo/linux/proc.c
```

やっていることは、

```
/proc
```

以下をすべて調べているようである。
どのように調べているかはソースを見てもらった方がよい。


## 参考

```
proc.num[nginx]
```
AWS EC2を踏み台にして社内PCへ外から接続する。


ポートフォワーディングを使います。
参考：http://u0sa0.hateblo.jp/entry/2014/03/22/230201

模式図：
outside pc（社外） ------- remote ec2 ------- target pc（社内）

1.target pcからremoteのec2へ下記のコマンドでポートをくっつけるssh（ポートフォワード）を実施して接続を維持
以下をtarget pc上で実行：
ssh -i path/to/key -Rremote_local_port:target_global_ip:target_port remote_global_ip
--例：ssh -i ec2key.pem -R8888:1.1.1.1:22　（target pcの22ポートがremote pcの8888ポートへくっつく）
path/to/key: ec2への接続に使う鍵ファイル (.pem file等)
remote_local_port: target PCのportとくっつけるec2のport (8888等)
target_global_ip: target PCのグローバルIP（ifconfig等で確認）
target_port: 指定したremote PCのportへくっつけるtarget PCのport（sshなので基本22）
remote_global_ip: remote ec2のグローバルIP（aws ec2 consoleで確認）
参考:http://qiita.com/osuo/items/1fe9d6db2f5534440242
　　http://u0sa0.hateblo.jp/entry/2014/03/22/230201

2.outside pcよりec2を経由して、target pcへsshする
以下をoutside pcよりsshして接続したec2上で実行：
ssh username@localhost -p remote_local_port
username:target pcで接続するユーザー名
MySQL5.6が起動しない時

yumでMySQL5.6を入れて早速動かしてみたら早速[FAILED]という文字列に出くわす。

```text:MySQLの起動
[XX:XX:XX][root@test-web ~]# /etc/init.d/mysqld start
MySQL Daemon failed to start.
Starting mysqld: [FAILED]
[XX:XX:XX][root@test-web ~]#
```
# ログを見てみよう

## ログが出力される場所を探す

そもそものMySQLの設定のあるファイルがどこかを探してみよう。

```text:ログが出力される場所を探す
[XX:XX:XX][root@test-web ~]# mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 
[XX:XX:XX][root@test-web ~]# 
```

だいたい一番**左**に表示されているのが設定ファイルの場所になる。
なので今回は'/etc/my.cnf'を見てみることにする。

```/etc/my.cnf
log-error=/var/log/mysqld.log
```
なるほど/var/log/mysqld.logにログが出力されるらしいので[FAILED]になった原因のエラーを探してみる。

# [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

このエラーはmy.cnfに以下の設定を加えると解決できる。

```my.cnf
[mysqld]
explicit_defaults_for_timestamp = 1
```

## ⚠注意
くれぐれも[mysqld]の下に記述すること。
なんとなく末尾に追記〜なんてやっていると[mysqld_safe]の下に書いてしまっていて一向に動かないなんてことがある。

## MySQLの再起動

```text:MySQLの再起動
[XX:XX:XX][root@test-web ~]# /etc/init.d/mysqld start 
Starting mysqld: [  OK  ]
[XX:XX:XX][root@test-web ~]# 
```
これで[OK]が表示されれば大丈夫👍
更にエラーが出ている場合は引き続きログの確認を繰り返す。

---以下発生したエラーとその対応について記載---

# Error: Fetch of persistent statistics requested for table "example_db"."example_table" but the required system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.

このエラーは恐らく、以前にMySQLを立ち上げて、DBを作成したことがある場合に起こっている。
今回の場合、"example_db"というDBを作成したことがある、ということになる。
それで、DBを作成するとDB名のディレクトリがMySQLのディレクトリ内にできて、それが悪さをしているらしい。

## 該当箇所を探す

```text:該当箇所を探す
[XX:XX:XX][root@test-web ~]# find / -name 'example_db*' 
/var/lib/mysql/mysql/example_db
[XX:XX:XX][root@test-web ~]# 
```

## 問題が無ければ消す。問題があればバックアップを取っておく。

(自分の場合は「またDB作り直せばいいやー」ということで消してしまったので、バックアップを取っておいたところでどうやってDBを復元するかは不明だったり...)
どのみちMySQLのディレクトリ内にrenameをした状態で残してもエラーが出たので、一旦別の場所に置いてから以下コマンドで削除を行う。

```text:該当ディレクトリの削除
[XX:XX:XX][root@test-web ~]# rm -f /var/lib/mysql/mysql/example_db
[XX:XX:XX][root@test-web ~]# 
```

# [ERROR] InnoDB: space header page consists of zero bytes in data file ./ibdataX もしくは [ERROR] InnoDB: Cannot create ./ib_logfileXXX

このエラーは既にibdataXやib_logfileXXXが存在している時に発生する。

## ディレクトリの場所を探す

ibdataXの場合

```text:ディレクトリの場所を探す
[XX:XX:XX][root@test-web ~]# find / -name 'ibdataX*'
/var/lib/mysql/ibdataX
[XX:XX:XX][root@test-web ~]# 
```

## 削除

そのまま削除で問題は無いけど、心配な場合はバックアップを取っておく。

```
[XX:XX:XX][root@test-web ~]# rm -f /var/lib/mysql/ibdataX -r
[XX:XX:XX][root@test-web ~]# 
```