OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドラインからAWS CUIで超高速にファイルを共有する

手元にあるファイルをとりあえず共有したいという状況があります。
でも、いちいちファインダーを開いてファイルをドラックアンドドロップして添付なんてやってられません。

s3にアップロードしてurlを共有する方針でやってみます。

## スクリーンショット

![s3up.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/7045fa46-4e33-0544-1060-067de48f494f.gif)

## 解説

以下のスクリプトにs3のバッケット名を入れて、パスの通ったところに置いて実行権限を付加してます。

```bash:s3up
#!/bin/sh
BACKET=<バケット名>
aws s3 cp $1 s3://$BACKET --acl public-read
echo https://s3-ap-northeast-1.amazonaws.com/$BACKET/$1 | pbcopy
```

ファイル名を引数にして匿名ユーザの閲覧のみを許可してファイルをアップロードし、そのリンクをクリップボードに追加します。
AWS CUIの環境が必要です。

- [AWS コマンドラインインターフェイス | AWS](https://aws.amazon.com/jp/cli/)

`pbcopy`コマンドを使っているため、mac環境のみ動作します。
ちなみにスクリーンショットのocコマンドは`alias oc='open -a "/Applications/Google Chrome.app"'`です。
.bat（バッチファイル）で、作業時間を記録する（タイムカード）

　一回叩くとその時間を開始時間として記録、もう一回叩くとその時間を終了時間として記録、時間の差分も記録するバッチ。

　記録するtxtファイルは、デフォルトではバッチファイルと同じディレクトリになってます。

　何かの作業のはじめに叩き、終わったらもっかい叩く。後から作業時間を見て鬱る。

#コード
```bat:kanri.bat
set nowtime=%time%& set nowdate=%date:/=%& (for /f "tokens=1,2,3" %%m in (kanri.txt) do set predate=%%m& set pretime=%%n& set previous=%%o) || set present=EXIT
if %previous% == EXIT echo %nowdate% %nowtime% START>>kanri.txt& exit
for /f "tokens=1-8 delims=:. " %%a in ("%pretime%%nowtime%") do set /a diff=(nowdate-predate)*8640000+(%%e0-%%a0)*36000+(1%%f-1%%b)*6000+(1%%g-1%%c)*100+1%%h-1%%d
set /a D1=%diff:~0,-2%0/10,D2=10%diff:~-2,2%%%100+100
echo %nowdate% %nowtime% EXIT (%D1%.%D2:~1,2%sec)>>kanri.txt
```

#出力
```text:kanri.txt
20160306  1:08:24.23 START
20160306  1:12:12.36 EXIT (228.13sec)
20160306  1:19:20.28 START
20160306  1:19:30.79 EXIT (10.51sec)
```
　開始から終了までの間に日をまたいでも、時間の差分はきちんと出るはずです。多分。
　月をまたいだ場合はお察し。

#タイムカードとして使う場合
PC起動時にSTART記録を行い、EXIT記録とともにシャットダウンする（勤怠管理？）
　方法
　　１：出力ファイルのパスをデスクトップかなんかに変える。（任意）
　　２：バッチの最後にシャットダウンコマンドを付け足す。
　　３：スタートアップにこのバッチを突っ込む。
　　４：スタートアップ内のバッチへのショートカットを作る。（任意）
　　５：シャットダウンしたいときに、そのショートカットを叩く。
　　　　（４を行わなかった場合、直接スタートアップ内のバッチを叩く）

　　　で、行けるはず…。
Pythonで自作モジュールを手軽に使う

# Target
自作モジュールを作ったがPATHが通せない人

# Main
自作モジュールを`/home/users/mymodule`に作ったとします。
この下に、`test.py`があるとします。

```test.py
def print_test():
    print("testだよーん")
```
---
自作モジュールを利用したい先で、下のような`import`をします

```main_python.py
import sys
sys.path.append("/home/users/mymodule")
import test
（略）
```

このプログラムの中でモジュールを呼び出すには、`test.print_test()`とするだけです。

自作モジュールを利用するたびに初めの3行が必要になります。
ですが、PYTHONPATHにつっこむより恐らく簡単で、確実。
pyenvなどなど環境によってモジュールの読み出しPATHが変わってしまうので地道且つ簡単な方法だと思います。
dein.vim 用に無いよりはマシな snippet を書いた


```
snippet tap
options head, indent
	" }}}3  ${1:plugin} {{{3
	
	if dein#tap('$1')
	
	  function! s:$1${2}_on_source() abort
	    ${4}
	  endfunction

	  autocmd vimrc User dein#source#$1 call s:$1${3}_on_source()

	endif
```
goji(unix domain socket)+supervisorでデーモン管理するときの注意点

## gojiでUnixドメインソケット起動

gojiでUnixドメインソケット対応したい場合、bind引数でファイルパス形式するだけで簡単に起動できます。簡単！

```
/path/to/gojiapp -bind /tmp/gojiapp.sock 
```

## supervisorから起動したい

デーモン化したいのでsupervisorから起動してみます。
ただし、以下のように単純にコンフィグを書くと動作自体はしますが
停止時ソケットファイルが消えずに残ってしまいます。  

```conf
[program:gojiapp]
command=/path/to/gojiapp -bind /tmp/gojiapp.sock
(snip...)
```

この時、シグナルを`SIGINT`で停止してグレースフルシャットダウンしてあげるときちんとソケットファイルもお掃除してくれます。  

```conf
[program:gojiapp]
command=/path/to/gojiapp -bind /tmp/gojiapp.sock
stopsignal=INT
(snip...)
```

goji、フレームワークとして使いやすいだけではなくこういう細かいところも面倒見てくれるのが良いですね :)
AndroidにAdMobを導入

```python:build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.google.android.gms:play-services:8.4.0'
}

```

```java:MainActivity.java


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AdView mAdView = (AdView) findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
    }
}

```

```xml:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="****.MainActivity">

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
    </com.google.android.gms.ads.AdView>
</RelativeLayout>

```


```xml:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.***.myapplication">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <activity android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

    </application>

</manifest>


```
LVSの設定方法4(補足説明)


ロードバランサーの方法にはNat方式とDSR方式がある

###Nat方式
セグメントが違う場合はうまくいく
web1のdefault gwをLBのIPに設定する必要がある

