OmniAICreator/Qiita-1.07M huggingface dataset:
LPICレベル1対策 - ハードウェアの基本知識と設定

#### Linuxとは

Linuxとはカーネルの事。

カーネルというのは、OSの本体のことで、下記のような機能だけを持っている。
カーネルがないとOSにはならないが、カーネルは本当にOSとしての基本中の基本の動作しかしないため、通常は、`カーネルというプログラムに色んな部品(モジュール)を追加してユーザが使えるように`しています。

**カーネル**
オペレーティングシステムの本体

* プロセス管理
    * CPUの割り当てに関する管理
* 入出力管理
    * 入出力装置の利用に関する管理
* メモリ管理
    * 主記憶装置の利用に関する管理

実際は、Linuxに色んなモジュールを追加して、Unixっぽく動くようにしたようなものをディストリビューションと言い、一般的に`Linux`というのは`ディストリビューション`の事を刺されることが多い。

#### 代表的なディストリビューション

|Debian系|RedHat系|Slackware系|
|:---|----|---:|
|Debian GNU/Linux|Red Hat Enterprise Linux|Slackware|
|KNOPPIX(クノーピクス)|Fedora|open SUSE(オープンスーゼ)|
|Ubuntu|Cent OS||


#### アーキテクチャ

CPUの命令セットアーキテクチャ。
CPUが持っている命令の種類のこと。

**代表的なアーキテクチャ**

* x86
    * インテル・AMDベースの32ビットCPU
* x64
    * インテル・AMDベースの64ビットCPU
* ARM
    * ARM社のCPU

OSや、OS上のアプリケーションはCPUのアーキテクチャに依存するため、自身のPCのアーキテクチャに対応したOSやアプリケーションを使う必要がある。

#### CPU

中央処理演算装置

#### 拡張カード

* マザーボードの拡張スロットに取り付けるもの
    * ビデオカード
        * ビデオ性能あげる
    * NIC
        * ネットワーク速度向上
    * ディスクコントローラRAIDカード
    * などがある。
* 取り付けるときには必ず電源を切る必要がある
    * コールドプラグという

#### USB

様々な機器をPCに取り付けられる。
USBは取り付け時に電源を切る必要がない。

→ `ホットプラグ`という。

#### BIOS

PCの電源を入れると、まずはBIOSが起動する。
ハードウェアに近いものを設定するもの。

* BIOSの設定項目
    * 日付や時刻
    * ディスクやデバイスのパラメータ
    * 電源管理
    * 起動ドライブの順序
        * どのドライブから順番に起動するか
    * IRQの割り当て

#### デバイスの確認

Linuxが認識してるデバイスは、`/proc`ディレクトリ以下のファイルで確認出来る。

|ファイル名|説明|
|:---|---:|
|/proc/bus/usb/*|USBデバイス情報|
|/proc/cpuinfo|CPU情報|
|/proc/interrupts|IRQ情報|
|/proc/pci|PCIデバイス情報|
|/proc/scsi/scsi|SCSIデバイス情報|

#### デバイスファイル

デバイスファイルとは、デバイスにアクセスするために使用する仮想ファイル。
`/dev`ディレクトリ以下に存在している。

* `lsusb`コマンド
    * USBデバイスの情報
* `lspci`コマンド
    * PCIデバイスの情報


#### デバイスドライバのロード

デバイスを制御するのに必要な制御プログラム。
Linuxでは、デバイスドライバの実体はカーネルの一部(カーネルモジュール)

* ロードされてるカーネルモジュールは`lsmod`コマンドで確認する

基本的には必要なモジュールを使うときには、デバイスドライバも自動的にロードされるが、手動で読み込む必要がある時もある。

その場合には`modprobe`コマンドでロードすることが出来る。
Debian Wheezyにthriftをインストール


おまじない

```
sudo aptitude update
```

https://thrift.apache.org/docs/install/debian

```
sudo aptitude install libboost-dev libboost-test-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libevent-dev libtool flex bison pkg-config g++ libssl-dev
```

```
sudo aptitude install default-jdk ant
```

automakeの1.14という新し目のバージョンが必要なので、

```
wget http://ftp.debian.org/debian/pool/main/a/automake-1.14/automake_1.14.1-4_all.deb
sudo dpkg -i automake_1.14.1-4_all.deb
```

https://github.com/apache/thrift/tree/master/debian

```
git clone git@github.com:apache/thrift.git
cd thrift
./bootstrap.sh
./configure
make
sudo make install
```

/usr/local/bin/thrift ができる。
Ruboty 体験記

Ruboty で会社のシステムを管理することを目標に ruboty を育ててる話をオンタイムで更新していこうと思います。すでにどうなるか不安ですが。。。

構想
----

- システムの予約とか登録とかプロビジョニングとかデプロイとかを bot にやってほしい
- 誰でも出きるように自然言語で対話できるようにしたい

ruboty は普通コマンドを送る形になるのですが、これだと対話にならないしコマンドを知ってる人じゃないと使えない。ということで、対話をする bot とコマンドを受け付ける bot の2台を作成することにしました。スターウォーズの C-3PO と R2-D2 のようなロボットに育ってくれることを祈ってます。

Ruboty インストール
------------------

bot が2台いるので、ディレクトリを分けて gem を入れてみました。

```shell-session
$ mkdir c3po && cd c3po
--- Gemfile 作成 して ---
$ bundle install --path vendor/bundle
```

現在の Gemfile。参考にしようと思い ruboty-talk と docomoru を入れてみました。ヌルポって言いたかったので。

```rb:Gemfile
group :production do
  gem "ruboty-slack"
  gem "ruboty-talk"
  gem "docomoru"
end

gem "ruboty", :git => "https://github.com/r7kamura/ruboty.git"
```

つづく
「○○危険地帯」で任意の半径（メートル）で安全地帯を定義する

[LODチャレンジJapan](http://lod.sfc.keio.ac.jp/)2013データ提供パートナー賞受賞作品「[トイレ危険地帯](http://lod.sfc.keio.ac.jp/challenge2013/show_status.php?id=v008)」 を改造してSPARQLエンドポイントの検索結果を利用できるようにした「[○○危険地帯](https://github.com/uedayou/dangerzone-sparql)」というWebアプリがあります。

このWebアプリは、ある施設が「存在しない地域」（＝危険地帯）を可視化するアプリで、危険地帯の範囲はアプリが自動的に計算します。例えば、

<http://uedayou.github.io/dangerzone-sparql/>

上記のようになります。

ここでは、危険地域の範囲を手動で設定する方法を解説します。
危険地帯の範囲は、ある施設が一定の距離に存在しない地域になりますので、ある施設からの一定の距離（＝安全地帯）をメートルで指定する必要があります。
安全地帯を手動で指定するには、

<https://github.com/uedayou/dangerzone-sparql/blob/master/js/app.js>

の114行目に

      var metersPerPx = (Math.cos(initial_latitude * Math.PI/180) * 2 * Math.PI * 6378137) / (256 * Math.pow(2,map.getZoom()));
      var aveDistancePx = 500*2/metersPerPx;


を挿入してください。
上のコードの` var aveDistancePx = 500*2/metersPerPx;` の` 500` は
安全地帯（赤い円が表示されない部分）の半径（メートル）を表します。
この値を変更することで、危険地帯を表す赤い円の大きさを変更することができます。

以下は、半径500m、1000m(1km)、2000m(2km) を指定したときの実行例です。

・半径 500m
<http://uedayou.net/dangerzone-sparql-500/>

コード：<http://uedayou.net/dangerzone-sparql-500/js/app.js>

・半径 1000m(1km)
<http://uedayou.net/dangerzone-sparql-1000/>

コード：<http://uedayou.net/dangerzone-sparql-1000/js/app.js>

・半径 2000m(2km)
<http://uedayou.net/dangerzone-sparql-2000/>

コード：<http://uedayou.net/dangerzone-sparql-2000/js/app.js>
AndroidStudio1.0の初回起動時に起動できない時の対処方法(The following SDK components were not installed)

# 問題

Windows用AndroidStudio1.0(SDK同梱版)をインストールした直後の初回起動時、以下のエラーメッセージダイアログが表示されてしまってAndroidStudioが起動できない現象に遭遇しました。

```markdown
Android SDK was installed to C:\hoge\hoge\sdk\
Refresh Sources:
  Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-2.xml, reason: Unknown Host dl-ssl.google.com
  Fetched Add-ons List successfully
  Refresh Sources
  Failed to fetch URL http://dl-ssl.google.com/android/repository/repository-10.xml, reason: IO Unknown Host dl-ssl.google.com
Refresh Sources:
  Failed to fetch URL http://dl-ssl.google.com/android/repository/repository-10.xml, reason: IO Unknown Host dl-ssl.google.com
There is nothing to install or update.
The following SDK components were not installed: platform-tools, extra-android-m2repository, tools, addon-google_apis-google-21, build-tools-21.1.1, android-21, sys-img-x86-addon-google_apis-google-21, source-21, extra-google-m2repository
```

エラーメッセージを見ると、SDKのコンポーネントが足りないようです。しかし「extra」や「addon」がインストールされていないだけなら理解できますが、SDK同梱版をインストールしたのにも関わらず「platform-tools」すらインストールされていないというメッセージが表示されてしまっています。

# 対処法

エラーメッセージから、正しいSDKディレクトリが参照できていないと推測しました。インストールの時にSDKの配置場所をデフォルトから変更したせいでしょうか？そこで色々と試した結果、私は以下の2つの対処法を考えました。

## 方法1 : android-sdkの中身を移動させる

インストール時に指定したSDKの配置場所に新たなディレクトリ(`\android-sdk`)が作成され、その中にSDKコンポーネントが配置されています。

この `\android-sdk`　の中のファイルを全て、インストール時に指定したディレクトリ(ひとつ上の階層のディレクトリ)へ移動させます。

これでAndroidStudioを起動させると、無事に起動するはずです。

## 方法2 : 初回起動の時にスキャンする場所を変更する

AndroidStudioは初回起動時、以下のファイルを参照してSDKを探しにいっているようでした。

```markdown
C:\Users\(ユーザー名)\.android\studio\installer\firstrun.data
```

ファイルの中身はこんな感じ

```markdown:firstrun.data
# This file's encoding is UTF-16LE. If modified, preserve the encoding!

# Location of the user's JDK
jdk.dir=C:\Program Files\Java\jdk1.7.0_71

# Location of the user's Android SDK
androidsdk.dir=C:\hoge\hoge\sdk

# Location of a reference Android SDK that just has the latest files
androidsdk.repo=C:\hoge\hoge\sdk

# If true, create a default AVD with optimized settings
create.avd=true

# The UTC timestamp when this installer ran
install.timestamp=2014-12-11 01:18:29
```

このファイルの`androidsdk.dir`と`androidsdk.repo`に記述されているパスがインストール時に指定したSDKを配置するディレクトリになっています。ここにそれぞれ `\android-sdk`を追記します。
追記した状態のファイルが以下です。

```markdown:firstrun.data
# This file's encoding is UTF-16LE. If modified, preserve the encoding!

# Location of the user's JDK
jdk.dir=C:\Program Files\Java\jdk1.7.0_71

# Location of the user's Android SDK
androidsdk.dir=C:\hoge\hoge\sdk\android-sdk

# Location of a reference Android SDK that just has the latest files
androidsdk.repo=C:\hoge\hoge\sdk\android-sdk

# If true, create a default AVD with optimized settings
create.avd=true

# The UTC timestamp when this installer ran
install.timestamp=2014-12-11 01:18:29
```

AndroidStudioを起動させると、無事に起動します。

***

発生する環境や設定等の条件はいまいちわかりませんが、何かのお役にたてば。
rbenv + mac環境で、rails runnerをcronで実行するさいにはまったメモ

# やりたかったこと
あるrails projectのdir以下にて、下記コマンドを実行

```lang:crontab
0 * * * * cd $HOME/u/app/; rails runner -e production "Hoge.run()"
```

cronで実行すると、環境変数などが読み込まれていないため、PATHが通ってなかったり、と盛大に怒られる。

### bash -lc
参考：[cron 実行時にログインシェル(bash)と同じ環境変数で動かしたい - yukku++](http://blog.44uk.net/2012/07/16/cron-in-login-env/)

ログインシェルと同様の環境変数にするために、シェルにオプションを渡してから実行する。
bashの場合は`-l`となる

### rbenvをloadする
rbenv関連の設定を読み込む。

（自分の場合、少し前に、`bundle install --binstubs`をrails4環境化でやってしまい、解決にくろうしたので、そのときの何かも影響していたのかも。。？

[ruby script using rbenv in cron - Stack Overflow](http://stackoverflow.com/questions/8434922/ruby-script-using-rbenv-in-cron)
[Rails4から--binstubsが使えなくなる件 - Qiita](http://qiita.com/naoty_k/items/01c41578e611b038da6e)
[railsのサブコマンドが使えなくなる問題の原因はbinstubs - PILOG](http://xoyip.hatenablog.com/entry/2013/12/14/203805)


rbenv関係読み込みの参考: [ruby script using rbenv in cron - Stack Overflow](http://stackoverflow.com/questions/8434922/ruby-script-using-rbenv-in-cron)

>```lang:bash.sh
*/1 * * * * /bin/bash -c '. $HOME/.rbenv/loader.sh ; cd /data/app/; ruby -v'
```
The '.' before '$HOME/.rbenv/loader.sh' is important, it runs the script in the current shell
Or without loader, which is better

>```
*/1 * * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" ; eval "$(rbenv init -)"; cd /data/app/; ruby -v'
```

参考に書き換えてみる

```lang:bash.sh
0 * * * * /bin/bash -lc 'export PATH="$HOME/.rbenv/bin:$PATH" ; eval "$(rbenv init -)"; cd $HOME/u/app/; rails runner -e production "Hoge.run()"'
```
意外と知らない GitHub の便利機能

一週間分の Commit ログを見る
---

`https://PATH_TO_REPO/compare/master%40%7B7day%7D...master`

