OmniAICreator/Qiita-1.07M huggingface dataset:
self gem

[Ruby - Object#self があればちょっとうれしい - Qiita](http://qiita.com/riocampos/items/4dea07258734eba98e6c)
の派生ネタ。
名前だけ関連していますが、内容は脱線していますw
#self gem
というのがありますw

* [self | RubyGems.org | your community gem host](https://rubygems.org/gems/self)
* [ConradIrwin/self](https://github.com/ConradIrwin/self)

これは

```ruby
class Object
  def self
    self
  end
end
```
では **ありません** w
#紹介
簡単に言うと、インスタンス変数やプライベートメソッドへのアクセスを簡単に行うためのメソッドを作ってくれるメソッドです。インスタンス変数への代入メソッドも作ってくれます。
##インストール
* `pry` で使う場合

```bash
$ gem install pry-self
```
`pry` 実行時に自動的に self gem を `require` してくれます。

* `pry` を使わない場合

```bash
$ gem install self
```
##例
GitHub の例を実現する Class を書いてみました。

```ruby	
class Mouse
  class Head; end
  class Tail; end
  class Legs; end
  
  def initialize
    @head = Head.new
    @tail = Tail.new
    @legs = Legs.new
  end
  
  private
  def squeak!
    "Squeak!"
  end
end
```
この `Mouse` クラスのインスタンスメソッド `mouse` で `Object#self` メソッドの働きを確認しましょう。 `pry` を使います。
`pry` の `ls` メソッドは、 `-p` オプションが（プライベートメソッドを含む）全てのメソッドを表示し、 `-i` オプションがインスタンス変数及びクラス変数を表示します。

```ruby
[1] pry(main)> mouse = Mouse.new
#=> #<Mouse:0x007fe83e25d810 @head=#<Mouse::Head:0x007fe83e25d770>, @legs=#<Mouse::Legs:0x007fe83e25d680>, @tail=#<Mouse::Tail:0x007fe83e25d748>>
[2] pry(main)> ls -pi mouse
Mouse#methods: initialize  squeak!
instance variables: @head  @legs  @tail
```
* `Object#self` のあとにインスタンス変数名のメソッドを呼ぶとインスタンス変数が返ります。

```ruby
[3] pry(main)> mouse.self.head
#=> #<Mouse::Head:0x007fe83e25d770>
[4] pry(main)> mouse.head
NoMethodError: undefined method `head' for #<Mouse:0x007fe83e25d810>
```
* `Object#self` のあとにはプライベートメソッドを呼べます。

```ruby
[5] pry(main)> mouse.self.squeak!
#=> "Squeak!"
[6] pry(main)> mouse.squeak!
NoMethodError: private method `squeak!' called for #<Mouse:0x007fe83e25d810>
```
* インスタンス変数への代入メソッドも作ってくれます。

```ruby
[7] pry(main)> mouse.self.tail
#=> #<Mouse::Tail:0x007fe83e25d748>
[8] pry(main)> mouse.self.tail = "long tail"
#=> "long tail"
[9] pry(main)> mouse
#=> #<Mouse:0x007fe83e25d810 @head=#<Mouse::Head:0x007fe83e25d770>, @legs=#<Mouse::Legs:0x007fe83e25d680>, @tail="long tail">
[10] pry(main)> mouse.self.tail
#=> "long tail"
```
#注意
この gem はテストだけに使いましょう。
views.py 複数のobjectをtemplateに送信


知っている人は知っているのかな。。
Django難しい。。

めも

views.py

def hogehoge(request):
  object1 = [models.pyのclass名].objects.all()
  object2 = [models.pyのclass名].objects.all()
  　
  return render_to_response('hogehoge.html',{'object1_list':object1,'object2_list':object2})
openFrameworksでのプライベートなマルチプラットフォーム開発環境の構築

# 環境
* OS X 10.9.3
* openFrameworks 0.8.3
* Xcode 5.1.1

# 目的
openFrameworksの開発環境を、以下の要求を満たすように構築する。

* マルチプラットフォーム（後々Windowsともリポジトリを共有するため）
* gitリポジトリの容量を節約する
* projectGeneratorはマルチプラットフォーム環境確保のためソースから必要
  * とりあえずOSX版のみビルドしとく

# 手順
## GitHubから目的のバージョンをDLする

https://github.com/openframeworks/openFrameworks/releases

容量を減らすために、gitの履歴は不要なのでcloneしません。
下手にうまくやろうとせず、素直にzipなりなんなりで落としてきた方が単純で早いです。

また、マルチプラットフォームの要求を満たすため、[openFrameworks公式からのDL](http://openframeworks.cc/download/)もしません。


## 容量を軽くするため、極力削除する

- apps/devApps
- apps/projectGenerator/ProjectGeneratorSimple (submodule addで生成するので消しておきます)
- CHANGELOG.md
- CONTRIBUTING.md
- docs
- examples
- (LICENSE.md)
- other
- README.md
- tutorials

※ LICENSE.mdは人道的にも容量的にも消さないでいいと思います。

## git initする

```
$ git init
```

>Initialized empty Git repository in /path/to/of/directory/openFrameworks-0.8.3/.git/

## projectGeneratorを追加

__submodule addする__

```
$ git submodule add git@github.com:ofZach/projectGeneratorSimple.git apps/projectGenerator/projectGeneratorSimple
```

>Cloning into 'apps/projectGenerator/projectGeneratorSimple'...
>remote: Counting objects: 738, done.
>remote: Total 738 (delta 0), reused 0 (delta 0)
>Receiving objects: 100% (738/738), 848.68 KiB | 384.00 KiB/s, done.
>Resolving deltas: 100% (396/396), done.
>Checking connectivity... done


oFとprojectGeneratorとのバージョン不整合が心配な場合はGitHubで該当バージョンのハッシュをチェックしてcheckoutしてください
https://github.com/openframeworks/openFrameworks/tree/0.8.3/apps/projectGenerator

```（0.8.3の場合）
$ cd apps/projectGenerator/projectGeneratorSimple
$ git checkout 3de40be
```

_ちなみに0.8.3でこのバージョン(3de40be)はビルドできません（笑）_
_http://forum.openframeworks.cc/t/fix-for--cvdisplaylinkrelease-etc-errors/16423_

__ビルドしてコピーする__

1. `apps/projectGenerator/projectGeneratorSimple/projectGenerator.xcodeproj`をXcodeで開いてビルド
1. ルートに`projectGenerator`ディレクトリを作成
1. `apps/projectGenerator/projectGeneratorSimple/bin/`内の`data`と`projectGeneratorDebug.app`を`projectGenerator`以下にコピー
1. `projectGenerator/data/settings/projectGeneratorSettings.xml`をテキストエディタで開き、`appToRoot`の値を修正

```
<appToRoot>./../</appToRoot>
```

__projectGeneratorのための.gitignoreを作成__

ルートにある`.gitignore`で`*.app/`がignoreされているのでこのままだと`projectGenerator/projectGeneratorDebug.app`がaddされない。
`projectGenerator/.gitignore`を以下の内容で作成する。

```projectGenerator/.gitignore
!*.app/
```

## コミットする

```$ git add .
$ git commit -m "first commit"
```

line endingss関連のwarningがたくさん出ても気にしない。

## pushする

```
$ git remote add origin ssh://your.remote/repo.git
$ git push -u origin master
```

>Counting objects: 2678, done.
>Delta compression using up to 8 threads.
>Compressing objects: 100% (2544/2544), done.
>Writing objects: 100% (2678/2678), 192.87 MiB | 2.00 MiB/s, done.
>Total 2678 (delta 508), reused 0 (delta 0)
>remote: Resolving deltas: 100% (508/508)
>remote: Updating references: 100% (1/1)
>To ssh://your.remote/repo.git
> * [new branch]      master -> master
>Branch master set up to track remote branch master from origin.

# 結果

ワーキングディレクトリ（.gitディレクトリ含む）の容量は約1GB。
`$ git gc`したあとの.gitディレクトリの容量は約200MB。
それぞれoF0.8.3を丸ごとcloneした場合は1.8GBと935MBなのでそこそこ節約できているかと思います。
Swap領域が足りないときに、ささっと追加する


## swapfileを作る

```
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
```

countは、bs(1024) * 欲しい容量(1024MByte)です。

## swap領域に追加する

```
mkswap /swapfile
swapon /swapfile
```

とすると、swap領域が増えます。

この方法だと通常のパーティションよりは遅いでのですが、とりあえず再起動なしでささっと追加するにはよいでしょう。

@suin によって、fallocateをつかったシェルスクリプトでやる方法が書かれてましたので、こちらも参考になるとおもいます。 [VagrantでUbuntuにSwapを4GBほど追加したい](http://qiita.com/suin/items/c30cb302043aa5cd041f)
複数の Markdown を 1枚の PDF に出力

印刷出力
---------

[pandoc](http://johnmacfarlane.net/pandoc/) を使用することで、様々なファイルフォーマットに出力可能です。

複数の Markdown ファイルを結合して、 pandoc に渡すことで、 1枚の PDF ファイルに出力することができます。

### PDF出力

まず、体裁を整えるため、 **preanble.tex** ファイルを作成します。

```preanble.tex
%
% preanble.tex
% PDF出力用プリアンブル
%
\paperwidth210mm
\paperheight297mm
\usepackage{luatexja}
\usepackage[ipa]{luatexja-preset}
\usepackage{amsmath}
\usepackage{graphicx,color}
\usepackage[margin=2cm,truedimen]{geometry}
\def\baselinestretch{1.1}
\parindent=0pt
```

以下のようなコマンドで、カレントディレクトリ以下の `*.md` ファイルを1枚の PDF に出力することが可能です。
pandoc の他、 lualatex を使用するため、 [Tex Live](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%20Live#qf59e3ea) が必要です。

Mac の場合は [iconv で NFCに正規化しなおす](http://macwiki.sourceforge.jp/wiki/index.php/UTF-8-MAC) 必要があります。

```sh
# Mac の場合
find . -name '*.md' | xargs iconv -f UTF-8-MAC -t UTF-8 | pandoc -f markdown -o output.pdf -V documentclass=ltjltxdoc -H preanble.tex --latex-engine=lualatex --toc -N

# Mac 以外の場合
find . -name '*.md' | xargs cat | pandoc -f markdown -o output.pdf -V documentclass=ltjltxdoc -H preanble.tex --latex-engine=lualatex --toc -N
```

- **--toc** を付与することで、目次を生成できます。
- **-N** を付与することで、項番を生成できます。

#### 文書クラス

**documentclass** を変更することで、 `--latex-engine` で指定した LaTeX エンジンの多彩な文書クラスを利用できます。
**--latex-engine=lualatex** を指定し、前出の preamble.tex を使用した場合、 *article*, *book* といった 8 ビット欧文 LaTeX 用の文書クラスでも、日本語で出力できるようです。ただし、 *jarticle*, *jsarticle* 等、 pLaTeX 専用のものは使用できません。

文書クラスについては、 「[LaTeX 文書クラスについて](http://akita-nct.jp/yamamoto/comp/latex/make_doc/doc_class/class.php) 」が詳しいです。

#### 表紙

以下のような pandoc 用コメントを入れておくと、表紙の出力が可能です。

```cover.md
% 文書のタイトル
% 著者名
% 日付
```

[Pandoc ユーザーズガイド 日本語版 - タイトルブロック](http://sky-y.github.io/site-pandoc-jp/users-guide/#title-block) も参考にしてください。

#### 参考

- [多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)
- <http://kreisel.fam.cx/webmaster/clog/2014-05-26-1.html>
- [Pandoc ユーザーズガイド 日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide/)
- [LaTeX 文書クラスについて](http://akita-nct.jp/yamamoto/comp/latex/make_doc/doc_class/class.php)

#### TODO

 - `*.md` ファイルの最終行に、改行コードが2つ以上ないと、 PDF にした際に正常に出力されない。 `cat` で連結した時に、ファイルの境界を改行させたいが、良いやり方が解らない。。。
Hubotのログレベルを指定する

https://github.com/github/hubot/blob/master/src/robot.coffee#L50

ここにある通り、 `HUBOT_LOG_LEVEL` という環境変数を認識する。デフォルトでは `info` なので、だいぶ細かく出てしまって不便。ことhubot-ircだとinfoではチャンネルのすべての発言がログに出てしまうのでサイズも...。

Heroku で運用していれば

```bash
$ heroku config:set HUBOT_LOG_LEVEL=notice
```

でセットできて便利やね〜

あと、ログレベルの表記はsyslog準拠らしい。

* http://dev.classmethod.jp/etc/logjs/

log4jやRubyのLoggerの感覚で `config:set HUBOT_LOG_LEVEL=warn` とやってしまうと認識してくれない。注意。
ダッシュボードで登録した画像をbackground-imageで出力する(<img>タグではなく)

#やりたいこと
　WordPressで、background-imageを使ってパララックス効果を実現したい。「WordPressで」ということは、ここでの画像はクライアントやユーザーがダッシュボード(主に固定ページの管理画面)から簡単に変更できるようにする必要もあるということを意味する。

#ぶつかる壁
　単純なパララックス効果は、CSSのbackground-imageなどのCSSプロパティを使って、

```lang:style.css

.parallax-area {
    background-image: url('hoge.jpg');
    background-attachment:fixed;
    background-size: cover;
    background-position: 56% 56%;
    width:100%;
    height: 450px;
    position: relative;
 	
}

```
という風にすれば、簡単に書くことができます。
　ですが、この画像のリソースの部分はどうしてもパスを直に書くしか無い。クライアントが画像を変える場合、CSSファイルを直接書き換えることは困難でしょうから、これでは困ります。

# 解決方法
　インラインで出力します。言われてみれば当たり前ですね。和英問わずググっても解決策が出てこなかったのは、もしかしたら当たり前すぎたかもしれません。そうだったらごめんさない。
　気を取り直して、実際のコードをみていきます。実はやり方は少なくとも2つあり、それぞれで少しやり方が異なります。また、あたりまえですが、CSSファイルのbackground-image:の一行をここで消しておきます。
## A. Advanced Custom Fieldsで保存した画像を出力する

```lang:page.php

<div class="parallax-area" style="background-image:url(<?php the_field('parallax_image1'); ?>);"></div>


``` 

　これは、ワンページレイアウトで複数の画像を使用するときによく使います。

## B. アイキャッチ(サムネイル)として保存した画像を出力する

```lang:page.php

<?php 
   $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' );
?>
<div class="parallax-area" style="background-image:url(<?php echo $image[0]; ?>);">
   <h2 class="page-heading"><?php the_title(); ?></h2>
</div>

``` 
　これは、固定ページでそれに対するイメージを使用するときによく使います。

# 備考

　アイキャッチ出力の方は、前回の投稿[サムネイルがlightbox系のプラグインで拡大されない時に](http://qiita.com/Nanigashi/items/3f96aac0e69d07f93531)を借用しています。
　なお、インラインCSSはあまり推奨されていませんが、サーバーからの出力を実現することを優先して、ここではまったく気にしていません。
　ビジュアルエディタで登録したメディアについては、the_content();に含まれる画像はbackground(背景)ではなくコンテンツの一部なので、ユーザビリティやSEOの観点から、元々background-image:として出力されることを想定していません。
SNMPを利用して時刻監視をするNagiosプラグイン（シェル版）

SNMPを利用して対象サーバの時刻（監視サーバとの時差）を監視するプラグインを作成してみました。

標準のプラグインとして**check_ntp**がありますが、対象サーバがNTPを起動していない場合（VMとか）や別サーバからNTP接続を許可していない場合などに設定を入れてもらう必要がありやや面倒です。

というわけで、それならsnmpで時刻を取得して監視すればいいじゃないかとシェルでプラグインを作成してみました。　閾値は「**秒**」で、監視サーバと指定した秒数以上の開きがあれば警告を返します。

ちなみに方法ですが、snmpwalkコマンドで **HOST-RESOURCES-MIB::hrSystemDate** を取得しますが、 *2014-8-6,15:43:9.0,+9:0* といった結果が返ってきますのでそれを解析して閾値と比較しています。

```sh:check_datetime.sh
#!/bin/sh
########################################################################
#    Nagios Plugin for Datetime-diff for SNMP.
##
###    Argument    Community / HostIP / Warning / Critical
####   Create      2014.8.6
#####
#######################################################################


# 引数チェック
if [ $# -ne 4 ] ; then
        echo "Argument is not enough.($#)"
        exit 3
fi


# 絶対値を返す関数
function abs()
{
        if [ $1 -lt 0 ] ; then
                res=`expr $1 \* -1`
                echo $res
        else
                echo $1
        fi
}


# snmpwalkで対象ホストの時刻を取得
RESULT=`/usr/bin/snmpwalk -v 1 -t 0.1 -c $1 $2 HOST-RESOURCES-MIB::hrSystemDate -O v 2>&1`
if [ $? != 0 ] ; then
        echo $RESULT
        exit 1
fi


# 取得したsnmpの結果文字列から日付と時間を取得
TEMP=`echo $RESULT | cut -d ' ' -f2-`
DATE=`echo $TEMP | cut -d ',' -f1`
TEMP2=`echo $TEMP | cut -d ',' -f2`
TIME=`echo $TEMP2 | cut -d '.' -f1`
UNIXTIME_SERVER=`date -d "${DATE} ${TIME}" +%s`


# 現在の時刻と取得したサーバ時刻との差異（秒）を取得
UNIXTIME_HOST=`date +%s`
UNIXTIME_DIFF=`expr ${UNIXTIME_HOST} - ${UNIXTIME_SERVER}`


# 時刻の差異を閾値で比較して結果を返す
UNIXTIME_DIFF_ABS=`abs $UNIXTIME_DIFF`
echo "Difftime (${UNIXTIME_DIFF_ABS} sec) | difftime=${UNIXTIME_DIFF_ABS}"
if [ $UNIXTIME_DIFF_ABS -ge $4  ] ; then
        # Critical
        exit 2
elif [ $UNIXTIME_DIFF_ABS -ge $3 ] ; then
        # Warning
        exit 1
else
        # OK
        exit 0
fi
```

こんな感じです。
ホストを汚したくないので開発環境としてDocker使ってるけど何とかテストしたい話

ホストを汚したくないので、どの言語で開発するにしても、最近は`Docker`とか`VirtualBox`とか、まあ仮想マシンの上でやってます。
今は`PHP with Laravel on Docker`でやってます。もちろんホストには`nginx`はおろか`PHP`さえ入ってません。

# 本題
## の前の、ちょっとした背景
プロジェクト構成はだいたいこんな感じ。

```
Application
+base
|+Dockerfile
+dev
|+Dockerfile
+src
 +ソースとか
```

baseコンテナになんやらかんやら、アプリケーションが動作するために必要なものを全て突っ込んで、それを元にdevコンテナを作るイメージ。
基本的にコンテナの中には入らず、ソースは`Docker`に共有張って、ローカルで修正してる感じ。
理由は、ぶっちゃけ開発用コンテナの中にdotfilesを入れたくなかったから。
開発用と言いつつ、実際は`PHP`と`nginx`を動かすためだけの実行環境コンテナですね。

## テストしたい
ホストに`PHP`がないので`Composer`は動作しない。もちろん`PHPUnit`も動かない。でもテストはしたい。
Jenkinsさんにご登場いただくとしても、やっぱりpushする前にテストぐらいはしたいですよね。

なので考えました。そうだ、リモートで実行すればいいんだ！

開発用コンテナに`SSH`突っ込んで、ローカルからコンテナに向けてリモートで`PHPUnit`を実行すれば、SSHクライアントさえあればホストに依存せずテストできる！

## なので
こんな感じのshell用意しました。

```bash:command.sh
#!/bin/bash

CONTAINER_NAME=webapp-dev

ip_address=$(docker inspect -f='{{ (index (index .NetworkSettings.Ports "22/tcp") 0).HostIp }}' ${CONTAINER_NAME})
port=$(docker inspect -f='{{ (index (index .NetworkSettings.Ports "22/tcp") 0).HostPort }}' ${CONTAINER_NAME})
user=webapp

ssh ${user}@${ip_address} -p ${port} "cd /app_root; $@"
```

やってることは単純で、アプリケーションルートに移動してコマンドを実行するだけ。
`./command.sh composer update`とか、そんな感じで使います。`PHP`に限らずなんでもできます。


# さいごに
とりあえずこれで解決はできて、まあ何とかやってるわけですけど、なんかほかにいい案ないですか？（他力本願（誤用
PHPで配列の中身を超見やすくデバッグ表示してくれるdBugの使い方メモ

PHPで連想配列や多次元配列などなど、複雑な配列をサクッと超綺麗にデバッグ表示してくれるのが**dBug**というデバッグツールです。　*include*してから一行書くだけで超簡単に使えますので開発時必須です。（個人的に）

#標準関数としてvar_dump関数というのがいちよある
PHPで配列のデバッグをしてくる関数として**var_dump**というのがありますが、まぁあまり見た目もわかりやすいってものじゃないです。

例えばこんな感じでvar_dumpを使ってみると。

```php:debug.php
<?php

$aryDemo = array();

$aryDemo[] = array( "Name"=>"Tarou", "Age"=>"22", "Address"=>"Fukuoka" );
$aryDemo[] = array( "Name"=>"Jirou", "Age"=>"45", "Address"=>"Kumamoto" );

var_dump($aryDemo);

?>
```

こんな感じで表示されます。分からなくもないけど見難い。

![2014-08-06_14h55_22.png](https://qiita-image-store.s3.amazonaws.com/0/49156/3387fb3c-c7f1-e570-ef70-48fb90e67b7f.png)

#dBugを使ってみると
まずは**dBug**をダウンロードしてサーバ上に設置しておく必要があります。
1ファイルなのでわかりやすいです。
http://dbug.ospinto.com/

`include_once("dBug.php");`　して読み込みます。

あとはデバッグしたい関数を `new dBug([配列変数名]);`　とすればデバッグ表示されます。

```php:debug.php
<?php
//dBugクラスをインクルードする
include_once("dBug.php");

$aryDemo = array();

$aryDemo[] = array( "Name"=>"Tarou", "Age"=>"22", "Address"=>"Fukuoka" );
$aryDemo[] = array( "Name"=>"Jirou", "Age"=>"45", "Address"=>"Kumamoto" );

//配列をデバッグ表示
new dBug($aryDemo);
?>
```

こんな感じでブラウザ上に表示されます。
見た目が綺麗で分かりやすいです。
![2014-08-06_15h04_52.png](https://qiita-image-store.s3.amazonaws.com/0/49156/f6895e80-c587-2071-92dd-32f66d80b6e4.png)

大量に配列がある場合は特定の行を折りたたんで表示することもできるので便利。
![2014-08-06_15h06_15.png](https://qiita-image-store.s3.amazonaws.com/0/49156/c14ab35e-2842-bff7-6ef2-6b23e9c93844.png)

これでデバッグも捗ります。
bashの引数や変数をお手軽に操作しようメモ

ちょいちょい忘れるのでメモ

## 文字列の置換

```bash
name=nntsugu
echo ${name} #nntsugu
echo ${name/nn/} #tsugu
```

## どういう時に使ってる？

### ファイルにhostと使用するgit repository一覧を書いておいて、for文でまわしつつscriptに食わせるとか

**もっといいやりかたあったら教えてくださいmm**

```file:host_list
host01:repoA
host02:repoB
host03:repoC
```

```bash
for target in `cat host_list`;
do
  redeploy.sh ${target/:/ };
  ## redeploy.sh host01 repoA
done
```
redeploy.sh: ホストに対応したリポジトリのコードを再デプロイするscriptやと思ってくださいmm
estimote iBeacon分解

estimoteの[iBeacon](http://estimote.com/)がBLEでスキャンしても見つけられなくなった・・・
もしや電池切れ？ということで、分解して電池交換してみました。
電池2年持つって話だし、まさかとは思うが念のため。

注）estimoteのiBeaconは技適通ってないので国内で利用出来ません


まずは裏のシリコンをはがします。
べったりくっついているのでカッターで切りながらはがします。。
電池交換しているようには見えませんね。
![ibeacon1.JPG](https://qiita-image-store.s3.amazonaws.com/0/23385/eb8ba19a-4942-7f89-26ee-1ae76440b62c.jpeg)


シリコンをはがすと今度はプラスチックの板で覆われています。
![ibeacon2.JPG](https://qiita-image-store.s3.amazonaws.com/0/23385/9f5adb96-b1ee-3c74-5522-c8cef75260c9.jpeg)

このプラスチックもべったりケースにくっついているので、やっぱりカッターで切りながらはがします。。
しつこいようですが、電池交換作業中です＞＜
![ibeacon3.JPG](https://qiita-image-store.s3.amazonaws.com/0/23385/68b82cab-7b4a-b183-24b2-0eddd7c9d93d.jpeg)

基板が出てきました！
![ibeacon5.JPG](https://qiita-image-store.s3.amazonaws.com/0/23385/e529f4aa-cd52-649f-f285-e2fd9d4fd0cd.jpeg)

分解完了。き、きたない。
電池交換作業中といったら、はたして何人が信じてくれるでしょうか。。
はたからみると、破壊的衝動に駆られたただの変態にしか見えないのではないかと心配です。
![ibeacon6.JPG](https://qiita-image-store.s3.amazonaws.com/0/23385/932c4277-42e9-7134-27a4-cca7a70c2546.jpeg)

電池はCR2450。でかい。コンビニには置いてませんでした。
![ibeacon7.JPG](https://qiita-image-store.s3.amazonaws.com/0/23385/81b40042-35a9-aa24-b273-3bd4feaf3a6a.jpeg)

で、結論としては電池交換したらまた認識しましたｗ
バッテリー2年もつって言ってたのに。。1年持ってないよ＞＜
しかも、電池交換させる気ゼロってくらいがっちりべったりカバーされてるし。
これ、戻すときはまた接着剤でつけ直すのかな。。

iBeacon、色々あるけど電池交換の手間も考慮して選ばないと大変ですね、という教訓になりました。


追記(2014/08/25)
[Reality matters — Estimote rolls out the world’s first power management tool for iBeacon](http://blog.estimote.com/post/91749152580/estimote-rolls-out-the-worlds-first-power-management)
の記事によると、電力モードを設定できるようになって電池が長く持つようになったみたいです。
CentOS上の lxc でCentOS のコンテナを走らせる

## CentOS に lxc-1.0.5 を入れる

[LXC - Linux Containers](https://linuxcontainers.org/jp/)

### specファイルからRPM作ってインストール

```bash
$ curl -O https://linuxcontainers.org/downloads/lxc-1.0.5.tar.gz
$ tar zxvf lxc-1.0.5.tar.gz
$ mkdir -p ~/src/rpm/SPECS ~/src/rpm/SOURCES
$ cp lxc-1.0.5/lxc.spec ~/src/rpm/SPECS
$ cp lxc-1.0.5.tar.gz ~/src/rpm/SOURCES
$ rpmbuild -bb ~/src/rpm/SPECS/lxc.spec
$ cd  ~/src/rpm/RPMS/x86_64
$ sudo rpm -ivh lxc-1.0.5-1.el6.x86_64.rpm lxc-libs-1.0.5-1.el6.x86_64.rpm
```

その他 libvirt , docbook2X, cgconfig が必要

### template から Linux コンテナを作成する

テンプレートは以下にある

```bash
$ ls /usr/share/lxc/templates
lxc-alpine     lxc-centos    lxc-fedora        lxc-oracle  lxc-ubuntu-cloud
lxc-altlinux   lxc-cirros    lxc-gentoo        lxc-plamo
lxc-archlinux  lxc-debian    lxc-openmandriva  lxc-sshd
lxc-busybox    lxc-download  lxc-opensuse      lxc-ubuntu
```

busybox は最も単純なLinuxコンテナ、sshd は SSHデーモンのあるLinuxコンテナ。

```bash
$ sudo lxc-create -t centos -n centos-test1
$ sudo lxc-start -n centos-test1 -d
lxc-start: Executing '/sbin/init' with no configuration file may crash the host
```

エラーがでるので `-f /var/lib/lxc/centos-test1/config` を指定する

```bash
$ sudo lxc-start -f /var/lib/lxc/centos-test1/config -n centos-test1 -d
lxc_conf - failed to attach 'vethPX7X32' to the bridge 'virbr0' : No such device
```

またエラー。仮想ブリッジがない。設定かえてリブート。

```bash
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
$ sudo shutdown -r now
````

再度実行するとプロンプトがでてくる。
2回目以降は -f オプションは不要みたい。
パスワードは、/var/lib/lxc/centos-test1/tmp_root_pass に定義されているが、
初回に変更する必要あり。

```bash
$ sudo lxc-start -f /var/lib/lxc/centos-test1/config -n centos-test1 -d
$ sudo lxc-console -n centos-test1
CentOS release 6.5 (Final)
Kernel 2.6.32-431.20.3.el6.x86_64 on an x86_64

centos-test1 login: root
Password:
Last login: Wed Aug  6 01:40:45 on lxc/console
[root@centos-test1 ~]#
```

停止するには仮想コンテナで shutdown を実行するか、lxc-stop を使って停止する。
Mac に Ocaml をインストール（ brew で普通に入った）

`brew install`で何事もなく入ったけど、XQuartz のインストールだけ先に必要だった。
http://xquartz.macosforge.org/

XQuartz はパッケージインストーラなので普通に実行すればインストールできる。

あとは普通に`brew install`する。

```shell-session
$ brew install ocaml
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/objective-caml-4.01.0_1.mavericks.bottle.3.tar.gz
######################################################################## 100.0%
==> Pouring objective-caml-4.01.0_1.mavericks.bottle.3.tar.gz
?  /usr/local/Cellar/objective-caml/4.01.0_1: 1200 files, 215M
$ ocaml
        OCaml version 4.01.0

# List.map (fun x -> x * 2) [1; 2; 3; 4] ;;
- : int list = [2; 4; 6; 8]
```

とりあえず動いてるみたいです。

これから OCaml 勉強します。
超絶お手軽 連続シリアルファイル転送

TeraTerm の sendfile ダイアログがいちいちキーボードフォーカス奪うので。

```bat
@echo off

set port=COM1
set file=c:\tmp\send.txt
set log=log.txt

mode %port%: BAUD=115200 PARITY=N DATA=8
mode %port%: /STATUS >> %log%

:loop

echo %date% %time% 
echo %date% %time% >> %log%
copy "%file%" \\?\%port% 

goto loop
```
SwiftでInt型に素数かどうかまともに判定するメソッドを追加

[SwiftでInt型に素数かどうか判定するメソッドを追加]の実装がさすがにnaiveすぎるので。

[SwiftでInt型に素数かどうか判定するメソッドを追加]: http://qiita.com/Alex_23drum/items/b48a8172e16f2f3d7e5c

* https://github.com/dankogai/swift-prime

## SYNOPSIS

````swift
println(2.isPrime)                                // true
println(42.isPrime)                               // false
println(0x7FFFffff.isPrime)                       // true (M31)
println(0.nextPrime)                              // 2
println(Int.max.prevPrime)                        // 9223372036854775783 on OS X
println(Int.Prime.within(0..<100))                // [2, 3, 5, 7, ... 97]
println(Int.Prime.within(Int.max-100..<Int.max))  // [9223372036854775783]
````

## DESCRIPTION

* `0...UInt.max`の範囲でまともな速度で判定します。
* 判定は軽く試し割りした後[Miller-Rabin法]で。後者は確率的アルゴリズムですが、判定対象の整数が充分小さければ決定的にもなるので、疑素数なしの判定をしています。
* ~~その過程で(OS Xの`Int`は64bitゆえオーバーフローを防ぐのに)128bit演算が必要となるのですが、その部分のみCで実装しています。clangは`__uint128_t`をサポートしているのですがSwiftはまだなので。ちょっと敗北感。Swiftで完結させる方法を緩募。~~
* [GMP]へのバインディングはすでに[出来ることを確認]しているのですが、GMP自体Yosemiteでバグがあるので、Bigintへの対応はTodoということで。
* Pure-swiftになりました。ただし128bit演算を使っていない分オーバーフローを防ぎながら少しずつ計算するので少し遅くなります。
* Swift 2に対応しました。
  * Linuxも対応しています。
  * Playgroundでも動きます。


[Miller-Rabin法]: https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A9%E3%83%BC-%E3%83%A9%E3%83%93%E3%83%B3%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A%E6%B3%95
[GMP]: https://gmplib.org/
[出来ることを確認]: https://github.com/dankogai/swift-gmpint

Enjoy!

Dan.the.Prime.Programmer
Vagrant VMにMongoDBをインストール(メモ)


参考：[antonyh/vagrant-mongodb](https://github.com/antonyh/vagrant-mongodb)

Vagrant上にMongoDBをインストールする手順について記述します。

#必要な環境
以下の環境が必要なので、あらかじめ用意しておきます。

- Vagrant
- VirtualBox
- VMのための空き容量とメモリ

#注意事項
デフォルトの設定だと以下の問題があります。
こちらを解決するには後述の「MongoDB設定」を参照してください。

- 管理画面が有効になっていません
- ホストOSからのアクセスができません


#セットアップ
公開されているboxを利用して起動します。
OSはFedora、Puppetを利用してMongoDBをインストールしています。

1. [antonyh/vagrant-mongodb](https://github.com/antonyh/vagrant-mongodb)をダウンロード(またはクローン)
1. Vagrant起動
`$ vagrant up`
1. Vagrant VMへ接続
`$ vagrant ssh`
1. MongoDBシェルの起動

```
 [vagrant@localhost ~]$ mongo
MongoDB shell version: 2.4.6
connecting to: test
>
```

入力待ちとなればセットアップは成功です。
シェルを終了させるには`quit()`を実行します

##デフォルトの環境
- OS

```
[vagrant@localhost ~]$ cat /etc/redhat-release
Fedora release 20 (Heisenbug)
```

- MongoDB

```
[vagrant@localhost ~]$ mongo --version
MongoDB shell version: 2.4.6
```

- Puppet

```
[vagrant@localhost ~]$ puppet --version
3.4.3
```

#MongoDB設定
そのまま起動すると以下の問題があるので、修正します。
##ホストから接続出来るようにする
mongodb.confを下記の通り編集して、```sudo service mongod restart```

```::/etc/mongodb.conf
#bind_ip = 127.0.0.1
bind_ip = All
```

##管理画面を有効にする
mongodb.confを下記の通り編集して、```sudo service mongod restart```

```::/etc/mongodb.conf
# Disable the HTTP interface (Defaults to port+1000).
#nohttpinterface = true
nohttpinterface = false
```

##上記の設定を自動化する
はじめから上記設定になるようPuppetの設定を変更すると便利です。
Puppetで/etc/mongodb.confを生成する設定を追加。

```Puppet/modules/mongo/manifests/init.pp
	file { "/etc/mongodb.conf" :
		content => "
bind_ip = All
port = 27017
fork = true
pidfilepath = /var/run/mongodb/mongodb.pid
logpath = /var/log/mongodb/mongodb.log
dbpath =/var/lib/mongodb
journal = true
nohttpinterface = false
"
	}
```


#確認
ホストOSにMongoDB Clientが入っている場合は接続してみましょう。
ポートはデフォルトのMongoDBのポートがフォワードされているので、そのままホストOSで接続すればOKです。

```
$ mongo
MongoDB shell version: 2.6.3
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
>
```

管理画面が有効な場合は、ブラウザで管理画面にアクセスしてみましょう。
http://localhost:28017/

##ホストOSから接続出来ない場合
ホストOSから接続出来ない場合は以下を確認してみましょう。

- Vagrantfile
 - forwarded_portの設定が正しいか？
- ホストOSでポートが空いているか？
 - 27017,27018,27019,28017
 - 空いていない場合はVagrantofileを編集してホストのポートを変更する
- mongodb.conf
 - bind_ipでホストOSの接続が許可されているか？

管理画面にアクセス出来ない場合は、上記に加えて以下もチェックします。

- mongodb.conf
 - ```nohttpinterface = false``` に設定されているか？
Polymer を簡単に試す方法(Yeomanを利用)


Polymer は、Web Components 未対応のブラウザでも Web Components を動かせるようにする JavaScript ライブラリのようです。

たまたま [Yeomanの公式のジェネレータ](https://github.com/yeoman/generator-polymer) を見つけたので、試してみました。

まず、ジェネレータをインストールし、

```shell
$ npm install -g generator-polymer
```

ジェネレータを起動します。

```shell
$ yo polymer
```

なんか聞かれますが、

![スクリーンショット 2014-08-06 13.27.38.png](https://qiita-image-store.s3.amazonaws.com/0/35733/716aac61-49c7-7c80-954b-8f90d2e038d1.png "スクリーンショット 2014-08-06 13.27.38.png")

よくわからいので適当に Yes を選択します。
完了したら、Grunt で起動してみます。

```shell
$ grunt serve
```

次のように表示されました。

![スクリーンショット 2014-08-06 13.20.34.png](https://qiita-image-store.s3.amazonaws.com/0/35733/a152cf5f-7184-9a01-7037-f4eba3a6a9eb.png "スクリーンショット 2014-08-06 13.20.34.png")

テキストエリアを編集すると、リアルタイムにタイトル部分の文字列が変更されます（データバインディングか何かの機能？）。

# 中身をみてみる

`index.html` を見てみます。

```html:app/index.html
<!doctype html>
<html class="no-js">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Polymer WebApp</title>
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->

  <!-- build:css styles/main.css -->
  <link rel="stylesheet" href="styles/main.css">
  <!-- endbuild-->

  <script src="bower_components/platform/platform.js"></script>
  <!-- build:vulcanized elements/elements.vulcanized.html -->
  <link rel="import" href="elements/elements.html">
  <!-- endbuild-->
</head>

<body unresolved>

  <div class="hero-unit">
    <yo-greeting></yo-greeting>
    <p>You now have</p>
    <yo-list></yo-list>
  </div>

  <!-- build:js scripts/app.js -->
  <script src="scripts/app.js"></script>
  <!-- endbuild-->
</body>

</html>
```

上記の `rel="import"` のタグのところで、外部HTMLファイルを読み込んでるっぽい。
これが Web Components の `HTML Imports` という機能かな。

また、`<yo-greeting></yo-greeting>` `<yo-list></yo-list>` は、`Custom Elements` の機能である様子。
このエレメントの定義が書かれてそうな `yo-greeting.html` を開いてみます。

```html:app/elements/yo-greeting.html
<link rel="import" href="../bower_components/polymer/polymer.html">

<polymer-element name="yo-greeting"  attributes="">
  <template>
    <style>
      /* styles for the custom element itself - lowest specificity */
      :host { display: block; }
      /*
      style if an ancestor has the different class
      :host-context(.different) { }
      */
    </style>
    <h1>{{ greeting }}, {{ greeting }}!</h1>
    <span>Update text to change the greeting.</span>
    <input type="text" value="{{ greeting }}">
  </template>
  <script>
    Polymer({
      greeting : '\'Allo'
    });
  </script>
</polymer-element>
```

本来の Web Components では `<element>`タグですが、この例のように `polymer-element` タグで同じ機能が実現できるようです。

# ほか

`bower_components` 配下に、色々なものが大量にインストールされてました（そういえば yo した時に結構時間かかったな..）。

![スクリーンショット 2014-08-06 13.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/35733/838b8641-7b3d-6857-66e9-6e7bcf3c1302.png "スクリーンショット 2014-08-06 13.19.09.png")

UI 部品もいろいろ揃っているようです。サンプルも同梱されているので、機会があったらまた触ってみようと思います。
ワードプレスのwhile(have_posts())について色々。forー＞初心者


備忘録　兼　知らない人用。
ちょっとドツボにはまったので。

#その１：各種記事ページでループしたい。

## どゆこと？

各記事ページで

```php
if (have_posts()) :    
	while (have_posts()) : the_post();
		//ループさせたい処理
	endwhile;
else:
	//記事がない場合の処理
endif;
```

なんてループ処理を使おうとすると残念ながら一度しか回りません。

各種記事ページでループした際に取得できるのは記事ページで見ている記事のものだけのようですね。

## それでも俺は、ループしたい。

そんな人のためにWP_Query()とquery_posts()いう物とがあります。
後者は現在推奨されていない記述のようですが、一応書いておきます。

これらを使うことでカテゴリー別とか、タグ別とかに記事を取得するのにループの前に記述したりするものです。勿論全ての記事を取ってくることも出来るんですね。助かる！

※解決方法１

```php
$args = array(
	'posts_per_page' => -1//すべての記事を取得することにする
);
$the_query = new WP_Query( $args ); 
	if ( $the_query->have_posts() ) :
  		while ( $the_query->have_posts() ) : $the_query->the_post();
	//ループさせたい処理
	endwhile;
else:
	//記事がない場合の処理
endif;
```


※推奨されない解決方法２

```php
query_posts('posts_per_page=-1');//全部の記事を取得することにする。
if (have_posts()) :    
	while (have_posts()) : the_post();
		//ループさせたい処理
	endwhile;
else:
	//記事がない場合の処理
endif;
wp_reset_query();//全ての記事を取得していたことをリセット
```

#その２：ループ中にブレイクして二度目のループもブレイク

## おまえは何を言っているんだ。

人によってはオリジナルでウィジェットのような動きをするテーマをコーディングする人も、きっといますよね。

そんな時に、記事を１０だけ表示して終わりにしたい考えていた無知な私は

```php
if (have_posts()) : 
	$i = 1;
	while (have_posts()) : the_post();
		//ループさせたい処理
		if($i==10)break;
		$i++;
	endwhile;
else:
	//記事がない場合の処理
endif;
```

という感じに記述した後に、同じ処理でループ処理の内容を変えてもう一度ループ仕様としたのですが、条件に合致しているはずの一度目のループで抽出した記事が二度目のループで取り出せない！！

そんな罠にハマりました。（仕掛けたのは自分ですが）

## 解決方法

きちんとループを最後まで回しましょう。そうするとhave_posts()さんはしっかり最初からループを回してくれるようになります。

```php
if (have_posts()) : 
	$i = 1;
	while (have_posts()) : the_post();
		if($i <=10 && 条件２){
			//ループさせたい処理
			$i++;
		}
	endwhile;
else:
	//記事がない場合の処理
endif;
```

個人的には該当する記事を10見つけたら終わりにするっていう記述をしたかったのでこんな感じになりました。

参考になれば幸いですm(_ _)m
SwipeRefreshLayout覚え書き

# SwipeRefreshLayout
Support Library revision 19.1.0から[SwipeRefreshLayout](https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html)という新しいViewGroupが追加された。
これはいままで引っ張って更新とかPullToRefreshとか呼ばれていた機能を実装できるものになる。
以後長々と書くが、[公式サンプル](https://developer.android.com/samples/SwipeRefreshLayoutBasic/index.html)のほうがわかりやすくてタメになるのでそっちを見たほうがいい。



# 実装
まず、Support Library revision 19.1.0が使える状態にしておく。

次に、利用したい画面のレイアウトファイルに`SwipeRefreshLayout`を配置する。
この時、`SwipeRefreshLayout`の直接の子はひとつだけになるようにする。

````refreshlayout.xml
<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>
````

ソースコード側では`SwipeRefreshLayout.OnRefreshListener`の実装を行う。
このインターフェイスにはジェスチャ操作が発生したときに呼び出される`onRefresh()`というメソッドしかない。
大半のアプリはここから通信などの非同期処理を呼び出すことになるはずだ。
また、ローディング中インジケータの色設定も画面側で行う。
`SwipeRefreshLayout#setColorScheme()`に4色も渡さないといけないので大変だ。
ちなみに渡さないとインジケータが真っ黒になる。

````RefreshFragment.java
public class RefreshFragment extends Fragment implements 
        SwipeRefreshLayout.OnRefreshListener {

    private SwipeRefreshLayout mSwipeRefreshLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.refreshlayout, null);
        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipelayout);
        
        // 色設定
        mSwipeRefreshLayout.setColorSchemeResources(R.color.red,
                R.color.green, R.color.blue,
                R.color.orange);
        // Listenerをセット
        mSwipeRefreshLayout.setOnRefreshListener(this);
        return view;
    }

    @Override
    public void onRefresh() {
        // 更新処理を実装する
        // ここでは単純に2秒後にインジケータ非表示
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                // 更新が終了したらインジケータ非表示
                mSwipeRefreshLayout.setRefreshing(false);
            }
        }, 2000);
    }
}
````

追記:`SwipeRefreshLayout.setOnRefreshListener`をしていないとプルダウン時に`NullPointerException`が発生するので注意！

# ListFragmentでは
ListFragmentの場合、レイアウトファイルを直接触りたくない。
そこで、onCreateViewの中でListViewの親レイアウトとしてコード内で挿入を行う。
しかもAndroidのバージョンによって`canChildScrollUp`の処理を変えなくてはいけないため、`SwipeRefreshLayout`も継承が必要…。
結構無理矢理感があるが、[公式のサンプル](https://developer.android.com/samples/SwipeRefreshListFragment/src/com.example.android.swiperefreshlistfragment/SwipeRefreshListFragment.html)でもそうなっているので、多分これでいいんだろう。

# おまけ
`SwipeRefreshLayout.setEnabled(false)`でジェスチャと表示中のプログレスインジケータが無効化される。
ただし、無効化されたあとに`SwipeRefreshLayout.setRefreshing()`によってプログレスインジケータの表示/非表示を切り替えることができる。
これにより、プログレスインジケータを表示するだけのレイアウトとして利用することもできるようだ。
便利な場面もあるかもしれない。
gulp.watchの注意点メモ

Gruntに代わるタスクランナー [gulp](http://gulpjs.com/) を試してみた所、[gulp.watch](https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulpwatchglob--opts-tasks-or-gulpwatchglob--opts-cb) の挙動ではまった点があったのでメモしておきます。

ちなみに動作環境は以下のとおりです。

* Windows 7 (64bit)
* node.js: ver 0.10.24
* gulp.js: ver 3.8.7

<br />

## 監視対象がひとつでも存在している必要がある
`gulp.watch` で監視するパターン(glob)にマッチするファイルが1つでも存在しないと、監視そのものが上手く動作しない様です。

<br />

```js:gulpfile.js
var gulp = require('gulp');
gulp.task('watch', function (callback) {
  var path = "../scss/main.scss"
  gulp.watch(path, function (e) {
    // added, changed or deleted のどれかが発生するはず
    console.log(e.type)
  }
}
```
こんなスクリプトを書いても `$ gulp watch` してタスクを開始した時点で `../scss/main.scss` が存在しないと、監視イベントが発生しないようです。
上記の場合、`../scss/` フォルダに `main.scss`を後から追加すると `e.type=added` なイベントが発生しても良さそうなのですがダメでした。

<br />

```js:gulpfile.js
var gulp = require('gulp');
gulp.task('watch', function (callback) {
  var path = "../scss/*.scss"
  gulp.watch(path, function (e) {
    // added, changed or deleted のどれかが発生するはず
    console.log(e.type)
    // 何らかの変更があった対象ファイルの絶対パス
    console.log(e.path)
  }
}
```

こんな感じでワイルドーカードを使った場合でも `../scss/*.scss` に該当するファイルが1個も無ければ、同じく監視イベントが発生しません。

ですが、1個でも該当するファイルがあれば監視は正常に動作します。
たとえば、`../scss/main.scss` が始めから存在していれば、 後から `../scss/sub.scss` を入れてもちゃんと `e.type=added` で反応しました。

<br />

基本的にgulpで完結するルーチンなら問題なさそうな気もしますが、他のツールが特定のフォルダにファイルを置くので、それを監視したい場合には要注意かと思います。

<br />

## 監視イベントオブジェクトのパスは Windows 形式
Windows限定の話だと思いますが、[gulp.watch(glob[, opts, cb])](https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulpwatchglob-opts-cb) のシグネチャで呼び出した場合にコールバック関数の引数に含まれるパスは『\\(円マーク)』区切りになります。

<br />

```js:gulpfile.js
var gulp = require('gulp');
gulp.task('watch', function (callback) {
  var path = "../scss/*.scss"
  gulp.watch(path, function (e) {
    // 何らかの変更があった対象ファイルの絶対パス
    // 例: C:\Users\xxxxx\project\sample\scss\main.scss
    console.log(e.path)
  }
}
```
こんな感じで、変更があったファイルの絶対パスが『\\(円マーク)』区切りで格納されていますが、プラグインによってはUNIX形式の『/(スラッシュ)』区切りでないと動作しないケースがありました。

<br />

```js:gulpfile.js
var gulp = require('gulp');
var tsc = require('gulp-tsc');
gulp.task('watch', function (callback) {
  var path = "../ts/Main.ts"
  gulp.watch(path, function (e) {
    //gulp.src(e.path)
    gulp.src(e.path.replace(/\\/g, "/"))
      .pipe(tsc({out: 'main.js'}))
      .pipe(gulp.dest("../js/"))
  }
}
```

例として、TypeScriptをコンパイルしてくれるプラグイン [gulp-tsc](https://github.com/kotas/gulp-tsc) では『\\(円マーク)』区切りでは上手く動作しませんでした。
この場合は、replaceで『/(スラッシュ)』区切りに変換する事で問題なく動作させる事ができるかと思います。
Laravelでログイン済みの全てのページに共通のビュー変数を渡す方法

（ログイン処理に限らないですが）

ログイン後にページのメニューバーの端にログインしているユーザのユーザ名等を表示させたりすることが多いと思います（Qiitaしかり）。
そのように、ある条件をもとに共通のビュー変数を複数のページに渡す方法のメモです（もっとスマートなやり方があったら教えて下さい）。

### 前提条件

* ログイン後はユーザのIDをセッションに保存している
* DBのuserテーブルにidフィールドがある。

### 実装方法
どのビューであっても、同様のビュー変数を渡す方法として`View::share()`を使います。これをログイン判定のルートフィルタ内に、ログイン後に呼び出されるように記述します。


```php:filters　.php
 Route::filter('auth', function()
 {
         if(!Session::has('id')){
                 return Redirect::to('/');
         }
         $user = User::where('id','=', Session::get('id')) -> first();
         View::share("user", $user);
});
```

あとは、ログイン判定を求めるページをルートグループでまとめれば、ログインユーザの情報を表示したい複数のページにまとめて変数を渡すことが出来ます。このフィルタを通った（ログイン出来た）場合のみ、ユーザ情報をDBから取得し、ページにログインユーザの情報を表示出来ます。

```php:routes.php
  Route::group(array('before' => 'auth'), function(){
                 Route::get('user/', 'IndexController@user');
                 Route::get('my/', 'IndexController@my');
  });
```

参考：
PHP - Laravelで共通のビュー変数を複数のルートで共有する - Qiita http://qiita.com/takaaki-mizuno/items/f937ceae33b288b77316
複数のファイルのフォーマットを一括で整形する


以下のページで紹介されているように、
`Option`+`Cmd`+`L`
で、リフォーマットアクションを呼び出せる。
http://samuraism.com/products/jetbrains/intellij-idea/quickstart/codestyle-and-formatting


しかし、EmacsのKeymapにしていた場合、
このショートカットキーは無効にされていた。

アクション名は「Reformat Code」なので、
以下のように、Preferencesで検索して設定する。

![スクリーンショット 2014-08-06 12.28.13.png](https://qiita-image-store.s3.amazonaws.com/0/2278/f0c452c1-0f68-9b95-db19-40a3904dcac8.png "スクリーンショット 2014-08-06 12.28.13.png")
bower(js パッケージ管理)とrailsの相性は抜群！！

### 概要
railsの開発していて、jsのライブラリを入れる際にgemを通していれることがよくある。
jsのgemが実際にはメンテナンスされてなくて、gemを使う意味がなかったり、railsなどにdependencyがあってほかのgemが更新できないなどの問題がある。
一方でvendorに入れると、ライブラリが更新されたことが分からない。

こんなときに、bowerというjsのパッケージ管理を使うと便利みたい。

### bowerで利用できるライブラリ
* http://bower.io/
* http://bower.io/search/
* 15696件のライブラリが利用できる
* bootstrapやjqueryやd3やangulerなどの有名なものももちろん使える

### railsでの利用
* Ruby DSL configurationを利用するのが良さそう
* bower-railはしっかりメンテされてそう
* https://github.com/42dev/bower-rails/

### bowerのセットアップ
* nodeのインストール http://nodejs.org/
* bowerのインストール ``sudo npm install bower -g``
* rails-bowerのgemのインストール ``bower-rails``を追加して ``bundle install``
* bowerのライブラリのインストール ``rake bower:install``

### ライブラリの追加方法
1 Bowerfileに追加

```
asset 'bootstrap'
```
2 ``rake bower:install``を実行
3 assetsにパスを追加

```app/assets/javascripts/application.js.coffee
#= require bootstrap
```
```app/assets/stylesheets/application.css.scss
*= require bootstrap
```
4 bootstrapにはlessが必要なのでGemfileにless-railsを入れる

```
gem 'therubyracer' # for less-rails
gem 'less-rails'
```

### bowerに統一する必要がある
* jquery-railsなどのgemで管理しているjsやcssのライブラリはbowerで統一する必要がある
* だからjquery-railsは必要なくなる
* coffee-railsやless-railsやsass-railsはそのまま。gemで管理。
* 確かjquery-fileupload-railsなど、特定のgemは独自でjqueryのversionをfixしたりしているので、js系のライブラリはbowerに統一するのはすごく良さそう

### herokuにdeploy
* herokuのbower-rails用のビルドパックがあり、それを利用するようになる
* buildpackはしっかりメンテされてそう
* https://github.com/qnyp/heroku-buildpack-ruby-bower
* ！！！ herokuへのdeployはうまくいかなかった。調査中。。。

### 参考
* 日本語でbowerを解説 http://tohae.hatenablog.com/entry/2013/05/10/121548
* bowerの前はvendorにjsを入れることが推奨 http://stackoverflow.com/questions/21372331/rails-include-third-party-javascript-library-file
[JavaScript] zeroclipboard を使って js だけでクリップボードにコピーする方法


[runstant](http://qiita.com/phi/items/e7fe30156c43a7690c1a) でボタンによる short url のコピー機能を実現するにあたり,
色々調べたら [zeroclipboard](https://github.com/zeroclipboard/zeroclipboard) とかいうライブラリに行き着きました.

わりと使いやすいのに日本語で書かれた最新版の使い方がなかったので
備忘録がてらまとめてみました.

![zeroclipboard.png](https://qiita-image-store.s3.amazonaws.com/0/7756/1f585a6b-2a84-742c-91b1-642a79ca92ea.png)


## zeroclipboard とは?

ブラウザ上で js を使ってコピーを実現するためのライブラリです.
内部的には flash を使っているみたいです.

[github](https://github.com/zeroclipboard/zeroclipboard)


## サンプル

最小サンプルです.

[サンプル](http://goo.gl/lKp6PR)

クリックするとクリップボードにテキストがコピーされているのが
分かるかと思います.


## コード

### html

html は下記のような感じです.

zeroclipboard は cdnjs 経由でサクッと読み込んでいます.
ボタンを押した際にコピーしたいテキストをボタンの
`data-clipboard-text` 属性に入れておきます.

```html
<!DOCTYPE html>
 
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, user-scalable=no" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
 
        <title>${title}</title>
        <meta name="description" content="${description}" />

        <style>${style}</style>
        
        <script src="http://cdnjs.cloudflare.com/ajax/libs/zeroclipboard/2.1.5/ZeroClipboard.min.js"></script>
		<script>${script}</script>
    </head>
    <body>
        <a id="btn" data-clipboard-text="ボタンだよー♪" href='#'>Copy</a>
    </body>
</html>
```


### javascript

js はこれだけです.

ZeroClipboard にボタン要素を渡して生成するだけで
コピー機能が有効になります.

```js
window.onload = function() {
    // 
    var clip = new ZeroClipboard(document.getElementById("btn"));
    clip.on("ready", function() {
        // 準備完了
    });
};
```

ボタンを右クリックすると flash のコンテキストメニューが出てくれば
うまくいっています!


## イベント

ZeroClipboard にはいくつかイベントがあります.

- ready ... 準備完了時に発火
- beforecopy ... コピー前に発火
- copy ... クリック時(beforecopy と aftercopy の間)に発火
- aftercopy ... コピー後に発火
- destroy ... 削除時に発火
- error ... エラー時に発火

`beforecopy` のときに `data-clipboard-text` を変更すれば
動的にコピーするテキストの内容を変更できます.

[サンプル](http://goo.gl/50y7WZ)



## グチ

そもそも Pure JS でクリップボードにコピーできないってどういうことだよ!
早く HTML5 Clipboard API 実装してくれー!!
EaseUSのPC引越しソフトーTodo PCTransがVer.7.0にバージョンアップ

EaseUSが５月にリリースしたホームユーザ、またはビジネスユーザ向けのPC引越しソフトーTodo PCTransは7月31日にバージョンアップ。

今回のアップデートは、データ及びアプリの転送の効率が向上し、対応アプリも増えてきた。また、IT管理者または技術サービス提供者向けのTechnician版も加えられた。

Todo PCTransはデータ移行、システムアップグレード、またはPCを買い替えるときのデータ引越しのためにデザインされ、プログラムを再インストールなしで大事な文書、ファイル、フォルダ、画像、音楽、アプリを引越しする。 Windows XP、Windows Vista、Windows 7、Windows 8及び Windows 8.1がすべて対応。

Todo PCTransはLAN経由で、安全にデータを移行するソリューションで、無料版、プロ版、または技術者版がある。

無料版：http://jp.easeus.com/free-pc-transfer-software/
プロ版：http://jp.easeus.com/pc-transfer-software-pro/pctrans-pro.html
技術者版：http://jp.easeus.com/pc-transfer-software-pro/


![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/51008/b05721ea-387d-86c5-2b34-83e6932212e4.jpeg)
選択したテキストフレーム内の行をソートする

※エラー処理とか全部はしょってます
※これ実行すると最終行に改行が追加される場合があります
※使用は自己責任でねー
![aiueo.png](https://qiita-image-store.s3.amazonaws.com/0/4000/f9b3b90e-1214-9d7c-58c7-d68b8d2181b1.png)

```javascript:

var myParagraphs = app.selection[0].paragraphs;
sortParagraphs(myParagraphs);

function sortParagraphs(myParagraphs){
	var tmpParagraph;
	var keyA;
	var keyB;
	var paraA;
	var paraB;
	var inSertion;
	for (var i = 0; i < myParagraphs.length; i++) {
		paraA = myParagraphs[i];
        //比較用のキーを設定。キーの取得に特殊な処理が必要な場合は
        //関数に飛ばすのがおすすめ
        //keyA = get_Sortkey(paraA);
		keyA = paraA.contents;
		if (keyA === "" || keyA === String.fromCharCode(13)) {
			continue;
		}
		for (var j=i+1; j < myParagraphs.length;j++) {
			paraB = myParagraphs[j];
                        //keyB = get_Sortkey(paraB);//関数に飛ばすならこっち!
			keyB = paraB.contents;
			if (keyB === "" || keyB === String.fromCharCode(13)) {
				continue;
			}
			if (keyA > keyB) {
                //これから動かそうとする行の行末に改行がなければ付加する
				if (paraB.characters[-1].contents != String.fromCharCode(13)) {
					inSertion = paraB.insertionPoints[-1];
					inSertion.contents = String.fromCharCode(13);
				}
                //行移動させます
                 paraB.move(LocationOptions.BEFORE,paraA.texts[0]);
			}
		}
	}
}
//ソートキーを取得する関数
//先頭からタブ文字までを取得とかの処理はここで実装する
function get_Sortkey(myPara) {
    return myPara.contetns;
}
```
ブラウザバック時にリロードする

「test1.html → test2.html → test3.html」の画面遷移の中で
test3.html から test2.htmlにブラウザバックで戻った際に強制的に１回リロードさせるjsです。
なお、`<button class="back">Back</button>`で戻った場合にはリロードしないようにしてあります。

```lang:test1.html
<button class="next">Next</button>
```
```lang:test2.html
<button class="next">Next</button>
<button class="back">Back</button>
```
```lang:test3.html
<button class="next">Next</button>
<button class="back">Back</button>
```
```lang:js
$(function () {
    //test1でnextをクリックする→読み込み済み(loaded)
    if(location.pathname=="test1") {
        $(".next").click(function(){
            window.name = "loaded";
        });
    }

    //test2で未読み込み(null)であればリロード
    //test2で読み込み済み(loaded)であればリロードしない
    //test2でnextをクリックする→未読み込み(null)
    if(location.pathname=="test2") {
        if (window.name != "loaded"){
            location.reload();
            window.name = "loaded";
        }
        $(".next").click(function(){
            window.name = "null";
        });
    }

    //test3でbackをクリックする→読み込み済み(loaded)
    //test3でブラウザバックをする→未読み込み(null)
    if(location.pathname=="test3") {
        $(".back").click(function(){
            window.name = "loaded";
        });
    }
});
```
enthumbleキーカスタマイズ例(HJKL配列)

viエディタと同じHJKL型です。職業はITコンサルです。

まだまだカスタマイズできていないですが、
プログラマーの皆様とは程遠い生活を送っているので参考になれば、と思います。自分へのメモ代わりに徐々に更新しようと思います。太線部が変更している部分です。

パワーポイントで文章などを書く機会が多いので、キーボードを端々に置かれているのをホームポジションに移動しています。
また、enthumbleでできればベストなんですが、ファイル名などによく日付を使用するのでAutoHotkeyでCtrl + D -> YYYYMMDD / Ctrl + Q -> YYYY/MM/DD が入力できるようにして、enthubleとの組み合わせで無変換+D -> YYYYMMDD / 無変換+Q -> YYYY/MM/DD　を入力できるようにしています。
(Insertキーなどenthumbleで準備されているキーは使用するので使用できないのが悲しいところです。)

============
[HowToUse]
Check=http://jp.enthumble.com
Name=enthumble version 3.0
[KEY]
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={}
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={F8}
9={F9}
0={F10}
-={F11}
Hat={F12}
\={}
Q=^q
W=^w
<b>E={End}</b>
R=^r
<b>T={Tab}</b>
Y={Backspace}
U={Backspace}
I={delete}
<b>O={Home}</b>
P={up}
@={}
LB={}
A=^a
S=^s
D=^d
F=^f
G=^g
H={left}
J={down}
K={up}
L={right}
Semicolon={}
:={}
RB={}
Z=^z
X=^x
C=^c
V=^v
B=^b
<b>N={shift down}{Home}{shift up}</b>
<b>M={shift down}{End}{shift up}</b>
,={delete}
.={delete}
/={}
Backslash={}
Up={ASC 33194}
Down={ASC 33195}
Left={ASC 33193}
Right={ASC 33192}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Bacspace={}
Enter={}
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
wsでハンドシェイクのヘッダにアクセスする

たとえば WebSocket ハンドシェイクのヘッダを用いてクライアントを認証したいとして、必要なフックがwsモジュールのどこにあるか。

## 要求

`ws.Server`のコンストラクタの`verifyClient`オプションでハンドシェイク要求をフックできる。

```ts
var wsServer : ws.Server = new ws.Server({
    server : httpServer,
    verifyClient : verifyClient // <- この子
});
```

`verifyClient` に与えられる引数 `info` からリクエストヘッダにアクセスできる。

認証の成否については、戻り値で返す方法とコールバックで通知する２種類の方法があるようだ。

```ts:認証の成否を戻り値で返す
function verifyClient(
    info : {
        origin: string;
        secure: boolean;
        req:    http.ServerRequest}
) : boolean {
    return doSomething(info.req.headers);
}
```

```ts:認証の成否をコールバックで通知する
function verifyClient(
    info : {
        origin: string;
        secure: boolean;
        req:    http.ServerRequest
    },
    cb : (res: boolean, code?, name?) => boolean
) : void {
    cb(doSomething(info.req.headers), 401, 'Unauthorized');
}
```

コールバック方式では応答を明示的に指定できる。戻り値方式は 401 Unauthorized で固定。

https://github.com/einaros/ws/blob/master/lib/WebSocketServer.js#L268

## 応答

`ws.Server`の`headers`イベントでハンドシェイク応答のヘッダにアクセスできるので、必要ならばここでカスタムヘッダを注入する。

```ts
wsServer.on("headers", (headers : string[]) => {
    doSomething();
});
```
Java入門 配列と繰り返し

Java入門
配列と繰り返し

前回はfor文の使い方についてやりました。
今回は配列とfor文の組み合わせです。

for文は繰り返しの回数を指定してあげる必要がありました。今回は自分で数を指定せずに、配列の要素数だけ繰り返すというfor文を書きます。C言語では存在していない機能ですね。

```java:sample.java
public class Sample {
	public static void main (String[] args) {
		String[] message = {"ゆかりん", "世界一かわいいよ！", "Fooo!"};
		for (String value : message) {
			System.out.println(value);
		}
	}
}
```

これを実行すると

```lang:sample.java
ゆかりん
世界一かわいいよ！
Fooo!
```

このようになります。短くすっきりとしたfor文ですね。
今回は、文字列を扱うString型を使いましたが、もちろん整数のintなどでも可能です。
その際には、***for文の中の型と一致させる***必要があるので、そこを忘れないようにしてください。
Rails での適切な Sass の構成手法について（翻訳）

Sass のディレクトリ構成やファイル管理の仕方は、プログラムを管理しやすくする上でとても重要だと思いますが、まだまだ日本語での記事はあまり見かけません。

そこで、海外サイトで素晴らしい記事（Q&Aでのコメント）を見つけましたので、御本人の許可をいただいて和訳させていただきました。

Sass ファイル読み込みの際のかなり基本的な部分についての解説ですが、とても丁寧にアドバイスされており、CSS/Sass 初心者にもわかりやすい内容だと思います。



## Rails での Sass のコンパイルはどうなっているの？

Stack Overflow で、（質問の概要をざっくりまとめると）

『Rails の stylesheets の読み込み順についてよくわかりません。
思った通りにコンパイルできないのですが、どうしたらエラーを解決できますか。』

という質問が投げられていました。

以下、その質問に対しての、Benjamin 氏による回答です。
（読みやすいように、小見出しは、私の言葉でつけさせていただきました）

元記事はこちらです。↓
***

#### Proper SCSS Asset Structure in Rails - Stack Overflow
http://stackoverflow.com/questions/9138946/proper-scss-asset-structure-in-rails

answered Feb 12 ’12 at 8:38
Benjamin Udink ten Cate


# Benjamin 氏による回答（翻訳）

今回のCSSによる課題は、自動的にすべてのファイルが追加されてしまうのを避けたいということですね。
基本的には、スタイルシートはブラウザによって読み込まれて処理されたとおりの順番になります。
つまり、いつでも最終的にはすべての CSS を読み込むことになります。

## CSS をランダムに読み込んでしまうと

例えば、各ブラウザ間による恐ろしい挙動の違いを防ぐために、デフォルトの見栄えを用意する `normalize.css` シートを、あなたが持っていたとします。
ブラウザはこのファイルを最初に読み込むべきですね。
もし、このシートをあなたが読み込む CSS のどこかに、ただランダムに入れてしまったとしたら、
ブラウザのデフォルトスタイルを上書きするだけでなく、その他の CSS ファイルの中に示されているいくつかのスタイルも先に読み込まれてしまうでしょう。
これは、変数でもミックスインでも同じです。

私は、Euruko2012 での Roy Tomeji によるプレゼン（*1）を見てから、管理しなければならないCSSが大量にあるときには、以下のアプローチをすることに決めました。

## たくさんの CSS を管理するには

私は通例このアプローチを使います：

  1.  すべての .css ファイルを .scss に改名
  2.  application.scss のすべてのコンテンツを削除

`application.scss` に @import 命令を加えることから始めましょう。

もしあなたが twitters bootstrap といくつか自分のスタイルシートを使っているのでしたら、スタイルをリセットするためのシートがすでにあるので、まずは bootstrap を読み込むべきです。
ですので、`@import “bootstrap/bootstrap.scss”;` をあなたの `application.scss` に加えてください。

bootstrap.scss ファイルはこのようになります：

```
// CSS Reset
@import “reset.scss”;

// Core
@import “variables.scss”;
@import “mixins.scss”;

// Grid system and page structure
@import “scaffolding.scss”;

// Styled patterns and elements
@import “type.scss”;
@import “forms.scss”;
@import “tables.scss”;
@import “patterns.scss”;
```

そして、`application.scss` ファイルはこのようになります：

```
@import “bootstrap/bootstrap.scss”;
```

読み込みの順番を指定したおかげで、やっと、 `@import “variables.scss”;` で読み込まれた変数を、その後で読み込まれた他の `.scss` ファイルの中で使うことができます。
つまり、bootstrap フォルダの `type.scss` の中だけでなく、 あなたの作成した `my_model.css.scss` の中でも使うことができるということです。

## partials と modules ディレクトリ

次に、`partials` と `modules` という名前のフォルダを作ります。
これが他のほとんどのファイルの置き場所になります。
`application.scss` ファイルに import を追記しましょう。このようになります。

```
@import “bootstrap/bootstrap.scss”;
@import “partials/*”;
```

では、あなたのホームページ上の記事のスタイルのCSSを少し作りましょう。

`partials/_article.scss` というファイルを作るだけで、コンパイルした `application.css` の中に自動的に加わるでしょう。
読み込み順のおかげで、あなたの scss ファイルの中では、bootstrap のミックスインと変数も使えます。

私が見つけた限りの、このメソッドの唯一の欠点は、時々あなたが partial/*.scss ファイルを強制的に再コンパイルしてあげないといけないことです。Rails はいつでもそれをしてくれるわけではないので。

# 補足

*1) 記事内にある『Euruko2012 での Roy Tomeji によるプレゼン』の URL はこちらです。

#### Modular & reusable front-end code with HTML5, Sass and CoffeeScript - Lanyrd | Euruko 2012
http://lanyrd.com/2012/euruko/


#### Benjamin Udink ten Cate

website: http://www.leipeshit.com/
Stack Overflow: http://stackoverflow.com/users/859762/benjamin-udink-ten-cate