OmniAICreator/Qiita-1.07M huggingface dataset:
【基礎】CodeIgniterでコアクラスを作成する

Qiitaに書かないと投稿できないんですね！
[こっち](http://kaneshin.hateblo.jp/entry/2013/12/01/002924)に書いちゃいましたよ！！

この記事は[CodeIgniter Advent Calendar 2013](http://qiita.com/advent-calendar/2013/codeigniter) の 1 日目の記事です。

今年はPHPについてAdvent Calendarを書きたかったんですよ！

そしたら[PHP Advent Calendar 2013](http://qiita.com/advent-calendar/2013/php)は全て埋まってたわけで…

しょうがないので書きたかったCodeIgniter のAdvent Calendar作ったら誰も登録しない！！

```
＿人人人人人人＿
＞  Nobody  ＜
￣ＹＹＹＹＹＹ￣
```

後々誰かが登録してくれるのを気長に待ちましょう。

さて、書く内容ですが、とりあえず基本中のコアクラスの拡張方法でも紹介しましょうか。

[Core Classes](http://codeigniter.jp/user_guide_ja/general/core_classes.html)

まぁ、公式に書いてあるのですがね！

ほとんどが上記の引用ですよ！CodeIgniterは公式のだけで十分使えるんですよね！！素晴らしい。


## コアシステムクラスの拡張

### コアシステムクラスって？

systemフォルダにあるファイルのことで、CodeIgniterを使用する開発者は直接いじらないやつらです。

```
├── application
├── index.php
├── license.txt
├── system
│   ├── core
│   │   ├── Benchmark.php
│   │   ├── CodeIgniter.php
│   │   ├── Common.php
│   │   ├── Config.php
│   │   ├── Controller.php
│   │   ├── Exceptions.php
│   │   ├── Hooks.php
│   │   ├── index.html
│   │   ├── Input.php
│   │   ├── Lang.php
│   │   ├── Loader.php
│   │   ├── Model.php
│   │   ├── Output.php
│   │   ├── Router.php
│   │   ├── Security.php
│   │   ├── URI.php
│   │   └── Utf8.php
│   ├── database
...
```


### コアシステムクラスをいじりたい

デフォルトに用意されているコントローラーのwelcome.php (Location: ./application/controllers/welcome.php) はCI_Controllerを継承しています。

```php
class Welcome extends CI_Controller {

    public function index()
    {
        $this->load->view('welcome_message');
    }

}
```

普通、ベースとなるコントローラーを用意し、それを継承させて開発を行いたいですが、
既にCI_Controllerなるものが継承されているため、共通に処理させたいものを記述したい際にこまります。

そんなとき、CodeIgniterではちゃんと拡張する方法を用意しております。


### コアシステムクラスを作成する

作成方法はめっちゃ簡単です。作成する順序をコントローラーを例に述べると。

1. ./application/core/ の中にMY_Controller.php を作成する
2. クラス名をMY_Controllerにし、CI_Controllerを継承させる
3. コンストラクタで親クラスのコンストラクタを呼ぶ
4. MY_Controllerクラスを使用したいクラスで継承させる

That's it.

つまり、下記を./application/core の中にMY_Controller.php という名前で作成します。

```php
class MY_Controller extends CI_Controller {

    function __construct()
    {
        parent::__construct();
        // something
    }
}
```

./application/controllers の中にあり、ベースとなるコントローラーの継承元をMY_Controllerにします。

例えば、./application/controllers/welcome.phpの継承元をCI_ControllerからMY_Controllerに変更します。

```php
class Welcome extends MY_Controller {

    public function index()
    {
        $this->load->view('welcome_message');
    }

}
```

これだけです！！！めっちゃ簡単！公式ドキュメントにも書いてあるよ！


## 終わり

CodeIgniterのコアクラスを直でいじらず、ちゃんと継承したクラスを作成しましょう。

CodeIgniterの超基礎でした。


### 次回のCodeIgniter Advent Calendar2013

誰も書かないなら明日も書くかも。書かないかも。
緩くやりたいと思います。一年間CodeIgniterを使用して、いろいろ書きたいこともあるので。
[HDL][雑記] 言語トレンドを見てみよう


この記事は [HDL Advent Calendar 2013](http://qiita.com/advent-calendar/2013/hdl) の1日目の記事です。  
まだまだ参加者募集中ですので、ぜひご参加ください！

※うまいこと表示されないみたいなので、 **[こちら](http://lsifrontend.blog100.fc2.com/blog-entry-795.html)**を参考にしてください。

### Google トレンド

先ずはこちらを見てみてください。

***[Google トレンド - VHDL/Verilog/SystemC/SystemVerilog](http://www.google.co.jp/trends/explore?q=vhdl,verilog#cat=0-5-31&q=VHDL%2C%20Verilog%2C%20SystemC%2C%20SystemVerilog&cmpt=q)***

このような感じで、色々な検索キーワードに対して調べることが出来ます。

### 動向調査

これで、動向が分かるとは言えないですが。  
見てみると色々と面白いかもしれません。

例えば、 **SystemC** と **SystemVerilog** に注目。

「地域別人気度」を見てみましょう。

- SystemC

<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&cat=0-5-31&q=VHDL,+Verilog,+SystemC,+SystemVerilog&cmpt=q&content=1&cid=GEO_TABLE_2_0&export=5&w=500&h=330"></script>

- SystemVerilog

<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&cat=0-5-31&q=VHDL,+Verilog,+SystemC,+SystemVerilog&cmpt=q&content=1&cid=GEO_TABLE_3_0&export=5&w=500&h=330"></script>

このように、
本当かどうかは別にして
 SystemCでは「日本」、SystemVerilogでは「インド」が一位になっていることが分かります。

「関連キーワード」を見てみても面白いです。

- SystemC

<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&cat=0-5-31&q=VHDL,+Verilog,+SystemC,+SystemVerilog&cmpt=q&content=1&lp=1&cid=TOP_QUERIES_2_0&export=5&w=300&h=420"></script>

皆さん苦労する点として、tutorialが一番上位。  
つまり、手を出してはいけないｗ

- SystemVerilog

<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&cat=0-5-31&q=VHDL,+Verilog,+SystemC,+SystemVerilog&cmpt=q&content=1&lp=1&cid=TOP_QUERIES_3_0&export=5&w=300&h=420"></script>

SystemVerilogでは、「assertion」や「ovm」が。

### まとめ

こんな感じで調べることが出来ますので、一度検索してみてはいかがでしょうか！？

最後に、人気度の動向グラフを貼り付けて終わりたいと思います。  
明日は、@tethys_seesaa さんです。

<script type="text/javascript" src="//www.google.co.jp/trends/embed.js?hl=ja&cat=0-5-31&q=VHDL,+Verilog,+SystemC,+SystemVerilog&cmpt=q&content=1&cid=TIMESERIES_GRAPH_0&export=5&w=500&h=330"></script>
ゲーム制作計画6日目

#あきらめよう。
今日一時間くらい全力で英語読んだのですが原因は解明できませんでした。
まるごとダウンロードしたり、
html書き換えてみたり、
ファイル置き換えたりしてみたのですが、
自分の技術内では無理そうでした。
なぜ動くサンプルと動かないサンプルがあるのか…
とりあえず明日は、新しいゲームの内容を考えようと思います。
また、cocosが動かせそうかもう一度試してみようと思います。
今日の報告は以上です。
英語読むのつらい…
ターミナルに画像を表示する

　概要と元ネタ。

> [terminal で画像を cat できるようにした - 終わる世界とコンテンツ](http://blog.geta6.net/post/53187725909/terminal-cat)

```rb
#!/usr/bin/env ruby

require 'curses'
require 'rmagick'

Curses.init_screen
columns = Curses.cols / 2 
Curses.close_screen

ARGV.each {|filename|
  source = Magick::Image.read(filename).first
  image = source.sample(1.0 * columns / source.columns)

  puts (0...image.rows).map {|row|
    image.get_pixels(0, row, image.columns, 1).map {|pixel|
      color = [pixel.red, pixel.green, pixel.blue].map {|n| n * 5 / (255 * 255)}
      "\x1b[48;5;#{16 + color[0] * 36 + color[1] * 6 + color[2]}m  \x1b[0m"
    }.join
  }.join("\n")
}
```

![ﾃﾞｰｽ!](https://qiita-image-store.s3.amazonaws.com/0/4250/f9ee8198-b86b-1cb6-8be5-3871267acfae.png)

楽しい！ ✌(’ω’✌ )三✌(’ω’)✌三( ✌’ω’)✌

> [ANSI escape code - Wikipedia](http://en.wikipedia.org/wiki/ANSI_escape_code)
Hubot-scriptsの学びかた

Hubotとは、GitHub社が開発したチャット専用ボットのフレームワークです。
Node.jsとcoffee-scriptとredisで構成されていて、ボットとしての受け答えをcoffee-scriptで簡単に追加することができます。これをここではHubot-scriptと呼ぶことにします。

今回は、資料が今ひとつ少ないhubot-scriptの学び方と、簡単な受け答えの仕組みをご紹介します。

## スクリプトのお手本

[hubot-script](https://github.com/github/hubot-scripts)に大量にお手本となるコードがあるので、時間がある人はまずはこれらを端から試すのがいいと思います。

## 時間がない人向けの基本

### 挨拶したい

おはようといえばやっほーと答えるscriptを紹介します。

```hello.coffee
module.exports = (robot) ->
  robot.hear /おはよう/, (msg) ->
    msg.send "やっほー"
```

最初の行は決まり文句です。robotというインスタンスがhubot本体になります。

Hubotはチャット上の発言を一つずつ見ています。その中で、おはようという文字列を見つけたら登録している関数が実行されます。

ここでは、やっほーというメッセージを返す処理が登録されているので、おはように対してやっほーが帰ります。

ね、簡単でしょ？
rails4 でモデルの初期値を代入したい場合


default_scopeには、初期値を代入する機能がある。（これ自体でハマることもある気がする）

しかし、default_scopeでの条件は個別には外せないので、避けたほうが無難。(unscopedで外せるけれど、これは全ての条件を消しさるので、has_many 等を介して呼んだ場合の条件も消えてしまう）

よくある？Rails失敗談 default_scope編 | TechRacho
http://techracho.bpsinc.jp/tsunekawa/2013_10_10/13553


なので、下記のようにする

```ruby
class Model < ActiveRecord::Base
  after_initialize :set_default_value
  
  private
  def set_default_value
    self.number  ||= 0.0
    self.bool_field = true if (self.has_attribute? :bool_value) && self.bool_field.nil?
  end
end
```

参考：
ruby on rails - How can I set default values in ActiveRecord? - Stack Overflow
http://stackoverflow.com/questions/328525/how-can-i-set-default-values-in-activerecord


追記：
あとからデフォルト値を追加するときは、新規に限ったほうがよい？？

```
after_initialize :set_default_value, if: :new_record?
```
Qt Quickでコンソールに文字列出力

QtQuick(QML)のConsole出力について、質問させて下さい。

QtCreatorでプログラムを実行すると、
console.log()を使用すると、Consoleに文字列が出力されますが、
Commad PromptやPowerShellコンソールからプログラムを起動すると、
console.log()の出力を標準出力に返されません。

別途、.proファイルに何かの設定が必要なのでしょうか？
お手数ですが、ご存知の方がいらっしゃいましたら教えて頂けないでしょうか？

■開発環境
OS:Windows 8.1(32bit) 
IDE:Qt Creator3.0
Kits: Desktop Qt 5.2.0 MSVC2012 32bit 

■ソースファイル
<main.qml>
import QtQuick 2.1
import QtQuick.Controls 1.0

ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
            MenuItem {
                text: qsTr("Start")
                onTriggered: console.log("start button is pressed.")
            }
        }
    }

    Button {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
}

<Hello_QtQuick.pro>
# Add more folders to ship with the application, here
folder_01.source = qml/Hello_QtQuick3
folder_01.target = qml
DEPLOYMENTFOLDERS = folder_01

# Additional import path used to resolve QML modules in Creator's code model
QML_IMPORT_PATH =

# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp

# Installation path
# target.path =
CONFIG += console　//自分で追加しました
# Please do not modify the following two lines. Required for deployment.
include(qtquick2controlsapplicationviewer/qtquick2controlsapplicationviewer.pri)
qtcAddDeployment()
[Ruby] gem の  daemons の利用サンプル

ruby で書いたメソッドを  daemn 化するのに daemons という gem を使ってみた。

https://gist.github.com/katoy/7718753

最終的には 上の  gist 中の  testdaemon_2.rb の形に。
工夫をしたのは次の２点。
1. log を  カレントフォルダの  test.log に出す。
2. 実行する  task の処理の途中で処理が中断されないようにする。

daemons の  homepage  や github にあるサンプルを流用しただけは、これらの点は達成できない。

以下 testdaempn_2.rb を転載する。

```ruby:testdaemon_2.rb
# -*- coding: utf-8 -*-

# See
#   http://snippets.aktagon.com/snippets/212-how-to-create-a-daemon-process-using-ruby-and-the-daemons-rubygem
#   > How to create a daemon process using Ruby and the daemons RubyGem
#
#   http://wokowa.net/blog/archives/88
#   > Rubyのdaemonsでloggerからログ出す方法がよく分からなかった話
#
#   http://stackoverflow.com/questions/11237815/ruby-cant-write-to-logs-in-daemons
#   > What does daemons internally do with my daemons?
#
#   http://stackoverflow.com/questions/12266645/ruby-daemons-soft-stop
#   > Ruby daemons soft stop
#
# 開始
#  ruby testdaemon_2.rb start
# 再起動
#  ruby testdaemon_2.rb restart
# 終了
#  ruby testdaemon_2.rb stop
#
# -----------------------------------------
# task(logger) の処理を繰り返し実行する。
# task 実行中に daemon の stop , restart の指示, kill pid をされても、
# task の処理が途中で中断されることが無い様にした。
#
# $ tail -f test.log や $ tail -f test.rb.output を別コンソールで実行しながら
# damon の stop, resatret, kill pid を行うと様子がよくわかる。
#
# -----------------------------------------
# ruby: ruby 1.9.3p484 (2013-11-22 revision 43786) [i386-darwin9.8.0]
# gem:  daemons (1.1.9)

require 'rubygems'
require 'daemons'
require 'logger'

CWD = File.expand_path(File.dirname(__FILE__))

STDOUT.sync = true
STDERR.sync = true

def task(logger)
  # 時間がかかる処理を定義。
  # 処理の途中で daemon の stop, restart を行いやすくしてある。
  logger.info 'start task'
  sleep 2; STDOUT.puts "# ------- task start #{Time.now}"
  sleep 2; STDOUT.puts "#      -- stdout #{Time.now}"
  sleep 2; STDERR.puts "#      -- stderr #{Time.now}"
  sleep 2; STDOUT.puts "# ------- task end   #{Time.now}"
  logger.info 'fnish task'
end

# ------------------
def get_logger
  ret = Logger.new('test.log')
  ret.level = Logger::INFO
  ret
end

def log_info(logger, str)
  logger = get_logger unless logger
  logger.info str
  logger
end

def show_message(str)
  puts str
  log_info(nil, str)
end

options = {
  log_output: true,   # stdout, stderr を test.rb.output に保持する
  multiple:   false,
  ontop:      false,
  backtrace:  true,
  monitor:    false
}
Daemons.run_proc('test.rb', # name of daemon
                 options) do
  stopped = false
  logger = nil

  Signal.trap(:INT)  { stopped = true; show_message 'SIGINTを受信' }
  Signal.trap(:QUIT) { stopped = true; show_message 'SIGQUITを受信' }
  Signal.trap(:KILL) { stopped = true; show_message 'SIGKILLを受信' }
  Signal.trap(:TERM) { stopped = true; show_message 'SIGTERMを受信' }

  Dir.chdir CWD
  until stopped
    logger = show_message 'Start Daemon' if logger.nil?
    task(logger)
    sleep 2
  end
  show_message 'Finish Daemon'
end
```

my_task() だけを渡して、簡単に  上の２点を達成できるようなメソッド 、モジュールの形にするには
どうしたよいだろう？
既にそのようなものは存在していないのだろうか？
vagrantでmountエラーの解決方法

```
Failed to mount folders in Linux guest. This is usually beacuse
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group apache | cut -d: -f3`,dmode=777,fmode=777 /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g apache`,dmode=777,fmode=777 /vagrant /vagrant
```

こんなエラー。

#解決方法
vboxをリビルドする必要があるようです。

まずsshで入ります

```
vagrant ssh
```

リビルド実行します。

```
sudo /etc/init.d/vboxadd setup

Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
```

一旦macのコンソールに戻ります。

```
exit
```

vagrantを再起動します。

```
vagrant halt
vagrant up
```
mruby-meta-circularの紹介

mruby Advent Calendar 2013はqiitaで書くとよさそうなので、テストを兼ねて投稿します。

mruby Advent Calendar 2013はJITの話をする予定ですが、その時使う[mruby-meta-circular](https://github.com/miura1729/mruby-meta-circular)　の話を書きます。mruby-meta-circularはmrubyからRite　VMの各種情報を得たり、書き換えたりするといった、ありがちな操作を行うためのmrubyのgemです。

簡単に使い方を見てみましょう
`Irep::get_irep(オブジェクト、　メソッド名)`でそのオブジェクトのメソッドのIrepをオブジェクト化したもの(Irepオブジェクト)を取り出すことができます。とりだした結果は、pool, syms, iseqといったメソッドで同名のIrep構造体のメンバーを取り出すことができます。

`a = Irep::get_irep([], :each)` 
これで、Array#[]メソッドのIrepオブジェクトがaに入ります。
`p a` →　#\<Irep:0x20013d48\>
`p a.pool` →　[]　　# [1]とあったけど、これはmrubyのJITのメソッドインラインキャッシュがあったため。今はないので[]が返る
`p a.syms` →　[:length, :-, :[], :+, :==, :>=, :call, :<, :<=]

```rb
a.iseq.each do |n|
  p Irep::OPTABLE[n & 0x7f]
end
```

→　
"ENTER"
"LOADI"
"LOADSELF"
"SEND"
"NOP"
"SUBI"
"NOP"
"MOVE"
"MOVE"
"JMP"
"LOADSELF"
"MOVE"
"ADDI"
"NOP"
"MOVE"
"SEND"
"NOP"
"MOVE"
"MOVE"
"JMPNOT"
"JMP"
"MOVE"
"LOADNIL"
"EQ"
"NOP"
"JMPNOT"
"MOVE"
"LOADSELF"
"SEND"
"NOP"
"GE"
"NOP"
"JMPNOT"
"JMP"
"MOVE"
"MOVE"
"SEND"
"NOP"
"MOVE"
"MOVE"
"LT"
"NOP"
"JMPNOT"
"MOVE"
"LOADSELF"
     省略


なお、`Irep::OPTABLE`は命令コード(整数)をインデックスにアクセスすると命令の名前のシンボルが返ってくる配列です。`Irep::OPTABLE_CODE`はシンボルからコードに変換することができます。これで、アセンブラ・逆アセンブラがmrubyで実装できますね。なお、mruby-meta-circularにはまだ、アセンブラ・逆アセンブラはないです。まあ、それだけ面倒な作業になりそうということです。

これで、Irepを得るところまで説明しました。実は、Irepを新しく作ることもできるのですが13日までに仕事が入ってこなければその辺も書きたいと思います。
fluentdでApacheのerror_logをログサーバに送る

大学院生でちりちりとFluentdをいじってる人は僕くらい何じゃないかと不安になる11月末。

インターン先でがんばって運用のために8割くらい技術検証終わったのでちょっとずつtipsでまとめて行きます。

#3分でわかるFluentd
## Fluentdって？
TreasuteDataの出してるログ集計基盤です。

[FLuentdで始めるリアルタイムログ集計・・・](http://codezine.jp/article/detail/6958)
[最近だとはてなが使ってるのが有名](https://speakerdeck.com/shibayu36/fluentd-mongodb-kibanawoli-yong-sitahatenaburoguabtesutofalseshi-li)
[Fluentdとはどのようなソフトウェアなのか](http://tagomoris.hatenablog.com/entry/2013/12/03/150656)

## なにができるの？
いろんなサーバで出るログを一カ所に集めたり、それをうまいことまとめたり、うまいこと操作できます。
Mongoに送ったり、フィルタかけたり、ElasticSearchにつっこんだり

## 何がいいの？
導入がらくちん、インフラ歴0年数ヶ月の僕でもさぐりさぐり動かせている！

## どこからはじめよう・・・
ここら辺見てくれれば幸せになれる。
td-agentとよばれるfluentdの安定板を使えば難しくないはず、ドキュメントも豊富です。（たぶん

[さくらサーバーのVPS環境にfluentdとMongoDBをインストール](http://netdiever.com/archives/12241)
[fluentdでapacheのアクセスログをmongoDBにつめる方法](http://qiita.com/dahugani/items/c655f101a5a9920ec2e8)


#速攻で有用にする
世の中を調べるとけっこうアクセスログの集計で使ってるというか、そこまでやってみましょう系の記事が多いのが見て取れます。

これはtd-agentが以下みたいな感じで標準でApacheのアクセスログをtailで拾ってどんどん投げるみたいなことができるからなんですね、

```xml:td-agent.conf
<source>
  type tail
  format apache
  path /var/log/httpd/httpd_access_log
  tag mongo.apache
</source>
```

これでもいいんですが、僕的にはPHPのエラーログとかNoticeをまとめて欲しい時が多くあったので、
そっちのやり方を紹介します。

```xml:td-agent.conf
<source>
  type tail
  format /^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\] (?<message>.*)$/
  time_format %b %d %H:%M:%S %Y
  path /var/log/httpd/error_log
  tag webServer.error
</source>
```

はい、こんな感じ。
それぞれのtype、formatが何を意味しているかは以下を
[公式！！](http://documents.mazgi.com/fluentd/doc/plugin.html#id1)

error_logに出てくるログを正規表現でパターンマッチして、それぞれのパラメターに落とし込み
td-agentで使えるようにしてるんです。

それだけです、tipsというほどではないですがゆるりと晒しておきますね╭( ･ㅂ･)و
brew update に失敗した時の対応


```
% brew update    error: Your local changes to the following files would be overwritten by merge:
        Library/Formula/emacs.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

% git pull -q origin refs/heads/master:refs/remotes/origin/master
fatal: Not a git repository (or any of the parent directories): .git

```
意図してない変更がいつの間にか入っていてそれが原因でupdateできなくなっていた。

とりあえず、バージョンをもとに戻したいんだがどこで管理されてるのか理解してなくて再発しそうなので今回の対応をメモ

```
% cd  /usr/local 

% git status -sb
## master
 M Library/Formula/emacs.rb

% git reset  --hard HEAD~
HEAD is now at 41f0e36 groonga 3.0.6

% git status -sb
## master

```

これで無事復活!!
EmacsでとにかくUTF-8を使う

ruby-modeでコードを書いててたまに思い出したように日本語をコード内で使うと`# -*- coding: undecided -*-`なんてのが気づいたらヘッダーにあるせいで` unknown encoding name: undecided (ArgumentError)`と出て「ふぁーーーっく」と言う気分になるので、とりあえず何でもかんでもUTF-8だと仮定して読むこむことにした。

```el:~/.emacs.d/inits/00-env.el
(prefer-coding-system 'utf-8)
(setq coding-system-for-read 'utf-8)
(setq coding-system-for-write 'utf-8)
```

これでOK。

別の文字エンコーディングで開きたい時は `revert-buffer-with-coding-system` とか使ってかえましょう。

## 参考

encoding - Change Emacs Default Coding System - Stack Overflow
http://stackoverflow.com/questions/1785200/change-emacs-default-coding-system
ソルト付きハッシュで格納するPEAR::Auth互換ライブラリを書いた

昨今のパスワード漏えいや不正ログインを踏まえ、パスワードの扱いに関する議論が活発です。一方で、フォーム認証ライブラリとして公開されているものは未だにMD5またはSHA1でハッシュしたものを格納してるだけだったりして、そのまま使い続けるのは心許ないので、

* PEAR::Auth互換（というかなんというか）

* ソルト付きハッシュを格納

* ストレージはプリペアドステートメントを対応しているPDOのみ

というライブラリを書いてみました。

https://github.com/usopyon/mauth

サンプル(index.php）にあるようにAuth.phpの代わりにmauth.phpを呼び出し、salt用のDSN、テーブル名、カラム名を指定させるだけでPEAR::Auth用に書いたPHPがソルト付きハッシュに対応できるようになります。

```php:index.php
require_once("mauth.php");
//require_once("Auth.php");

$param = [
    "dsn" => "sqlite:users.db",
    "table" => "users",
    "usernamecol" => "username",
    "passwordcol" => "password",
    "db_fields" => "*",
    "saltdsn" => "sqlite:salts.db",
    "salttable" => "salts",
    "saltcol" => "salt"
];
```

以下、箇条書きでつらつらと。

* 本当はPHP5.5から実装されたpassword_hashを使いたかったのですが、借りてるレンタルサーバはPHP5.4なのでcryptで妥協してます。

* 最初、pear.php.netを見て外部仕様からゴリゴリ書き始め、途中からgithubを見て他の関数を呼び出す部分を合わせます。最初からソースを参照しておけばよかったと反省。

* PEAR::Auth互換と言いつつ、他のPEARライブラリに依存したくなかったので、ログ出力は実装してません。すみません。

* 同様にsetAdvancedSecurityも実装していません。IPアドレスやUser-Agentが変わっていたら強制ログアウトするモードで、セッション・ハイジャックなどに有効なんですが、元のPEAR::Authの仕様だと、「誰」が怪しいか記録する前にログアウトしちゃうので本体側で実装するのがよろしいかと。

* サンプル（index.php）はあっさり書いてますが、ライブラリ側は既存の仕様を踏襲してるので、パスワードの文字数チェックとかは本体側で実装するのがよろしいかと。

* サンプル（setup.php）で動作確認用のSQLiteを生成できますが、そのままだとHTTP GETで簡単に引っこ抜かれちゃうので、htaccessなどで守っておくのがよろしいかと。

* その他、色々とフィードバックをいただけると嬉しいです。
明日からmrubyのAdvent Calendar始まりますね

ということで、Qiitaちゃんと使った事ないのでテストがてら投稿してみました。

[mrubyのAdvent Calendar](http://qiita.com/advent-calendar/2013/mruby/participants)が明日からはじまりますが、後9人ぐらい空いていますね。もし誰も集まらなかったら、登録している人達で埋めた方が良いんでしょうか。自分が書こうと思ってるネタをざっとメモしてみました。

## 書けそうなネタ
* Cアプリの設定ファイルをmrubyにしてみよう
* mod_mruby的な何か
* ngx_mruby的な何か
* mruby-vedisとmruby-redis的な何か
* mrbgemのCIをどうするか
* Ruby側から見えないグローバル変数
* グローバル変数を削除
* C構造体のインスタンス変数化やDATA_PTR

・
・
・

などなどネタは色々ありそうな気がしています。

できるだけ色々な人が書いた方が楽しいので待った方が良さそうですね。でも最終日はできれば __あのお方__ が書いて頂けると良い年末を迎えられそうですね...
jqGridのFormEditingで複数のdatepickerを設定したい

例えば、start_dateとend_dateみたいな日付項目の2個あるレコードをjqGirdで表示、標準で備わっているモーダルダイアログ型のフォームを出して編集させたい場合

```js
$('#table_id').jqGrid({
/**
（略）
*/
colNames   : ['日付1', '日付2', '本文'],
colModel   : [
	{
		name: 'start_date',
		index: 'start_date',
		width: 100,
		jsonmap: 'start_date',
		editable: true,
		edittype: 'text',
		editoptions: {
			dataInit: function(e){
				setTimeout(function(){
					$(e).datepicker({
						dateFormat: 'yy-mm-dd'
					});
				}, 200);
			}
		},
		editrules: {
			required: true
		}
	},
	{
		name: 'end_date',
		index: 'end_date',
		width: 100,
		jsonmap: 'end_date',
		editable: true,
		edittype: 'text',
		editoptions: {
			dataInit: function(e){
				setTimeout(function(){
					$(e).datepicker({
						dateFormat: 'yy-mm-dd'
					});
				}, 200);
			}
		},
		editrules: {
			required: true
		}
	},
/**
略
*/
}).navGrid('#pager_id', {
	add: true,
	edit: true,
/**
（略）
*/
},{
/**
（略）
*/
});


```
のような形で書けば一瞬うまくいったように見えるけど、日付入力させるところで何か挙動がおかしくなる
私が遭遇した具体例はend_dateにフォーカスがあたると、start_dateのdatepickerが出てきていつまでもend_dateが入力できない、特にdatepickerを設定した項目に真っ先にフォーカスがあたるような形でそれが起こる

で、調べてみたのですが

[jqgrid multiple datepickers and autofocus](http://stackoverflow.com/questions/14398630/jqgrid-multiple-datepickers-and-autofocus)

というドンピシャなスレッドを発見
どうやら、navGridのAdd/Editのオプションのところに

```js
	{
		closeAfterAdd: true,
		modal: true,
		jqModal: false /** ←コレ */
	}

```
を入れるといいらしい
実際やってみましたが、フォーカスがいきなりdatepicker項目にあたることもなく、2つともちゃんとdatepickerがでてきてくれるようになった
[ReVIEW Tips] 行頭の字下げ（インデント）を調整する

行頭の字下げ（インデント）は悩ましいですね……。

字下げについてはハウスルールもありそうで（例えばちくま学芸文庫の場合、行頭に『「』が来る場合は一字下げて1/2幅の『「』が来るようです。言ってみればいわゆる半角スペースのあとに全角の『「』が来る感じです）、ReVIEW側で自動に調整するのは難しそうです。

そのため、ある程度個別対応が必要になるわけですが、その方法にも２通りあります。

## 自動インデントにして、インデントしない場合だけ指定を入れる

ReVIEWでは、通常は段落冒頭は字下げするのがデフォルトです。
HTMLの場合、CSSで、

```css
p {
    text-indent: 1em;
}
```

的なものが指定されていることが期待されています。

一方で、段落冒頭であってもインデントしたくない場合もあります。そのような場合、

```review
//noindent
```

という記法を入れておくと、その直後の段落はインデントされなくなります。

この場合、HTMLでは当該p要素にはclass="noindent"が指定されるため、CSSにも、

```css
p.noindent {
    text-indent: 0;
}
```

的な指定を入れておいて下さい。

## 自力でインデントする

上記の場合とは異なり、基本的にはインデントしてほしくないとか、インデントする／しないが大変微妙であって、インデントする場合のみ個別に指定したい、という場合もあります。

そのような場合は、インデントしたいところにはいわゆる全角空白を入れる、ということにするのが楽ちんです。

その場合、当然のようにCSSとしては、

```css
p {
    text-indent: 0;
}
```

としておきます。また、PDF (LATEXBuilder) の場合にも、

```tex
\parindent = 0pt
```

といった指定を入れておきます。
gitでリモートブランチをローカルにcheckoutする

新しい作業環境で開発リポジトリのmasterリポジトリをcloneしたあとにその他のブランチもcheckout/pullしたいことがある。というか、しないと作業にならない。

よく忘れるのでメモ。

```shell
git checkout -b local_branch_name origin/remote_branch_name
```

remote_branch_nameリモートブランチから派生するlocal_branch_nameローカルブランチを新たに作成する。

-bオプションをつけることで「新しいブランチを作り、チェックアウトする」という動作になる。
よく使う git diff コマンド


git diff コマンドは、2つの commit の差分や、 working tree と index の差分などを表示するコマンドである。

## 実行例

### まだ index に add していないモノを表示

```
git diff
```
index と working tree の差分を表示するコマンド。


_注意: 新規に作成したファイルはこのコマンドでは表示されない。新規に作成されたファイルは Git に track されていないので。_

### 次の commit で反映される変更を表示

```
git diff --cached
```

index と HEAD の差分を表示するコマンド。
commit 直前によく実行する。

### 直前の commit による変更を表示

```
git diff HEAD^ HEAD
```
HEAD と HEAD^ の差分を表示するコマンド。
commit 直後によく実行する。

```
git diff HEAD^ HEAD --stat
```

`--stat` オプションを指定すると、差分の統計情報だけを表示する。

## オプションについての補足

git diff コマンドは、 default では index と woking tree の差分を表示する。

 `--cached` オプションを指定すると、 index と、ある commit の差分を表示する。
(commit を明示的に指定しない場合は HEAD との差分を表示する。)

## 設定

コンフィグファイルに以下の設定を書くことで、 git diff を含む Git の大半の出力に色がつく。

```
[color]
        ui = true
```

` ~/.gitconfig ` に上記設定を書き込むには、以下のコマンドを実行すれば良い。

```
git config --global color.ui true
```

## リファレンス

 * [git-diff](http://www.git-scm.com/docs/git-diff)
   * Git 公式ウェブサイトの中のマニュアルページ。

 * [git diff の使い方がほんの少し理解できた - murankの日記](http://d.hatena.ne.jp/murank/20110320/1300619118)
   * git diff コマンドの使い方について、絵付きで分かりやすく書いてある。

 * [Git - Git の設定](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)
   * コンフィグファイルの設定について。
group_concatの制限値をmy.cnfで設定する

MySQLには文字列を結合して返す集計関数group_concatがあります。

```sql
select group_concat(title separator ' ') from Book
```

group_concatには結合後の文字数に制限があり、デフォルトでは1024バイトを超えた文字はカットされます。

この制限値をmy.cnfで変更したい場合は、下記の様に設定してください。

```
[mysqld]
group_concat_max_len=200000
```

実行時で変更したい場合は、下記の構文で。

```sql
SET grobal group_concat_max_len = 200000
```
rails devise 管理者から他のユーザーを登録する。

#rails devise 管理者から他のユーザーを登録

##railsで管理機能
####ログイン機能　devise

すでにログインしている状態から、新しいアカウントの作成画面に遷移すると、
リダイレクトで、ホーム画面に戻ってしまう。

####deviseのregistrationsのコントローラーを作成

```bash
$rails g controller users/sessions
```

####Devise::RegistrationsControllerを継承する

```rb
class Users::RegistrationsController < Devise::RegistrationsController
end
```

継承したRegistratoinsControllerのfilterをオーバーライド

```rb
class Users::RegistrationsController < Devise::RegistrationsController
    prepend_before_filter :require_no_authentication, :only => [ :cancel]
    prepend_before_filter :authenticate_scope!, :only => [:new, :create ,:edit, :update, :destroy]
end

```

ちなみにdefaultは、
/usr/local/lib/ruby/gems/2.0.0/gems/devise-3.2.1/app/controllers/devise

```rb
class Devise::RegistrationsController < DeviseController
  prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
  prepend_before_filter :authenticate_scope!, :only => [:edit, :update, :destroy]
```

これでログイン中でもログインユーザーが登録できました。
devise 管理者

#devise 管理者 

devise登録ユーザーを一般と管理者で分けたい。

ex)http://d.hatena.ne.jp/watanabe162/20120510/1336626340
https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-role

```bash
$rails g m add_admin_to_users admin:boolean
```

defaultをfalseに設定する

```rb

class AddAdminToUsers < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, :default => false
  end
end

```

####確認
```
<%if current_user.try(:admin?)%>
aaa
<% else %>
bbb
<%end%>
```

adminがtrueなら管理者、空もしくはfalseは一般と分ける
Railsでログイン前にいたページを維持する

# ログイン時のページ遷移
見てた所に戻れないとイヤですよね。

## `store_location`

`ApplicationController`の`before_filter`として`store_location`と言う名前で、ユーザが居た場所を覚えておきます。

```rb
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter: store_location

  def store_location
    session[:return_to] = request.url
  end

end
```

## `redirect_back_or(default)`

`SessionsController`や`SessionsHelper`に`redirect_back_or(default)`と言う名前で、ユーザが居た場所を覚えていればその場所に、無ければデフォルトに飛ばす、としておきます。

```rb
# app/controllers/sessions_controller.rb | app/helpers/sessions_helper.rb
  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end
```

## `skip_before_filter`

後は保存されているlocationを呼び出したいcontrollerで`redirect_back_or`を利用すればOKです。
変な場所にredirectされる場合は、利用するcontroller部分で`skip_before_filter`を使い、`store_location`を走らせないようにしておくと幸せになれるかも知れません。
仮に`SessionsController`とする場合は

```rb
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  skip_before_filter :store_location

  def create
    # login user
    redirect_back_or root_url
  end
end
```

と言った感じですね。
tarコマンド

### tarコマンド
ファイル群を１つに固めたり、逆にまとめたりするコマンド。.tarだとファイルを１つにまとめただけで圧縮は行なっていない(tarballと言うことがある)。これをgzipで圧縮したのが.tar.gzもしくは.tgzになる。
代表的なオプションは以下

* -f 書庫ファイル指定
* -x ファイルの取り出し(展開)
* -z gzipを通して処理をする(つまりtgzを展開 or tgzに圧縮する)

http://ja.wikipedia.org/wiki/Tar
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230896/
herokuにルートドメインを無料で設定する


herokuにルートドメインを設定した時のメモ

## 概要

herokuではルートドメインの登録をサポートしていません。
もし`example.com`というドメインを取得した場合、`www.example.com`とか`app.example.com`
のようなサブドメインを登録する必要があります。

どうしても、`example.com`でheroku上のアプリを参照したい場合は、別のDNSサービスを利用する
必要があります。

> 参考
> [Custom Domains | Heroku Dev Center](https://devcenter.heroku.com/articles/custom-domains#root-domain)

## 前提

* ドメイン取得済み
* 下記等を参照し、herokuにアプリがデプロイ済み
 
> [Node.js + Expressのアプリをherokuにデプロイしたときのメモ](http://qiita.com/Tkashiro/items/5108ccf9cd9f5eeb3762)

## heroku側にドメインを登録する

```shell
heroku domains:add ${your_domain}
```

## DNS登録する

今回は`Apex Alias`に対応した[GEHIRN WEB SERVICE](http://www.gehirn.jp/)を利用します。
2ドメインまでは無料で利用できます。

詳しいDNSの説明はサービスの[ブログ](http://news.gehirn.jp/information/325/)にスクリーンショット付きで解説されていますので、参照ください。ざっくり、流れは下記です。

### 2016/10/12現在Gehirnのバージョンについての説明
Gehrinはデザインのみならず料金体系などもリニューアルされています。
Apex Aliasの設定は、Aレコードの編集によって、その機能を代替されているため、当記事当初の内容と少し操作が異なります。
詳しくは以下のブログをご確認ください。
新しくなった Gehirn DNS のエイリアス機能を使う | Gehirn News（ゲヒルンニュース） : https://news.gehirn.jp/dev/717/

 
1. DNSの登録ボタンを押下
2. 表示されたDNSホストを取得したドメインサービスに登録する (※1)
3. 取得したドメインサービスのDNSにGEHIRNのDNSが登録できたら、再度、ドメイン登録ボタンを押してドメイン登録すると、GEHIRN側でドメインの認証が完了
4. GEHIRNのDSNのメニュー画面に登録したドメインが表示
5. メニュー画面から登録したドメインを押下して`Apex Alia`を押下
6. 作成したherokuのアプリの既存urlを登録。必ずドメインの最後にドット(.)を入れること（ ${app_name}.herokuapp.com.）
7. しばらく待つ（6時間くらい）
8. 登録が完了すると、ルートドメインでherokuアプリで参照できるようになる

※1 .coのドメインを取得したときに、ドメインサービスのDNSに登録するフローが大変だったので下記にまとめる

## .coドメインのDNSにGEHIRN WEB SERVICEの認証DNSを登録する

2013年11月に行われた[Startup Weekend Tokyo](http://tokyo.startupweekend.org/)に参加しました。
参加の特典で`.co`ドメインが無料でもらえたので、それをGEHIRN WEB SERVICEを利用してルートドメインで参照できるようにしようとしましたが、うまくいかず手こずったので、下記に方法をまとめておきます。

参照
> [.coドメイン登録](http://domain.go.co/)

### 認証用のDNSが登録できない

上記に書いた通り、GEHIRN WEB SERVICEのDNSにドメインを登録しようとすると、そのドメインが
本当にあなたのものなのか、確認するために、ドメインを取得したサービス側のDNSにGEHIRN WEB SERVICEの下記のような認証用DNSを登録するように言われます。

> XXXXX.dns-verify.gehirn.ne.jp

しかし、上記認証用DNSだけ、.coドメインサービスのDNSには登録できませんでした。
なぜか、エラーで怒られる。。。

> Failed to Modify Domain Nameservers: Nameserver not found at registry

そのため、直接メールにて、エラーで登録出来ない旨を.coドメインサービス側に連絡したら、無事登録してもらえました。
下記その返信です。

>That error happens when the name server you are attempting to add doesn't exist in the Registry. All name servers have to be created in the Registry before they can be added to a domain. I've gone ahead and created the name server for you and updated your domain.

これで、GEHIRN WEB SERVICE側の認証が無事通りました。
RubyでJSON.parseした際に、HashのキーをSymbolにする


~~~ruby
JSON.parse('{"key":"value"}', { symbolize_names: true }
~~~

参考

- [rubyのJSON.parseでhashキーをsymbolにしてもらう方法](http://hirakiuc.hatenablog.com/entry/2013/05/19/121211)
- [Module: JSON (Ruby 2.0.0)](http://www.ruby-doc.org/stdlib-2.0/libdoc/json/rdoc/JSON.html#method-i-parse)

~~なんで[オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.0.0/doc/index.html)には載ってないんだろう…？~~

2014/04/19：あれ？載ってる。
開発者必見！Chromeで.local .loc .dev .pre などのドメインがgoogle検索になってしまう回避方法

Chromeのアドレスバー（omnibox）に

``example.local``

などいれるとgoogle検索に行ってしまいます。
開発者としては使いづらいですよね。

それを回避する方法をいくつか調べてみました。


#解決1　スラッシュを最後にいれる

アドレスバーに入力する際に
``example.local/``
というように
最後にスラッシュをつけるとURLと認識してくれます。



#解決2　検索エンジンとして設定する （おすすめ）

Chromeの検索エンジンの設定に追加することで、
自動で解決してくれます。

・Chromeの設定→検索エンジンの管理
・その他の検索エンジンの一番下の3つボックスに下記の用に追加
・「example.local」   「example.local」   「http://example.local/」

これでexample.localといれたものは、http://example.local/と変換してくれます。
自分のよく使うものについては設定してしまった方が楽ですね。


# 解決2の発展　短縮化
実は検索エンジンの管理はこんな使い方もできます。
上記で設定した内容の真ん中をこのように変更してみましょう。

・「example.local」   「loc」   「http://example.local/」


こうするとアドレスバーに

``loc``

といれて、Enterすると

``http://example.local/``

を開いてくれます。

これは色々応用出来そうですね！

元記事こちら
http://osm.hatenablog.com/entry/2013/11/30/125200
locatorで指定しづらいradio buttonを操作する方法

HTML中に以下のようにradio buttonが並んでいるとします。

```html
<input type="radio" name="fruit" value='apple'> リンゴ
<input type="radio" name="fruit" value='orange'> オレンジ
<input type="radio" name="fruit" value='strawberry'> イチゴ
```

これをRSpecなどでCapybara使ってどうやって選ぶかなのですが、適切にlabelが指定されていれば`choose`でいけるものの、上記例のようにlabelが設定されていない場合chooseでは難しそうです。このメソッドは引数にcssやxpathを付けつけてくれないようだからです。

そこで、`choose`自体は`Capybara::Node::Element`に対して何かしらの操作をしているだけだろうと予想し、[Capybara::Node::Actions](http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#choose-instance_method)のドキュメントを読んでchooseが`Capybara::Node::Element`をどういじっているのかを見てみました。

```rb
# File 'lib/capybara/node/actions.rb', line 65

def choose(locator, options={})
  find(:radio_button, locator, options).set(true)
end
```

findはcssでもxpathでもなんでも受け付けてくれます。ということで、上記の例でいえば

```rb
find("input[name='fruit'][value='apple']").set(true)
```

でリンゴ用のradio buttonをチェックすることができます。なお、check box用の`check`も同様にいけるようです。
ruby-dmmを使ってDMMのAPIを用いたアイテム検索結果の大きなアイテム画像を一気にWebブラウザで確認しよう


まずは、ruby-dmmを使った基本的なアイテム検索方法はこちらを参照してください。
http://qiita.com/bash0C7/items/ccaf95c4177fbe7ecfdd

さて、検索結果が望みのものかを確認するには名前や説明文を読むより画像を見るほうが直感的で捗ります。

DMM::Response::Item#imagesで複数のサイズの画像URLを取得できるので、これをWebブラウザで実際に開いて確認してみましょう

```ruby
require 'ruby-dmm'
client = DMM.new(:api_id => [APIID], :affiliate_id => [アフィリエイトID], :result_only => true)
client.item_list(＜キーワード＞).items.each { |item| `open "#{item.images[:large]}"`}
```

これで、DMM::Response::Item#images[:large]にある大きな画像URLを取得し、macのopenコマンドに渡します。
WebブラウザがたいていはURLに関連付けられているので、画像をWebブラウザで一気に確認できるという仕組みです。

もしいったんローカルに保存した上で確認したい場合は、open-uriをrequireの上、ファイルとして読み込み、ローカルファイルに書きだせばいいでしょう。
script/runner でテンプレートをレンダリング

Rails 2.3.10 で確認

テンプレートファイル

```html
<html>
<body>
<%= "現在時刻は #{Time.now}" %>
</body>
</html>
```

script/runner で実行するスクリプト

```rb
av = ActionView::Base.new
result = av.render(:file => Rails.root.join('test.html.erb'))
puts result
```

実行結果

```bash
$ bundle exec script/runner script/render.rb
<html>
<body>
現在時刻は Sat Nov 30 12:18:01 +0900 2013
</body>
</html>
```
Chrome拡張でのユーザーエージェント書き換え実装

バックグラウンドスクリプトで

```js
chrome.webRequest.onBeforeSendHeaders.addListener(
	function(info) {
		var headers = info.requestHeaders;
		headers.forEach(function(header, i) {
			if(header.name.toLowerCase() == 'user-agent'){ 
				header.value = "書き換えたいユーザーエージェント";
			}
		});
		return {requestHeaders: headers};
	},{
		urls: [
			<対象サイトたちのマッチパターン列挙>
		],
		types: ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest"]
	},[
		"blocking",
		"requestHeaders"
	]
);

```
あとはmanifestのpermissionsに

"webRequest",
"webRequestBlocking",
<対象サイトたちのマッチパターン列挙>

を追加する

注意事項としては、event pages(manifestのbackground.persistent = falseの場合)では使えない
event pagesは同様の機能を実装するのに[declarativeWebRequest](http://developer.chrome.com/extensions/declarativeWebRequest.html)を使う必要があるが、これが現在まだβ段階でこの機能を組み込んだ拡張を作ると警告が出る
devise コントローラーのカスタマイズ

#devise コントローラーのカスタマイズ

ex)http://www.tamurasouko.com/?p=929

コントローラーの作成

```bash
$rails g controller users/sessions
```

deviseのSessionsControllerを継承する

```bash
$ diff sessions_controller.rb sessions_controller.rb.org
1c1
< class Users::SessionsController < Devise::SessionsController
---
> class Users::SessionsController < ApplicationController
```

私はログインページは他のページのレイアウトとは違うのに変更したかったので

```rb
$ diff sessions_controller.rb sessions_controller.rb.org
1,4c1
< class Users::SessionsController < Devise::SessionsController
<       def new
<               render :layout => 'login'
<       end
---
> class Users::SessionsController < ApplicationController
```
とした。
Rubyでファイルを同期コピーしたいとき

Rubyでファイルをコピーするとき、あまり同期/非同期を意識していなくて、テストでハマった時のお話。
あるテストを実行するときに設定ファイルの`spec/necessary`が必要で、なければ`spec/example`からコピーして使うという状況でした。
Rakefileで書くとこんな感じ、

```rb
RSpec::Core::RakeTask.new('spec') do |t|
    t.verbose = true
end

file 'spec/necessary' => 'spec/example' do |task|
  CLEAN.exclude task.name
  src_path = File.expand_path("../../#{task.prerequisites.first}", __FILE__)
  dst_path = File.expand_path("../../#{task.name}", __FILE__)

  dst_file = File.open(dst_path, 'w')
  File.open(src_path) do |f|
    f.each_line do |line|
      dst_file.write line
    end
  end
end

Rake::Task[:spec].prerequisites << :'spec/necessary'
```

この書き方でテストが通らないので調べてみると、`spec`タスクの実行時に'spec/necessary'が空の状態で存在していました。同期モードにしていなかったのが原因で、書き込みが終わる前に`spec`タスクが実行されていると。

同期モードになるように修正したところ

```rb
file 'spec/necessary' => 'spec/example' do |task|
  CLEAN.exclude task.name
  src_path = File.expand_path("../../#{task.prerequisites.first}", __FILE__)
  dst_path = File.expand_path("../../#{task.name}", __FILE__)

  dst_file = File.open(dst_path, 'w')
+ dst_file.sync = true

  File.open(src_path) do |f|
    f.each_line do |line|
      dst_file.write line
    end
  end
end
```

```rb
file 'spec/necessary' => 'spec/example' do |task|
  CLEAN.exclude task.name
  src_path = File.expand_path("../../#{task.prerequisites.first}", __FILE__)
  dst_path = File.expand_path("../../#{task.name}", __FILE__)

+  File.open(dst_path, 'w') do |dest|
+    File.open(src_path).each do |source|
+      dest.write source
    end
  end
end
```

というレビューをもらいました。ブロックを渡せば、すぐに実行されるんだったなぁ。
時間を見つけて、Rubyのコードを読まないと・・・・
ViewPagerでのページの削除

android-support-v4のViewPagerで、ユーザーがページを増やしたり減らしたりできる可変長のビューを作る場合の話です。
ページの追加、削除を行うときにはFragmentStatePagerAdapterを使うのはいろんなところで書かれてるので理由とか使い方は割愛します

そのFragmentStatePagerAdapterでページの削除をする時ですが、Activity側で何らかのイベントを受け取って、現在見ているページを閉じるという処理をしたいと思います。単純に書くと

```java:
public void removeCurrentPage()
{
    int current = pager.getCurrentItem();
    adapter.remove(current);
    adapter.notifyDataSetChanged();
}
```

みたいなことになりそうですが、これだとViewPagerに反映されませんでした。あれこれ試行錯誤して最終的にいきついたのは

```java:
public void removeCurrentPage()
{
    int current = pager.getCurrentItem();
    adapter.remove(current);
    List<Fragment> list = new ArrayList<Fragment>();
    list.addAll(adapter.getList());
    adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), list); //Refresh page caches
    pager.setAdapter(adapter);
    pager.setCurrentItem(current, false);
}
```

adapterから要素を削除したのち、Listを出力してadapterを初期化、改めてListを渡してViewPagerにadapterをセットしなおして元の位置を表示させる
というすごい回りくどい処理をしてますが、これで今のところページの削除は滞り無くできてます

ページの追加のほうは単純にadapterにaddするだけで出来るんですが、削除のほうはViewPager側のキャッシュが残るためこういう処理が必要なんじゃないかと思います。
もしもっといいやり方がありましたら教えて下さい
開発者の為のサーバチューニング（LinuxOS編）

サーバを立てる上で最低限必要なチューニングポイントを整理したいと思います。
とは言っても、立ててしまえば割となんとかなるので、一定の負荷がないサービスでは
ただの自己満足になる可能性もあります。
※若干うろ覚えなので一応調べて書いてますが、間違ってたらすいません。。。

#OS編
チューニングという意味で主に触るのはカーネルパラメータぐらいだと思います。
というか片手間で出来るのはこのラインぐらいまでが限界な気がします。
今回書きませんが、自分が意識する事についてキーワードだけ書いておくと
* DISKのブロックサイズを指定してフォーマット
* プロセスの優先順位変更
* RAID0（AWSでも可能）
などがありますが、RAID0以外はあまり力を入れなくても。。。という感じです。
とは言え、依存性の高い設定が多いと運用がし辛くなるので、バランスが必要な気もします。

以下、主要なケース毎に書いていきます。
カーネルパラメータは以下のコマンドで確認できます。
この２つのコマンドを知れば取りあえず事足りると思います。

```bash
$ ulimit -a
$ sysctl -a
```

以下、注意すべき点について書いていきます。
##DBサーバなどでテーブルが開けない（too many open files）
プロセス毎に同時に開けるファイル数を制限するパラメータが存在します。

```bash
$ ulimit -a
open files                      (-n) 1024

変えたい場合は
$ ulimit -n 8192
その後、対象プロセスの再起動も必要です
恒久的な設定ではないので、
~/.bash_profile , ~/.bashrc などへ必要に応じてコマンドを書いておく必要があります。
// もしくは、 /etc/security/limits.conf などで設定します
```

参考URL：http://open-groove.net/linux/memo-etcsecuritylimits-conf/

特にMySQLでMyISAMを使用して運用している場合、
このケースに遭遇する事は多いかと思います。
後、雑なシステムだと不要なログだったりゴミの様なテーブルを大量に残していて、
そのテーブルに対してのファイルハンドラが開いたままだった為、ファイル数の上限に
引っかかってしまうケースなどがあると思います。
MyISAMの場合、一つのテーブルに対して３つぐらいファイルを必要とする為、
とくに注意が必要かと思います。

ちなみに、どれぐらいのファイルを開いているのか調べる方法ですが、

```bash
$ ps aux | grep mysql
でプロセスIDを特定
$ ls /proc/{PID}/fd | wc -l
で確認できます。
これは、他のプロセスも同様に調査できます。
```

参考URL
http://studio3104.hatenablog.com/entry/20121030/1351587278

Tomcatなどで運用しているシステムであれば
##プロセスが落ちたのにコアダンプが出ない###
```bash
$ ulimit -a
core file size          (blocks, -c) 0 
// 変えたい場合は
$ ulimit -c unlimited
// その後、対象プロセスの再起動も必要です
```
先ほどの[URL](http://open-groove.net/linux/memo-etcsecuritylimits-conf/)にも書いていますが、Javaを利用している様なシステムでは
慎重に設定しておく必要があります。
これをちゃんと出せるようにしていないと、なんで落ちたのか調べる手だてが途絶えてしまう
可能性があります。

##なんかプロセスが落ちる###
APやDBサーバなどで大量にメモリを利用しているケースに発生する可能性があります。
LinuxではOOM Killer という仕組みが動作しており、
メモリが足りなくなると足りるようになるまでプロセスを殺し続ける機能があります。
詳しくは、
http://passingloop.tumblr.com/post/11957331420/overcommit-and-oom-killer
のURLが大変わかりやすいので是非読んでください。

```bash
$ sysctl -a | grep overcommit
vm.overcommit_memory = 2
vm.overcommit_ratio = 99
変更は、以下のファイルで
$ vim /etc/sysctl.conf 
反映する時は、
$ sysctl -p 
```

多分、普段意識しなくてもうまく動いてまうので、何かある前に
見直してみると良いかと思います。
日本語確定時のenterキー入力を判別しつつ入力内容により処理する方法のメモ

jQueryでinputフィールドに入力されている内容を監視し、enterキーが押されたタイミングで処理を発火する
また、1文字単位で入力内容の変化を検知して処理を発火する

keypressを使用した場合、受け取ったイベントにキーコードが含まれるものの、
inputフィールドのval()で取得できる値は入力実行前の値となるためenterキーが押されたことは検知できるが、1文字単位での処理を行うのは(可能だろうけど)面倒かもしれない。
また、この場合、日本語変換中か否かの判定ができないような気がする。

上記踏まえ以下のようにしたところ意図通り動作した。
(日本語確定状態でEnterを押したときにfunc1、空欄になったときにfunc2、その他入力時func3)

```js
  var keyDownCode = 0;
  $('#message').keydown(function(e) {
    keyDownCode = e.which;  // 押下されたキーのコードをとっておく(日本語変換確定の場合keyupと異なるコード)
  });
  $('#message').keyup(function(e) {
    if ( 13 == e.which && e.which == keyDownCode ) {
      // 日本語入力確定済みかつinputにフォーカスのある状態でエンターキー押下したときの処理
      func1();
      return false;
    }
    $('#message').change();  // 1文字ごとの変化を監視処理したい場合、changeイベントを発生させる
  });
  $('#message').change(function() {
    if('' === $(this).val() && currentId) {
      // inputテキストが空欄になった
      func2();
    } else if('' !== $(this).val()) {
      // inputテキストが空欄ではない(変換途上の文字列含む)
      func3();
    }
  });
```
OSX 10.9 Mavericks に Chefクライアントをインストールする

ChefでOSXをセットアップしようとしたんだけど，
いつも使ってたインストールスクリプトではインストールできなくなっていた．

`curl -L https://www.opscode.com/chef/install.sh | sudo bash`

実際に実行すると，`No builds for platform: 10.9`というメッセージと共に終了してしまう．
（追記:2014/04/19 もう出来るようになってました）

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6790  100  6790    0     0   3145      0  0:00:02  0:00:02 --:--:--  3146
No builds for platform: 10.9
Please file a bug report at http://tickets.opscode.com
Project: Chef
Component: Packages
Label: Omnibus
Version:

Please detail your operating system type, version and any other relevant detail
```

## install.sh に10.9の挙動を追加する

これは，`install.sh`に10.9の時の挙動が記述されていないため，インストールできなくなっているらしい．
そのため，`install.sh`に`"10.9") platform_version="10.7" ;;`という一行追記するだけでインストールできるようになる．

```
     "10.8") platform_version="10.7" ;;
+    "10.9") platform_version="10.7" ;;
     *) echo "No builds for platform: $major_version"
```

gistに変更済みのものを上げておいたので，以下のコマンドでインストールできます．

```
curl -L https://gist.github.com/ringohub/7660676/raw/bc25c3274d55a799f11e4aa012bf3e809a7cf285/install.sh  | sudo bash
```

成功！

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6829    0  6829    0     0   6035      0 --:--:--  0:00:01 --:--:--  6038
Downloading Chef  for mac_os_x...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 23.0M  100 23.0M    0     0   126k      0  0:03:05  0:03:05 --:--:--  147k
Installing Chef
Verifying archive integrity... All good.
Uncompressing The full stack of chef.....................
...
Thank you for installing Chef!
```

## 参考
- [driesvints / install-chef-os-x-mavericks.md](https://gist.github.com/driesvints/7160641)
- [Omnibus installer support for OS X 10.8 Mountain Lion](https://tickets.opscode.com/browse/CHEF-3327)
Javaで分布数え上げソート[CountingSort]（不完全燃焼版）

不完全燃焼と言いつつ乗せたのは、
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_6_A
の問題で、テストケース9以降からメモリだったり実行時間で蹴られてしまったからです。
アルゴリズム的には正しいのですが、もっと効率の良い方法があるのか模索中です。
とは言え、気づいた方、アドバイスいただけるとすごく嬉しいです。
※最後の出力そのもので蹴られている気が。。。

#分布数え上げソート
例によって、ソースへ直接コメント書いています。
概念などは下記URLが一番分かりやすかったと思います。
http://www.codereading.com/algo_and_ds/algo/counting_sort.html

要は、サイズや値の範囲が決まっている配列である場合に有効なソート方法であり、
値の発生回数を元に、値の位置を決めていくものです。
速度的には一応ソートアルゴリズムの中で最速とのことです。

#コード
```java:CountingSort.java
package aoj.sort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CountingSort {

	public static void main(String args[]) throws IOException {
		// 入力の受付
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// 要素数が入ってくるが、要素数からサイズを取れるので読み捨て
		br.readLine();
		String line = br.readLine();
		// 整数値の配列を取得
		int[] befSort = parseInt(getSplitLine(line));

		/**
		 * ここから計数ソート
		 */
		// 前提条件
		// 1 ≤ n ≤ 2,000,000 : 要素数
		// 0 ≤ A[i] ≤ 10,000 : 含まれる整数値

		// カウンタ配列（出現回数）の初期化
		// 数値の最大値+1で初期化する
		int maxSize = 2000001;
		int[] counter = new int[maxSize];

		int i;
		for (i = 0; i < befSort.length; i++) {
			// numArrayに含まれる数値の出現回数を計算する
			counter[befSort[i]]++;
			// 2, 5, 1, 3, 2, 3, 0 の配列である場合、
			// counter[0] = 1 回（0）
			// counter[1] = 1 回（1）
			// counter[2] = 2 回（2）
			// counter[3] = 2 回（3）
			// counter[4] = 0 回（4）
			// counter[5] = 1 回（5）
			// の様な計算結果になる
		}
		//
		for (i = 1; i < counter.length; i++) {
			// i 以下の出現回数を計算する
			counter[i] = counter[i] + counter[i - 1];
			// i = 0; counter[i] = 1; 0以下は1つ
			// i = 1; counter[i] = 2; 1以下は2つ
			// i = 2; counter[i] = 4; 2以下は3つ
			// i = 3; counter[i] = 6; 3以下は6つ
			// i = 4; counter[i] = 6; 4以下は6つ
			// i = 5; counter[i] = 7; 5以下は7つ
		}

		// output(ソート結果を登録する配列)へ計算した結果を登録する
		int[] output = new int[maxSize];
		for (i = befSort.length - 1; i >= 0; i--) {
			output[counter[befSort[i]]] = befSort[i];
			// i = 0; output[counter[2]] = 2;
			// i = 0; output[4] = 2;
			// i = 1; output[counter[5]] = 5;
			// i = 1; output[7] = 5;
			// のように、入力配列の出現回数(count[i])の場所へ
			// 数値を登録していくことでソートされる
			counter[befSort[i]]--;
		}

		// 出力
		System.out.print(output[1]);
		for (i = 2; i <= befSort.length; i++) {
			System.out.print(" " + output[i]);
		}
		System.out.println();
	}

	private static String[] getSplitLine(String line) {
		return line.split("\\s");
	}

	private static int[] parseInt(String[] line) {
		int[] numArray = new int[line.length];
		for (int i = 0; i < line.length; i++) {
			numArray[i] = Integer.parseInt(line[i]);
		}
		return numArray;
	}

}
```
Androidでちゃんと明示的にブラウザでIntentを呼ぶ方法

例えばアプリ内で他アプリを呼び出す方法としてスキーマを使って呼び出す方法がある。


```xml:Lineアプリでメッセージを送る
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("line://msg/text/" + shareText)); 
try {
	((Activity) ct).startActivityForResult(intent, 0);	
} catch (Exception e) {
	// Lineが入ってない場合
}
```

みたいな感じ。これにはいろいろな使い方があって

```xml:マップを起動
intent = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q=Osaka"));
```

```xml:マーケットでアプリを検索
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:goodMorningTweet"));
```

```xml:アプリを削除
intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package", <削除したいアプリケーションのパッケージ名>, null));
```

などなど
[Intent連携をまとめてみる](http://d.hatena.ne.jp/unagi_brandnew/20100309/1268115942)

よく知られているところのインテントの扱いは２種類に分けて解釈されていて、明示的・暗黙的と呼ばれている。

##明示的
こちらで指定した特定のアクティビティを起動

```xml:明示的インテント
Intent intent = new Intent(this, NanikashiraActivity.class);
startActivity(intent);
```

##暗黙的
「処理」だけしていして、どのアクティビティにやらせるかはユーザーに指定させる。
例えばここではアプリ内でTweetをすると、つぶやき機能を持つアプリの選択画面が出て
どのアプリでつぶやくか選べる。

```xml:暗黙的インテント
Uri uri = Uri.parse(shareTweetUrl);
Intent i = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
```

アプリでこれを受けるようにするにはManufestにごにょごにょ書く
[Intent - Androidの肝](http://blog.haw.co.jp/android/?p=54)

でも他のアプリではなく、明示的に標準のブラウザで開いてほしい時とかがある。

これは以下のようにする。

#標準ブラウザを明示的に呼び出しリンクを表示

これは結構簡単でClassNameを指定するといい

```xml:標準のブラウザでつぶやく
Intent i = new Intent(Intent.ACTION_VIEW,uri);
i.setClassName("com.android.browser", 
				"com.android.browser.BrowserActivity"); 
```

これにより明示的に標準のブラウザで起動できる〜知らなかった！！
PHPのエラーログをNode.jsで監視して通知してもらう。（Mac専用？）


Windowsマシンが手元にないので、ちと検証出来ませんが、
Windowsの場合通知センターって右下のやつになるんですかね。
（前使ってたのXPなんですが、、、）

PHPのログが更新されたら通知が来るスクリプトを組んでみました。
これでPHPのデバッグも少しは楽になるかも？

coffeeScript勉強中なのでおかしいところがあったら教えて下さい。
むしろ俺ならこうするとかあったら言ってください。

## 必要なもの
1. coffeeScript
2. node.js
3. terminal-notifier
4. <del>エラーがバンバン通知されても泣かない心</del>


```coffeescript:phplog.coffee

# パスはここに書く 相対パスは試してないけどいけるかな？
targetFile = "/PHP/logs/php_error.log"

# ファイルの読み込み
fs = require("fs")
exec = require('child_process').exec


# ファイルを監視
fs.watch( targetFile, (event, filename)->
    console.log "event is: " + event
    
    # ファイルの変更キャッチ
    if event is "change"
         # コマンドの実行
        exec("terminal-notifier -message 'PHP ERROR!' -title 'm9(^Д^)'", (err, stdout, stderr) ->
            console.log err

            )
     # 本当は末端行だけ取得してexecのメッセージに渡したらもっと幸せになれるかも
       
)

```





### 参考サイト
CoffeeScriptでNode.jsアプリを書いてみる
http://parrot.hatenadiary.jp/entry/20111207/1323245393

Node.jsでshellコマンドを叩く
http://d.hatena.ne.jp/muddydixon/20110708/1310134554

terminal-notifier で通知センターにコマンドラインから通知
http://heartbeatheart.blogspot.jp/2012/08/terminal-notifier.html
SRM 154 DIV2 Lv.1


##問題文概略
商品の仕入れ値と売値から売上を算出する問題

## 書いたコード

```java
public class ProfitCalculator {

	public int percent(String[] items) {

		double cost = 0;
		double price = 0;
		double margin = 0;

		for(int i = 0; i < items.length; i++) {
			price += Double.parseDouble(items[i].substring(0, 6));
			cost += Double.parseDouble(items[i].substring(7, 13));
		}
		margin = price - cost;
		return (int) Math.floor((margin / price) * 100);
	}

}


```

## 他の参加者のコードを読んで修正した
```java
public class ProfitCalculator {

	public int percent(String[] items) {

		double cost = 0;
		double price = 0;
		double margin = 0;

		for(String s : items) {
			String[] split = s.split(" ",0);
			price += Double.parseDouble(split[0]);
			cost += Double.parseDouble(split[1]);
		}
		return (int) ((price - cost) * 100 / price);
	}

}
```

## 雑感

文字列分割方法
1.splitを使う
```java
public String[] split[](String regex, int limit)
```
文字列をregexで指定された正規表現に一致する位置で分割する。

+ regex：パターン(正規表現)
+ limit：パターンの適応回数。
    + 0ならパターンの適用回数と配列の長さは制限されず、後続の空文字列は破棄
    + 負の数ならパターンの適用回数と配列の長さは制限されない。

2.substringを使う

```java
public String substring(int beginIndex, int endIndex)
```
beginIndex〜endIndex-1にある文字までを返す。

+ beginIndex：開始インデックス(この値を含む)
+ endIndex：終了インデックス(この値は含まない)