OmniAICreator/Qiita-1.07M huggingface dataset:
railsにslimを導入し、erbファイルをslimファイルに一括変更する方法


## 前提
viewをよりスッキリ描く方法として、slimを導入するサイトが増えてきています。これから導入したくても、すでにerbファイルが多くて、導入できないよ。。という方に向けて、簡単に導入する方法をまとめてみました。

## slimとは
- 拡張子が.slim
- インデントが非常に重要
- インデントでHTMLファイル内の構造を構築し、必要最小限のコードで書くことができる
- 既存のerbファイルと比べてスピードが速い

## slimとerbのコードの違い

```index.html.erb
<h1>テスト一覧</h1>
<% @tests.each do |test| %>
  <%= test.name %>
  <%= test.content %>
  <%= link_to 'Edit', edit_test_path(test.id) %>
  <%= link_to 'Destroy', test_path(test.id), method: :delete, data: { confirm: 'Are you sure??' } %>
<% end %>
```

```index.html.slim
h1 テスト一覧
- @tests.each do |test|
  = test.name
  = test.content
  = link_to 'Edit', edit_test_path(test.id)
  = link_to 'Destroy', test_path(test.id), method: :delete, data: { confirm: 'Are you sure??' }
```


## slimコードの特徴
- ```< >や<% %> ```などのカッコはすべてとりはらわれます。
- ```<%= %>```は、slimだと```=```で代用できます。
- ```if文やeach文```などの先頭には、```-```を使用します。また、```end```は必要ありません。


## railsにslimを導入する方法
Gemfile内に以下のコードを追加し、```bundle install ```をしてください。

```
gem 'slim-rails'
```

これで、railsプログラム内で、slimファイルを作成し、使用することが可能になります。

## 既存のerbファイルをまとめてslimファイルに変える方法
以下のgemをGemfileに追加し、```bundle install```してください。

```
gem 'html2slim'
```
これで、erbファイルをslimファイルにする準備が整いました。
このあと、以下のコードをコマンドラインで打つことで、erbファイルをslimファイルに変え、ファイルの中身もslimのコードに書き換えてくれます。

```
for i in app/views/**/*.erb; do erb2slim $i ${i%erb}slim && rm $i; done
```

### 注意点
- ```app/views/**/*.erb```この部分を変えたいファイルの場所に変え、使用してください。
- ディレクトリ以下を一括変更をした場合、そのディレクトリ以下のすべてのファイルが変更加えられるので、一応githubで管理しつつ行いましょう。
Excel2013 > BADUI > 申し訳ございません。同じ名前のブックを同時に開くことはできません。

```txt:動作確認
EXCEL 2013
```

異なるフォルダにある同じ名前の.xlsxファイルを開けない。

> 申し訳ございません。同じ名前のブックを同時に開くことはできません。


Sublime Textだとフォルダ名付きで同時に開くことはできる。

他のソフトでもたいてい同時に開くことはできたかと思う。

<hr>
異なるファイルで同じシートが含まれると扱いは難しいかもしれないが、別ウィンドウで開く、などの対応はできないものだろうか。
SwiftでAppleScriptを使う方法


##AppleScriptの返り値がStringの場合

```swift
import Cocoa
let appleScript = "tell application \"iTunes\"\n"
	+ "set trackName to name of current track\n"
	+ "return trackName\n"
	+ "end tell"
var error: NSDictionary?
if let scriptObject = NSAppleScript(source: appleScript) {
	if let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError(&error) {
		print(output.stringValue) // Optional("TrackName")
	}
	if error != nil {
		print(error)
	}
}
```

##AppleScriptの返り値がListの場合
```swift
import Cocoa
let appleScript = "tell application \"iTunes\"\n"
	+ "set trackName to name of current track\n"
	+ "set trackArtist to artist of current track\n"
	+ "return {trackName,trackArtist}\n"
	+ "end tell"
var error: NSDictionary?
if let scriptObject = NSAppleScript(source: appleScript) {
	if let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError(&error) {
		print(output.descriptorAtIndex(1)?.stringValue) // Optional("TrackName")
		print(output.descriptorAtIndex(2)?.stringValue) // Optional("ArtistName")
	}
	if error != nil {
		print(error)
	}
}
```

`descriptorAtIndex`が`1`から始まることに注意
TypescriptでaddEventListener時のEventTarget型ではまった

Typescriptでイベント発生元の情報を取りたい時に、Javascriptのノリで書いていたら怒られた
具体的には下記
inputのvalueをとろうとしたら、んなもんねぇよ！と怒られた

```ts:あれ・・・valueがいない・・・
var element = document.createElement('input');
element.value = 'test';
element.addEventListener('click', function(event: MouseEvent) {
	alert(event.target.value); // Property 'value' does not exist on type 'EventTarget'.
}, false);
element.click();
```

EventTargetにはHTMLElementが必ずしも来るわけでないらしい
https://developer.mozilla.org/ja/docs/Web/API/EventTarget
> Element, document, and window are the most common event targets, but other objects can be event targets too, for example XMLHttpRequest, AudioNode, AudioContext, and others.


targetにHTMLElementが来る用のinterfaceを用意して解決した

```ts:欲しいHTMLElementを指定したinterface
interface HTMLElementEvent<T extends HTMLElement> extends Event {
	target: T;
}

var element = document.createElement('input');
element.value = 'test';
element.addEventListener('click', function(event: HTMLElementEvent<HTMLInputElement>) {
	alert(event.target.value); // 補完できるﾔｯﾀｰ
}, false);
element.click();
```

