OmniAICreator/Qiita-1.07M huggingface dataset:
Arduboy開発向けセットアップ手順

# Arduboy開発向けセットアップ手順

https://www.arduboy.com/

先日Arduboy DevKitが届いたもののドキュメント的なものがなかったので
セットアップ手順をまとめます。
Arduino初体験の人/とりあえず遊びたい人向け。

## 1 必要な機器
 - microUSB-USBケーブル x1
 - リチウム電池 CR-2016 (USB接続中は電源ONになるのでなくても良い)

## 2 Arduinoのダウンロード

(すでにArduino取得済みの場合は飛ばしてください)

Windowsの場合はUSB接続前にドライバーをインストールします。
以下ページでOS選択しダウンロード(+寄付)します。
現時点では1.6.5が安定最新版です
https://www.arduino.cc/en/Main/Software

## 3 Arduboy向けセットアップ
以下のドキュメントの通りですが、やったことを順に書きます。
https://github.com/Arduboy/Arduboy

### 3.1 ボードを設定
Arduino上で
ツール > ボード > "Arduino Leonardo"
を選択します。

<img width="553" alt="スクリーンショット 2015-10-24 22.36.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/a4f269ad-1a14-67a4-e81b-435e8dbcf7df.png">

### 3.2 ライブラリ追加

https://github.com/Arduboy/Arduboy
zip downloadします。

スケッチ > include Library > Add Zip Library
でダウンロードしたzipファイルを選択します。 

<img width="647" alt="スクリーンショット 2015-10-24 22.46.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/3950259c-59b2-766c-cc79-5b9b18a2a05b.png">

Arduboyライブラリ追加を確認
<img width="649" alt="スクリーンショット 2015-10-24 22.45.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/f64d7351-e6dc-0ce3-bbe8-81a402ff8b9a.png">


### 3.3 ポートを設定

以下のように"Arduino Leonardo"を選択します
<img width="735" alt="スクリーンショット 2015-10-24 22.43.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/50916a62-254c-56a8-f8ac-e2b3f4a06ff0.png">

## 4 サンプル起動

https://github.com/Arduboy/Arduboy/tree/master/examples/FloatyBall
FloatyBall.ino を選択するとArduino IDEが起動するので
"検証"して"マイコンボードに書き込む"

うごいた！
![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/19692/b35d58ca-687e-4953-dd3a-b43c83cdeae9.png)

おわり
WebAPIを利用する際のクロスドメイン制約回避(JSON形式)

#概要
クロスドメイン制約を回避し、JSON形式で出力するPHPのサンプルコードです。
PHPを間に挟んで通信することで、クロスドメイン制約を回避することができます。

JSON形式で応答を返すWebAPIを利用しようと思ったところ、クロスドメイン通信に悩んだため今回投稿しました。
#使用したAPIについて
今回はMarineTrafficAPIのID25番、Simplified JSON sample responsewoを使用しました。(有料)
http://www.marinetraffic.com/jp/ais-api-services/documentation/api-service:25

#ソースコード
コードは以下の通りです。

```php:ajax.php
<?php

try
{
    $API = null;
	$url = "http://services.marinetraffic.com/api/exportvessel/自分のAPIキー/timespan:20/mmsi:431000628/protocol:json";

	//ファイルの内容の読み込み
	$json = file_get_contents($url);
      
	//連想配列にする
	$users = json_decode($json,true);

	$API[] = array(
		'mmsi'=>$users[0][0],//二次元配列
		'time'=>$users[0][6]
	);

	//JSON形式で出力する
    header('Content-Type: application/json; charset=UTF-8');
	echo json_encode( $API, JSON_UNESCAPED_UNICODE );
	exit;

}
catch (PDOException $e)
{
	//例外処理
	die('Error:' . $e->getMessage());
}
```

#実行結果
[{"mmsi":"xxxxxxxx","time":"2015-10-24T13:34:46"}]
と表示され、APIから情報を取得できたことが分かります。
(mmsiは伏せておきます。)
#備考
自分はQiitaへの投稿が初めてなので、至らない点が多々あるかと思います(´・ω・`)
AndroidでgooのPOSTAPIを利用する

#gooAPIで今日やること
[gooラボ API](https://labs.goo.ne.jp/api/)に公開されている形態素解析APIでjsonデータを取得するまでのコードをAndroidで実装します

##準備
まず、自分のアプリケーションIDを取得しましょう。githubアカウントが必要となります。
[gooラボAPI利用方法](https://labs.goo.ne.jp/apiusage/)

##コード
以下のようになります。例外処理はお好みで

```java:MorphologicalAnalysis.java


    static final String GOO_URL = "https://labs.goo.ne.jp/api/morph";
    String ID  = "取得したID";
private void post(String sentence){

        URL url = null;

        try{
            url = new URL(GOO_URL);
            URLConnection connection =url.openConnection();
            connection.setDoOutput(true);

            //ヘッダ
            connection.setRequestProperty("Content-Type", "application/json");

            OutputStream os = connection.getOutputStream();

            //jsonの中身書く
            String postStr = "{\"app_id\": \"" + ID + "\",\"sentence\": \"" + sentence + "\"}";


            PrintStream ps = new PrintStream(os);
            ps.print(postStr); //データをPOSTする
            ps.close();

            InputStream is = connection.getInputStream(); //結果を取得
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            
            String s;
            while ((s = reader.readLine()) != null) {
                Log.d("OUTPUT",s); //結果を出力
            }
            reader.close();

        }catch (IOException e) {
            e.printStackTrace();
        }
    }

```

Androidで実際に実行するときはAsyncTaskで包みます

``` java:MorphologicalAnalysis.java
new AsyncTask<Void ,Void ,Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                post("京都はめちゃめちゃ楽しい");
                return null;
            }
        }.execute();
```

##結果
上のような入力からは次のような結果が返ってきます
`
 {"request_id":"labs.goo.ne.jp\t..\t0","word_list":[[["京都","名詞","キョウト"],["は","連用助詞","ハ"],["めちゃめちゃ","名詞","メチャメチャ"],["楽し","形容詞語幹","タノシ"],["い","形容詞接尾辞","イ"]]]}
`

##最後に
APIを利用したアプリなどを公開するときはクレジットの表記などが必要となるようなので要件等確認しておきましょう
[gooラボAPI利用方法](https://labs.goo.ne.jp/apiusage/)
[tvOS]動的にフォーカスしているビューを変更する

```swift

    var currentFocusedView:UIView?
    
    override var preferredFocusedView: UIView? {
        return currentFocusedView
    }
    
    @IBAction func forceFocusButton1(sender: AnyObject) {
        currentFocusedView = button1
        view.setNeedsFocusUpdate()
    }

```

preferredFocusedViewで返すビューを変更した後に`setNeedsFocusUpdate()`を呼ぶことで強制的にフォーカスを切り替えることができます。


#UITableViewの場合

```swift 
    override func indexPathForPreferredFocusedViewInTableView(tableView: UITableView) -> NSIndexPath? {
        return currentIndex
    }
```

indexPathForPreferredFocusedViewInTableViewというメソッドが用意されているので、同様にcurrentIndexを変更してsetNeedsFocusUpdate()です
iOSでの日付設定(dateBySettingUnit)


EventKitを使う準備として日付の操作を試していていて気づいた注意点です。
日付を設定する時に以前は、NSDateのイニシャライザに

>`onvenience init?(string description: String)`

というメソッドが用意されていましたが、OSX10.10 でdepriciated になってしまいました。現在 NSDate クラスで日付を設定するために使用できるイニシャライザは、

- init(timeIntervalSinceNow secs: NSTimeInterval)
- init(timeInterval secsToBeAdded: NSTimeInterval,
       sinceDate date: NSDate)
- init(timeIntervalSinceReferenceDate ti: NSTimeInterval)
- init(timeIntervalSince1970 secs: NSTimeInterval)

になり、全て特定の日付からの TimeInterval での指定になりました。
従って必要な日付のNSDateインスタンスは、 `NSDate()` でそのときの日付時刻を得て、そこからNSCalendar のメソッドを使って欲しい日付のNSDate インスタンスを得る方法にほぼ限定されています。
これに使用できそうなNSCalendar のメソッドは

- dateByAddingComponents:toDate:options:
- dateByAddingUnit:value:toDate:options:
- dateFromComponents:
- dateBySettingHour:minute:second:ofDate:options:
- dateBySettingUnit:value:ofDate:options:

といったところです。
この中で `dateBySettingUnit:value:ofDate:option:` は注意が必要です。Class Reference では与えられた日付のコンポーネントを与えられた値に設定すると説明されていますが、このメソッドの実行結果は与えられた日付よりも後の日付にしかなりません。

```swift: date.swift
var myCalendar = NSCalendar.currentCalendar()

