OmniAICreator/Qiita-1.07M huggingface dataset:
sbt + Spark で分散処理するときの注意ネタ

sbt を使用して Spark を分散実行するとソース内の無名内部クラスに対して `ClassNotFoundException` が発生する。この場合、一度 JAR を作成して明示的に `SparkContext` に指定すると解消する。

```scala
val sc = new SparkContext("spark://...", ...)
sc.addJar("./target/scala-2.10/myproject_2.10-1.0-SNAPSHOT.jar")
```

sbt から実行するときに `package` `run` の順序でコマンドを指定して該当 JAR が作成されてから実行するように起動すれば良い。

```bash
$ sbt package run
```

`sbt run` はコンパイル済みクラスを `target/classes` から参照するが、Spark はクラスパス上の無名内部クラスの *.class ファイルを分散処理の各ノードに配布していないような感じ。1.x～1.5 まで確認しているが後のバージョンで改善されるかも知れない。まぁ粒度が高いと転送パフォーマンスも悪いので JAR 化は必ずしましょう。
[awk] sub関数とgsub関数の違い

混乱することがあったのでまとめておきます。

# 文字列の置換をするsub関数とgsub関数

sub関数とgsub関数はどちらも文字列の置換を行う関数です。

違いですが、sub関数は呼び出されるとはじめに正規表現に適合した文字列が置換されるだけで最大１回の置換が行われます。

それに対し、gsub関数は正規表現に適合する全ての文字列を置換します。なので、置換回数は１回に限りません。

では、具体的な例を載せておきます。

# データ例

適当に以下のデータが"test.dat"というファイルに保存されているとします。

```
1 yamada_taro tokyo_to
2 kimura_hanako kanagawa_ken
3 takahashi_jiro kyoto_hu
4 sato_momoko osaka_hu
5 tanaka_akane fukuoka_ken
```

# sub関数の使用例

```awk
awk '{
    sub("_", "-");
    print $0;
}' test.dat
```

最初に"_"が見つかる名前のカラムだけがアンダーハイフンからハイフンに置換されます。

```
1 yamada-taro tokyo_to
2 kimura-hanako kanagawa_ken
3 takahashi-jiro kyoto_hu
4 sato-momoko osaka_hu
5 tanaka-akane fukuoka_ken
```

# gsub関数の使用例

```awk
awk '{
    gsub("_", "-");
    print $0;
}' test.dat
```

名前のカラムだけでなく、都道府県のカラムもアンダーハイフンからハイフンに置換されます。

```
1 yamada-taro tokyo-to
2 kimura-hanako kanagawa-ken
3 takahashi-jiro kyoto-hu
4 sato-momoko osaka-hu
5 tanaka-akane fukuoka-ken
```
vimでCSVの特定カラムでハイライトを行う