で 1 週間分の Commit ログが見れる。

今週の成果を見たい時とか便利。

![](http://i.gyazo.com/53e2dd335fd631105ee71bfb5dc0ee1c.png)

`hub` でこの URL を開けます。(`brew install hub` でインストール)

```
hub compare master@{7day}...master
```

GitHub Release のバージョン間の commit を見る
---

```
hub compare v0.1.0...v0.2.0
```

でバージョン間の Commit ログを見れます。

Release Note を書くときに便利！と思いきや、Pull Request の一覧とか出してくれないので使いにくい。

CLI で Pull Request を出す
---

PR 駆動でやるとき、push してからイチイチ GitHub に行って PR ボタン押すのが面倒くさい。

`hub` を使えば一発です。(`brew install hub` でインストール)

```
hub pull-request
```

便利。

CLI で CI Status を知る
---

CI を連携させていればビルド結果が pull request に出ますね。

`hub` を使えばコマンドライン上で結果を知れます。いちいち見に行かなくて便利。

```
hub ci-status
```

実際イチイチ見るの面倒なので growl とかで教えてほしい。

ある行が誰によって最後に変更されたか知る
---

ファイルのページに行ってから、右上のボタンの [Blame]

`git blame` が UI で見れる！

![](http://i.gyazo.com/34d75b26294893edb61e552b5cb698da.png)

あんまり使ってる人を見たことがありません。

まとめ
---

もっと色々あるらしいのですが、あんまり知りません。
DX11RendererからDX9Rendererに書き出したい

みなさんが、Advent Calendarでガッツリ長文を書いてる中、 
申し訳ないという気持ちもありつつ、 
DX11のRendererからDX9のRendererにTextureとして
吐き出すという小ネタを紹介しようと思います。
ついでに、DX9からDX11の書き方も紹介しておきます。

#DX9→DX11
DX9→DX11は__「DX9ToDX11」__のノードがあるので、
Textureは、簡単に吐き出すことができます。
1.__DX9 Texture__：RendererからTextureとして吐き出す
2.__DX9ToDX11__：DX9からDX11用のTextureへ変換
3.通常通り__Textureとして使用__する。
という流れになります。
[DX9toDX11.v4p](https://github.com/JunkyInc/Advent_vvvv/blob/master/dx9todx11.v4p)

![dx9_dx11.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/96e60685-5523-0dad-d65d-733165563aba.jpeg)

#DX11→DX9
__DX11からDX9__へ書き出す方法です。
__SharedTexture__ノードを見たところ、欲しいデータがとってこれそうだった、
__Renderer(DX11 MRT)__を使用し、以下のように作ってみました。

MRTはMulti Renderer Targetっていうみたいですが、
詳しいことは調べてみてください。~~（理解できてないとは言えない。）~~

フォーマットは__R16G16B16A16_Float__に統一し、
得られている情報を__Vector、AsSharedTexture__で処理しています。
あとRenderer(DX11 MRT)は、Previerwがそのままできないので、
__Preview(DX11 Texture)__を使うと良いかと思われます。

![DX11_DX9_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/71fe7c36-95c4-1a0a-b85d-8112bf501ab6.jpeg)

[DX11ToDX9_sample.v4p](https://github.com/JunkyInc/Advent_vvvv/blob/master/DX11intoDx9_sample.v4p)

#具体的な使用例
vvvvではサンプルパッチを見つつ、改変しつつということが多いと思われます。
なので、以下の画像のように、
S(NODE)、R(NODE)を利用することで、別パッチから送ることができます。
基礎すぎかもしれませんが…参考までに。

![dx11_DX9_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/bd7771b0-4f94-d4e7-af48-ea0354f5ad79.jpeg)


---


なぜDX11からDX9に書き出したいのか…
たしか、kinect v2とかからのものをTextureとしてだったかな？
~~正直忘れました。←~~

何か、使う機会があったら、試してみてください。
小ネタでした。

__Junky_Inc__





#
Ruby内にHaskellのコード埋め込むHaskellというGem作ったヨ！

# あいさつ

今日は鼻ピアスを鼻くそみたいにつけられてる方を見ました.
（いやこれがマジで）

### HaskellのコードをRubyから文字列で渡して別スレッドでコンパイルしてRubyの文字列で取得するというGemです.

（**動的にHaskellのコードを生成出来る！**）

前面白がって「[実行時にゆるふわ型をチェックするHaskellというGem](http://qiita.com/gogotanaka/items/c98c584082b2652e10eb)」を作りましたが、ちょっとアレだったので[Rubype](https://github.com/gogotanaka/Rubype) に名称を変更し、Haskellという方にはサクッとネタGemをぶち込んでおきました.

#### [Giuhub](https://github.com/Azabuhs/Ruby)
（僕が粛々とやっている麻布.hsのプロジェクトとして作りました！麻布にゆかりのあるHaskellerは是非！）
#### [Rubygems](https://rubygems.org/gems/haskell)

# 様子

```rb
require 'haskell'

# Haskellをコンパイルするためのサンドボックスを作る
Haskell.invoke_sandbox!(File.expand_path('../', __FILE__))

# 別スレッドでコンパイル
Haskell.compile <<-HASKELL
  add :: Integer -> Integer -> Integer
  add x y = x + y
  result = add 1 2
HASKELL

# 待ち時間を楽しみましょう
while Haskell.compiling?
  # wait for....
end

# fooo↑
p Haskell.execute
#=> 3

# サンドボックスを潰すのをお忘れなく
Haskell.revoke_sandbox!
```

こんな感じでHaskellを実行出来ます、返り値は`result`にHaskellの`Show`を適応させたもの. すなわちHaskellから返せるのは`Show typeclass`（日本語だと型クラスというんだっけ）を由来していないといけない.


ただ単に別スレッド立てて`GHC`でコンパイルしているだけなのでコンパイル＋実行用の遊び場を`Haskell.invoke_sandbox!`とか`Haskell.revoke_sandbox!`で作ったり閉じたりするという結構キモい事している.


 


# 使ってみる

エラーハンドリング等スカスカですがソースコードもそんな長いもんじゃないので詰まったら読むと良いです.

とりあえずファーストカットもファースカットなので`OS X`用をザックリ書いておきます.
（使えるハードルをまだ高くしておきたい）

## GHC を入れる

**「Haskellをコンパイル出来る何かにghcというパスが通っている事が必要です」**

`OS X` なら


    $ brew install ghc

でおk


## Haskell(Gem)を入れる

    $ gem install haskell

でおk


# be rake でHaskellのコンパイル始まるの楽しすぎる

こちらはHaskell Gem のテストの様子なのですが、`bundle exec rake test` を走らせるとHaskellのコンパイルが始まってクッソ楽しいです.

[![Gyazo](http://i.gyazo.com/9c1320c449ae75beba147f3fb8bd1acf.gif)](http://gyazo.com/9c1320c449ae75beba147f3fb8bd1acf)


# 長所をひねり出してみた

このgemを正当化するための理由をひねくり出してみました.


* 動的なHaskellのコードが書ける

* Haskellに任せたい処理を別スレッドでやらせてRubyは他の事に集中出来る.

* 楽しい
changeで発火するajax通信の開始時にloadingアイコンを表示して、終了時に消す



```cagegory_select_box.js.coffee
jQuery ($) ->
  showAjaxErrorMessage = ->
    alert('error message')

  $(document).delegate('.book_category_id','change', ->
    $('.book_category_id').val($(this).val())
    $('.category_select_box').submit()
    $.ajax
      beforeSend: ->
#それっぽいcssを用意しておいて、アイコンにクラスを追加する
        icon = $('.category_select_box').find('.static-icon')
        icon.addClass('loading-spin')
      success: ->
#アイコンからクラスを取り除く
        icon = $('.category_select_box').find('.static-icon')
        icon.removeClass('loading-spin')
      error: -> showAjaxErrorMessage
    )
```

ajaxのevent一覧はここで確認出来る
http://api.jquery.com/Ajax_Events/
WEBサーバーのファイルを、ユーザーを個別管理しながら共同編集出来るようにしたい


WEBサーバーにアクセスする人間に、個別にアカウントを発行して管理を出来るようにしつつ、WEBサイトの更新はみんなで出来るようにしたいのですが、通常、違うユーザーが作成したファイルはパーミッションの関係で読み取り・書き込み・実行権限に制限が発生します。例えば、誰か(userA:userAGroup)がアップロードしたファイルを他の人(userB:userBGroup)は上書きできない、ということがあります。

そこで、userAとuserBを同じグループに所属させ、同じグループなら自由に編集できるようにパーミッションを設定するようにしたいと考えました。しかしチームの人間にはデザイナーや黒い画面が使えない人間もいて、毎度パーミッションを意識してもらうことは難しいのが現状です。

## 考えた方法

そこでCronで自動・定期的にファイルパーミッションを書き換える方法を考えました。

（※umaskのデフォルトパーミッションを試しましたがFTPクライアントが勝手にパーミッションを決定するパターンが有りました。逆にFTPクライアントにアップロード時のパーミッション設定を施すことは、各ユーザーが他のサーバーを利用する場合もあるため、他の環境にも設定が影響する可能性があり、グループに権限を与えることはサーバーによってはセキュリティ上問題となる可能性もあり、不適切であると考えました）

以下、具体的に行った内容です。

##全ユーザーを同じグループに所属させる

```
usermod -g apache SOMEUSER
```

※ WEBサーバーもapacheグループで動いています。

##Cronで、共同管理対象のディレクトリの一括パーミッション設定を行う

###シェルスクリプトを組んでおく

`sudo vi /root/crontab-chmod-www.sh`

```
#!/bin/bash
find /path/to/dir -type d -print0 | xargs -0 chmod 775
find /path/to/dir -type f -print0 | xargs -0 chmod 664
```
ディレクトリなら775、ファイルなら664を設定します。

### 実行権限を付与
```
sudo chown root:root /root/crontab-chmod-www.sh
sudo chmod 700 /root/crontab-chmod-www.sh
```

###Cron を設定
`crontab -e`

```
*/10 * * * * /root/crontab-chmod-www.sh
```

10分毎に実行します。
[WordPress] 固定ページの子ページかどうか条件分岐させる方法

色んな条件分岐タグがあるWordPressですが子ページかどうか調べる`is_subpage()`のような条件分岐タグはありません。毎回調べるのでメモしておきます。

# 固定ページの子ページかどうか判定

```php
if (is_page() && $post->post_parent) {
    // 子ページ
} else {
    // 子ページではない
}
```

## 上記の判定を is_subpage() と関数で使う場合

```php:functions.php
function is_subpage() {
  global $post;
  if (is_page() && $post->post_parent){
    $parentID = $post->post_parent;
    return $parentID;
  } else {
    return false;
  };
};

```

これで判定させたい場所で `is_subpage()`を使えます。

# 親ページと子ページもtrueにさせたい場合

IDで指定するならそのまま。

```php
if ( is_page(1234) || $post->post_parent === 1234 ) {
    // 親ページと子ページ
}
```

これでも可能ですがローカル環境とテスト環境、さらに本番環境が同じIDである事はまずないので、
__スラッグ__で分岐させるのが楽です。

# 固定ページの親ページと子ページをスラッグで判定する方法

まずfunctions.phpに下記の関数を作って、

```php:functions.php
function is_parent_slug() {
  global $post;
  if ($post->post_parent) {
    $post_data = get_post($post->post_parent);
    return $post_data->post_name;
  }
}
```

判定させたい場所で上記関数を使って判定出来ます。

```php
if (is_page('hoge') || is_parent_slug() === 'hoge') {
  // スラッグが hoge ならtrue
}
PHPのPDOStatement::bindParamでハマったメモ


ヽ(｀@A@´#)ﾉ ﾑｷｰ!!

## 前提

久しぶりにフレームワークの入らないPHPを書きました。
$_POSTで受け取ったデータをDBに書き込むだけの簡単なお仕事です。

```php
	function insert($dto){
		$sql = 'insert into '.TABLE.'('.implode(',',DTO::get_insert_key()).') values ('.implode(',',DTO::get_insert_holder()).')';
		$stmt = $this->pdo->prepare($sql);
		
		foreach(DTO::get_insert_holder() as $holder){
			$key=substr($holder,1);	// ※ここは単に:取り除いてるだけ
			$val=$dto->get($key);
			$b=$stmt->bindParam($holder ,$val);
		}
		
		$stmt->execute();
	}
```

※DTO::get_insert_keyはDBのカラム名を配列で、get_insert_holderはカラム名それぞれコロンが付いた形の配列が返ってきます（何もかも外部化したい病気）。

……動かない。動かないというか、つめ込まれた変数がおかしい。
途中にアイキャッチャー挟んで全ての変数を追ってもおかしいところがないのに、execute時点ではどうもデータが変わってしまっている。
時間は全て0000-00-00 00:00:00だし、吐出されるはずのSQLをphpMyAdminで叩いてみても異常は見られない。

## 結論
SQLStatement::bindParamの第二引数は **参 照 渡 し** でした。
つまり、foreachループ内で$valの中身が変わるとそちらでSQLを作成してしまう。
私の場合末尾に入っていた文字列で全ての変数をバインド、DB側でエラーを起こして初期値が入ってしまう、ということでした。

リファレンス何回も見てたのになぜ気がつけなかったのか、こんなことで半日を潰しました。

## 解決策
[SQLStatement::bindValue](http://php.net/manual/ja/pdostatement.bindvalue.php)を使いましょう。
※ループ回さないできっちり変数名を指定するのが一番無難です。
俺のJSライブラリの世界観(2014末版)

http://qiita.com/advent-calendar/2014/frontrend 

## 概論

ここ近年のモダンJSは特に理由がなければcommon.jsのrequireスタイルで記述され、webpack/browserifyでビルド/読み込むことを前提にしてよい。今やビュー層を除いてブラウザとnodeのライブラリの境界は非常に曖昧である。

識者諸君においては常にどちらの環境でも読み込めるようなライブラリを提供するように心がけることを切に願う。


今日はライブラリの名前しか出さないんで各自ググるように。

## 立場

- サーバサイド~ゲームプログラミング出身node寄りフロントエンドエンジニア
- このサイトのスタッフだけど他のことに手一杯でQiitaのフロントはまだそんなにいじってない　すまんな　他ってなんだろうな


## 言語

- CoffeeScript
- TypeScript

最近DDDっぽい構成を目指しているのだけど、コアドメインをTypeScriptで書いて、それをUI層からCoffeeScriptで雑に呼ぶみたいな構成にしている。
なんだかんだでUI層は最初は雑に書きたい。UI層の開発イテレーションはトライアンドエラーを繰り返したい。

## ビルドツール

- webpack
- gulp

webpackで完結できるときはgulpすら用意せずにwebpackのみにすることもある。gulpfileはcoffeeで書く。

## ユーティリティ

- bluebird: Promise
- lodash.js: altenativeなunderscore実装
- moment.js: Datetimeユーティリティ
- jquery

underscoreではなくlodash使っているのは `_.cloneDeep` の存在が大きい。

jqueryは、本当は使いたくない。近年においてはjqueryプラグイン=低品質とほぼ同義である。
もはやjqueryとはグローバル依存に走る割れ窓であると言っても良い。仕方なくjqueryを生で書くときは、恥ずかしいと思って書いて欲しい。近年のモダンなフレームワークの中での開発と比較すると、jqueryコーディングはまるで外科手術のような形相を呈している。

自分はDOMを切り裂いて中をかき回す外科手術が必要なときに使う。

## エディタ

- Vim
- Atom
- Sketch3

3ファイル以上編集しなきゃなーってなった瞬間Atom起動する感じ。
Sketch3はモック書くのに使うようになった。SVG出力で雑にアタリをつけたりもする。

## gulpでよく使うプラグイン

- gulp-webpack
- gulp-shell
- gulp-concat

なんだかんだでコマンド実行するのとconcat必要になるケースが多いのでいつも入れてる。
ビルド系は全部webpackにまるなげしている。gulpでは触らない。

ただしtypescriptはHEAD使ってることが多いので、プラグインの対応が遅いので tsc -w でwatchさせてることが多い。
gulp-shellで `shell(['./node_modules/.bin/tsc -w hello.ts'])` とか書いてる。

## ワークフロー

- tmux
- tmuxinator
- hub
- tig
- fish
- gyazo/gyazo gif

わざわざ言及する程でもないけどUnixに抵抗がない人間なのでGithub見に行くのとブラウザ使う以外はこのツールをぐるぐる回しつつ活動している。fishあたりにゲテモノ好き感が出てると思う。

## WebStorage

- localforage
- minimongo

単純なキーバリューならlocalforage、IndexedDb使えて複雑なストレージを組むならminimongoを使う。

## テスト

- mocha: node
- mocha-phantomjs: ブラウザテスト
- sinon

可能な限りヘッドレス(node)でテストする派。

nodeのときとスタイルを変えたくないのでmocha-phantomjsを使い続けているけど、正直そんな流行ってないしどうしようか感ある。

今はjest使いたい。power-assertはいつも導入迷ってるんだけど僕自身が色々あってASTに介入すること多くて相性悪い。すいませんt_wadaさん。

## SVG

- snap.svg

これ便利なんで皆も使ってください。

## CI

- drone.io

あんまり使ってる人いないけど僕は好きです。タダだし。

## テンプレートエンジン

- jade
- react-jade
- coffeekup
- handlebars

jade使うとDOM/仮想DOMを吐きわけられるのが嬉しい。
html以外を生成するときは雑にhandlebars使ってることが多い。コードジェネレータ書くときとか。

## CSSプリプロセッサ

- libsass
- ruby-sass

どっち使うかはクロスプラットフォームでcompass使いたいかによる。
素振りで適当に使う分なら高速なlibsassで十分。Ruby依存も発生しないし。
正直、僕はあんまり真面目にCSS書く人ではない。

仕事で真面目にやるときはマークアップする人に合わせる。


## 仮サーバー

- `$ python -m SimpleHTTPServer 8080`

特に何も言ってないけど、昔から一貫してこれしか使ってない

## 悩んでいるもの

- Fluxフレームワーク
- クライアントサイドEventEmitter
- クライアントサイドルーター
- E2Eテストランナー

Protoractor… うーん

## 避けているもの

- Yeoman
- require.js
- Angular
- jQueryUI
- jQuery.Deferred
- grunt

Yeoman、自分が好みのスタックで書かれていたことが一度もないのでまともに使えたことがない。
gruntは…特に使わない理由はないのだけど、監視やビルドの並列化とかしだすとgulpに軍配があがる。

Angularは(以下略(「Angularが嫌い」でググってください


## 来年以降に頑張りたいもの

- flowtype


## まとめ

今日はあえてReactに触れないようにしたけど少し漏れた。
Dart 1.8.3リリースノート

こんにちは、らこです。起きたらDart 1.8.3のリリースノートが上がってたので今回も軽くまとめます。原文は[こちら](https://groups.google.com/a/dartlang.org/forum/#!topic/announce/NVQAFmXpxuc)。今回はすべてバグ修正なので新機能はありません。

## Dart Editorのブレークポイントに関する修正
https://code.google.com/p/dart/issues/detail?id=21280

よくわからないのだけど、`app/bin/server.dart`と、`bin/server.dart`に同じブレークポイントが貼られるようにしてくれという感じらしい。多分Dockerと関係してて、リモートデバッグに必要なんだろうと思うけどここらへんの知見不足であまり詳しいこと言えません。おそらく普通に開発する分には関係ない修正です。

## pubコマンドがIPv6で使えるようになった
https://code.google.com/p/dart/issues/detail?id=21698

「出来てなかったのか」という感想しかないですが、IPv6でpubコマンド使った時のエラーが修正されたようです。

## async/await関連のいくつかの修正
今のところ順調に開発が進んでいるようで、おそらくこのままなら1.9.0でasync/awaitがコアライブラリにマージされると思います。ちなみにWebStormの次期リリースでもすでにasync/awaitのサポートが実装されています。

## DartVM関連のいくつかの修正
内部的なオペレーションの問題をいくつか修正したそうです。詳細は不明です。

## ListBaseが返すコレクションをすべてジェネリックを維持させるように修正
https://codereview.chromium.org/720153003

これはかなり恩恵のある修正です。これまでListBaseの`take(count)`や、`skip(count)`、`reverse()`が **何故か** 返り値でジェネリクスが外れたコレクションを返していましたが、ようやくIterable&lt;E&gt;の形で返してくれるようになりました。

以上Dart 1.8.3のリリースノートまとめでした。
ElasticBeanstalk で環境変数を利用する


.ebextensions など ElasticBeanstalk で、Software Configuration などで設定した環境変数を参照したい場合のやり方メモ。
(最後に確認したのがかなり前なので、もしかしたら現在はこのままでは動作しないかもしれないです)


![スクリーンショット 2014-12-11 10.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/11679/46fb0977-7173-a185-59e4-719683dca13b.png "スクリーンショット 2014-12-11 10.24.10.png")

# 環境タイプ: Docker

## 現在の方法

以前は `/opt/elasticbeanstalk/hooks/common.sh` に書かれていた設定ファイルを参照して直接読み出していたけれど、最近 EB の AMI のバージョンをあげたところうまく動かなくなっていた(ami-4aedea4b で確認)。

デプロイ用のスクリプトが使っていたツールを発見したので、これを使わせてもらうことにします。

ちなみに環境変数が含まれた、コンテナのコンフィグファイルを直接参照したい場合はここにあります。

```
/opt/elasticbeanstalk/deploy/configuration/containerconfiguration
```

### その1: `/opt/elasticbeanstalk/bin/get-config` を使う

たとえば `AWS_ACCESS_KEY_ID` を取得したい場合は以下。

``` bash
# 要 root 権限
AWS_ACCESS_KEY_ID=$(/opt/elasticbeanstalk/bin/get-config optionsettings -n aws:elasticbeanstalk:application:environment -o AWS_ACCESS_KEY_ID)
```

### その2: `/opt/elasticbeanstalk/containerfiles/support/generate_env` を使う

`generate_env` を使えば、設定された環境変数を一度に取得することができます。

``` bash
# 要 root 権限
while read -r ENV; do
    export $ENV
done < <(/opt/elasticbeanstalk/containerfiles/support/generate_env)
```

ただし support ディレクトリが可変な雰囲気だったので、実際に使用する場合は下記のように get-config を使って support ディレクトリを取得したほうがいいかもしれません。

``` bash
SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_files_dir)
while read -r ENV; do
    export $ENV
done < <(${SUPPORT_DIR}/generate_env)
```


### 番外編: 以前の方法

上記を適用するまでは以下を使用していました。

``` bash
source /opt/elasticbeanstalk/hooks/common.sh

touch /tmp/env.sh
chmod 600 /tmp/env.sh
jq .docker.env[] $EB_CONFIG_FILE | tr -d \" > /tmp/env.sh
source /tmp/env.sh
rm /tmp/env.sh
```

こちらの方法は、[Amazon S3をDockerプライベートレポジトリにしてAWS ElasticBeanstalk環境にデプロイ](http://aws.typepad.com/sajp/2014/06/eb-docker-private-repo.html) で紹介されていたやり方です。


# 環境タイプ: Multi-container Docker

コメントで教えていただいた方法ですが、 Multi-container Docker の場合は下記の方法で環境変数を取得可能なようです。

```
jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" <(/opt/elasticbeanstalk/bin/get-config environment) > /tmp/envs
. /tmp/envs
```
JavaScriptからCPUのコア数を確認する

https://wiki.whatwg.org/wiki/Navigator_HW_Concurrency

`navigator.hardwareConcurrency`にコア数が入ってる。


![image](https://qiita-image-store.s3.amazonaws.com/0/17969/7925cc8a-3876-5599-83ed-534bd67af128.png)


## 用途

重い処理をするときにどれくらい負荷かけても大丈夫かをコア数から判断するとか。

WebGL使うときにコア数見て弱そうならクオリティ下げるとか？

## 実装

今のところ確認できたのはChromeだけ。

### polyfillがある

http://wg.oftn.org/projects/core-estimator/demo/

Firefoxで確認したらきっちりコア数を当てられたけど力技感がありそうな挙動。

---

3Dとかゲーム系とかで使われるようになりそう
OSX yosemite(10.10)でnokogiriのインストールに失敗

またしてもnokogiriのインストールに失敗しました。おのれnokogiri。

~~~
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/hoge/.rbenv/versions/2.1.5/bin/ruby extconf.rb --use-system-libraries=true
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/val00300/.rbenv/versions/2.1.5/bin/ruby
	--help
	--clean
	--use-system-libraries
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--with-xml2-dir
	--without-xml2-dir
	--with-xml2-include=${xml2-dir}/include
	--with-xml2-lib
	--without-xml2-lib=${xml2-dir}/lib
	--with-xslt-dir
	--without-xslt-dir
	--with-xslt-include
	--without-xslt-include=${xslt-dir}/include
	--with-xslt-lib
	--without-xslt-lib=${xslt-dir}/lib
	--with-libxslt-config
	--without-libxslt-config
	--with-pkg-config
	--without-pkg-config
	--with-exslt-dir
	--without-exslt-dir
	--with-exslt-include
	--without-exslt-include=${exslt-dir}/include
	--with-exslt-lib
	--without-exslt-lib=${exslt-dir}/lib
	--with-libexslt-config
	--without-libexslt-config
	--with-pkg-config
	--without-pkg-config

extconf failed, exit code 1

Gem files will remain installed in 
/workspace/.bundle/gems/ruby/2.1.0/gems/nokogiri-1.6.2.1 for inspection.
Results logged to 
/workspace/.bundle/gems/ruby/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/nokogiri-1.6.2.1/gem_make.out
An error occurred while installing nokogiri (1.6.2.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.2.1'` succeeds before bundling.
~~~

以下のコマンドを試したのですがうまくいきませんでした。
bundle configのオプションもいろいろ組み替えてうまくいかず...。

~~~
brew install libxml2 libxslt libiconv
brew link --force libxml2 libxslt libiconv
bundle config build.nokogiri --with-xml2-config=/usr/local/opt/libxml2/bin/xml2-config --with-xslt-config=/usr/local/opt/libxslt/bin/xslt-config --with-iconv-lib=/usr/local/opt/libiconv/lib --with-iconv-include=/usr/local/opt/libiconv/include --with-xml2-include=/usr/local/opt/libxml2/include --use-system-libraries=true
~~~

最終的に [ここ](http://stackoverflow.com/questions/19643153/error-to-install-nokogiri-on-osx-10-9-maverick) にたどり着き、

~~~~
bundle config build.nokogiri --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libxml2 --use-system-libraries
~~~

で解決。
理由はよくわかりませんが、HomeBrewで入れたlibxmll2ではなく、Xcodeの方のlibxml2を使わないとだめってことですね。

参考URL
---

http://stackoverflow.com/questions/19643153/error-to-install-nokogiri-on-osx-10-9-maverick
JavaScriptで回線情報を取得するAPI

**Editor's DraftなAPI。仕様が大きく変わる可能性あり（2014/12/11）**

## Network Information API

http://w3c.github.io/netinfo/

回線の情報を取得したりイベントで色々したりするAPI

`navigator.connection`に色々入ってる。

## 接続のタイプ

`navigator.connection.type`にはどうやってインターネットに繋いでるかの情報が入っている

|type|
----
|bluetooth|
|callular|
|ethernet|
|none|
|wifi|
|wimax|
|other|
|unknown|

用途としては帯域幅の判定として使ってコンテンツを出し分けるとか、従量課金の回線もあるのでアラート出すとか。

`type`が`none`なときは`navigator.onLine`が`false`になる。

## 接続タイプの変更イベント

回線の変化が起こったときに`typechange`イベントが発生する。`navigator.connection`の`ontypechange`もしくは`addEventListener`でイベントハンドリングする。

```
navigator.connection.ontypechange = function(e) {
  console.log(e);
}
```

or

```
navigator.connection.addEventListener("typechange", function(e) {
  console.log(e);
});
```

## 実装状況？

ChromiumとFirefox OSで実装あり。

`Chrome 39.0.2171.71`で試験運用版のウェブプラットフォームの機能を有効にすると`navigator`に`connection`が生える。

Chromeでは確認できなかったけど`downlinkMax`とか`bandWidth`とかのプロパティが今後生えるかも？
Android Volleyのタイムアウト時間は結構短い

GoogleによるAndroid用の通信処理ライブラリVolleyですが、通信のタイムアウトが2500ミリ秒（2.5秒）と短めに設定してあるため、思わぬところでバグが発生することがあります。

# ライブラリのコード
現時点（2014/12/11）での最新コミット（[1a39583](https://android.googlesource.com/platform/frameworks/volley/+/1a39583f0ee06329f7918ed9a4c7d0e7cd342917)）より

```java:DefaultRetryPolicy.java
/** The default socket timeout in milliseconds */
public static final int DEFAULT_TIMEOUT_MS = 2500;
```

# タイムアウト時間を変更する
DefaultRetryPolicyとRequest#setRetryPolicyで変更することができます。

```java
/* タイムアウト 10000ミリ秒（10秒）*/
int custom_timeout_ms = 10000;
DefaultRetryPolicy policy = new DefaultRetryPolicy(custom_timeout_ms,
                                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)
request.setRetryPolicy(policy);
```

# DefaultRetryPolicyって何？
リクエストの再送制御を行うRetryPolicyの実装クラスです。コンストラクタからはタイムアウトを含む以下の3つのパラメータが設定可能です。

| 　パラメータ名　     | デフォルト値 |　　　デフォルト名     |
|:----------------:|------------:|:-------------------:|
| initialTimeoutMs |         2500|   DEFAULT_TIMEOUT_MS|
| maxNumRetries    |            1|  DEFAULT_MAX_RETRIES|
| backoffMultiplier|           1f| DEFAULT_BACKOFF_MULT|

# タイムアウト後の流れ
タイムアウトした後はmaxNumRetriesの回数になるまで再試行します
DEFAULT_MAX_RETRIES=1なので、タイムアウトしても1回だけ再試行します。
（注意：再試行のうち1回でも成功すればResponse.Listener<T>#onResponseが呼ばれます。
　　　　ErrorListener#onErrorResponseが呼ばれるのは全ての再試行が失敗した場合のみです）

# （余談）タイムアウトに泣かされた話
VolleyでAPIを呼んでいた時に、ひとつのAPIで登録／ログインを行っていた。
登録処理は重い。2.5秒以上掛かる。
もちろんVolleyはタイムアウトする。そして自動的にリトライする。
この間にサーバでは登録処理が完了し、次からはログイン処理になる。
処理時間は2.5秒掛からない。
Volleyは通信を完了する。

通信後のLogCatの[retryCount=0]の数字が増えていたら
再試行が発生してるので注意してみると良いかも。

```
D/Volley﹕ [1295] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://xxx.com/xxx 0x316cf6e5 NORMAL 1> [lifetime=3015], [size=96], [rc=200], [retryCount=0]
```
AngularJS

# AngularJS
**AngularJS** はGoogleからJavaScriptのフレームワークです。Model-View-Controllerというdesign patternのアプリケーション用に使います。色んな機能を持ってますが、主にカスタムHTMLオブジェクトを作ることが出来るようにします。

## 基本
AngularJSのHTMLオブジェクトは皆**ng-directive**というものです。基本的なng-directivesはng-app, ng-model,ng-bindとng-controllerです。これらだけを使えば、面白いアプリケーションを作ることが出来ます。

### ng-app
Rootの要素(ようそ)です。一般的に、他のng-directivesはこのオブジェクトの中にあります。Auto-bootstrapの機能が持ってます。

### ng-modelとng-bind
ng-modelとng-bindは皆HTMLオブジェクトとAngularを結合(けつごう)します、が方向は違います。
ng-modelはHTML→Angularで、
ng-bindはHTML←Angularです。
つまり、ng-modelのinputのバリューが変わると、スコープのバリューも変わるし、スコープの`varName`という変数が変わると、ng-bindで`vaNname`にbindされたHTML要素が更新されます。

**例**

```example1.html
<div ng-app="">
    <input type="text" ng-model="varName"/>
    → ng-model → scope → ng-bind →
    <text ng-bind="varName"/>
</div>
```
[結果](http://jsfiddle.net/Maerig/3y779zaL/)

### ng-controller
Model-View-ControllerのControllerです。Javascriptのコードは特にそこで書きます。

**例**

```example2.html
<div ng-app="" ng-controller="exampleController">
    <button type="text" ng-click="onButtonClicked()">ng-click button</button>
    <br/>
    Button clicked {{clickedTimes}} time(s).
</div>
```
```example2.js
function exampleController($scope) {
    $scope.clickedTimes = 0;
    
    $scope.onButtonClicked = function() {
        $scope.clickedTimes++;
    }
}
```
[結果](http://jsfiddle.net/Maerig/56hwa5c7/)
`{{clickedTimes}}`はexpressionです。ng-bindの省略(しょうりゃく)です。

## カスタムng-directive
自分のng-directiveを作ることも出来ます。

**例**

```example3.html
<div ng-app="SprocketApp">
    <sprocket-directive>
        Directive contents
    </sprocket-directive>
</div>
```
```example3.js
angular.module("SprocketApp", [])
    .directive("sprocketDirective", function() {
        return {
            restrict: 'E',
            replace: false,
            link: function($scope, element, attrs) {
                element.append("<div>Text added by the directive</div>")
            }
        };
    });
```
[結果](http://jsfiddle.net/Maerig/tnh82woc/)
sshfsをfstabに書く

## 参考

* [Notes on sshfs on Ubuntu « SaltyCrane Blog](http://www.saltycrane.com/blog/2010/04/notes-sshfs-ubuntu/)

## 書式

```bash:/etc/fstab
sshfs#user1@server:/srv /opt/sshfs/server fuse allow_other,IdentityFile=/home/user1/.ssh/id_rsa,ServerAliveInterval=60 0 0
```

```bash:
# mount /opt/sshfs/server
```


## メモ: sshfs コマンドでのマウント

```
sshfs server1:/srv/ /home/user/sshfs/server1 \
 -o allow_other \
 -o ro \
 -o nonempty
```
【AndroidStudio】AndroidStudioのコンパイル＆デバッグを高速化する方法

Androidしてますか？
AndroidStudioの1.0が正式にリリースされましたね！

AndroidStudioはさすが、IntelliJから派生しているため、きびきび動いて
くれます！

しかし、そんなAndroidStudioですが、一つ困ったこともあります。
それは


### **コンパイル＆デバッグが遅い！！！**

そこで特にメモリを多く積んでるユーザーにオススメの設定で高速化してみましょう。
まず、

gradle.propertiesに以下のオプションを設定します

	org.gradle.jvmargs=-Xmx10248m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError - Dfile.encoding=UTF-8
	org.gradle.parallel=true
	org.gradle.daemon=true
	org.gradle.configureondemand=true

次に、Gradleをオフラインで動作させます。
Preference... > Gradle > Global Gradle settings
の欄にある
**Offline work**
にチェックをつけてApply or OKボタンでPreferencesを終了。


はい！これでおしまい！！！
1回目は遅いかもですが、2回目以降は速くなると思います！


オフラインにチェックをつけると、Gradleをネットから引っ張ってこなくなるので、
常に最新版ではなくなる、その他の環境では古いままのGradleが使われるという
リスクはあるかとは思いますが、普段はそれはあまり気にならないかと思います。
必要なときに、Onlineにすれば。
sshでパススルー認証する設定まとめ


サーバ管理していると、鍵登録したりする業務あるけど毎回一部忘れたりごっちゃになるので、まとめてみた。
現在のログインユーザとssh接続先のログインユーザが異なる場合にも、ユーザ、鍵指定なしで下記のような感じで簡単にsshログインするのが目的。

```現在がhogeユーザでtest1にfugaで接続する
#毎回ユーザと鍵指定するの辛い。。。
$ ssh -l fuga -i ~/.ssh/fuga_id_dsa test1
↓ 
#これなら簡単
$ ssh test1
```

別の方法もあるだろうけど、この手順ならパスフレーズなし鍵作成から登録までして、サーバにホスト名またはIPだけでつなげるはず。

## 鍵作成
これはログインしたいユーザで実行する。
ログイン簡素化が目的なので、パスフレーズはなしで。

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/xxx/.ssh/id_rsa.
Your public key has been saved in /Users/xxx/.ssh/id_rsa.pub.
The key fingerprint is:
c6:d1:b4:9d:48:a2:ad:39:26:03:ad:7e:e2:89:8f:0a xxx@xxx.local
The key's randomart image is:
+--[ RSA 2048]----+
|        . o      |
|   .   o = + .   |
|  . . . o + o    |
|   o   + .       |
|  . o = S        |
| .   + o         |
|E o .            |
|.+ +             |
|=.+              |
+-----------------+

#公開鍵の名前変更
$ cat id_rsa.pub >authorized_keys

#公開鍵のパーミッション変更
$ chmod 0600 authorized_keys

```

##鍵登録の方法(ローカル・サーバ双方)
ローカルで作った鍵を使うかサーバで作った鍵を使うかで、手順分かれるので両方書く
環境やポリシによってどちらを使うかは分かれるけど、社内とかのテスト環境だと①が多くて、本番機やサービスは②が多いと思う


①ローカルで作った公開鍵をサーバに登録するパターン(githubとかこれ) ※自ユーザの公開鍵をサーバに登録
②サーバで作った秘密鍵をローカルに持ってくるパターン(通常のサーバだとこれかな) ※サーバ上ユーザの秘密鍵をローカルに取得

###①ローカルで作った公開鍵をサーバに登録するパターン

####ローカルで実施

```サーバ上の任意の場所に作成した公開鍵をアップロード
$ scp ~/.ssh/authorized_keys [対象サーバ]:/tmp/
```

```接続情報を追加
$vim ~/.ssh/config

Host ホストのIPまたはホスト名
  IdentityFile ~/.ssh/id_rsa #秘密鍵の場所(デフォルトならこれ)
  User 接続ユーザ名(自分)
```

####サーバ上で実施

```アップロードした公開鍵を追加[接続ユーザのホームdir]
$ cat /tmp/authorized_keys >> ~/.ssh/authorized_keys

```

これで、ローカルから~/.ssh/configに登録したホストかIPで認証なしでパススルーログイン出来る

###②サーバで作った秘密鍵をローカルに持ってくるパターン

####ローカルで実施

```ローカルにサーバから秘密鍵を持ってくる
$ scp [接続ユーザ名]@[対象サーバ]:~/.ssh/id_rsa(秘密鍵名) ~/.ssh/秘密鍵名(このフォルダはどこでもよい)
```

```接続情報を追加
$vim ~/.ssh/config

Host ホストのIPまたはホスト名
  IdentityFile ~/.ssh/秘密鍵名 #秘密鍵の場所(home配下でなくてもよい)
  User 接続ユーザ名
```

これで、ローカルから~/.ssh/configに登録したホストかIPで認証なしで、別ユーザで簡略してパススルーログイン出来る

手順は簡単なんだけど、毎回ごっちゃになるのでメモとして。

##おまけ

さらに、ssh test1を.bashrcでエイリアスとして切ってtest1と打つだけで繋げるようにすると楽。

```.bashrc
alias test1='ssh test1'
```
[Vagrant] synced_folderでローカルと同期する時、パフォーマンスを上げる方法

取り急ぎのメモです。

# やりたかったこと

* vagrantを利用したい
* vagrantの /home/username/project_root 以下にRailsプロジェクトを構築したい(Railじゃなくてもいいし、/var/www/project_root とかでもその辺りはなんでもOK)
* vagrantの /home/username/project_root 以下とローカルの ./synced_folder/project_root を同期させて、お気に入りのGUIエディターやIDEで開発したい

# 問題点

* ブラウザでvmのurlにアクセスするととってもおそい。

で、これをなんとかするために、synced_folderを何とかします。
レスポンスタイムをRack mini profilerでざっくりみました。（本当はsiegeとか使えばよかったけど、手を抜きました。いつかやります。）

# 通常

```rb:Vagrantfile
  config.vm.synced_folder ".synced_folder/project_root", "/home/username/synced_folder/project_root"
```

```rb
GET http://192.168.33.16:3000/	1439.0ms
```

# rsync

```rb:Vagrantfile
  config.vm.synced_folder "./synced_folder/project_root", "/home/username/synced_folder/project_root", type: "rsync", rsync__exclude: ".git/"
```

```rb
GET http://192.168.33.16:3000/	212.0ms
```

# nfs

```rb:Vagrantfile
  config.vm.synced_folder "./synced_folder/project_root", "/home/username/synced_folder/project_root", type: "nfs"
```

```rb
GET http://192.168.33.16:3000/	369.4ms
```

というわけで、私の環境では、rsyncが一番パフォーマンスが高くでました。でも、他の環境ではnfsの方が高いパフォーマンスを出していたりします。
どれにしてもcpuの負荷などは問題ありませんでした（MacBookPro, 3 GHz Intel Core i7, 8 GB 1600 MHz DDR3）

雑でごめんなさい。

# References

* https://docs.vagrantup.com/v2/synced-folders/nfs.html
* http://www.1x1.jp/blog/2013/08/vagrant_synced_folder_with_nfs.html
* http://qiita.com/EaleLove777/items/b7a7d1a671106cd1a78a
* https://docs.vagrantup.com/v2/synced-folders/rsync.html
*
awkで別ファイルのリストとマッチしている行のみ抽出させる

awk便利ですね。便利すぎてなんでもawk使おうとするんですが、範囲を広げるともどかしいことも増えてきます。

今回は、標準入力とは別に「IDとか名前とかキーワードとかの一覧が並んでいるテキストファイル」を読み込んで、どの行かと標準入力の1番目がマッチしたらその行を返すというスクリプトをご紹介します。

ロジックが簡単なので1度理解してしまえば、コピペでスクリプト貼り付けて一分で抽出始められます！

awkのバージョンによっては動かないかもしれません。試したのは、WindowsのCygwin 64bit版のGNU Awk 4.1.0です。

```sample1.awk
#!/bin/awk -f
# cat input.txt | awk -F, -v file=keyword.txt -f sample1.awk
# 改行はLF
# 日本語の場合文字コードはUTF8

BEGIN {
    DATA="|";
	CAT = "cat " file;
	while ((CAT | getline) > 0) {
		DATA = DATA "" $0 "|";
	}
	close(CAT);
}

$1!=""{
	ITEM = "|" $1 "|";
	if (index(DATA, ITEM) >0) {
		print $0;
	}
}
```

```keyword.txt
test1
test2
test3
```

```input.txt
test1
test12
test123
```

やってることは単純に、キーワード一覧を、keyword.txtを一行ずつ読み込んで、|test1|test2|test3|という文字列に変換して、標準入力の1番目がマッチすればtrueと見なすということをやっています。

それでは充実したawkライフをお送りください。
fluentdプラグインのテストをrspecで書く

fluentdプラグインのテストは基本的にtest-unitを使うことが前提になっていますが、一応、rspecを使うこともできます。
しかし普通にrspecを実行すると、test-unitの実行結果も表示されていまいます。

```
$ bundle exec rspec spec/out_lambda_spec.rb
...

Finished in 2.14 seconds (files took 0.2635 seconds to load)
3 examples, 0 failures
Run options:

# Running tests: # ↓末尾にtest-unitの出力が…

Finished tests in 0.013681s, 0.0000 tests/s, 0.0000 assertions/s.
0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
```

また、rakeからrspecを実行すると`--pettern`が不正なオプションとなってエラーになってしまいます。

```
$ bundle exec rake
../ruby -I.. rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...

Finished in 2.05 seconds (files took 0.24343 seconds to load)
3 examples, 0 failures
../test/unit.rb:49:in `process_args': invalid option: --pattern (OptionParser::InvalidOption)
	from ../minitest/unit.rb:1042:in `_run'
	...
```


しかし、rspecに慣れた身としてはできればrspecを使いたい、なんとか方法はないものか…といろいろ試行錯誤したところ、一応、普通に使えるようになったので、その方法を紹介したいと思います。

# おまじない
結論から書くと、以下のコードを`spec_helper.rb`などに書いておくと、rspecを実行しても余計な情報を出力されたり、エラーになったりすることがなくなります。

```rb
require 'fluent/test'
require 'fluent/plugin/out_...'

# Disable Test::Unit
module Test::Unit::RunCount; def run(*); end; end

RSpec.configure do |config|
  config.before(:all) do
    Fluent::Test.setup
  end
end
```

# やっていること
なにをやっているのかだいたい分かると思いますが、一応解説します。

まず`fluent/test`をrequireすると[test/unit.rbがrequireされます](https://github.com/fluent/fluentd/blob/v0.10.57/lib/fluent/test.rb)。

```rb
require 'test/unit'
require 'fluent/load'
require 'fluent/test/base'
...
```

`test/unit.rb`の末尾では[Test::Unit::Runner.autorunが実行されます](https://github.com/ruby/ruby/blob/v2_0_0_576/lib/test/unit.rb#L865)。

```rb
...
  end
end

Test::Unit::Runner.autorun
```

さらにTest::Unit::Runner.autorunの中では[at_exitでTest::Unit::Runner#runを実行しています](https://github.com/ruby/ruby/blob/v2_0_0_576/lib/test/unit.rb#L363)。

```rb
def self.autorun
  at_exit {
    Test::Unit::RunCount.run_once {
      exit(Test::Unit::Runner.new.run(ARGV) || true)
    } unless @@stop_auto_run
  } unless @@installed_at_exit
  @@installed_at_exit = true
end
```

ということでTest::Unit::Runner#runを上書きしてやれば、test-unitは実行されなくなります。

# まとめ
あまり行儀のいいやり方ではないですが、一応rspecが普通に使えるようになるので、どーしてもrspecが使いたいという方は試してみると良いのではないでしょうか。
[Android] String Resourceに別のString Resourceを含める


String ResourceでFormatter（書式指定）を使えば、別のString Resourceを文字列内に含めることもできます。

このキャプチャの場合、「Cancelを選ぶと〜」の「Cancel」は「Cancel」ボタンのtextに指定しているString Resourceを使っています。

「Cancel」ボタンから「キャンセル」ボタンに変えたくなっても変更は一箇所ですみます。

![スクリーンショット_2014-12-11_7_41_10.png](https://qiita-image-store.s3.amazonaws.com/0/40758/b5c215ca-e28d-b2b9-53ed-3844e9b7c2b6.png)

```strings.xml
<string name="confirm_save">保存しますか？\n%sを選ぶと・・・</string>
<string name="cancel">Cancel</string>
```
`%s` の部分が指定した文字列に置換されます。
そこに別のString Resourceを指定ればOK。（あたりまえ）


```HogeFragment.java
getResources().getString(R.string.confirm_save,
        getResources().getString(R.string.cancel))


// これも同じ。
String.format(getResources().getString(R.string.confirm_save),
        getResources().getString(R.string.cancel))
```
`getResources().getString(resId)` を短い名前のメソッドに切り出せばもっとすっきりしますね。

XMLだけではできないっぽい？？

書式指定はこの辺りを参考に。
http://developer.android.com/reference/java/util/Formatter.html
RubyMine初心者が定期実行させるJobのデバッグに挑戦

# RubyMine初心者が定期実行させるJobのデバッグに挑戦

## はじめに

以前からRubyMineに興味はあったのですが、ずっとVimで開発しています。

最近デバッグで手間がかかっていたので、デバッグにかけるコストを減らしたいと思っていました。
そんなとき、ちょうどAdvent Calendarの記事を見て”試してみる価値あるかも！”と思いました。

- [メインの開発ツールをVimからRubyMineに変更した理由](http://qiita.com/jnchito/items/cb05bb14d89095e5cc0b)

- [RubyMine が気になる人に捧ぐ、ざっくり入門編](http://qiita.com/ruzia/items/2edd8d45c16ac2c70dd7)

ということで、RubyMineをお試しで使ってみることにしました。

## まずRailsアプリのデバッグ

こちらは迷うことなくできました。

Railsアプリをプロジェクトとしてオープンして、RunメニューからDebug実行です。

![page1.png](https://qiita-image-store.s3.amazonaws.com/0/38173/81dff0b5-4aa4-b11c-f972-497df11e0484.png)

環境も選べるんですね〜

![page2.png](https://qiita-image-store.s3.amazonaws.com/0/38173/48cce330-73c5-e52b-5cf6-3647e4f41336.png)

ちゃんと起動しました。

![page3.png](https://qiita-image-store.s3.amazonaws.com/0/38173/c6bcfceb-46fa-54de-9fb9-375301fa4167.png)

ブレークポイントで停止することも確認できました。

![page4.png](https://qiita-image-store.s3.amazonaws.com/0/38173/df2e97f7-cdec-3c05-215a-cdeaeda73752.png)

## Schedulerで定期実行させるJobのデバッグ

いよいよ本命です。

今作っているアプリで、定期的にJobキューを確認し、Jobの状態に応じてLinuxコマンドを非同期で実行させるような処理があります。(JobTask.executeというクラスメソッド)

コマンド実行時にpidを取得したり、そのpidを使って停止させたりしています。

これまでは、puts文をあっちこっちに仕込み、rails console上でJobTask.executeを実行してデバッグしていました。

これが思いのほか大変だったので、RubyMineで簡単にできたらいいなと思って試そうとしました。

### 一つの疑問

いざJobTask.executeを実行しようとしましたが、Runメニューには特定のメソッドを実行するようなメニューが見当たりません。

![page1.png](https://qiita-image-store.s3.amazonaws.com/0/38173/81dff0b5-4aa4-b11c-f972-497df11e0484.png)

Rails runnerとかRails consoleとかデバッグできないの〜！？と思ってたら、ちゃんとありました。

- [Running Rails Console](https://www.jetbrains.com/ruby/webhelp/running-rails-console.html)
- [Debugging in Console](https://www.jetbrains.com/ruby/webhelp/debugging-in-console.html)

### Rails Console上でデバッグ

まずRails Consoleを起動します。

![page5.png](https://qiita-image-store.s3.amazonaws.com/0/38173/9e5a84d6-9d12-65e2-0e09-f47bcc606911.png)

こちらも環境が選択できます。

![page6.png](https://qiita-image-store.s3.amazonaws.com/0/38173/7e30926c-1763-4505-694c-e92076de7569.png)

![page7.png](https://qiita-image-store.s3.amazonaws.com/0/38173/a1437676-2a09-c672-5e92-91f316fc0bb1.png)

起動しました。

![page8.png](https://qiita-image-store.s3.amazonaws.com/0/38173/b08f9ec5-dab1-37bc-87fc-d4e1bce94899.png)

この状態でRunメニューをのぞいてみるとRails Consoleでのデバッグができるようになっていました。

![page9.png](https://qiita-image-store.s3.amazonaws.com/0/38173/ff9fcb05-254a-8c00-b0a8-49d50f0cdb7c.png)

そのままデバッガを起動させ、Rails Console上で動かしたいもの(ここではJobTask.execute)を実行します。

![page10.png](https://qiita-image-store.s3.amazonaws.com/0/38173/46dcaa55-6f04-132c-340a-3b2027d5612f.png)

仕込んでおいたブレークポイントで停止することが確認できました！

![page11.png](https://qiita-image-store.s3.amazonaws.com/0/38173/c937f2b3-87cd-e8a4-eeef-0f6c8edaef0b.png)

いろいろと使いながら慣れていこうと思います。
Rails4でhas-oneなレコードをCoffeeScriptから作成する

Railsで画面遷移なしでレコードを作成＆更新したいことがよくあるので、CoffeeScriptを使った実装パターンをまとめてみました。

Railsのほうでは`/blog/site_configs`コントローラがJSON APIになっていて、`create`アクションと`update`アクションが実装してあるとします

なお、この記事ではCoffeeScriptのサンプルコードだけご紹介しますが、RailsとHTMLまで含めたコードについては元記事「[Rails4でhas-one関連先のレコードをCoffeeScriptから作成＆更新する](http://blog.enogineer.com/2014/12/11/rails-coffee-create/)」の方をご覧ください。

下記のCoffeeScriptでは

* 「編集」ボタンを押したら入力フォームを表示する
* 「保存」ボタンを押したら`create`アクションか`update`アクションをリクエストする
* 保存できたら入力フォームを非表示にする

という動作を記述しています。

```coffeescript
# app/assets/javascripts/blog/sites/index.coffee
$ ->
  $('body#blog-sites-index-page').each ->
    $('button.redirect-to-edit').click ->
      showBlogSiteConfigForm($(@).data('blog-site-id'))

    showBlogSiteConfigForm = (blogSiteId) ->
      $("tr#blog-site-#{blogSiteId} span.blog-site-config-edit").slideDown()
      $("tr#blog-site-#{blogSiteId} span.blog-site-config-show").slideUp()

    hideBlogSiteConfigForm = (blogSiteId) ->
      $("tr#blog-site-#{blogSiteId} span.blog-site-config-edit").slideUp()
      $("tr#blog-site-#{blogSiteId} span.blog-site-config-show").slideDown()

    $('button.redirect-to-save').click ->
      createOrUpdateBlogSiteConfig($(@).data('blog-site-id'))

    createOrUpdateBlogSiteConfig = (blogSiteId) ->
      id = blogSiteConfigIdOf(blogSiteId)

      if id
        url = "/blog/site_configs/#{id}/"
        method = 'PUT'
      else
        url = '/blog/site_configs/'
        method = 'POST'

      $.ajax url,
        type: method,
        data:
          site_config: blogSiteConfigParams(blogSiteId)
        dataType: 'json'
        success: (data) ->
          receiveBlogSiteConfig(blogSiteId, data)
          hideBlogSiteConfigForm(blogSiteId)

    blogSiteConfigIdOf = (blogSiteId) ->
      $("tr#blog-site-#{blogSiteId} td.blog-site-config").data('id')

    blogSiteConfigParams = (blogSiteId) ->
      site_id: blogSiteId,
      redirect_to: $("tr#blog-site-#{blogSiteId} input.redirect-to-input").val()

    receiveBlogSiteConfig = (blogSiteId, data) ->
      $("tr#blog-site-#{blogSiteId} td.blog-site-config").data('id', data['id'])
      $("tr#blog-site-#{blogSiteId} p.redirect-to-show").text(data['redirect_to'])
      $("tr#blog-site-#{blogSiteId} input.redirect-to-input").val(data['redirect_to'])
```

## 参考
* [Rails4でhas-one関連先のレコードをCoffeeScriptから作成＆更新する](http://blog.enogineer.com/2014/12/11/rails-coffee-create/)
OpenVzコンテナでsshfs

## 参考

* [OpenVZ ゲストOSでホストOSのディスクをマウントする : わすれないうちにメモしよう](http://nekokamuri.exblog.jp/16668338/)


## ホスト側の設定

ContainerIDを335とする。

```bash:hostの/dev/fuseを確認
# ls -l /dev/fuse
crw-rw---T 1 root fuse 10, 229 Dec 10 09:08 /dev/fuse
```

* キャラクタ型のデバイス、major: 100, minor:229

ということがわかる。

```bash:
vzctl set 335 --devices c:10:229:rw --save
vzctl exec 335 mknod /dev/fuse c 10 229
```

以下追記される。

```diff:/etc/pve/openvz/335.conf
+ DEVICES="c:10:229:rw "
```

```bash:要コンテナ再起動
# 再起動しない場合
crw------- 1 root root 10, 229 12月 12 15:50 /dev/fuse
# 再起動後
crw-rw-rw- 1 root root 10, 229 12月 12 15:55 /dev/fuse
```


## コンテナ側

```bash:
sshfs server1:/srv/ /home/user/sshfs/server1
```
【パッチでました】KB3008923を適用するとModal Dialogから値を取得できなくなる

2014/12/10にKB3008923が配布。

## パッチ

http://answers.microsoft.com/en-us/ie/forum/ie11-windows_7/problem-with-ie11-and-nested-modal-dialog-after/b589426c-7134-4169-8e0c-5c00768ce50c


## 検証ページを作りました。

* https://ie11popup.herokuapp.com/
* https://tukiyo.github.io/ie11_popup/index.html

## 参考

* [2014年12月のWindows Updateの不具合と解消方法](http://freesoft.tvbok.com/cat97/2013/windows_update_2014-12.html)
* [Blogs - Japan IE Support Team Blog - Site Home - TechNet Blogs](http://blogs.technet.com/b/jpieblog/archive/2014/12/12/3642398.aspx)

## KB3008923 未適用での検証

![準備.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1745d58b-bda2-575b-df2d-2d709d52c4b0.png)

CLOSE2を押すと`戻り値 = 2`

![確認1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0ccf9779-6050-b330-0e8a-aab3c8a4f09a.png)


## IE11 + KB3008923 での検証

https://ie11popup.herokuapp.com/

![準備2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/215aefc7-95c6-77be-bdda-e80295d11cfa.png)

CLOSE2を押すと`戻り値 = undefined`


![確認2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/64d1a45d-34e5-8f94-b963-d789764fb540.png)


## 参考


* [Problem with IE11 and nested Modal Dialog after applying KB3008923 - Microsoft Community](https://answers.microsoft.com/en-us/ie/forum/ie11-windows_7/problem-with-ie11-and-nested-modal-dialog-after/b589426c-7134-4169-8e0c-5c00768ce50c)
* [ChromeのshowModalDialogサポート終了が企業向けウェブアプリで問題に](http://www.infoq.com/jp/news/2014/09/chrome-showmodaldialog)
* [Windowsのアップデートをコマンドラインからアンインストールする - Qiita](http://qiita.com/tukiyo3/items/8d735f329677200f899d)


## window.showmodaldialogがなければ定義すればいいじゃない

* [javascript - How can I make window.showmodaldialog work in chrome 37? - Stack Overflow](http://stackoverflow.com/questions/25663053/how-can-i-make-window-showmodaldialog-work-in-chrome-37)