OmniAICreator/Qiita-1.07M huggingface dataset:
AMI で PHP 5.5 + nginx + FPMの設定


Nginx（1.4.7）
PHP（5.5.10）

# nginx のインストールと動作確認
```
sudo yum -y install nginx
(sudo yum -y install telnet)
sudo yum -y install php55
sudo yum -y install php55-fpm
sudo yum -y install git

sudo service nginx start
```

# FuelPHP サンプルを導入

```
(http://fuelphp.com/docs/)
curl get.fuelphp.com/oil | sh
mkdir Sites
cd Sites/
oil create blog
```

# FPM の設定
以下のように編集:

```
--- nginx.conf.original	2014-04-11 01:40:33.135556672 +0000
+++ nginx.conf	2014-04-11 02:29:30.387077766 +0000
@@ -40,18 +40,31 @@
     # for more information.
     include /etc/nginx/conf.d/*.conf;

-    index   index.html index.htm;
+    index   index.php index.html index.htm;

     server {
         listen       80;
-        server_name  localhost;
-        root         /usr/share/nginx/html;
+        server_name  SERVERIP;
+        root         /home/ec2-user/Sites/blog/public/;

         #charset koi8-r;

         #access_log  /var/log/nginx/host.access.log  main;

         location / {
+                try_files $uri $uri/ @handler;
+        }
+
+        location @handler {
+                rewrite ^ /index.php?/$request_uri;
+        }
+
+        location ~ ^/index.php$ {
+                fastcgi_pass 127.0.0.1:9000;
+                fastcgi_index index.php;
+                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+                include fastcgi_params;
+
         }

         # redirect server error pages to the static page /40x.html

```

# FPM 起動
```
sudo service php-fpm-5.5 start
sudo service nginx restart
```

# To be continued
 * Chefレシピ化して、
 * Vagrant readyにする

ってところまでやっていきたいところ
rescue修飾子