let today = NSDate()
// "Oct 24, 2015, 9:43 PM"
var day1 = myCalendar.dateBySettingUnit(NSCalendarUnit.Day, value: 1, ofDate: today, options: NSCalendarOptions())
// "Nov 1, 2015, 12:00 AM"
var day30 = myCalendar.dateBySettingUnit(NSCalendarUnit.Day, value: 30, ofDate: today, options: NSCalendarOptions())
// "Oct 30, 2015, 12:00 AM"
var day20 = myCalendar.dateBySettingUnit(NSCalendarUnit.Day, value: 20, ofDate: today, options: NSCalendarOptions())
// "Nov 20, 2015, 12:00 AM"
day1 = myCalendar.dateBySettingUnit(NSCalendarUnit.Month, value: 1, ofDate: day1!, options: NSCalendarOptions())
// "Jan 1, 2016, 12:00 AM"
day1 = myCalendar.dateBySettingUnit(NSCalendarUnit.Year, value: 2015, ofDate: day1!, options: NSCalendarOptions())
// nil
let firstDayOf2015Comp = NSDateComponents()
firstDayOf2015Comp.day = 1
firstDayOf2015Comp.month = 1
firstDayOf2015Comp.year = 2015
day1 = myCalendar.dateFromComponents(firstDayOf2015Comp)
// "Jan 1, 2015, 12:00 AM"
```

上の例のday1のように10月24日の日付に対して"Day" を1に設定すると11月1日になります。day30のように10月24日に対して"Day"を30にすると10月30日になります。day20 のように10月24日の"Day"を20にすると11月20日になります。11月1日になっているday1 の"Month" を1に設定すると2016年1月1日になります。さらにこのday1の"Year" を2015に設定すると `nil` になってしまいます。2016年以後に2015年にはならないので`nil`になってしまいます。
ということで、日付を設定する時には例えばNSDate() を基準にして、

- dateByAddingComponents:toDate:options:
- dateByAddingUnit:value:toDate:options:

を使用する方がよいようです。
なお、例の最後にあるようにNSDateComponets で日付コンポーネントを用意してやれば、

- dateFromComponents:

で直接日付を設定することができます。
DateByAddingComponets を使うと、月初めの日付から月末の日付を得るには、NSDateComponets インスタンスの month に1、day に-1 を設定して
dateByAddingComponents を使うと簡単に計算できます。

```swift: endOfMonth.swift
let endOfMonthComp = NSDateComponents()
endOfMonthComp.month = 1
endOfMonthComp.day = -1

let endOfMonth = myCalendar.dateByAddingComponents(endOfMonthComp, toDate: day1!, options: NSCalendarOptions())
// "Jan 31, 2015, 12:00 AM"
```
[tvOS]最初にフォーカスされるビューを指定する

通常、一番上にありかつcanBecomeFocused()がtrueのビューにフォーカスがあたります。

![Simulator Screen Shot 2015.10.24 21.47.48.png](https://qiita-image-store.s3.amazonaws.com/0/24979/bcfd038a-0c94-dca4-6efe-23bd31ad2557.png)


#Storyboard

これを変更するには、ViewControllerからビューに向けてcontrolを押しながらドラッグしpreferredFocusedViewを選択します。

<img width="293" alt="スクリーンショット 2015-10-24 21.49.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/04bef220-e628-93ea-13e8-c92ab70c89c7.png">

変更後

![Simulator Screen Shot 2015.10.24 21.50.52.png](https://qiita-image-store.s3.amazonaws.com/0/24979/9dd17c3c-1e5a-6b30-e3d5-e765b681ab89.png)


#Swift

```Swift
    override var preferredFocusedView: UIView? {
        return button3
    }
