OmniAICreator/Qiita-1.07M huggingface dataset:
paperclipとS3で画像をアップロード

AWSクラウドストレージサービスのS3を用いて、paperclipでアップロードした画像をheroku上で表示されるようにする。
Paperclipは画像だけでなく各種ファイルをアップロードする機能をRailsアプリケーションに組み込むことのできるgemです。

前提条件 
・AWSのアクセスキーとシークレットキーを持っている
・AWSでBUCKETを作成済み

今回はProjectテーブルのimageカラムに適用させていきます。
まずimageカラムを作成

```:command
$ bundle exec rails g migration AddAttachmentImageToProject
```

```rb:7834653827_add_attachment_image_to_projects.rb
class AddAttachmentImageToProjects < ActiveRecord::Migration
  def self.up
    change_table :projects do |t|
      t.attachment :image
    end
  end

  def self.down
    remove_attachment :projects, :image
  end
end

```

```:command
$ rake db:migrate
=> image_file_name,
    image_content_type ,
    image_file_size,
    image_updated_at
の4つのカラムをpaperclipで作ってくれる
```


```rb:Gemfile
gem 'paperclip', '~> 5.0'
gem 'aws-sdk', '~> 2.3' # AWS

```

$ bundle install

##s3の設定
```rb:config/environments/production.rb


Rails.application.configure do
  
  `
  `
 
  # s3の設定

  config.paperclip_defaults = {
  :storage        => :s3,
  :bucket         => ENV['S3_BUCKET_NAME'],
  :s3_region      => ENV['AWS_REGION'],
  :s3_host_name   => 's3-ap-northeast-1.amazonaws.com',
  :s3_credentials => {
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  }
}
  
end
```

##モデルに画像情報を追記
Projectテーブルのimageカラムに指定しています

```ruby:app/models/project.rb

class Project < ActiveRecord::Base

  has_attached_file :image, 
                    :path => ":attachment/:id/:style.:extension",
                    styles: { medium: "680x300>", thumb: "170x75>" }, 
                    default_url: "/images/:style/missing.png" 

  validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/ # 
end
```


```rb:config/initializers/paperclip.rb
Paperclip::Attachment.default_options[:url] = 's3user-magict2017.s3.amazonaws.com' # '[バケット名].s3.amazonaws.com'という形にすると良いっぽいです。
```

###herokuに環境定数を設定する
```
$ heroku config:set S3_BUCKET_NAME=your_bucket_name 
$ heroku config:set AWS_ACCESS_KEY_ID=your_access_key_id
$ heroku config:set AWS_SECRET_ACCESS_KEY=your_secret_access_key
$ heroku config:set AWS_REGION=your_aws_region
```

```:command
$ heroku config     # 環境変数の設定を一覧で確認できる
```

ここまでできたら設定は終了です。
好きなようにviewから呼び出して見てください

```:commmand
$ git add .
$ git com -m 's3'
$ git push origin master
$ git push heroku master
$ heroku run rake db:migrate
```

herokuでエラー出たら
$ heroku logs -t　でログを確認ください

参考URL
https://devcenter.heroku.com/articles/paperclip-s3
http://blog.kakeragames.com/2016/02/03/heroku-paperclip-s3.html
http://ruby-rails.hatenadiary.com/entry/20140716/1405443484
54歳おばさんプログラマーのゆめ～死ぬまでプログラマーでいたい

私は、プログラムを組むのが好きだ。
コードを書き、動かして、デバッグする。とてもワクワクする作業だ。

30数年前、ヒョンなことからプログラマーになり、アセンブラ、C、UNIX、さらには組み込みの手作りOSをアセンブラで作るなど、みっちり基礎を習得した。

しかし、９年勤めて、やめた。

やめた理由は２つある。

１つ目は、典型的なダメダメ男社会だからだ。
上司のご機嫌をとって、おしゃべり（説教や自慢話）に付き合い、ダラダラと遅くまで会社に居残る奴が出世していく。
私は、サッサと仕事を終わらせて帰った。と言っても連日、帰りは夜の８時９時だった。残業代などもちろん無く、休日出勤も当たり前だった。
特に、後輩の男は、仕事ができないとまでは言わないが、とても調子のいい奴で、上司に気に入られて、私より先に主任になったので、ほとほと嫌気がさした。

２つ目は、出産。
当時は、女は結婚して子供を産むのが普通だった。しかも、『三歳児神話』なんてものがあり、「３歳までは母親が育てるべき」という世間のプレッシャーもあった。
それでなくても、無駄な長時間労働が当たり前の業界では、働きたくても働き続けるのは無理だった。
２人産んだ。計６年間、子どもにべったり。その間に、業界は劇的に変化していった。

やっと子どもの手が離れ、たまたまPHPとMysqlに出会った。やってみたら結構いける。勘は鈍ってなかったのだ。

ちょうどいいチャンスがあったので、頑張って就職した。２０数年ぶりの社会復帰だ。

もちろん、当時とは、開発環境やツールがまったく違い、知らないことばかりだったが、そこはそれ、基礎があるので、それ程慣れるのには時間はかからなかった。
１年後には、PMを任された。（たぶん、PMというのは、自分がそう思ってるだけだろう）

20数年のブランクを経て、めでたくプログラマーとして就職し、今はプログラマーとして働いている。しかし、ちょっと前に、正社員からパートに切り替えさせてもらった。
会社としては、パートでは使いづらいらしく、今は、たいした仕事は回ってこなくなった。

パートに切り替えた理由は、男たちの労働意識だ。

男たちの働き方は30年前となんら変わらず、無駄な長時間労働を当然として、なんの疑問も持たないらしい。

それに、SEとプログラマーは、全く違う職種だ。協力は必要だが、どっちが偉いというものではない。と、私は思っているのだか、男はどうも、どっちが偉いか決めたいらしい。
プログラマーは、下なのだ。たぶん、テスターはさらに下だろうと推測される。

同じ会社に、同世代位の女性がいるのだが、彼女は、テストやドキュメント作りなど、（補助的な？）仕事をしている。若い頃は、バリバリ組んでいたらしいが、今はやろうとしない。
パートで週３日勤務だ。気持ちはわかる気がする。しかし、私はプログラムを作りたいのだ。

某会社で、週３日～のプログラマーを募集していたので、問い合わせしてみた。

「54歳 女 週３日勤務希望ですが、採用の可能性はありますか？」

すると、こんな答えが返ってきた。

「年齢的には、多少厳しいが、スキル次第では可能性あり。しかし、週３日は厳しいですね。どうして週３日なんですか？」

私は、仕事も生活も大事にしたい。

それに、ロクに休みも取らず、連日遅くまで会社にいるより、しっかり休んで心身ともに余裕がある方が、いいプログラムが書けると思っている。だから、週３日希望なのだ。
もちろんそんな事は言わなかった。そんな会社はこっちからお断りだ。

そもそも、プログラマーは、センスとアイデア、好奇心があれば、誰だってできる。

男でも女でも、若くても年をとっていても。車椅子でも、耳が聞こえなくても、あるいは、今時は出勤する必要さえない。打ち合わせもスカイプで十分だ。

誰でも、どこでも、センスとやる気さえあればできるのに、それが、なぜだか、許されていないのは、非常に不可解だ。

きっと、世の中に埋もれている才能は、たくさんあるはずなのに、とんでもない損失だと、男たちは何故気が付かないのだろう？？

死ぬまでプログラマーでいたい。それが、私の切なる願いだ。出勤できなくたって、プログラマーはできるのだ。

人間は、働く場を奪われることによってボケる。死ぬまで働いていれば、ボケる事はないのだ。と、思う。

男どもが作った、日本のクソな労働環境を変えていこう！
女性も、老人も、障がい者も、自分のスキルを活かして、生き生きと幸せに働ける労働環境を作るには、どうしたらよいものか？

追記 ［2017-8］
会社に、実務経験なしの新人君が入社したのだが、社長や古参の男性社員たちは、電話番とお茶出しをどうしても女の私にやらせたいらしく、不当な圧力に辟易したので、社長には、「女性差別はお断りです。」と伝え、今のところ会社へは行かず、社長からの連絡待ち状態である。
会社自体、仕事もないらしいしね・・・。

追記［2017-11］
退職手続き完了。

追記［男女差別エピソード］［2017-12］
今思えば、男性は、実務経験なしの新人君も含め、全員パソコンのほかにモニターも用意されていたのに、私はリーダーをしていた時も含め、最後までパソコンだけだった。当時は気にも留めなかったが、これって明らかに男女の待遇差別ですね。

追記[2023-09-01]
投稿してから6年、今60歳です。今もプログラマーとして働いています
githubでブランチ名を変更する（ローカル/リモート）

githubでブランチ名を変更しリモートに反映させる手順

**ブランチ名をhogeからfugaに変更する**

## 1.ローカルのブランチ名を変更する

```ruby:terminal
$ git branch -m hoge fuga
```

※現在使用しているブランチ名を変更する場合は下記でOK

```ruby:terminal
$ git branch -m fuga
```


### 2.リモートのブランチを削除

```ruby:terminal
$ git push origin :hoge
```


### 3.ブランチ名を変更したローカルブランチをプッシュ

```ruby:terminal
$ git push origin fuga
```
MSYS2でシンボリックリンクを作れるようにしてみた


