OmniAICreator/Qiita-1.07M huggingface dataset:
ちょっと便利な Git コマンドのオプション

普段使ってて便利だと思った Git コマンドのオプション

## log

```bash
# 表示数を指定
$ git log -n x(x は出力したい数)

# コミット履歴を 1 行で表示
$ git log --oneline

# コミット履歴の情報を少なくして表示
$ git log --pretty=short

# コミットログを任意のフォーマットで出力
## %h  : ハッシュ(省略形)
## %H  : ハッシュ
## %ai : 日付
## %an : Author 名
## %s  : コミットメッセージ概要
$ git log --format=format:'%h %ai %an %s'

# %C で色の変更も可能 (この辺は alias 設定しておくと便利)
$ git log --format=format:'%C(red)%h %C(yellow)[%ai] %C(blue)<%an> %C(green)%s %C(yellow)(%ar)'

```

## add

```bash
# 変更したファイルをすべて追加(新規ファイルは含まれない)
$ git add -u

# 1 つのファイルの変更点を部分的に追加できる
$ git add -p

# 変更ファイルを強制的にコミットする
# .gitignore に登録されているファイルを登録したいときに使える
$ git add -f
```

## commit 

```bash
# 変更ファイルの追加とコミットを同時に行う
$ git commit -a

# 直前のコミットをやりなおす
# コミットメッセージの修正などに便利
$ git commit --amend
```

## diff

```bash
# HEAD とインデックスの差分表示 (stage のファイル差分を表示)
$ git diff --cached

# HEAD とワーキングツリーの差分を取るときは下記
$ git diff HEAD

# 空白文字を無視して比較
$ git diff -w

# 行ではなく単語単位で差分を表示
$ git diff --color-words
```


## branch

```bash
# ブランチ一覧とその HEAD 情報を取得
$ git branch -v

# ブランチ名の変更
$ git branch -m
```

## grep

```bash
# 行番号を表示
$ git grep -n

# 大文字小文字の区別をしない
$ git grep -i
```

## stripspace

```bash
# trailing space の削除
$ git stripspace < TargetFile.txt > Temp.txt
$ mv Temp.txt TargetFile.txt
```
SQLでFizzBuzz

