OmniAICreator/Qiita-1.07M huggingface dataset:
[書籍] JavaScript フレームワーク入門 86ページ誤植

JavaScript フレームワーク入門の86ページでタイプエラーになったので、以下のように修正してみました。
querySelectorが、HTMLInputElement型を返さないところと、valueの戻り値がstring型でエラーとなっていました。

```ts
function calc(price:number, tax:number):number {
    return Math.floor(price * (1.0 + tax));
}

function doClick():void {
    let text1:HTMLInputElement = <HTMLInputElement>document.querySelector('#text1');
    let msg:Element = document.querySelector('#msg');
    msg.innerHTML = calc(Number(text1.value), 0.08) + '円';
}
```
はじめての Qiita

私立文系大学生がいろいろ書きます。

####目的：
ブログを作ることで自らを衆人環視の場に追いやり、
仕事や勉強を絶対に進めなくてはならない状況をつくるため。
(ぶっちゃけ、誰も見てないところだと普通に**手抜き**するし、**やるべきことに手をつけない。**)

####現状スペック
 - 年齢:20歳,大学3年 //(実は明日で21)
 - 院進することを考え中
 - ゼミは統計学・ファイナンス
 - だらけがち、真面目系クズ、やけにプライドが高い、~~某語録多用しがち~~
 - 興味範囲は広い、、、はず。
    - 車が好きです。カラオケも好きです。基本なんでもやりたがります。

####やりたいこと、なりたい"なにか"
 - 時代の流れに依存しない仕事がよさげ
 - できるならお家で仕事したい、家を出たくない.
    - ならば、webエンジニア系じゃね？(プログラミングもできるようになるし、ええやん)
 - お金と時間が許すなら勉強を続けたい(~~そのためにやる気出せ~~)
 - 本とか読んだりしたら、逐一書いてみたい。
 - ブログをなんかはじめてみたい
    - 「こういう系のブログってQiitaじゃね?」
    - じゃけん、いますぐはじめましょうね～


定期的にとは言わないけど、気が向いたらポチポチして、長く続けることを当面の目標にします。
~~叱咤してください！なんでもしますから！~~
【PHP】Carbonで月が何週あるか取得する