## 状況

**MSYS2** はデフォルトの状態ではシンボリックリンクを作成する事ができません

## 対応

MSYS2 の起動スクリプトを変更し、管理者モードで起動した後にシンボリックリンクを作成します。

## 手順

`msys64/msys2_shell.cmd` を修正します。適当なエディタで開きます。
以下の箇所のコメントを外します:

変更前
```
rem set MSYS=winsymlinks:nativestrict
```

変更後
```
set MSYS=winsymlinks:nativestrict
```

次に変更した **msys2_shell.cmd** を右クリックし `管理者として実行` を選択し起動します。

開いたコンソールから `ln` コマンドでシンボリックリンクを作成します

```
$ ln -s /c/Users/[ユーザ名]/Desktop ~/Desktop
$ ls -l ~/Desktop
lrwxrwxrwx 1 [ユーザ名] なし 25 1月   5 10:38 /home/[ユーザ名]/Desktop -> /c/Users/[ユーザ名]/Desktop
```

## まとめ

MSYS2でシンボリックリンクが作れるようになると、CLI生活が捗りますね
Time-based One-Time Password (TOTP) ワンタイムパスワード

## 2 STEP / 2 FACTOR AUTHENTICATION

- Github : https://help.github.com/articles/configuring-two-factor-authentication-via-a-totp-mobile-app/

- Google **2 step verification** is not **2 factor authentication**
    -  https://www.google.com/intl/en/landing/2step/#tab=how-it-works
    -  https://www.google.com/intl/ja/landing/2step/#tab=how-it-works

- Swivel Secure UK https://swivelsecure.com/products
- Swivel Secure 日本総代理店 http://www.securitystrings.com/products/sw/product/2fa.html

## ハードウェアトークン