vimでCSVを見やすくするためにコマンドを打つとハイライトを行うようにするスクリプト。
.vimrcに追加する。
[ここ](http://vimwiki.net/?tips%2F47)を参考にしてカーソル位置のカラムのハイライトも行うようにした。

# ソース

```vim:.vimrc
" csvファイルハイライト「:Csv [数値]」 と打つと、csvファイルで[数値]カラム目のハイライトをしてくれる
function! CSVH(x)
   execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
   execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)

" 「:Csvs」と打つと、現在のカラムをハイライトしてくれる
command! Csvs :call CSVH(strlen(substitute(getline('.')[0:col('.')-1], "[^,]", "", "g")))

" Csv系のコマンドのハイライトを消す
command! Csvn execute 'match none'
```

# 使い方
指定したNカラムをハイライト→`:Csv 2`
現在カーソル位置のカラムをハイライト→`:Csvs`
ハイライトした色を消す→`:Csvn`

※Csv 2の「2」は0から数えたカラム位置。
　aaa,bbb,ccc,dddというデータがあった場合、cccをハイライト表示する。

コマンド名は好きに変えられるので使いやすいように。
（vimでユーザコマンドを作るときは最初の文字が大文字じゃなくてはならないので注意）

~~リアルタイムでカーソル位置のカラムをハイライトするようにしようと思ったけど思いつかなかったのでここで終わり。なんかいい方法あるかな？~~

# 追記
簡単ではあるけどリアルタイムでカーソル位置ハイライトができたので追記。
「:Csva」と打つとリアルタイムでハイライトしてくれるようになります。もう一度打つと停止（色はそのまま残る）

```vim:
" 「:Csva」と打つと、リアルタイムに現在のカラムをハイライトにしてくれるもう一度打つと停止
function! CSVH_SAVE_CURSOR()
   let g:CsvaFlg = get(g:, 'CsvaFlg', 0)
   if g:CsvaFlg == 1
      execute 'match Keyword /^\([^,]*,\)\{'.strlen(substitute(getline('.')[0:col('.')-1], "[^,]", "", "g")).'}\zs[^,]*/'
   endif
endfunction
augroup CsvCursorHighlight
    autocmd!
    autocmd BufWinEnter,InsertLeave,CursorHold * call CSVH_SAVE_CURSOR()
augroup END
function! CSVA()
   let g:CsvaFlg = get(g:, 'CsvaFlg', 0)
   if g:CsvaFlg == 0
      let g:CsvaFlg = 1
   else
      execute 'match none'
      let g:CsvaFlg = 0
   endif
endfunction
command! Csva :call CSVA()
```

好みで.csv形式のファイルが開いた時に自動で「csva」コマンドを実行するのを入れてもいいかもしれない

```vim:
autocmd BufNewFile,BufRead *.csv execute'Csva'
```

---------------------------

指定したカラムのみを表示するコマンドもあるので[こちら](http://qiita.com/rita_cano_bika/items/8383b46018838c113809)も合わせてぜひ。
inputの値によってHTML要素を出したり消したりするjQueryプラグイン作った

# inputの値によってHTML要素を出したり消したりするjQueryプラグイン作った

## 経緯

割とよくあるのが、「このチェックボックスがONのときはこっちのUI表示して、OFFのときはあっちのUI表示して」みたいな仕様。

それをちょっと楽にできる`toggleForm`というプラグインを勉強がてら作ってみた

## ダウンロード

https://github.com/nmbakfm/toggleForm

ここからダウンロードできます。

ちなみに、bowerを使っていれば、

```
bower install toggleForm
```

でもOKです。

## 使い方

```html
<p>"abc"を入力したらメッセージが表示されるよ</p>
<input id="input-field" type="text" /><br/>
<span id="text-abc">正しい入力です！さすが！</span>

<script type="text/javascript">
$(function(){
  $("#input-field").toggleForm({
    value: "abc",
    targetSelector: "#text-abc"
  })
});
</script>
```

この例だと、inputのフィールドに"abc"が入力されたときに"正しい入力です！さすが！"と褒め称えてくれます。

## option

|field||
|:--:|:---|
|value|inputの値がこの値とどういう関係か(operation)で表示されるかどうかが決まります。|
|operator|`=`, `!=`, `>`, `>=`, `<`, `<=`, `checked`, `unchecked` が選択できます。. `=` がデフォルトです|
|targetSelector|出したり消したりする要素のセレクタを指定します。|
|onTargetShown|`targetSelector`が表示されたとき、呼ばれるコールバックです。|
|onTargetHidden|`targetSelector`が消えたとき、呼ばれるコールバックです。|

## まとめ

誰か、githubのREADMEの英語をなおしてください。。。orz
ActiveAdmin で初期ユーザーを作成する方法

# 方法1

ActiveAdmin が seed ファイルを用意してくれているので

`$ rake db:seed` すれば良い。

この場合はおそらく、次のデータが作成される。 

email: admin@example.com
password: password

( 詳しくは db/seeds.rb を見てみよう )

# 方法2


pry ( Rails のコンソール ) で直接作っても良い。

プロジェクトに移動する。

`cd /path/to/project`

Rails のコンソールを立ち上げる。

`$ bundle exec rails console`

ActiveAdmin のユーザー作成メソッドを実行する。

`pry(main)> AdminUser.create!(:email => 'admin@example.com', :password => 'password')`

入力したパスワードは暗号化され、ユーザーが作成される。

### バージョン

- ActiveAdmin 4.2.4

### 補足

[ActiveAdminでRails管理画面を作成](http://easyramble.com/rails-active-admin.html) を参考にした。

上記のページでは password_confirmation ( パスワードの確認 ) というパラメータを渡しているが、自分の環境では必要なかった。
email と password を指定するだけで動いた。




<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
grafana-zabbixのインストール&初期設定

#概要
Zabbixのデータをソースとして、Grafanaでサーバの状態を可視化できるgrafana-zabbixのインストール〜初期設定までの手順です。

http://play.grafana-zabbix.org/ にオンラインのデモ環境があります。
とてもステキな感じです。
![スクリーンショット 2015-10-21 16.38.36.png](https://qiita-image-store.s3.amazonaws.com/0/52904/2c6caea7-5ba6-2016-8c15-91fbb8bf1d49.png)


#環境
すでにZabbixサーバ(2.4系)がインストールされているCentOS6上で構築しました。
Zabbixサーバは2.2系以下だと設定が若干異なるようです。
https://github.com/alexanderzobnin/grafana-zabbix/wiki/Installation#note-for-zabbix-22-or-less
Grafanaは未インストールの状態です。今回は2.0系を使います。


#インストール
##Grafanaインストール
grafana2.0系をインストールします。

```
yum install -y fontconfig
wget https://grafanarel.s3.amazonaws.com/builds/grafana-2.0.2-1.x86_64.rpm
rpm -ivh grafana-2.0.2-1.x86_64.rpm
service grafana-server start
```

##grafana-zabbixのインストール
```
wget https://github.com/alexanderzobnin/grafana-zabbix/archive/v2.0.0.tar.gz
tar zxvf v2.0.0
mv grafana-zabbix-2.0.0/zabbix /usr/share/grafana/public/app/plugins/datasource/
```


#zabbixへGrafana用ユーザー追加
zabbix上で、grafana連携用のユーザーを作成します。
Grafanaで表示させたいサーバの読み取り権限が必要です。

ここでは

```
ユーザー名：grafana
パスワード：passwd
```
とします。

![スクリーンショット 2015-10-21 17.04.09.png](https://qiita-image-store.s3.amazonaws.com/0/52904/9613240c-7f20-70e7-1804-1433266c1810.png)


作成したユーザー情報を設定ファイルに記述して、Grafanaを再起動します。

```
vi /usr/share/grafana/public/app/plugins/datasource/zabbix/plugin.json
-----
:
  "username": "grafana",
  "password": "passwd",
:
-----

/etc/init.d/grafana-server restart
```

#ダッシュボード設定
ブラウザでGrafanaにログインします。
デフォルトでは3000番ポートで起動します。
**http://servername:3000**
初期状態では。admin/adminでログインできます。

左ペインの[Data Sources]から[Add New]を開いて、Zabbixサーバをデータソースとして登録します。

![スクリーンショット 2015-10-21 17.14.50.png](https://qiita-image-store.s3.amazonaws.com/0/52904/64c1aafb-d9cf-e932-32ff-900b8628148b.png)

NameとTypeを**Zabbix**とします。
Urlは、zabbixサーバのAPI(api_jsonrpc.php)のURLを入力します。
Accessは**direct**に変更します。
ZabbixAPIdetailsにZabbixサーバで作成したGrafana用ユーザーの情報を入力します。

これで設定は完了です。


#ダッシュボード作成
新規でダッシュボードを作るには、トップページからHomeを開き、Newボタンをクリックします。

![スクリーンショット 2015-10-21 17.19.33.png](https://qiita-image-store.s3.amazonaws.com/0/52904/1e758a33-c940-6483-1dcf-a871846095c1.png)

すると空のダッシュボードが作成されます。
![スクリーンショット 2015-10-21 17.21.12.png](https://qiita-image-store.s3.amazonaws.com/0/52904/bf69e854-2932-1d9a-44fe-91d7f2186e10.png)

緑色のバーをクリックするとAddPanelから項目を追加できます。（ここではgraphで作成します）
![スクリーンショット 2015-10-21 17.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/52904/724b6e19-564d-9d6c-f6a9-b7d83857606f.png)

グラフの雛形が作成されますので、タイトル（no titleの部分）からeditをクリックします。
![スクリーンショット 2015-10-21 17.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/52904/16b95254-e815-913a-00fb-46ae546bb972.png)

Metricsのタブの下部にあるデータソースをzabbixに変更すると、zabbixの監視パラメーターが選択できるようになります。
![スクリーンショット 2015-10-21 17.28.53.png](https://qiita-image-store.s3.amazonaws.com/0/52904/83777e61-04b8-bb46-f6db-241b0e52c1fd.png)

あとは、通常のGrafanaと同じように設定していけば、お好みのダッシュボードが作成できると思います！
API経由だからか表示がちょっと重いかなという印象です。

#参考
GitHub
https://github.com/alexanderzobnin/grafana-zabbix
Storyboard/XibのAutoLayoutのレビューを自動化する

現在、[家族アルバム みてね](https://mitene.us/)というアプリのAutoLayout対応を進めていて、弊チームでは以下の3つのルールを対応必須とすることにしてみました。

1. 全てのStoryboard/Xibでuse AutoLayoutのチェックを有効にする
2. 全てのStoryboard/Xibでuse SizeClassesのチェックを有効にする
3. AutoLayoutのmisplacedは必ず解消した状態でコミットする

AutoLayoutはとにかく仕様が複雑で開発するのが大変なので、少しでも楽にしていくために最低限機械的にチェックできるところを自動化しました。

```bash:circle/review_view_files.sh
#!/bin/bash

! find . -name '*.xib' -o -name '*.storyboard' | xargs grep misplaced 2>&1 > /dev/null && \
  ! find . -name '*.xib' -o -name '*.storyboard' | xargs grep -L 'useAutolayout="YES"' 2>&1 > /dev/null && \
  ! find . -name '*.xib' -o -name '*.storyboard' | xargs grep -L 'useTraitCollections="YES"' 2>&1 > /dev/null
```

これをCircleCIなどCI上で実行するようにすると、1,2,3の条件をすべてパスしなかった時にfailするようになります。
以下設定例です。

```yaml:circle.yml
machine:
  xcode:
    version: "7.0"
test:
  pre:
    - circle/review_view_files.sh
```
PHPWordを触ってみた

#PHPWordを触ってみた

PHPOfficeにはPHPExcelの他に、PHPWordやPHPPowerpointがあるのをご存じでしょうか？

とりあえず、その中でPHPWordを触ってみました。

https://github.com/PHPOffice/PHPWord

##導入
README通りに進めます。

composer.json

```
{
    "require": {
       "phpoffice/phpword": "dev-master"
    }
}

```

で、`composer update`でインストール完了

##書いてみる

```php
<?php
require_once 'vendor/autoload.php';
$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();
//文字
$section->addText(
    'ほげほげほげたろー',
    array('name' => 'ＭＳ ゴシック', 'size' => 20, 'color' => '66FFFF', 'bold' => true)
);
//改行
$section->addText(
    'ほげほげほげたろー',
    array('name' => 'ＭＳ ゴシック', 'size' => 20, 'color' => '66FFFF', 'bold' => true, 'italic' => true, 'underline' => 'dash')
);

//てーぶる
$tableStyle = array(
    'borderColor' => '006699',
    'borderSize' => 6,
    'cellMargin' => 50
);
$table = $section->addTable($tableStyle);
$table->addRow();
$table->addCell(2000, array('bgColor' => 'FFFF66'))->addText('あああ');
$table->addCell(2000, array('bgColor' => 'FF6666'))->addText('いいい');

$table->addRow();
$table->addCell(2000, array('bgColor' => '66FF66'))->addText('ううう');
$table->addCell(2000, array('bgColor' => '6666FF'))->addText('えええ');
//画像
$section->addImage('test.jpg');

// Saving the document as OOXML file...
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('helloWorld.docx');
```

これで何かとりあえずワードの文章ができました！
![word画像.png](https://qiita-image-store.s3.amazonaws.com/0/54588/0ccb0b56-ef78-bd21-d06e-3fa8e84738c3.png)


## まとめ
上記例ではテンプレートなしで作業しましたが、テンプレートも使用ができます。

また、ネットには日本語は対応してないって記事が結構ありますが現在は普通に対応しているので日本語でもそのままPHPWordが使えます。

細かい調整はやや難しそうですが、テンプレートから値を埋め込むなどの対応で可能な範囲であれば問題なく使用できそうです！

## 追記
PDFで出せないのって話が出たのでちょっと試してみました。

```php
//tcpdfのダウンロードが必要
\PhpOffice\PhpWord\Settings::setPdfRendererPath('./tcpdf');
\PhpOffice\PhpWord\Settings::setPdfRendererName('TCPDF');

$objWriter2 = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'PDF');
$objWriter2->SetFont('kozminproregular', '', 12);// 日本語フォント
$objWriter2->save('helloWorld.pdf');
```

で、とりあえずは出来ました。

[tcpdf](http://www.tcpdf.org/)

ただ、テーブルの背景色や画像などが取ってこれなかったです。

![word-pdf画像.png](https://qiita-image-store.s3.amazonaws.com/0/54588/e20974f2-9199-3ca1-43a9-fda519e72282.png)


もしかしたら、PDF変換ツールを別のものに置き換えればもっときれいに出るかもですがとりあえず出来なくはないというところまで。
Railsで既存DBのModelを生成する



普通にmodelを生成して扱おうと思っていたら
`rails mysql2 error table doesn't exist`
が出てしまった。解決に手間取ったのでメモ


`self.table_name`で解決できる。
まずは、`migration`を作成したくないので--`migration=false`オプションをつけてモデルを生成する。

```bash:
$ bundle exec rails g model user --migration=false
```
そして、モデルクラスに既存のテーブル名を指定する。

```
class User < ActiveRecord::Base
    self.table_name = 'user'
end
```
processingでAndroid端末から画像印刷

Processingから直接プリントジョブを送るわけではないですが、
Android用のプリントアプリを介して印刷できたのでメモします。

プリンタがEPSONだったので、以下のような流れになりました。

1. Android端末にEPSONの無料プリントアプリ「EPSON iPrint」を入れる。

2. Processingから画像のシェアを要求。

3. シェアのリストから「EPSON iPrint」を選んで印刷。

~~~java

import android.view.MotionEvent;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.app.Activity;

Intent intent;

void setup () {
	size (displayWidth, displayHeight, JAVA2D);
  	colorMode (RGB, 256);
	background (255);
	//Android端末のファイル保存環境を取得
	intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()));
}

void draw () {
	fill (random (256), random (256), random (256));
	ellipse (random (width), random (height), 20, 20);
}

void mouseReleased () {
	//Android端末に画像を保存
	save_image ();
}

void save_image () {
	String img_name = Environment.getExternalStorageDirectory() + "/test_image.png";
	save (img_name);
	sendBroadcast (intent);
	//保存した後プリントアウト
	print_out (img_name);
}

void print_out (String img_path) {
	Intent shareIntent = new Intent (Intent.ACTION_SEND);
	shareIntent.setType ("image/png");
	shareIntent.putExtra (Intent.EXTRA_STREAM, Uri.fromFile (new File (img_path)));
	startActivity (shareIntent);
}

~~~
続Node.jsでメールが届いたタイミングでごにょごにょする場合

## おさらい

以前、[メールが届いたタイミングでごにょごにょする場合のメモ](http://qiita.com/khirose/items/a064a6585e569d9ff017)として、node.js製のSMTPエージェントの[Mailin](http://mailin.io/)というプロダクトを紹介しましたが

> * Wellknownの25番ポートで起動させるにはroot権限が必要
> * 他のアプリ(PHPとかRails)などでメールを使う場合のことを考えると、こいつ専用にドーンと1台構えないといけないのは負担かも

と書いてましたが、ずっとこれ使えないのかなあ・・・と悶々としておりました
汎用的なメールは実績あるMTAやMDAにお任せするとして、処理をさしこみたい特定のメールアドレスやドメインだけこいつで処理をしたかっただけなんです

## Postfixとの組み合わせなら使えるんじゃね？

そう、Postfixにはドメインやメールアドレスなどの配送先に応じてさらにどこかに配送を委任するような[Transport](http://www.postfix.org/transport.5.html)という機能がありまして、 someone@example.com は一度ウチのサーバで受け取るけどMailinの動いている(ホストのWellknown以外の番号)ポートにSMTPでリレーしますというような設定ができます

Postfixのmain.cfの変更とtransport_mapを準備しなきゃいけないわけですが、これで一応汎用的なMTAとMailinの共存ができそうですね

## めでたしめでたし・・・なんですが

実は最近、空メール含めてあんまりメールドリブンで何か起こすような処理って殆ど書いてないんですよね
やるとすればSlackとかに内容そのままコピペとか？

そもそもメールインフラを自前で組むということもめっきり減りまして


* 送信→[SendGrid](http://sendgrid.com/)でええやん
* 独自ドメインで受信→[Google Apps](https://www.google.com/work/apps/business/)や[Office365](http://www.microsoft.com/ja-jp/office/365/default.aspx)使って、どうぞ

メールの送受信に関するQ&Aやトラブルに巻き込まれるのが嫌で、すっかりこんな感じになってしまいました
Android: apk から取得できる情報いろいろ

## 概要
Android アプリケーションパッケージであるところの apk ファイルから取得できる諸々の情報。

## パッケージ名 (バンドルID)
```
$ aapt l -a hoge.apk | grep "A: package"
    A: package="com.abc.hoge" (Raw: "com.abc.hoge")
```

## アプリケーション名・アイコン
```
$ aapt d badging hoge.apk | grep "application:"
application: label='HogeApp' icon='res/drawable/app_icon.png'

$ unzip hoge.apk
$ ls -l res/drawable/app_icon.png
-rw-rw-rw-  1 user 0 8121 2015-10-01 00:00 res/drawable/app_icon.png
```

## アプリケーションバージョン
```
$ aapt l -a hoge.apk | grep "android:version"
    A: android:versionCode(0x0101021b)=(type 0x10)0x4
    A: android:versionName(0x0101021c)="1.4" (Raw: "1.4")
```

## SDKバージョン
```
$ aapt l -a hoge.apk  | grep "SdkVersion"
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x4
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0xf
```

## メインアクティビティ
```
$ aapt d badging hoge.apk | grep "activity"
launchable-activity: name='com.abc.hoge.MyActivity'  label='HogeApp' icon=''
```

## 全アクティビティ

```
$ aapt dump xmltree hoge.apk AndroidManifest.xml | grep -A 3 "E: activity"
…
      E: activity (line=18)
        A: android:label(0x01010001)=@0x7f050000
        A: android:name(0x01010003)="com.abc.hoge.MyActivity" (Raw: "com.abc.hoge.MyActivity")
        A: android:configChanges(0x0101001f)=(type 0x11)0x40000fff
--
      E: activity (line=26)
        A: android:theme(0x01010000)=@0x103000a
        A: android:label(0x01010001)=@0x7f050000
        A: android:name(0x01010003)="com.abc.hoge.SecondActivity" (Raw: "com.abc.hoge.SecondActivity")
--
      E: activity (line=30)
        A: android:theme(0x01010000)=@0x1030010
        A: android:label(0x01010001)=@0x7f050000
        A: android:name(0x01010003)="com.facebook.FacebookActivity" (Raw: "com.facebook.FacebookActivity")
…
```

## パーミッション
```
$ aapt l -a hoge.apk | grep -i permission
…
    E: uses-permission (line=4)
      A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
    E: uses-permission (line=6)
      A: android:name(0x01010003)="android.permission.ACCESS_NETWORK_STATE" (Raw: "android.permission.ACCESS_NETWORK_STATE")
…
```

## 署名 (キーストア)
```
$ unzip hoge.apk
$ keytool -printcert -file META-INF/CERT.RSA
所有者: C=JP, ST=Tokyo, L=Dokoka, O=Abc Inc.
発行者: C=JP, ST=Tokyo, L=Dokoka, O=Abc Inc.
シリアル番号: xxxxxxx
有効期間の開始日: Sat Aug 01 12:00:00 JST 2015終了日: Mon Aug 01 12:00:00 JST 2050
証明書のフィンガプリント:
         MD5:  XX:XX:…:XX:XX
         SHA1: XX:XX:…:XX:XX
         SHA256: XX:XX:…:XX:XX
         署名アルゴリズム名: SHA1withRSA
         バージョン: 3
```

## クラス
```
$ d2j-dex2jar hoge.apk
$ unzip *.jar
$ ls -lR
…
./com/google/ads:
AdRequest$ErrorCode.class
AdRequest$Gender.class
AdRequest.class
AdSize.class
mediation
…
./com/facebook/messenger:
MessengerThreadParams$Origin.class
MessengerThreadParams.class
MessengerUtils.class
ShareToMessengerParams.class
ShareToMessengerParamsBuilder.class
…
```
MySQL 日次、週次、月次の集計

注文テーブル

```mysql
> describe `order`;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| buyer_id    | bigint(20)   | NO   | MUL | NULL    |                |
| product_id  | bigint(20)   | YES  | UNI | NULL    |                |
| pay         | bigint(20)   | NO   |     | 0       |                |
| ...                                                                |
+-------------+--------------+------+-----+---------+----------------+
```

集計用のカレンダーを作成する

```mysql
CREATE TABLE `calendar` (
  `dt` datetime NOT NULL,
  PRIMARY KEY (`dt`)
)
```
カレンダーテーブルに日付を入れる

```mysql
DELIMITER |
CREATE PROCEDURE fill_calendar(start_date DATE, end_date DATE)
BEGIN
  DECLARE crt_date DATE;
  SET crt_date=start_date;
  WHILE crt_date < end_date DO
    INSERT INTO calendar VALUES(crt_date);
    SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
  END WHILE;
END |
DELIMITER ;

CALL fill_calendar('2000-01-01', '2099-12-31');
```


日次の取得

```mysql
SELECT
	DATE_FORMAT(c.dt,'%Y-%m-%d')
	, COUNT(o.id) order_count
	, COUNT(DISTINCT o.product_id) product_count
	, COUNT(DISTINCT o.buyer_id) buyer_count
	, IFNULL(SUM(o.pay), 0) total_pay
FROM
	calendar c
LEFT JOIN 
	`order` o
ON
	TO_DAYS(c.dt) = TO_DAYS(o.created_dt)
WHERE
	c.dt >= '2015-06-01 00:00:00'
	AND c.dt < '2015-07-01 00:00:00'
GROUP BY
	c.dt
ORDER BY 
	c.dt;
```

週次の取得

```mysql
SELECT
	STR_TO_DATE(CONCAT(YEARWEEK(c.dt, 1),' 1'), '%x%v %w') week_start_date
	, STR_TO_DATE(CONCAT(YEARWEEK(c.dt, 1),' 0'), '%x%v %w') week_end_date
	, COUNT(o.id) order_count
	, COUNT(DISTINCT o.product_id) product_count
	, COUNT(DISTINCT o.buyer_id) buyer_count
	, IFNULL(SUM(o.pay), 0) total_pay
FROM
	calendar c
LEFT JOIN 
	`order` o
ON
	YEARWEEK(c.dt,1) = YEARWEEK(o.created_dt,1)
WHERE
	YEARWEEK(c.dt,1) >= YEARWEEK('2015-06-01 00:00:00',1)
	AND YEARWEEK(c.dt) <= YEARWEEK('2016-07-01 00:00:00',1)
GROUP BY
	YEARWEEK(c.dt,1)
ORDER BY 
	YEARWEEK(c.dt,1);
```

月次の取得

```mysql
SELECT
	DATE_FORMAT(c.dt,'%Y-%m')
	, COUNT(o.id) order_count
	, COUNT(DISTINCT o.product_id) product_count
	, COUNT(DISTINCT o.buyer_id) buyer_count
	, IFNULL(SUM(o.pay), 0) total_pay
FROM
	calendar c
LEFT JOIN 
	`order` o
ON
	DATE_FORMAT(c.dt,'%Y%m') = DATE_FORMAT(o.created_dt,'%Y%m')
WHERE
	DATE_FORMAT(c.dt,'%Y%m') >= DATE_FORMAT('2015-06-01 00:00:00','%Y%m')
	AND DATE_FORMAT(c.dt,'%Y%m') <= DATE_FORMAT('2015-07-01 00:00:00','%Y%m')
GROUP BY
	DATE_FORMAT(c.dt,'%Y%m')
ORDER BY 
	DATE_FORMAT(c.dt,'%Y%m');
```


参考: http://www.media-division.com/using-mysql-generate-daily-sales-reports-filled-gaps/
lprコマンドで印刷する時のオプション項目の調べ方

```
$ lpoptions -l
```

↑ これでデフォルトのプリンターのオプション項目が調べられる。

```
$ lpstat -s
```

↑ プリンタ一覧はこれ

```
$ lpr -P PrinterName -o PageSize=○○ MediaType=○ FileName.png
```

↑ 実行するコマンドはこんな感じで指定
WPF 「MahApps.Metro」MetroWindowプロパティでよく使うやつ


```xml:XAML
<Controls:MetroWindow 
    xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
    ここに指定するプロパティでよく使うやつメモ>
```

### 1. ウィンドウの縁を指定

```xml:Border(ウィンドウがアクティブの時の色)
BorderBrush="{DynamicResource AccentColorBrush}"
```

```xml:Border(ウィンドウが非アクティブの時の色)
NonActiveBorderBrush="{DynamicResource AccentColorBrush}"
```

```xml:Glow(ぼやっとする　アクティブ時)
GlowBrush="{DynamicResource AccentColorBrush}"
```

```xml:Glow(ぼやっとする　非アクティブ時)
NonActiveGlowBrush="{DynamicResource AccentColorBrush}"
```

##### Ver1.65まで

```xml:Shadow(影ができる)
EnableDWMDropShadow ="True"
```

### 2. ウィンドウ位置，サイズ自動保存
次に起動したときにウィンドウ位置とサイズが復帰する

```xml(マルチモニタも大丈夫そう)
SaveWindowPosition="True"
```

### 3. ウィンドウが表示されるときスライドするのをオフにする
デフォルトはTrue。スライドしながらウィンドウが表示される。

```xml
WindowTransitionsEnabled="False"
```

### 4. ウィンドウのタイトルが大文字/小文字の設定

##### Ver1.65まで
デフォルトはTrue。Trueだと強制的に大文字になり、スペースがトリミングされる。

```xml
TitleCaps="False"
```

##### Ver2.0以降

```xml:大文字，小文字そのまま
TitleCharacterCasing="Normal"
```

```xml:大文字
TitleCharacterCasing="Upper"
```

```xml:小文字
TitleCharacterCasing="Lower"
```


### 5. ウィンドウのアイコンサイズを変更
※プロパティではないです。

```xml:例>縦横22
<Controls:MetroWindow …省略…>

    <Controls:MetroWindow.IconTemplate>
        <DataTemplate>
            <Image Source="{Binding}" Width="22" Height="22" />
        </DataTemplate>
    </Controls:MetroWindow.IconTemplate>
```
bundle install の速度を1.5倍 にする方法。 ( 並列実行 )


`$ bundle install -j4`


これで4並列でインストールしてくれる。

4 というのは立ち上げるワーカーの数。
なぜ「4」なのかというと、端末のCPUコア数に合わせているからだ。

なので、走らせる環境が 8 コアなら、たぶん `$ bundle install -j8` でも良いはず。


　
---

「bundle install 速度」で検索してもヒットしなかったので投稿。

詳しくは [Bundlerで並列処理？？bundle installを爆速で処理する方法。](http://qiita.com/camelmasa/items/5ca27ab398f105f86c76) を参照。

公式: http://bundler.io/v1.5/whats_new.html
( この解説によると、40% - 60% ぐらいの速度改善が見込まれるらしい )

　
---

Thanks to Hattori



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Appleに学ぶ、横スクロールナビを組む時のCSSメモ

# やりたいこと
* 横スクロールするナビを組みたい … ①
* スマホ(iOS)で慣性スクロールにしたい … ②
* スクロールバー非表示にしたい … ③
* ②と③を両立させたい

# ① 横スクロールするナビを組みたい

![cap_ 2015-10-21 15.17.57.png](https://qiita-image-store.s3.amazonaws.com/0/48396/73ae271b-64de-5207-3cfc-5ec3224d30d4.png)

スマホサイトでよく見る上図のようなナビゲーションを組みたいとします。
今回は、一つ一つの `li` を `table-cell` にし、水平に並べつつ、ウィンドウからはみ出た分を `overflow-x: auto;` で横スクロールさせるシンプル組み方で考えます。

デモ → https://s.codepen.io/skwbr/debug/QjaBLV/NjrYzwNZpgwA
(コードは下記にて)

# ② スマホ(iOS)で慣性スクロールにしたい
`overflow: auto;` をかけている要素に下記を指定すればOK。

```css
-webkit-overflow-scrolling: touch;
```


# ③ スクロールバー非表示にしたい

webkit独自拡張の `::-webkit-scrollbar` を使用すると、スクロールバーのベース部分やバー部分の色を指定することができます。これを使えば透明にすることができます。
下記のサイトが分かりやすくまとめていました。

> cf. [iPhoneやAndroidのサイトでスクロールバーをカスタマイズ | スターフィールド株式会社](http://sterfield.co.jp/designer/iphone%E3%82%84android%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%90%E3%83%BC%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA.html)

# ②と③を両立させたい

しかしながら現時点のiOS Safariの仕様では、 `-webkit-overflow-scrolling: touch;` を指定していると、スクロールバーが非表示化できません。

![cap_ 2015-10-21 15.30.21.png](https://qiita-image-store.s3.amazonaws.com/0/48396/e072f381-3b4c-7f1c-854c-ff3c9b14a703.png)
↑こうなる

解決策として、
縦方向にも `overflow: hidden;` を使って、「本来スクロールバーが出てるはずの部分を隠してしまう」という手があります。

![hr-nav_2.png](https://qiita-image-store.s3.amazonaws.com/0/48396/3eb5d3cd-c704-38ce-2f7c-6addec9d5fa9.png)
↑ 本当は5emの高さの要素が横スクロールしていますが、見えているのは上3em分だけ。


# DEMOとコード

## DEMO
http://s.codepen.io/skwbr/debug/QjaBLV
是非スマホからどうぞ
コード付きは [こちら](http://codepen.io/skwbr/pen/QjaBLV)


## コード(html)

```html
<nav class="nav-horizontal">
  <div class="mask">
    <ul class="list">
      <li><a href="#">Alpha</a></li>
      <li><a href="#">Beta</a></li>
      <li><a href="#">Gamma</a></li>
      <li><a href="#">Delta</a></li>
      <li><a href="#">Epsilon</a></li>
      <li><a href="#">Zeta</a></li>
      <li><a href="#">Eta</a></li>
      <li><a href="#">Theta</a></li>
      <li><a href="#">Iota</a></li>
      <li><a href="#">Kappa</a></li>
      <li><a href="#">Lambda</a></li>
      <li><a href="#">Mu</a></li>
      <li><a href="#">Nu</a></li>
      <li><a href="#">Xi</a></li>
    </ul>
  </div>
</nav>
```

## コード(CSS)

スタイル目的の不要部分ははしょってます。フルで見る場合は [こちら](http://codepen.io/skwbr/pen/QjaBLV)

```css
.nav-horizontal {
  overflow: hidden;
  height: 3em; /* 可視領域の高さ */
  width: 100%;
}
.nav-horizontal .mask {
  height: 5em; /* 横スクロールする理屈上の高さ */
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;  /* 慣性スクロール */
}
.nav-horizontal .list {
  display: inline-table;
  max-width: 100%;
}
.nav-horizontal .list li {
  display: table-cell;
}

```

横方向にスクロールするラッパーを、さらにもう一段階縦方向にマスクするラッパーで囲んでいる感じです。


# 参考元
慣性スクロールとスクロールバーの両立が難しいことが分かった時に、
「あれ？Appleのサイトって横スクロール上手いことやってたよなあ」と思い出して、ソースを覗いたところこのやりかたをしてたので参考にさせていただきました。
他にもこんなやりかたあるよ、などアドバイスいただければ嬉しいです。

![cap_ 2015-10-21 15.36.47.png](https://qiita-image-store.s3.amazonaws.com/0/48396/a7739f05-ceec-3378-8cbb-ae1649f6645d.png)
React / flux の store のテスト

# 概要

* flux の store 部分のテストの書き方。
* jest を使う。
* 入力は Action。結果は Store の状態と Change Listener が呼ばれることを確認。
* localStorage のモック。

# テスト対象
```web/static/js/stores/AuthStore.js``` をテストします。
以下の機能を持っています。

* LOG_IN アクションを受け取ると token を localStorage に保存し、Change Listener に通知する。
* LOG_OUT アクションを受け取ると token を localStorage から削除し、Change Listener に通知する。

# 環境設定
elixir / phoenix の勉強用に作成した[サンプル](https://github.com/yasuhiro-okada-aktsk/sample_phoenix_react/tree/qiita-jest-flux-store) (tag qiita-jest-flux-store)を使って説明します。

```jest-cli```, ```react-addons-test-utils``` をインストールします。(npm に jest というパッケージもありますが別のものです。)

```bash
npm install jest-cli --save-dev
npm install react-addons-test-utils --save-dev
```

React 用に ```package.json``` に設定を書きます。
JSX / ES6 の変換、react 関連のモジュールのモック化の除外設定をしています。

```json:package.json
"jest": {
    "rootDir": "./web/static/js",
    "scriptPreprocessor": "../../../node_modules/babel-jest",
    "unmockedModulePathPatterns": [
      "react",
      "../../../node_modules/react",
      "../../../node_modules/react-dom",
      "../../../node_modules/react-addons-test-utils"
    ]
  }
```

# テスト作成
jest は ```__tests__``` ディレクトリにあるテストを実行するので、```__tests__``` ディレクトリを作成します。

```bash
mkdir web/static/js/stores/__tests__
```

```AuthStore-test.js``` を作成し、モックの設定をします。
jest はデフォルトで全てのモジュールをモック化するので、基本的には **モック化しないモジュール** のみ設定します。

```js:AuthStore-test.js
jest.mock('../../dispatcher/AppDispatcher');
jest.dontMock('../../constants/Constants');
jest.dontMock('../AuthStore');
```

AuthStore はテスト対象なので除外します。
Constatnts は入力用のアクションが定義されているため除外します。
AppDispatcher はモック化されるはずですが、なぜかモックにならなかったため、モックにするように設定しています。

jest の実行環境では localStorage がないため、localStorage のモックも作成します。

```js:AuthStore-test.js
var mock = (function() {
  var store = {};
  return {
    getItem: function(key) {
      return store[key];
    },
    setItem: function(key, value) {
      store[key] = value.toString();
    },
    clear: function() {
      store = {};
    }
  };
})();
Object.defineProperty(window, 'localStorage', { value: mock });
```

Store が AppDispatcher に登録したコールバックは、mock から取得します。

```js:AuthStore-test.js
callback = AppDispatcher.register.mock.calls[0][0];
```

このコールバックに Action を送ることで、Store の dispatcher を実行できます。

```js:AuthStore-test.js
  var actionLogIn = {
    type: ActionTypes.LOG_IN,
    token: 'abc'
  };
  callback(actionLogIn);
```

store から Change Listener 通知を確認するため、リスナーを作成し登録します。テスト実行後はリスナーを削除します。

```js:AuthStore-test.js
    var calledOnChange = false;
    let onChange = () =>  calledOnChange = true;

    Store.addChangeListener(onChange);
    callback(actionLogIn);
    Store.removeChangeListener(onChange);
```

```callOnChange``` はリスナーが呼ばれたことを確認するためのフラグです。

結果を確認します。

```js:AuthStore-test.js
    expect(Store.isLoggedIn()).toBeTruthy(); // ログイン状態の確認
    expect(Store.getToken()).toBe('abc'); // トークンの確認
    expect(calledOnChange).toBeTruthy(); // Change Listener が呼ばれたことの確認
```

ログアウトや初期値のテストを含めたテスト全体は[こちら](https://github.com/yasuhiro-okada-aktsk/sample_phoenix_react/blob/qiita-jest-flux-store/web/static/js/stores/__tests__/AuthStore-test.js)を参照してください。

# 参考

* [Jest | Painless JavaScript Unit Testing](https://facebook.github.io/jest/)
Tense

英語では3のテンスがあります。

Past
Present
Future


<h2>-past</h2> 
1. simple  　　　       　　　   私はごはん食べた  I ate rice   
2. continuous　　　　　私はごはん食べていた        I was eating rice
3. perfect　　　　　　　あなたが到着時に私はすべてのPizzaを食べてしまった。 I had eaten pizza when you arrived
 
 　　　　               （※過去に２つ出来事のなかで一つの出来事が次の出来事が始まるまで終わる場合）
                          

4.perfect continuous　　 あなたが到着するまでの2時間Pizza食べていました。
                                                       I had been eating pizza for 2 hours when you arrived. 


 （※過去に２つ出来事のなかで一つの出来事の開始点から２つ目の出来事が始まるまで続いてた場合）
                     

1.simple past : Helena CAME late in to THE class .
2.past continuous:  Helena WAS not SPEAKING loudly in THE class.
3. past perfect :   when I started THE class at nativecamp, khan HAD already FINISHED his class .
4. past perfect continuous :  At last Helena came to the class, I HAD BEEN WAITING for 30 minutes. 



<h2>-present</h2>　

 1. simple 
 2. continuous
 3. perfect
 4. perfect continuous




<h2>future</h2>

 1. simple
 2. continuous
 3. perfect
 4. perfect continuous
ZabbixでSSL証明書の有効期限監視(１つのサーバーに複数のホストがあるとき)

# 概要

* [ZabbixでSSL証明書の有効期限を監視する - Qiita](http://qiita.com/ma3ki/items/302205c0402c3746c9ff)

ここをみると、SSL証明書の有効期限を監視することができる。

しかし、１つのサーバーで、複数のホストをさばいていて、それらのホストそれぞれに証明書があるとき、監視したいホスト名を与えても、
IPで解決されるのか、そのうちの１つのホストの期限だけがかえってくる。

# 解決策

接続するときに以下の***-servername***を加えるとよい。

```
-servername 本当に調べたいホスト名
```

以下の部分を
```
openssl s_client -connect $1:$2
```
次のようにする

```
openssl s_client -connect $1:$2 -servername $1
```
JAVA-環境変数設定(Mac)

JAVAコマンドを入力するたびに、一々-cpオプションを指定するのは面倒なので、OSの環境変数という設定にクラスパスを登録したいと思います。

ファイルの構成はこの様な感じです。

![スクリーンショット 2015-10-21 16.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/95187/466af2af-05c6-65f7-1fa7-870f23b36f13.png)


eclipseで開発したsample1.java
![スクリーンショット 2015-10-21 16.05.11.png](https://qiita-image-store.s3.amazonaws.com/0/95187/0e0885ea-7894-69c1-008a-2f43b633fc3a.png)



▪️コマンド
export CLASSPATH=/Users/marimo/workspace/Sample/bin
java sample1



▪️実行結果
10
20
ruby2.2に上げたらシンボルで値が取れなくなった

- Ruby1.9.2-p326から2.2.3p173にアップ。Railsは3.2.17
 -  ActiveSupportのHashに設定した値が取れなくなっている 

```rb
   5:                                       add_params[:cmd],
(byebug) p add_params[:cmd] #値が取れない！

(byebug) p add_params #値は入っている
{"cmd"=>"listALL"}
```

- クラスを調べてみる

```rb
(byebug) p add_params.class #Hashになってる
Hash
(byebug)
   146:     debugger
=> 147:     add_params.reject{|k, v| EXCEPT_PARAM.include?(k.downcase)}
   148:   end
(byebug) p add_params.class
ActiveSupport::HashWithIndifferentAccess #reject前はHashWithIndifferentAccessクラス
(byebug) p add_params.reject{|k, v| EXCEPT_PARAM.include?(k.downcase)}.class
Hash #reject後Hashクラスになってしまっている！！
(byebug)
```

- rejectするとクラスがActiveSupport::HashWithIndifferentAccessからHashに変わってしまう！！
 - [Ruby 2.1.1 で Hash#reject のデグレらしい](http://diary.sorah.jp/2014/02/28/ruby211-hash-reject)

- 直す方法

```rb
   change_params = add_params.reject{|k, v| EXCEPT_PARAM.include?(k.downcase)}
   change(change_params)
…
  def change(change_params)
    change_params.each_with_object(ActiveSupport::HashWithIndifferentAccess.new){|(k, v), h| h[k] = v}
  end

```

- rejectした後にHashWithIndifferentAccessクラスに戻すようにした…他にいい修正方法あったら教えてください。
Spark-Javaとlombokを使う時のbuild.gradle

```groovy:build.gradle
def defaultEncoding = 'UTF-8' 

tasks.withType(AbstractCompile) each { it.options.encoding = defaultEncoding }

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'jetty'
apply plugin: 'eclipse-wtp'
apply plugin: 'application'

sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'application',
                   'Implementation-Version': version
    }
}

mainClassName = 'spqrk.HelloWorld'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
    
    compile 'org.projectlombok:lombok:1.16.6'
    compile 'com.sparkjava:spark-core:2.3'
    compile 'org.eclipse.persistence:org.eclipse.persistence.jpa:2.6.+'
    compile 'javax.servlet:javax.servlet-api:3.1.0'

    
}



test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

```

eclipseで使うときは、適当なプロジェクトを作成し、そのルートにこのbuild.gradleを配置。
コマンドラインから以下のコマンドを実行して、プロジェクトを更新する。
```groovy
gradle eclipse
gradle build
```

###2015-10-22追記。
バージョン番号を指定しないとsl4jのjarが衝突するので修正。
runタスク用の設定も追加。
AppCode用正規表現

AppCode用の置換パターン。個人用メモ。

#### メソッドに@autoreleasepoolを一括追加

```lang:Example
- (void)test{
    NSLog(@"Test");
}

- (void)test{
    @autoreleasepool {
        NSLog(@"Test");
    }
}
```

```lang:Regex
(^[-+].*\{\n)((^[\s/]+.*\n)*)(^\}$)
```

```lang:Replace
$1@autoreleasepool {\n$2}\n}
```
#### コメントを一括置換

###### その1

```lang:Example
    //
    // Comment
    //
    
    /*
     * Comment
     */
```

```lang:Regex
^(\s+)//\n^(\s+)//\s(.*)\n^(\s+)//
```

```lang:Replace
$1/*\n$2 * $3\n$4 */
```

###### その2
```lang:Example
    //////////////////////////////////
    // Comment
    //////////////////////////////////
    
    /******************************************
     * Comment
     ******************************************/
```

```lang:Regex
^(\s+)(/+)\n^(\s+)//\s(.*)\n^(\s+)(/+)
```

```lang:Replace
$1/******************************************\n$3 * $4\n$5 ******************************************/
```
D3.jsで矩形にクリックイベント

自分がハマったのでメモ。
以下は矩形を斜めに描写しクリックイベントを乗っけたコード。

```
  var rectData = [
  {"x":100,"y":300,"width":150,"height":10,"color":"red"},
  ];
  var rect = svg
     .selectAll("rect")
     .data(rectData)
     .enter()
     .append("rect")
     .on("click", function(d){alert();})
     .attr("x",function(d){return d.x;})
     .attr("y",function(d){return d.y;})
     .attr("width",function(d){return d.width;})
     .attr("height",function(d){return d.height;})
     .style("fill",function(d){return d.color;})
     .attr("transform", "rotate(-15)")
}
```
.on("click", function(d){alert();})をattrの後に書くとなぜか動かなかった。
Potential leak of an object stored into 'reachability'

Appleが提供している[サンプルコード](https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html)に含まれているReachabilityクラスを、Xcodeで静的解析すると2箇所ほどで潜在的リークの可能性を指摘されてしまいます。

指摘を受けた箇所を含むメソッド``reachabilityWithHostName:``のソースコードを見てみると、

```
+ (instancetype)reachabilityWithHostName:(NSString *)hostName
{
	Reachability* returnValue = NULL;
	SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]);
	if (reachability != NULL)
	{
		returnValue= [[self alloc] init];
		if (returnValue != NULL)
		{
			returnValue->_reachabilityRef = reachability;
			returnValue->_alwaysReturnLocalWiFiStatus = NO;
		}
	}
	return returnValue; // ここでXcodeから指摘を受けてしまう
}
```

となっています。
これだと``returnValue``の生成に失敗した時の``reachability``の後始末ができていないので、二つのインスタンスの生成する順序をひっくり返して

```
+ (instancetype)reachabilityWithHostName:(NSString *)hostName
{
	Reachability* returnValue = [[self alloc] init];
	if (returnValue != NULL)
	{
		SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]);
		if (reachability != NULL)
		{
			returnValue->_reachabilityRef = reachability;
			returnValue->_alwaysReturnLocalWiFiStatus = NO;
		}
	}
	return returnValue;
}
```

と変更してあげると、指摘を解消できます。
AppDelegateでUIAlertControllerを表示する

# Problem

AppDelegate内でUIAlertControllerを使ってアラートを表示したい

# Solution

[DBAlertController](https://github.com/dbettermann/DBAlertController)を使って解決できます。

AppDelegate.swift

```swift
import DBAlertController

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // アラートを表示する
    let alert = DBAlertController(title: "didFinishLaunchingWithOptions", message: nil, preferredStyle: .Alert)
    alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
    alert.show()
  }
}
postgresql で trigger とその trigger が動作するテーブルの一覧を取得する

### 環境
PostgreSQl 9.3 です

### SQL

``` sql
SELECT event_object_schema,
       event_object_table,
       trigger_schema,
       trigger_name
FROM information_schema.triggers
```

### 結果

```
 event_object_schema |     event_object_table      | trigger_schema |               trigger_name
---------------------+-----------------------------+----------------+------------------------------------------
 schema              | user_table                  | schema         | user_trigger
```

`*` だと `action_timing` や `event_manipulation` も取得できます。  
information_schema 便利です。

### `information_schema.trigger` のカラム
```
\d information_schema.triggers
                     View "information_schema.triggers"
           Column           |                Type                | Modifiers
----------------------------+------------------------------------+-----------
 trigger_catalog            | information_schema.sql_identifier  |
 trigger_schema             | information_schema.sql_identifier  |
 trigger_name               | information_schema.sql_identifier  |
 event_manipulation         | information_schema.character_data  |
 event_object_catalog       | information_schema.sql_identifier  |
 event_object_schema        | information_schema.sql_identifier  |
 event_object_table         | information_schema.sql_identifier  |
 action_order               | information_schema.cardinal_number |
 action_condition           | information_schema.character_data  |
 action_statement           | information_schema.character_data  |
 action_orientation         | information_schema.character_data  |
 action_timing              | information_schema.character_data  |
 action_reference_old_table | information_schema.sql_identifier  |
 action_reference_new_table | information_schema.sql_identifier  |
 action_reference_old_row   | information_schema.sql_identifier  |
 action_reference_new_row   | information_schema.sql_identifier  |
 created                    | information_schema.time_stamp      |
```
OS X El Capitan にしたらgulpの$ npm installでエラーを吐くようになったので。

ウキウキでOS X El Capitanにアップデートしたらgulpの$ npm installでエラーを吐くようになってしまったので以下に対処方法を記載しておく。

![スクリーンショット 2015-10-21 14.30.52.png](https://qiita-image-store.s3.amazonaws.com/0/57867/0753ea14-bc07-50df-e0ce-041a1ee158f0.png)

##【その1】 Node.jsの再インストール

```
$ node -v
$ sudo npm cache clean -f
$ sudo npm install -g n
$ sudo n stable
$ node -v
```
で、再インストール。

##【その2】 npmの再インストール

```
$ npm install -g npm
```

もし実行中にエラーが出たら、

```
$ curl -L https://npmjs.org/install.sh | sudo sh
```

で再インストールできた。

##【その3】 Xcodeの初期設定を済ませる

Node.jsとnpmの再インストールも完了したし、いざ$ npm install！したら以下のエラーが。

```
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```

あ、そういえばEl CapitanにしてからXcode起動してないな・・・。
起動後、小さいウィンドウが開くので「Agree」ボタンをポチッとしたら準備完了。

## 以上の手順で

無事 $ npm install が実行できましたとさ。
とりあえずOSアップデートしてエラー出たらまず再インストールするといいかも。

## 参考にしたサイト

- [OSX El Capitanでgulpのエラーを解決する](http://blog.yuhiisk.com/archive/2015/10/11/osx-el-capitan-with-gulp-tips.html)
- [Node.js と npm のアップデート](http://blog.nocorica.jp/2015/03/nodejs-npm-update/)
macでvagrant上の仮想環境でnode.jsでウェブサーバーを立て外部からアクセスするまで

macでvagrantを使って仮想環境を作り、node.jsでサーバーを立てて外部からアクセスしてみた。
首尾一貫した説明がなくてちょいちょい手こずったので備忘録がてら書いてみる。


#1　環境
- mac
- vagrant
- centOS6.6
- node.js(v0.10.40)

#2 vagrant
せっかくなのでここから。
仮想環境を作るソフト、手軽に仮想環境が作れてかつ外部とのファイルのやり取りができて便利とかそんな感じ。

## vagrant
https://www.vagrantup.com/downloads-archive.html
から本体をダウンロード

## virtual box
https://www.virtualbox.org/wiki/Downloads
からvirtual box　for OS X hostsをダウンロード

各々インストールしておく

## CentOS
http://www.vagrantbox.es/
からcentos(この場合は6.6、boxと呼ぶらしい)をダウンロード

### 仮想環境を立てる
適当なディレクトリを作成し、そこに移動

```
$ mkdir centos66
$ cd centos66
$ vagrant init centos
$ vim Vagrantfile
```

Vagrantfileの中身に

```
config.vm.network :forwarded_port, guest: 8000, host: 8000
```
を追加、これで外部からアクセスできるようになる。

```
$ vagrant up
$ vagrant ssh
```
で仮想マシンに入れるので、とりあえず

```
cd ../../vagrant
```
と打とう、このフォルダが先ほどのVagrantfileがあったフォルダとの共有フォルダになる。

#3 node.js
次はnode.jsのインストール、ググって出てきた情報ではうまくいかなかったので、
素直に公式サイトのやり方でやってみる。

centOSの場合Run as rootとのことなのでsudoをつけて

```
$sudo curl --silent --location https://rpm.nodesource.com/setup | bash -
$sudo yum -y install nodejs
```

これでnode.jsが入ったはずだ。
次に適当なフォルダ（共有フォルダ内がベター）で適当にjsファイルを作る。

```javascript:script.js
// httpのモジュールを用意
var http = require('http');

//　サーバーの作成
var server = http.createServer();
server.on('request', function(request,response){
    //　ヘッダ
    res.writeHead(200,{'Content-Type' : 'text/plain'});
    //　出力
    res.write('Hello World!!');
    //　終了
    res.end();
});
//　ポートの指定
server.listen(8000);
```

とりあえずここまできたらサーバーが動くかどうか確認しよう。

```
$node script.js
```

ブラウザ上で
http://http://127.0.0.1:8000
にアクセス。hello world!が確認できたら外部からアクセスできている。

#4 ウェブサーバー
外部からアクセスさえできてしまえば、あとはサーバーの方のスクリプトで
htmlファイルを読み込んで表示してしまえばいい。

適当なindex.htmlファイルを作る。

```html:index.html
<html>
<head>
<title>nodesテスト</title>
</head>
<body>
<h1>Hello World!!</h1>
</body>
</html>
```

そして
スクリプトの方も書き換える。

```javascript:script.js
//　httpのモジュールとfsのモジュールを用意
var http = require('http');
var fs = require('fs');

//　サーバーの作成
var server = http.createServer();

//　アクセスされた際の挙動
server.on('request', function(request, response) {
  //　htmlファイルが指定されなかった場合はindex.htmlを入れる。
  if(request.url == '/'){
    request.url = 'index.html';
  }
  //　リクエストされたURLに従い、ファイルの中身を読み込む。
  fs.readFile('./' + request.url,'utf-8',function(error,data){
    if(error){
      //　見つからなかった場合404エラーを返す。
      response.writeHead(404,{'content-Type': 'text/plain'});
			response.write("not found");
			return response.end();
    }
    //　ファイルが存在する場合htmlファイルの中身が格納されたdataを書き出す。
    response.writeHead(200,{'content-Type': 'text/html'});
	  response.write(data);
	  response.end();
  });
});
```

#5　最後に
以上のことを行えば最低限目標は達成されるはずだが、記憶を頼りに書いているので
抜け等あれば連絡いただけると助かります。
私のcocos2d-JS 開発環境

cocos2d-JSの情報があまりに少ないので、参考まで。
#開発環境
- MacbookAir（mid2011）Corei7(1.8GHz)
- OS X 10.8.5 Mountain Lion
- cocos2d-js-v3.6.1
- Cocos Code IDE 1.2.0
- 広告表示は i-mobile

#経緯
・cocosでゲーム制作したい → c++苦手！（文字列操作等）
・JS版が出たらしい、クロスプラットフォーム → これだ
・XCode苦手→ Eclipseベースの CocosCodeIDE 発見
（※ 最新のCocosはEclipseベースでないため断念）

###旧 MacbookAirの限界
MBAのプリインストールOSは 10.7.5 Lion
LionではCodeIDEのコンパイル後、PrebuiltRuntimeが実行不能
（OS非対応）
実行可能な最低限OSが 10.8.5 MountainLion

MBAのメモリ上限は４GBで増設できないため、OSX10.9以降でcocos環境を作ると、動作が非常に重い。そのため10.8.5を使っている。

##最新OS ElCapitanでのトラブル
ElCapitan OSは当方MBAでも動作軽快なのだが
*コンパイル後のトラブル頻発* につき、利用を断念（10.11→ 10.8.5に）
→ cocos run -p android 失敗、なんとか修正すると今度は実機転送されたアプリがクラッシュするなど、２日ほど無駄になった。
（原因ははっきり特定できないが、SDKやNDKの「相性が悪いらしい」としか言いようがない。他の記事や英語フォーラムにも似たことが書いてある。）
**cocosのこういう所は本当に苦手だ。**情報が少なすぎる上、稼働が不安定で、IT技術にあるまじき「試行錯誤の相性実験」みたいなことをせざるを得ない。素晴らしいフレームワークなので改善を期待。

ので、私は *安定して開発できるのは Yosemiteまでだと認識*している。
（開発仲間がYosemite環境で開発できている）
もし私が最新環境で開発したい場合、8GB~のメモリ搭載Macを入手し、Yosemiteで構築するのが当面（2015/10月現在）のベスト選択肢だと思われる。

##ElCapitanでも問題なく開発できてる方 おられましたら環境をお知らせください！
data.frameとdata.tableでは、summaryの表示が異なる


## はじめに
data.frame と data.tableでsummary()の表示結果が異なる！と質問がきたので、まとめてみた。

## 結論
data.frameでは文字列の列はデフォルトだとfactor型。data.tableでは文字列はcharacter型になる。

character型だと、summaryで統計量がでないようです。

factor型とcharacter型で、summaryの結果が異なるのですね。

## データを作る
```
> aaa <- seq(1,100)
> bbb <- seq(1,200,by=2)
> ccc <- c(rep("c",50), rep("d",50))
```

## data.frameの場合

```
> df <- data.frame(a1 = aaa, b1 = bbb, c1 = ccc)
> sapply(df, class)
       a1        b1        c1 
"integer" "numeric"  "factor" 
> summary(df)
       a1               b1        c1    
 Min.   :  1.00   Min.   :  1.0   c:50  
 1st Qu.: 25.75   1st Qu.: 50.5   d:50  
 Median : 50.50   Median :100.0         
 Mean   : 50.50   Mean   :100.0         
 3rd Qu.: 75.25   3rd Qu.:149.5         
 Max.   :100.00   Max.   :199.0         
```

## data.tableの場合

``` 
> dt <- data.table(a1 = aaa, b1 = bbb, c1 = ccc)
> sapply(dt, class)
         a1          b1          c1 
  "integer"   "numeric" "character" 
> summary(dt)
       a1               b1             c1           
 Min.   :  1.00   Min.   :  1.0   Length:100        
 1st Qu.: 25.75   1st Qu.: 50.5   Class :character  
 Median : 50.50   Median :100.0   Mode  :character  
 Mean   : 50.50   Mean   :100.0                     
 3rd Qu.: 75.25   3rd Qu.:149.5                     
 Max.   :100.00   Max.   :199.0
```
マウスボタンイベント

マウスイベントの覚書

## onmousedown
解説：
マウスボタンを押した
⇒onmousedownでpopupするとpopupblockが出てしまう

## onmouseup
マウスボタンを離した
⇒あまり使わない。

## onclick
・クリックした
・キーボードで選択した

## ondblclick
・ダブルクリックした
押した数だけウィンドウを開くExplorerボタンをタスクバーに置く

Windows 10 や Windows 8 のタスクバーにピン留めって、頻繁に使うショートカットをタスクバーに常に置いておけるので便利ですよね。標準でExplorerやIEが登録されています。
で、自分の場合なんですけど、アプリのショートカットのつもりでExplorerのアイコンをクリックして、最前面のウィンドウが最小化する度に「そうじゃなくて、もう一個ウィンドウ開いてよ」と思うわけですが、それを実現する方法。
Windowsキー + `e` でも開くのですが、Explorer のウィンドウを増やしたい時には便利。

1. Explorer で C:¥Windows を開いて explorer (拡張子を表示している人は explorer.exe) を探して右クリックします。
2. 「スタート画面にピン留めをする」を選びます。一旦スタート画面です。
3. スタート画面(メニュー)を開いて、今ピン留めしたexplorerを探して右クリックします。
4. ここで「タスクバーにピン留めする」を選びます。
5. 不要ならスタート画面にピン留めしたexplorerのピン留めを解除します。

一旦スタート画面に登録する事で、うまくタスクバーにexplorerのショートカットが登録できます。そうじゃないとたぶん登録できない。

explorer起動用のショートカット(常に開いてない状態表示)と、開いているウィンドウを選択するアイコンの二つがタスクバーに表示されます。
Swift 2.0 で CocoaPods の CocoaLumberjack を組み込んで使ってみる

## 動機
iPhone 6Sが発売されて、XCode7が出て、Swift 2になったということで、GPSで位置情報を取得するアプリを書いてみようと思った。バックグラウンドで更新されないので、何故だろうと思って、実機上で、ログファイルを作る必要性がでてきた。

## CocoaLumberjack
iOSで、ログファイルを管理するためのライブラリとして、CocoaLumberjackがどうやら結構利用されているので、検索してみると、『 [SwiftでもCocoaLumberjack]( http://documents.tips/software/20150721-swiftcocoalumberjack.html) 』と言う記事を見つけて、できるんじゃないか？とやってみた。

## CocoaPodsのインストール

```lang:console
$ sudo gem install cocoapods
$ pod setup
```

## PodFileの作成
取り込みたいXCodeのプロジェクトの配下に『PodFile』を置く

```lang:PodFile
pod 'CocoaLumberjack/Swift',  
:git => ‘https://github.com/CocoaLumberjack/CocoaLumberjack.git', 
:branch => 'swift_2.0' 
use_frameworks!
```

紹介記事には書いていないけど、『use_frameworks!』を追加しないといけません。

## ライブラリのインストール
取り込みたいXCodeのプロジェクトの配下で、コンソールで次のコマンドを投入する。

```lang:console
$ pod install
``` 

すると、ライブラリのインストールが行われ、『プロジェクト名.xcworkspace』が生成されるので、これをXCode7から開くことにより取り込まれて使える状態になります。

## Swiftソース上での書き方

インポートはこんな書き方

```lang:Swift2
import CocoaLumberjack
``` 

例えば、viewDidLoad()あたりの処理で、下記のように書くと、コンソールとファイルに書き出されます。

```lang:Swift2
defaultDebugLevel = DDLogLevel.Verbose
DDLog.addLogger(DDTTYLogger.sharedInstance())

let fileLogger = DDFileLogger()
fileLogger.rollingFrequency = 60 * 60 * 24
fileLogger.maximumFileSize = 1024 * 1024 
fileLogger.logFileManager.maximumNumberOfLogFiles = 10
DDLog.addLogger(fileLogger)
``` 

## ログを出したい場所では

```lang:Swift2
DDLogDebug("didUpdateToLocation")
```  

とかやればOKです！

## でも。。。

info.plistにApplication supports iTunes file sharingをYESと記述しても、iTunesからログファイルを取得することができない。
あれあれ？
調べてみてみたら、Cacheフォルダに吐き出している事実を発見し、設定で変えられるのかな？と思っていましたが、ライブラリのソースコードを直接書き換えてこの問題をクリアーにしました。コメントアウトした部分がキャッシュフォルダをしていしていたので、ドキュメントフォルダにするように書き直しています。

```lang:/Pods/Pods/CocoaLumberjack/Core/DDFileLogger.m
- (NSString *)defaultLogsDirectory {
#if TARGET_OS_IPHONE
    // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *baseDir = paths.firstObject;
    NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];

#else
    NSString *appName = [[NSProcessInfo processInfo] processName];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? paths[0] : NSTemporaryDirectory();
    NSString *logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName];

#endif

    return logsDirectory;
}
```

以上、ご参考までに