```
preferredFocusedViewをオーバーライドしてビュー指定でOK
docker daemonのrestart時にrestart=alwaysなコンテナが起動しない問題

docker runで`--restart=always`にして起動したコンテナが、docker daemonの再起動後に立ち上がったり、立ち上がらなかったりする状況なので、調査過程をメモ。

ubuntu系なので`tail -f /var/log/upstart/docker.log`でログを確認。
`service docker stop`を実行すると、そこそこの頻度で以下のようなログが出力される。

```
No endpoints in sandbox while trying to remove endpoint <container-name>
```

この時、そのコンテナは次回に `service docker start`しても立ち上がってこない。

`docker inspect` でコンテナ起動時のエラーを見てみると、

```
"failed sandbox add: failed to create new sandbox: open /var/run/docker/netns/default: permission denied"
```

とのこと
Vim の挿入モードでヒトを表示し、それ以外で（主に移動時に）イカを表示する

画面の左下に注目

![vimtoon2.gif](https://qiita-image-store.s3.amazonaws.com/0/25886/87f4b85e-529e-b8ca-e942-18d32922f470.gif)

.vimrc に下記の設定を追加するだけ

```vim
au VimEnter * set statusline=くコ:彡
au InsertEnter * set statusline=━┓🚶
au InsertLeave * set statusline=くコ:彡
set laststatus=2
```

最初は statusline ではなく powerline でやろうかと思ったが、
たくさんのプラグインを入れる必要があることに気がついたため statusline にした。 

顔文字を操るパワーがなかったので、ヒトモードの表示はやるせない感じになっている。

# ざっくり解説

## au (autocmd)

Vim 上の何かのイベントが起きた時に、登録しておいたコマンドを実行するもの

- VimEnter ... Vim が起動した時
- InsertEnter ... 挿入モードになった時
- InsertLeave ... 挿入モードをやめた時

## set statusline

statusline とはイカを表示するための領域のこと

## set laststatus=2

statusline を常に表示する

[http://vim-jp.org/vimdoc-ja/options.html#'laststatus'](http://vim-jp.org/vimdoc-ja/options.html#'laststatus')

~~statusline を配置する位置がエディタウインドウの末尾から 2 行目ということを指定している~~
※ 10/28 訂正

# 余談

[vim-color-splatoon](https://github.com/rhysd/vim-color-splatoon) というプラグインがある。
これを入れるともっと臨場感が出るかもしれない。

https://github.com/rhysd/vim-color-splatoon
Why my pam_tally auth locked out?


# pam auth failure (locked account)
When your linux account locked out, altough login succeeded, confirm `/etc/pam.d/*`

Configure not only
`auth    required   pam_tally2.so denay=x`
but also
`account     required      pam_tally2.so reset`

more better
`auth        required      pam_tally2.so deny=10 unlock_time=3600`
git with multi account

# client side, ssh-key & config
site-a = default: id-rsa
site-b = specific-key: site-b-rsa 

```
Host ghe.hoge.fuga
 User git
 HostName ghe.hoge.fuga
 Port 22
 IdentityFile ~/.ssh/site-b-rsa

```
# server side, ssh-pubkey
Add ssh key `site-b-rsa.pub`

#commit author & email
site-a = default: ~/.gitconfig

site-b = specific repositry: `git config` each repos

```bash:
git config user.name "hoge.hoge"
git config user.email "hoge@example.com"
```
rubyでモンティホールをシミュレートしてみた


## モンティホール問題とは(wikipdiaより引用)

```
モンティ・ホール問題（モンティ・ホールもんだい、Monty Hall problem）は確率論の問題で、ベイズの定理における事後確率、あるいは主観確率の例題のひとつとなっている。モンティ・ホール (Monty Hall、本名 Monte Halperin) が司会者を務めるアメリカのゲームショー番組、「Let's make a deal」の中で行われたゲームに関する論争に由来する。 一種の心理トリックになっており、確率論から導かれる結果を説明されても、なお納得しない者が少なくないことから、ジレンマあるいはパラドックスとも称される。「直感で正しいと思える解答と、論理的に正しい解答が異なる問題」の適例とされる。
なお、モンティ・ホール問題と実質的に同型である「3囚人問題」については、かつて日本で精力的に研究された。
```
https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C

## ソース

```rb
debug = false
num_itr = 10000

[true, false].each do |do_change|
  num_seikai = 0
  num_itr.times.each do |n|

    seikai = rand(3)
    ans = rand(3)
    puts "first select: " +  ans.to_s if debug
    mon = nil
    3.times do | c |
      if c != seikai && c != ans
        mon = c
        break
      end
    end
    puts "mon: " + mon.to_s if debug
    final_ans = ans
    if do_change
      3.times do | c |
        if c != ans && c != mon
          final_ans = c
          break
        end
      end
      puts "change to " + final_ans.to_s if debug
    end
  
    if final_ans == seikai
      puts "seikai" if debug
      num_seikai += 1
    else
      puts "hazure" if debug
    end
    puts "" if debug
  end
  puts (do_change ? "change" : "no change")
  puts "seikai ritsu: " + (num_seikai.to_f / num_itr * 100) .to_s
end
```

## 結果

```
change
seikai ritsu: 66.32000000000001
no change
seikai ritsu: 33.379999999999995
```
autofs による自動マウント

# 事前確認
- man autofs
- man mount_nfs
- man auto_master
- man automount

```
% mount
% df
% nfsstat -m
```

手動設定は以下の通り，これを自動マウントする

```
mount -t nfs 192.168.x.x:/share/work /mnt/work
```

# /etc/auto_master の変更
マウントポイントの上位ディレクトリに対して、設定ファイルを指定

```
/mnt     /etc/autofs_nfs
```

#  autofs_nfs

書式: key location
key はなんでもよいが，& により locationで参照可能
key がマウントポイント、ここでは work になる。

```
work -fstype=nfs 192.168.x.x:/share/work
```

# autofsd の再起動
```
% sudo launchctl stop com.apple.autofsd
% sudo launchctl start com.apple.autofsd
```

# 確認
```
% mount
% df -ah
```
iOS9で実行したPhoneGapアプリのjQM popupの挙動がおかしい場合の対処法

PhoneGapで作ったアプリをiOS9の端末で実行した際、jQuery mobileの挙動がおかしかったのでその修正方法をまとめます。

# 現象
・ポップアップを開くリンクをクリックした際に初回だけ表示されない
　（表示されるが一瞬で消える）
・ ポップアップを閉じた時に前のページに遷移してしまう。

# 実行環境
・iPhone 5 iOS8.3(正常)
・iPhone 6 iOS9.1(異常)

#対策の流れ
1. PhoneGapを最新版にアップデート
2. プロジェクトにPhoneGapの最新版を適用
3. htmlのソースを一部修正（※ここだけでOKかも）

## PhoneGapを最新版にアップデート
ターミナルを開き、プロジェクトのディレクトリまで移動した後に以下のコマンドを実行します。

```lang:
sudo npm update phonegap -g
#Cordovaの場合はこちら
sudo npm update cordova -g
```

## プロジェクトにPhoneGapの最新版を適用

```lang:
sudo phonegap platform update ios
#Cordovaの場合はこちら
sudo cordova platform update ios
```

## htmlのソースを一部修正
この工程だけでも良いかもしれませんが、私の場合は上記１，２を先にやってしまったので検証できません。

修正前：

```lang:index.html
<!-- リンク -->
<a href="#pp" data-rel="popup">ポップアップ!</a>

<!-- ポップアップの中身 -->
<article data-role="popup" id="pp">
   ポップアップ！
</article>
```

修正後：

```lang:index.html
<!-- リンク -->
<a href="#pp" data-rel="popup">ポップアップ!</a>

<!-- ポップアップの中身 -->
<article data-role="popup" id="pp" data-history="false">
   ポップアップ！
</article>
```

ポップアップの中身の方にdata-history="false"を追加したら治りました。
[引用元(StackOverFlow)](http://stackoverflow.com/questions/32626073/jquery-popupopen-not-working-properly-on-ios-9-device)
CentOS5.11でNginxとPHP-FPMでPHPを動かす


手順は調べればたくさんWebにあるけど、エラーが起きてすんなり進まなかったのでメモ。

#手順
##Nginxのインストール
1.yumにあるNginxは古いので新しいものを取得する

```console
$ wget http://nginx.org/packages/centos/5/noarch/RPMS/nginx-release-centos-5-0.el5.ngx.noarch.rpm
$ sudo rpm -ivh nginx-release-centos-5-0.el5.ngx.noarch.rpm
```

2.インストールする

```console
$ sudo yum -y install nginx
```

3.サーバを起動する


```console
$ sudo /etc/init.d/nginx start
```


##PHPのインストール
1.epelとremiレポジトリを追加

```console
$ rpm -ivh  http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm
```
```console
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
```

2.PHPに関連するファイルとPHP-FPMをインストール

```console
$ sudo yum -y install --enablerepo=remi --enablerepo=remi-php55 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-fpm
```

3.PHP-FPMが自動起動するように設定する

```console
$ chkconfig php-fpm on
```

4.PHP-FPMの設定ファイルを編集

/etc/php-fpm.d/www.conf の以下の箇所を修正
(userとgroupは環境に合わせて修正)

```console
user = nginx
group = nginx
```

5.PHP-FPMを起動

```console
/etc/init.d/php-fpm start
```

6.nginxの設定
/etc/nginx/conf.d/default.conf

```Nginx:default.conf
#rootのパスを変更
root	/var/www

#index.をphpに変更
index	index.php

#コメントアウトを外す
location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }
```

7.nginx起動

```console
$ /etc/init.d/nginx start
```

8.index.phpの配置
/var/www/index.phpを作成

```index.php
<?php
    phpinfo();
?>
```
9.ブラウザからアクセス
http://IPアドレス

PHPバージョンのページが表示されれば成功


# エラー
## その1
### 事象
$ sudo /etc/init.d/nginx start でエラー

```console
nginx を起動中: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [失敗]
```

### 原因
Apacheを起動していたので、すでに80ポートを使っていたのが原因。

受信するポートを変える。

$ sudo vim /etc/nginx/conf.d/default.conf
の中のポートを使っていないポートに変更したら解決した。
## その2
### 事象

http://IP　にアクセスしたら「File not found.」と表示された。
/var/log/nginx/error.logを確認すると、以下のようなエラーが出ていた。

```error.log
[error] 9273#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.16.208.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "IP"
```

####解決策
/etc/nginx/conf.d/default.confの「location ~ \.php${」内の以下の部分はデフォルトでは無いパスを指定するため、書換える必要があった。


```before
fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
```
/scripts が無いのでエラー。

```after
fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
```

nginx再起動

```console
$ /etc/init.d/nginx restart
```

# 備考
参考にさせてもらったサイト
[その1](http://webkaru.net/linux/php-fpm-install/)
[その2](http://blog.ybbo.net/2014/01/24/【シンプル】centos5にphp5-5をyumで簡単にインストールする/)
Expressことはじめ

- node.jsを利用したwebアプリケーション・フレームワーク
- 今回はExpress3を使用します
- 前提としてnode.jsがインストールされていること

exressインストール(グローバルにインストール)

```bash:
# バージョンを指定してインストールしないと、最新のバージョン4系がインストールされてしまう
$ sudo npm install -g express@3.x.x
```

# プロジェクトの作成
今回はサンプルプロジェクトを使用せず、最初から作成していきます

プロジェクトを作りたいディレクトリにて下記を実行

```bash:
# package.jsonを作成
$ npm init
# package.jsonに登録するために--save-devオプションを指定
$ npm install express@3.x.x --save-dev
```

## app.jsを作成

```javascript:app.js
var express = require('express'),
	app = express();

app.use(app.router);


// トップ画面
app.get('/', function(req, res) {
	res.send('hello world');
});

// "/about"でアクセスしてきた時の処理
app.get('/about', function(req, res) {
	res.send('about this page');
});

// 3000ポートで待ち受ける
app.listen(3000);
console.log('server starting...');
```

## 起動

```bash:
$ node app.js
> server starting...
```

下記にアクセスするとhello worldが表示される
http://localhost:3000/

# middleware
- app.jsのapp.use()の部分のこと
- リクエストが来てからの処理を上から順次実行していく

```javascript:
app.use(app.router);
```

## カスタムmiddleware
```javascript:
app.user(function(req, res, next) {
	console.log('custom middleware');
	next(); // 今の処理が終わったら次にいく
});
```

参考
http://qiita.com/kazusa-qooq/items/23926befcb87c0c7b26f

## logger
便利なログ機能

```javascript:
app.use(express.logger('dev'));
```

# nodemon
ファイルを監視して自動で再起動してくれます

インストール

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

使い方
nodeコマンドの代わりにつかう

```bash:
$ nodemon app.js
```

# テンプレートファイルを使用する(ejs)
テンプレートエンジンのejsを使用します

インストール

```bash:
$ npm install ejs --save-dev
```

viewa/index.htmlを作成します

```html:index.html
<html>
	<h1><%= title %></h1>
	<p>hello from ejs</p>
</html>
```

```javascript:app.js

...
// ejsを使用するための設定
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

...

app.get('/', function(req, res) {
	// index.ejsの拡張子は省略可能
	res.render('index', {title : 'タイトル'});
});
...
```

## POSTメソッドに対応させる
index.htmlにフォームを追加します

```html:index.html
<html>
	<form method="post" action="/create">
		<input type="text" name="name">
		<input type="submit" value="create">
	</form>
</html>
```

postに対応させるためのmiddlewareを指定して、処理を書く

```javascript:app.js

...
// postを使用するための設定
app.use(express.json());
app.use(express.urlencoded());

...

app.post('/create', function(req, res) {
	console.log(req.body);
	res.send(req.body.name);
});
...
```
実行すると、フォームで書いたテキストが表示されます
Pythonで簡単パスワードボックス

### 背景
Pythonのコマンドを実行した際にユーザのパスワード入力が必要になったため，簡単なコードでパスワードを入力するポップアップを作りました．

### 参考
Tkinterは情報が少なく，ちょっと使い勝手が悪いのですが，[nnahitoさんの投稿](http://qiita.com/nnahito/items/ad1428a30738b3d93762)がよくまとまっているので，参考になると思います．

### コード
動作は python 2.7.10で行いました．Tkinterはpython標準で組み込まれているので，特にインストールは必要ありません．
最小限のコードにしたため，GUIを変更したい場合は以下のコードに変更を加えてください．

```py
# -*- coding: utf-8 -*-
import Tkinter

class PswdBox(Tkinter.Tk):
    def __init__(self):
        Tkinter.Tk.__init__(self)
        self.title('Enter password')
        self.ent = Tkinter.Entry(self, show='*')
        self.ent.pack()
        self.lbl = Tkinter.Label(self, foreground='#ff0000')
        self.lbl.pack()
        self.btn = Tkinter.Button(self, text='Submit', command=self.submit)
        self.btn.pack()
        # ここで正しいパスワードを定義 あるいは ファイルからインポートなどする
        self.correct_pass = 'pass'

    def submit(self):
        self.pswd = self.ent.get()
        if self.pswd == self.correct_pass: # 正しい
            self.destroy() # ウィンドウを閉じる
        else: # 間違え
            self.lbl['text'] = 'Try again!'
            print(self.pswd)


if __name__ == '__main__':
    pb = PswdBox()
    pb.mainloop()
    print(pb.pswd)
```

### 実行結果

使い方
上のコードを適当に pswdbox.pyとデスクトップに保存してターミナルで
```
python ~/Desktop/pswdbox.py
```
と入力すれば起動します．
![パスワードボックス実行結果](https://qiita-image-store.s3.amazonaws.com/0/36752/a2d058c8-e2eb-6732-1d4d-b70868cfdc4e.png)
ConoHaVPSを使ってみる

# ConoHaVPSを使ってみる

## 経緯
- 会社の仲間内でゲームを作ることに。
- ローカル環境の差異があるので、無くしたい
    - 開発機がmacとwindows
- 前々から気になってたConoHaVPSを導入することに(独断)

## やったこと
- ポイントチャージ！
- 最安値プランでの契約(ビンボー)
- 電話による認証(conohaChanかわいいよ)
- sshでのログイン設定など

## やりたいこと
- android開発なので、android studioをインストールしたい
- GUIじゃないとダメみたい
- 入れてみよう
- 入ったけど、sshの設定ができない
- GUI重い
- 調べると3000円くらいのプランじゃないと快適ではない模様
- お金がないので諦める←イマココ

とまぁ大まかに流れを書いてみましたが、sshとか設定は楽しいです。

今回はGUIで使用するために、APIを使ってOSの再インストールを行いました。

## OS再インストールの手順

今までは、GUIでできたみたいなのですがここ最近のアップデートでAPIを叩いて行うように
なったみたいです。

- 参考サイト(ありがたや〜)
    - http://server-setting.info/blog/conoha-api-iso-ubuntu-server.html#apiiso_7

- OSのISO取ってきて入れるだけ。Linuxとか入れたことある人なら簡単

## 感想

- 最初はAPI叩くの面倒だなと思った
- 実際やると非常にすんなりはいり、何かしらでプログラム組めば楽になるかと
    - chefとかansibleとか連携できそう？
- 今回は予算の関係上断念してしまったけど、開発環境はcloud上で作りたいので資金を頑張る
QlikViewでカレンダーを自動生成する

# カレンダーを自動生成する
いわゆるカレンダーマスタと呼ばれる系統のデータを自動生成するテクニックです。
営業日の判定（祝日の定義）を含んだり、その他特殊な対応が必要な場合には簡単に自動生成はできないのですが、ここでは難しいことを考えず、以下の項目を含むようにします。
・日付
・年
・月
・日
・週番号
・曜日
・半期
・四半期
## やりかた
### ロードスクリプト定義
次のようなロードスクリプトを書きます。例では2013/01/01から2015/12/31のカレンダーを作っています。

```sql:loadscript
SET vBegin = '2013/01/01';
SET vEnd = '2015/12/31';

t:
LOAD * INLINE [
    dummy
    1
];

For i = date('$(vBegin)') To date('$(vEnd)')
	LOAD date($(i)) as 日付,
	Year(date($(i))) as 年,
	Month(date($(i))) as 月,
	Day(date($(i))) as 日,
	Week(date($(i))) as 週番号,
	WeekDay(date($(i))) as 曜日,
	If(Month(date($(i))) >= 4 and Month(date($(i))) <= 9, '上期', '下期') as 半期,
	If(Month(date($(i))) < 4, '4Q',
	If(Month(date($(i))) < 7, '1Q',
	If(Month(date($(i))) < 10, '2Q', '3Q'))) as 四半期
	Resident t;
Next

DROP Table t;
```

### リロード
リロードします。つまり、上のロードスクリプト定義だけで、やるべきことはおしまいです。
適当にオブジェクトを作ると、次のような感じになります。
<img width="210" alt="calendar.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/3edff526-9f00-121e-69d0-ebe2211c62b8.png">

このデータは、エクセル出力したりcsv保存したりすることも可能です。
また、応用編として、
・リロードする日±2年の範囲でカレンダーを生成する(vBegin,vEndの定義を変更する)
・他のトランザクションを読み込むときに、生成したカレンダーの範囲にデータを限定する(inner keep)
といった対応も可能です。
H2 DatabaseでTIMESTAMP・DATEをUNIX時間に変換する

#概要
H2DataBaseで、TIMESTAMP・DATE型の値の、UNIXエポック、*すなわち協定世界時 (UTC) での1970年1月1日真夜中（午前0時0分0秒）の時刻からの形式的な経過秒数*(Wikipediaより引用)を求めます。

#使用する関数
**[DATEDIFF](http://www.h2database.com/html/functions.html#datediff)関数**
DATEDIFF(unitString, aTimestamp, bTimestamp)

- 2つのタイムスタンプ間の差(bTimestamp - aTimestamp)を、指定された単位を基準にしてlong型で返します。
- 単位を指定するunitStringの引数には、year month day hour minute second millisecond等が使えます。
- aTimestamp > bTimestampの場合は負の数を返します。

詳しくは上のリンク先を参照してください。


#実行例
###UNIXエポックからの経過年数
```sql:コンソール
select DATEDIFF('year',timestamp '1970-01-01 00:00:00' ,  date '2012-05-05')
```
```plain:結果
42
(1 行, 0 ms)
```
###UNIXエポックからの経過秒数
```sql:コンソール
select DATEDIFF('second',timestamp '1970-01-01 00:00:00' ,  date '2012-05-05')
```
```plain:結果
1336176000
(1 行, 13 ms)
```
###UNIXエポックからの経過週数
```sql:コンソール
select DATEDIFF('day',timestamp '1970-01-01 00:00:00' ,  date '2012-05-05')/7;
```
```plain:結果
2209
(1 行, 2 ms)
```
Jekyllのページファイルを_pagesなどのフォルダで整理する方法


Jekyllのデフォルト設定では`_posts`フォルダに入れたものは投稿として生成してくれるが、ページファイルは`source`直下に置かなくてはいけない。これを整理したい。


これを

```整理前
_config.yml
_posts
index.html
```

こうしたい

```生理後
_config.yml
_pages
└ index.html
_posts

```


手順は2つです。

### 1. `_config.yml`に`_pages`を読み込む指定を記述

```_config.yml

# 設定いろいろ...
include: ['_pages'] # この行を追加
```

### 2. 対象のページ(ここでは`index.html`)に`permalink`をセット

```index.html
---
layout: default
title: HOME
permalink: / # permalinkにルートを指定
---
```



参考リンク:
https://github.com/jekyll/jekyll/issues/920
Play2 Scalaのコードを静的解析する

project/plugins.sbt

```
resolvers += "sbt commynity repository" at "http://dl.bintray.com/sbt/sbt-plugin-releases/"
resolvers += "sonatype-releases" at "https://oss.sonatype.org/content/repositories/releases/"

addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.3.3")
addSbtPlugin("de.johoop" % "findbugs4sbt" % "1.4.0")
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.7.0")
addSbtPlugin("de.johoop" % "cpd4sbt" % "1.1.5")
```

build.sbt

```
import de.johoop.cpd4sbt.CopyPasteDetector._
import de.johoop.cpd4sbt.Language.Scala</code>

findbugsSettings

cpdSettings
cpdLanguage := Scala
cpdSkipDuplicateFiles := true
```
GithubやBitbucketに簡単に鍵を追加できるシェルスクリプトを作った

開発機のセットアップでは、SSH鍵作ったりdotfilesを置いたりしますよね。
その後GithubやらBitbucketやらに手動でSSH鍵を登録するわけです。
いちいちブラウザからアクセスして…って面倒じゃないですか？

ということで、ぱぱっと登録できるシェルスクリプトを書いてみました。

https://github.com/ABCanG/add-sshkey-remote

# 使い方
シェルスクリプトをダウンロードして、パスの通っているフォルダに配置してください。
dotfilesをまとめてる人は、.binフォルダの中に入れてパスを通しておくと便利だと思います。

使い方はこんな感じです。

```
Usage:
    add-sshkey-remote [command] [args]

Command:
    ssh [user@]hostname       adding ssh keys to authorized_keys on remote host
    github user [label]       adding ssh keys to github
    bitbucket user [label]    adding ssh keys to bitbucket
    help                      print this
```

今のところGithubとBitbucketに対応してます。
おまけとして、ホストにSSH鍵を登録する機能も付けてます。

READMEには書いてないですが、`[label]`に何も指定しない場合、hostnameが使われます。

# おわりに
適当な作りなので、コマンド実行後にcurlのレスポンスがそのまま表示されます。
また、英語できないマンなので言葉がおかしいかもしれないです。
~~そのあたり誰かいい感じにしてほしいです。~~

GithubやBitbucket以外にもAPIでSSH鍵登録できるサービスがあれば、機能追加してプルリク貰えるととても嬉しいです。
Raspberry Pi2にWebサーバを構築し、LEDを点灯させる

ブラウザからLEDを点灯させるまでの手順メモ


# 目標

別PCのブラウザからhttp://192.168.11.75/~pi/cgi-bin/led_high.py にアクセスすることで、
Raspberry Pi2に接続したLEDを点灯させることが目標。
（アドレスやファイル名などは個人の設定に依る）

# Apacheのインストール

```sh:ターミナル
sudo apt-get install apache2
```

動作確認

テスト用のhtmlを以下のように作成する

```html:/var/www/html/test.html
<html>
<head>
<title>test</title>
</head>
<body>This page is test page.</body>
</html>

```

別PCのブラウザからhttp://192.168.11.75/test.html と入力し、以下の画面が出れば成功
(192.168.11.75の部分は各自の環境に応じて変更)
![test.png](https://qiita-image-store.s3.amazonaws.com/0/97314/f262c814-90a2-a898-f726-bbebeb87c785.png)


UserDir を有効化する

デフォルトでは、コンテンツの読み込みディレクトリが/var/www/となっている。
/var/wwwだと、sudoしないとファイルの編集が行えないので、
コンテンツの読み取りディレクトリを~/public_html/に対して出来るようにしておく。

```sh:ターミナル
$ sudo a2enmod userdir
```

```sh:ターミナル
$ mkdir ~/public_html
$ sudo cp /var/www/html/test.html ~/public_html
```

再起動

```sh:ターミナル
$ sudo service apache2 restart
```

これで、別PCのブラウザからhttp://192.168.11.75/~pi/test.html でアクセスできるようになる。
(192.168.11.75の部分は各自の環境に応じて変更)


# CGIの設定

Pythonスクリプトを実行するためにCGIの設定を行う

まずは、CGIを有効にする

```sh:ターミナル
$ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
```

設定ファイルの変更

```text:/etc/apache2/sites-available/000-default.conf
// 以下のコメントを外す
Include conf-available/serve-cgi-bin.conf
```
拡張子.pyのCGIが動作出来るように設定する。

```text:/etc/apache2/mods-available/mime.conf 
(変更前)
#AddHandler cgi-script .cgi
(変更後)
AddHandler cgi-script .cgi .py
```

CGIを動かすディレクトリの設定

```text:/etc/apache2/conf-available/serve-cgi-bin.conf
(変更前)
                ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
                <Directory "/usr/lib/cgi-bin">
(変更後)
                ScriptAlias /cgi-bin/ /home/pi/public_html/cgi-bin
                <Directory "/home/pi/public_html/cgi-bin"> 
```

再起動

```sh:ターミナル
$ sudo service apache2 restart
```

Pythonスクリプトの準備


```py:~/public_html/cgi-bin/test.py 
#!/usr/bin/python

print "Content-type: text/html"
print
print "<html>"
print "<head>"
print "<title>test</title>"
print "</head>"
print "<body>This page is test page.</body>"
print "</html>"
```

以上の設定を行い、
別PCのブラウザから、http://192.168.11.75/~pi/cgi-bin/test.py にアクセスすると、"This page is test page. "が表示される。

# LED点灯

回路は[Raspberry PiでLEDの点灯](http://qiita.com/aryoa/items/3f6d82b8c63761cef087)で記載したのもを使用する

pythonコードは以下の通り。

```py:~/public_html/cgi-bin/led_high.py 
#!/usr/bin/python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)

GPIO.output(25, 1)
time.sleep(2)

GPIO.cleanup()

print "Content-type: text/html"
print
print "<html>"
print "<head>"
print "<title>LEDtest</title>"
print "</head>"
print "<body>LED test success.</body>"
print "</html>"
```

別PCのブラウザからhttp://192.168.11.75/~pi/cgi-bin/led_high.py にアクセスすると、サーバーエラー（500）となる。
どうも、apacheではGPIOを制御できないのが原因っぽい。

そこで、apacheの実行ユーザーであるwww-dataのグループにgpioを追加してみる。
（apacheの実行ユーザーは、/etc/apache2/envvarsで確認した）

```sh:ターミナル
$ sudo gpasswd -a www-data gpio 
ユーザ www-data をグループ gpio に追加
$ sudo service apache2 restart # 再起動が必要
```

再び、別PCのブラウザからhttp://192.168.11.75/~pi/cgi-bin/led_high.py にアクセスすると、LEDが点灯した！！
OS X を El Capitan にアップグレードしてしまい HHKB Lite2が利用できなくなったときの暫定的対処方法

#HHKBのEl Capitan対応ドライバの提供時期は**[未定](https://www.pfu.fujitsu.com/hhkeyboard/hhkb_support/faq_el_capitan.html)**だそうです(2015/10/24時点)
※11月下旬公開予定になったようです(2015/11/11時点)
※対応ドライバが**[公開](https://www.pfu.fujitsu.com/hhkeyboard/download.html)**されました。**下記の対処は不要となりました**

# 暫定的対処方法
1. [FAQ](https://www.pfu.fujitsu.com/hhkeyboard/hhkb_support/faq_lite2.html#l23_6)に従いドライバーをアンインストールし、汎用USBキーボードとして設定する
2. [Seil](https://pqrs.org/osx/karabiner/seil.html.ja)で「かなキー」と「英数キー」を有効化する
![se.png](https://qiita-image-store.s3.amazonaws.com/0/48588/b576ff3c-dfdb-aec2-7beb-074eda09e645.png)

3. [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)で左コマンドキーを有効化する
![ka.png](https://qiita-image-store.s3.amazonaws.com/0/48588/4811f5e5-f01a-0905-3c8e-631e61876284.png)
dockerコンテナ間の依存関係グラフを見る

dockerコンテナは `--link`オプションの指定に従って依存関係が設定されていますが、この状態は `/var/lib/docker/linkgraph.db` に格納されています。

このファイルはsqlite3のデータベースなので、

```shell-session
sqlite3 /var/lib/docker/linkgraph.db
sqlite> select * from edge;
<entity id>|<parent id>|<name>
<entity id>|<parent id>|<name>
<entity id>|<parent id>|<name>
...
0||
```

という感じで確認できます。rootノード `"0||"` が入っていて、全てのエンティティはこれの子になっているようです。
行列のできるラーメン屋


KUPCの問題を見る前にこちらの問題を見てしまったため、コーディング時間は20分ですが実際に掛かった時間は不明です。すみません。

問題文には明記されていませんが、たとえば[8,1]卓に2人を入れることは可能です。
あと、最後の出力をするときは人を掃き出してはいけないのがポイント。最初clear_table()をtake_turn()に組み込んではまりました。

採点は、
https://github.com/cielavenir/procon/blob/c348846381e01a638a1854c24c8658e5a09c522b/hena/tyama_hena_validator.cpp
https://github.com/cielavenir/procon/blob/c348846381e01a638a1854c24c8658e5a09c522b/hena/tyama_hena_validator_test_mtsmfm151022.cpp
https://github.com/cielavenir/procon/blob/c348846381e01a638a1854c24c8658e5a09c522b/streambuf_fromfile.h
を用意して、

`g++ -O2 tyama_hena_validator.cpp tyama_hena_validator_test_mtsmfm151022.cpp -I. -DSTREAM_PORTABLE`
として、`a.out ruby mtsmfm151022.rb`とします。
(採点プログラムv2は使えません)

```mtsmfm151022.rb
#!/usr/bin/env ruby
#https://gist.github.com/mtsmfm/4b8ffb53ffac055f5843
N=8
def fill_table(a,n)
	idx=N.times.find{|st|n.times.all?{|i|a[(st+i)%N]==0}}
	if idx
		n.times{|i|a[(idx+i)%N]=1}
		true
	else
		false
	end
end
def clear_table(a)
	N.times{|i|
		a[i]=0 if a[i]==4
	}
end
def take_turn(a)
	N.times{|i|
		a[i]+=1 if a[i]>0
	}
end
		
if __FILE__==$0
	while gets
		a=[0]*N
		$_.chomp.chars{|c|
			clear_table(a)
			f=fill_table(a,c.to_i)
			take_turn(a)
			redo if !f
		}
		puts a.map{|e|e==0 ? 0 : 1}*'' 
		STDOUT.flush
	end
end
```
Microsoft Office for Mac 2016 でユーザーフォント・カラー・スタイルのテーマを保存する場所

Office for Mac 2011とは場所が変わっていたのでメモ。

* フォント：`~/Library/Group Containers/UBF8T346G9.Office/ユーザー コンテンツ/テーマ/Theme Fonts`
* カラー：`~/Library/Group Containers/UBF8T346G9.Office/ユーザー コンテンツ/テーマ/Theme Colors`
* スタイルセット：`~/Library/Group Containers/UBF8T346G9.Office/ユーザー コンテンツ/テーマ/Theme Colors/Style Sets`
【Wordpress】管理画面の設定に項目を追加する


忘れないようにメモ。詳細はそのうち追記予定。

まずは、function.phpに設定を追記する。
例として、設定 > 一般にサイトタイトル2とキャッチフレーズ2を追加してみる。

```php:function.php
/*
 * 一般設定に項目を追加
 */
