OmniAICreator/Qiita-1.07M huggingface dataset:
Windows再セットアップメモ

なんだかんだと環境が汚れて、Windowsを再セットアップすることがあります(仮想環境を使えとは思いますが)。ここでは、再セットアップの手順を説明します。
なお、この文章はあくまで自分向けなので、他の人には参考にならないと思います。たぶん。

# 前準備

- IMEの辞書をバックアップする。
- 他にバックアップすべきファイルが無いか、全フォルダを確認する。特に、ユーザーフォルダ以下を確認する。
- iPhoneUSB接続でテザリングする場合、iTunesインストールファイルをダウンロードしておいたほうが良い。

# 用意するもの

- 外付けHDD。PC内にしかないファイルを退避するため。Dropboxなど外部ストレージに保存してあるなら、必要ない。
- Windowsインストールメディア。Windows PCであれば、PC内に回復用パーティションがあるはず。
- MS Officeインストールメディア。

# 手順

## Windowsインストール

- インストールメディア、または回復用パーティションからWindowsをインストールする。
- Microsoftアカウントでログオンする。
- ログオン方式を変更する。
  - Microsoftアカウントのパスワードをランダム文字列にしていて覚えていないため、ログオン方式を変更している。

## 初期設定

※設定は、前使用していたアカウントから色々引き継がれる。

- ディスプレイ解像度、デスクトップ壁紙、スクリーンセーバーを設定する。
- エクスプローラーを設定する。
  - 自動的に現在のフォルダーまで展開。
  - 全てのフォルダを表示。
  - フォルダの表示設定をクリア、設定
  - 拡張子を表示
- タスクバーを設定する。
  - 左に表示
  - 小さいアイコン
- 電源を設定する。
- スタート画面、タスクバーのアイコンを整理する。
- インターネット接続を設定する。
  - 自宅LANに接続
  - テザリングで接続
- Windows Updateを行う。
- ウィルス対策ソフトウェアをインストールし、最新状態に更新、完全スキャンを行う。
- コマンドプロンプトを設定する。
  - フォントサイズ
  - 画面幅、バッファ

## Chocolatey

