OmniAICreator/Qiita-1.07M huggingface dataset:
Eclipseで快適にコーディングするためにやったこと

## はじめに
投稿練習も兼ねて，僕が使っているEclipseの設定を紹介したいと思います．
っていってもネット上で調べて出てくるものを組み合わせただけですけどね…
ちなみに，Eclipseのバージョンはkepler SR2で，OSはWindows7 Professional 64bitです．

## 日本語化
個人的には日本語化はしなくてもいいと思うんですけど，日本人だし日本語のほうが使いやすいって人が多いですよね．
僕が日本語化するときはこちらを参考にしました．

+ Eclipseの日本語化のためにPleiadesプラグインの導入｜http://www.javadrive.jp/eclipse3/install/index4.html

こんなことしなくても，All in Oneってやつ入れればいいじゃん？って方，いますよね．
最初は僕もそう思いました．
でも， **絶対にAll in Oneは使わないでください．**
これは僕の経験からです…
ノーマルのEclipseで書いたコードを，All in OneのEclipseで開いたら…
**コメント等の日本語が全て文字化けしました．**
めちゃくちゃ面倒です…
なので，できるだけノーマルのEclipseにプラグインを追加する方法にしましょう．
（あくまで僕個人の意見ですけどね．）

## 黒背景&黒テーマにする
僕は目が悪いんですけど，コーディングする時ってずっと画面見てますよね．
Eclipseは標準で全体的に白を基調としたデザインになってますが，これがなんとも目に悪いのです…
なので，思い切ってEclipseを黒くしました！
まさにEclipse（月・日食）という感じになりますね．
参考にしたのはこちら

+ 月夜に輝く滴の如き美しさ！黒背景とカラフルなEclipseプラグイン Moonrise UI Themeに一目惚れ｜http://futurismo.biz/archives/2152

残念ながら，2014年10月23日現在，Eclipse 4 Chrome Themeというプラグインはなくなってしまったようです…
でもこれで目にやさしいEclipseになりました！

## 補完機能を強化
IDEで一番便利と言っても過言ではない補完機能ですが，デフォルトのままだと少々貧弱です．
なので，強化してあげます．
上のメニューバー→ウィンドウ→設定→Java→エディター→コンテンツ・アシストのなかの，
「自動有効化」の部分を調整します．