function add_contact_info_field( $whitelist_options ) {
	$whitelist_options['general'][] = 'blog_title2';
	$whitelist_options['general'][] = 'catch_phrase2';
	return $whitelist_options;
}
add_filter( 'whitelist_options', 'add_contact_info_field' );

function regist_contact_info_field() {
	add_settings_field( 'blog_title2', 'サイトのタイトル2', 'display_blog_title', 'general' );
	add_settings_field( 'catch_phrase2', 'キャッチフレーズ2', 'display_catch_phrase', 'general' );
}
add_action( 'admin_init', 'regist_contact_info_field' );

function display_blog_title() {
	$blog_title = get_option( 'blog_title2' );
?>
	<input name="blog_title2" type="text" id="blog_title2" value="<?php echo esc_html( $blog_title ); ?>" class="regular-text">
<?php
}

function display_catch_phrase() {
	$catch_phrase = get_option( 'catch_phrase2' );
?>
	<input name="catch_phrase2" type="text" id="catch_phrase2" value="<?php echo esc_html( $catch_phrase ); ?>" class="regular-text">
<?php
}
```


設定はこれで完了。
表示する時は`get_option`使用する。

```php:header.php
<?php

echo get_option( 'blog_title2' );
echo get_option( 'catch_phrase2' );

