OmniAICreator/Qiita-1.07M huggingface dataset:
Common Lispの手軽なSymbolの調べ方

# HyperSpecとは？
HyperSpecはCommon Lisp(以下CL)のシンボルをmanのように調べられる。
つまり CL の関数やマクロ、ifなどについて調べたくなった時は HyperSpec が頼りになる。
それを利用する上で、おそらく一番簡単な方法はここからシンボルを検索することだ。

```shell-session
w3m 'http://clhs.lisp.se/Front/X_AllSym.htm'
```
何の準備もいらない上にシンボルの一覧性はある。
しかし、perldocやpydocのように doc_command Symbol と利用したくなる。
平たく言えばめんどくさい。

# 試しにHyperSpecを利用する現実的なコード
補完もできないやっつけ仕事だか、書き出すとこんな感じになる。
引数無しで一覧の所に飛び、1つのシンボル名を与えると該当urlに飛ぶ。

```python3
#!/usr/bin/env python3
import urllib.request
import re
import subprocess
import sys

Symbol_ref = 'http://clhs.lisp.se/Front/X_AllSym.htm'
if len(sys.argv) == 1:
    to_Symbol_list = 'w3m ' + Symbol_ref
    subprocess.call(to_Symbol_list, shell=True)
elif len(sys.argv) == 2:
    with urllib.request.urlopen(Symbol_ref) as res:
        html = res.read()
        is_Symbol = 'Body/.+?#' + sys.argv[1] + '"'
        url_suffix = re.sub('#.*', '',
                            "".join(re.findall(is_Symbol, html.decode())))
        if url_suffix:
            do_w3m = 'w3m http://clhs.lisp.se/' + url_suffix
            subprocess.call(do_w3m, shell=True)
        else:
            print("The symbol was not found.")
else:
    print("Please input 0 or 1 Symbol of Lisp.")
```
# ソースをダウンロードして実用化したコード
これで使い勝手は分かるが、通信環境次第で遅さや利用できない事が気になる。
雰囲気をつかむお試しなら十分ながらperldocやpydocのような速度、
ネット環境に依存しない堅実性をもとめるとやはりダウンロードが必須になる。
幸い HyperSpec-7-0.tar.gz のような形でそのhtmlを丸ごとダウンロードできるので ~/lib/ に置くとする。

```python3
#!/usr/bin/env python3
import urllib.request
import re
import os
import subprocess
import sys

# USAGE: this-script.py or this-script.py [Symbol]
ref_dir = os.environ["HOME"] + "/lib/HyperSpec/"
ref_top_dir = ref_dir + "/Front/X_AllSym.htm"
if len(sys.argv) == 1:
    to_Symbol_list = "w3m " + ref_top_dir
    subprocess.call(to_Symbol_list, shell=True)
elif len(sys.argv) == 2:
    top_as_html = "file://" + ref_top_dir
    with urllib.request.urlopen(top_as_html) as res:
        html = res.read()
        is_Symbol = 'Body/.+?#' + sys.argv[1] + '"'
        url_suffix = re.sub("#.*", "",
                            "".join(re.findall(is_Symbol, html.decode())))
        if url_suffix:
            do_w3m = "w3m " + ref_dir + url_suffix
            subprocess.call(do_w3m, shell=True)
        else:
            print("The symbol was not found.")
else:
    print("Please input 0 or 1 Symbol of Lisp.")
```

補完も相変わらず効かない上にaspellのような正しくないシンボル名からタイポ復元を示唆することもできない。
荒いところはそのままだが、これで純粋に速度等々を改善できた。
cpコマンドの進捗状況をチェックする

コピー中にあとどれくらいか知りたい時があるんです、
特に`cp -v`を忘れた時に有用