![自動有効化.png](https://qiita-image-store.s3.amazonaws.com/0/57278/dfbd2cbc-5582-facc-f768-6494fe25582e.png)

この画像は，調整後のスクショです（黒背景版）．
まず，「 **自動有効化遅延** 」の項目を「200」→「80」にしました．
数字を小さくするほど，文字を入力してから補完候補が出るまでの時間が短くなります．
さらに，「 **Javaの自動有効化トリガー** 」の項目に，「abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_」を追加します．
こうすることで，アルファベットのどの文字を打っても，補完候補が出るようになります．
一文字でも補完候補を出してくれるので，コーディング速度がめちゃくちゃ上がります．
（友人に教えたら「 **邪魔だったから戻した** 」と言われたけど…）
ちなみに，補完ウィンドウにフォーカスが移ってムカついた場合は，Escキーで元のフォーカスに戻りますよ．

## エディタの細かい設定
エディタに行番号表示されないとか不便すぎるので，行番号を表示するようにします．
先程と同じく，設定→一般→テキスト・エディターの「 **行番号を表示** 」にチェックを入れます．
これでエディタの左端に行番号が表示されます．
ついでに「**タブでスペースを挿入**」，「**空白文字の表示**」もチェックを入れておきます．
前者は，タブとスペースが混同しないようにするため，後者は，忌まわしき全角スペースを見つけられるようにするために設定しておきます．
（そんなことをしなくても，皆さんはIMEの設定で全角スペースを打てないようにしてあるでしょうから，大丈夫ですよね？）

## 【最重要】エンコードの設定【要注意】
個人的に一番気にして欲しい設定が，**エンコードの設定**です．
僕は今まで研究で**文字コードの†闇†**に飲まれたことが何度もあります．
そりゃもう何度も何度も何度も何度も何度も何（ry
文字コードとか滅びればいいと思ってますが，そんなわけにもいきませんので，
せめて1つに統一したいです．
そこで僕は普段，1番世界標準に近いであろう，**UTF-8**を使っています．
Eclipseでの設定は，先程と同じく，設定→一般→ワークスペースのなかの「**テキスト・ファイルのエンコード**」の項目です．
![エンコード.png](https://qiita-image-store.s3.amazonaws.com/0/57278/bee649dd-d4b3-3aaa-d440-a2354a14e30a.png)
赤枠で囲んだ部分の中の「**その他**」にチェックを入れ，「**UTF-8**」を選択します．
こうすることで，Eclipseで書いたテキストファイルは，UTF-8で書かれます．
文字コードの†闇†に飲み込まれる危険が少なくなります．
（web上にはUTF-8じゃないデータがたくさん転がってるので，そういうデータを使おうとすると†闇†に飲まれます．F○ursquareのVenue名とか†闇†で溢れてますからね．）

## だいたいこんなところでしょうか
以上で僕のEclipse環境と同じ環境が作れるはずです．
黒い見た目はかっこいいし，補完は強力で爆速コーディングできるし，僕はかなり満足してます．
まぁ最近はjava書いてないですけど…
それでは，快適なjavaコーディング生活をお過ごしください（？）

## 参考ページ
Eclipseの日本語化のためにPleiadesプラグインの導入｜http://www.javadrive.jp/eclipse3/install/index4.html
月夜に輝く滴の如き美しさ！黒背景とカラフルなEclipseプラグイン Moonrise UI Themeに一目惚れ｜http://futurismo.biz/archives/2152
exampleがこけたら任意の回数リトライするモンキーパッチ

## 元々はこれ

jenkins上でたまにコケるexampleがあって困ってて、ググったらcookpadさんで既に対処していました

> CI で稀に失敗してしまうテストへの対処方法 - クックパッド開発者ブログ
> http://techlife.cookpad.com/entry/2013/06/13/how-we-deal-with-examples-fail-sometime/

> auto_retry.rb
> https://gist.github.com/sorah/5704562

## リトライは1回だけだったので

任意の回数を設定できるようにしたわけです

MAX_RETRY_COUNTを変えればその回数実行します。
3にした場合リトライしても成功しない時は__最初の失敗 + 3回__分のエラーが表示されます

```
module RSpec
  module Core
    class Example
      INIT_RETRY_COUNT = 0
      MAX_RETRY_COUNT = 3

      attr_reader :is_retry_example

      def run_with_retry(example_group_instance, reporter)
        @retrying_count ||= INIT_RETRY_COUNT
        succeeded = run_without_retry(example_group_instance, reporter)

        until succeeded do
          # リトライ中のエラーを画面に出力
          reporter.notify :example_failed, Notifications::ExampleNotification.for(self)
          return finish_without_retry(reporter) unless retry_needed?

          $stderr.puts "[RETRY] #{self.location}: #{self.full_description}"
          @retrying_count += 1

          # リトライexampleのフラグを立てる
          @is_retry_example = true

          # Initialize itself (originally this has done in ExampleGroup#run_example)
          @exception = nil
          example_group_instance = example_group_instance.class.new.tap do |group|
            group.class.set_ivars(group, group.class.before_context_ivars)
          end

          succeeded = run_without_retry(example_group_instance, reporter)
        end

        succeeded
      end

      alias run_without_retry run
      alias run run_with_retry

      private

      def finish_with_retry(reporter)
        if (@retrying_count || INIT_RETRY_COUNT).zero? && @exception
          false
        else
          finish_without_retry(reporter)
        end
      end

      alias finish_without_retry finish
      alias finish finish_with_retry

      def retry_needed?
        # Fix here for your usecase.
        # For us, we calls internal-app's API for determining to retry or not.
        (@retrying_count || INIT_RETRY_COUNT) <= (MAX_RETRY_COUNT - 1)
      end
    end

    class Reporter
      def example_passed(example)
        # リトライが成功したらリトライ中に失敗したexampleを消す
        if @failed_examples.any? && example.is_retry_example
          @failed_examples = @failed_examples.select{|fe| fe != example }
        end
        notify :example_passed, Notifications::ExampleNotification.for(example)
      end

      def example_failed(example)
        @failed_examples << example
        # エラーリポートをまとめる
        @failed_examples.uniq!
        notify :example_failed, Notifications::ExampleNotification.for(example)
      end
    end
  end
end
```
カレントディレクトリ以下の容量一覧を表示するコマンド

## これだけ

```
$ du -s * | sort -nr
```

## こんなかんじで出力される

```
$ du -s * | sort -nr
888K	Social
792K	VirtualBox
610M	Logs
572K	MobileSafari
572K	Kobito
513M	Containers
512K	WebKit
...
```

## aliasにしてる
```
alis calc_capacity="du -s * | sort -nr"
```
KnockoutJs Tutorial｜簡単な追加・削除



# knockout.js tutorial

knockout.js tutorialやりました。http://learn.knockoutjs.com/#/?tutorial=collections ２個め？の、Working with Lists and Collections。メモ書きです。

# HTML

```
<h2>Your seat reservations</h2>

<table>
    <thead><tr>
        <th>Passenger name</th><th>Meal</th><th>Surcharge</th><th></th>
    </tr></thead>
    <!-- Todo: Generate table body -->
    <tbody data-bind="foreach: seats">
        <tr>
            <td><input data-bind="value: name" /></td>
            <td>
            <select data-bind="options: $root.availableMeals, value: meal, optionsText: 'mealName'"></select></td>
            <td data-bind="text: formattedPrice"></td>
            <td><a href="#" data-bind="click: $root.removeSeat">Remove</a></td>
        </tr>   
    </tbody>
</table>

<h3 data-bind="visible: totalSurcharge() > 0">
    Total surcharge: $<span data-bind="text: totalSurcharge().toFixed(2)"></span>
</h3>
<h2>Your seat reservations (<span data-bind="text: seats().length"></span>)</h2>

<button data-bind="click: addSeat">Reserve another seat</button>
```


# JS

```
// Class to represent a row in the seat reservations grid
function SeatReservation(name, initialMeal) {
    var self = this;
    self.name = name;
    self.meal = ko.observable(initialMeal);
    
    self.formattedPrice = ko.computed(function() {
        var price = self.meal().price;
        return price ? "$" + price.toFixed(2) : "None";        
    });
}

// Overall viewmodel for this screen, along with initial state
function ReservationsViewModel() {
    var self = this;
    
    self.addSeat = function() {
        self.seats.push(new SeatReservation("", self.availableMeals[0]));
    }

    self.removeSeat = function(seat) { self.seats.remove(seat) }   
    

    // Non-editable catalog data - would come from the server
    self.availableMeals = [
        { mealName: "Standard (sandwich)", price: 0 },
        { mealName: "Premium (lobster)", price: 34.95 },
        { mealName: "Ultimate (whole zebra)", price: 290 }
    ];    

    // Editable data
    self.seats = ko.observableArray([
        new SeatReservation("Steve", self.availableMeals[0]),
        new SeatReservation("Bert", self.availableMeals[0])
    ]);
    
    self.totalSurcharge = ko.computed(function() {
       var total = 0;
       for (var i = 0; i < self.seats().length; i++)
           total += self.seats()[i].meal().price;
       return total;
    });

}

ko.applyBindings(new ReservationsViewModel());
```
Open VZでのコンテナコピー方法

EverNoteに残ってたので、転載してみます。
元祖コンテナ仮想化技術(？)での、コンテナコピー方法です。
以下の手順で、サクサク仮想マシンをコピーして乱立できます。
ちょっと古い手順なので、現行Verでも行けるかは未検証です。ごめんなさい。

※OpenVZとは
http://ja.wikipedia.org/wiki/OpenVZ

1.コピー元のコンテナを停止する。
\# vzctl stop <OLDID>

2.複製するコンテナのディレクトリを作成する。
\# mkdir /vz/root/<NEWID>

3.コピー元のコンテナの情報をコンテナのコピーする。
\# cp -a /etc/vz/conf/<OLDID>.conf /etc/vz/conf/<NEWID>.conf
\# mkdir /vz/private/<NEWID>
\# pushd /vz/private/<OLDID>; tar c --numeric-owner * | tar x --numeric-owner -C /vz/private/<NEWID>; popd

4.複製したコンテナのIPを変更する。
\# vi /etc/vz/conf/<NEWID>.conf

5.コンテナを起動する。
\# vzctl start <NEWID>; vzctl start <OLDID>

6.正常に起動を確認できれば完了となる。

以上。
jquery1.11から.data()の挙動が変わっている件

# 違い

```html
<div id="hoge" data-hogehoge="foobar" />
```

## jquery1.11未満

```js
console.log('存在するid、存在するdata属性');
console.log($('#hoge').data('hogehoge')); // "foobar"

console.log('存在するid、存在しないdata属性'); //undefined
console.log($('#hoge').data('hoge'));

console.log('存在しないid');
console.log($('#hogehoge').data('hogehoge')); //null

```

## jquery1.11以降

```js
console.log('存在するid、存在するdata属性');
console.log($('#hoge').data('hogehoge')); // "foobar"

console.log('存在するid、存在しないdata属性'); //undefined
console.log($('#hoge').data('hoge'));

console.log('存在しないid');
console.log($('#hogehoge').data('hogehoge')); //undefined

```

# これにより発生する問題

## $.ajax()使用時

* 送信するパラメータは`ajaxSetup()`の中で`ajaxExtend()`されて実際のパラメータとして使用される。
* ajaxExtend中で`undefinedのパラメータは無視される`。
* 1.11未満は`null`だったので、無視されずパラメータ的には空文字として送信されるが、1.11以降は`undefined`なので、無視されてしまいパラメータとして送信されない。

## その結果

* `param = {selected_value: $(xxx :selected).data(yyy)};`みたいなコードが書かれていたので、項目が選択されていない時に値が飛んでこず、バリデート処理が入っていなかったのでエラーで落ちた。
* どう見てもサーバー側処理のせいによるバグです、本当にありがとうございました。

# おまけ

http://bugs.jquery.com/ticket/14101

どうやら1.8.3の頃は存在しない要素に対して.data()した場合にはundefinedが返ってきていたのに、1.9になってnullを返すようになり、1.10でもそのままで、1.11で再びundefinedに戻ったようですね。
ident認証のせいで名前解決してるのにrshとかsshが遅い

サーバ側のident認証を無効にしてxinetdをrestart

```
# cat /etc/xinetd.d/rsh
# default: on
# description: The rshd server is the server for the rcmd(3) routine and, \
#       consequently, for the rsh(1) program.  The server provides \
#       remote execution facilities with authentication based on \
#       privileged port numbers from trusted hosts.
service shell
{
        socket_type             = stream
        wait                    = no
        user                    = root
#       log_on_success          += USERID
#       log_on_failure          += USERID
        server                  = /usr/sbin/in.rshd
        disable                 = no
}
# service xinetd restart
```
EaseUS Partition Master Freeでディスク管理、システム最適化を簡単に実現

EaseUS Partition Master Freeは人気のディスク／パーティション管理ソフトであり、強力で完備の機能を持ちながら、直感的なインターフェース及び簡単な操作を備えているほか、完全無料に利用できるため、世界中のユーザやからよい評価を受けています。

バージョン10.1はより多くのユーザに役に立つように、従来の英語、日本語、ドイツ語、フランス語のほかに、スペイン語、ポルトガル語(ブラジル)、ポーランド語をも新規対応しました。

この使いやすいディスク管理ソフトで、パーティションの新規作成、削除、移動/サイズ変更、結合、分割、データ消去、ダイナミックディスクをベーシックディスクに変換、基本パーティションと論理パーティション間の変換、削除やフォーマットしたパーティションの復元など、豊富な機能を持っています。

ソフトのメイン画面はこちらです：

![epmf-1.png](https://qiita-image-store.s3.amazonaws.com/0/51008/a76a1dc9-25be-b1e0-2e35-47fe79185d43.png)

ソフトの詳細な機能紹介はこちらです：

http://jp.easeus.com/partition-manager-software/

以下の関連記事をお読みになってください。

無料でMBRディスクからGPTディスクに変換する方法：
http://jp.easeus.com/partition-manager/convert-mbr-disk-to-gpt-disk.html

安全かつ簡単にダイナミックディスクをベーシックディスクに変更する方法：
http://jp.easeus.com/partition-manager/change-dynamic-disk-to-basic.html

Windows 7とWindows 8をデュアルブートする方法：
http://jp.easeus.com/partition-manager/dual-boot-windows-7-and-windows-8.html

より多くの記事は：http://jp.easeus.com/partition-manager/index.html　
をご覧ください。
templateディレクトリ配下の実行順ルール


## templateディレクトリ配下
templateディレクトリ配下は何で分かれてるかふと疑問だったので見てみた。（今まであんまり分ける必要性を感じてなかったので）

自分で決められるのかと思ったらこういう順番で決まっているらしい。
Blogに書くほどじゃないんでメモっとく。


+ /host-$fqdn/$source
+ /$platform-$platform_version/$source
+ /$platform/$source
+ /default/$source

A cookbook may have a /templates directory structure like this:


## ex)

     templates/
         host-hostname.example.com
         windows-6.2
         windows-6.1
         windows-6.0
         windows
         debian
         gentoo
         ubuntu
         default
CentOS7のapacheでUserdirを有効にする

```diff:/etc/httpd/conf.d/userdir.conf
+     UserDir enable
+     UserDir public_html
```

apacheからユーザの`/home/owner/public_html/`を見れるようにする。

```bash:権限修正
mkdir /home/owner/public_html
chmod g+x /home/owner/
chown :apache /home/owner/
```

```bash:httpdリスタート
systemctl restart httpd
```

http://url/~owner/ でアクセスができることを確認。


なお、特定のVirtualHostのみUserdirを有効にすることができる。

```diff:
  <VirtualHost *:80>
  
      ServerName default
      DocumentRoot "/srv/default"
      ServerAdmin root@localdomain.com
      CustomLog logs/access.log common
      ErrorLog logs/error.log
  
+     <IfModule mod_userdir.c>
+         UserDir enable
+         UserDir public_html
+     </IfModule>
  
      <Directory /srv/default>
          AllowOverride All
          Require all granted
      </Directory>
  
  </VirtualHost>
```
何がちがう？NYAOS 3.x と NYAGOS 4.0

[NYAGOS 4.0.0_0](https://github.com/zetamatta/nyagos) リリース記念！

# ユーザから見えるもの

## Unicode 対応

NYAOS 3.x は Double Byte Charactor System を前提にしており、仕組み的に UTF8 などのUnicode をサポートできなかった。

NYAGOS 4.x は Go 言語の機能を通じて、Unicode をサポートしている。

* 現在のコードページにないUnicode 文字列をペーストできる
* %U+XXXX% といった形式で間接的に記載することが出来る（コマンドに引き渡される際に置換される）
* Cygwin と同様に ls や、リダイレクト先等に Unicodeファイル名を用いることが出来る。
* Lua で扱う文字列のデフォルトは UTF8。UTF8⇔現在のコードページの文字コードに相互変換関数もある。

## 環境変数定義用バッチファイルも読み込める source 文

<dl><dt>(2018.08.22)</dt><dd>4.2.5 で、CMD.EXEと同様に、特にsource文など使わずとも、自動でバッチファイルでの環境変数の修正を取り込むようになりました。従来どおり source 文を使う時だけ環境変数を取り込みたい場合は「`nyagos.option.usesource=false`」を設定します</dd></dt>

NYAOS 3.x の source 文は独自文法の環境設定ファイルを読み込めるだけで、環境変数などを設定するバッチファイルを読もうとすると、別途用意した Lua スクリプト(cmdsource.lua)を用いる必要があった。

NYAGOS 4.x の source 文は、最初から cmdsource 相当となっている。また、source のエイリアスとして「`.`」（ドット一つ）も使える。

## キーフックがシンプル

NYAOS 3.x では、一行編集時のキーのフックが全てのキーに対して一つであったため、独自機能をキーに割り当てる際、差し替えが煩雑になりがちだった。

NYAGOS 4.x では

```
nyagos.bindkey('C-c',function(this)～end)
```

いう形で、キー個別にフックをかけることができるため、シンプルに作成できる。
## 自動ワイルドカード展開の廃止

UNIX的なワイルドカード展開は便利だが、Windowsでは自前でワイルドカードを展開することを前提にしたコマンドも多く、それらの誤動作を防ぐため、バッドノウハウを駆使する必要があった。

NYAGOS 4.x ではワイルドカード展開は勝手に行わず、必要に応じてエイリアスなどで組み込めるよう、Lua向け支援関数を用意するだけにとどめた。

## 重複機能の削除

### コマンド定義

NYAOS 3.x では

* alias 文
* 関数機能 (関数名{ … })
* Lua 関数

と三種類もあった。NYAGOS では Lua による

```
nyagos.alias("コマンド名", ～ )
```

に統合した。～に置く引数には、置換されるコマンドライン文字列か、あるいは `function(args) … end` 句が使える。

### 独自文法

NYAOS 3.x では

* CMD.EXE のバッチファイルの文法
* NYAOS 3.x の独自文法(foreach 等)
* Lua 5.2

と3種類もあった。NYAGOS では独自文法は極力廃止した。

# 開発上のこと

## 独自コンテナライブラリの廃止

NYAOS 3.x は NYAOS 2.x 時代の DOS / Windows 等の 16bit 環境のサポートのため、省メモリ志向の独自のコンテナライブラリを使用しており、STL など広く知られたライブラリを使っていなかった。

NYAGOS では Go 言語標準のライブラリを使用しているので、第三者が予備知識なしに修正するのがより容易になった。

## CMD.EXEのラッパー時代に出来た歪な構造から脱却

NYAOS は最初パイプラインを実現するのに、COMMAND.COM / CMD.EXE に頼っていた為

* 外部コマンド・内蔵コマンドで、同じことをする、別のコードを用意
* 字句解析を何回も何回もやり直しているコードがある。

といった歪なコードが含まれていた。その後、CMD.EXEなしにスタンドアローンで動作するように改造されたものに、内部構造にはその名残りがかなり色濃く残っていた。

NYAGOS は最初から自前でほぼ全てを行うようにしているため、このような歪さはない。

## GNU General Public License から New BSD License へ

GPL も嫌いやないけど、嫌う人もいるからね

# 正直、すまんかった

## mruby 断念

（説明が長くなるので詳細は省くが）タイミングが悪かったんや…としか言いようがない。でも、Lua も結構ええやろ？

## あんまり、移行メリットないね

これから増やすよ！
LaTeXで画像挿入で困ったのでメモ

LaTeXってたまにしか使わないので、毎回操作忘れるのでメモ。

#LaTeXで画像挿入

##パッケージ指定
　graphicxパッケージを指定。graphic **x** であるのに。注意。

```lang:***.tex
\documentclass{jarticle}
\userpackage{graphicx}
\begin{document}
　文章
\end{document}
```

##画像はpdfに変換
　画像はpdfに変換するのが一番ベストぽい。convertコマンドを使う。

```lang:
convert foo.jpg foo.pdf
```

僕の環境ではjpgからしかconvertできませんでした。
（アップデートやらなにやらで画像変換系統のライブラリがゴチャゴチャしてるのも、画像挿入で困った原因だったり。）

##挿入

```lang:***.tex
\documentclass{jarticle}
\userpackage{graphicx}
\begin{document}

\includegraphics[width=5cm, bb=0 0 300 400]{foo.pdf}

\end{document}
```

あとは、\includegraphicsで文章中に挿入。
bbは"Bounding Box"の略みたいです。画像サイズを指定してあげてください。
→参考：[JPEG画像の挿入](http://www.clas.kitasato-u.ac.jp/~fujiwara/infoScienceB/TeX/image/jpeg.html)
docker link は怖い？怖くない？ (調べ中)

最近，dockerのlink機能を知りました。
hosts書き換えるのか・・・こわくね？と思ってやってみたこと。

# docker run linkの指定をURLっぽくやってみる

```
[user@host]$ docker run -it --link=app:www.hogehoge.com centos /bin/bash
```
appコンテナは3000番でWebサービス(lodge)を提供しているコンテナです。

エラーになるかなぁとちょっと期待しましたが，普通に通過。

# コンテナの中での作業
```
bash-4.1# ping www.hogehoge.com
PING www.hogehoge.com (172.17.0.66) 56(84) bytes of data.
64 bytes from www.hogehoge.com (172.17.0.66): icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from www.hogehoge.com (172.17.0.66): icmp_seq=2 ttl=64 time=0.043 ms
bash-4.1# curl http://www.hogehoge.com:3000
<html><body>You are being <a href="http://www.hogehoge.com:3000/users/sign_in">redirected</a>.</body></html>
```

ちゃんとアクセスできてるっぽいですね。

# まぁ，実害はないと思うんだけれど

将来的にDockerでDaaSを提供する，なんてコトが起き始めたときに，その起動ロジックに

- HTTPリクエストをリダイレクトする悪意あるイメージをコンテナ化するロジック
- コンテナの名前を取得するロジック
- よく使いそうなURL (google.co.jpとか)をlinkしてDesktopイメージをコンテナ化するロジック

なんてのが，謎のスクリプトとして提供されていて，よく分からずに使っちゃったらどうなんのかなぁ，，，なんて，ちょっとだけ思いました。(ドキドキ)


考えすぎ？
Devise＆OmniAuth-facebookの組み合わせでドメインなどに合わせてFB_APP_IDやFB_SECRETを変える

やっぱりドメインに合わせて変えたりとかしたくなりますよね。

http://stackoverflow.com/questions/13524919/use-omniauth-facebook-when-app-id-and-app-secret-are-different-for-each-request

によると

```rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook,:setup => true
end
```

そうするとログインのプロセス中に
`/account/auth/facebook/setup`のような`/[deviseのパス]/auth/:provider/setup`がコールされるのでこの瞬間にやりたいことが出来る。config/routes.rbに例えば下記のように書いて

```rb
get '/account/auth/facebook/setup', to: "account#facebook_setup"
```

`account_controller`に下記を作成する。

```rb
def facebook_setup
 # この環境変数の設定で都合よく指定すること
 request.env['omniauth.strategy'].options[:client_id] = @site.facebook_key
 request.env['omniauth.strategy'].options[:client_secret] = @site.facebook_secret

 render :text => "Setup complete.", :status => 404
end
```

以上でOK。

コードを読むと下記のようにも出来るっぽい（未確認）

```rb
  provider :facebook,:setup => true, :setup_path => '[setupで呼ばれるパス]'
```
javascript ydn-dbでローカルデータを扱う

日本でやってる人は少ないのかな…
iOSも8からindexeddbに対応したらしいので、もうindexeddbで統一しちゃってもいいのかもしれないですね。不安定と聞いてますが…

使い方は難しくはないのでちょっとご紹介します。[ydn-db](https://github.com/yathit/ydn-db)


定義
---
RDBで言えば、store.nameはテーブル名(mytable)、store.keypathはキー列名(userid)、一つ目の引数はデータベース名(mydb)という感じです。

```js:
var schema = { stores: { name:"mytable", keyPath:"userid" } };
var jdb = new ydn.db.Storage("mydb", schema);
```

insert or update
---
キー列で上書きされちゃいます。

```js:
jdb.put("mydb", { userid:"1", username:"suzuki" } );
```

一気にやりたい場合は配列で押し込む。

```js:
jdb.put("mydb", [
    { userid:"2", username:"sato" },
    { userid:"3", username:"tanaka" },
] );
```

putはdeferredを返しませんが、doneとfailはチェインできます。

```js:
jdb.put("mydb", [
    { userid:"10", username:"a.suzuki" },
    { userid:"11", username:"i.suzuki" },
] ).done( function() {
    console.log("正常終了");
} ).fail( function() {
    console.log("エラー");
});
```

値の取得
---
getですが、こちらはdeferredを返します。

```js:
var task = jdb.get("mydb", "1");
task.then( function(data) {
    console.log(data.username); → suzuki
});
```

データに型がありますのでご注意を。failにもなりませんのでハマりやすいかも。

```js:
var task = jdb.get("mydb", 1);
task.then( function(data) {
    console.log(data.username); → undefined
});
```

変数で指定する場合なんかはきちんと変換してやりましょう。

```js:
var i = 1;
var task = jdb.get("mydb", i + "");
task.then( function(data) {
    console.log(data.username); → suzuki
});
```

同時実行の場合はdeferredが活躍します。

```js:
var task1 = jdb.get("mydb", "1").done( function(d) { console.log(d) } );
var task2 = jdb.get("mydb", "2").done( function(d) { console.log(d) } );
$.when.apply(task1, task2).then( function() {
    console.log("done.");
} );
```

全行の取得

```js:
jdb.values("mydb").then( function(items){
    for(i in items) {
      console.log(i.userid + ': ' + i.username);
    }
} );
```

行数の取得

```js:
jdb.from("mydb").count().then( function(c){ console.log(c) } );
```

sqlに近いものも使えて、全文検索までできるようですが、そこまでは使い込んでいません。
クライアントサイドだけでそこまでやろうとはなかなか思わないので…
Backlogの更新情報をIFTTTでSlackへだらだらと流す


![スクリーンショット_10_23_14__4_12_PM.png](https://qiita-image-store.s3.amazonaws.com/0/7454/d653d606-2b2e-e686-036f-bafae0553787.png "スクリーンショット_10_23_14__4_12_PM.png")

最近[Backlog](http://www.backlog.jp/)を使う相手が多いので、更新情報をSlackにも流すことにしました。


## 方針

連携には自前のサーバやプログラムをできれば使いたくない。
BacklogのダッシュボードにRSS(Basic認証)があるので、それを使ってみよう。

## 段取り

1. RSSフィードが読めるように、Backlogにゲストユーザを作成
1. ゲストユーザをプロジェクトに参加させる
1. IFTTTで`RSS then Slack`


## Backlogにゲストユーザを作成

RSSフィードはAPIキーで取れない気がしたので、Basic認証ができるように適当なゲストユーザを作成しました。メインユーザのID/Passを使うのは一応避けておきます。

![HiganWorks_チケット取り扱い所-_Backlog.png](https://qiita-image-store.s3.amazonaws.com/0/7454/6b9070f3-41bc-bb2a-ef7b-c52eff196d31.png "HiganWorks_チケット取り扱い所-_Backlog.png")

ゲストのメールアドレスはgmailの`+`でつくるエイリアスにしておくといいです。

RSSが取れるかチェックしよう、URLは次のようにすればOK。

`https://{user-id}:{password}@{org-name}.backlog.jp/rss/{Project-ID}`


## あとはIFTTT

で、If Then。

If: new feed item from Backlog(RSS)
Then: post a message to a Slack channel

RSSなので15分おきにまとめて通知されます。

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/7454/48433655-5685-c306-cbe8-b000c8b64630.png "Slack.png")

RSSにフィルタを掛けて、複数のチャンネルに振り分けてもいいですね。

Messageフィールドのオススメはこう。

```
{{EntryAuthor}} {{EntryContent}}
```

ああ、15分で50件以上の更新があったら漏れますが。
JSONをサーバーとフロント側で安全に共有する

こんな感じかなと思いつつ、ベスト・プラクティスってありますか？

**追記: @ngyuki さんがコメントしてくださったものの方がよさそうなのでそちらを紹介しておきます** 

属性値として設定してHTML escapeする

```js:server
this.render("index", {
  initialData: JSON.stringify(initialData)
});
```

```html:handlebars
<script id="initial-data" type="text/plain" data-json="{{initialData}}"></script>
```

```js:browser
var initialState = JSON.parse(document.getElementById('initial-data').getAttribute('data-json'));
```

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

* 最初に書いていたもの

JSON.stringifyしたのをscriptタグ内に入れつつscriptタグを閉じられるのを防ぐために</をエスケープする

* server(node)

```js
this.render("index", {
  initialData: JSON.stringify(initialData).replace(/<\//g, '<\\/')
});
```

```html
<!-- handlebars -->
<script id="initial-data" type="application/json">{{{initialData}}}</script>
```

  * browser

```js
var initialState = JSON.parse(document.getElementById('initial-data').innerText);
```
--------------------------------------------------

Reactでserver-side-renderingしようとする時に必要になったので...
Adminナビゲーションにメニューを追加


下記の手順でナビゲーションを追加できる。

### Managementメニューシステムへ移動

下記のページを移動します。
structure/menu/manage/management
ここでAdminのナビゲーションを管理しています。

![スクリーンショット 2014-10-23 16.15.00.png](https://qiita-image-store.s3.amazonaws.com/0/15535/fdcd6130-2ee4-095f-0fa9-851798c6c719.png "スクリーンショット 2014-10-23 16.15.00.png")


### リンクを追加
上記の緑ボタン「リンクを追加」で追加します。
基本的にはこれで完了です。キャッシュをクリアすると反映されると思います。
Android Fragmentで非同期処理

[jsoupで楽できた！](http://qiita.com/kawa106/items/5b557bf6949b939ed4ce)と思っていたのも束の間。
非同期にしてあげないといけなくなったらしい。
処理の書き方としては[jsoupを使わなかったとき](http://qiita.com/kawa106/items/9f50537a36dfa31863c3)と同じようなのだけど、それはActivityに処理を書いてたんです。
（たぶんですが、Activityに書いたほうがいい処理なんじゃないかと思います）

Fragmentで処理しようとしたら、onPostExecuteでfindViewByIdができなくてひとしきり悩みました。
とりあえず、FragmentのonCreateViewの変数rootViewを、Fragmentのクラスのメンバに（格上げ？）して、そのまんま使い回せばエラーなしで動きました。

```java:itemDetailFragment
        public View rootView;
```

```java:onCreateView
        rootView = inflater.inflate(R.layout.fragment_item_detail, container, false);
        new getData().execute();
```

```java:
private class getData extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void...voids) {

        StringBuilder ret = new StringBuilder();
        try {
            Document doc = Jsoup.connect("http://example.jp/list.html").get();
            Elements elm = doc.select("a[href]").select("a[target=main]");
            for (Element el : elm) {
                ret.append(String.format("%s: %s\n", el.text(), el.attr("abs:href")));
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
        return ret.toString();
    }
    @Override
    protected void onPostExecute(String result) {
         ((TextView)rootView.findViewById(R.id.item_detail)).setText(result);
    }
}
```
XCTestで非同期実行を含むメソッドのパフォーマンスをテストする

```objc
- (void)testMeasureWithExpectation
{
    XCTestExpectation *expectation = [self expectationWithDescription:@"MeasureWithExpectation"];
    
    __block NSUInteger counter = 0;
    [self measureBlock:^{
        [self.testTarget executeTasks:^{
            counter++;
            if (counter == 10) {
                [expectation fulfill];
            }
        }];
    }];
    
    [self waitForExpectationsWithTimeout:1.0 handler:NULL];
}
```

`measureBlock:` は複数回実行した計測数値を出すが、`[expectation fulfill]` を複数回読んでしまうとテストに失敗するので10回目だけ呼ぶようにする。

10回実行するというのはドキュメントに載っているけど今後変わってもおかしくはない。

>[A performance test takes a block of code that you want to evaluate and runs it ten times](https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/testing_with_xcode/testing_3_writing_test_classes/testing_3_writing_test_classes.html#//apple_ref/doc/uid/TP40014132-CH4-SW8)
IDトークンの検証時にエラー

javaのYconnect SDK（jp.co.yahoo.yconnect-2.0.0.jar）を使用してID連携を行いたいと考えています。
jp.co.yahoo.yconnect-2.0.0.jarに同梱されていたサンプルサーブレット（YConnectServlet.java）を使用してID連携を試みたのですが、IDトークンの検証時にJsonの解析エラーが出てしまいます。
なにか足りないことがあるのでしょうか。


####■行ったことは以下のとおりです。
【サンプルプログラムの準備】
１．Yahooデベロッパーネットワークで、サーバサイドアプリケーションを作成
２．サンプルサーブレット（YConnectServlet.java）のアプリケーションID、シークレット、コールバックURLの箇所を取得したものに書き換え
３．コンパイル、サーバ（tomcat）にデプロイ

【サンプルプログラムの実行】
１．ブラウザでサンプルサーブレットへアクセス
２．Yahooの「アプリケーションの利用」画面が表示される
３．「同意する」ボタンを押下する
４．コールバックURLへリダイレクトされ、サンプルサーブレットが実行される
ここで、エラーが発生します。


####■エラーの発生箇所・内容
サンプルサーブレット（YConnectServlet.java）の、IDトークンの検証でエラーが発生しています。
具体的には、YConnectExplicit#verifyIdToken()メソッドを呼んだときに、javax.json.stream.JsonParsingExceptionが発生します。
jsonの解析に失敗しているようです。
以下、その際のスタックトレースです。
* * *
javax.json.stream.JsonParsingException: Unexpected char 0 at (line no=1, column no=226, offset=225)
        at org.glassfish.json.JsonTokenizer.unexpectedChar(JsonTokenizer.java:532)
        at org.glassfish.json.JsonTokenizer.nextToken(JsonTokenizer.java:415)
        at org.glassfish.json.JsonParserImpl$ObjectContext.getNextEvent(JsonParserImpl.java:255)
        at org.glassfish.json.JsonParserImpl$StateIterator.next(JsonParserImpl.java:172)
        at org.glassfish.json.JsonParserImpl.next(JsonParserImpl.java:149)
        at org.glassfish.json.JsonReaderImpl.readObject(JsonReaderImpl.java:177)
        at org.glassfish.json.JsonReaderImpl.readObject(JsonReaderImpl.java:103)
        at jp.co.yahoo.yconnect.core.oidc.IdTokenDecoder.decode(IdTokenDecoder.java:62)
        at jp.co.yahoo.yconnect.YConnectExplicit.verifyIdToken(YConnectExplicit.java:226)
        at jp.co.yahoo.sample.YConnectServlet.doGet(YConnectServlet.java:103)
* * *

####■これまでに調査したこと
YConnectExplicit#getIdToken()メソッドからの戻り値は、ドット区切りの文字列が取得できています。
ですので、IDトークンは取得できているようです。
取得できたIDトークンが正常なのかどうかを調査するため、base64デコードしてみました。
その結果、ドット区切りの2番目のデータがうまくデコードできず、jsonとして不正なもの（データが途中で切れてしまう）になりました。
おそらくこのことが原因でIDトークンの検証に失敗しているのだと思います。
通信の障害も疑い、時間をおいて何度かやり直してみましたが、毎回同様に失敗します。

ちなみに、アクセストークンは正常に取得できており、UserInfo情報の取得も正常にできました。


IDトークンが正常にbase64デコードできれば解決するように思いますが、原因がわかりましたらご教示ください。
gistのツール作りました

gist-tool
=========

[http://manchan.github.io/gist-tool/](http://manchan.github.io/gist-tool/ "gist-tool")
![スクリーンショット 2014-10-22 午後10.26.46.png](https://qiita-image-store.s3.amazonaws.com/0/8972/334f970b-9266-3080-a725-3e29da9d3b18.png)


## Description
Seo friendly gists generate tool.
Generate a gist and embeds it in a `<noscript>` tag for RSS readers and search engines

gistのIDを入れるだけで、
ソースをコピペできるツール作りました。

既存のgistの埋め込みのソース（Embed URL）では、
jsが動的に生成されるだけで、SEO的にあれなので、
生のソースをコピペできる用にしました。

使い方は簡単で、gistのidを入力して、検索するだけ。
結果が表示され、noscriptでソースが表示されます。
Select Embed Codeで簡単に全ソースを選択できます。


あとは煮るなり、焼くなり、ブログに貼り付けるなり、お好きにどうぞ。
Google日本語入力が具合悪い時やってみること


A　とか表示されて、「かな」や「カナ」に変換できない！ってときには、以下のコマンドでGoogleの漢字変換プロセスを終了させてみましょう。

私は毎回これで解決させております。

ターミナルで、

```
$ killall GoogleJapaneseInput
```

これでダメならば再起動してます。
centos6にansibleでpython環境を構築

# centos6にansibleでpython環境を構築

注)
手元の _pyenv_ に _ansible_ を入れる方法 __ではない__ です。
__手元の _ansible_ から他所の _centos_ サーバに _pyenv_ 環境を作る方法__です。

_centos6_ のデフォルトのpython環境が _2.6_ だったので、
_ansible-playbook_ で _pyenv_ で好きなバージョン入れられるようにしてみた。


_python_ビルドに必要なパッケージyumで入れるあたりが若干めんどくさい。
ちょっと余計なのも入ってるけど。

_vagrant_ でテストしたので、
`user: vagrant`
のところは適宜 _sudo_ 権限あるユーザに書き換えて実行すればおｋ。

```yaml:python.yml
---
- hosts: servers
  user: vagrant

  vars:
    python_version: 2.7.6

  tasks:
  - name: install basic pkg
    yum: name={{item}} state=installed
    sudo: yes
    with_items:
    - vim
    - git
    - rsync

  - name: install build python package
    sudo: yes
    yum: name={{item}} state=installed
    with_items:
    - gcc
    - gcc-c++
    - patch
    - readline-devel
    - zlib-devel
    - openssl-devel
    ## for lxml
    - libxml2-devel
    - libxslt-devel
    ## for file copy
    - libselinux-python

  - name: install pyenv
    args:
      ## guard for only once.
      creates: ~/.pyenv
    shell: |
      git clone https://github.com/yyuu/pyenv.git ~/.pyenv
      ## add pyenv env
      (
          echo 'export PYENV_ROOT=~/.pyenv'
          echo 'export PATH=$PYENV_ROOT/bin:$PATH'
          echo 'eval "$(pyenv init -)"'
      ) >> ~/.bashrc
      source ~/.bashrc
      # install python
      pyenv install {{python_version}}
      pyenv rehash
      pyenv global {{python_version}}

  - name: pip install pkgs
    pip: name={{item}}
    with_items:
    - flask
    - lxml
    - uwsgi
```
OS X Yosemite で Testflight Desktop の Error creating IPA に対応する

## エラー
プロビジョニングを選択すると下記の様なエラーが表示されます。

![Screen Shot 2014-10-23 at 14.45.26.png](https://qiita-image-store.s3.amazonaws.com/0/17768/046492de-a71f-8bb9-1ea7-31eb05a5b124.png)

```
error: /usr/bin/codesign --force --preserve-metadata=identifier,entitlements,resource-rules --sign 954436e4bf2b3a20ed600dbb2384fd08e7b96ea2 --resource-rules=/tmp/bdqrjcAZlh/Payload/CodeSigning.app/ResourceRules.plist /tmp/bdqrjcAZlh/Payload/CodeSigning.app failed with error 1. Output: Warning: usage of --preserve-metadata with option "resource-rules" (deprecated in Mac OS X >= 10.10)!
Warning: --resource-rules has been deprecated in Mac OS X >= 10.10!
/tmp/bdqrjcAZlh/Payload/CodeSigning.app/ResourceRules.plist: cannot read resources
```


## 対処
Xcode で ResourceRules.plist のパスを指定していればこのエラーは発生しないようです。

− "PROJECT" or "TARGET" を選択
− "Build Settings" を選択
- "Code Signing" > "Code Signing Resource Rules Path" に `$(SDKROOT)/ResourceRules.plist` を入力
 

## 参考元
[ios - --resource-rules has been deprecated in mac os x >= 10.10 - Stack Overflow](http://stackoverflow.com/questions/26459911/resource-rules-has-been-deprecated-in-mac-os-x-10-10/26485381#26485381)
え！ while readにそんなワナがあったの!?

# [問題]次のシェルスクリプトの欠陥を全て指摘せよ

## 問題のシェルスクリプト
`rmdeadlink.sh`:指定ディレクトリーのデッドリンクを削除するプログラム

* ここで言う「デッドリンク」とは、実体が無くなってしまったシンボリックリンクを指すものとする。
* ただし、指定したディレクトリーにどんな名前のファイルがあるかわからない。

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

[ $# -eq 1 ] || {
  echo "Usage : ${0##*/} <target_dir>" 1>&2
  exit 1
}

dir=$1

cd $dir
ls -1 |
while read file; do
  # デッドリンクの場合、"-e"でチェックすると偽が返される
  [ -L "$file" ] || continue
  [ -e  $file  ] || rm -f $file
done
```

# Thinking Time

：
：
：
：
：
：
：
：
：
：
：
：
：
：
：
：
：
：
：
：

# [解答]

## 0. 意図しない場所の同名コマンドが実行される恐れがある

これはコメント欄からのご指摘に基づくものです。

環境変数PATHがいじくられていると同名の予期せぬコマンドが実行される恐れがあります。安全を期すなら、環境変数PATHを/binと/usr/binだけにしましょう。（今回使っているコマンドはいずれもPOSIX範囲内なので、どちらかのディレクトリーに必ずあります）

```bash:環境変数がヘンにいじくられていた場合への対策
PATH=/bin:/usr/bin # シェルスクリプトの冒頭にこの行を追加
```

（「/binや/usr/binにあるコマンドそのものが不正に書き換えられていたら？」という指摘があるかもしれませんが、それはOSそのものが既に正常ではないことを意味し、言いだしたらキリがありませんのでナシにします）

## 1. 引数`$1`がディレクトリーであることを確かめていない

ディレクトリーでない引数を指定するとその後のcdコマンドが誤作動しますので、冒頭のtestコマンド(`[`)に、引数がディレクトリーとして実在していることを確認するためのコードを追加しましょう。

```bash:ディレクトリーの実在性確認
[ \( $# -eq 1 \) -a \( -d "$1" \) ] || {
  echo "Usage : ${0##*/} <target_dir>" 1>&2
  exit 1
}
```

## 2. 引数`$1`がスペースを含んでいると誤動作する

半角スペースを含んでいるような特殊なディレクトリー名だとcdコマンドに、は複数の引数として渡されてしまい、誤動作してしまいます。なので、cdコマンドの引数`$dir`はダブルクォーテーションで囲みましょう。

```bash:ディレクトリー名がスペースを含む場合への対策
cd "$dir"
```

## 3. 引数`$1`が`-`で始まっていると誤作動する

ディレクトリー名がハイフンで始まっていると、cdコマンドにそれはオプションであると誤解され、誤動作してしまいます。これを防止するためには、絶対ディレクトリーでないと判断した時は、強制的に先頭にカレントディレクトリ―`./`を付けるようにしましょう。

具体的には変数dirを代入している行の後ろに次のコードを追加します。

```bash:ディレクトリー名がハイフンで始まる場合への対策
# シェル変数$dirの先頭が/で始まってるならそのまま、
# さもなければ先頭に"./"を付ける。
case "$dir" in
  /*) :;;
  *)  dir="./$dir";;
esac
```

## 4. 引数`$1`のディレクトリーに移動できない場合の対策が抜けている

いくら引数`$1`でディレクトリーが実在していることを確認しても、パーミッションが無い等の理由でそのディレクトリーに移動できなかったら……。そうです、意図せずカレントディレクトリーのデッドリンクを消そうとしてしまいます。なので、cdコマンドの次の行に次のコードを挿入し、ディレクトリー移動に失敗したら、中断するようにしましょう。

```bash:指定されたディレクリーに移動できなかった場合への対策
[ $? -eq 0 ] || {
  echo "${0##*/}: $dir: Permission denied" 1>&2
  exit 1
}
```

## 5. ファイル名がスペースを含んでいると誤動作する

これも2と同じ理屈です。testコマンドもrmコマンドも誤動作してしまいます。両方ともダブルクォーテーションで囲みましょう。

```bash:ファイル名がスペースを含んでいる場合への対策
  [ -L "$file" ] || continue
  [ -e "$file" ] || rm -f "$file"
```

## 6. ファイル名が`-`で始まっていると誤作動する

これも3と同じ理屈です。もし、先の5の対策コードも下記に記す対策コードもなかったら、**`-rf /home/your_homedir`なんていう特殊なリンクファイルが置かれていた日には、大変なことになりますよ！**奥さん。

```bash:ファイル名がハイフンで始まる場合への対策
file="./$file"
```

## 7. ファイル名が`.`で始まっているとそもそも見つからない

`.`で始まるファイルは一般的に隠しファイル扱いされます。従って、lsコマンドもデフォルトではそのようなファイルを列挙しません。

列挙させるようにするには、lsコマンドに`-a`オプションを追加しなければなりません。

```bash:ファイル名が.で始まる場合への対策
ls -1a
```

## 8. それから…

さて、このシェルスクリプトには実はもう一つ欠陥があります。え、「cdでディレクトリー移ってlsなんてせずに`find -type l -depth 1`でいいだろ」って。

ごもっともな意見なんですが、それ以外の明らかな欠陥を含んでいるのですよ。

それは、
：
：
：
：
：

> readコマンドがバックスラッシュを特別扱いする仕様であることを忘れている。

です。

試しに次のワンライナーを実行してみてください。

```bash:バックスラッシュが取り除かれる!
$ echo 'Total price : \500' | while read str; do echo "$str"; done
Total price : 500
$ 
```

これでは、バックスラッシュ付のファイルを正しく扱えません。

ではどーすればいいのかというと、readコマンドに`-r`オプションを付けるだけです。これで特別扱いはなくなります。

```bash:ファイル名がバックスラッシュを含む場合への対策
while read -r file; do
```

さて、全部指摘できましたか?

え、まだある!? それ、追記しますから教えてください!!!
初心者にお勧めするChefの正しいインストール方法

# どうやってChefをいれる？

## Gemでインストールする？
もちろん！
私もそう思っていました。
世の中のChef環境構築記事はGemばっかり！

この記事はよくありません。（私が書いた）
http://qiita.com/hamichamp/items/e27a0ecacc33482936c8

## Chef Development Kitでインストールしよう。いやするべき！
https://downloads.getchef.com/chef-dk
ここから各OS毎のChef Development Kitがダウンロードできます。
私はMacで使っていますので、Mac版をインストールしました。

Chefが使うRubyやGemも抱え込んでいるので、お使いの環境に依存しなくなります。

すでに、GemでChefを入れちゃっている方は、かぶるとめんどくさいので、アンインストールしたほうがいいと思います。

## knife-soloもインストールしておく
たぶん使う人多いですよね。
インストール方法はつぎの通りです。

```
$ sudo chef gem install knife-solo
```

従来の書き方と違って、chefコマンドのパラメータとしてgemを実行します。

sudo コマンド付けるのめんどくさいなら、chefのインストールディレクトリのアクセス権を変えたりしてください。

## 最後に・・・
Vagrantだ！Chefだ！ってざわざわした頃に調べた情報は、圧倒的にGemでChefをインストールする情報ばかりでした。

久しぶりに、自分のPCにVagrant環境を構築して、ChefをGemでインストールしたら、knifeがない！

どうしたらいいかと困ってたら、Gemで入れるのは一般的ではないと[安藤 祐介](https://twitter.com/yando)さんが教えていただきました。

安藤さん、ありがとうございます！
Sensu monitor for Chrome extension

# Tessen - 鉄扇 - 

SensuのAPIを叩いてChromeのBrowserActionでバッジ表示するChrome拡張を作ってみました。

正式公開前のデモ公開です。要望や気づいたところがありましたら教えて下さい。

また、アイコンやナイスな名前募集中です。

## スクリーンショット

![screenshot](https://raw.github.com/nobuhito/tessen/master/screenshot.png)

## 利用方法

  1. [GitHub](https://github.com/nobuhito/Tessen/releases)から[Zipファイル](https://github.com/nobuhito/Tessen/releases/download/0.0.1/tessen.zip)をダウンロード
  2. Zipファイル内の `tessen/tessen.js` をエディタで開く
  3. 「apiHost, apiPort, uchiwaHost, uchiwaPort, datacenter」の値を環境に合わせて変更
    - apiHost: SensuのAPIサーバー(require)
    - apiPort: SensuのAPIポート(require)
    - uchiwaHost: Uchiwaを利用していればUchiwaのサーバー
    - uchiwaPort: Uchiwaを利用していればUchiwaのポート
    - datacenter: Uchiwaを利用していればUchiwaで表示されるデータセンター名
  4. 再度Zipファイルに圧縮
  5. Chromeにインストール(要デベロッパーモード)

## TODO

  - 設定ページ
  - 複数Sensuのサポート

## ソースコード

[GitHub/Tessen](https://github.com/nobuhito/Tessen)

## ライセンス

デモ的なものなので特に制限は設けません。自由にお使いください。
後日ChromeStoreで正式公開予定ですので二次利用の際には連絡ください。
Google Maps APIのメモ

Google Maps APIを使う案件があったのでメモしたいと思います。
すでにDBでソース上に表示されている「住所」の値から、ジオコーディングでMAPを呼び出す処理を行いました。

使いまわせるように、あとからソース改修をする予定。

# Google Maps API サンプルコード

## HTML

* HTML上にjQueryとMapのAPIの呼び出し
* map_canvasに地図を表示する部分を配置
* 住所の値が入る部分をjs-addressでclassを追加

``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>googleMapsAPI</title>
<link rel="stylesheet" href="css/common.css">
</head>
<body>
<div class="mod-canvas">
    <div id="map_canvas"></div>
</div>
<span class="js-address">札幌市中央区南13条西1丁目1-8</span>
<!-- jQuery -->
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<!-- Google map Script -->
<script src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
<!-- map script -->
<script src="js/map.js"></script>
</body>
</html>
```

## Script

* address01に.js-addressのクラスからテキスト取得し変数に格納
* 地図を表示する部分を変数に格納
* new google.maps.Geocoder()を変数に格納
* .geocode()のaddressに取得した住所を格納

``` map.script
var address01 = $(".js-address").text();
var mapDiv01 = document.getElementById('map_canvas');

function initialize() {
  var geocoder = new google.maps.Geocoder();
  geocoder.geocode({
    'address': address01
  }, function(result, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      var latlng = result[0].geometry.location;
      var myOptions = {
        zoom: 15,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
       };
      var map = new google.maps.Map(mapDiv01, myOptions);
      var marker = new google.maps.Marker({
        position: latlng,
        map: map
      });
    } else {
      alert('取得できませんでした…');
    }
  });
}
// Map lodding
google.maps.event.addDomListener(window, 'load', initialize);
```

# Github
サンプルコードをgithubにリポジトリを作りました。

* [141023_googleMapsAPI](https://github.com/redamoon/141023_googleMapsAPI)

# 公式ドキュメント

* [Google Maps JavaScript API v3](https://developers.google.com/maps/documentation/javascript/?hl=ja)

# 参考サイト

* [Google Maps APIのおさらい。](http://lopan.jp/google-maps-api/)
* [Google Maps APIを使用して住所から緯度・経度を取得(ジオコーディング)](http://kwski.net/api/805/)
* [google map API Geocorder を使ってみた（その１）](http://altarf.net/computer/google_apis/1642)
* [複数のgoogle.maps.Markerに吹き出しをつける](http://www.nanchatte.com/map/showDifferentInfoWindowOnEachMarker.html)
* [Google Maps入門(Google Maps JavaScript API V3)](http://www.ajaxtower.jp/googlemaps/)
* [ジオコーディング(GClientGeocoder)](http://www.ajaxtower.jp/googlemaps/geocoding/)
sshのncと-WでSSH_CLIENT値が異なる。

authorized_keysでfrom=にて絞っている時認識しておく必要がある。

* `nc`の場合、直近の踏み台のIPアドレス
* `-W`の場合、接続元のIPアドレス

`SSH_CLIENT`は `ssh 192.168.XX.XX env`でわかる。
[iOS] 絵文字を表示する

#UILabel などに表示する場合
##方法1
1. 絵文字を[iOS Emoji](http://punchdrunker.github.io/iOSEmoji/table_html/ios6/index.html) から探す
2. Unicode のリンクをクリック
3. 下のJava Data にある「□」を、コードにコピー＆ペ―スト

##方法2
1. 絵文字を[Adding Graphics and Emoji characters to Apple push notifications](http://arashnorouzi.wordpress.com/2011/08/31/adding-graphics-and-emoji-characters-to-apple-push-notifications/) から探して、「¥uaaaa」を「0xaaaa」にして、NSString で表示
2. 
```Objective-C:Example
NSLog(@"%@", [NSString stringWithFormat:@"%C", 0xe022]);
```

3. コンソールに出力された「■」のような文字を、コードにコピー＆ペ―スト

#HTML として表示する場合
[iOS Emoji](http://punchdrunker.github.io/iOSEmoji/table_html/ios6/index.html) の各Unicode の前に「&#x」、後ろに「;」を付ける

>例： 松 \&#x1F4DD;

#実行例
![IMG_2868.PNG](https://qiita-image-store.s3.amazonaws.com/0/53928/169ebaf9-efd9-588d-d5f8-d0fad520a796.png "IMG_2868.PNG")

#参考
##UILabel など
*[Showing emoji in a UILabel?](http://stackoverflow.com/questions/11619267/showing-emoji-in-a-uilabel)
*[Adding Graphics and Emoji characters to Apple push notifications](http://arashnorouzi.wordpress.com/2011/08/31/adding-graphics-and-emoji-characters-to-apple-push-notifications/)
##HTML
*[iOS Emoji](http://punchdrunker.github.io/iOSEmoji/table_html/ios6/index.html)
aリンクを無効にする

tab切替だったり、何らかの操作のトリガーにリンク（#）を使うことがあります。
ページをコーディングするときにリンクを使ったイベント処理はやるのですが、よく忘れるのが、処理のあとに記述する``` return false ```ですね。

いつも忘れて挙動がおかしいとかで突っ込まれるので、メモ投稿になります。


# jQueryで無効

``` html
<a class="mod-tabBtn" href="#">LINK01</a>
```

``` jQuery
$(function(){
	$('a.mod-tabBtn').click(function(){
		// なんらかの処理をする。。。
		return false;
	})
});
```

# 参考サイト

* [aリンクを無効にする方法 – JQuery、javascript、[#]リンク等 – How to disable links](http://zxcvbnmnbvcxz.com/how-to-disable-links/)
Mac(utf-8)でリモート(euc-jp)に接続するときのメモ


## cocotを使う


```
# cocot インストール
brew install cocot

# 実行するときのコマンド
cocot -t UTF-8 -p EUC-JP -- ssh

# おわり
```

参考URL
http://gam0022.net/blog/2012/08/06/how-to-use-cocot
GulpをWebstormで使ってみる

## Webstorm9でGulp対応
今回リリースされたWebstorm9でGulp対応したそうなので早速使ってみることに。[Webstorm](http://blog.jetbrains.com/webstorm/2014/09/webstorm-9-eap-138-1988-meteor-support-gulp-and-more/)

## Gulp関連の機能
###コンテキストメニュー
とりあえずgulpfile.jsを作成しファイルを右クリック。
lessをコンパイルする簡単なものを用意しました。

```js:glupfile.js
var gulp = require('gulp');
var less = require('gulp-less');
var path = require('path');

gulp.task('less', function () {
  gulp.src('./less/**/*.less')
    .pipe(less({
      paths: [ path.join(__dirname, 'less', 'includes') ]
    }))
    .pipe(gulp.dest('./css'));
});
```
すると、glupアイコンとともに、[Create 'default']と [Show Gulp Tasks]が現れています。
![contextmenu.jpg](https://qiita-image-store.s3.amazonaws.com/0/44982/5bc72545-4c6a-be2f-d9c0-90a74783beaa.jpeg)

###オートコンプリート
これは多分これまでもできていたと思いますが、オートコンプリートももちろん出てくる。
![autocomplete.jpg](https://qiita-image-store.s3.amazonaws.com/0/44982/1886ce0a-3fd3-3824-8c0d-5f838e10a489.jpeg)

###Gulpの実行設定
こんなダイアログが出てきます。
![Createdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/44982/10e77360-3d14-16bc-5206-5fca3f4321a6.jpeg)

### Gulp実行ボタン
設定すると右上にタスク実行できるボタンが。
![runtasks.jpg](https://qiita-image-store.s3.amazonaws.com/0/44982/bd1a8477-ae68-ae2f-5cfd-3973183031c2.jpeg)

### Gulp実行コンソール
こんな感じで実行結果が見れます。
![rungulp.jpg](https://qiita-image-store.s3.amazonaws.com/0/44982/edcfae72-7a83-4668-ee7a-c4934eb9865a.jpeg)

### Gulp タスクリスト
Gruntみたいにタスクリストも表示されます。
![tasklist.jpg](https://qiita-image-store.s3.amazonaws.com/0/44982/5e6e91d7-878e-d369-cd9a-2732b769071e.jpeg)

この際に簡単なアプリでも作ってGulpの勉強をしてみようと思います。
ヒラギノとHelvetica Neue の混植スタイル

iOS7 以降とYosemite になってから　ヒラギノ角ゴシックにw1, w2 のウェイトが追加されたので、
CSS でHelvetica Neue とのいい感じの混植を模索。

とりあえず Yosemite だけでいい感じになるように。

```css
.w1, .w2, .w3, .w6 { -webkit-font-smoothing: antialiased; }

.w1 {
  font-family: "HelveticaNeue-Thin", "Helvetica Neue Thin", "Helvetica Neue", ".HiraKakuInterface-W1";
  font-weight: 100;
}

.w2 {
    font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", ".HiraKakuInterface-W2";
    font-weight: 300;
}

.w3 {
  font-family: "Helvetica Neue", 'ヒラギノ角ゴ Pro W3','Hiragino Kaku Gothic Pro';
  font-weight: 400;
}

.w6 {
  font-family: "HelveticaNeue-Bold", "Helvetica Neue Bold", "Helvetica Neue", 'ヒラギノ角ゴ Pro W6','Hiragino Kaku Gothic Pro';
  font-weight: 700;
}
```

![スクリーンショット 2014-10-23 12.04.15.png](https://qiita-image-store.s3.amazonaws.com/0/955/2a1700b5-61a4-8ec9-d38d-e91cfb723f7a.png)


W3 + Regular がほんのちょっと…。
Helvetica Neue Medium との組み合わせほしい。（買えよ…


参照：[iOS 7 の隠しフォント， ヒラギノ角ゴ W1/W2 を CSS で指定する](http://keagelog.blogspot.jp/2013/10/ios-7-w1w2-css.html)
vimを使って文字コードを変換する方法


vimを使った文字コードの変換は、

```
:set fenc=sjis
:set fenc=cp932
```

のように :set fenc= というコマンドにて実行することができる。
ただし、文字コードによって使えない文字があったりするので、
その文字を保持したまま変換 & 保存しようとするとエラーになる。

例えば shift-jisで「¥(半角の￥)」を使うことはできない。
これらの文字は削除or代替してから保存すればOK。

ちなみに、

```
:e ++enc=sjis
```

とすればそのファイルを何の文字コードで読み込むのかを指定することができる。

ちなみに、Webサイトではhtml, js, cssの
それぞれのファイルを何の文字コードで読み込むのか設定することができる。

htmlなら、headタグ内に

```
<meta charset="Shift_JIS">
```

cssなら、ファイル先頭に

```
@charset "UTF-8";
```

jsなら、

```
<script src="hogehoge.js" type="text/javascript" charset="UTF-8"></script>
```

というふうに書けば良い。
Backlog API V2 を使って、課題を Slack に連携させる

[Backlog API V2](http://developer.nulab-inc.com/ja/docs/backlog/api/2/) を使って、Backlog に課題が投稿されたり更新されたりした場合は Slack へ通知を行うようにしたのでそのメモです。
([Hubot](https://hubot.github.com/) を使っていて、Slack 以外でも応用できそう)

## 下準備

1. Hubot が動く環境を用意。(私は heroku を使いました、設置方法はググるといっぱい出てきます)
1. Hubot の環境に以下のモジュールを追加
    - node-cron
    - node-time
1. Backlog API キーを取得

## コード

Hubot の scripts フォルダに以下のようなコードを設置。

```coffeescript
# Description:
#   Backlog to Slack
#
# Commands:
#   None

cron = require('cron').CronJob

intervalMinutes = 10
backlogUrl = 'https://****.backlog.jp/'
apiKey = '****'

module.exports = (robot) ->
	new cron "0 */#{intervalMinutes} * * * *", ->

		# APIアクセス
		robot.http("#{backlogUrl}api/v2/space/activities?apiKey=#{apiKey}")
		.get() (err, res, body) ->

			# 前回cron実行時刻
			lastTime = new Date - intervalMinutes*60*1000

			for feed in JSON.parse body
				# 前回cron実行時刻より古いものは処理しない
				if new Date(feed.created) < lastTime
					continue

				switch feed.type
					when 1
						label = '課題追加'
					when 2
						label = '課題更新'
					when 3
						label = '課題コメント'
					else
						# 課題関連以外はスルー
						continue

				# 投稿メッセージを整形
				url = "#{backlogUrl}view/#{feed.project.projectKey}-#{feed.content.key_id}"
				if feed.content.comment?.id?
					url += "#comment-#{feed.content.comment.id}"
				message = "[#{feed.project.projectKey}] #{label} - #{feed.content.summary} by #{feed.createdUser.name} #{url}"

				# Slack に投稿
				robot.send {room: '#sample'}, message

	, null, true, 'Asia/Tokyo'
```

node-cron を使って、一定時間間隔(ここでは10分)毎に Backlog API の [最近の更新の取得](http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-activities) をコールしています。
で、直近10分以内の更新があれば、てきとうにメッセージを整形して Hubot の robot.send で Slack に投稿しているだけです。

![スクリーンショット 2014-10-23 17.00.16.png](https://qiita-image-store.s3.amazonaws.com/0/45034/171509b4-d68c-412e-bdb3-54a983dd8f56.png)

こんな感じで流れてきます。

今回は課題関連だけを通知していますが、git や Wiki の更新情報も取れている状態なので、そのへんもわりと簡単に対応できるかと思います。
Swiftで便利だった小ネタ集


記事にするのもアレ or いまいちちゃんと調べきれてない雑多な小ネタ集

# Swiftの小ネタ
## printlnにtuple使うと便利
複数の値を一気にコンソールに出したいとき、最初は

```swift
println("some value")
println(value)

```

とやっていたけどタプル化して

```swift
println(("some value", value))
```

とすればよい。地味に便利

### 追記(2014/12/10)
Xcode6.1.1で試してたところ

```swift
println("foo","baz")
```

が使えるようになっていました。

## optionalな値のデフォルト
scalaでいうとこのgetOrElseなのを探してたらこんなかんじだった。
javascriptとかrubyでよくやる記法に近い気がする

```swift
let baz : String? = nil
let foo = baz ?? "default value"
```


# XCodeがらみの小ネタ
## xibで紐付けたoutletをオプショナル型にすればIBの紐付けが無くても大丈夫になって便利

複数のxibを扱うようなViewCellなどのクラスで、InterfaceBuilderから紐付けた時基本`!`のunwrap記号が付与されるが、これを`?`にすれば片一方のxibに存在していないようなヒモ付ができた（TODO：あまり仕組みちゃんと調べてないので要検証）

```swift
class SomeCell: UICollectionViewCell{
    @IBOutlet var labelView: UILabel!
    @IBOutlet weak var image: UIImageView!
    @IBOutlet weak var optionalLabel: UILabel? // xibによっては存在しなかったりするならこんな感じで
}
```

## lldbでは`fr v someValue`を使えばコンソール出力できる
`po someValue`でエラーが出ちゃってなんだろうなーと思っていたけど`fr v`で出るっぽい。（ちゃんとわかってない）
出展このへん：http://natashatherobot.com/swift-debugging/
【Facebook】コメントをサイトに埋め込むときに注意すること

[Facebookコメント](https://developers.facebook.com/docs/plugins/comments/)をサイトに埋め込むときに

```
警告: （URL） に到達できません
```

という警告が出た。
まだ本番に上げてないから、だと思っていたが違ったらしい。

#埋め込むページがhtmlだったら気をつけるべきこと
**URL to comment on**に入れるURLは

```
http://qiita.com/
```

ではなく

```
http://qiita.com/index.html
```

と入れなければならなかったみたい。
これだと[Facebookでバッカー](https://developers.facebook.com/tools/debug/og/object/)もエラーでないし、警告も出ない。
Unityで"_clock$UNIX2003"がないよ@Xcode6シミュレーター


Unity Version4.5.4f1でiOS用のアプリをシミュレーターで動かそうとしたところ、
i386には"_clock$UNIX2003"ないよと怒られた。
ちなみにXcodeは6.0.1。

```
Undefined symbols for architecture i386:
  "_clock$UNIX2003", referenced from:
      _substanceHandleSwitchHard in libiPhone-lib.a(apihandle.o)
      _mainRenderProcess in libiPhone-lib.a(mainrenderprocess.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

[こちら](http://forum.unity3d.com/threads/ios8-xcode6-compatibility.249533/page-2#post-1769753)のフォーラムでUnityの人が下記をmain.mmに追加すればイケるって書いてたのでやってみた。

```main.mm
#include <time.h>

extern "C"
{
    clock_t
    clock$UNIX2003(void)
    {
        return clock();
    }
}
```

イケた。
けどこれっていいのかな(´･ω･`)

追記

Unity Version4.5.5f1にアップデートしたら発生しなくなってた。
これが追加されたっぽい。

```main.mm
#if TARGET_IPHONE_SIMULATOR
extern "C" clock_t clock$UNIX2003(void) { return clock(); }
#endif // TARGET_IPHONE_SIMULATOR
```
Gnu Global で C# のコードにタグをつける方法


[こちらを参考にしました](http://d.hatena.ne.jp/kiwatana/20110611)

一言でいうと、gtags.conf の build-in parser の定義に C# に関連するファイルの拡張子を追加した gtags.conf を以下のように作成して、違う名前、たとえば gtags.new.conf などでどこかに保存します

```gtags.conf変更前
builtin-parser:\
	:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.hh.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
```
```gtags.new.conf
builtin-parser:\
	:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.hh.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:++ :langmap=cs\:.cs.h.cppproj.csproj.aspx.asax.config.cscfg.csdef:
```

そして以下のように --gtagsconf で先ほどの gtags.new.conf を指定して gtags を実行します

```
gtags -v --gtagsconf gtags.new.conf
```