?>
```
[メモ]H2OでHTTP/2を使ってみる

### 前提

H2Oインストール済みであること
http://qiita.com/igara/items/1b7cd8e714844440795d

opensslをインストール済みであること

### オレオレ認証書を作成する

```

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

```
設定はお好きに

### H2Oのコンフィグを作成

http通信用に作成

```h2o.conf

hosts:
 "example.com":
    listen:
     port: 8000
    paths:
        /:
         file.dir: /home/vagrant/web/slack_rack_php/public
         redirect:
           url: /index.php/
           internal: YES
           status: 307

file.custom-handler:
 extension: .php
 fastcgi.connect:
  host: 127.0.0.1
  port: 9000
  type: tcp

access-log: /home/vagrant/access-log
error-log: /home/vagrant/error-log
pid-file: /home/vagrant/pid-file

```

リバースプロキシとSSLの設定されたコンフィグ

```proxy.conf

listen:
 port: 8080
 ssl:
  certificate-file: /home/vagrant/server.crt
  key-file: /home/vagrant/server.key
hosts:
  default:
    paths:
      /:
        proxy.reverse.url: http://127.0.0.1:8000/

access-log: /home/vagrant/accessre-log
error-log: /home/vagrant/errorre-log
pid-file: /home/vagrant/pidre-file

