OmniAICreator/Qiita-1.07M huggingface dataset:
PK00で始まるZIPファイル

「zipファイルを展開できない」と問い合わせがあって、調べてみたら ```PK00``` つまり PK\30\30 で始まるファイルだった。もろもろ考えた結果、「分割アーカイブには対応していません」という仕様にすることにした。そのときのメモ。

## ZIPファイルってそもそもなによ

複数のファイルを圧縮したアーカイブファイルのこと。

zipファイルは通常、PK\03\04や PK\07\08 で始まる圧縮済みファイルブロックと、それらのインデックスである PK\01\02 で始まり PK\05\06 レコードで終わるディレクトリブロックが連結された構造になっている(→[Wikipedia](https://en.wikipedia.org/wiki/Zip_(file_format)))。

ファイル冒頭にある数バイトが特徴的なので、それを検査することで「たぶんzipファイルである」ということがわかる。LINUXのfileコマンドでは、[/etc/magic](https://github.com/file/file/blob/master/magic/Magdir/archive#L769) というマジックナンバー定義を使っている。そのZIPファイルの定義は以下のようになっている:

```file:/etc/magic
# PKZIP multi-volume archive
0	string		PK\x07\x08PK\x03\x04	Zip multi-volume archive data, at least PKZIP v2.50 to extract
!:mime	application/zip
!:ext zip/cbz

# Zip archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
0	string		PK\005\006	Zip archive data (empty)
!:mime application/zip
!:ext zip/cbz
0	string		PK\003\004
```

# PK00って定義されてないけど……なに?

検索してみたら、[PKZIPのAPPNOTE](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) 8.5.4 に記載があった。つまり、PKZIP 2.50以降で作成された、分割アーカイブのようだ。

- StackOverflowだと[こんなやりとり](http://stackoverflow.com/questions/12039237/how-to-check-if-zip-file-is-split-across-multiple-archives-using-pythons-zipfil)があったり。
- OpenJDKでは [BUG 678605](https://bugs.openjdk.java.net/browse/JDK-6782605) がまだOpenである。
- [Oracle Javaでは実装されているけどー](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=31305)という情報もある。 → 動かないらしい。ざんねん。

この問題の検索キーワードは、```PK00``` またはそのビッグエンディアンの ```0x30304b50``` です。
ruby singleton module

http://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html

```rb
require "singleton"
require "pry"

class Klass
  include Singleton

  attr_accessor :la

  def lala
    binding.pry
  end

  def fuck
    puts "fuck you"
  end
end
 
a = Klass.instance
a.lala

b = Klass.instance
b.lala
```

```
vagrant@precise64:~/data$ ruby 1.rb

From: /home/vagrant/data/1.rb @ line 11 Klass#lala:

     9: def lala
    10:   binding.pry
 => 11: end

[1] pry(#<Klass>)> self.la = 12
=> 12
[2] pry(#<Klass>)> exit

From: /home/vagrant/data/1.rb @ line 11 Klass#lala:

     9: def lala
    10:   binding.pry
 => 11: end

[1] pry(#<Klass>)> self.la
=> 12
[2] pry(#<Klass>)> exit
vagrant@precise64:~/data$ ruby 1.rb

From: /home/vagrant/data/1.rb @ line 11 Klass#lala:

     9: def lala
    10:   binding.pry
 => 11: end

[1] pry(#<Klass>)> la = 12
=> 12
[2] pry(#<Klass>)> exit

From: /home/vagrant/data/1.rb @ line 11 Klass#lala:

     9: def lala
    10:   binding.pry
 => 11: end

[1] pry(#<Klass>)> la
=> nil
[2] pry(#<Klass>)> exit
vagrant@precise64:~/data$ 
```

不能使用initialize

```rb
require "singleton"
require "pry"

class Klass
  include Singleton

  attr_accessor :la

  def initialize
    puts "lalala"
  end

  def lala
    binding.pry
  end

  def fuck
    puts "fuck you"
  end
end
 
a = Klass.instance
a.lala

b = Klass.instance
b.lala
```

```
vagrant@precise64:~/data$ ruby 1.rb
lalala

From: /home/vagrant/data/1.rb @ line 15 Klass#lala:

    13: def lala
    14:   binding.pry
 => 15: end

[1] pry(#<Klass>)> exit

From: /home/vagrant/data/1.rb @ line 15 Klass#lala:

    13: def lala
    14:   binding.pry
 => 15: end

[1] pry(#<Klass>)> exit
```

rails里面的另一种实现

```rb
class Test
	def initialize
		puts "lala"
	end

	def self.instance
		@instance ||= new
	end
end
```

```rb
[1] pry(main)> Test.instance.object_id
lala
=> 33236940
[2] pry(main)> Test.instance.object_id
=> 33236940
```
知っておきたい政府のセキュリティ対策

# 知っておきたい政府のセキュリティ対策

サイバー犯罪が増加する昨今、エンジニアや非エンジニアがセキュリティを意識することがとても重要です。
ここでは個人や会社レベルではなく、政府レベルでどういったセキュリティ対策を行っているかの組織や会議などを概要レベルで紹介したいと思います。
新人プログラマの方は、もちろん言語レベルやアーキテクチャレベルのセキュリティ知識も重要ですが、
こういった政府のセキュリティ対策に対する動きも把握しておくと、勉強になりますよん。

## 政府の組織

* 内閣サイバーセキュリティセンター（NISC)   
2015年1月9日に日本政府が内閣官房に設置した組織   
JPCERT/CCと共に、日本における実質的なナショナルCSIRTの役割を果たしている。   
組織体制   
http://www.nisc.go.jp/about/organize.html


>CSIRT(シーサート)とは？
コンピュータやネットワーク上で何らかのセキュリティ上の問題が起きていないかどうか監視すると共に、万が一問題が発生した場合にその原>>因解析や影響範囲の調査を行ったりする組織の総称

日本年金機構の年金情報流出事件の調査結果もNISCが報告書として出しています。
http://itpro.nikkeibp.co.jp/atcl/column/14/346926/082400321/?ST=govtech


### 関連する組織/団体

* 一般社団法人 JPCERTコーディネーションセンター(JPCERT/CC))
コンピュータセキュリティの情報を収集し、インシデント対応の支援、コンピュータセキュリティ関連情報の発信などを行う一般社団法人

* 日本サイバー犯罪対策センター(JC3)(日本版NCFTA)
サイバー空間の脅威に産官学連携で対処することを目的として日本で設立された非営利団体の名称
産業界、学術機関、法執行機関（警察）のそれぞれの強み、経験の蓄積を迅速に共有し、警察の捜査権限をより効果的に行使するなど、サイバー空間における脅威への「先制的・包括的な対応」を実現しようとする

IPA(情報処理推進機構)と経済産業省が協力

* サイバー情報共有イニシアティブ（J-CSIP（ジェイシップ）
2011年10月25日、経済産業省の協力のもと、重工、重電等、重要インフラで利用される機器の製造業者を中心に、情報共有と早期対応の場として発足。

* サイバーレスキュー隊J-CRAT（ジェイ・クラート)
標的型サイバー攻撃の被害拡大防止のため、2014年7月16日、経済産業省の協力のもと、相談を受けた組織の被害の低減と攻撃の連鎖の遮断を支援する活動としてサイバーレスキュー隊を発足

## セキュリティ対策会議

* 警察庁 総合セキュリティ対策会議    
http://www.npa.go.jp/cyber/csmeeting/index.html     
警察庁の検討会     
現代の社会のインフラは、情報セキュリティが必須です。     
有識者等によって情報セキュリティをテーマに取り上げ、検討を行っている会議です。広い分野の有識者の方が委員になっており、委員長は東京都立大学の前田氏です。    
上記URLに報告書や資料がアップされています。

## 政府のサイバーセキュリティ予算
http://www.nisc.go.jp/conference/cs/dai05/pdf/05shiryou03.pdf

平成28年度予算概算要求額は７４２．８億円です
平成27年度予算額が３２５．８億円
なので、かなり予算アップの要求がされています。
これは政府のセキュリティ対策に対する重要度が増してることがわかります

## まとめ

オリンピックもありますし、サイバー犯罪にどう立ち向かうか。NISCもまだ完全ではないので、早急な組織強化と人材育成が
必要だと思います。

## 関連記事

http://www.itmedia.co.jp/enterprise/articles/1501/09/news097.html
http://www.kantei.go.jp/jp/tyoukanpress/201601/25_a.html
http://www.nisc.go.jp/conference/cs/taisaku/ciso/dai01/pdf/01shiryou06.pdf
http://blogos.com/article/116370/?p=2
http://itpro.nikkeibp.co.jp/atcl/esi/14/527562/122200003/
Oracle 12cのパターンマッチングSQL(MATCH_RECOGNIZE)を使って、ズンドコ!


##パターンマッチング##
パターンマッチングを行うことによって、たとえば機器ログでのDouble Bottom(W)パターンを検出したり、株式変動における価格パターンを識別できます。[MATCH_RECOGNIZE句](http://docs.oracle.com/cd/E57425_01/121/DWHSG/pattern.htm#sthref827)を利用することによって、SQLが苦手だったテーブルの行データに対しても特定の数値のパターンや文字列の出現順序に柔軟に対応することができます。

流行りに乗って手元のOracle Database Cloud環境でズンドコキヨシを試してみたいと思います。
今回はパターンマッチングがメインなので、plsqlでのデータ作成は[PL/SQLでズンドコキヨシ](http://qiita.com/ora_gonsuke777/items/d25b97e4c4f6faf5a488)を参考にさせていただきました。

そもそもズンドコキヨシってなんだという方はこちらに[まとめ記事](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)がありますので、ご覧下さい。元ネタは[こちら](https://twitter.com/kumiromilk/status/707437861881180160?ref_src=twsrc%5Etfw)。

>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了

```lang:OracleDatabase12c
--事前にテーブルを落とします
DROP TABLE zundokokiyoshi;
--ズンドコ用テーブルを作成
CREATE TABLE zundokokiyoshi(rhythm NUMBER(30,0),word VARCHAR2(20));
--データ生成とパターンマッチングをPL/SQLで実装
DECLARE
  vstr VARCHAR2(20);
  vexit INTEGER := 0;
  i INTEGER := 0;
BEGIN
  DBMS_RANDOM.SEED(TO_CHAR(SYSTIMESTAMP, 'YYYY/MM/DD HH24:MI:SS.FF'));
  LOOP
    i := i + 1;
    vstr := CASE MOD(TRUNC(DBMS_RANDOM.VALUE*10), 2) WHEN 0 THEN 'ズン！' ELSE 'ドコ！' END;
    INSERT INTO zundokokiyoshi(rhythm,word) VALUES (i,vstr);
    SELECT COUNT(*) INTO vexit FROM (
      SELECT rhythm,word 
      FROM zundokokiyoshi 
      MATCH_RECOGNIZE(
        ORDER BY rhythm
        MEASURES zun.rhythm AS zunrhythm,
                 MATCH_NUMBER() AS match_num
        ALL ROWS PER MATCH
        PATTERN (zun zun zun zun doco)
        DEFINE
        zun AS zun.word = 'ズン！',
        doco AS doco.word = 'ドコ！'
      ) mr
      ORDER BY rhythm
    )T;
    EXIT WHEN vexit = 5;
  END LOOP;
  INSERT INTO zundokokiyoshi(word) VALUES ('キ・ヨ・シ！');
  COMMIT;
END;
/
--結果の確認!
SELECT word FROM zundokokiyoshi;
```
ポイントとなるのは、**PATTERN (zun zun zun zun doco)**と記したところで、ここの記述を少し変えればいろいろなパターン検出に応答できます。

```lang:OracleDatabase12cクエリ部分だけ
SELECT rhythm, word 
FROM zundokokiyoshi 
MATCH_RECOGNIZE(
    ORDER BY rhythm
    MEASURES zun.rhythm AS zunrhythm,
             MATCH_NUMBER() AS match_num
    ALL ROWS PER MATCH
    PATTERN (zun zun zun zun doco)
    DEFINE
    zun AS zun.word = 'ズン！',
    doco AS doco.word = 'ドコ！'
) mr
ORDER BY rhythm
```

クエリ部分出力結果例

|   | RHYTHM |WORD   |
|--:|-------:|:------|
|  1|      50|ズン！ |
|  2|      51|ズン！ |
|  3|      52|ズン！ |
|  4|      53|ズン！ |
|  5|      54|ドコ！ |

**PATTERN (zun zun zun zun doco)**と記したところと同じパターンが抽出できています。今回はズンドコで行いましたがもちろん数字でも対応できるので、より複雑なパターンマッチングも簡単にMATCH_RECOGNIZE句で書くことができます。
c++ builder > 1000個のデザインの変更 > 120分

```txt:動作確認
C++ Builder XE4
```

10列 x 10行 x 10Pageの項目、合計1000個のデザインのやり直し。
主に位置調整と名前の付けなおし。

所要時間120分 (途中の割り込み10回を除く)。

120 * 60 / 1000 = 7.2秒/個あたりの作業時間。

時間短縮で役に立ったこと

- IDEのエラーをわざと利用 > フォーカス移動が楽
- [Enter]キーを押さない > 項目のフォーカス変更時に[Enter]の入力と同等になるのを利用
- 構造ウィンドウを利用 > デザイン上のコンポーネント選択時の誤操作を回避
- デザイン上で選択が必要な時、右クリックで選択 > 誤操作を回避

たった2時間の作業でしんどさが通常のコーディングと異なるのはなぜなのだろうか。単調作業だからかもしれない。
Atomのパッケージ

#Atomパッケージ
編集中

##プロジェクト関連
###[project-manager](https://atom.io/packages/project-manager)
プロジェクト管理

###[EditorConfig](https://atom.io/packages/EditorConfig)
コーディングスタイルの設定

```ruby:editorconfig
#ここがプロジェクトのルートですよ
root = true

#対象の指定
[*]
#改行コード
end_of_line = crlf
charset = utf-8
indent_style = tab
indent_size = 4
#行末の空白削除します？
trim_trailing_whitespace = false
#最終行に改行いれます？
insert_final_newline = false

[*.md]
indent_style = space
indent_size = 4
insert_final_newline = true

[*.{js,css}]
trim_trailing_whitespace = true
insert_final_newline = true

```

####補足

- 「charset」 が "latin1", "utf-8", "utf-8-bom", "utf-16be" or "utf-16le"のどれかしか指定できない。
- 「charset」 が新規ファイルには反映されない。

指定できないcharsetは、atomの設定で行えば、一つだけは何とか対応できる。
（他に方法あれば教えてほしいです）


####参考
http://editorconfig.org/


##○○関連
###[minimap](https://atom.io/packages/minimap)



##lint関連

##あったら欲しい
あなたと住むとこが違うの・・・（メモリアドレス）


hogeたちが一緒に住めるか、気にかけてみた

```
NSArray *hoge1 = [[NSArray alloc] init];
NSArray *hoge2 = [[NSArray alloc] init];
NSArray *hoge3 = @[];
NSArray *hoge4 = @[];
NSArray *hoge5 = [NSArray array];
NSArray *hoge6 = [NSArray array];
NSMutableArray *hoge7 = [[NSMutableArray alloc] initWithCapacity:0];
NSMutableArray *hoge8 = [[NSMutableArray alloc] initWithCapacity:0];
NSMutableArray *hoge9 = [hoge3 mutableCopy];
NSMutableArray *hoge10 = [hoge4 mutableCopy];
NSMutableArray *hoge11 = [@[] mutableCopy];
NSMutableArray *hoge12 = [@[] mutableCopy];
NSArray *hoge13 = @[@"hoge", @"fuga"];
NSArray *hoge14 = @[@"hoge", @"fuga"];
NSMutableArray *hoge15 = [@[@"hoge", @"fuga"] mutableCopy];
NSMutableArray *hoge16 = [@[@"hoge", @"fuga"] mutableCopy];
```
 

hoge1からhoge6までは __同居__ している
hoge7からhoge16までは __別居__ している

当方、`Xcode Version 7.2.1 (7C1002)` 

一緒に暮らさなくてもいいんだよ！
Embulk Core & Plugin Hacking Tips


Embulk本体とプラグインの開発に役立つ(かもしれない)tipsのリンク集

## 開発のドキュメントどこにあるの？

* [README](https://github.com/embulk/embulk#embulk-development)
* [JavaDoc](http://www.embulk.org/docs/javadoc/index.html)
* [RDoc](http://www.embulk.org/docs/rdoc/_index.html)

## embulkの実行ファイルってどこにできるの？

``gradlew cli``して作成される、pkg/embulk-x.y.z-jarが実行ファイルです。
拡張子にjarってついていますが、そのまま実行できます。

```
./pkg/embulk-0.8.8.jar 
Embulk v0.8.8
...
```

## JRubyのバージョンを変えたい

build.gradle を修正します。[参考](https://github.com/embulk/embulk/pull/398/files)

## Gradleのバージョンを変えたい

[Embulk コア開発者向け、Gradleのバージョンアップ手順](http://qiita.com/hiroysato/items/0cd0bf81ab66cf7e14dd) を参考にしてください。

## Windows上で、本体やプラグインのビルドをしたい。

* gitとJDKが必要です。
* jruby-gradleのバージョンを1.0.5より上のバージョンを使ってください。(古いバージョンだと``gradlew gem``が失敗します) [参考1](https://github.com/embulk/embulk-input-jdbc/issues/42) [参考2](https://github.com/embulk/embulk-input-jdbc/pull/43)
* Cygwinじゃないとうまくいかない場合があるかもしれません。[参考](https://twitter.com/hito4_t/status/709530715717640192)

## gradle-jrubyのバージョンをあげたら``invalid option: -S``というエラーが出た。

``build.gradle``内の``script``を``scriptArgs``に変えます。[参考](https://github.com/embulk/embulk-input-jdbc/pull/43)
docker.serviceが起動できなかった場合


CentOS7 でdockerをシャットダウンしたときうまくいかなったので
とりあえずの復旧手順をめも。

```
sudo ip link set dev docker0 down
sudo brctl delbr docker0
sudo systemctl start docker
```

発生したエラー

```
Error starting daemon: Error initializing network controller: Error creating default \"bridge\" network: Failed to setup IP tables, cannot acquire Interface address: Interface docker0 has no IPv4 addresses
```
Redux のカウンターアプリの解説



Redux のマニュアルの[トップページ](http://redux.js.org/)に記載されているカウンターアプリの解説を翻訳しました (2016年3月18日)。


アプリケーション全体の状態は単独のストア内部のオブジェクトツリーに保存されます。状態のツリーを買える唯一の方法はアクションをエミットすることです。アクションは何が起きたのかを記述するオブジェクトです。アクションが状態ツリーを変換する方法を指定するには、純粋な reducer を書きます。

ただそれだけです！

```js
import { createStore } from 'redux'

/**
 * これは reducer です。
 * (state, action) => state のシグネチャをもつ純粋な関数です。
 * これはアクションが状態を次の状態に変換する方法を記述します。
 *
 * 状態の表現のかたちはあなたしだいです。プリミティブ、配列やオブジェクト、
 * もしくは Immutable.js のようなデータ構造になります。
 * 唯一重要な部分は状態オブジェクトは可変なものとして扱うのではなく、
 * 状態が変更したときに、新しいオブジェクトを返すことです。
 *
 * この例では、`switch` ステートメントと文字列を使いますが、
 * プロジェクトで意味をなすなら、
 * (関数マップなど) 異なる規約に従うヘルパーを使うことができます。
 */
function counter(state = 0, action) {
  switch (action.type) {
  case 'INCREMENT':
    return state + 1
  case 'DECREMENT':
    return state - 1
  default:
    return state
  }
}

// アプリケーションの状態を保有する Redux ストアをつくります。
// この API は { subscribe, dispatch, getState } です。
let store = createStore(counter)

// 更新を手動で購読する、もしくはビューレイヤーへのバイディングを使うことができます。
store.subscribe(() =>
  console.log(store.getState())
)

// 内部の状態を変える唯一の方法はアクションをディスパッチすることです。
// アクションをシリアライズしたり、ロギングしたり、保存したり、後でリプレイすることができます。
store.dispatch({ type: 'INCREMENT' })
// 1
store.dispatch({ type: 'INCREMENT' })
// 2
store.dispatch({ type: 'DECREMENT' })
// 1
```

状態を直接変更する代わりに、アクションと呼ばれるプレーンなオブジェクトで起きる変化 (mutation) を指定します。すべてのアクションがアプリケーション全体の状態をどのように変換するのかを決めるために、reducer と呼ばれる特別な関数を書きます。

Flux を使ってきたのであれば、理解する必要のあることが1つあります。Redux は Dispatcher をもたないもしくは複数のストアをサポートしないということです。代わりに、関数を reduce する単独のルートをもつ単独のストアがあるだけです。アプリケーションが成長するにつれて、ストアを追加する代わりに、ルートの reducer を独立した複数の reducer に分割します。これらの reducer は異なる部分の状態ツリーでオペレーションを実行します。React アプリでただ一つのルートがあり、複数の小さなコンポーネントで合成される場合とそっくりです。

このアーキテクチャはカウンターアプリに対して過剰であるように見えるかもしれませんが、このパターンの美しさは大きく複雑なアプリにスケールするためにうまく対応できることです。これはとても強力な開発者のツールとしても機能します。アクションへのすべてのミューテーションをトレースできるからです。ユーザーセッションを記録し、すべてのアクションを置き換えるだけでそれらを再生成できます。
Unityで「Animator has not been initialized」という警告が出る

環境はUnity5.3.4f1。

>Animator.SetTriger("hoge");

としたときに、

>Animator has not been initialized.

と警告される。

以下の記事で掛かれているように、
http://forum.unity3d.com/threads/mecanim-issue-animator-has-not-been-initialized.158874/page-2

GameObjectをSetActive( true )にしてからAnimator.SetTrigerするようにしたら、警告がでなくなった。
Xamarin: Button.Tagにオブジェクトをセットして１つのClickハンドラで処理する


## JavaObjectWrapper

- [How to convert a type to Java.lang.object](https://forums.xamarin.com/discussion/7894/how-to-convert-a-type-to-java-lang-object)

~~~csharp
public class JavaObjectWrapper<T> : Java.Lang.Object
{
  public T Obj { get; set; }
}
~~~

### GetTag<T>/SetTag<T> 拡張メソッド

~~~csharp
public static T GetTag<T>(this Android.Widget.Button button){
  return (button.Tag as JavaObjectWrapper<T>).Obj;
}
public static void SetTag<T>(this Android.Widget.Button button, T obj)
{
  button.Tag = new JavaObjectWrapper<T>{ Obj = obj };
}
~~~

## TableViewにテーブル ボタン

- Line オブジェクトをTagとしてセットする

~~~csharp

  // LineTable: cols列のTableView
  TableRow row = null;

  for (int i = 0; i < lines.Count (); i++) {
    var line = lines [i];

    if (i % cols == 0) {
      row = new TableRow (this){LayoutParameters =rowlayouts};
      LineTable.AddView (row);
    }

    var button = new Button (this);
    button.SetText (line.name, TextView.BufferType.Normal);
    button.SetTag<Line> (line);
    button.Click += OnLineButtonClicked;
    row.AddView (button, buttonlayout);
  }
}
~~~


## Clickハンドラ

- LineオブジェクトをTagから復元する

~~~csharp
void OnLineButtonClicked(object sender, EventArgs e) {
  var line = (sender as Button).GetTag<Line>();
  Console.WriteLine ("...... {0}", line.name);
}
~~~
rails-assets から、npm に移行するために、Gemfile.lock から version 付きのライブラリ名を抜き出す

rails-assets が停止してしまうので、ライブラリを npm に移動する。
version も合わせたいので、抜き出すスクリプトを書く。

```
grep rails-assets Gemfile.lock | sed -n 's/^    rails-assets-\(.*\)/\1/p' | sed 's/\(.*\) (\(.*\))/\1@\2/'
```

結果は下みたいになる

```
angular-ui-tree@2.10.0
blueimp-canvas-to-blob@2.1.1
blueimp-load-image@1.13.0
blueimp-tmpl@2.5.4
bootstrap@3.3.2
...
```

私の環境では、rails-assets の名前と、npm の名前が異なる物があったり、
そもそもそのバージョンが無かったり(!?)して処理が止まることが多かった。

```
npm ERR! 404 Registry returned 404 for GET on https://registry.npmjs.org/angular-ui-bootstrap-bower
```

ファイルに吐き出して、処理してから、読み込ませる方向性に変更した。

```
grep rails-assets Gemfile.lock | sed -n 's/^    rails-assets-\(.*\)/\1/p' | sed 's/\(.*\) (\(.*\))/\1@\2/' > asset-versions
vi asset-versions
cat asset-versions | xargs npm i -S
```

bower と npm のズレが大きいみたいで、手作業で合わせているけど、ツライ。

誰か、 rails-assets を確認して、 package.json を生成する方法を作ってくれないかな。
rails cでdyld: lazy symbol binding failed: Symbol not found

# `rails c`でDBにアクセスできない

`rails c`にてモデルのデータを取得しようとするとエラーが発生した

```
[1] pry(main)> user = User.find(1)
dyld: lazy symbol binding failed: Symbol not found: _rb_data_object_alloc
  Referenced from: /Users/hoge/.gems/gems/mysql2-0.4.3/lib/mysql2/mysql2.bundle
  Expected in: flat namespace

dyld: Symbol not found: _rb_data_object_alloc
  Referenced from: /Users/hoge/.gems/gems/mysql2-0.4.3/lib/mysql2/mysql2.bundle
  Expected in: flat namespace
```

ググってたら`mysql2`のgemを再インストールすればいいよって書かれてたから

```
$ sudo gem uninstall mysql2
$ sudo gem install mysql2
```

してみたけど動かない。（動く人もいるかもと思ってメモ）

# `rb-readline`というgemをインストールしたら動いた

``` Gemfile
group :development, :test do
  gem 'rb-readline' # これを追加
end
```

# 参考

[Having Some Trouble With Pry And Setting Up Rails On My Machine!](https://learn.launchacademy.com/questions/1280)
[rails console が動かない](http://gagapi.hatenablog.jp/entry/2013/03/16/175705)
Vimのカーソルキーを封じる


ビルド待ちの間のネタ投稿だよーん

カーソル移動には`h`,`j`,`k`,`l`を使った方が良いんだろうけど、カーソルキーを使ってしまう...

そんな人は、`~/.vimrc`に以下の記述をすればVim強制ギプスの下でvimが起動するぞ！

```Vim:.vimrc
nmap <LEFT>  :q!<CR>
nmap <RIGHT> :q!<CR>
nmap <UP>    :q!<CR>
nmap <DOWN>  :q!<CR>

imap <LEFT>  <ESC>:q!<CR>
imap <RIGHT> <ESC>:q!<CR>
imap <UP>    <ESC>:q!<CR>
imap <DOWN>  <ESC>:q!<CR>
```

意味は【カーソルキーを使ったら保存せず強制終了】だ！！

同僚が面白そうだからって設定してたけど、時々席から絶叫が聞こえてきて楽しかったw
ズンドコキヨシ on Nutanix Acropolis Hypervisor

# はじめに
[流行り](http://qiita.com/tags/%E3%82%BA%E3%83%B3%E3%83%89%E3%82%B3%E3%82%AD%E3%83%A8%E3%82%B7)に乗っかりたかっただけです。発信源は↓
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 何をしたか
スクリプトを作ってみました。

Nutanix CE (or 商用版）のAcropolis Hypervisor(AHV)環境で
5連続のランダムなズンorドコで生成されるVM名を用いてBASE VMのクローンを作成します。
「ズンズンズンズンドコ」という名前のVMが現れるまでVMをクローンするループを行い、
この名前のVMが現れると最後に「キヨシ」という名のクローンVMの作成＆起動を行って処理を完了します。

つまり「ズンズンズンズンドコ」が現れるまで延々と「ズンドコズンズンズン」「ドコドコズンズンズン」「ドコズンドコドコズン」などの名前のVMが作成され続けます。

とはいえ、1/32の確率でズンズンズンズンドコになりますので、基本的に大した数にはなりません。

# 出来たもの
普段やってないの丸出しで恥ずかしい。

```bash:zndk-clone.sh
#! /bin/bash
while [ "$str" != "ZZZZD" ]
do
        for i in 0 1 2 3 4 
        do
                zndk[i]=`expr $RANDOM % 2`
                if [ ${zndk[i]} = 0 ]
                then
                        zndk[i]="Z"
                else
                        zndk[i]="D"
                fi
        done

        str="$(IFS= ; echo "${zndk[*]}")"
        acli vm.clone $str clone_from_vm=BASE
done
acli vm.clone KIYOSHI clone_from_vm=BASE
acli vm.on KIYOSHI
```
#このスクリプトに関連する、AHV環境の特徴や注意点
## VM名の重複OK
ACLIでVM名指定の操作をする歳には、後ろにIDを付加して区別することができます。
![VMname.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/c139ef29-c06d-0920-7093-291faf434467.png)

## VM名はマルチバイト文字NG
今回はズン＝Z、ドコ=D、キヨシ=KIYOSHIで代用しています。
インベントリが意味不明なことになっていますが、「ズン」や「ドコ」などのカタカナほどインパクトが無いのが悔やまれます。
あと、アルファベットでKIYOSHIだと、自分的にはギタリストの方を思い出します。
![VMs.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/2b998736-d907-63b6-89aa-ac46d413bbf4.png)


## クローンが非常に高速
1VMあたり1秒も掛からないレベル。
![tasks.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/f173ae86-a795-b69a-a063-2cb398b6b94c.png)


## VM削除はACLIで一括指定が楽。
acli vm.delete D* とか acli vm.delete Z* で一斉に削除可能。いらないVMはポイーで。
※関係ないものを消さないように注意。削除は一瞬で完了します。
![delete.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/e25025bb-8b45-12bd-d782-ab7dd76bda86.png)
Apacheでズンドコキヨシ

現在のURLの末尾にランダムで「ズン/」「ドコ/」のどちらかを追加したURLにリダイレクトし、URLの末尾が例のパターンになったら「キ・ヨ・シ！」と表示します。

```apache:zundoko.conf
Listen 8000

<VirtualHost *:8000>
    DocumentRoot /home/zundoko
    AddDefaultCharset UTF-8

    RewriteEngine On

    RewriteMap zundoko rnd:map_zundoko.txt

    RewriteRule \/ズン\/ズン\/ズン\/ズン\/ドコ\/$ /kiyoshi.html [L]
    RewriteRule (.*) $1${zundoko:zundoko}/ [R]
</VirtualHost>
```

```text:map_zundoko.txt
zundoko ズン|ドコ
```

```html:kiyoshi.html
<body>
<p style="margin: 80px 0; text-align:center; font-size:100px">キ・ヨ・シ！</p>
<body>
```

![apache-zun-doko-kiyoshi.gif](https://qiita-image-store.s3.amazonaws.com/0/42710/d7d0aa3f-6d81-d144-1897-00cb02ad92ef.gif)
ズンドコキヨシ with VBScript

### 「ズンドコキヨシ」に出遅れてVBScriptくらいしか残ってなかったです

```lang:vbscript
Option Explicit

Dim zundoko, loopCnt, result, tempResults

' 初期化
Call Init

Do While True
    ' 初期化
    If loopCnt > 5 Then
        loopCnt = 0
    End If

    ' 乱数の発生
    If Rnd < 0.5 Then
        zundoko.add "ズン"
    Else
        zundoko.add "ドコ"
    End If
    
    ' 5回目の時の確認処理
    If loopCnt = 4 Then
        result = zundoko(zundoko.Count-1) & zundoko(zundoko.Count-2) & zundoko(zundoko.Count-3) & zundoko(zundoko.Count-4) & zundoko(zundoko.Count-5)
        If result = "ズンズンズンズンドコ" Then
            Exit Do
        End If
    End If
    
    loopCnt = loopCnt + 1
Loop

result = ""
For Each tempResults In zundoko
    result = result & tempResults
Next
MsgBox result & "キ・ヨ・シ！"

' 初期化関数
Sub Init()
    loopCnt = 0
    Set zundoko = CreateObject("System.Collections.ArrayList")
End Sub
```

<img width="362" alt="result.png" src="https://qiita-image-store.s3.amazonaws.com/0/103647/ece49709-498a-3ea5-dd27-fcd0af39fa3d.png">

[元ネタ](https://twitter.com/kumiromilk/status/707437861881180160)
[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
aws-sdk-php-laravelで複数のサービスを使用する場合の設定ファイル


## 環境
* laravel5.1
* SDKのversionは3系

## 前提
通常は下記のドキュメントにもある通り、ACCESS_KEYなどは1つしか設定できませんが、 
複数サービス使用する場合は設定値も複数必要になることがあります。  

下記はS3とSNSを使用する場合の設定方法の例です。

## 手順
### 1. 下記コマンドでawsのconfigファイルを生成する
```
php artisan vendor:publish
```

### 2. config/aws.phpが生成されているので設定する
ここに各サービスごとに設定値を書くと、デフォルトの値がオーバーライドされるらしい。

```php:config/aws.php
<?php

use Aws\Laravel\AwsServiceProvider;

return [

    /*  
    |--------------------------------------------------------------------------
    | AWS SDK Configuration
    |--------------------------------------------------------------------------
    |
    | The configuration options set in this file will be passed directly to the
    | `Aws\Sdk` object, from which all client objects are created. The minimum
    | required options are declared here, but the full set of possible options
    | are documented at:
    | http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html
    |
    */
    'S3' => [
        'region' => env('AWS_S3_REGION', 'us-east-1'),
        'credentials' => [
            'key' => env('AWS_S3_ACCESSKEY'),
            'secret' => env('AWS_S3_SECRETKEY') 
        ]
    ],
	'Sns' => [
        'region' => env('AWS_SNS_REGION', 'us-east-1'),
        'credentials' => [
            'key' => env('AWS_SNS_ACCESSKEY'),
            'secret' => env('AWS_SNS_SECRETKEY') 
        ]   
    ]
];

```


ちなみに.envの中身は下記の通り

```env:.env
...
AWS_S3_REGION=us-west-2                                                                                                                                                                                                   
AWS_S3_ACCESSKEY=xxxxxxx
AWS_S3_SECRETKEY=xxxxxxx
AWS_S3_BUCKET=xxxxxxx

AWS_SNS_REGION=ap-northeast-1
AWS_SNS_ACCESSKEY=xxxxxxx
AWS_SNS_SECRETKEY=xxxxxxx
AWS_SNS_IOS=xxxxxxx
AWS_SNS_ANDROID=xxxxxxx
AWS_SNS_TOPIC_ARN=xxxxxxx
...
```

### その他処理
S3へのアップロードなどは他と特に変わりませんので、リンクのドキュメントを参考に。

## リンク
[GitHubのREADME](https://github.com/aws/aws-sdk-php-laravel/tree/sdk3)
[公式の設定ファイルのドキュメント](http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html)
非ITメンバーへプログラミング勉強会をしてみてわかったこと

暖かくなってきましたね。
メンバーに触発されて初の投稿になります。非エンジニア向けに開催したプログラミング勉強会を通じて学んだことを書きます。

# 勉強会の目的
弊社はリアル×ITのサービスを展開していることもあり、社内のエンジニア比率が通常IT企業と比較して低いです。システム開発に対して距離を置かれたり、エンジニアとのコミュニケーションも心なしか少ない気がしていました。そこで、エンジニアとの壁の解消、そして、学んでくれた人々が純粋にプログラミングを楽しんでくれて好きになってくれれば良いなと思い、始めました。

できるだけ多くの方に集まってもらいたいと思い、業務時間外の18:30開始、毎週木曜日で設定したところ、14人の生徒と1人のボランティア講師が集まりました。

# 勉強会の内容

## 第一回、第二回
初回は「全員で楽しく達成できる！」「プログラミングはそんなに難しくない？」という認識をもってもらおうと、[Code Studio](https://studio.code.org/)を利用させていただき、言語を知らずともプログラミングのアルゴリズムを楽しみながら学んでいってもらいました。多少の躓きはあるものの、ドラッグ＆ドロップで処理のブロックを組み合わせることによって課題を解決していく形式になっていてプログラミング初心者でも自力で解いていってもらいました。

上から順番に処理されること、分岐処理やループの処理、分岐処理内とループ処理内でも更に分岐やループを行えることなどを学んでいただきました。

## 第三回
この回から[Code Monkey](http://codemonkey.jp/)を利用させていただき、Code Studioでブロックを使ってやっていた箇所を簡易なプログラミング言語を入力して進めていってもらうことにしました。前回までに分岐やループ処理を理解してもらっていたためか、心配をよそに比較的スムーズに進行していくことができました。

ここでの発見としては、2byte文字を混在させてエラーやインデントをあまり意識しないことでした。文字フォントによっては違和感なく表示されることもあるので、普段から2byte、1byteの差をあまり気にしていないのかもしれません。また、インデントに関してはプログラムの保守などをしていかないと重要性が理解できない箇所なのかなと感じました。

みなさん、真剣ですね〜
![20160316073535.jpg](https://qiita-image-store.s3.amazonaws.com/0/71343/a77ccfc5-d89b-e76f-998e-0c429fa0848d.jpeg)

## 第四回〜第七回
第四回目からRubyとブラウザ上でコンパイルできるサイトを利用して、いよいよ本格的に？プログラミングを始めていきました。Rubyを選択した理由としては、単純に私もRubyという言語を知りたかったからですね。勉強会の前にいつも必死に予習をしています(笑)
第一回〜第三回まででやったことを、どうRubyで実装していくのか。変数の扱い方から演算の仕方までの基礎を中心に、分岐処理、ループ処理が複数あるので、違いにフォーカスしながら説明していきました。ここら辺から理解度に差が出てきましたね。次に同じことをやる場合にはクラスを分けていっても良いのかもしれないです。

## 第八回〜
第七回まで出力をテキストにしていたのですが、第八回からHTML形式での出力にしていき、実際にプログラミングしたものがWebページとして反映されていく動きを見ていってもらいました。分岐処理とループ処理を駆使して、HTMLを全部書かずとも、簡単に複雑なWebへの描画ができることを体験してもらいました。


# まとめ
いままでTOTAL8回の勉強会を通じて、次につながる良い反省点がたくさん見つかりました。

- 理解している間はモチベーション高く勉強を続ける
- 理解度に個人差が出るので、できる人に合わせる or できない人に合わせるを意識していったほうが良い
- 腹落ちするまで、徹底的に復習をしよう

といったとこでした。
全体を通して、出来た人がまだ出来ていない人へ積極的に教えていく流れがあったりと、社内の普段関わらないメンバー同士のコミュニケーションが生まれたりと非常に良い機会になったなと感じました。まだまだ、プログラミングを知らないメンバーが多いので、引き続き勉強会を継続していきます！
DateTime::diffの挙動がよくわからない

# DateTime::diff
> http://php.net/manual/ja/datetime.diff.php
ふたつの DateTime オブジェクトの差を返す

# サンプル
```php
$d1 = new DateTime('2016-03-18');
$d2 = new DateTime('2017-04-19');
$diff = $d1->diff($d2);
var_dump($diff);
/*
yが年差、mが月差、dが日差を表すので、
1年と1月と1日の差があることを表している。
object(DateInterval)#3 (15) {
  ["y"]=>
  int(1)
  ["m"]=>
  int(1)
  ["d"]=>
  int(1)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(397)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}
*/
```

ここまでは良い。理解できる。
問題は3月を対象とした場合。

```php
$d1 = new DateTime('2016-01-01');
$d2 = new DateTime('2016-02-01');
$diff = $d1->diff($d2);
echo $diff->m;//1

$d1 = new DateTime('2016-01-01');
$d2 = new DateTime('2016-03-01');
$diff = $d1->diff($d2);
echo $diff->m;//1 !?
```

閏年のせいというわけでもなく（それだったとしても問題だけど）

```php
$d1 = new DateTime('2015-01-01');
$d2 = new DateTime('2015-02-01');
$diff = $d1->diff($d2);
echo $diff->m;//1

$d1 = new DateTime('2015-01-01');
$d2 = new DateTime('2015-03-01');
$diff = $d1->diff($d2);
echo $diff->m;//1 !?
```

そもそも閏年であっても3月で無ければ問題ない

```php
$d1 = new DateTime('2016-01-01');
$d2 = new DateTime('2016-04-01');
$diff = $d1->diff($d2);
echo $diff->m;//3 正常
```

GMTなら3月でも正常表示できる。（なんで？

```php
$d1 = new DateTime('2016-01-01', new DateTimeZone('GMT'));
$d2 = new DateTime('2016-02-01', new DateTimeZone('GMT'));
$diff = $d1->diff($d2);
echo $diff->m;//1

$d1 = new DateTime('2016-01-01', new DateTimeZone('GMT'));
$d2 = new DateTime('2016-03-01', new DateTimeZone('GMT'));
$diff = $d1->diff($d2);
echo $diff->m;//2
```

ということは、Asia/Tokyoでも9時間足せば正常表示できる？

```php
$d1 = new DateTime('2016-01-01 09:00:00', new DateTimeZone('Asia/Tokyo'));
$d2 = new DateTime('2016-02-01 09:00:00', new DateTimeZone('Asia/Tokyo'));
$diff = $d1->diff($d2);
echo $diff->m;//1

$d1 = new DateTime('2016-01-01 09:00:00', new DateTimeZone('Asia/Tokyo'));
$d2 = new DateTime('2016-03-01 09:00:00', new DateTimeZone('Asia/Tokyo'));
$diff = $d1->diff($d2);
echo $diff->m;//2
```

出来た。
しっくりこない。

# まとめ

* Asia/Tokyoタイムゾーンでは3月との差分が正しく取得できない、の？
* 3月以外にもあるかもしれないけど、調べてない。
* タイムゾーンの影響を受けるのであれば、3月以外では正常に取得できる理由が分からない。
* PHP5.4.xで確認。PHP7等の最新の挙動を確認できる方がいましたら教えてください。

# 対策

* これだけではQiitaは質問サイトじゃねぇぞ、というツッコミを受けるので、対策を。

```php
function datetime_diff_month(DateTime $d1, DateTime $d2, $absolute = false){
  $diff_month = ($d2->format('Y')*12 + $d2->format('n')) - ($d1->format('Y')*12 + $d1->format('n'));
  return $absolute ? abs($diff_month) : $diff_month;
}
$d1 = new DateTime('2016-01-01', new DateTimeZone('Asia/Tokyo'));
$d2 = new DateTime('2016-03-01', new DateTimeZone('Asia/Tokyo'));

echo datetime_diff_month($d1, $d2); //2 (^-^)

```

力技過ぎる・・・。
play framework 2.5.x をビルドする

# 概要

play 2.5.x をローカルでビルドする方法です。

# ソースを取得する

github にあります。
https://github.com/playframework/playframework

HEAD を 2.5.0 タグにします。

# バージョンを変更する

ビルドした framework を ivy リポジトリのローカルに入れるので、公式リポジトリとバージョンがぶつからないように、バージョンを変更します。
※末尾は “-SNAPSHOT” としてください。

```framework/version.sbt
version in ThisBuild := "2.5.0-SNAPSHOT"
```

# ビルドする

out of memory エラーが出ないように、SBT_OPTS を設定します。（以下は windows の例です。不要な設定も入っていますが気にしないでください。）

```
set SBT_OPTS=-Xmx1024M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT
```

ビルドします。

```
sbt publishLocal
```

~/.ivy2/local/com.typesafe.play に成果物が作成されていれば成功です。


# ビルドした framework を使用する

お試し用のプロジェクトを activator new でサクッと作成してください。
※activator new とすると、デフォルトで最新のframework 向けのプロジェクトが作成されます。いずれ 2.6.x に上がってしまうと思います。。。

plugins.sbt を以下のように変更します。

```project/plugins.sbt
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.0-SNAPSHOT")
```

sbt run でアプリを起動すると、ローカルでビルドした framework が使用されます。
checkboxとLABLEの変な現象

railsで、checkboxとLABLEの組み合わせで、チェックボックスが反応なしの現象が起こりました。
調査しにくいので、共有したいと思います。


##現象

チェックボックスをクリックしても、チェックされなくて反応なしです。

##開発環境

Rails 4.1.4
ruby 2.1.2p95
viewテンプレート: erb

##lable forとは

```
<LABLE for="ID属性値">タグを使用すると、
<LABLE>タグの開始タグと終了タグに挟まれた文書が、
ID属性の属性値として「ID属性値」と同じ値が書き込まれた部品と、関連付けされます。
```

##発生状況

```
<%= check_box_tag 'item_ids[]', item.id, item_ids.include?(item.id), id: "AAA"%>
<LABLE for="BBB"><%= item.name %></LABLE>
```

checkboxのID：AAA
lableのfor：　BBB

checkboxのIDとlableのforが一致しないため、現象が起こりました。

##対処
lableのforの値はcheckboxのidと同じように修正します。

※関連付けるために、値は一致しないのは正しくないですが、
まさかチェックボックス動作に影響するのは思いませんでした。
[Crystal] 「３角形はいくつあるの問題」でコードゴルフ

# <i class="fa fa-file-text-o"></i> はしがき

[コードゴルフ（Code Golf）](https://ja.wikipedia.org/wiki/コードゴルフ)というゲームがあることを最近知りました。

トータルの打数をできるだけ少なくすることを目指すスポーツのゴルフに対して，コードゴルフではソースコードをできるだけ短くすることを目指すそうです。

面白そうなので先日書いた [「３角形はいくつあるの問題」](http://qiita.com/arcage/items/34a9842f197a97afb10a) を題材にチャレンジしてみることにしました。ベースとなるコードはこちら（何をしてるのかは上記リンク先を参照してくださいませ）。

```rb:元ファイル（triangle.cr）
PATH = [ [1, 2, 3], [1, 4, 6, 9], [1, 7, 10],
         [2, 1], [2, 3], [2, 4, 7], [2, 6, 8, 10], [2, 5, 9],
         [3, 2, 1], [3, 5, 6, 7], [3, 9, 10], [4, 1],
         [4, 2], [4, 6, 9], [4, 7],
         [5, 2], [5, 3], [5, 6, 7], [5, 9],
         [6, 2], [6, 4, 1], [6, 5, 3], [6, 7], [6, 8, 10], [6, 9],
         [7, 1], [7, 4, 2], [7, 6, 5, 3], [7, 8, 9], [7, 10],
         [8, 6, 2], [8, 7], [8, 9], [8, 10],
         [9, 3], [9, 5, 2], [9, 6, 4, 1], [9, 8, 7], [9, 10],
         [10, 7, 1], [10, 8, 6, 2], [10, 9, 3] ]

def on_a_path?(p1, p2, p3)
  PATH.each do |path|
    return true if path.includes?(p1) && path.includes?(p2) && path.includes?(p3)
  end
  return false
end

dst = Hash(Int32, Array(Int32)).new { |h,k| h[k] = Array(Int32).new }
triangles = Array(Array(Int32)).new

PATH.each do |path|
  dst[path.first] += path[1..-1]
end

dst.each_key do |p1|
  dst[p1].each do |p2|
    dst[p2].each do |p3|
      next if !dst[p3].includes?(p1) || on_a_path?(p1, p2, p3)
      triangle = [p1, p2, p3].sort
      triangles << triangle unless triangles.includes?(triangle)
    end
  end
end

triangles.sort.each do |triangle|
  puts triangle.join("-")
end
puts "total: #{triangles.size}"
```

```bash:ファイルサイズ
$ ls -l triangle.cr
-rw-r--r--  1 arcage  staff  1197  3 18 13:06 triangle.cr
```

正式なコードゴルフのルールは（そんなものが存在するのかも含めて）わかりませんが，今回はこれを

1. 最終的に検出した３角形の合計数が出せればよし（３角形のリストは出さない）
1. 読みやすさは考えない
1. 処理効率も気にしない
1. 本来のメソッドの使い方とかスルー
1. 潜在的なバグの危険性とかも考慮しない
1. とにかくソースファイルのサイズ最小化を目指す

という方針で，現時点で思いつく限りの手を尽くしてみました。

## やったことリスト

1. 変数名を１文字に変更
1. 省略できる空白/改行は削除（インデントもしない）
1. 配列リテラルの代わりに文字列を`String#split`
1. `"10"` を `"a"` に
1. 長い型名に１文字のエイリアスを用意
1. `do ... end` の代わりに `{}`
1. `Array#includes?(obj)`の代わりに`Array#count(obj)>0`
1. `Array` の代わりに `Set` を使うと重複チェックが要らない
1. １度しか呼ばないメソッドは処理をベタ書き
1. 可能であれば `==` の代わりに `>` や `<` で判定
1. `true` の代わりに `1`，`false` の代わりに `nil`
1. 出力するのが数値なら `puts` も `p` も結果は同じ

# <i class="fa fa-file-text-o"></i> その結果

こうなりました。（注：横に長いです。要スクロール）
基本的に，解決に向けたアプローチは上のコードと変わりません。（最後に `p r` とかしてやると，検出した３角形の一覧も見られます）

```rb:縮小版（triangles_golf.cr）
alias A=Array(String)
L="123|1469|17a|21|23|247|268a|259|321|3567|39a|41|42|469|47|52|53|567|59|62|641|653|67|68a|69|71|742|7653|789|7a|862|87|89|8a|93|952|9641|987|9a|a71|a862|a93".split("|").map(&.split(""))
d=Hash(String,A).new(A.new)
r=Set(A).new
L.each{|l|d[l[0]]+=l[1..-1]}
d.each_key{|a|d[a].each{|b|d[b].each{|c|t=[a,b,c]
f=1
L.each{|l|f=nil if t.map{|o|l.count(o)}.sum>2}
r<<t.sort if d[c].count(a)>0&&f}}}
p r.size
```

```bash:実行結果
$ crystal triangle_golf.cr
47
```

```bash:ファイルサイズ
$ ls -l triangle_golf.cr
-rw-r--r--  1 arcage  staff  425  3 18 17:58 triangle_golf.cr
```

今回出題された問題だけ解ければ良いのであればもう２バイトほど削減できそうですが，今の自分ではこの辺りが限界のようです。

おそらく，１年後に見たら自分でも何してるか分からないと思います。
golang AWS-SDK (github.com/aws/aws-sdk-go)でEC2IAMRole権限でアクセスする



``` s3.go
package main

import (
	"net/http"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
	"github.com/aws/aws-sdk-go/aws/ec2metadata"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

// AwsConfig get config
func AwsConfig() *aws.Config {
	ec2m := ec2metadata.New(session.New(), &aws.Config{
		HTTPClient: &http.Client{Timeout: 10 * time.Second},
	})
	cr := credentials.NewCredentials(&ec2rolecreds.EC2RoleProvider{
		Client: ec2m,
	})
	return &aws.Config{
		Region:      aws.String("ap-northeast-1"),
		Credentials: cr,
	}
}

func main() {
	s3c := s3.New(session.New(), AwsConfig())
    ...
}

```

credentialsファイルが有ればそっちを見て、なければIAMRoleを使うみたいなのを作りました
https://github.com/ushios/awsconfig
PostgreSqlコマンドの備忘録

●DB接続コマンド
psql -h {ホスト名かIP} -U {ユーザー名} -d {DB名}

●直接SQL実行
psql -d {DB名} -c "select * from table_name"

●指定DBのテーブル一覧
psql -d {DB名} -c "\d"

●指定DBのVIEW一覧
psql -d {DB名} -c "\dv"

●テーブルカラム一覧
psql -d {DB名} -c "\d table_name"

●テーブルやVIEWの存在確認（部分一致検索）
table_name='{テーブル名の一部の文字}'
psql -d {DB名} -c "SELECT relname FROM pg_class WHERE relkind = 'r' AND relname LIKE '%${table_name}%' 
UNION SELECT viewname FROM pg_views WHERE viewname LIKE '%${table_name}%' ORDER BY relname;"

●特定テーブルのみのバックアップ
pg_dump -t {テーブル名} {DB名} > table_bk_yyyymmdd.sql

●本番環境からテスト環境のテーブル同期（データのみ）
テストターミナルから
ssh {本番IP} 'pg_dump {DB名} -h{本番DBのIP} -c -t {テーブル名}' | psql {DB名} -h{テストDBのホスト名}
OpenLDAPの同期が再開しない問題をkeepaliveの設定で回避する

###問題の現象
OpenLDAPの障害試験を行っていて、ネットワークが切断されたとき、
TCPコネクションが残ってしまうことで、同期リトライが行われない現象があった。

ネットワークの落ちる頻度が高くなければ、さほど問題にはならないのですが。
拠点間でVPNを張っていて、細いおかげでよく切れるとか･･･。
そういうことも考えられなくはないので、回避策を備忘として残しておきたいと思います。

###OpenLDAPの同期方法
OpenLDAPにはいくつか同期の方法がありますが、
今回想定しているのは「refreshAndPersist」という同期方法をとっている場合のお話になります。

refreshAndPersist はTCPコネクションを維持して、
プロバイダからコンシューマへ更新情報を即時通知する同期方法です。

###回避策
keepalive設定の書式は以下のとおりです。
syncrepl ディレクティブの中に書く設定になっています。

```
keepalive <idle>:<probes>:<interval>
```
idle    ･･･無操作だと判断するまでの時間(秒)
probes　･･･再送回数 keepaliveパケットが届かなかった時の再送
interval･･･keepaliveパケットが届かず、再送するまでの間隔（秒）


```
syncrepl rid=001
  provider=ldap://10.0.0.200:389
  type=refreshAndPersist
  retry="60 +"
  keepalive 30:1:3
  searchbase="dc=example,dc=com"
  bindmethod=simple
  binddn="cn=Manager,dc=example,dc=com"
  credentials=secret  
```
設定例では、
idle･･････  30秒間　エントリ操作がなかったら keepaliveパケットを送信する
probe･･････ keepaliveパケットが到達しなかった場合、1回再送する
interval･･･ keepaliveパケットが到達しなかった場合、再送するまでの間隔を3秒あける

###解説
OpenLDAPの同期設定中にkeepaliveの設定を書くと
何も操作していないとき、keepaliveパケットを送って接続が維持されているか確認できる

keepaliveパケットが到達しなかった場合、再送する
届かなくなったことがわかった時点でTCP接続を切ってくれるので、
TCPコネクションが残ったままの状況に陥らずにすむ

###まとめ
OpenLDAPの同期設定で使うkeepaliveの設定は、
ネット上の情報にはほとんど設定されていなかったため、
発見するのに大変苦労した。

発見したきっかけはslapd.conf の man でした。
よく知らないプロダクトの設定を書くとき、マニュアルの確認は必須ですが、
公式マニュアルには同期設定の例にも書いていなかったために完全に見落としていました。

manコマンドにこっそり書いておくパターンがある事がわかったのは収穫でした。
TeratermマクロでSWへのコマンドを自動入力

# **やりたいこと**
SWへTeratermでSSH接続してコンフィグ投入するという場面の際に、環境によっては大量のコンフィグを投入した際に文字欠け等が発生して正しいコンフィグが投入できないことがあるのでなんとかしたいと思い、Teratermでマクロを作成しましたというしょうもない記事です。

# **内容**
#### **マクロの作成**

```rb
LIST_FILE='command_list.txt'
PROMPT='^SW'

fileopen FH LIST_FILE 0

while 1
	filereadln FH VAL
	if result = 1 break
	flushrecv
	sendln VAL
	waitregex PROMPT
endwhile

fileclose FH
```

#### **マクロの説明**
|コマンド|説明|
|:--|:--|
|LIST_FILE='command_list.txt'|リストファイル定義|
|PROMPT='^SW'|プロンプト定義|
|filereadln FH VAL|ファイルから1行読む|
|if result = 1 break|最後まで読み込んだらループを抜ける|
|flushrecv|マクロの受信バッファーの内容を消す|
|sendln VAL|読み込んだコマンドを実行|
|waitregex PROMPT|指定したプロンプトが戻ってくるまで待つ|
|fileclose FH|ファイルを閉じる|



# **参考**
[Tera Termマクロ コマンド一覧](http://www.macrosh.com/tera-termmakuronitsuite/komando-yi-lan)
[Tera Termマクロ活用入門](https://osdn.jp/magazine/10/01/08/0825239/2)
[TeraTermProのマクロでよく忘れることメモ](http://uwazumi.honeniq.net/entry/2013/11/09/155039)
パラメタライズドテストケースをGoogleSpeadsheetで管理する

**[google-spreadsheets-parser](https://github.com/tanakaworld/google-spreadsheets-parser)**を使って，
スプレッドシートで管理しているデータをテストで使用する．

## 背景:データの二重管理をなくしたい

あるJSモジュールのパラメタライズドテストコードを書いていた．
パラメータとそのテスト結果はGoogleSpreadsheetで表管理していて，ビジネス・エンジニア共に使用していた．

はじめはSpreadSheet上にそれらの値をJSで扱える形式にconcatenateとかしてコピペしていたが，
バリエーションが膨大になり，データ二重管理の問題が発生しメンテナンスに難があった．

## 普通にパラメタライズドテストを書くとこんな感じ

grunt x karma x jasmine の環境構築手順は[こちら](http://yutarotanaka.com/blog/coffeescript-grunt-karma-jasmine/)．

```coffeescript:src/user.coffee
class User
  constructor: (@NAME, @age) ->

  canDrink: ->
    parseInt(@age) >= 20
```

```coffeescript:src/userSpec.coffee
describe "User", ->
  describe "#canDrink", ->
    assertCanDrink = (name, age, canDrink) ->
      it "Age:#{age}, CanDrink:#{canDrink}", ->
        user = new User(name, age)
        expect(user.canDrink()).toBe(canDrink)
        
    # ここのバリエーションが増えてくると管理がツラい
    target = [
      {no: 1, name: 'User1', age: 18, canDrink: false}
      {no: 2, name: 'User2', age: 19, canDrink: false}
      {no: 3, name: 'User3', age: 20, canDrink: true}
      {no: 4, name: 'User4', age: 21, canDrink: true}
      {no: 5, name: 'User5', age: 22, canDrink: true}
    ]

    for t in target
      assertCanDrink(t.name, t.age, t.canDrink)
```

`target` 部分のバリエーションが増えてくるとスプレッドシートの変更を反映するときにミスったりして，テストが不安定になる．

## [google-spreadsheets-parser](https://github.com/tanakaworld/google-spreadsheets-parser)を使う

インストール

```
npm install google-spreadsheets-parser --save-dev
```

パーサーを読み込む

```coffeescript:karma.conf.coffee
files: [
      'node_modules/google-spreadsheets-parser/dist/googleSpreadsheetsParser.js'
      'src/**/*.coffee'
      'spec/**/*Spec.coffee'
    ]
```

テストコードを下記のように記述できる．
JSONの値は文字列になっているので，それぞれ調整する．

```coffeescript:userSpec.coffee
gss = new GoogleSpreadsheetsParser(
      'https://docs.google.com/spreadsheets/d/1LjDMRm8j_0XHJiOF7DZuYWUXQHYpZ6MxRnMkh25plZ8/pubhtml'
      {sheetTitle: 'v001', hasTitle: true}
    )

target = JSON.parse(gss.toJson())

for t in target
  # JSONの値は文字列になっているので，それぞれ調整
  assertCanDrink(t.name, parseInt(t.age), t.canDrink == 'true')
```

テストデータのバージョン管理も可能．
シート毎にバージョンをわけて，バージョン毎に `sheetTitle` を分ければおｋ． 


## サンプル

[karma-jasmine-parameterized-test](https://github.com/tanakaworld/google-spreadsheets-parser/tree/master/demo/karma-jasmine-parameterized-test)
CakePHP3.1 → 3.2アップグレードで対応すべき点

PHP 5.5.9 以上が要求されるのが一番大きかった(私には)のですが、バージョンアップに伴って他にも修正しなければならないところが少しあったので書いておきます。(これ以外にもあると思いますが、私がやったことだけ)

# FormHelperのcreate()でactionを指定しているものをurlに変える

テンプレートでFormHelper::create()を使って

```php:src/Template/Users/hoge.ctp
<?= $this->Form->create($user, ['action' => 'index']) ?>
```

としてurlのactionを指定していたものは、

```php:src/Template/Users/hoge.ctp
<?= $this->Form->create($user, ['url' => ['action' => 'index']]) ?>
```

に変更する必要があります。

# Entityで仮想フィールドを定義したものは、スネークケースで取得する

CakePHP3.1までは、Entityで

```php:src/Model/Entity/User.php
protected function _getFullName()
{
    return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
```

のように定義した仮想フィールドは、`$user->fullName` でも `$user->full_name` でも取れていましたが、3.2では `$user->full_name` じゃないとダメになりました。(元々キャメルケースで書くのは間違いだったのでしょうね…)

# おまけ(date型とdatetime型のデータについて)

[前に少し書きました](http://qiita.com/ran/items/e0e84ede3fb003ea4035)が、Chronosが導入されて、DBのTableからデータを取得した時に返ってくるEntityのdate型やdatetime型の値のオブジェクトが変わりました。

CakePHP3.1までは、date型もdatetime型も`Cake\I18n\Time`オブジェクトが返ってきていましたが、3.2では、date型は`Cake\I18n\FrozenDate`、datetime型は`Cake\I18n\FrozenTime`になっています。

FrozenDateは`Cake\Chronos\Date`を、FrozenTimeは`Cake\Chronos\Chronos`をそれぞれ継承しているので、date型のものはタイムゾーンがUTCのオブジェクトになります。
なので、`Cake\I18n\Time`や`Cake\Chronos\Chronos`で生成した日付(設定されているタイムゾーンになる)と比較している場合などは注意が必要です。
date型のデータと日付を比較する場合は、`Cake\Chronos\Date`で生成したものと比較した方が良さそう。
DMM APIがリニューアルされたみたい

# DMM APIがv2からv3へリニューアルされたようだ
その他にも

- 女優検索APIを追加
- ジャンル検索APIを追加
- メーカー検索APIを追加
- シリーズ検索APIを追加
- 作者検索APIを追加

のように新規で５本追加リリースしてきた。
https://affiliate.dmm.com/information/detail/info#327

## 商品情報APIの変更点

- Requestパラメーター
  - `timestamp`が無くなった
  - 在庫絞込用に`mono_stock`が追加された
  - `output`でjsonとxmlが指定出来るようになっている
  - jsonpにも対応できるよう`callback`の指定も追加

v2まではxml形式のレスポンスでEUC文字コードだったので、v3からはUTF8に対応したのだろう
json形式が利用できるようになったので使いやすくなった

## 女優検索API

自分もアフィリエイターなのでこれは嬉しいAPIだ
女優のページを別途クローラーでHTMLパースして頑張らなくて良くなった！
主にR18な女優検索みたい？
商品情報APIみたく`site`の指定がなかったので一般側のグラビアアイドルは取れないかもしれない

# 試してみたこと

v3から追加された`output`のリクエストをv2で`output=json`指定してみたら、実は実装されていたのかjson値で返ってきていた。が、、EUC文字コードという謎な仕組みだった

# まとめ

- v1, v2のリファレンスが無くなっているのでいつまで利用できるのかが分からない
- 女優APIまでをさくっとさわってみたので、他のAPIも触ってみたいと思う
:first-letterの適応範囲について

CSS4の話題もあるのにCSS2の話だよ！滅多に使わないけど罠いよ！

## first-letterの基本仕様

first-letterは正確には最初の一文字だけでない。最初の一文字に隣接する句読点等の一部記号（以下句読点）も対象に含まれる。
句読点であれば複数連続していても全てが対象に含まれる。
また、最初の1文字が句読点である場合、次に句読点でない文字列が出てくるまでが対象となる。
句読点というのは同一である必要は無く、「.」と「,」などの違う文字列でも句読点同士が隣接している限りはfirst-letter対象から外れない。

参考までに、以下は全てB以外の全ての文字列がfirst-letter対象文字列になるパターン。
* AB
* .AB
* .A.B
* A...B
* ....AB
* A...!B
* A!.!.B
仕様はそういう事らしい。

## じゃあどこまでが句読点として扱われるのか

けっこう色々なものが句読点扱いになってる。
軽く試したところでは下記。

* 一般的な句読点（,.،۔、。，．﹐﹑﹒｡､）
* エクスクラメーションとか（?!！？）
* シングルクオートダブルクオート("'')
* 全角半角問わず、一部の括弧類（（）【】「」[])
* アスタリスク類、コロンの類*＊※、：；:;
* 中黒とか三点リーダー（・……）
* スラッシュ（/／）
* 同上〃 
* スペースの類（　 ）

たぶん他にもある。

なおいけそうでいけなかった連中

* ダッシュ、伸ばし棒（―）
* バッスラ\
* 同上〃に似てる気がする連中（々、ヽ、ゞ）
* 一部の括弧類（&lt; &gt;）→もしかして:演算子扱い
* 演算子（+-=）
* ★●■♪、矢印の類など

わからない……！
感覚としては文章の中で一般的に使われる記号は句読点扱いになっていることが多い気がした。公式文書にも出て来そうなやつ。
ダッシュが含まれないのは少し意外。伸ばし棒扱いなのかな。
全角記号で通るものは半角記号でも通った。全角半角は関係ない模様。

## 何が基準なのか

[仕様書の日本語訳](http://zng.info/specs/css3-selectors.html#first-letter)からはいちおう言及がある。

>最初の文字に先行する句読点(例えば、"開き"(Ps)、"閉じ"(Pe)及び"その他"(Po)の句読点の種類の中で、Unicode [[UNICODE]](http://zng.info/specs/css3-selectors.html#UNICODE)において定義されている文字)は、

>![最初の文字に先行する引用符は含まれるべきである。](https://www.w3.org/TR/2001/CR-css3-selectors-20011113/first-letter2.gif)

>のように含まれるべきだ。

unicodeを基準にしているらしい。しかし「"開き"(Ps)、"閉じ"(Pe)及び"その他"(Po)の句読点の種類の中で～」……？何のこっちゃ。
と思ったら[mozzilaがかなり日本語らしい翻訳](https://developer.mozilla.org/ja/docs/Web/CSS/::first-letter)を出してくれていた。

>句読点 (punctuation)。これは、Unicode の open (Ps)、close (Pe)、initial quote (Pi)、final quote (Pf)、other punctuation (Po) の各クラスで定義されているすべての文字です。最初の文字に先行している句読点や、すぐ後ろに続いている句読点も同様に、擬似要素にマッチします。

なるほどよくわからないけどPsとかPeは文字の分類の名前っぽい。
各クラスごとの文字一覧とかあるのかなーと思ってググってたら出てきたのは[これ](http://www.unicode.org/Public/UNIDATA/Scripts.txt)。
あーなんか見えるなーPeとかPoとかいう文字列が見えるなー！って事でここで# Psとか# Peとか文字列検索してひっかかってたらfirst-letterの対象になるみたいです。
出てくるの文字コードだけど。0F3E..0F3Fとかいう記述もあってどっからどこまでを指してるのか曖昧だけど。まぁなんとかなるでしょ。
探したらどこかにもっと見やすいのもありそうだけど見つからないので見つけたら教えてください。
Fabricスクリプトのメンテ任されたけどわかんないよー > < な人へ

構築済みFabricスクリプトを渡されたものの・・・何やってるかわからない・・・> <
だったので頻出する単語をまとめました。

そもそも既存のスクリプトがないって人は
一からチュートリアルを見つつやれば自然と理解できるかと。

ちなみに公式チュートリアル
http://fabric-ja.readthedocs.org/ja/latest/tutorial.html

## env
'**env**ironment'で環境辞書と呼ばれています。いわゆる設定ファイルなのですが、
設定ファイルというよりは
**スクリプト内でグローバルに参照できる辞書オブジェクト**が
正しい認識です。
辞書なんですが使いやすいようにenv.hostsと属性っぽくアクセスできるようになってます。

Fabricでは何にでもとにかく使われるもっとも重要な要素です。

ちなみにsettings( )という関数がありますが、with句と一緒に使うと
そのスコープだけ特定の設定にできる、という効果があります。

```
from fabric.api import settings

def hoge():
  with settings(warn_only=True):
    return run('hoge hoge')
```

はデフォルトではenv.warn_only=Falseなのがwith句スコープ内でのみ
warn_only=Trueとなります。
Djangoを使っているとsettingsに特別な意味を見出しそうですが、Fabricではこれだけです。


## local( )とrun( )
local( ) はローカル。つまり実行しているPCのローカルでコマンドを実行します。
対してrun( )はターゲットのリモート環境でコマンドを実行します。
run( )の中でlocal('cd /path/mypath') とかやっている場合は

手元のPCからリモートPCにrun( )の処理をしろと飛ばす
↓
リモートPCが自分のローカルにたいして cd /path/mypath とディレクトリ移動する

という感じです。
他にもsudoで実行させるsudo( )とかもあります。

## role
role(役割)の訳に惑わされないように。
単純にhostのグルーピングをしているだけです。
env.roledefs で設定されています。

```
env.roledefs = {
  'web-servers': ['web1', 'web2']
}
```

これは、ウェブサーバーにデプロイする時はweb1とweb2のサーバーを対象にするんだけども、
毎回['web1', 'web2']ってやるより、'web-servers'って指定するだけでよくなったら楽だよね。
という以上の意味はないです。
roleのキーがコマンド名と同名になってたりするとFabric初心者はわけわからなくなりますが、
落ち着いてみればこれだけです。

ちなみデコレータでも使用可能で、

```
@role('web-servers')
def deploy():
  '''do deploy'''
```
とすればroleを対象にコマンド実行をしてくれます。

##taskデコレータ
```@task``` で関数に適用すると
**「これは実行可能タスクですよ」**
とFabricが拾い上げてくれます。
つまり ```$ fab -l``` の一覧に載ります。
比較的新しい機能とのことで、このデコレータを使うと
**```@task```の付いていない関数は```$ fab -l```に載らなくなる**ので注意しましょう。

わざわざtaskデコレータとしたのはtask( )関数もあるからですが、こちらを直接使う機会は
ほぼないので気にしなくていいです。

##execute
runやlocalと意味が微妙にかぶって混乱しますが、
**Fabricタスク関数を別のタスク関数から呼び出します。**
つまり処理の入れ子ができます。
普通に関数呼び出しをする場合との違いは、
**タスク毎のhostやroleの設定を元のまま適用してくれる**
ことにあります。なので細かいこと考えず直感的にタスクの入れ子処理ができます。
使い方として例えば、

- デプロイ
- 最新ソースコード取得
- サーバー再起動

のそれぞれのタスク関数があった場合に、

```
def デプロイ()
  execute(最新ソースコード取得)
  execute(サーバー再起動)
```
とかやっているはずです。

------
以上いきなり構築済みスクリプトを渡されて中身見たけどよくわからん！
になりそうな単語集でした。
これらだけでも意味がわかると公式のドキュメントも理解しやすいはずです！
gulpでpipeする処理を事前にまとめておく


ぐぐってもみつかりにくかったのでメモしておく。

探したところthrough-pipesでできそうだった。

* https://www.npmjs.com/package/through-pipes


下記のような処理をかいたとする

```
gulp.src("src/*.txt")
    .pipe(hoge())
    .pipe(goro())
    .pipe(gulp.dest("dist"))
    
```


`hoge()` と `goro()`の組み合わせはよくつかうので、`mofu()`として使えるように合成しておきたい。そして以下のように使いたい。

```
gulp.src("src/*.txt")
    .pipe(mofu())
    .pipe(gulp.dest("dist"))
```

どうするか。

```
var through = require('through-pipes');

func mofu() {
  return through(function(source) {
    source.pipe(hoge())
          .pipe(goro())
  });
}

```

としてmofuをつくっておけばつかえる。
いつか指定されるであろう、情報源 sourceがはいってきて、使えるという感じである。

gulpのプログインは単にTransform Streamのはずなので、gulpに限らずthrough-pipesは使えるはず。
もっと簡単に合成できてもいい気がする。
Check! Mac のターミナルから Visual Studio Code を呼ぼう

こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
[Visual Studio Code](https://www.visualstudio.com/ja-jp/products/code-vs.aspx "Microsoft Virtual Academy のご紹介") は何かと重宝してます。新しい職場でも、新しい Mac にももちろんインストール済みです。

いつものように、ターミナルから `code` コマンドで呼べるように設定しました。

Mac のシェルに code コマンドを登録する
====
Visual Studio Code で、 View > Command Palette... (または `Shift + Command + p`) でコマンドパレットを開きます。

`shell` と入力すると、「Shell Command: Install 'code' command in PATH」と表示されるので、実行してください。

![20160318_vscode_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/9051dbd4-2482-deeb-1006-f96b03489877.png)

"Shell command 'code' successfully installed in PATH" とインストールが完了すれば準備OKです。

動作確認
----
ターミナルを起動して、動作確認してみましょう。

```bash
# 指定したファイルを Visual Studio Code で開く
code some.txt

# カレントディレクトリを Visual Studio Code で開く
code .
```

Epilogue - おわりに
====
これ意外と便利ですので、ぜひ設定をおすすめします♪
Windows環境の環境変数(Unix的)なことなど

# 環境変数設定
これもおいおい拡充できたらな、と思います。

## LANG
設定すると、各種bashでのlsでの文字表示が正常になるかもしれません
nyagosでのbuilt-in lsは不要
vimでmenuの選択でNGが出ることがあるので、この場合は設定しないのが吉?

## GIT_SSH,SVN_SSH,CVS_RSH
ssh/plink
### ssh
素のssh、git付属でもいいし、最近だとMicrosoftのOpenSSHポーティングがあるので、そちらでも利用できるかも(未確認)

### plink
プロキシを越える通信をgitなどでするとき、github.comなるセッションを作成し、proxyの設定を保存しておくと通る

## Proxy
HTTP_PROXY,HTTPS_PROXY,FTP_PROXYなど

これのフォーマットだが、

```
http://example.com:1234
```
というもの、これもUnix的になじみ

ただ、最後の/はあったりなかったりの場合があるっぽい
普通はなしがよさそうだが、ソフト(の設定項目)によっては/が必要な場合もあるかもしれない

## GNUPGHOME
Gpg4Win(のgpg win32版)でも上記は設定しておくことで、鍵位置を指定できる。
無指定でもいいけど、指定するほうが無難。
image_tag が UndefinedConversionError を吐く

Rails 5 beta 3 && Sprockets 3.5.2
image_tag の部分が Encoding::UndefinedConversionError を出すようになって困った。
再現条件は不明。

**エラーメッセージ**

```
Encoding::UndefinedConversionError in Public#index
Showing /path/to.html.slim where line #6 raised:

"\xE3" from ASCII-8BIT to UTF-8
Extracted source (around line #6):  

      .navbar-item
        a href="/"
          .logo = image_tag 'logo.png'
```

## 対策

```
rm -rf tmp/cache/assets/
```

どうやらキャッシュのエンコーディングが腐っていたらしい。このエラーメッセージから読み取るのは困難すぎる。