OmniAICreator/Qiita-1.07M huggingface dataset:
PowershellでUnix時刻とDateTimeの相互変換

ぐぐってみて案外日本語の情報がないので、自分の防備録のためにもQiita投稿しておきます。
1970年1月1日 0時0分0秒のEpoch時刻から引き算足し算すればいいだけってのだけ理解してれば簡単に作れます。

Powershellの関数であれば、ログ解析なんかにも組み込めると思うのでどうぞご利用ください。

```ps1
function Convert-UnixTimeToDateTime($unixTime){
   $origin = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0
   $origin.AddSeconds($unixTime)
}
```

```ps1
function Convert-DateTimeToUnixTime($dateTime){
   $origin = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0
   [Int]($dateTime-$origin).TotalSeconds
}
```

UTC云々の部分はあえて省いてます。offsetをどうするか、という問題でしかないので、
それはこの関数を通す前後で処理しておいてください。
この考えが間違っていたら指摘をお願いします。

[参考]
Convert Unix time with PowerShell
http://stackoverflow.com/questions/10781697/convert-unix-time-with-powershell
rails4-autocompleteを使ったオートコンプリート機能付きのテキストフィールドをカスタマイズする

# はじめに
railsを使ったウェブアプリケーションで、テキストフィールドにオートコンプリートをつけたいときに、rails4-autocompleteというgemを使うと便利。基本的な使い方はこちらの[参考URL](http://loumo.jp/wp/archive/20150108082543/)を参照。
このgemを使った際にオートコンプリートのフィールドの挙動をカスタマイズする方法を記録します。

# 環境
* ruby 2.2.1
* rails 4.2.3

# 前提
今回の実装例は、

* 外部キー「fuga_id」を持つ「hogeモデル」のフォームから
* オートコンプリートを使って「fugasテーブル」を細かい条件で検索し
* オートコンプリートが提案する文言も変更したうえでfuga_idをsubmitする場合

を想定。gemによって作られるアクションを下記のようにオーバーライドして実装すると柔軟に対応できる。

# 実装手順

```app/controllers/hoges_controller.rb
class HogesController < ApplicationController
  autocomplete :fuga, :name
```

```config/routes.rb
resources :hoges do
  collection do
    get :autocomplete_fuga_name
  end
end
```

```app/views/hoges/_form.html.erb 
<%= form_for(@hoge) do |f| %>
  <%= f.autocomplete_field :fuga_name, autocomplete_fuga_name_hoges_path, id_element: '#hoge_fuga_id' %>
  <%= f.hidden_field :fuga_id %>
  <%= f.submit '登録' %>
<% end %>
```

のようにすれば、単純にfugaのnameを入れるとマッチするfugaデータが出てきてformからsubmitできる。
ここで、

* 検索条件を細かく指定したい
* 検索対象カラムを増やしたい
* 検索を複数テーブルをjoinしておこないたい
* オートコンプリートで提案される候補の文言をカスタマイズしたい

などの場合は、メソッドをオーバーライドして実装する。
inputに入力した文字列はtermというパラメータとして渡ってくる挙動。
それを引数として自分で定義したscopeに渡すこともできるし、返り値のjsonについても自由にかけるため、オートコンプリートで提案される候補の文言変更や挙動の調整をすることができる。

```app/controllers/hoges_controller.rb
class HogesController < ApplicationController
  autocomplete :fuga, :name

  def autocomplete_fuga_name
    term = params[:term]
    fugas = Fuga.scope_name(term)
    render json: fugas.map { |fuga| { id: fuga.id, label: fuga.method_name, value: fuga.method_name } }
  end
```
JPOUG Tech Talk Night #6 イベントレポート(by 21cafe様)

先日の JPOUG Tech Talk Night #6 が記事になったやで！彡(ﾟ)(ﾟ)

> Oracle運用のノウハウが満載！JPOUG Tech Talk Night #6イベントレポート
> https://geechs-magazine.com/tag/event/20160331

ワイ(柴田AYU) の プレゼンや、中嶋さん、太田さん、三原さん の
ライトニングトークがまとまってます。是非見てくれやで！ 彡(^)(^)

今後も JPOUG をよろしくお願いします！イベントにご協力頂いた
21cafeさん や ギークス様 ともども、お引き立てを(｀･ω･)ゞ

> JPOUG
> http://www.jpoug.org/
> 
> 21cafe
> https://geechs-magazine.com/21cafe/index
> 
> ギークス株式会社
> http://geechs.com/
UnityのLightmapが焼けない問題

#概要
UnityのBakedGIでシーンのライトマップを焼く時に、室内ならともかく、屋外の大きなシーンだと焼けないことがあります。
GIキャッシュを増やしたりLightmap Parametorのscaleを下げたりするのもありますが、ともかく焼けない場合はシーン全体のTransform→Scalingを下げることで、速く焼けるようになる。というバッドノウハウです。

#検証
Modern City Extension
https://www.assetstore.unity3d.com/jp/#!/content/57786
のサンプルシーンで確認します。

##Realtime
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/36dd643a-3e0c-4531-4b21-88ded5f59b39.png)

##ultra fast bake setting(4minitues)
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/45e04464-12f2-5ee9-4263-7f67f928fa58.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/40627/80c9f2af-eb06-9a08-f263-27ada71709cc.png)

##normal settings (8minutes)
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/87d4c6ee-5242-3641-0e78-15f399427759.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/40627/f9c10b55-c89f-9bec-70ac-5039309254cf.png)


## (transform)scaling =10000
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/743bc2e8-8a12-1653-bde6-c29c6f3a0ebd.png)
JOB数がめっちゃ増えてます…
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/18d0a10c-706b-ecfe-7ed4-f05106132cd1.png)


#検証結果から分かること
スケーリングを大きくすると、ライトマップを焼くのに掛かる時間が増大する→つまり、スケーリングを小さくすると、ライトマップが速く焼ける。

これを応用して、ライトマップを焼く時だけスケーリングを小さくして、適用した後に拡大する、などの小技が使えるかもしれません。

enjoy!
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/5496fb74-c79e-2a3e-5adb-e90e8f91c900.png)
github に push したら `Warning: Permanently added the RSA host key for IP address '192.30.252.121' to the list of known hosts.` 

github に push したら、`Warning` がやけに出た。記憶に残るくらいなので、2日間で3回くらい？

あまりに心配になったので、確認したら、`192.30.252` は確かに、 github の ip なので、安心した。
気にしなくていい。

