OmniAICreator/Qiita-1.07M huggingface dataset:
SMTP over SSL/TLS

※自己証明書での送信です。
※Postfixです。

## SSL証明書ディレクトリの作成
```
mkdir /etc/postfix/ssl/SERVER
```

## CA局発行スクリプトの修正
```
cp /usr/lib/ssl/misc/CA.sh /etc/postfix/ssl/

vi /etc/postfix/ssl/CA.sh
if [ -z "$DAYS" ] ; then DAYS="-days 36500" ; fi        # 100 year
CADAYS="-days 36500"     # 100 years
if [ -z "$CATOP" ] ; then CATOP=/etc/postfix/ssl/CA ; fi
```

## opensslスクリプトの修正
```
cp -pi /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.org
vi /etc/ssl/openssl.cnf
※2ヶ所のパス修正
[ CA_default ]
dir             = /etc/postfix/ssl/CA
[ tsa_config1 ]
dir             = /etc/postfix/ssl/CA
```

## CA局の作成
### CA秘密鍵の作成
```
sh /etc/postfix/ssl/CA.sh -newca

 ※cakey.pemのパスフレーズを入力
 ※Subject情報を入力
   Country Name (2 letter code) [AU]:JP
   State or Province Name (full name) [Some-State]:Fukuoka
   Locality Name (eg, city) []:Fukuoka-shi
   Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alterbooth Inc.
   Organizational Unit Name (eg, section) []:TechRoom
   Common Name (eg, YOUR name) []:FQDN
   Email Address []:設定不要
```

### CA証明書の作成
```
openssl req -new -x509 -keyout /etc/postfix/ssl/CA/private/cakey.pem -out /etc/postfix/ssl/CA/cacert.pem -days 36500
```

## サーバー証明書の作成
### 秘密鍵の作成
```
openssl genrsa -rand rand.dat -des3 2048 > /etc/postfix/ssl/SERVER/FQDN.key.pem
```

### 鍵パスフレーズの削除
```
openssl rsa -in /etc/postfix/ssl/SERVER/FQDN.key.pem -out /etc/postfix/ssl/SERVER/FQDN.key.pem
```

### 証明書要求（CSR）の作成
```
openssl req -new -days 36500 -key /etc/postfix/ssl/SERVER/FQDN.key.pem -out /etc/postfix/ssl/SERVER/FQDN.csr.pem

 Subject情報を入力
   Country Name (2 letter code) [AU]:JP
   State or Province Name (full name) [Some-State]:Fukuoka
   Locality Name (eg, city) []:Fukuoka-shi
   Organization Name (eg, company) [Internet Widgits Pty Ltd]:Alterbooth Inc.
   Organizational Unit Name (eg, section) []:TechRoom
   Common Name (eg, YOUR name) []:FQDN
   Email Address []:設定不要
```

### 証明書の作成
```
openssl ca -in /etc/postfix/ssl/SERVER/FQDN.csr.pem -keyfile /etc/postfix/ssl/CA/private/cakey.pem -cert /etc/postfix/ssl/CA/cacert.pem -out /etc/postfix/ssl/SERVER/FQDN.crt.pem
```

## Postfix設定変更
### main.cf修正
```
vi /etc/postfix/main.cf
以下を追記
#-------------------------------------#
# TLS
#-------------------------------------#
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtp_tls_security_level = may
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtpd_tls_CAfile = /etc/postfix/ssl/CA/cacert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/SERVER/FQDN.crt.pem
smtpd_tls_key_file = /etc/postfix/ssl/SERVER/FQDN.key.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
smtpd_tls_security_level = may
smtp_tls_loglevel = 2
```

### master.cfの修正
```
vi /etc/postfix/master.cf
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
```

### postfix 再起動
```
service postfix restart
```

## 送信テスト
```
openssl s_client -connect FQDN:465

MAIL FROM: 送信元メールアドレス
RCPT TO: 宛先メールアドレス
DATA
Subject:Mail Send Test
From:送信元メールアドレス
To:宛先メールアドレス
Test Mail
.
```
IEをMicrosoft windows based script hostとJavaScriptで自動操作しますよ。


# やりたいこと
本当はGithubを操作したかったわけではないのですが、自動&定期実行でIEを起動してログインしてフォームの入力をして送信します。

# JavaScriptの準備
test.jsという名前で以下の内容を作成します。
`user_name`と`user_password`に自分のGithubのアカウント情報を設定してください。
またgit_wiki_newはあなたの持っているリポジトリのwikiに移動してNewPageをクリックして出てくるページのURLを設定しましょう。

```
// この下を書き換えてください
var user_name = "*****"
var user_password = "*****"
var git_wiki_new = "https://github.com/*****/*****/wiki/_new"


//  Internet Explorerオブジェクトを取得(Internet Explorerの起動)
var IEApp = new ActiveXObject( "InternetExplorer.Application" );

//  Internet Explorerアプリケーションを表示
IEApp.Visible = true;


//  ページの読み込みが終わるまで処理を止める　その後3秒停止
while( IEApp.Busy )
    WScript.Sleep( 500 ); 
WScript.Sleep( 3000 );


//　サイトに移動
IEApp.Navigate( "https://github.com/login" );

//  ページの読み込みが終わるまで処理を止める　その後3秒停止
while( IEApp.Busy )
    WScript.Sleep( 500 ); 
WScript.Sleep( 3000 );

// フォームに入力
var TextBox1 = IEApp.document.getElementById( "login_field" );
var TextBox2 = IEApp.document.getElementById( "password" );
TextBox1.value = user_name;
TextBox2.value = user_password;

// 3秒停止
WScript.Sleep( 3000 );


//  ボタンを押す
var Button = IEApp.document.getElementsByName( "commit" ).item(0);
Button.click();

//  ページの読み込みが終わるまで処理を止める　その後3秒停止
while( IEApp.Busy )
    WScript.Sleep( 500 ); 
WScript.Sleep( 3000 );

/*-----------------------------------------------------------*/
//　サイトに移動
IEApp.Navigate( git_wiki_new );

//  ページの読み込みが終わるまで処理を止める　その後3秒停止
while( IEApp.Busy )
    WScript.Sleep( 500 ); 
WScript.Sleep( 3000 );

var Title = IEApp.document.getElementsByName( "wiki[name]" ).item(0);
Title.value = new Date();
var Editor = IEApp.document.getElementById( "gollum-editor-body" );
Editor.value = "自動入力したよ（　´_ゝ`）(´<_｀ 　)"

// 3秒待つ
WScript.Sleep( 3000 );

var Button2 = IEApp.document.getElementById( "gollum-editor-submit" );
Button2.click();

//  ページの読み込みが終わるまで処理を止める　その後3秒停止
while( IEApp.Busy )
    WScript.Sleep( 500 ); 
WScript.Sleep( 3000 );

/*-----------------------------------------------------------*/
//ログアウト
var Signout = IEApp.document.getElementsByClassName( "dropdown-signout" ).item(0);
Signout.click();

//  ページの読み込みが終わるまで処理を止める　その後3秒停止
while( IEApp.Busy )
    WScript.Sleep( 500 ); 
WScript.Sleep( 3000 );

//  Internet Explorerを終了
IEApp.Quit();

// WScript.Echo( "終了" );

