OmniAICreator/Qiita-1.07M huggingface dataset:
ビルドのパターンを定義して一発で出力する

# 環境
　Unity5.3.2f1にて動作確認
# 前書き
　開発用・テスト用・リリース用などビルドの設定を手動で変更するのが面倒だったのでパターンを定義して一発で出力する方法を調べました。
# やりたいこと
- ビルドを出力したい　＞　BuildPipeline.BuildPlayerを使う
- ビルド時のオプションを変更したい　＞　BuildOptionsを使う
- シンボル定義を変更したい　＞　PlayerSettings.SetScriptingDefineSymbolsForGroupを使う

# サンプル
　Standaloneビルド用のサンプルです。

```CustomBuild.cs
using UnityEngine;
using UnityEditor;
using System.Linq;
using System;

public class CustomBuild : MonoBehaviour {

    enum BuildPattern {
        RELEASE,
        TEST,
        DEV
    }

    const string BUILD_SYMBOL_FOR_RELEASE = "RELEASE";
    const string BUILD_SYMBOL_FOR_TEST = "TEST";
    const string BUILD_SYMBOL_FOR_DEV = "DEV";

    const BuildOptions BUILD_OPTION_FOR_RELEASE = BuildOptions.None;
    const BuildOptions BUILD_OPTION_FOR_TEST = BuildOptions.AllowDebugging;
    const BuildOptions BUILD_OPTION_FOR_DEV = BuildOptions.AllowDebugging | BuildOptions.Development;

    [MenuItem("Build/Release")]
    static void DoCustomBuildForRelease() { OutputBuild(BuildPattern.RELEASE); }
    [MenuItem("Build/Test")]
    static void DoCustomBuildForTest() { OutputBuild(BuildPattern.TEST); }
    [MenuItem("Build/Dev")]
    static void DoCustomBuildForDev() { OutputBuild(BuildPattern.DEV); }
    [MenuItem("Build/ALL")]
    static void DoCustomBuildALL() { foreach(BuildPattern p in Enum.GetValues(typeof(BuildPattern))) OutputBuild(p); }

    static BuildOptions GetBuildOptions(BuildPattern pattern) {
        switch (pattern) {
            case BuildPattern.RELEASE: return BUILD_OPTION_FOR_RELEASE;
            case BuildPattern.TEST: return BUILD_OPTION_FOR_TEST;
            case BuildPattern.DEV: return BUILD_OPTION_FOR_DEV;
            default: throw new Exception("想定外のBuildPattern:" + pattern);
        }
    }

    static string GetBuildSymbols(BuildPattern pattern) {
        switch (pattern) {
            case BuildPattern.RELEASE: return BUILD_SYMBOL_FOR_RELEASE;
            case BuildPattern.TEST: return BUILD_SYMBOL_FOR_TEST;
            case BuildPattern.DEV: return BUILD_SYMBOL_FOR_DEV;
            default: throw new Exception("想定外のBuildPattern:" + pattern);
        }
    }

    static void OutputBuild(BuildPattern pattern) {
        // ビルドシンボル設定
        PlayerSettings.SetScriptingDefineSymbolsForGroup(
            BuildTargetGroup.Standalone,
            GetBuildSymbols(pattern));

        // ビルド出力先パス生成
        string outputPath =
            pattern.ToString() + "_" + DateTime.Now.ToString("yyyyMMdd_HHmm") + "/" +
            PlayerSettings.productName + ".exe";

        // ビルド出力
        BuildPipeline.BuildPlayer(
            EditorBuildSettings.scenes.Select(s => s.path).ToArray(),
            "_Builds/" + outputPath,
            BuildTarget.StandaloneWindows64,
            GetBuildOptions(pattern)
            );
    }
}
```
# あとがき
　同じ要領でプラットフォームを切り替えることもできます。
UIBezierPathにCABasicAnimationでアニメーションをつける

UIBezierPathはアニメーション可能ですが、いくつか嵌まったのでメモ。

1. UIViewのdrawRectをオーバーライドするのではなく、CAShapeLayer()を作成し、そのpathプロパティにUIBezierPathの**CGPath**(これ忘れがち)を設定すること。
2.  CABasicAnimation(keyPath: "path")とやって pathを変化させることを教えてあげる。スペルミスをしても、なにもエラーを出してくれないので注意すること。（出す方法はあるのかな？）
3.  CABasicAnimationのformValueとtoValueにはUIBezierPathの**CGPath**(これ忘れがち)を指定する。型が不一致でもエラーをだしてくれないので注意すること。

```
    // 引数で指定されたポイントに円をアニメーションしながら書く

    private func drawGraphPoint(center: CGPoint){
        let radius = CGFloat(10.0) //円の半径の設定
        let myLayer = CAShapeLayer()
        self.layer.addSublayer(myLayer)

        let endCircle = UIBezierPath(arcCenter: center,
            radius: radius,　
            startAngle: 0.0,
            endAngle: CGFloat(2.0) * CGFloat(M_PI),
            clockwise: true)
 
        let startCircle = UIBezierPath(arcCenter: CGPointMake(/* アニメーションの開始位置を指定する */),
            radius: radius,
            startAngle: 0.0,
            endAngle: CGFloat(2.0) * CGFloat(M_PI),
            clockwise: true)

        myLayer.path = startCircle.CGPath　// 型に注意！
        myLayer.lineWidth = 2
        myLayer.strokeColor = graphColor
        myLayer.fillColor = graphColor
        
        let animation = CABasicAnimation(keyPath: "path")
        
        animation.duration = duration //アニメーションの継続時間を指定する
        animation.fromValue = myLayer.path // 開始pathの設定
        animation.toValue = endCircle.CGPath　// 終了pathの設定。型に注意！
        
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) // animation curve is Ease Out
        animation.fillMode = kCAFillModeBoth // keep to value after finishing
        animation.removedOnCompletion = false // don't remove after finishing
        
        myLayer.addAnimation(animation, forKey: animation.keyPath)
    }

```
Node.jsでffmepgを使って動画からサムネイル/静止画を生成する

Node.jsで動画ファイルから静止画を生成する必要があったんで、調べてみたよ


## ffmpegをインストール

執筆時点では3.0がリリースされたばかり。
brewにあるのは2.8.6だったけどこれで良しとする。インストール。

```
$ brew install ffmpeg
```

## fluent-ffmpegをインストール

