OmniAICreator/Qiita-1.07M huggingface dataset:
Boost.勉強会 #17 東京に参加してきた

トイレ行こうとしたら会場の出口付近にいた江添さんにニコニコのステッカー貰いました。会社のノートには既にドワンゴステッカー貼っているのですがどこに貼ろう。

こういう勉強会に参加するのは初めてだったので、隅っこのほうで聞くだけでした。感想とか書こうと思います。
普段使ってないLaptopを持ちだしてみたら、いつの間にか液晶が割れててショックでした。
一応全滅はしてなかったので、講演中のメモは取れましたが……。

# Boostライブラリ一周の旅 1.54.0-1.58.0
遅刻しました＼(^o^)／

なので、ほとんど聞いてません。
スミマセン。

# LINQ for C++のご紹介

Boostではない。
発表者は普段C#とかやっている人らしいです。
LINQは初耳。
見た感じ、色々なコンテナに対してSQLみたいなクエリ文っぽい物を実行する機能といった感じのもの。
LINQ for C++は、C#にコア言語機能として組み込まれているこれをC++でもそれっぽく実装したもののようでした。
仕方ないことだとは思うけど、operator >> を悪用したあの記法がちょっと気持ち悪い。
中身は無難に、条件式とかはラムダ式で（多分関数オブジェクトならラムダじゃなくてもいいと思うけど）与える。コンテナは多分inputiteratorが実装されていればいいのではないでしょうか。
配列型を受け取るfrom_arrayが別に実装されているみたいだけど、std::beginとstd::endを使えば良いんじゃないかな？
後でソースコード眺めておこうかな、と思います。

# Siv3D で楽しむゲームとメディアアート開発
Boostではない。
Siv3Dというマルチメディアライブラリを開発している方による発表。
簡単なコードでゲームや音楽プレイヤーなどのアプリケーションが作れるすぐれものっぽいです。
豊富なデモを使って素晴らしい発表をしておられました。
画像であればピクセル単位のから画像認識のような処理、音声であれば波形編集レベルからピッチ変更まで、できることは幅広いようです。
あと、キーボード・マウス・ゲームパッドにとどまらず、Kinectや音声入力など12種類もの入力方法を実装しているようです。
Windowsでゲーム開発したい人はDXライブラリなんか使ってる場合じゃねえって感じでした。
ただし、今のところ対応プラットフォームはWin32、Win64の32ビットモードだけ、ということで、Macやスマートフォンでは使えないようです。惜しい。
ちなみに、Boostは内部で使っているそうです。

# Boost.Logとfluentdで始めるログ活用術
Boost.Logをどのように使うかという話。普通にファイルに出力して、fluentdに解析を任せる感じのことを仰っていました。
ログの出力フォーマットでプレースホルダーを使うとか、LTSVフォーマットにするのが良いとか。
LTSVにする時は、出力する値にTabが入ってきたのをちゃんとエスケープしないと解析に失敗しそうですね。

# Boost.odeintで遊ぼう
発表者の方はCADとかやっているらしい。趣味は幾何学って言ってました。数学とかすごく得意そうです。私はもう微分なんか忘れました。
さて、Boost.ODEIntがどういうものかと言うと、常微分方程式の初期値問題の解法を近似するライブラリだそうです。むずかしいことはわかんないです＞＜
とりあえず自然対数の低eのt乗する方程式x(0)=1, x'(t)=x(t)に関して、Euler法で近似を求めてグラフ表示するサンプルを見ました。tを0.1刻みで計算すると、誤差がかなり大きい。刻みを細かくすると誤差は減るが、その分計算量が増大する。
そういうわけで、Boost.ODEIntではRunge-Kutta法というEuler法と比べるとかなり誤差が小さいアルゴリズムがデフォルトになっているらしいです。こちらで計算すると、確かにかなり誤差が小さい。
その後、いくつか他の例を表示しておられました。
発表者の方は機械設計に関わっているようなので、確かにこういった計算は便利だろうなと思います。
ただ、通常のゲームでの物理演算などであれば、計算済みの方程式を与えたほうが良さそうので、使いどころは少ないかも……

# MessagePackとAPIバージョニング
Boostではない。
MessagePackのC/C++実装、msgpack-cの中の人の発表。
msgpack-cと言っても、C++の実装はCのラッパではなくちゃんとC++で書かれているそうです。
msgpack-cそのものは、ヘッダオンリーのライブラリなのですが、既存のmsgpack-cを利用したビルド済みライブラリと同時使用するとABI互換性が崩れた場合に衝突する。そこをAPIのバージョニングにinline namespaceを使うことで解決しようというお話と、そうした場合にADLに問題が起こったという話でした。
ただ、ADLの問題に関しては、usingを使えば解決できるのでは？　と思っていましたが、同じことを質問した方がいらっしゃいました。
msgpack-cに関して、破壊的変更をしたバージョンアップをしたばかりのようですが、また元に戻るかもしれません。
MessagePackは個人的にいずれ使いたいと思っているので、これからの動向に注目しておきたいと思います。

# Boost.Container特有の機能
これは主催者さんのもの。
Boost.ContainerはいわゆるSTLコンテナのBoost実装で、次期標準に入る機能を先取り実装していたり、現在の標準ライブラリで設計ミスといえる部分（std::vector<bool>など）を排除していたり、独自のコンテナを含んでいたりするそうです。
あと、デフォルトコンストラクタで例外を投げないことが保証されているそうで、こちらに統一できるなら使う意義は色々とありそうです。
また、vectorのresize時にdlmallocのreallocを使って、メモリ領域が伸張出来る場合にメモリ移動を抑制してくれるとか。

# C++11やEmscriptenと付き合って１年間の振り返り
Emscriptenを使ってオンラインゲームを作っている方二人の発表。
C++11になって書きやすくなったよ！　という話と、Emscriptenの効果や問題点などを語ってくれました。
Emscriptenには興味はあるのですが、なんかこう、多分Webブラウザ関係の技術はそっちには行かない気がします。どちらかと言うと、TypescriptとかDartのアプローチが近いかなーと。
静的なコンパイルでC++並の最適化ができるモダンなWebスクリプト言語とか出てこないもんですかね（無茶ぶり）。

# 感想
技術というものは本当に日進月歩ですね。
個人的に一番面白かったのはSiv3Dの発表でした。
ただ、対応プラットフォームがWin32だけというのが本当に惜しい。これでAndroidとかiPhoneに対応できたらスゲーと思うんですが。
今後に期待したいと思います（上から目線）
【Javascript】入れ子になったulタグとその親のliタグのclassnameを取得する

```html:001.html

<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>入れ子になったulタグとその親のliタグのclassnameを取得する</title>
<style type="text/css">
</style>
</head>
<body>

<h3>JavaScript</h3>

<ul  id="menu">
  <li>配列</li>
  <li class="parent_1">関数
    <ul class="child_1">
      <li>Functionオブジェクト</li>
      <li class="parent_2">関数の呼び出し
       <ul class="child_2">
           <li><a href="#">メソッド呼び出しパターン</a></li>
           <li><a href="#">関数呼び出しパターン</a></li>
           <li><a href="#">コンストラクタ呼び出しーンパターン</a></li>
           <li><a href="#">apply呼び出しパターン</a></li>
       </ul>
　　　</li>
    </ul>
  </li>
</ul>

<script type="text/javascript">

window.onload=function(){

  var element = document.getElementById("menu").getElementsByTagName("ul");

  for(i=0;i<element.length;i+=1){
     console.log("element[" + i + "].className="+element[i].className);
     console.log("element[" + i + "].parentNode.className="+element[i].parentNode.className);
  }

}

/*
"element[0].className=child_1"
"element[0].parentNode.className=parent_1"
"element[1].className=child_2"
"element[1].parentNode.className=parent_2"
*/

</script>
</body>
</html>

```

##解説
jQuery等のライブラリの使用せずに、入れ子になったulタグとその親のliタグのclassnameを取得する。

```js
var element = document.getElementById("menu").getElementsByTagName("ul");
element.length//2
```
javascriptを勉強して長いが、document.getElementById().getElementsByTagName()って初めて書いた。
element.lengthって3じゃなく2であることに驚いた。
Windows8 OSのHDDをCentosで読もうとしたときのメモ

Windows8 OSが起動しなくなってしまい、HDDをCentOSで読もうとしたら、NTFSのため、
読み込めないというエラーが出た。
そこで
yum -y install ntfs-3g
で、ntfsのHDDを読めるようにしたが、それでも次のエラー、

Metadata kept in Windows cache, refused to mount.
Failed to mount '/dev/sdb5': 許可されていない操作です