- [Chocolatey Gallery](https://chocolatey.org)に記載されているコマンドをコマンドプロンプトで実行して、Chocolateyをインストールする。
- よく使うソフトウェアを`choco`コマンドでインストールする。

```
> choco install TortoiseGit git.install tortoisesvn svn GoogleChrome thunderbird winscp jdk8 vcredist2013 dotnet3.5 dotnet4.5 directx ccleaner adobereader cygwin ruby python cygwin skype putty SourceTree virtualbox vagrant genymotion dropbox fiddler sandboxie truecrypt android-sdk
```

## 手動でソフトウェアをセットアップ

- MS Office
  - 自動修正を一通りオフに設定
- Explzh
  - 32bit版を使用する。64bit版だと、なぜかアーカイバーDLLがダウンロードできない。
  - アーカイバーDLLを全てインストールする。
- IrfanView
  - 本体は日本語ページから、プラグインは英語オフィシャルページからダウンロードする。
- Thunderbird
  - 一度そのまま起動して、プロファイルを作成する。
  - 「%USER%¥AppData¥Roaming¥Thunderbird¥profile.ini」にプロファイルの場所が設定されているので、Dropboxのプロファイルに修正して再起動する。
  - メールが参照できることを確認する。
  - メールの新規作成、返信、転送でプラグインが適用されることを確認する。
- CCleaner
  - 起動時にクリーン
- WinMerge
- サクラエディタ
  - インストール途中で、「Sakuraで起動する」を設定する。これがあるため、Chocolateyからはインストールしない。
- astah*
- CubePDF
- TeraTerm
- Google日本語入力
- GomPlayer
- DriveAnalyzer
- Skitch
- git
  - 以下のコマンドを実行する。

```
> git config --global user.name "John Doe"
> git config --global user.email johndoe@example.com
> git config --global core.autocrlf false
> git config --global core.precomposeunicode true
> git config --global core.quotepath false
```

- Java SDK
  - JAVA_HOME環境変数を設定する。
- GoogleChrome
  - Googleアカウントでログインする。
- Dropbox
  - ログインし、同期する。
- Skype
  - ログインする。
- SourceTree
  - GitHubにログインする。
  - BitBucketにログインする。
- Genymotion
  -適当なエミュレーターイメージをダウンロードし、使えるようにする。
- Android SDK
  - 適当なモジュールをダウンロードする。

# メモ

- まだまだ、手動でインストール・設定することが多い…
- Linuxのdotfile管理みたいなのは、Windowsだとレジストリかな。レジストリを保存しておいて、Chocolateyインストール→レジストリを復元、で設定を復元できないかなぁ。そんなに綺麗にはできないよなぁ…
jdkの中のjava.exeを直接指定したい時

いろいろ事情があって
java -jar hoge.jar
をするときに、直接蹴るjavaのバージョンを指定したい
これは対象クライアント機にjreが入っていない時も対応できるようにしたいから

やり方としてはOracleからJDKを落としてきてこれを解凍し、中のjavaをpathを指定して動かす。

解凍のやり方は下を参考にした

http://d.hatena.ne.jp/torutk/20140314/p1
gulpでstylusを使った時に先頭にアンダーバーがついていても出力されてしまう

##先頭に「_」がついているのに出力される
gulp-stylusで先頭にアンダーバーが付いているファイルに関しては出力されないはずなのに、実際に実行したら先頭にアンダーバーが付いているのにも関わらず出力されてしまった。基本的にstyle.stylというファイルに全部importしてcssファイルに変換したいので、どうにか出力されないようにしたい。  

##解決方法
###「!」をつける

 ```coffee:gulpfile.coffee
gulp.task'stylus', ->
  gulp.src(['./path/to/stylus/**/*.styl','!./path/to/stylus/**/_*.styl'])
```
みたいに書いてやれば出力されなくなった。
結構ハマってしまったので忘れないようにメモ。
部分一致とか日付の範囲で検索したい

[課題メモ](http://qiita.com/ishidam/items/3d667728e1eec954807b)より

## 部分一致検索

部分一致に限ったことではないのですが、モデルクラスの`scope`でクラスメソッドを作成しておくと、他の検索条件と組み合わせる時に便利です。

```rb:app/model/employee.rb
class Employee < ActiveRecord::Base
  scope :name_like, -> name {
    where('name like ?', "%#{name}%") if name.present?
  }
end
```

```rb:使い方
Employee.name_like('佐藤')
```

## 日付の範囲で検索

```rb:app/model/employee.rb
class Employee < ActiveRecord::Base
  scope :birth_between, -> from, to {
    if from.present? && to.present?
      where(birth: from..to)
    elsif from.present?
      where('birth >= ?', from)
    elsif to.present?
      where('birth <= ?', to)
    end
  }
end
```

```rb:使い方
Employee.birth_between('2000/01/01', '2000/12/31') #=> 範囲指定で検索
Employee.birth_between('2000/01/01', nil         ) #=> from以降を検索
Employee.birth_between(nil         , '2000/12/31') #=> to以前を検索
Employee.birth_between(nil         , nil         ) #=> 全件を返す
```

## 複数の条件で検索
`scope`を定義しておくと便利なのは、メソッドチェーンで定義したメソッドを組み合わせて複数の条件を簡単に作れることです。
上の２つを組み合わせて以下のように書くことができます。

```rb:app/model/employee.rb
class Employee < ActiveRecord::Base
  scope :name_like, -> name { ... } #(略)
  scope :birth_between, -> from, to { ... } #(略)

  # cond: 検索条件入力フォームのモデルオブジェクト
  scope :match -> cond {
    name_like(cond.name).birth_between(cond.birth_from, cond.birth_to)
  }
end

```
Cisco Catalystスイッチ 各ポートのリンクアップ状態 + VLAN番号表示コマンド

はじめに
===

Cisco Catalyst 2960sスイッチで、各ポートのリンクアップ状態やポートに割り当てているVLAN番号等を表示するコマンドです。

```
show interfaces status
```

参考サイト
===

以下を参考にさせて頂きました。
http://www.infraexpert.com/study/catalyst5.html

実行例
===

Cisco Catalyst 2960sスイッチにコンソールケーブル、またはtelnetでログインして、以下のコマンドを実行すると、情報を表示出来ます。

なお、以下に記載しているVLAN番号やNAMEは例です。

```
スイッチ名# show interfaces status
Load for five secs: 37%/12%; one minute: 47%; five minutes: 63%
Time source is NTP, 16:44:46.221 JST Tue Feb 3 2015


Port      Name               Status       Vlan       Duplex  Speed Type
Gi1/0/1                      notconnect   1            auto   auto 10/100/1000BaseTX
Gi1/0/2   example-server-1   connected    1          a-full a-1000 10/100/1000BaseTX
Gi1/0/3   example-server-2   connected    1          a-full a-1000 10/100/1000BaseTX
Gi1/0/4   example-server-3   connected    2          a-full a-1000 10/100/1000BaseTX
Gi1/0/5   example-server-4   connected    2          a-full a-1000 10/100/1000BaseTX
Gi1/0/6                      notconnect   3            auto   auto 10/100/1000BaseTX
Gi1/0/7   example-server-5   connected    3          a-full a-1000 10/100/1000BaseTX
　(省略)

スイッチ名# 
```
日曜日〜土曜日がすっぽり収まるカレンダーってほんとに823年ぶりなの？

```rb:
require 'date'

years = [*(2015 - 823)..2015]
months = [*1..12] # 日数が7で割り切れる月は2月だけなので、実際は2だけ。

result = years.product(months).select do |year, month|
  Date.new(year, month, 1).sunday? && Date.new(year, month, -1).saturday?
end

puts <<EOS

#{years.first}年 から #{years.last}年 までに #{result.length}回 ありました。

#{result.map{|y, m| "#{y}年#{m}月"} * ", " }

直前3回:

#{result.last(3).map{|y, m| `cal #{m} #{y}`.chomp}.join}
EOS

```

```text
1192年 から 2015年 までに 90回 ありました。

1198年2月, 1209年2月, 1215年2月, 1226年2月, 1237年2月, 1243年2月, 1254年2月, 1265年2月, 1271年2月, 1282年2月, 1293年2月, 1299年2月, 1310年2月, 1321年2月, 1327年2月, 1338年2月, 1349年2月, 1355年2月, 1366年2月, 1377年2月, 1383年2月, 1394年2月, 1405年2月, 1411年2月, 1422年2月, 1433年2月, 1439年2月, 1450年2月, 1461年2月, 1467年2月, 1478年2月, 1489年2月, 1495年2月, 1506年2月, 1517年2月, 1523年2月, 1534年2月, 1545年2月, 1551年2月, 1562年2月, 1573年2月, 1579年2月, 1587年2月, 1598年2月, 1609年2月, 1615年2月, 1626年2月, 1637年2月, 1643年2月, 1654年2月, 1665年2月, 1671年2月, 1682年2月, 1693年2月, 1699年2月, 1705年2月, 1711年2月, 1722年2月, 1733年2月, 1739年2月, 1750年2月, 1761年2月, 1767年2月, 1778年2月, 1789年2月, 1795年2月, 1801年2月, 1807年2月, 1818年2月, 1829年2月, 1835年2月, 1846年2月, 1857年2月, 1863年2月, 1874年2月, 1885年2月, 1891年2月, 1903年2月, 1914年2月, 1925年2月, 1931年2月, 1942年2月, 1953年2月, 1959年2月, 1970年2月, 1981年2月, 1987年2月, 1998年2月, 2009年2月, 2015年2月

直前3回:

      2月 1998
日 月 火 水 木 金 土
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

      2月 2009
日 月 火 水 木 金 土
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

      2月 2015
日 月 火 水 木 金 土
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
```
小さなお友だちの為の　MacOsXでLua #1


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#Lua
オフィシャルはこちら
http://www.lua.org/
![kobito.1422969331.288842.png](https://qiita-image-store.s3.amazonaws.com/0/33317/bb90acbc-77be-8953-59f8-f2c6c74aec71.png "kobito.1422969331.288842.png")

#ダウンロードページ
http://lua-users.org/wiki/LuaBinaries
![kobito.1422969462.986417.png](https://qiita-image-store.s3.amazonaws.com/0/33317/a00656c5-da08-d0c2-7c20-540b00165036.png "kobito.1422969462.986417.png")

色んなコンピュータで動いてますね。
Macの場合brewで一発
brew install lua
拡張したい人は、ここを参照。いいまとめ。
http://y-ken.hatenablog.com/entry/macosx-install-lua-luajit-luarocks

#対話形式
ターミナルからluaを起動します。
対話形式で実行できます。
printしてみましょう。終了はctl+D
![スクリーンショット 2015-02-03 22.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/33317/5d84fc5b-faf1-8890-f9b9-821b4226ab36.png "スクリーンショット 2015-02-03 22.25.16.png")
小さなお友だちの為の　MacOsXでBASIC #5 媒介変数


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#媒介変数
##04.BAS

```bas:04.BAS
10 SET WINDOW -2,2,-2,2
20 DRAW axes
30 FOR t=0 TO 2*pi STEP pi/180
40    LET r=1+cos(t)
50    PLOT LINES: r*cos(t),r*sin(t);
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![kobito.1422821703.053442.png](https://qiita-image-store.s3.amazonaws.com/0/33317/b05e51a5-eb01-7653-6f99-70605460fcc8.png "kobito.1422821703.053442.png")
Railsで検索機能を作って気がついたこと

Ruby on Railsの学習として検索機能を作ってみました。
色々と調べて覚えたことをまとめておきます。

![Practice 2015-02-03 22-01-45.png](https://qiita-image-store.s3.amazonaws.com/0/67427/2efed5e0-d346-52bd-ce53-2b182e860d6d.png)

* [アプリ](http://ishida-rails-practice.herokuapp.com/employees/find)
* [ソース](https://github.com/ishidamakot/rails-practice)

## 検索画面のURL
条件を指定してデータを検索する画面のURLとアクションをどうしようか考えた記録。

[検索画面のRESTfulなURL](http://qiita.com/ishidam/items/78b7ce1f0c421648042b)

## 検索フォームでもform_forが使える
データベースのテーブルと項目が完全に一致しないフォームであっても、ActiveModelを定義することで`form_for`に渡すことができます。

[検索条件フォームのようにテーブルと完全に同一でないフォームもform_forを使って実装できる](http://qiita.com/ishidam/items/dc16b6e22e6ec275079f)

## 選択項目を生成してくれるヘルパーがある
ラジオボタンやチェックボックスのHTMLを自動生成してくれるヘルパーメソッド

* collection_select
* collection_radio_buttons
* collection_check_boxes

```erb:app/views/employees/_find_form.html.erb
<%= form_for @form, url: '/employees', method: :get do |f| %>
  <%= f.collection_select :department_id, Department.all, :id, :name %>
  <%= f.collection_radio_buttons :sex_id, Sex.all, :id, :name %>
  <%= f.collection_check_boxes :favorite_ids, Favorite.all, :id, :name, checked: @form.favorite_ids %>
<% end %>
```

`collection_check_boxes`は`checked:`オプションで値の配列を渡さないと初期表示のチェックが付いてくれませんでした。

## 選択項目の「指定しない」という項目
ラジオボタンは一度チェックすると、未チェックの状態に戻すことができません。なので、「指定しない」という項目を追加しました。

プルダウンの項目は、`collection_select`のオプションで`include_blank: true`を指定することで空の項目が追加されます。

## 検索条件を組み立てる処理はmodelに書く
データベースから指定された条件に該当するデータを取得するために、モデルの`where`メソッドに渡す条件を組み立てる処理をコントローラに書くと、if文の連続でグチャグチャしたものが出来上がります。

モデルの`scope`メソッドで、ひとつひとつの検索条件に対するクラスメソッドを定義することができます。`scope`で定義されたクラスメソッドは、デフォルトで`all`を返すので、条件が指定された時だけwhereするということがシンプルに実装できます。

```rb:app/models/employee.rb
  # nameが空でない場合は氏名を部分一致検索する条件を返す
  # nameが空文字の場合はallが返る
  scope :name_like, -> name { where('name like ?', "%#{name}%") if name.present? }
```
Cisco Catalystスイッチ ファンや温度等の状態 + CPU使用率表示コマンド

はじめに
===

Cisco Catalyst 2960sスイッチで、CPU使用率やファンや温度等の機器状態を表示するコマンドです。

```
show env all
```

実行例
===

Cisco Catalyst 2960sスイッチにコンソールケーブル、またはtelnetでログインして、以下のコマンドを実行すると、スイッチのCPU使用率や温度やファン状態等の情報を表示出来ます。

```
スイッチ名# show env all
Load for five secs: 37%/12%; one minute: 47%; five minutes: 63%
Time source is NTP, 16:44:42.336 JST Tue Feb 3 2015
FAN is OK
TEMPERATURE is OK
Temperature Value: 32 Degree Celsius
Temperature State: GREEN
Yellow Threshold : XX Degree Celsius
Red Threshold    : XX Degree Celsius
SW  PID                 Serial#     Status           Sys Pwr  PoE Pwr  Watts
--  ------------------  ----------  ---------------  -------  -------  -----
 1  XXXXXXXX                                         Good
 2  XXXXXXXX                                         Good

SW  Status          RPS Name          RPS Serial#  RPS Port#
--  -------------   ----------------  -----------  ---------
1   <>              <>
2   <>              <>

スイッチ名#
```
Railsで関連モデルも一緒にcloneして新しいレコードを作成する

Railsで更新じゃなくて、同じものをコピーして新規作成したい際に関連モデルとかで悩んだのでメモします。

今回は

* 編集のときにそのオブジェクトを更新するのではなく新たに作成したい。
* ただフォームで送られてきたのは更新して。
* そもそもこのフォームでは送られてこない関連モデルもある。
* その関連モデルも新たに作成したい。

という状況でした。

そんな時に役立ったGemが、[deep_cloneable](https://github.com/moiristo/deep_cloneable)です。だいたいこれ見ればわかるかなと思います。

参考までに

```rb
@old_event = Event.find(params[:id])
@event = @old_book.deep_clone(include: [:event_scheduls], except: [{ event_scheduls: [:id] }])
@event.attributes = event_params #strong parameter
@event.save
```
paramsで送られてくる関連イベントも新たに作成する場合にはidを送ろうとしてくるhiddenをjavascriptとかで消しちゃうか、strong parameterにidなければ問題ないしって感じでしょうか。

他に何かいいやり方がある気もしますが^^;

とりあえずとても助かったGemでした。
raspberry Pi のOS(Raspbian)ダウンロード

つまらない所で引っかかってます。
こんな初心者ネタをQiitaに書くのは気が引けますが忘備録として。

## Raspberry PiのOS「Raspbian」をダウンロード

ダウンロードサイトからゲット　http://www.raspberrypi.org/downloads/
30分位かかりました。2015-01-31 Releaseほやほや！

![raspi.jpg](https://qiita-image-store.s3.amazonaws.com/0/64664/ee01bf33-a9c8-6773-d76f-16a4c57b5578.jpeg)

## SHA1でのチェック

Macでターミナルを開いて ダウンロードされたファイルのSHA-1をチェック。

`openssl sha1 downloads/2015-01-31-raspbian.img`

![raspi2.jpg](https://qiita-image-store.s3.amazonaws.com/0/64664/a7e869ce-b695-6a0e-7c66-cba3b99afa85.jpeg)

あれ？あわない。。？？なぜだ：：

なんと、ここでのSHA-1はimgじゃなくてzipの方。
自動解凍してくれてzipがゴミ箱に入っていたのでうっかり忘れていました。

`openssl sha1 downloads/2015-01-31-raspbian.zip`

![raspi3.jpg](https://qiita-image-store.s3.amazonaws.com/0/64664/0952ecb5-53f8-0dd7-eceb-a29e0fc90adc.jpeg)

今度はOKです。
Linux でマウスカーソル/ポインタを消す方法まとめ

## 動機
某組込機器でマウスカーソルを消したかったので調査。

## 常に消したいとき
環境に合わせて、X11 起動時に以下のように `-nocursor` を付与して実行。


```
$ Xorg -nocursor
```

```
$ X -nocursor
```

```
$ xinit -- -nocursor
```

```
$ startx -- -nocursor
```

## 動作を指定して消したいとき
Ubuntu にて。 unclutter 使用。

```
$ sudo apt-get install unclutter
$ unclutter --help
unclutter: usage:
	-display <display>
	-idle <seconds>		time between polls to detect idleness.
	-keystroke		wait for keystroke before idling.
	-jitter <pixels>	pixels mouse can twitch without moving
	-grab			use grabpointer method not createwindow
	-reset			reset the timer whenever cursor becomes
					visible even if it hasn't moved
 	-root	       		apply to cursor on root window too
	-onescreen		apply only to given screen of display
 	-visible       		ignore visibility events
 	-noevents      		don't send pseudo events
	-regex			name or class below is a regular expression
	-not names...		don't apply to windows whose wm-name begins.
				(must be last argument)
	-notname names...	same as -not names...
	-notclass classes...    don't apply to windows whose wm-class begins.
				(must be last argument, cannot be used with
				-not or -notname)
```

```
$ unclutter -idle 0.1 -root
```
とすると、アイドル状態が 0.1 秒続いたら消す、の設定。何か操作すると再表示。


# 参考
http://www.noah.org/wiki/cursor_disable_in_X11
http://www.x.org/wiki/AdvancedTopicsFAQ/
[マウスポインタもシャイで困る](http://incompleteness-theorems.at.webry.info/201011/article_3.html)
My Karabiner Configuration


1. Redefine `CapsLock` to `F19` in »[Seil](https://github.com/tekezo/Seil)«
2. Change `F19` to `Hyper` in »[Karabiner](https://github.com/tekezo/Karabiner)«
3. Open »[private.xml](https://raw.githubusercontent.com/599316527/my-karabiner-configuration/master/private.xml)« in »Karabiner«
4. Enable remapping items you like

## Global

* `Hyper` = `ESC`
* `Hyper` + `Tab` = `CapsLock`
* `Hyper` + `BackSpace` = `Delete`

* `Hyper` + `H` = `←`
* `Hyper` + `J` = `↓`
* `Hyper` + `K` = `↑`
* `Hyper` + `L` = `→`

* `Hyper` + `C` = Open *GoogleChrome.app*
* `Hyper` + `E` = Open *SublimeTextEditor.app*
* `Hyper` + `F` = Open *Finder.app*
* `Hyper` + `T` = Open *Terminal.app*

## Poker II

* Left `Win` = `Option`
* Left `Alt` = Left `Command`
* Right `Alt` = Right `Command`
* Right `Ctrl` = `→`
* `ESC` = ``~`

* `Hyper` + `F7` = Music Previous
* `Hyper` + `F8` = Music Play/Pause
* `Hyper` + `F9` = Music Next

### Hard Programing

* `Pn` + `[` = `Command` + `Shift` + `[` = Previous Tab
* `Pn` + `]` = `Command` + `Shift` + `]` = Next Tab

* `Pn` + `7` = `Hyper` + `Fn` + `7` = Previous Song
* `Pn` + `8` = `Hyper` + `Fn` + `8`	= Play/Pause
* `Pn` + `9` = `Hyper` + `Fn` + `9`	= Next Song

* `Pn` + `0` = `Fn` + `,` = Mutes
* `Pn` + `-` = `Fn` + `N` = Volume Down
* `Pn` + `=` = `Fn` + `M` = Volume Up

* `Pn` + `,` = `Ctrl` + `Hyper` + `H` = Goto Left Desktop
* `Pn` + `.` = `Ctrl` + `Hyper` + `L` = Goto Right Desktop

* `Pn` + `E` = tcook@apple.com = DIY Input String *(Length Limit)*
S3の画像ファイルをExpressで表示する


S3の画像ファイルを表示する以外何もしない単純なwebアプリ。

### nodeパッケージ

```console:
$ npm install express@4.9.8
$ npm install jade
$ npm install aws-sdk
```

### `aws-sdk`用設定

```$HOME/.aws/credentials
[default]
aws_access_key_id = XXXX
aws_secret_access_key = XXXX
```

### テンプレート

```jade:views/index.jade
doctype html
html
  body
    img(src='./fig.png')
```

### アプリケーション


```javascript:index.js
var express = require('express');

var app = express();

app.set('view engine', 'jade');
app.set('views', __dirname + '/views');

var aws = require('aws-sdk');
var region = 'ap-northeast-1';

var s3 = new aws.S3({region:region});

app.get('/', function (req, res) {
  res.render('index');
});

app.get('/fig.png', function (req, res) {
  bucket= 'BUCKET';
  key = 'fig.png';
  s3.getObject({Bucket:bucket, Key:key},
          function(err,data) {
              if (err) {
                  // some error handling
              }
              else {
                  res.send(data.Body);
              }
          }
  );

});

var PORT = 8080;
app.listen(PORT);
```


```console:
$ node index.js
```
ポートは任意。`$IP_ADDRESS:8080`で画像が表示される。
Javaで認証が必要なProxyサーバー経由でHTTP接続する

# URLConnectionを使用する場合

`Authenticator`の実装クラスを作成してユーザー名とパスワードを設定する。
少し古い情報だとシステムプロパティの`proxyUser`と`proxyPassword`を使うように書いてあるが、現在は使用できないので注意。

```java
    public static String URL = "http://www.apache.org/";
    public static String HOST = "proxy.server";
    public static int PORT = 9000;
    public static String USER = "user";
    public static String PASSWORD = "pass";

    public static void example1() throws Exception {
        System.setProperty("proxySet", "true");
        System.setProperty("proxyHost", HOST);
        System.setProperty("proxyPort", Integer.toString(PORT));
        
        Authenticator.setDefault(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(USER, PASSWORD.toCharArray());
            }
        });
        
        URL url = new URL(URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        System.out.println(conn.getResponseCode());
    }
```

# HttpClient4.3を使用する場合

```java
    public static void example2() throws Exception {
        HttpHost proxy = new HttpHost(HOST, PORT);
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope(proxy),
                new UsernamePasswordCredentials(USER, PASSWORD));
        RequestConfig config = RequestConfig.custom()
                .setProxy(proxy)
                .build();
        HttpClient httpclient = HttpClients.custom()
                .setDefaultCredentialsProvider(credsProvider)
                .setDefaultRequestConfig(config)
                .build();

        HttpGet get = new HttpGet(URL);
        HttpResponse res = httpclient.execute(get);
        System.out.println(res.getStatusLine());
    }
```

## 参考
[Apache HttpComponents](http://hc.apache.org/) > [HttpClient 4.3](http://hc.apache.org/httpcomponents-client-4.3.x/index.html) > [Examples](http://hc.apache.org/httpcomponents-client-4.3.x/examples.html) > [Proxy authentication](http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/examples/org/apache/http/examples/client/ClientProxyAuthentication.java)
[Rails] FactoryGirl generate random users

If you want to generate a user with different uuid or email address, try to do this way.

```rb
FactoryGirl.define do
  factory :user do
    uuid                  { SecureRandom.uuid }
    sequence(:email)      { |n| "test#{n}@abc.com" }
    password              "password"
    password_confirmation "password"
  end
end
```

**POINT:**
The `SecureRandom.uuid` will generate same uuid if you do something like this.

```rb
uuid  SecureRandom.uuid
```
topless と color_echo


[topless](http://www.ongs.net/~daichi/) が個別の単語に色付けしてくれたらなーーーっと思ってたら、先週知った `color_echo` って言うコマンドが！

```bash:
$ anyenv install rbenv 
$ eval "$(anyenv init -)"
$ PERL5OPT= rbenv install 2.2.0
$ rbenv shell 2.2.0
$ gem install bundler
$ gem install color_echo
$ rbenv rehash
```


```bash:
$ topless 'ps aux' | color_echo -w -p 'Chrome' -f blue 
```

ん。いい感じ

```bash:
$ color_echo | more
```
したら、読むに耐えない状態に。
help は普通にしたら良いのに。
Qiime 1.9


[Qiime](http://qiime.org/) 1.9.0 が [正式リリース](https://qiime.wordpress.com/2015/01/30/qiime-1-9-0-is-live/)されました。

### 要件
* 'CentOS6.6', `pyenv` での環境構築
* `python` のバージョンは 2.7.3

`python` バージョン要件が、[ここ](http://qiime.org/)のどこを掘っても出て来ない。
駄目元で、3系を試したものの、やっぱり上手く行かなかった。
一応、前バージョンの環境に併せて。

`pyenv` 環境では無い人は必要に応じて `sudo` する。`--prefix` 以降を消去する。

## インストール


### 隔離環境作成
`pyenv` 使ってない人には無関係

```bash:
$ pyenv virtualenv 2.7.3 qiime1.9
$ pyenv shell qiime1.9
$ pyenv rehash
$ pip install --upgrade setuptools
$ pip install --upgrade pip
```

### 本体インストール前にインストール
Qiime1.8 からのアップグレードの場合に、このステップが必要かどうかは検証していない

#### nose,numpy

```bash:
$ pip install nose
$ pip install numpy  
```
`nose` は、 `numpy` などのテストに必要

#### scipy 用の数値演算ライブラリー
先に入れとかないと `scipy` インストール時にコケる
素直に `sudo` でインストール
当方の環境では、 `lapack-devel` のみインストールされていなかったのだが、一応全部書く。

```bash:
$ sudo yum install lapack-devel
$ sudo yum install blas-devel
$ sudo yum install atlas
```

#### scipy
本体インストール時に、インストールされるが、上記のからみで先にインストール。

```bash:
$ pip install scipy
```


### 本体インストール

#### 新規インストール
コケる事もなく、、、

```bash:
$ pip install qiime 
```

#### Qiime1.8 からのアップグレード
の場合も、上に同じ


```bash:
$ pip install --upgrade qiime 
```

### 確認
個々のアプリインストール、環境変数設定後に、

```bash:
$ print_qiime_config.py -tf
```

エラーは出てないので良しする。

### 個々のアプリ

以下のもののインストールだけ記載

* 新規に必要だった `hdf5`, `h5py`
* Mothur 1.25.0 （ちょっとインストールが難しいもの）

`${PLENV_ROOT}/versions/qiime1.9/src` にソースディレクトリがあると想定

#### hdf5, h5py

パラレル必要な程のデータは扱ってない。
ヲーニングが山程出たが、`make check` はパスした。

```bash:
$ wget -q http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.8.14.tar.bz2
$ tar xjf hdf5-1.8.14.tar.bz2
$ cd hdf5-1.8.14
$ ./configure --prefix=${PLENV_ROOT}/versions/qiime1.9
$ make
$ make check
$ make install
```

```bash:
$ HDF5_DIR=${PLENV_ROOT}/versions/qiime1.9 pip install h5py
```

#### mothur 1.25.0

Qiimeによるバージョン指定 => 1.25.0
[ここ](http://qiime.org/install/install.html)から src_mothur をダウンロード

```bash:
$ ls | grep Mot
Mothur.1.25.0.zip
$ unzip Mothur.1.25.0.zip
```


##### `uchime_src/Makefile` の編集
端折ってますが、適当なエディタで編集して。
行頭の空白は'タブ'


```bash:
$ cd Mothur.source/uchime_src
$ touch Makefile
```

```Makefile:Makefile
CXX=g++
CXXFLAGS=-O3 -msse4.2 -mavx -mfpmath=sse -D_FILE_OFFSET_BITS=64 -DNDEBUG=1 -DUCHIMES=1
OBJ=$(subst .cpp,.o,$(wildcard  *.cpp))

uchime: $(OBJ)
	$(CXX) $(OBJ) -o $@ -lm
	strip uchime
	mv uchime ../
```

##### `makefile` の編集
端折ってますが、（略）


```bash:
$ cd ../
$ diff makefile makefile.bak
31c31
<       #TARGET_ARCH += -arch x86_64
---
>       TARGET_ARCH += -arch x86_64
40c40
<       CXXFLAGS += -mtune=native -march=native -m64
---
>       #CXXFLAGS += -mtune=native -march=native -m64
104c104
<       make -C uchime_src
---
>       cd uchime_src && ./mk && mv uchime .. && cd ..
```

##### `make`

```bash:
$ make
$ mv mothur uchime ../../bin/
$ cd ../
$ rm -rf Mothur.source __MACOSX
$ mothur -version
Mothur version=1.25.0
Release Date=5/1/2012
```
壊れない？！丈夫なCardBoardの作り方（2号機）

# はじめに
* CardBoardを作ってみたあなた。もう壊れてしまっていませんか？丈夫で持ち運びが出来るCardBoardを改めて作ってみましょうｗ

# 背景
* GoogleのCardBoard（初号機）を作ってみてそのときは満足していたのですが、時間が経つにつれて色々と気になる点が出てきました。
    * もろい（段ボールですから、、、）
    * 持ち運びに不便（折りたたむサイズに限界がある。ワンショルダーに入るくらいコンパクトにしたい）
    * レンズの焦点距離があって無くてイライラする（正規レンズでなくてダイソーレンズなので当然ですが）
    * 切るのが面倒（図面通りに作ろうと思うと、切り抜き箇所や複雑な箇所があって大変）
* これらの課題を解消すべく2号機の作成を行いました。

# 完成品
* こちらが完成品です。背景で上げていた課題を一通りクリアしたつもりです。（左が初号機、右が今回の完成品）
    * ![card-kansei.png](https://qiita-image-store.s3.amazonaws.com/0/44076/8af16be3-e02f-62af-3851-e75997ca1fdd.png)
* 分解して折りたたんだ図がこちらです。小さなポーチに収まるサイズまで小さく折りたためます。
    * ![card-kumitate.png](https://qiita-image-store.s3.amazonaws.com/0/44076/b3c5efba-d579-103a-7f43-ca01b5f53a7d.png)


# 材料
* 段ボール
    * 今回は、印刷用紙が入っている丈夫なもの（約2mm）を使用しました
* 布テープ
    * 外周補強と折り曲げ箇所に使用しています
* レンズ
    * ダイソーの100均一レンズです。この中に同じレンズが2枚入っています。
    * ![loupe.png](https://qiita-image-store.s3.amazonaws.com/0/44076/eb75150e-9b13-9b6a-4329-cad8502cf75e.png)
* マジックテープ
    * 分解したパーツ同士の組み合わせに使います

# 作り方
* 図面を印刷する
    * 等倍サイズで印刷します
        * ![card-print.png](https://qiita-image-store.s3.amazonaws.com/0/44076/e69b53ec-7352-80cf-be11-1104655c059d.png)

* 図面を一部加工する
    * 加工内容
        * ダイソーレンズに焦点が合うように焦点距離を5mmずらします
        * 不要な部分は使わない＆切らない
    * 模式図（概念図です。実際は印刷した紙をベースに加工してください）
        * ![edit-01.png](https://qiita-image-store.s3.amazonaws.com/0/44076/3c934842-221a-b3d1-ff3f-90c016bbd2ed.png)
        * ![edit-02.png](https://qiita-image-store.s3.amazonaws.com/0/44076/59b31942-b915-7109-444d-a0de0213f1bb.png)
        * ![edit-03.png](https://qiita-image-store.s3.amazonaws.com/0/44076/cddad18d-125c-f86a-88d1-bf67f0803da2.png)

* パーツを切る（仮切り）
    * 紙からすべてのパーツを分けて切り取ります（折り曲げる部分は一箇所もありません）
    * 細かな部分のカットは段ボールに貼ってから行います
    * 切り取ってから組み立て箇所が分からなくならないように番号など付けておくと良いです
* 段ボールに貼り付ける
    * 補強時にそのまま布テープで貼り付けるのでべったり貼ってOKです
    * ![paste-and-cut.png](https://qiita-image-store.s3.amazonaws.com/0/44076/69c458c2-82bc-8936-1795-037d3417fbc2.png)

* 段ボールを切る
    * 各パーツを丁寧に切り取ります
    * ![cut-detail.png](https://qiita-image-store.s3.amazonaws.com/0/44076/f5e4513e-2f55-04a8-ae88-fda949bf7763.png)

* 布テープで補強する
    * 側面から貼って最後に表面に貼ると良いです
    * ![tape-setting.png](https://qiita-image-store.s3.amazonaws.com/0/44076/245a1860-e11b-f72d-96d6-6468ca3ee457.png)

* 貼り合わせる
    * 最終的に折りたためるように布テープの貼り付け位置を工夫して貼ります
* 合体させる
    * マジックテープで貼り合わせます。

# まとめ
* 初号機は、段ボールで図面通り切って図面通り折り曲げないと、、、とおっかなびっくり作成しましたが、2号機は思い切って全部切り離してつなぎ合わせることで丈夫なものが出来たと思います。
* 今回の作成で、分解して折りたためるように作れることが分かったので、次回はアクリル板など本当に丈夫な素材で作成したいと思います。
windows カレンダーガジェット作成(2)

[前回](http://qiita.com/lofttecs/items/64f4c43b2fde749e29a0)のガジェットを改修して表示を透過にし、スケジュールを書き込めるようにしました。


http://web.loft-net.co.jp/lofttecs/windows_gadget_calendar/2/

背景を透過にしてPNG形式の文字の画像を表示させています。

g:textとかAddImageObjectとかを使えばもっときれいに作れるかもしれません。

スケジュールはUIを作るのが大変そうだったのでJSON形式で登録します。

オプションボタンをクリックして下記のように書けば登録できます。

＞例
{'20150204':{'0930':'会議'}
,'20150205':{'0930':'打合せ','1630':'カットオーバー'}
,'20150312':{'0930':'朝礼'}
,'20150312':{'1630':'締切'}
}

文字数制限：2,048 文字

参考：https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb655904%28v=vs.85%29.aspx

GitHub：https://github.com/lofttecs/simple-calendar-gadget

GitHub　(ver. 2.0)：https://github.com/lofttecs/simple-calendar-gadget/tree/677319913d7eb4e1a075927ffbfa2a8b5cee5f03

GitHub（ver.1.0）：https://github.com/lofttecs/simple-calendar-gadget/tree/5a6fc0217c98f82bf4957b8c2bb6cd1af2e45172
【Virtual Box】Virtual BoxでCentOS6.6-32bitの仮想マシンを入れた

#概要
ネット上に何個転がってても良いよねな感じの入れたときの話。
Virtual BoxでCnetOS仮想マシン立ち上げる際の参考にどうぞ。

尚入れながら書ければ良かったんだけど、結局思い出したように全部入れ終わった後に書いたのであしからず。

#Virtual Boxを使うPC
Windows

#CentOS落としてくる
http://www.centos.org/download/mirrors/
から
CentOS-6.8-i386-bin-DVD1.iso
を落とす。DVD2は拡張用らしく不要。尚ネットワークインストールとminimalは何か上手く行かないから上級者じゃなければやめた方が良い。

#Virtual Boxインストール
しよう

#仮想マシンの作成
今回は32bit。

新規ボタンから作成
![sinki.png](https://qiita-image-store.s3.amazonaws.com/0/59944/696f4bfd-8554-2ace-a126-b43692a27d46.png)

名前は「CentOS6.8 bit数」とする。それ以降の設定は全てデフォルトでOK。

#sshログインできるようにする設定
仮想マシンを作成したらLinuxのインストール前にsshログインできるようにする設定を行う。具体的には仮想マシンのネットワーク設定でブリッジアダプターってやつに変更する。

仮想マシンのネットワークの設定画面を出す。
![network01.png](https://qiita-image-store.s3.amazonaws.com/0/59944/f9a1cf7e-07b1-5c81-2fea-be1c60c0aff6.png)

「割り当て」って書いてある奴をブリッジアダプターに変更。
これに設定するとVirtual Box起動してるマシンと共通のネットワークが利用されるらしいけど細かいことは知らない。

#OSのインストール
仮想マシンを起動する。
起動すると起動ディスク選択画面が出る。

![kidoudisk.png](https://qiita-image-store.s3.amazonaws.com/0/59944/d8a105e8-933d-ce7d-aee8-325d910665c0.png)

さっき落としたisoを選択すれば良い。

![kidoudisk12.png](https://qiita-image-store.s3.amazonaws.com/0/59944/93c96f92-81a4-14e9-359e-73d6c1a5a36f.png)

後は適当にインストールするんだけど、注意点としては以下
・インストールテストを行うかみたいなのは全部スルーする
・途中でインストール構成として「Desktop」「minimal」「Basic Server」...みたいなのを選択する場面がある。大抵はデスクトップ不要でコマンドラインだけで使いたいので「Basic Server」か「Web Server」を選択した方が良い。
・HDD初期化しちゃうけど大丈夫かとかいう脅迫メッセージが出るけど問題なし（初めて入れたときはちょっと怖かった）

#ネットワークの設定
```
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
```
で設定を編集。
ONBOOT=yes
BOOTPROTO=dhcp
になってればOK、なってなかったら修正。dhcpについては固定IPにしちゃってもいいけど。

```
$ /etc/rc.d/init.d/network restart
```
でネットワーク再起動。全部OKだったら大丈夫。

```
$ ifconfig
```
で出てきたIPに対して、Virtual Boxを起動してるPCからpingを打って帰ってくれば繋がってる。

#Tera Termでssh接続
インストール後触ってみればわかるけど解像度が小さ過ぎてとてもじゃないけど作業できない。なのでTera TermでSSH接続してそっち側で作業する。

普通はそのままifconfigで出てきたipに接続すればいける。
だめな場合ポート22が開放されてないかも。

```
$ vi /etc/sysconfig/iptables
```
でiptable編集して
```
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
```
を追加すれば良い。
尚、インストール時に「Web Server」を選択している場合は初めから入ってるはず。
euc-jpなサイトにnodeのrequestを使ってpostする時にハマって解決した事

npmのrequestを使ってeuc-jpなサイトに
postするプログラムを以下のように作ろうとしていた。

CoffeeScriptです。


```coffee
request = require('request')
Iconv = require('iconv').Iconv

callback = (error, response, body) ->
  if !error && response.statusCode == 200
    iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE')
    contents = iconv.convert(body).toString()
    console.log contents

form =
  name: 'テストユーザー'
  memo: 'メモなのです'


request.post( {
  url: 'http://hoge.jp',
  encoding: null,
  form: form
}, callback )
```

と、やっていたが、postする値をeuc-jpにするところで詰まってしまった。

しかも、requestの実装を見てみると、formの値を何だかutf-8に変換しているっぽい感じだった。


https://github.com/request/request/blob/f0acc0b/request.js#L1338

たぶん、この辺。


いろいろ試行錯誤した結果、以下のようにやれば上手く行った。

1. formはハッシュじゃなくて、文字列にする。
2. euc-jpの文字列をurlエンコードする

サンプルは以下のような感じになる。

coffee勉強中です（言い訳

```coffee
request = require('request')
Iconv = require('iconv').Iconv
Encoding = require('encoding-japanese')


urlEncodeUtf8ToEuc = (string) ->
  iconv = new Iconv('UTF-8', 'EUC-JP//TRANSLIT//IGNORE')
  string = iconv.convert(string)
  encodeString = Encoding.urlEncode(string)

callback = (error, response, body) ->
  if !error && response.statusCode == 200
    iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE')
    contents = iconv.convert(body).toString()
    console.log contents

form = 'name=' + urlEncodeUtf8ToEuc('テストユーザー') + '&memo=' + urlEncodeUtf8ToEuc('メモなのです')

request.post( {
  url: 'http://hoge.jp',
  encoding: null,
  form: form
}, callback )

```

なんかもっと良さげな方法があったら誰か教えてください〜



#### 参考
- http://blog.sarabande.jp/post/52117191060
- https://github.com/polygonplanet/encoding.js
[Spree] 商品管理のオプションタイプ追加時の不具合

* Spreeで商品管理のオプションタイプを追加するとタイムアウトが発生する様になった
* DBへの負荷が尋常では無く危険な状態
* 調査してみたところオプションタイプを追加するときに全商品のレコードを更新(touch)している処理がある
* touch処理は外しても問題が無さそうなので外した
* 何か意図があって全件touchをしているのかもしれないので管理画面からupdateするときのみtouch処理をskipさせた
* パッチを適用させたのはoption_types_controllerのみ

### decorator
* app/controllers/spree/option_types_controller_decorator.rb

```rb
Spree::Admin::OptionTypesController.class_eval do
  def update
    Spree::OptionType.skip_callback(:touch, :after, :touch_all_products)
    super
  end
end
```
ls -lした時に@(アットマーク)がパーミッションの所についた時にカレントディレクトリ以下をまとめて消すワンライナー

```bash
for f in `find . -name "*.*"` ; do for attr in `xattr $f` ; do xattr -d $attr $f ; done ; done
```

それだけなんですけどね。よく使うし。

詳細は下記が詳しいです。
* [Macでlsした時のパーミッションにあるアットマークを消す。xattrコマンド。 - kanonjiの日記](http://d.hatena.ne.jp/kanonji/20100912/1284292517)
* [ls したときパーミッションにあるアットマーク@について(Mountain Lion) - by shigemk2](http://shigemk2.hatenablog.com/entry/20121128/1354094363)
vagrantでRails4.2に接続できなくなった

Railsで環境構築をしていて、Rails4.2になったけどまぁいっかーとか思いながら環境構築をしているものの、「rails s」のコマンドを起動してもゲストOSにつながらない。

Vagrantファイルの「port forwarding」の設定がおかしくなったのかと思いきや。

**Rails 4.1.2までwebrickは「0.0.0.0」で待ち受けていたけど、 Rails 4.2では 「127.0.0.1」で待ち受けるように変わっていた。**

すっげーつまんない所で時間とりました。

起動を以下のコマンドに変えれば無事動きました。

```
rails s -b 0.0.0.0
```

やれやれ。
Vim に惚れるシーン（IP アドレス と ポート番号 を分ける）

# シーン 3

Yamaha のルータで、NAT の変換テーブルを調査している時、次のような出力に悩まされることがあります。

```
> show nat descriptor address detail 
参照NATディスクリプタ : 1, 適用インタフェース : LAN2(1)
Masqueradeテーブル
    外側アドレス: primary/xxx.xxx.xxx.xxx
    ポート範囲: 60000-64095, 49152-59999, 44096-49151   12231個使用中
プロトコル      内側アドレス                  宛先   マスカレード    TTL(秒)
   UDP    172.22.11.13.63646     200.172.127.74.53        59355            1
   TCP     172.19.1.17.61312     113.127.234.60.80        56468            1
   TCP     172.32.3.49.50138      61.32.128.97.110        56737            1
   TCP      172.25.4.6.56077     51.235.213.115.80        50755           39
   TCP    172.17.1.110.51283   101.162.236.199.443        63259            1
   TCP      172.24.4.9.56076      53.214.30.162.80        51170           45
   TCP      172.28.1.9.56068      201.232.238.6.80        61462           39
   TCP      172.33.3.2.50330      69.32.120.91.110        57941            1
   UDP    172.27.16.39.57780     215.168.126.68.53        55026            2
    :
```

よく見てみると、IP アドレスと ポート番号 が "."（ドット）で区切られています。
これが IP アドレスの区切り文字の "."（ドット）と同じために、調査する際に扱いにくいことがあります。

# どうしたい？

IP アドレスと ポート番号を分離しやすいように区切り文字を "."（ドット）から ":"（コロン）に変更したい。
つまり、次のように置換したいと思います。

```
> show nat descriptor address detail 
参照NATディスクリプタ : 1, 適用インタフェース : LAN2(1)
Masqueradeテーブル
    外側アドレス: primary/210.172.124.109
    ポート範囲: 60000-64095, 49152-59999, 44096-49151   12231個使用中
プロトコル      内側アドレス                  宛先   マスカレード    TTL(秒)
   UDP    172.22.11.13:63646     200.172.127.74:53        59355            1
   TCP     172.19.1.17:61312     113.127.234.60:80        56468            1
   TCP     172.32.3.49:50138      61.32.128.97:110        56737            1
   TCP      172.25.4.6:56077     51.235.213.115:80        50755           39
   TCP    172.17.1.110:51283   101.162.236.199:443        63259            1
   TCP      172.24.4.9:56076      53.214.30.162:80        51170           45
   TCP      172.28.1.9:56068      201.232.238.6:80        61462           39
   TCP      172.33.3.2:50330      69.32.120.91:110        57941            1
   UDP    172.27.16.39:57780     215.168.126.68:53        55026            2
    :
```

# どうする？

正規表現を使った置換で簡単にできますよね？

## よくありそうな解決法

```
:%s/\v(\d+\.\d+\.\d+\.\d+)\.(\d+)/\1:\2/g
```

グループ化 `(...)` と、部分文字列参照 `\1` や `\2` でさらりと解決ですね。

「IP アドレスとポート番号を取り出して、":"（コロン）で区切ってやる」

これは、Vim だけではなく、他の多くのエディタで使える方法だと思います。

## Vim らしい(?) 解決法

Vim らしいかどうかは分かりませんが、Vim ならこんな解決方法もあります。

```
:%s/\v\d+\.\d+\.\d+\.\d+\zs\.\ze\d+/:/g
```

マッチの開始点 `\zs` と マッチの終了点 `\ze` を指定する方法です。

先ほどの「よくありそうな解決法」での置換とくらべると、着目点が逆になっていますね。

「IPアドレスとポート番号の間の "."（ドット）を ":"（コロン）に置き換える」

こちらの方が、少しだけ **直感的に表現** できているとは思いませんか？

# まとめ

 - `\zs` と `\ze` 便利！
 - 選べる解決法があるのは、嬉しい。（直感的な解決法につながる）
 - 2タッチ少ない（これはオマケです）

発想を素直に表現できる Vim に惚れます！
WindowsでMAME/MESSをビルドする

# Build

* MAMEのソースを用意する
 * [github](https://github.com/mamedev/mame)からソースをダウンロード。
 * 任意のフォルダに解凍。

* ビルド環境（MSYS2）を用意する
 * [Tools for building MAME on Windows](http://www.mamedev.org/tools/)から適当なパッケージをダウンロード。（今回は64bit版を使用）
 * 任意のフォルダに解凍した後、`autorebase.bat`を実行。

* MAMEのコンパイル
 * MSYS2の`win32env.bat`か`win32con.bat`を実行してコンソールを開く。（今回は`win32con.bat`を使用。見た目が格好良かったからｗ）
 * MAMEのフォルダに移動し、```make```する。（数時間掛かります）

```
C:\mame>mame64 -help
MAME v0.175 (unknown)
Copyright Nicola Salmoria and the MAME team
```

# Test

* 公開されているROMを[ROMs for Free Download](http://www.mamedev.org/roms/)からダウンロード。（今回はCircusを使用）
* MAMEの実行ファイルがあるフォルダに```roms```フォルダを作成し、ダウンロードしたROMファイルをコピー。

```
+- <mame>
   |
   +- <roms>
   |  |
   |  +- circus.zip
   |
   +- mame64.exe
```

* MAMEを実行。
 * 実行後の操作については省略。

![0001.png](https://qiita-image-store.s3.amazonaws.com/0/18828/4735ab85-6075-2850-56ad-1b88eeafde68.png)

# Variations

## アーケードのみ版のコンパイル

```
make SUBTARGET=arcade

C:\mame>mamearcade -help
MAME v0.175 (unknown)
Copyright Nicola Salmoria and the MAME team
```

実行ファイルが50MBほど小さくなりました。

## MESSのみ版のコンパイル

```
make SUBTARGET=mess

C:\mame>mess64 -help
MESS v0.175 (unknown)
Copyright Nicola Salmoria and the MAME team
```

## Tiny版のコンパイル

一部の機種/ゲームのみ動作するTiny版を作成します。

### MAME

```
make SUBTARGET=tiny
```

* デフォルトでは、[ROMs for Free Download](http://www.mamedev.org/roms/)で公開されているゲームのみ動作する実行ファイルが生成される。（World Rallyは公開されていない‥？）

```
C:\mame>mametiny64 -listfull
Name:             Description:
alienar           "Alien Arena"
carpolo           "Car Polo"
circus            "Circus / Acrobat TV"
crash             "Crash"
fax               "FAX"
fax2              "FAX 2"
fireone           "Fire One"
gridlee           "Gridlee"
hardhat           "Hard Hat"
looping           "Looping"
ripcord           "Rip Cord"
robby             "The Adventures of Robby Roto!"
robotbwl          "Robot Bowl"
sidetrac          "Side Trak"
spectar           "Spectar (revision 3)"
starfir2          "Star Fire 2"
starfire          "Star Fire (set 1)"
starfirea         "Star Fire (set 2)"
supertnk          "Super Tank"
targ              "Targ"
teetert           "Teeter Torture (prototype)"
topgunnr          "Top Gunner (Exidy)"
victorba          "Victor Banana"
victory           "Victory"
wrally            "World Rally (Version 1.0, Checksum 0E56)"
```

* ゲームを変更したい場合は、`src/mame/tiny.lst`と`scripts/target/mame/tiny.lua`を書き換える。（未検証）

### MESS

MAME/MESSの一体化に伴って（？）、**MESSのTiny版**という括りは無くなったらしい。（MESSもTiny版もSUBTARGET扱いなので指定出来ない）

# Links

* [MAMEDEV.org](http://www.mamedev.org/)
 * [github](https://github.com/mamedev/mame)
 * [Tools for building MAME on Windows](http://www.mamedev.org/tools/)
 * [ROMs for Free Download](http://www.mamedev.org/roms/)
Windowsでadbコマンドを使用する際の注意


Windowsからadbコマンドを使用して、マルチバイト文字が含まれるファイルを作成してはいけません。MacやLinuxなどのWindows以外のPCから正常にアクセスできなくなる他、Androidアプリからもファイルを正常に扱えなくなります。

## 再現手順

以下はその手順です。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/74aa7952-f6c5-a124-8b95-d030ed0d8055.png)

```dos
adb shell mkdir /sdcard/Download/test
adb shell touch /sdcard/Download/test/こんにちは.txt
adb shell ls /sdcard/Download/test
```

作業場所はダウンロードフォルダにしました。後でエクスプローラやAndroid File Transferで確認がしやすいためです。

マルチバイト文字を含むファイルは、必ずマルチバイト文字を含まないフォルダ内に作成して下さい。作成したファイルが削除できなくなる、という最悪の事態を、フォルダごと削除することで回避することができます。

lsコマンドで見ると、正しく作成されているように見えます。

Cygwinからadbコマンドでファイル名を確認してみます。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/4ae1236e-4a62-bb38-68f2-b27b17cfa446.png)

正しく表示されません。

WindowsのコマンドプロンプトはCP932という、いわゆるShift_JISが入出力に用いられます。一方、AndroidおよびCygwinはUTF-8が入出力に用いられます。要するにShift_JISの文字コードを用いてファイルを作成してしまった、という状態なのです。

この状態でエクスプローラを見てみます。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/c0379e85-8c34-94a0-3f41-34efd8047649.png)

はい、エクスプローラ上でファイルが見当たりません。Windowsだけでもうおかしな状態になってしまっています。

では、このAndroid端末をMacに接続して状態を確認してみましょう。

まずは、adbコマンドを叩いてみます。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/404839d1-8663-fd0f-1fb7-c28d9ebfbaad.png)

ファイル名が正しく取得できません。

Android File Transferで見てみます。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/8ff65310-4fc4-7315-9358-1eace61f4d1c.png)

Android File Transferではtestフォルダ内のファイルが検出できません。

Androidアプリのファイルマネージャを用いて確認してみます。ここではES File Explorerというファイルマネージャを用います。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/8296a2a7-c115-2d0b-45f0-7264bad132f9.png)

文字化けしていますが検出はできています。では、これを削除してみましょう。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/108f4e8d-dfab-3339-f587-35b1d56b326e.png)

ファイルを選択して、削除ボタンをタップすると：

![](https://qiita-image-store.s3.amazonaws.com/0/31613/0475efaa-d8e1-f06d-247e-2550f23be458.png)

確認ダイアログが表示されました。なんだかうまくいきそうな気配です。このままOKをタップします。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/6ffbcb79-4489-9d6e-34cb-2807c186b1b8.png)

消えました。やった！

念のため、再読み込みをしてみます。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/c6c39fbe-a298-6901-e01c-b2d3b199399f.png)

なんか復活してる！！！

正確には、削除に失敗しているのに「成功」というメッセージを出して、表示上削除できたように見せる、という処理になっているのでしょう。

## 復旧方法

文字化けするファイルの消し方はいくつかあります。

ひとつは、ワイルドカードを用いてコマンドラインから消す方法です。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/9bf6ea07-bfdf-63e1-f3c7-d4bc0f461a8e.png)

ただし、この方法は確実ではなく、失敗することもあります。成功／失敗はおそらくファイル名に依存しているのではないかと思います。

つぎは、親フォルダごと消す方法です。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/7c853f3a-3d5a-0419-28eb-2b8721110ca7.png)

こんな感じで削除することができます。これが確実ですが、削除可能なフォルダ配下になければならないという制約があります。

さいごは、コマンドプロンプトから削除する方法です。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/6c628b25-29cf-e7ae-97ed-2686efae61aa.png)

ファイル名を指定して確実に削除することができます。ただし、コマンドプロンプトではUTF-8のマルチバイト文字が逆に文字化けするので、対象ファイルがマルチバイト文字を含むパスに移動していたりすると、この方法は使えません。なんとかMac/Linux/Android上でマルチバイト文字が含まれないパスに移動しましょう。

## まとめ

- Windowsからadbでマルチバイト文字のファイルを作成しない
- Androidにマルチバイト文字のファイルを作成しない
- 最悪Android端末を工場出荷時状態に初期化
Macのスクリーンキャプチャ機能の画像保存場所を変更する


Mac OS標準のスクリーンキャプチャ機能で撮影した、
スクリーンショット画像の保存フォルダを変更する方法です。

## スクリーンショット画像の保存フォルダを変更

Mac標準のスクリーンキャプチャ機能（command+Shift+4）を使用すれば、
デスクトップ全画面を撮影したり、ウインドウの一部を撮影したりできます。

また、この機能の設定を変更すれば、スクリーンキャプチャのウインドウの影を無くしたり、
保存ファイル形式を変更したりすることができます。

## 保存先を変更する

「ターミナル」を起動します。
そして、以下のように入力します。

``` #sh
$ defaults write com.apple.screencapture location ~/Downloads
```

SystemUIServerを再起動します。

``` #sh
$ killall SystemUIServer
```

ちなみにこれは「ダウンロード」フォルダを保存場所に指定しています。
最後のパスを変更すれば保存場所を指定することができます。
デフォルトに戻す場合は以下を入力してください。

``` #sh
$ defaults delete com.apple.screencapture location
$ killall SystemUIServer
```

Blog投稿等、操作キャプチャをひとまとめにしたい人等、
A型タイプの人にはオススメです。
golang で string を []byte にキャストしてもメモリコピーが走らない方法を考えてみる

> 追記: go1.9 でこの方法を使うと安定動作しない可能性があります

* [golang で string を []byte にキャストするとメモリコピーが走ります - Qiita](http://qiita.com/ikawaha/items/3c3994559dfeffb9f8c9)
* [メモ：golang で []byte と string の読み込みを透過的に扱う試行錯誤 - Qiita](http://qiita.com/ikawaha/items/2d58f58e4ab12918e8c9)

コピーしない方法は無くはないんじゃないかなーと思いまして筆を取りました。

golang では `[]byte(str)` をコンパイルすると `runtime.go` の `stringtoslicebyte` によりバイト配列にコピーされます。

```go:runtime.go
func stringtoslicebyte(s string) []byte {
	b := rawbyteslice(len(s))
	copy(b, s)
	return b
}
```

しかし実際に golang は内部で utf-8 な文字列を扱っている訳なので、そのまま取り出す方法さえあればいいはずなんですよね。

そこで `unsafe` の登場です...

![](http://go-gyazo.appspot.com/8865daced898478b.png)

これを使うと自らプログラムを破壊出来るんだ。

![](http://go-gyazo.appspot.com/4dc18c68a260b3e5.png)

内部のバイト列はもちろん...

```go:stringbytes.go
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	str := "hello, world!"
	vec := *(*[]byte)(unsafe.Pointer(&str))
	fmt.Println(vec)
}
```

ポインタ演算まで出来ちゃう！

```go:pointer.go
package main

import (
    "unsafe"
)

type foo struct {
    k int64
    v int64
}

func main() {
    f := &foo{3,4}

    // unsafe.Pointer() で匿名ポインタにして
    // uintptr() で演算可能にして
    // +8 バイト(64bit)足して
    // unsafe.Pointer で匿名ポインタに戻して
    // そこにはフィールド v があるはずなので *int64 にキャストして
    // デリファレンスすれば出来上がり
    *(*int64)(unsafe.Pointer((uintptr(unsafe.Pointer(f))+8))) = 5 // ｸﾞﾋﾋ

	println(f.v) // 5
}

```

ちなみに上記の `stringbytes.go` を `go tool 8g -S stringbytes.go` でアセンブラにしてみると...

```asm
	0x001c 00028 (stringbytes2.go:8)	LEAL	go.string."hello, world!"+0(SB),BX
	0x0022 00034 (stringbytes2.go:8)	MOVL	(BX),CX
	0x0024 00036 (stringbytes2.go:8)	MOVL	4(BX),BP
	0x0027 00039 (stringbytes2.go:9)	MOVL	CX,"".str+24(SP)
	0x002b 00043 (stringbytes2.go:9)	MOVL	CX,(SP)
	0x002e 00046 (stringbytes2.go:9)	MOVL	BP,"".str+28(SP)
	0x0032 00050 (stringbytes2.go:9)	MOVL	BP,4(SP)
	0x0036 00054 (stringbytes2.go:9)	PCDATA	$0,$0
	0x0036 00054 (stringbytes2.go:9)	CALL	,runtime.stringtoslicebyte(SB)
	0x003b 00059 (stringbytes2.go:9)	MOVL	8(SP),DX
	0x003f 00063 (stringbytes2.go:9)	MOVL	12(SP),CX
	0x0043 00067 (stringbytes2.go:9)	MOVL	16(SP),AX
```
※部分抜粋

この様にコードに落ちていたのが

```asm
	0x001c 00028 (stringbytes.go:9)	LEAL	go.string."hello, world!"+0(SB),BX
	0x0022 00034 (stringbytes.go:9)	MOVL	(BX),BP
	0x0024 00036 (stringbytes.go:9)	MOVL	BP,"".str+24(SP)
	0x0028 00040 (stringbytes.go:9)	MOVL	4(BX),BP
	0x002b 00043 (stringbytes.go:9)	MOVL	BP,"".str+28(SP)
	0x002f 00047 (stringbytes.go:10)	LEAL	"".str+24(SP),BX
	0x0033 00051 (stringbytes.go:10)	CMPL	BX,$0
	0x0036 00054 (stringbytes.go:10)	JEQ	$1,232
	0x003c 00060 (stringbytes.go:10)	MOVL	(BX),DX
	0x003e 00062 (stringbytes.go:10)	MOVL	4(BX),CX
	0x0041 00065 (stringbytes.go:10)	MOVL	8(BX),BP
```

こーんな形になるー！
これでコピー無しで文字列が扱える！
プログラムも高速になる！
だれも困らない！
みんなハッピー！
みんなどんどん使っていこう！

![](http://go-gyazo.appspot.com/ada2751761a2be22.png)

**unsafe をご使用になる時は、用法・用量を守り正しくお使い下さい。race conditionでもあり、あらゆるケースにおいてもGC-safeという訳ではありません。**
AWS CLIで複数アカウントのアクセスキーを管理して扱う設定

複数のAWSアカウントを管理しなければいけないけれど、CLIだと毎回 `aws configure`ってコマンド叩いて、管理したいアカウントのAccess Keyやらなにやらを設定しなければならないと思ったら気が狂いそう！
って調べてみましたら、やっぱりありました、複数のアカウントを扱う方法が。

`aws configure help`

で確認してみた所、以下の様な記載が。

`SYNOPSIS
           aws configure [--profile profile-name]
`

という事で、実際に試してみることに。

```
[user@server ~]$ aws configure --profile kwsmkn
AWS Access Key ID [None]: iamで取得したSecurity Credentialsから設定
AWS Secret Access Key [None]: iamで取得したSecurity Credentialsから設定
Default region name [None]: お好きなリージョンを設定
Default output format [None]: お好きなフォーマットを設定
```

設定完了後、確認してみると...

```
[user@server ~]$ less ~/.aws/config
[default]
output = json
region = ap-northeast-2
[profile kwsmkn]
output = json
region = ap-northeast-1
[fsop@kwsm-verify ~]$ less ~/.aws/credentials
[default]
aws_access_key_id = himitsu!
aws_secret_access_key = himitsu!
[kwsmkn]
aws_access_key_id = oshierarenai!
aws_secret_access_key = oshierarenai!
```

できてました！

これで複数アカウントのインスタンスも管理が出来るようになりました。
Windows 7 の Rails で ExecJS が TypeError を吐くようになった

※「原因」に加筆し，タイトルの「Windows」を「Windows 7」に変えた（2015/02/04）

# Rails アプリが軒並み死んだ

ある日突然，Rails がエラーを吐くようになった。

```
ExecJS::ProgramError TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。
```

ちなみに英語だと

```
ExecJS::ProgramError TypeError: Object doesn't support this property or method
```

のようだ。

`bundle update` をやったタイミングなのかどうか当初は分らなかったが，その日あたりからあらゆる Rails アプリが動かなくなっていった。

現象としては，`app/assets/javascripts` に `*.coffee` なファイルが一つでも入っているとエラーが出る。

ただ，「ある日突然」よりも前に `*.coffee` からコンパイルされて出来た JavaScript が `tmp/cache` に残っていて，生きている（元の `*.coffee` が変更されていない）限りはエラーは出ないようだった。

CentOS 上では大丈夫だった。

異常が起こったのはこんな環境：

* Windows 7
* ruby 2.1.5p273 (2014-11-13 revision 48405) [i386-mingw32]
* Rails 4.2, 4.1.8

# CoffeeScript が 1.8.0 から 1.9.0 になってた

Rails がエラーを吐くようになったのは，どうも 1 月末あたりっぽい。

そこで，この頃にアップデートした gem が何かを調べてみた。すると，coffee-script-source が 1 月 29 日に 1.8.0 から 1.9.0 に上がってた。これが怪しい。

この gem は，CoffeeScript の処理系を提供するためのものらしい。つまり，CoffeeScript スクリプトを読み込んで JavaScript スクリプトに変換してくれるコンパイラー（JavaScript で書かれている）がこの gem の中に入っている。

gem のバージョン番号は CoffeeScript のバージョン番号に合わせてあるようだ。

# coffee-script-source を 1.8.0 に戻す

Rails の Gemfile には coffee-script-source はあらわには書かれていない。

Gemfile に書かれているのは coffee-rails で，こいつが coffee-script に依存し，coffee-script が coffee-script-source に依存しているのだった。

そこで，Gemfile にあらわに

```rb
gem 'coffee-script-source', '1.8.0'
```

と追記してやると，正常に動くようになった。

ふぅ。この問題で半日以上つぶれた。

# 原因

TypeError が出た原因は私には分らない。

CoffeeScript 1.9.0 で何か非互換な変更が行われたのだろう。

Windows で問題が起こり，CentOS で起こらなかったのは，JavaScript の処理系の違いなのかな。

Rails は CoffeeScript を処理するため，JavaScript の処理系を必要とする。実際に JavaScript を実行させるのは ExecJS という gem の役目らしい。

ExecJS はその環境で使える JavaScript の処理系を自動的に選んで動かしてくれるのだとか。

Windows と CentOS で選ばれた JavaScript 処理系が違ったのではないかと思うが，詳細は分らない。

ともかく Rails は関係なくて，

```rb
gem "coffee-script-source", "1.9.0"
require "coffee-script"

p CoffeeScript.compile("x=1")
```

という簡単なコードでエラーが再現できることが分った。（`1.9.0` を `1.8.0` にするとエラーは出ない）

## 追記：もうちょっと分った（2015/02/04）

TypeError の直接の原因は，CoffeeScript 1.9.0 で `Object.create` を使っていることっぽい。1.8.0 ではこれは使っていなかった。

ちなみにブラウザーの JavaScript エンジンで `Object.create` がサポートされたのは，Firefox なら 4.0，InternetExplorer なら 9.0（いずれも 2011 年リリース）から。

ということは，話がそれるけど，ブラウザー上で CoffeeScript の処理系を直接動かすような使い方をすると，IE8 以下は切り捨てることになるのだろう。

それから，ExecJS が Windows の cscript というコマンドを使って OS の JScript 処理系を呼び出していることも分った。`cscript` に `//E:jscript` というパラメーターを渡し，スクリプトエンジンとして JScript を指定しているらしい。

Windows 7 が出たのは IE8 の時代だから，`cscript` で呼ばれる JScript が `Object.create` に対応してないバージョンというのは，原因としていかにもありそう。

新しい IE を入れても `cscript` で新しい JScript が呼ばれたりはしないのね。

## 追記：Windows 10 もダメ（2016/04/20）

Windows 10 に上げたので同じことをやってみたら，やっぱりダメだった。

「JavaScript の処理系が新しくなって，CoffeeScript 1.9.0 以上でもエラーが出なくなる」と予測していたので，これは意外だった。

# 教訓

気軽に

```
bundle update
```

とかやるとエラい目に遭うこともあると分った。

ただ，気軽に `bundle update` してなかったら，問題に気づくのがずっと先になり，今より対処に時間がかかっていたかもしれない。変更になった gem も多かっただろうし。

だから，やってよかったのだけど，タイミングがまずかった。他の仕事で忙殺されてたり，気持ちに余裕のないときにやるべきではなかった。

`bundle update` した直後にエラーが出るようになったんなら，私でもすぐに分ったかもしれないけど，今回は JavaScript のキャッシュが生きている（？）間はエラーが出なかった（らしい）のがつらかった。