```

### H2Oの起動

```

sudo h2o -m daemon -c h2o.conf
sudo h2o -m daemon -c proxy.conf

```

### HTTP/1とHTTP/2の比較

画像をいっぱい読み込むページを作成してみてちょっと比較を行ってみた。

こんなの

![スクリーンショット 2015-10-24 15.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/89599/b2915969-45c6-e624-3240-5baec013b0c2.png)

Chromeのプラグインで「HTTP/2 and SPDY indicator」もしくは
firefoxだと「SPDY indicator」というのを入れると
URLの隣に青いイナズマが表示され、
HTTP/2を用いられているサイトだとわかる。

#### HTTP/1

![スクリーンショット 2015-10-24 15.30.11.png](https://qiita-image-store.s3.amazonaws.com/0/89599/2560636e-973b-664e-1299-fe6927fd7c4c.png)

#### HTTP/2

![スクリーンショット 2015-10-24 15.32.30.png](https://qiita-image-store.s3.amazonaws.com/0/89599/e7c672aa-387f-0e38-40c0-969180e471dd.png)


HTTP/2は並列的に画像のダウンロードされているんですね。
LESSことはじめ

公式サイト
http://lesscss.org/

# 概要
- CSSを効率的に書くためのツール
- node.jsのパッケージとして提供されている
- 前提としてnode.js, npmがインストールされていること

# インストール
- グローバルにインストール

```bash
$ sudo npm install -g less
```

# 変換
- lessをcssへと変換するためのコマンド

```bash
$ lessc test.less test.css
```

# 変数
- @〇〇で変数として値を格納することができる

```css:test.less
@color : red;

h1 {
	font-color: @color;
}
```

変換後

```css:test.css
h1 {
  font-color: red;
}
```

## セレクタやプロパティ名にも変数を使える

```css:test.less
@color: red;
@header: h;

@{header}1 {
	font-color: @color;
}
@{header}2 {
	font-color: @color;
}
```
変換後

```css:test.css
h1 {
  font-color: red;
}
h2 {
  font-color: red;
}

```

# 入れ子構造
- 親子構造を記述することができる

```css:test.less
header {
	font-size: 18px;
	a {
		color: red;
	}
}
```
変換後

```css:test.css
header {
  font-size: 18px;
}
header a {
  color: red;
}
```
## &を用いると親要素のセレクタを指定することができる

```css:test.less
.button {
	&-ok {
		color: green;
	}
	&-ng {
		color: red;
	}
}
```
変換後

```css:test.css
.button-ok {
  color: green;
}
.button-ng {
  color: red;
}
```

# mixin
- 関数のように再利用可能な形として設定を使い回すことができる
- 引数を追加することもできる

```css:test.less
.button {
	&-ok {
		color: green;
		.mixin();
	}
	&-ng {
		color: red;
		.mixin(10px, 8px);
	}
}

.mixin(@size:5px; @padding:7px) {
	border: @size solid red;
	padding: @padding;
	margin: 7px;
}
```
変換後

```css:test.css
.button-ok {
  color: green;
  border: 5px solid red;
  padding: 7px;
  margin: 7px;
}
.button-ng {
  color: red;
  border: 10px solid red;
  padding: 8px;
  margin: 7px;
}
```

# extend
- いわゆる継承のようなもの
- mixinを使うよりも、継承元と継承先の関係性がはっきりしたマークアップが可能

```css:test.less
.button {
	font-size: 14px;
	border: 1px solid black;
}