//  オブジェクトを解放
IEApp = null;
```

[ここ](http://www.atmarkit.co.jp/ait/articles/1305/31/news049.html)を参考にタスクスケジューラの起動までを行います。

- 画面右側の基本タスクの作成をクリック
- 名前と説明を適当に埋めて「次へ」
- 毎日を選択して「次へ」
- 開始日時を適当に5ふん後くらいで「次へ」
- プログラムの開始を選択して「次へ」
- 参照をクリックして先ほど作ったtest.jsを選択
- そのまま完了まで進んでいきます。


タスクスケジューラの設定はここまでで今度はtest.jsを右クリックします。

- 全般タブの変更をクリックして「Microsoft windows based script host」を選択します。
- あとはPCを起動したまま待ちます。
CentOSでUECコンピュータ大貧民大会の配布プログラムを動かしてみる。

# UECda
[公式サイト](http://uecda.nishino-lab.jp/2015/)

UECコンピュータ大貧民大会、通称UECdaは電気通信大学の学園祭の日程と合わせて毎年開催されます。内容は、トランプゲームの大貧民（大富豪）をプレイするプログラムを対戦させ、最も強いプログラムを決める大会です。なので、参加するには、大会の環境で動くプログラムを事前に作成する必要があり、そのための基本的なサンプルや過去の優勝したプログラムなどは公式サイトで配布されています。今回はこの配布プログラムを動かして、対戦している様子が見えるところまでまとめます。公式サイトにはドキュメントがありますのでMacやWindowsで動かす方法はそちらを参照ください。

大会自体は上記の通り電気通信大学の学園祭の日程と同じなので11月中頃に行われますが、参加登録自体は1~2か月前からできて、1，2週間前には締め切られたと思います。

# 環境準備

VirtualBoxに入れたCentOS6.7で今回は動かしました。
minimalではなくDesktopが表示される方を入れましょう。
最終的に対戦画面はGUIで見えるようになります。

<img width="488" alt="uecda.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/86684/5c09c0b6-64ad-b0ea-2fa3-bd44e2fbcd42.png">


# ダウンロード
開発キットをダウンロードして解凍します。
今回はC言語版です。

公式サイトからダウンロードできますがダウンロードリンクは年度によって変わるかもしれないので最新のものをとってきましょう。

```
mkdir uecda
cd uecda
curl -O http://uecda.nishino-lab.jp/files/tndhm_devkit_c-20140627.tar.gz
tar xvzf tndhm_devkit_c-20140627.tar.gz
```

# サーバ実行
初めにgccを入れておきます。

```
yum install gcc
```

これで残りがすんなり動くと幸せなのですが動かなかったのでいろいろ入れます。

```
yum install libX*
```

この後は公式サイトのドキュメントと手順は同じです。
サーバを実行します。

```
cd tndhm_devkit_c-20140627
cd server
./configure
make
cd src
./tndhms
```

# クライアント
クライアントを実行します。
以下を行う前にserverと同じ改装にあるclientフォルダに移動して以下を行っていきます。

```
./configure
make
```

次にクライアントをサーバにつないでいきます。
サーバに5台クライアントが接続されるとゲームが始まります。

```
./client &
./client &
./client &
./client &
./client &
```

この実行にはオプションがあるのですがとりあえずはなにもつけなくても動きます。


# 実行画面
これで無事に実行できれば下のようなグラフが伸びていくところが見れると思います。　

<img width="453" alt="uecda2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/86684/07814a9e-775a-faf7-68b8-b389ac7a42e9.png">

トランプが表示され、対戦内容を見る画面に切り替えるには横（下？）のコントローラで操作できます。この画像だと右上にある見切れているやつです。白い箱が四つ並んでいるだけで一見コントローラには見えません。使い方は公式のドキュメントのどこかに書いてあると思うのですが、見つかりませんでした。これで試合速度や表示形式を変更できます。
Scalaで動的にインスタンスを生成する

これは [Scala Advent Calendar](http://qiita.com/advent-calendar/2015/scala) 20日目の記事です。
元々は全く別のネタを書こうと思っていたのですが、進捗ダメだった [@takashabe](https://twitter.com/takashabe) がお送りします。

本記事では実行時に与えられた引数によって動的にインスタンスを生成したい欲求に駆られ、Scalaにおける実装例について調べてみた結果についてつらつら書きます。

## クラス文字列からインスタンスを生成する

`scala.reflect` を使って動的にインスタンスを生成することが出来ます。Scalaのリフレクションではミラーと呼ばれるオブジェクトを通してアクセスすることが可能となっています。

※ scala本体にはreflectが含まれていないため、sbtなどで実行する際は依存関係を解決しておく必要があります

```scala:build.sbt
libraryDependencies ++= Seq(
  // 言語のバージョンに合わせて
  "org.scala-lang" % "scala-reflect" % "2.11.2",
)

```

### 単純なコード例

```scala
case class ParameterSchema(name: String, email: String) extends Parameter

class Parameter {
  def generate(className: String, args: Any*): Parameter = {
    // クラスミラーを取得
    val mirror = scala.reflect.runtime.currentMirror
    val classSymbol = mirror.staticClass(className)
    val classMirror = mirror.reflectClass(classSymbol)

    // クラスミラーからコンストラクタミラーを取得
    val constructorSymbol = classSymbol.typeSignature.decl(termNames.CONSTRUCTOR).asMethod
    val constructorMethodMirror = classMirror.reflectConstructor(constructorSymbol)

    // コンストラクタミラーからコンストラクタを実行してインスタンスを生成する
    constructorMethodMirror(args: _*).asInstanceOf[Parameter]
  }
}

val parameter = new Parameter()
val schema = parameter.generate("com.example.root.Parameter", "Alice", "alice@example.com")

println(schema) // => ParameterSchema(Alice,alice@example.com)
```

### コンストラクタが複数ある場合

先の例では `ParameterSchema` にコンストラクタが1つしか無かったため特に問題ありませんでしたが、補助コンストラクタが用意されていて複数のコンストラクタがある場合は `Symbols#asMethod` が例外を吐きます。


`Symbols#asMethod` は1つのコンストラクタが渡されることを期待しています。 `asMethod.paramLists` で引数の数が取れるので、`filter` にかけるなりしてやれば良いです。

```scala
case class ParameterSchema(name: String, email: String) extends Parameter {
  def this() = this("Bob", "bob@example.com")
}

...

val constructorSymbol = classSymbol.typeSignature.decl(termNames.CONSTRUCTOR).filter {
  _.asMethod.paramLists match {
    case List(Nil)        => // 引数無し
    case List(List(_, _)) => // 引数を2つ取る
  }
}.asMethod
```

## 分からなかったこと

元々動的インスタンス生成をやりたかった背景として、CLIからデータを羅列したJSONとJSONをマッピングするためのクラス名を渡して動的にゴニョゴニョしたかったという思いがあります。

そこで以下のような感じで `convertTo[T]` の部分がミラーなどから指定出来れば幸せになれると思ったのですがよく分かりませんでした...。

```scala
val jsonAst = """{ "name":"Alice", "email":"alice@example.com" }""".parseJson
val param = JsonAst.convertTo[ParameterSchema]
```

もし「そんなことも分からんのかこうすれば動くんじゃ！１１」という方がいれば教えて頂ければ幸いです :pray:

## まとめ

リフレクションを用いてクラス名の文字列から動的にインスタンスを生成する方法について紹介しました。リフレクションの類なのであまり多用はしない方が良いと思いますが、ここぞという場面では役に立つのではないでしょうか。

### 参考

http://docs.scala-lang.org/ja/overviews/reflection/overview.html
http://docs.scala-lang.org/ja/overviews/reflection/environment-universes-mirrors.html
http://d.hatena.ne.jp/Kazuhira/20130121/1358780334
俺俺Stan manual翻訳5-2: Proper Uniform Priors: Interval Constraints ~ Truncated Priorsまで