[Demo](http://www.typescriptlang.org/Playground#src=interface%20HTMLElementEvent%3CT%20extends%20HTMLElement%3E%20extends%20Event%20%7B%0A%09target%3A%20T%3B%0A%7D%0A%0Avar%20element%20%3D%20document.createElement('input')%3B%0Aelement.value%20%3D%20'test'%3B%0Aelement.addEventListener('click'%2C%20function(event%3A%20HTMLElementEvent%3CHTMLInputElement%3E)%20%7B%0A%09alert(event.target.value)%3B%0A%7D%2C%20false)%3B%0Aelement.click()%3B%0A)
pepper　起動トリガーの条件

ペッパーのアプリを作成した後に条件をつけて起動させる方法を模索しています。

内容は、起動トリガーで('Launchpad/Minute' == 5) ように何分に起動するはわかるのですが、毎日１０分おきに起動するとかにする場合、または、平日と祝休日を別にするなどとする場合の起動トリガーの記載方法がわからないのですが何方かご伝授していただけないでしょうか
宜しくお願いします。
全角カナから半角カナの変換 (mac)

nkf を使う。
`nkf -wx -Z4 --overwrite ./**/* `
x をつけないと元々ノ半角カナガ全角カナになってしまう。

句読点なども半角になってしまうのは困ったので
`grep -rl "､" . | xargs sed -i "" "s/､/、/g`
などとしてしまった。対象が多いとこれだと対処しきれない...。
CentOS-6.7にリポジトリを追加してPHP-5.6をインストールしたメモ

```bash

cat /etc/redhat-release
CentOS release 6.7 (Final)

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-11.ius.el6.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
   
yum erase php*
   
yum install --enablerepo=remi  \
            --enablerepo=remi-php56  \
            php  \
            php-opcache  \
            php-devel  \
            php-mbstring  \
            php-mcrypt  \
            php-mysqlnd  \
            php-pgsql \
            php-phpunit-PHPUnit  \
            php-pecl-xdebug  \
            php-pecl-xhprof
```
プロジェクト内で、選択されたフォルダ内のコンポを取得するスクリプト

AfterEffectsのスクリプト(jsx)で、選択されたフォルダ内のコンポを取得する。

```js:select_compo_in_folder.jsx
//まず選択されているコンポを取得
for (var i=1; i<=app.project.items.length; i++)
{
    if( app.project.item(i).selected ){
        srcCompos.push(app.project.item(i));

        //タイプがフォルダーだったら
        if( app.project.item(i).typeName == "フォルダー"){
            myFunc(app.project.item(i).items);
        }
    }
}


var myFunc = function (items){
    for(var i=1; i<=items.length;i++){
        //ファイル名をアラート
        alert(items[i].name);
    }
}
```

##参考
AEスクリプトはここを参考にした。
http://www.openspc2.org/book/AfterEffectsCS4/
https://sites.google.com/site/annamillersclub/script-menu/gyakubikiscript
http://aejsx.hiroshisaito.net/reversereference
それでもわからない場合は、本家のPDFを参考にした。
http://blogs.adobe.com/aftereffects/files/2012/06/After-Effects-CS6-Scripting-Guide.pdf
python > print > N回改行する > print('\n' * 3) > 4回改行 > print('\n' * 3), > 3回改行

Python Programming
https://www.youtube.com/watch?v=N4mEzFDjqtA&index=34&list=WL
の08:00あたり

「5行の改行を入れる」とおそらく言っている。

```
print('\n' * 5)
```

<hr>
http://ideone.com/6JiHrn
で実施すると

```test.py
print "start"
print('\n' * 3)
print "end"
```

```txt:結果
Success	time: 0.02 memory: 44632 signal:0
start




end
```

1行改行が多い気がする。

<hr>
上記をCentOS 6.5で実施したが、やはり改行は4回だった。

つまり、

```
print('\n' * 3)
```
とした時、3回の改行に加えて、print自体の改行が入るということなのだろう。


`print('\n' * 3),`として最後にカンマをつければ、3回だけの改行になるが、読みやすいコードなのかはわからない。

http://ideone.com/F0Ky6U


リンク http://qiita.com/7of9/items/ac371b545213d2862bc8
#CakePHP 2.3.9 にてフォームでポスト可能な時間(Security->csrfExpires)を変更したときのメモ

## <i class="fa fa-comment"></i> 背景

* じっくり考えながら入力するようなフォームで初期値の30分では足らず、投稿できないという現象がしばしば発生したため、30分より長い時間を許容したいということから。
* CakePHP のバージョンは 2.3.9

## <i class="fa fa-question-circle"></i> Security->csrfExpires とは？

* CSRF token が作成されてからの有効期限。  
(CSRF protectionが有効な時フォーム系で画面を開いてからポストするまでの有効期限。)
* フォーム画面を開いてからポストする時にこの時間を超えると`blackHole()`が呼ばれる模様。
* 公式ドキュメント  
http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html  
※2系は英語版のみの模様。

## <i class="fa fa-cube"></i> 初期値は30分

* CakePHP 2.3.9においては`lib/Cake/Controller/Component/SecurityComponent.php`に`public $csrfExpires = '+30 minutes';`と設定してある様子。

## <i class="fa fa-pencil"></i> 変更するには Controller で値を上書き

* 方法1: Controller の `$components` に記載する方法。 Controller 全体で変更したいときなど。

```php:CakePHP
public $components = array(
    'Security' => array(
        'csrfExpires' => '+1 hour'
    )
);
```

* 方法2: Controller の `beforeFilter()` に記載する方法。 特定のactionでのみ変更したいときなど。

```php:CakePHP
public function beforeFilter() {
    parent::beforeFilter();
    $this->Security->csrfExpires = '+1 hour';
}
```

## <i class="fa fa-warning"></i> 変更する際の注意点

* CakePHP 2.3.9においては`lib/Cake/Controller/Component/SecurityComponent.php`の`$token['csrfTokens'][$authKey] = strtotime($this->csrfExpires);`にて`strtotime()`の引数に直接csrfExpiresの値を渡している様子。  
有効期限を**1時間にしたいなら`'+1 hour'`**、**40分にしたいなら`'+40 minutes'`**とする必要がある。  
**初期値の30分から±するという意味ではない**。過去の日時になる`'-1 minute'`などにすると直ちに有効期限が切れる。  
http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#SecurityComponent::$csrfExpires
Windowsで増えすぎたCOMポートを解放する

# WHAT #

Windowsでは新しいArduinoやRS232C変換ケーブルなどを接続すると、無限にCOMポートが新しく確保されていき、そのデバイスを接続していない時でも使用中となり、そのCOMポートは別のデバイスでは使用できなくなる。
その結果COMポートの数がとんでもないことになる。

秋月電子のPICProgrammerなどでは指定できるCOMポートが20までと決まっており、「指定できねえじゃん、やべえ」を回避するための手段である。

# HOW #
Windowsのスタートメニューを開き、プログラムとファイルの検索かregeditを検索する。
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/326bed0a-e1be-91f7-2b27-bcc5bbea318e.jpeg)

regedit.exeが見つかれば実行する。
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/90ae1f22-3f2e-233d-5f14-469d06bca710.jpeg)

左のサイドメニューから
` HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > COM Name Arbiter `
を選択する。

 ![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/1f8167f9-6f0d-b7ad-3c1b-8c3faf02214c.jpeg)


この`Com DB`の中身が使用中のポートを指しているbinary fileなのでこいつを編集する。

が、その前にPC固有で持っているCOMポートがあり、間違って解放して使用すると競合して不具合を起こしてしまうので固有のCOMポートを確認しておく。

スタートメニューからコントロールパネルを開き、デバイスマネージャーを起動する。

![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/bfdb6e85-580d-3ed2-150e-da5ebb6d5a77.jpeg)


COMポートを使用するデバイスを全てはずして`ポート(COM と LPT)`を開くと、PCの固有の通信ポートが出てくる。
これらのポートを別のCOMデバイス(Arduinoなど)で使用しようとすると、競合して不具合を起こすので、これらのポートだけは解放しないようにする。

![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/4e1f9b7c-0662-0eb9-6f9b-cdf90bd9132d.jpeg)

私のPCではCOM1とCOM2(私のと書いたが大抵のWindowsPCは1と2は使用されているように思う。)が使用されているので、この2つは解放しないようにする。


ここで先ほどのComDBというファイルだが、1byte目のLSBからCOM1,COM2,COM3…と使用中かそうでないかが0,1で表現されている。
私のPCでは、1,2を解放してはいけないという話だったので、1byte目の下位2bitは1にする必要がある。
バイナリファイルを編集するときはHEX表記されているので、
`0b0000 0011 = 0x03`
つまり、1byte目を`03`に指定してあげればよい、ということになる。

ComDBを編集するには、ComDBを右クリックし、バイナリデータの修正を選択する。
![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/3305e55b-c6e6-d89b-8f01-1322464e4b47.jpeg)

そして、1byte目に03を与え残りを`Del`キーなどで消してやり、OKを押下する。
![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/5c9168e5-1aad-fd82-2b66-75feb4424a50.jpeg)

これで解放は終了です。

Arduinoなどを新しく接続すると、解放されたCOM3から割り当てられる。

![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/40556/56c5e9a2-f428-d81a-86fc-e5f09cfacba8.jpeg)

これで無事COMポートが解放された。
実践的なグラフデータベースの利用(トライアルプロジェクト)

所属会社の企画で「婚活支援プロジェクト」という記事を連載中です。この記事の目的は、例示を通してNeo4jの利用方法を具体的且つ分かり易く伝えることです。そのために、実際にトライアルプロジェクトを起こし、企画段階からデータモデル設計、データ登録、Cypherクエリーを利用した様々な分析、問題点のまとめ、問題点をどのように改善するかなど、実行した事や起きた事などをそのまま伝えております。

具体的な内容は、以下の記事を参照して下さい。