Windows8 OSのブートの設定のためらしい。
こちら↓をみたら、
http://askubuntu.com/questions/439634/unable-to-mount-ntfs-hard-drive-partition-the-disk-contains-an-unclean-file-sys

ntfsfix というコマンドでひとまず修復できそうなのだが、
ntfsfixコマンドが見つからない。
あれこれgoogleで調べて、ntfsprogs をインストールすればよいとわかる。
yum install ntfsprogs

これで次のコマンドを実行できた。
ntfsfix /dev/sdb5

Windows8 OSのHDDをLinuxで読めるようになった。

※ 壊れたWindows PCのHDDで実施しています。ntfsfix /dev/sdb4 などのコマンド実行後、Windowsの起動は保証できません。
セルを縦方向に結合するExcelマクロ

## やりたいこと
選択範囲のセルを縦方向に結合する。

## 使い方
1. セルを選択  
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/80231/ed5bf2c2-28a2-d741-1000-ffce5f0bc6b3.png )
2. マクロ実行  
3. セルが縦方向に結合される  
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/80231/706f6550-54d4-a250-6519-b5335a1db5ec.png)

## コード

```vbnet:Module1
Option Explicit

Public Sub verticalMerge()
    
    Dim rng As Range
    Dim i As Long
    
    '選択範囲がセルでない時は動作させない
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Set rng = Selection
    
    '複数領域を選択した時は動作させない
    If rng.Areas.Count > 1 Then Exit Sub
    
    '縦方向にマージする
    With rng
        For i = 1 To .Columns.Count
            Range(.Item(1, i), .Item(.Rows.Count, i)).Merge
        Next
    End With
    
    Set rng = Nothing
    
End Sub

```

## 検討
今回は、シンプル化するために一つのエリアを選択した時のみ動作する仕様にした。
複数のエリアを選択した場合は、各エリアごとに行数と列数を調べて、同じように処理すれば対応可能。
Dockerを使って、すぐElixirが使えるように

普段の仕事でIDCFクラウド使って、バーチャルマシン立ち上げて、Elixirをインストールすることがよくあるので、面倒になって、人の作ったimageを使って、すぐElixirが使えるようにしたいです。