本文章は[Stan Development Team. 2015. Stan Modeling Language Users Guide and Reference Manual, Version 2.7.0.](http://mc-stan.org/documentation/)の5章Regression ModelsのProper Uniform Priors: Interval ConstraintsからTruncated Priorsまでの翻訳となります。  
訳者は勉強がてら翻訳しようと思っただけで、プログラムの専門家でもデータ解析の専門家でもありません。そのため誤訳・意味の取り違えなどあると思いますが、その際はご指摘いただけると幸いです。翻訳ペースは気分しだいです。ご了承ください。

とうとう[Stan manual翻訳プロジェクトがGithubに立ち上がり](https://github.com/stan-ja)、本格化し始めたので、出来る限り協力して行きたと思います。

###Properな一様事前分布: 区間の制約
以下のように書くことで、properな一様事前分布の取りうる範囲の上限、下限を定めることができます。

```stan
  real<lower=0.1, upper=2.7> sigma;
```

上記はsigmaの事前分布として Uniform(0.1, 2.7)が与えられていることを示しています。

すべての制約と同様に、すべてのsigmaの値のサポートを提供することはモデル構築において重要です。例えば、以下のコードではsigmaは正の値を取り、かつ限られた範囲の一様分布からサンプリングされることが示されています。

```stan
  parameters {
    real<lower=0> sigma;
    ...
  model {
    // *** bad *** : support narrower than constraint
    sigma ~ uniform(0.1, 2.7)
```

このコードではsigmaのサンプリング範囲が(0.1, 2.7)からの範囲に制限されています。この値はもともと提示された(0. ∞)よりも狭い範囲です。これにより、初期化が困難になる、サンプリング中に止まってしまう、ランダムウォークへの移行が困難になってしまう可能性があります。

####境界の見積もり
区間制約パラメータの境界付近を推定する場合、一般的に事前分布がモデルに適していないような結果が帰ってきます。また、サンプリングや最適化の際にアンダーフロー、オーバーフローによる問題が発生する可能性もあります。

###無情報事前分布
回帰分析の際にNormal(0, 1000)のような事前分布を使うことは珍しいことではありません。1000のように事前分布のスケールが推定したい回帰係数の値に比べて数桁大きい場合、このような事前分布は推定値に対して何の効果も提供していない事になります。
 我々は下記のようなBUGSでの実例 [(Lunn et al., 2012)](http://www.mrc-bsu.cam.ac.uk/software/bugs/the-bugs-project-the-bugs-book/) から、デフォルトスケールの事前分布の危険性を示します。

```math
  \sigma^{2} ~ InvGamma(0.001, 0.001)
```

このような事前分布は合理的な事後分布の値の外にあまりにも多くの確率質量が集中してしまうため、対称的な一般的な事前分布と異なり、事後分布の歪みに大きな影響を及ぼす可能性があります。これらの詳細については[Gelman, 2006](http://www.stat.columbia.edu/~gelman/research/published/taumain.pdf)に詳細を示しています。

###切断事前分布
Stanにおいて変数の下限が0と宣言されている場合には、その分布はproperな切断正規分布として扱われます。Stanでは0での切り捨てを宣言する必要はなく、確率密度を指定するだけで構いません。
この際にはまず下記のように変数を宣言した後、

```stan
  real<lower=0> sigma;
```

事前分布を下記のように与えてやることでsigmaに半正規分布を与えることができます。

```stan
  sigma ~ normal(0, 1000);
```
より詳細に書くと下記のように示されますが、

```math
  p(\sigma) = \frac{normal(\sigma | 0, 1000)}{1-normalCDF(\sigma | 0, 1000)} \propto normal(\sigma | 0, 1000)
```

Stanでは半正規密度の正規化に必要な、正規累積分布 (CDF) の計算を避けることが出来ます。一方、事前分布の位置やスケールがパラメータである場合や切り捨てのポイントがパラメータである場合には、標準CDFの項が一定にならないため、切り捨てを行うことが出来ません。

###参考資料
[Stan Development Team. 2015. Stan Modeling Language Users Guide and Reference Manual, Version 2.7.0.](http://mc-stan.org/documentation/)
[Gelman A., 2006. Prior distributions for variance parameters in hierarchical models.](http://www.stat.columbia.edu/~gelman/research/published/taumain.pdf)
[Lunn et al., 2012. The BUGS
Book: A Practical Introduction to Bayesian Analysis](http://www.mrc-bsu.cam.ac.uk/software/bugs/the-bugs-project-the-bugs-book/)
Visual Studio Code has crashed

#「何もしてないのに壊れた。」

VisualStudioCode（0.10.5 (December 2015)）で急にファイル開けなくなった。
一応メニューはでてるので、Help>Release Notesを見た。(https://code.visualstudio.com/updates#vscode)

Improvements for non US standard keyboard layouts
>19 Dec 2015: On OS X the 0.10.5 release of VS Code may crash on startup when using a JIS (Japanese) keyboard layout. We have a fix ready for issue #1463 and will publish 0.10.6 as soon as possible. To workaround the issue, start VS Code with an English-US keyboard layout and then change the keyboard layout back to JIS (Japanese).


面倒なので0.10.6を待つことにする。
Laravel と Rails を比較してみた

[2015 Laravel Advent Calendar](http://www.adventar.org/calendars/817) 20日目の記事を書いてます。

普段は`Ruby`をメインで使っていますが、以前`PHP`を触っていて`Rails`に似ているフレームワークがあるということで、今回`Laravel`を調べてみました。

# マイグレーション
## マイグレーションファイル作成
```bash:Laravel
php artisan make:migration クラス名
```

```bash:Rails
rails generate migration クラス名
```

## マイグレーション実行
```bash:Laravel
php artisan migrate
```

```bash:Rails
rake db:migrate
```

## シード実行
```bash:Laravel
php artisan db:seed
```

```bash:Rails
rake db:seed
```

# Generator
## モデル作成
```bash:Laravel
php artisan make:model モデル名
```

```bash:Rails
rails generate model モデル名
```

## コントローラー作成
```bash:Laravel
php artisan make:controller コントローラ名
```

```bash:Rails
rails generate controller コントローラ名
```

## scaffold
`Laravel` には標準でなさそうですね。
ただ、https://github.com/alnutile/l5scaffold を使えばできそうです。 

```bash:Rails
rails generate scaffold モデル名
```

# routes
```bash:Laravel
php artisan routes
```

```bash:Rails
rake routes
```

# サーバー起動
```bash:Laravel
php artisan serve
```

```bash:Rails
rails s
```

# ORM
`Laravel`では`Eloquent ORM`を採用しており、Railsの`Active Record`と同等のことができます。

```php:Laravel
User::find(1);
```

```ruby:Rails
User.find(1) 
```

## 論理削除
`Laravel`は論理削除が標準であるんですね。

```php
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
    use SoftDeletes;

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}
```

なお、`Rails`は標準ではなく以下の`gem`をいれることにより実現できます

```rb
gem 'kakurenbo'
```




いかがでしたか？かなり`Rails`と似てますね。
`PHP7`も最近出たことですし、`Ruby`エンジニアも触ってみてはいかがでしょうか。
libgdxとKotlinでツンパァードラグーンを移植

あなたは [ツンパァードラグーン・冬](http://jsdo.it/moriyoshi/q6rf) をご存知だろうか。
わずか122行のjavascriptで実装されているとは思えない秀逸なゲーム性により、一部界隈で伝説となった作品である。

しかし、そんな伝説的ゲームにも穴があり、その穴を突いた必勝法が発見されてしまった。
https://twitter.com/moriyoshit/statuses/577395643863339008

そこで伝説を守るために、この必勝法が使えないようにした [ツンパァードラグーン 2015](https://bitbucket.org/garsue/zenper/downloads) を実装した。

私はjavascriptに慣れていないため、もっとも慣れているゲーム開発ライブラリである [libgdx](https://libgdx.badlogicgames.com) を使ってPCアプリおよびスマートフォンアプリとして開発することにした。

言語はKotlinを使うことにした。正直Kotlinを使う利点はさほどないが、RoboVMがKotlinサポートしたというのもあったので、なんとなく使ってみることにした。

# 変更した点
上記必勝法については、単にプレイヤーの移動可能なX座標に制限が設定されていないことが原因だったので、画面外にでないように移動可能なX座標に制限をいれた。

プレイヤー座標を左下基準から下端中央基準に変更した。これにより高く積もったところに立った際の表示がより自然になった。

ジャンプの高さを+1した。私があまりにも下手だったため。

一番右端の地面に雪が積もらなかったのを積もるようにした。

ドラゴンが画面外に出る際、画面下端に落ちないようにした。

# 既知の問題
* タップ判定がうまくできていない。
* ゲーム開始直後勝手にジャンプする。
* TextureRegionを毎フレーム生成している。
* iOS版の配布ができない。

# 移植してみた感想
ナチュラル難読化されたjavascriptはなかなか味わい深かった。
移植後のコア部分の行数が302行まで膨らんでしまったのは、コメントやログ出力を入れた分を加味してもちょっとよろしくない。
コンパクトさもツンパァードラグーンの価値だと思うので、もっと削っていきたい。ファイル数も多すぎるし。
JavaScript入門 5.条件分岐 <個人メモ>

指定されたconditionが true ならstatement1が実行されます。条件が false なら、
statement2が実行されます。

`if (condition) {
　　statement1
} else {
　　statement2
}`

`<!DOCTYPE html>
　　<html lang="ja">
　　<head>
　　　　<meta charset="utf-8">
　　</head>
　　<body>
　　　　<script>
　　　　　　var num = 50;
　　　　　　if(100 > num) {  
　　　　　　　　alert(num);
　　　　　　} 
　　　　</script>
　　</body>
</html>`
プログラミング初心者のJavaScript備忘録-オブジェクト編


オブジェクトの作り方。

```
var obj = {};
```

中身はプロパティと値

```
var obj = {
	key : value
};
```

複数プロパティを設定したいときはカンマでつなぐ。最後のプロパティにはいらない。

```
var obj = {
	key1 : value1,
	key2 : value2,
	key3 : value3
};
```
ドット演算子を使ってアクセスできる。

```
var obj = {
	key : value
};
window.alert(obj.key); //valueが表示
```

あとからプロパティの変更•追加などの操作ができる。

```
var obj = {
	x : 1,
	y : 2
};
obj.x = 2; //変更してる
obj.z = 3; //追加してる
```

プロパティには関数もいれれる。このオブジェクトのプロパティに入った関数のことをメソッドと呼ぶ。

```
var obj = {
	key : function(){...}
};
```
####補足

プロパティの役割は『変数』と一緒で、オブジェクトの中に入っている変数というイメージ。プロパティの値にはどんなものでも入るので『値』である関数も入る。→変数に入れて取り出したり、受け渡せる。↓のようにメソッドはそれを持つオブジェクトに参照されているだけ。

####メソッドはそれを持つオブジェクトに参照されているだけ

```
//func には関数のアドレス情報
var func = function(){...};
func();

//func にはメソッドのアドレス情報
var obj = {
	func : function(){...}
};
obj.func();
```

###this
javaScriptにおいてオブジェクトのプロパティにメソッドを定められ、そのメソッド内で「this」が使われている場合は、その関数が代入されたプロパティの持ち主オブジェクトのことを「this」として処理がおこなわれる。

```
var x = 1;
var obj = {
	x : 2,
	func : function(){
		alert(this.x);
	}
};
obj.func();//2が表示
```


#オブジェクトの生成
##newとコンストラクタを使って生成
同じ機能や属性（性質）を持ったオブジェクトを量産する。
###new
オブジェクトの生成•継承•初期化を指示する演算子。
###コンストラクタ
newを使って生成されるオブジェクトの初期化に使われる関数のことをコンストラクタと呼ぶ。


```
//コンストラクタの定義
function Product(){}

//newを使ったオブジェクトの生成
var obj = new Product(); 
```

####補足
コンストラクタは**頭を大文字**にする習慣がある。小文字でもエラーになる訳ではないが大文字にする。


###引数あり
引数もいれられる。

```
function Point(x, y) {
	this.x = x;
	this.y = y;
}
var myPoint = new Point(1, 10);//プロパティxの値が1、プロパティyの値が10のオブジェクトが生成される
```
新しい技術を導入するにあたってまずやっていること

##まえがき
IT業界で働いしていると、技術のトレンドが年々代わり新しい技術の習得が常に求められます。最近は本当についていくだけで必死です。
できるだけ効率的に新しい技術を学ぶために、個人的にやっていること・使っているサービスをまとめます。

## 概要を知る
最初は調べたい技術の全体像を知ることがやっぱり大事ですね。
公式のドキュメントのイントロダクションを読んでもいいのですが、よっぽど新しい技術でない限り、他の人が分かりやすくまとめた資料がネット上に落ちているのでそれを見ることが多いです。
インターネット万歳！
特に見るのは以下の2つのスライド系のサービスです。

- [SlideShare](http://www.slideshare.net/)

- [SpeakerDeck](https://speakerdeck.com/)

知りたい技術で検索すれば、◯◯入門みたいな資料が大体落ちているので、取っ掛かりとしてはそれを見るようにしています。
SlideShareの方が検索結果がソートできたりと検索しやすいけど、SpeackerDeckのが情報が多い印象。

## 類似技術との比較
DBだとMySQL, PostgreSQL...などあるように、キーとなる技術要素には大体類似の技術が存在します。最初はどれを使うか迷うことも多いと思うので、その比較用に以下のサービスを使っています。

- [stackshare](http://stackshare.io/)

調査している技術で検索すると、類似技術やツール、使用している企業などが分かります。
ここで類似技術を洗い出して、あとはGoogleでそれの技術を組み合わせて検索するような使い方をしています。

## 問題点を知る
導入しようとしている技術の問題点の洗い出しも大事です。
現状どのような問題・課題が存在するのかを調べるのには以下のサービスを使っています。

- [stackoverflow](http://stackoverflow.com/)

もう説明不要だと思いますが、エンジニア向けのQAサイトですね。
Google検索からたどり着くから多いので、直接使うことはあまりないかもしれませんが、最初に使いたい技術のメジャーな問題点を把握するためにも便利です。
検索後、タブの「frequent」「votes」あたりでソートして有名ドコロを斜め読みしています。

## 実際に触ってみる
最近の技術はデモページが用意されていたりすることも多いと思いますが、
運悪く見つからない場合dockerでコンテナを立ち上げて試しています。
イメージは大体Docker Hubにあるので、それを落として使っています。

- [Docker Hub](https://hub.docker.com/)


## まとめ
最終的にはやっぱり公式ドキュメントを読むことになると思いますが、概要や問題点を把握してから読むと、かなり入りやすくなっていると思います。
技術の進歩・移り変わりが年々早くなっているのですが、習得コストも年々減っているので脳みそがパンクすることを除けば、個人的にはトントンなんじゃないかと思っています。
無駄な労力はできるだけ減らして、スピード感を持って技術を習得していきたいですね。
Underscore.jsに満足できない人向けの拡張ライブラリ

# Underscore.jsとは

今更Underscore.jsが何かなんてものに興味がある人は少ないと思いますが、一応念の為に

- 便利なユーティリティ郡
- 豊富な配列操作関数
- メソッドチェーンの仕組みの提供
- 実行エンジンの仕様の差異を吸収した関数群

などなど、JavaScriptでコードを書く上で色々と便利な機能を提供してくれるライブラリです。
SPAフレームワークの『Backbone.js』もUnderscore.jsをバリバリに使って構築されているフレームワークです。
JavaScriptの言語仕様にして欲しいぐらい私好きです。

https://www.npmjs.com/package/underscore

## Underscore.jsのサンプルコード

例えば、1-10の2乗した結果を奇数と偶数に振り分けるプログラムはこんな感じに書くことができます。
んんクールですね。

```js

var _ = require('underscore');
var arr = _.range(1, 11);
console.log(
  _(arr).chain()
        .map(function(x){
          return x * x;
        })
        .groupBy(function(x){
          return x % 2 ? '奇数' : '偶数';
        })
        .value()
);

```

## 今回の話のネタ

さて、このUnderscore.jsですが、更にパワーアップさせることができるので今回はどれくらいパワーアップできるのかを調べてみたので、いくつか紹介したいと思います。


# Lodash

Underscore.jsとの互換性を保ったまま、新しいFunctionが追加されていたり、Underscore.jsのFunctionにパッチを当てて、柔軟な振る舞いをできるようにしたライブラリです。

https://www.npmjs.com/package/lodash


例えば、Underscore.jsの.getとLodashの.getを見てみます
Lodashの.getでは『.』で繋いでcontextをたどっていくことができます。

```js

var _ = require('underscore');
var object = { 'a': { 'b': { 'c': 3 } } };
console.log(_.has(object, 'a'));
console.log(_.has(object, 'a.b'));
console.log(_.has(object, 'a.b.c'));
// > true, false, false

var _ = require('lodash');
var object = { 'a': { 'b': { 'c': 3 } } };
console.log(_.has(object, 'a'));
console.log(_.has(object, 'a.b'));
console.log(_.has(object, 'a.b.c'));
// > true, true, true
```

カリー化した関数を作成するのも簡単にできます

```js

var _ = require('lodash');

var curried = _.curry(function(a, b, c){
  return a * b * c;
});

console.log(curried(1)(2)(3));
console.log(curried(1, 2)(3));
console.log(curried(1)(2, 3));
console.log(curried(1, 2, 3));
console.log(curried(1)(_, 2)(3));

```

# Lodash-math

Lodashに数学的な関数を追加するためのライブラリです。
以下のサンプルではそれぞれの平均値・中央値を出力するサンプルです。

https://www.npmjs.com/package/lodash-math

```js

var _ = require('lodash');
require('lodash-math')(_);

console.log(_.median([1, 2, 3, 4, 100]));
console.log(_.average([1, 2, 3, 4, 100]));
// > 3, 22
```

# Lodash-inflection

文字列変換の関数を提供するライブラリ
自前のソースコードジェネレーターみたいな物を作るときに役に立ちそうです。

https://www.npmjs.com/package/lodash-inflection

```js

var _ = require('lodash-inflection');

console.log(_.pluralize('word'));
// -> words

console.log(_.singularize('words'));
// -> word

console.log(_.ordinalize(11));
// -> '11th'
```
underscoreコードリーディング（indexBy）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##indexByとは


###[underscorejs.orgのindexBy](http://underscorejs.org/#indexBy)

こんな説明。
>####_.indexBy(list, iteratee, [context]) 
>Given a list, and an iteratee function that returns a key for each element in the list (or a property name), returns an object with an index of each item.
>Just like groupBy, but for when you know your keys are unique.



```javascript

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.indexBy(stooges, 'age');
=> {
  "40": {name: 'moe', age: 40},
  "50": {name: 'larry', age: 50},
  "60": {name: 'curly', age: 60}
}

```

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

listと、keyかproperty名が返されるiteratee関数を引数に、それぞれのアイテムがindexされた状態のオブジェクトが返される
groupByに似ているけれど、groupByとちがってそれぞれのkeyはユニークじゃなければならない


###[underscore.indexBy](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L414)

コード的にはこのあたり。


```javascript
  // Indexes the object's values by a criterion, similar to `groupBy`, but for
  // when you know that your index values will be unique.
  _.indexBy = group(function(result, value, key) {
    result[key] = value;
  });
```

groupByと同様にgroup関数を用いて結果を返す。
指定されたiterateeを元にkey-value型にindexし直されて返される
何がちがう？NYAGOS 4.0 と 4.1β


# 実はクラッシュ対策しただけ

NYAGOS 4.0 では、パイプライン等の**平行動作のために複数の goroutine から同一の Lua インスタンスを利用することがあり、それが原因と思われる panic（クラッシュ）を起こす問題がありました**。おそらくはLuaスタックに矛盾を起こした結果ではないかと思われます（推測）。

4.1β では、それを回避するために、コマンド発行の度に別の Lua インスタンスを都度新規作成して、競合を回避して安定をはかりました。

ただし、別のインスタンスでは変数領域が完全に別になり、`nyagos.alias[]` 等に代入された関数（以下**コールバック関数**）自身すら、新しいインスタンス(goroutine)から見えないという問題があります。

その対策として 4.1βではグローバルテーブル `nyagos[]` 以下と `share[]` 以下に代入された変数・関数については、Go言語側で本体を保持し、新インスタンスの同テーブル経由で参照できるようにしました。（内部的にはメタテーブルの `__newindex`、`__index` メソッドで代入・参照を横取りしています）

とはいえ、これによって、**従来稼動していた Lua スクリプトの互換性が損われる結果となりました**。NYAGOS 4.0 で動作していたスクリプトが4.1 にて同様に動くには、下記の修正が必要です。

- コールバック関数から参照される static な変数は、全て share[] 下へ移動する
    - `share[]` 直下の変数・関数は、全てのコールバック関数より参照可能
    - （注意）変更の検出は `share[]` の直下しかされない。つまり
          - OK:`share.foo = { '1','2','3' }` 
          - NG:`share.foo[1] = 'x'` （階層が一つ深いため、変更が検出されず、データ本体まで修正が届かない）
          - OK:`local t = share.foo ; t[1] = 'x' ; share.foo = t `（でも、テーブル全体のコピーが走るので、ずばり遅い）

- `nyagos.alias[]` , `nyagos.on_command_not_found` には代入できるのは  関数だけで、クロージャは代入できない
    - つまり、local 宣言された変数も参照できない
    - `nyagos.prompt` も同様だが、改善を検討中

NYAGOS 4.1 は、現在 beta として[公開中](https://github.com/zetamatta/nyagos/releases/tag/4.1-beta)です。4.0 の時代から、クラッシュは稀にしか起こらないので、理論上は解消しているはず…なんですけどねぇ。どんなもんでしょうか

# 関連記事

- [何がちがう？NYAOS 3.x と NYAGOS 4.0](http://qiita.com/zetamatta/items/98cc2ac1fa1f9370667b)
- [nyagosスクリプト解説 - CMD.EXEで化けさせず、nyagosの中だけプロンプトをカラー化](http://qiita.com/zetamatta/items/c08586c85fa73c182a7a#comment-e91ff095ff6b10c3d1b9) … スクリプトが要修正でした（コメント追記）
SwiftでSingleView(第一画面)からSpriteKit(第二画面)を利用できるようにしたい。

Swiftで、SingleView Applicationを生成して、SingleView(第一画面)からSpriteKit(第二画面)を呼び出す方法がわかりません。

SingleView(第一画面)をタイトルとしてSpriteKit(第二画面)をゲームメイン画面として処理させたいのです。

お分かりの方、ご指導をお願いします。
ActivatorでSpringBoard外のメソッドをhookするCFNotificationCenterPostNotification

Activatorの場合、通常ですとSpringBoard内で呼び出せるメソッドを実行するようになっていますが、それを別の場所でも実行できるようにする方法を紹介します。
##Sample
<a href="https://github.com/ichitaso/UIRotation9" target="_blank" rel="nofollow">https://github.com/ichitaso/UIRotation9</a>

```objc:Tweak.xm
- (void)activator:(LAActivator *)activator receiveEvent:(LAEvent *)event
```
ここがActivatorのジェスチャーを実行した時に呼び出される部分です。

```objc:Tweak.xm
[(UIDevice *)[objc_getClass("UIDevice") currentDevice] setOrientationByUIRotaion];
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.ichitaso.uirotation-changed"), NULL, NULL, true);
```
objc_getClassメソッドで呼ぶことも出来ますが、一回では回転しなかったので「CFNotificationCenterPostNotification」の通知を使って呼び出しています。

「CFNotificationCenterPostNotification」の通知は、他の部分でも有用なコードなので後日また別の利用方法を紹介します。

##別のdylibを作ってそちら側で処理をする
<a href="https://github.com/ichitaso/UIRotation9/blob/master/UIRotationHelper/UIRotationHelper.xm" target="_blank" rel="nofollow">UIRotationHelper.xm</a>

こちらの方はフィルターのplistが
```
{ Filter = { Bundles = ( "com.apple.UIKit" ); }; }
```
となっているので、UIKitで動作しているもの全てをhookできます。

```objc:UIRotationHelper.xm
@interface UIDevice (UIRotation)
+ (id)currentDevice;
- (void)setOrientation:(int)arg1 animated:(char)arg2;
- (void)setOrientationByUIRotaion;
@end
```
UIDevice.hに新しく「- (void)setOrientationByUIRotaion;」というものを作っています。

```objc:setOrientationByUIRotaion
%new
- (void)setOrientationByUIRotaion
{
    LoadSettings();
    
    [self setOrientation:setRotate animated:YES];
}
```
LoadSettings();でplistに保存されたint値の「setRotate」の方向に回転するように命令します。

それを呼び出すのが先ほどのCFNotification

```objc:UIRotationHelper.xm
// Call method from Activator
static void setUIRotaionChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    [(UIDevice *)[objc_getClass("UIDevice") currentDevice] setOrientationByUIRotaion];
}
```
##通知の受け取り
これだけでは実行しないので、%ctorの部分に通知の受け取りを記述しておきます。

```objc:UIRotationHelper.xm
// Activator Notification
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),NULL,setUIRotaionChanged,CFSTR("com.ichitaso.uirotation-changed"),NULL,CFNotificationSuspensionBehaviorCoalesce);
```
これで「com.ichitaso.uirotation-changed」という通知を受け取った時に「static void setUIRotaionChanged」のメソッドが実行されます。

つまり、Activatorのdylib側で通知を出して、UIRotationHelperでその処理を行うので、SpringBoard外でもActivatorの処理を実行できるようになったわけですね。

##実際の回転処理
```objc:UIRotationHelper.xm
%hook UIDevice
- (void)setOrientation:(int)arg1 animated:(char)arg2
{
    LoadSettings();
    
    if (setRotate == 2) {
        %orig(2,YES);
    } else if (setRotate == 3) {
        %orig(3,YES);
    } else if (setRotate == 4) {
        %orig(4,YES);
    } else {
        %orig();
    }
}
%end
```

UIDevice.hをhookして

```objc:
- (void)setOrientation:(int)arg1 animated:(char)arg2
```
ここのint値のarg1で回転させています。

次回は明日ストック2記事を書く予定なので、他の方で残りの部分を埋めていただけるとありがたいです。

それでは。
Groongaで学ぶ全文検索 2015-11-20 に参加しました


はじめてのQiitaです。
先月のことになりますが、[Groongaで学ぶ全文検索](https://groonga.doorkeeper.jp/events/35021) 2015-11-20に参加しましたのでそのことを書きます。


この回のテーマは **「日本語検索のしくみ」**でした。

そもそもGroongaの全文検索の仕組みはどうなってるのか？
---
データがDBに入っていてそれを検索したい！という時、大量の検索対象に対して検索するのは大変なので、インデックスをつくっておいて、それを利用して検索します。 **インデックスに登録されているものだけ検索可能**です。ここ重要！

インデックス
---
インデックスはキーとバリューで構成されています。


* キー　　　: 検索キーワード
* バリュー　: データを特定できる情報(IDリストとイメージすればOK)

例えばユーザーが「Groonga」で検索したら、インデックスのキーに対して「Groonga」を探しに行き、ヒットしたらバリューを返す、という仕組みです。「Groongaで学ぶ全文検索」という文字を含むデータを探すために「Groonga」で検索したけど、インデックスキーには「Groongaで学ぶ全文検索」と登録されていた場合、検索したいデータを取得することはできません。つまり、検索の精度を上げるために重要なのは、ユーザーが検索するキーワードをどれだけインデックスに登録できるかということになります。

では、Groongaではどういう風にインデックスを登録しているのかというと・・・

* **英語の場合**

 例えば「this is a pen」という文をインデックスに登録する場合、インデックスのキーは以下のようになります。（4レコードになる）

```    
 this
 is
 a
 pen
```
英語の文章は半角スペースで区切られるので単語の区切りが明確です。また、検索するときも同じことが言えます。（「pen」を検索したいときに「pe」など中途半端な文字で検索しないはず。）そのためインデックスのキーには単語を登録すればOKだし、単語を登録することが簡単！というわけで上記のようなキーになっています。

* **日本語の場合**

 日本語の場合は2種類の方法が用意されています。

　　　1.単語をキーワードにする(形態素解析)　
　　　2.なんでもキーワードにする(N-gram)

**1.単語をキーワードにする(形態素解析)**

１つ目は単語をキーワドにする形態素解析と呼ばれる方法です。例えば「花が咲いた」をインデックスに登録する場合、キーは以下のようになります。（3レコードになる。「咲いた」をこの例では1単語とする。）

    花
    が
    咲いた

単語をキーワードにするってのは英語の場合と一緒です。

これの難しいとこは日本語は単語の区切りが判断しにくい(>_<)ってところです。日本語は句読点がなくても意味が通じるし、「すもももももももものうち」という文章があった場合、「すもも」で区切るのか「す」で区切るのか・・・単語の区切りが不明瞭なのです。そこでその問題に対応できる2つ目の方法もあります。

**2.なんでもキーワードにする(N-gram)**

２つ目の方法は、単語の区切りは考えず、ある文字数で区切ってキーにしてしまうというものです。これは「N-gram」と呼ばれる方法で、2文字で区切る場合は「2gram(バイグラム)」、3文字で区切る場合は「3gram(トリグラム)」と呼ばれます。

先ほどの「花が咲いた」を2gramでインデックスに登録すると以下のようなキーになります。（4レコードになる。）

    花が
    が咲
    咲い
    いた

これだと１つ目の方法よりちょっと検索処理が複雑になります。
こんな感じ。

````N-gramを採用した時の検索方法

検索キーワードに「咲いた」が指定された場合の検索処理

1.検索キーワード分割する
　
　咲い
　いた

2.検索キーワードを全て含むものを検索する
　インデックスのキーで「咲い」にヒットするものと「いた」にヒットするものを探す。
　例えば
　
　キー：バリュー（[データを示すID,...]）　
　咲い：[1,2,3]
　いた：[1,4]
　
　これだと1がヒットする。

3.2でヒットしたものを対象に、キーワードが隣り合ってるかを検索(フレーズ検索)する
「咲い」と「いた」が含まれていても「咲いていた」のように隣り合っていなければ
それは検索結果として相応しくないので、「咲い」と「いた」が隣り合っているかを検索します。
これをフレーズ検索と言います。このフレーズ検索も2つの方法が準備されています。

▼フレーズ検索（2種類ある）

　A.インデックスのバリューに、キーの文字がデータ中の何番目の文字かをいれといて、検索時にとなりあっているかをみる方法。
　例えばこんなイメージ。

　キー：バリュー（[データを示すID[キーの文字がデータ中の何文字目か],...]）　
　咲い：[1[1],2[1],3[6]]
　いた：[1[2],4[4]]
　
　この場合、文書1の「咲い」と「いた」は隣り合っているので「咲いた」の検索結果として適切なものと判断される。
　　
　B.インデックスをみに行く時点では怪しいものをピックアップしておくまで（上記の2まで）。
　その後怪しいものを対象に分割前の検索キーワードで検索する。
　
　キー：バリュー（[データを示すID,...]）　
　咲い：[1,2,3]
　いた：[1,4]
　
　この例でいうと、1のデータに対して「咲いた」で検索をかけるということになります。

````

このN-gramの嬉しいことは形態素解析に比べて **検索漏れがない**ということ。
難しいことは形態素解析より検索処理がちょっと大変ということです。

まとめ
----
* 先輩に ~~はめられて~~ 誘われて急に参加した勉強会でした。私、Groonga初心者でかなり緊張していたのですが、初心者にもわかるようにすっごく丁寧に説明してくださいました！質問もしやすくて優しさに感激しました！
* 日頃仕組みもよくわからず利用しているものって多いのですが、仕組みを知るって面白いなーって感じました。もっと知りたい！という気持ちになりました。
* こういった勉強会参加するの初めてだったのですが、行ってみるもんだなと思いました。先輩にも須藤さんにも参加者の皆さんにも感謝です。
 とにかく皆さんにありがとうございました！という気持ちです。今後も参加させていただきたいなと思っています。
vagrantに追加した一般ユーザでのログイン

#概要#
vagrantに追加した一般ユーザでのログイン方法の手順

前回の投稿で、vagrantで構築したローカル開発環境に

```lang:コマンド
# useradd masaki
```

で追加した"masaki"というアカウントでログインする方法を説明する。

#手順#

Vagrantfileに以下のコマンドを追加する。

```lang:Vagrantfile
config.ssh.username = "masaki(ユーザ名)"
```

これで、追加した一般ユーザでのログインが可能となる。
私は、root権限を持つことができるユーザを制限しているため、上記アカウントでログインしなければ、root権限を持つことができない。

```lang:コマンド
$ vagrant ssh
```

でログイン後、どのユーザでログインするか確認するようにできる
方法がございましたらコメントをよろしくお願いします。
(メモ) xargs はプレースホルダーで複数箇所に引数を挿入できる。

```shell-session
curl file1 file2 \
    | xargs -n 1 -I{} \
        curl -o download-dir/{} \
        http://some-host/{}
```

特に、`-P`オプションで並列化するときに有効活用できそう。
Trailing commas in function parameter lists and calls

# Trailing commas in function parameter lists and calls

いわゆるケツカンマ付きで関数呼び出しと関数の引数定義ができるというもの。

[Trailing commas in function parameter lists and calls](https://jeffmo.github.io/es-trailing-function-commas/)

**ちなみに執筆当時はstage3**

これからは

```js
function foo(
  param1, 
  param2, 
  param3, // ケツカンマOK
) {
  // ...
}

foo(bar, baz, qux,); // ここでもケツカンマOK
```


（正直これより JSON ケツカンマ許してほしい）
facebookのshareボタンを独自のデザインで実装する方法。web

htmlで下記コードを書くだけです。

```html
<a href="https://www.facebook.com/sharer/sharer.php?u=my-website.com" target="_blank">
 shareしてね
</a>
```

``my-website.com``の部分はシェアしたいwebページのURLに書き換えます。  
``shareしてね``の部分で自由にhtmlやcssを使い、簡単にデザインができますね。

facebook for developers で Appを作りidを使用して、やる方法もありますが、この方法が一番シンプルで簡単かと思います。

## 参考サイト
[How to add facebook share button on my website?](http://stackoverflow.com/questions/16463030/how-to-add-facebook-share-button-on-my-website)
Scala コードの列挙型と DB（Slick）の整数型 / 文字列型をマッピングする


デフォルトでマッピングできるのはプリミティブ型のみです。Enum を含め、それ以外の独自定義型をマッピングする場合は MappedColumnType を使い、マッピングの関数定義が必要です。詳細は公式ドキュメントの「[USER-DEFINED FEATURES](http://slick.typesafe.com/doc/3.1.0/userdefined.html)」を参照してください。

注）手元の環境は以下です。
* Scala 2.11.6
* Slick 3.1.0
	
## 列挙型 の定義

マッピング対象の列挙型として以下があるとします。

```
// 文字列型	にマッピングするEnum
object Color extends Enumeration {
  type Color = Value
  val Blue = Value("Blue")
  val Red = Value("Red")
  val Green = Value("Green")
}

// 整数型にマッピングするEnum
object Bar extends Enumeration {
  type Bar = Value
  val b1 = Value
  val b2 = Value
  val b3 = Value
}
```

## Slick でのテーブル定義

column定義の箇所で、普通に独自定義の Enumeration が使えます。MappedColumnType を使い、implicit なマッピング関数を定義している点に注意してください。こういうマッピングを独自定義型に対して書く必要があります。

```
class SampleTable(tag: Tag) extends Table[Sample](tag, "Sample") {
  def name  = column[String]("NAME")
  def id    = column[Int]("ID")
  def color = column[Color]("COLOR")
  def bar   = column[Bar]("BAR")
  def * = (name, id, color, bar) <> (Sample.tupled, Sample.unapply)
}
implicit val colorMapper = MappedColumnType.base[Color, String](
  e => e.toString,
  s => Color.withName(s)
)
implicit val barMapper = MappedColumnType.base[Bar, Int](
  e => e.id,
  i => Bar.apply(i)
)
```
Ajaxを利用して複数画像をドラッグ＆ドロップで一括アップロード

Ajaxを利用して複数画像をドラッグ＆ドロップで一括アップロードするための簡単なメモ。
基本的に画像をPOSTするだけなので、サーバサイドは特別なことをしなくても大丈夫です。

File APIについてはここがわかりやすかったので、是非見てみてください。
http://www.atmarkit.co.jp/ait/articles/1112/16/news135.html

また、このライブラリが便利そうなので、時間がある方はこちらを使った方がいいと思います。
https://github.com/blueimp/jQuery-File-Upload

<h2>サンプル</h2>

<h5>HTML</h5>

```html
<html>
<head>
<title>画像をドラッグ＆ドロップで一括アップロード</title>
</head>
<body>

<div id="image_upload_section">
    <div id="drop" style="width:700px; height:150px; padding:10px; border:3px solid" ondragover="onDragOver(event)" ondrop="onDrop(event)">
        ファイルをドラッグアンドドロップしてください。複数ファイル同時も対応しています。
    </div>
</div>

</body>
</html>

```

<h5>JS</h5>

```js

<script type="text/javascript">
// File APIに対応していない場合はエリアを隠す
if (!window.File) {
    document.getElementById('image_upload_section').style.display = "none";
}

// ブラウザ上でファイルを展開する挙動を抑止
function onDragOver(event) {
    event.preventDefault();
}

// Drop領域にドロップした際のファイルのプロパティ情報読み取り処理
function onDrop(event) {
    // ブラウザ上でファイルを展開する挙動を抑止
    event.preventDefault();

    // ドロップされたファイルのfilesプロパティを参照
    var files = event.dataTransfer.files;
    for (var i=0; i<files.length; i++) {
        // 一件ずつアップロード
        imageFileUpload(files[i]);
    }
}

// ファイルアップロード
function imageFileUpload(f) {
    var formData = new FormData();
    formData.append('image', f);
    $.ajax({
        type: 'POST',
        contentType: false,
        processData: false,
        url: 'http://example.com/image/upload',
        data: formData,
        dataType: 'json',
        success: function(data) {
            // メッセージ出したり、DOM構築したり。
        }
    });
}
</script>

```
Realm でプライマリーキーの型による違いを計測してみた

`v0.85.0` から primary key に `Int` がサポートされました。
おそらく[このコミット](https://github.com/realm/realm-cocoa/commit/37ba88ba4acaf5ae0850659cec8dbe4a91d9e587)かなと思います。

`Int` がサポートされて１年もたつんですね。はやいものです。
プライマリーキーの型による違いがあるのかと若干気になりながらも、特に調べる機会がありませんでした。

あまりそういう記事も見たりしないので、そんなに違いはないだろうなと...
とはいえ、どの程度違いがあるのか気になります。
そんなに目立った違いはないだろうとは思うんですけどね。
普通に考えれば空間効率で差がでそうですが、クライアントなんでそこまで気にはならないかなと思います。

ということで、今回はこの疑問を解決してみようと思った次第です。

Realm は core が公開されていないため、詳細は追えないのでベンチマークを計測して比較することにしました。

## ベンチマーク

Realm v0.97.0 で試しました。

[realm.io](https://realm.io/news/introducing-realm/#fast) で使われているベンチマークを参考にして同じようなパターンで比較してみました。


以下、条件を各項目で計測してみました

* プライマリーキーが `int(連番)`, `int(バラ)`, `string`の３種類
* 計測端末を `iPhone 5s`, `iPhone 6 Plus`, `iPhone 6s`の３種類

### insert
15 万レコードの追加にかかった時間

|   | iPhone 5s | iPhone 6 Plus | iPhone 6s |
|:--|:----------|:--------------|:----------|
| int(連番) | 1.1900 sec | 1.0466 sec | 0.5506 sec |
| int | 0.9379 sec | 0.9126 sec | 0.4132 sec |
| string | 0.9976 sec | 0.8932 sec | 0.4259 sec |

### update
15 万レコードの更新にかかった時間

|   | iPhone 5s | iPhone 6 Plus | iPhone 6s |
|:--|:----------|:--------------|:----------|
| int(連番) | 0.4289 sec | 0.3419 sec | 0.1478 sec |
| int | 0.3587 sec | 0.3058 sec | 0.1489 sec |
| string | 0.4454 sec | 0.3534 sec | 0.1884 sec |

### insert update
15 万レコードの追加/更新にかかった時間

|   | iPhone 5s | iPhone 6 Plus | iPhone 6s |
|:--|:----------|:--------------|:----------|
| int(連番) | 0.5644 sec | 0.4552 sec | 0.4041 sec |
| int | 0.6205 sec | 0.4644 sec | 0.3957 sec |
| string | 0.7167 sec | 0.5187 sec | 0.3875 sec |

### filter
15 万レコードからの取得にかかった時間

|   | iPhone 5s | iPhone 6 Plus | iPhone 6s |
|:--|:----------|:--------------|:----------|
| primary key - int(連番) | 0.8374 sec | 0.6300 sec | 0.3588 sec |
| primary key - int | 0.8162 sec | 0.5921 sec | 0.3247 sec |
| primary key - string | 0.8479 sec | 0.6410 sec | 0.3876 sec |
| int(連番) | 	1.7811 sec | 1.2309 sec | 0.7563 sec |
| int | 1.7453 sec | 1.2189 sec | 0.7307 sec |
| string | 1.7452 sec | 1.2152 sec | 0.7237 sec |

### enumerate
15 万レコードからの取得後に `valueForKey ` の実行にかかった時間

|   | iPhone 5s | iPhone 6 Plus | iPhone 6s |
|:--|:----------|:--------------|:----------|
| primary key - int(連番) | 2.1763 sec | 1.6664 sec | 1.0993 sec |
| primary key - int | 2.5606 sec | 1.9454 sec | 1.3117 sec |
| primary key - string | 15.0283 sec | 13.3181 sec | 9.9435 sec |
| int(連番) | 9.0388 sec | 7.5988 sec | 6.3678 sec |
| int | 9.0091 sec | 7.5670 sec | 5.9569 sec |
| string | 9.0197 sec | 7.5639 sec | 5.9495 sec |

`enumerate primery key - string` が圧倒的に遅いですね。
primary key で引かなければ問題がないので何かあるかもしれません。
なぜこうなるかは分かりませんが、 propery でアクセスするスコアは他と同じになるので、 `valueForKey` を使った際にボトルネックになる処理があるのではないかなと推測されます。

## まとめ
基本的には型に `String`, `Int` どちらを使おうが大抵のケースで誤差レベルです。
プライマリーキーが `String` で `valueForKey` を使わない限り、パフォーマンスに気になるほどの違いはなさそうでした。
とはいえ普段は propery でアクセスするケースが大半なので、パフォーマンスが出ないなって悩んだ時のために、頭の片隅にでも入れておけばいいんじゃないでしょうか。

実行速度以外にも CPU, Memory の利用率も出したかったですが時間が足りずに、ここまでとなります。
気になる方はベンチマークのプロジェクトを [GitHub](https://github.com/dealforest/sandbox/tree/master/RealmBenchmark) にあげておくので、個々で計測してもらえれば幸いです。

これで安心してプライマリーキーの型を決めれますね。

現場からは以上です。
数値と文字列のsortの速度比較のお話(未完))

Qiita APIでユーザに結びつくCoraboration数を持ってこれなかったので、[自前でユーティリティ](https://github.com/MeguMegu1978/GetQiitaContribution)を作り、さぁ、ランキングの出力を実装しようとした時のお話です。

取得結果をユーザ名とCoraboration数の辞書で返却しており、Coraboration数も文字として扱ってしまっていたため、組み込み関数のsortedで期待する動きをしてもらえません。

```py3:sort.py
import GetQiitaContribution

d = GetQiitaContribution.getContributionByFile("account.txt")

for v in sorted(d.values()):
    print  (v)
```

```
python3 ./sort.py
0
142
23
235
309
4
42
```

ここで、Python勉強中なので、いろいろ試してみました。

### まずは、ユーティリティを修正する

辞書のvalueとして、素直にContribution数を数値として格納するように修正し期待通りのソートが実行されるようにしてみました。

```py3:
#            dict[username] = getContributionByName(username)
            dict[username] = int(getContributionByName(username))
```

```
time python3 ./sort.py
0
4
23
42
142
235
309

real	0m4.177s
user	0m0.101s
sys	0m0.026s

real	0m3.636s
user	0m0.111s
sys	0m0.028s

real	0m3.377s
user	0m0.108s
sys	0m0.029s
```

ここで、もとの文字列格納バージョンと実行にかかる時間を比較してみました。

```
time python3 ./sort.py
0
142
23
235
309
4
42

real	0m4.298s
user	0m0.115s
sys	0m0.045s

real	0m3.535s
user	0m0.100s
sys	0m0.025s

real	0m3.606s
user	0m0.100s
sys	0m0.025s
```

### Pythonにおける数値のソートと文字列のソートの速度差が気になる

文字のソートと数値のソートでどれくらい速度差がでるのか気になって比較してみたのですが、ソートだけを切り出した速度比較ではない(プロファイリングしていないのでなんともいえませんが、処理にかかる時間の大半はユーティリティで実施しているスクレイピングに費やされていると思われる)のと、ソートしているデータ数が大したボリュームではないというのもあり、参考になりません。

そこで本格的に比較してみることにしました。１から1048576(Excel for Macの最大行数)までの数値のリストと文字列のリストを作成し、それぞれをソートしてみました。

数値

```
real	0m12.400s
user	0m9.455s
sys	0m2.412s

real	0m12.522s
user	0m9.444s
sys	0m2.493s

real	0m12.500s
user	0m9.718s
sys	0m2.288s
```

文字列

```
real	0m14.583s
user	0m9.772s
sys	0m3.828s

real	0m12.000s
user	0m9.259s
sys	0m2.200s

real	0m12.183s
user	0m9.430s
sys	0m2.249s
```

どうやら、要素数が100万個程度では数値と文字列のソートにそれほど速度差はないようです。

### 結論
7桁オーダー程度では、文字列だろうと数値だろうと速度が出ないらしいです。LLが普及して随分立ちますが、ハードの進化なのかLLの進化なのか、ロートルなプログラマになりつつある自分は少しびっくりしながら、締りのないい記事はここでおわりにしたいと思います。

長々と駄文ここまで読んでくださった方、ありがとうございます。
UnityのLogを簡易的に実行画面に表示する

# 背景
UnityのログはEditor上ではすぐ確認できるがビルド後は別のツールを立ち上げたりやや面倒
また何気ないテストプレイ中にエラーが発生した場合でも問題箇所をすぐに特定したい

# 目的
Debug.LogError等の情報を実行画面に表示しアプリ単体で確認できるようにする

# テストコード
```
using UnityEngine;
using System.Collections.Generic;

public class Test : MonoBehaviour {
	private const int LOG_MAX = 10;
	private Queue<string> logStack = new Queue<string>(LOG_MAX);

	void Awake() {
		Application.logMessageReceived += LogCallback;	// ログが書き出された時のコールバック設定

		Debug.LogWarning("hogehoge");	// テストでワーニングログをコール
	}

	/// <summary>
	/// ログを取得するコールバック
	/// </summary>
	/// <param name="condition">メッセージ</param>
	/// <param name="stackTrace">コールスタック</param>
	/// <param name="type">ログの種類</param>
	public void LogCallback(string condition, string stackTrace, LogType type) {
		// 通常ログまで表示すると邪魔なので無視
		if (type == LogType.Log)
			return;

		string trace = null;
		string color = null;

		switch (type) {
			case LogType.Warning:
				// UnityEngine.Debug.XXXの冗長な情報をとる
				trace = stackTrace.Remove(0, (stackTrace.IndexOf("\n") + 1));
				color = "yellow";
				break;
			case LogType.Error:
			case LogType.Assert:
				// UnityEngine.Debug.XXXの冗長な情報をとる
				trace = stackTrace.Remove(0, (stackTrace.IndexOf("\n") + 1));
				color = "red";
				break;
			case LogType.Exception:
				trace = stackTrace;
				color = "red";
				break;
		}

		// ログの行制限
		if (this.logStack.Count == LOG_MAX)
			this.logStack.Dequeue();

		string message = string.Format("<color={0}>{1}</color> <color=white>on {2}</color>", color, condition, trace);
		this.logStack.Enqueue(message);
	}

	/// <summary>
	/// エラーログ表示
	/// </summary>
	void OnGUI() {
		if (this.logStack == null || this.logStack.Count == 0)
			return;

		// 表示領域は任意
		float space = 16f;
		float height = 150f;
		Rect drawArea = new Rect(space, (float)Screen.height - height - space, (float)Screen.width * 0.5f, height);
		GUI.Box(drawArea, "");

		GUILayout.BeginArea(drawArea);
		{
			GUIStyle style = new GUIStyle();
			style.wordWrap = true;
			foreach (string log in logStack)
				GUILayout.Label(log, style);
		}
		GUILayout.EndArea();
	}
}

```

# 結果
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/e64c6495-95c8-e610-26ff-81a296010c5e.png)

#まとめ
単純な処理だがアプリケーションを実行中に問題が発生した際に割とすぐ気づける
ただしあくまで開発用なのでDebugSymbol等でリリースビルドには含めないようにする
Swiftで競プロ入門

[paiza プログラミングで彼女を作る](https://paiza.jp/poh/ando?read=true)がSwiftでかけると聞いたので、競プロ入門してみようかなと思い少しやってみました。(普段はアプリ開発ばかりなので、競技プログラミングは全然できません)
初心者なりに、Swiftだとこんな感じで書くのがSwiftっぽいかなっていうものや使えそうだなと思ったものを紹介したいと思います。

# 環境
Macがある人はplaygroundでコードを書くのがいいと思います。ただし、標準入力はplayground上で書くと他の計算が止まってしまうので、それだけは提出するものだけに書きましょう。
また、Web上でもplaygroundのようなことができる[サイト](http://swiftstub.com/)もあるので、Macじゃない人やXcode入れたくない人はこれもアリかも

# Swift入門
この記事では詳しくは書きません。Swiftの言語の入門はいろいろなサイトや[ドットインストール](http://dotinstall.com/lessons/basic_swift)もありますし、qiitaにも記事があります。本やサイトを見てやる場合はSwiftのバージョンに気をつけましょう。また、Swiftはまだ大規模な変更を含むアップデートが行われたりするので、動かない部分は各自で調べる必要があります。

# コード

## 標準入力
readLine()を使うことで1行ずつString?で取得することができます。[この記事](http://qiita.com/y_mazun/items/dc2a0cad8da1c0e88a40)でもっと便利に使うやり方が紹介されていますね。

``` swift
let input_line: String? = readLine()  // 標準入力
let string_value: String = input_value!
let int_value: Int = Int(input_line)!
```

## 標準出力

``` swift
print("hoge")                           // "hoge\n"
print("hoge", "piyo")                   // "hoge piyo\n"
print("hoge", "piyo", separator: ",")   // "hoge,piyo\n"

print("hoge", terminator: "")           // "hoge"   <- 改行なし
print("piyo")                           // "piyo\n"
```

### 結果

```
hoge
hoge piyo
hoge,piyo
hogepiyo
```


# 関数
普通に書けばいいです。

``` swift
func pow(base: Int, count: Int) -> Int {
    if count < 1 {
        return 1
    }
    return  base * pow(base, count: count-1)
}
```

# ループ
いろいろあるので好きなものを使いましょう。

``` swift
for i in 0..<4 {
    print(i) // 0123 の4ループ
}

for _ in 0...5 {
    // iは_で省略可 6ループ
}

let arr: [Int] = [4, 5, 6]
for i: Int in arr {
    print(i) // 456
}

for (index, value) in arr.enumerate() {
    print(index, ":", value) //0 : 4\n1 : 5\n2 : 6\n
}
```

## extension
Swiftはクラスの拡張が簡単にできます。また、StringやIntといったものまで拡張することができます。

``` swift
extension String {
    ...   
}
```

これを利用することで便利なオレオレ関数やプロパティを生やすことができます。

``` swift
extension String {
    
    /// 任意のindexの1文字のStringを返す
    func at(i: Int) -> String {
        return String(self[self.startIndex.advancedBy(i)])
    }
    
    /// 任意のindexから任意の長さを切り取ったStringを返す
    func between(i: Int, length: Int) -> String {
        return self.substringWithRange(self.startIndex.advancedBy(i)..<self.startIndex.advancedBy(i + length))
    }
    
    /// 文字列の長さ(プロパティ)
    var length: Int {
        return self.characters.count
    }
    
    /// 文字列をIntの配列にする "01a234b" -> [0, 1, 2, 3, 4]
    func splitToArrayOfInt() -> [Int] {
        return self.characters.flatMap({Int(String($0))})
    }
}
```

# データ構造
stackやqueueなどの基礎的なものをジェネリクスを使って実装するやり方が[公式](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html#//apple_ref/doc/uid/TP40014097-CH26-ID179)に載っています。

# まとめ
競プロに関しては、まだまだわからないことだらけですね。
swiftはextensionとmap,flatmap等をうまく使うことができればかなり書きやすいと思います。
自動でnpmライブラリをアプデ&プルリクしてくれるサービスのgreenkeeperがすごく便利だった


## はじめに

どうもみなさん`npm xmas`！（気が早い）

みなさんnpmライブラリのバージョンのアップデートどうしてますか？
方法としては[npm-check-updates](https://github.com/tjunnone/npm-check-updates)などが有名なのではないかと思うのですが、逐一手動でアップデートするのは面倒ですよね？

そこで、自動でアップデートしてプルリク投げてくれるという[greenkeeper](http://greenkeeper.io)というのを使ってみたら非常に便利だったので紹介したいと思います！

## 公式サイト・リポジトリ

公式サイト: http://greenkeeper.io
Github: https://github.com/greenkeeperio/greenkeeper

## お値段

publicリポジトリなら無制限、privateリポジトリなら1リポジトリまで無料で、それ以上は料金がかかります。

![Kobito.XqwwxR.png](https://qiita-image-store.s3.amazonaws.com/0/15402/a6161984-c28c-9a64-9e3c-649d58375601.png "Kobito.XqwwxR.png")

また、このの3つ以外にも$5/月のsupporterプランがあります

## 使い方

使い方は非常に簡単で以下のコマンド3つで済んでしまいます

```bash:
$ npm install -g greenkeeper
$ greenkeeper login
$ greenkeeper enable
```

### インストール

まずはグローバルにインストール

```bash:
$ npm install -g greenkeeper
```

### greenkeeperにログイン

コンソールで次のコマンドを打ちます

```
$ greenkeeper login
```

すると以下のような画面が開きます（Organization accessの所、一応伏せさせていただきました）

![1.png](https://qiita-image-store.s3.amazonaws.com/0/15402/d187e996-7666-b3c5-443c-62c72d3dff87.png "1.png")

ここで「Authorize application」を押すと「Signin successful, now check your terminal :)」と書かれた画面が表示され、言われるままにコンソールを見ると以下のように表示されています。

```
$ greenkeeper login

                oooo
                `888
     .ooooooooo  888  ooooo
    8888' `8888  888 .88P'
    8888   8888  8888888.       g r e e n k e e p e r . i o
    `888bod88P'  888 `888b.
     `Yooooooo. o888o o8888o
          `Y88b
    d88P   d888
    `Y8888888P'

🌴  info login That was successful, now syncing all your GitHub repos
🌴  info login Done syncing 9 repositories
You are now logged in, synced and all set up!
🌴  info login Find out how to get started with $ greenkeeper start
```

これでgreenkeeperにログインできました！

### リポジトリをgreenkeeperに登録

次に、自分のnodeリポジトリをgreenkeeperに登録します。

```
$ cd <リポジトリのpath>
$ greenkeeper enable
🌴  info enable The GitHub slug is: <リポジトリ名> enabled
```

これで設定は完了です！
npmライブラリに更新がある場合はgreenkeeperから以下のようなプルリクが来るので確認してみましょう！

![4.png](https://qiita-image-store.s3.amazonaws.com/0/15402/98539ed6-d0ef-ad18-9cfb-b00b0ed3897e.png "4.png")


### おまけ

メインの使い方からは外れますが、以下のようなコマンドも用意されています。

```
# ユーザーサポートとのチャット画面を開く
$ greenkeeper support

# 有料プランに更新する
$ greenkeeper upgrade
```

## まとめ

greenkeeperを使えば非常に簡単にnpmライブラリをほぼ自動で最新に保つ環境ができました。
もし、普段手動でアップデート作業をしているならば一回試してみてはいかがでしょうか？