![スクリーンショット 2016-03-05 23.37.16.png](https://qiita-image-store.s3.amazonaws.com/0/39073/a1b21f51-00ef-d9ed-5362-a46c7f345bdf.png "スクリーンショット 2016-03-05 23.37.16.png")

###Nat方式
**セグメントが同じ場合はうまくいかない**
Hostから見た場合に、sourceとdestinationがrequestした時と、responseの時とで値が違う
request時のresponse時に、sourceとdestinationを入れ替えたら、同じ値にならないと
通信は成り立たない。

request

| source | destination |
|:-----------:|:------------:|
| 192.168.43.60 | 192.168.43.200 |

response

| source | destination |
|:-----------:|:------------:|
| 192.168.43.63 | 192.168.43.60 |


![スクリーンショット 2016-03-05 23.39.46.png](https://qiita-image-store.s3.amazonaws.com/0/39073/7c82bdc1-f8f1-23b2-3b7f-586d761c89ca.png "スクリーンショット 2016-03-05 23.39.46.png")

###DSR方式
今回、設定した方式
webのループバックアドレスにLBのIPを設定する必要がある
request

| source | destination |
|:-----------:|:------------:|
| 192.168.43.60 | 192.168.43.200 |

response

| source | destination |
|:-----------:|:------------:|
| 192.168.43.200 | 192.168.43.60 |


![スクリーンショット 2016-03-05 23.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/39073/4aae93df-392e-70c3-6a6f-2008e011baeb.png "スクリーンショット 2016-03-05 23.42.31.png")
LVSの設定方法3(Test)


###in Web1

```Bash
ssh web1
```

```Bash
sudo vi /var/www/html/test.html
```

```/var/www/html/test.html
<html>
<body>
<h1>Hello web1</h1>
</body>
</html>
```

###in Web2

```Bash
ssh web2
```

```Bash
sudo vi /var/www/html/test.html
```

```/var/www/html/test.html
<html>
<body>
<h1>Hello web2</h1>
</body>
</html>
```

###in Host
バランシングされていることを確認する

You should try twice

```Bash
curl -v 192.168.43.200/test.html
```

![スクリーンショット 2016-03-05 23.32.57.png](https://qiita-image-store.s3.amazonaws.com/0/39073/a88aa40e-3919-7838-088c-2dac855efe1a.png "スクリーンショット 2016-03-05 23.32.57.png")

###lvs1をshutdownしても、動作することを確認

in lvs1

```Bash
ssh lvs1
```

```Bash
sudo /sbin/shutdown -h now
```

in Host

```Bash
curl -v 192.168.43.200/test.html
```
[作業しながら随時更新] RubyMine 使い始めたので，細かいところまでメモ

RubyMine の試用版 (30日限定) を入れてみたので，使ってみる．
極力，何か作業をしようとしたら「RubyMine の機能にあるはず」と疑うようにして，出来ないかやってみる．
出来ること，出来るようになりたいことを順次列挙していく．

# 出来たこと
## まず Search Everywhere から探す
JetBrains 系の IDE は，Shift 二度打ちで全件検索ができる．やりたいアクションもだいたい見つかる．
\# たまに反応してくれないのはなんでだろう…??
## Rails のプロセスを始める
プロジェクトペインでプロジェクトのルートを選んで，メニューから Run を選ぶ．もしくは ⌥+^+R.

## Bundler から新しい Gem を追加する．
Gemfile を編集すると，インストールするか確認するポップアップが表示される．
一度消してしまっても，Gemfile 上で ⌥+Enter を押せば，クイックフィックス上からインストールを選べる．

## rails generate ... したい
⌘+⌥+G で Generator ダイアログが出てくる．ちょっとくせがあるのが，何を作るのかを一度訊かれた後に OK を押して，次のダイアログで引数を指定する．
そのまま Generate されたファイルが開かれるので便利．

## Git 操作関連
@yusuke さんからも「Commit だけでも使ってみると良いかも」と言ってもらっているので，上手く使いこなせないか格闘中．
⌘+Shift+A で Action 一覧を出して，Commit Changes を探しだすのが一番早いかな．

## Rspec を回す
アプリプロセス立ち上げと同じで，Run を実行するとメニューの中に rspec もいるので，それを選ぶ．

## デバッグ
Ruby のスクリプトもさることながら，**haml ファイルの中も行けたのにはびっくり！**
### ブレークポイントを張る
⌘ + F8 で張る．
### 式評価ウィンドウを開く
⌥ + F8.
基本的にデバッグのたぐいは F8 が多いね．


# 出来るようにしたいこと
## テストを常に回す
guard でずっと見守ってるみたいなやつ．
自分は guard-livereload とかも入れているので，それも動かしたい．
## 間違いなく ⌥ を押せるようになる
職場では Windows を使っている，家の Mac のキーボードは US 配列で Caps と Ctrl を入れ替えているので，間違えると Caps Lock がかかってしまう…
## この投稿の整理
出来たことをただ並べているので，そのうちカテゴリ分けする．
Google Maps APIを使う

#概要
Google Maps APIを使う手順を示す


## APIキーを取得する

1.  Google MAP APIホームへアクセスする 
 https://developers.google.com/maps/?hl=ja 


1.  対象のプラットフォームを選択する(今回はウェブを選択する)

1. 「ウェブ向けGoogle Map API」が表示されるので、 「キーを取得」をクリックする

1. 「Google Maps ウェブAPをアクティベートする」ボックスが表示されるので、 「続ける」をクリックする

1. 「Google Developers Console」が表示されるので、「新しいプロジェクトを作成」を選択し(既定値)「続行」をクリックする

1. APIキーが生成される



## サンプルページからGoogle Mapページ(HTML)を作成する

1. 「ウェブ向けGoogle Map API」を表示し、「Google Maps JavaScript API」をクリックする 
 https://developers.google.com/maps/web/?hl=ja

1. 「Google Maps JavaScript API」が表示されるので、「サンプル」をクリックする。

1. サンプルの一覧が表示されるので、任意のサンプルをクリックする。(今回はSimple mapを選択する)

1. サンプルが表示されるので、ページ中央の「JAVASCRIPT + HTML」をクリックし、ソースコードを表示させる

1. 表示されたコードを任意のテキストエディタに貼り付け、任意の名前を付け保存する(今回はsample.htmlとする)

1. サンプルコードに下記の修正を加える

- 「YOUR_API_KEY」の部分を、生成したAPIキーで置き換える
- 「lat」を表示したい緯度に修正する(正の値は北緯、負の値は南緯)
- 「lng」を表示したい経度に修正する(正の値は東経、負の値は西経)

```html:sample.html
<!DOCTYPE html>
<html>
  <head>
    <title>Simple Map</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      var map;
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
        });
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    async defer></script>
  </body>
</html>
```
アンシブる？って言いたい〜構成管理ツール「Ansible」セットアップ編〜

今更感はあるのだけど、ドヤ顏で「とりあえずアンシブる?」、「アンシブらないの？」とか言いたいので勉強する

## 環境
* 管理サーバー
 * OS : CentOS 6.6 64bit Plain (CentOS 64bit)
 * Ansibleをインストールするサーバー

* 管理対象サーバー
 * OS : CentOS 7.1 64bit Plain (CentOS 64bit) 
  * Ansibleを使って構築される（する）サーバー
  * クラウドサービスで払い出したばかりで何もしていないです
 

## 管理サーバーのセットアップ
### [Ansible](http://docs.ansible.com/) のインストール
* epelリポジトリが追加済みであればyumでインストールできます
 * `yum install ansible`で完了
  * バージョン：1.9.4-1.el6（2016/03/05現在）

### 公開鍵認証の設定
利用している[クラウドサービス](http://cloud.nifty.com/)の仕様で、sshは公開鍵認証でのみ許可されているので管理サーバーから管理対象サーバーに接続できる様に設定しています

1. 鍵の配置ディレクトリの作成
	* `mkdir ~/.ssh/identityFile`
1. 鍵の配置ディレクトリのパーミッション変更
	* `chmod 700 ~/.ssh/identityFile`
1. 秘密鍵の配置
	* 例として以下に配置
		* `~/.ssh/identityFile/×××.pem`
1. 秘密鍵のパーミッション変更
	* `chmod 400 ~/.ssh/identityFile/×××.pem`

### .ssh/configファイルの作成
管理サーバーから管理対象サーバーに簡単にsshできる様に`~/.ssh/config`を作成
Ansibleは管理対象サーバーにsshで接続して構成設定を流し込んでいくのでエイリアスは設定したほうが楽

```lang:config
Host hogeee #接続ホストのエイリアス（あだ名）
	Hostname ×××.×××.×××.××× #管理対象サーバーのIP
	Port 22 # sshのポート(要変更)
	User root # ログインユーザ
	IdentityFile ~/.ssh/identityFile/×××.pem # 秘密鍵のPATH
```

* パーミッションを600に変更
	* `chmod 600 .ssh/config`

* 管理サーバーから`ssh hogeee`で接続できればOK


### [イベントリファイル](http://docs.ansible.com/ansible/intro_inventory.html)の作成
* Ansibleでは管理対象のサーバーをインベントリファイルに記載する必要があります
* デフォルトでは実行時に`/etc/ansible/hosts`を読み込む
* オプションで読み込むイベントリファイルを指定することができるので、今回はホームディレクトリ配下にinventoryファイルを作成してしまう

```sh
mkdir ~/ansible
echo hogeee > ~/ansible/inventory
```

### ansibleで.ssh/configを有効にする
* ansible.cfgでAnsibleがssh接続する際に作成した`~/.ssh/config`をロードする様に明記する
 * `/etc/ansible/ansible.cfg`の`[ssh_connection]`の部分に以下を追加
 * `~/.ssh/config`と書くとansibleの実行時にユーザが切り替わるらしく『No such file or directory』と言われるのでフルPATHで指定


```lang:ansible.cfg
[ssh_connection]
ssh_args = -F /hoge/hoge/.ssh/config
```

この設定を忘れると`$ ansible -i ~/ansible/inventory hogeee -m ping` とかやっても「No hosts matched」となります。
 

## 管理対象サーバーのセットアップ
* 特になし！（強いて言うならFWの確認くらい？Pythonもデフォルトで入っているし。）
* [Chef](https://www.chef.io/chef/)のchef-clientみたいなものも入れる必要もない！

## 確認
### テスト方法

* Ansibleの[PingModule](http://docs.ansible.com/ansible/ping_module.html)を使って確認する
 * PingModuleは管理対象ホストに接続し、Pythonが利用可能か確認し可能であれば`pong`を返してくれるテスト用モジュール


### アンシブる
* 管理サーバーでansibleを実行して管理対象サーバーと疎通確認
	* -iオプションでイベントリファイルを指定する
	* -mオプションで利用モジュールを指定
	* 鍵認証のPWが聞かれるので入力（結構しつこく聞かれるのでのちのち簡略化させる）

```sh
ansible -i ~/ansible/inventory hogeee -m ping

hogeee | success >> {
    "changed": false,
    "ping": "pong"
}
```

* 上記の様に返却されればOK。セットアップ完了。


次回、本格的にアンシブる

## 参考
* [Documentation](http://docs.ansible.com/)
* [Inventory-File](https://github.com/yteraoka/ansible-tutorial/wiki/Inventory-File)
* [Ansible Tutorial](http://yteraoka.github.io/ansible-tutorial/)
* [ansible.cnfでssh_configを設定する](http://dev.classmethod.jp/server-side/ansible/enable_ssh_conf_using_via_ansible-cnf/)
LVSの設定方法1


###作りたいサーバー構成のイメージ

![スクリーンショット 2016-03-05 22.47.14.png](https://qiita-image-store.s3.amazonaws.com/0/39073/332d7091-87dc-bb4b-635c-a793988a401b.png "スクリーンショット 2016-03-05 22.47.14.png")

```Bash
mkdir lvs_lesson
```

```Bash
cd lvs_lesson
```

```Bash
vagrant box add "centos_6.6" https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
```

```Bash
vagrant init
```

```Bash
vi Vagrantfile
```

```Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "256"
  end
 
  config.vm.define "host" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.60"
  end
 
  config.vm.define "lvs1" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "lvs1"
    node.vm.network :private_network, ip: "192.168.43.61"
  end
 
  config.vm.define "lvs2" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "lvs2"
    node.vm.network :private_network, ip: "192.168.43.62"
  end
 
  config.vm.define "web1" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "web1"
    node.vm.network :private_network, ip: "192.168.43.63"
  end
 
  config.vm.define "web2" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "web2"
    node.vm.network :private_network, ip: "192.168.43.64"
  end
 
end
```

```Bash
vagrant up
```

```Bash
vagrant status
```

![スクリーンショット 2016-03-04 14.56.26.png](https://qiita-image-store.s3.amazonaws.com/0/39073/925665aa-d33f-0e5a-ea88-f341c8589fbf.png "スクリーンショット 2016-03-04 14.56.26.png")

###sshの設定

```Bash
vagrant ssh host
```

```Bash
vi ~/.ssh/config
```

```config
Host lvs1
  HostName 192.168.43.61
Host lvs2
  HostName 192.168.43.62
Host web1
  HostName 192.168.43.63
Host web2
  HostName 192.168.43.64
```

```Bash
chmod 600 ~/.ssh/config
```

```Bash
ssh-keygen -t rsa
```

```Bash
ssh-copy-id lvs1
#password is vagrant
```

```Bash
ssh-copy-id lvs2
```

```Bash
ssh-copy-id web1
```

```Bash
ssh-copy-id web2
```

### Install Ansible

```Bash
wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

```Bash
sudo rpm -Uvh epel-release-6-8.noarch.rpm
```

```Bash
sudo yum install -y ansible
```

```Bash
vi hosts
```

```hosts
[lvs]
192.168.43.61
192.168.43.62
 
[web]
192.168.43.63
192.168.43.64
```

```Bash
ansible all -i hosts -m ping
```

![スクリーンショット 2016-03-04 15.41.28.png](https://qiita-image-store.s3.amazonaws.com/0/39073/0d8aaec8-bdee-94eb-f8a7-f92f1fda0dd4.png "スクリーンショット 2016-03-04 15.41.28.png")
Kotlinのdata classを安全に使いたい

Kotlinだと先頭に`data`を付けるだけで値を保持するためのクラスが作れる。

```kotlin
data class User(val name: String, val age: Int)
```

Kotlin / Javaの両方から扱える安全な`data class`を作りたい。

data class (最初の案)
----
```kotlin
data class SafetyData(
        val string: String = "",
        val list: List<String>? = null
)
```

Stringには初期値を設定して、ListはNullableにした。
結論 = Javaから使った時に危険!!

**Kotlinから使う時**

```kotlin
// 引数なしでインスタンス生成
val safetyData = SafetyData()

// Stringへのアクセス
// 初期値がセットされているので安全
val stringLength = safetyData.string.length

// Listへのアクセス1
// ちょっと長いけど安全
val listSize1 = if (safetyData.list != null) safetyData.list.orEmpty().size else -1

// Listへのアクセス2
// JavaのList<String>にキャストしてアクセスも可能だけどやっぱり長い
val listSize2 = if (safetyData.list != null) (safetyData.list as List<String>).size else -1

// Listへのアクセス3
// 短縮形 普通に書く時はこれ
val listSize3 = safetyData.list?.size ?: -1

// Listへのアクセス(コンパイルエラー)
// 以下のような書き方をすると.sizeの部分でコンパイルエラーにしてくれるので安全
val listSizeNg1 = safetyData.list.size
val listSizeNg2 = if (safetyData.list != null) safetyData.list.size else -1

```

**Javaから使う時**

```java
SafetyData safetyData = new SafetyData();

// Stringへのアクセス
// 初期値がセットされているので安全
int stringLength = safetyData.getString().length();

// Listへのアクセス(NPEが発生)
// Javaから使う時はコンパイルエラーにならない。危険!!
int listSize = safetyData.getList().size();
```

data class (修正版)
----

```kotlin
data class SafetyData(
        val string: String = "",
        val list: List<String> = listOf()
)
```

ListはNullableをやめて空の初期値を入れた。
当たり前だけど、初期値が入っているのでJavaから使ってもNPEは発生しない。

結論
----
Javaからも使いたい場合はNullableにせず、nullではない初期値を入れておくのが安全。
（´-`）.｡oO（でも、Nullableを使ったほうがKotlinらしく書ける。。。



参考
----
* https://kotlinlang.org/docs/reference/data-classes.html
uikitでプログレスバーとswitcherを連携させて表示切り替わりごとにプログレスバーをアニメーションさせる

# 概要
CSSフレームワークUIKitのコンポーネント「progress」と「switcher」を連携してみました。
現在の表示場所によってprogressbarがアニメーションします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/112521/51e39ecc-8933-0a9c-7884-87f261cee54e.png)


主に、アンケート等のUIにおいてユーザーが今どれくらい回答が進んだかみるときに使えそうですかね。
デモはPlunkerに挙げてあります。
https://plnkr.co/edit/FiulXGe13pWd9AGBeABw?p=preview

# ソースコード
HTML

```html
<!DOCTYPE html>
<html>
  <head>
   <script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
   <link rel="stylesheet" href="style.css">
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.25.0/css/uikit.min.css" />
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.25.0/css/components/dotnav.min.css">
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.25.0/css/components/progress.min.css">

  </head>
  <body>
   <div class="uk-panel uk-panel-box uk-panel-box-secondary">
    <h1>Progress bar Animation</h1>
    <div id="progressbar" class="uk-progress uk-progress-success">
      <div class="uk-progress-bar" style="width: 0%;">0%</div>
    </div>
    <ul id="content" class="uk-switcher">
      <li class="uk-active"><h1>1</h1></li>
      <li><h1>2</h1></li>
      <li><h1>3</h1></li>
      <li><h1>4</h1></li>
      <li><h1>5</h1></li>
    </ul>
    <ul class="uk-dotnav uk-flex-center small" data-uk-switcher="{connect:'#content'}">
      <li class="uk-active"><a href="">...</a></li>
      <li><a href="">...</a></li>
      <li><a href="">...</a></li>
      <li><a href="">...</a></li>
      <li><a href="">...</a></li>
    </ul>
   </div>
   <script src="script.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.25.0/js/uikit.min.js"></script>
  </body>
</html>
```
JavasScript

```js
var bar = $("#progressbar").find(".uk-progress-bar");
var list = $("#content").find("li").length;
$('[data-uk-switcher]').on('show.uk.switcher', function(event, area){
  var itemActive = $("#content").find("li.uk-active").index() + 1;
  var percent = Math.floor(itemActive / list * 100);
  bar.css("width", percent+"%").text(percent+"%");
});
```

ざっくり説明しますと、UIKitが提供しているswitcherは表示の切り替わりに対するコールバックが実装されています。
ですのでコールバックを受け取った際に、リスト上のuk-activeの位置からプログレスバーのテキストとCSSの書き換え処理を行っています。
ちなみにJavaScriptのコードの4行目にマジックナンバー(+1してるとこ)を使用していますが、これはindex()で返却値が0始まりのため・・・仕方なかったのだ・・・

# 参考までに
UIKitの公式サイトは以下に、
http://getuikit.com/

iOSアプリのuikitと名前がかぶっておりググラビリティが悪いですが、すごく良いCSSフレームワークなんでこれからもっともっと日本語の情報が増えるとうれしいです。
Swiftはじめたい...その２３ reduceふたたび


# その‥を進めてきたらreduceもおさらいしたくなりました。

+ その３でもさらっと試したんですが、コピペで動作確認しただけでしたので。

## 与えられた配列の値に10を足し直した配列を、元の配列に付け加えます。

+ 上のタイトルだとよくわかりませんかね？？
+ ↓↓↓のような動きです。

### arr.reduce(T initial, combine: (T, Int) throws -> T) な形

```swift
var arr = [1, 2, 3, 0, 4, 5]
let initial = [0, 1, 2]

print( arr.reduce( initial , combine : {
            (var x:[Int],y:Int) -> [Int] in
                x.append(10 + y)
                return x
        }
    )
)
```

+ 結果は```[0, 1, 2, 11, 12, 13, 10, 14, 15]```となります。
+ 動作としては、初期の値、```[0, 1, 2]```に、```[1, 2, 3, 0, 4, 5]```の各要素に10足した値を追加するということでした。

### reduce(T initial){(T, Int) throws -> T} な形

+ (, combine:)だったのが、(){}になっても書けました。

```swift
print( arr.reduce( initial ) {
        ( var x:[Int],y:Int) -> [Int] in
            x.append(10 + y)
            return x
    }
)
```

+ 答えは同じです。

### 関数を外出し

+ 関数を別に定義しておけば reduceの中はさっぱりしました。

```swift
let append = {
    (var x:[Int],y:Int) -> [Int] in
        x.append(10 + y)
        return x
}
print( arr.reduce( initial , combine : append) )
```

### mapだと...

+ こういう処理自体はmapでもいいんじゃね？という話は置いときまして...

```swift
print(initial + arr.map({ 10 + $0 })) // [0, 1, 2, 11, 12, 13, 10, 14, 15]
```

## まとめ

+ なんとなくコピペで済ませてきましたが、書き方がわかってきたような気がします。
継続的開発に向けたView EditorとしてのPlayground

[View EditorとしてのPlayground](http://qiita.com/uny/items/ba73e06718079396c9a7)の続編です。
前回の課題として、Playgroundで書き上げたViewをアプリケーションプロジェクトにコピペする作業が含まれていて、継続的に修正していくには現実味がないことがありました。今回はその宿題を踏まえて、コピペの発生しない、HTMLを書くような感覚でPlaygroundを活用する流れについて説明します。
https://github.com/uny/LayoutPlayground

# 手順
おおよそ前回の通りで、一部手順が増えます。

1. Workspace作成
2. Application Project作成
3. Application Framework作成：AppDelegateやリソース以外はここに入れていく感じで。
4. SnapKitインストール：[Adding frameworks to unit tests or a framework](https://github.com/Carthage/Carthage#adding-frameworks-to-unit-tests-or-a-framework)の"Copy Files" build phaseも追加しないとPlayground側が実行できないので注意。
5. Frameworkをビルド → Playgroundを実行でビューの変更が即座に反映される。

![LayoutPlayground.gif](https://qiita-image-store.s3.amazonaws.com/0/76670/b33519f3-6f74-e468-b0b2-f6b3cd01ec19.gif)

# まとめ
Frameworkをビルドしたらすぐに反映、とはいかないですが、コピペからはかなり進歩しました。構成は、Carthage/CarthageKitのような関係が生まれています。呼び出す側とその他大勢で、これはこれで整理された形なのかも。あと、Xcode7.3からPlaygroundがインタラクティブになるので、より活用の幅が広がりそう。Storyboardやっぱりいらないね。各subviewsの整理の仕方をどうするかを引き続き検討します。
とりあえずCakePHP3を動かしてみたメモ

#1.Composerインストール
```
cd ~
curl -s https://getcomposer.org/installer | php
```

#2.CakePHPインストール（というかプロジェクト用にDL）
```
php composer.phar create-project --prefer-dist cakephp/app my_app_name_path
```

#3.Apacheの設定を適当に
公開するディレクトリをmy_app_name_pathに設定する。
my_app_name_pathの例：
```/var/www/html``` とか
```/home/ubuntu/my_app```
ということ

#4.アクセスしてみる
CakePHPの最初のページが出る

#その他
2.の前に以下が必要（設定・インストール済みなら問題なし）

```sudo aptitude install php5-intl```

ついでにこれも
```sudo a2enmod rewrite```


###以上、Ubuntu 14.04/PHP5.5.9にて確認
[Survey]SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <1MB model size

# Purpose & Motivation
## Purpose
**DNN**モデルを性能を落とさずにできるだけ小さくしようというのがこの論文の目的です。

## Motivation
**Small DNN Architecture**が必要になるSceneとして３つ考えられます。
1. **分散学習**
　 Server間における**Overhead**を小さくするため
2. **新しいModelを既存のNetworkにUpdate**
　 自動運転Carなど既存の製品に新しいModelを取り込むときの**Overhead**を小さくするため
3. **FPGAなどのH/Wに実装する**
　 H/W Resourceに限りがあるため(e.g. Xilinx Vertex-7 FPGA 最大**8.5MB**)

# Strategy
Smaller DNNにするための3つの戦略

## Strategy 1. 3x3 filterを1x1 filterにする
Parameterが**1/9**になる

## Strategy 2. 3x3 filterのInput Channel数を減らす

Parameter数は$(input channel数)\times(filter数)\times3\times3$なので、input chennel数が１つ減るだけでParameter数が$(filter数)]times9$減る。

## Strategy 3. Downsamplingは後ろの方でする
**Activation mapサイズ**は、入力のサイズと**Downsampling**の仕方によって決まります。
入力に近い場所でDownsamplingすると、ほとんどのLayerのActivation mapのサイズが小さくなります。
逆に、Downsamplingを後ろの方でする、ほとんどのLayerのActivation mapのサイズが大きくなります。
Downsamplingを遅らせて、大きいActivation mapの方が**Classification精度**が高い傾向にあります。


**Strategy 1、Strategy 2**はParameter数を減らすための戦略で、**Strategy 3**は、精度を保つための戦略です。

# Fire Module
下図の**Fire Module**を**Convolutional Layer**の代わりに使います。
この構造は、Strategy 1, 2から来ています。
Strategy 1よりParamter数を減らすために1x1フィルタを使っています。
次にStrategy 2より、入力Channel数が減るように、最初に1x1フィルタ通しています。
![範囲を選択_104.png](https://qiita-image-store.s3.amazonaws.com/0/100523/824b7786-70ea-04d3-13a9-03df4182056b.png)

# SqueezeNet architecture
**SqueezeNet**の構造は、以下の通りです。最初と最後にConvolutional layer(conv1, conv10)、その間のLayerはfire module(fire2-9)になっています。Strategy 3より、max-poolingは、conv1, fire4, fire8, conv10の後に入っています。

その他は以下の通り
・出力サイズが同じになるように3x3filterは**zero padding**する
・**Squeeze**と**Expand**の間に**ReLU**を入れる
・**Dropout** 50%
・詳細は[Github](https://github.com/DeepScale/SqueezeNet/tree/master/SqueezeNet_v1.0)参照

![範囲を選択_105.png](https://qiita-image-store.s3.amazonaws.com/0/100523/5e984e43-9f9f-7e08-3744-3b933947384e.png)

![範囲を選択_106.png](https://qiita-image-store.s3.amazonaws.com/0/100523/85381a68-1842-6d2e-e7f2-ced494c6a978.png)

# Evaluation
![範囲を選択_107.png](https://qiita-image-store.s3.amazonaws.com/0/100523/81274bf3-81e0-0bcb-b0ac-24daab27b682.png)

Data typeが32bit で1/50、Data typeを6bitにすると1/461で性能はほとんど変わっていない。

# 最後に
結局は、1x1を二股に分けて1x1と3x3に通して結合したということのようです。
それを一つのモジュール（fire module)と言っているようです。
こんなに減らしても性能が保たれているということは、解こうとしている問題に対してもともとの性能がOverspecということでしょうか？
1bitというのがあるくらいなので、このくらいは大丈夫ということなのかもしれないです。
ensembleにしたり、distributedにしたりするにはparameter数は少ない方がいいですね。
太陽光を当てると、ゆらゆら揺れる100円ショップのおもちゃの中身


前からどう動いているんだろうと思ってたので、バラしやすそうだった象を分解してみた。

![20160305-DSC04873.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/8781892b-34ad-0245-8f9c-1d5b6a2147f3.jpeg "20160305-DSC04873.jpg")

思った通り簡単にばらせた。

![20160305-DSC04876.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/6099efc1-7237-a855-d632-a621092c67ef.jpeg "20160305-DSC04876.jpg")

メカ部は振り子になっていて、磁石が左右に動くことで耳と鼻がうまく動く仕組みに。

![20160305-DSC04874.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/283da016-7ca0-072d-11bf-f07980b5cfd7.jpeg "20160305-DSC04874.jpg")

ソーラーパネルが 1.5V ぐらいの電圧を出力し、これをコンデンサでためて、3秒に一度ぐらい IC から出力して、コイルに磁力を発生させてる。しかしコイルの線、髪の毛ぐらい細い線だなぁ。

![zousan_ac.png](https://qiita-image-store.s3.amazonaws.com/0/5330/6f4bf7d8-138e-0741-7ac0-35fc64ea8d71.png "zousan_ac.png")

ICからの出力のオシロキャプチャ。光を強く当てるともっと大きい出力になる。ぱっと見交流っぽいんだけど、振り子なので正負どちらか片方の出力でもうまくいく(短期間に発振しても良くないというか、振り子が打ち消し合うので良くないと思う)ので、最初の -1V の印加だけが動かすのに必要なのかな。

![20160305-DSC04877.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/cc0a5b4a-d8a9-861e-0f67-edbcd7f9919b.jpeg "20160305-DSC04877.jpg")

適当に引っ張り出してマイコンから 3.3V(HIGH)/0V(LOW) と 0V(LOW)/3.3V(HIGH) を0.n秒〜2秒ぐらいでスワップさせて適当に印加して↑や↓を表現させてみた。

<blockquote class="instagram-media" data-instgrm-captioned data-instgrm-version="6" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:8px;"> <div style=" background:#F8F8F8; line-height:0; margin-top:40px; padding:50.0% 0; text-align:center; width:100%;"> <div style=" background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAAGFBMVEUiIiI9PT0eHh4gIB4hIBkcHBwcHBwcHBydr+JQAAAACHRSTlMABA4YHyQsM5jtaMwAAADfSURBVDjL7ZVBEgMhCAQBAf//42xcNbpAqakcM0ftUmFAAIBE81IqBJdS3lS6zs3bIpB9WED3YYXFPmHRfT8sgyrCP1x8uEUxLMzNWElFOYCV6mHWWwMzdPEKHlhLw7NWJqkHc4uIZphavDzA2JPzUDsBZziNae2S6owH8xPmX8G7zzgKEOPUoYHvGz1TBCxMkd3kwNVbU0gKHkx+iZILf77IofhrY1nYFnB/lQPb79drWOyJVa/DAvg9B/rLB4cC+Nqgdz/TvBbBnr6GBReqn/nRmDgaQEej7WhonozjF+Y2I/fZou/qAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;"></div></div> <p style=" margin:8px 0 0 0; padding:0 4px;"> <a href="https://www.instagram.com/p/BCkp6iwmuCu/" style=" color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;" target="_blank">象の制御が出来るように〜</a></p> <p style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;">セコンさん(@hotchpotch2nd)が投稿した動画 - <time style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px;" datetime="2016-03-05T13:17:57+00:00">2016  3月 5 5:17午前 PST</time></p></div></blockquote>
<script async defer src="//platform.instagram.com/en_US/embeds.js"></script>

楽しい！
JAX-RS(Jersey)でyyyy-MM-dd形式の日付パラメータをjava.util.Dateで受け取る

以下のようなProviderを作成する。

```java
package com.example.helloworld;

import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Jerseyでyyyy-MM-dd形式をDateとして受け取るコンバータ
 */
@Provider
public class DateParamConverterProvider implements ParamConverterProvider {

    @Override
    public <T> ParamConverter<T> getConverter(Class<T> type, Type genericType, Annotation[] annotations) {
        if (type.equals(Date.class)) {
            return (ParamConverter<T>) new DateParamConverter();
        } else {
            return null;
        }

    }

    private static class DateParamConverter implements ParamConverter<Date> {
        @Override
        public Date fromString(String value) {
            if (value == null) {
                return null;
            }
            try {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                // 2016-01-32が2016-02-01と扱われないように
                simpleDateFormat.setLenient(false);
                return simpleDateFormat.parse(value);
            } catch (ParseException e) {
                throw new RuntimeException("parse失敗: " + value, e);
            }
        }

        @Override
        public String toString(Date value) {
            return value.toString();
        }

    }
}
```

Dropwizardの場合は、以下のような感じでApplicationで上記Providerを登録。

```java
public class HelloWorldApplication extends Application<HelloWorldConfiguration> {

.
.
.
    @Override
    public void run(HelloWorldConfiguration configuration, Environment environment) {
    
        environment.jersey().register(DateParamConverterProvider.class);
.
.
.
```

しかし、Dropwizardには io.dropwizard.jersey.params.DateTimeParam が用意されているので日付に限ってはそちらを使った方が良い。Optionalにラップ出来るみたいだし。
message station > v0.32 > getコマンド変更 / storageコマンド追加 / フレーム追加

http://qiita.com/7of9/items/35072f39fee9c2656898
の続き

## code v0.32

[github](https://github.com/yasokada/esp8266_160220_BYOP/releases/tag/v0.32)

v0.32までに以下の処理を追加、変更した

- getコマンド時にメッセージのsenderを取得するように変更
- storageコマンドを追加
  - 現在のメッセージ保持数と上限を表示

[PiZero > Communication protocol v0.11 > PiZero / ESP8266](http://qiita.com/7of9/items/a62a6f21b00923fe3658)


あと、フレームを作成 (versionとは無関係)

![DSC_0140.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/cf9e4ce0-0402-0826-2426-af9ea4d64b08.jpeg)


材料は以下

- 割り箸 4膳
  - 千日前道具屋筋 Aプライス 100膳 307円 (業務用 御割箸)
- 10年前の土産 (アッサム)
  - レターケースに装飾がほどこされたもの(1枚 / 10枚セット)

彫刻刀を用いて割り箸に相欠き（あいがき）という工法を試してある程度固定出来る状態にしてから木工ボンドで接着。
[google image](https://www.google.co.jp/search?q=%E7%9B%B8%E6%AC%A0%E3%81%8D&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiD3c2m0qnLAhXDnqYKHcIbBcoQ_AUIBygB&biw=1326&bih=1088)

数年前、様々な回路の外枠を割り箸で作っている人のブログを見たことがあり、真似した。
その人はグルーガンで接着していたかと思う。

本当は回路を固定する何かとして試そうとしたが、そこまで達していない。

![DSC_0136.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/e7199b07-e35a-b08e-ae79-82ea54bd55ca.jpeg)
electron+babelのテンプレートを作ってみた その2(CSS周り)

その１でjs周りの設定をしたので今回はCSS周りを設定する
http://qiita.com/umema4/items/1250ad632204acbd684c

github
https://github.com/umema4/electron-babel6

#どういう構成にするか
- bootstrapは使いたい
- cssnextも試したい

bootstrap5からはpostCSSに代わるらしいので基本方針はpostCSSを中心すえる
フロントにかかわる部分は基本webpackでまとめるのでpostcss-loaderを利用

jsファイルがあまりにでかい様であれば分割を考える

bootrap4はsassなのでbootstrapはgulp-sassでcssに変換。bootstrapはデフォルトで読み込ませるのでwebpackではまとめない

部分的に上書きする場合は必要なモジュールでstyle-loader/css-loaderでrequireする

# bootstrap v4
flexboxを使いたいのでnode_modules/bootstrap/scssにあるboostrap-flexboxと同様のことをsrc/scssで行う
cssnanoでminifyしておく 110kbが90kb

# electronでbootstrapの動作を試す
![bs-flex.png](https://qiita-image-store.s3.amazonaws.com/0/101017/8a31ec60-488b-4904-cbb0-ae0e0956feb5.png)

button, cards, flexboxを確認

大丈夫そう

- .card自体は幅を持たないのでstyleを定義する必要あり

```scss
 .main {
   .card {
     width: 20rem;
   }
 }
```

# style-loader, css-loader
styleをrequireして利用するjsから読み込むようにする
lolcal scopeを利用するとrequireしたjs内で有効なclassになるようなのでreact.jsとかと相性がよさそう

## はまっているところ
style-loaderのuse/unuseが使えない
https://github.com/webpack/style-loader#reference-counted-api

```js
const style = require("style/useable!css!./style.css");
```

のような記述をするとunknown wordとエラーがでる.

```js
const style = require("./style.css");
```

styleは定義したclassだけもっていてuse/unuse メソッドがない
何でこけているのかの深追いはしていない

# postcss-loader
まずはautoprefixer, precssを適用
cssnextとかも試しては見たい

# stylelint
lintは単独で回す or eslint併せてlintだけ回すとかしたいのでwebpackには入れない
gulp-stylelintで設定。ruleはsuit cssを適用
https://suitcss.github.io/

# 今回修正したコード
https://github.com/umema4/electron-babel6/commit/dd55df94761b5e2df6fd2ed0789652037c516ef9

# 予定している作業
- scriptからbootstrapを操作する
  - jqueryも入れる必要あり
- 画像周り
- electronのパッケージを作る

# 参考にしたサイト
http://ameblo.jp/ca-1pixel/entry-12086383139.html
http://qiita.com/youthkee/items/f456fb5730655cc8f9c2
http://cssnext.io/postcss/
http://qiita.com/nekobato/items/43122e0ff7d260b2b0cc
RecyclerViewでリストの先頭or末尾検知をシンプルに実装する

初投稿します[@u_nation](https://twitter.com/u_nation) です。

##結論
以下のコードで実現できました。

```java
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (!recyclerView.canScrollVertically(-1)) {
           /*リストの先頭に来た時の処理*/
         }

        if (!recyclerView.canScrollVertically(1)) {
           /*リストの末尾に来た時の処理*/
        }
    }
);
```

重要なのは__recyclerView.canScrollVertically(-1 or 1)__の部分です。
**View.java**の_Javadoc_を読むと負の数はスクロールアップを正の数はスクロールダウンをチェックするとあります。

引数に負の数を与えると先頭でfalseが返り、正の数を与えると末尾でfalseを返してくれます。

```java:View.java
/**
  * Check if this view can be scrolled vertically in a certain direction.
  *
  * @param direction Negative to check scrolling up, positive to check scrolling down.
  * @return true if this view can be scrolled in the specified direction, false otherwise.
  */
public boolean canScrollVertically(int direction) {
     final int offset = computeVerticalScrollOffset();
     final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
     if (range == 0) return false;
     if (direction < 0) {
         return offset > 0;
     } else {
         return offset < range - 1;
     }
 }
```

##使用例
**1.末尾で次のデータをロード**
よくあるパターンのアレです

**2.SwipeRefreshLayout**
ListViewの時はリストの先頭で下方向にスワイプするとよしなに動いてくれた*SwipeRefreshLayout*ですがRecyclerViewではリストの先頭以外ではsetEnabled(false)してあげないと意図しない位置でもonRefreshが呼ばれてしまいます。
recyclerView.addOnScrollListener内のonScrolledメソッドの中に以下のコードで適切に処理してくれます

```java
if (!recyclerView.canScrollVertically(-1)) {
   swipeRefreshLayout.setEnabled(true);
} else if (swipeRefreshLayout.isEnabled()) {
   swipeRefreshLayout.setEnabled(false);
}
```

##オマケ
末尾検知はAdapter内でもできます。
positionを使ったりデータをどうこうしたい時はこちらでもいいかもしれません。
ただonBindViewHolderメソッド内でリストの要素の変更をするときは
**java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling**
がでるのを防ぐためにHandlerを使ったほうが良いと思います。

```java
@Override
public void onBindViewHolder(BindingHolder holder, int position) {
    if (position == getItemCount() - 1) {
       /*リストの末尾に来た時の処理*/

       handler.post(() -> {/*要素の変更をする場合*/})); 
    }
}
```


以上です。誤りがあれば訂正いたします(>_<)
Swift Classにclosure type propertyを生やす


UIViewなどのクラスやプロパティを追加するextensionというものがあります。closure type (Objective-Cではblock type)をAnyObjectへ変換するのにハマったのでメモ :memo:

# Extension

```swift
import UIKit

// closureを包むプライベートクラス
private class ObjectWrapper<T> {
    let value :T
    init(value:T) {
        self.value = value
    }
}

extension UIView {
    // closureの型を定義
    typealias Ext_TapGestureHandler = (UITapGestureRecognizer -> ())
    // key
    private struct AssociatedKeys {
        // StringでもIntでもOK
        static var TapGestureHandler = "tapGestureHandler"
    }
    
    var ext_tapGestureHandler: Ext_TapGestureHandler? {
        get {
            if let object = objc_getAssociatedObject(self, &AssociatedKeys.TapGestureHandler) 
                as? ObjectWrapper<Ext_TapGestureHandler?> {
                return object.value
            }
            return nil
        }
        set {
            let object = ObjectWrapper(value: newValue)
            objc_setAssociatedObject(self,
                &AssociatedKeys.TapGestureHandler,
                object,
                .OBJC_ASSOCIATION_RETAIN_NONATOMIC
            )
        }
    }

}
```

# 使用例

実際にはこのような使い方はしないと思いますがサンプルとして

```swift
    override func viewDidLoad() {
        super.viewDidLoad()

        let view1 = setupView()
    }

    func setupView() -> UIView {
        let view = UIView.init(frame: CGRectMake(0, 0, 200, 200))
        view.backgroundColor = UIColor.blueColor()
        self.view.addSubview(view)
        let tapGesture = UITapGestureRecognizer(target: self, action: "didTap:")
        view.addGestureRecognizer(tapGesture)
        view.ext_tapGestureHandler = { [weak view] (tap) in
            print("tapped! \(view?.frame)")
        }
        return view
    }
    
    func didTap(tap: UITapGestureRecognizer) {
        tap.view?.ext_tapGestureHandler?(tap)
    }
```


# 注意点
ClosureをAnyObjectに変換しようとして得たエラー
```
Could not cast value of type 'UITapGestureRecognizer -> ()' (0xf48c018) to 'Swift.AnyObject' (0xf47e03c).
```

Closureは直接AnyObjectに変換できないので一度プライベートクラスに包括しています。

また、クロージャー内でそのインスタンスを使用する際はブロックの最初に`[weak object]`を記述して循環参照に気をつけましょう。

```swift
    viewX.ext_tapGestureHandler = { [weak viewX] (tap) in
        viewX?.backgroundColor = UIColor.greenColor()
    }
```

その他あやしい箇所もしくはより良い記法などありましたらお知らせください。


# 参考
:link: Swift closure as AnyObject http://stackoverflow.com/a/32454665/3283039
:link: Swift & the Objective-C Runtime http://nshipster.com/swift-objc-runtime/
[Help募集]RailsでのLEFT OUTER JOINの記法

#概要
Railsで実装している際LEFT　OUTER　JOINを色々試したので、まとめました。
(※2016/03/07 その６追加しました)

**ただ、やりたい事自体は実現できていません。**
**有識者の方、コメントお願いします。**

#やりたいこと
Facebookのような投稿に対しユーザーが「いいね」を押すようなWEBアプリを作成しています。

テーブルとmodelは以下の3つで構成しています。

- Post　id[PK], user_id, text
- User　id[PK], name
- Good　id[PK], post_id, user_id

Facebookみたいに、POSTの一覧ページにて、自分が「いいね」を押しているか判るようにしたいので、

**以下のようなクエリを発行したい。**
かつ、
**eager_loadで実行することで、クエリ発行数を減らしたい。**

という条件があります。

> SELECT * FROM posts
> LEFT OUTER JOIN goods
> ON goods.post_id = posts.id AND goods.user_id = 3

※goods.user_id = 3　のuser_idの指定は任意の値を与えたい。

#その１　.joins()を利用する。

```
user_id = 3
@posts = Post
.joins("LEFT OUTER JOIN goods ON posts.id = goods.post_id AND goods.user_id = #{user_id}")
```
一応、クエリ自体は発行できました。
ただ、キャッシュされていないので、N+1問題が残ります。

#その２　.joins()　+ arel　を利用する。

```
user_id = 3
good = Good.arel_table
good_condition = post
  .join(good, Arel::Nodes::OuterJoin)
  .on(post[:id].eq(good[:post_id]), good[:user_id].eq(user_id))
  .join_sources
@posts = Post.joins(good_condition)
```

その１の改良版で、ArelというActiveRecordの基盤？を使っているので、DBの方言に起因する実行問題がなくなります。
ただ、こちらもキャッシュされないので、N+1問題が残ります。

#その３　eager_load + where　を利用する。

```
user_id = 3
@posts = Post.eager_load(:goods)
.where(good[:user_id].eq(user_id))
```

eager_loadを使っているので、クエリは１回だけです。
ただ発行されるクエリが

>SELECT *  FROM `posts`
>LEFT OUTER JOIN `goods`
>ON `goods`.`post_id` = `posts`.`id`
>WHERE `goods`.`user_id` = 3

と、絞り込まれてINNER JOINしたみたいになってます。

#その４　eager_load + active_record の アソシエーションでのラムダ式　を利用する。

今までは、単純なhas_manyやbelong_toしか利用してませんでしたが、
アソシエーションでラムダ式を利用してみました。

```
@posts = Post.eager_load(:goods)
```

```
has_many :goods, -> { where(user_id: 3) }
```

とりあえず、user_idは3でべた書き。

>SELECT * FROM `posts` 
>LEFT OUTER JOIN `goods` 
>ON `goods`.`post_id` = `posts`.`id`
>AND `goods`.`user_id` = 3

期待通りのクエリが発行されて、かつeager_loadになっている。
ただし、user_idは固定なのでダメ

#その５　eager_load + active_record の アソシエーションでのラムダ式　+　変数　を利用する。

基本的にやってる事はその４と一緒です。

```
@posts = Post.eager_load(:goods)
```
```
has_many :goods, ->(post_user_id) { where(user_id: post_user_id) }
```

で、これどうやって、post_user_idを渡すの？
やり方全然判らないんですけど…

ちなみに実行すると

>SELECT * FROM `posts` 
>LEFT OUTER JOIN `goods` 
>ON `goods`.`post_id` = `posts`.`id`
>AND `goods`.`user_id` = NULL

上記のクエリが発行されます。

#その６　eager_load + joinsのstring型を利用する。

```
@posts = Post.eager_load(:goods).joins("AND goods.user_id = #{user_id}")
```

このやり方だと、プレイスホルダは使えてませんが、一応要件は満たしてます。
ただ、やり方が裏技っぽい気がするので、将来的には少し心配です。

あと、joinsが1テーブルしか使えません。
以下のように複数テーブルに対して使うと、うまく動きません。

```
@posts = Post.eager_load(:goods).joins("AND goods.user_id = #{user_id}")
　　　　　　　.eager_load(:goods2).joins("AND goods2.user_id = #{user_id}")
```

#HELP募集中

というわけで、色々試しましたが、どれも要件を満たしません。
どなたか、良い解決方法がありましたら、ご教示お願いします。
preloadとかの方が良いのかなぁ。
pyenvでpython環境を構築する(OS X El Capitan 10.11.3)

Pythonは好きですが、書く時があまりないのでそれほど詳しくない。
そろそろPyhton3が面白そうなので、仕事外でも書こうかと思い環境を用意した。

## Pythonのバージョン管理
[pyenv](https://github.com/yyuu/pyenv)というツールがあるので`homebrew`でインストールします。

```bash:バージョン管理
$ brew install pyenv

# インストール出来るバージョンを調べる
$ pyenv install -l

# 好きなバージョンをインストールする
# カップラーメンが出来るくらいには時間がかかる(体感)
$ pyenv install 3.5.1
$ pyenv install 3.4.4

$ pyenv versions
* system (set by /Users/cc/.pyenv/version)
  3.4.4
  3.5.1

# globalを指定するとシステム全体でそのバージョンを使用する
$ pyenv global 3.4.4

# localを指定すると.python_versionというファイルが作成される
# このファイルがあるディレクトリ以下はそのバージョンを使用する
$ pyenv local 3.4.4

$ pyenv versions
  system
* 3.4.4 (set by /Users/cc/.pyenv/version)
  3.5.1
```

他のサイトなどではpyenv-virtualenvを使う方法も書いてありますが、ややこしくなるのでおすすめしませんｗ
なお、virtualenv前提だと`which python`で返ってくるのはシステムデフォルトになります。

## プロジェクト別に実行環境を作る
Pythonといえば`virtualenv`ですよね！というわけでvirtualenvで実行環境を作ります。

```bash:実行環境構築
$ pip install virtualenv

$ cd /path/to/develop
$ virtualenv example
$ cd example
$ . bin/activate
(example) $ 
```

簡単すぎる。Python最高！

## おまけ(PySideを使ってみる)
マルチプラットフォーム対応のGUIライブラリQtのPythonバインディングであるPySideを使ってみます。

```bash:PySideインストール
(example) $ brew install qt

(example) $ cd /path/to/develop/example

# ひたすら長い、YouTubeでも見てます :)
# PySideはPython3.4までしか対応してないようです(Python3.5未対応)
(example) $ pip install -U PySide

(example) $ python
Python 3.4.4 (default, Mar  5 2016, 20:17:44)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide
>>> from PySide import QtGui # ここまででエラーでなければOK
>>>
```

## 余談：QtとElectornはどっちがいいの？
色々なサイトを見たのですが、特にどちらがいいとは書いてなかった。
さすがに両方をやるのはつらいので、どちらかがいいのですよね〜
Electronの実行速度的なやつが言及されていたけど、2015年の記事だしなぁ。
こっちが良いというのがあれば教えて下さい！
mysqlが起動しなかった。

- Mac OSX 10.8.5
- Homebrew
- MySQL (Homebrewでインストール)

# 背景
そろそろ2週間前から集録し始めたのでデータベースの勉強がてら、データの集録と演算を勉強しようと構築したが...、起動しないよ（´・ω・｀）

# 処置前
```sh
$ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
# おっと、mysqlが起きていなかった。
$ sudo mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/*******)
```

# 処置後

```sh
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql
$ sudo mysql.server start
Starting MySQL
.... SUCCESS!

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.11 Homebrew

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
iOS9上のシステムアプリでバッジ、通知を表示する方法 ~Cydiaのバッジが表示されない原因の考察~

# システムアプリのバッジが表示されないよ！

~~~
[UIApplication sharedApplication].applicationIconBadgeNumber = 1;
~~~

これで動かず。。。
調べた所、`application 
didFinishLaunchingWithOptions`にて権限をリクエストする必要があるとのこと。
詳しくは[こちら](http://trueman-developer.blogspot.jp/2015/12/ios9.html)

これでもダメ。。

##Info.plistを弄ったら行けた！

これを追加したら行けました！

```Info.plist
....
<key>SBAppUsesLocalNotifications</key>
<true/>
....

```
VMの起動が終わるのを判定してバッチ処理を行う方法

私のパソコンでは起動時に`VBoxManage.exe startvm hogehoge --type headless`というカンジでバッチで流して起動している。
このあとにputtyやらAptanaを起動しているのだが、VMが完全に立ち上げる前に起動してしまうので困っていた。
sleep処理で待っても良いのだが、どうもスマートじゃない。
そこでsftpコマンドを利用して下記を書いてみたら、上手く待ってくれるようになった。


```
sftp -oPort=<ポート番号>  -oConnectionAttempts=120 -b "./bye.bat" <ユーザ名>@<アドレス>
```

```bat:bye.bat
bye
```

これは、**sftpコマンドを120回試して、うまく繋がったらbye.batを流す**というコマンドになっている。`-o`でssh_configの設定が出来ることを利用してみた。
*ConnectionAttempts*は接続を試みる回数を指定している。一回一秒なので、120秒＝２分である。２分試して上手くいかなければエラーということで。
bye.batは何の処理も必要ないので、すぐ接続を切るように`bye`のみである。

これはWindows環境でやっているが、ロジック的にはMac・Linuxでも問題ないはずだ。
というか**Windowsでやるにはコマンドからsftpを打てるようにする必要がある！**
参考までに、私が普段起動しているバッチを載せておきます。

```bat:startVM.bat
rem VM起動
"<PATH>\VBoxManage.exe" startvm "<VM名>" --type headless
sftp -oPort=<ポート番号>  -oConnectionAttempts=120 -b "./bye.bat" <ユーザ名>@<アドレス>

rem Aptana起動
start <PATH>\AptanaStudio3.exe

rem Chrome起動
start <PATH>\chrome.exe --new-window http://XXXX http://YYYY http://ZZZZ

rem putty起動
<PATH>\PUTTY.EXE -load <設定名> -l <ユーザ名> -pw <パスワード>
```

参考：
http://webkaru.net/linux/sftp-command/
http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man5/ssh_config.5.html
XcodeのSimulatorをスパっと呼べるようにする。

別にXcode自体に用はないものの、Simulator.appがXcode.app内のリソースに組み込まれているのでSpotlightでヒットしてくれないのは面倒。人によってはLaunchpadからも呼びたいだろうし。

そんなわけでそんなときにはエイリアスですよ。

<img width="801" alt="Screen Shot 2016-03-05 at 8.43.24 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/61912/8a5769b9-37ad-2fc3-13b2-b6a09c31d786.png">

別にターミナルからシンボリックリンク作っても良いですが。

リソース内のSimulator.appをFinderで表示する方法は、1度Simulator立ち上げておいてDockのアイコンのコンテクストメニューからFinderに表示を選べば簡単。

これでSpotlightでもLaunchpadでも出てくる。
GridDBをDockerのCentOS 6.7で動かしてみた

#GridDBをインストールしてみます

TOSHIBAさんが公開した、スケールアウト型データベースです。
詳しくは下記のリンクで
http://www.griddb.org/griddb/

今回は、Dockerに実行環境を構築した後に、[githubで公開されているReadme](https://github.com/griddb/griddb_nosql)に従って、ビルド、起動、サンプルコードの実行を行います。
https://github.com/griddb/griddb_nosql

#Dockerコンテナ上に動作確認済みの環境を用意
[github](https://github.com/griddb/griddb_nosql)には下記のような動作環境の記述があります。
>We have confirmed the operation on CentOS 6.7 and gcc version 4.4.7.

今回は、動作環境が確認されている、OSのCentOS 6.7で、コンパイラをgcc 4.4.7で動かしてみようと思います。

##dockerにCentOS 6.7のコンテナを用意

Dockerの環境が構築されていることを前提としております。
これからDocker環境を構築する場合には、Docker Toolboxをインストールすることをおすすめします。[参考：Mac版 Docker Toolbox を使ってみました](http://qiita.com/akiko-pusu/items/a30db6332a77ed0ded09)

以降は、Docker Tarminal上での操作です

```bash:docker_tarminal
docker pull centos:6.7 #dockerリポジトリからCentOS 6.7 のイメージをダウンロード
docker run -i -f centos:6.7 /bin/bash #dcoker イメージを起動
docker attach NAMES #起動したイメージの名称またはIDを指定してコンテナの内部に入ります
```

##CentOS 6.7にGridDBをインストール

###インストールに必要なアプリをyumコマンドで導入

インストール作業ですので、管理者権限をあるアカウントで実施して下さい。

```bash:yum_install
#rootアカウントに変更（rootアカウントの場合は不要)
sudo su
#コンパイルに必要なソフトウェア
yum install gcc
yum install gcc-c++
yum install automake
yum install git
#クライアントアプリ（Java）に必要なソフトウェア
yum install java
yum install ant
```
###GridDBをダウンロードしてコンパイル

```bash:
#ユーザのホームディレクトリで作業
cd ~
#ソースコードをダウンロード
git clone https://github.com/griddb/griddb_nosql.git
#ダウンロードディレクトリに移動
cd ./griddb_nosq
#コンパイル
./bootstrap.sh
./configure
make 
```
###サーバの起動

サーバの起動には、パスの指定、パスワード、クラスタ名の設定が必要です。

```bash:
export GS_HOME=$PWD
export GS_LOG=$PWD/log
#パスワードの設定
bin/gs_passwd admin
#クラスタの設定 gs_gluster.jsonのclusterNameにクラスタ名を記入します
vi conf/gs_cluster.json
export no_proxy=127.0.0.1
bin/gs_startnode
bin/gs_joincluster -c クラスタ名 -u
admin/パスワード
```

###クライアントのビルド

JAVAで記述されたクライアントアプリをビルドします。実行にはJAVAとANTが必要です。

```bash:
ant -f java_client/build.xml
```

###サンプルコードの実行

```bash:
export CLASSPATH=${CLASSPATH}:$GS_HOME/bin/gridstore.jar
mkdir gsSample
cp $GS_HOME/docs/sample/program/Sample1.java gsSample/.
javac gsSample/Sample1.java
java gsSample/Sample1 239.0.0.1 31999 クラスタ名 admin パスワード
```

下記のような結果が出力されれば成功です。

```sql:
Person:  name=name02 status=false count=2 lob=[65, 66, 67, 68, 69, 70, 71, 72, 73, 74]
```