![image](https://qiita-image-store.s3.amazonaws.com/0/30755/fd48ac02-647b-a75a-3766-000c759299f6.png)

https://help.github.com/articles/what-ip-addresses-does-github-use-that-i-should-whitelist/

しかし、なんでこんなに頻繁に出たんだろう？

```
$ grep 192.30.252 ~/.ssh/known_hosts | wc -l
    7
```

なので、まだまだ出続けるのかもしれない……。
uniqコマンドを使うときに気をつけること

# uniqコマンドを2バイトコードに対して使うときには気をつけよう
## 問題
BOWを作成するのに，sortやuniq，nlコマンドを使ってぱぱーっとやってしまうことが多々
その際，丸囲み文字など一部の（異なる）文字が同じものとして扱われ，削除されてしまうことがある

## 解法
`LC_COLLATE=C` を設定する

これだとダメ
` % cat tmp | tr " " "\n" | sort | uniq`

こうする
` % cat tmp | tr " " "\n" | sort | LC_COLLATE=C  uniq `

# おまけ？

ファイルtmpは半角スペースで分かち書きされたなにかが，1行1文書で記述されていると仮定

上述のユニークな単語集合を作成するものに加えて，以下のようにしてBoWを作成
` % cat tmp | tr " " "\n" | sort | LC_COLLATE=C  uniq | nl -n ln -s , > bow `
ViewPagerのページ数を動的に変更するためのPagerAdapterライブラリを作りました



ViewPagerのページ数を動的に変更するためのライブラリを作りました。（https://github.com/takaaki7/ArrayPagerAdapter

イチから実装するのが結構面倒だからです。（後述）

`ArrayFragmentStatePagerAdapter`, `ArrayFragmentPagerAdapter`, `ArrayViewPagerAdapter`の3つのアダプターが使えます。


`ListView`などのシンプルな利用に使われる`android.widget.ArrayAdapter<T>`を参考にしました。

# 使い方
`ArrayFragmentStatePagerAdapter<T>`の使い方の例です。

```
@Override
protected void onCreate(Bundle savedInstanceState) {
		/** ... **/
    adapter = new MyStatePagerAdapter(getSupportFragmentManager()
    						, new String[]{"1", "2", "3"});
    ((ViewPager)findViewById(R.id.view_pager)).setAdapter(adapter);
	 adapter.add("4");
	 adapter.remove(0);
}

class MyStatePagerAdapter extends ArrayFragmentStatePagerAdapter<String> {

    public MyStatePagerAdapter(FragmentManager fm, String[] datas) {
        super(fm, datas);
    }

    @Override
    public Fragment getFragment(String item, int position) {
        return MyFragment.newInstance(item);
    }
}
```

アダプターに対し`add(String item)`や`remove(int position)`を呼べば細かいことは気にせずともデータを動的に増減させることができ、それに対応していらないページの削除などを内部でよしなにやってくれます。
`ArrayFragmentPagerAdapter`と`ArrayViewPagerAdapter`も同じような方法で使えます。

詳しくは
https://github.com/takaaki7/ArrayPagerAdapter
のデモなどをご覧ください。

# なぜ
なぜ動的なページの増減が難しいのか。

おさらいとして、`ViewPager`を使う場合、`PagerAdapter`、`FragmentPagerAdapter`、`FragmentStatePagerAdapter`の3種類のアダプターを使う方法があります。

例えば`FragmentStatePagerAdapter`はこのように利用すると思います。

```
public static class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        return MyFragment.newInstance(position);
    }
}    
    
```

しかし、動的にページを増減させる場合次のようなことも意識しないけいけません。

### 1 `int getItemPosition(Object object)`を実装する

`getItemPosition`は`ViewPager`から呼ばれるメソッドです。これは`object`(フラグメントとか)の位置が変わった場合は新しい位置を返し、変わってない場合は`POSITION_UNCHANGED`を返し、`object`が既にない場合は`POSITION_NONE`を返す必要があります。
`ViewPager`のコードを見ると、`notifyDataSetChanged()`が呼ばれた時に現在保持している全`object`を`mAdapter.getItemPosition(object)`に渡して呼び出し、`POSITION_NONE`や新しい位置が返ってきた場合はページを作り直したり位置を計算し直したりしているようです。

デフォルトの`PagerAdapter`たちは動的なデータの増減を想定して作られていないので常時`POSITION_UNCHANGED`を返しています。

(メソッド名が若干わかりにくい。。。)

### 2.1 `FragmentStatePager`の不具合
詳しくはコメント欄に投稿しましたが、`FragmentStatePager`の場合は`getItemPosition(object)`で`if(object == 消したいフラグメント){ return POSITION_NONE } else { objectの位置
 }`のような感じで`getItemPosition()`を実装するだけでは他のページとの整合性がうまく取れず、表示がおかしくなる場合があるようです。おそらく`FragmentStatePager`の不具合によるものです。

### 2.2 `FragmentPagerAdapter`の場合、一度追加した`Fragment`を取り除かなければならない
`FragmentPagerAdapter`の内部では一度追加した`Fragment`の`remove()`を行っておらず、ページが隠れて破棄される時は`detach()`(UIを削除する）をしているだけなので`FragmentManager`の管理下でメモリに残ります。正しく削除するために`detach()`ではなく`remove()`をしたいところです。

# どうやって

`getItemPosition()`で常時`POSITION_NONE`を返すようにしたり、表示する内容を変更した時にアダプターを再度作ってセットし直す方法とかもあるようですが、そうすると毎回全て一からインスタンス化し直すことになるのでエコじゃないと思います。

`ArrayPagerAdapter`は外から渡されたデータをリストとして保存し管理することで`getItemPosition`を正しく実装し、元の`FragmentStatePagerAdapter`や`FragmentPagerAdapter`などを改良することで表示中のページの削除や追加を実装しました。

よかったら使ってみてください。
ソースコードでアプリをバックグラウンドにいかせる

アプリをプログラムで終了させる事は勧められていない（リジェクトされる？）ので、ホーム画面に戻すようにしようと思い調べてみた。
ライフサイクル的にはバックグラウンド→サスペンドなので、下記メソッドも呼ばれているという認識。

- applicationWillResignActive
- applicationDidEnterBackground

サンプルコード

```objc:objc_sample.m
UIApplication *app = [UIApplication sharedApplication];
if ([app respondsToSelector:@selector(suspend)]) {
    [app performSelector:@selector(suspend)];
}
```

## Swift2.0

```swift:swift_sample.swift
let app = UIApplication.sharedApplication()
if app.respondsToSelector(#selector(NSURLSessionTask.suspend)) {
   app.performSelector(#selector(NSURLSessionTask.suspend))
}
```

## Swift4.0

```swift:swift_sample.swift
let app = UIApplication.shared
if app.responds(to: #selector(URLSessionTask.suspend)) {
   app.perform(#selector(URLSessionTask.suspend))
}
```
RedHat EnterpriseLinuxでエラータ（errata）をダウンロードする方法

## 準備

開発者向けに、無料でRPMがダウンロードできるようになりました。
[Red Hat Developers](http://developers.redhat.com/)

既存の企業アカウントを再登録することで、使えます。


## エラータの確認

ここからダウンロード
[Errata](https://rhn.redhat.com/errata/)

エラータに含まれる個別パッケージの確認は、各エラータの下部にあります。


## エラータのダウンロード

```:bash
server$ yumdownloader [RPM名]
```

## エラータの適用（インターネット越し）

```:bash
server$ yum update --advisory RHSA-[エラータ番号]
```
Rubyでのシングルクォーテーションとダブルクォーテーションの性能差異について

#Rubyでのシングルクォーテーションとダブルクォーテーションの性能差異について

##はじめに
PHPでprintやechoする際、ダブルクォーテーションで括ってあげると式展開ができる。
もっと言うとシングルクォーテーションで括っても式展開はできず、
ダブルクォーテーションで括った場合は、式展開をする処理が動く。

(わざわざ言うことでもない気もしますが)
なので、以下のように変数を含む場合と含まない場合とで、
シングルクォーテーションで書くよう、考慮してる。

```PHP:PHP
print 'Hello.';
print "Hello $name";
```

では、Rubyではどうなの？という疑問から、
若干性能について見てみる。

##評価
狂ったように10,000,000回、まわしてみる。
（Ruby標準のパッケージを利用する）

```
require 'benchmark'

start_time = Time.now
result = Benchmark.realtime do
  for num in 1...10000000
    print 'performance.'
    # print "performance."
    
  end
end

print result
```

##結果
シングルクォーテーション|ダブルクォーテーション
|---|---|
|234.6442553200177|295.6961059400346|

##まとめ
PHPやRubyのソースまでは追ってないが、式展開する処理が動く分、
ダブルクォーテーションの方が処理時間がかかることがわかる。
重い処理や繰り返し処理をする際は、気をつけたほうがよさ気ですねー。
Mac環境でかゆいところに手が届くショートカット・設定



## 入力

|ショートカットキー|内容|
|---|---|
|Control + k|全角カタカナ|
|Control + :| 半角英数 |
|shift + @| バッククオート |

引用：<a href="http://mattintosh.blog.so-net.ne.jp/2012-07-15_mac_english_katakana_convert" target="_blank">Macの英数・カタカナ変換はファンクションキーではなくControlキーを使う｜mattintosh note (跡地)</a>
Oracle接続用extensionビルドの話

# これは何？
phpのoci8エクステンションをビルドするメモです。
あんまりやらないのですぐ忘れるんです。

# 前提
・Oracle Clientがインストールされていること
・phpがインストールされていること(phpenvでもなんでもOK）

# ビルド
http://php.net/manual/ja/oci8.installation.php
"PECL から OCI8 をインストール"を参照。

{code}
sudo su - delivery_user
bash

```bash
curl -x ${http_proxy}:${PORT} -L https://pecl.php.net/get/oci8-2.0.10.tgz -O oci8-2.0.10.tgz -k
tar zxfv oci8-2.0.10.tgz
cd oci8-2.0.10;pwd
phpize
./configure -with-oci8=shared,${ORACLE_HOME}
make install
```

extension_dirにoci8.soができるので、php.iniかiniからIncludeされるファイルに

```
extension=oci8.so
```

とかけばOK。
apacheなどに組み込まれて動いているプロセスで有効化するなら、gracefulなりしてあげてください。

以上。
【Google Analytics】社外関係者の内部トラフィック除外方法

#社外関係者の内部トラフィック除外方法

社内からの固定IPによるアクセスはビューにフィルタを追加することで簡単に除外できるのですが、やっかいなのは社外関係者 (たとえば、フリーランスの方) からのアクセス除外です。

まだアクセスが少ないサービスだとユーザーの挙動を正確に追えなくなってしまうため、関係者のアクセス除外を重要です。

１. 「アナリティクス設定」→「プロパティ」→「カスタム定義」→「カスタムディメンション」
２. 「+ 新しいカスタムディメンション」をクリック。
３. 以下のように設定します。

|項目|設定情報|
|:--|:--|
|名前|AccessType|
|設定|ユーザー|

「アクティブ」にはチェックマークを入れておいてください。

４. トラッキングコードを挿入します。挿入するために、以下の手順が必要です。
 
(1) トラッキングコードを挿入しただけのコンテンツがないページをサーバーにアップロードします。ページ構成は以下で大丈夫です。

```html:ga.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Google Analytics 内部トラフィック除外</title>
  <meta name="robots" content="noindex">
</head>
<body>
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
                          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-1', 'auto');
  ga('set','dimension1','internal');
  ga('send', 'pageview');
</script>
</body>
</html>
```
次のコードは Google Analytics のアカウントID と先程作成したカスタムディメンション (AccessType) のインデックス番号に変更してください。インデックス番号は 「アナリティクス設定」→「プロパティ」→「カスタム定義」→「カスタムディメンション」 から確認することができます。たとえば、インデックス番号が 3 の時は 'demension3' となります。　

```html:ga.html
ga('create', 'UA-XXXXXXXX-1', 'auto');
ga(’set’,’dimension1’,’internal’);
```

５. 「アナリティクス設定」→「ビュー」→「フィルタ」
６. 「+ フィルタを追加」をクリック。
７. 以下のように設定します。
 
**ビューにフィルタを適用する方法を選択**
　「新しいフィルタを作成」にチェック
**フィルタ情報**

|項目|設定情報|
|:--|:--|　
|フィルタ名|社内関係者の内部トラフィック除去|
|フィルタの種類|カスタム|
|フィルタ フィールド|AccessType (カスタム ディメンション)|
|フィルタ パターン|internal|

「カスタム」をクリック時表示されるラジオボタンは「除外」にチェックしておいてください。

８. 社外関係者が作業に使用するすべてのブラウザで 4. (1) でアップロードしたページにアクセス。

これで以降は内部トラフィックとして結果から除外されます。
[cocos2d-x]Cocos CreatorでとりあえずiOS/Android向けにビルドする

## 概要

最近は最早お馴染みのゲームエンジン[cocos2d-x](http://jp.cocos.com/)ですが、少し前に統合開発環境として[Cocos Creator](http://blog.cocos2d-x.org/2016/03/announcing-the-cocos-creator-public-beta/)が発表されました。
Cocos Studioとかは触ったことないのですが、デザインからビルドまで１つでできるのは便利そう…ということでとりあえずビルドまでやってみました。

## 画面
![スクリーンショット 2016-04-04 13.30.05.png](https://qiita-image-store.s3.amazonaws.com/0/71259/9b66e47f-4aa0-056e-0218-c4edb8c6c166.png)

インストールして、最初から用意されているHelloWorldプロジェクトを作成しました。画面はこんな感じです。
因みにインストール後の起動でCocos Developerアカウントの登録を求められます。

## Web向けにBuild
Web向けであれば、この時点でビルドできます。
「File」->「Build」（あるいはShift+Cmd+B）にてビルドメニューを開きます。

![スクリーンショット 2016-04-04 13.34.07.png](https://qiita-image-store.s3.amazonaws.com/0/71259/f4c32b7e-e1d9-e52a-9c60-ec60a563ebcb.png)

「Build」ボタンを押すとビルドが開始され、進捗状況が上の方にバーで表示されます。
ビルドが完了したら、「Play On Device」を押してみるとブラウザ上での動作が確認できるはずです。

## モバイル端末向けにビルド
Web向けは確認できたので、iOS/Androidに向けても試してみましょう。
この場合ビルド画面の「Platform」プルダウンを変更してBuildボタンを押すわけですが、デフォルトではエラーになると思います。

![cococre_err.png](https://qiita-image-store.s3.amazonaws.com/0/71259/d90bdb93-2f19-5106-0b67-b41c6290aafc.png)

結論から言うと、モバイル向けには自分でcocos2d-x（Android向けにはそのSDKなども）の設定が必要になるからです。

### 設定画面を開こう
各SDKのパスをCocos Creatorのために設定します。
設定画面は、「File」->「Preference」で開くことができます。
（この辺はXcode,Eclipse用に環境構築した人なら釈迦に説法かも）

![スクリーンショット 2016-04-04 13.45.42.png](https://qiita-image-store.s3.amazonaws.com/0/71259/919d3262-9b16-d646-6b22-10305c0056f8.png)

* Cocos Console Path
  * [cocos2d-xの公式サイト](http://jp.cocos.com/)からDLしてきたcocos2d-xを展開し、その中のtools/cocos2d-console/bin を指定します。

* NDK Root
    * [Android NDK](http://developer.android.com/intl/ja/ndk/downloads/index.html)からDLし、展開後のフォルダを指定します。

* Android SDK Root
    * [Android SDK](http://developer.android.com/intl/ja/sdk/index.html#Other)からDLし、展開後のフォルダを指定します。
    * Android SDKはDLしたての状態では空っぽなので、SDK Managerを立ち上げて各OS VersionのSDKをDLする必要があります。（ここでの説明は割愛させてください…）

* ANT Path
    * [Apache Ant](http://ant.apache.org/)をDLし、展開後のフォルダ内 binフォルダを指定します。

下３つはAndroidでのビルドのためのものです。
これでBuildを押せばコンパイルが通る…はずです。（因みに結構時間がかかります）

### 実機確認（iOSではまだ未確認）
Buildが通れば、「Play On Device」から実機確認を行うことができます。
Androidは実機をPCに繋いでこの操作を行うだけでOK。インストールされます。
iOSの場合、エミュレータが立ち上がります。でもなぜかiPhone4Sサイズ…

<img width="592" alt="スクリーンショット 2016-04-04 14.04.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/71259/3add5897-0237-9d24-4b1c-83ffc77ccab2.png">

この辺の設定はまたそのうち見ていこうと思います…
batでコードページ（エンコーディング）を変更して実行したい

タイトルまんま、Windowsのバッチ（bat）で文字エンコーディング（コードページ）を変更して処理をし、その後もとに戻しておきたい。
（具体的にはSQL/Plusをたたきたかった）

処理そのものはUTF-8で動かしたいけど、WindowsはShift-JISっぽい「MS932」で。。。
単純にメインの処理だけ記述していると文字エンコーディングの違いで文字化けしまくりになります。
そこで、コードページを変更して動かせばいいわけですが、普段はMS932のままで動いてほしいのでUTF-8に変わりっぱなしでは困る。

次に考えるのはコードページを変更して処理をした後にMS932に戻せばいい！
と、ここで問題。
もし元がMS932じゃなかったら。。。固定で「MS932に戻す」みたいなことをしてしまうと、それが欠陥になっちゃう。

そんなわけで、処理開始前にコードページが何になっているかバックアップしておき、希望のコードページで処理した後に「元に戻す」ようにしました。

久々にバッチを書いたｗ
PowerShellの方が楽だよね～


```bat
@ECHO OFF
REM === 実行モード
REM --- コードページ変更を行う(YES:1, NO:0)
SET CHCP=0
REM --- 変更後のコードページ
SET CP=932

REM === システム変数(触らないで)
SET T_CP=

REM ------------------
REM |  メインループ  |
REM ------------------
REM === コードページ変更
IF %CHCP%==1 (CALL :CHCP_ %CP%)

REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM @@@         ここに処理を記述           @@@
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

REM === コードページ復元
IF %CHCP%==1 (CALL :CHCP_DEFAULT)
REM === おわり
GOTO :END_


REM ------------------
REM |  サブルーチン  |
REM ------------------
REM === コードページをSHIFT-JIS(MS932)に変更
:CHCP_
FOR /F "usebackq tokens=2 DELIMS=:" %%C IN (`CHCP`) DO SET T_CP=%%C
CHCP %1
GOTO :LOCAL_END_

REM === コードページを戻す
:CHCP_DEFAULT
CHCP %T_CP%
GOTO :LOCAL_END_


REM ------------------
REM |     おわり     |
REM ------------------
:END_
ENDLOCAL
:LOCAL_END_
EXIT /b 0
```
Googleトレンドに見る2016年人気のCSS・JavaScript・タスクランナー

(2016/05/23 追記)
記事内で取り扱っている技術で、はてぶコメント等で質問の多かった「webpack」についての解説記事を書きました。
[最新版で学ぶwebpack入門 – JS開発のモジュールバンドラ - ICS MEDIA](https://ics.media/entry/12140)

---

Web技術はよく技術の進化が早いと言われます。多くの技術が現れては消える中で、どの技術を学ぶべきかを選択するのは重要です。**選択するポイントの1つに「技術の将来性・人気があるかどうか？」があります**。今回は基本的なフロントエンド技術である「CSSコーディング」「JavaScriptプログラミング」「タスクランナーとビルドツール」の3つについて、それぞれの人気をGoogleトレンドで調べてみました。

# CSSコーディングの流行り
CSSは、SassやLESSに代表される「CSSプリプロセッサー」を使ってプログラミングすることで、品質と効率を大きく向上させることが可能です。通常のCSSコーディングに比べて下記のような利点があります。

- ネスト（入れ子）が使用可能
- 変数を使用可能
- 条件分岐（if文）やループ処理（for文、while文等）が使用可能
- ファイルを分割可能

![](https://qiita-image-store.s3.amazonaws.com/0/67884/1ae3245d-28d1-be51-9f24-c559ee8c8199.png)

下記がGoogleトレンドでの比較結果を表します。グラフの数値が高いほどより多くGoogleで検索されていることを示します。

元々はLESSの方が人気でしたが、**2016年現在CSSプリプロセッサーの中で1番流行っているのはSassです**。Twitter社製のUI作成フレームワーク「Bootstrap」もver3まではLESSベースでしたが、ver4からはSassベースとなっています(※)。2015年4月頃からPostCSSも伸びてきていますが、現状ではSassの4分の1程です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/24b07590-9b28-31a9-ab04-7374badcb6f8.png)

※ [Bootstrap 4 alpha · Bootstrap Blog](http://blog.getbootstrap.com/2015/08/19/bootstrap-4-alpha/)

# JavaScriptプログラミングの流行り
JavaScriptもTypeScriptやBabelと言った中間言語を使ってプログラミングすることで、より便利に記述できます。たとえばTypeScriptなら下記のような利点があります。

- 型を使用できる為、大規模開発に向いている
- 最新のJavaScript仕様（ES2015）の記法を使用でき、ほぼすべてのモダンブラウザで動作する仕様（ES5)向けにコンパイルできる

![](https://qiita-image-store.s3.amazonaws.com/0/67884/8bbaa84c-1c65-d58c-a1f3-6a15ab631cb8.png)

**JavaScriptのプログラミング技術で2016年1番人気なのはMicrosoft社製のTypeScript**。類似の技術であるBabel、Haxe、CoffeeScriptと比べても人気のある技術です。また、TypeScriptはJavaScriptフレームワーク「AngularJS」の開発者向けアンケートでもBabelを抑えて1位になっています（※）。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/fa70c488-e871-cd40-7b79-9fc40aafc396.png)

※ 記事「[世界のAngular開発者はどんなトランスパイラー・エディター・ビルドツールを使っているのか？](http://qiita.com/tonkotsuboy_com/items/b29a8a568c618bf70e96)」より


# タスクランナー・ビルドツールの流行り
フロントエンドの開発には、コンパイル作業やファイル圧縮など、多くの面倒なタスクがあります。これらを一括で管理する「タスクランナー」やビルドツールもフロントエンドには欠かせない存在です。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/aa4bbf1b-0894-e750-7c6c-54e2fd91bddd.png)

**2016年4月現在のトレンドでは、GruntよりGulpとwebpackの方が人気**。GulpはGruntと比べてシンプルな記述と高速な処理が可能（※）なタスクランナー、webpackはJavaScriptからCSS、画像等あらゆるアセットを生成する近年人気のビルドツールです。GruntよりもGulpかwebpackを選択するとよいでしょう。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/d6f6fe2f-5d43-47ed-7c92-f226a5f92c42.png)

※ [5分で導入！ タスクランナーGulpでWeb制作を効率化しよう - ICS MEDIA](https://ics.media/entry/3290)

# 人気と将来性も技術選択のポイントの1つ
今回はCSS・JavaScript・タスクランナーの3つについて、2016年の今現在流行っているものを見てきました。**CSSはSass、JavaScriptはTypeScript、ビルドツールGulpとwebpackがそれぞれ1番人気でした**。もちろん、流行っているかどうかだけで技術を選んではいけませんが、多くの開発者が関心を持っている技術であることは間違いありません。学ぶ技術の選定の参考にしていただければと思います。


> *参考記事*
> *[人気上昇中のJavaScriptライブラリを調べてみた【2016年版】 - Build Insider](http://www.buildinsider.net/web/popularjslib/2016)*
いまさらリーダブルコードまとめ (第7章)

# はじめに
チーム内リーダブルコード輪読会の第7章。
第5･6章は[こちら](http://qiita.com/zephyria/items/cc48c843af8aefe39fdc)

# 第7章 制御フローを読みやすくする

## どんな内容？
- 結果的に同じ処理になるとしても、他の人が見て__より読みやすい方__の書き方を選択しよう
- 「読みやすい方」とは、以下のようなもの。
    - 読み手にとって直感的(一般的な慣例に従っている)
    - 読み手の脳(記憶)への負荷が小さい

## 読んだ感想
　コードの書き手にとって、条件式の順番やネストの深さというのはそこまで気にならない。
なぜならば、__今自分が書いたばかりで、多少複雑なコードでもすぐに理解できるから__。
ただ、それはあくまでも「自分は読める」というだけなので、コードレビューに出すときは今一度自分のコードを見返して「このコードは本当に読みやすいのか？」と振り返ってみた方がいい。
　あと、「既存のコードに手を加えるとき、条件式が複雑になったりネストが深くなりやすい」という点も印象的だった。
日々の開発では、「既存のAというfunctionにαという条件を追加してほしい」というような"小さい修正"が良くあるが、そういうときに何も考えずに条件追加するとコードがどんどん複雑化していってしまうので、意識付けする観点としては非常に重要だと感じた。
　この章で述べられているようなアンチパターンに対処することで、結果的にレビューが短く済むようになりそう。

## 例を挙げて議論してみよう

### 条件式、if-elseの並び順
```java:7-1
boolean isAdult(int age) {
  if(20 > age) {
    return false;
  }

  return true;
}
```

#### リファクタリングポイント
- 評価対象の引数を条件式の左辺にした方がいい
- 「20歳未満かどうか」よりも「20歳以上かどうか」の条件式にしたほうがいい

### do-whileを書き直す
```java:7-2
String result = null;
int index = 0;

do {
    result = fetchFromDB(index);
    index++;
} while(result != null);
```

#### リファクタリングポイント
- while(true)とbreakを組み合わせる
- もしindexに仕様上の上限があるなら、for文に書き換える

### 関数内で早くreturnする(Guard節)
```java:7-3
boolean hasA(String input) {
  String target = input;
  if(target == null) {
    target = "";
  }

  boolean result = target.contains("A");
  
  return result;
}
```

#### リファクタリングポイント
- inputがnullだったら`return false`する
    - その場合、targetという一時変数は不要になる

### ネストを減らす
```java:7-4
if (checkA) {
  doSomething(true);
  if (checkB) {
    doAnother(true);
  }
} else {
  doSomething(false);
}

```

#### リファクタリングポイント
- if(checkA){}else{}いらなくて、doSomething(checkA)でいいのでは。

### 補記
輪読会メンバーのメイン使用言語がJavaなので、Stream APIとかOptionalにも言及されて、「そもそもnullチェックのifや、Listを処理するためのループは自前で記述する必要だいぶ減るよね」という話に。
CentOS 6に、RVMを使ってruby 1.9.3を入れる

CentOS標準では1.8.7が入ってしまうので、以下の手順を実施しました：

```install_ruby.sh
yum update
yum groupinstall "Development Tools"

yum -y install gcc-c++ patch readline readline-devel zlib zlib-devel 
yum -y install libyaml-devel libffi-devel openssl-devel  make 
yum -y install bzip2 autoconf automake libtool bison iconv-devel

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

curl -L get.rvm.io | bash -s stable

rvm install 1.9.3

rvm use 1.9.3 --default
```

参考URL
https://gist.github.com/slouma2000/8619039
Visual Studio 2015 Update2でIntellisenseのDB形式がSQLite3に

Visual Studio 2015のUpdate2がリリースされたのでアップデートしてみたところ、Intellisenseのデータベースファイルの形式が変わっていました。
Update1までは、「\*.sdf」というファイル拡張子だったのが、「\*.VC.DB」に変わっていて、おや？と思ってファイルの中を覗くと、先頭が「SQLite format 3」の文字列になっていました。
SQLIte3のツールでファイルを開くと問題なく開けました。

Intellisenseは、色々と変遷を辿っていて、VS2015でだいぶマシにはなったんだけど、うまく行かなくなることが多々あって、何とかならないかと思っていたところ。

これで、起動や候補表示など速くなってくれるのかな？
webpackでbabel際はnode_modulesをexcludeし忘れるべからず


コンパイル早いし複数のJSエントリーポイント設定するのも簡単だしということで1年ぐらい前からwebpack使ってます。
なのに簡単なところでつまずいてしまったので恥を忍んで一筆。

結論から述べるとタイトルが全てです。
webpackとbabel-loaderでES2015のコードを扱う場合、`node_modules` をexcludeしないと正常に動作するJSにコンパイルされないのでブラウザで読み込んだときにエラーが出てしまいます。

現象再現できる環境を以下のリポジトリに用意しました。
~~暇な人~~興味のある方はお試しあれ。
https://github.com/haribote/do-not-miss-excluding-node-modules

## 正しい設定
正常に動作するJSにコンパイルさせるための設定は以下の通りです。
何のことはなくて、JS（およびそれに準ずる）ファイルのローダー設定に `exclude: /node_modules/` を忘れずに指定すること。
もちろん `node_modules` 以外に除外すべき対象があるならば列記が必要です。

```JavaScript
// import modules
var path    = require('path');
var webpack = require('webpack');

/**
 * Configuration of webpack
 */
module.exports = {
  context: __dirname + '/src',
  entry  : [
    './main.js'
  ],
  output : {
    path    : path.resolve(__dirname, 'dist'),
    filename: './bundle.js'
  },
  plugins: [
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  module : {
    loaders: [
      {
        test   : /\.js$/,
        loader : 'babel-loader',
        exclude: /node_modules/, // <- Don't miss it!
        query  : {
          plugins: ['transform-runtime'],
          presets: ['es2015']
        }
      }
    ]
  },
  resolve: {
    extensions: ['', '.js']
  }
};
```

## 補則
今回作成したサンプルでは、`main.js` で `Promise` を呼び出しています。
そのためbabelの `transform-runtime`[^1] がpolyfillを差し込んでくれるわけですが、 `node_modules` をexcludeしないとこういったpolyfillやライブラリがブラウザで動作するコードとして出力されなくなってしまいます。

[^1]: おなじくcore-jsを用いる `babel-polyfill` でも今回と同様の結果になる
いまさらリーダブルコードまとめ（第５･６章）

# はじめに
チーム内リーダブルコード輪読会の第5･6章。
第4章は[こちら](http://qiita.com/tokutoku/items/c31d5de982fd9e7bae44#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

# 第5/6章　コメントすべきことを知る/コメントは正確で簡潔に
## どんな内容？
### ５章
　１．コメントすべきでは「ない」ことを知る
　　・コードを読んですぐに分かることはコメントにする必要がない
　２．コードを書いているときの自分の考えを記録する
　　・手法について、採用理由を説明する。
　　・コードの欠陥、不足については記法(TODO/FIXMEなど)に則って記載する。
　３．読み手の立場になって何が必要になるかを考える
　　・読み手が疑問を感じるような処理についてはコメントを残す。
　　・ファイルやクラス単位で「全体像」(仕様レベルで)の記述を行う。

　　第５章では"コメント"ってどんなことを書くべきなのか。どんなことを書くべきではないのか。
　　また、コメントで教えるべき情報なのか、ソースを直して対応すべきなのか、方針論についてまとめられていた。

### ６章
　１．指定先が曖昧な代名詞(「それ」「これ」など)の使用を避ける
　　・// これはAAAを返却する関数です。(←記載位置によっては指している対象が分かりにくい)
　　　→ // testFunctionはAAAを返却する関数です。
　２．関数の動作は正確に説明する
　　・// ファイルに含まれる行数を返却します。(←何も記載がない時や１行だけの時は？)
　　　→ // ファイルの"\n"の数を返却します
　３．コメントに含める入出力の実例を慎重に選ぶ
　　・正規表現だったり、実際のパターンだったり、必要な情報をむしろ値として示す。
　４．コードの意図は詳細レベルでなく高レベル(仕様レベル？)で記述する
　　・詳細レベルでソースの動きを説明するよりも、何をしたいのか、を記載した方が後から読むには分かり易い。
　５．よくわからない引数にはインラインコメントを使う
　　・引数がどういった意図で渡されているのか、その内容はどんな単位なのかなど必要な情報はインラインコメントで残す。
　　　ex)　

```java:testFunc
  testFunc(/* timeout_ms = */ time, /* use_encryption = */ false);
```
　　　　　 timeoutはmsで補助的に時間の単位が何であるかという情報を付与している。
　　　　　 use_encryptionは手前につけることで意味が通り易い。後部につけるとuse_encryptionがfalseなのか、
　　　　　 falseがuse_encryptionなのか分かりにくくなる。
　６．多くの意味が詰め込まれた言葉や表現を使って、コメントを簡潔に保つ
　　・分かりにくくなる冗長な表現よりも、共通的に認識された短い言葉のほうが分かり易い。

　　第６章では実際にコメントを付ける際に、具体的にコメントを付けるならどうする？と言う観点で、
　　第５章で示された方針をさまざまなケースごとにどう活かすか記述されていた。

## 読んだ感想
### 第５章
　自分自身、コードを書いていてコメントを付けるのは「機能の説明」をしようとするものがほとんどだったことに気が付かされた。
　「ひどいコードはコメントを無理につけるよりコードを修正する」と言う段については今まで全く内に考えがなかったように思う。
　また、個人的には定数の「背景」を説明するコメントを付けるという考え方はなかったので非常に興味深かった。
　
### 第６章
　最も勉強させられたのは、関数の機能を説明する際に実例を記載してしまうと言う手法だった。
　今までは頭の中にコメントと言うのは自然言語レベルで、機能の説明を行うものと言う意識が何処かにあったのだと思う。
　また「多くの意味が詰め込まれた言葉や表現を使う」為には、より最新のスタンダードを吸収し続ける必要性があると解釈した。

　あとは6章の扉絵が簡潔に印象的で非常にこの章で何を学ぶのか、が分かり易かった。

## 例

　分量が多いので、２例に絞って議論を行いたい。


###１．実例をコメントに付与する

　実例をコメントに付与する場合について例を抜粋する。

```java:StringUtil
 // 'src'の先頭や末尾にある'chars'を除去する。
 String Strip(String src, String chars){...}
```

↓

```java:StringUtil
 // 'src'の先頭や末尾にある'chars'を除去する。
 // 実例：Strip("abba/a/ba", "ab")は"/a/"を返す
 String Strip(String src, String chars){...}
```

　あまりここでは見ない方式のコメントだが(Utilは極力作らないと言うことは置いておいて)、
下手に解説をコメントに書くのも長くなるけどソースは長大な処理だし、と言う場合など、
結局○○を返すんだよって記述は有用性が有るように感じた。


###２．コメントの付与ではなくコードを修正する

　個人的に気が付きが大きかった、コメントをつけると言う本題とは逆に
「ひどいコードはコメントを無理につけるよりコードを修正する」
部分について以下、例を抜粋。

```java:RegistryManage
 // レジストリキーのハンドルを解放する。実際のレジストリは変更しない。
 void DeleteRegistry(RegistryKey key)
```

↓

```java:RegistryManage
 void ReleaseRegistryHandle(RegistryKey key)
```
 
　コメントを足すのか、リファクタするのか、実際に後から対応する時に指針になると感じる。
　特にリファクタだとしてもメソッド名のリファクタだけなら
影響範囲もそこまで広くない(処理内容自体は変わらない)ので、
手段として先々使っていくことが出きると思う。

コメントはあくまで"補助"と言う部分を意識して、
コードは適切な形にした上で、尚解説があった方が良い部分に付与することが肝要と解釈した。

　後はまとめにある通り。
CoreOSにdocker-composeを導入

VPSのCoreOSでdocker-composeを動かそうとしたら、そもそも入ってなかったので導入する。

# GitHubのDocker-Composeのページにアクセス

https://github.com/docker/compose/releases/latest

"latest"のタグが貼ってあるリンクにアクセス。

16.04.04時点では1.6.2がリリースされている。

```bash
curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

リリースごとにgitHubのダウンロード先は変わるだろうから、導入するときにはlatestのタグで最新版のリンクを確認しておいた方が良いのではないか。

# 早速GitHubを参考に導入する

1. sudo -i でsudoでコマンドを実行できるようにする。
2. GitHubのREADMEでは/usr/local/bin以下に展開するようになっているが、CoreOSでは/usr以下は読み込み専用らしいので、代わりに/opt/binフォルダを作成する。
3. /opt/binにダウンロード


```
$ sudo -i
Update Strategy: No Reboots

# mkdir -p /opt/bin
# curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose    

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   600    0   600    0     0    798      0 --:--:-- --:--:-- --:--:--   802
100 7743k  100 7743k    0     0   659k      0  0:00:11  0:00:11 --:--:-- 1143k

# chmod +x /opt/bin/docker-compose 
# docker-compose -v
docker-compose version 1.6.2, build 4d72027
```

無事コマンドが実行できた。
npm以外プロジェクト内で完結させたWeb開発環境を作る(npm以外ローカルインストール)

<b> bower + gulp + karma </b> とかその辺を始めようと思い、とりあえずプロジェクトのテンプレを作りました。

最近ずっと新しいものい触れていなかったため、疎いです！　指摘があればよろしくお願い致します。


  
  
  

これから作るテンプレは、npm以外すべてプロジェクト内に<b>ローカルインストール</b>する形で進めます。

プロジェクト内で使用するnpm以外の<b>ライブラリ( bowerとかkarmaとかgulpとか )がプロジェクトごとに分離してる</b>感じです。

無駄じゃぼけ、って言われるかもしれませんが、バージョンが保証されない環境で自分が痛い目に遭ってきたためこのような構成にしてます。
( いや、やっぱり無駄かも )

ゴールとしては、以下の手順で環境が整う状況です。

+ <b> テンプレートのリポジトリをクローンする。</b>

+ <b> npmインストールなどの実行と、パスを通す( ローカルインストールしたもののバイナリの。 )処理が集約したスクリプトを回す。</b>

+ <b> みんなと全く同じ環境( package.json, bower.json の記述にもよるが... )のできあがり！ </b>


では、つらつらと行った手順を書いてきます。
なお、bower,gulp,karma を入れた手順を紹介します。

# gitの設定
+ git init しちゃいます。  

  ``` 
  git init 
  ```
+ .gitignore書いちゃいます。

  ```
  #.gitignore内に記述
  node_modules
  bower_components
  # その他適宜必要なもの...
  ```

# npm による各ライブラリのインストール 
## npm の初期化
  + npmのプロジェクト毎の設定が書いてあるpackage.jsonを生成する
  
  ```
  npm init
  ```
## bower のインストール
  + bower をローカルインストールします。
  
  ```
  npm install bower --save
  ```

  　　npmでローカルインストールを行うと、各ライブラリの実行ファイルは以下に配置されます。
  
  ```
  node_modules/.bin
  ```
  
　+ このままだとbowerコマンドが使えないので、パスを通してあげる必要があります。
　  そのため、npmのインストールも含めたスクリプト( init.sh )を作成します。

  ```
  # init.sh に記述

  echo "initializing..."
  # npm によるインストール
  npm install 
  # パスを通す
  DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
  PATH="$PATH:$DIR/node_modules/.bin"
  export PATH
  # bower によるインストール
  bower install

  echo ".....finished!"
  ```

  + npmインストールとかも入っちゃってますが、このスクリプトを実行してみて、bowerコマンドが使えるかどうかチェックしてみてください。
  　ちなみに、 init.sh を実行するときは、 export が含まれているので sourceコマンドで実行する必要があります。
  
  ```
  source init.sh
  ```

## gulp・karma連携 ( メインとはもう関係ない )
  + 例のごとくこいつらもローカルインストールします。(すべて本番環境にもインストールするようになっちゃってるのでそこは適宜お願いします！)
  
  ```
  npm install gulp --save
  npm install gulp-karma --save
  npm install karma-cli --save
  npm install karma-jasmine --save
  npm install karma-chrome --save # とりま chromeだけ

  ```

  + それぞれ設定ファイルを生成しましょう。  

  ```
  karma init
  ```

  + gulp.js に設定を記述(新規作成)
  
  ```
  var gulp = require('gulp');
  var karma = require('gulp-karma');
 
  var testFiles = [
    // 必要なライブラリなど...
    // ...
    // 自分のJSファイルなど...
    'assets/js/*.js', // あくまでも例
    // テストファイル
    'tests/*.js' // あくまでも例
  ];
 
  gulp.task('karma', function(){
      return gulp.src(testFiles)
        .pipe(karma({
            configFile: 'karma.conf.js',
            action: 'run'
        }));
  });
  ```
  
  + テストを作って、実行しましょう。  
  自分の決めた場所にテスト対象のJS、テストコードを置き、チェックしてみましょう。
  
  ```
  gulp karma
  ```

  + これでテスト結果が正常に表示されればOKです。

## cloneから最後まで試してみる

  + 先ほど作ったプロジェクトをどこかにpushしましょう。
  
  ```
  git add .
  git commit "テンプレ作成"
  git push どこか master
  ```

  + 別のフォルダで、cloneしてきましょう
  
  ```
  git clone どこか 
  ```

  + クローンしてきたプロジェクトで、例のスクリプトを実行しましよう
  
  ```
  source init.sh
  ```

  + これで、gulp karma などのコマンドが動けばOKです！


# 書いていて思ったこと

　最後まで書いて気づいたのは、全部ローカルインストールにする意味ってやっぱないのかなと笑
　もっとどんなケースがあるかを把握して、その辺をうまく使い分けられるようになりたいな、と。
  まぁ、練習ですわ！
MacOS Xのビルド済みのQtを使うgo-qmlのビルド方法

全人類の99.99%には必要のなに使い捨てメモなので読む必要はありません。

動機
----------

* go-qmlはビルド時にpkg-configを使ってQtライブラリを探す
* Qtのプリビルドの5.6(LTSでQt Quick Controlは豊富なのでこれが使いたい)には[pkg-configがなぜか同梱されない](https://github.com/bitcoin/bitcoin/issues/7714)
* 標準のframework化されているプリビルドのやつならmacdeployqtコマンドが使えてインストーラ作成まで一発のはずという期待

環境
----------

* MacOSX 10.11
* ビルド済みQt 5.6
* Golang 1.6
* 最新のgo-qml(最終更新は一年以上前)

これまであった前提知識
----------------------

* MacOSXにはフレームワークというヘッダーとダイナミックリンクライブラリがセットになった塊がある。.frameworkという拡張子を持つフォルダ。
* Qtのビルド済みパッケージをインストールすると、~/Qt/5.6/clang_64/lib以下にFrameworkがインストールされる。
* コンパイラに``-framework Foundation``みたいに書くと、フレームワークをリンクする-Iのインクルードパスの追加、-Lのライブラリ探索パス、-lのリンクライブラリが一緒に行われるイメージ(厳密にはちょっと違う)
* アプリケーションをリンクすると、フレームワークの参照が実行バイナリに記録される。``otool -L 実行ファイル``で見られる。.appになった実行ファイルの場合は、``@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore``みたいな感じで記録されている。
* ``otool -L``のリンク先はビルド後に書き換えられる。[install_name_tool](http://mattintosh.blog.so-net.ne.jp/2012-11-24)を使う。システムに入っているものでないフレームワークは、.app/Content/Frameworks以下にまるっとコピーして(依存しているものが依存しているものも全部)、install_name_toolで.app内で参照を解決できるようにパスを修正していく。
* macdeployqtは↑を簡単にやってくれる+フレームワークからヘッダを抜いて、デバッグ版dylib削除までやってくれる。

go-qmlのビルド
---------------

* READMEはHomebrewを使っている。MacPortsでも問題なくできたがmacdeployqtはエラーになる。Homebrewは試してないがたぶん同じ。
* go-qmlはあまり更新されてないプロジェクト(Pull Requestも放置)なので、go-qml自体の変更はなるべく避けたい。
* まずは欠けているpkg-configを手当する。[ここ](https://github.com/bitcoin/bitcoin/issues/7714#issuecomment-204299905)にHomebrew用のものと思われるものがあるので、これをちょちょっと加工して、ローカルのQtを指すような.pcファイル一式を用意する。
* ``PKG_CONFIG_PATH=(↑を入れたパスを)`` の環境変数を設定してgo get gopkg.in/qml.v1を実行→失敗
* ``-framework`` というオプションはMac依存のせいか、cgoが無視している気がする。とりあえず、-Iでフレームワーク内のヘッダを参照するようにしたらOKになった

アプリのビルド
--------------

* そのままビルドすると、Qtのフレームワークへの参照が ``@rpath/QtCore.framework/Versions/5/QtCore`` になってビルドされた。実行するとエラーになる。
* Qt Creatorで素でビルドしたGUIのアプリも↑と同様のはずなのに・・・
* どうも、@rpathの場合は、ライブラリの探索パスが、otool -Lで表示されるのとは別の領域に(otool -l)に書き込まれているっぽい。-rpathで指定する。
* Golangのcgoは-rpathを指定するとエラーになる。-rを代わりに使う。
* -rを指定する場合は、PKG_CONFIG_PATHを再び指定する必要があるっぽい→できた

.app化
----------

* 既存の.appを持ってくる。実行ファイルとか設定ファイルをContens/MacOSに入れる。本当はqtリソース化(qrc化)していれるべきだけど、とりあえずgo-qmlのサンプルがカレントパスのファイルを読み込む用になっていたので、そのまま入れてみた。
* Info.plistを適当に書き換え
* 実行できた。画像の読み込みパスがおかしい。.appの場合、カレントディレクトリが'/'になる。os.Args[0]は.app/Contents/MacOS以下の実行ファイルの絶対パス。
* macdeployqtもうまく実行できた。フレームワーク全部込みで50MBぐらい。Electronよりは半分ぐらい？圧縮すると12MB。iOS/Androidはまだやっていないが、[Xamarinよりでかそうで](http://www.muo.jp/2015/03/xamarinapi.html)悲しい。[ここによれば20MBぐらいに収まるよ](http://stackoverflow.com/questions/23808234/qt-android-5-3-application-size)という話も書かれているが、今後実際に計測してみたい。dylibよりはiOS版の静的リンクの方がサイズは小さそうではある。Androidも静的リンクライブラリ版を作ってしまうのも手かも。

今後
------

* 手順が複雑なので、 ``goqml setup`` でgo-qmlのダウンロードを、``goqml build``でアプリのビルドを、``goqml pack``でインストーラを作るツールを作る。
* Android/iOSのアプリも作ってみる
* ログ出力どうすればいいんだろうか？

**追記**: アプリを作ってみた。でもgo-qmlはクラッシュ時のデバッグとかがツラそうなので様子見中。

https://github.com/shibukawa/goqml
新人さんにより良いコミットメッセージを書いてもらうための対話式スクリプト

# 作ったもの

コミット時に対話式で質問を表示させるものをつくりました。
↓こんな感じ↓

![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/23189/b9bfc53b-ef71-271d-fd3b-875de358e8da.gif "tty.gif")

回答の内容をつなげたものがコミットメッセージになります。

質問リストは別のファイルで自由に設定できるので、
チーム内でコミットメッセージへ書いて欲しい内容をゆるく共有したい場合に。

https://github.com/shimokei53/git_simple_commit_message_editor


# How to use

スクリプト本体はこちら

```sh
#!/bin/sh

set -e

# core.editorに設定したいもの
# merge,rebaseなどの時に起動する
CORE_EDITOR=vi

# commitじゃなかった場合(mergeとかrebaseとか)の場合はCORE_EDITORに渡す
if [[ ! "$1" = *COMMIT_EDITMSG ]]; then
    $CORE_EDITOR $1
    exit 0
fi

CURRENT_DIR=$(cd $(dirname $0); pwd)
MSGLIST_FILE=$CURRENT_DIR/.gscme_msglist
SAMPLE_MSGLIST_FILE=$CURRENT_DIR/sample_msglist/.gscme_msglist_present_tense_subject

# .gscme_msglistファイルが無い場合は作る
# デフォルトの質問リストをセットする
if [[ ! -r $MSGLIST_FILE ]]; then
    /bin/echo "please edit .gscme_msglist file."
    cat $SAMPLE_MSGLIST_FILE > $MSGLIST_FILE
fi

COMMIT_MSG=""

exec 3< $MSGLIST_FILE
while read line 0<&3
do
    if [[ ${line} == \#* ]]; then
        continue
    fi
    if [[ ${line} ]]; then
        /bin/echo -n "$line > "
        read msg
        COMMIT_MSG="${COMMIT_MSG}${msg}"
    fi
    COMMIT_MSG="${COMMIT_MSG}\n"
done
exec 3<&-

echo $COMMIT_MSG >> $1
exit 0
```


コピペなりgithubから持ってくるなりして保存して実行権限つけてpath通して、

```
% chmod +x gscme
% mv gscme /usr/local/bin/gscme
```

core.editorを置き換えます。（乱暴）

```
% git config --local core.editor gscme
```

代わりに、普段使いのエディタを`CORE_EDITOR`の部分にセットしておいてください。

```
CORE_EDITOR=vi
```

`.gscme_msglist`というファイルができるので「コミットするときに書いて欲しいこと」を質問形式で並べると、
そこから１行ずつ表示させる仕掛けになってます。

チーム内で`.gscme_msglist`だけ共有することで、コミットの際に書いて欲しいことの統一を期待できます。

# 期待すること

「コミットメッセージに書いて欲しいこと」の共有方法は過去いろんな記事ありますが、
templateなどだと「メッセージの内容」についてまでは言及できなかったり、
またチーム開発の経験がないと「どんなメッセージが有用なのか？」というのがピンと来づらかったりするのかなぁと。

あと「質問に答えづらいコミット」≒ひとつのコミットでいろいろしすぎではないか、と
コミット分割を検討するチェックになるかな、といった副作用も期待してます。

実際には「事前にセットした文章を一行づつ表示させる」「回答をコミットメッセージとして保存する」ことしかしないので、応用効くと思います。たぶん。
なんか面白い使い方見つけたら教えて下さい。

## 質問の例

変更の概要とか

```
どのような変更ですか？
```

外部への影響とか

```
この変更によって,どんなことが起きますか？
```

変更された背景とか

```
なぜその変更が必要でしたか？
```

「何かstackoverflowに書いてたやつコピペしたら動いたんです」→せめてURL貼っといて、とか

```
参考URLなど（あれば）
```

あとは、issue番号とか（これは自動化したほうが楽かも）

```
issue number?
```

無駄に増やして嫌がらせとか

```
本当にコミットして大丈夫？ 
本当の本当に？
ちゃんとレビューした？
ではコミットしますか？
本当に？
・・・？
言い残したことはないですか？
```

あんまり行数増やすとすぐにうざったくなると思うので,3~4行くらいがいいと思います。

# 追記（4/16）

## 質問毎に改行を入れるようにしました
また質問ファイルの方に空行を入れると、コミットメッセージの方も空行が入るようにしました。

質問ファイル

```
(タイトルは現在形で自然に読めるように書く)このコミットは,

この変更によって,どんなことが起きますか？
なぜその変更が必要でしたか？
参考URLなど（あれば）
```

↓↓↓
コミットメッセージ

```
改行を追加した

1行目をタイトルのように表示できるようにしました
gitのお作法に従うようにしたかったため
http://qiita.com/smd8122/items/1dd077cb4d7757c5326c#comment-36fa06a283548220015b
```

これによって、形式が揃うようになりました。

## 質問ファイルのサンプルフォルダを作って頂きました

https://github.com/shimokei53/git_simple_commit_message_editor/tree/master/sample_msglist

皆さんがどんな質問を書いているのか、共有できればと思います。
Adobe AIRランタイムに含まれるOpenSSLのバージョン

#You are using a vulnerable version of OpenSSL

毎年恒例の(?)Google様からの警告メールが届きました。 
Google Play公開のアプリに脆弱性のあるOpenSSLのバージョンが使われているから対応しないと公開をブロックするという内容です。 

Adobe AIR SDK for Androidで開発していると、対応方法はSDKのバージョンを上げてみるしかないですね。というわけで、どのバージョンのAdobe AIR SDKでビルドするとどのバージョンのOpenSSLが含まれるのか調べました。

##AIR SDKとOpenSSLの対応

|AIR SDK|OpenSSL|vulnerable version|
|------:|------:|:----------------:|
|15.0.0.356|1.0.1i|yes|
|16.0.0.292|1.0.1l|yes|
|17.0.0.172|1.0.1m|yes|
|18.0.0.199|1.0.1m|yes|
|19.0.0.241|1.0.2d|yes|
|20.0.0.260|1.0.2d|yes|
|21.0.0.176|1.0.2f|no|
|22.0.0.153|1.0.2f|no|
|23.0.0.257|1.0.2h|no|
|24.0.0.180|1.0.2h|no|
|25.0.0.134|1.0.2j|no|
|26.0.0.118|1.0.2k|no|
|27.0.0.124|1.0.2k|no|
|28.0.0.125|1.0.2k|no|

##対応方法

2016年のOpenSSL 1.02f/1.01r以降に更新せよというお達しには、AIR SDKをバージョン21以降に上げて対応しましょう。

※APKファイルにAIRランタイムを同梱する「キャプティブランライム」で書き出している場合は、SDKを更新してリリースビルドする必要があります。 
「共有AIRランタイム」で書き出している場合は、APKファイルにAIRランタイムが含まれずOpenSSLも含まれないためそもそも警告メールは届かないはずです。
※AIR26からAndroid向けの共有ランタイムは無効になり、キャプティブランタイムのみに変更されました。
CSOM のインスタンスをチェックする方法


チェックプロパティが２つあってややこしいので、 http://stackoverflow.com/a/25682543/6153969 から転載

In order to determine whether client object property is loaded or not the following methods are available:

1. ClientObject.**IsPropertyAvailable** method method indicates whether the specified scalar property has been retrieved or set

1. ClientObject.**IsObjectPropertyInstantiated** method indicates whether the specified property of the client object is instantiated
# Tests

Test case 1: load scalar property only

```csharp
ctx.Load(ctx.Web, w => w.Title);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists")  //False
ctx.Web.IsPropertyAvailable("Title")    //True
```

Test case 2: load composite property only

```csharp
ctx.Load(ctx.Web, w => w.Lists);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists") //True
ctx.Web.IsPropertyAvailable("Title")    //False
```
Test case 3: load both scalar and composite properties

```csharp
ctx.Load(ctx.Web, w=>w.Lists,w=>w.Title);
ctx.ExecuteQuery();
//Results
ctx.Web.IsObjectPropertyInstantiated("Lists")  //True
ctx.Web.IsPropertyAvailable("Title")    //True
```
【Google Analytics】日本固有の検索エンジンからの検索キーワード取得方法

#日本固有の検索エンジンからの検索キーワード取得方法

GoogleやYahoo!、Bingなどの主要な検索エンジンからのトラフィックは自然検索に分類されますが、その他の日本固有の検索エンジンは「自然検索トラフィック」ではなく「参照トラフィック」として分類されてしまいます。

以下の方法で、日本固有の検索エンジンからのトラフィックのキーワードを取得することができます。

1. 「アナリティクス設定」→「プロパティ」→「トラッキング情報」→「オーガニック検索ソース」
2. 「+検索エンジンを追加」をクリック
3. 以下の検索エンジン情報を作成する。

|検索エンジン名|ドメイン名に次を含む|クエリ パラメータ|
|:--|:--|:--|
|au|auone.jp|q|
|docomo|docomo.ne.jp|MT|
|Dolphin Browser|search.dolphin-browser.jp|q|
|excite|websearch.excite.co.jp|q|
|hi-ho|hi-ho.excite.co.jp|search|
|livedoor|search.livedoor.com|q|
|Lunascape|s.luna.tv|q|
|My Cloud|search.azby.fmworld.net|q|
|My Cloud|search.azby.fmworld.net|Text|
|My VAIO|search.start.sony.jp|MT|
|MY JCOM|search.myjcom.jp|q|
|nifty|nifty.com|q|
|nifty|nifty.com|Text|
|ocn|wsearch.ocn.ne.jp|MT|
|Sleipnir|search.fenrir-inc.com|q|
|so-net|so-net.ne.jp|query|

これで追加した検索エンジンからのトラフィックが自然検索として分類され、また「オーガニック検索キーワード」レポートで検索キーワードを確認できるようになります。
CloudWatch Eventsの特定のルールを有効化／無効化できるポリシーを書いてみた

# 書いてみた背景

- EC2インスタンスの自動起動／自動終了をCloudWatch EventsとLambdaで運用していた。
- 特定の部署で管理するEC2インスタンスの自動起動／自動終了をその部署で制御したいという要望があった。

# 実際書いた結果

以下のような感じで、ルールのARNをリソースに指定することで権限の付与が可能です。

```json:ポリシー例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "events:DescribeRule",
                "events:ListRuleNamesByTarget",
                "events:ListRules",
                "events:ListTargetsByRule",
                "events:TestEventPattern"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "events:DisableRule",
                "events:EnableRule"
            ],
            "Resource": [
                "arn:aws:events:ap-northeast-1:************:rule/********"
            ]
        }
    ]
}
```

一括してRuleを指定できるように、RuleにTagをつけることができたらいいんですけどね。
（ルール名に特定の接頭辞を設定＋ワイルドカードでもいいんですが、命名規則決めて運用でカバーになっちゃうしなー・・・）

# 補足

## 自動起動の方法について

自動終了はBuilt-in Targetを利用すればいいんですが、自動起動は用意されていなかったので
とりあえず、以下のようなLambda FunctionをInvokeしています。
インスタンスの指定は、Configure input >> Constant (JSON text)でインスタンスIDを直接指定しています。
（もっと汎用的なの書きたいなー、今のところ使うあてはないけど。）

```py
import boto3
 
def lambda_handler(event, context):
    client = boto3.client('ec2')
    id = event['instance-id']
    response = client.start_instances(
        InstanceIds=[
            id,
        ]
    )
    print response
```
Docker Quickstart TerminalをMinttyで使う

アップデートとかで上書きされないうちにメモ。

Docker Quickstart TerminalはGitのbashを借りているようだが、`%GITDIR%\bin\bash.exe`を使うのでコマンドプロンプトが起動し、フォントが汚かったり表示がバグったりする。あとGitを2.8.0にバージョンアップしたからか知らんけどなんかVimが動かんくなった。

そこでスタートメニューのDocker Quickstart Terminalのショートカットのプロパティを開き、

- リンク先: `"C:\Program Files\Git\git-bash.exe" --no-cd -l -i -c start.sh`
- 作業フォルダ: `"C:\Program Files\Docker Toolbox"`

これでMinttyの綺麗なフォントレンダリングと（Minttyで設定すれば）256colorで表示できる。あと`docker-compose logs`とかのカラー出力も正常に表示される。

-----

2016/04/06 追記

これやるとDockerの`-it`オプションがエラー起こすようになるっぽい？

とりあえず、[Vimがフリーズする問題も直った](https://github.com/git-for-windows/git/releases/tag/v2.8.1.windows.1)みたいだし戻しておく。
セル内の行（改行）それぞれに処理を行う関数

セル内改行を含むものをfor eachで回すための関数
ググっても出なかったので備忘録


instrの方が早そうだけど、処理する情報量が少ないのでこれでいいかなと、、

```
Function lines_to_collection_in_cell(text As String) As Collection '入力されたテキストを行ごとにcollectionに格納

    Dim lines As New Collection

    line_start_position = 1

    For i = 1 To Len(text)
        If Mid(text, i, 1) = vbLf Then
            lines.Add Item:=Mid(text, line_start_position, i - line_start_position)
            line_start_position = i + 1
        End If
        
        If i = Len(text) Then
            lines.Add Item:=Mid(text, line_start_position, i - line_start_position)
        End If

    Next i

    set lines_to_collection_in_cell = lines
End Function
```
Atomのパッケージremote-ftpにおけるエラー"Invalid host hash algorithm: undefined"の対処法

remote-ftpで作成する".ftpconfig"を以下のようにsha1を追加。

```
"hosthash":"",    
↓
"hosthash":"sha1",
```

参考：https://github.com/mgrenier/remote-ftp/issues/321
PhoenixでYamlを扱うライブラリyaml_elixirを使ってみる

絶賛Elixir + Phoenixでwebアプリ作ってみよう期間中につき、それ系のネタです。
今回はYamlを扱いたかったので、便利なライブラリってないかなと探してて使ったもののまとめ。

# 公式github

githubはこちら

https://github.com/KamilLelonek/yaml-elixir


# インストール

mix.exsは以下の内容追加です。

```mix.exs
def application do
  # 割愛
  applications: [
    # 割愛
    , :yaml_elixir]] # :yaml_elixirを適当な場所に追加
  ]
end

def deps do
  # 割愛
  {:yaml_elixir, "~> 1.0.0"}, # yaml_elixir追加
  {:yamerl, github: "yakaz/yamerl"}, # yamerl追加
end
```

でいつも通りのdeps.get

```bash
$ mix deps.get
```

# 使い方

## ファイルから読み込む

一番多そうな使い方はyamlファイルを読み込んでparse的な感じですね。
自分で使うのもそんなのが多いです。

そういう場合はこんな感じになります。

```hoge.yml
"1": "hoge"
"2": "moge"
"3": "huga"
```

```ex
iex(1)> path = File.cwd! |> Path.join("yaml/hoge.yml")
"/home/develop/apps/tutorial/yaml/hoge.yml"
iex(2)> YamlElixir.read_from_file path
%{"1" => "hoge", "2" => "moge", "3" => "fuga"}
```

これで読み込めました！

ちなみに、yamlファイルのキーの部分を"1"ではなく1にしてしまうと、エラーするみたいです(´・ω・｀)

## 変数から読み込む

あんまりパターンなさげですが、yaml形式の文字列変数からも読み込めます

```ex
iex(1)> yml_string = """
...(1)> "1": hoge
...(1)> "2": moge
...(1)> "3": fuga
"""
"\"1\": hoge\n\"2\": moge\n\"3\": fuga\n"
iex(2)> YamlElixir.read_from_string yml_string
%{"1" => "hoge", "2" => "moge", "3" => "fuga"}
```

こんな感じです。
見てるページを参考リンクにするブックマークレット


最近よくMarkdownに

```
### 参考
+ [xxxについて](http://xxx)
```
みたいな参考リンクを貼る機会が多いので、ブックマークレットを作ってみた。
Chrome拡張はよく作るけど、BookMarkLetは初めて作った。楽で良いね。


適当に作ったブックマークのURLを以下のソースに変更すればOK

```Javascript
javascript:
var url = location.href;
var title = document.getElementsByTagName('title')[0].text;
alert('+ [' + title + '](' + url + ')');
```


こんな感じのポップアップが出るので、適当にコピーして使う。
![スクリーンショット 2016-04-04 10.28.13.png](https://qiita-image-store.s3.amazonaws.com/0/113398/25d0b43d-5765-31f4-edb7-910fda6d97ca.png "スクリーンショット 2016-04-04 10.28.13.png")


MacのChromeとSafariで動いた。まぁ多分大体動くのではなかろうか。
Xcode7 実行時にbreakpointでアセンブリ表示されてしまう問題の解決

# 現象
実行環境: xcode 7.3

以下のような感じにbreakpointを設置する。
![スクリーンショット 2016-04-04 10.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/40796/93844674-d111-def9-849b-f3119adeeed3.png)

それで実行すると、なぜかアセンブリ表示。。
![スクリーンショット 2016-04-04 10.08.35.png](https://qiita-image-store.s3.amazonaws.com/0/40796/f6330f88-cf0c-6de6-95e1-1675bf8e14e6.png)

[Xcodeでのデバッグ方法](http://blogios.stack3.net/archives/776)
みたいにデバッグ出来ない。。

# 原因
デバッグの設定が原因だった。
ここの 「Always Show Disassembly」のチェックを外せば問題が解決した。

![スクリーンショット 2016-04-04 10.11.39.png](https://qiita-image-store.s3.amazonaws.com/0/40796/418d6159-4a41-8d2e-06f7-eefbf77156de.png)

無事実行時に下記のような表示がされるようになった。

![スクリーンショット 2016-04-04 10.14.35.png](https://qiita-image-store.s3.amazonaws.com/0/40796/e3257521-88c0-0c88-d4b1-2225565f8536.png)

参考
[Xcode4.1 デバッグ時のアセンブリ表示からの脱出](http://cocoadays.blogspot.jp/2011/08/xcode41.html)
rpmbuildで自動で依存関係を付与されるのを回避

## 参考

* [Where does rpm look for dependencies? - Stack Overflow](http://stackoverflow.com/questions/11418814/where-does-rpm-look-for-dependencies)
* [PerlスクリプトをRPMの中に入れようとすると，requireまで依存性チェックした - Lejayの日記](http://d.hatena.ne.jp/Lejay/20090207/1233988273)

## 方法

.specファイルに以下を追記

```diff:tenshi.redhat-spec
  #--------------------------------------------------------------------------------
  #  Basic package information
  #--------------------------------------------------------------------------------
  Summary:           tenshi log monitoring program
  Name:              %{name}
  Version:           %{version}
  Release:           %{release}
  Group:             System Environment/Daemons
  License:           ISC-style
  Url:               http://www.inversepath.com/tenshi.html
  Source0:           %{name}-%{version}.tar.gz
  Requires:          perl
  Buildroot:         %{_tmppath}/%{name}-buildroot
+ AutoReqProv:       no
  
  #--------------------------------------------------------------------------------
  #  Description of the package
  #--------------------------------------------------------------------------------
  %description
```

## 確認

```bash:変更前
$ rpm -qpR /usr/src/redhat/RPMS/i386/tenshi-0.13-1.i386.rpm
/bin/sh  
/bin/sh  
/bin/sh  
/bin/sh  
/usr/bin/perl  
config(tenshi) = 0.13-1
perl  
perl(File::Temp)  
perl(Getopt::Long)  
perl(IO::BufferedSelect)  
perl(IO::Socket::INET)  
perl(Net::SMTP)  
perl(POSIX)  
perl(Sys::Hostname)  
perl(Term::ANSIColor)  
perl(Time::Local)  
perl(filetest)  
perl(strict)  
perl(warnings)  
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
```

```bash:AutoReqProvオプションをつけてビルドし直し
sudo rpmbuild -bb tenshi.redhat-spec --quiet
```

```bash:依存関係が減った
$ rpm -qpR /usr/src/redhat/RPMS/i386/tenshi-0.13-1.i386.rpm
perl  
/bin/sh  
/bin/sh  
/bin/sh  
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
```

----

## tenshiのrpmパッケージを作ってみた

```bash:
wget https://dev.inversepath.com/download/tenshi/tenshi-0.15.tar.gz
tar xzf tenshi-0.15.tar.gz
sudo mv tenshi-0.15.tar.gz /usr/src/redhat/SOURCES/
cd tenshi-0.15
vim tenshi.redhat-spec
```

```diff:tenshi.redhat-spec
  Buildroot:         %{_tmppath}/%{name}-buildroot
+ AutoReqProv:       no
  
  #--------------------------------------------------------------------------------
  #  Description of the package
  #--------------------------------------------------------------------------------
  %description
```

```
$ rpm -qpR /usr/src/redhat/RPMS/i386/tenshi-0.15-1.i386.rpm
perl  
/bin/sh  
/bin/sh  
/bin/sh  
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
```

## 消せなくなった場合

```
$ sudo rpm -e tenshi-0.15-1
エラー: %preun(tenshi-0.15-1.i386) スクリプトの実行に失敗しました。終了ステータス 1
$ sudo rpm -ev --nopreun tenshi
エラー: %postun(tenshi-0.15-1.i386) スクリプトの実行に失敗しました。終了ステータス 6
$ sudo rpm -ev --nopreun --nopostun tenshi
```