nodeからffmpegを使うために抽象化ライブラリ[fluent-ffmpeg](https://github.com/fluent-ffmpeg/node-fluent-ffmpeg)を使う。
多分これが一番早いと思います

```
$ npm install --save fluent-ffmpeg
```


## JSを書く

```js
const ffmpeg = require('fluent-ffmpeg');

const command = ffmpeg('video.mp4');
```

`ffmpeg`関数に変換元となる動画ファイルへのパスもしくはストリームを渡してあげると、`command`オブジェクトを返してもらえます。
コイツを使ってエンコードやらサムネ抽出やらをしていく流れになります


### いざサムネイル抽出

```js:サムネイル抽出の最小構成
command.screenshots();
```

これだけでカレントディレクトリに`tn.png`という名前で静止画を作ってくれます。
ここまで3行。簡単すぎますね
デフォルトでは動画時間の50%の位置を撮ってくるようです
オプションを指定することで、取得位置、ファイル名、保存場所、静止画サイズを変更可能

```js:サムネイル抽出のオプションいろいろ
command.screenshots({
	count: 4,
	folder: path.join(__dirname, 'thumbnails'), // pathは別途requireしてね
	filename: 'thumb-%i:%s.png', // %iはインデックス番号、%sは秒
	size: '320x?' // 幅320で縦は可変
});
```

`count`を`4`とすると、20%、40%、60%、80%の位置で撮ってくれます。
`count`の代わりに`timemarks`を使うと、何分何秒という決め打ち指定も可能。


### 終了イベント

サムネイル抽出は非同期処理なので、終了イベントもちゃんと取れます。

```js:サムネイル存在確認
command.on('end', () => {
	console.log(fs.existsSync('tn.png')) // true
}).screenshots();
console.log(fs.existsSync('tn.png')) // false
```
DroidKaigi2016メモ：実践！Android Studioプラグイン開発

DroidKaigi 2016での@konifarさんによる発表動画は[こちら](https://www.youtube.com/watch?v=JfT3c6Ey_z4)です。

## 発表者
* @konifar
* TapTrip: グローバルSNS
* TapTripのリニューアルから本格的にAndroid開発に
* 最初のOSSがAndroid Studioプラグインだった

## プラグイン開発の特徴・おさらい
* IntelliJベース
* Java7だと動かないのでJava6が必要
* 詳しくはQiitaに！
* 問題はここから先で...

## プラグインを実際につくるときに役立つ実践的な話をします

#### 覚えておくべきクラスと役割
* AnActionEvent
  - 右クリックなどのイベントを取得する
  - ファイル別に右クリックメニューの中身を変えたいときとか
* Project
  - Projectのディレクトリや、SDKのバージョンなどが取得できる
  - ルートパスやファイル一覧も取得できる
* Editor
  - エディタの内容を取得する
  - 範囲選択中のテキストを取得したり
  - エディタを↓までスクロールしたり
* Document
  - エディタの内容を検知することもできる(*インクリメンタルな動きを作るときに使う？*)
* PsiFile
  - カーソル位置のJavaクラスを取得する

#### UIの実装
* Dialog
  - DialogWrapperを使う
  - 呼び出したいところでshow()するだけ
* HintManager
  - いわゆるヒント吹き出しみたいなやつ
* Notification.Bus
  - いわゆるtoastみたいなやつ
* FileChooser
  - ファイル選択のUI

#### 悩んだときの調べ方
* 公開されているコードを読むのが一番はやい
* Android Studio Plugin Repository
* おすすめのプラグイン
  - intellij-sdk-docs
  - android-percelable-intellij-plugin
  - android-drawable-importer-intellij-plugin
  - adb-idea
* ほんとどうしようもなくなったら...
* Android Studioのコードを読むと良い。
* コマンドやバージョン指定はAndroid Project SiteページのBuild Overviewを参考に

## まとめ
* 基本的なクラスは覚えておく
* UIもDialogやNotificationは標準のやつを
* 似たようなコードを探してみる
* IntelliJ Plugin勉強会を近いうちにまた開催します

## 質疑応答
* 1つのPluginのコード量的にはどのくらい？
  - クラスの行数10いかないくらい、全体でも1000行くらいなので読むのには苦労しない
ActiveRecordがメモリを食って解放しない問題

Railsコンソルで以下のように確認しましょう

```rb
[1] pry(main)> ObjectSpace.each_object(ActiveRecord::Base).count
=> 0
[2] pry(main)> User.limit(100)
  User Load (1.5ms)  SELECT  `users`.* FROM `users`  LIMIT 10
[4] pry(main)> ObjectSpace.each_object(ActiveRecord::Base).count
=> 100
[5] pry(main)> User.limit(100)
  User Load (0.3ms)  SELECT  `users`.* FROM `users`  LIMIT 10
[7] pry(main)> ObjectSpace.each_object(ActiveRecord::Base).count
=> 200
```

作ったActiveRecordのインスタンスがどんどんメモリ上に溜まると分かりました。
溜まったインスタンスが使わなくても、時間をかけて解放されないです。そのため、プロセスのメモリ使用量がどんどん増加てしまいます。多量なデータを処理する場合、メモリ足りない問題が出るおそれがありますね。

実にみんなさんがご存知ですが、この問題はunicornというサーバーでよくありました。時間をかけてunicornのプロセスのメモリ使用量が増加するという問題です。この問題を解決するために、unicorn killerというgemを使ってunicornプロセスを再起度して、メモリを解放する工夫をよくやっていると思います。

なぜRubyのGCはActiveRecordオブジェクトのメモリを自動的に解放しないか、まだ分からないですが、対策として以下のように幾つか方法があります。

## 1. 必要ない場合、includesを使用しない
includesを使ったら、パフォーマンスが上がるが、紐付けるテーブルのレコードもロードして、メモリを大量に使ってしまいます。パフォーマンスとメモリ量を検討する必要があります。

## 2. 使用しないレコードの属性をロードしないようにする
属性が多ければ多くほどActiveRecordオブジェクトが使うメモリ量が大きいです。
処理に必要な属性のみをselectしてください。

```rb
 User.select(:id, :name).limit(100)
```
## 3. 手動でメモリ解放する
```ruby
ObjectSpace.each_object(ActiveRecord::Relation).each(&:reset)
GC.start
```

メモリを解放する処理は少なくても時間がかかるので、この処理を追加したら、パフォーマンスが落ちる可能性があります。メモリ量とパフォーマンスを考慮する必要があると思います。
CSS PIE を IE8 に適用させた時に、SELECT BOX が開かなくなる現象

IE8でもCSS3を使うことができる便利なライブラリ「CSS3 PIE」、
自分がめんどくさがったがためにハマった問題を共有します。

いちいち該当の要素に適用させるのが面倒だったので、
以下のコードで全要素に適用させました。

```
$(*).each(function(){
  PIE.attach(this);
});
```

すると、なぜか selectタグで作ったプルダウンメニューが開かない。

いろいろと調べた結果、 selectタグの中のoptionタグにpieを適用すると、
メニューが開かなくなる(または、一瞬開くだけ)模様。

なので、またまた横着ですが、以下の様にして一旦回避しました。

```
$("*").addClass("css_pie");
$("option").removeClass("css_pie");
$(".css_pie").each(function(){
  PIE.attach(this);
});
```

この状態でも危険なので、他の方法でpieの適用を試みたいの考えています。

IE8のサポートが終了したとはいえ、まだ対応しなくてはならない状況はあります。

もう少しの辛抱ですので、一緒にがんばりましょう。。
DroidKaigi2016メモ：用途に合わせたアニメーションの実装方法

* *資料がアップロードされるまでの参考にどうぞ*

*資料アップロードされました。公式の情報は以下をご参照ください。*
http://www.slideshare.net/TakaoSumitomo/ss-58409105

## 発表者
* @cattaka_net
* takao Sumitomo
* Wantedly唯一のAndroidアプリエンジニア

## アニメーションさせる対象
* Viewの中身を動かす
* View自体を動かす
* 複数のViewを含むレイアウトを動かす
* それぞれに仕組みが用意されている
* でも新しいのや古いのやで複雑になっている→整理していきましょう

## Viewの中身を動かす
* Animation Drawable
  - 要はパラパラあにめ
  - 必要なもの：drawable/***.ml
  - xmlに<animation-list>を書き、javaで動かす
* Animated Vector Drawable
  - SVGをアニメーションさせる
  - なめらかなアニメーションが作れる
  - これもxmlに<animated-vector>で要素を書いて作る

## View自体を動かす
* View Animation
  - translate:平行移動
  - rodate:回転
  - scale:拡大縮小
  - alpha:フェードイン・アウト
  - xmlでアニメーションを定義(コードからも定義可能)
  - コードからアニメーションを実行
* Property Animation
  - 2通りの実装がFWにある
  - ObjectAnimatorクラス
      - xmlでアニメーションを定義、コードで実行するところはView Animationと一緒
      - translationXはどこを指しているか？
      - ViewクラスのsetTranslationXをリフレクションで叩いている
      - これがPropertyと呼ばれる所以
      - コードからアニメーションを定義することも
      - 数字をカウントアップするアニメーションとかも作れる
  - ViewPropertyAnimatorクラス
    - コードで定義、コードで実行

## 複数のViewを動かす
* Activity Animation
  - xml & code
  - Viewを動かすのに使ったアニメーションと同じものを使う
* Fragment Animation
  - xml & code
  - Viewを動かすのに使ったアニメーションと同じものを使う
  - SupportLibraryを使っているかどうかで使い方が違う
      - SupportLibraryの場合：View Animation
      - それ以外の場合：Property Animation
* Transition
  - activityやfragmentじゃないviewgroupをアニメーションさせる
  - あとで
* Activity Transition
  - xml or code
  - あとで
* Fragment Transition
  - あとで
 　- それぞれの動きと、遷移の前後で共通する動きを定義する
  - この辺の話はサンプルアプリの動きとコードをにらめっこしたほうが良さそう

## API Lebelについて
* Android5.0で一通り揃っている


## 今回のサンプルアプリはここにあります
https://github.com/cattaka/LearnAnimation
classをデコンパイルして読ませて頂く


## インストール
http://varaneckas.com/jad/

## jadる

`jad -s java -d src -r hogefolder/**/*.class`


## 関連リンク
[Android端末からapkファイルを取り出す
](http://qiita.com/toguri/items/d879cd0ef3642508a7d0)
[classes.dexファイルをjarファイルに変換する](http://qiita.com/toguri/items/fb1e3133ac3d556e2100)
[AndroidManifest.xmlの中身を拝見させて頂く](http://qiita.com/toguri/items/0516eaab989a4ca04452)
tumblrで（比較的）楽にサイト公開する手順まとめ


本題に入る前に

##github pagesでやったほうが楽だけど・・・

* 写真やテキストでの更新がある
* 更新作業がエンジニア以外の人間が行う
* (ペライチ)

という場合はtumblrでやるのも良いかもしれません。一応CSSやjsで制限はあまりありません。


カスタマイズ可能なブログでやってもいいけど、

* 無料で独自ドメインを設定出来る
* スマホアプリで更新が可能(オフラインでも記事が書ける)

等のメリットもあります。

##tumblrの制限
まずtumblrでサイト製作するにも、この辺に制限があるので注意です。この辺を許容出来ないのであれば他の方法を探したほうがいいかもしれません。

* アップロード出来るファイルサイズと種類に制限がある※
* ファイルアップロードが手動なのでめんどくさい


※アイコンファイル(.ico)がアップロード出来ません。この対策については後述

#手順

目標:tumblr適用がさらっと完了する状態に持っていく

##cssもjsもhtmlに直接記載する
gulp等を使って、jadeのincludeを使って出来上がったcss,jsを読むことでindex.htmlに全部統合出来る

##画像をspriteにしてアップするのを数枚にまとめる
リピートする画像以外の画像はspriteにして画像アップの手間を省略する。
(他:ogp.pngだけは別途上げる必要あり)

* spriteの注意点:iOSでデカイ画像がボケるのでだいたい2000px*2000px超えたら分けるべし
* CSSでのbackgroundをアセッツに登録した画像のURLにする

* もし画像をcanvasとかで使いたいって場合はbase64にして突っ込みましょう
* faviconも.icoファイルをbase64に変換してhrefに入れる事でIE10,9も表示可能になる



ここまで準備すればtumblrでのサイト製作も随分と楽になります。他にも何かtipsがあれば教えて下さい。
[オブジェクト指向]ファクトリーメソッドの大きな弊害

ファクトリーメソッドの大きな弊害
==========
『利用者に実体を意識させないため』に、タイプでswitchするファクトリーメソッドを作ることがあります。今回、この設計思想により担当プロジェクトで痛い目を見ましたので紹介します。


#### switchを利用したファクトリーメソッドの例
---------

```cpp:RendererFactory.cpp
// ファクトリーメソッド
IRenderer* RendererFactory::Create( TYPE type ) {
 switch( type ) {
  case OPEN_GL: 
   return new OpenGLRenderer();
  
  case DIRECTX:
   return new DirectXRenderer();
  
  case CAIRO:
   return new CairoRenderer();

  default:
   break;
 }

 return nullptr;
}
```

このコードは全タイプを切り替えて利用する要求がある場合を除いては、以下の弊害が発生します。

#### 弊害１： 『過度の依存が発生！？』
--------

どれか１つのタイプしか利用しない場合でも、このファクトリーメソッドの利用者は`gl32.dll`, `Direct3D.dll`, `cairo.dll`を配置する必要があります。更には、利用するタイプに限らずDirectXをリンクするためWindowsでしか使えません（/_;）


#### 弊害２： 『矛盾パラメータ！？』
--------

実際はタイプ毎に異なる初期化パラメータが必要になるでしょう。結果、以下のように拡張されることになります。

```cpp:RendererFactory.h
// TYPEに対応したパラメータを設定してね
static IRenderer* Create( TYPE type, GLPARAM p1, DXPARAM p2, CAIORPARAM p3 );
```

`TYPE`に応じて設定を無視する（矛盾する）パラメータが出てきます。


#### 弊害３： 『結局ダウンキャスト！？』
--------
生成したインスタンスから初期化時のパラメータを取得したい場合や、拡張により生成時以外の操作に差分がある場合はダウンキャストが必要になります。

```cpp:main.cpp
/// IRendererはTYPEに依存するメソッドは持っていないのでダウンキャスト
OpenGLRenderer* glrenderer = static_cast<OpenGLRenderer*>( renderer );
GLPARAM param = glrenderer->GetInitParam();
int version = glrenderer->GetGLVersion();
```
> Note: TYPEは利用者自身が生成時に指定しているため、`static_cast`でのダウンキャストが保証される


### まとめ
- 利用者がタイプを意識して生成をした時点で、当初の『利用者に実体を意識さないため』という目的が薄れている
- そもそもIRendererとそれを実現したRendererを１つのダイナミックリンクライブラリーとしていたことが失敗＼(^o^)／
Google Blogger をフルカスタマイズする時にとても勉強になった記事まとめ

# Blogger リンク集

- [bloggerで投稿の要約（snippet）を表示して、readmoreリンクをつける | ウェブに残したもの](http://nokoshitamono.blogspot.jp/2013/04/bloggersnippetreadmore.html)
- [GoogleブログBlogger： 特定ページのみにhtmlソースコードを記述する方法 @ コンピュータ系サラリーマンブログ](http://salaryman-life.blogspot.jp/2010/05/googleblogger-html.html)
- [企業ブログにおすすめ！広告なしの無料ブログサービス「Blogger」の始め方](http://webcommu.net/blogger-startup/)
- [Bloggerユーザなら知っておきたい、BloggerブログのURL構成まとめ - Dr.ウーパのコンピュータ備忘録](http://upa-pc.blogspot.jp/2015/02/blogger-url-summary.html)
- [Blogger で URL に日本語を使うのは - Idea, Design, Engineering, Architecture on Blogger](http://voidptrjp.blogspot.jp/2014/06/blogger-url.html)
- [Blogger記事にカスタムパーマリンクを設定する方法 | Hanpen DaDa](http://www.hanpendada.com/2015/01/permalink.html)
- [bloggerでping送信を送る方法](http://bloggercustomizehowto.blogspot.jp/2013/01/ping-blogger-method.html)
- [私にもできたっ Bloggerページナビまとめ！！](http://styleblog.soyokazezakka.com/2012/05/blogger_28.html)
- [bloggerであるURLの投稿やページだけウィジェットに条件を付ける「フルパスURLの修正」 | ウェブに残したもの](http://nokoshitamono.blogspot.jp/2014/08/bloggerurl.html)
- [Blogger: Picasa Web Album (googleusercontent.com) の画像を縮小・トリミングして呼び出す方法](http://mizumoto-koen.blogspot.jp/2013/12/blogger-picasa-web-album.html)
- [[Blogger] タイトルタグを「投稿タイトル|ブログタイトル」に変更する方法 | Bloggerをカスタマイズするときに見るブログ](http://www.blogger-customize.com/2014/02/title-tag-edit.html)
- [【Google Blogger】FeedBurnerのRSS用URLを独自ドメインで簡略化設定 | LIFE GOES TO A PARTY](http://www.life-gp.net/2012/11/feedburnerrssurl.html)
- [Bloggerのテンプレートをいじる - Aragger](http://aragger.blogspot.jp/2012/04/blogger.html)
- [Bloggerをカスタマイズするときに見るブログ](http://www.blogger-customize.com/search?q=%E3%83%A9%E3%83%99%E3%83%AB)
node+socket.io+expressでサーバーとWebページ間で通信するためのスニペット

この記事は、ほぼ[socket.io](http://socket.io/)のページの[Get Started: Chat application](http://socket.io/get-started/chat/)の流用です。
よく使うのでメモ。

## 前提
nodeとnpmのインストールが済んでいること。
## ディレクトリ構成
```
.
|-- index.html
|-- index.js
|-- node_modules
|-- package.json
```
## サーバー側の準備
```
mkdir server&&cd $_
npm init
npm install express --save
npm install socket.io --save
```
## HTTPおよびWebSocketサーバー
```js:index.js
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

// index.htmlから読み込まれている静的ファイルを送れるようにしておく
app.use(express.static(__dirname));

// GETされたらindex.htmlを送信する
app.get('/', function(req, res){
  res.sendfile('index.html');
});

// クライアントからの接続を待つ
io.on('connection', function(socket){
  console.log('a user connected');
  socket.on('disconnect', function(){
    console.log('user disconnected');
  });
  // クライアントからメッセージを受け取ったら投げ返す
  socket.on('chat message', function(msg){
    // 同じクライアントに送信する場合は socket.emit を io.emit に変える
    socket.emit('chat message', msg);
  });
});

// サーバーをポート3000番で起動
http.listen(3000, function(){
  console.log('listening on *:3000');
});
```
## クライアント側HTML
```html:index.html
<!doctype html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>

<!-- socket.ioをロードする -->
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>

<script>
  var socket = io();
  $('form').submit(function(){
    // メッセージを送信する
    socket.emit('chat message', $('#m').val());
    $('#m').val('');
    return false;
  });
  // メッセージを受信する
  socket.on('chat message', function(msg){
    $('#messages').append($('<li>').text(msg));
  });
</script>

  </body>
</html>
```

## 実行する
ターミナルで```node index.js```を実行して、ブラウザで ``` http://上記サーバのIPアドレス:3000 ```を開く。
EC-CUBEをPHP7+SQLiteで動かす

EC-CUBE 3.0.9から、[SQLiteでうごくようになった](https://github.com/EC-CUBE/ec-cube/pull/1393)ので、早速動かしてみました。
ついでにPHP7もためしてみます。

環境はこんな感じです。

- Windows 7
- PHP 7.0.3
- EC-CUBE 3.0.9

# EC-CUBE

## ダウンロード
以下からダウンロードします。
http://www.ec-cube.net/download/

## 設置
アーカイブを解凍して、`C:\eccube-3.0.9`に設置します。

# PHP

## ダウンロード
ここからダウンロードします。
http://windows.php.net/download#php-7.0

## 設置
アーカイブを解凍して、`C:\php-7.0.3`に設置します。

## php.iniの設定
`php.ini-development`をコピーして、`php.ini`にファイル名を変更します。

エクステンションのディレクトリ名が設定と異なるようなので、以下を追記。

```
extension_dir=ext
```

必要なエクステンションを有効にします。
以下あたり。

```
extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_mbstring.dll
extension=php_openssl.dll
extension=php_pdo_sqlite.dll
```

# ビルトインサーバの実行

PHPには標準でWebサーバが入っています。
コマンドプロンプトを立ち上げて、実行してみます。

`> C:\php-7.0.3\php -S localhost:80 -t C:\eccube-3.0.9\html`

# EC-CUBEのインストール

localhostでWebサーバが立ち上がっているので、インストーラにアクセスしてみます。

http://localhost/install.php

Step1で、mysql/pgsqlの警告がでますが、今回はSQLiteを使うのでスルーします。
Step3のデータベースの選択では、SQLiteを選びます。

最後まで進めば完了です。

# システム情報設定

こんな風に表示されます。

![php7-sqlite.png](https://qiita-image-store.s3.amazonaws.com/0/72858/acb1ab63-b06b-5552-c910-d36af2061fd0.png)



デモとか開発用にはこれくらいで十分そうです。PHP7はやい。
スマホ実機でhostsの追加が必要なページを確認した時のメモ


「iphone hosts 追加」などでググると「脱獄が必要」という記事が目につきますが不要です。
[Charles](https://www.charlesproxy.com/)で大丈夫でした。
プロキシすごい（よくわかってない）

# iPhoneの場合
1. PCとiPhoneを同じネットワークに接続
2. PCでCharlesを起動
3. iPhoneのWifi設定の i マークタップ
4. 一番下「HTTPプロキシ」を「手動」に
5. サーバ「PCのローカルIP」ポート「8888」※Charlesのプロキシ設定のポート
6. iPhoneからIPでページにアクセスすると、Charlesからポップアップがでるので**「Allow」を選択**して許可
7. 見れました

※デフォルトのカーソル位置が「Allow」ではなくて「Deny」なので急いでクリックせぬよう


# Androidの場合
機種によって設定画面が違うのですが、基本的なアプローチ（IPとポートを設定）は同じなので省きます。
Wi-Fi設定画面内を探してみてください。長押ししてみたり。

※OSのバージョンや機種によってはプロキシの設定ができません
※Androidは[Proxy Settings](https://play.google.com/store/apps/details?id=com.lechucksoftware.proxy.proxysettings&hl=ja)などのアプリで簡単にできるかもです（アプリのインストールができないので未検証）
Tesseract-ocr における漢字の対応（収録）状況


オープンソースのOCRエンジン、tesseract-ocrの日本語用データ（tessdata/langdata）について。

残念ながら、日本語の漢字すべてに対応していないのは既知の事実（[参考サイト](http://d.hatena.ne.jp/uakira/20140710)）。リンク先の情報は2014年のバージョン3.02用のデータ。

要するに認識できないであろう漢字についての調査結果。

記事にする意味があるかについては深く考えないものとする。

## 調査対象について

調査対象はバージョン3.04用の[データ](https://github.com/tesseract-ocr/tessdata/releases/tag/3.04.00)について調査。JISX0213の漢字リストは[こちら](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0213/index.html)より入手したものを使用。

jpn.trainddataを`combine_tessdata`コマンドで`jpn.traineddata`展開する。

```bash
$ combine_tessdata -u jpn.traineddata tmp/jpn.
Extracting tessdata components from jpn.traineddata
Wrote tmp/jpn.config
Wrote tmp/jpn.unicharset
Wrote tmp/jpn.unicharambigs
Wrote tmp/jpn.inttemp
Wrote tmp/jpn.pffmtable
Wrote tmp/jpn.normproto
Wrote tmp/jpn.punc-dawg
Wrote tmp/jpn.word-dawg
Wrote tmp/jpn.number-dawg
Wrote tmp/jpn.freq-dawg
Wrote tmp/jpn.shapetable
Wrote tmp/jpn.params-model
```

お目当のファイルは`jpn.unicharset`。エディタで開くと先頭に3714という数字があるのでこれがおそらく学習済みの文字の総数。このファイルの左端の列をgrepするか、もしくはlangdataリポジトリの、`jpn.training_text`ファイルをgrepすれば学習済みの漢字かどうかは確認できる。


## 常用漢字の対応状況

いわゆる常用漢字1945字のうち、下記の6字が含まれていない。

> 虞 劾 勺 錘 朕 匁

- 虞美人草の「虞」
- 弾劾の「劾」
- 「勺」（しゃく）：尺貫法の容積の単位
- 「錘」（おもり）
- 「朕」（ちん）：皇帝の自称
- 「匁」：尺貫法による重さの単位

あまり使わない字のような気もするが、6字ともJIS第一水準。

## JIS第一水準

JIS第一水準漢字で含まれていないものは以下の123字。

> 穐 袷 吋 嬰 盈 穎 掩 鴛 恢 劾 浬 鈎 劃 廓 鰍 竃 侃 澗 翰 翫 誼 黍 笈 禦 兇 彊 粁 駈 虞 轡 粂 祁 戟 諺 乎 鈷 肱 砿 艮 孜 鴫 悉 蔀 屡 蕊 勺 輯 酋 藷 恕 鋤 妾 樵 鉦 擾 錘 趨 椙 頗 栴 賎 糎 岨 鎗 詑 柁 鐸 歎 樗 瀦 苧 凋 牒 朕 鍔 菟 鍍 梼 撞 鴇 涜 橡 椴 噸 乍 迩 廼 狽 矧 駁 硲 櫨 溌 釆 匪 簸 弼 畢 彪 斌 蕗 弗 箆 穆 釦 哩 柾 粍 鵡 棉 緬 摸 匁 鑓 愈 猷 熔 慾 葎 掠 賂 榔 亙

3.02の頃よりは未収録漢字が減っている。

OCR対象文書次第では必要そうなものがいくつかある。必要に応じて`jpn.training_text`に追加して`tesstrain.sh`で学習させるべし。

## JIS第二水準

546字だけ収録で残りは含まれていない。数が多いのでgistへ。

[tesseract-ocr 3.04 日本語未収録漢字のうち、JIS第二水準漢字の一覧](https://gist.github.com/atuyosi/7b6b01350aab56fb9592)

## JIS第三水準

収録されているのは1文字だけで残りは未収録。

> 鄧

多分、中国の政治家、鄧 小平（とう しょうへい）さんの「鄧」だろう。著名人の苗字なんでGoogleのコーパスにおける出現率が高くなったのであろう。

## JIS第四水準

収録漢字なし。下手に学習させると認識率低下しそうではある。

## まとめ

| 分類 | 規格上の漢字の総数 |  対応している漢字 |未対応漢字 | 
|:----| :----:| :----: | :----: |
| 常用漢字 | 1945|　1939 | 6 |
| JIS第一水準 | 2965 | 2842|  123 | 
| JIS第二水準  | 3390 | 546 |2844 | 
| JIS第三水準 | 1259 | 1 | 1258|
| JIS第四水準 | 2436 | 0 | 2436 |



ただし、ひらがな、カタカナ、数字、アルファベット、記号類などのいわゆる非漢字については考慮してない。

機会があれば非漢字についても調査しておきたい。
秘書問題（あるいは お見合い問題、あるいは浜辺の美女問題）

[OR大研究](http://www.amazon.co.jp/dp/B0039KFCJ2)には、鳩山元首相も研究した秘書問題の話が出ています。

秘書問題とは、下記のような問題です。([wikipediaより](https://ja.wikipedia.org/wiki/%E7%A7%98%E6%9B%B8%E5%95%8F%E9%A1%8C))

> 1. 秘書を1人雇いたいとする。
- n 人が応募してきている。n という人数は既知である。
- 応募者には順位が付けられ、複数の応募者が同じ順位になることはない（1位からn位まで重複無く順位付けできる）。
- 無作為な順序で1人ずつ面接を行う。次に誰を面接するかは常に同じ確率である。
- 毎回の面接後、その応募者を採用するか否かを即座に決定する。
- その応募者を採用するか否かは、それまで面接した応募者の相対的順位にのみ基づいて決定する。
- 不採用にした応募者を後から採用することはできない。
- このような状況で、最良の応募者を選択することが問題の目的である。

[数学美術館](http://ameblo.jp/interesting-math/entry-10596274766.html)には、20人の場合に平均順位を最小化する手順が出ています。

> １）最初の５人はスルー。
２）次の５人については、それまでで最高だったら誘う。
３）次の３人については、それまでで最高or２位なら誘う。
４）次の２人については、それまでで３位以内なら誘う。
５）１６番目の人は、それまでで４位以内なら誘う。
６）１７番目の人は、それまでで５位以内なら誘う。
７）１８番目の人は、それまでで７位以内なら誘う。
８）１９番目の人は、それまでで１０位以内なら誘う。
９）最後まで来てしまったらその人を誘う。

この手順で平均3位の美女が選べるそうです。

pythonで確かめてみましょう。

```py3:python
import numpy as np
def order1(b):
    n = len(b)
    c = sorted(zip(b.argsort(), range(n))) # 実際の順位
    for i in range(5, n): # 最初の5人スルー
        d = b[:i+1]
        e = len(d[d < b[i]]) + 1 # 順位
        if i < 10:
            if e == 1: break
        elif i < 13:
            if e <= 2: break
        elif i < 14:
            if e <= 3: break
        elif i < 15:
            if e <= 4: break
        elif i < 16:
            if e <= 5: break
        elif i < 17:
            if e <= 7: break
        elif i < 18:
            if e <= 10: break
    return c[i][1] + 1

np.random.seed(1)
a = np.random.randn(100000, 20)
print(np.mean([order1(b) for b in a]))
>>>
3.12287
```

だいたい3位ですね。

でも、最初の5人は必ずスルーというのは、腑に落ちません。面接に来てくれた人にも悪いです。上記の例では、標準正規分布(N(0,1))を用いました。

このように予め分布がわかっていれば、単純にあるしきい値以下なら選択するということもできるでしょう。

やってみました。

```py3:python
def order2(b, t):
    n = len(b)
    c = sorted(zip(b.argsort(), range(n))) # 実際の順位
    d = b < t
    if not d.any(): return n
    return c[d.argmax()][1] + 1

np.random.seed(1)
a = np.random.randn(100000, 20)
print(np.mean([order2(b, -0.92) for b in a]))
>>>
2.66621
```

しきい値は試行錯誤で求めました。さっきより、いいですね。

P.S.
機械学習で、できないか考えてみましたが、上手くいきませんでした。

以上
# シェルスクリプトにおけるファイル記述子

```sh


# シェルスクリプトにおけるファイル記述子

# 「『標準出力』、『標準エラー出力』を分けて、各ログファイルに出力する」
# と考えるのではなく、
# ・『標準出力(ファイル記述子1)』や『標準エラー出力(ファイル記述子2)』を、
# ファイルに置き換えたり (記述子>ファイル)
# ・あるファイル記述子Aを、ファイル記述子Bとおなじ出力に変更する (記述子A>&記述子B)
# と考えると、個人的には、わかりやすかった


# 前提として、標準出力と標準エラー出力は、画面上に出力される


# 標準出力(ファイル記述子1)を、sample.logに変更
"処理" 1>sample.log

# 上とおなじこと(1は省略できる)
"処理" >sample.log

 

# 標準エラー出力(ファイル記述子2)を、ERROR.logに変更
# (2は省略不可)　
"処理" 2>ERROR.log

 

# 標準出力(ファイル記述子1)をsample.logに、
# 標準エラー出力(ファイル記述子2)をERROR.logに、変更
"処理" 1>sample.log 2>ERROR.log

 

# 標準出力(ファイル記述子1)を、sample.logに変更し、
# 標準エラー出力(ファイル記述子2)を、標準出力(ファイル記述子1)とおなじ出力にする
"処理" 1>sample.log 2>&1

# (解説)
# まず、標準出力(ファイル記述子1)を、sample.logに変更(1>sample.log)、
# 標準エラー出力(ファイル記述子2)を、標準出力(ファイル記述子1)とおなじ出力先に変更(2>&1)
# 標準出力(ファイル記述子1)はsample.logとなっているので、
# 標準エラー出力(ファイル記述子2)も、おなじsample.logになる

 

# 標準出力(ファイル記述子1)か標準エラー(ファイル記述子2)のどちらかで、
# sample.logが上書きされるため利用NG
# 例：
"処理" 1>sample.log 2>sample.log


# (ファイル記述子5)を、sample.logに変更、
# 標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)を、
# (ファイル記述子5)とおなじ出力先にする(1>&5 2>&5)
# (ファイル記述子5)は、sample.log
"処理" 5>sample.log 1>&5 2>&5

 

# execコマンドによって、出力を保存しておくこともできる

# 現在の標準エラー出力(ファイル記述子2)を、ファイル記述子5に保存しておく
# 現在の標準エラー出力は、画面(プロンプト)
exec 2>&5

# 現在の標準エラー出力(ファイル記述子2)を、ファイルに置き換える
exec 2>sampleERR.txt

# →プロンプトに何も出力されなくなる。
# プロンプトへの基本的な出力は、標準エラー出力である・・・
# つまり、これは対話式の操作で利用できない

# シェル内でのログ出力設定に利用すれば、
# 処理のたびにログ出力先を書かなくて済む(めっちゃ便利！！)

# 例：
#!/bin/bash
# 処理1と処理2をします
# 標準出力をout.logに、標準エラー出力をerr.logに変更
exec 1>out.log
exec 2>err.log
"処理1"
"処理2"

 

 

# 例2:
# 標準出力をout.logに、標準エラー出力をerr.logに変更
# 画面にも出力
exec 1> >(tee -a out.log)
exec 2> >(tee -a err.log >&2)

 

 

 

おわり
Raspbian (jessie) Wi-Fi (固定アドレス) 有線eth0無視 dhcpcd止める

#内蔵の有線LAN(eth0)を無視する設定です。但し良く分かってない所があります。
dhcpcd止めるのに参照させて頂きました。
[Raspberry Pi2でApache Sparkを動かしてみた。]
(http://qiita.com/sohatach/items/61c3ff77bba57343c0c6)

SDカードのバックアップ絶対に取っておいて下さい。

```
wpa_passphrase SSID PassPhrase
```

```def:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="SSID"
  psk=XXXXXXXXXXXXXXXXXXXXXXXXXXX
  proto=WPA2
  key_mgmt=WPA-PSK
  pairwise=TKIP
  group=TKIP
}
```

```def:/etc/dhcpcd.conf
eth0, wlan0 定義無し
```


```def:/etc/network/interfaces
auto lo
iface lo inet loopback

allow-hotplug wlan0
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
address 192.168.1.80
netmask 255.255.255.0
gateway 192.168.1.1
broadcast 192.168.1.255
dns-nameservers 192.168.1.1
```

```def:/etc/hosts
192.168.1.80 ホスト名
```
#dhcpcdを使わないように(私は後者で止まりました)
```
sudo systemctl disable dhcpcd
```
もしくは

```
sudo apt-get remove dhcpcd5 isc-dhcp-client
```

これどこかで実行される様にしとけば良いと思うのですが影響は無さそうです。

```
sudo ifdown eth0
```

#rebootします

```
sudo reboot
```
#有線LANを抜きます

sshでアクセス出来てps -ef | grep dhcpでdhcpcd動いてないか確認
どこか外にpingやらtracerouteやら打って帰って来てれば成功だと思います。
GAE/Jで謎のSLF4JなWARNを退治する

GAE/Jなプロジェクトで謎のWANRがログに出ていました。

```
<stderr>: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
<stderr>: SLF4J: Defaulting to no-operation (NOP) logger implementation
<stderr>: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
```

致命的なエラーでは無いようなのですが、それなりの頻度で出るので退治します。
上記のエラーでググると以下のような情報がヒットします。
http://stackoverflow.com/questions/7421612/slf4j-failed-to-load-class-org-slf4j-impl-staticloggerbinder

ようするに、ログ出力ライブラリ SLF4J のモジュールが足りないようです。

このプロジェクトではGAE/JからiOSのPUSH通知を行なうために [Java Apple Push Notification Service Provider](https://github.com/notnoop/java-apns)を使っていますが、このライブラリの中でSLF4Jを使っているようです。

プロジェクトのpom.xmlを見てみると 上記のjava-apnsの記述があり、Eclipseの参照ライブラリを見るとslf4j-api-1.7.2.jarはありますが、どうやらslf4j-log4j12がないようなのでpom.xmlに以下の定義を追加してみます。

```
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.2</version>
</dependency>
```
上記の変更を反映してからサイドGAEにアップしてログを確認してみます。

```
WARN No appenders could be found for logger (xxx.xxx.xxx.Xxx).
WARN Please initialize the log4j system properly.
```
なんか違うWARNに変わりましたorz

気を取り直して上記のWARNをググってみました。
http://d.hatena.ne.jp/learn/20100108/p1

要するに上記のJARファイルを追加したことにより、ログを出力しようとして、log4jの定義が無いぞと怒られているようです

とはいえ、今回はGAEなのでlog4j.propertiesがありません。

GAEのログ設定は


>logging.properties


になりますので以下の定義を追加してみます。

```
#APNs Log4j
log4j.rootLogger=FINEST, console
log4j.appender.null=org.apache.log4j.varia.NullAppender
```

上記の設定を追加してようやくWARNが出なくなりました。

地味にここまでたどり着くのに2時間以上使いましたorz
CentOS セキュリティー UPDATE

CentOSのバージョンをそのままにしながらセキュリティー関連のアップデートのみ行うコードです。

```:linux
インストール
#yum install yum-security

セキュリティー関連アップデート実行
#yum update --security

アップデートリスト確認
#yum list-security --security

インストールされたアップデートリスト確認
#yum updateinfo list security all
```

最後のコードを実行すると以下のようなリストが確認できます。
![Cap 2016-02-18 15-10-58-959.png](https://qiita-image-store.s3.amazonaws.com/0/113820/6180ab90-37fa-e13c-df7e-3a2bd767000f.png)
jQueryでマウスクリック系のイベントをデバッグする時に自動でクリックさせる

JavaScriptを書いていてクリック系のイベントをデバッグする時、いちいちブラウザでクリックするのが面倒。
ロードしたら勝手にクリックされるようにしておくとブラウザのConsoleだけ見ていれば良いので楽。

```js
jQuery(document).ready(function($){
    $('#target').on('click', function() {
       // ここに処理を書く
    });

   
    $('#target').click(); // 発火
}(jQuery));
```
広告用語まとめ（初心者向け）

# **最初に**
広告は、出稿する**広告主**、掲載する**メディア**、広告を見る**消費者**で構成されてます。
ここにまとめた用語は、その中で**【広告主（advertiser）】**と**【メディア（publisher）】**にとって非常に大事な数字となります。
それぞれの立場になって、どんな時に使われるのかを意識しながら見ると覚えやすいと思います。

# **基本用語**
広告系の話が出たら必ず出てくる用語で、課金もこれがベースとなります。
計算式とかないので、まずはこれを確実に覚えましょう。
広告主はインプレッション課金型、クリック課金型、成果報酬型のどれかを選択して、それに合った方法で出稿します。

### **ad**
```
読み方：アド

説明：
広告のことを指す。サービス名にもadが付いていることが多い。
AdWords、AdSenseなど。
```

### **Impression**
```
読み方：インプレッション

説明：
広告の表示回数。imp（インプ）と略される事が多い。
例えば、読み込んだ画面に広告が２つ出てたら２インプとなる。
```

### **Click**
```
読み方：クリック

説明：
広告クリック回数。
```

### **Conversion**
```
読み方：コンバージョン

説明：
成果の回数。
例えば、会員登録が目的での広告出稿の場合、１人が会員登録を行ったら１コンバージョンとカウントする。
```





# **指標**
基本用語で出てきたものの組み合わせで様々な指標を出します。
ここは広告主向けなのか、メディア向けなのかを意識しましょう。

### **CTR（Click Through Ratio）**
```
読み方：シーティーアール

説明：
クリック率。広告表示回数（インプ数）に対するクリックの割合。
高い方がクリックされる確率が高いため、ユーザへの訴求が上手くいってると判断することが多い。

計算式：
CTR = クリック数 / imp数 * 100

例：
10,000impで100クリックの場合
100クリック / 10,000imp * 100 = 1%
```

### **CPC（Cost Per Click）**
```
読み方：シーピーシー

説明：
クリック1回にかかった費用。
クリック課金型の場合は、クリック単価 = CPCで問題ない。

計算式：
CPC = コスト / クリック数
```

### **CPM（Cost Per Mille）**
```
読み方：シービーエム

説明：
1,000回表示あたりの広告単価。
高いほど1PV辺りの収益が高く、メディアとして広告配信事業者を選択する基準の一つとなる。

計算式：
CPM = コスト / imp数 * 1,000
```

### **eCPM（effective Cost Per Mille）**
```
読み方：イーシービーエム

説明：
実際はインプレッション課金でないものをCPMに換算して、
インプレッションに対してどれだけコストがかかるのかを測るために使用する指標で、意味自体はCPMと同じ。
```


### **CVR（Conversion Rate）**
```
読み方：シーブイアール

説明：
訪問数（クリック数）に対するコンバージョン数の割合。
高いほど訪問からコンバージョンに繋がる確率が高い。

計算式：
CVR = コンバージョン数 / 訪問数（クリック数） * 100
```

### **CPA（Cost Per Acquisition）**
```
読み方：シーピーエー

説明：
成果（Conversion）を1件獲得するのにかかるコスト。
低いほど安い金額で成果を獲得できたことになる。

計算式：
CPA = コスト / コンバージョン数
```

### **ROAS（Return On Advertising Spend）**
```
読み方：ロアス

説明：
広告の費用対効果。
100%になると広告費を回収できたことになり、高くなると費用対効果が高いことになる。

計算式：
ROAS = 広告経由の売上 / 広告費 * 100(%)
```

### **LTV（Life Time Value）**
```
読み方：エルティーブイ

説明：
顧客生涯価値。
顧客がリピートし続ける商品やサービスのトータル価値。

計算式：
いろいろある。
```
LTV計算式サンプル：
https://teiki-eclab.jp/etc/ltv-calc
https://precs.jp/blog/?p=294](https://precs.jp/blog/?p=294
Vagrantのデバッグを行うための準備

# 概要

vagrant を起動するときの流れを追い駆けたいので、デバッグ方法を探す。


# 調べたこと

## 公式サイトの情報

まずはこれでメッセージが見えるようになるので、大抵はこれで言が足りそう。

[Debugging and Troubleshooting - Vagrant by HashiCorp](https://www.vagrantup.com/docs/other/debugging.html)


## pry

pryが良さそうかなと思い、pryについて調べる。

* [vagrant pry - Google 検索](https://www.google.co.jp/search?q=vagrant+pry&ie=utf-8&oe=utf-8)


これが今回使えそうかな？

* [Debugging Vagrant plugins | Linux Simba](http://linuxsimba.com/debugging-vagrant-plugins/)

これも同じようなことが書いてある感じ

* [Debugging Vagrant with pry-byebug – Notes to self](http://nts.strzibny.name/debugging-vagrant-with-pry-byebug/)


これはちょっと違う感じか

* [Using pry-remote to debug within Vagrant VM – [codecrate]](http://codecrate.com/2015/01/pry-remote-with-vagrant.html)
Linuxでuserを作成する時の備忘録


```bash
adduser japan
```

###wheelユーザーを有効にする

rootユーザーになった後

```bash
visudo
```

```visudo
%wheel  ALL=(ALL)       ALL
```

ユーザーをwheelグループに追加

```bash
usermod -aG wheel japan
```

###wheel groupに属してるユーザーがrootになれなるかを設定する。

```bash
vi /etc/pam.d/su
```

wheel groupに属していないと、rootになれない設定。

```su
auth required pam_wheel.so use_uid
```

全てのユーザーがrootになれる設定。

```su
#auth required pam_wheel.so use_uid
```
olタグのナンバリングをカッコつきにする

# 単純に(1)になればいい

```css:kakko.css
ol {
  list-style-type: none;
}

ol li {
  counter-increment: cnt;
}

ol li:before {
  content: "(" counter(cnt) ") ";
}
```

# ()部分が、list-style-position:insideてきな扱いになるのが嫌

```css:kakko-outside.css
ol {
  list-style-type: none;
  margin-left: 3em; /* いい塩梅の幅を設定したまえ */
}

ol li {
  counter-increment: cnt;
}

ol li:before {
  content: "(" counter(cnt) ") ";
  display:inline-block;
  margin-left:-3em; /* いい塩梅の幅を設定したまえ */
  width: 3em; /* いい塩梅の幅を設定したまえ */
}
```

# ol > li の start属性を使いたい
以下のhtmlをカッコつきで表示したいとき、第二シーズンのstart属性が無視されて、1～の表示になっちゃう。

```html:kakko.html
<h1>第一シーズン</h1>
<ol start="1">
  <li>マックス誕生</li>
  <li>殺人スポーツ・レイキング</li>
  <li>謎の人体バンク</li>
</ol>

<h1>第二シーズン</h1>
<ol start="4">
  <li>天才少年養成アカデミー</li>
  <li>美人伝道師の誘惑</li>
  <li>宿敵グロスバーグの逆襲</li>
</ol>
```

しょうがないので、jQueryで無理やり書き換えちゃう。

```js:kakko.js
$("ol").each(function() {
  var start = $(this).attr("start");
  start = start - 1;
  $(this).css({
    'counterReset': 'cnt ' + start
  });
});
```

しっかり見てないけど、IE8以降ぐらいなら動くんじゃないかな。

#関連リンク
[イカ](http://cookpad.com/search/%E3%82%A4%E3%82%AB%E3%83%AA%E3%83%B3%E3%82%B0
)
[アイドル](https://idoling.fujitv.co.jp/)
[夢がひろがる](http://netyougo.com/2ch/1268.html)
Go言語の関数


####変数をひっくり返す

```go
func swap(a, b int) (int, int ){
  return b, a
}

func main(){
  fmt.Println(swap(1, 2))
}
```

####クロージャーとして使う

```go
func main(){
  f := func(a, b int) (int, int ){
    return b, a
  }

  fmt.Println(f(1, 2))
}
```

####即時関数っぽく使う

```go
func main(){
  func(msg string){
    fmt.Println(msg)
  }("test")
}
```
Go言語のデータ型と配列、スライス、マップ


####基本のデータ型
string, int, float64, bool, nil
初期値

```go
var s string //""
var a int //0
var f bool //false
```


####変数

```go
func main(){
  var msg string
  msg = "hello world"
  var msg1 string = "hello world1"
  var msg2 = "hello world2" //stringは省略可能
  msg3 := "hello world3" //値と変数の紐付け
  fmt.Println(msg)
  fmt.Println(msg1)
  fmt.Println(msg2)
  fmt.Println(msg3)
  
  a, b := 1, 2 //複数宣言
  fmt.Println(a)
  fmt.Println(b)
  
  var (
    c = 1
    d = "test"
  )
}
```


####配列
```go
func main(){
  var a [5]int
  b := [3]int{1, 3, 5} //型の宣言と同時に値を代入
  c := [...]int{1, 3, 5, 6} //値はわかっているので指定する必要なし
  fmt.Println(a)
  fmt.Println(b)
  fmt.Println(c)
}
```

###配列の展開
```
func main() {
	array1 := []int{1, 2, 3}
	array2 := []int{4, 5, 6}
	array3 := append(array1, array2...)

	fmt.Println(array1)
	fmt.Println(array2)
	fmt.Println(array3)
}
```

```shell-session
[1 2 3]
[4 5 6]
[1 2 3 4 5 6]
```

####スライス1

```go
func main(){
  a := [5]int{9, 8, 7, 6, 5}
  s := a[0:3]
  s[0] = 12
  fmt.Println(a)//[12 8 7 6 5]
  fmt.Println(s)//[12 8 7]
  fmt.Println(len(s))//3
  fmt.Println(cap(s))//5 0から切り出せる最大の値
}
```

####スライス2

```go
func main(){
  s := make([]int, 3)
  s2 := []int{1, 3, 5}
  fmt.Println(s)//[0 0 0]]
  fmt.Println(s2)//[1 3 5]
  s2 = append(s2, 10)
  fmt.Println(s2)//[1 3 5 10]
  s3 := make([]int, len(s2))
  num := copy(s3, s2)
  fmt.Println(s3)//[1 3 5 10]
  fmt.Println(num)//4
}
```

####スライス3

```go
func main(){
  cards := []string{newCard(), "Ace of Dia"}
  cards = append(cards, "Six of Spades")

  for i, card := range cards {
    fmt.Println(i, card)
  }
}
```

####マップ

```go
func main() {
  m := make(map[string]int)
  m["japan"] = 100
  m["ame"] = 200
  fmt.Println(m)
  delete(m, "japan")
  fmt.Println(m)
  m2 := map[string]int{"tokyo":1, "osaka":2}
  fmt.Println(m2)

  m3 := make(map[string]string)
  m3["japan"] = "no1"
  m3["ame"] = "no2"
  fmt.Println(m3)
  v1, ok := m3["japan"]
  fmt.Println(v1)//no1
  fmt.Println(ok)//true

  v2, ng := m3["canada"]
  fmt.Println(v2)
  fmt.Println(ng)//false
}
```
Go言語のインストール


vagrantのboxに追加

```bash
vagrant box add https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box --name centos7
```

```bash
vagrant init
```

```bash
vi Vagrantfile
```

localのdir
/Users/test/workspace/golang

仮想マシンのdir
/home/vagrant/golang

```bash
Vagrant.configure(2) do |config|
  config.vm.define "host" do |node|
    node.vm.box = "centos7"
    node.vm.hostname = "golang"
    node.vm.network :private_network, ip: "192.168.43.55"
    node.vm.synced_folder "/Users/test/workspace/golang", "/home/vagrant/golang", mount_options: ['dmode=777','fmode=777']
  end 
end
```


```bash
vagrant up
```

```bash
vagrant ssh
```

仮想マシン上
パスワードはvagrant

```bash
sudo yum instlall golang
```

Hello World

```hello.go
package main
import "fmt"

func main() {
  fmt.Println("hello world")
}
```

動かし方

```bash
go run hello.go
```

もしくは

```bash
go build hello.go 
```

```bash
./hello
```

Go言語をブラウザで試したい時
https://play.golang.org/

Go言語のドキュメント
https://golang.org/doc/
nkf インストール

#nkfコマンドが利用できなかったので，インストールを試みる

2016/02/18現在
最新Version:_2.1.4_

wgetでダウンロードを行って解凍
ディレクトリは自由

```
# wget https://osdn.jp/projects/nkf/downloads/64158/nkf-2.1.4.tar.gz/
# tar zxf nkf-2.1.4.tar.gz
```

同ディレクトリにダウンロードしたファイルと
解凍ファイルができてる

```
nkf-2.1.4
nkf-2.1.4.tar.gz
```

展開したディレクトリに移動し，コンパイル

```
# cd nkf-2.1.4
# make
```

これではまだ使用できないので，
コンパイルして出力されたファイル(nkf)を/usr/bin/に移動

```
cp nkf /usr/bin/
```
WindowsタッチPCにも対応したクロスブラウザのイベント pointer touch mouse click

# touch と mouse イベント

SP/PCの両方に対応したイベントの振り分けはこれで良かったのですが。

```js
var isTouchDevice = 'ontouchend' in document,
    eventNames    = {
        start: isTouchDevice ? 'touchstart' : 'mousedown',
        move : isTouchDevice ? 'touchmove'  : 'mousemove',
        end  : isTouchDevice ? 'touchend'   : 'mouseup',
        click: 'click'
    };
```

WindowsのタッチPC+Chromeの組み合わせで、マウスでボタンが効きません。
(画面タッチは効きます)
touch が先に true になってしまうため。

# pointer touch mouse click イベントに対応するには
こうすると、SP/PC/タッチ搭載PC どのデバイスでも大丈夫です。

```js
;(function(window, document, undefined) {

    var deviceEvents = {
        Touch     : typeof document.ontouchstart !== 'undefined',
        Pointer   : window.navigator.pointerEnabled,
        MSPointer : window.navigator.msPointerEnabled
    };

    var eventNames = {
        start     : deviceEvents.Pointer ? 'pointerdown' : deviceEvents.MSPointer ? 'MSPointerDown' : deviceEvents.Touch ? 'touchstart' : 'mousedown',
        move      : deviceEvents.Pointer ? 'pointermove' : deviceEvents.MSPointer ? 'MSPointerMove' : deviceEvents.Touch ? 'touchmove'  : 'mousemove',
        end       : deviceEvents.Pointer ? 'pointerup'   : deviceEvents.MSPointer ? 'MSPointerUp'   : deviceEvents.Touch ? 'touchend'   : 'mouseup',
        click     : 'click'
    };

    window.eventNames = eventNames;

})(this, this.document);
```

```js
;(function($, window, document, undefined) {
    $('.btn').on(eventNames.end, function () {
        // 処理
    });
})(jQuery, this, this.document);
```
GitHubのIssue・Pull Requestのテンプレート機能を使おう

GitHubにIssueとPull Requestのテンプレート機能がつきました。（["Issue and Pull Request templates" - GitHub](https://github.com/blog/2111-issue-and-pull-request-templates)）とても便利な機能なので、みなさんも使ってみてください。

**※本記事は公式の日本語ドキュメントが作成される前に作成され、メンテナンスされていません。ぜひ公式ドキュメントの方をご覧ください。**
▼
「[公式ドキュメント：テンプレートを使用して便利な Issue やプルリクエストを推進する](https://docs.github.com/ja/github/building-a-strong-community/using-templates-to-encourage-useful-issues-and-pull-requests)」


---- 以下いつか消します -----

# ファイル配置場所

リポジトリ直下、もしくは`.github`フォルダーへ特定の名前がついたファイルを配置することで、Issueを作成するときや、プルリクエストを行うときの説明テキストのテキストエリアに、自動でテキストが挿入されます。

- `ISSUE_TEMPLATE.md` - Issueを作成するときのテンプレート
- `PULL_REQUEST_TEMPLATE.md` - PullRequestを作成するときのテンプレート

また、`CONTRIBUTING`と名前のついたファイルを配置すると、Pull Request時のガイドラインとして示すことができます。

- `CONTRIBUTING.md` - Pull Request時のガイドライン

※拡張子はなんでも良いようです。

![github.png](https://qiita-image-store.s3.amazonaws.com/0/1423/770ecba4-0b00-9840-30e2-ef6b9c1b6076.png "github.png")

▲GitHubのリポジトリにファイルを配置した例

# ISSUE_TEMPLATEを作る

- `ISSUE_TEMPLATE.md`ファイルを配置すると、Issue作成時にの説明記入エリアにテキストが挿入される。

![issue-template.png](https://qiita-image-store.s3.amazonaws.com/0/1423/c2b010ff-422e-c4a2-125d-5ec4be7aec11.png "issue-template.png")

## 複数のIssueテンプレートファイルを作る
Issueに関しては、複数のテンプレートファイルも作れます。例えばバグレポートや機能のリクエストなどはテンプレートが別あると便利です。`.github/ISSUE_TEMPLATE` フォルダを作成し、中にファイルを追加するだけです。

▼ フォルダを自分で作らなくても、プロジェクトの[Settings]の[Option]、[Features]の[Set up template]ボタンからでも追加できます。
![貼り付けた画像_2018_06_25_15_22.png](https://qiita-image-store.s3.amazonaws.com/0/1423/d46c01d2-184e-6315-aa2d-9e0c80f7da99.png)


▼ Issueテンプレートを複数作ったときのIssue画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/1423/0eb5037d-3ded-731b-0627-13ec62fbf475.png)



# PULL_REQUEST_TEMPLATE、CONTRIBUTINGを作る

- `PULL_REQUEST_TEMPLATE.md`ファイルを配置すると、プルリクエストの説明記入エリアに自動でテキストが挿入される。
- `CONTRIBUTING.md`ファイルを配置すると「Please review the [guidelines for contributing](https://github.com/nyamogera/issue-test/blob/master/.github/CONTRIBUTING.md) to this repository.」と文字が表示される。**guidelines for contributing**の部分のリンクは、`CONTRIBUTING.md`へのリンクとなっている。

![pull-request-template.png](https://qiita-image-store.s3.amazonaws.com/0/1423/0387d5c1-d833-bda9-4652-121bddc865a7.png "pull-request-template.png")


# まとめ
IssueやPull Requestに記入して欲しい情報はある程度決まっていると思います。今回のテンプレート機能を使うことで、記入者はなにを書けばいいのかわかりやすくなり、閲覧者側にとっては見やすいIssueやPull Requestを作成できるようになると思います。
出、出、出~~~!!mongorestore実行中的Error restoring database "insertion error: EOF"奴~~wwwwww

俺です。

この世にAmazon Linuxで稼働しているmongodbが存在したとします。

## version

```
mongodb-org-server-3.0.7-1.amzn1.x86_64
mongodb-org-tools-3.0.7-1.amzn1.x86_64
mongodb-org-shell-3.0.7-1.amzn1.x86_64
mongodb-org-3.0.7-1.amzn1.x86_64
mongodb-org-mongos-3.0.7-1.amzn1.x86_64
```


## issue

このmongodbへmongorestoreを実行中に、とあるコレクションをリストアするタイミングで
以下の様なエラーに遭遇しました。

```
Failed: restore error: mongorestoreni.shiwo: error restoring from puke/mongo/mongorestoreni.shiwo: insertion error: EOF
```

## 対策

`--batchSize`オプションを調整するとよいです。

## 参考

https://jira.mongodb.org/browse/TOOLS-939
[Mac]Macでローカルサーバー環境構築(apache+php+mysql+phpmyadmin)

OS X ElCapitanでの話。

#apache起動

ターミナルで

```shell-session
sudo apachectl restart
```

http://localhost/
でIt worksが出ればok.

デフォルトでは、DocumentRootは
/Library/WebServer/Documents/
になる。


```shell-session
open /Library/WebServer/Documents/
```

などでFinderで確認できる。
ただ権限の問題で、そのままだとファイルの修正はやりづらい。

適宜virtualhost設定などで調整する。

/etc/apache2/extra/httpd-vhosts.conf
※/etc/apache2/httpd.conf
 で
 Include /private/etc/apache2/extra/httpd-vhosts.conf
 のコメントアウト解除必要

ホストファイルいじる場合は、
http://qiita.com/kitanoow/items/35c1ebffd721f83ac7a0
このあたりで。


#php読み込み

/etc/apache2/httpd.conf
\#LoadModule php5_module libexec/apache2/libphp5.so
のコメントアウトを解除で。apache再起動

php -versionあたりでバージョンは確認。
(php ver 5.5.30が現在では確認できた)


#Homebrewインストール(なければ)
インストールは、
http://brew.sh/index_ja.html
こちらよりコマンドがかいてあるので、それを実行。


#mysqlのインストール・起動

```shell-session
brew update
brew install mysql
```

installした際のコメントの通り、
mysql.server startで起動

Starting MySQL
. SUCCESS! 

で、起動OK

あとは、ユーザーの追加や設定など

my.cnfの位置は、
/usr/local/Cellar/mysql/5.7.11/mysql-test/std_data/mylogin-bad-cipher.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/federated/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb_big/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb_binlog/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb_ddl/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb_memcache/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb_rpl/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndb_team/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/ndbcluster/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/rpl/extension/bhs/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/rpl/my.cnf
/usr/local/Cellar/mysql/5.7.11/mysql-test/suite/rpl_ndb/my.cnf
/usr/local/Cellar/mysql/5.7.11/support-files/my-default.cnf
※バージョンによって変わります。

編集しやすいように、
/usr/local/etc/my.cnf
あたりに適宜コピーしておく。


#phpmyadmin

phpmyadmin一発は無理だったので。

```shell-session
brew tap homebrew/php/
brew install mhash
```

そのあとに、

```shell-session
brew install phpmyadmin
```

vhostsファイルに、

```shell-session
Alias /phpmyadmin /usr/local/share/phpmyadmin
<directory /usr/local/share/phpmyadmin/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    <ifmodule mod_authz_core.c>
        Require all granted
    </ifmodule>
    <ifmodule !mod_authz_core.c>
        Order allow,deny
        Allow from all
    </ifmodule>
</directory>
```

など記述。



接続で、”the local server's socket is not correctly configured”などで
こける場合は、php.iniで/tmp/mysql.sockの設定が必要かも。

謝辞 参考URL:
http://starzero.hatenablog.com/entry/2012/11/10/103047
http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d
https://gist.github.com/gaspanik/3806983
https://soarcode.jp/posts/55
コードレビューの担当者の配分を可視化するスクリプト

コードレビューがつまっている人から助けるためにバッとチェックしたい。

実行するとこうなる

<img width="412" alt="スクリーンショット 2016-02-18 2.27.19 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/229/b691e93c-4d13-61d4-510a-040b58532cfe.png">

コード

```js
var icons = jQuery('.js-issue-row')
                .toArray()
                .map(issue => issue.querySelector('img'))
                .filter(img => img !== null)
                .sort((a, b) => a.alt.localeCompare(b.alt))
                .reduce((container, user) => { 
                    container.appendChild(user.cloneNode());
                    return container;
                  }, 
                  document.createElement('div'));

document.querySelector('.repository-content')
  .insertBefore(icons, document.querySelector('.issues-listing'));
```
DroidKaigi2016メモ：Android Lintで正しさを学ぼう

* *DroidKaigiのメモ書きを随時アップロードしていきます*
* *スライドは上がり次第こちらに貼ります*

*スライド上がっていたので公式の内容は以下をご参照ください。*
http://www.slideshare.net/Nkzn/androidlint-droidkaigi?ref=http://unsolublesugar.com/20160218/134940/

## 発表者
* @Nkzn
* Yukiya Nakagawa
* 農業生産者向けサービス「アグリノート」

## 対象者
* Androidプログラミングのベストプラクティスが分からない
* 品質を保証する

## Android List?
* 構文解析ツール
* Google公式
* 222個のルール
  - Category, Severity(危険度), Priority
* Googleによるアンチパターン集

## 初学者がやりがちなミス
* LinearLayoutに並べたビューが表示されないのはなぜ？(orientation)
  - 慣れたらやらなくなるミス
  - horizontalの場合も明示的にちゃんと書こう
* SharedPreferenceが保存されない
  - commit()をちゃんと書こう.
  - commit()で書いたけどなぜか黄色くなる...?
  - commit()の返り値を保存していないことでWarningが起こってる
  - apply()を使う
* Toastがでない
  - show()を呼んでないだけ
* なんかこのボタン押しづらい
  - ButtonOrder
  - キャンセルのようなものは左、本来やりたくなかた操作を続ける「OK」のようなものは右に置く
  - おまけ：API Level13まではOKが左で正しかった
* このアプリ英語化して問題
  - 日本語直書きNG
  - レイアウトXML
  - AndroidManifest.xml
  - メニューXML
  - Javaに日本語をベタ書きしても検出されない
  - 文字列リソースに抜き出すメリット
  - 多言語化するときにリソースを変更するだけで置き換えられる
  - プロトタイピングでベタ書きしたものを、後からAndroid Studioのクイックフィックスを使って文字列リソース化
  - *レイアウトファイルのソートってどうしてますか？*
    - 場合によってソートすべし、必須だとは思わない

## アプリが管理していた個人情報が別のアプリから見えていた！
* AndroidManifext.xml
* ExportedContentProvider
* Dropboxの2011年の話がよくネタになっている
* providerタグには必ず`android:exported="false"`を付けましょう！

## 初学者がやりがちなミス part.2
* EditテキストでなんかめっちゃWarning出てるんだけど！
  - TextFields
* アイコンで怒られる？
  - この辺から静的解析の領域を抜けてくる...
  - ステータスバーやActionBarの色をマテリアルデザイン
* 3点リーダをピリオド3つで書くとwarning
  - Typograpy
  - フォントによってはピリオドを都合よく...と見えてくれるかどうか分からない
  - 3点リーダ文字として書く、ISOの文字番号を使う

## エンジニアの言い分
- Googleが良くないこととして回避しているので、相対的にアプリの品質は上がる

## 品質指標に使う場合
- 優先度が低いルールは事前に設定でignoreしておく
- プロジェクトごとに大切にするルールを切り分ける

## エンジニアの方へ
- abortOnError, checkReleaseBuildsはfalseにしないで！
- Android Studioがソースコードに黄色いのとか赤いのとか付いてたら、マウスオーバーして何が起きてるかみよう！
- 直し方を聞こう、知ろう
- 200個のルールをマスターしよう