[こちら](http://qiita.com/kamichidu/items/80c420ff667535ca2ec9)に張り合ってみました。
SQLで再帰を利用したFizzBuzz。
DBによって微妙に書き方が変わってくるけど、以下はPostgreSQLで動作確認。


```
WITH RECURSIVE TMP(NUM) AS (
    SELECT 1 AS NUM
    UNION ALL
    SELECT NUM + 1 FROM TMP WHERE NUM < 20
)
SELECT
    CASE
        WHEN NUM % 15 = 0 THEN 'FIZZBUZZ'
        WHEN NUM % 3 = 0 THEN 'FIZZ'
        WHEN NUM % 5 = 0 THEN 'BUZZ'
        ELSE CAST(NUM AS CHAR(2))
    END
FROM
    TMP
```

最近[はてな](http://louvre24.hatenablog.com/entry/2015/02/18/223759)始めました。
平方根を求めてみる練習

#問題
>
与えられた数の平方根を求める
当然ライブラリは使わない

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答
```ruby:sqrt.rb
# 平方根を求めるメソッド
# sqrt_judge_number：平方根を求めたい数
# essential_figure：小数点第何位まで求めるか
# approximate_value：平方根の近似値（最初は0）
# sqrt_count：メッソドを呼んだ回数（最初は0）
def calc_sqrt(sqrt_judge_number, essential_figure, approximate_value = 0, sqrt_count = 0)
  # 求めたい数と比べる数
  # 再帰前の数を足す
  square_number = approximate_value + 10.0 ** (-sqrt_count)
  
  # 1から順に2乗していく
  # sqrt_judge_numberを超えたらループから抜ける
  while square_number * square_number <= sqrt_judge_number
    square_number += 10.0 ** (-sqrt_count)
  end
  
  # 1つ戻す
  square_number -= 10.0 ** (-sqrt_count)
  
  # 指定した有効数字の桁数に達するまで繰り返し
  if essential_figure == 0
    return square_number
  end
  
  # 繰り返す数を減らす
  essential_figure -= 1
  # 繰り返した数を増やす
  sqrt_count += 1
  
  # 再帰
  calc_sqrt(sqrt_judge_number, essential_figure, square_number, sqrt_count)
end

# 平方根を求めたい数を入力
print "平方根を求めたい数を入力してください : "
SQRT_JUDGE = gets.to_i

# 求めたい有効数字の桁数を入力
print "小数点第何位まで求めますか？ : "
ESSENTIAL_FIGURES = gets.to_i

# 平方根を計算して表示
puts "自分で計算 = #{calc_sqrt(SQRT_JUDGE, ESSENTIAL_FIGURES).round(ESSENTIAL_FIGURES)}"
# 関数を使って答え合わせ
puts "関数で計算 = #{Math.sqrt(SQRT_JUDGE).round(ESSENTIAL_FIGURES)}"
```

#結果
>
平方根を求めたい数を入力してください : 20
小数点第何位まで求めますか？ : 10
自分で計算 = 4.4721359549
関数で計算 = 4.472135955

#備考（というか感想）
メソッドに段々引数追加してったからかなり見辛くなってしまった…
一応答えは出せてるぽい
Railsは、開発環境では直前までモデルやコントローラーを読み込まない

結構詰まったので記録しておく。
今作っているアプリケーションの構造的に、あるモデル（Parent)がたくさん従属要素をもっていて、そのたびにhas_manyを書く必要があった。そこで、下のactive_record_extenstion.rbを作ってlib/以下においた。

```active_record_extension.rb

ActiveRecord::Base.class_eval do
  def self.scoped_to_tenant
    belongs_to :parent
    association_name = self.to_s.downcase.pluralize
    Parent.has_many association_name.to_sym, class_name: self.to_s
  end
end
```

そんで、子モデルの方に、こんな感じで書いた。

```child.rb
require Rails.root.join("lib/active_record_extension.rb"
class Child < ActiveRecord::Base
  scoped_to_parent
end
```

こう書いとけば、子の方で親の分もまとめて定義できる。そう思って、子供の一覧を表示するコントローラーを下のように書いた。(current_parentは別に定義）

```parents_controller.rb
class ParentsController < ApplicationController
  def index
    @children = current_parent.children.all
  end
end
```
そしたら、一覧ページを訪れた時に

```
undefined:children <class: parent>
```
てなようなエラーが出た。
***
ここからが本題。

エラーが出たわけで、pryを使ってデバッグしてみたり、色々原因を探ってみた。いつもこのエラーが出るわけじゃなくて、何回か更新したら出ない時もあった。試行錯誤していくと、コントローラー入ったところでChildを一回呼び出したらエラーが出なくなることに気がついた。

ここで、あれ、もしかしてChild modelが読み込まれてないんじゃ...?とピンときて、「rails model 読み込み」とかでググってみたら、model一覧を

```
Activerecord::Base.subclasses
```
で取得できると知った。デバッグ中に実行してみたら、案の定Parentしか表示されない。
なんでや！って思い、さらにググったら、タイトルのことが判明した。
この設定はconfig/environments/development.rbでしてあった。

```config/environments/development.rb
  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.

  config.cache_classes = false

  # Do not eager load code on boot.

  config.eager_load = false

```
この2つの設定、production.rbではこうなってる。

```config/environments/production.rb
  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true
```
本番環境では起動時にクラスをすべて読み込んで、キャッシュも使うけど、もし開発環境でそうしてしまうとファイルを更新するたびにサーバーを再起動させなくてはならないのでやらない。とのこと。

だから開発環境で一覧ページを訪問した時は、childモデルが読み込まれてなくて、parentにもhas_manyが適用されていなかったというわけ。結局parentにhas_manyを追加しましたとさ。
MySQLでインデックスを追加するSQLと削除するSQLを実行しました

MySQLで特定のカラムにindexを追加した状態を確認したい機会があり、SQLを使用してindexを追加しました。

# indexを追加
ALTER TABLE と ADD INDEX でindexを追加することができます。

```sql:indexを追加する基本
ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);
```
postsテーブルのupdated_atカラムにindexを貼る場合です。

```sql:indexを追加するSQL
ALTER TABLE posts ADD INDEX index_posts_on_updated_at(updated_at);
```

# indexを削除
indexを削除する場合はDROP INDEXと書きます。

```sql:indexを削除する基本
ALTER TABLE テーブル名 DROP INDEX インデックス名;
```
postsテーブルからindex_posts_on_updated_atというインデックスを削除します。

```sql:indexを削除するSQL
ALTER TABLE posts DROP INDEX index_posts_on_updated_at;
```

# 複合indexを追加
複合indexを追加する場合は、カラム名をカンマ区切りで指定します。

```sql:複合indexを追加するSQL
ALTER TABLE posts ADD INDEX index_posts_on_created_at_updated_at(created_at, updated_at);
```
上記SQLでは **created_at** と **updated_at** のカラムで複合indexを貼りました。

# おまけ
以下はindexを確認する場合の記事になります。
http://qiita.com/pugiemonn/items/2edf5d7967fb45dd5196
Railsでgeocoderをつかって住所から緯度経度を登録する


GoogleMap用途などで、住所を属性に持つモデルに対して緯度・経度を登録する場合はgeocoderが便利です。

# geocoder

geocoderは住所⇔緯度・経度を取得・登録できるスグレモノです。

## geocoder のインストール

```rb:Gemfile
# geocoder
gem 'geocoder'
```

Gemfileに追記したら、 ```bundle install``` でGemをインストールします

# モデルの修正

Ex. Hotelモデルに住所(address), 緯度(latitude), 経度(longitude)がある場合

hotel.rb に以下のコードを記述するだけです。

```hotel.rb
geocoded_by :address
after_validation :geocode, if: lambda {|obj| obj.address_changed?}
```

これで、モデル登録時と住所(address)変更時にgeocoderが動いて緯度・経度のデータが登録・更新されます :smiley:

---

# 参考

- geocoder
	- https://github.com/alexreisner/geocoder
	- http://www.rubygeocoder.com/
git 使って機能追加とかする時のブランチ操作

だいたいのいつものコマンドをメモっとく


# 準備

とりあえずクローンしてることを前提に
```bash
git clone <repo>
cd <repodir>
```


# 同期

削除されたブランチとかも同期する

`git fetch --prune`


# 何かしら作業したいブランチに移動

`git checkout origin/hogehoge`

ここでソース眺めたり、動かしたり、だとかする。
いちいちローカルブランチを作らないのが好きです。

# 変更する時

`origin/hogehoge`にコミットしない。

`git checkout -b feature/hogehoge`

変更しちゃってからでも遅くない。

変更はfeature/ブランチなどとにかく別のブランチで。
README.mdとかはそのままやることも許す。

# commit

`git commit -m "<ticket/issue> hogehoge"`

issueトラッキングはしたいよね


# push

remote に変更をあげる。

`git push origin feature/hogehoge`


# マージはPullRequestで。

基本は分岐元へPullRequestです。

feature/hogehoge -> hogehoge

誰かにレビューしてもらってマージしてもらうのが良い。
github


# 同期に戻る。

同期から繰り返し。



# PullRequestが can not merge な時。

分岐元からrebaseする。

`git rebase origin hogehoge`

# conflict してたとき

頑張る


# 終わり。

`git pull --rebase origin hogehoge`
とかは基本しない流れでやってます。
CordovaでiOS simulatorを指定する

# 困っていること

```bash
# cordovaの場合
cordova emulate iOS

# ionicの場合
ionic emulate iOS
```

シミュレータを起動した場合にデフォルトのiOS Simulatorが起動する（筆者の場合iPhone6）。テスト目的で違うデバイスでも起動させたいときが出てきますが「ハードウェア」からデバイスを切り替えてもうまくいかない。

# 解決法
以下のコマンドで使用可能なiOSデバイスがリストアップされます

```bash
# iOS platformが追加済みであることが前提
./platforms/ios/cordova/lib/list-emulator-images
# ↓出力結果
# iPhone-4s
# iPhone-5
# iPhone-5s
# iPhone-6-Plus
# iPhone-6
# iPad-2
# iPad-Retina
# iPad-Air
# Resizable-iPhone
# Resizable-iPad
```

上記で出てきたデバイス名を使って以下のようにコマンドを叩けば意図したシミュレータでアプリの起動が可能です。（他にやり方があれば教えてほしいです）

```bash
# cordovaの場合
cordova emulate --target=iPad-2 ios

# ionicの場合
ionic emulate --target=iPad-2 iOS
```
20150219 ベストアプリ勉強会

# Androidアプリ開発編

## Sansan

### 評価・品質の話

- ベストアプリ／フィーチャーはないが足切りはある
  - 4.3以上。可能なら4.4以上
- 累計平均評価をひたすら上げよう
  - 品質を上げる
    - ex. 起動しない
    - 大改修時に品質が下がって0.5下がった
    - ユーザーの声を毎朝共有
      - 直接話す
      - 可能であればすぐに直して出す
    - ドロワーの下部に、「問題を報告」
      - 問題が出ると、GooglePlayに書くか、使うのをやめるか
          - 悪い評価をされづらくなる
    - Crashlytics
    - 適切なタイミングで評価をお願いする



## MoneyForward

### デザインリニューアルの話

- なんのためのリニューアル？
  - 目的をもったリニューアルでないと意味が無い
  - 現状の課題を解決する
  - KPI明確に
      - 課題が明確で無い＝リニューアル時期ではない
- 痛みを伴う
  - ネガティブなレビュー・ツイート
  - 評価が一時的に下がる
    - 4.0を下回るとデメリット発生
- リニューアルをゴールにしない
  - 画面遷移を極力かえない（KPI追えなくなる）
  - 継続的な改善

- すすめかた
  - 短期集中
      - 他のコミットのマージ大変
      - デグレやすい
      - 作業中に方向性が変わる
      - 徹底的に議論
          - 途中でコンセプトがぶれないため
      - こだわる部分を決める
      - 開発中はWIPで共有
      - ツール・サービスを活用（Sketchとか）
  - 一気に変える
      - ２つのアプリ同居状態。一本化がつらい
      - 部分的に変えると、長い間ネガティブレビュー。スクショの更新もめんどくさい

## Fablic

### Fril 3.0リニューアル

- 背景
  - TV CM 駆動開発
  - iOS likeなUIが残ってた
- 時間がない。合宿した
- 3人
  - デザイナー、デザイナー&ディレクター、エンジニア
- ペーパープロトタイピングを事前に読む
- リサーチ・共有
  - Googleや他社のアプリをリサーチ。マテリアルデザインのガイドラインも
- ペーパープロトタイピング
  - 紙で書く。全パターン。検討して潰しておくことが大事
- 議論・集約
- ツールプロトタイピング
  - Popで動きをつける
  - PC / Flintoで清書
- ユーザーテスト
  - 社内ユーザーでテスト
  - Popで作ったモックを触ってもらう
- 3.0
 - リニューアル & フラグメントベースに移行

- 質疑
 - POを巻き込むの大事
 - タブレット対応１ヶ月弱
     - フラグメント対応をやってたから




# 開発体制編

## Sansan 開発責任者(webエンジニア)

### 開発のリズム

- 開発体制の紹介
  - Eng 12(mobile3 web8 aws1)
  - その他6

  - PDCA
  - 使用策定。ストーリーベース
      - Pivotal Tracker を使ってる
  - フィードバック
      - 3つのKPI
          - 事業, UserGrowth,？
  - 重要なストーリー: mobile中心
      - mobile サイクル2weeks ~ 1month
      - web 1week
      - 振り返りはどちらも2weeks

- プレミアム機能開発
  - 開発1.5month 全体3month
  - Eightとしては大きいプロジェクト
  - いつもの1weekリリース
  - 1monthを超えるプロジェクトは、フェーズを切って成果物を明確にする
  - リズムを大切に



## MoneyForward CTO

- マーケット出身
  - リスクコントロール
  - 本質を見る
  - 俯瞰的な視点を持つ
- 体制
  - 2013前半
      - 一人
      - 直接つくる。ベンチャーっぽい
  - 後半
      - 二人
      - 開発スピードは加速
      - 気合と根性
  - 2014前半
      - 四人。デザイナーやマーケなど他の部隊
      - ワイヤーを作り、UIデザインも作りこむように
      - 手戻りはあまりない
      - 雲行きが怪しく
  - 2014後半
      - 8人
      - 暗黙知、技術的負債、コミュニケーションコスト

  - 個人ではなくチームの効率を重視
  - 暗黙知対策
      - コードレビュー会
      - Qiita:Team導入で、ナレッジ共有
  - 技術的負債
      - リリース後振り返り会し、リファクタリング時間を確保
  - コミュニケーション効率化
      - 目的に応じて分ける（中長期開発とグロースハック）
      - チームに最適化したプロセス


## Fablic チーフエンジニア（バックエンド）

- 開発体制
  - 2012/4創業,
  - 2012/7 iPhoneリリース（２人）
  - 2013/1 Android開発開始（３人）
  - 2014/1 10人
  - いま 50人

  - Android/iOS/Backend 3:3:4
      - A/i両方できる人も多い

- ベストアプリを取るために
  - 品質を良くする
      - githubでレビュー
      - CIをパスしたコードのみリリース
      - Androidは段階的リリース。10%から
      - 実機テスト
          - テストシートを作って、開発者テスト
          - テストシートもレビュー＆メンテ
          - webと違って修正できない
      - ユーザーとともに開発。実際のユーザーとテスト
          - サポートスタッフとして採用。QAチームを組織
          - リリース前の本番アプリを数週間使ってもらうとか
  - レビュー
      - 良い物も悪いのも返信
      - 困ったらサポートへ案内
      - 最適なタイミングでのレビュー
          - 気持ちが高まるとき（売れた時、買えた時）
  - Platformとのコミュニケーション
      - GoogleIO
          - マテリアルデザイン対応
          - 何よりも早く対応することが大事
          - UX向上になるかは見極める
      - 開発ロードマップをGoogleと共有
          - Nexus6展示会でプリインされたり
シェル関数に、その関数内でだけ有効な関数を含める


* 関数を入れ子にする、的な。


```~/.bashrc
testfunc () {
  innerfunc () {
    pwd
  }
  innerfunc
}
```

```bash
$ cd ~
$ innerfunc
bash: innerfunc: command not found
$ testfunc
/Users/catfist
$ innerfunc
/Users/catfist
$ unset innerfunc
$ innerfunc
bash: innerfunc: command not found
```

* 関数内に関数を書くと、関数実行時に定義される。
* しかし、そのままだと実行後に残ってしまう。
* つまり、関数内で**定義＋削除**を行えば良い。

```~/.bashrc
testfunc () {
  innerfunc () {
    pwd
  }
  innerfunc
  unset innerfunc
}
```

```bash
$ testfunc
/Users/catfist
$ innerfunc
bash: innerfunc: command not found
```

* なお、実行可能ファイル形式のシェルスクリプトの場合、別プロセスで走るので、内部で定義された関数は元のシェルには継承されない。
「年が空だと月は入れたらだめ」みたいな時の validation

`year` が空かどうかで `month` の条件を切り替えているのがポイントです。

ついでに `year` が未来の年でないかもチェックしています。

```rb
validates :year,
          numericality: {
            only_integer: true,
            greater_than_or_equal_to: 1900,
            less_than_or_equal_to: ->(_model) { Date.today.year }
          },
          allow_nil: true
validates :month,
          numericality: {
            only_integer: true,
            greater_than_or_equal_to: 1,
            less_than_or_equal_to: 12
          },
          allow_nil: true,
          unless: ->(model) { model.year.nil? }
validates :month,
          absence: true,
          if: ->(model) { model.year.nil? }
```
ランキング表示させる（PHP＋MySQL）

PHPとMySQL（リレーショナルデータベース）で
SQL文でデータを出力し、ランキング表示されるやり方。

知恵袋で見ても
コードが使えなかったりしたものもあったので
こちらでまとめときます。

簡単な説明

PHP（プログラミング言語の一つ。サーバーとwebページをつなげて
掲示板の書き込みの受信、メールの受信をしたりできる）

MySQL（リレーショナルデータベースの１つ）

SQL（テーブルを結合したり、任意の情報を取得したりと命令する）


例として、○○会社、△△会社という契約している会社があったとして
これの売上データを表示させるようにしたいとします。


![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/64337/2b377dd1-8a45-b176-7397-4c9aa8691f08.jpeg)

(↑MySQLで「sale」というテーブルを予め作っといてください。）







で、このテーブルから　会社の年度ごとの売り上げを出し、降順に並び替え、
ランキング表示させたいと思います。


![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/64337/7e5b76bb-6e3a-6946-c323-e989934896d2.jpeg)



出力したデータは以下の通りになります。


![出力.jpg](https://qiita-image-store.s3.amazonaws.com/0/64337/4e575997-c350-9fb2-cb3e-63a4666c2ca8.jpeg)





（・８・）＜ちゅんちゅん!
ProGuardのメモ

まだよくわからないけど、利用するライブラリによってProGuardの指定をきちんとしないと動かなかったりするらしい。

## Google Play Services

[ドキュメント](http://developer.android.com/google/play-services/setup.html#Proguard)によると以下の指定が必要らしい。

    -keep class * extends java.util.ListResourceBundle {
      protected Object[][] getContents();
    }

    -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
      public static final *** NULL;
    }

    -keepnames @com.google.android.gms.common.annotation.KeepName class *
    -keepclassmembernames class * {
      @com.google.android.gms.common.annotation.KeepName *;
    }

    -keepnames class * implements android.os.Parcelable {
      public static final ** CREATOR;
    }

## OrmLite

[OrmLite DAO](http://ormlite.com/)はリフレクションを使うため、下記指定が必要らしい。

    -keep class com.j256.**
    -keepclassmembers class com.j256.** { *; }
    -keep enum com.j256.**
    -keepclassmembers enum com.j256.** { *; }
    -keep interface com.j256.**
    -keepclassmembers interface com.j256.** { *; }

## Logger

`Caused by: java.lang.ClassCastException: The application has specified that a custom LogFactory implementation should be used but Class 'org.apache.commons.logging.impl.LogFactoryImpl' cannot be converted to 'xc'. Please check the custom implementation. Help can be found @http://commons.apache.org/logging/troubleshooting.html.`
…みたいなエラーメッセージが出る場合は、下記指定をすると良いらしい。

    -keep public class org.apache.commons.** { *; }

## コンストラクター

コードから明示的に使われていないコンストラクターが除去されてしまう場合は、除去しない設定を書く。

    -keepclassmembers class * {
       public <init>(android.content.Context);
    }

## EventBus

[EventBus](https://github.com/greenrobot/EventBus)はリフレクションでonEventメソッドを探すので、下記指定が必要。

    -keepclassmembers class ** {
         public void onEvent(**);
     }

## JSONマッピング用、DBエンティティ用クラス

GsonみたいなJSONマッピング機能やOrmLiteのようなORM機能はリフレクションでフィールドを取得するので、それらのデータを表すためのクラスはフィールドを削除したりしない指定が必要。

    -keepattributes *Annotation*
    -keepclassmembers class com.my.app.data.using.ormlite.** { *; }

ProGuardめんどくさいよう…
Raspberry Pi 2 Bと一緒に揃えたものメモ

買ったものを記録しておきたい。

## 一緒に買ったもの

|| 名称 | 購入場所 | 価格 | リンク |
|:-:|:-:|:-:|:-:|:-:|
| 1 | Raspberry Pi 2 B | マルツ@秋葉原 | 税込5,508円(2015.02.08) | [商品ページ](http://www.raspberrypi.org/products/raspberry-pi-2-model-b/) |
| 2 | FTDI USB シリアル変換ケーブル(3.3V) | 秋月電子@秋葉原 | 税込1,950円(2015.02.08) | [商品ページ](http://akizukidenshi.com/catalog/g/gM-05840/) |
| 3 | SanDisk microSDHC 16GB Class10 UHS-I 並行輸入品 SDSDQUA-016G-U46A | ？@秋葉原 | 税込1,040円(2015.02.08) | [Amazonページ](http://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF-SDSDQUA-016G-U46A-SANDISK-%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%AB%E3%83%BC%E3%83%89-%E4%B8%A6%E8%A1%8C%E8%BC%B8%E5%85%A5%E5%93%81/dp/B007XZL7PC) |

* 単身赴任中でマウス・キーボード・HDMIモニタがなく、PCから操作するためにシリアルケーブルを購入。
* microSDはもっと安く済むが(価格的にもスペック的にも)、買って帰ってすぐに触りたかったからテキトーに。

## 持っていたもの

|   | 用途 | 名称 | 価格 | 参考URL |
|:-:|:-:|:-:|:-:|:-:|
| a | 給電(コンセントから) | ELECOM USBハブ 充電・通信 2A出力 セルフパワー 4ポート U2HS-T201SBK | 1,500円くらい | [Amazon](http://www.amazon.co.jp/ELECOM-USB%E3%83%8F%E3%83%96-%E5%85%85%E9%9B%BB%E3%83%BB%E9%80%9A%E4%BF%A1-%E3%82%BB%E3%83%AB%E3%83%95%E3%83%91%E3%83%AF%E3%83%BC-U2HS-T201SBK/dp/B00DKREKQK) |
| b | 給電(aとRasPiをつなぐ) | microUSBケーブル | 落ちてたやつ0円 | － |
| c | 通信(シリアルケーブルとGPIO間) | ジャンパ線(オス-メス)3本 | 10本以上入って数百円 | [秋月](http://akizukidenshi.com/catalog/g/gP-03471/) |
| d | 通信(RasPiからインターネットへ) | LANケーブル | － | － |
Vimの超入門

#MacVim超入門
##自己紹介
こんにちは。自分の知識をまとめるために記事をどんどん書いていきます。
大学の学部生なので暖かくに見守りください。
まちがったことがございましたらご指摘ください。
私は基本的にはjavascript,HTML5,PHP等の言語を使います。
アプリケーションとかよりは、数値計算やアルゴリズムなどの固い系を主に勉強しています。最近はThree.jsをもちいて物理シミュレーションなどしたりしています。某筆者の元で勉強させてもらっています。ですので、これからはCGだったりjavascriptだったり、数値計算のお話を書いていこうと思っています。
さて、昨日まではsublime Text2をもちいてプログラムを書いていました。
今日から乗り換えるわけではないですがVimをすこしづつつかえるよう勉強していこうとおもいます。
##Vimとは
Vimとはテキストエディタである。
今の自分にはそれしか言えません。
使いこなせるととても便利だとか
##vimのインストール
[Macvimダウンロード先](https://code.google.com/p/macvim/)
適当にダウンロードしてインストールしちゃってください
##モード
Vimにはモードというものが存在するみたいです。

まずはvimをたちあげた時に滞在するモード、ノーマルモード
ノーマルモードでは、テキストエディタなんだからノーマルと言われれば文字の入力かなと思われますよね
しかし、違います。このノーマルモードというのは今から説明する３つのモードを行き来するためのモードとおもっていただければ結構です。
また、カーソルの移動、文字の削除などもできます。

次に挿入モードの説明をします。
このモードは文書を実際にかくモードになります。
ノーマルモードからはa,i,s,cを打つことで移行できます。
では、実際に移行して文字を打ち込んでみましょう。
ノーマルモードにもどるにはEscして戻ります。
次にビジュアルモードです。
ビジュアルモードとは、文章の選択をするときに使います。
移行のしかたは、ノーマルモードからは、v,Vで移行します。
では、移行してみましょう。カーソルを動かしてみましょう。
すると選択されていますね。
ノーマルモードにもどるにはEscして戻りましょう
最後にコマンドモードです。
コマンドモードは、その名の通りコマンドをうち色々なことができます。
推測ですが、このモードこそがvimの強みなのでしょう。
コマンドモードに移行するには:,/,?をノーマルモードで叩いてください。
コマンドモードに移行してみましょう。
試しにセーブせずに終了する:q!→Enterをおしてみてください。
普通にセーブするには、ファイル名をつけてください。
その後であれば:qでセーブすることができます。
###行番号の表示とか
行番号の指定は、コマンドモードで
```
:set number
```
これでできます。
次に気になるのはタブ幅ですね
タブ幅は
```
:set shiftwidth=4//挿入するときの長さ
:set tabstop=4//表示するときの長さ
```

これで変更することができます。

この２つの違いは各自確かめといてください。
gmailで社外の宛先・差出人だけ表示文字色を変える

会社メールとしてgmailを使用している方に是非オススメな設定です。

gmailのメール作成時、ToやCcの入力補助は名前のアタマを少し入力するだけで候補をずらっと並べてくれてとても便利なのですが、ときたま名前が似ている方がいると誤送信のおそれが有ります。
それが社外の人だとなおさら危険です。

また、メール一覧画面では、差出人の名前しか表示されず、それが社内の人なのか、社外の人なのかがぱっと見でわからりづらいです。

たしかThunderbirdとかにはドメインごとに文字色を変える機能があったと思うのですが、、、

その社外の人だけ文字色を変える機能をgmailで実現する方法です。

## イメージ

イメージとしては以下の様な感じで、社外の差出人だけを強調表示します。

| 適用前 | 適用後 |
|:------:|:-----:|
| ![qiita_mail_before.png](https://qiita-image-store.s3.amazonaws.com/0/38570/168d7d57-441f-0261-c564-087b30a0f920.png) | ![qiita_mail_after.png](https://qiita-image-store.s3.amazonaws.com/0/38570/1bb63018-b272-f0d5-ccab-c5d02df77103.png) |


## Stylishのインストール

ブラウザにStylishアドオンをインストールします。
指定したページごとに独自CSSを流しこんでくれるアドオンです。

Firefox用: https://addons.mozilla.org/ja/firefox/addon/stylish/
Chrome用: https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=ja


## 「ユーザスタイル」の登録

Stylishの「新しいスタイルを書く」or「新しいスタイルを作成」で以下を入力します。
"xxxxxxx.com"の部分は自社のドメインを記載します。

```css
span[email]:not([email$="xxxxxxx.com"]) {
    color: #AA3322;
}
```

「適用先」は、"ドメイン上のURL"を選択し、"mail.google.com"を入力します。

Firefoxの場合はこうなるかも。

```css
@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document domain("mail.google.com") {
    span[email]:not([email$="xxxxxxx.com"]) {
        color: #AA3322;
    }
}
```

最後に保存を押して、gmailを念のため再読込させると、社外の差出人や宛先が赤色の文字になっていると思います。
色については上記の `#AA3322` を変更してください。
`font-weight: bold;` を追加すれば太文字にもできます。
連番展開とかするvim plugin(ネタ)

ネタなのでスルーしてください。

昔作った、プラグインです
`[(begin)-(end)]`の部分を連番に展開します。[ExpandSerialNmuber.vim](https://github.com/nocd5/ExpandSerialNumber.vim)

こんなのとか
![expandserialnum2.gif](https://qiita-image-store.s3.amazonaws.com/0/52493/f97226c9-3185-bc6d-3107-2f07798f1086.gif)

素敵な素材画像のDLとか(今気づいたけど、これじゃ上書きされちゃいますね…)
![expandserialnum5.gif](https://qiita-image-store.s3.amazonaws.com/0/52493/25dd143f-b4dc-b2fb-d198-e4bb20e42318.gif)

後方参照的なこととか、計算もできます(evalに投げてるだけですが)
![expandserialnum4.gif](https://qiita-image-store.s3.amazonaws.com/0/52493/48f4e7d9-1483-d2c0-7c44-ed934b60e065.gif)


さて、<br>0-65535に正規化されたSinθを1/1024ステップでの1/4周期分、2進数で表示したいことってよくありますよね！
==========================================================================================
それ1行でできます！

```vim
[substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(substitute(printf("%04x",float2nr(pow(2,16)*sin([0-1023]*0.5*3.141592/1024.0))),"0","0000","g"),"1","0001","g"),"2","0010","g"),"3","0011","g"),"4","0100","g"),"5","0101","g"),"6","0110","g"),"7","0111","g"),"8","1000","g"),"9","1001","g"),"a","1010","g"),"b","1011","g"),"c","1100","g"),"d","1101","g"),"e","1110","g"),"f","1111","g")] 
```
vimで16進数→2進数の変換が分からなかったのでベタ書きしちゃったｗ

おわりに
=======
個人的には頻繁に使ってるんですが、欠点はソースコードが酷いこと
SSLターミネーション環境でもLaravelを動かしたい

意外と無かったので書くよ。
開発中にわざわざ証明書買うのももったいないのでHTTPでテストしてて、いざHTTPSで動かそうとしたら動かないのはよくあること。
ELBとかでSSLターミネーションするような環境で例えばHTMLビルダーでURLを作ってる所がhttp://で展開されちゃうと、httpsでアクセスしてると外部ファイルの読み込みが上手く行かなかったりするわけです。
そんな時は

```lang:filters.php
App::after(function($request, $response)
{
    if (App::environment('production')){
        // Locationヘッダの書き換え
        $location = $response->headers->get('Location');
        if(strstr($location, 'http://')){
            $location = str_replace(url('/'), secure_url('/'),$location);
            $response->header('Location',$location,true);
        }
        // ソース内のURLスキームを全部書き換え
        $content = $response->getContent();
        $content = str_replace(url('/'), secure_url('/'), $content );
        $response->setContent($content);
});
```

こんな風にフィルタのApp::afterでLocationヘッダとかURLをゴリっとhttpsに書き換えてあげると動いたよ、っていうメモでした。
素数判定練習2

#問題
>
与えられた数までの素数を列挙する
処理にかかった時間を計測しておくと、自分の技術向上に伴って処理時間が短くなっていくのがよくわかる

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答
```ruby:prime_number_catalog.rb
# 時間計測に使うライブラリ
require 'benchmark'

# 素数かどうか調べる数を入力
# timesを使うから1つ増やす
print "いくつまでの素数を列挙しますか？ : "
CATALOG_NUMBER = gets.to_i + 1

# ここから時間を計る
result = Benchmark.realtime do
  CATALOG_NUMBER.times do |current_number|
    # 入力された数を割る数
    # 0と1が素数でないことは自明なので2から始める
    prime_numer_judge_count = 2
    # 素数かどうか判定するフラグ
    prime_number_judge_flag = true
    
    # 入力された数が2より小さかったら素数ではない
    unless current_number >= 2
      prime_number_judge_flag = false
    else
      # 入力された数の平方根まで繰り返し
      while prime_numer_judge_count <= Math.sqrt(current_number)
        # 割り切れたら素数じゃないからループ脱出
        if current_number % prime_numer_judge_count == 0
          # 素数判定フラグはfalse
          prime_number_judge_flag = false
          break
        end
        
        # 割る数を1増やす
        prime_numer_judge_count += 1
      end
    end
    
    if prime_number_judge_flag
      puts "#{current_number} "
    end
  end
  
# 時間計測ここまで    
end

puts "処理概要 #{result}s"

```

#結果
>
いくつまでの素数を列挙しますか？ : 10000
2 
3 
5 
7 
11 
13 
17 
19 
23 
29 
…（略）… 
9941 
9949 
9967 
9973 
処理概要 0.273888s
素数判定練習1

#問題
>
与えられた数が素数かどうか調べる
処理にかかった時間を計測しておくと、自分の技術向上に伴って処理時間が短くなっていくのがよくわかる

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答
```ruby:prime_number_judge.rb
# 時間計測に使うライブラリ
require 'benchmark'

# 素数かどうか調べる数を入力
print "素数かどうか調べる数を入力してください : "
PRIME_NUMBER_JUDGE = gets.to_i

# ここから時間を計る
result = Benchmark.realtime do
  # 入力された数を割る数
  # 0と1が素数でないことは自明なので2から始める
  prime_numer_judge_count = 2
  # 素数かどうか判定するフラグ
  prime_number_judge_flag = true
  
  # 入力された数が2より小さかったら素数ではない
  unless PRIME_NUMBER_JUDGE >= 2
    prime_number_judge_flag = false
  else
    # 入力された数の平方根まで繰り返し
    while prime_numer_judge_count <= Math.sqrt(PRIME_NUMBER_JUDGE)
      # 割り切れたら素数じゃないからループ脱出
      if PRIME_NUMBER_JUDGE % prime_numer_judge_count == 0
        # 素数判定フラグはfalse
        prime_number_judge_flag = false
        break
      end
      
      # 割る数を1増やす
      prime_numer_judge_count += 1
    end
  end
  
  # 結果出力
  if prime_number_judge_flag
    puts "#{PRIME_NUMBER_JUDGE}は素数です"
  else
    puts "#{PRIME_NUMBER_JUDGE}は素数ではありません"
  end
# 時間計測ここまで    
end

puts "処理概要 #{result}s"

```

#結果
>
素数かどうか調べる数を入力してください : 9999991
9999991は素数です
処理概要 0.403857s

#備考
9999991は1000万以下の最大の素数
FizzBuzz練習

#問題
>
なんか偉い人が考えた問題
ルールは以下の通り
1. 1から順番に数を表示する
2. その数が3で割り切れるなら"Fizz"、5で割り切れるなら"Buzz"、両方で割り切れるなら"FizzBuzz"と表示する
要するに"1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz ･･･"と出力される
プログラマかどうかがわかるんだとさ

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答（if文使用）
```ruby:fizzbuzz.rb
# 実行回数の入力
print "実行回数を入力してください : "
FIZZBUZZ_COUNT = gets.to_i

# FIZZBUZZ_COUNTの数だけ繰り返し
1.upto(FIZZBUZZ_COUNT) do |fizzbuzz_count_time|
  # 15で割り切れたら"FizzBuzz"と出力
  if fizzbuzz_count_time % 15 == 0
    print "FizzBuzz"
    
  # 5で割り切れたら"Buzz"と出力  
  elsif fizzbuzz_count_time % 5 == 0
    print "Buzz"
    
  # 3で割り切れたら"Fizz"と出力  
  elsif fizzbuzz_count_time % 3 == 0
    print "Fizz"
  
  # 3でも5でも15でも割り切れたらその数をそのまま出力  
  else
    print "#{fizzbuzz_count_time}"
  end
  
  # スペースを表示
  print " "
end
```

#解答（case文使用）
```ruby:fizzbuzz_2.rb
# 実行回数の入力
print "実行回数を入力してください : "
FIZZBUZZ_COUNT = gets.to_i

# FIZZBUZZ_COUNTの数だけ繰り返し
1.upto(FIZZBUZZ_COUNT) do |fizzbuzz_count_time|
  case
  # 15で割り切れたら"FizzBuzz"と出力
  when fizzbuzz_count_time % 15 == 0
    print "FizzBuzz"
    
  # 5で割り切れたら"Buzz"と出力  
  when fizzbuzz_count_time % 5 == 0
    print "Buzz"
    
  # 3で割り切れたら"Fizz"と出力  
  when fizzbuzz_count_time % 3 == 0
    print "Fizz"
    
  # 3でも5でも15でも割り切れたらその数をそのまま出力  
  else
    print "#{fizzbuzz_count_time}"
  end
  
  # スペースを表示
  print " "
end
```

#結果
>
実行回数を入力してください : 30
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz
ループ練習2

#問題
>
Hello World!をn回表示してください。
コマンドラインから入力を受け取って、n回表示するようにしてください。
何回目のHello World!かも表示してみてください。

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答

```ruby:loop_training2.rb
# ループ回数の入力
print "ループ回数を入力してください : "
LOOP_COUNT = gets.to_i

# LOOP_COUNTの数だけ繰り返し
1.upto(LOOP_COUNT) do |loop_count_time|
  puts "Hello World! #{loop_count_time}"
end
```

#結果
>
ループ回数を入力してください : 7
Hello World! 1
Hello World! 2
Hello World! 3
Hello World! 4
Hello World! 5
Hello World! 6
Hello World! 7
ループ練習1

#問題

>Hello World![改行]を5回表示させてください。 
print(或いはprintf,cout等)を5回コピーすれば当然可能ですが、
ループ構文(for,while等)を利用してprint等は1回の使用にとどめてみてください。

※[こちらのサイト](http://vipprog.net/wiki/exercise.html)から引用

#解答

```ruby:loop_training.rb
# ループ回数の定義
LOOP_COUNT = 5

# LOOP_COUNTの数だけ繰り返し
LOOP_COUNT.times do
  puts "Hello World!"
end
```

#結果
>
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
DB2でdb2inst1ユーザ以外にデータベースの作成権限を付与する

# 環境

DB2 バージョン 9, 10あたり on CentOS を想定

# 動機

db2inst1 以外のユーザにデータベース作成権限を渡すために、SYS_ADM 権限や SYS_CTRL 権限を付与しようとして

```bash
db2 update dbm config using ...
```

といろいろ頑張っていたがなかなかできなかった。

# 方法

ここで紹介する方法はユーザをDBM管理者グループに追加する方法である。これが手っ取り早い。

```
gpasswd -a <ユーザ> db2iadm1
```

実行後にユーザはログインし直す必要がある。

# 注意

もちろん作成以外にも削除やら何やら、色々できるので注意が必要である。
Pythonでのデータ分析初心者がまず見るべき情報源のまとめ

データ分析言語としてデータサイエンスの世界での存在を日々増している(と言われる)Python。
Pythonでのデータ分析、特にPandasの使い方についてまとめてみました。

・Rユーザーの方がPythonを使いたい場合には特に有用だと思います。
・基本的なデータハンドリングの方法に主眼をおいています。


# **RユーザーがPandas,Numpyを使う場合の早見表**
#####**【Slide Share】Python for R uses**
Rで使う記法をPythonで再現するにはどうしたらいいかの
比較早見表が列記されており、RでやっていたことをPythonでやろうと
思ったらかなり有用だと思います。 
http://www.slideshare.net/ajayohri/python-for-r-users

#####**【Pandas Official】Pandas -comparison with R**
上記と同様、Rでの文法をPandasで実現しようと思った時の
記法比較がひたすら書かれてる。
http://pandas.pydata.org/pandas-docs/stable/comparison_with_r.html 

#####**◆Comparing dplyr in R and Pandas**
Dplyrでの 表記とPandasでの表記の対応比較をやっている神ページ
Rでできるけど、Pandasにない機能は「できない」と言い切ってくれているので清々しい。
Dplyrで定番のFlightデータを使った解説なので、R userには馴染みがあるはず。
http://goo.gl/7dNzE6

#####**◆Numpy for R users**
RNumpy の文法をRで(ry
結構ボリュームが有り、使えそう。 
http://mathesaurus.sourceforge.net/r-numpy.html

# **Pandas初学者のためのTipsサイト**
【Pandas Official】Ten Minutes Work to Pandas
http://pandas.pydata.org/pandas-docs/stable/10min.html

#####**◆Pandasでデータ分析を詳しく**
pd.DFのアクセスのための記法が詳しく書かれている。
ix[],iloc[]など。
http://sinhrks.hatenablog.com/entry/2014/11/12/233216

#####**【SlideShare】Pandas超入門**
DFやSeriesの扱い方の基礎の基礎
http://goo.gl/FoqmCs


## とりあえず手っ取り早くPandasを使えるようになりたい方へ
こちらの記事もどうぞ
上記を色々読んだ上で、Pandasでよく使う手法をまとめています

◆Python Pandasでのデータ操作の初歩まとめ メソッド一覧表
http://qiita.com/hik0107/items/d991cc44c2d1778bb82e
Polymer


次バージョンの `TogoStanza` は、`Polymer` で実装するらしいんで、 `ruby` free ですよーーーと。

極力触りたくなかった `JavaScript` の勉強は避けられないものと判断せざるを得ない。更には、`SPARQL` 、、、

## Node.js
のインストール。 `anyenv`（からの `ndenv`） の使用前提の元なので注意

```shell-session:
$ anyenv install ndenv
$ exec $SHELL -l
$ ndenv install v0.12.0
$ ndenv rehash
```

## bower と http-server

```shell-session:
$ ndenv global v0.12.0
$ npm install -g bower 
$ ndenv rehash
$ npm install -g http-server
```
OS X では元々 `Node.js` はインストールされてないから、他の `env` 系とは違い global で設定した

## Polymer

```shell-session:
$ mkdir tmpdir
$ cd tmpdir
$ bower init
$ bower install --save Polymer/polymer
$ bower install --save Polymer/core-elements
$ bower install --save Polymer/paper-elements
```

したら `bower_components` ディレクトリが出来る。

## sortable-table
適当にみつけた[テーブル系のコンポーネント](https://github.com/stevenrskelton/sortable-table)をインストールして、


```bash:
bower install --save sortable-table
```

index.html を書き

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <script src="bower_components/webcomponentsjs/webcomponents.min.js"></script>
    <link rel="import" href="bower_components/sortable-table/sortable-table.html" />
    <link rel="stylesheet" href="bower_components/sortable-table/css/bootstrap.css" shim-shadowdom />
  </head>
  <body>
    <div class="panel panel-default">
      <div class="panel-heading">Optional heading</div>
      <sortable-table class="bootstrap" footerTemplate="indexedPager">
        <sortable-column>fruit</sortable-column>
        <sortable-column>alice</sortable-column>
        <sortable-column>bill</sortable-column>
        <sortable-column>casey</sortable-column>
        <!-- data case be either an Array, JSON, or JSON5 -->
        [
          [ "apple", 4, 10, 2 ],
          [ "banana", 0, 4, 0 ],
          [ "grape", 2, 3, 5 ],
          [ "pear", 4, 2, 8 ],
          [ "strawberry", 0, 14, 0 ]
        ]
      </sortable-table>
    </div>
  </body>
</html>
```
サーバー起動して、

```shell-session:
$ http-server
```

で、以下の URL へ。

http://localhost:8080/index.html

~~さわり~~導入部分は何でも簡単なんだよな、、、
Spreadsheet::ParseXLSX


エクセルなんざ無縁だった自分が、何で日本語混りのエクセルの解析なんざせにゃならんのよ、、、
ボヤいても仕方ない。普通にパーサをインストール。
\# Numbers しか使ってない、、、

## インストール

```bash:
$ cpanm Spreadsheet::ParseXLSX
```

### 挙動確認
さくっと。

```perl:
use v5.12 ;
use Spreadsheet::ParseXLSX;
use utf8 ;


binmode(STDOUT, ":utf8");
my $parser = Spreadsheet::ParseXLSX->new;
my $workbook = $parser->parse("file.xlsx");

my $worksheet = $workbook->worksheet(0) ;

my ( $row_min, $row_max ) = $worksheet->row_range();
my ( $col_min, $col_max ) = $worksheet->col_range();

for my $i ($row_min .. $row_max ) {
    my $row = $i + 1 ;
    my $col = q{A} ;
    for my $j ( $col_min .. $col_max  ) {

        my $cell = $worksheet->get_cell( $i, $j );
        next if ! defined $cell;

        printf "%s\n",  join "\t",
            +( $col ++ ) . $row , 
            $cell->value()
            ;

    }
}
```
* `binmode` なんて初めて使ったよ。
* マジックインクリメントが初めて役に立ったよ。

### 日本語が変。
普通に使おうと思ったら日本語が変。読みがなが付く。
ググったら、モジュール弄って対応してた人がいた。
出来れば、モジュールを直接弄るのは避けたいと思い、更に彷徨うも、その人以外の情報が無い。

仕方ないので、その人に倣おうと思ったら、バージョン違いでモジュールも多少変化（ 20150219 現在）。

```shell-session:
$ perl -MSpreadsheet::ParseXLSX\ 42
Spreadsheet::ParseXLSX version 42 required--this is only version 0.16.
BEGIN failed--compilation aborted.
```
コード的にはちょっとした違いしか無かったけれど、ま、もののついでで、自分で書こう。


### 解決？
挙動を確認したら、手元の環境とデータにおいては、以下で対応出来そう。

```shell-session:
$ perldoc -l Spreadsheet::ParseXLSX
/Users/XXX/.anyenv/envs/plenv/versions/5.18.4/lib/perl5/Spreadsheet/ParseXLSX.pm
$ diff -u ParseXLSX.pm.bak ParseXLSX.pm
--- ParseXLSX.pm.bak    2015-02-19 18:23:18.000000000 +0900
+++ ParseXLSX.pm        2015-02-19 18:50:40.000000000 +0900

                     # XXX this discards information about formatting within cells
                     # not sure how to represent that
-                    push @$PkgStr,
-                      join( '', map { $_->text } $si->find_nodes('.//t') );
+                    #push @$PkgStr,
+                    #  join( '', map { $_->text } $si->find_nodes('.//t') );
+                    my $rubi = join '', map{ $_->text } $si->find_nodes('.//rPh') ;
+                    ( my $tgt  = join '', map{ $_->text } $si->find_nodes('.//t') ) =~ s/${rubi}$// ;
+                    push @{$PkgStr}, $tgt ;
+                    
                     $twig->purge;
                 },
             }
```
最初は、`($si->find_nodes('.//t'))[0]->text` でいいじゃんと思ったけど、`[1]` にもルビ以外が現われるよ、、、


バージョンアップの度に、コレでパッチ当てんの？
面倒くさー
Windowsサービスの起動バッチ

### 管理者で起動

まずバッチを起動するのにいちいち右クリックで「管理者として実行」が面倒です
ショートカットを作成して詳細設定で「管理者として実行」を設定しておけばいいですが、他人に渡すときに説明するのを忘れてしまいます

最初の部分で管理者として実行されていない場合は自分自身を管理者として実行し直します


### MSSQLSERVERサービスを起動する場合


```bat:MSSQLSERVER-start.cmd

REM SQL Server (MSSQLSERVER)開始

for /f "tokens=3 delims=\ " %%i in ('whoami /groups^|find "Mandatory"') do set LEVEL=%%i

if not %LEVEL%==High (
powershell start-process -verb runas '"%~f0" %*'
exit
)

net start MSSQLSERVER

timeout /t 30
```
ファイル名をコピー

### ファイル名をコピー

以下のスクリプトを保存して
sendToにショートカットをおいておく

```VB:copyfilename.vbs
Option Explicit

Dim tmp
Dim tmpPath
Dim Args
Set Args = CreateObject("System.Collections.ArrayList")

IF WScript.Arguments.Count > 0 Then
	For Each tmp In WScript.Arguments
		tmpPath = Split(tmp, "\")
		Args.Add tmpPath(Ubound(tmpPath))
	Next
	Call PutInClipboardText( Args.ToArray() )
End If


Public Sub PutInClipboardText(ByVal arr)
	Dim cmd
	Dim str
	Dim WSH
	str = Join(arr, "\n")
	cmd = "mshta.exe ""javascript:clipboardData.setData('text', '" & str & "');close()"""
	Set WSH = CreateObject("WScript.Shell")
	Call WSH.Run("%ComSpec% /c " & cmd, 0, false)
End Sub
```
フルパスをコピー


### フルパスをコピー

以下のスクリプトを保存して
sendToにショートカットをおいておく

```vbnet:copyfullpath.vbs
Option Explicit

Dim tmp
Dim Args
Set Args = CreateObject("System.Collections.ArrayList")

IF WScript.Arguments.Count > 0 Then
	For Each tmp In WScript.Arguments
		Args.Add tmp
	Next
	Call PutInClipboardText( Args.ToArray() )
End If


Public Sub PutInClipboardText(ByVal arr)
	Dim cmd
	Dim str
	Dim WSH
	str = Replace(Replace(Join(arr,vbCrLf),"\","\\"),vbCrLf,"\n")
	cmd = "mshta.exe ""javascript:clipboardData.setData('text', '" & str & "');close()"""
	Set WSH = CreateObject("WScript.Shell")
	Call WSH.Run("%ComSpec% /c " & cmd, 0, false)
End Sub
```
ツリーをコピー


### ツリーをコピー

以下のスクリプトをどこかに保存して
sendToにショートカットをおいておく

```vbnet:copytree.vbs
Option Explicit

Sub treeclip(currentPath)
	Dim WSH, sCmd
	Set WSH = CreateObject("WScript.Shell")
	sCmd = "tree " & currentPath & " /f|clip"
	Call WSH.Run("%ComSpec% /c " & sCmd, 0, false)
	Set WSH = Nothing
End Sub

IF WScript.Arguments.Count > 0 Then
	Call treeclip(WScript.Arguments(0))
End If
```
odコマンドを使用して特定プロセスの環境変数を綺麗に表示する

serviceや別のシェルから起動されたプロセスがどんな環境変数で動いているのかを確認したいことが時々あります。
いままでは`cat`を使って表示していましたが、`od`を使うと見やすいことに気づいたので共有しておきます。

動作確認環境
------------
* CentOS 6.6
* CentOS 7.0

`cat`による環境変数の表示
----------------
実行中のプロセスに関連した情報は`/proc/[PID]`の下に格納されており、環境変数は`/proc/[PID]/environ`で見ることができます。

```
$ cat /proc/[PID]/environ
LANG=ja_JP.utf-8USER=sheileLOGNAME=sheileHOME=/home/sheilePATH=/usr/local/bin:/usr/binMAIL=/var/mail/sheileSHELL=/bin/zsh...
```

この方法でも一応見ることができますが、各設定の区切りが`¥0`となっており、catで表示すると全て繋がって表示されてしまいます。この状態だと`grep`などでの絞り込みもしづらく、ちょっと不便に感じていました。

`od`による環境変数の表示
------------------
`od`コマンドにはバイナリに含まれる文字列を表示する`-S`オプションがあり、これを使うことで上述した`environ`ファイルを綺麗に表示することができます。

```
$ od -S1 /proc/[PID]/environ
0000000 LANG=ja_JP.utf-8
0000021 USER=sheile
0000035 LOGNAME=sheile
0000054 HOME=/home/sheile
0000076 PATH=/usr/local/bin:/usr/bin
0000133 MAIL=/var/mail/sheile
0000161 SHELL=/bin/zsh
...
```

オフセットも邪魔な場合には`-A`オプションで消してしまいましょう。

```
$ od -S1 -An /proc/[PID]/environ
LANG=ja_JP.utf-8
USER=sheile
LOGNAME=sheile
HOME=/home/sheile
PATH=/usr/local/bin:/usr/bin
MAIL=/var/mail/sheile
SHELL=/bin/zsh
...
```
HerokuでNode.jsのアプリケーションをデプロイする時のengineのstableが0.12.xになっていた

```package.json
  "engines": {
    "node": ">= 0.10.x",
    "npm": ">= 1.4"
  },
```

こういう書き方をしていたHubotのデプロイが突然コケるようになってて気付いた

[Node.js deploys defaulting to Node 0.12.0 (latest stable) | Heroku Dev Center](https://devcenter.heroku.com/changelog-items/610) ということらしい

```
$ git push heroku master                                                                                          

-----> Node.js app detected

-----> Reading application state
       package.json...
       build directory...
       cache directory...
       environment variables...

       Node engine:         >= 0.10.x
       Npm engine:          >= 1.4
       Start mechanism:     Procfile
       node_modules source: package.json
       node_modules cached: true

       NPM_CONFIG_PRODUCTION=true
       NODE_MODULES_CACHE=true

-----> Installing binaries
       Resolving node version >= 0.10.x via semver.io...
       Downloading and installing node 0.12.0...
       Resolving npm version >= 1.4 via semver.io...
       npm 2.5.1 already installed with node

-----> Building dependencies
       Node version changed (v0.10.35 => v0.12.0); invalidating cache
       Installing node modules
```

0.12.0 をインストールしはじめてる

```
$ curl https://semver.herokuapp.com/node/resolve
0.12.0

$ curl https://semver.io/node/stable                                      
0.12.0
```

ここのエンドポイントに依存して切り替えているっぽい

https://github.com/heroku/heroku-buildpack-nodejs/blob/f3cbf81b2fdb4e1c1d11c9d5eee67fcdf96a2dd7/lib/build.sh#L107

```package.json
  "engines": {
    "node": "~>0.10.x",
    "npm": ">= 1.4"
  },
```

こう書き換えると0.10.x系の環境でデプロイできる

```
-----> Node.js app detected

-----> Reading application state
       package.json...
       build directory...
       cache directory...
       environment variables...

       Node engine:         >= 0.10.9 <0.12
       Npm engine:          >= 1.4
       Start mechanism:     Procfile
       node_modules source: package.json
       node_modules cached: true

       NPM_CONFIG_PRODUCTION=true
       NODE_MODULES_CACHE=true

-----> Installing binaries
       Resolving node version >= 0.10.9 <0.12 via semver.io...
       Downloading and installing node 0.10.36...
       Resolving npm version >= 1.4 via semver.io...
       Downloading and installing npm 2.5.1 (replacing version 1.4.28)...
```
-lstdc++を付けてもundefined reference to `operator new(unsigned)'のエラーが出る場合について

#概要

> undefined reference to `operator new(unsigned)'

のエラーが大量に出てなんだと思ったら

> -lstdc++

付けないと出るよとの事だったので、付けてコンパイルするも相変わらずコンパイルできず。

そもそもg++でコンパイルしてるんだからデフォルトで付けてgcc呼ばれてるのではと思いつつ試行錯誤したときの話

#-m32オプションが悪さしてた
結局-m32オプションが悪さしていました。

CentOS5 x86_64にてopensslのライブラリを-m32オプションを付けずにビルド。
その後、そのopensslライブラリをリンクした別のプログラムを-m32オプションを付けてビルド。

そうすると

> undefined reference to `operator new(unsigned)'

のエラーがopenssl側のライブラリで大量に出るといった具合です。
32bitと64bitで動作が変わる関数に関しては未定義と言われて当然かもしれないなとか思いつつ、

ぐぐった際に-lstdc++付けろ以外の回答がまるで見つからないので同じようにはまった人の為に書き残しておきます。

ちなみに解決策としてはopensslライブラリを-m32オプションでビルドするか、または-m32付けずに本体のアプリケーションビルドするかして、どっちかに統一すれば治ります。

new以外でエラーが出なかったのがちょっと気になります。それ以外にbit数が変わって動作が変わるような関数使ってないからですかね・・・
Laravel5 の Eloquent で SoftDelete を行う

やり方が変わっている
Illuminate\Database\Eloquent\SoftDeletes の trait SoftDeletes を使う

なお、Schemaに deleted_at カラムが必要

```
$table->dateTime('deleted_at')->nullable();
```

https://laracasts.com/discuss/channels/general-discussion/l5-date-default-timezone-error-on-clear-compiled

http://laravel.com/docs/5.0/upgrade#upgrade-4.2
JavaScriptで対象のプロパティが存在しない場合にデフォルト値を使う方法

## プロパティが存在しない場合の挙動

```js
var object = {
  value:'hoge'
};

console.log(object.key);

// 存在しないプロパティだとundefinedになる
undefined
```

JavaScriptでは存在しないプロパティにアクセスすると、エラーでは無くundefinedになります。

## JavaScriptにおけるundefinedの値評価について

[JavaScript] null とか undefined とか 0 とか 空文字('') とか false とかの判定について - Qiita 
http://qiita.com/phi/items/723aa59851b0716a87e3

上記の記事が参考になります。

こちらに記載がある通り、undefinedはJavaScriptではfalseになります。


## オブジェクトのプロパティにデフォルト値を使う

```js
var object = {
  value:'hoge'
};

var defaultObject = {
  value: 'key' in object ? object.key : 'defaultValue'
}

console.log(defaultObject.value);

// object.keyが存在しないので、デフォルト値のdefaultValueになる
defaultValue
```

以前はいちいち、typeof object.key !== 'undefined'みたいに書いていたので、かなりコードの省略が出来るようになりました。

以上です

これ間違ってるよ！とか、もっといい書き方があればぜひ教えて下さい！
公開鍵はどこで作成すべき？（続）

先日の記事（[公開鍵はどこで作成すべき？](http://qiita.com/satonasu/items/e3981e1be22f2e4c30fa)）の続編。

…というか、結論をひっくり返し、

　**SSH の接続元**

で作成したほうが良い、ということになった。

以下、
・SSH の接続元を test_client
・SSH の接続先を test_server
として、手順の形式で書いていく。

## 1. 鍵ペアの生成
まずは test_client にて、鍵ペアを作成する。

```
[satonasu@test_client ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/satonasu/.ssh/id_rsa): ← 作成先のパスとファイル名を指定
Created directory '/home/satonasu/.ssh'. ← .ssh ディレクトリが作成される
Enter passphrase (empty for no passphrase): ← パスフレーズを入力
Enter same passphrase again: ← パスフレーズをもう一度入力（確認）
Your identification has been saved in /home/satonasu/.ssh/id_rsa.
Your public key has been saved in /home/satonasu/.ssh/id_rsa.pub.
```

この手順だと、.ssh ディレクトリを自分で作成する必要はない。
下記の通り、アクセス権もちゃんと 700 で作成される。

```
[satonasu@test_client ~]$ ls -dl /home/satonasu/.ssh
drwx------. 2 satonasu satonasu 4096  2月 19 08:25 2015 /home/satonasu/.ssh
```

公開鍵のアクセス権は 644 だが、ここでは問題ない（後述）。

```
[satonasu@test_client ~]$ ls -l /home/satonasu/.ssh
-rw-------. 1 satonasu satonasu 1675  2月 19 08:25 2015 id_rsa
-rw-r--r--. 1 satonasu satonasu  403  2月 19 08:25 2015 id_rsa.pub
```

## 2. 公開鍵の転送
ここで普通に（scpで）転送してしまうと、SELinux 的にアウトな状態となる。

具体的には、下記のように、user_home_t となってしまい、
SELinux が有効な環境では id_rsa.pub が読まれなくなってしまう。

```
[satonasu@test_server ~]$ ll -Z　/home/satonasu/.ssh/
-rw-r--r--. satonasu satonasu unconfined_u:object_r:user_home_t:s0 id_rsa.pub
```

そこで、ssh-copy-id コマンドを使う。

```
[satonasu@test_client ~]$ ssh-copy-id -i /home/satonasu/.ssh/id_rsa.pub satonasu@test_server
Now try logging into the machine, with "ssh 'satonasu@test_server'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
```

転送先(test_server)を見てみると…

```
[satonasu@test_server ]$ ll -Z /home/satonasu/.ssh/
-rw-------. satonasu satonasu unconfined_u:object_r:ssh_home_t:s0 authorized_keys
```

完璧。
ssh_home_t になっているし、アクセス権も 600 に変更されている。
先ほど転送元でアクセス権が 644 でも問題ないのは、ここで変更されるからだ。

そして名前もちゃんと authorized_keys になっている。

ちなみに、転送先に .ssh ディレクトリがない状態で実行したが問題なく、
ちゃんとアクセス権 700 で作成されていた。

さらに、既に公開鍵が登録されている状態で実行すると、ちゃんと追記される。
※同じ公開鍵でも追加となってしまう点は注意

こんな便利なコマンドを知らなかったとは…。

// 先日の記事にコメントを下さった iwaim@github さん、toru_miyahara さんに、この場を借りてお礼申し上げます。
git-flowを使った日々の開発フローのふりかえり

知らず知らずのうちに、弊社内のsrcリポジトリの開発フローがgit-flowに沿ったものになっているようです。まだイマイチ理解できていないスタッフ向けに、ここで簡単におさらいし、一歩進んでリリースまでを復習してみようと思います（私は軟弱なのでSourceTreeを使います）。

詳しくGitを知りたい人は、まずはこちら。

- [サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/)

こちらは弊社疋田のまとめ記事です。

- [Git初心者のためのGit入門 - Qiita](http://qiita.com/shunhikita/items/0729c2a3b76d745eb626)

git-flowの概要を知りたい方は、以下が参考になりました。基本的なGitの使い方が分かっていれば理解できると思います。

- [Gitブランチを使いこなすgit-flow／GitHub Flow入門（1）：いまさら聞けない、成功するブランチモデルとgit-flowの基礎知識 (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html)
- [Gitブランチを使いこなすgit-flow／GitHub Flow入門（3）：図とコマンドで分かる！ git-flowによる開発の流れと使い方 (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1401/06/news013.html)

# 1. 初期化

`git flow init`に相当します。SourceTreeを使っていればgit-flowのワークフローの準備は簡単です。メニュー右上の「Git Flow」で、デフォルトのブランチ名のままOKすれば、git-flowで使われるブランチ群が作成されます。

![Screen_Shot_2015-02-17_at_6_52_24_PM.jpg](https://qiita-image-store.s3.amazonaws.com/681/27707/1ae86fc5-0799-1ca1-c692-673d2212550a.jpeg)

# 2. 日々の開発作業

`git flow feature ~`に相当します。機能の開発を行うときは、`develop`ブランチから機能についての`feature`ブランチを作成して開発を進めます。SourceTreeから実施するには、以下の手順を踏みます。

## 対応開始

`feature`ブランチを作成します(例として`feature/feature_a`を追加します）。

![Screenshot_2_19_15__4_31_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/8db3ef69-a76a-a7d9-bbbf-aedbf4fa71ab.jpeg)

## 対応中

作成したfeatureブランチに対して成果物をコミットしていきます。

## 対応完了

機能の実装、テストが完了したら、メニュー右上の`Git Flow`から`Finish Current`を選択し`develop`ブランチにマージします。rebaseするのか明示的にmergeコミットするのか、といった点はプロジェクトの方針に合わせてご自由に。

![convert_kana__Git__and_Edit_-_Qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/c3bd13f2-b93e-9565-5c45-aa222e5b174f.jpeg)

![Screenshot_2_19_15__5_06_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/404ba755-7551-658c-b564-4f4f76297515.jpeg)

完了したら`develop`ブランチにマージされていることが確認できると思います。

# 3. リリース作業

`git flow release ~`に相当します。リリースに必要な機能の開発が進んだら、いよいよリリース準備をします。大まかな流れとしては、`release/1.0.0`のようなリリース準備用のブランチを作成し、リリース作業を行います。以下の記事がよくまとまっていました。

[Git Flowによるリリース ｜ Developers.IO](http://dev.classmethod.jp/tool/git/git-flow-release/)

# 4. 緊急対応

`git flow hotfix ~`に相当します。リリース後に発生した不具合にへの対応など、緊急対応はhotfixブランチを作成して行います。具体的な例を以下に示します。

## 対応開始

メニュー右上の`Git Flow`から`Finish Current`を選択し、hotfixブランチを作成します（例として`hotfix/0.1.1`とします）。

## 対応中

作成したhotfixブランチ`hotfix/0.1.1`に対してコミットしていきます。

## 対応完了

対応が完了したらメニュー右上の`Git Flow`から`Finish Current`を選択し、リリース準備に入ります。ここで`OK`すると、`hotfix/0.1.1`がリリースされます。Tagに修正概要をメッセージとして残すと良いでしょう。

![Screenshot_2_19_15__4_08_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/fbd12e60-323f-e540-aa71-ba18217d0ec2.jpeg)

具体的には、`master`ブランチと`develop`ブランチに`hotfix/0.1.1`の修正内容がマージされ、`master`ブランチに、最初に入力した`Hotfix Version`のタグ`0.1.1`が打たれます。

![convert_kana__Git__and_Git_Flowによるリリース_｜_Developers_IO_and_SourceTree.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/e080e595-a197-74aa-113f-c421161704e3.jpeg)

これで修正対応のリリースは完了です。

# その他参考

- [git-flowを試す - Qiita](http://qiita.com/tanishi/items/09e72c65c0a0c9e1cc10)
HTMLヘルパーのlinkでタグを使う


iconフォントを使いたい時など。

optionに`'escape' => false`を指定する。

```
echo $this->Html->link(
	'<i class="fa fa-facebook"></i>facebook',
	array(
		'controller' => 'users',
		'action' => 'index'
	),
	array(
		'class' => 'btn btn-success',
		'escape' => false
	)
);
```
AWS SDK for .NET で CloudSearch から検索してみる

## 準備

検索対象となるデータソースの登録をAWSコンソール上から行う
http://dev.classmethod.jp/cloud/aws/amazon-cloudsearch-japanese-text/

## AWS SDK for .NET のインストール

Visual Studio の「NuGetパッケージの管理」からインストールする。
![awssdk.png](https://qiita-image-store.s3.amazonaws.com/227/31075/285abda9-8988-715e-1b82-33056abc400a.png)

## 実装

```csharp
using Amazon.CloudSearchDomain;
using Amazon.CloudSearchDomain.Model;

public class CloudSearchClient
{
    private readonly AmazonCloudSearchDomainClient cloudSearchDomainClient;

    public CloudSearchClient(string awsAccessKeyId, string awsSecretAccessKey, string serviceUrl)
    {
        cloudSearchDomainClient = 
            new AmazonCloudSearchDomainClient(awsAccessKeyId, awsSecretAccessKey, serviceUrl);
    }

    public long CountSearchResult(string query)
    {
        var request = new SearchRequest
        {
            Query = query
        };

        SearchResponse response = cloudSearchDomainClient.Search(request);
        return response.Hits.Found;
    }
}
```

* `awsAccessKeyId` `awsSecretAccessKey` はAWSコンソール上から取得。取得方法は[コチラ](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/ManagingCredentials.html)。
* `serviceUrl` はAWSコンソール上から取得。「CloudSearch > Dashboard > Search Endpoint」
　　ex) http://search-sampledomain-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com
* `query` は検索キーワード。詳細は[コチラ](http://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/searching.html)。
CentOSで複数NICでマルチホーミング

iproute2がインストールされているか確認

rpm -qa | grep iproute-2

入っていたら下記のような返答あり。
iproute-2.6.32-23.el6.x86_64

現在のルールを確認

ip rule

local main default 3つのルーティングテーブルが確認できる

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

ルーティングテーブルを追加
192.168.0.100からのパケットの応答は、優先度10000のtable 1を使用

ip rule add from 192.168.0.100 table 1 prio 10000

table 1のデフォルトゲートウェイは192.168.0.1と指定

ip route add table 1 default via 192.168.0.1

再起動すると消えてしまいますので
vi /etc/rc.d/rc.local

/sbin/ip rule add from 192.168.0.100 table 1 prio 10000
/sbin/ip route add table 1 default via 192.168.0.1

と exit 0 の上に記載。
設定後のルールを確認

ip rule

0:      from all lookup local
10000:  from 192.168.0.100 lookup 1
32766:  from all lookup main
32767:  from all lookup default

main ルティングテーブル確認

ip route show table main

192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.100
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.100
default via 192.168.0.1 dev eth0

先ほど作成した table 1 ルーティングテーブルを確認

ip route show table 1

default via 192.168.1.1 dev eth1

覚書です。