[第1回目:構想からデータモデル設計まで](http://www.creationline.com/lab/11658)
[第2回目:データ処理と問題点](http://www.creationline.com/lab/neo4j/11848) 
[第3回目:どのように改善したらいいのか](http://www.creationline.com/lab/11995)
[第4回目:改善したデータモデルよるデータ処理](http://www.creationline.com/lab/12205)

以下のCypherクエリーは、ある男性が望んでいる理想的な相手(最も類似性が高い女性という想定）を分析し、望んでいる要素の一覧と共に、類似性の高い割合でトップ10を表示しています。

```
WITH ["飲む",1981,1982,1983,1984,1985,1986,1987,1989,"短大・高専","大学","大学院","信じない","意識して運動する",140,150,160,"土日祝日",100,200,300,400,500,600,700,800,900,"映画感想","ゲーム","公務員","会社員","自営業","企業経営・役員","教師","医師","医療関係","保育士","農林・漁業","パート・アルバイト","学生","家事手伝","好き","埼玉県","千葉県","東京都","神奈川県","無し","積極的","海","川","外向的","内向的","猫派","吸わない","野球","サッカー","バレーボール","バスケットボール","テーブルテニス","ヨガ","散歩","ダンス","話すタイプ"] AS list
MATCH (woman:Person:Woman)-[*]->(things)
WHERE NOT woman-[:DISAGREE|SUCCESS]-()
WITH woman, COLLECT(things.title) AS wlist, list
WITH woman, filter( x IN list WHERE x IN wlist) AS shared, [1995,1994,1993,1992,1991,1990,1980,1979,1978,1977,1976,1975,1974,1973,1972,1971,1970,170,180,190,200,"dummy"] AS list2
WHERE NONE ( x IN shared WHERE x IN list2)
RETURN woman.name AS 女性, shared AS 共有要素, 1.0 * length(shared) / 20 AS 類似性
ORDER BY 類似性 DESC
LIMIT 10
```

```
女性 共有要素 類似性
W24 [1982, 大学, 意識して運動する, 140, 600, ゲーム, 自営業, 好き, 埼玉県, 無し, 積極的, 海, 外向的, 猫派, 吸わない, バレーボール] 0.8
W13 [飲む, 1984, 大学, 信じない, 意識して運動する, 150, 700, ゲーム, 自営業, 好き, 埼玉県, 無し, 海, 外向的, 吸わない, バスケットボール] 0.8
W12 [飲む, 1985, 大学, 意識して運動する, 160, 土日祝日, 600, 会社員, 好き, 無し, 積極的, 外向的, 猫派, 吸わない, バレーボール, 話すタイプ] 0.8
W16 [飲む, 1981, 信じない, 意識して運動する, 140, 土日祝日, 300, 映画感想, 医師, 好き, 東京都, 内向的, 猫派, 吸わない, バレーボール] 0.75
W05 [飲む, 大学, 意識して運動する, 150, 土日祝日, 400, 映画感想, 教師, 好き, 千葉県, 無し, 外向的, 吸わない, テーブルテニス, 話すタイプ] 0.75
W14 [飲む, 1983, 大学, 信じない, 160, 土日祝日, 400, 企業経営・役員, 好き, 神奈川県, 海, 内向的, 猫派, 野球, 話すタイプ] 0.75
W10 [飲む, 1987, 意識して運動する, 土日祝日, 400, 映画感想, 農林・漁業, 好き, 東京都, 無し, 海, 外向的, 猫派, 吸わない, 話すタイプ] 0.75
W18 [飲む, 大学, 意識して運動する, 160, 400, 保育士, 好き, 東京都, 積極的, 海, 内向的, 猫派, テーブルテニス, 話すタイプ] 0.7
W20 [飲む, 意識して運動する, 土日祝日, 600, パート・アルバイト, 好き, 東京都, 無し, 海, 外向的, 猫派, 吸わない, 散歩, 話すタイプ] 0.7
W17 [飲む, 短大・高専, 信じない, 150, 土日祝日, 700, 医療関係, 好き, 神奈川県, 無し, 川, 外向的, 吸わない, バスケットボール] 0.7
```
cocos2d-x 3.x android版にAdmobバナーを表示させる

なぜかエラーになるので調べてまして、解決したのは、
[android-support-v4.jar]を入れること。

プロジェクトのプロパティ - Android Tools - サポートライブラリの追加
これでOK

[**cocos2dx admob android**]でググってヒットしたところ片っ端からやってみたけどうまくいかず。


細かくは検索結果のページにある通りにやればいいです。最後に[android-support-v4.jar]を入れればOKです。
***入ったかどうか確認するには、libs->android-support-v4.jarがあればOK。***

一応導入手順を簡潔にまとめます。
１. Android SDK Manager で[Extras] にある [Google Play services]をインストール。インストールされていればOK。
２. [Google Play services]をプロジェクトに追加。
　[File > New > Project… > Android Project from Existing Code] から[android-sdkのパス\extras\google\google_play_services\libproject]を指定すると[Google Play services]が表示されるのでそれを追加する。
(Android SDKの配置先がC:\Android\android-sdkの場合)
３. AndroidManifest.xmlを編集 ＜application＞タグ内と＜manifest＞タグ内に追加

```xml:AndroidManifest.xml 
<application>タグ内
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

<manifest>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
```
４. src->org.cocos2dx.cpp->AppActivity.javaに追加
追加内容は、cocos2d-xのページにある内容でもググってもらって見つかったところでOKです。
http://www.cocos2d-x.org/wiki/User_Tutorial-Integrate_AdMob
WordpressのメディアライブラリでHTTPエラーの原因は意外な場所にあった

# 原因はパーミッションだったけど意外な場所のパーミッションだった話

メディアライブラリから画像をアップロードすると 10KB以下のファイルはできるのに、それ以上のファイルは全て「HTTPエラー」が表示されてしまいました。

「メディアライブラリ HTTPエラー」で検索すると皆さん苦労されているので情報はたくさんあったのですが、どれも自分の事例には当てはまらなかったのでメモしておきます。

## 環境

* OSX El Capitan
* Nginx 1.8.0
* PHP 5.6.14
* Wordpress 4.3.1

## 試してみたこと

### ファイルサイズが 0byte になっていないか
* [WordPress の「HTTPエラー。」でメディアアップロードができない、を調査](http://dotnsf.blog.jp/archives/2472378.html)

### プラグイン、パーミッション、php.ini
* [画像をアップロードできない！どうする？](http://worpre-lab.com/setup/upload-error/)

全てのプラグインを無効にし、
wp-content/upload/のパーミッションを確認し、
php.ini でメモリやファイルサイズ上限をあげましたがダメでした。

### Nginxのアップロード上限を増やす
* [Redmineでアップロードできるファイルサイズの最大値を増やす](http://qiita.com/zakihaya/items/8723eeef4c2bbe632f4a)

### Wordpressのメモリ上限を増やす
[How to Fix HTTP Error When Uploading Images?](http://wordpress.stackexchange.com/questions/59763/how-to-fix-http-error-when-uploading-images)
wp-config.php に `define('WP_MEMORY_LIMIT', '64MB');` を追加してみましたがダメでした。

## 意外（？）な場所のパーミッションが原因だった

他の事例をあてにするのは諦めて、素直にNginxのログを見てみることにしました（最初からそうしろ）。
すると下記のようなエラーが検出されていました。

```
2015/11/16 10:05:54 [crit] 1191#0: *231 open() "/usr/local/var/run/nginx/client_body_temp/0000000027" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "POST /xxx/system/wp-admin/async-upload.php HTTP/1.1", host: "localhost:8080", referrer: "http://localhost:8080/xxx/system/wp-admin/upload.php"
```

問題となるのはここです。

```
/usr/local/var/run/nginx/client_body_temp/0000000027" failed (13: Permission denied)
```

Nginxがファイルアップロードを受け入れる時の一時的な保管場所だと思うのですが、ここをパーミッション `777` にしたら問題なくアップ出来るようになりました。

El Capitanで権限関係が厳しくなったらしいですが、その辺が原因でしょうか？
SDカードイメージのパーティションをマウントする

yocto等で作成されたSDカードイメージの中身を確認する方法を記載。

# `fdisk`でパーティションを確認

```bash
$ sudo fdisk -u -l XXX.rootfs.sdcard

Disk XXX.rootfs.sdcard: 864 MiB, 905969664 bytes, 1769472 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000XXXXX

Device             Boot Start     End Sectors  Size Id Type
XXX.rootfs.sdcard1       8192   24575   16384    8M  c W95 FAT32 (LBA)
XXX.rootfs.sdcard2      24576 1761279 1736704  848M 83 Linux
```

# オフセットを指定してマウント

パーティションをマウントするにはパーティションの先頭のオフセット(byte)を指定してやれば良い。
１番目のパーティションをマウントする場合、`fdisk`の結果から先頭のセクターが8192でセクターのバイト数は512byteであることがわかるので以下のとおり指定する。

```bash
$ sudo mount -oloop,offset=$(expr 8192 \* 512) XXX.rootfs.sdcard /path/to/mountpoint
```
hubotで外部コマンドを使う - 覚え書き

hubotで外部コマンドを使いたい。外部コマンドにパイプで入力値を流しこみたい。CoffeeScriptを書くのははじめてなのであまり良い方法ではないかもしれない。覚え書きだ。

例として標準出力の1行目を逆にしたものを出力とする外部コマンド

```shell-session
% ghc -e 'interact $ reverse . head . lines'
```

を使っている。この部分を自分の好きな外部コマンドに置き換えれば良い。

```coffeescript:reverse.coffee
spawn = require('child_process').spawn

module.exports = (robot) -> robot.hear /reverse/i, (msg) ->
        echo = spawn 'echo', [msg.message]
        reverse = spawn 'ghc', ['-e', 'interact $ reverse . head . lines']
        echo.stdout.on 'data', (data) -> reverse.stdin.write(data)
        reverse.stdout.on 'data', (data) -> msg.send data.toString()
```
Finderで英語のディレクトリ名を日本語表示にする

## はじめに

OS X標準ディレクトリのような、CUIでは`Documents`、Finderでは和訳され`書類`と表示されるような、ディレクトリ名の日本語訳化の実現、および日本語訳の追加を行います。


## 実行環境

* OS X Yosemite 10.10.5


## ディレクトリ名の日本語表示

日本語訳させたいディレクトリに`.localized`という空ファイルを設置するだけです。
ただし、OSの言語データに登録されてある日本語訳しか出来ません。

> `mkdir -p ~/Sites && \`
> `touch ~/Sites/.localized`


## 言語データに日本語訳の追加登録

OSの言語データに日本語訳の追加を行います。
言語データはプロパティファイルになっており、そのまま編集することは出来ません。
プロパティファイルをバイナリ形式からXML形式に変換し、その後テキストエディタで編集します。

> `cd /System/Library/CoreServices/SystemFolderLocalizations/ja.lproj/ && \`
> `sudo plutil -convert xml1 SystemFolderLocalizations.strings && \`
> `sudo vim SystemFolderLocalizations.strings`

`<dict>`内に、`<key>`と`<string>`をセットで追加していきます。

```diff:SystemFolderLocalizations.strings
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
+         <key>Developer</key>
+         <string>デベロッパー</string>
          <key>Applications</key>
          <string>アプリケーション</string>
           :
```


## 言語データの再バイナリ化と適用

編集後、言語データをXML形式からバイナリ形式に戻しFinderを再起動します。

> `sudo plutil -convert binary1 SystemFolderLocalizations.strings && \`
> `killall Finder`

これで、追加した`<key>`名のディレクトリに`.localized`を設置すると日本語訳が適用されるようになります。
ProcessingをiPadで書いて実行する。

# 動機
ちょっとした[Processing](https://processing.org)のコードを書いて動作を確認するのにiPadを使って出来ると便利という人がいたので、実現方法を調べてみた。

#オンラインの場合
「[jsdo.itでProcessingを動かす](https://takatamajp.wordpress.com/2013/03/21/processing_on_jsdo_it/)」に書かれている通りに[jsdo.it](http://jsdo.it/)のhtml編集タブにProcessingのコードを書いて実行できた。

- 良いところ
 - コードと実行結果を同時に見比べられる。
 - アカウント制なので、PCとiPadで同じコードを触ることができる。
- イマイチなところ
 - PC上ではサクサクと動作したが、iPadのSafariだと少しもっさりな印象。
 - 他のブラウザだと動作速度は違ってくるかも（未検証）。
- その他
 - 処理系はprocessing.jsを使う。


#オフラインの場合
「[Processing iCompiler](https://itunes.apple.com/us/app/processing-icompiler/id648955851
)」を導入する。

- 良いところ
 - アプリ内のエディタでコーディング→実行できる。
 - 重そうな処理もiPad Air上でサクサク動いている。
- イマイチなところ
 - コードを他の環境に共有したい時はテキスト全選択コピーしか手段がない。
- その他
 - 処理系は不明。iOS専用コンパイラを開発している？
電子メール署名を別のコンピューターにコピーする

https://support.office.com/ja-jp/article/%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%92%E5%88%A5%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B-4e03286f-2246-4d7d-ae95-a4cc1992595a
dockerのインストール - Mac OS

Docker ToolboxでMac OS Xにdockerをインストールを行います。

1. まずDocker Toolboxのページへ行きます。<br>
https://www.docker.com/docker-toolbox


2.Download(Mac)ボタンを押してダウンロードをします。<br>
![docker-toolbox1-300x249.png](https://qiita-image-store.s3.amazonaws.com/0/82090/71cea7b3-8213-7410-c8c6-ff2ce6ec9a99.png)


3.ダウンロードしたパッケージをクリックしてインストーラーを起動させます。


4.起動したらナビゲーションに従い進みます。
![docker-toolbox2-300x211.png](https://qiita-image-store.s3.amazonaws.com/0/82090/95a753cc-9409-efe1-3c97-e3141dc88a00.png)

![docker-toolbox3-300x211.png](https://qiita-image-store.s3.amazonaws.com/0/82090/44be53e3-4788-3ae3-def9-2439c60aa2b2.png)

![docker-toolbox4-300x214.png](https://qiita-image-store.s3.amazonaws.com/0/82090/3f808694-d676-1ce8-aba2-2ff6d0940ac5.png)

![docker-toolbox6-300x214.png](https://qiita-image-store.s3.amazonaws.com/0/82090/fac6e78a-5e39-c63f-4449-6bfc3633d2f2.png)


5.インストールが完了するとLaunchpadに「Docker Quickstart Terminal」「Kitematic」「VirtualBox」の３つがインストールされます。
![docker-toolbox7-300x83.png](https://qiita-image-store.s3.amazonaws.com/0/82090/0a4784c9-dff8-7d7c-ed16-37bd7db04a17.png)


6.「Docker Quickstart Terminal」をクリックするとTerminalが立ち上がり、VirtualBox上にDocker環境が構築されます。
![docker-toolbox8-300x233.png](https://qiita-image-store.s3.amazonaws.com/0/82090/d2ed5332-439f-35eb-7730-1e1da9251b9d.png)

![docker-toolbox9-300x235.png](https://qiita-image-store.s3.amazonaws.com/0/82090/bd9974f9-dae7-122d-8385-38b80193e584.png)

以上、dockerのインストールが完了です。
scipy.sparseの非ゼロ要素の対数を取る


調べてもあまり出てこなかったのでメモ。

参考：http://stackoverflow.com/questions/6256206/scipy-sparse-default-value

ポイントはlilだと出来ないけどcoo, csr, cscならできる所。

```python
>>> import numpy as np
>>> from scipy.sparse import lil_matrix
>>> a = lil_matrix((3,2))
>>> a[0,0] = 10
>>> a[0,1] = 3
>>> a[1,0] = 11
>>> a[1,1] = 100
>>> a[2,0] = 12
>>> a.todense()
matrix([[  10.,    3.],
        [  11.,  100.],
        [  12.,    0.]])
>>> b = a.tocsr()
>>> a.data
array([[10.0, 3.0], [11.0, 100.0], [12.0]], dtype=object)
>>> np.log(a.data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'log'
>>> b.data
array([  10.,    3.,   11.,  100.,   12.])
>>> np.log(b.data)
array([ 2.30258509,  1.09861229,  2.39789527,  4.60517019,  2.48490665])
>>> b.data = np.log(b.data)
>>> b.todense()
matrix([[ 2.30258509,  1.09861229],
        [ 2.39789527,  4.60517019],
        [ 2.48490665,  0.        ]])
```
Oracleのセキュリティアラートの購読

oracle javaの情報をウォッチしようと思って、そのメモ。

http://www.oracle.com/technetwork/topics/security/securityemail-090378.html

1. oracleのアカウント取得
2. ログインして、アカウントリンクをクリック
3. プロフィールが足りてなければ追加して更新
4. ニュースレターの購読から、下の方にある「オラクルの個人情報保護基本方針およびセキュリティ通知
」からセキュリティアラートをチェック

# 参考

その他の、セキュリティ関連のMLについてはここに情報が集まってるようです。
http://qiita.com/harukasan/items/4f11dce5db8cd62b7126
TDD > SQLite > 100% branch test coverage

https://www.sqlite.org/testing.html
> The TH3 test harness is a set of proprietary tests, written in C that provide 100% branch test coverage (and 100% MC/DC test coverage) to the core SQLite library. 

100% coverageというのはすごい。

100%でなくても、リファクタリングする時は可能な限りテストハーネスを整備してから実施したいものだ。

テストハーネスがない状態などでコードを変更して、「何がどうなったかわからない」状態になってしまうと、時間がかかるだけでなく、コーディング+デバッグが”しんどい”作業になる。

[コーディング+デバッグ]に同じ時間がかかるなら、テストハーネスを整備して「何がどうなっているかわかる」状態で進めたいものだ。
atom markdown-preview用のスタイル

```css:styles.less

@def-b: #fff;
@def-b-hilight: #ddd;
@def-c: #444;
@def-c-hilight: #1E88E5;
@def-font-family: "Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3","メイリオ","Meiryo","ＭＳ Ｐゴシック",Osaka,sans-serif;
@def-border: solid 1px #aaa;
@def-blockquote-content: '\201C';

.b-color(@color: @def-b) { background-color: @color; }

.def-font(@em: 1.00em, @color: @def-c) { font-family: @def-font-family; font-size: @em; color: @color; }
.bold { font-weight: bold; }
.italic { font-style: italic; }
.under-line { padding-bottom: 5px; border-bottom: @def-border; }
.ver-margin(@margin) { margin: @margin 0; }
.top-left(@top, @left, @position: absolute){ position: @position; top: @top; left: @left}


.def-table-border{ border: none; border-bottom: @def-border; }
.def-blockquote{ padding: 20px 20px 20px 50px; position: relative; border-left: 5px solid @def-b-hilight; }
.def-q-before{ .def-font(3em); .bold; .top-left(5px,10px); color: @def-b-hilight; content: @def-blockquote-content; }

.markdown-preview.markdown-preview {

  .b-color;
  .def-font;

  h1{ .def-font(2.8em); .bold; }
  h2{ .def-font(2.0em); .under-line; }
  h3{ .def-font(1.4em); .bold; }
  h4{ .def-font(1.3em); .bold }
  h5{ .def-font(1.2em); .bold }
  h6{ .def-font(1.1em); .bold }
  a { .def-font(1.0em, @def-c-hilight) }
  li{ .ver-margin(5px) }

  table { .def-font(0.9em); .ver-margin(40px); border-collapse: collapse; }
  th    { .def-font; .b-color(@def-b-hilight); .def-table-border; }
  td    { .def-font; .b-color(#fff); .def-table-border; }
  pre   { .def-font(0.9em, @def-b-hilight); }

  blockquote{ .def-font; .italic; .def-blockquote; }
  blockquote::before{ .def-q-before; }
}
```
iTerm2のhexcodeってなんやねん

#tmuxのコマンドが覚えられないので
iTerm2のショートカットで簡単に入力出来たら良いと思ったんですよね。
んで色々調べていると、どうもhexcodeで指定するらしい。
#hexcodeって何
iTerm2の言うhexcodeとはUNIXのASCIIコードのことらしい
#で、結局？
https://en.wikipedia.org/wiki/ASCII#ASCII_control_code_chart
この表を基に指定すれば良いですよって話
Serverspecことはじめ

Serverspecについての簡単なまとめと
EC2上でServerspecをインストールして実行するまでを記述。

## Serverspecとは何か
* サーバの状態をコードにより自動的にテストするツール
 * 構築したサーバが要件を満たしているかどうか確認できる
 * Black Duck社が発表した2013年のオープンソースルーキーズオブザイヤー
	 * https://www.blackducksoftware.com/open-source-rookies/2013-recipients 
* Rubyで実装されている
* テストはRSpecで書ける（Server+RSpec=Serverspec）
* Serverspecをインストールしたサーバ自身をテストするだけでなく、ネットワーク経由(ssh/WinRM)で外部の複数のサーバに対してもテストが可能(以下画像参照)
 * http://tech-sketch.jp/mt/2014/04/28/serverspec-overview.png 
 
## Serverspecの目的
* テスト駆動によるインフラのコード開発
* サーバ構築後の確認作業の自動化
* 稼働しているサーバの監視
* サーバの再起動時の状態確認

## インストール
* gemで公開されているので以下のコマンドでインストールできる

``` serverspecのインストールコマンド
sudo gem install serverspec
```

## 最初にやること
* serverspec-init コマンドを実行する

以下例を参考。

```ec2インスタンスでローカルに実行する例
ec2-user@serverspec-host$ serverspec-init 
Select OS type:

  1) UN*X
  2) Windows

Select number: 1 # EC2なので1を選択

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 2　# ローカルで実行するので2を選択
# 以下ファイルができる
 + spec/
 + spec/localhost/
 + spec/localhost/sample_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 + .rspec
```
生成されたファイルの中にRakefileがある。
Serverspecの実行にはRakefileを読み込む必要があるので
rake をgemでインストール

```rakeのインストール
sudo gem install rake
```

Apache HTTP Serverを起動する

```
sudo service httpd start
```
以下コマンドにて実行

```
ec2-user@ip-172-31-15-14$ rake spec
/usr/bin/ruby2.0 -I/usr/local/share/ruby/gems/2.0/gems/rspec-support-3.4.0/lib:/usr/local/share/ruby/gems/2.0/gems/rspec-core-3.4.0/lib /usr/local/share/ruby/gems/2.0/gems/rspec-core-3.4.0/exe/rspec --pattern spec/localhost/\*_spec.rb

Port "80"
  should be listening

Finished in 0.01063 seconds (files took 0.30423 seconds to load)
1 example, 0 failures
```


## まとめ
* RSpecの理解が深まる
* 副次的な効果として、Serverspecを調べることで知らなかったミドルウェアの使い方を知れる(netstatコマンドとか)
* CIに組み込んでおけば、EC2で空けちゃいけないポートが空いていないかを確認することに利用できそう。
* またテストを書いておけばそのサーバがどういった要件を満たしているのかが分かるため便利
* [Serverspecのoreilly本](http://www.amazon.co.jp/dp/4873117097) 読む
* [Infrataster](http://infrataster.net/)も使えそう
 *  Serverspecはサーバの内部をテストするのに対して、Infratasterは、外部から見た場合の振る舞いをテストする。もうちょっとアプリケーションよりのテストができるっぽいです。
 * HTTPリクエストの応答が200か確認したり、MySQLへの問い合わせた結果を比較したりなどが確認できる
 * 次はこっち(Infrataster)調べたい。
vncviewer小技

## 速度重視（画質劣化）

* [特選フリーソフト - 低速回線でも使用できる遠隔操作ソフト　TightVNC（下）：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20061025/251813/)
* 8bit表示

```bash
vncviewer -bgr233
```

## パスワードを標準入力から取得

```bash
echo fjhqijf23 | vncviewer -autopass
```
jupyter 4.0のパスワード設定

# jupyter インストール
[anaconda一択](http://qiita.com/y__sama/items/bb0756574456f9ab11d4#jupyter-ipython-notebook-3x%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)

# config周りについて
jupyter 4.0でconfig周りが結構変わったようなので要確認
https://jupyter.readthedocs.org/en/latest/migrating.html

# configファイルの作成とパスワードの設定
[参考URL](http://jupyter-notebook.readthedocs.org/en/latest/config.html)

```bash
conda install ipywidgets # ipywidgets入れておく
jupyter notebook --generate-config
#Writing default config to: ~/.jupyter/jupyter_notebook_config.py
ipython
```
pythonでハッシュパスワードを生成する

```py3
In [1]: from notebook.auth import passwd;passwd()
Enter password:
Verify password:
Out[1]: 'sha1:........'
# ハッシュパスワードをコピーしておく
```

```
vi ~/.jupyter/jupyter_notebook_config.py
```
93行目からハッシュパスワードの記載あり。
100行目にコピーしたハッシュパスワードを張り付ける
```
c.NotebookApp.password ='sha1:<ハッシュ>'
```
閲覧中のページタイトルを自動で書き換える

```js:censor.js
var observer = new MutationObserver(function(mutations) {
	// タイトルが空ならスキップ
	if (!document.title) return;
	
	// Googleドメインか(Google系はちょくちょく書き直すので)
	var isGoogleDomain = (document.domain.indexOf('google') > -1);
	
	// タイトルを取得
	var title = document.title.toLowerCase();
	
	// 「Google Drive」がタイトルに含まれるかチェック
	if (title.indexOf('google') == -1) {
		if (!isGoogleDomain) observer.disconnect(); // 監視を解除
		return;
	}
	if (title.indexOf('drive') == -1 && title.indexOf('ドライブ') == -1) {
		if (!isGoogleDomain) observer.disconnect(); // 監視を解除
		return;
	}

	// 対象文字を「***」に置換
	title = title.replace(/google/g, '***');
	title = title.replace(/drive/g, '***');
	title = title.replace(/ドライブ/g, '***');
	document.title = title;
	
	if (!isGoogleDomain) observer.disconnect();
});
observer.observe(document, { subtree: true, characterData: true, childList: true });
```

社内検閲対策のExtensionを作りました。
contents_scriptsで"run_at": "document_start"かませると、常に監視します。
ページタイトルに「Google ドライブ」と含まれていれば、即「*** ***」に書き換えます。
ちょっとエッチな感じになりますね。
Documentの全変更を検出するので、マシンによってはきついかも。

社内でGoogleドライブの利用を禁止されていて、
ページタイトルに「Google ドライブ」と入ってるとタブが落ちるWindowsポリシーです。
でも、普通のニュース記事でもタブが落ちるのはさすがにヒドイ。
Python 分散処理 Spartan

#この記事はPythonで分散処理したい方に向けた記事です。

pythonのイメージは遅いという方も多いと思います。

そのイメージを払拭すべくcythonなどのライブラリが出ていますが、今回はpythonを高速化する手法の一つとして分散処理について紹介しようと思います。

分散処理の代表といえば。

・Hadoop
・Spark

です。

今回はSparkを単純にpythonに適用したいと考えたのですが・・
下記の記事でJVMとPythonのデータ構造の変換が何回も起こり、レイテンシーが大きくなるのであまり早くならないと記述がありました。

http://codezine.jp/article/detail/8484

![python spark.png](https://qiita-image-store.s3.amazonaws.com/0/10496/8a014daa-40a3-d510-f1e8-5d2f747be6b6.png)

上図の構造を見てみるとSpark Workerとデータをパイプする部分が多く分散処理するとそこがネックになるかもという印象を受けます。

#Spartan

https://github.com/spartan-array/spartan

そこで今回はPythonでのデータ処理はNumPyという行列データ構造を使うことで高速化することができるため、Numpy行列をSparkのRDDのように分散化する試みの、Spartanというプロジェクトで作成されたライブラリを使用してみることにしました。

依存ライブラリの関係でspython2系でないと上手く動きませんでした。
python3系への対応が望まれます。

python3系の人はvirtualenvでもpyenvでも良いので2系の環境にして下さい。

##ライブラリの導入

では環境構築手順です。（Macでしか試していません）

`requirement.txt`を下記のように用意し、`pip install -r requirement.txt`でインストールします。

```
numpy
chainer==1.1.2
ipython==4.0.0
notebook==4.0.4
jinja2==2.8
pyzmq==14.7.0
tornado==4.1
scipy
dsltools
cython
parakeet
scikit-learn
traits
psutil
```

##インストール

```
git clone https://github.com/spartan-array/spartan.git
cd spartan
python setup.py develop
```

上記でインストール完了です。

ただしMacだと使用するには更なる設定が必要でした。

```
spartan/worker.py
```

上記のpythonファイルを変更する必要があります。

デフォルトの状態だと

```
psutil.TOTAL_PHYMEM
psutil.NUM_CPUS
```

の２つが設定されておらず、エラーが出てしまうので、

```py
    ret = psutil.virtual_memory()
    num_cpus = psutil.cpu_percent()
    psutil.TOTAL_PHYMEM = ret.total
    psutil.NUM_CPUS = num_cpus
```

上記を下記のプログラムの行の前に追加することで設定が可能です。設定しているのは仮想メモリとCPUをどれだけ使用するかを設定しています。
psutilはメモリやCPUの使用を調整、管理できるプログラムなので詳しく知りたい方は下記をご覧下さい。

https://github.com/giampaolo/psutil

また環境設定でシングルしか使用しない設定をされている場合は下記のサイトから設定して下さい。

http://jesperrasmussen.com/2013/03/07/limiting-cpu-cores-on-the-fly-in-os-x/

```
    self.worker_status = core.WorkerStatus(psutil.TOTAL_PHYMEM, 
                                           psutil.NUM_CPUS,
                                           psutil.virtual_memory().percent,
                                           psutil.cpu_percent(),
                                           time.time(),
                                           [], [])
```

では実際に動作させてみましょう。

名前を`lreg.py`として下記のような線形回帰のプログラムを記述します。

```
import spartan as sp
sp.initialize()

N_DIM = 10
N_EXAMPLES = 1000 * 1000
EPSILON = 1e-6

x = 100 * sp.ones((N_EXAMPLES, N_DIM)) + sp.rand(N_EXAMPLES, N_DIM)
y = sp.ones((N_EXAMPLES, 1))

# put weights on one server
w = sp.rand(N_DIM, 1)

for i in range(50):
    yp = sp.dot(x, w)
    diff = x * (yp - y)
    grad = sp.sum(diff, axis=0).reshape((N_DIM, 1))
    w = w - (grad / N_EXAMPLES * EPSILON)
    print grad.sum().glom()
```

下記のコマンドで動作させます。

```
python lreg.py --log_level=WARN
```

実行するとフルでCPUとメモリを食うので固まります。
PCにスパルタなことを強要するとまずいですね。

今回は本質的なクラスターで動作させる所まで行っていないので、今後、試していく予定です。

ご利用はご計画的に！！

今回のレポジトリはこちら

https://github.com/SnowMasaya/Spartan-Study

#参考資料

http://codezine.jp/article/detail/8484

https://github.com/spartan-array/spartan

https://www.cs.nyu.edu/web/Research/Theses/power_russell.pdf
【知見共有】GoogleBigQueryの設計ミスでデータサイエンティストの業務効率が低下

GoogleBigQueryの問い合わせクエリー肥大化でメンテが大変なことになったので、人間のためのクエリーを書けるよう工夫する話です。データ収集基盤としてBigQueryを採用しています。スマホアプリやサーバで生成される全てのユーザ行動ログをfluent経由でBigQueryに投入してデータサイエンティストに自由に活用してもらっています。

## データ収集基盤の仕様設計
BigQueryはGoogle様のクラウド技術を利用して100GByteのフルスキャンだって10秒で終わるイケてるサービスです。BigQueryをデータ収集基盤として運用すればReadが超高速なので、アプリエンジニアは行動ログを仕込むだけ、データサイエンティストは蓄積されたデータを利用してビジネスに活用とWin-Winの関係が築けるはずだ、と思っていたのですがそう上手くはいきませんでした。

## 問い合わせクエリー肥大化による業務効率低下
データサイエンティストと雑談していたときに、GoogleBigQueryへの問い合わせクエリーを書くのに時間が掛かって仕方が無いという話がありました。実際に問い合わせクエリーを見せてもらったら500行を超える肥大化してしまったクエリーが複数ありました。使い回しや、引き継ぎ、バグの観点で現状のままだと本来の業務に割く時間が、クエリーのメンテにばかり取られてしまいそうだなーと思ったので改善方法を探してみました。

## クエリー肥大化の理由
複雑なことをしたり、出力単位や集計単位が異なるログを1クエリーで扱おうとするとクエリーが肥大化します。たとえばパズドラ型ゲームで、プレイしたクエストとプレイヤーレベルとアプリ継続率の観点で調査する場合のログ単位を表にまとめてみました。

■ ログ毎の出力単位

|ログ種別 |データ記録タイミング |1レコードの集計単位|
|---|---|---|
|プレイしたクエスト |クエスト終了毎にBigQueryに投入|User毎|
|ユーザのデイリーログイン情報 |深夜バッチで1日1回一括でBigQueryに投入 |User毎|
|7日間継続ユーザ |デイリーログイン情報テーブルからクエリーで生成|日付+User毎|
|ユーザのレベル帯 |デイリーログイン情報テーブルからクエリーで生成。Lv1-10,Lv11-20等|Lv帯+User毎|
※ あくまでパズドラ型ゲームのログ収集を自分がつくるならというサンプル実装です。

上記データがBigQueryにある状態で、7日間継続率や30日間継続率の観点で解析するためにクエリーを書くと、最終的にJoin句を多用した巨大クエリーを書く必要があります。

■ 解析用データを出力するクエリー
![スクリーンショット 2015-11-15 22.28.59.png](https://qiita-image-store.s3.amazonaws.com/0/65312/33bb1421-bf8b-3e57-ccc7-400d763719b1.png)


## BigQueryのView機能を使って解決
良い解決方法ではないですがバッチで良く使う解析項目をBigQueryに投入しようかと思ったのですが、調べてみたらOracleDBやMySQLのView機能のように、BigQueryにもView機能が存在しました。Viewは指定したクエリー結果をテーブルとして利用するための機能です。1度Viewを作成してしまえば、以後テーブルと同じように扱えます。


```sql:Viewから情報を取得するクエリー
-- レベル帯毎のユーザデータ取得View
select * from view.user_level_summary;

-- 7日間継続率を取得
select * from view.fq7;
```

■ 改善後のクエリー
![スクリーンショット 2015-11-15 22.42.10.png](https://qiita-image-store.s3.amazonaws.com/0/65312/b554e5ca-945e-e8cf-be46-4be7b6879100.png)

1度作れば他のクエリーでも使い回せて、汎用性が高いです。
珍しく銀の弾丸がありました( ･ㅂ･)و

## BigQueryでViewを作成する方法

■ 1. BigQueryのコンソールでクエリーを書いてSaveViewボタンを押す
![スクリーンショット 2015-11-15 22.47.47.png](https://qiita-image-store.s3.amazonaws.com/0/65312/27f399c0-da14-dfe5-4552-c3c7128f7473.png)

■ 2. データセットにViewが出来てる
![スクリーンショット 2015-11-15 22.48.36.png](https://qiita-image-store.s3.amazonaws.com/0/65312/28af97b2-d7d0-ccd3-a3c2-f20d040694a7.png)
ソフトウェア・テストの「テスト」は「検査」or「試験」

ソフトには色々なテストがあります。単体テスト、結合テスト、・・・。日本語だと単体検査とか単体試験と書きますが、「検査」なんでしょうか「試験」なんでしょうか？
テストの日本語訳を調べてみると　試験・検査と出てくるので、どちらでも同じような気もします。
でも試験と検査は微妙に違うんですよね。

入学試験や入社試験とはいいますが、入学検査や入社検査とはいいません。
服装検査とはいいますが、服装試験とはいいません。
検査というのは（何らかの基準に照らして）異状や悪い所がないかどうか調べること。　校則に服装の規定があってそれに反していないかを検査するわけですね。
試験というのはある物事の性質や性能などをためしてみること。
化学の試験などは試してみないと結果がわからないこともあります。
試験の意味を調べると「物の性質や力などをためすこと、または検査すること」と検査も含んでいるので、仕様が決まっていて、仕様を満たすか確認するのが「検査」、検査も行った上で、さらに仕様にも載っていない所まで確認するのが「試験」かなと思いました。
そう考えるとユニットテストは設計通りに動いているか確認しているので単体検査。

開発者が「出来たよ」って言ってリリースしたソフトを「本当に正しく動いてる？」と（仕様に書いてあること＋書いてないことも）試してみるのが試験（総合試験とか機能試験、受入れ試験）かなと思いました。

以前、テストの仕様書に「○○検査」「○○試験」を混在させていたら、上長から「どちらかに統一しろ」と言われて違いを考えてみました。

皆さんはどちらを使われているのでしょうか？



追記１：Facebookで秋山さんから「ソフトウェア開発のいう専門領域における専門用語としてのテスト」なので「テストの仕様を記載したものなら「○○テスト仕様書」に統一するのが良いと思います。」とご指摘を頂きました。


追記２：Facebookで辰巳さんから以下のコメントを頂きました。試験の一部に検査があるのかと思っていましたがが勘違いで、検査の一部に試験があるようです。
勉強になります。ありがとございました。

>SQuBOK V1の「1.2.8　S-KA：検査」で以下のように書いています。
>
>検査は一般に『品物またはサービスの一つ以上の特性値に対して，測定，試験，検定，ゲージ合わせなどを行って，規定要求事項と比較して，適合しているかどうかを判定する活動』〔JIS Z 8101-2:1999〕と定義されており，JIS Q 9000:2006における定義もほぼ同様である。ソフトウェアの検査においても，この定義はあてはまり『テストで得られたデータを基準に照らして品質評価し，合否を決めること』〔石井 1986〕，あるいは『ソフトウェア製品をなんらかの方法で試験（テスト）した結果を，品質判定基準と比較して，合格・不合格の判定を下すこと』〔保田 1995〕とされている。なお，JIS規格では検査はinspection（インスペクション）の訳語であるが，ソフトウェアの分野ではインスペクションは特定のレビュー技法の名称として用いられているので注意が必要であり，本書においても使い分けている。
>SQuBOK V2でも「2.4　KA：検査のマネジメント」に上記の記述は移動して残しました。
>ご参考まで。
技術英語 > 動詞としてのequal > But that early exposure may not equal destiny. / evenly distributed

@ LOE > June 1, 2012

http://loe.org/shows/shows.html?programID=12-P13-00022
> But that early exposure may not equal destiny.

形容詞ではなく動詞としてのequalとdestinyの結びつきが印象的だった。

<hr>
equal関連で思い出したのは

http://qiita.com/7of9/items/ad1c30d06e35ac56daec
> 
- evenly distributed : 均等に分布した
【Homebrew】brew doctorで，毎回書き込み権限が無いと言われる問題の意外な原因

# はじめに
Homebrewについてです．
OSをアップデートした訳でもなく，何かをいじった記憶もなく，ある日から数時間〜1日時間をあけて`brew doctor`をすると毎回「書き込み権限が無い」との警告が出るようになりました．

- brew doctor: Homebrewに問題がないか調べるコマンド

# 実際におきたこと

`brew doctor` で出る警告をまとめると，以下のようになります．
（実際には解決法も一緒に書かれています）

```
Warning: /usr/local/bin isn't writable.
Warning: /usr/local/share isn't writable.
Warning: Some directories in /usr/local/share/man aren't writable.
This can happen if you "sudo make install" software that isn't managed
by Homebrew. If a brew tries to add locale information to one of these
directories, then the install will fail during the link step.
```

これを解決するには，

```
sudo chown -R $(whoami):admin /usr/local
```

をして`/usr/local/`の所有をユーザーに戻す必要があります．
なぜか次に`brew doctor`をするときには所有がrootに戻ってしまうのです．
毎回同じ警告が出て，毎回同じように解決していました．

# 原因を調べてみた
アンチ・ウイルスソフトの `Sophos` が原因らしいです！
`homebrew` に関して問題があるのかと探っていたので，予想外でした．
[Macで/usr/local/binの所有者が勝手に変わる問題について](http://rcmdnk.github.io/blog/2015/10/13/computer-mac/)
という記事に書かれていました．
Homebrew自体の問題なのかと思っていたのですが，実際は`Sophos`の更新の度に起きる問題だったようです．ウイルス定義のアップデートなどもあり，わりと頻度は高かった気がします．
`sudo fs_usage | grep "usr/local"`
で，ファイルシステムへのアクセスを確認し，実際に何が原因なのかを確認できます．ただし，相当時間がかかります．


# 実際に確認してみた
`sudo fs_usage | grep "usr/local"`
をしたところ，`Sophos　Update` という文字列を見かけました．
やはり原因は`Sophos`だと思ったので，`Sophos`をアンインストールしました．
アンインストール後，`brew doctor`をしてもエラーが出なくなりました．
アンインストールする際の注意点なのですが，`Sophos`は`ゴミ箱`に入れてもアンイストールされません．`Remove Sophos Anti-Virus`というアプリを，ダブルクリックして実行し，指示にしたがってアンインストールできます．

以下のフォーラムで，Sophosの担当者が，この問題に関して2015年11月上旬までには対処すると書いているのですが，まだ対処されていないようです．（2015/11/15現在）
['sweep' command installs itself into /usr/local and changes permissions, wreaking havoc on Homebrew - Sophos Anti-Virus for Mac Home Edition - Free antivirus & tools for desktops - Sophos Community](https://community.sophos.com/products/free-antivirus-tools-for-desktops/f/17/t/10029)

# 補足
ClamXAVでも同様の現象があるようです．こちらはインストール時のみのようです．

# 参考URL
- Macで/usr/local/binの所有者が勝手に変わる問題について  
http://rcmdnk.github.io/blog/2015/10/13/computer-mac/
- Mac用アンチウィルスソフトとHomebrewの所有権についてまとめ  
http://qiita.com/tozaiuser/items/8426ee90844b46f7e4ce
- Sophos Anti-Virus for Mac のアンインストール方法  
https://www.sophos.com/ja-jp/support/knowledgebase/120838.aspx
メディアアートに用いるMIC/AI/SPKの選定


# はじめに
団体として音響機器について学ぶ必要があり、最低限実用に耐えるレベルの機器を選定した。
スピーカはメディアアート制作に、マイクはラジオ番組の製作に必要になった。
オーディオインターフェイスはそれら入出力機器とPCをつなげる役割を担ってくれている。


[PA基本講座](http://www.soundhouse.co.jp/howto/pa/)なんかが参考になった。（PA:プロフェッショナルオーディオ）

# マイク（MIC）

本職の方にお勧めされたのはダイナミック型マイクの[AKG D5](http://www.soundhouse.co.jp/products/detail/item/99380/)(8k円)か[SHURE SM58](http://www.soundhouse.co.jp/products/detail/item/69782/)(11k円)。
ケーブルはXLR端子。

# オーディオインターフェイス（AI）
最終的にはフォーカスライトの[scarlett](http://www.soundhouse.co.jp/products/detail/item/184502/)を購入することにした。
お値段20k円。

ユーザが多くネットに情報が多いこと、6chの入出力に対応していることなどが決め手となった。
なお出力端子はXLRではなくフォン。

# スピーカー（SPK）
最終的には[YAMAHA HS5](http://www.soundhouse.co.jp/products/detail/item/184217/)を買うことに決定した。
ペアで30k円。

YAMAHAのMSP5とMSP3が定番らしいが、用途として低音よりも解像感を重視したいという結論にいたり、HS5を選ぶに至った。

参考にしたページは[こちら](http://www.emuramemo.com/entry/2014/03/10/040626)。

# ケーブル
ケーブルの種類についての基礎知識は[こちら](http://info.shimamura.co.jp/digital/knowledge/2014/01/16501)のページで学んだ。

業界標準のXLR端子と市販品に多いフォン端子の互換を考えて、変換コネクタは[こういうもの](http://www.soundhouse.co.jp/products/detail/item/25290/)が安くていいのではないかという話になった。0.25k円。

SPK-AIの接続にはサウンドハウスの[割安XLRケーブル](http://www.soundhouse.co.jp/products/detail/item/25332/)
0.5k円/5mを見繕った。

XLR端子については、信号はメスから入ってオスに出るとおぼえておこう。
Tupleの配列でcontainsを使う方法。（と質問。）

Tupleの配列でcontainsが簡単に使えなかったので、少し試してみました。
```Array<(Int, Int)>```型でやりました。

#現状
```tupleArray```（```Array<(Int, Int)>```型）の中に```(0, 0)```があるかを調べたかったら、このように書く必要があります。

```swift

let tupleArray = [(0, 0), (5, 5)]

tupleArray.contains { t -> Bool in
    t.0 == 0 && t.1 == 0
}

// true
```
使いづらいです。

普通の```Array```（```[Int], [String]```）だったら、

```swift

let intArray = [1, 2, 3]
intArray.contains(2) // true
```
と簡潔に書けるのに。。。

#方法

演算子の定義を行い、さらに、```SequenceType```に```Extension```を与えます。

```swift

func == <T: Equatable, U: Equatable>(lhs: (T, U), rhs: (T, U)) -> Bool {
    return lhs.0 == rhs.0 && lhs.1 == rhs.1
}

extension SequenceType where Self.Generator.Element == (Int, Int) {
    func contains(element: (Int, Int)) -> Bool {
        return contains { $0 == element }
    }
}
```

すると、

```swift

tupleArray.contains((0, 0)) // true
tupleArray.contains((5, 0)) // false
```

このように見やすく書けるようになりました。

#質問

一般化しようとして、

```swift

extension SequenceType {
    func contains<T, U where T: Equatable, U: Equatable, Self.Generator.Element == (T, U)>(element: (T, U)) -> Bool {
        return contains { $0 == element }
    }
}
```
と書いたのですが、

```
 error: cannot convert value of type '(T, U) -> Bool' to expected argument type '_ -> Bool'
        return contains { $0 == element }
                        ^~~~~~~~~~~~~~~~~~~
```
このようなエラーが出てきてしまいます。


また、

```swift

extension SequenceType where T: Equatable, U: Equatable, Self.Generator.Element == (T, U) {
    
}
```
```extension``` に対して genericsを使ったwhere文で型を指定する方法も分かりませんでした。

---

解決策、なにかアドバイスをいただけると とてもうれしいです。
よろしくお願いします。

# 追記
Qiitaでのコメント、Swift Slackでのご回答ありがとうございました。

根本的な原因は分かりませんでしたが、```==```演算子だけを定義し、
この書き方で妥協すれば汎用的に```(T: Equatable, U: Equatable)```に対応できます。

```swift
func == <T: Equatable, U: Equatable>(lhs: (T, U), rhs: (T, U)) -> Bool {
    return lhs.0 == rhs.0 && lhs.1 == rhs.1
}

let tupleArray2 = [("a", 1), ("b", 2)]
tupleArray2.contains { $0 == ("a", 1) } // true
tupleArray2.contains { $0 == ("c", 1) } // false
```

#参考
[stackoverflow -> how-do-i-check-if-an-array-of-tuples-contains-a-particular-one-in-swift](http://stackoverflow.com/questions/29736244/how-do-i-check-if-an-array-of-tuples-contains-a-particular-one-in-swift)
Clojure プログラマがシダを描画する


「プログラ **ムで** シダを描画」の誤植じゃないかって.
一年ほど提出が遅れ ([「プログラムでシダを描画する」一覧](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd) 参照) ましたので, 普段 Clojure プログラムを書いているプログラマの私が, 鉛筆とペンで紙に描画しました.
よろしくご査収のほどお願い致します.

1. 鉛筆で葉っぱを書きます.
![2015-11-16 00.42.24.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/6d2f7d2c-303d-1707-2934-905839fb415c.jpeg "2015-11-16 00.42.24.jpg")

2. 再帰的に葉っぱを書きます.
![2015-11-16 00.46.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/6accaf44-1ec7-8d11-2352-a74337ea8cc4.jpeg "2015-11-16 00.46.53.jpg")

3. さらに再帰的に葉っぱを書きます.
![2015-11-16 00.54.32.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/5d3543a7-1728-b403-f053-b953c0901a01.jpeg "2015-11-16 00.54.32.jpg")

4. 鉛筆を薄く消して, 茎をペンで書きなおし, ついでにもう一段再帰的に葉っぱを書きます.
![2015-11-16 01.09.32.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/70a18215-b902-5627-9bb7-cdb2cc159d87.jpeg "2015-11-16 01.09.32.jpg")

5. 疲れました.
![2015-11-16 01.53.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/52ff0579-c8a0-044e-f0a2-b31b9d77b54c.jpeg "2015-11-16 01.53.40.jpg")

6. 背景を鉛筆で塗ってサインを書きます.
![2015-11-16 01.57.57.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/9ce3a2c1-f6a2-c3bd-05e5-adafbc334c1d.jpeg "2015-11-16 01.57.57.jpg")

7. 道具
![2015-11-16 02.00.31.jpg](https://qiita-image-store.s3.amazonaws.com/0/12593/96d93213-9c76-5a22-4e3d-82f2d3b150c2.jpeg "2015-11-16 02.00.31.jpg")

  * 2B鉛筆 ([STAEDTLER Mars Lumograph](https://www.google.co.jp/search?q=mars+lumograph))
  * 万年筆 ([Reform 1745](https://www.google.co.jp/search?q=reform+1745))
  * 消しゴム ([STAEDTLER Mars Plastic](https://www.google.co.jp/search?q=mars+plastic))
  * クロッキー帳 ([MARUMAN MPS C01 SQ](http://www.e-maruman.co.jp/products/detail.php?product_id=1639))

### プログラムで描かないんですか?

Clojure でやられている方は何人かいらっしゃるので, 僭越ですが, 拙作もあげておきます.

* [コード](https://gist.github.com/kohyama/98a11e9048748cf0e0cf)
* [動画](https://www.youtube.com/watch?v=O4qJxVH9CCg&feature=youtu.be)
TexStudioをEl Capitanで使うまでにしたこと


はじめに
-------
El Capitan環境で，TexStudio動けるようにしたのでそのメモです．

参考
----
- [TeX Live/Mac](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%20Live%2FMac#elcapitan) (だいたいここに書いてる)

環境
----
- GPL Ghostscript 9.16 (2015-03-30)

やったこと
---------
```
# mactex容量大きいのでやめた
#$ brew cask install mactex 
$ brew cask install basictex
$ sudo tlmgr update --self --all
$ sudo tlmgr install collection-langjapanese

# 和文フォントにシンボリックリンクを張るスクリプトを実行
$ cd /usr/local/texlive/2015basic/texmf-dist/scripts/cjk-gs-integrate
$ sudo perl cjk-gs-integrate.pl --link-texmf --force
$ sudo mktexlsr
$ sudo updmap-sys --setoption kanjiEmbed hiragino-elcapitan 

$ brew cask install texstudio
$ brew install ghostscript
```

エラー対策
--------

#### コンパイラが通らない
このままtexstudioを実行すると，下のようなエラーがでました

```
dvipdfmx:warning: Filtering file via command -->rungs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -sOutputFile='/var/folders/y8/c5gnp47j4czcwm1rcjvdmtt00000gn/T//dvipdfm-x.5c4b8a4cbabef2ac306aa77efb67db36' './img/zu.eps' -c quit<-- failed. dvipdfmx:warning: Image format conversion for "./img/zu.eps" failed... dvipdfmx:fatal: pdf_ref_obj(): passed invalid object. Output file removed.
```

これの対策として，dvipdfmx.confを書き換えます(参照:[epsファイルで図を表示しようとするとdvipdfmxで失敗する](http://kitofuyu.hatenablog.com/entry/20101006/1286394436))
ちなみに，自分の環境では，`/usr/local/texlive/2015basic/texmf-config/dvipdfmx/dvipdfmx.cfg`にありました．

```bash:shell
$ vim /usr/local/texlive/2015/texmf-config/dvipdfmx/dvipdfmx.cfg
D  "rungs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -sOutputFile='%o' '%i' -c quit"
↓
D  "gs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -sOutputFile='%o' '%i' -c quit"
```

---
#### 日本語が表示されない
texStudioのコンパイラは通ったのですが，texStudioのpdfビューワでは日本語が表示されませんでした．
このエラーは，texStudio組み込みのビューワのみで日本語が表示されません．ほかのビューワだと表示することができました．
以下で，組み込みビューワでも日本語が表示することができました

- 参照:[TeXstudioの組み込みPDFビューアで日本語を表示させる(Mac)](http://hayate.me/archives/31)

```bash:shell
$ brew install poppler
$ ln -s /usr/local/Cellar/poppler/0.37.0/share/poppler /usr/local/share/poppler
```

はまったこと
----------
texStudioの組み込みビューワで日本語が表示できないのに個人的にはまりました．最初にmactexそのままインストールした状態でつかっことが原因だと思われますので，`tlmgr update`は必須かと．
Raspberry PiのCPU温度をvcgencmdで簡単に取ってみる

Raspberry Pi 1 Model Bをradikoの録音に使用していますが、
頻繁に固まるためCPU温度と電圧を取ってみました。
（ポリスイッチ絡みだと予想はしているものの、他の要素を排除したかったのもあり）

下記で計測できます。

```
$ cat /sys/class/thermal/thermal_zone0/temp
40084
```

しかし1/1000する必要があるようです。

でもこちらでもCPU温度を取れます。

```
$ vcgencmd measure_temp
temp=39.0'C
```

ちなみに、電圧とかもとれます。

```
$ vcgencmd measure_volts
volt=1.20V
```

こんな感じで、ためしにログを取ってみましょう

```
#!/bin/bash

file=cpu_volts_log.csv
temp=`vcgencmd measure_temp 2>&1`
volts=`vcgencmd measure_volts 2>&1`

if [ -e ${file} ]; then
  echo ${temp}","${volts} >> ${file}
else
  echo ${temp}","${volts} > ${file}
fi

```

今回はcsvにしましたが、出力されたファイルを加工するなりするとよろしいかと。

cronでこのログを取るファイルを実行し、出力されたファイルをdropboxにアップロードするスクリプトを書いて運用してみようと思います。