dockerをインストールして、起動します。[trenpixster/elixir](https://registry.hub.docker.com/u/trenpixster/elixir/)をpullしてからアクセス

```
# yum install epel-release
# yum install docker
# systemctl start docker.service
# docker info # 生きてるかを確認
# docker pull trenpixster/elixir
# docker run trenpixster/elixir echo "hello world"
hello world
# docker run -i -t trenpixster/elixir /bin/bash
# iex
```

Dockerのインストール情報をチェック

```
$ docker info 
```

```
$ docker run --name my-redis -it ubuntu:latest bash
```

```
$ man docker-run
```
> -i, --interactive=true|false
Keep STDIN open even if not attached. The default is false.
-t, --tty=true|false
Allocate a pseudo-TTY. The default is false.
When set to true Docker can allocate a pseudo-tty and attach to the standard input of any container. This can be used, for example, to run  a  throw‐
       away interactive shell. The default is value is false.


### 普通ユーザー権限で操作
Centos中の普通ユーザーでもdockerを使えるようにする前にまずそのユーザーを`docker`グループに追加する必要がある

```
# usermod -aG docker admin-user
```

### Dockerfileをビルド

Dockerfileが存在しているディレクトリに下のコマンドを実行する。最後の点が忘れずに

```
sudo docker build -t="wang/super_nginx_image" .
```

Dockerfielの中身

```
FROM ubuntu:12.04
MAINTAINER "aaa" "abc@example"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Our first Docker image for Nginx' > /usr/share/nginx/www/index.html
EXPOSE 80
```

作ったimageを使ってみる

```
# docker images
# docker run -i -t wang/super_nginx_image /bin/bash
root@72951e4df540:/# service nginx start
Starting nginx: nginx.
```

`docker ps`は、現在動いているコンテナの一覧を返します。


一括削除する

```
# docker rm `docker ps -a -q`
```

Dockerイメージを削除する

```
# docker rmi [イメージID]
```

DockerイメージをRename

```
$ docker rename old_name new_name
```

ubuntuコンテナー中のコマンドを実行

```
$ docker run ubuntu /bin/echo hello world
hello world
```

ubuntuコンテナーをdetached modeで動かす

```
$ docker run -d ubuntu
bf0d4abb80c99c51305eb5384443de43e5add695f208e429e3c26244b8789a1d
```

Apacheをubuntuコンテナーにインストール後、commitして、新しいコンテナーを作成

Terminal-1
apache2をインストール

```
$ docker run -t -i ubuntu
# apt-get update && apt-get install apache2
```

Terminal-2
Apache2がインストールされているコンテナーをcommitして、新しいapache-ubuntu

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c1e88c4df7e8        ubuntu              "/bin/bash"         2 minutes ago       Up 2 minutes                            naughty_curie

$ docker commit c1e88c4df7e8 apache-ubuntu
```

公式サイトでimageを探す
```
$ docker search elasticsearch
```
Selenium API を使って UIテストを自動化する | python で Web サイトをクローリングする

環境：
* Windows 7
* python 2.7.10
* 2015/05/30時点で最新版のFirefox

自動テストを行ったり，Web サイトを操作して何かを取得したりしたい時に．
今回は，selenium の API を利用して行いました．
ドキュメントは[こちら](http://selenium-python.readthedocs.org/en/latest/api.html)
今回は Firefox を利用してクローリングを行いました．
Chrome などでもできるようですが，サードパーティ製のブラウザはサポートはされていないようです。。。

```py:sample.py
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

# ブラウザの起動
driver = webdriver.Firefox()

# ウィンドウの最大化
driver.maximize_window()

# Web サイトへのアクセス
driver.get("https://github.com")

# Web サイトのタイトルを取得
driver.title

# "q" という名前を持つエレメントを指定する
# ここでは，リポジトリ検索用のキーワード入力フォームのこと
form_textfield = driver.find_element_by_name("q")
# 入力フォームに，”hoge”と入力する
form_textfield.send_keys("hoge")
# 入力した内容を削除する
form_textfield.clear()
# 入力したキーワード("hoge")を送信し，検索を実行する
form_textfield.submit()
# 入力フォームの場所を調べる
form_textfield.location
# 入力フォームのサイズを調べる
form_textfield.size
# 入力フォームのタグ名を調べる
form_textfield.tag
# エレメントの(HTMLソース上の)テキストを調べる
form_textfield.text

# エレメントを xpath で指定する
# ここでは，ページ下部の1, 2, ..., n と書いてあるボタンのうち，2と書いてあるボタンを指す
next_button = driver.find_element_by_xpath("//*[@id=\"container\"]/div[2]/div/div[2]/div[2]/div/a[1]")
# このエレメントはクリックできるので，クリックしてみる
next_button.click()

# エレメントを xpath で指定する
# ここでは，python を使ったリポジトリに絞って再検索してみる．
refined_search_python = driver.find_element_by_xpath("//*[@id=\"container\"]/div[2]/div/div[1]/ul/li[9]/a")
refined_search_python.click()

# タイムアウト時間を設定する(ページ遷移) <- まだ試していない
driver.set_page_load_timeout(1)

# タイムアウト時間を設定する(スクリプトの実行) <- まだ試していない
driver.set_page_script_timeout(1)

# ページを一つ戻す
# やりかたその1
ActionChains(driver).key_down(Keys.BACKSPACE).send_keys('').keys_up(Keys.BACKSPACE).send_keys('').perform()
# やりかたその2
driver.back()

# ページを一つ進める
driver.forward()

# スクリーンショットをとる
driver.get_screenshot_as_file("./hogehoge.png")

# ウィンドウの位置を調べる
driver.get_window_position()

# ウィンドウのサイズを調べる
driver.get_window_size()

# ページの更新
driver.refresh()

# url の取得
driver.current_url

# 現在使用しているブラウザの種類を調べる
driver.name

# 現在開いているページのソースを取得する
driver.page_source

# ブラウザを閉じる
# やりかたその1
driver.quit()
# やりかたその2
driver.close()
```
サイトページをサーバーにアップロードしたけれどうまく反映されない時の対処3つ


サイトをサーバーにアップしたけれどうまく反映されない！崩れている！というときに試したことをまとめました。

##バリデーションを行う
[http://validator.w3.org/](http://validator.w3.org/)
htmlに間違いがないかをチェックできるサービスです。
何行目にどのようなエラーがあるのか示してくれるので
一つ一つしらみつぶしするようにミスを改善することができます。


##Developer Toolでチェックする

Developer Tool(command + option + I)を呼び出すと、
エラーがある場合はどこにどんな不具合があるのかを赤文字で表示してくれます。

##知り合いのプログラマに聞く
ここまでチェックしてもわからなかった場合は自分で解決するのも難しくなると思うので、プロに聞いたほうが良いです。

餅は餅屋。

###あとがき
私がサイトをサーバーにアップしたときはスタイルシートがうまく反映されず、htmlの構造だけが表示されるというしょっぱいサイトになっていたのですが、バリデーションを行い原因を見ていくとcssのスタイルシートの参照コードが間違っていたようでした。直したらうまくサイトに反映されました。

そこ以外にも、
最後の`</html>`とするべきところが`<html>`となっているのがわかり・・・
締まるところが締まらないし、初歩的のミスすぎるし、見つかってよかったです。
やれやれ。
iOS申請+3.13(課金情報足りないよ)リジェクトされた場合の対処法

以下のようなリジェクトをされた場合の対処法

```lang:3.13リジェクト
3.13 Details

Your app metadata does not clearly identify supplemental content or items that must be purchased separately. Specifically, you didn't mention on Application Description that this app includes In-App Purchase product.

Next Steps

Please remove these references, or clearly mark these features as separate purchases to ensure that users accurately understand the included content in your app.

Since your iTunes Connect Application State is Rejected, a new binary will be required. Make the desired metadata changes when you upload the new binary.

NOTE: Please be sure to make any metadata changes to all App Localizations by selecting each specific localization and making appropriate changes.

アプリ課金の情報が不足してるよ。
ちゃんと書いてね。
「レビュー送信」ボタンから再度申請できるよ。
バイナリデータを再度アップロードする必要はないよ。
```


アプリの説明文に

```lang:説明文の語尾に付け足す
*一部有料コンテンツがあります。
```
を付け足せば良い。

あとは、課金アイテムの説明文を具体的に書けば良い。
誤)課金することで全ての機能を使うことができます。
正)課金することで***と***の機能が使えるようになります。
みたいに抽象的な言葉をやめる。
Elixir二つのノードで通信

二つのインスタンスを立ち上げ、rabbit1とrabbit2
![スクリーンショット 2015-05-30 18.18.27.png](https://qiita-image-store.s3.amazonaws.com/0/54698/ab6ff5a0-f735-796d-5676-b2eb7ce4788b.png)


二つのノードが通信できるように同じクッキを設定します。名前はそれぞれ`node_one`と`node_two`とします。`Node.self`でノード名を確認します

```
[root@rabbit1 ~]# iex --sname node_one --cookie chocolate-chip
[root@rabbit2 ~]# iex --sname node_two --cookie chocolate-chip

iex(node_one@rabbit1)1> Node.self
:node_one@rabbit1

iex(node_two@rabbit2)1> Node.self
:node_two@rabbit2

```
![スクリーンショット 2015-05-30 18.21.40.png](https://qiita-image-store.s3.amazonaws.com/0/54698/20b8ab07-56c2-0fe0-3ed1-ac3be196736b.png)


`Node.connect :"node_two@rabbit2`コマンドで二つのノードをつなげると
`Node.list`コマンドでお互いを確認することができます。

![スクリーンショット 2015-05-30 18.29.22.png](https://qiita-image-store.s3.amazonaws.com/0/54698/857445a0-307b-e559-f8db-e05ade03d815.png)


node_oneで定義した無名関数をNode.spawn関数でnode_twoにプロセスを作成して実行します。

```
iex(node_one@rabbit1)5> func = fn -> IO.inspect Node.self end
#Function<20.90072148/0 in :erl_eval.expr/5>

iex(node_one@rabbit1)6> Node.spawn(:"node_two@rabbit2", func)
:node_two@rabbit2
#PID<9000.70.0>
```

![スクリーンショット 2015-05-30 18.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/54698/b18c9f78-fc43-e579-44ca-64bf1ab6d0e0.png)

[ElixirのNodeモジュールのマニアル](http://elixir-lang.org/docs/v1.0/elixir/Node.html)
Vagrant と CoreOS 環境でコマンドを叩くと Docker コンテナをビルドして起動できるようにする


(MacOSX10.9, Vagrant1.7.2)

## 目的

[Web+DB Press Vol.86](http://gihyo.jp/magazine/wdpress/archive/2015/vol86) の Docker 特集4の記事で

> cap -versionと実行してください。すると Capistrano の Docker イメージのダウンロードが始まり、ダウンロードが終わるとバージョンを表示するためだけに Capistrano コンテナが起動します。

これがどうやっているのかよくわからなかったので、シンプルな構成で python で試してみた。
（ちなみに CoreOS に Python はインストールされていない）


## ディレクトリ構成

コードはとりあえず [github に置いておきます](https://github.com/CortYuming/example-vagrant-coreos-python) （そのうち消すかも）

```
example-vagrant-coreos-python
├── Dockerfile
├── coreos
│   ├── Vagrantfile
│   ├── config.rb
│   └── user-data
└── script
    └── run
```


## Dockerfile

```
FROM python:2.7
ENV PYTHONUNBUFFERED 1
```

## Vagrant で CoreOS 環境を作る

- https://coreos.com/docs/running-coreos/platforms/vagrant/

上記リンクを参考に `coreos/` に下記三つのファイルを用意する

### coreos/Vagrantfile

`config.vm.synced_folder` のみ修正する

```
      config.vm.synced_folder "../", "/home/core/#{File.basename(File.dirname(Dir.pwd))}", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
      $shared_folders.each_with_index do |(host_folder, guest_folder), index|
```

### coreos/config.rb

ここはそのままか、お好みで `$update_channel='stable'` ににするとか。


### coreos/user-data

```
#cloud-config

coreos:
write_files:
  - path: /opt/bin/python
    permissions: 0755
    owner: core:core
    content: |
      #!/bin/bash

      /home/core/example-vagrant-coreos-python/script/run python $@
```

## 起動スクリプト

### script/run

```
#!/bin/bash

set -e

docker build -t=python27 example-vagrant-coreos-python/

docker run \
       --rm \
       -it \
       --name python.`date +%s` \
       python27 \
       $@
```

本来は、ビルドしたものを Docker Hub などに置いて `--net=host hogeghoe` とかするのだろうけど、とりあえずお試しなのでこれで。

## 実行

```
$ cd coreos
$ vagrand up
$ vagrand ssh
CoreOS stable (633.1.0)
```

```
core@core-01 ~ $ python -V
Sending build context to Docker daemon 79.87 kB
Sending build context to Docker daemon
Step 0 : FROM python:2.7
Pulling repository python
9fa21a3e9f2f: Download complete
39bb80489af7: Download complete
df2a0347c9d0: Download complete
7a3871ba15f8: Download complete
a2703ed272d7: Download complete
c9e3effdd23a: Download complete
24b3549417de: Download complete
3009dde7a8a5: Download complete
9da97b9166df: Download complete
a80d186674da: Download complete
fe7091222d5c: Download complete
29d755a35726: Download complete
1452a2aa19dd: Download complete
Status: Downloaded newer image for python:2.7
 ---> 9fa21a3e9f2f
Step 1 : ENV PYTHONUNBUFFERED 1
 ---> Running in 4a7d8fa7390b
 ---> 4786559fdc11
Removing intermediate container 4a7d8fa7390b
Successfully built 4786559fdc11
Python 2.7.10
```

python のバージョンが表示されている。


## 参考

- http://gihyo.jp/magazine/wdpress/archive/2015/vol86
- https://coreos.com/docs/
C#でforeachをForEachしまくる

# foreachとForEach
UnityでC#触るくらいなので.NETがどうとかはよく知らない。
イテラブルなやつらはみなforeachでループ出来るけどForEach関数が用意されててループがラムダ式で書けるのはList\<T>型だけ。

# 何でもかんでもForEach
せっかく推論型でvarとかで型をあんまし意識しないで書いてるのにForEachがメンバになくて、ああーこれはList\<T>型じゃないのかーってがっかりしないように

```csharp:CollectionExtensions.cs
using System;
using System.Collections.Generic;

public static class CollectionExtensions {
	public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action) {
		foreach (var elm in enumerable) action(elm);
	}
}
```
ってファイルを書いとく。
これでForEachスタンバイ。

# 使う
例えばディレクトリ内を削除するコード

```csharp
private static void DeleteDirectory(string path) {
		foreach (var i in Directory.GetDirectories(path)) {
			DeleteDirectory(i);
		}
		foreach (var i in Directory.GetFiles(path)) {
			File.Delete(i);
		}
		Directory.Delete(path);
	}
```

が、こうなる

```csharp
private static void DeleteDirectory(string path) {
	Directory.GetDirectories(path).ForEach(obj => DeleteDirectory(obj));
	Directory.GetFiles(path).ForEach(obj => File.Delete(obj));
	Directory.Delete(path);
}
```

更にメソッドチェーンでこうも書ける

```csharp
private static void DeleteDirectory(string path) {
		Directory.GetDirectories(path).ForEach(DeleteDirectory);
		Directory.GetFiles(path).ForEach(File.Delete);
		Directory.Delete(path);
	}
```

コンパクト。
Scalastyleで問題があるときはコンパイルできないようにしたい

Scalastyleで問題があるときはコンパイルが通らないようにしたい場合、scalastyle-config.xmlの`level`を`error`にするとできます。

```diff
- <check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
+ <check level="error" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
```
Java: MacでJDKのバージョンを切り替えたい

MacでJDKのバージョンを切り替える方法です。

## Java 8に切り替える

```console
$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
```

## Java 7に切り替える

```console
$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
$ java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
```
sublime text 3でawsにsftpする設定

普段、ST3とsftpパッケージを使って開発をしています。
今回、初めてAWSを使いましたが、pemファイルを使用しての
sftp設定でちょっとハマったのでメモ。

AWSに上げるために考慮が必要なのは2点。
1.hostにはAWSインスタンスのパブリックDNSを設定。
2.ssh_key_fileにはpemファイルへのパスを設定。

これ以外は普段通りの設定でOK。
特に1について、パブリックIPを設定していて、
そこそこハマりました。
std::vector と std::valarray はコンストラクタの引数が逆順なんだね...

```cpp
std::vector<T>::vector(SIZE, INITIAL_VALUE);
// whereas...
std::valarray<T>::valarray(INITIAL_VALUE, SIZE);
```

しかも、`<bool>` で特殊化された実装に対して、普通に期待する型チェックをやってくれなかったので(`gcc (Debian 4.9.2-16) 4.9.2`)、

```cpp
valarray<bool> my_sugoi_bitvector(false, N);
```

とか書くとメモリが `SEGV` になってしぬ (過去形)
giter8でScalaのプロジェクトテンプレートを作りたい

giter8でScalaのプロジェクトテンプレートを作る方法です。

## リポジトリ名

GitHub上でホスティングする場合は、`<username>/<template-name>`または`<username>/<template-name>.g8`の形式でリポジトリを作成します。接尾辞の`.g8`は以前は必須でしたが今は無くてもかまいません。例えば、`suin/play-scala`または`suin/play-scala.g8`という名前でリポジトリを作っておくと、ユーザは`g8 suin/play-scala`でプロジェクトを生成することができます。

## 基本的なファイル構成

`src/main/g8`の中身がテンプレートになる。

```
github.com/username/template-name.g8
└── src
    └── main
        └── g8
            ├── build.sbt
            ├── default.properties ... g8の変数定義など
            ├── project
           ...
```

## giter8の設定ファイル

`default.properties`はgiter8の設定と、プロジェクト生成時に置き換える変数名とそのデフォルト値を設定します。よくあるパターンは次のような設定値ですが、好きなだけ変数を用意してかまいません。

```text:default.properties
name=Play Scala
organization=com.example
version=0.1.0-SNAPSHOT
verbatim=activator *.js *.ts *.jar *.xml *.png
```

`verbatim`はテンプレート処理しないファイル名を指定します。ファイルに`$`が書いてあると、giter8は置換しようと試みるので、jquery.min.jsなど`$`が書かれているファイルはここで除外するようにしておきます。もし次のようなエラーが出る場合は、`$`を含んでいるファイルが処理されようとして失敗しているので、除外すべきファイルを確認する必要があります。(現在のg8ではどのファイルでエラーになったのか教えてくれないので、出ないので当てずっぽうで探す他ありません…)

```
problem parsing template 'anonymous'
line 23:1: expecting '$', found '<EOF>'
```

## ローカルでの開発方法

giter8は実はローカルのファイルからプロジェクトを生成することができます。`file://`でパスを指定すると、そこにあるテンプレートでプロジェクト生成を実行してくれます。これを活用したほうがGitHubにpushしたりする手間がないので、手軽にテンプレートを開発できます。

```
g8 file:///path/to/template.g8
```

## 置換のしくみ

置換のしくみは、設定ファイル`default.properties`で宣言した変数名を単純に置き換えるというものになっています。ソースファイル中の`$`で囲まれた文字が置換されます。また、ファイル名に含まれる`$変数名$`も置換されます。
OpenVZの最新CentOS 7テンプレートでネットワークに出られない場合

## issueあった

[CentOS 7 OpenVZ template in PVE 3.4 issues](http://forum.proxmox.com/threads/21808-CentOS-7-OpenVZ-template-in-PVE-3-4-issues)

## バージョン確認

```bash:
# rpm -qa | grep initscripts
initscripts-9.49.24-1.el7.x86_64
```

initscripts が上記バージョンだと該当。

## 対処

```bash:
wget ftp://bo.mirror.garr.it/pub/1/slc/centos/7.0.1406/os/x86_64/Packages/initscripts-9.49.17-1.el7.x86_64.rpm

rpm -Uvh --force initscripts-9.49.17-1.el7.x86_64.rpm
systemctl restart network
```

```diff:/etc/yum.conf
+ exclude=initscripts
```

これでネットに出られた。
Android M Previewのランタイムパーミッション 既存アプリへの影響について


今日のGoogle I/Oのセッション [Android M Permission](https://www.youtube.com/watch?v=f17qe9vZ8RM) で聞けた内容をざっくりメモ。まだ追試等はできていない。
日本に帰ってAndroid Mの端末用意できたら試してみる。

## Target SDK

Target SDK が M Preview のときはランタイムパーミッションが必須になる。

## 既存アプリ(古いTarget SDK)への影響

- 既存アプリの場合はいままでどおりインストール時にすべてのパーミッションを許可するか聞かれる。
- ユーザは設定でパーミッション毎の許可/不許可を変更可能。その際、ユーザーにはクラッシュの可能性があることが警告される。
- 取り消されたパーミッションをアプリが実行時に要求することはできない。

## まとめ

思ったより深刻な影響は無さそうだが、ユーザが許可を取り消せてしまうので対策をしていないと恐らく落ちる。
テンプレート関数にコンセプトを設定

テンプレート関数、使ったことがないという方はいらっしゃらないと思いますが、特定の条件に当てはまるものしか受け取ってほしくない、あるいは、特定の条件に当てはまらないものしか受け取ってほしくないということが多々あると思います。
そのように必要とされる条件をコンセプトと呼びますが、今回はそのコンセプトを簡単に指定する方法をご紹介いたします。

使うものは \<type_traits>のstd::enable_ifで、SFINAEを使うのですが、これがまた読みにくくなるﾃｸﾆｯｸなので、それを何をしてるのかわかりやすく、簡単にできるようにしたいと思います。

まず、肝になる型を定義します。std::enable_ifをちょっとラップするだけです。

```cpp
#include <type_traits>
template < class Ty >
struct concept : std::enable_if < Ty::value, std::nullptr_t >
{ // determine if Ty::value is true
};
template < class Ty >
using concept_t = typename concept < Ty >::type;
```

これをテンプレート引数の最後に足して、SFINAEを実現します。
デフォルト引数にnullptrを渡してあげてください。

```cpp
template < class Ty, concept_t < std::is_integral < Ty > > = nullptr >
Ty twice( Ty integral ) { return integral << 1; }

template < class Ty, concept_t < std::is_floating_point < Ty > > = nullptr >
Ty twice( Ty fp ) { return fp * 2; }

int main()
{
  twice( 1 ); // twice with <<
  twice( 1.0 ); // twice with *
}
```

twice関数に整数型を渡すと上のが、浮動小数点型を渡すと下のが、それ以外を渡すとコンパイルエラーになります。
このようにオーバーロードをすることもできますが、複数の関数に当てはまるテンプレート引数が推論されるとambiguousとしてコンパイルエラーになるので注意してください。

もっと複雑な条件を指定するときのために、ヘルパのメタ関数も一緒に置いておきましょう。
std::conditional_tはC++14からなので、必要であれば自前で定義してあげてください。

```cpp
//
// meta_bool
template < bool b >
using meta_bool = std::integral_constant< bool, b >;

//
// meta_or
template < class A, class... Args >
struct meta_or
  : std::conditional_t < A::value, std::true_type, meta_or < Args... > >
{ // if any of std::true_type in template arguments, this is derived from std::true_type.
};
template < class A >
struct meta_or < A >
  : meta_bool < A::value >
{
};

//
// meta_not
template < class A >
struct meta_not
  : meta_bool < !A::value >
{ // nagater
};

//
// meta_and
template < class... Args >
struct meta_and
  : meta_not < meta_or < meta_not < Args >... > >
{ // if any of std::false_type in template arguments, this derive from std::false_type.
};
```

これらを使えば、複雑な条件も書くことができるかなと思います。

`template < class Ty, concept_t < meta_not < std::is_pointer < Ty > > > = nullptr >`
とすれば、ポインタ以外を受け取るようにできますね。

もっと実用的な使い道として、タグと何かクラスを関連づけてグループ分けしたり（例えばイテレータを使う関数など）、ある実装を持っているか（メンバ変数firstとsecond、メンバ型typeやvalue_type, element_type, メンバ関数begin, endなどなど…）で処理をわけたりすることができます。
pecoでpyenvのvirtualenvsを簡単に切り替える

【追記】これを汎化してrbenvなどでも使えるようにした物を公開しましたので、こちらを使うと良いと思います。

[giginet/peco-anyenv](https://github.com/giginet/peco-anyenv)

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

![](http://i.gyazo.com/cd280200c519074e876234db41e95831.gif)

```sh:.zshrc
function venv() {
    venvs=`pyenv versions | peco`
    venv0=`echo $venvs | cut -d' ' -f1`
    venv1=`echo $venvs | cut -d' ' -f2`
    if [[ $venv0 == "*" ]]; then
      venv_name=$venv1
    else
      venv_name=`echo $venvs| awk '{ print $1 }'`
    fi

    mode=local
    if [[ $1 == "--global" ]]; then
      mode=global
    fi
    echo "Set ${mode}　Python version to ${venv_name}"
    pyenv $mode $venv_name
}
```

```
$ venv # pyenv local
$ venv --global #pyenv global
```

便利
PHP7調査(37)エクステンションの対応状況

PHP7では内部的なデータ構造やAPIの変更があったため、PHP5用のエクステンションをPHP7でビルドしようとしても、そもそもコンパイルすら通らない可能性が高いです。PHP同梱のエクステンションは既に対応が終わっていますが、外部でメンテされているエクステンションは修正が必要になります。

エクステンションの対応状況がわからないと、PHP7への移行可否も判断しづらくて困っちゃいますよね。

実は、各エクステンションの対応状況をまとめているプロジェクトが存在します。

* https://github.com/gophp7/gophp7-ext/wiki/extensions-catalog

といっても、このページ自体の知名度が低いせいか、本体同梱のエクステンション以外は寂しい状況です。GitHubアカウントがあれば誰でも書き込めますので、追加情報をお持ちの方は追記していきましょう！

ちなみに上のURLを普通のブラウザで開くと横幅が足りなくて困ると思いますが、「不便なら[wide-githubブラウザ拡張](https://github.com/xthexder/wide-github
)入れろや！」だそうです。GitHubさんDISりながらGitHub使う感じが面白いですね。
rbenv環境下のpassenger動作確認

## 概要
rbenv環境下でのpassengerの動作確認を行います。

## 事前準備
[Ruby関連インストール](http://qiita.com/ftakao2007/items/f232c86df0d561793850) にあるrbenvインストールが完了している。

## 作業内容

### 必要なパッケージのインストール
``` bash
### Apacheのインストール
$ sudo yum install httpd httpd-devel libcurl-devel

### passengerのインストール
$ sudo gem install passenger -q --no-rdoc --no-ri -v '5.0.8'
```

### Railアプリ作成とテスト

```
### ディレクトリの作成
$ sudo mkdir -p /var/www/passengertest
$ sudo chown apache:apache /var/www/passengertest
 
### bundle initの実行
$ cd  /var/www/passengertest
$ sudo -u apache bundle init
 
### Gemfileの編集。「# gem "rails"」のコメントアウトを外す
$ sudo vi Gemfile
=====================
# A sample Gemfile
source "https://rubygems.org"
 
gem "rails"
=====================
 
### ディレクトリ以下にインストール
$ sudo -u apache bundle install --path vendor/bundle
$ sudo -u apache bundle exec rails new .
 
### Gemfileの編集。以下追加
$ sudo vi Gemfile
=====================
...
gem 'jquery-rails'
gem 'execjs'
gem 'therubyracer'
...
=====================
 
### 再度bundle install
$ sudo -u apache bundle install --path vendor/bundle
 
### generate
$ sudo -u apache bundle exec rails generate controller Hello index
 
### rubyのバージョンを表示するための設定。which rubyやwhoami等でパスやユーザの確認もできます。
$ sudo vi app/controllers/hello_controller.rb
=====================
class HelloController < ApplicationController
  def index
    render text: `ruby -v`
  end
end
=====================

### WEBrick起動
$ sudo -u apache bundle exec rails s

### 別のターミナルを立ち上げてcurlを実行。rubyのバージョンが返ってくれば成功。
$ curl -H "Host: passengertest" http://localhost:3000/hello/index
=====================
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
=====================
```

### Apache、passengerの設定
```
### passengerモジュールのインストール。t1.microなど小さなインスタンスの場合メモリ不足でコンパイルできないことがある。
$ sudo passenger-install-apache2-module

### passengertest.confの設定
$ sudo vi /etc/httpd/conf.d/passengertest.conf
=====================
LoadModule passenger_module /usr/local/rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.8/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.8
  PassengerDefaultRuby /usr/local/rbenv/versions/2.2.2/bin/ruby
</IfModule>

<VirtualHost *:80>
    DocumentRoot /var/www/passengertest/public
    ServerName passengertest
    RackEnv development
    RackBaseURI /
    PassengerRuby /usr/local/rbenv/shims/ruby
</VirtualHost>
=====================

### apache の再起動
$ sudo service httpd restart

### 接続テスト
$ curl -H "Host: passengertest" http://localhost/hello/index
=======================
[ruby -v]
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
 
[which ruby]
/usr/local/rbenv/versions/2.2.2/bin/ruby
  
[whoami]
apache
=======================
  
### アクセスログ
$ tail -f /var/log/httpd/access_log
=======================
127.0.0.1 - - [15/May/2015:20:12:38 +0900] "GET /hello/index HTTP/1.1" 200 12
=======================
```

## 参考
* [プロキシを使わずにRuby-1.9/2.1混在環境も作れる、Apache2+Passenger4+rbenvを用いた混在環境の作り方](http://y-ken.hatenablog.com/entry/how-to-use-multiple-ruby-version-in-one-apache-passenger)
* [rbenvの切り替えの仕組み](http://d.hatena.ne.jp/sugyan/20111128/1322420500)
ng-repeat中の特定の要素に別の要素を挿入

~~`$index`でrepeat中のアイテムのインデックスが取得できる。~~
けど、こうやって変数にアクセスしたほうがわかりやすい。（コメントでのご指摘ありがとうございます！！）

```html
<div ng-repeat="item in items" ng-click="addFuga($index)">
    <div> {{ item.hoge }} </div>
    <div ng-show="item.fuga"> {{ item.fuga }} </div>
</div>
```
じゃなくって、↓のように。

```html
<div ng-repeat="item in items" ng-click="addFuga(item)">
```


```js
$scope.addFuga = function(item){
    item.fuga = 'Someting insert you want'
}
$location.pathを使ってactiveなメニューにクラスを追加する




```html
<ul>
    <li ng-class='{ active : isActive("/menu01") }'>
        <a href='#/menu01'>Menu 1</a>
    </li>
    <li  ng-class='{ active : isActive("/menu02") }'>
        <a href='#/menu02'>Menu 2</a>
    </li>
</ul>
```


```js
$scope.isActive = function(path){
    return path === $location.path();
}

```

####参考
***
[$locationの使用について | AngularJS 1.2 日本語リファレンス |](http://js.studio-kingdom.com/angularjs/guide/$location)
[Angular js add class to active element](http://www.angulartutorial.net/2014/04/angular-js-add-class-to-active-element.html)
AngularJS(1.3)でカスタムバリデーション


お遊びを離れ、何かやろうとすると直ぐにカスタムバリデートが必要になるので、そのやり方。

1.3から簡単になったらしいが、その前を知らないので、感動は薄い。

普通？のバリデーションに加え、サーバを非同期で見に行くバリデーションも作れる。ユーザーの一意性チェックなどには重宝するだろう。

###やること

* nameには、普通？のバリデーションんを書けている（全部小文字じゃないとだめ）
* nicknameはサーバに問合せ、ユニークかどうかをチェックする（サーバはokかngを返すイメージ）

###ポイントと課題

非同期のバリデーションはngModel.$asyncValidatorsを使うことで実現できる。また、全部入力時に初めて評価したいため、ng-model-options="{updateOn: 'blur'}"により、フォーカスが外れた時にチェックがかかるようにしている（が、そうならない）。

ng-model-options="{updateOn: 'blur'}"をつけていても、初回読み込み時に１度実行されてしまう。何かやり方がおかしいのだろうけど、初回時は値がundefinedなので、それで判断して場合分けしている・・・。うーん。

あと、ngModel.$asyncValidatorsの返り値はpromise(then...)じゃないとだめ。最初、直接true,falseを返していてしばらくハマった。

```html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>
var app = angular.module('myApp',[]);
app.controller('myCtrl',function($scope){
	
	//function
	$scope.addUser = function(){
		alert("added");
	}

});

//普通？のバリデーション
app.directive('usernameValidator',function(){
	return{
		restrict: "A",
		require: "ngModel",
		link: function(scope,element,attrs,ngModel){
			ngModel.$validators.username = function(modelValue,viewValue){
				var value = modelValue || viewValue;
				return /^[a-z]+$/.test(value);
			}
		}
	}
});

//サーバを見に行くバリデーション
app.directive('nicknameValidator',function($http,$q){
	return{
		restrict: "A",
		require: "ngModel",
		link: function(scope,element,attrs,ngModel){
			//戻り値はpromiseでなくてはならない（直true, false)ではNGになる。
			ngModel.$asyncValidators.nickname = function(modelValue,viewValue){

				var value = modelValue || viewValue;

				//読み込時は何もしない（''とすると何もしないのでそうしている。なにかよい方法がないか・・・）
				if(value == undefined){
					return $http.get('').then(function(){

					},function(){

					});
				}

				//on blurで非同期チェック
				return $http.get('res.php').then(function(res){
					if(res.data == "ok"){
						return true;
					}else{
						return $q.reject();
					}
				});
			}
		}
	}
});
</script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
<form novalidate name="myForm" ng-submit="addUser()">

<!-- text -->
<p>
Name:<input type="text" name="name" ng-model="name" username-validator>
<span ng-show="myForm.name.$error.username">name contain only lowercharactors.</span>
</p>

<p>
NickName:<input type="text" name="nickname" ng-model="nickname" nickname-validator ng-model-options="{updateOn: 'blur'}">
<span ng-show="myForm.nickname.$error.nickname">aleady exits.</span>
</p>

<!-- submit -->
<p><input type="submit" value="add"></p>

<pre>{{name}}</pre>
</form>
</body>
</html>

```
Win32アプリでx86命令を直接実行させる

#方法と環境
**masmではない**
visual studio 2013で使用言語はC++です。
マシン語を実行させます。
今回は何もしない関数を作ります。

* windows7 64bit
* core i7-2600K

#コード（失敗） :trollface: 

```cpp:Source.cpp
unsigned char ops[] =
{
	0x55,		// push	ebp
	0x8B, 0xEC, // mov	ebp,esp
	0x8B, 0xE5, // mov	esp,ebp
	0x5D,		// pop	ebp
	0xC3,		// ret
};

int main()
{
	void(*p)() = reinterpret_cast<void(*)()>(&ops[0]);
	p();
	return 0;
}
```

デバッグ実行
>ハンドルされない例外が 0x00B28000 (Source.cpp_Project27.exe) で発生しました: 0xC0000005: 場所 0x00B28000 の実行中にアクセス違反が発生しました。

#なぜ失敗するのか
opsの中身が格納されているメモリに実行可能属性が無いためです。
メモリ保護というもののせいで、opsは実行されない。

#コード(成功):feelsgood: 

```cpp:Source.cpp
#include <Windows.h> //追加

unsigned char ops[] =
{
	0x55,		// push	ebp
	0x8B, 0xEC, // mov	ebp,esp
	0x8B, 0xE5, // mov	esp,ebp
	0x5D,		// pop	ebp
	0xC3,		// ret
};

int main()
{
	DWORD old = 0;
	VirtualProtect(ops, sizeof(ops), PAGE_EXECUTE_READWRITE, &old);

	void(*p)() = reinterpret_cast<void(*)()>(&ops[0]);
	p();
	return 0;
}
```

逆アセンブルをステップ実行しopsが実行されていることを確認しました。

VirtualProtectについては[こちら(msdn)](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa366898%28v=vs.85%29.aspx)

ちなみに、oldはPAGE_READWRITEでした。
メモリの属性はページ単位で変わるので、opsの周辺のメモリも実行可能になっています。
細かいことは気にしない。

#おまけ
実行確認用にint3命令を挿入してもよいと思います。
デバッグ実行したらブレークします。

```cpp
unsigned char ops[] =
{
	0x55,		// push	ebp
	0x8B, 0xEC, // mov	ebp,esp
	0xCC,		// int3
	0x8B, 0xE5, // mov	esp,ebp
	0x5D,		// pop	ebp
	0xC3,		// ret
};
```
Angular.jsでテンプレートを使いまわす


変数とか初期化したいけど、テンプレートは使いましたいときはこうしとく。

```js

angular
    .module('App',['ngRoute'])
        .config(function ($routeProvider) {
            $routeProvider
                .when('/', {
                    templateUrl: 'sampleTemplate',
                    controller: 'MainCtrl'
                })
                .when('/routeA', {
                    templateUrl: 'sampleTemplate',
                    controller: 'MainCtrl'
                })
                .when('/routeB', {
                    templateUrl: 'sampleTemplate',
                    controller: 'MainCtrl'
                })
                .otherwise({
                    redirectTo: '/'
                });
    });
RHEL/CentOS と PHP のバージョンの関係

RHEL/CentOS の base + updates の PHP のバージョン

- RHEL/CentOS 5
    - PHP 5.1.6
    - PHP 5.3.3 (php53)
- RHEL/CentOS 6
    - PHP 5.3.3
- RHEL/CentOS 7
    - PHP 5.4.16

CentOS のライフサイクル ([CentOS][CentOS] 参照、[RHEL][RHEL] も Extended Life Cycle Support 無しなら同じ)

- CentOS 5
    - 2017-03-31
- CentOS 6
    - 2020-11-30
- CentOS 7
    - 2024-06-30

つまり PHP 5.1.6 も 2017-03-31 まで現役、やったー＼(^o^)／

[CentOS]: http://wiki.centos.org/Download "CentOS"
[RHEL]: https://access.redhat.com/ja/support/policy/updates/errata "Red Hat Enterprise Linux のライフサイクル"
再背面にペーストするPowerPointマクロ

## やりたいこと
PowerPointでペーストすると、必ず最前面になってしまう。
最初から、再背面に貼り付けたい場合に、一発で操作したい。

## コード
```vbnet:Module1

Private Sub pasteBack()
    
    On Error GoTo myErr
    
    ActiveWindow.Selection.SlideRange.Shapes.Paste.ZOrder msoSendToBack

    Exit Sub
myErr:
    Debug.Print "クリップボードが空"
End Sub

```

## 参考
[\[VBA\]PowerPointの指定したスライドへExcelグラフを最背面で貼り付けるExcel/VBA](http://ateitexe.com/ppt-select-paste/)
ぼっちWikiに最適なGollumについてのメモ


自分だけが使うぼっちWikiを**Gollum**で作成したときのメモ。

Gollumは**データベースにGit**を使い、**Markdown**で書けるWiki。

Gollumの特徴は以下の通り。

* **シンタックスハイライト**や**数式**に対応している
* 様々な記法で書ける
  * GitHub Flavored Markdown
  * Textile
  * reStructuredText
  * MediaWiki
  * などなど
* `gem`コマンドで簡単にインストールできる
* データベースとしてGitを使うのでMySQLなどが不要
* Ruby＋Sinatraで実装されている
* Rubyでマクロを書いて拡張できる


欠点は、日本語の扱いに気をつける必要があること（後述）。

## Gollumのインストール
ICUという文字コード変換ライブラリに依存しているのでまずはそれをインストール。

```
# OS Xの場合
$ brew install icu4c

# Debian/Ubuntuの場合
$ sudo apt-get install libicu-dev
```

続いて、Gollum本体をインストール。

```
$ gem install github-markdown gollum
```

## 日本語の扱いについて
ページのタイトルに漢字を使うと、URLがピンイン（中国語のローマ字のようなもの）になってしまう。
タイトルは適当に英語で入力し、真の日本語タイトルは本文中でMarkdownの`#`を使って書けば問題ない。


## 認証の設定
ぼっちWikiなので、他人に内容を見られてしまっては困る。

Gollumは普通のSinatraアプリと同じように、ユーザー認証をつけることができる。

こんな感じの`auth.rb`を作成。

```ruby
module Precious
  class App < Sinatra::Base
    use Rack::Auth::Basic, "Restricted Area" do |username, password|
      [username, password] == ["user", "password"]
    end
  end
end
```

※Basic認証＆ファイルにパスワード直書きなので、盗聴やパスワード漏洩の可能性がある。あくまでも気休め。



## Gollumの起動

```
$ git init # 初回だけ
$ gollum --mathjax --config auth.rb --allow-uploads
```
Element.setInnerHtmlで一部のタグが除外されてしまう


```dart
DivElement div = new Element.tag('div');
String html = '<p>こんにちは、<ruby><rb>山田太郎</rb><rp>(</rp><rt>やまだたろう</rt><rp>)</rp></ruby>さん。';
div.setInnerHtml(html);
```

とした時に、`こんにちは、さん。`と表示され、DeveloperToolsのconsoleを見ると、

```
Removing disallowed element <RUBY>
Removing disallowed element <RP>
Removing disallowed element <RT>
Removing disallowed element <RP>
Removing disallowed element <RB>
```
みたいに表示されちゃう問題。

## 解決策

```dart
//NodeValidatorを作る
NodeValidatorBuilder nodeValidator = new NodeValidatorBuilder.common()
  ..allowTextElements()
  ..allowElement('ruby')
  ..allowElement('rb')
  ..allowElement('rp')
  ..allowElement('rt');
  
DivElement div = new Element.tag('div');
String html = '<p>こんにちは、<ruby><rb>山田太郎</rb><rp>(</rp><rt>やまだたろう</rt><rp>)</rp></ruby>さん。';

//validatorを指定する
div.setInnerHtml(html, validator: nodeValidator);
```

`setInnerHtml`はデフォルトで `new NodeValidatorBuilder.common()` によってバリデーションが行われるが、`.common()` は `allowHtml5();` と `allowTemplating();` しか許可してない。

`allowHtml5()`で許可されてるHTMLタグ一覧は [`_Html5NodeValidator` の実装](https://dart.googlecode.com/svn-history/r45416/branches/bleeding_edge/dart/sdk/lib/html/dartium/html_dartium.dart)とか見るといいんだけど、その中には `ruby` 等がないので、今回のようなエラーが起きてしまったというわけ。

なので、自前で [NodeValidatorBuilder](https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/dart:html.NodeValidatorBuilder) を使ってValidatorを作成し、それをsetInnerHtmlに渡すことで解決。
CDHのコンポーネントをCentOSに部分インストールする設定

# 動機
CDHのコンポーネントをCentOSにパッケージインストールするときの設定。
クラスタにするのであればCloudera Manager経由でParcelを使うのが一番楽だと思うのだけど、
CentOS上で一部のツールを使いたい、といった場合にこういう設定があると便利かなと思ったので。

# 手順
下記を実行してyumの設定ファイルを変更するだけcm_ver/cdh_verを書き変えればしばらくは使えるはず。
因みにCMの方は主にJDKのためなのでインストール済みであればなくても良いかなと。

```
os_major=$(cat /etc/redhat-release | grep -oE '[0-9]' | head -1)

# CM
cm_ver=5.4.1
cm_major=$(echo $cm_ver | sed 's/^\(.\).*/\1/')
cat <<EOF > /etc/yum.repos.d/cm.repo
[cm]
name=CM
baseurl=http://archive.cloudera.com/cm${cm_major}/redhat/$os_major/x86_64/cm/${cm_ver}/
gpgcheck = 0
EOF

# CDH
cdh_ver=5.4.2
cdh_major=$(echo $cdh_ver | sed 's/^\(.\).*/\1/')
cat <<EOF > /etc/yum.repos.d/cdh.repo
[cdh]
name=CDH
baseurl=http://archive.cloudera.com/cdh${cdh_major}/redhat/$os_major/x86_64/cdh/${cdh_ver}/
gpgcheck = 0
EOF
```

上記でリポジトリが設定されているので、下記のようなコマンドでコンポーネントをインストールできるようになるはず。

使用例

```
yum install -y oracle-j2sdk1.7.x86_64
yum install -y avro-tools
```

# 感想
CDHをインストールするのであればCMからParcelのが圧倒的にインストール/運用共に楽なのでそっちを使ってください。
avro-toolsだけどうしても、とかって状況になることもあまり無い気はするのでこういう状況ではこの設定が便利。
といったことがあれば教えてもらえると嬉しいです。
OSXで最新のPHPをビルドする方法

OSXで最新のPHP ( https://github.com/php/php-src ) を取得してビルドする方法を紹介します。

# 必要なもの
* homebrew
* git

# homebrewで必要なものをインストール
```
brew install git
brew install re2c
brew install bison
brew install autoconf
```

homebrewはbisonへのパスを自動で通さないので、bisonが入った場所をメモしておきましょう。後で使います。


# php-srcを取得

```
git clone https://github.com/php/php-src.git
```

# configure


```
cd php-src
./buildconf
export YACC="/usr/local/Cellar/bison/3.0.4/bin/bison"
prefix="/opt/php-master"
./configure --prefix=$prefix \
--enable-cli \
--enable-mbstring \
--enable-json
```

インストール先を変えたい場合はprefixを変更してください。

# ビルド

```
make
sudo make install
```


# もうちょっとconfigure オプションを足したいときは

こんな感じでオプションを追加します。

```
--enable-xml \
--enable-zip \
--enable-ftp \
--enable-exif \
--enable-fileinfo \
--enable-pcntl \
--enable-pdo \
--with-curl \
--with-gd \
--with-curl=/usr \
--with-openssl \
```

(ちなみに私の環境だと--enable-intl, --enable-fpm あたりがうまく入らなかったのであきらめました)

# はまりポイント

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">OSX でphp-srcのコンパイルしたらこける... ext/tokenizer/tokenizer.c:132:20: error: use of undeclared identifier &#39;T_ERROR&#39;</p>&mdash; DQNEO (@DQNEO) <a href="https://twitter.com/DQNEO/status/604448240696586240">May 30, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

tokenizerとかparserまわりでこういうエラーが出ることがあります。
当初、C言語ファイルにバグがあるのかと思っていろいろソースを読んでもチンプンカンプンで途方に暮れていたのですが、どうやら自分が古いbison(OSXのデフォルトのbison)を使っていたのが原因だったようです。

# 参考

http://qiita.com/hnw/items/8a55e10364bde2f1ef0b
いつの間にかbison3でPHPをビルドできるようになっていました

「PHPをビルドするにはbison 2.4〜2.7でないといけない」という超不便な縛りがあったのですが、最近のPHP(おそらくPHP5.6あたりから?) ではこれが解決されたようです。

https://github.com/php/php-src/pull/402/files

これで、OSXでもらくにPHPをビルドできるようになりましたね！

# OSXでbison3をインストールしてそれでPHPをビルドする方法

```
brew install bison
```

これでbison3がインストールされます。
このとき、bison3は自動でパスが通らないようになっています。

なのでPHPをconfigureするときに、YACC変数にbisonバイナリの場所を指定してあげるとよいでしょう。

```
YACC=/usr/local/Cellar/bison/3.0.4/bin/bison
```


# 参考

hnwさんの記事がとても参考になりました。

http://qiita.com/hnw/items/8a55e10364bde2f1ef0b
SQLの制約の種類とその指定方法

# SQLの制約の種類

* NOT NULL制約
* チェック制約
* 一意性制約（UNIQUE KEY)
* 主キー制約 (PRIMARY KEY)
* 参照整合性制約、外部キー制約 (FOREIGN KEY)  

---

### NOT NULL
* NULL値を禁止   

```
  CREATE TABLE product  
  (
    product_id       INT PRIMARY KEY ,
    product_name     VARCHAR(16) UNIQUE NOT NULL ,
    price            INT
  ) ;
```

### CHECK
* 条件を指定し、条件を満たさないデータを禁止

```
CREATE TABLE user
(
   user_id     INT PRIMARY KEY ,
   age         INT ,
   city_code   CHAR(4) ,
   gender      CHAR(1),
   CONSTRAINT agecity_check   CHECK(age >= 18 OR city_code = '0003'),
   CONSTRAINT gendercheck     CHECK(gender IN('M', 'F')))
) ;
```

### UNIQUE KEY
* 重複したデータを禁止
* 複数の列に設定可能
* NULLを禁止するわけではない

```
CREATE TABLE user
  (
     user_id        INT PRIMARY KEY ,
     telephone    CHAR(8)
     addreess     VARCHAR(255),
     UNIQUE (telephone, address)
  ) ;
```

### PRIMARY KEY
* 一意を保証
* 重複とNULLを禁止
* 1つのテーブルに1つ

```
CREATE TABLE user
  (
     user_id      INT PRIMARY KEY ,
     telephone    CHAR(8)
     age          INT,
  ) ;
```

* 複合主キーの指定

```
CREATE TABLE price
  (
     shop_code      CHAR(4) ,
     product_code   CHAR(4) ,
     price          INT ,
     PRIMARY KEY(shop_code , product_code)
  ) ;
```

### FOREIGN KEY
* 他のテーブルの列を参照し、その列にないデータを禁止

```
CREATE TABLE order
  (
     order_id      INT PRIMARY KEY ,
     shop_code     CHAR(5) ,
     product_code  CHAR(4) ,
     number        INT ,
     date          DATE ,
     FOREIGN KEY (shop_code)
              REFERENCES shop_table(shop_code) ,
     FOREIGN KEY (product_code)
              REFERENCES product_table(product_code)
  ) ;
```

* 2つの列の外部参照  

```
CREATE TABLE item
  (
     maker_id    CHAR(10) ,
     product_id  CHAR(10) ,
     PRIMARY KEY (maker_id , product_id)
  ) ;
```
```  
CREATE TABLE dealer
  (
     shop_id        CHAR(10) NOT NULL ,
     maker_id       CHAR(10) NOT NULL ,
     product_id     CHAR(10) NOT NULL ,
     PRIMARY KEY (shop_id , maker_id , product_id) ,
     FOREIGN KEY (maker_id , product_id)
            REFERENCES item(maker_id , product_id)
  ) ;
```

### 制約に名前をつける
```
  CONSTRAINT <制約の名前> <制約>
```

### 制約の削除
```
ALTER TABLE <テーブル名> DROP CONSTRAINT <制約の名前> ;
```

### デフォルト値を設定
```
CREATE TABLE product
 (
    product_id  INT NOT NULL PRIMARY KEY ,
    name        CHAR(16) UNIQUE,
    price       INT DEFAULT 2000
 ) ;
```
PEAR MDB2 インストールメモ

pear mdb2インストール
os wni7 64


参考サイト
http://seesaawiki.jp/w/wanderingse/d/PEAR::MDB2%A4%CE%A5%DA%A1%BC%A5%B8#content_1_2

ステップ１
mdb2をダウンロード当方は最新のバージョン2.5.0b5をダウンロードしました。

PEARフォルダを作る
c:\php\PEAR

これを解凍し、MDB2.phpとMDB2フォルダーをPEARにコピーします。

ステップ２
MDB2_Driver_mysqlのダウンロードページより、1.5.0b4を落としてきます。
これを解凍すると、MDB2フォルダーがでてきます。このフォルダー配下のものをすべて、先ほどPEARに置いたMDB2フォルダーに上書きコピーします。

ステップ３
go-pear.pharをダウンロード

http://pear.php.net/manual/en/installation.getting.php

ダウンロードしたgo-pear.pharをc/phpフォルダに置きます。

ステップ４
インストール実行
cd c:\php
php go-pear.phar
AngularJSでFormの値の設定と取得例


何年やってても、Formの値をちゃんと取得するには苦労するな。。。

###簡単な例

各フォームの値を設定、取得してAlertで表示

```html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>
var app = angular.module('myApp',[]);
app.controller('myCtrl',function($scope){

	//init
	$scope.user = {};
	$scope.user.gender = "man";
	$scope.user.adult = true;

	//array for option
	$scope.years = [2001,2002,2003];
	
	//function
	$scope.addUser = function(){
		alert(JSON.stringify($scope.user));
	}

});
</script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
<form novalidate name="myForm" ng-submit="addUser()">

<!-- text -->
<p>
Name:<input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="10">
<span ng-show="myForm.name.$error.required">required</span>
<span ng-show="myForm.name.$error.minlength">too short</span>
<span ng-show="myForm.name.$error.maxlength">too long</span>
</p>

<!-- number -->
<p>
Age:<input type="number" name="age" ng-model="user.age">
<span ng-show="myForm.age.$error.number">Not valid number</span>
</p>

<!-- email -->
<p>
Email:<input type="email" name="email" ng-model="user.email">
<span ng-show="myForm.email.$error.email">Not valid email</span>
</p>

<!-- checkbox -->
<!-- <p>18歳以上ですか？<input type="checkbox" ng-model="user.adult" ng-init="user.adult=true"></p> -->
<p>18歳以上ですか？<input type="checkbox" ng-model="user.adult"></p>

<!-- radiobutton -->
<p>
Gender:
<input type="radio" ng-model="user.gender" value="man">man
<input type="radio" ng-model="user.gender" value="woman">woman
</p>

<!-- select -->
<p>
BirthYear:
<select ng-model="user.year" ng-options="year for year in years">
	<option value="">選択してください</option>
</select>
</p>

<!-- submit -->
<p><input type="submit" value="add"></p>

<pre>{{user|json}}</pre>
</form>
</body>
</html>
```

###備忘

* 配列に入れたい場合は、配列自体を初期化しておかないと$scope.usr.name = "hoge"とはできない。
* コントローラで初期値を設定する場合は、valueを設定する。
* HTML側だとng-init等を使う。
* select等で取得できる値は（標準では）valueではない

###その他

####ボタンのdisabled

formの場合、formname.$invalidで全体の評価のtrue,falseが取れる。なので、全部のバリデーションがtrueになるまで、ボタンをenableにしないというようなことが複雑なAND条件等を書かなくてもできる。

```html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script>
var app = angular.module('myApp',[]);
app.controller('myCtrl',function($scope){

	$scope.addUser = function(){
		alert("added");
	}

});
</script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
<form novalidate name="myForm" ng-submit="addUser()">

<!-- text -->
<p>
Name:<input type="text" name="name" ng-model="name" required>
<span ng-show="myForm.name.$error.required">name required.</span>
</p>

<p>
NickName:<input type="text" name="nickname" ng-model="nickname" required>
<span ng-show="myForm.nickname.$error.required">nickname required.</span>
</p>

<!-- submit -->
<p><input type="submit" value="add" ng-disabled="myForm.$invalid"></p>

<pre>{{myForm.name.$error|json}}</pre>
</form>
</body>
</html>
```
3分でできるRailsダウングレード

#Ruby on Railsのバージョンを4.2.1→4.2.0にダウングレード

```ruby:バージョン確認
> rails -v                                                                  [~]
Rails 4.2.1
```

```ruby:アンインストール
> gem uninstall rails                                                       [~]
Successfully uninstalled rails-4.2.1
```


```ruby:バージョン再確認
> rails -v                                                                  [~]
Rails 4.2.1
```

あれ、アンインストールされてない。。。
railtiesというrailsのコアライブラリにある4.2.1を削除する必要があります。

```ruby:railtiesにある4.2.1を削除
> gem uninstall railties -v '4.2.1'                                         [~]
省略
Successfully uninstalled railties-4.2.1
```

```ruby:成功！
> rails -v                                                                  [~]
rbenv: rails: command not found
```


Rails 4.2.0をインストール

```ruby:4.2.0をインストール
> gem install rails -v '4.2.0' --no-rdoc --no-ri   
省略 
9 gems installe
``` 
 `--no-rdoc --no-ri` はドキュメントをインストールしないオプション



```ruby:確認
> rails -v                                                                  [~]
Rails 4.2.0
```

# 追記

```ruby:謎のエラー
Expected string default value for '--rc'; got false (boolean)
Rails 4.2.0
```
解決策

http://qiita.com/motty93/items/ad39f2f632a7d8b3b442#_reference-94137fdb854c93c151df

ありがとうございます。

これでダウングレード完了です。
チーム開発でRailsのバージョンを揃えたいときなど参考になればと思います。




##参考:
『RubyGemsでgemのインストール時に--no-ri --no-rdocをデフォルトにする』:http://blog.ruedap.com/2011/05/14/ruby-gem-install-no-ri-no-rdoc-gemrc 参考日:2015/05/30
『Railes4.0.2をインストールしてしまったあとにRails3.2.16に変更する方法（メモ）』:http://qiita.com/tosato3/items/61b8c4a5f509f44c762b 参考日:2015/05/30