[元ネタ](http://shokai.org/blog/archives/8221)にコメントが書けないのでこっちに。

rescue修飾子とは
==============

[逆引きRubyの例外の項](http://www.namaraii.com/rubytips/?%E4%BE%8B%E5%A4%96#l10)を見るとわかるけど、中置rescue（＝rescue修飾子）は **左辺で例外発生時、右辺を実行するという意味** なので、```serialport.read rescue EOFError```とは、なんか例外が発生したら定数EOFErrorを評価して、その結果EOFErrorクラスを返すという意味になる。なので

> rescueで拾ったEOFErrorがreturnされてた

のではなくて、EOFErrorクラスが返されているのであって、発生した例外が返されているわけではない。

```serialport.read rescue nil```としたら想定の動作になる。

そもそも
========

rescue修飾子を忘れてたので、以下のワンライナーでログファイルが一部存在しない場合IOエラーになったので、ググってた。

```shell-session
$ ruby -e 'ARGV.each{|x|puts "***#{x}***";puts IO.read(x)}' pre_process.log process1.log process2.log post_process.log
***pre_process.log***
これから処理するよ…
***process1.log***
一個目処理してるよ…
***process2.log***
-e:1:in `read': No such file or directory @ rb_sysopen - process2.log  (Errno::ENOENT)
        from -e:1:in `block in <main>'
        from -e:1:in `each'
        from -e:1:in `<main>'

```

単純に直したらこう。

```shell-session
$ ruby -e 'ARGV.each{|x|puts "***#{x}***";puts IO.read(x) rescue puts "not found"}' pre_process.log process1.log process2.log post_process.log
***pre_process.log***
これから処理するよ…
***process1.log***
一個目処理してるよ…
***process2.log***
not found
***post_process.log***
処理終わったよ
```

しかし2個めのputsが冗長な気がして以下に書き換えると文法エラーになる。イケてもよさそうな気もするけど、カッコの中にはrescue修飾子が書けない様子。

```rb
puts(IO.read(x) rescue "not found")
```

まあ手抜きしないでファイルチェックせーよっていう話だけども。

```rb
ARGV.each do |x|
  puts "***#{x}***"
  puts File.exists?(x) ? IO.read(x) : "not found"
end
```

パーミッション無かったりするとこれでも落ちるけど。
[FileTest::readable?](http://docs.ruby-lang.org/ja/1.9.3/method/FileTest/m/readable=3f.html)のほうが適切か。

しかし
======
rescue修飾子の評価順は左辺→右辺だけど、(if|unless|while|until)修飾子は **右辺の評価が先** なので、やや迷う気もする。よく次のように書くけど、この場合は右がtrueなら左を実行。

```rb
There.do_something if My.foo_enabled?
```

あとwhile(until)修飾子で、いわゆる後置while(do..while)が実現されているのだが、知らんかったけど、どうも **左辺にbegin - endがある場合は左辺が先、なければ右辺が先** らしい。やや気持ち悪い？
do whileは入力ループなんかで使うと思う。```begin x=gets;end while x =~ /on|off/i```とか。Rubyのbegin-endは変数スコープを導入しないので、これでも問題なく動く。評価順が変わることでハマるパターンとかないのかな？（例が思いつかないのでなさそう）
FuelPHP開発入門_04

すっかり忘れてましたが、当方FuelPHP1.7を対象に書いております。

Controller書いていきますヽ(´＠ω＠｀)ﾉ
FuelPHPのコントローラーのタイプは４つ。

 - Controller
 - Controller_Template
 - Controller_Restable
 - Controller_Hybrid

Controllerは基本のコントローラークラス。

```welcome.php
class Controller_Welcome extends Controller // 継承して利用
{
```

Controller_Templateはビューテンプレートを用いることができるコントローラークラス。例えばヘッダー、サイドバー、フッターなどを含むページ全体のテンプレートがある場合などはこちら。
テンプレートファイルにそれぞれのビューを嵌めこむ形になるので、CakePHPに慣れている方はこちらのほうが使いやすいかもしれません。

Controller_Restableはビューを利用しないコントローラークラス。DBを検索してデータを返す処理などに使います。
第一回でも書いたとおり、ひとつのメソッドでXMLもJSONもPHP配列も返却できるのがFuelの利点ですので、モバイルアプリなどを作成する場合はこちらで作っちゃうと楽かと思います。
※主観です

Controller_HybridはTemplatemとRestableの両方を利用できるクラス、とのことです。まだ使ったことがないです(＠ω＠)

## 命名

Controllerクラスの基本的な命名規則は、Controller_Hogehogeです。ファイル名はhogehoge.phpになります。
Controller_Hoge_Hogeなどにしてしまうと一段下の階層を指してしまうので注意。

Controllerクラスの基本メソッドは以下のとおり。

```welcome.php
public function action_hello()
{
	return Response::forge(ViewModel::forge('welcome/hello'));
}
```

クラスの命名規則は、action_hogehogeとなります。
このメソッド(Controller_Welcome -> action_hello())は
localhost/fuelphp/public/ **welcome** / **hello** でアクセスすることができます。

return部分で返却しているのがビューファイル、対応のファイルはapp/viewsの下にあります。
***app/classes/viewではないので注意！***

Controller_Templateを利用する場合、Controller_Restableを利用する場合についてはまた別記事にします。

ちなみにFuelPHPのコーディング規約については[FuelPHP公式のコーディング規約](http://fuelphp.jp/docs/1.7/general/coding_standards.html)が詳細ですので是非に。

さて次はCakePHPer大本命のController_Templateの実装に移りましょうヽ(´＠ω＠｀)ﾉ

※当方CakePHPに慣れているので、オートローダーなど自然にスルーしてる項目がいくつかあると思います。わかりにくい箇所はご指摘いただくとありがたいです。
Raspberry PIの不要ファイル削除

## Raspberry PIの不要ファイル削除

```bash
sudo apt-get autoremove -y scratch
sudo apt-get autoremove -y midori
sudo apt-get autoremove -y omxplayer
sudo apt-get autoremove -y galculator
sudo apt-get autoremove -y xpdf
sudo apt-get autoremove -y dillo
sudo apt-get autoremove -y debian-reference-common
sudo apt-get autoremove -y netsurf-common
sudo apt-get autoremove -y netsurf-gtk
sudo apt-get autoremove -y x11-common
sudo apt-get autoremove -y python*
sudo apt-get autoremove -y lxde-icon-theme
sudo apt-get autoremove -y psmisc
sudo apt-get autoremove -y idle-python3.2
sudo apt-get autoremove -y python
sudo apt-get autoremove -y python3
sudo apt-get autoremove -y python2.7
sudo apt-get autoremove -y python2.7-minimal
sudo apt-get autoremove -y lxde-common
sudo apt-get autoremove -y lxdeterminal
sudo apt-get autoremove -y hicolor-icon-theme 
sudo apt-get autoremove -y xarchiver
sudo apt-get autoremove -y libpoppler19
sudo apt-get autoremove -y ed
sudo apt-get autoremove -y vim-common
sudo apt-get autoremove -y lxsession
sudo apt-get autoremove -y lxappearance
sudo apt-get autoremove -y lxpolkit
sudo apt-get autoremove -y lxrandr
sudo apt-get autoremove -y lxsession-edit
sudo apt-get autoremove -y lxshortcut
sudo apt-get autoremove -y lxtask
sudo apt-get autoremove -y lxterminal
sudo apt-get autoremove -y xauth
sudo apt-get autoremove -y samba-common
sudo apt-get autoremove -y fontconfig
sudo apt-get autoremove -y fontconfig-config
sudo apt-get autoremove -y fonts-freefont-ttf
sudo apt-get autoremove -y dbus-x11
sudo apt-get autoremove -y desktop-base
sudo apt-get autoremove -y desktop-file-utils
sudo apt-get autoremove -y libxmuu1
sudo apt-get autoremove -y
sudo apt-get -y clean

sudo rm -rf /home/pi/python_games
sudo rm -rv /usr/share/wallpapers/
sudo rm -rf /usr/share/sounds/
sudo rm -rv /usr/share/icons/*
sudo rm -rv /opt/vc/src/*
sudo rm -rv /opt/*
sudo rm -rv /usr/share/icons/*
sudo rm -rv /usr/games/
sudo rm -rv /usr/share/squeak/
sudo rm -rv /usr/share/themes
sudo rm -rv /usr/share/kde4
sudo rm -rv /usr/share/images/*
sudo rm -rf /opt/vc/src/*
sudo rm -rf /usr/share/icons/*
sudo rm -rf /usr/share/squeak/
sudo rm -rf /usr/share/themes
sudo rm -rf /usr/share/kde4
sudo rm -rf /usr/share/images/*
```
Koa用のミドルウェアをwebsocketにも対応させたい


#はじめに

[koa](http://koajs.com/)はp-baleine@githubさんの[記事](http://qiita.com/p-baleine@github/items/41b8946b9cfff7601d85)やLightSpeedCさんの[記事](http://qiita.com/LightSpeedC/items/bcc92391b5436664d4cb)で魅力を感じて触っています。
でもnode.jsといえばやっぱりsocket.ioを使った双方向通信ですね。

どうやって実現するか。

そこでググってみるとtakyamさんの[ブログ](http://new.takyam.com/entry/2013/12/31/koa%E3%81%A8socket.io%E3%81%AE%E9%80%A3%E6%90%BA)にドンピシャな投稿がありました。
さっそくtakayamさんの[コード](https://github.com/takyam-git/koa-chat/blob/master/index.js)を拝見すると、やっぱりsocket.ioの部分はごちゃごちゃしてしまうのは仕方がなさそうですね。

せっかくkoaのhttpのミドルウェア部分はすっきりしているのにと。。。

そこで今回はsocket.io部分もミドルウェアっぽく記述出来るモジュールを作成しました。
[公開](https://github.com/yukik/cocotte-mixin-ws)しているので試してみてください。
npmを使う場合は`npm install cocotte-mixin-ws`です。

# Koaのミドルウェア

とっても単純に記述するとhttp部分のミドルェアは次のようになります。

```js:js
var koa = require('koa');
var app = koa();

// HTTPミドルウェアの追加
app.use(function*(next){
  yield next;
});
```

# socket.ioの部分

普段の記述方法はこんな感じです。

```js:js
var server = app.listen();
var io = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {

  socket.on('EVENT1', function (param) {
    
  });

  socket.on('EVENT2', function (param) {
    
  });

});
```

モジュールを使ってミドルウェア風に記述するとこんな感じ。

```js:js
var server = app.listen();

app.ws('EVENT1', function*(next){ 
  yield next;
});

app.ws('EVENT2', function*(next){
  // ソケット
  var socket = this.socket;
  // ソケット変数
  var values = this.values;
  // イベント引数
  var param = this.param;
  yield next;
});

```

ただ記述方法が変わっただけでなく、上記の方法に比べて利点もあります

+ 同じイベント名を設定するとyield nextでフロー処理が使える
+ 面倒な非同期でのプッシュ通信も簡素に書く事が出来る
+ httpの時と同じように処理をモジュール化する事も容易になる

詳しくは[Git - README](https://github.com/yukik/cocotte-mixin-ws)で。

# さいごに
wsはwebsocketの略ですが、socket.ioは別にwebsocketだけの通信をするわけではないので、名称が適切でなかったかも。
まだ、Koaのapplication.jsのmixinといったバットノウハウぽい動きなっています。
数日前に出来たばかりのモジュールなので、これから充実させていきたいですね。
ただ、肝心のKoaの方が動きが速いので付いていくのが精一杯です。
Koaのバージョンアップしだいで、うごかなくなっちゃうかも。。。
[iOS] 非公式Qiitaアプリをリリースしました！


2月頭から突然のiOSチーム異動で、色々勉強を続けてきました。
しかし、Objective-CのことだけではiPhoneアプリは作れません。
申請やプロビジョニングファイルなどなど、知らないとならないことがたくさんあります。

それらの知識も手に入れるため、ひとつ実際にアプリを作って申請する、というのを目的にアプリを作ってみました。

その名も **[マイQiita](https://itunes.apple.com/us/app/maiqiita/id815520982?l=ja&ls=1&mt=8)**。

アプリ自体は非常にシンプルなものです。
できることは

* 自分で投稿した記事一覧を見れる
* 限定公開の記事も一覧に表示される
* 記事に対するストック数を表示する
* 詳細ページ（WebView）での、コメント位置と最下部へのショートカット

くらいです。Simple is best.

アプリのイメージはこんな感じです↓

![screen568x568.jpeg](https://qiita-image-store.s3.amazonaws.com/0/5616/a7f65ccb-82dc-9761-1f46-17f50cea6bf8.jpeg "screen568x568.jpeg")

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/f15d60de-025f-1477-35aa-2053212a2dc3.png "cap.png")

まだまだ手を入れないとならないところがたくさんありますが、とりあえず動く、使える状態にはできました。
よかったらインストールしてみてください(ㆆᴗㆆ)
mac osx mavericks にrbenvとrubyとrailsをインストールする手順



App Storeからxcodeをダウンロードしインストールする。インストール後一旦xcodeを起動しライセンスに同意する。
その後xcode-select --installを実行する

```

http://brew.sh/

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

$ brew doctor

$ brew install git

$ brew install rbenv ruby-build

$ rbenv install -l

```

※最新版を選択

```

$ rbenv install 2.3.0

$ rbenv rehash

$ rbenv global 2.3.0

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

zshの場合
echo 'eval "$(rbenv init -)"' >> ~/.zshrc


```


シェルを再起動

```

$ brew install openssl
$ brew install readline


$ sudo gem install rails 


```

シェルを再起動
AWS使用時に便利なTeraTerm 公開鍵で自動ログイン

Tera Term
公開鍵で自動ログインするサンプル

```
;============================================ 
; Filename    : ssh2-connect.ttl 
; Description : SSH Auto login 
; Author      : Azusa Nakano
; Created     : 2014/04/11 
; modified    : 
;============================================ 
;; ユーザ名／パスワード設定 
hostname= '接続先IPアドレス' 
username= 'ユーザ名'
passfile= 'C:\password.dat' 
keyfile = 'C:\id_rsa' 
;============================================ 
;; パスワード取得 
getpassword passfile username password
 
;; コマンド組立て 
cmd = hostname 
strconcat cmd ':22 /ssh /2 /auth=publickey /user=' 
strconcat cmd username
strconcat cmd ' /passwd=' 
strconcat cmd password
strconcat cmd ' /keyfile=' 
strconcat cmd keyfile
 
;; サーバへ接続 
connect cmd
 
;; マクロ終了 
end
```
Rails with Liquid

[Liquid](http://liquidmarkup.org/)は`Ruby`で記述されたテンプレートエンジンです。
[Shopify](http://www.shopify.com/)や[Jekyll](http://jekyllrb.com/)などで利用されています。

Liquidは`ERB`とは違い、独自のレキサーとパーサーで解析をするので
エンドユーザーにテンプレートの編集機能を安全に提供できます。
(Shopifyでは[Email Templates](http://docs.shopify.com/manual/settings/notifications/default-templates)で利用されています。)

# Example

**Rails**での簡単な使い方を紹介します。
([Liquid Designers](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers)や[Liquid Output](http://docs.shopify.com/themes/liquid-basics/output)が参考になりました。)

## Gemfile

**Gem**に`liquid`を追加します。

```ruby
gem 'liquid'
```

## Models

**Model**の`liquid_methods`にテンプレートで利用するキーワードを追加します。

### product

**liquid_methods**に指定したキーワードのみがテンプレートで利用できます。(安心ですね!)

```ruby
class Product < ActiveRecord::Base
  liquid_methods :title, :vendor, :variants
  has_many :variants
end
```

### variant

`Product`と`Variant`は1対多の関係です。(Railsではおなじみですね!)

```ruby
class Variant < ActiveRecord::Base
  liquid_methods :title, :price
  belongs_to :product
end
```

## Controllers & Views

**GET /catalogs**でヒアドキュメントのテンプレートがレンダリングされます。
(オリジナルの[Example snippet](http://liquidmarkup.org/)を参考にしています。)

```ruby
class CatalogsController < ApplicationController
  before_action :set_products, only: [:index]

  def index
    render text: Liquid::Template.parse(template).render('products' => @products).html_safe
  end

  private
    def set_products
      @products = Product.all
    end

    def template
      <<-EOS
      <ul id="products">
        {% for product in products %}
          <li>
            <h2>{{ product.title }}</h2>
            <ul>
              {% for variant in product.variants %}
                <li>
                  <h3>{{ variant.title }}</h3>
                  Only {{ variant.price | format_as_money }}
              {% endfor %}
            </ul>
          </li>
        {% endfor %}
      </ul>
      EOS
    end
end
```

**コードは[GitHub](https://github.com/ogom/nsume-rails-example/blob/master/app/controllers/catalogs_controller.rb)に公開しています。**

# Tips

## Editor

**Sublime Text**にはパッケージの[Liquid Syntax](https://github.com/siteleaf/liquid-syntax-mode)でシンタックスハイライトが利用できます。
ウェブサイトのスクリーンショットを比較して見た目が完全に同一であることを自動でテストする

ImageMagick のコマンドで 2 つの画像を比較して差分を抽出できる機能があることを知りました。

2枚の画像のdiff（差分）を超簡単に調べる方法
http://blog.mirakui.com/entry/20110326/1301111196

これをテストで使ってみたくて下記のように RSpec を作りました。

```screenshotdiff_spec.rb
require 'watir-webdriver'

describe "Screenshot" do
  before do
    @browser = Watir::Browser.new :ff
  end

  it "development and production are the same" do
    @browser.goto "http://development.example.com"
    @browser.screenshot.save "development.png"

    @browser.goto "http://production.exapmle.com"
    @browser.screenshot.save "production.png"

    `composite -compose difference development.png production.png diff.png`
    result = `identify -format "%[mean]" diff.png`
    expect(result).to eq("0\n")
  end

  after do
    @browser.close
  end
end
```

### 説明

Firefox を起動して `http://development.example.com` と `http://production.exapmle.com` をそれぞれ開き、それぞれのスクリーンショットをカレントディレクトリに保存します。保存した 2 つのスクリーンショットを `composite` コマンドを使って画像の差分を可視化します。そして `identify` コマンドを使って差分の有無を検出し、その結果を `expect` でテストします。

### 気がついたこと

- ウェブサイトのほとんどは動的にコンテンツが生成されており全く差分が無いことはまず無い。なので、自動テストに組み込むのであれば、ある程度の差分を許すようなアプローチが必要。(画像認識？)
- selenium-webdriver でも試したが、画像が完全に同一となるような同じ URL のスクリーンショットを撮っても、ロードのタイミングのせいなのか差分が発生してしまった。watir-webdriver だとうまくスクリーンショットが撮れた。
screen で Ctrl+<left> Ctrl+<right> でスクリーン間の移動

# screen で Ctrl+← Ctrl+→ でスクリーン間の移動

## 前提条件
 * OSは ```Mac OS X``` を想定
 * システム設定 > キーボード > Mission Control で ```^ ←``` ```^ →``` を切ってある、もしくは変更してあること。
 * キーボードは Apple Wireless Keyboard を想定
 * 下記を ```.screenrc``` に追加するだけ

```
bindkey ";5C" next
bindkey ";5D" prev
```

## Mac から リモートの Debian 環境にログインした場合

 ```.screenrc``` にはこっちを適用しておく

```
bindkey "^[[5C" next
bindkey "^[[5D" prev
```
ページのタイトルとURLを簡単に貼る

Chromeの拡張 [Create Link](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm)を使いましょう。

設定をこんなこのようにしておくと
クリックひとつで開いてるページのタイトルとURLをクリップボードにコピーできます。

| Name     | Format             | Filter |
|:--------:|:------------------:|:------:|
| Markdown | `[%title%](%url%)` |        |


↓こういうリンクが簡単に貼れるようになります。

* [ホーム - Qiita](http://qiita.com/)
O/RマッパーのTengを使ってみた

ちょこっとしたものを書くのに生DBIは面倒なのでO/Rマッパーというものに挑戦してみた。

create tableする前にTeng::Schema::Loader->loadしてそのままinsertしようとすると"Table definition for user does not exist (Did you declare it in our schema?)"みたいなエラーになってハマった。テーブル情報更新したらリロードしないといけない。

```bash
// 必要なモジュールをインストール
$ cpanm DBI
$ cpanm DBD::SQLite
$ cpanm Teng
```

```pl:teng.pl
use strict;
use warnings;
use Teng;
use Teng::Schema::Loader;
use DBI;
use Data::Dumper;

exit main();

sub main
{
  # SQLiteはオンメモリ上でもできる
  #my $dbh = opendb(":memory:");
  my $dbh = opendb("a.db");

  unless (check_table($dbh, "user")) {
    init_table($dbh);
  }

  my $teng = Teng::Schema::Loader->load(
    dbh => $dbh,
    namespace => "MyApp::DB",
  );

  # INTEGER PRIMARY設定しているとidは連番が自動で振られる
  my $row = $teng->insert(user => {
    #id   => 1,
    name => "test1",
    age  => 26,
  });
  warn Dumper $row->get_columns;

  $dbh->commit;
  closedb($dbh);

  return 0;
}

sub init_table
{
  my ($dbh) = @_;

  my $teng = Teng::Schema::Loader->load(
    dbh => $dbh,
    namespace => 'MyApp::DB',
  );
  $teng->do(q{
    CREATE TABLE user (
      id   INTEGER PRIMARY KEY,
      name TEXT,
      age  INTEGER
    )
  });
  return;
}

sub check_table
{
  my ($dbh, $tbl) = @_;
  my $query = "select count(*) from sqlite_master where type='table' and name='$tbl'";

  # この4行はselectrow_arrayrefでできる
  #my $sth = $dbh->prepare($query);
  #$sth->execute;
  #my $row = $sth->fetch();
  #$sth->finish();

  my $row = $dbh->selectrow_arrayref($query);
  return $row->[0];
}

sub opendb
{
  my ($dbfile) = @_;
  my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
  $dbh->{AutoCommit} = 0;
  return $dbh;
}

sub closedb
{
  my ($dbh) = @_;
  return $dbh->disconnect;
}

```

実行するたびにidが増えていく

```bash
$ perl teng.pl
$VAR1 = {
          'name' => 'test1',
          'id' => 1,
          'age' => 26
        };
$ perl teng.pl
$VAR1 = {
          'name' => 'test1',
          'id' => 2,
          'age' => 26
        };

$ sqlite3 a.db "select * from user"
1|test1|26
2|test1|26
```


# 参考
* [Teng - very simple DBI wrapper/ORMapper - metacpan.org](https://metacpan.org/pod/Teng)
* [クイックスタート — Teng-Doc 0.01 documentation](http://walf443.github.io/teng-doc/quickstart.html)
* [PerlのO/RマッパーTengの簡単なリファレンス | UCWD-Studio.【ホームページ制作 / 京都】](http://ucwd.jp/blog/707)
* [INTEGER PRIMARY KEYが設定されたカラム - テーブルの作成 - SQLite入門](http://www.dbonline.jp/sqlite/table/index7.html)
* [SQLiteでテーブルが存在するか確認したい](http://o-tomox.hatenablog.com/entry/2013/09/28/194634)
* [SQLiteで学ぶデータベース操作の基礎 - サンプルコードによるPerl入門 ～ Perlで楽しくプログラミングを学ぼう ～](http://d.hatena.ne.jp/perlcodesample/20091121/1246679588)
* [1 行だけの結果を返す SQL 文](http://program.station.ez-net.jp/special/perl/dbi/sqlite.asp)
* [tokuhirom/teng-handbook](https://github.com/tokuhirom/teng-handbook)
ubuntu13.10にJenkins+Nginxをインストールしたメモ


## 概要
ubuntu Server 13.10 にJenkinsとNginxをインストールしました。
インターネット上に公開するのでBasic認証もかけました。

## 手順
### 各種インストール

```
$ sudo apt-get install jenkins
$ sudo apt-get install nginx
$ nginx -v
$ nginx version: nginx/1.4.1 (Ubuntu)
```

### Nginxのconfigを編集

```
$ sudo vi /etc/nginx/sites-enabled/default 
```
serverディレクティブの末尾に以下を追加する。

```
server {
    
	# ...省略...

    location /jenkins {
        proxy_pass http://localhost:8080;
    }
}
```

### Nginxを起動しようとすると怒られる

```
$ sudo service nginx start
sudo: unable to resolve host <hostname>
```

<hostname>のIPアドレスが解決できないのでhostsを修正する。

```
$ sudo vi /etc/hosts
```

```
#127.0.0.1	localhost # コメントアウト
127.0.0.1	<hostname>.localhost	<hostname>
```

### Jenkinsの設定

```
$ sudo vi /etc/default/jenkins 
```

末尾に``` --prefix=/jenkins``` を追加する。

```
JENKINS_ARGS="$JENKINS_ARGS --preferredClassLoader=java.net.URLClassLoader --prefix=/jenkins"
```

```
$ sudo service jenkins restart
```

### トラブルシューティング

接続できない場合、ポートの状態をnmapで確認する。

```
$ sudo apt-get install nmap

$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-11 00:24 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00022s latency).
rDNS record for 127.0.0.1: CI01.localhost
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
8080/tcp open  http-proxy

$ nmap xxx.xxx.xxx.xxx

Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-11 00:25 JST
Nmap scan report for xxx.xxx.xxx.xxx
Host is up (0.00036s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
```

localhostのみ8080がopenされ、外部（xxx.xxx.xxx.xxx）には80のみopenされていることがわかります。

私の場合は、Nginxの設定ファイル/etc/nginx/site-enable/defaultがあるのに、別の設定ファイル/etc/nginx/conf.d/default.confを作って、そっちにproxy設定を書いていたのでserverディレクティブ全体が上書きされてしまっていたと思われます。

### Basic認証をかける

パスワードファイルを作成する。

```
$ sudo apt-get install apache2-utils

$ cd /etc/nginx
$ sudo htpasswd -c htpasswd <username>
```

```
$ sudo vi /etc/nginx/sites-enabled/default 
```

locationディレクティブに以下を追加する。

```
server {
    
	# ...省略...

    location /jenkins {
        proxy_pass http://localhost:8080; # 追加
        auth_basic "Restricted";          # 追加
        auth_basic_user_file htpasswd;
    }
}
```

```
$ sudo service jenkins restart
```

### 参考

- [Ubuntu 12.04 LTS に Jenkins をインストール](http://jnst.hateblo.jp/entry/2013/10/03/123012)
- [「sudo: unable to resolve host ***」と怒られたときの対処法](http://d.hatena.ne.jp/sakurako_s/20100916/1284599963)
- [Nginx でベーシック認証をかける手順メモ](http://bekkou68.hatenablog.com/entry/2013/10/05/232451)
【JavaScript】記述方法別の実行タイミングについて

JavaScriptを記述する方法はいくつか存在するが、それぞれ実行タイミングが異なる。
ここではそれについてまとめる。


## \<script>タグ内に記述する
\<script>タグ内にJavaScriptを記述した場合、スクリプトが実行されるのは\<script>タグが解析された直後となる。そのため\<script>タグ以降のDOM要素を操作することはできない。

```html:html
<body>
<div id="a"></div>
<script>
  var a = document.getElementById('a');
  console.log(a != null); // true
  var b = document.getElementById('b');
  console.log(b != null); // false
</script>
<div id="b"></div>
</body>
```
また、外部のJavaScriptファイルを読み込んだ場合も同様で、\<script>タグ解析後にファイル読み込みが開始され、読み込み終了後スクリプトが実行される。

```html:html
<div id="a"></div>
<script type="text/javascript" src="demo.js"></script>
<div id="b"></div>
```
```js:demo.js
var a = document.getElementById('a');
console.log(a != null); // true
var b = document.getElementById('b');
console.log(b != null); // false
```


##onloadイベントハンドラとして記述する
この場合はページ読み込み完了後、すなわちDOMツリー構築、\<img>タグによる画像ファイルの外部リソースのロードなどすべて完了した時点でスクリプトが実行される。

```js:demo.js
// htmlは先程と同じ
window.onload = function() {
	var a = document.getElementById('a');
	console.log(a != null); // true
	var b = document.getElementById('b');
	console.log(b != null); // true <- 注目
};
```
そのため、画像ファイルなどのリソースが大きい場合、スクリプトの実行までに必要以上の時間がかかる可能性がある。


##DOMContentLoadedイベントに対してリスナを登録する
DOMContentLoadedはDOMツリー構築完了直後、画像ファイルなどの外部リソースが読み込まれる前に発火するイベントである。このイベントに対してリスナ登録することで、イベント発火時にスクリプトを実行する。

```js:demo.js
document.addEventListener('DOMContentLoaded', function() {
	var a = document.getElementById('a');
	console.log(a != null); // true
	var b = document.getElementById('b');
	console.log(b != null); // true
});
```
なお、DOMContentLoadedは、IE9、Safari3.1以降でないと対応していない模様。
[DOMContentLoaded - MDN](https://developer.mozilla.org/ja/docs/Web/Reference/Events/DOMContentLoaded)


##動的ロード
script要素を生成することにより、動的にJavaScriptファイルをロードすることのできる記述方法。JavaScriptファイルのダウンロードから実行開始まで、その他の処理をブロックしないという特徴がある。

```js
var script = document.createElement('script');
script.src = 'test.js';
document.body.appendChild(script);
```
なお、この記述方法は、クロスドメインでデータ取得を行う場合に利用されるJSONPという仕組みの実現にも使われる、らしい。。。


##参考書籍
[パーフェクトJavaScript](http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88JavaScript-PERFECT-SERIES-%E4%BA%95%E4%B8%8A-%E8%AA%A0%E4%B8%80%E9%83%8E/dp/477414813X)
chef-soloでack入れようとしたらつまずいた


chef-solo&vagrantですぐに環境構築できるようにしたらack入れるときにつまずいたのでメモ。

##ackコマンド
grepよりも高速かつきれいに表示してくれてとても便利！
特に意識せずに

`$ ack 検索したい文字列`

とするだけでそのディレクトリ配下のファイルからtestという単語が検索されます。

grepより文字数少なくてすてき！

不要そうなファイルは検索対象から省いてしまうので、
-aオプションをつけると全ファイル検索してくれます。

##ackをchefから入れてみた
ackにはお世話になっていたので、vagrantにも入れようとしました。
chefを実行させたときのコマンドは

`$ knife solo cook -V 192.168.33.10`

しかし、ackを入れるときに下記のエラーが出力されどうしてもつまずいてしまう。。


	Errno::ENOENT
	-------------
	No such file or directory - create symlink
	
	
	Resource Declaration:
	---------------------
 	In /home/vagrant/chef-solo/cookbooks-2/ack/	recipes/default.rb
	
 	11: execute "create symlink" do
 	12:   case node[:platform]
	13:   when "debian","ubuntu"
 	14:     if !node[:ack][:symlink_as].nil? && 	node[:ack][:symlink_as].length > 0
 	15:       command "ln -nsf /usr/bin/ack-grep 	#{node[:ack][:symlink_as]}"
 	16:       creates "#{node[:ack][:symlink_as]}"
	17:      end
 	18:   end

これで結構悩んでたんですが、
原因はrecipeの記述ミスzで、11行目と18行目を削除したら動きました。
create symlinkというコマンドが間違っていた模様。

以上です。




PS.chefを学習するときに特にお世話になったのはこちら。

[chef-solo - Chefを読んで実行するための全知識 - Qiita](http://qiita.com/TsuyoshiUshio@github/items/89030baca68b05a9783d)
細かいことまで載っていてとても参考になりました。

[knifeによるChefの実行 - Qiita](http://qiita.com/kidachi_/items/b222fb2892e6108c46d5)
こちらはエラーが出たときに参考にしました。
brew updateのエラー回避


これで解決

```lang:ターミナル
$ cd $(brew --prefix)
$ git fetch origin
$ git reset --hard origin/master
```

## 参考にしたサイト

[ヾ(oﾟωﾟo)ﾉﾞbrew updateでエラーでたった[Homebrew]](http://qiita.com/harapeko_wktk/items/f4f44ddb5d3912e15ea2)


[What is the meaning of git reset --hard origin/master?](http://stackoverflow.com/questions/15432052/what-is-the-meaning-of-git-reset-hard-origin-master)
Yesodで作ったWebアプリをHeroku上でビルドしようとしても15分以内に終わらないときは


# Herokuの15分ルール

[YesodアプリをHerokuにデプロイする](http://qiita.com/jabaraster/items/c18b1206939749489906)というトピックを書きましたが、難関があります。
Herokuは、ビルドが15分経っても終わらないとデプロイを失敗させてしまうのです。
そして、Yesodで作ったアプリケーションは、ビルドに15分以上かかるのは珍しいことではありません・・・

# ビルドサーバ「Anvil」

15分ルールに対抗するには、Anvilというビルドサーバが使えます。
[heroku-buildpack-ghcのページに書いていました](https://github.com/begriffs/heroku-buildpack-ghc#beating-the-fifteen-minute-build-limit)。

ビルドサーバはHerokuでのビルドとは関係ないので、15分ルールに縛られないようです。


# ビルドサーバでのビルド〜デプロイの流れ

概ね次のような流れになります。

1. ビルドサーバにプロジェクトをアップロード
2. ビルドサーバ上でビルド
3. 2で生成されたslug(Heroku用語で、アプリ実行に必要なファイル群のこと)をビルドサーバ上に保存
4. ビルドサーバ上のslugをHerokuにリリース


# ビルド〜デプロイ手順

## 前提
* ```Heroku Toolbelt```が導入されていること

## 準備

ビルドサーバでのビルドには、```Heroku Toolbelt```をプラグインで拡張する必要があります。

```sh
heroku plugins:install https://github.com/ddollar/heroku-anvil
```

これで```heroku build```コマンドと```heroku release```コマンドが使えるようになります。

これらのコマンドの使い方の詳細は[こちら](https://github.com/ddollar/heroku-anvil)。

## ビルド〜デプロイを一発で行う

Herokuにデプロイするプロジェクトのディレクトリで、次のコマンドを実行します。
Yesodアプリをデプロイする想定なので、buildpackを指定します。

```sh
heroku build -r -b https://github.com/begriffs/heroku-buildpack-ghc.git
```

運が良ければ（時間こそかかりますが）これ一発でデプロイは完了です！
なんという便利さ！

## ビルドに失敗した場合
ビルドに失敗することは、よくあります。Yesodアプリのデプロイは安定しないのです。
あきらめずに何度もビルドしましょう。


## ビルドには成功したがデプロイに失敗した場合
slugは作成されたがデプロイに失敗することも、よくあります。Yesodアプリのデプロイは安定しないのです。

この場合はビルドをスキップしてslugのリリースだけを次のコマンドで行います。

```sh
heroku release <slugのURL>
```

なお「ビルドに成功している！」というのは次の出力を見て判断出来ます。

```
Putting cache... done 
Creating slug... done 
Uploading slug... done 
Success, slug is https://api.anvilworks.org/slugs/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.tgz 
Releasing to metshop... ...................................
```

```Success, slug is https://…```で始まる行が出力されていれば、ビルドには成功しています。


# ２回目以降のビルド
２回目のデプロイは、平常どおりGitを通して行えるそうです。

```sh
git push heroku
```

前回デプロイのslugがキャッシュされているため、ビルド時間が短縮され15分かからなくなる・・・と[heroku-buildpack-ghcのページには書かれています](https://github.com/begriffs/heroku-buildpack-ghc#beating-the-fifteen-minute-build-limit)。
が、実感としてはあまり変わらない気がしています。

# 課題
ビルドサーバ上のGHCのバージョンを指定する方法が見付かっていません。

# まとめ
ビルドサーバでのビルドとデプロイは、Yesodアプリをローカルでビルドしてのデプロイを試みていた時に比べると、まさに比べ物にならない簡単さです。

不安定なところがあり長時間待たされたあげく失敗に終わってがっかりすることも多いのですが、Yesod導入の困難を乗り越えた開発者の方であれば、これくらいのことは蚊に刺されたほどにも感じないのではないでしょうか。
MavenプロジェクトでJDKが1.5になってしまう問題を解決する設定


# 問題
EclipseでMavenプロジェクトを作成した場合、デフォルトでJRE System Libraryが1.5になる。
JDK1.7を利用して開発するので、JRE System Libraryを1.7にしたい。
プロジェクトのプロパティでビルドパスに1.7を指定すれば、一旦解決しているように見えるが、
「Maven > プロジェクトの更新」をすると、また1.5に戻ってしまう。

# 解決策
デフォルトが1.5になってしまうこと自体を変更する方法はわからないが、pom.xmlで明示的にビルドするJDKを指定すれば解決する。
例えば、以下のように記述する。

```pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.sample</groupId>
	<artifactId>foo</artifactId>
	<version>1.0.0</version>
	<packaging>war</packaging>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

```
GAE/jでGCS Default Bucketを使う


GAEからGCSを利用する場合、Bucketを作成する必要がありますが、DefaultのBucketを作成することができます。
Default BucketはDevelopers ConsoleのApp Engine Settingのボタンから作成します。

<img width="445" alt="Screen Shot 2016-03-04 at 18.13.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/1f5b76ee-5f4a-f171-a617-944175b08a19.png">

## GCS Default Bucket のメリット

### アプリごとにDefaultBucketを取得できる

Bucket名はGCS全体でUniqueである必要があるため、テスト用など複数の環境がある場合、それぞれ別のBucket名を指定する必要が出てくる。
しかし、DefaultBucketを利用すれば、アプリごとにUniqueな名前を出してくれるので、そこを気にしなくてよくなります。

### 5GBの無料枠がある。
Blobstoreは5GBの無料枠があったのですが、GCSにはありませんでした。
しかし、DefaultBucketについては、Blobstoreと同じく5GBの無料枠が入るようになりました。
ただし、Billingは設定しないと、GCSを使うことはできません。

## Default Bucket Name の名前と取得方法

DefaultBucketName は {appId}.appspot.comになります。
また、以下で取得することができます。

```Java
AppIdentityServiceFactory.getAppIdentityService().getDefaultGcsBucketName()
```

Default Bucketも他のBucketと同じようにCloud Consoleで見ることができます。
ACLの設定なども他のBucketと同様に行なうことができます。

上記で取得できる以外は、他のBucketと特に違いはないようです。

Bucketを削除したりできるのかなんかは、怖くて試してないです！
「レガシーコード改善ガイド」読書メモ

「レガシーコード改善ガイド」という書籍を読みました。考え方から具体的な手法まで説明されていて良い本でした。特に気になった部分について、自分の解釈した内容をメモしておきたいと思います。

#書籍概要
![PaperCamera2014-04-10-23-30-58_041014_113820_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/24511/a3d5de1d-51f0-b728-90c3-2744580b414a.jpeg)

[レガシーコード改善ガイド (Object Oriented SELECTION)](http://www.amazon.co.jp/exec/obidos/ASIN/4798116831/)
作者: マイケル・C・フェザーズ
発売日： 2009/7/14

#考え方
##なぜテストが必要か？
まずは、始めの数ページ目に書かれていた次の言葉にハッとさせられました。

>テストのないコードは悪いコードである。どれだけうまく書かれているかは関係ない。どれだけ美しいか、オブジェクト指向か、きちんとカプセル化されているかは関係ない。テストがあれば、検証しながらコードの動きを素早く変更することができる。テストがなければ、コードが良くなっているのか悪くなっているのかが本当にはわからない。

テストの粒度としては、メソッドレベルの単体テストを想定。実行時間が短く、エラー個所の特定がしやすく、コードが確実に動作したことを確認（カバレッジ）できることが重要。

##作業時間
テストケースのコーディングは、単純に作業量が増える。

これは、次回のイテレーション時に対する投資であり、次のイテレーションが発生したタイミングで、回収できる。次回がなければ、回収できないですね。

あと、書かれていませんでしたが、開発チーム/環境によっては、次回イテレーションまで、テストコードを保持し続けるのが、手間だったりする気がします。

手動でテストするほうが早いこともしばしばある。ただし、コードを変更するたびに再テストすることを考えると、トータルの作業コストは考える余地がある。

##テストの仕掛け
テスト対象のコードに対して、次のような仕組みが必要となる。

* 検出：テスト結果にアクセスできること。
* 分離：テスト対象を、テスト対象外の処理から切り離して、動作させることが可能であること。

検出と分離をするために、テスト用に動作を切り替えられる場所を「接合部」と呼び、次の種類がある。

* プリプロセッサ接合部：CやC++言語のようなプリプロセッサ機能を使う方法（頻度「少」）
* リンク接合部：CやC++言語ではリンカ、JavaではCLASSPATHで切り替える方法（頻度「少」）
* オブジェクト接合部：クラス/インターフェース継承、メソッドのオーバーライド/オーバーロードを活用する方法（頻度「大」）

テストコード作成を支援してくれるツール

* 自動リファクタリングツール：Eclipseにもいろいろなリファクタリング機能がありますね。
* モックオブジェクト：Mockito／EasyMock／jMockなどありますね。
* 単体テストハーネス：JUnit／NUnitなどありますね。
* カバレッジツール：書籍ではカバレッジ確認用のツールについて話がなかったのですが、、、。

今日はここまでとします。
次回は、実際のテストコードについて、まとめたいと思います。
Confluence の 「作成」ボタンが消えた


こんにちは、はじめて kobito で qiita に投稿します。


コンフルエンスっていいですよね。

いまいる組織に導入するという話しが決まりましてセッティングしていたら、「作成」ボタンとか、左側にあるサイドバーが消えてしまうという現象がおきてしまいました。

ここが消えてしまうと、そこそこ不便で困ります。

![](https://www.evernote.com/shard/s31/sh/c4711fff-48d5-48be-b0c4-f9d41ea3c0d6/8aae84642263c7d855f43f4fdf9853bf/deep/0/情報システム構築学講座-ホーム---ゼミ---Confluence---岩手県立大学佐々木研究室.png)


消してしまうオプションつけちゃったかなーとか、テンプレートいじったから消してしまったのかなーとか思いましたが、どうもConfluenceが不正に終了したときに残ってしまった プラグインキャッシュが悪さをしていたようでした。

（この部分の実装はプラグインという形で提供されているんですね！）


復旧手順は次の通りです

0. Confluence サーバに ssh ログインする

1. Confluence を停止する  
  
  <pre>
$ cd /path/to/confluence
$ sudo ./bin/stop-confluence.sh
#（しばらく時間がかかります）
</pre>

2. キャッシュを消す  

  <pre>
# data を置いているディレクトリ に移動
$ cd /path/to/confluence-data
# キャッシュ削除（一応、実体は残しておく）
$ sudo mkdir plugin_bak
$ sudo mv plugins-temp/ plugins-cache/ plugins-osgi-cache/ plugin_bak/
</pre>

3. Confluence を再起動する  

  <pre>
$ cd /path/to/confluence
$ sudo ./bin/start-confluence.sh
（しばらく時間がかかります）
</pre>

4. 復旧 :)


# AWS EC2 マイクロインスタンス では動かさないようにしましょう

今回のエラーの根本は、貧弱な環境でコンフルエンスを起動したために、強制終了してしまい、データが不整合を起こしてしまったためでした。


コンフルエンスのインストールに必要な[サーバー要件](https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=50398528) だと、必要メモリは 512MB でマイクロインスタンスが613MBで、ギリギリーいけるかななんて考えていた私が甘かったです。
Macのハードウェアのスペックをコマンドラインから確認する


```bashなど
$ system_profiler SPHardwareDataType 
```
自分のはこんなのが出ました。

```
Hardware:

    Hardware Overview:

      Model Name: MacBook Air
      Model Identifier: MacBookAir6,1
      Processor Name: Intel Core i7
      Processor Speed: 1.7 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 4 MB
      Memory: 8 GB
```
[アニメ放送開始記念]ごちうさスキンのエディタができたよ

LightTable用の「ご注文はうさぎですか？」のスキン＆テーマです～（ver. 0.0.1)

![rabbit1.jpg](https://qiita-image-store.s3.amazonaws.com/0/40558/4265c492-a944-a588-e42f-cc91320168c3.jpeg)

![rabbit2.jpg](https://qiita-image-store.s3.amazonaws.com/0/40558/f660eaee-4a38-96f1-13a0-6252fdbfe0ee.jpeg)

![rabbit3.jpg](https://qiita-image-store.s3.amazonaws.com/0/40558/3db7dbe8-0bae-01b3-a87e-e15af7d44efe.jpeg)

![rabbit4.jpg](https://qiita-image-store.s3.amazonaws.com/0/40558/1a6de074-3455-3014-a36a-15e13c65e409.jpeg)

![rabbit5.jpg](https://qiita-image-store.s3.amazonaws.com/0/40558/1a71fe14-1b6c-3d5b-4eb6-e8dff453aadf.jpeg)

# インストール方法

1. [LightTable](http://www.lighttable.com/)をインストール
2. [GitHubのページ](https://github.com/kurogelee/lighttable-theme-rabbit-house)の右側の「Download ZIP」からダウンロード
3. LightTableのpluginsフォルダにダウンロードしたZIPを解凍
4. LightTableを起動して、Ctrl-Spaceを押してCommandsを開きUser behaviorsを開く
5. スキン設定のところで`(:lt.objs.style/set-skin "rabbit-house-light-1")`のように設定（番号は1から5まで）
6. テーマ設定のところで`(:lt.objs.style/set-theme "rabbit-house-light")`を設定

# etc

技術的な話題は[後ほど](http://qiita.com/kurogelee/items/ba03d173ba412adac6c4)。
~~Ctrl-Alt-Shift-1などのショートカット設定もしてるけどバグあり・・・~~
2014/04/12: Ctrl-Alt-Shift-1,2,3,4,5で背景変更したときのバグ直しました。
AlloyのModelでREST APIからデータを取得する


[Githubで公開されていたREST API用のAdapter](https://github.com/viezel/napp.alloy.adapter.restapi)を利用してREST APIからデータを取得します。

# 実装方法
## Adapterを導入
PROJECT_DIRECTORY/app/asset/alloy/syncにrestapi.jsを配置する。

## ModelにAdapterを設定する
Modelで導入したAdapterを使用するように設定します。adapterとURLのあたり。
jsを使っている方は読み替えてください。

``` user.coffee
exports.definition =
  config:
    columns:
      id: 'string'
      name: 'string'
    URL: 'http://localhost:8080/user'
    adapter:
      type: 'restapi'
      collection_name: 'user'
      idAttribute: 'id'
    extendModel: (Model) ->
      _.extends Model.prototype, () ->
      Model
    extendCollection: (Collection) ->
      _.extends Collection.prototype, () ->
      Collection
```

## REST APIからCollectionを生成
適当なControllerでREST APIからデータを取得します。

``` hoge.coffee
users = Alloy.createCollection 'user'

users.fetch
  success: () ->
    users.forEach (user) ->
      Ti.API.info user.id
  error: () ->
    Ti.API.info 'error'
```

# 困ったこと
ModelのなかでAlloy.CFGからリソースのurlを取ろうとしたんだけど取得できず。Alloy = requre 'Alloy'したらいける。
ModelではグローバルにAlloyが注入されてないんですね。
Sencha Cmdのビルド時にビルドするディレクトリーを変える方法


Sencha Cmdを使って作られたアプリケーションを

	$ sencha app build

としてビルドすると、通常は **build/production/[アプリケーション名]** にビルドされます。

![スクリーンショット 2014-04-10 21.21.48.png](https://qiita-image-store.s3.amazonaws.com/0/24863/2b94cbea-c8dc-4c72-304b-9e044294f688.png "スクリーンショット 2014-04-10 21.21.48.png")

これを変えるには、**.sencha/app/production.properties**に、
build.dirというプロパティを設定します。

    build.dir=${workspace.dir}/hogehoge

例えば上記の一行を追加してビルドすると

![スクリーンショット 2014-04-10 21.34.16.png](https://qiita-image-store.s3.amazonaws.com/0/24863/e923df67-b02e-d5b5-316c-24ac6a249983.png "スクリーンショット 2014-04-10 21.34.16.png")
	
ワークスペース下の**hogehoge**というディレクトリーにビルドされます。
FuelPHPでmustacheを使う(インストール)


FuelPHPのParserの情報を探すと、Twigの事ばかりでmustacheを使用したという情報があまりない。。。

## mustache.phpのインストール

*前提条件として、FuelPHPのインストールは完了しているものとする。*
*PROJECT_ROOT/にfuelディレクトリーが存在するものとする。*

**1.**
`mustache.php`のGitHubページにアクセス。
[https://github.com/bobthecow/mustache.php/wiki](https://github.com/bobthecow/mustache.php/wiki)

**2.**
**Installation**の記述を、`fuel`ディレクトリと同階層の`composer.json`に追記する。

```json:PROJECT_ROOT/composer.json
"require": {
  "mustache/mustache": "~2.1" // requireにここだけ追記
}, 
```

**3.**
`composer`を使用してインストールする。

`$ php PROJECT_ROOT/composer.phar update`

**4.**
`mustache.php`を有効にする。

```php:PROJECT_ROOT/fuel/app/config/config.php
// コメントアウトを解除して、結果こうなれば良い
'always_load' => array(  'packages' => array(    'parser'  )),
```

これで導入は完了するはず。
俺はインストールとか無茶苦茶苦手な人だけど、すんなりいけた。
EffectiveJava読書会1日目

関連リンク
http://d.hatena.ne.jp/amachang/20100215/1266245521

## 項目1 コンストラクタの代わりにstaticファクトリーメソッドを検討する
- コンストラクタ

```java:Car.java
public class Car {
    //クラス変数
    public static int createdCar = 0;
    //インスタンス変数
    public int adultNum;
    //車を作るときのコンストラクタ
    Car() {
        this.adultNum=4;
        Car.createdCar += 1;
    }
    //adultNum人乗りの車を作るコンストラクタ
    Car(int adultNum) {
        this.adultNum = adultNum;
        Car.createdCar += 1;
    }

    public static Car newInstance() {
        this();
    }
    
}
```
- staticメソッド

≒クラスメソッド：クラスに属するメソッド。クラス一つにつき一つしか存在しない。インスタンスがなくても使える
↔インスタンスメソッド：インスタンスに属するメソッド。クラス一つにつき複数存在する。インスタンスがないと使えない

- コレクションフレームワーク

HashMap, ArrayListとか

### Good
##### 好きな名前を付けられる（コンストラクタのオーバーロードはわかりづらい）
##### オブジェクトの生成が制御出来る（オブジェクトの生成はコスト）
オブジェクト生成の制御はenumで！
##### 戻り値の型のサブタイプのクラスを返せる
コンストラクタだとそのクラス自体しか返せない
##### オブジェクトの生成が（場合によっては）シンプル（guavaライブラリ）
型パラメータ２回も書くのしんどいです＞＜

### Bad
##### privateなコンスタクタを持つクラスのサブクラス作れない
コンストラクタでやっても同じなような？
##### 他のメソッドと名前で区別できない
ファクトリメソッドだよ！ってわかる名前を付けよう
valueOf, of, getInstance, newInstance, getType, newType

- コンポジション

http://d.hatena.ne.jp/nabnab/20140118

## 項目2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する
名前付き引数っぽくてかっこいい！
## 項目3 privateのコンストラクタかenum型でシングルトン特性を強制する
##### シングルトンはテストしづらいか使っちゃだめ
##### シングルトン作るならenum型使うのがベスト
```java:singleton.java
public enum PropertiesCarrer {
    INSTANCE("env.properties");
    
    private bundle;
    private String name;
    
    public PropertiesCarreer(name) {
        bundle = ResouceBundle.getBundle(name);
    }
    public ResouceBundle getBundle() {
        return bundle
    }
}
PropertiesCarrer.INSTANCE.getBundle();
```
## 項目4 privateのコンストラクタでインスタンス化不可能を強制する
##### コンストラクタをprivateにして、インスタンス化させない(ex シングルトンとか、Utilクラスとか)
- UtilクラスとService

**Utilsクラス**
クラスメソッドのみからなるクラス、クラス名.メソッド()みたいに呼ぶ
ステートレス

**Serviceクラス**
インスタンスメソッドからなるクラス、インスタンス.メソッド()みたいに呼ぶ
ステートフルにできるが、、Spring, SAStrutsではシングルトンオブジェクトなので、ステートレスに作ったほうが良い

## 項目5 不必要なオブジェクトの生成を避ける
##### オブジェクトの生成はコストが掛かる
なんでもかんでもnewしない、オブジェクトを再利用を出来ないか考える
落とし穴→SimpleDateFormat
非スレッドセーフなオブジェクト（状態を持つオブジェクト）を複数スレッドで共有すると、バグる
→なんでもかんでも、再利用するべきじゃない
Mapとかは明らかに状態を持つってわかるけど、sdfは直感的に状態持つ感じしないよね。。。
## 項目6 廃れたオブジェクト参照を取り除く
オブジェクトはいつ死ぬと思う？
![alt](http://blog-imgs-53-origin.fc2.com/f/o/r/fore168/201208111416387dc.jpg)
Stackさんが配列で過去に作られた全てのオブジェクトへの参照をしてるので、参照カウントが0にならない。
なんでもかんでもnullにするのはだめ、
## 項目7 ファイナライザを避ける
C++ユーザー：えーデストラクタないのーダサーい
リソースの回収はfinallyでやってね
##### じゃあいつ使うの？
~~今でしょ~~リソースが解放されなかった時の保険として使われてるらしいよ


2日目（３章はこちら）↓
http://qiita.com/qwerty__/items/bb40ca48674bcbbe98bd
WildFlyでレスポンスヘッダからx-powered-byとserverを除去する

# 概要
セキュリティの観点から実運用時には、x-powered-byヘッダとserverヘッダを除去しておきたい。

# 環境
* WildFly 8.0.0.Final

# 内容

* standalone/configuration/standalone.xml を編集するだけ。


```xml:standalone.xml
<host name="default-host" alias="localhost">
  <location name="/" handler="welcome-content"/>
<!--
  <filter-ref name="server-header"/>
  <filter-ref name="x-powered-by-header"/>
-->
</host>
...
<!--
<filters>
  <response-header name="server-header" header-name="Server" header-value="Wildfly 8"/>
  <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow 1"/>
</filters>
-->
```
CoronaSDKでのピッカー的な何か

coronaには、widget.newPickerWheel()というピッカーホイールを表示させるヤツがあるんですけど、なんかいまいち使えないと思うんです。
僕はいっつも、2サイズ用意するのがめんどくさいので、config.luaに
width=640,
height=960
って書いちゃうんですよ。
めんどくさいし、そもそもiPhone3GSなんてもういいじゃないですか。

で、いろいろピッカーのやり方考えたり、独自実装してる方のソースとか探したんですが、なんかどうにもよくなくて……。

そして、そもそもピッカーホイールにこだわるほうがよくない、と思いました。
Androidのプルダウン押したときみたいに、全画面に出るのでいいんじゃないかな、と思って作りました。

これだけだと、だからなんだ、って感じですが…。
なんかもっと良いやり方とかあったら教えてください。

https://github.com/ozawachev/pickerModoki
iPadで使用可能アプリケーションを固定する

iOSのアクセスガイド機能を使う。

手順

```lang:手順
1. 「設定」>「一般」>「アクセシビリティ」>「アクセスガイド」の順にタップして、
　　アクセスガイドを設定
2. 設定したいアプリケーションを開く
3. ホームボタンをトリプルクリック
```

これで、指定したアプリケーション以外は開けない。
MojoliciousでJSON::XSを使う


## 目的

JSON::XSを使って、$c->render(json => ...)を高速化したい。

## Mojo::JSON::XSの設定

Mojo::JSON互換のインタフェースを実装したMojo::JSON::XSを使う。

```shell
$ cpanm JSON::XS Mojo::JSON::XS
```

以下のように、render(json => ...)で、このモジュールを使うように置き換える設定をする。

```perl:lib/MyApp.pm
use Mojolicious::Lite;
use Mojo::JSON::XS;

...

app->renderer->add_handler(json => sub {
    my ($self, $c, $output, $options) = @_;
    $$output = Mojo::JSON::XS->new->encode($options->{json});
});

...

```


## Mojo::ByteStreamが渡された時の対策

以下のように、
Mojo::ByteStreamのオブジェクトを渡すと、エラーが出てしまう。

```perl:myapp.pl
use Mojolicious::Lite;
use Mojo::JSON::XS;
use Mojo::ByteStream 'b';

app->renderer->add_handler(json => sub {
    my ($self, $c, $output, $options) = @_;
    $$output = Mojo::JSON::XS->new->encode($options->{json});
});

get '/' => sub {
    my $self = shift;
    $self->render(json => {name => b('太郎')});
};

app->start;
```

「encountered object 'å¤ªé', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing)」

のようなエラーが出る。

通常は、オーバーロードでMojo::ByteStreamのto_stringメソッドが呼び出されるが、
JSON::XSの内部ではblessed判定をしてエラーを出している。

JSON::XSは変換処理をするために、
内部で対象のオブジェクトに対してTO_JSONメソッドを呼び出している。

以下のようにMojo::ByteStreamにTO_JSONメソッドを追加する。

```perl:myapp.pl
use Mojolicious::Lite;
use Mojo::JSON::XS;
use Mojo::ByteStream 'b';

app->renderer->add_handler(json => sub {
    my ($self, $c, $output, $options) = @_;
    $$output = Mojo::JSON::XS->new->encode($options->{json});
});

{
    no strict 'refs';
    *{"Mojo::ByteStream::TO_JSON"} = sub {
        my $self = shift;
        $self->to_string; # 自身を文字列に変換する
    };
}

get '/' => sub {
    my $self = shift;
    $self->render(json => {name => b('太郎')});
};

app->start;
```

これで無事にエラーが出なくなる。
Railsでbelongs_toをクラス名とは別名で持たせたい

```rb
belongs_to :hoge
```

でbelongs_toを持たせるけどなんか違うよね、って言うときに使用。

```rb
belongs_to :yuusha, class_name: 'Devil'
```

彼は悪魔かもしれないが、彼らにとっては勇者なのだ。
みたいな
OpenSSL で証明書確認とか設定とか


忘れるからメモという名のコピペ

## 作成手順

- openssl コマンドを使って SSL 自己証明書を作成する。

	1. 秘密鍵（server.key）の作成
		
		openssl genrsa -aes256 1024 > server.key
	
	1. 公開鍵（server.csr）の作成
		
		openssl req -new -sha256 -key server.key > server.csr

	1. デジタル証明書（server.crt）の作成

		openssl x509 -in server.csr -sha256 -days 365 -req -signkey server.key > server.crt

	1. Apache の ssl.conf を編集する。

- 秘密鍵（server.key）の作成
	
	次のコマンドで秘密鍵（server.key）を作成する。

		openssl genrsa -aes256 1024 > server.key

	パスフレーズの入力を求められるので、任意のパスフレーズを入力する。

- Apache 起動時にパスフレーズの入力を省略する

	上記の方法で作成した秘密鍵（server.key）は、作成時に入力たパスフレーズで暗号化された状態になっているので、Apache を起動する時に復号化するためのパスフレーズの入力を求められる。

	1. 秘密鍵 (server.key) ファイルをあらかじめ復号化しておく方法

		- server.key の名前を変更する。

			# mv server.key server.key.back

		- 次のコマンドでパスフレーズを解除する。

			# openssl rsa -in server.key.back > server.key

		- パスフレーズの入力を求められるので、パスフレーズを入力する。

			Enter pass phrase for server.key.back:パスフレーズ
			writing RSA key
	2. Apache起動時のパスフレーズ入力を自動化する方法

		- SSLPassPhraseDialog ディレクティブで、パスフレーズを標準出力するような外部コマンドを指定し、パスフレーズを自動入力するように設定する。

		- 外部コマンドは何でもよいので、簡単なシェルスクリプトを用意する。例えば下記のような内容のファイル /etc/httpd/conf.d/pass-phrase.sh を作り、パーミッションを 500 にする。

```
#!/bin/sh
echo "パスフレーズ"
```
		- SSLPassPhraseDialog ディレクティブは次のように指定する。

			# SSLPassPhraseDialog  builtin
			SSLPassPhraseDialog   exec:/etc/httpd/conf.d/pass-phrase.sh



- 公開鍵（server.csr）の作成
	
	WebサーバのCSRファイル（server.csr）を作成する。
	
	そして、ついでにSHA256に対応しておく。

		openssl req -new -sha256 -key server.key > server.csr
	
```
Enter pass phrase for server.key:パスフレーズ
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka-shi,Chuo-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Inc.
Organizational Unit Name (eg, section) []:Example Section
Common Name (eg, YOUR name) []:example.com
Email Address []:空白

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:空白
An optional company name []:空白
```

- デジタル証明書（server.crt）の作成

	SSL 通信には CA（Certification Authority, 認証局）が発行した証明書が必要だが、自分自身でデジタル証明書（server.crt）作成する。(このデジタル証明書の発行をおこなっている第三者機関が VeriSign などになるが、自分自身でデジタル証明書をつくることもできる。)

		openssl x509 -in server.csr -sha256 -days 365 -req -signkey server.key > server.crt


## 確認方法

作成した csr (公開鍵)ファイルから鍵情報を見る

```
$ openssl x509 -noout -text -in (crtファイル)
```

- Not Before: 証明書が発行された日時
- Not After: 証明書の有効期限


参考: http://www.maruko2.com/mw/Apache/SSL自己証明書の作成とmod_sslの設定
参考: http://timudondon.ti-da.net/e2422928.html
Javaでクローラを実装する


なにかライブラリが無いかと思って[crawler4j](http://code.google.com/p/crawler4j/)に行き着きました。

## 使用準備
http://code.google.com/p/crawler4j/ のサイドバーにある[Downloads]からcrawler4j-3.5.zipとcrawler4j-3.5-dependencies.zipをダウンロードする。
htmlのパースにはjsoupを使うので、[ここ](http://jsoup.org/download)からダウンロードしておく。

eclipseだと[ビルドパスの構成]>[ライブラリー]から[外部jar追加]で全てのjarファイルを追加する。
![スクリーンショット 2014-04-10 19.11.53.png](https://qiita-image-store.s3.amazonaws.com/0/280/922c1069-caa8-df5c-0e1b-a078ca1f5817.png "スクリーンショット 2014-04-10 19.11.53.png")

これで準備完了のはず？
<del>そろそろmaven使おう</del>

## 実装
大体の実装としては[Basic Crawler](http://code.google.com/p/crawler4j/source/browse/src/test/java/edu/uci/ics/crawler4j/examples/basic/)で十分だと思う。

[BaseCrawler.java](http://code.google.com/p/crawler4j/source/browse/src/test/java/edu/uci/ics/crawler4j/examples/basic/BasicCrawler.java)で`Override`してある`visit`と`shoudVisit`では、クロールするurlの絞り込みや、実際の処理を記述出来る。

[BaseCrawlController.java](http://code.google.com/p/crawler4j/source/browse/src/test/java/edu/uci/ics/crawler4j/examples/basic/BasicCrawlController.java)では設定を行い、シードとなるurlを与えたり、クロールする深さやページ数、proxyやクロールの際のスリープ時間等を設定出来る。

jsoupを使ったhtmlパースは[この記事](http://qiita.com/opengl-8080/items/d4864bbc335d1e99a2d7)を参考にした。
上の記事でも触れられているが、jsoupでパースして得られるElementの[API一覧](http://jsoup.org/apidocs/org/jsoup/nodes/Element.html)は見たほうが良いと思う。

```java:htmlのパース始め
// BaseCrawler.javaの73行目
String html = htmlParseData.getHtml();
Document doc = jsoup.parse(html);

// ID
Element elm = doc.getElementById("hoge");

// CSSセレクタ
Elements elements = document.select("#hoge ul .error");
for (Element element : elements) {
   	System.out.println(element.outerHtml());
}

```

ややJavaScriptっぽい。
CSSセレクタを使えるのが手軽で良い。
ネット史上最大級のバグ（OpenSSLのHeartbleed）が関係しているサイトかどうか調べる方法

クレカとか登録するサイトはチェックした方がいいみたいなので調べ方をまとめてみた。

- 米大手サイトは[チェックリスト](https://github.com/musalbas/heartbleed-masstest/blob/master/top1000.txt)を確認
- それ以外は[Test your server for Heartbleed](http://filippo.io/Heartbleed/)で確認

※必ず調べられる訳ではない
Qiita APIで絵文字がちゃんと表示出来るようになったらしいよ！

某記事で@Qiita宛に ~~さりげなーく~~ メンション送っておいたら気付いてもらえたらしく、絵文字の代わりに表示される`？`に悩まされる必要が無くなりましたっ！ :smile: 

こんな感じ。

![Screenshot_2014-04-10-18-24-32.png](https://qiita-image-store.s3.amazonaws.com/0/23997/a8bfc25c-f036-6e3e-0a8c-5b4f4ec7c97f.png)

…………

***でかっ！***

…………多分Retina対応とかですよね()

QiitaAPIでアプリ作るときは絵文字用に`img.emoji`のサイズ指定もちゃんとしてやらないといけないみたい。
ブロックの省略

mapやselectなどを使うとき、ブロックの中にレシーバーに行う処理を書きます。
言葉で説明するのは難しいので簡単なコードを以下に記述します。

```rb:sample1.rb
['tarou', 'hanako'].map { |i| i.capitalize }    # => ["Tarou", "Hanako"]
[1, 2, 3].select { |i| i.even? }                # => [2]
```

ただこういう単純な処理に毎回ブロックを書くのは正直めんどくさいです・・・。
そういう時Rubyには簡単に書く方法があります。
コードは下のようになります。

```rb:sample2.rb
['tarou', 'hanako'].map(&:capitalize)    # => ["Tarou", "Hanako"]
[1, 2, 3].select(&:even?)                # => [2]
```

以上のようにメソッドがあるものは簡潔に書くことが可能です。
もちろん自分が書いたメソッドにも使うことができます。
あまりよくない例だと思いますが、下にコードを書きます。

```rb:sample3.rb
class Fixnum
  def my_even?
    if self % 2 == 0
      true
    else
      false
    end
  end
end

[1, 2, 3].select(&:my_even?)                # => [2]
```

injectの場合は&(アンパサンド)も省略できます。
下のコードは1～10の合計を求めます。

```rb:sample4.rb
a = [*1..10]
a.inject(&:+)                   # => 55
a.inject(:+)                    # => 55
```

簡潔に書けるのはやっぱりいいですね。
網元AMIを使っている時に「ssh_exchange_identification: read: Connection reset by peer」でSSH接続できなくなったら


[網元AMI](http://ja.megumi-cloud.com/)を使っている時に`ssh_exchange_identification: read: Connection reset by peer`が発生して、SSHでのログインが出来なくなりました。

#原因

原因は[DenyHosts](http://denyhosts.sourceforge.net/)でした。

DenyHostsは、ブルートフォースアタックなどを行ってきたホストを締め出すことが出来るツールです。
hosts.denyに攻撃元のホスト（IP）を登録してSSH認証が出来ないようにします。
かなり強力なツールですが、誤って登録されたらまずいホストが登録されたりします。今回の件はこれでした。

#解除方法

解除方法は[FAQ](http://denyhosts.sourceforge.net/faq.html#3_19)の通り

1. Denyhostsを停止
2. /etc/hosts.denyから、自分のIPアドレスを削除
3. WORK_DIR/hostsを編集し、該当のIPアドレスを含む行を削除
4. WORK_DIR/hosts-restrictedを編集し、該当のIPアドレスを含む行を削除
5. WORK_DIR/hosts-rootを編集し、該当のIPアドレスを含む行を削除
6. WORK_DIR/hosts-validを編集し、該当のIPアドレスを含む行を削除
7. WORK_DIR/user-hostsを編集し、該当のIPアドレスを含む行を削除
8. （オプション）該当のIPアドレスをWORK_DIR/allowed-hostsに追加
9. DenyHostsを起動

`allowed-hosts`に追加しておけば今後`hosts.deny`に追加されることはないようです。

他にも、`hosts.allow`に該当IPを追加する方法でも行けました。