.button-ok {
	&:extend(.button);
	color: green;
}

.button-ng {
	&:extend(.button);
	color: red;		
}
```
変換後
button-ok, button-ngはbuttonクラスを元にしているということが明示的にわかる

```css:test.css
.button,
.button-ok,
.button-ng {
  font-size: 14px;
  border: 1px solid black;
}
.button-ok {
  color: green;
}
.button-ng {
  color: red;
}
```

# extend VS mixin
- extendはmixinでも同じように書くことができるが、親子関係が曖昧になってしまう

```css:test.less
.button {
	font-size: 14px;
	border: 1px solid black;
}

.button-ok {
	.button();
	color: green;
}

.button-ng {
	.button();
	color: red;		
}
```
変換後
.button, .button-ok, .button-ngがそれぞれ独立した形になってしまっている

```css:test.css
.button {
  font-size: 14px;
  border: 1px solid black;
}
.button-ok {
  font-size: 14px;
  border: 1px solid black;
  color: green;
}
.button-ng {
  font-size: 14px;
  border: 1px solid black;
  color: red;
}
```
grep / 文字列を検索する


備忘録

## 構文
```bash
grep [ -[[AB] ]num ] [ -[EFGBchilnsvwx] ] [ -e pattern | -f file ] [ files... ]
```

## オプション
|option|content|
|:-:|:--|
|-G|	検索に正規表現を使用できる|
|-E|	検索に拡張正規表現を使用できる
|-F|	固定文字列の検索を行う
|-num|	マッチした行から前後num行を同時に検索結果として表示する
|-A num|	マッチした行から後num行を同時に検索結果として表示する
|-B num|	マッチした行から前num行を同時に検索結果として表示する
|-C|	マッチした前後2行を同時に検索結果として表示する
|-b|	各行の前に，ファイルの先頭からバイト単位のオフセット数を表示する
|-n|	各行の前に行番号を表示する
|-c|	検索条件にマッチした行数を表示する。-cvとするとマッチしなかった行数を表示する
|-e pattern|	検索条件を指定する
|-f file|	検索パターンとしてfileの内容を使用する
|-h|	検索結果の先頭にマッチしたファイル名を表示しない
|-i|	検索条件に大文字と小文字の区別をなくす
|-l|	検索条件にマッチしたファイル名を表示する。-lvとするとマッチしなかったファイル名を表示する
|-q|	検索結果を表示しない
|-s|	エラー・メッセージを表示しない
|-v|	マッチしない行を検索結果として表示する
|-w|	パターン・マッチを，単語全体で行うようにする
|-x|	行全体を検索対象にする
|files|	検索するファイルを指定する

## 説明
ファイル中の文字列を検索する。検索パターンとして正規表現を使用できる。


## 正規表現
|option|content|
|:-:|:--|
|.|	改行文字以外の任意の1文字
|*|	直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない
|^|	行の先頭を表す
|$|	行の末尾を表す
|[ ]|	かっこ内の任意の文字に一致。ハイフン（-）で範囲指定もできる。かっこ内の最初の文字に^を使用すると，意味が逆転する
|+|	直前の文字の1個以上の連続
|?|	直前の文字の0または1文字にマッチ
|pattern1`|`pattern2|	pattern1またはpattern2のいずれかにマッチ
|(pattern)|	patternをグループ化する
|\ |	正規表現に使われる記号を普通の文字として扱う

## 使用例
- 拡張子がtxtのファイルからhogeを検索

 ```shell
 $ grep "hoge" *.txt
 ```
- `<p>`のある行数を表示

 ```shell
 $ grep -ci "<p>" index.shtml
 ```
- hogeのプロセス情報を得る

 ```shell
 $ ps aux | grep "hoge"
 ```
Android Studioでのアプリ開発メモ -Activityの追加方法-

久しぶりに触ったらど忘れしていたのでメモ

右クリックして
new > Activity > Blank Activity

![スクリーンショット 2015-10-24 15.22.36.png](https://qiita-image-store.s3.amazonaws.com/0/6955/e01819b1-fd52-ebda-5fa2-d26f63549f64.png)

あとは表示されるwindowでクラス名やlayoutのファイル名を決める

以上
Swift Bridging Headerファイルの生成手順

ファイルの生成する場所と使う場所が違っているのはなぜか？？


```
Bridging-Headerファイルとは
Swiftコード内でObjects-Cで書かれたライブラリやコードを使う為のファイル

やり方

・XCodeのファイルからBridingHeaderファイルを生成する
・File => New => File../ => IOS:Object-C Fileを選択する。
・ファイル名自体は何でも良い
・Would you like to configure an Objective-C bridging header? => Bridging-headerファイル作るの？？と聞かれるからCreate

・ダミー用に作成したファイル名テキトーなファイルのファイル名.mは削除する
・XCworkSpaceに移動してからアプリの生成をおこなう。
```
Apache CordovaでAndroidアプリをビルドした時のエラーと解決方法 on Arch Linux

もう2週間以上前に出遭って解決したエラーだが、メモが残っていたので解決方法と合わせて公開しておく。

```
> cordova build

... 省略 ...

* What went wrong:
Execution failed for task ':CordovaLib:processDebugResources'.
> java.io.IOException: Cannot run program "/home/yu/opt/android-sdk-linux/build-tools/23.0.1/aapt": error=2, そのようなファイルやディレクトリはありません
```

http://stackoverflow.com/questions/18928164/android-studio-cannot-find-aapt

上記の通り、32bitアプリ関連のライブラリが不足しているのが原因らしい。
解決するには下記のパッケージを入れる。

https://www.archlinux.org/packages/multilib/x86_64/lib32-zlib/
https://www.archlinux.org/packages/multilib/x86_64/lib32-libstdc++5/

```
> sudo pacman -S lib32-libstdc++5
> sudo pacman -S lib32-zlib
```
IDCFクラウドのCentOSにFTPサーバを立てて、Filezillaで接続する方法

IDCFクラウドでFTPサーバ立ててみたのでメモしておきます

## サーバの設定（ssh編）

1. サーバにrootでsshログインした状態で開始
1. vsftpdをインストール　```yum -y install vsftpd```
1. vsftpdを起動　```service vsftpd start```
1. hogeユーザを追加　```useradd hoge```
1. hogeユーザのパスワード設定 ```passwd hoge```
2. ftpアクセスのグループが必要であれば、グループを追加する（ここでは、ユーザhogeを既存のhogegroupに所属させると仮定して話を進める）　
2. グループへの追加 ```usermod -G hogegrup hoge```
3. FTPでアクセスするディレクトリの権限を変更 ```chown hoge:hogegroup /var/www/html```
4. 終了

## サーバの設定（クラウドコンソール：管理画面編）

1. IDCFのクラウドコンソールにログイン
1. IPアドレスを選択
2. FTPで接続したいIPアドレス名をクリック
3. ファイアウォールのタブを選択し、[コメント->ftp_仮想マシン名(自由)]、[ソースCIDR->Any(MyIPがbetter)]、[ポートレンジ->21]で、追加
4. ポートフォワードのタブを選択し、[コメント->ftp_仮想マシン名(自由)]、[プライベートポート->21]、[パブリックポート->21]、[仮想マシン->お使いの仮想マシン名]で、追加

## FileZillaの設定

1. site managerでNew Siteボタンをクリックして、適当な接続情報を作成

### Generalタブの設定

1. Hostに管理画面編で選択したIPアドレスを入力
1. UserとPasswordに先ほどssh編で作成したユーザ名とパスワードを入力
1. 他の設定は下の画像をご参照ください

<img width="150" alt="step1.png" src="https://qiita-image-store.s3.amazonaws.com/0/49263/f34a5293-37df-66c6-bf48-35475cc5aca2.png">


### Transfer Settingsタブの設定

<img width="382" alt="step2.png" src="https://qiita-image-store.s3.amazonaws.com/0/49263/87eac818-8fb4-753d-f61a-f3664de26d11.png">


### FileZillaの設定

- FileZillaの設定に進んでください(Macの場合、「Command」 + 「,」など)
- Fall back to active modeを選択してください

<img width="565" alt="step3.png" src="https://qiita-image-store.s3.amazonaws.com/0/49263/298affc1-3044-4e50-80d7-e581e9469e52.png">

## 参考

- http://norm-nois.com/blog/archives/1529
Rubyのattr_accessor等について

Rubyの`attr_accessor`，`attr_reader`, `attr_writer`等が良く分からなくて，モヤモヤしていたので，調べて自分なりに納得したことをまとめておく．

例として以下のコードを考える．

```rb
class Triangle
  attr_accessor :baseLength, :height

  def initialize(baseLength, height)
    @baseLength = baseLength
    @height = height
  end