[Carbon - A simple PHP API extension for DateTime.](http://carbon.nesbot.com/)

Carbonで`weekOfMonth`プロパティを使うとその日が何週目であるかを取得できるが
このプロパティは**その日を1週の日数で割って切り上げたもの**が返ってくるのでカレンダー上で何周目であるかには使えない

```php
Carbon::setWeekStartsAt(Carbon::SUNDAY); // 週の最初を日曜に設定
Carbon::setWeekEndsAt(Carbon::SATURDAY); // 週の最後を土曜に設定
$dt = Carbon::create(2016, 10); // 2016年10月を作成
// 10月1日が何周目か(1週目)
$dt->startOfMonth()->weekOfMonth; // 1
// 10月31日が何周目か(6週目)
$dt->endOfMonth()->weekOfMonth; // 5 (!?)
```

月末が何周目かを取得すればいいと思っていたけどそういう使い方ができないのであれば計算するしかないのでやってみよう

```php
private function getWeekOfMonth($year, $month){
  Carbon::setWeekStartsAt(Carbon::SUNDAY);
  Carbon::setWeekEndsAt(Carbon::SATURDAY);

  $dt = Carbon::create($year, $month);
  $days = $dt->daysInMonth; // 月に何日あるか取得
  $daysParWeek = $dt::DAYS_PER_WEEK; // 1週の日数を取得(デフォルトは 7 が設定されている)
  $dayOfWeek = $dt->startOfMonth()->dayOfWeek; // 1日の曜日(int)を取得

  return (int) ceil(($days - ($daysParWeek - $dayOfWeek)) / $daysParWeek) + 1;
}
```

できた
月の日数(days)を1週の日数(daysParWeek)から1日の曜日(dayOfWeek)を引いたもので引いて、1週の日数(daysParWeek)で割ったものを切り上げてintにcastして+1する

もっとスマートな方法ありそうだけど・・・
C90の型分類と、演算子のオペランドの型

##型分類
規格（C90）で定義された型分類が煩雑なので、表にまとめて見通しを良くしてみました。

![C90型分類.png](https://qiita-image-store.s3.amazonaws.com/0/51871/a8e82219-9acd-3c81-dfe0-646dccc6e49e.png)

**型分類**とは、派生型を表現する際に最外側に示す型（型が派生型を含まない場合、その型自身）となります。例えば「`int`へのポインタ」の型分類は、ポインタ型となります。「`int`の配列」の型分類は、配列型となります。「`int`へのポインタの配列」の型分類は、配列型となります。

`const`・`volatile`のいずれか、およびその両方によって修飾された型`T`は、`T`の**修飾版**と呼びます。修飾されていない型`T`は、`T`の**非修飾版**と呼びます。

上の表を見て、こんなもんやってられるかー！と思った方は、人間として正常だと思います。しかし、ポイントとして以下を抑えておけば、当面は事足りるのではないかと思います。

- 算術型は、汎整数型+浮動小数点型。
- スカラ型は、算術型+ポインタ型。
- 集成体型は、配列型+構造体型。
- オブジェクト型は、関数型・不完全型を除くすべて。

##演算子のオペランドと結果の型

演算子のオペランドの型、および結果の型についてまとめてみました。

こちらも中々に煩雑ですが、C言語を一から設計しなおすなら、ここをこう定義すればスッキリするのにな~と、ハイボールでも飲みながらあーだこーだ独り言を言いながら眺めるのも一興かもしれません。

|演算子|オペランドの型|結果の型|
|:--------|:--------|:--------|
|`[]`|一方が型”T型オブジェクトへのポインタ”、片方が汎整数型|T型|
|`.`|（左）構造体型又は共用体型<BR>（右）左オペランドのメンバ|メンバの型（修飾版含む）|
|`->`|（左）構造体型又は共用体型へのポインタ<BR>（右）左オペランドのメンバ|メンバの型（修飾版含む）|
|後置`++`|スカラ型（変更可能な左辺値）|通常の算術型変換適用後のオペランドの型|
|後置`--`|同上|同上|
|前置`++`|同上|同上|
|前置`--`|同上|同上|
|アドレス演算子`&`|関数指示子、ビットフィールド、`register`記憶域指定子つきで宣言されたオブジェクト以外の左辺値|オペランドの型へのポインタ型|
|単項`*`|T型へのポインタ型|T型|
|単項`+`|算術型|汎整数拡張適用後のオペランドの型|
|単項`-`|算術型|同上|
|`~`|汎整数型|汎整数拡張適用後のオペランドの型|
|`!`|スカラ型|`int`型（`0`または`1`）|
|`sizeof`|・(型名)<BR>・関数型、不完全型、ビットフィールドを指す左辺値以外|`size_t`型|
|キャスト`(T)`|・`T`には`void`またはスカラ型を持つ型名を指定する。<BR>・`T`が`void`の場合、オペランドは任意の型。<BR>・`T`がスカラ型の場合、オペランドはスカラ型。|`T`型|
|二項`*`|算術型|通常の算術型変換適用後の型|
|`/`|算術型|同上|
|`%`|汎整数型|同上|
|二項`+`|・両オペランドが算術型<BR>・一方がオブジェクト型へのポインタでもう一方が汎整数型|・両オペランドが算術型の場合、通常の算術型変換適用後の型<BR>・一方がポインタオペランドの場合、ポインタオペランドの型|
|二項`-`|・両オペランドが算術型<BR>・両オペランドがオブジェクト型へのポインタ型<BR>・左がオブジェクト型へのポインタで右が汎整数型|・両方がポインタ型の場合、通常の算術型変換適用後の型<BR>・片方が算術型の場合、そのオペランドの型<BR>・両オペランドがポインタ型の場合、`ptrdiff_t`型|
|`<<`|汎整数型|左オペランドの汎整数拡張適用後の型|
|`>>`|同上|同上|
|`<`|・算術型<BR>・オブジェクト型へのポインタ型<BR>・不完全型へのポインタ型|`int`型（`0`または`1`）|
|`>`|同上|同上|
|`<=`|同上|同上|
|`>=`|同上|同上|
|`==`|・算術型<BR>・ポインタ型<BR>・一方がオブジェクト型へのポインタで、他方が`void`型へのポインタ<BR>・一方がポインタ型で、他方が`NULL`|同上|同上|
|`!=`|同上|同上|
|ビット単位`&`|汎整数型|オペランドの通常の算術型変換適用後の型|
|`^`|同上|同上|
|`｜`|同上|同上|
|`&&`|スカラ型|`int`型（`0`または`1`）|
|`｜`｜|同上|同上|
|`?:`|・第1オペランドはスカラ型<BR>・第2、第3オペランドは両方が算術型、両方が構造体型または共用体型、両方が`void`型、両方がポインタ型、一方がポインタで他方が`NULL`、一方がオブジェクト型または不完全型へのポインタで、他方が`void`型|複雑なので別記事で書かせてくださいm(_ _)m|
|代入`=`|複雑なので別記事で書かせてくださいm(_ _)m|左オペランドの型の非修飾版|
|`+=`|・左がオブジェクト型へのポインタ、右が汎整数型<BR>・両方が算術型|同上|
|`-=`|同上|同上|
|`*=`|二項`*`に倣う|同上|
|`/=`|`/`に倣う|同上|
|`%=`|`%`に倣う|同上|
|`<<=`|`<<`に倣う|同上|
|`>>=`|`>>`に倣う|同上|
|`&=`|`&`に倣う|同上|
|`^=`|`^`に倣う|同上|
|`｜=`|`｜`に倣う|同上|
|`,`|任意の型|右オペランドの型|

##参考文献
「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」
デザイナーがiPhone6(375px)基準のデザインをつくってきたとき



320pxでも見切れなく表示する必要がある。

## viewport

```javascript
// http://www.bricoleur.co.jp/blog/archives/2985

import UA from './UA';
const ua = new UA();
const _ua = ua.get();

export default (() => {

    const SP_BASE_WIDTH = 375; // デザイナー作成サイズ
    const PC_MAX_WIDTH = 1280; // タブレット内に収めたいサイズ

    const ua = navigator.userAgent.toLowerCase();
    const isiOS = (ua.indexOf("iphone") > -1) || (ua.indexOf("ipod") > -1) || (ua.indexOf("ipad") > -1);
    const iOSviewportW = (isiOS) ? document.documentElement.clientWidth : 0;

    function updateMetaViewport(){

        const ww = (isiOS) ? iOSviewportW : window.outerWidth;
        let viewportContent;

        if (_ua.Tablet) {
            // タブレットの場合はpcを縮小した感じにする
            viewportContent = `width=${PC_MAX_WIDTH}, user-scalable=no, shrink-to-fit=no`;
        } else {
            // spの基準サイズ（デザイナー作成サイズ）以下はよしなに縮小する
            // ※ iphone7などのデザイナー作成サイズ以上のときも拡大表示したい場合は、
            //   条件分岐をなくし、width=デザイナー作成サイズ を適応する。
            viewportContent = (ww < SP_BASE_WIDTH)
                ? `width=${SP_BASE_WIDTH}, user-scalable=no, shrink-to-fit=no`
                : `width=device-width, user-scalable=no, shrink-to-fit=no` ;
        }

        document.querySelector("meta[name='viewport']").setAttribute("content", viewportContent);
    }

    window.addEventListener("resize", updateMetaViewport, false);
    window.addEventListener("orientationchange", updateMetaViewport, false);

    const evt = document.createEvent("UIEvent");
    evt.initEvent("resize", true, true);
    window.dispatchEvent(evt);

})();
```

## zoom

~~個人的にはzoomで横着してしまっている。~~
~~他に良い方法あればコメントください。~~
（zoomは使わないほうがいい）

デモ：http://s.codepen.io/mo4_9/debug/ZpRoBy
（インスペクタのスマホ表示）


```css:375pxを基準に320~600pxの間で10pxずつzoomを設定するサンプル
@mixin media($width) {
  @media only screen and (max-width: $width + 'px') {
    @content;
  }
}

@mixin fixZoom() {

  $base: 375;
  $max: 600;
  $min: 320;
  $current: $max;

  $stride: 10;

  $flag: true;

  @while $current >= $min {

    @if $flag {
      @if $current < $base {
        @include media($base) {
          body{ zoom: 1.0 ; }
          $flag: false;
        }
      }
    }

    @include media($current) {
      body{ zoom: $current / $base ; }
      $current: $current - $stride;
    }
    
  }

}
```


追記
(以下のコードはiOSでうまく拡縮してなかったので使わないほうがいいかも)

~~media queryよりjsの方が柔軟に対応できそうなので~~

~~SP環境かつ320~600pxでよしなにzoomする。~~

```javascript:Zoom.js
import $ from 'jquery';

export default class {

    constructor(opts={}) {

        this.MAX_WIDTH = opts.MAX_WIDTH || 600;
        this.MIN_WIDTH = opts.MIN_WIDTH || 320;
        this.isSP = opts.isSP || false;

        this.initListener();

    }

    initListener() {
        
        $(window).on('load resize', () => {
            if (!this.isSP) return;
            this.changeScale();
        })

    }

    changeScale() {
        
        const ww = window.innerWidth;
        if ( ww >= this.MAX_WIDTH || ww <= this.MIN_WIDTH ) return;

        const BASE = 375; // zoom = 1.0
        $(document.body).css('zoom', ww / BASE * 1.0 )

   }

}
```


http://caniuse.com/#feat=css-zoom
Unity VRハンズオン 事前準備（開発環境準備編）

# Unityのインストール

バージョンは**5.4.1**をダウンロードします。
最新版のダウンロードページの右下に過去バージョンの Unityのリンクがあるので、そこから入手できます。
（10/13に5.4.2がリリースされたので注意してください。）
インストールするコンポーネントについて以下は必須です。

- Unity本体
- Standard Assets
- Android Build Support
- iOS Build Support（Macの方のみ）

Windowsの方の手順はこちら
http://qiita.com/decchi/items/9ea7af993825c1b46023

Macの方の手順はこちら
http://qiita.com/takish/items/9c3f7183cf204db7e0aa

# Unity IDの取得
下記ページでUnity IDを取得します。
https://id.unity.com/ja/conversations/ee627aa6-59b0-4b77-bb30-594092c0d53600df
# Androidビルドのための事前準備
### JDKのインストール
下記リンクからJDKをダウンロード、インストールします。（既にJDK8以上がインストールされている場合は不要です）
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
### Android SDKのインストール
下記リンクからAndroid SDKをダウンロード、インストールします。（Android Studioがインストール済の方はこの作業は不要です。）
https://developer.android.com/studio/index.html
特に指定しなければC:\Users\"ユーザ名"\AppData\Local\Android\android-sdkにインストールされます。
インストール完了時にSDK Managerを起動するか聞かれるので起動し、次の作業を行います。
### SDK Managerによる各種ツールのダウンロード、インストール
先ほどインストールしたAndroid SDKのSDK Managerを起動します。
SDK ManagerはC:\Users\"ユーザ名"\AppData\Local\Android\android-sdk\SDK Manager.exeにあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/442de21c-f76e-365f-0fb9-6630035fda23.png)

起動したら下記のツールを選択し、インストールします。（リビジョンの違いに注意してください）

- Android SDK Platfrom-tools(Rev24.03)
- Android SDK Build-tools(Rev23.03)
- Android 6.0 SDK Platfrom
- お使いの端末のAndroidバージョンに合った SDK Platfrom（下の例の場合、4.4.2）
- Google USB Driver


![image](https://qiita-image-store.s3.amazonaws.com/0/60734/ffd02c12-bcc1-1cbc-45c9-a466f6016f6d.png)

インストールが完了するとStatusがInstalledになります。
# Android実機実行のための事前準備
下記のリンクの手順を参照してください。
https://akira-watson.com/android/nexus7-usb-driver.html

**トラブルシューティング**
PCとAndroidスマートフォンをUSBで接続してもデバック機として認識されない場合、以下を確認してください。

- スマートフォンの設定で開発者オプションのUSBデバックが許可されている。
- SDK Managerでインストールすべきものがすべてインストールされている。（対象は上記SDK Managerによる各種ツールのダウンロード、インストールを参照）
- お使いの端末に対応したUSBドライバーがインストールされている。（参考ページ:https://developer.android.com/studio/run/oem-usb.html?hl=ja)
- 接続に使っているUSBケーブルがデータ転送に対応している。（安いケーブルは充電のみの場合があります）

# iOSビルドのための事前準備
### Xcode8のインストール
Mac App Storeからダウンロードし、インストールします。
手順は以下を参照してください。
https://iphone-app-tec.com/ios/xcode-install.html
# iOS実機実行のための事前準備
Xcodeで空のプロジェクトを作成し、実機実行ができるかを確認してください。
手順は以下を参照してください。実行のためのプロジェクトはプロジェクトの作成を参照してください。
### XcodeにAppleIDを登録、実機実行
https://iphone-app-tec.com/ios/device-test.html
### プロジェクトの作成
https://iphone-app-tec.com/ios/using-xcode.html
プロジェクト作成時の各パラメータは以下を設定してください。

| 設定値名 | 設定値 |
|:--|:--|
|Product Name   |UnityVRHandson   |
|Team   |Xcodeに登録したApple ID  |
|Organization   | techcircle  |
|Company Identifier   |com.techcircle   |
|Class Prefix   |空欄のまま   |
|Language   | Swift  |
|Device   |iPhone   |

### iPhoneの設定アプリで 開発元を信頼
実機での初回実行時にホーム画面上のアプリアイコンをタップすると、信頼されていない開発元というタイトルのアラートが表示されます。
以下の手順で開発元を信頼済に設定します。

1. iPhoneの設定アプリで、一般 > プロファイルとデバイス管理 に遷移。
2. デベロッパAPP欄を見ると、作成した Apple ID が見つかります。コレをタップ。
3. 続く遷移先画面で、青い文字で Apple ID が表示されている部分をクリック。
4. ウインドウが表示されるので、信頼をクリックします。

# Uinity プロジェクト準備編へ
開発環境準備編の事前準備は以上となります。引き続きUinityプロジェクト準備編の事前準備を行ってください。
http://qiita.com/decchi/private/9f902c9a1c88a64cbd06
ruby 返り値 と nil

＊　初投稿　返り値について初めて躓いたのでメモ

　そもそも、「返り値とは、プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値」である。


```
[1] pry(main)> puts "hello world"
hello world
=> nil
```
puts でhello worldを出力させています。

注意ですが、「hello world はputsによってコンソールに標準出力されただけで、返り値ではない」ということです。

ここでの返り値は、=> nil　です。これは、putsに対しての返り値になります。

[公式](https://www.ruby-lang.org/ja/documentation/quickstart/)によると、
``putsはRubyで何かを出力する基本的なコマンドです。 では、=> nilは何でしょうか？ これはこのコマンドの評価結果です。 putsは必ずnilを返します。nilは、「まったく何もない」ことを表すRubyの「値」です。``

では、次にメソッド hogeを下記のように定義し実行してみます。

```
[13] pry(main)> def hoge
[13] pry(main)*   puts "hello world"
[13] pry(main)* end
=> :hoge
```
実行してみると、

```
[15] pry(main)> hoge
hello world
=> nil
```
ここで一つ疑問がでます。
それは, hello world はメソッド hoge の「返り値」なのかどうかです。　

　冒頭で説明した、
「返り値とは、プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値」だとすれば、メソッド hoge の返り値はhello worldなのか？！？！？！？

結論からいうとメソッド hoge の「返り値」はnilです。

変数aにメソッドhogeの返り値を代入してみます

```
[59] pry(main)> def hoge
[59] pry(main)*   puts "hello world"
[59] pry(main)* end
=> :hoge
[60] pry(main)> a = hoge
hello world
=> nil
[62] pry(main)> a
=> nil
```

次に、変数bにメソッドfugaの返り値を代入してみます

```
[70] pry(main)> def fuga
[70] pry(main)*   puts "good night world"
[70] pry(main)*   return "new world"
[70] pry(main)* end
=> :fuga
[71] pry(main)> b = fuga
good night world
=> "new world"
[72] pry(main)> b
=> "new world"
```

ここで分かるのは、
変数aに代入されているのは => nil

変数bに代入されているのは => "new world"

それぞれhoge, fugaの返り値が代入されているのがわかります。

メソッド fuga では、
puts "good night world"でコンソールに標準したあと、return　で指定された"new world"返り値として戻ってきています。

また、
hoge2 という何も処理のない（返す値のない） メソッドを定義し、変数cに代入してみます。

```
[74] pry(main)> def hoge2
[74] pry(main)* end
=> :hoge2
[75] pry(main)> c = hoge2
=> nil
[76] pry(main)> c
=> nil
```

変数cにはメソッド hoge2の返り値=> nilが代入されています。

ここまでで分かるのは、メソッドはreturnなりで、返す値を指定されていない場合、返り値がないので、
=> nil
を返り値として返します。

つまり、putsがnilを返すのも同じ理由です。

余談ですが、
putsと同じようなものに、pメソッドというものもあります。

```
[102] pry(main)> p "test"
"test"
=> "test"
```

こちらは標準出力をしたあと、返り値としても指定した文字列が返ってきます。
Centos7にNginx + Unicornで構築したRedmine3.3にredmine_agileをインストールする

# [概要]
下記で構築したRedmineにredmine_agileをインストールする。

[Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e55)

# [事前準備]
下記が構築済みであること。
[Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e55)

# [作業内容]
```bash
$ sudo unzip redmine_agile-1_4_1-light.zip
```

## 解凍後のファイルを移動させる
```
$ sudo mv redmine_agile /opt/redmine/plugins/
```

## redmineのrootディレクトリに移動
```bash
cd /opt/redmine
```

## gemインストール
```bash
$ bundle install --without development test RAILS_ENV=production
```

## マイグレーション実行
```bash
$ bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
```
## 再起動させて反映
```bash
$ sudo systemctl restart redmine-unicorn.service
```

## アンインストールする場合
```bash
bundle exec rake redmine:plugins NAME=redmine_agile VERSION=0 RAILS_ENV=production
```

### フォルダを削除
```bash
rm -r plugins/redmine_agile
```

## [事後確認・作業]
PythonからJavaを呼び出す簡単な方法

## はじめに
py4jを使ってpythonからjavaのメソッドを呼び出す方法です。
日本語ドキュメントが古いものばかりで苦労したのでまとめてみました。

## 環境
OS X Yosemite 10.10.5
anaconda 3.5.0(python 3.5.2)

## インストール
pip でpy4jをインストール後、Java側でpy4jを読み込めるようにjarをコピーします。

```
$ pip install py4j
$ sudo cp ~/.pyenv/versions/(仮想環境名)/share/py4j/py4j(バージョン).jar /Library/Java/Extensions/
```

## 実装
公式チュートリアルの通り、Javaで足し算を行う簡単なサンプルを作成してみます。
まずは以下のようなJavaプログラムを作成します。

```AdditionApplication.java
import py4j.GatewayServer;

public class AdditionApplication {

  public int addition(int first, int second) {
    return first + second;
  }

  public static void main(String[] args) {
    AdditionApplication app = new AdditionApplication();
    // app を gateway.entry_point に設定
    GatewayServer server = new GatewayServer(app);
    server.start();
    System.out.println("Gateway Server Started")
  }
}
```

作成したら、以下のコマンドでサーバーを起動します。

```
$ javac AdditionApplication.java
$ java AdditionApplication
```

次に、AdditionApplication を呼び出すためのpythonプログラムを書いていきます。

```python
from py4j.java_gateway import JavaGateway

# JVMへ接続
gateway = JavaGateway() 
# java.util.Randomインスタンスを作成
random = gateway.jvm.java.util.Random()   
# Random.nextIntを呼び出し
number1 = random.nextInt(10)              
number2 = random.nextInt(10)
print(number1,number2) # (2, 7)
#AdditionApplicationのインスタンスを取得
addition_app = gateway.entry_point        
# additionを呼び出し
sum_num=addition_app.addition(number1,number2)    
print(sum_num) # 9
```

ひとまずはpythonから呼び出せています。
ですが、サーバーの起動・停止をわざわざターミナルから行うのは若干手間です。
どうせなら、最初から最後までpythonで実行できるようにします。

```python
# クラスパスを指定して実行
args=(["java","-cp",'/path/to/class/','AdditionApplication'])
p=subprocess.Popen(args)
# サーバー起動前に処理が下へ行くのを防ぐ
time.sleep(3) 
gateway = JavaGateway(start_callback_server=True)
random = gateway.jvm.java.util.Random()
n1 = random.nextInt(10)
n2 = random.nextInt(10)
print(number1,number2) # (2, 7)
addition_app = gateway.entry_point
print(addition_app.addition(n1, n2)) # 9
# プロセスをkill
gateway.shutdown()
```

最後まで一貫してpythonで実行できるようになりました。
Javerな人のプロジェクトを受け継いだ時や、使用したいJavaライブラリがある時、スピードの必要な処理を一部Javaで実装したい時等に使えるんじゃないでしょうか。

## 参考
https://www.py4j.org/
https://gist.github.com/bartdag/1070311
MacOS Sierra，Sublime Text3にsublコマンドを使いたい

これこれこれこれ！MacOS Sierra，Sublime Text3 !
sublのコマンドを使うためにターミナルに以下のコマンドを入れてください．

```sudo ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl```

できたら　```subl -h``` をしてみて，色々出たらおけ
交差検定の評価指標の設定（メモ、scikit-learn, cross_validation.cross_val_score）

##cross_validation.cross_val_scoreのケース

この**scoring**の値の指定！！

scores = cross_validation.cross_val_score(clf, X_digits, y_digits, cv=k_fold, ... **scoring**='precision_macro') 


学会発表聞いてても交差検定の評価指標が謎なことが多かった。
対象によっては一意に決まるのかと思ったりもしていた（昔）。
目的次第でちゃんと選択するんだよね＾＾；

**一覧リスト、詳細はリンク先からさらに飛べる**
http://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter

```
['accuracy', 'adjusted_rand_score', 'average_precision', 'f1', 'f1_macro', 
'f1_micro', 'f1_samples', 'f1_weighted', 'log_loss', 'mean_absolute_error', 
'mean_squared_error', 'median_absolute_error', 'precision',
'precision_macro', 'precision_micro', 'precision_samples', 
'precision_weighted', 'r2', 'recall', 'recall_macro', 'recall_micro', 
'recall_samples', 'recall_weighted', 'roc_auc']
```
　
**'accuracy'**　accuracy_score　
二値分類では多くのサンプルがそうなってるが、これがデフォルト?かな上位だし。
式的にはこうなんだ。
![alt](http://scikit-learn.org/stable/_images/math/cd4bea15b385d15cceb8e24f68976da7d8510290.png)

回帰の時は、大仏さんが書いてた。
表にはneg_が付いているが、リストでは"mean_squared_error"の表記だな。
負の値が帰ってくるとかあるからその絡みか...
http://d.hatena.ne.jp/teramonagi/20130825/1377434479#20130825f2

**説明を抜粋（クオーテーションがパラメータの値）**
表記がリストと完全に一致...　していないのは謎ｗ
>**Classification**
‘accuracy’ 	metrics.accuracy_score
‘average_precision’ 	metrics.average_precision_score
‘f1’ 	metrics.f1_score 	for binary targets
‘f1_micro’ 	metrics.f1_score 	micro-averaged
‘f1_macro’ 	metrics.f1_score 	macro-averaged
‘f1_weighted’ 	metrics.f1_score 	weighted average
‘f1_samples’ 	metrics.f1_score 	by multilabel sample
‘neg_log_loss’ 	metrics.log_loss 	requires predict_proba support
‘precision’ etc. 	metrics.precision_score 	suffixes apply as with ‘f1’
‘recall’ etc. 	metrics.recall_score 	suffixes apply as with ‘f1’
‘roc_auc’ 	metrics.roc_auc_score 	 
**Clustering**
‘adjusted_rand_score’ 	metrics.adjusted_rand_score 	 
**Regression**
‘neg_mean_absolute_error’ 	metrics.mean_absolute_error
‘neg_mean_squared_error’ 	metrics.mean_squared_error
‘neg_median_absolute_error’ 	metrics.median_absolute_error
‘r2’ 	metrics.r2_score
USBメモリが認識されなくなったときに試してみるとよいこと (Ubuntu)

1. USBメモリを挿します．
2. usb-creatorを起動します．（[こちらの記事](http://qiita.com/K-Kachi/items/3e461b10846eee6539cd)を参照）
3. 使用するディスクにUSBメモリが表示されていれば復活できる可能性あり！ディスクの消去ボタンを押しましょう．
4. うまくいけばUSBメモリが認識されるようになっているはずです．
first-childセレクタとfirst-of-typeセレクタの違い


first-childが何故か効かない、ということがあったので少し調べました。


## first-childセレクタ

以下のCSSが適用されるか調べてみる。

```css
.sample p:first-child {
	font-weight: bold;
}
```


### CSSが適用される場合

```html

<div class="sample">
	<p>how</p>
	<h2>are</h2>
	<h2>you</h2>
	<p>gone?</p>
</div>

```

この場合は、一番初めのp要素にcssが適用される。


### CSSが適用されない場合

```html

<div class="sample">
	<h2>are</h2>
	<p>how</p>
	<h2>you</h2>
	<p>gone?</p>
</div>

```

この場合、pにはCSSが適用されない。
sampleの初めの子要素（first-child）がh2要素だからである。

p:first-childは、あくまでも「最初の子要素がp要素だった場合のみ」装飾が適用される。


## first-of-typeセレクタ
p要素だけカウントしてCSSを適用したい場合は、以下のように書く。

```css
.sample p:first-of-type {
	font-weight: bold;
}
```

last-childとlast-of-typeについても、
最後の子要素についてみるという以外は同じ考え方になります。
アラサー女子が中堅SI企業からWeb系受託ベンチャー企業にエンジニアとして転職して感じたこと

初めまして！
初めて投稿させていただきます^^

私は中堅のSI企業に新卒で入社し、丸4年間働いて、受託開発をメインで行っているweb系のベンチャー企業に転職しました。
(これから自社開発にシフトしていくみたいです^^)
中堅企業とベンチャー。
SI企業とweb系企業。
似ているようでかなり異なるところが多い2つの企業において、私なりに感じたことをまとめてみます。
自分のいた会社に限ったことなのと、ちょっと独断と偏見を含んでいるところがあるかもしれないので、気分を害された方はすみませんm(_ _)m
現状に悩んでいる方のお役に立てたら幸いです！！

##SI中堅企業について(転職前)
###メリット
・新卒入社で、研修を3ヶ月みっちり受けさせてもらえた
・中途入社の方も3ヶ月の研修があった
・最初から大きい仕事を任させられることはなかった
・努力する姿勢が割と評価されていた
・資格手当がもらえた


###デメリット
・技術を深めていこうという前向きさはなかった
・仕事が好きで働いてる人は少なく、みんな給料のために働いているという感じだった
・飲み会とイベントの企画くらいしか楽しみがなかった気がする
　イベントの企画は社内営業所から客先への部署異動のため、途中からなくなりました；；
・飲み会強制感ハンパなかった
・言い方悪いが、ごますり社会
極端な話実力なくても上にいい顔をすれば昇格できる感じだった
・出る杭は打たれる
ちょっとでも変わった人がいたら飲み会のネタでしたorz
・男：女が9:1だったので、良くも悪くも女性は特別。
女性がリーダーになれる確率はとっっても低かった。(本人のやる気と実力次第な気も)
まぁ若いうちはちやほやはしてもらえたのかな。
・希望した仕事をやらせてもらえる環境ではなかった
・現場によっては、ネタにできないレベルの残業量
先輩は1週間ホテル生活してました。月の労働時間が500時間越えの人も。。。
かくいい自分は楽な現場も経験しました。
本当に、現場次第といった感じです
・セキュリティ問題に異常にうるさい
そこまで言わなくても・・・大事だけどさ

##Webベンチャー企業について(転職後)
###メリット
・自由
・コード書きまくり
web業界はゴリゴリ実装ですな〜
・実力が伸びる、勉強ができる環境がある
・仲が良い
・飲み会の時に人の悪口をいう人は少なく、会社のこれからについてや日々の勉強方法についての話が出る
・勉強会などが積極的に開かれていて、参加したり情報共有している
・新卒研修後も上が下を積極的に教えている
・社内でも勉強会やLT大会が開かれている
・責任ある仕事を任させられる
入社2日目でインフラ構築を任せていただきました。
当時はジェ、jenkins・・・？なにそれおいしいの？状態
・リーダーになるスパンが早い
社会人5年目で入社して、3年目の人が他プロジェクトでリーダーやってるのは圧巻されますた
・会社に意見を出しやすい
経営者との距離が近いから。
言いやすいのと聞き入れてもらえるのは別物。
・前向きな人が非常に多い
　みんな若いのに・・・びっくりします
・コミュ力高い人が多い


###デメリット
・自分でどんどん勉強して、ついていかないと確実に置いていかれる
・競争の激しい業界
・web業界はとにかく流行りすたりが多い
バージョンアップ系もかなり多く、悩まされるし、バージョンによってUI全然違うじゃん！的なwww
・仕事において引っ込み思案思考の人には向いていないかも
・実力次第なので、実力が足りなければ残業もあり、残業手当はない
今の会社は、残業非推奨なのでか〜なり助かってます！！
デフォルト20時前に会社静かです！！
・フロント、サーバ、インフラ、全部自分たちでやらないといけない
・一通りつかめたらマネジメント。みんなこれに苦戦している。
自分で手を動かせば早いのに・・・という声も聞く。
・生産性が必要
自分、前の会社では評価されていたはずなんだけど、今の会社では・・・orz


##考えたこと
・やってみないとなんでもわからない
・(今は)日々の生活の中に成長があるということを実感
・エンジニア全般的に、仕事で身につくのは技術だけではないと思います。
何事も広い視野を持って勉強、情報収集が必要！


##結論
向き不向きあり
勉強したくない、新しい技術とかいらないという方にはweb系は向いてないでしょう。
・・・ということはその逆の方には向いているでしょう。
特にゴリゴリ実装したい人！！web系では必要不可欠ですからね！！

とはいえ、アラサー女子、婚期などもあるとは思います。
(自分は・・・ゲホンゲホン)
人生のライフバランス等は考慮しつつ。考えていただきたいところでございます。サザエでございま〜す。

##転職理由
入社して丸3年経って。
毎日言われたことだけを淡々とこなすのはつまらない、新しい刺激が欲しい！と思っていました。
あと、前の会社にいた時、3年目でたまたま社内のweb開発に携わらせて頂き、「ちょーむずい」と思ったと同時に「結果が目に見えるのたんのしぃ」と思った記憶があります^^
ひょんなことから転職活動を始め、web系を中心に他職種も受けていましたが、web系受託開発の会社にご縁をいただいて、イマココ。
きついことだらけですが、環境と上司に恵まれてやっていけてます。
なんだかんだ、チャレンジも大事！！
人生1度きりですから！

##最後に★
わからなかったこと、分かりづらかったこと、もっと聞いてみたいことなどありましたらコメントください。
拙い文章で失礼いたしました！
悩んでいる方や、web業界に興味のある方の参考になりましたら幸いです♪♪
継承をさせるかMixinさせるか考えてみた


最近コードを書いている時にDRYなコードを書くのには親クラスを作って継承させるべきなのかModuleでMixinするべきなのか、どっちが良いのか整理して考えてみた。
最初にお断りをしておくと、多分どちらでも問題ないと思うし、好みの問題だと思います。

##ある高校の先生を例に考えてみる。

```teacher.rb
class Teacher
  def prepare_lesson
  	#授業の予習をする
  	@naiyou = "教科書を読んでくる"
  end
  def lesson
    #授業をする
    @naiyou.show
  end
  def create_test
    #英語のテストを作成
    @test = "先生が考えてくる"
  end
  def examine
    #テストを実行する
    @test.exec
  end
  def check_test
    #テストを採点
    @test.check
  end
  
  etc...
end
```
先生のやる事は挙げればきりがないが例えば上記のような事をすると考えよう。
でも先生は１人で数学や英語、化学や国語を教えたりするスーパーマンではない。もしそんなスーパーマンがいたらコードの中身はきっとifやcaseで埋め尽くされてしまう。

##どうしようか・・・　継承 or Mixin
そうならないように役割をもう少し分けて共通項はDRYにした方がいいよねと思い立った故に、あれ継承？Mixin？
授業の予習や、テストを作るといった事は教科によって内容が変わるのでそれぞれの専門のクラスに持たせるとするが授業をしたりテストを実施するのは教科の内容にかかわらず鐘がなってから終わるまで準備してきたもの生徒たちに提供するだけなので親クラスやモジュールにまとめることにする。

```math_teacher.rb
class Teacher 
  def lesson
    @naiyou.show
  end
  def examine
    @text.exec
  end
end

class Teacher::MathTeacher < Teacher
  def prepare_lesson
  	#数学の授業の予習をする
  	@naiyou = "数学の問題をといてくる"
  end
  def create_test
    #数学のテストを作成
    @test = "数学の教科書から作る"
  end
end

class Teacher::EnglishTeacher < Teacher
  def prepare_lesson
  	#英語の授業の予習をする
  	@naiyou = "英語の教科書を読んでくる"
  end
  def create_test
    #英語のテストを作成
    @test = "英語の教科書から作る"
  end  
end
```

```english_teacher.rb
module Teacher
  def lesson
    @naiyou.show
  end
  def examine
    @test.exec
  end
end

class Teacher::MathTeacher
  include Teacher
  def prepare_lesson
  	#数学の授業の予習をする
  	@naiyou = "数学の問題をといてくる"
  end
  def create_test
    #数学のテストを作成
    @test = "数学の教科書から作る"
  end
end

class Teacher::EnglishTeacher
  include Teacher
  def prepare_lesson
  	#英語の授業の予習をする
  	@naiyou = "英語の教科書を読んでくる"
  end
  def create_test
    #英語のテストを作成
    @test = "英語の教科書から作る"
  end  
end
```
上は継承 下はMixin
この状態であれば、結論付けられないので他のクラスを登場させてみる。

##生徒クラス登場
```student.rb
class Student
  def take_lessons
    #授業を受ける
  end
  def move_to_a gymnasium
  	#体育館に移動する
  end
end
```

ここで生徒クラスを登場させてみる。生徒は教師と大きく関わりを持つが教師がやるべきことと生徒がやるべきことは同じじゃない。 そん中でも教師と生徒が同じ動作をすることはある。例えば全校集会の為に体育館に移動するとか。　生徒クラスにも教師クラスにも体育館に移動するメソッドは全く同じであるが、2つを内包するような上位概念があるだろうか? schoolクラスを作る?　schoolクラスからインスタンス化されたオブジェクトはそれ単体でも実行できる。 学校というオブジェクトが体育館に移動するという主語になるかと言われると気持ちが悪くて想像したくない。

```school.rb
class School
  def move_to_a_gymnasium
    #体育館に移動する
  end
end

class Teacher < School
  ...#その他
end  

class Student < School
  ...#その他
end

Teacher.new.move_to_a_gymnasium
Student.new.move_to_a_gymnasium
School.new.move_to_a_gymnasium !?!?!?!?
```

そこで、こんな時こそ微妙な距離感の2つのクラスの間にはModuleでMixinするというのがあっているのではないかと思いました。ということで全校集会は学校のイベントなのでSchoolEventモジュールを用意

```school_event.rb
module SchoolEvent
  def move_to_a_gymnasium
    #体育館に移動する
  end
end

class Teacher
  include SchoolEvent
  ...#その他
end  

class Student
  include SchoolEvent
  ...#その他
end

Teacher.new.move_to_a_gymnasium
Student.new.move_to_a_gymnasium
```

##結論
プレフィックスを持つようなグループに分けられるようなクラスをDRYにする時は親クラスを用いて、汎用的な共通の処理が必要な場合はModule化してMixinを使ってあげるというのが良いかなと思いました。
MyBatis-Springでプログラム的にトランザクション管理をする


残業続きでとても眠いので、ごく簡単に済ませたいと思います。誤字脱字は許してね(´・ω・`) 

やりたいことはタイトルの通り。MyBatis-Springではトランザクション管理をMyBatis-Springに一任します。つまりプログラマはコミットやロールバックなどを明示的に呼び出す必要はないのですが……とはいえトランザクション管理をプログラム的に行いたい場面があるのも事実です。

まずトランザクション管理について、Springの設定用xmlに次のようなbean定義がなされているとします。

```xml
<bean id="transactionManager"
           class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>
```
次にMybatisについて、Mapperインターフェイスが次のように存在するとします。

```java
public interface Dao {

	@Insert("INSERT INTO user VALUES(#{userid}, #{name})")
	int insertUser(@Param("userid") Stringuserid, @Param("name") String name)

	@Update("UPDATE user SET name = #{name} WHERE userid = #{userid}")
	int updateUser(@Param("userid") String userid, @Param("name") String name)
}

```
さてMyBatis-Springにおいて、明示的にトランザクション管理を行う場合は`TransactionManager`を利用します。具体的には以下の通りです。

```java
public class Service {
	
	@Autowired Dao dao;
	@Autowired PlatformTransactionManager txManager;
	
	public void sample(String userid, String name) {
		
		// トランザクション管理の開始
		DefaultTransactionDefinition txDefinition = new DefaultTransactionDefinition();
		txDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		TransactionStatus txStatus = txManager.getTransaction(txDefinition);
		
		
		try {
			
			// DBに対するアクセスを実行
			dao.insertUser(userid, name);
			dao.updateUser(userid, name);
			
			// DBへのアクセスが問題なく終了した場合は処理を確定させる
			txManager.commit(txStatus);
            
		} catch (Exception e) {
			
			// 何らかの事情で更新処理に失敗した場合は処理をロールバックする
			txManager.rollback(txStatus);
		}	
	}
}
```

簡単ですね(´・ω・`)
Salesforce：Visualforceにて子オブジェクトの項目値を取得する方法

オブジェクトParentがオブジェクトChildの親であるとします。
この時、Visualforceにて特定のParentの子供であるChildの項目をリスト表示する方法考えます。

### 前提条件

- ParentのAPI参照名を *Parent__c* とします。
- ChildのAPI参照名を *Child__c* とします。
- Childは4つの項目を持ち、その内一つはParentへの参照です。この参照のAPI参照名を *Child2Parent__c* とします。また、子リレーション名を *Children* とします。
- Childの残る3つの項目をX,Y,Zとし、それぞれのAPI参照名を *X__c*, *Y__c*, *Z__c*とします。

### ApexでControllerを実装

パラメータで受け取ったID( *ParentId* )でParentを検索し、その子であるChildも取得します。
SOQLは次の通りです。

` Select Id, (Select Id, X__c, Y__c, Z__c from Children__r) Where Id = :parentId Limit 1 `

取得したChildオブジェクト群をList型に格納します。

```java:ExampleController
public Id parentId {get; set;}
public List<Child> children {get; set;}

public ExampleController() {
    this.children = new List<Child>();
}

public void doSearch() {
    if (String.isEmpty(parentId)) {
        return;
    }
    Parent parent = [Select Id, (Select Id, X__c, Y__c, Z__c from Children__r) Where Id = :parentId Limit 1];
    if (parent.size() > 0) {
        for (Child child : parent.Children__r) {
            this.children.add(child);
        }
    }
}
```

### Visualforceで子オブジェクトをリスト表示

List<Child>のchildrenを使ってVisualforce側で<apex:pageBlockTable>を使ってループし、各項目（X, Y, Z)を表示します。

```xml:ExampleVisualforce
<apex:page controller="ExampleController" title="ExampleVisualforce" showHeader="true" sidebar="false" id="page">
  <apex:form id="form">
    <apex:pageBlock id="block">
      <apex:pageBlockButtons >
      　　親（Parent）のSalesforce ID: <apex:inputText value="{!parentId}" id="parentId"/>
        <apex:commandButton value="Search" title="Search" action="{!doSearch}" reRender="form" />
      </apex:pageBlockButtons>
      <div>
      <apex:pageBlockTable value="{!children}" var="child">
        <apex:column headerValue="項目X">
          <apex:outputText value="{!child.X__c}" />
        </apex:column>
        <apex:column headerValue="項目Y">
          <apex:outputText value="{!child.Y__c}" />
        </apex:column>
        <apex:column headerValue="項目Z">
          <apex:outputText value="{!child.Z__c}" />
        </apex:column>
      </apex:pageBlockTable>
      </div>
    </apex:pageBlock>
  </apex:form>
</apex:page>
```

作成したVisualforceで親のSalesforce IDを指定して[Search]ボタンをクリックすると、その親が持つ子供の項目がリスト表示されます。
Monacaでアプリ起動時のページをindex.html から他のページに変更する


Monacaでアプリ作ってたら、起動時のページをindex.htmlから変えたくなった。
Monacaの公式ドキュメントにも載ってるんですが自分用にメモしたかったので。

### www フォルダー下に置かれた config.xml ファイルを編集する
![スクリーンショット 2016-10-08 21.12.44.png](https://qiita-image-store.s3.amazonaws.com/0/94998/2563931d-4eb7-439f-47be-36199a2e4e29.png)

一番下のやつ。

![スクリーンショット 2016-10-08 21.13.04.png](https://qiita-image-store.s3.amazonaws.com/0/94998/afef6dee-63f5-e6bb-296d-7ec4065d9301.png)


`<content>`タグ内の`index.html`を、起動時に表示させたいページに変えるだけ！
**※パスを間違えないように注意すること。**


以上ヾ(＠⌒ー⌒＠)ノ
MariaDB 10.1 設定

# はじめに
[CentOS 7 minimal インストール ～ LAMP 構築まで](http://qiita.com/wreath/items/f9d6b2128d7a5bf5a2f1)

こちらは上の記事の続きとなります。

# MariaDB 設定
MariaDB は MySQL の設定やコマンドがそのまま利用出来ます。
インストール直後は設定が存在していないのでサンプルをコピーします。

```
[root@localhost ~]# cp /usr/share/mysql/my-small.cnf /etc/my.cnf.d/server.cnf
```

## 文字化け対策
デフォルトだと日本語が文字化けしてしまうので以下の通り修正します。

```
[root@localhost ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
character-set-server = utf8   # この行を追加
```

```
[root@localhost ~]# systemctl restart mysqld.service
[root@localhost ~]# mysql -u root
MariaDB [(none)]> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

MySQL サービスを再起動し文字コードが全て utf8 になっているか確認します。
Rails5.0.0 + puma3.6 + nginx1.10.1連携

Rubyから少し離れていると標準が大きく変わっていました。
備忘録も兼ねて、メモ。

今回はRails5を使ってWEBアプリを構築してみたいと存じます。
これまではunicornを利用してたのですが、5からpumaが
より標準に近い形になっていくように見受けられました。

**SWのバージョン**
さくらのクラウド（CentOS7.2）を利用します。

```bash:version
$ uname -a 
Linux lightnote-ap 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

$ rails -v
Rails 5.0.0.1

$ puma -v
* Version 3.6.0

$ nginx -v
nginx version: nginx/1.10.1
```

**pumaの設定**

```rb:puma.rb
# project_home /opt/rails/rightnotes
$ pwd
/opt/rails/rightnotes

$ cat config/puma.rb 
_proj_path = "/opt/rails/rightnotes"
_proj_name = "rightnotes" 
_home = "/opt/rails/rightnotes"
pidfile "#{_home}/run/#{_proj_name}.pid"
bind "unix://#{_home}/run/#{_proj_name}.sock"
directory _proj_path

#以下省略
```


**nginxの設定**

```nginx:default.conf
# cat /etc/nginx/conf.d/default.conf
upstream rightnotes {
    server unix:/opt/rails/rightnotes/run/rightnotes.sock fail_timeout=0;
} 
server {
    listen       80;
    server_name  localhost;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_pass http://rightnotes;
    }

    root /opt/rails/rightnotes/public;
    client_max_body_size 10m;
    error_page 404 /404.html;
    error_page 500 502 503 504 /500.html;
    try_files $uri/index.html $uri @rightnotes;
}
```

**nginx、puma start**

```bash:start
$ systemctl start nginx.service
$ cd /opt/rails/rightnotes
$ puma -w 2
```

**ブラウザでアクセスする**
![スクリーンショット 2016-10-08 22.38.17.png](https://qiita-image-store.s3.amazonaws.com/0/110457/10fda305-8107-1fa2-c8df-9827dad4b25f.png)

取り急ぎ、連携と動作を確認できました。
Rails5、pumaどちらも、きちんと勉強しなおす必要がありますね。
compileSdkVersionを上げるときに、非推奨になったAPIをチェックする

新しいOSが発表されたときに、compileSdkVersion(targetSdkVersion)を上げることがあると思います。

# 非推奨APIのチェック
以下のように記述すると、ビルド時に非推奨APIの警告が表示されるようになります。
新しく非推奨になったAPIが無いか、ざっとチェックしたいときにいいと思います。

``` build.gradle
allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}
```

例えば、APIレベル24から非推奨になったカメラAPIのCamera.ACTION_NEW_PICTUREを利用していたメソッドがあったとします。

```
public void hogeMethod() {
    String aaa = Camera.ACTION_NEW_PICTURE;
}
```

この場合、compileSdkVersionを24に上げると新たに以下の警告が表示されるようになります。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/38164/a2a75bff-7075-b882-729a-70ad43476ecd.png)

# プロセスとして取り入れる
日常的にチェックしてもいいと思います。

minSdkVersionによっては以下のように処理を切り分けるケースがでてきますが、こういう時に警告が出続けてしまいます。

```
public void hogeMethod() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // 新しいAPIの処理
    } else {
        // Android7.0未満ではこっち
        String aaa = Camera.ACTION_NEW_PICTURE;
    }
``` 

対応した箇所の警告を抑止するなどすれば、保守性があがりそうです。

```
// ↓メソッドごと警告抑止するなら
@SuppressWarnings("deprecation")
public void hogeMethod() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
       
    } else {
        // ↓次の1ステップのみ警告抑止するなら
        // noinspection deprecation
        String aaa = Camera.ACTION_NEW_PICTURE;
    }
```
pico8備忘録


レトロゲームの製作プラットフォーム[pico8](http://www.lexaloffle.com/pico-8.php)の備忘録。

# リンク

- [pico8日本語版マニュアル](http://tkitao.hatenablog.com/entry/2016/07/24/214805)
- [pico8 fanzine(日本語訳)](https://sectordub.itch.io/pico-8-fanzine-1-japanese)
- [pico8 API cheetsheet](http://www.lexaloffle.com/bbs/?tid=1906)

# コードスニペット

## 障害物判定ありの移動

障害物（フラグ0オンのマップチップ）を避けて移動する関数moveの定義。
※ chrはフィールドx,yを持つテーブル。
※ キャラクタは8x8ドット。一度に8ドット以上移動した場合はすり抜ける場合あり

```lua
-- move
function move(chr,vx,vy)
	movex(chr,vx)
	movey(chr,vy)
end

-- move x
function movex(chr,v)
	-- dont move
	if v==0 then
		return
	end
	-- corner position
	local x=chr.x
	if v>0 then
		x+=7
	end
	-- check block
	local block=checkblock(x+v,chr.y  ) or 
             checkblock(x+v,chr.y+7)
	if block then
		chr.x=flr(x/8)*8
	else
	 chr.x+=v
	end
end

-- move y
function movey(chr,v)
	-- dont move
	if v==0 then
		return
	end
	-- corner position
	local y=chr.y
	if v>0 then
		y+=7
	end
	-- check block
	local block=checkblock(chr.x  ,y+v) or
             checkblock(chr.x+7,y+v)
	if block then
		chr.y=flr(y/8)*8
	else
	 chr.y+=v
	end
end

-- check block
function checkblock(x,y)
	local col=(x)/8
	local row=(y)/8
	local mval=mget(col,row)
	return fget(mval,0)
end
```
正規分布N(0,1)に従う乱数ジェネレータ

この記事ではBox-Mullerの方法で$N(0,1)$に従う変数を生成するコードを書いてみます。

## Box-Mullerアルゴリズム概要
2つの独立な一様分布を$U_1, U_2$とします。このとき次の$X_1, X_2$で定義される2 変数は正規分布に従うことが知られています（って結果だけかヲイw）

```math
\begin{eqnarray}
X_1 &=& \sqrt{-2\log(U_1)}\cos(2\pi U_2) \\
X_2 &=& \sqrt{-2\log(U_2)}\sin(2\pi U_1)
\end{eqnarray}
```

→右辺の$U_1, U_2$の「混ざり具合」に注意ですねー。
（ココを間違えると、変な感じの分布になりますw）

## 準備
今回は`numpy`,`seaborn`を使うので、準備しときましょ。

```py
## preparation
import numpy as np
import seaborn as sns
```

## Step1: 一様分布を生成
$0\sim 1$の間に値をとる関数`np.random.uniform(0,1)`を使います。
独立な一様分布$U_1, U_2$を作る必要があるので、配列にもたせておきます。

一端、sample数を`10000`にしておきましょうか。

```py
## Sample size
N = 10000
## Uniform distributions
random_list1 = [np.random.uniform(0,1) for i in range(N)]
random_list2 = [np.random.uniform(0,1) for i in range(N)]
```

## Step2: 一様であることの確認
一応、、、（ただの目視確認ですが、、）

```py
sns.tsplot(random_list1)
```

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/80539/b8a12656-96fc-6e5e-2e78-65394fa53e99.png)

→何となく大丈夫そう！

## Step3: 2変数のぶっこみ - `zip`関数
「Box-Mullerアルゴリズム概要」に記載したとおり、$U_1, U_2$の「混ざり具合」が面倒ですが、ここは`zip`関数を使ってみましょうか。

```py
zip(random_list1,random_list2))
```
とすれば、`random_list1`と`random_list2`の2つの配列の同じ位置にある要素を1つずつ取ってきて新しいリストを作ります。イメージ的には

```math
\begin{eqnarray}
list1 &=& [a_0, a_1, a_2, \ldots] \\
list2 &=& [b_0, b_1, b_2, \ldots]
\end{eqnarray}
```

に対して

```math
[[a_0,b_0], [a_1,b_1], [a_2,b_2] \ldots] ]
```

を返すイメージです。

## Step4: 生成しまーす -`map`関数とか
今回は`map`関数と`lambda`式を使いますー。

```py
norm_list = map(lambda x: np.sqrt(-2*np.log(x[0]))*np.sin(2*np.pi*x[1]), zip(random_list1,random_list2))
```

→$U_1, U_2$をひっくり返して作った$X_2$も挑戦してみて下さい！

## Step5 、、で結果は？

```py
sns.distplot(norm_list)
```

![Unknown-1.png](https://qiita-image-store.s3.amazonaws.com/0/80539/0afafa50-8061-6ffc-40e3-d0c538703410.png)

何となく正規分布っぽいですねｗ

## Step6 もっと簡単な方法？
まぁ、考えることはみんな一緒と言いますか、用意されてますよね、そりゃ。!

```py
rnd = np.random.RandomState(0)
random_element = [rnd.randn() for i in range(N)]
sns.distplot(random_element)
```

![Unknown-2.png](https://qiita-image-store.s3.amazonaws.com/0/80539/c7e31ab8-6b47-bfe1-2319-0a8734a764c5.png)

# Reference
- [Box-Muller法](http://aidiary.hatenablog.com/entry/20140706/1404646793)
Pushdogの(非公式)ブックマークレット公開します。

<p>今日、Pushdogを使い始めましたが、Chrome専用ですね。アレ。サイト追加が公式サイトとChrome拡張なおかげで、ストレージ問題でFirefoxを使う私にとっては、通知を受け取れるけど、追加の作業が面倒なのですね。そこで、えっちらほっちらChrome拡張を解凍して、適当なサイトからURLを書き換えるブックマークレットを引っ張てきて合成しました。それが、以下のコードになります。</p>
<code>javascript:(function(){window.location='https://push.dog/subscribe?url='+encodeURIComponent(document.URL)})()</code>
<p>毎度のことですが、適当に合成して作動が確認できただけで。そのままで、どの環境でも動くことは保証できません。その上に、私自身にコードを書く技術は無いですから、自己責任はもとより泣きつくなら、心優しそうなWeb開発クラスタにでも逝ってください。何にも保証しません。できません。</p>
【Android】Push通知タップ後にActivityが起動しない場合の対処法

## 概要
同じアプリ内で複数のPendingIntentを使っている（NotificationやWidgetを実装している）場合に、Push通知タップ後にActivityが起動しないときの対処法メモです。

## 結論
PendingIntent.getActivity()の第二引数をユニークな値にする。

## 例
以下のように第二引数を固定値にしているとActivityが起動しない場合があります。

```java
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
```

その場合は以下のようにユニークな値に変更すると解決します。

```java
PendingIntent pendingIntent = PendingIntent.getActivity(context, uniqueId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
```

## 参考
- [PendingIntent | Android Developers](https://developer.android.com/reference/android/app/PendingIntent.html)
- [platform_frameworks_base/PendingIntent.java at master · android/platform_frameworks_base · GitHub](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/PendingIntent.java)
【iOS】アプリバージョンの簡単比較

NSComparisonResultを使うと簡単に比較できる

## やり方
#### Swift
```swift
let compareVersion: String = "1.1.0"
let currentVersion: String = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as! String // 1.0.0
        
if compareVersion.compare(currentVersion) == .OrderedAscending {
    print("現在のバージョンより下です")
} else {
    print("現在のバージョンより上です") // この場合はこちらが出力される
}
```

#### Objective-C
```Objective-C
NSString* compareVersion = @"1.1.0";
NSString* currentVersion = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"]; // 1.0.0

if ([compareVersion compare:currentVersion options:NSNumericSearch] == NSOrderedAscending) {
    NSLog(@"現在のバージョンより下です");
} else {
    NSLog(@"現在のバージョンより上です"); // この場合はこちらが出力される
}
```

## 注意
バージョンコードが同じとき、`.`で区切る数で結果が変わるので気をつける

例えば、`currentVersion`が`1.0.0`のとき、
比較するバージョンが`1.0`の場合は、`currentVersion`より下
比較するバージョンが`1.0.0`の場合は、`currentVersion`より上、
比較するバージョンが`1.0.0.0`の場合は、`currentVersion`より上になる
=~と!~の左辺と右辺に気をつける


正規表現パターンを左辺と右辺どちらに書いても結果は同じだと思っていたら、右辺に書かないと正しくマッチしませんでした。


```vim:サンプル1
echo '\s' =~ ' '
echo ' ' =~ '\s'
```

```:結果
0
1
```

```vim:サンプル2
echo '\s' !~ ' ' 
echo ' ' !~ '\s' 
```

```:結果
1
0
```

この仕様についてはVimのヘルプ```:h E694```に書いてありました。

```
The "=~" and "!~" operators match the lefthand argument with the righthand
argument, which is used as a pattern. 
```
Android MのRuntime PermissionsとPermissionsDispatcher

前回、[いまいち納得できないAndroid MのRuntime Permissions](http://qiita.com/kojimamasahiro/items/a984510791f79c242728) というのを書いたのですが、PermissionsDispatcherというライブラリはどうかとコメントをいただいたので、調べてみました。

ほぼこちらの記事を参考にしています。
http://qiita.com/kazy/items/0ded30d80cef9df54c98

# booleanのメソッドなのに３つの状態がある
このため、状態を区別するためのpreferenceを新しくつくらないといけなくなってました。

こちらは、ライブラリを使っても特に解決するということはなさそうでした。今回、新たに調べた感じだと、Googleとしては、パーミッションの許可をとる場合は、初回に限って、そのパーミッションの必要性をユーザーに知らせて欲しいとの意向があるようで、おそらくそのからみでこのような仕様になっているのかと思われます。

# 現在地は端末の設定もある
このためテストの条件をかなり増やさないといけなくなってました。

こちらもライブラリを使っても特に解決するということはなさそうでした。（仕様が増えたのだから、当たり前と言えば当たり前ですかね）

とは言え、ライブラリを使うことで、パーミッションはパーミッション、端末は端末とソースを分離できるようになったので、テストはしやすくなったと思います。

# 各画面で確認しなければならない
こちらも上記と同じかと思います。

# テストの分岐が増える
こちらも上記と同じかと思います。

# おわりに
あまり解決できてないようですが、納得できなかった部分が少し軽くなった気がします。また、ちょっと触っただけですが、とても便利ですね。うまく隠ぺいしてるというかなんというか。

ちなみに、aptはこれからも流行るのでしょうか。勝手にソースが生成されたり、ビルドが遅くなった気がしたり不安なんですが。ソースがきれいになって楽になるから流行るのかな。
【しずおかアプリ部】活動ログ　第26回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第２６回


##■開催日##
２０１６年１０月８日（土）　１６：００～１８：００


##■参加者##
１０名

![IMG_7308.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/fdb44f90-2a5a-74d9-c1bb-f76f20acd110.jpeg)



##■活動内容（概要）##
・菅原プレゼン「Unityはじめるよ　～NavMesh基礎～」
・部員さんプレゼン「Gitでバージョン管理～ブランチ編～」
・部員さんプレゼン「自作ハードウェアでのVRコンテンツ制作経過発表」
・雑談


##■活動内容（詳細）##

【実演・プレゼン】


**・菅原プレゼン「Unityはじめるよ　～NavMesh基礎～」**

　NavMeshの基本的な使い方を解説。
　　NavMeshを使うと、簡単にNPCキャラを作ることができる。
　　目的地を設定するだけで、障害物をよけながら自動で移動してくれる。

　　今回の体験内容は、
　　ローレシアの王子とサマルとリアの王子についてくる、
　　ムーンブルグの王女（犬）状況をNavMeshで再現。

　　＜作り方＞
　　１．地形と障害物を作る
　　２．NavMeshの設定
　　３．NPCの作成(NavMeshAgent設定)
　　４．スクリプトで⽬的地を設定

　　■まとめ
　　　NavMeshの生成もボタン一つでできるし、NavMeshAgentを使った移動も２，３行のスクリプトで済む。
　　　こんなに簡単に使えるならもっと早く勉強しとけばよかった。と思える機能の一つ。　　　
　　　

　　資料：[第26回_プレゼン資料(Unityはじめるよ～NavMesh基礎～).pdf](http://monolizm.com/sab/pdf/第26回_プレゼン資料(Unityはじめるよ～NavMesh基礎～).pdf)
　　プロジェクト一式：[NavMeshTest.zip](http://monolizm.com/sab/src/NavMeshTest.zip)

![IMG_5148.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/e2262864-0fc1-7b98-ca2f-64ef039da73a.jpeg)


　
　
<hr>
　

**・部員さんプレゼン「Gitでバージョン管理～ブランチ編～」**

　前々回に引き続き、SourceTreeを使ってのgitの使い方を解説。

　今回のプレゼン内容はブランチについて。　
　ブランチを使えば並行作業が可能。

　・ブランチの作成 (branch)
　　作業用のブランチを作成して、このブランチに対してコミット
　　します。他のブランチには一切影響を与えないので、自由に
　　コミットができます。

　・マージの適用 (merge)
　　現在のブランチに、別ブランチの変更を適用します。
　　差分だけが適用された形でコミットされます。


　複数人でばらばらに作業して、簡単にマージすることが可能ということ。
　ただし、同じファイルを複数人で編集ると競合 (コンフリクト)が発生するから注意が必要。

　　資料：[第26回_プレゼン資料 (Gitでバージョン管理～ブランチ編～).pdf](http://monolizm.com/sab/pdf/第26回_プレゼン資料 (Gitでバージョン管理～ブランチ編～).pdf)
　　プロジェクト一式：[GitWorld_20161008.zip](http://monolizm.com/sab/src/GitWorld_20161008.zip)

![IMG_7304.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/d9c6e311-af16-c4fe-4581-ea42d74dece1.jpeg)

　
<hr>
　
　　　　


**・部員さんプレゼン「自作ハードウェアでのVRコンテンツ制作経過発表」**

　現在製作途中の「自作ハードを使ったVRコンテンツ」の途中経過を発表しました。
　前回に比べて、さらに操作性が上がり、かなりこなれてきました。

　ハードウェアでの重心バランスの補正リセット機能により、
　体験者に合わせたバランスでゲームすることができ、これが操作性の向上に大きくつながっていました。
　また、手すり部分にボタンが搭載され、移動の微調整、視点の切り替えが行えるようになっていました。

　また、ソフトウェア側も、動く障害物や、ジャンプメーター、効果音等が増え、クオリティが上がっていました。

![IMG_7311.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/018ccf9b-a788-30a8-d1b9-6aae26d4d262.jpeg)


<hr>
macOS Sierra GAE/Go Standard Environment でデプロイする方法

環境 macOS Sierra GAE/Go Standard Environment

新しいSDKをインストール（Go1.6.3対応）

    gcloud components update
    gcloud components install app-engine-go

appcfg.py でデプロイする。

    appcfg.py update .

ドキュメント
https://cloud.google.com/appengine/docs/go/quickstart
[ Electron + React ] webpackするときの注意

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です👍 (2016.10.8現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

# 前回の...

前回同じような形で[[ Electron + React ] 5分で作るMarkdown Editor](http://qiita.com/konojunya/items/854e92ce5ee543edcc33)という記事を書いたんですが、この最後に

> 今後はexport機能とかをつけようと思います。

と、自分で書いています。

ではなぜこの開発の時はファイル保存ができなかったか。

この記事の時の開発方法は、

```js
"main": "app.js",
"scripts": {
  "start": "watchify -v -t babelify javascripts/app.js -o javascripts/bundle.js"
},
```

と書いて、タスクを回し続けていましたがこれでは少し設定が足りませんでした。

なので、webpackを使い開発する方法に変えています。

理由としては、electronのモジュール環境がwebとnode.jsがごちゃまぜになってしまうのを防ぐための設定を書かないといけないからです。

# jsxからfsが呼べない...

さて、ファイル保存をしようと思った時にまずファイル書き出しができていなかったら話になりません。

しかし、jsxからfsをrequireしても使えません。

こういう場合は__`commonjs2`__で呼び出してあげるという方法になります。

では、この読み込まないようにする設定___`externals`___と、それをどう読むのかを設定する___`libraryTarget`___のお話になってきます。

# webpackの設定をするヨ

今回の`webpack.config.js`の全貌は

```js
var path = require('path');

module.exports = {
	entry: "./javascripts/app.js", // どのjsファイルをルートにするか
	output: {
		path: __dirname + "/javascripts", // ファイルパス
		filename: "bundle.js", // ファイル名
		libraryTarget: 'commonjs2', // モジュールを呼ぶための方式を指定*1
	},
	module: {
		loaders: [ // loaderをカキカキ...
			{
				test: /\.jsx?$/,
				loader: "babel-loader",
				exclude: "/node_modules/",
				query: {
					presets: ["es2015","react"] // es2015とreact使うよと...
				}
			}
		]
	},
	externals: [ // こいつらは一つにしません！*2
      'electron',
      'fs'
    ],
	debug: true
};
```

この`*1`,`*2`としている部分をこれから説明していきます。

## externalsで読み込まないファイルを指定

まず`*2`の`externals`と書いている部分。

今回は、`electron`と`fs`があります。

この２つは、webpackで __１つのファイルへまとめあげないよ！__ という指定になります。

このままでは、`fs`や`electron`は読み込むことができません。

ここで読み込まない代わりにこっちからよみます！と指定するのが`libraryTarget`です。

## libraryTargetで読み込む方式を指定

`*1`の`libraryTarget`は、さっきの`externals`で回避をした分これで読み込みます！と指定する部分です。

今回は、commonjs2形式で読んであげたいので

```js
libraryTarget: 'commonjs2'
```

とします。

これで、jsxからでも`import fs from "fs"`を使うことができます。

詳しくは[公式ドキュメント](https://github.com/webpack/docs/wiki/configuration#outputlibrarytarget)をご覧ください！

# 最後に

HTMLとCSSとJavaScriptでデスクトップアプリを作れるElectronで、じゃんじゃんファイル操作やコマンドラインの操作もしていきましょう！

Twitter -> [@konojunya](https://twitter.com/konojunya)
Javascriptのcallとapplyを試す

Javascriptではcallとapplyという方法で他のオブジェクトに実装された関数を借りることができるらしいので早速ためしてみた。

OOPは、物凄く乱暴にいえば主語と動詞をグループ化する。Class Calculatorがaddという関数を持つみたいな感じで。主体と行いをセットにしていくことでシステムの構造化を行うが、Javascriptでは行いをそのままで主体を差し替える事ができる。

やり方としては

```
var Adder = function(inX,inY){
	this.x = inX;
	this.y = inY;
	this.add = function(){
		return this.x+this.y;
	};
};

var Borrower = function(inX,inY){
	this.x = inX;
	this.y = inY;
};

var borrower = new Borrower(3,4);
var adder = new Adder(5,6);
var result = adder.add.call(borrower);
```
みたいな感じ。.addという関数はAdderにしか定義されてないが.callファンクションを使うことにより、borrowerにその関数を実行させることができ、borrowerは自分の保持してるデータを使うので、resultは7になる。
db:reset と db:migrate:reset の違いについて、ささいなこと。

すでに、この話の記事は多くあるのですが、ちょっと補足をしたい気持ちになったので、投稿しておきます。本当に些細なことなのですが。


どっちのコマンドもdropしてるので、データは消えるの初期段階でしか使わないものだと思いますが。

## db:migrate:reset

`db:migrate:reset` は migrationを順に実行してくれます。

ですので、migration修正直後（まだ最新のmigration更新がschemaに反映されていない段階）で、リセットしたときには使えるコマンドかと思います。

## db:reset

一方、`db:reset` は

- `db:schema:load`
- `db:seed`

をしてくれます。スキーマファイルからDBを作成した後に、seedも打ってくれます。

ですので、migration更新がschemaに反映されている段階であれば、これは便利なコマンドの気がします。

以上、ささいなことでした。

初期の開発段階で、ガチャガチャデータやったりするときは `db:reset` 便利だなぁと思いました。
【Swift】switch式を実装

[前回](http://qiita.com/KentaKudo/items/f55aed9ea52e5ed28b97)はifでしたが、今回はswitchに挑戦してみました。

```swift
func `switch`<A: Equatable, B>(_ value: A, cases: [(A, () -> B)], default: @autoclosure () -> B) -> B {
    for `case` in cases {
        if `case`.0 ~= value {
            return `case`.1()
        }
    }
    return `default`()
}
```

使用例

```swift
enum A {
    case a, b, c
}

let result = `switch`(A.c,
                      cases: [(.a, { "AAAAA" }),
                              (.b, { "BBBBB" }),
                              (.c, { "CCCCC" })],
                      default: "")
// result = "CCCCC"
```

しかし、範囲を指定したswitchは書けません。。。

```swift
let result2 = `switch`(43,
                   cases: [(0 ... 100, { "0" }),
                           (101 ... 200, { "1" })],
                   default: { "0000000" })
// エラー
// error: cannot convert value of type '(CountableClosedRange<Int>, () -> _)'
// to expected element type '(_, () -> _)'
//                    cases: [(0 ... 100, { "0" }),
//                            ^~~~~~~~~~~~~~~~~~~~
```

また、default必須なのでなんともいまいちです。
いろいろ改善できそうなので、コメントお待ちしております🙇