[Xfennec/progress](https://github.com/Xfennec/progress)
調べたら、こちらのprogressを使うと簡単にできます

ダウンロード

```shell-session
git clone https://github.com/Xfennec/progress.git
Initialized empty Git repository in /home/kubor/src/progress/.git/
remote: Counting objects: 279, done.
remote: Total 279 (delta 0), reused 0 (delta 0), pack-reused 279
Receiving objects: 100% (279/279), 206.50 KiB | 111 KiB/s, done.
Resolving deltas: 100% (142/142), done.
```

コンパイル

```shell-session
cd　progress; make
cc -g -Wall -D_FILE_OFFSET_BITS=64 -c progress.c
cc -g -Wall -D_FILE_OFFSET_BITS=64 -c sizes.c
cc -g -Wall -D_FILE_OFFSET_BITS=64 -c hlist.c
cc -Wall progress.o sizes.o hlist.o -o progress -lncurses -lm
```

usage

```shell-session
./progress -h
progress - Coreutils Viewer
---------------------
Shows running coreutils basic commands and displays stats.

Commands monitored by default:
cp mv dd tar gzip gunzip cat grep fgrep egrep cut sort xz md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb 

Usage: ./progress [-qdwmM] [-W secs] [-c command] [-p pid]
  -q --quiet              hides all messages
  -d --debug              shows all warning/error messages
  -w --wait               estimate I/O throughput and ETA (slower display)
  -W --wait-delay secs    wait 'secs' seconds for I/O estimation (implies -w, default=1.0)
  -m --monitor            loop while monitored processes are still running
  -M --monitor-continous  like monitor but never stop (similar to watch ./progress)
  -c --command cmd        monitor only this command name (ex: firefox)
  -p --pid id             monitor only this process ID (ex: `pidof firefox`)
  -v --version            show program version and exit
  -h --help               display this help and exit
```
  
監視対象は結構いろいろあるみたいですね
>cp mv dd tar gzip gunzip cat grep fgrep egrep cut sort xz md5sum sha1sum >sha224sum sha256sum sha384sum sha512sum adb 

シンボリックリンクは、cvコマンドとしてリンクしておきます
coreutils viewerとのことですし

```shell-session
ln -s ~/src/progress/progress ~/bin/cv
```

cpで大きなファイルをコピー中に実行してみる
せっかくなので別セッションで実行してみます

```shell-session
cp huge_genome_R1.fastq /mnt/usb/
```

cpが別セッションで実行中に、新しく接続したセッションで監視してみます

```shell-session
cv
[32720] cp /home/oryza/exome/fastq/huge_genome_R1.fastq  /mnt/usb/ 44.4% (698.5 MiB / 1.5 GiB) 50.9 MiB/s eta 0:00:17
```

ファイルはフルパスで展開されるのですね
ちなみに`-m`オプションをつけるとリアルタイム監視できます
`watch cv`してるのと同じでしょうか

READMEを読むと`/proc`を読んでいるらしいです
データストアの同イベントに複数のコールバックを登録・解除する

# 概要
Milkcocoaのデータストアの同一イベント(たとえばpush)に、複数のコールバックを登録したり解除するとどうなるか確認してみた。特に解除するときに1つ1つ解除されるのか、それとも全部解除されるのかを試してみた。

# 登録・解除
データストアイベントへコールバックを登録するにはdatastore.on(イベント名,コールバック)でできる。今回はpushイベントに対して複数のコールバックを登録してみる。ボタンを押すとデータストアにデータがpushされるので、それに対して登録されたコールバックがどうなるか確認する。
解除はdatastore.off(イベント名)でできる。これでpushイベントに登録されたコールバックが1つずつ解除されるのか、それとも全部解除されるのか確認する。

# 結果
下記コードで試した。

```lang:コード
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <button id="send_button">send message</button>
    <button id="off_button">off</button>

    <script src='https://cdn.mlkcca.com/v2.0.0/milkcocoa.js'></script>
    <script>
        var milkcocoa = new MilkCocoa("{your-app-id}.mlkcca.com"); //ここは変えてください
        var ds = milkcocoa.dataStore("chat");

        // pushにコールバック登録1
        ds.on("push", funcA);

        // pushにコールバック登録2
        ds.on("push", funcB);

        // データをpushする
        document.getElementById("send_button").addEventListener("click", function (e) {
            ds.push("push");
        });

        // pushのコールバックを解除する
        document.getElementById("off_button").addEventListener("click", function (e) {
            ds.off("push");
        });
        
        function funcA() {
            console.log("pushed1");
        }

        function funcB() {
            console.log("pushed2");
        }
    </script>
</body>

</html>
```

```lang:push結果
pushed1
pushed2
```

```lang:解除後push結果
なし
```

# まとめ
同一イベントにコールバックを複数登録すると順に実行されました。たぶん処理は非同期なので、「処理1が終わってから処理2が実行される」わけではないと思いますが。
また、イベントに登録されたコールバックをoffで解除すると、1つ1つ解除されるわけではなく全部一気に解除されました。1つ1つ解除することはできないので、そういうときはoffした後に再登録する等の処理が必要そうです。
CakePHP3.0 → 3.1アップグレードで対応すべき点

CakePHP3.1.0がリリースされましたが、3.0.xからアップグレードすると、少し手を入れないといけなかったので、対応点を書いておきます。(たぶん他にもあると思いますが、私がやったものだけ。)

詳細は[3.1 Migration Guide](http://book.cakephp.org/3.0/en/appendices/3-1-migration-guide.html)を見てください。


# layoutの変更はviewBuilder()を使う

3.0では

```php
$this->layout = 'admin';
```
とやってlayoutを変更していましたが、3.1では

```php
$this->viewBuilder()->layout('admin');
```
と書くようになりました。

# helperのloadもviewBuilder()を使う

ControllerのbeforeRenderでヘルパーをloadする場合、3.0では

```php
$this->getView()->loadHelper('MyHelper');
```
としていましたが、3.1では

```php
$this->viewBuilder()->helpers(['MyHelper']);
```
と書きます。

# Emailのnamespaceが変わった

3.0では

```php
use Cake\Network\Email\Email;
```
でしたが、3.1では

```php
use Cake\Mailer\Email;
```
になりました。

あと、TestCaseで

```php
$this->getMock('Cake\Network\Email\Email');
```
と書いていたのですが、methodも指定しないと`className()`とかがcallできなくてエラーになってしまうので、

```php
$this->getMock('Cake\Mailer\Email', ['send']);
```
のようにmethodを指定するようにしました。(元々そうすべきだったかも。)

# Flashメッセージがstackになった

今まで書いてたものは特に変えなくて大丈夫だと思いますが、セッションの構造が変わった(配列になった)ので、TestCaseで

```php
$this->assertSession(__('更新できませんでした'), 'Flash.flash.message');
```
と書いてたのを

```php
$this->assertSession(__('更新できませんでした'), 'Flash.flash.0.message');
```
にしました。
Rebuild.fm 111単語帳

ちょっと前からRebuild.fmを聴いているのですが、自分の知識不足でさらっと当たり前のように出てくる単語の意味が分からないことがあって、都度調べているので、備忘も兼ねて（面白い回とか何度か聴くし）、オレオレ単語帳としてまとめてみたいと思います。

僕の知識基準なので、あくまでご参考程度に。。
（基本的にShow NotesにあるものはShow Notesをみるスタンスで）
ただ、間違っていること書いてあったらコメントくださいm(__)m

# 111: Not Too Technical（Naoya Ito）
今回のゲストは伊藤直也さん。Appleの話とHashiCorpの話題が多め。

## Kubernetes
* 読み方はクーバーネティス（た、たぶん）
* Dockerのスケジューリングツール（コンテナクラスタマネージャー）
* Googleのオープンソース

## Marathon
* Kubernetes的なやつ。
* 正確にはMesos≒Kubernetes？（MarathonはMesosの中でデーモンを実行させる役割を担う）
* 今回HashiCorpから発表されたNomadやDocker Swarmと同じような感じ

## Terraform
* HashiCorpのプロダクト
* インフラ構成をテンプレートファイルに記述して、クラウド環境に適用するツール
* AWS CloudFormationと似てる

## Atlas
* Hashicorpのプロダクト
* Vagrant Cloudのバージョンアップ
* 乱暴に言うと、開発、デプロイ時などの作業をひとつのプラットフォームで出来るツール（SaaS）

## Vault
* 書こうと思ったら、宮川さんが説明してくれました。

## 悲鳴ドリブン
* ワロタ

## two-factor authentication
* 二段階認証

## New Relic
* サーバーモニタリングサービス（Saas）
* 色んな言語や環境に対応

## Packer
* またまたHashiCorpプロダクト
* 1つのイメージから複数の環境への仮想マシンイメージをつくってくれるツール

## Serf
* HashiCorpプ（ry
* 疲れたのでHashiCorpプロダクトは参考サイトからどうぞ（丸投げ）

## Consul
* HashiCorpプ（ry
* 疲れたのでHashiCorpプ（ry

## サービス・ディスカバリ機能
* IPやリソースが動的に変化する昨今において、インフラ的な観点でなく、サービスとして、特定のポートやプロセスが正常稼働しているかを検出する機能
* 加えて、その結果をサービス単位でまとめる機能

# まとめ
いつも（特にnaoyaさん回）はもっと知らない単語がガンガン出てきて、ググりまくりで、今回は割とスムーズに聴けるなーと途中まで思っていたんだけど、後半急にガチ話連発でキャッチアップするの大変だったw
でも、とても勉強になりました。

http://rebuild.fm/111/

## 参考サイト
Dockerを管理するKubernetesの基本的な動作や仕組みとは？ Kubernetesを触ってみた。第20回 PaaS勉強会：
http://www.publickey1.jp/blog/14/dockerkubernetes_kubernetes20_paas_1.html
kubernetes/kubernetes · GitHub：
https://github.com/kubernetes/kubernetes
瞬殺で作るMesos + Chronos + Marathon + Dockerクラスタ環境：
http://qiita.com/TsuyoshiUshio@github/items/9d8f5b952b635d94ae6f
KubernetesとMesos：Dockerのスケジューリングツールの違いを理解する：http://thinkit.co.jp/story/2015/04/10/5855
サーバクラスタのためのオペレーティングシステムMesosを開発するMesosphereがアプリケーションコンテナDockerをサポート：http://jp.techcrunch.com/2013/09/27/20130926mesosphere-adds-docker-support-to-its-mesos-based-operating-system-for-the-data-center/
HashiCorpの新オーケストレーションツールTerraformを試してみた：
http://dev.classmethod.jp/cloud/terraform-first-impression/
Hashicorp社の新サービスATLASと周辺ツールのまとめ：
http://pocketstudio.jp/log3/2014/12/10/what_is_atlas/
HashiCorp社が出したVaultとはどういうものなのか：
http://kiririmode.hatenablog.jp/entry/20150429/1430279218
two-factor authentication（2要素認証）- Norton.com：
http://jp.norton.com/security_response/glossary/define.jsp?letter=t&word=two-factor-authentication
パフォーマンス監視サービスのNew Relicが超便利な件：
http://qiita.com/y_uuki/items/dd4fce78b1bc32b64600
AWSユーザなら無料で使えるNew Relic導入方法：
http://qiita.com/kou/items/fcb75108e6e882fd12bb
HashiCorpのツール「ATLAS」「VAGRANT」「PACKER」「TERRAFORM」「SERF」「CONSUL」「VAULT」：
http://www.creationline.com/hashicorp/products.html
サービス・ディスカバリのためのConsul入門：
http://thinkit.co.jp/story/2015/08/24/6343
途中のViewからUINavigationControllerを使う

# Problem

アプリ全体をナビゲーションコントローラーで管理したくはないが、一部でナビゲーションコントローラを使いたい。

# Solution

## StoryboardにUINavigationControllerを追加する

* StoryboardにUIViewControllerをドラッグする
* UIViewControllerが選択された状態で、Editor > Embed in > NavigationController

![nav1.png](https://qiita-image-store.s3.amazonaws.com/0/9875/abfe09ec-fa47-a005-7f62-f36e7661a7a6.png)

* NavigationControllerにStoryboard IDをつける。ここでは`NavigationVC`にした。

![nav2.png](https://qiita-image-store.s3.amazonaws.com/0/9875/3f6ef8e4-7659-77e6-b227-a09fe890b71c.png)

## NavigationControllerに遷移するためのコードを書く

```swift
class MainViewController: UIViewController {

  func presentNavigationViewController() {
    let navigationVC = self.storyboard?.instantiateViewControllerWithIdentifier("NavigationVC")   as! UINavigationController
    presentViewController(navigationVC, animated: false, completion: nil)
  }
}
```
vagrant上でrails 4.2.4プロジェクトを作成する

# 目的

vagrant環境上に、railsプロジェクトを作成した際にハマった点をメモする。

# 前提

windows環境にvagrantを入れて、rails 4.2.4プロジェクトを作成する。

- vagrant (CentOS6.5)
- ruby 2.1.7 (rbenv)
- rails 4.2.4

vagrantのインストールは、
[Windows上でVirtualBox+Vagrant+CentOSによる仮想環境構築｜Qiita @hiroyasu55](http://qiita.com/hiroyasu55/items/11a4c996b0c62450940f)

ruby + railsのインストールは、
[rails環境構築（CentOS + ruby on rails）｜Qiita @shinyashikis@github](http://qiita.com/shinyashikis@github/items/3501c5f7f71a8e345c3d)

上記を参考にした。

# 新規rails4.2.4プロジェクトの作成

### 1.  `rails new` コマンドで新しいプロジェクトを作成。

自動的に、`bundle install`を行わないように、`-- skip-bundle`オプションをつける。

```
rails new project_name --skip-bundle
```

下記でも可。

```
rails new project_name -B
```

### 2. Gemfileの編集
therubyracerの行をコメントインする。
JavaScript のエンジンv8を Ruby から使えるようにする。

```
vim Gemfile
```

### 3. gemのインストール

このとき、環境に依存しないように、pathを指定する。

```
bundle install --path=vendor/bundle
```

####**ハマりポイント1**

railsのプロジェクトがWindowsとvagrant上のCentOSの共有フォルダ内である場合、
上記コマンドが失敗する場合がある。
この場合は、pathを共有フォルダ以外に指定する必要がある。
以下に例を示す。

```
bundle install --path=~/bundle/project_name
```

以上は、下記のブログを参照した。
[Vagrant環境でのbundle installで失敗する｜tamo's blog](https://tamosblog.wordpress.com/2015/02/22/bundle-install_on_vagrant/)

### 4. WEBrick起動

WEBrick起動

```
bundle exec rails s
```

`http://localhost(or IP):3000` にアクセス。

####**ハマりポイント2**

Vagrantを使用している場合は、ポート番号とIPアドレスを指定する必要がある。
IPアドレスがわからない場合は、 `ifconfig` で調べる。
ポート番号はデフォルトポート3000番を使用する場合、省略可能である。

```
bundle exec rails s (-p 3000) -b 192.168.33.10
```

上記のようにポート番号とIPアドレスを指定した場合、以下のようにアクセス。

```
http://192.168.33.10:3000
```

追記：
以上については以下のページが詳しいので、ご参照ください。
[Rails 4.2.0のrails serverにアクセスできない｜Qiita @mizoki](http://qiita.com/mizoki/items/d3bdef3be252ece425b9)

# オプション

以下は、お好みで。

## 不要なログを削除する

本節は、下記のブログを大いに参考にした。
[Railsメモ(21) : quiet_assetsでアセットパイプラインのログを出力しないようにする ｜もた日記](http://wonderwall.hatenablog.com/entry/2015/08/17/100039)

WEBrick起動中、IPアドレスやアセットパイプラインのログが出る場合がある。
これらが不要の場合は、以下を行う。

### IPアドレスのログの非表示

`config/environments/development.rb`に以下を追加する。 

```
Rails.application.configure do
  …
  config.web_console.whitelisted_ips = '192.168.33.1'
end
```

### アセットパイプラインのログの非表示

Gemfileに以下を追加して、 `bundle install` を実行する。

```
group :development do
  gem 'quiet_assets'
end
```

一時的にログを出力したい場合は、 `config/application.rb` に下記行を追加。

```
config.quiet_assets = false
```

## Hamlを利用する

本節は、下記のブログを大いに参考にしました。
[Rails 4 で Haml を利用する手順｜Qiita @ hkusu](http://qiita.com/hkusu/items/acd487eec4bbfc9fed2f)

### 1. Gemfileに追加

```
gem 'haml-rails'
gem 'erb2haml'
```

### 2. `bundle install` を実行

ちなみに、 `.bundle/config` に `vendor/bundle` の場所を保存してあるので、
2回目以降は、 `path` を指定する必要はない。

```
bundle install
```

###  3.  `rake haml`  の実行

```
./bin/rake haml:replace_erbs
``` 

以上で、元からある.erbファイルが.hamlファイルに変換され、
hamlが使用されることがrailsに伝わる。
xcode7で適当なアプリをstoryboardを使ってアプリを作ろうとするとき、ViewControllerの縦横比がおかしい場合の対処法

xcode7で適当なアプリをstoryboardを使ってアプリを作ろうとするとき、ViewControllerの縦横比がおかしい場合の対処法

ちょっとセグエを使って、自分のiphoneで動くものを作ろうと思ったとき、
xcode7で縦横比について特殊になってしまったのはなかなか困ってしまいました。
(とても便利なんでしょうがスキルが）

そんなとき、固定して使う方法です。

1. こんな感じで新しいViewControllerを置きます。(一番最初にあるものも同じくです)

![Screen Shot 2015-10-06 at 16.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/80128/d794126d-6366-b255-da77-2f1e09faeb6e.png)

2. ViewControllerを選択し、写真と同じたぶを開きます。

![Screen Shot 2015-10-06 at 16.32.58.png](https://qiita-image-store.s3.amazonaws.com/0/80128/5e724523-de4c-4730-3b64-7546fab005d4.png)

3. サイズたぶ内を設定します。

![Screen Shot 2015-10-06 at 16.34.55.png](https://qiita-image-store.s3.amazonaws.com/0/80128/d35fec05-ee72-6341-a841-483ce108f53b.png)

ここら辺の設定で、iphoneかipadか設定できます。

![Screen Shot 2015-10-06 at 16.35.35.png](https://qiita-image-store.s3.amazonaws.com/0/80128/8e90eacc-0a3e-6a86-6a3d-7f3662ebad6b.png)
xcode 7 bate  実機転送後、"process launch failed: Security"と表示される場合の対処法

xcode7でアプリを作成し、iosデバイスに転送。
その後、"process launch failed: Security"と表示される場合の対処法です。

以前は、ios端末上でできたアイコンをタップ、信頼を押すと実行できたようですが、
私の環境 : xcode7 bate、ios9では、"Untrusted Developer"という表示しか出ません。
ちなみに、iphone6、ipad2でいずれも同じ表示でした。

解決方法としては、
1. xcodeを通して実行後iosデバイス上にアイコンができていることを確認します。
2. "Setting" > "General" > "Profile" を開きます。
3. すると、自分が開発に用いたApple IDがあります。それをタップします。
4. 開くと、自分が作成したアプリ一覧等が出てきます。
5. "Trust "hoge@hoge.hoge"等あると思うので、タップします。
6. タップ後ホップアップした通知は、"Trust"します。

これで実行できるようになりました。

ちなみに、ios端末は英語で使っており、日本語の方は表示が違うと思います。
[.NET] キャンセル可能なスレッドの休止

# 前置き
[Monitor.Wait/PulseよりもManualResetEventSlimを使う](http://qiita.com/laughter/items/1e64ab8712e410a8f047) は、.NET4.0以降の環境でスレッドをブロックするには、`Thread.Interrupt`で中断できる`Monitor.Wait`の代わりに、`CancellationTokenSource`で中断できる`ManualResetEventSlim`を使うべきだという内容だった。

`Thread.Interrupt`で中断できるメソッドは`Monitor.Wait`の他にもあって、`Thread.Sleep`と`Thread.Join`がそれだ。
では、`Thread.Sleep`はどうなのか。`CancellationTokenSource`でキャンセル可能なスレッドの休止を実現する方法はあるのだろうか。

# .NET Framework 4.0
## `CancellationToken.WaitHandle`
`CancellationToken`には、`WaitHandle`型の`WaitHandle`というプロパティが存在する。

`WaitHandle`クラスはシグナルを受信することができ、そしてシグナルを受信するまでスレッドをブロックすることで排他制御を実現する。
そして、この`WaitHandle`プロパティは、ひもづいている`CancellationTokenSource`オブジェクトの`Cancel`メソッドがコールされたタイミングでシグナルを受信する。

よって、`CancellationToken.WaitHandle`がシグナルを受信するのを休止したい時間だけ待ち受けることで、キャンセル可能なスレッドの休止を実現できる。
そのための`WaitHandle`のインスタンスメソッドは`WaitOne`だ。

- `WaitHandle.WaitOne()`
- `WaitHandle.WaitOne(Int32)`
- `WaitHandle.WaitOne(TimeSpan)`

待ち受ける時間を指定することもできるし、指定せずにシグナルを受信するまでずっと待ち受けることもできる。
どれを呼び出したとしても、シグナルを受信したら`true`を、できずにタイムアウトしたなら`false`を返す。

よって、キャンセルしたら例外を発生するスレッドの休止は以下のようになる。

```csharp:CancellableSleep.cs
if (canceltoken.WaitHandle.WaitOne(1000)) // sleep 1000ms
    throw new OperationCanceledException();
```
```csharp:CancellableInfiniteSleep.cs
if (canceltoken.WaitHandle.WaitOne()) // Infinite sleep
    throw new OperationCanceledException();
```

## より自然な記述を
`canceltoken.WaitHandle.WaitOne(1000)`という記述はひいき目に言っても、スリープしているようには見えない。
もっと自然なコードになるように、`CancellationToken`のインスタンスにメソッドがあるかのような拡張メソッドを追加することをおすすめする。

```csharp:CancellationTokenEx.cs
public static class CancellationTokenEx
{
    public static void CancellableSleep(this CancellationToken self, int millisecond)
    {
        if (self == null)
            throw new ArgumentNullException();
        if (self.WaitHandle.WaitOne(millisecond))
            throw new OperationCanceledException();
    }
}

...
canceltoken.CancellableSleep(1000); // sleep 1000ms
```

これで、`CancellationToken.CancellableSleep(Int32)`とすることで指定ミリ秒だけスリープし、キャンセルされたら例外を発生させることができる。
本当は、`Thread.Sleep(Int32, CancellationToken)`と`Thread`の静的メソッドとして呼び出せるようにしたいのだが、残念ながら、これは許可されていない。

# .NET Framework 4.5以降
.NET4.5からは、`Task.Delay`という静的メソッドが追加されている。

- `Task.Delay(Int32, CancellationToken)`
- `Task.Delay(TimeSpan, CancellationToken)`
 
のいずれかを呼び出すことで、キャンセル可能なスレッドの休止を実現できる。
ただし、以下の2点に注意すること。

- 「遅延後に完了するタスクを生成する」という動作をするため、`async`/`await` を理解しておく必要がある
- キャンセルされると、`OperationCanceledException`の拡張クラスである`TaskCanceledException`が`throw`される

周囲に`async`/`await`があるのなら、こちらを使ったほうが自然だ。
しかし、わざわざメソッドに`async`修飾子を追加したり、`async`/`await`を勉強するぐらいなら、`CancellationToken.WaitHandle` を使ったほうがいいだろう。

# 結論
`CancellationTokenSource`を使ってキャンセルされるかもしれない場面でのスレッドの休止には、`CancellationToken.WaitHandle`を使う。
.NET4.5以降の環境では、`Task.Delay`が選択肢に追加されている。

# おまけ
**Q** `Thread.Join`の代替になる、`CancellationTokenSource`によってキャンセル可能な`Task`の完了の待ち受け方法は？
**A** `Task.Wait(CancellationToken)`

# 参考情報
How to “sleep” until timeout or cancellation is requested in C#4.0
http://stackoverflow.com/questions/18715099/how-to-sleep-until-timeout-or-cancellation-is-requested-in-c4-0
404が急増！攻撃されてそうなときの対応（アクセス元を確認する）


404が増えてたり、突発的なアクセスがあったり、攻撃が行われているような気がしたときにやることをまとめました。
今回は「404の急増」を例にあげてますが、他の場合にも応用が効くとおもいます。
「他にもこんな方法があるよ！」などあれば教えていただきたいです。

今回は「2015/10/6の15:10-15:20に404が増えている」という状況を仮定してみます


## 1. 異常値が検出されたときのログを見る

2015/10/6の15:10-15:20のアクセスだけを抽出する

```
grep "06/Oct/2015:15:1[0-9]:" access.log
```

## 2. 404のリクエストの情報だけを抜き出す。
1のうち、404のリクエストとそれに付随する情報だけ抜き出す。
※ ログの形式によって、"$数字"の数字が違います。combinedだとこのまま使えるはず。。。

```
1: IP
7: リクエストパス
9: httpステータス
12,13: ユーザーエージェントの一部
　
grep "06/Oct/2015:15:1[0-9]:" access.log | awk '$9=="404"{print $1, $9, $7, $12$13}'
```

## 3. アクセスが多いIPを見つける

```sort```と```uniq -c```を使って、IPごとのアクセス数を昇順で出す
（昇順だと、一番多いのが見える範囲に出力されるから）

```
grep "06/Oct/2015:15:1[0-9]:" access.log | awk '$9=="404"{print $1, $9, $7, $12$13}' | sort | uniq -c | sort
```

## 4. アクセスIPから、情報を割り出す
おなじIPが多く検出されたら、そのIPの情報を持ってくる

```
whois [IP]
```

ちゃんと登録されていれば、Organizationなどがあるはずなので

```
whois 133.242.231.207 | grep Organization
#=> Organization:   Asia Pacific Network Information Centre (APNIC)
```
などで確認する

## 5. その後の対応

だいたい、海外サーバーを経由したcrawlerのアクセスでしょう。自分達の設定ミスによるものでない限りは、無視するか、特定のIPを弾きます。

crawlerのアクセスがサイトパフォーマンスに影響を与えるくらい深刻な場合は、あくまで一例ですが
・fail2banなどでエラーを出しまくるIPをbanする
・落ちてもすぐ復旧できるようにmonitを設定しとく
・異常通知が来るように、awsのアラート設定しておく
などの対応を行います。
システムに関連する解決できない問題、エラー情報の検索サイト

イベントビューワのエラーメッセージ。
Microsoftのエラーメッセージは、ベテランでも良く分からない方が多いと思われます。

そこで、エラー情報の検索サイトを紹介します。登録されている情報範囲内なら
エラーメッセージの内容やそれがシステムに問題ないのかを理解する手がかりとなります。
完全無料のサービスなので、登録しない手はないと思います。

【ホームページ】
http://se-knowledge.jp/
RaspberryPiでVPNアクセスポイントを作る

ゲーム機などにはVPNを使う機能がないので、VPN接続できるアクセスポイント作りたいなと思って試してみました。
~~実際は、家のネットワークが少し不自由だから、VPN経由だとSplatoon快適にできるんじゃねと思ったのがきっかけ~~

外出先とかで、ネットワークが信頼出来ない時とかにも使えるんじゃないでしょうか。

# 概要
RaspberryPiからSoftEther VPNのVPNサーバーにブリッジ接続して、USB無線LAN子機から直接接続するようにします。
簡単な流れを言うと、以下の様な感じです。

1. SoftEther VPN BridgeでVPNサーバーに繋ぐ
2. SoftEther VPN Bridgeのtapデバイスを作成する
3. USB無線LAN子機をAPモードでセットアップ
4. tapデバイスとUSB無線LAN子機のインタフェースをブリッジ

※SoftEther VPN ServerおよびSoftEther VPN Bridgeのインストール、カスケード接続は割愛します。

# 準備物
* RaspberryPi(SoftEther VPN Bridgeインストール済み)
* USB無線LAN子機(今回はGW-USWExtremeを利用)
* VPNサーバー(SoftEther VPNを利用)

# パッケージのインストール
```zsh
$ sudo apt-get install bridge-utils hostapd
```

GW-USWExtremeはapt-getでインストールしたhostapdでは動かないため、対応したものに置き換えます。

```zsh
$ wget http://www.adafruit.com/downloads/adafruit_hostapd.zip
$ unzip adafruit_hostapd.zip 
$ chmod 755 hostapd
$ sudo mv /usr/sbin/hostapd{,.bak}
$ sudo mv hostapd /usr/sbin
```

# hostapdの設定
`/etc/hostapd/hostapd.conf`を開いて以下のように書き換えます。

```
interface=wlan0
bridge=br0
driver=rtl871xdrv
ssid=えすえすあいでぃー
hw_mode=g
channel=6
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=ぱすわーど
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
macaddr_acl=0
#macaddr_acl=1
#accept_mac_file=/etc/hostpad/accept_macaddress.conf
ieee80211n=1
wmm_enabled=1
#ht_capab=[HT40+][GF][SHORT-GI-40][TX-STBC][RX-STBC1]
logger_syslog_level=3
```

`ssid`と`wpa_passphrase`は適宜変えてください。
今回はブリッジを行うので`bridge`の項目も記入します。(もしかしたらあまり意味ない？)

# ブリッジ設定

まずは`/etc/network/interfaces`に`wlan0`と`br0`の設定を加えます。

```
allow-hotplug wlan0
iface wlan0 inet manual

auto br0
iface br0 inet dhcp
# bridge_ports wlan0
```

hostapdが自動的にbr0にwlan0を追加してくれるそうですが、うまくいかない人は`bridge_ports`の行の`#`を外して最初から追加されるようにしてください。

# SoftEther VPN Bridgeの設定
ローカルブリッジ設定からtapデバイスを追加しておいてください。
ここでは`tap_ap`という名前のtapデバイスを作ったことにして進めます。

`/etc/init.d/vpnbridge`を編集して、起動時に`tap_ap`が`br0`に追加されるようにします。

```zsh
#!/bin/sh
# chkconfig: 2345 99 01
# description: SoftEther VPN Server
DAEMON=/usr/local/vpnbridge/vpnbridge
LOCK=/var/lock/subsys/vpnbridge

test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
sleep 5

# SoftEther VPNで追加した仮想tapデバイス名を調べる
ap=`/sbin/ifconfig -a| awk '$1 ~ /^tap_ap/ {print $1}'`
/sbin/brctl addif br0 $ap
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
```

ポイントとは、`brctl`で`tap_ap`を`br0`に登録しているところなので、自分のスクリプトに合わせて調整するといいと思います。
このスクリプトでは、念のため5秒waitを入れています。

# 動作確認
各サービスを再起動して設定を反映させます。
Wi-Fiに接続して、VPN先のIPアドレスが割り当てられていれば成功です。

# 参考
* [Raspberry Pi を無線 LAN アクセスポイントに - TenForward]( http://tenforward.github.io/blog/2013/12/24/hostapd/)
* [Raspberry Piの無線LANルータ設定 - GreenLeaf](http://greenleaf.sakuraweb.com/index.php?Raspberry%20Pi%E3%81%AE%E7%84%A1%E7%B7%9ALAN%E3%83%AB%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A)
otto での Ruby & mysql 環境の構築について


otto では`otto compile`時に自動でアプリケーションのタイプ（言語等）を判別する機能がある。
Ruby 環境の判別基準は以下。

- *.rb のファイルがある
- Gemfile がある
- config.ru がある

自動判別ではなく、明示的にRubyであることを伝える方法もある。
以下のようにAppfileを作成する。

```Appfile
application {
    name = "test-app"
    type = "ruby"
}
```

これで、`otto compile`時にRubyと判別されるようになる、

ottoでRubyアプリだと判断した場合に、
自動でRubyアプリに必要なミドルウェア、ライブラリ等を含めた上でVMを立ち上げてくれるわけだが、
Rubyに必要なモノはなんなのか？
デフォルトで入るモノは以下。

- Ruby(現在は 2.2.3 の最新) and RubyGems
- bundler
- node.js
- git,mercurial
- postgreSQL dev headers

また、Rubyの`gem install`に必要なライブラリ等も入っている。(libxmlとか)
以下のように記述することで特定のversionを指定することもできます。

```Appfile
customization "ruby" {
    ruby_version = "2.1"
}
```

## mysql を含めたtype ruby のvm作成
otto では dependency として別でcompileしたAppfileを含める事ができる。
以下は、type docker で、mysqlを起動するAppfileを依存として記載している。
（このやり方が正しいのかはわかりませんが、好きではない・・・。）

```Appfile
application {
    name = "test-app"
    type = "ruby"

    dependency {
        source = "github.com/tamai/otto-mysql"
    }
}
```

以下のコマンドでvmを作成

```
otto compile
otto dev
```

作成されたvmに入ります。
残念ながら、mysqlクライアントは入らない為、手動で入れます。

```
otto dev ssh
sudo apt-get install mysql-client-core-5.5
```

以下のコマンドでdb接続可能

```
mysql -h 172.16.1.92 -u root -p
```

IPアドレスは以下のコマンドで確認可能。

`otto dev address`
[Elixir] PhoenixでJSONを返すWeb APIを作る

※ Phoenix 1.0.3

# やること

1. `mix phoenix.gen.html`する
2. RouterにAPIリクエストを受けるためのpipelineを設定する
2. ControllerでContent Negotiationを指定する
3. ViewにJSONを返すよう記述する

## 1. 事前準備

以下を実行

```zsh
mix phoenix.gen.html Note notes title:string description:text
```

`mix phoenix.gen.json`というタスクもあり、こちらはすぐにAPIを用意したいだけなら十分なコードが生成される。ただし管理に便利なWebUIは自動生成されないため、今回は`mix phoenix.gen.html`の方を使う。

## 2. Router

この辺はrouter.exにコメント書きされているのでなんとなくわかる。

```web/router.ex
defmodule Demo.Router do
  use Demo.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", Smaug do
    pipe_through :browser

    get "/", PageController, :index
    resources "/notes", NoteController
  end

  scope "/api", Smaug do
    pipe_through :api

    resources "/notes", NoteController, only: [:index, :show]
  end
end
```

`plug :accepts, ["json"]`を指定することで、`Accept: application/json`のあるHTTP Requestのみを許可してくれる。

また、`resources/3`でAPIとして公開するメソッドを制限できる。

## 3. Controller

生成されたControllerには、Templateのファイル名がStringでベタ書きされている。これだと`Accept: application/json`を指定したHTTP Requestを飛ばしてもContent Negotiationが行われない。

そこで、以下のようにAtomで指定する。

```web/controllers/note_controller.ex
#（該当箇所のみ抜粋）
def index(conn, _params) do
  notes = Repo.all(Note)
  # render(conn, "index.html", notes: notes)
  render(conn, :index, notes: notes)
end
```

## 4. View

mixが生成したViewだとJSONへのencodingが行われず、poisonがエラーを出す。そのため以下のようにViewを修正する。

```web/views/note_view.ex
defmodule Demo.NoteView do
  use Demo.Web, :view

  def render("index.json", %{notes: notes}) do
    %{data: render_many(notes, Demo.NoteView, "note.json")}
  end

  def render("show.json", %{story: story}) do
    %{data: render_one(note, Demo.NoteView, "note.json")}
  end

  def render("note.json", %{note: note}) do
    %{id: note.id,
      title: note.title,
      description: note.description}
  end
end
```

## 確認

```zsh
curl 'http://localhost:4000/api/notes' -v -X GET -H 'Accept: application/json'
```
windows環境の git で改行コードの自動変換に注意

windows環境で git を使っていて、改行コードが意図しないものになってしまっていたことがあり、git for windows には改行コードの自動変換というものの存在に気づきました。
git のインストーラーのデフォルト設定では、この自動変換がONになっているので、備忘録のためにおさらい。

#git for windows（msysgit） のインストール
最新版のダウンロード　⇒　[git for windows](https://git-for-windows.github.io/)
インストールの詳細については以下を参照。
⇒　[私家版 Git For Windowsのインストール手順](http://opcdiary.net/?page_id=27065)
⇒　[WindowsにGitをインストールする手順について](http://increment-log.com/git-install/)
このインストーラーでデフォルト設定でインストールしていくと、改行コードの自動変換がONになっているので注意！

(1) Select Components ⇒　デフォルトでOK

(2) Adjusting your PATH environment
　○ Use Git Bash only
　● Run Git from the Windows Command Prompt
　○ Run Git and included Unix tools from the Windows Command Prompt

⇒　2つ目にしておくと Gitが環境変数のPATHに追加されコマンドプロンプトや PowerShell.ext などからも Gitコマンドを使えるようになるので便利。
3つ目は find.exe や sort.exe の既存の動作に影響があるので注意。

(3) レポジトリへのチェックイン、チェックアウト時の改行の取り扱い
　○ Checkout Windows-style, commit Unix-style line endings
　　チェックアウト時に改行コードを[LF]から[CR+LF]に変換し、コミットする時に[CR+LF]を[LF]に変換する。
　● Checkout as-is, commit Unix-style line endings
　　チェックアウト時は改行コードを変換せず、コミット時のみ[CR+LF]を[LF]に変換する。
　○ Checkout as-is, commit as-is
　　チェックアウト時もコミット時も改行コードを変換しない。

⇒　デフォルトだと1つ目になっているので、2つ目 or 3つ目に変更。
　　巷の記事を見ていると、改行コードの制御は Gitでは行わない方がよいと思われる。


インストールの（3）でデフォルトのままインストールしてしまった場合、以下で設定変更が可能。
コマンドラインでの設定

```
> git config --global core.autoCRLF false
```

設定ファイルを直に編集する場合は、C:\Users\ユーザー名 配下の「.gitconfig」を開いて編集。
[core] に「autoCRLF = false」を追加。

```lang:.gitconfig
[user]
	name = hoge
	email = hogehoge@seeds-std.co.jp
[core]
	preloadindex = true
	autoCRLF = false
```

＜参考サイト＞
・[git での改行コード](http://qiita.com/shuhei/items/2da839de8803cb335f86)
・[gitの改行コード自動変換でハマッた話](http://qiita.com/naoqoo2/items/dbc4f55d1ce0162d97a7)
・[Git for Windows でレポジトリー上の CR LF を LF に変換する手順](http://tech.nitoyon.com/ja/blog/2014/03/28/git-crlf-to-lf/)
・[Windowsでgitを使う場合の改行コード自動変換がうざい](http://www.seeds-std.co.jp/seedsblog/2551.html)



ついでに TortoiseGit 備忘録も。

#TortoiseGit インストール
最新版ダウンロード　⇒　[TortoiseGit](https://tortoisegit.org/)
日本語パックのダウンロード　⇒　[TortoiseGit - Language Packs](https://tortoisegit.org/download/)

それぞれのインストール手順は以下を参照
⇒　[TortoiseGitを日本語化するまでの手順](http://little-braver.com/177/)
⇒　[チュートリアル1 Gitの基本 : Gitのインストール](http://www.backlog.jp/git-guide/intro/intro2_1.html)

##日本語化
TortoiseGit ⇒ 日本語化パックの順にインストール後
1. 右クリックで TortoiseGit のメニューを表示 「TortoiseGit」 > 「Settings」
2. 設定画面「General」の「Language」で日本語を選択してから「OK」をクリック
Android Gradle Plugin で JDK Version が自動的に設定される

# 悩んだ点

Android Studio で apk などをビルドするとき、build.gradle に、Java JDK のバージョンを指定する場合がありますが、指定しない(android.compileOptions を指定しない)場合は、Android Gradle Plugin がよしなに処理します。

* 例
    * compileSdkVersion を 19 にする -> JDK 1.6 が設定される
    * compileSdkVersion を 23 にする -> JDK 1.7 が設定される
 
どこでよしなにやっているのかが分からなかったので調べました。

[AbstractCompilesUtil.java](https://android.googlesource.com/platform/tools/base/+/master/build-system/gradle-core/src/main/groovy/com/android/build/gradle/tasks/factory/AbstractCompilesUtil.java)

```java:AbstractCompilesUtil.java
JavaVersion javaVersionToUse;
if (compileSdkLevel == null || (0 <= compileSdkLevel && compileSdkLevel <= 20)) {
    javaVersionToUse = JavaVersion.VERSION_1_6;
} else {
    javaVersionToUse = JavaVersion.VERSION_1_7;
}
```

つまるところ、Google としては、compileSdkVersion が API20 以下だと JDK1.6、API21からは JDK 1.7 でコンパイルすることをデフォルトとしている、ということになります。ちなみに CompileOptions クラスの JDK のデフォルト値は JavaVersion.VERSION_1_6 になっています。

# おまけ

gradle(w) 実行時に、--debug オプションを付けるとわかるのですが、ログに -source, -target が出ないことがあります。

* 例：JDK1.7 環境 + compatibility を 1.6 にする

> [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -source 1.7 -target 1.7 -d ...

* 例：JDK1.7 環境 + compatibility を 1.7 にする
 
> [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -d ...

つまり、ビルド環境の JDK のバージョンと、compatibility のバージョンが一致していた場合は、-source, -target がログに出ないことになります。こちらは Gradle Java Plugin の仕様のようです。
JAVAランダムな配列-出力される要素は重複を許可する

(取り出し方はランダム、出力数は配列の要素数とイコール、出力される要素は重複を許可する)

```java

import java.util.Random;

public class test1 {
	private static Random rand = new Random(System.currentTimeMillis());

	public static void main(String[] args) {
		test5();
	}

	public static void test5() {
		for (int i = 0; i < 10; i++) {
			System.out.println(rand.nextBoolean() ? "A" : "B");
		}
	}
}

▪️実行結果
Marimo-no-MacBook-Air:JAVA marimo$ java test1
A
B
B
A
B
A
A
A
A
A
Marimo-no-MacBook-Air:JAVA marimo$ java test1
A
A
B
B
A
A
A
A
B
B
[Swift2.0] UILabelとUIImageViewのタップイベント処理を実装する

tagを使ってタップイベントを処理します。

# 実装例(Swift2.0)

```swift
class MainViewController: UIViewController {
  @IBOutlet weak var sampleImageView: UIImageView!
  @IBOutlet weak var sampleNameLabel: UILabel!
  
  let tagSampleImageView = 1
  let tagSampleNameLabel = 2
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    sampleImageView.userInteractionEnabled = true
    sampleImageView.tag = tagSampleImageView
    
    sampleNameLabel.userInteractionEnabled = true
    sampleNameLabel.tag = tagSampleNameLabel
  }

  override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesEnded(touches, withEvent: event)
    for touch: UITouch in touches {
      let tag = touch.view!.tag
      switch tag {
      case tagSampleImageView, tagSampleNameLabel:
        print("tapped")
      default:
        break
      }
    }
  }
}
```
WordPressのSuperCacheで正規表現を使って特定のブラウザでオフにする

# 初めに
WordPressのSuperCacheが凄く便利なんだけど、ブラウザによってはオフにしたくて、でもその指定が面倒だったのでカスタマイズしてみた。

具体的にはAndroidのFireFoxでオフにしたかったんだけど、それだとワイルドカード指定とかが必要で、そういったことができないかなーとおもったけど出来なかったので本体にパッチをあてた。

# 修正点
該当のコード

```php:wp-super-cache\wp-cache-phase1.php
function wp_cache_user_agent_is_rejected() {
	global $cache_rejected_user_agent;

	if (!function_exists('apache_request_headers')) return false;
	$headers = apache_request_headers();
	if (!isset($headers["User-Agent"])) return false;
	if ( false == is_array( $cache_rejected_user_agent ) )
		return false;
	foreach ($cache_rejected_user_agent as $expr) {
		if (strlen($expr) > 0 && preg_match('/'.$expr.'/', $headers["User-Agent"]))
			return true;
	}
	return false;
}
```

`wp-super-cache\wp-cache-phase1.php`の516行目付近にある`wp_cache_user_agent_is_rejected`を書き換え。
`if (strlen($expr) > 0 && stristr($headers["User-Agent"], $expr))`
となっているところを
`if (strlen($expr) > 0 && preg_match('/'.$expr.'/', $headers["User-Agent"]))`
とした。
JAVA無限ループ(交互に繰り返す)

```java

public class test1{
	public static void main(String[] args) {
		test2();
	}

	public static void test2() {
		//問題4 AとBが交互に出る無限ループを作ってください。
		for(int d = 0; ; d++) {
			if(d % 2 == 0) {
			System.out.println("A");
			}else{
			System.out.println("B");
			}
		}
	}	
}


▪️実行結果
A
B
A
B
A
B
A
B
A
B
A
B
A
B
A
B
・
・
・
・
・
JAVA無限ループのつまづきやすい所

▪️問題 　AとBが交互に出る無限ループを作ってください。

```java
public class test1{
	public static void main(String[] args) {
		test2();
	}

	public static void test2() {
		for(int d = 0; ; d++) {
			if(d % 2 == 0) {
			System.out.println("A");
			}
			System.out.println("B");
			}
		}
	}	
}
```
▪️実行結果
A
B
B
A
B
B
：
：

▪️解説
ループブロック内で
・System.out.println("B"); は常に実行
だが、
・System.out.println("A"); は条件付き実行
だから。

その条件が if(d % 2 == 0
% は剰余演算子。
この場合「整数2で割った余り」になる。
d は 0, 1, 2, 3, 4, ... なので、その2の剰余を
考えてみればいい。
d%2 == 0 は「偶数だったら」に等しい。

ｄが偶数だったら
System.out.println("A");
System.out.println("B");
両方が実行されるが、基数だったら
System.out.println("B");
しか実行されない。

それを延々繰り返すから
A
B
と
B
の繰り返しになる。

▪️解説2
以下の様に1ステップずつ机上デバッグを行えばわかるはずです。

1.初期状態d = 0でループ開始。
2.if文の判定。d = 0よりd % 2 == 0が成立 → "A"を出力。
3.if文を抜ける。
4."B"を出力。
5.d++により、d = 1になる。
6.if文の判定。d = 1よりd % 2 == 0は不成立。
7.if文を抜ける。
8."B"を出力。
9.d++により、d = 2になる。
10.if文の判定。d = 2よりd % 2 == 0が成立 → "A"を出力。
11.if文を抜ける。
12."B"を出力。
13.d++により、d = 3になる。
14.if文の判定。d = 3よりd % 2 == 0は不成立。
15.if文を抜ける。
16."B"を出力。
17.d++により、d = 4になる。
18.if文の判定。d = 4よりd % 2 == 0が成立 → "A"を出力。
19.if文を抜ける。
20."B"を出力。
：
：
あとはこれの繰り返しです。


この実装を日本語で書くなら、
・dが偶数の時、"A"を出力する。
・dの値に関係なく、"B"を出力する。
となっています。
dが偶数の時は"A"と"B"が出力され、dが奇数の時は"B"のみが出力されるので、
A
B
B
A
B
B
：
となるのです。

AとBを交互に出力するなら、
・dが偶数の時、"A"を出力する。
・dが奇数の時、"B"を出力する。
という実装にする必要があります。
SoftetherVPNを用いてMacでSSL-VPN方式で通信するには


現在、SoftetherVPNが配布してるMac版のクライアントは上手く動作しなかった。

これを解決する方法を２つ考えてみたので、簡単な方を紹介する。

１つ目、OpenVPNのクライアントのTunnelblickを用いる方法。

２つ目、LAN内に新しくVPNセッションが張ってあるものにルーティングしてくれるゲートウェイを立て、それにスタティックルーティングする方法。

２つ目は、ルーティングやネットワーク知識が必要なのでひとまず、置いておいて、簡単に出来る１つ目を紹介する。しかし、macbookのようにリソースが少ないものは、クライアントを動かさなくてもよい２つ目がいいかもしれない。

##OpenVPNのクライアントで接続する方法。
1. Tunnelblickのダウンロード  
　　　https://tunnelblick.net
2. SoftetherVPN ServerのOpenVPNの設定を有効にする  
    * SoftetherVPNサーバー管理マネージャのOpenVPN/MS-SSTP設定を押す  
    * OpenVPNサーバー機能を有効にする  
    * OpenVpnクライアント用のサンプル設定ファイルを生成  
3. 仮想NATを有効にする
    * 使用している仮想HUBの管理画面から仮想NATおよび仮想DHCPサーバー機能(V)からSecureNAT機能を有効にする。
4. OpenVPNの設定をインストールする  
    * 設定をダウンロードした後、クライアントPCに移す。
    * zipファイルを解凍する。
    * ****access_l3.ovpnをダブルクリックし、インストールを終わらせる
　　
5. OpenVPNの設定を弄る  

    以下より、インストールした設定を弄る(OpenVPN 接続先設定ファイルを編集....)
![スクリーンショット 2015-10-01 16.14.09.png](https://qiita-image-store.s3.amazonaws.com/0/95018/5eb74ff0-fb85-1830-69c0-3ef6aa52ba15.png)


　　まず、多くのproxyサーバーなどはUDPを許可していないので必要であればtcpに変えておく
　　　　![スクリーンショット 2015-10-01 15.43.08.png](https://qiita-image-store.s3.amazonaws.com/0/95018/34abf9d0-b718-7503-1461-05f41c1f2023.png)



　　　次にポート番号をリッスンしてるtcpのポート番号に変えておく。

![スクリーンショット 2015-10-01 15.44.27.png](https://qiita-image-store.s3.amazonaws.com/0/95018/b9f934f6-734b-7a2d-2b29-e1f2919eee68.png)


これで接続すればきっと大丈夫なはず.....
node.js をアップデートしたら、npm でエラー

nodist で久々に（！）node.js のアップデートをしようとしたら、nodistのバージョンが古かったようで、nodist最新版にごそっと入れ替え。
⇒　[nodist update でこんなエラーが出たら...](http://qiita.com/yokoh9/items/20d6bdc6030a3a861189#nodist-update-でこんなエラーが出たら)

無事 node.jsも最新版（stable ver.4.0.0）になったと思ったら、今度は npm でエラー。。。
Mac だとこんなエラー地獄にはならないのだろうか。さすがにうんざり。
npm コマンド全般が使えなくなっている感じ。

```
> npm -v
Error: Cannot find module 'are-we-there-yet'
at Function.Module._resolveFilename (module.js:336:15)
at Function.Module._load (module.js:286:25)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (C:\nodist\bin\node_modules\npm\node_modules\npmlog\log.js:2:16)
at Module._compile (module.js:434:26)
at Object.Module._extensions..js (module.js:452:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
```

なんかモジュールがないよと怒られている模様。
ダメ元で

```
> npm install are-we-there-yet
```

なんてやっても同じエラーで怒られる。

検索したら同じエラーで困っている人発見！
⇒　[npm doesnt work, get always this error -> Error: Cannot find module 'are-we-there-yet'](http://stackoverflow.com/questions/31025048/npm-doesnt-work-get-always-this-error-error-cannot-find-module-are-we-ther)

npm が壊れているらしい。npm だけ再インストールした方がいいよと。

(1) グローバル node_modules ディレクトリに移動

```
> cd /nodist/bin/node_modules
```

(2) npm ディレクトリを削除（もしくはどこかへ避難がいいね）
(3) 最新版をダウンロード　⇒　[GitHub - npm](https://github.com/npm/npm)
(4) (1)のディレクトリ内の npm の中身をごそっと入れ替え
(5) npm のバージョン確認

```
> npm -v
3.3.6
```

(6) 念のため最新バージョンの確認を

```
> npm update -g npm
```

これでエラーも出なくなり、npm が使えるようになった！

ちなみに、こんなコマンドもあるらしい。
⇒　[【Node.js】足りないモジュールをたったの一行でインストールするコマンド](http://qiita.com/KENJU/items/5b2fda95be4685a750e1)

```
> npm install -g npm-install-missing
> npm-install-missing
```
Genymotion の仮想端末に Google Play を入れる(2015/10時点)


内容的には、 [Android - Genymotionの仮想端末に Google Play をインストール](http://qiita.com/snaka/items/260b9cbe12a75ab98171) とほぼ同じ、違う点は Lollipop(v5.1) になった点。

# GenyMotion をインストール

(省略)

# 仮想環境を作成

とりあえず

* Android version: 5.1.0
* Device model: Google Nexus 4

で作成

# ARM Translation をインストール

[android - How do you install Google frameworks (Play, Accounts, etc.) on a Genymotion virtual device? - Stack Overflow](http://stackoverflow.com/questions/17831990/how-do-you-install-google-frameworks-play-accounts-etc-on-a-genymotion-virt)

上記ページの "ARM Translation Installer v1.1 Hosted by FILETRIP" のリンクからダウンロード

![スクリーンショット 2015-10-06 12.52.35.png](https://qiita-image-store.s3.amazonaws.com/0/8219/7cdcf390-e3c1-aad6-e4ba-e63766de9804.png "スクリーンショット 2015-10-06 12.52.35.png")



※オリジナルは以下のサイトだが、リンク等は上記が新しい

[[GUIDE] Genymotion | Installing ARM Translat… | Android Development and Hacking | XDA Forums](http://forum.xda-developers.com/showthread.php?t=2528952)



# Google Apps for Android

同じページの "Google Apps for Android 5.1" のリンクから Google Apps の zip ファイルをダウンロード。

![スクリーンショット 2015-10-06 12.56.10.png](https://qiita-image-store.s3.amazonaws.com/0/8219/3fe645c2-e0ad-8a1b-0eab-cb2bc247e6fb.png "スクリーンショット 2015-10-06 12.56.10.png")



念のためダウンロードした zip の MD5 をチェック

```bash:Macの場合
$ md5 path/to/gapps-5.1-2015-04-20-15-56-24.zip
```


# ARM Translation 及び Google Apps for Android のインストール

インストールは ARM Translation -> GApps の順番に、ダウンロードした zip ファイルを Genymotion の仮想端末のウィンドウにドラッグ＆ドロップでOK

インストールしたらPlayストアのアイコンタップして起動できたら完了。

![スクリーンショット 2015-10-06 13.38.20.png](https://qiita-image-store.s3.amazonaws.com/0/8219/5b26ede6-14c9-aa96-3682-f0fe97ead8a1.png "スクリーンショット 2015-10-06 13.38.20.png")
PowerShell で CSV に SQL（Select文）を投げつける


q コマンドをインストール出来ないネットから隔絶された PC で、CSV ファイルに SQL を投げたかったので振休使って調べました。q コマンドについては下記参照。

* [CSV形式のデータをSQLを使って解析する](http://qiita.com/nishio-dens/items/6cf528f3fcdba0e20f9b)
* [csvや標準入力をsqlで取得できるqコマンド](http://qiita.com/astrsk_hori/items/fbe61e988f526d22efc9)

実装は[Code](#code)の節参照。

# 使ってみる

## データ

文字コードはUTF-8

```utf8
No,Ａ,Ｉ,Ｕ
1,あ,い,う
2,か,き,く
3,さ,し,す
```

```utf8
No,Ｅ,Ｏ
1,え,お
3,せ,そ
```

## 投げつける Select 文

```bash
@(
  "select * from R.csv",
  "select * from S.csv",
  "select R.No, Ａ, Ｉ, Ｕ, Ｅ, Ｏ from R.csv R inner join S.csv S on R.No = S.No"
) | %{$_ | Select-Csv | Format-Table}
```

## 結果

```
﻿No Ａ Ｉ Ｕ
--- - - -
  1 あ い う
  2 か き く
  3 さ し す

﻿No Ｅ Ｏ
--- - -
  1 え お
  3 せ そ

No Ａ Ｉ Ｕ Ｅ Ｏ
-- - - - - -
 1 あ い う え お
 3 さ し す せ そ
```

# 参考にしたサイトとか

* [powershell からのSQLserver接続](http://qiita.com/rogasawara/items/a5ecd37753a83025781a)
  * 今回の実装は、ここのコマンドの'OleDB mode'をCSVに特化させたもの。


* [Textfile connection strings](https://www.connectionstrings.com/textfile/)
  * CSVファイルなので、ConnectionString は Textfile 用になる。


* [Microsoft.Jet.OLEDB.4.0 Converting Characters](http://stackoverflow.com/questions/5794072/microsoft-jet-oledb-4-0-converting-characters)
  * 文字コードの設定方法はここで見つけた。


* [Schema.ini File (Text File Driver)](https://msdn.microsoft.com/en-us/library/ms709353(v=vs.85).aspx)
  * 細かい設定は ini ファイルを作らないとできないらしい。
  * 区切り文字が ini ファイルでしか設定できないのがキツイ。


# Code


```bash
function Select-Csv
{
  Param
  (
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)] 
    [String] $Query,

    [ValidateNotNullOrEmpty()]
    [String] $Path = (Get-Location).Path,

    # [Text.Encoding]::GetEncodings() | % Name
    [ValidateSet('UTF-8', 'Shift_JIS')]
    [String] $Encoding = 'UTF-8',

    [ValidateNotNull()]
    [Switch] $NoHead
  )

  Begin
  {
    $close = {
      if ($Connection -ne $null)
      {
        $Connection.Close()
        $Connection.Dispose()
      }
    }

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")
    $Connection  = New-Object 'System.Data.OleDb.OleDbConnection'
    $Cmd         = New-Object 'System.Data.OleDb.OleDbCommand'
    $DataAdapter = New-Object 'System.Data.OleDb.OleDbDataAdapter'
    $DataSet     = New-Object 'System.Data.DataSet'

    $Path = Resolve-Path $Path
    $HDR = if ($NoHead) {'NO'} else {'YES'}
    $CharacterSet = [Text.Encoding]::GetEncoding($Encoding).CodePage

    $ExtendedProperties = @(
      "Text"
      "HDR=${HDR}"
      "FMT=Delimited"
      "CharacterSet=${CharacterSet}"
    ) -join ";"

    $Connection.ConnectionString = @(
      "Provider=Microsoft.Jet.OleDb.4.0",
      "Data Source=${Path}",
      "Extended Properties=`"${ExtendedProperties}`""
    ) -join ";"

    trap {& $close; break}
  }

  Process
  {  
    $DataSet.Tables.Clear()

    $Cmd.CommandText = $Query
    $Cmd.Connection  = $Connection 

    $DataAdapter.SelectCommand = $Cmd 
    $DataAdapter.Fill($DataSet) | Out-Null

    $DataSet.Tables[0]

    trap {& $close; break}
  }

  End {& $close}
}
```
CSSで紙がめくれたような影をつける【四角・丸】

四角い紙に影をつけるものはたくさんあったけど、
丸いのがなかったからつくってみた。

## 四角

![スクリーンショット 2015-10-06 12.26.54.png](https://qiita-image-store.s3.amazonaws.com/0/34634/e84fec37-7b4b-5cc9-70a1-e0e9603d1016.png)

```
<div class="square shadow"></div>
```

```
.shadow {
    position: relative;
}
.shadow:after {
    position: absolute;
    right: 2px;
    bottom: 5px;
    content: '';
    width: 45%;
    height: 10px;
    background: #aaa;
    box-shadow: 0 6px 12px #aaa;
    transform: rotate(3deg);
    z-index: -1;
}
```


## 丸

![スクリーンショット 2015-10-06 12.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/34634/9fd6c1b9-5cb4-efea-29bb-c9f1f7759feb.png)

```
<div class="circle shadow circleShadow"></div>
```

```
.circleShadow:after {
    right: 1px;
    bottom: 8px;
    width: 80%;
    height: 80%;
    border-radius: 50%
}
```

## おまけ

ホバーしたら影がつく

```
.shadow {
    position: relative;
    transition: 0.5s;
}
.shadow:after {
    opacity: 0;
    position: absolute;
    right: 2px;
    bottom: 5px;
    content: '';
    width: 45%;
    height: 10px;
    background: #aaa;
    box-shadow: 0 6px 12px #aaa;
    transform: rotate(3deg);
    z-index: -1;
    transition: 0.5s;
}
.shadow:hover:after {
    opacity: 1;
}
```

※transitionを使う場合、bodyに背景を設定しないとtransitionの時間の間背景色が変わってしまうみたいです。
cordovaでiOSアプリをビルドした際に、bitcodeのエラーが出た場合のメモ


##問題
cordovaでiOSアプリをビルドした際に下記のエラーが発生した。

```
ld: '/Users/XXX/platforms/ios/hogehoge/Plugins/cordova-plugin-google-analytics/libGoogleAnalyticsServices.a(TAGHit.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **


The following build commands failed:
	Ld build/device/hogehoge.app/hogehoge normal armv7
```

##原因
Xcode6.x以前で作成されたプロジェクトファイルを、Xcode7.xでビルドする。
その際にライブラリ（上記だとcordova-plugin-google-analytics）を使用している場合、エラーとなることがあるようです。

◎参考
><a href="http://qiita.com/satoshi_imanishi/items/8b64af8262d7fe2eb2ba" target="_blank">Xcode7でbitcodeのエラーが出た</a>

##解決策
PROJECT > Build Options > Enable Bitcode をNOに設定する。
![スクリーンショット 2015-10-06 11.55.57.png](https://qiita-image-store.s3.amazonaws.com/0/11290/c15a112a-b871-a0e6-a24d-767adfef2b03.png)
NetBeans glassfish 連動不具合の対処

JavaEEの開発環境として利用されるNetBeansとglassfishですが、Windows環境で利用する場合に連動できない事象に当たりました。ちょっとハマりましたので対処方法を掲載しておきます。

#事象
- NetBeansからglassfishに起動をかけると、"web.xmlエラー"などのメッセージで起動に失敗する。
- サーバーアイコンを展開してglassfishを選択、実行してもNG。
- ファイルを選択して実行してもNG。
- インストール直後の最初のデプロイでは成功する。
- コマンドラインからのglassfish直接起動は成功する。
- ソースデバックはglassfishの再起動が掛かるためできない。

#原因
プロジェクトのパスに全角文字が含まれていると、本事象に至るようです。

NG)
- C:\Users\太郎\Documents\NetBeansProjects
- D:\ＪａｖａＥＥ\NetBeansProjects

OK)
- C:\Users\Taro\Documents\NetBeansProjects
- c:\NetBeansProjects
- D:\JavaEEProjects

Windowsの場合、名前などの全角文字でアカウントが作られてしまう場合が有ります（私がそうでした）。NetBeansのデフォルトではプロジェクトフォルダをマイドキュメント配下に作成するので、そのままだとプロジェクトフォルダまでのパスに全角文字が混ざることになります。このケースでプロジェクト作成し、デプロイすると本事象に当たってしまうようです。

#対処
アカウントが英数の場合は対処不要です。インストール直後とデプロイ後で対処が違います。

### [アカウントが半角英数の場合]
対処は不要です。但し、アカウント名とログイン名が違うケースが有るので注意して下さい。私がそうでした :scream: 

### [インストール直後の場合]
新規プロジェクトの際には、全角文字を含めないパスを指定して下さい。以降、新規作成の際には該当パスにはそのパスが使用されます。
以下は設定例です。
![image](https://qiita-image-store.s3.amazonaws.com/0/94957/1ce15b9b-3d2e-891f-cabe-77a6e11feb52.png)

### [デプロイ後の場合]
一旦、すべてのプロジェクトをアンデプロイする必要が有ります。
1.コマンドラインからstartserv.bat [domain名]コマンドでglassfishを起動します。
![image](https://qiita-image-store.s3.amazonaws.com/0/94957/858e9ea4-730e-561d-9341-ed6627d2f9e5.png)

2.続いてNetBeansを起動し、サービスタブのサーバーを展開します。
![image](https://qiita-image-store.s3.amazonaws.com/0/94957/cdcc8b69-8c9a-088e-e2c9-4b533f1d45fb.png)

3.アプリケーションを選択し、すべてのアプリケーションをアンデプロイします。
![image](https://qiita-image-store.s3.amazonaws.com/0/94957/f5cfbed9-598f-6879-d85f-8994ebd614fd.png)

4.glassfishがNetBeansから起動・停止可能となったことを確認します。glassfishをクリックして、起動を掛けて成功すればOKです。

5.NetBeansを終了します。

6.マイドキュメント配下にあるプロジェクトフォルダを、全角文字を含まないパスに移動します。

7.NetBeansを起動し、”プロジェクトを開く”で移動先のフォルダからプロジェクトを指定します。

8.ビルドを実行すると自動でglassfishが起動され、デプロイされればOKです。
dockerのイメージ


2年位前（2015年10月）に作成した記事ですが、新人へのdockerコマンドの説明用に公開します。

![d01.JPG](https://qiita-image-store.s3.amazonaws.com/0/14914/ab001fc3-cbc4-3732-14de-7c529836784e.jpeg)

![d02.JPG](https://qiita-image-store.s3.amazonaws.com/0/14914/32016c19-a7b5-ba7a-8f9f-4de0286fefae.jpeg)

![d03.JPG](https://qiita-image-store.s3.amazonaws.com/0/14914/5644b0d5-66b7-b463-1b86-6c2cc4d8004c.jpeg)

![d04.JPG](https://qiita-image-store.s3.amazonaws.com/0/14914/0f4c4a6b-d136-3bb1-7810-89c76685b018.jpeg)

ちなみに`docker ps`で起動してるコンテナの一覧。
`docker ps -a`で全てのコンテナの一覧が見れる。