end

sankaku = Triangle.new(10.0, 3.0)
puts sankaku.baseLength
puts sankaku.height
```

クラスの定義の中で

```rb
attr_accessor :baseLength
```

のように書くとクラスのインスタンス変数`@baseLength`に

```rb
sankaku.baseLength
```

のようにアクセス可能になる．ここで個人的に気持ち悪かったのは，インスタンス変数名は`@`で始まるから

```rb
sankaku.@baseLength
```

とアクセスするようにしてもよさそうなのにそうなっていないこと．あと，

```rb
attr_accessor :baseLength
```

がインスタンス変数を外からアクセス可能にするための記述だというのなら，なぜ

```rb
attr_accessor @baseLength
```

のように記述しないのだろう？

まぁそれがRubyの仕様だと言ってしまえばそれまでだけど，，，，

いろいろ調べて，[「まつもと直伝　プログラミングのオキテ 第6回」](http://itpro.nikkeibp.co.jp/article/COLUMN/20070604/273453/)が一番腑に落ちた．これによると，

>　`attr_accessor`は内部的に次のような処理を行っています。
>
>（1）引数のシンボルすべてに対して以下の処理を繰り返す。
>
>（2）シンボルで指定された名前のメソッドを定義する。そのメソッドはシンボルの名前の先頭に「`@`」を付加したインスタンス変数の値を取り出す。
>
>（3）シンボルで指定されたメソッド名の後ろに「`=`」を付加した名前のメソッドを定義する。そのメソッドは引数を1つ取り，その値をシンボルの名前の先頭に「`@`」を付加したインスタンス変数に設定する。

とある．これから分かるのは，まず

```rb
sankaku.baseLength
```

の`baseLength`はインスタンス変数ではなくインスタンス変数`@baseLength`の値を返してくれるメソッドだということです．これで最初の私のモヤモヤ感は解消しました．

また2番目の気持ち悪さも，

```rb
attr_accessor :baseLength
```

という記述は，インスタンス変数を外からアクセス可能にする，ということをやっているのではないということですから，解消されます．つまりこの `baseLength` はインスタンス変数 `@baseLength` を意味しているのではなく，メソッドの名前なのだから `@` が付かなくて当然です．
エックスサーバーに wp-cli を導入する


`~/bin/` に導入し、エイリアスを張りました。

## 導入

```bash
$ cd ~
$ mkdir bin
$ cd bin
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
```

## 動作確認

```bash
$ wp-cli.phar --info
X-Powered-By: PHP/5.3.3
Content-type: text/html

PHP binary:
PHP version:	5.3.3
php.ini used:	/etc/php53/php.ini
WP-CLI root dir:	phar://wp-cli.phar
WP-CLI global config:
WP-CLI project config:
WP-CLI version:	0.20.2
```

## php-cli 経由で呼び出すようにする

`help` サブコマンドが下記のエラーになります。

```bash
$ wp-cli.phar help
PHP Warning:  proc_open() [<a href='function.proc-open'>function.proc-open</a>]: Descriptor item must be either an array or a File-Handle in phar:///home/username/bin/wp-cli.phar/php/commands/help.php on line 109
PHP Warning:  proc_close() expects parameter 1 to be resource, boolean given in phar:///home/username/bin/wp-cli.phar/php/commands/help.php on line 109
X-Powered-By: PHP/5.3.3
Content-type: text/html
```

下記のように `php-cli` 経由で実行してやるとうまくいきます。

```bash
$ php-cli wp-cli.phar help
```

なので、 `.bashrc` で `wp` にエイリアスを張ってみました。

```bash
$ echo "alias wp='php-cli ~/bin/wp-cli.phar'" >> ~/.bashrc
$ source ~/.bashrc
```

## 参考文献

- [wp-cli, php errors [using cgi-fcgi binary] · Issue #1085 · wp-cli/wp-cli](https://github.com/wp-cli/wp-cli/issues/1085)
ブラウザ上で動作する[開発|実行|チュートリアル|デモ]環境を作成できるCodePicnic

![codepicnic01.png](https://qiita-image-store.s3.amazonaws.com/0/54186/cc4a9000-9163-4427-1bcb-daa0c31244e3.png)

## デモ
いきなりですが以下のURLをクリックしてみてください。
ターミナルがブラウザ上で開き、Githubリポジトリを検索するCLIツールの[ghs](http://qiita.com/sona-tar/items/c11063cd3671c07b6e0a)を試すことができます。

[ghs - Trial page](https://codepicnic.com/consoles/ghs/embed?sidebar=closed&hide=save,show_result,download,options,run,second_terminal,readme)
`ghs　探したいリポジトリ`でGithubのリポジトリを検索可能です。

## 概要
[CodePicnic](https://codepicnic.com/)とは上記のように作成した環境をWeb上で公開することができるサービスです。

作成者は環境を更新して保存することができます。利用者は基本的には保存することはできませんが、ファイルを作成して再アクセスするとファイルは残っています。他のブラウザからアクセスするとファイルは残っていないので、恐らくクッキーなどでセッション管理をしていてセッションごとに環境が作成されていると考えられます。

## 価格
1ヶ月20時間の制限はありますが無料で使うことができます。
また$9.99で制限がなくなるお買い得な価格設定になっています。

[CodePicnic 価格](https://codepicnic.com/#profiles)

## ユースケース
このターミナルはWebページに埋め込むこと可能なので、以下のようなチュートリアルを簡単に作成することが可能です。プログラミング学習サイトの作成にも便利だと思います。
[Try Prediction.IO](https://docs.prediction.io/tryit/)

また単純にコンソール環境を提供するだけではなく、簡易的なWebサーバで動作確認することや1つのエディタを複数に共有してリモートペアプログラミングが可能になっています。
[CodePicnicの機能](https://codepicnic.com/features)

## 対応環境
- Go
- HTML, CSS, Javascript
- NodeJS
- Ruby
- Python
- Eclixer
- Bash
- C#
- PHP

## 環境の作成方法
1. CodePicnic - https://codepicnic.com/ にアクセス。


2. Sign up and try us now!からログイン。
![codepicnic2.png](https://qiita-image-store.s3.amazonaws.com/0/54186/abb2ed4c-2ddf-2dba-1816-956944a4f9af.png)


3. 左の NEW CONSOLE から作成したい環境の言語を選択
<img width="217" alt="codepicnic3.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/0e4d10bf-25fd-9886-badc-cfbbac005f4c.png">


4. Create で作成
<img width="219" alt="codepicnic4.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/b471fb6a-50df-b941-d4b8-0d70dc1aed4a.png">


5. New Name your consoleに適当な名前を入力して、下記のTerminalタブを開きたい環境を作成していく。終わったらターミナルの右上の`save`アイコンをクリック。
<img width="777" alt="codepicnic5.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/47c76350-dc22-51c8-b8c7-84ba44ea41b7.png">


6. ターミナルを公開したい場合は、下部のChange mode:を`Draft`から`Public`に変更
<img width="405" alt="codepicnic6.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/4ae67b54-3597-ef92-e64c-a45cfb1d4274.png">


7. 最後に右上のoptionsアイコン -> Shareで公開URLを取得。
<img width="750" alt="codepicnic7.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/d77db801-632d-53eb-de8d-95da8f0f0b45.png">

<img width="371" alt="codepicnic8.png" src="https://qiita-image-store.s3.amazonaws.com/0/54186/5a60755c-53aa-1181-9753-c836b8c6068e.png">
8. 公開するターミナルのUIの設定
デフォルトではサイドバーやその他アイコンが表示されてしまいますが、以下のように`sidebar=close`や`hide=save`をURLに追加すると非表示にすることができます。
https://codepicnic.com/consoles/ghs/embed?sidebar=closed&hide=save,show_result,download,options,run,second_terminal,readme


また`README.md`を作成しておくと`README`タブを表示することが可能です。

詳細は、以下をご覧ください。
[Embed Documentation - CodePicnic](https://codepicnic.com/docs/embedding)

以上で、完了になります。


## 類似ツール
CodePicnicはクラウドサービスですがOSSで[codetainer](https://github.com/codetainerapp/codetainer)というツールが存在します。
自前の環境をプライベートでブラウザ上から使う用途では良いかもしれません。
公開となるとセキュリティが不安です。

## まとめ
CodePicnicを利用すると公開したツールのトライアル環境を簡単にユーザに提供できるようになりました。
今後多くのツールがCodePicnicでトライアル環境が提供されるようになると嬉しいです。