- [x] みずほ銀行　https://www.mizuhobank.co.jp/direct/security/password_card/index.html
    -  ![みずほ銀行](https://www.mizuhobank.co.jp/direct/security/password_card/images/index_01.jpg)

- [x] ゆうちょ銀行 http://www.jp-bank.japanpost.jp/direct/pc/security/token/dr_pc_sc_token.html
    - ![](http://www.jp-bank.japanpost.jp/direct/pc/security/token/images/about_token1.gif)
- [x] 三菱東京UFJ銀行 http://direct.bk.mufg.jp/secure/otp/app.html
    - ![](http://direct.bk.mufg.jp/secure/otp/imgs/card_img02.jpg)
- [x] 三井住友銀行 http://www.smbc.co.jp/kojin/direct/securi/passca/
    - ![](http://www.smbc.co.jp/kojin/direct/securi/passca/resources/images/index_img01.png)
- [x] りそな銀行 http://www.resonabank.co.jp/direct/otp/hard.html
    - ![](http://www.resonabank.co.jp/direct/otp/imgs/hard/img02.png)
- ソニー銀行、ジャパンネットバンク銀行なども

## メール認証/スマートフォンアプリ
- [x] みずほ銀行　https://www.mizuhobank.co.jp/direct/security/password_card/index.html
    -  ![みずほ銀行](https://www.mizuhobank.co.jp/direct/security/password_app/images/bnr_security_onetime_161010.jpg)
- [ ] ゆうちょ銀行 **メールによるワンタイムパスワード**
    - ![](http://www.jp-bank.japanpost.jp/direct/pc/security/images/onetimepassword_img01.jpg)
- [ ] 三井住友銀行 http://www.smbc.co.jp/kojin/spaplli/passca/
    - ![](http://www.smbc.co.jp/kojin/spaplli/passca/resources/images/index_img01.jpg)

- [ ] 三菱東京UFJ銀行 http://direct.bk.mufg.jp/secure/otp/app.html
    - ![](http://direct.bk.mufg.jp/secure/otp/imgs/app_img18.jpg)

- [ ] りそな銀行 http://www.resonabank.co.jp/direct/otp/hard.html
    - ![](http://www.resonabank.co.jp/direct/otp/imgs/soft/img01.png)

- こちらも各銀行がアプリ提供済
React Storybookを自分のライブラリに導入して感じた事など

作りっぱなしになっていたReactのコンポーネントをこの年末年始にStorybookの導入してCIも回した。

導入したコンポーネントライブラリはこちら
https://github.com/airtoxin/react-hex
https://github.com/airtoxin/react-triangle

## 導入

```bash
npm i -g getstorybook
getstorybook
```

以上。
プロジェクトのトップでgetstorybookコマンドを実行するとdependencyが追加されたりnpm scriptsが書き足されたりしてボイラープレートが追加されるので、その後 

```bash
npm run storybook
```
してstoryを書き足してゆくだけ。

## DecoratorとInfo addon

decorator addonはデフォルトで入っているstorybookのアドオンで、各storyで返すReact componentを包むみたいな事が出来る。
今回導入した2つのリポジトリはどちらもsvgの要素自体を返すので、表示するためにはsvgタグで包んでやる必要がありdecoratorを使って

```js
storiesOf('Hex', module)
  .addDecorator(story => (
    <svg width="500" height="500">
      {story()}
    </svg>
  ))
  .add(...)
```

みたいな事が出来ると、毎回storyの定義にsvgタグを書かずに済んでハッピーかなと思った。

一方のInfo addonはkadira公式が出している追加のアドオンで、それぞれのstory毎に注釈を追加したり、どのように描画されているのかコードを表示したり、PropTypesを見てそれをサマリー表示してくれたりする。
簡易APIリファレンスとして使えるようなやつ。

どちらも導入したかったが食合せが悪く、storyで開発者が返したコンポーネントにInfoが色々追加した後にデコレートが行われるようで、svgの中に不正なタグが含まれたりしてしまい上手く動かなかった。
現在githubにissueが立っているのでそのうち解決されるかもしれないが、直近でいじろうとしているなら注意したほうが良い。

## スナップショットテスト

storybookはコンポーネントのショーケースなので、そのままスナップショットテストに使うことも出来る。
`@kadira/storyshots` をインストールして 

```bash
storyshots
``` 

コマンドを実行すると初回に現在のstorybookの状態をスナップショットとして保存し、2回目以降はそのスナップショットと現在のstorybookの状態とで差分が有るかをテストしてくれる。
真面目にやるならE2Eみたいなテストが必要なところだが、コンポーネントライブラリ程度でそれをやるのは大掛かり感が否めないのでこれくらいが手軽でちょうどよかった。
ただあくまで見た目のテストなのでイベントハンドリングが出来るかみたいな動作テストはenzymeなどでやる必要がある。

またCIで回すにあたって、storyのうちランダム性のあるものは `seedrandom` ライブラリを使ってランダム値の生成をし、シード値には `process.env.NODE_ENV` を使ってやるようにした。
テスト実行時に `NODE_ENV=test storyshots` などとすればスナップショットテストの際はシード値が固定され毎回同じ結果が得られるので毎回差分に悩まされたりしない。
ちなみに実行自体はnodeで行われるのでbabelやwebpackなどで環境変数を埋め込んでやる必要はない。

## Storybook Hub

ここまでテストが出来たらあとはCIで回すだけ。
せっかくstorybookがあるのでプルリクエストがあった時に現在のstorybookの状態をプレビュー出来ると嬉しい。
それが出来るのが [Storybook Hub](https://hub.getstorybook.io/) で、サインアップ後に言われるがままに設定するといつの間にかプルリクエストがある度にstorybookをビルドしてプレビューを公開してくれるようになる。 [例](https://github.com/airtoxin/react-hex/pull/10)
個人で公開リポジトリで使う分には無料で使えるらしいので設定しておいても損はない。

## Github Pagesで公開

作ったstorybookはgithub pagesとして公開したい。
そんな時には `@kadira/storybook-deployer` をインストールして

```bash
storybook-to-ghpages
```

を実行するだけ。

因みに現在のstorybookでは左上のロゴマークををライブラリのgithubへのリンクに変更するみたいな事はできないので、
https://github.com/Personare/react-storybook-decorator-github-corner
を導入してgithubへのリンクを追加するのが親切。

## まとめ

storybookに関して、現状ではaddon apiの種類が少ないので好き勝手に拡張するみたいな自由性は無いが、動くサンプルとして公開する事や簡易APIリファレンスとして公開する事などはほぼ流れ作業で出来るようになっている。
内部で色々やっている感じはするがそんな事は意識せずに、開発者はただコンポーネントを返すようにstoryを書くだけで良いのが本当に楽。
導入のコストが低い割には得られる効果が高く、かなりよく出来ていると感じた。
htaccessを使わずにurlの拡張子を消す方法


#方法

ディレクトリを作って、その中にindex.htmlを作る。

##例

```
hoge
　├ index.html
　├ detail
　│　└ index.html
　└ map
   　└ index.html
```

こんな感じにすれば `detail` や `map` でアクセスできるようになる！
【VirtualBox編】Windows Server 2012 R2にWordPressをインストールする

# VirtualBox

## バージョン
VirtualBox バージョン 5.0.30

# サーバー OS

## 参考資料

> ▼Windows Server 評価版ソフトウェア
> https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-server-2012-r2

> ▼Windows OSのライセンス認証の猶予期間を延長する
> http://www.atmarkit.co.jp/ait/articles/1005/28/news108.html
> 評価版のライセンスが切れてしまったら
> ```C:\>slmgr -rearm```

## バージョン
Windows Server 2012 R2（64bit）
9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_JA-JP-IR3_SSS_X64FREE_JA-JP_DV9.ISO

## インストール
「Windows Server 評価版ソフトウェア」のページよりisoファイルをダウンロードしてインストールする。

# WordPress

## 参考資料

> ▼Microsoft IIS サーバーへのインストール
> https://wpdocs.osdn.jp/Microsoft_IIS_%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

> ▼わがまま？WordPressをIIS上で使いたい！
> http://ascii.jp/elem/000/000/529/529138/

## インストール
Web Platform Installerを使って「WordPress 日本語版」をインストールする。簡単。

【注意】
ウェブページが表示されなかった場合はPHPのランタイムを疑います。
「php-cgi.exe」を直接ダブルクリックすると「VCRUNTIME140.dll」がないと言われたら、
https://www.microsoft.com/ja-jp/download/details.aspx?id=48145へ行って、対応するプログラムをダウンロードする。

ちなみに、「Program Files(x86)」フォルダ内にPHPがインストールされたので「vc_redist.x86.exe」をインストールした。
Ubiregi APIのcurlサンプル

Ubiregi Apiのドキュメントを読んでcurlサンプル作ったのでメモ。
Authenticationはwith API tokenを使用。

# Ubiregi API

## Account
```shell-session
curl --request GET \
  --url https://ubiregi.com/api/3/accounts/current \
  --header 'x-ubiregi-auth-token: api_token'
```
*api_token*はユビレジのアカウントを作成して「設定」→「システム連携」からAPI アクセストークンを作成する。

## MenuItem
```shell-session
curl --request GET \
  --url https://ubiregi.com/api/3/menus/menu_id/items \
  --header 'x-ubiregi-auth-token: api_token'
```
*menu_id*はAccountの結果で*menus*を参照する。

## Categry
```shell-session
curl --request GET \
  --url https://ubiregi.com/api/3/menus/menu_id/categories \
  --header 'x-ubiregi-auth-token: api_token'
```

## Customer
```shell-session
curl --request GET \
  --url https://ubiregi.com/api/3/customers \
  --header 'x-ubiregi-auth-token: api_token'
```

## Checkout
```shell-session
curl --request GET \
  --url 'https://ubiregi.com/api/3/accounts/current/checkouts/close?since=2017-1-1T00%3A00%3A00&until=2017-1-1T24%3A00%3A00' \
  --header 'x-ubiregi-auth-token: api_token'
```
*since*と*until*で指定期間のデータを取得。

## PaidInOut
```shell-session
curl --request GET \
  --url https://ubiregi.com/api/3/accounts/current/paid_inouts \
  --header 'x-ubiregi-auth-token: api_token'
```

## StockEvent
```shell-session
curl --request GET \
  --url https://ubiregi.com/api/3/accounts/current/stocks/events \
  --header 'x-ubiregi-auth-token: api_token'
```

## CustomrtNote
```shell-session
curl --request GET \
  --url 'https://ubiregi.com/api/3/customers/notes?since=2017-1-1T00%3A00%3A00&until=2017-1-1T24%3A00%3A00' \
  --header 'x-ubiregi-auth-token: api_token'
```
*since*と*until*で指定期間のデータを取得。
RancherOSをBoot from ISOした手順


# 背景
個人的なことですが，2016年に，仮想マシンにいろいろなアプリを入れて動作確認をしていました．
いろいろなアプリを簡単に管理するために，RancherOSを使ってみようと思いました．

# 関連記事
RancherOSの日本語の記事を参考にしました．
[【Docker】RancherOSで本格的な自宅サーバーを構築しよう(1) ~ 要件と構成 ~](http://qiita.com/okamu_/items/da52b4dc12221feca55c)
[RancherOSをCDブートで運用](http://qiita.com/tukiyo3/items/548d67b5aa5a308aac40)

Rancher自体の説明は次のスライドがおもしろかったです．
[インフラエンジニアのためのRancherを使ったDocker運用入門](http://www.slideshare.net/zembutsu/docker-operation-and-introduciton-rancher-qpstudy-2015-06)

他にもDockerのわかりやすい説明がSlideShareにあり，読ませていただいています．
役に立つ情報を公開されている方々に，感謝しています．

# 目標
次の状況を目標として環境を作る．

- VMWare上でRancherOSが動作している
- ISOからブートとする
- Rancherの管理画面に普通のブラウザからアクセスできる

# バージョン等
## VMWare
VMWare Fusion 8.1.1を使っています．
## RancherOS
次のアドレスから2017年1月3日にダウンロードしたもの（v0.7.1, md5=eb58ac4958cf66bb9c2675cd7e565419）
https://releases.rancher.com/os/latest/rancheros.iso
## その他
`docker pull`的なものによってダウンロードされたデータもあるでしょうがこの日の前後に作業をしました．

# 手順
## 1. VMWareの設定
仮想マシンは次のようなところを設定しました．

||値|
|:----|:----|
|メモリ|4,096MB|
|ネットワークアダプタ|自動検出|
|CD/DVD|rancheros.iso|
|起動ディスク|CD/DVD|
|ハードディスクバスタイプ|IDE|
|ハードディスクサイズ|20GB|

## 2. ファイルシステムの作成
ISOからブートだと何もしないとHDDを使ってくれないため，アプリのインストール時に容量不足が発生しました．そこで，HDDを使ってくれるような設定をします．
次のように入力します（1行目でパーティション作成，2行目で再起動）．

```
sudo mkfs.ext4 -L B2D_STATE /dev/sda
sudo reboot
```

### 注意

[ドキュメント](https://docs.rancher.com/os/running-rancheros/workstation/boot-from-iso/)には次のように書いてあります．ここではパーティションのラベルを`RANCHER_STATE`にするようにと書いてあります．私の場合は`RANCHER_STATE`としてもだめでしたが，`B2D_STATE`としたところ，うまくできました．

> If you are running from the ISO, RancherOS will be running from memory. All downloaded Docker images, for example, will be stored in a ramdisk and will be lost after the server is rebooted. You can create a file system with the label RANCHER_STATE to instruct RancherOS to use that partition to store state.

再起動時に次のメッセージが表示されれば設定は成功です．

```
INFO[0000] Mounting state device /dev/sda to /state
```

また，`_`という文字はUS配列では`Shift + -`で入力できました．

## 3. ターミナルから入る

普段使っているターミナルから操作できるように，sshの設定を行いました．

### ssh_configの編集
`/etc/ssh/ssh_config`の25行目に次の行があるので，先頭の`#`記号を削除する．

```
#   PasswordAuthentication yes
```

### パスワードの設定
次のように入力してパスワードを設定します．

```
[rancher@rancher ~]$ sudo passwd rancher
Changing password for rancher
New password: (rancherと入力)
Bad password: similar to username
Retype password: (rancherと入力)
passwd: password for rancher changed by root
[rancher@rancher ~]$
```

### ターミナルから接続
私は普段`ssh`コマンドで接続しますので，次のようにします．

```
$ ssh (IPアドレス) -l rancher
The authenticity of host '(IPアドレス)' can't be established.
ECDSA key fingerprint is (略).
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '(IPアドレス)' (ECDSA) to the list of known hosts.
rancher@(IPアドレス)'s password: (rancherと入力)
[rancher@rancher ~]$ 
```

## 5. rancher/serverを起動
次のコマンドで起動できます．

```
docker run -d -p 8080:8080 rancher/server
```

## 6. Rancher画面を表示
しばらくしたら，ブラウザのアドレス欄に次のように入力し，Rancherの画面が表示されることを確認します．

```
http://(IPアドレス):8080/
```
BitcoindのBlockHeightが更新されないときの対応

久々にbitcoindを動かしたら、なぜかBlock Heightが更新されなかったので原因調査。

# 環境
MacOS Sierra (10.12)
実行日：2017-01-05
bitcoind: 0.13.0

# 事象
```
osada@mbp16a% bcr getinfo
[warn] kq_init: detected broken kqueue; not using.: Undefined error: 0 # <-　なんだろうか？
{
  "version": 130000,
  "protocolversion": 70014,
  "walletversion": 60000,
  "balance": 2.44580834,
  "blocks": 970219, # <- ここ
  "timeoffset": 0,
  "connections": 8,
  "proxy": "",
  "difficulty": 1,
  "testnet": true,
  "keypoololdest": 1463718812,
  "keypoolsize": 101,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}
```

なんかエラーが出てるっぽい。

# 対応
libeventを再インストール

```
osada@mbp16a% brew reinstall libevent
==> Reinstalling libevent
==> Downloading https://homebrew.bintray.com/bottles/libevent-2.0.22.sierra.bott
######################################################################## 100.0%
==> Pouring libevent-2.0.22.sierra.bottle.1.tar.gz
🍺  /usr/local/Cellar/libevent/2.0.22: 734 files, 2.0M
```

# 結果
更新ができました。めでたしめでたし。

```
osada@mbp16a% bcr getinfo
{
  "version": 130000,
  "protocolversion": 70014,
  "walletversion": 60000,
  "balance": 2.44580834,
  "blocks": 991327,    # <- ここ
  "timeoffset": 0,
  "connections": 2,
  "proxy": "",
  "difficulty": 531987.5528167652,
  "testnet": true,
  "keypoololdest": 1463718812,
  "keypoolsize": 101,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}
```
ショートカットを活用しよう - 4 - Win + R

# <kbd><kbd>Win</kbd> + <kbd>R</kbd></kbd> の効果
* <kbd><kbd>Win</kbd></kbd>はWindowsのロゴマークのキーのことです。（大抵のキーボード配列で左下の<kbd><kbd>Ctrl</kbd></kbd>のとなりにありますよね。）

[ファイル名を指定して実行]ダイアログを表示します。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/65065886-aab6-b7f3-fd60-9271ba5713a8.png)

後は、コマンドでプログラムを呼び出すなり使い方は自由です。
例えば、次のような感じです。（Windows 7 環境で確認）

|コマンド|内容|
|:--|:--|
|cmd|コマンドプロンプトを起動|
|notepad|メモ帳を起動|
|wordpad|ワードパッドを起動|
|mspaint|ペイントを起動|
|excel|(あれば) MS Excelを起動|
|winword|(あれば) MS Wordを起動|
|mmc|管理コンソールの起動|
|regedit|レジストリエディターを起動|
|msconfig|システム構成の起動|
|dxdiag|DirectX診断ツールの起動|
|eventvwr|イベントビューアーの起動|
|perfmon|パフォーマンスモニターの起動|
|wbemtest|WMIテストの起動|

自分で起動したいプログラムのショートカットをどこぞのフォルダに用意して、パスを通して利用するなんて手もあるかと思います。

以上


|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Win</kbd> + <kbd>Pause</kbd></kbd>](http://qiita.com/rrryutaro/items/9c52aeae912f013654a6)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Alt</kbd> + <kbd>↓</kbd></kbd>](http://qiita.com/rrryutaro/items/fa8d5a22506644f34acc)|
Laravel MassAssignmentException が出るときの対処法

# MassAssignmentException

新しく独自でモデルクラスを作ってデータをSaveしようとすると遭遇しやすいです。

Modele クラスには、**必ず** 下記のいずれか片方が必要になります。

```Contact.php
class Contact extends Model
{
    /**
     * create()やupdate()で入力を受け付ける ホワイトリスト
     */
    protected $fillable = ['name', 'email'];

    // or

    /**
     * create()やupdate()で入力させない ブラックリスト
     */
    protected $guarded = ['id', 'is_admin', 'created_at'];
}
```
html-webpack-pluginでfront-matterを挿入


html-webpack-pluginで生成したhtmlにfront-matterを挿入したい。

以下は`hoge/index.html`に`permalink: /hoge/`を追加する例。
気が向いたらちゃんとnode moduleにするかもしれない。(汎用的なものがみつからなければ)


```
var yaml = require('js-yaml');
var filename = 'hoge/index.html'

function InjectPermaLinkPlugin() {
}

InjectPermaLinkPlugin.prototype.apply = function(compiler) {
    compiler.plugin('compilation', function(compilation) {
        compilation.plugin('html-webpack-plugin-after-html-processing', function(htmlPluginData, callback) {
            if (htmlPluginData.outputName == filename) {
                htmlPluginData.html = "---\n" + yaml.dump({permalink: '/hoge/'}) + "---\n" + htmlPluginData.html;
            }
            callback(null, htmlPluginData);
        });
    });
};
var minify = {} // 省略
var config = {
  plugins:[
    new HtmlWebpackPlugin({
      inject: true,
      filename: '2017/index.html',
      template: 'public/2017/index.html',
      minify: minify
    }),
    new InjectPermaLinkPlugin(),
  ]
}
```

# もっとくわしく

## いきさつ

GitHub Pages + Jekyllな環境で、`hoge.github.io/hoge/`みたいなスラッシュで終わるURLにHTMLを表示したい。

`/hoge/index.html`を用意しても表示されなかった。

多分レアケースな状態。

そのためには

```
---
permalink: "/hoge/"
---
```

みたいなfront-matterをいれると解決できそうだった。

そこで[html-webpack-plugin](https://github.com/ampedandwired/html-webpack-plugin)と連携するwebpack pluginを用意した。

## 調べたこと

minifyする前に挿入してもうまくいかないので、minify後に先頭に挿入する。

ソースコードを確認するとminifyはpostProcessHtmlで処理される。Promiseを返している。
https://github.com/ampedandwired/html-webpack-plugin/blob/v2.24.1/index.js#L274-L296

postProcessHtmlを使っているところを確認。`html-webpack-plugin-alter-asset-tags`イベントより後であればminifyされてると考えられる。
https://github.com/ampedandwired/html-webpack-plugin/blob/v2.24.1/index.js#L153


postProcessHtmlより後に発火するイベントを確認する。

* html-webpack-plugin-after-asset-tags
* html-webpack-plugin-after-html-processing
* html-webpack-plugin-after-emit

イベントはhtml-webpack-pluginのREADMEにかいてある。
https://github.com/ampedandwired/html-webpack-plugin#events

`html-webpack-plugin-after-html-processing`で処理されるのがよさそうな気がする。
https://github.com/ampedandwired/html-webpack-plugin/blob/v2.24.1/index.js#L164

[あとはREADMEのevetsの下部にある例を参考にした](https://github.com/ampedandwired/html-webpack-plugin/tree/v2.24.1#events)
Android Thingsを日本語に対応させる

# Android Thingsの日本語対応
Android ThingsはIoT向けとなっている為、構成がシンプルになっており、日本語フォントが入っていません。
画面表示がなければ問題ないのですが、日本語やその他の言語を表示したい場合には、フォントを導入する必要があります。

# Android Thingsにインストールされているフォント一覧

```
% adb shell ls -la /system/fonts/
total 40280
drwxr-xr-x  2 root root     4096 2017-01-02 14:09 .
drwxr-xr-x 14 root root     4096 2016-12-12 21:10 ..
-rw-r--r--  1 root root     4540 2016-12-12 21:09 AndroidClock.ttf
lrw-r--r--  1 root root       15 2016-12-12 21:15 DroidSans-Bold.ttf -> Roboto-Bold.ttf
lrw-r--r--  1 root root       18 2016-12-12 21:15 DroidSans.ttf -> Roboto-Regular.ttf
-rw-r--r--  1 root root  3451744 2016-12-12 21:09 DroidSansFallback.ttf
-rw-r--r--  1 root root   108128 2016-12-12 21:09 DroidSansMono.ttf
-rw-r--r--  1 root root   305952 2016-12-12 21:09 Roboto-Bold.ttf
-rw-r--r--  1 root root   306672 2016-12-12 21:09 Roboto-Regular.ttf
```

# mountコマンドでマウント状態を確認
**/system/fonts**に書き込むことができるかを確認します


```
% adb shell mount
/dev/root on / type ext4 (ro,seclabel,relatime,data=ordered)
```
通常のAndroid端末同様にリードオンリーでマウントされています。

# ファイルシステムに書き込めるようにマウントし直す

```
% adb root
restarting adbd as root

% adb connect 192.168.0.100
connected to 192.168.0.100:5555

% adb remount
remount succeeded
```

```
% adb shell mount
/dev/root on / type ext4 (rw,seclabel,relatime,data=ordered)
```
roからrwに変わり、書き込みができるようになりました

# フォントファイルをダウンロード
https://www.google.com/get/noto/#sans-jpan
から**Noto Sans CJK JP**をダウンロードします（Androidのデフォルト日本語フォント）

## NotoSansCJKjp-hinted.zipを解凍

```
% unzip -d noto NotoSansCJKjp-hinted.zip
Archive:  NotoSansCJKjp-hinted.zip
  inflating: noto/LICENSE_OFL.txt
  inflating: noto/NotoSansCJKjp-Black.otf
  inflating: noto/NotoSansCJKjp-Bold.otf
  inflating: noto/NotoSansCJKjp-DemiLight.otf
  inflating: noto/NotoSansCJKjp-Light.otf
  inflating: noto/NotoSansCJKjp-Medium.otf
  inflating: noto/NotoSansCJKjp-Regular.otf
  inflating: noto/NotoSansCJKjp-Thin.otf
  inflating: noto/NotoSansMonoCJKjp-Bold.otf
  inflating: noto/NotoSansMonoCJKjp-Regular.otf
```

## notoフォントを端末に転送

```
% adb push noto/NotoSansCJKjp-Regular.otf /system/fonts/
[100%] /system/fonts/NotoSansCJKjp-Regular.otf

% adb shell ls -la /system/fonts/NotoSansCJKjp-Regular.otf
-rw-r--r-- 1 root root 16427228 2015-06-15 05:49 /system/fonts/NotoSansCJKjp-Regular.otf
```

# 設定ファイルを書き換え

```
% adb pull /system/etc/fonts.xml .
```

**&lt;familyset version="22"&gt;**の次の行に以下を追記

```
    <family lang="ja">
        <font weight="400" style="normal">NotoSansCJKjp-Regular.otf</font>
    </family>
```

**記述ミスなどがあるとOSが起動しなくなるので気をつけてください**

# 端末にfonts.xmlを転送

```
% adb push fonts.xml /system/etc/fonts.xml
```

# システムの再起動

```
% adb reboot
```

# Before
![Android Thingsを日本語に対応前](https://qiita-image-store.s3.amazonaws.com/0/129712/47795b6f-0ad2-c37a-42c8-e495b04dc51e.png)

# After
![Android Thingsを日本語に対応後](https://qiita-image-store.s3.amazonaws.com/0/129712/4d850759-ede0-dc2c-0879-ba2784abd884.png)
(初心者)MacでTensorFlowのチュートリアル実施時の試行錯誤メモ

# はじめに

Tensorflowはチュートリアルであっても本質的に何をやっているのかの理解が難しい。
中の状態を確認しながら進めたい
ちょうど中身を確認しながら進めているウェブ記事（）があったので
これを自分のところでも動かしたいと考えたのですが、簡単には動きませんでした。

- TensorFlowのチュートリアルをやってみる（1）
http://www.mwsoft.jp/programming/tensor/tutorial_beginners.html

本記事は、どうやって自分の環境で動かしたかを記したものになります。
Tensorflowの本質に関しては、新しい情報はなく、実施に関する情報です。


# 私の環境

- OS: Mac OS X El Capitan (10.11)
- Versions: python2.7.10 tensorflow0.9.0, numpy1.11.3
- Pythonはpyenvで構築した環境を使用し、OSのものは使いませんでした。

# チュートリアル実施

以下の記事を参考にチュートリアルを進めました。
各節は参考にしたページの節に合わせてあります。

- TensorFlowのチュートリアルをやってみる（1）
http://www.mwsoft.jp/programming/tensor/tutorial_beginners.html

## インストール

- pythonはpyenvでインストール
- tensorflowはpipでインストール *1
- matplotlibもpipでインストール(pip install matplotlib) *2

*1
以下の本家のページが参考になりました。
https://www.tensorflow.org/get_started/os_setup#pip_installation

```
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.1-py3-none-any.whl
sudo pip install --upgrade $TF_BINARY_URL
```

*2
backendがmacosxだと動作しなかったのでTkAppに変更してあります。
詳しい記事はこちら。
http://qiita.com/Kodaira_/items/1a3b801c7a5a41c9ce49

```
変更前：backend : macosx
変更後：backend : Tkagg
```

## データの読み込みと確認


```plt.imshow(mnist.validation.images[0].reshape(28, 28), cmap = cm.Greys_r)```のあとに```plt.show()```を実行する必要があります。このコマンドを実行することで、別ウィンドウに画像が表示されます。
以降も画像表示の際には```plt.show()```が必要ですのでご注意を。

```
>>> from matplotlib import pylab as plt
>>> import matplotlib.cm as cm
>>> plt.imshow(mnist.validation.images[0].reshape(28, 28), cmap = cm.Greys_r)
<matplotlib.image.AxesImage object at 0x11a540290>
>>> plt.show()  # ここ
<ここで画像が別ウィンドウで表示される>
```

## 1 + 2 = 3

特に問題なく動作しました。

## y = x * w

私の環境では、以下のコードでは動きませんでしたので、以下のように変更しました。

```
変更前：sess.run(tf.initialize_all_variables)
変更後：sess.run(tf.initialize_all_variables())
```

画像を表示させる場合は```plt.show()```を忘れないでください。

## 正答率の確認

特に問題なく動作しました。

## チュートリアルのコードを動かす

特に問題なく動作しました。

# まとめ

流せるようになったので、まださわりの部分だけかと思いますが、ある程度、挙動の詳細を追えるようになりました。
今後は内容を詳細に追ってみたいと思います。

# 参考

- TensorFlow - Download and Setup ｰ Pip installation
https://www.tensorflow.org/get_started/os_setup#pip_installation

- pyenvとvirtualenvで環境構築した時にmatplotlib.pyplotが使えなかった時の対処法
http://qiita.com/Kodaira_/items/1a3b801c7a5a41c9ce49
Redmine のメール通知にニフティクラウド ESS を利用するための設定

前に[別のところ](http://tily-java.tumblr.com/post/133922014644)にも書いたんだけど、tumblr は検索性悪いのでこちらにも書いておく。

Redmine 3.3.0-1 では `config/configuration.yml` に下記のような設定を書くとうまく動いた。
(domain: "www.gmail.com" という関係のない設定が入ってしまっているが、問題ないっぽい。)

```
# default configuration options for all environments
default:
  # Outgoing emails configuration
  # See the examples below and the Rails guide for more configuration options:
  # http://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true
      address: "ess-smtp.cloud.nifty.com"
      port: 587
      domain: "www.gmail.com"
      authentication: :login
      user_name: "アクセスキーID"
      password: "シークレットアクセスキー"
      tls: false
```

ちなみに docker イメージ ([sameersbn/docker-redmine: Dockerized redmine app server](https://github.com/sameersbn/docker-redmine)) を利用している場合には、下記のように環境変数を設定するとよい。

```
SMTP_HOST=ess-smtp.cloud.nifty.com
SMTP_PORT=587
SMTP_USER=アクセスキーID
SMTP_PASS=シークレットアクセスキー
```

[ニフティクラウド ESS を redmine\(alminium\) のメール通知に利用するための設定 \- tily と java](http://tily-java.tumblr.com/post/133922014644/%E3%83%8B%E3%83%95%E3%83%86%E3%82%A3%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-ess-%E3%82%92-redminealminium-%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A)
Windowsでnpmのバージョンをサクッと変更する方法

1. StartでPowerShellと検索します
Windows PoweShellというものが出てくると思います。(出てこなかった場合は…すみません分かりません)
それを右クリックして、「管理者として実行する」を選びます

2. Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
システムに対してスクリプトを実行できるようにこのコマンドを実行します。

3. npm install --global --production npm-windows-upgrade
アップグレードツールをインストールします

4. npm-windows-upgrade
後は実行するのみです。バージョンがいくつか並んで出てくるので、その中から任意のものを選びます。
ちなみに、「とりあえず最新版が欲しい」場合は下記の様なオプションがあるみたいです。
    
        npm-windows-upgrade --npm-version latest


参考:https://github.com/felixrieseberg/npm-windows-upgrade
【Swift】UITextFieldのカーソル非表示＆コピー・ペーストを不可にする方法

# デモ
![hollyweed.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/d5c5ed20-c061-c87e-5d51-53d2ae95ee51.gif)


# 手順

## カスタムクラス作成
まずUITextFieldのカスタムクラスを作ります。
⌘+Nで新規ファイル作成画面に移動し、Cocoa Touch Classを選択し、Nextをクリック。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/135478/bb0220a0-a793-e152-551a-fcbeda462aa2.png)

### Subclassを設定
次にクラス名を適当に入力(今回はCustomeTextFieldとしました。)し、SubclassをUITextFieldにし、Next。次の画面で保存場所を選んで作成します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/135478/9d28d6d7-a3c3-a115-29bd-dff0a4b79cfb.png)

### コード
ファイルができたらコードを以下のように記述していきます。

```.CustomTextField.swift
import UIKit

class CustomTextField: UITextField {

    // 入力カーソル非表示
    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }
    // 範囲選択カーソル非表示
    override func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }
    
    // コピー・ペースト・選択等のメニュー非表示
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }

}
```

## UITextFieldにカスタムクラスを適応
最後に該当のTextFieldを選択し、Custome Classに先程作ったCustomTextFieldを設定して完了です。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/135478/ba9f4aa1-336a-f52b-68bb-3043588a9f38.png)
[メモ]Railsで並列処理をしてみた

## 概要
Parallelが簡単そうだったけど、`Couldn't cleanly terminate all`みたいなエラーはいたのでQueueで実装。
新しいGemをインストールする必要がないのもいい。

参考にした記事はすべてThreadを2にしてたんだけど、適切なThread数がわからなかった。
追記：スクレイピングの処理をMacBook Pro プロセッサ 2.7 GHz Intel Core i5 で走らせてみた結果、3の場合が一番早かった。

## サンプル
```lib/tasks/parallel_sample.rake
namespace :parallel do
   task sample: :environment
      queue = Queue.new
      nodes.each { |i| queue.push(i) }
      queue.push(nil)

      Array.new(3) do |i|
        Thread.new do
          begin
            while num = queue.pop(true)
              # コネクション数の増大を防ぐ
              ActiveRecord::Base.connection_pool.with_connection do
                p num
                User.all.sample.update(value: num)
                sleep 0.5
                puts "end #{num}"
              end
            end

            queue.push nil
          end
        end
      end.each(&:join)
      p "end!!!!!"
  end
end
```

```shell-session
$ bundle exec rake parallel:sample
0
1
2
end 2
end 0
end 1
3
4
5
end 3
end 5
6
end 4
7
8
end 6
end 8
10
end 7
11
9
end 10
12
end 9
13
end 11
14
end 12
end 13
end 14
15
16
17
end 15
end 17
end 16
18
20
19
end 18
end 20
end 19
21
22
23
end 21
24
end 22
25
end 23
26
end 24
end 25
end 26
29
27
28
end 29
end 28
end 27
30
end 30
"end!!!!!"
```

### 参考

Rubyで並列処理が簡単にできるgem parallel - 酒と泪とRubyとRailsと http://morizyun.github.io/blog/parallel-process-ruby-gem/ @zyunnosukeさんから

【Ruby on Rails】非同期処理についてその②。　〜マルチスレッドとかマルチプロセスを実装してみた〜 - (ΦωΦ) http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/07/02/042448 @711fumiさんから
Mac で IRuby Notebook 環境を構築する方法 2017年版

http://qiita.com/kozo2/items/4bfbc9524b302b06710b
のMac版です
と同時に
http://qiita.com/kozo2/items/7ffc1704a72a28d7e21f
の2017年版です．

## Ruby のインストール

```shell-session
brew install rbenv automake gmp libtool wget
rbenv install 2.4.0
rbenv global 2.4.0
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

## Jupyter Notebook のインストール

Anacondaを使います.
JupyterとIRubyは独立しています．(同じzeromqを使っていないといけない，とかそういうことはありません)

Jupyterの(~/.jupyertもしくは~/.ipython下の) kernel設定ファイルに対してこの後の「Jupyter Notebook用Ruby kernelの登録」
が正しく行われてさえいれば，Jupyterは何を使ってinstallしてもらっても構いません．

```shell-session
wget https://repo.continuum.io/archive/Anaconda3-4.3.0-MacOSX-x86_64.sh
bash Anaconda3-4.3.0-MacOSX-x86_64.sh
# 基本デフォで回答。下記ではホーム下にインストールしたと仮定し、PATHを追加しなくても動作するようにフルパス書いてます
```

## zeromq, czmq, cztopのインストール

今のところcztopにはzeromq, czmqの先端版が必要なので `--HEAD` オプションを忘れずに

```shell-session
brew install zeromq --HEAD
brew install czmq --HEAD
gem install cztop
```

## IRuby のインストールとJupyter Notebook用Ruby kernelの登録
リリース版にはcztop supportがまだ入ってないのでspecific_installします

```shell-session
gem install specific_install
gem specific_install https://github.com/SciRuby/iruby.git
iruby register --force #~/.jupyterもしくは~/.ipython下にiruby kernel設定が既にあれば上書きします
```

## IRuby Notebookの実行

```shell-session
~/anaconda3/bin/jupyter-notebook
```

あとは新規Notebookの作成時にRubyのkernelを選択すればOKです．
lovefield を node環境でモックしてテストする

lovefield は google 製のIndexedDBのSQL風ラッパー。

https://github.com/google/lovefield

indexeddb を使うライブラリは大抵node環境で動かないのだが、fake-indexeddb でモックすることでインメモリDBとしてテスト環境で動かすことができた。少なくとも、公式のチュートリアルの範囲では。

以下動いたコード。

```js
// mock indexeddb
global.self = global;
global.indexedDB = require("fake-indexeddb");

// Get started
const lf = require("lovefield");

const schemaBuilder = lf.schema.create("todo", 1);
schemaBuilder
  .createTable("Item")
  .addColumn("id", lf.Type.INTEGER)
  .addColumn("description", lf.Type.STRING)
  .addColumn("deadline", lf.Type.DATE_TIME)
  .addColumn("done", lf.Type.BOOLEAN)
  .addPrimaryKey(["id"])
  .addIndex("idxDeadline", ["deadline"], false, lf.Order.DESC);

(async () => {
  const db = await schemaBuilder.connect();

  // Get the schema representation of table Item.
  // All schema-related APIs are synchronous.
  const item = db.getSchema().table("Item");

  // Creates a row. Lovefield does not accept plain objects as row.
  // Use the createRow() API provided in table schema to create a row.
  const row = item.createRow({
    "id": 1,
    "description": "Get a cup of coffee",
    "deadline": new Date(),
    "done": false
  });

  // INSERT OR REPLACE INTO Item VALUES row;
  // The exec() method returns a Promise.
  await db.insertOrReplace().into(item).values([row]).exec();

  // When reached here, Lovefield guarantees previous INSERT OR REPLACE
  // has been committed with its implicit transaction.

  // SELECT * FROM Item WHERE Item.done = false;
  // Return another Promise by calling this SELECT query's exec() method.
  const results = await db.select().from(item).where(item.done.eq(false)).exec();

  results.forEach((row) => {
    // Use column name to directly dereference the columns from a row.
    // console.log(row.description, "before", row.deadline);
    console.log("item:", row);
  });
})();
```

## 動機

現状のIndexedDBが使いづらい理由にドメイン層に近い部分で使うのにNodeでユニットテストできない点があると思っていて、これでその不満が解決できればだいぶ複雑なIsomorphicなアプリが作りやすくなる。

fake-indexeddb がどれぐらい信用できるかは、

```
It passes the W3C IndexedDB test suite (a feat that all browsers except Chrome fail) plus a couple hundred more tests just to be sure. It also works well enough to run fairly complex IndexedDB-based software.
```

とのことなんで、そもそも非同期のイベントくる順番がぶっ壊れてる Safari の実装よりマシじゃないでしょうか。

https://github.com/dumbmatter/fakeIndexedDB
技術英語 > and require you to [keep track of] many details / keep my eyes on you / We lost track of time. 

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 294 / 12833)

> ,and require you to **<font color=red>keep track of</font>** many details, which can lead crashes and problems that are hard to diagnose.

https://www.merriam-webster.com/dictionary/keep%20track
> :  to be aware of how something is changing, what someone is doing, etc. 

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/b1f6a8039c75c705c56d
> keep my eyes on you.

<hr>
関連して思い出したのは

@ (2年前に見た) Star Trek Enterprise 

> We lost track of time. 
時間が経つのも忘れていた
linux mint 18 で evolution 3.20.5をコンパイルする

0. sudo apt-get install build-essential
1. sudo apt-get build-dep evolution
6. sudo apt-get install libdb-dev
7. sudo apt-get install libgdata-dev
8. sudo apt-get install gperf
2. evolution-data-serverのソースを取得・展開
9. evolution-data-serverのソースのディレクトリへ移動
4. ./configure --disable-goa --disable-uoa
7. make
8. sudo make install
9. evolutionのソースを取得・展開
10. 展開したソースディレクトリへ移動
11. ./configure --disable-autoar
14. make
15. sudo make install
16. sudo ldconfig
17. evolution
Cocos2d-x新規クラス作成と追加


##エラー：
jni/../../Classes/Chip_Hero.h:11: error: undefined reference to 'vtable for ClassName'
##解決法:
Android.mkにClassName.cppを追加する必要がある

-1
![error1.PNG](https://qiita-image-store.s3.amazonaws.com/0/158154/4c36a2ee-9d72-bc6b-c1e7-423cc04055e6.png)

-2
![error2.PNG](https://qiita-image-store.s3.amazonaws.com/0/158154/1a67995c-4c7c-c69f-1abc-636c47b87eb6.png)


以上でエラーが出なくなった
シーンに合わせて.vimrcを切り替える swim

# SWIM : SWitch vIMrc files instantly

vim を様々な作業に使い続けていると、.vimrcが巨大になってきたり、場面場面で設定を切り替えたりするのが煩雑になってきますよね。そんな時に役に立つのが swim。

https://github.com/dawsonbotsford/swim

簡単に.vimrcを切り替えることができます。

# おまけ

chalk でエラーが出た場合

```
brew install node
```

などで新しいnodejsを使用すると問題なく使用できるようになります。
[Unity3D]プレイヤー中心に回転・拡縮・追従するカメラ

# 仕様
- 指定したキャラを中心に回転できる(マウス左ボタンを押しながらドラッグで操作)
- 指定したキャラを中心に拡大・縮小できる(マウスホイールで操作)
- 指定したキャラが移動しても追従する


![aa4b4552a91194a0b09f35344ad6d2bd.gif](https://qiita-image-store.s3.amazonaws.com/0/31952/21789eef-a6bb-2b61-4bb1-86b8982b4179.gif)
(C)Unity Technologies Japan/UCL



# ソースコード
```csharp
// These codes are licensed under CC0.
// http://creativecommons.org/publicdomain/zero/1.0/deed.ja

using UnityEngine;

/// <summary>
/// The camera added this script will follow the specified object.
/// The camera can be moved by left mouse drag and mouse wheel.
/// </summary>
[ExecuteInEditMode, DisallowMultipleComponent]
public class FollowingCamera : MonoBehaviour
{
    public GameObject target; // an object to follow
    public Vector3 offset; // offset form the target object

    [SerializeField] private float distance = 4.0f; // distance from following object
    [SerializeField] private float polarAngle = 45.0f; // angle with y-axis
    [SerializeField] private float azimuthalAngle = 45.0f; // angle with x-axis

    [SerializeField] private float minDistance = 1.0f;
    [SerializeField] private float maxDistance = 7.0f;
    [SerializeField] private float minPolarAngle = 5.0f;
    [SerializeField] private float maxPolarAngle = 75.0f;
    [SerializeField] private float mouseXSensitivity = 5.0f;
    [SerializeField] private float mouseYSensitivity = 5.0f;
    [SerializeField] private float scrollSensitivity = 5.0f;

    void LateUpdate()
    {
        if (Input.GetMouseButton(0)) {
            updateAngle(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        }
        updateDistance(Input.GetAxis("Mouse ScrollWheel"));

        var lookAtPos = target.transform.position + offset;
        updatePosition(lookAtPos);
        transform.LookAt(lookAtPos);
    }

    void updateAngle(float x, float y)
    {
        x = azimuthalAngle - x * mouseXSensitivity;
        azimuthalAngle = Mathf.Repeat(x, 360);

        y = polarAngle + y * mouseYSensitivity;
        polarAngle = Mathf.Clamp(y, minPolarAngle, maxPolarAngle);
    }

    void updateDistance(float scroll)
    {
        scroll = distance - scroll * scrollSensitivity;
        distance = Mathf.Clamp(scroll, minDistance, maxDistance);
    }

    void updatePosition(Vector3 lookAtPos)
    {
        var da = azimuthalAngle * Mathf.Deg2Rad;
        var dp = polarAngle * Mathf.Deg2Rad;
        transform.position = new Vector3(
            lookAtPos.x + distance * Mathf.Sin(dp) * Mathf.Cos(da),
            lookAtPos.y + distance * Mathf.Cos(dp),
            lookAtPos.z + distance * Mathf.Sin(dp) * Mathf.Sin(da));
    }
}
```



# 解説
動かしたいカメラにコンポーネントとして追加してtargetにキャラを指定すると動く。そのままだとキャラの足下を見てしまうのでoffsetで適当にずらすと良い。

アルゴリズムは[球面座標](https://ja.wikipedia.org/wiki/%E7%90%83%E9%9D%A2%E5%BA%A7%E6%A8%99%E7%B3%BB)で検索すべし。数式をUnityで実装する際は軸の対応に注意(Unityではy軸が上方向)
今あえて言おう。ThinkPadが良いんでない？

Qiitaに書くほどの話かよ、ってネタなのですが、本日ビックカメラでいろいろPCを触ってきて、また同じタイミングでLenovoの新製品発表があり、ここ半年ほどのもやもやに対するひとつの答えを見出した気がしたのでちょっとした雑記です。あるいは現実逃避です。あるいは物欲ポエムです。
なお私はLenovoとはなんの関係もありませんし（サーバ分野ではライバル企業ではありますが）、もと同じ会社としてHP Inc（株式会社日本HP）を応援したい気持ちはありますがこちらも関係ありません。
# ぼくが普段仕事で使っているPCは
HP Elitebook 2170p というものです。4年前のPCです。

- Core i5（第３世代）
- メモリ16GB DDR3（増設した）
- 11.6インチ HD
- SSD 180GiB

というスペックなのですが、いい製品だと思います。今更褒めてもとっくに生産終了してるのでアレなんですが、良いところを挙げると以下の通り。

- パフォーマンス的には今の最新モデルと比べてもそう見劣りしない。
- 重量も許容範囲（拡張バッテリつけて1.5kgぐらいかな）
- 丈夫。テーブルからコンクリートの床に落としても壊れない。
- キーボードが打ちやすい。
- ふつうにSODIMMのスロットが2つある。
- 何より4年間大きなトラブルなしで現役で使えている。

というわけで現場でガシガシ使えるPCとして（さんざん文句言いながらも）気に入ってます。

# とはいえ
会社の標準IT環境はどっぷりMicrosoftなんですが、エンジニアとしての作業の大半はLinuxベースのインフラだったり、ちょいちょいPythonとかGoとかコード書いたりもするわけです。
んで`GOPATH=C:\Users\junyoshi\Go\Projects`とかやっぱ気持ち悪いし、そもそもLinuxの実行環境が手元に必要なので、WindowsのVMware Workstationの上でUbuntuとかMintを動かしてもっぱらそこに住んでるわけですが、やっぱりそれだとそれなりにストレスフルなのです。

# BYOD
HPEはBYODに関してはかなり進んでる会社だと思います。自前のMacとか持ってきてもそれほど不自由なく仕事できちゃいます。いや仕事に使う機器は会社が与えてくれて当然でしょ、という話もありますが、会社員としてというよりはプロとして、使う道具は自分で決めて、それも給料のうち、という考え方もありなんじゃないかなと思います。だって一日の大半触れ合うわけだから快適に過ごしたいじゃん？

# というわけで
作業用のPCをここ半年ほど探してるのですが、なかなか「これ」というものに出会えてなかったのです。

# MacBook Proでええやん
いや期待してたんですけどね。いいと思うんですけどね。ぼくの場合は以下の理由で外れました。

- そもそもOSXを使う積極的な理由がない：
    - エンジニアにMacが使われてる理由って、OSがUNIXベースだからってのと、iOSアプリの開発のためってのがあると思いますが、前者はLinuxでいいし、後者はぼくの仕事ではまずありえないので。
    - あとiPhoneとかのApple製品群もぼくの生活圏にはないので。
- キーボードが・・・
    - これは好みというか慣れの問題とは言われていますが・・・ダメでした。

というわけで、キーボードがOKで、OSX使いたい方（まあLinux入れてもいいんでしょうけど）には大変よくできた機種ではないかと思います。

# じゃLinux前提で
って考えたときに選択肢は一気に増えるのですが、どれも帯に短し襷にも短しでして・・・

- [HP Spectre 13](http://h50146.www5.hp.com/notebooks/personal/spectre_13/)：　メモリがMax8GB（オンボード）は物足りない。
- [ASUS ZenBook 3 UX390UA](https://www.asus.com/jp/Notebooks/ASUS-ZenBook-3-UX390UA/)： 最初見たときはイイじゃん！と思ったのだけど、**USキーボードがない。**これぼくにとっては致命的なのですね。@とかの配列はともかく、手が小さいので日本語キーボードだとEnterに小指がとどかないのです。

とか見ていくと、要するにぼくが欲しいのは

- CPUはCorei5程度でいいけど世代は新しいほうがいい
- メモリは16GB（もしくは増設の余地が）欲しい
- 打ちやすいUSキーボード（必須）
- 頑丈っぽい
- 軽いに越したことはない
- 画面は外部ディスプレイつなぐことが多いのであんまこだわらないけど12インチじゃちょっと手狭かな
- バッテリーが長持ちするに越したことはない
- 安いに越したことはない

とかいう、別に大したことない話なんですが、これがなかなかなくて・・・と思ったら

- [Lenovo ThinkPad X1 Carbon](http://shopap.lenovo.com/jp/notebooks/thinkpad/x-series/x1-carbon/)：　何これ全部満たしてるんじゃない？

というわけでビックカメラに見に行ったわけですが。気に入りました。なんというか昔ながらのノートPCが正常進化した感じ。最近のPCって、マーケティング的に薄さをアピールするためにキーストロークを犠牲にしてたりとか、見た目のかっこよさで勝負してるんじゃないかとか思うんですが、ThinkPadは道具としての使い勝手をまじめに練り上げてきてるように思います。
そこへきて、[2017モデルの発表](http://japanese.engadget.com/2017/01/03/thinkpad-x1-2017-carbon-3/)がありました。さらに正常進化しているように見受けられます。値段次第ではありますが、もう自分の中ではこれが答えだって感じです。

# 課題
あとは2月の発売までの悩みとしては

- Linux OS（特にdistroに拘りはない）でちゃんと使えるか
- 業務上必要なSkype for Businessとかをどうするか
- 長男の受験がどうなるか（入学金とか怖いんですけど）
- それよりまず妻の仕事用のPCじゃね？

# 結論
- プロの作業用PCとして満足できる製品が少ない。4年前よりむしろ減ってるんじゃないか。
- 頑張れHP Inc。
モナドのまほう　第16話『Gamepad APIでブラウザでもゲームパッドを使う/Sentryでクラッシュレポート』

[第一話](http://qiita.com/hiruberuto/items/5321d8cebce7b87851f6) / [前回](http://qiita.com/hiruberuto/items/6b4353009059836569d1) / [デモ](https://aratama.github.io/cubbit/)

ゲームを作る日記です。本作の開発費は０円です。


# ゲームパッドに対応しました

行方不明だったゲームパッドが無事発見されたので、ゲームパッドへの対応を始めました。UIをかなりいじる必要があるのでまだ作業途中なのですが、フィールドを歩き回ったり周囲を見回す操作がゲームパッドでできるようになっています。

マウスやキーボードよりゲームパッドでプレイするほうが私は好きですし、むしろゲームパッド前提にしたくなってきました。ブロックを置くのはマウスのほうが便利なんですが、フィールドを歩きまわるのはゲームパッドのほうが圧倒的に楽です。ただ、ゲームパッドだと三人称視点でのブロックの配置操作をどうするかが悩みどころです。ドラクエビルダーズみたいに隣接する区画だけに置けるようにするというのもひとつの手だとは思います。

# 起動を早くしたいけど無理でした

ウェブから起動すると、github pagesがあまり早くないのもあって起動にかなりの時間がかかると思いますが、ローカルで動かしているときも起動に１０秒くらいかかります。開発中は頻繁に再起動を繰り返すので、あまり快適とは言えません。起動を早く出来ないか検討したのですが、いい方法が見つかりません。画像や音声などのファイルの読み込みを可能な限り遅らせようとしても、結局シーンの切り替えが長くなるだけで根本的な解決にはならなさそうです。よくクソゲーの理由として「ロードが長い」が挙げられますし、たびたび挟まれるロードはプレイヤーにとってかなりのストレスになると思われるので、そういう意味でも起動時に可能な限りすべて読み込んでしまうのがベターであるように思います。

しかたないので、起動中に間をもたせるために操作ガイドを表示することにしました。[Inkscape](https://inkscape.org/)でテキトーに描いたんですが、やっぱりデザインのアイデアがさっぱり浮かんでこないのでダサいです。デザインってイラストレーションなんかともまた違ったセオリーがあってすごく難しいです。普段からデザインのアイデアを収集する習慣がないので、引き出しがぜんぜん足りません。またいい感じのデザインが思いついたら差し替えようと思います。

![bitmap.png](https://qiita-image-store.s3.amazonaws.com/0/64695/29d6537f-b995-fb40-06e4-f0387a45377f.png)

# Sentryを試しています

クラッシュレポートが欲しくて、[Sentry/raven-js](https://sentry.io/)を試しています。使い方はとても簡単で、Sentryにアカウントを登録したあと、アプリケーションに`raven.min.js`を読み込んで、それから`Raven.config('https://<<SentryのID>>').install()`を実行しravenを起動するだけです。そうすると、アプリでエラーが起きるたびにログを取ってくれます。

なおFirebaseにも[クラッシュレポート](https://firebase.google.com/docs/crash/)の機能があって死ぬほど使いたいんですが、悲しいことにAndroidとiOSにしか提供されていないのです。それで早速ですが、Safariで`exitPointerLock`がないという問題が報告されました。なかなか便利そうです。

![sentry.png](https://qiita-image-store.s3.amazonaws.com/0/64695/f6a9a283-8a65-0861-a198-0b9313fb79bd.png)

[Can I Use](http://caniuse.com/#feat=pointerlock)で見ると、Safariは`Technology Preview`っていうステータスになっていますね。うーん？

![can.png](https://qiita-image-store.s3.amazonaws.com/0/64695/110ea224-2e0c-0280-0c82-544640022069.png)


対処を考えたいですが、貧乏な筆者は残念ながらMacを持っていないので、いやMacが高いとかそういう意味ではなくガチで筆者は貧乏なので、今のところ推奨環境は筆者が動作確認のできるChrome/Firefox/Edgeに限っています。誰かが私にMacを買い与えてくれれば、Safariも加えたいと思います。他にも、古いSafari(?)でSyntaxErrorが出てますね。Safari使いの人はごめんなさい。問題が起きていることはある程度把握しています。QiitaはなぜかSafari率がかなり高いサイトのようですし、いずれSafariにも対応したいと思います。

ちなみにスマホはぜんぶ対象外です。性能面が極めて厳しいというのもありますし、操作性が劣悪なので筆者があんまりスマホでゲームするのが好きじゃないっていうのもあります。現代ではどう考えてもPCゲーよりスマホゲーのほうが売れますが、私はスマホゲー作るのはあんまり興味が薄かったりします。



# rawgitでCDN

[githubのreadme](https://github.com/aratama/cubbit)に、RawGit/MaxCDNを通じてデモを起動するリンクを用意してみました。github pagesよりrawgit経由のほうがずっと読み込みが早いのでお勧めです。rawgitのほうのURLは随時変更されるので、readmeに乗っているリンクから開いてください。ただしドメインが変わってしまうので、シングルプレイヤーモードでのデータが共有できませんが。

# 次のお話

* * [第17話『ｱｶﾈﾁｬﾝｶﾜｲｲﾔｯﾀｰ!』](http://qiita.com/hiruberuto/items/ce2abda332d50f461493)

----
Gitolite環境構築手順（復習用）

ここでは下記のような環境を想定しています

- サーバー側・・・リモートリポジトリがあるLinux（CentOS）
- ローカル側・・・ユーザー使用PC、Windows側

※両方ともGitインストール済み

#Gitoliteをインストールスする前に
##ローカル側（Windows側）で公開鍵と暗号鍵を作成する
リモート側（サーバー側）でgitoliteを開始するときに公開鍵が必要なのでまず鍵を作成する
Git Bashで下記のコマンドを実行

```
ssh-keygen -t rsa -f (ファイル名)
```

-t 鍵作成アルゴリズム（RSA形式）
-f 鍵ファイル名
※最終的に「~/.ssh」に鍵を置くので「~./ssh」で上記コマンドを実行した方が良い


パスフレーズは設定しなくても良いのでEnter2回

秘密鍵：(ファイル名)
公開鍵：(ファイル名).pub
が作成される

#Gitoliteをリモート側（サーバー側）にインストールする
##概要
簡単にまとめると下記の手順でインストール＆開始する

1. gitoliteをサーバーにインストールする（このときgitoliteユーザーが作成される）
2. gitoliteユーザーでサーバーにログイン
3. gitoliteをセットアップ（開始）する（初期ユーザーのSSH公開鍵○○○.pub必要）

※gitoliteユーザーをサーバーで新規作成して、[そのユーザーでgitoliteのリポジトリをcloneしてインストールする方法](http://gitolite.com/gitolite/install.html#qi)は何故か上手く行かない（鍵の追加が上手く行かない）
~/.ssh/authorized_keys に上手く鍵情報が追加されない。
おそらくhome/gitoliteにインストールしてしまったため？


##詳細
###gitoliteをインストールする
インストール権限があるユーザーでサーバーにログイン
下記コマンドでインストール

```
sudo yum install gitolite
```
インストール後にサーバーにgitoliteユーザーが作成される

###gitoliteユーザーのパスワード設定
下記コマンドを実行

```
passwd gitolite
```
パスワード入力してEnter

###gitoliteユーザーでログイン
下記コマンドでログイン

```
su - gitolite
```

###gitoliteをセットアップ（開始する）

- ローカル側（Windows）から公開鍵をサーバー側へ渡す
windows側のgit bashで下記コマンドを実行

```
scp (鍵ファイル名).pub gitolite@(ipアドレス):tmp
```
サーバー側の「/temp/」に鍵がコピーされる

-  gitoliteをセットアップ
下記コマンドを実行

```
gl-setup /tmp/(鍵名).pub
```

- 適当にエンター押す
- .gitolite.rcの編集画面になるが設定しないので終了「:q」

※以上でgitoliteのインストール＆セットアップ（開始）が終了

#gitからSSHでのサーバーへの接続
##SSHの設定ファイルを作成してSSH接続
~/.ssh/で下記のconofigファイルを作成

```~/.ssh/config
host gitserver
    user gitolite
    hostname 192.168.1.8（Gitサーバのホスト名 or IP）
    port 22
    identityfile ~/.ssh/admin（秘密鍵のPATH）
```
これで「ssh://gitserver/(リポジトリ名)/」というURIでリモートリポジトリ（サバー側のリポジトリ）にアクセスできる
ちなみにconfigファイルはlinuxはパーミッション600にしないと動かない

## 接続確認
初期で「testing」「gitolite-admin」というリポジトリが作成されている。
下記コマンドでリポジトリをコピーできるか確認

```
git clone ssh://gitserver/testing
```
ファイルがダウンロードできたらSSH接続成功

#Tortoise Gitでの公開鍵SSH接続の設定
ssh-keygenで生成した暗号鍵だとTortoiseGitではそのままの設定だとSSH接続ができないので、SSH接続クライアントをTortoiseGitのクライアント（PLink） → Gitのクライアント（ssh）に変更

Tortoise Gitの「Settings > Network」の「SSH > SSH client:」の欄を下記PATHに変更（自分のWindows環境だと）する

```
C:\Program Files\TortoiseGit\bin\TortoisePlink.exe
　↓
C:\Program Files\Git\usr\bin\ssh.exe
```

#gitoliteに登録する公開鍵が以下の形式だったとき

```
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20130218"
AAAAB3NzaC1yc2E..............
..................
..................
---- END SSH2 PUBLIC KEY ----
```

上記の形式の場合gitoliteに公開鍵を登録しても、暗号鍵でリポジトリにアクセスできない（鍵登録失敗する）
puttygenの「SSH-2 RSA」形式で公開鍵と暗号鍵を生成したとき上記の公開鍵の形式になる。

Git Bashなどで以下のコマンドを実行して鍵を変換する。

```
ssh-keygen -i -f (変換前のパス) > (変換後の鍵のパス)
```
-i 公開鍵や秘密鍵をOpenSSHで利用できるように変換し、その結果を標準出力
-f 鍵ファイルの指定

変換後の公開鍵をgitoliteに登録すると、対応する暗号鍵でアクセスできる（暗号鍵は変換しなくてよい）

ちなみにputtygenで生成した「SSH-2 RSA」形式の鍵は、Plink（SSH接続クライアント、Tortoise Gitの初期設定クライアント）でリポジトリにアクセスできる
testingのリポジトリにアクセスするときは以下のアドレスになる

```
ssh://gitolite@(接続先のIPアドレスなど)/testing
```


#gitoliteの使い方（リポジトリ別やブランチ別の権限の設定の仕方）
下記参考リンクを参照

#参考リンク
- [【Linux】 CentOSにGitolite を導入する](http://kzy52.com/entry/2013/05/03/024455)
- [Git管理の神ツール「Gitolite」なら、ここまでできる！](http://www.atmarkit.co.jp/ait/articles/1110/03/news112.html)
- [gitoliteはどうやってユーザを判別しているか]
(http://qiita.com/yuku_t/items/46d1d834fbdae271d66c)