OmniAICreator/Qiita-1.07M huggingface dataset:
UnityC#でドキュメント化できるコメントの書き方

#きっかけ#
次の仕事で使うから調べておいた方がいいと言われたので
#結論#
ソースコードのコメントをそのままドキュメント化してくれるDoxygenというツールがあるのでそれを使えば良さそうです。


#Doxygenの書式#
コメントを///で書けばいいみたいです。
またタグ付けして概要や備考をかくといいみたいです。

参考にしたサイト
http://693sharpsharp.blog.fc2.com/blog-entry-3.html

サンプル

```
/// <summary> 
/// namespace の概要
/// </summary>
/// <remarks>
/// 備考
/// </remarks>
namespace Test
{
	/// <summary>
	/// クラス概要 
	/// </summary>
	/// <remarks>
	/// 備考
	/// </remarks>
	class Person
	{
		/// <summary>
		/// 関数の概要
		/// </summary> 
		/// <remarks>
		/// 備考
		/// </remarks>
		/// <returns>返却値の説明</returns>
		/// <param name="arg">引数の説明</param>
		bool IsReal(string arg)
		{
			return true;
		}

		/// <summary>
		/// 概要
		/// </summary>
		/// <remarks>
		/// 補足情報
		/// </remarks>
		/// <value>値の説明</value>
		int State{ get; set; }

		/// <summary>
		/// 概要
		/// </summary>
		/// <remarks>
		/// 補足情報
		/// </remarks>
		public enum enumState
		{
			/// <summary>
			/// StateGreenの説明
			/// </summary>
			StateGreen = 0,
			/// <summary>
			/// StateRedの説明
			/// </summary>
			StateRed = 1,
		}
	}
}
```

#Doxygenの実行手順(Macの場合)#
1.http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc
からDoxygenを入手する。
2.Doxygenを起動するとこんな画面が出ると思うので
作業フォルダ
プロジェクトの名前
ソースフォルダ
出力先フォルダ
を入力する
Scan recursivelyにチェックを付ける（再帰チェック）
![スクリーンショット 2015-12-08 2.50.03.png](https://qiita-image-store.s3.amazonaws.com/0/65776/20ef6504-3d7b-9451-c98e-9ddeccb01cec.png)
3.Nextを押して次に進む
Optimize for Java or C# outputにチェックを付ける
![スクリーンショット 2015-12-08 2.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/65776/24d6e482-933a-903d-9705-ff3632600577.png)
4.WizardからRunに変更してRun doxygenボタンを押す。
*** Doxygen has finished
が出たら終了です。
![スクリーンショット 2015-12-08 2.58.35.png](https://qiita-image-store.s3.amazonaws.com/0/65776/a1bd6b28-6f26-7473-191b-6b7bee27b5b6.png)
5.Show HTML outputボタンを押す
変換後のhtmlを見ることができます。
以下は実際に作ってみたイメージです。
![スクリーンショット 2015-12-08 18.36.30.png](https://qiita-image-store.s3.amazonaws.com/0/65776/02cc7aa6-427c-1b15-98a9-f0e268c357e3.png)

![スクリーンショット 2015-12-08 18.42.11.png](https://qiita-image-store.s3.amazonaws.com/0/65776/8a050924-127f-3da9-01b6-b920c9ad8993.png)

![スクリーンショット 2015-12-08 18.44.31.png](https://qiita-image-store.s3.amazonaws.com/0/65776/1a88516d-7842-916f-02cc-16056b587635.png)
duとdfで出てくるディスク使用量が異なる原因の一つ

起こったこと
-------------
http://qiita.com/Hi-king/items/fe5ac34170c7cdf12cc0 で書いたように肥大化したdockerのログを削除するのには/dev/nullを流し込むのが効果的だが、それをせずにログファイルを直接削除してた。するとディスク容量不足に陥った上に、duコマンドでは消すべきファイルが見つからなくなった。

原因と解決策
--------------
http://www.cyberciti.biz/tips/freebsd-why-command-df-and-du-reports-different-output.html に有るように、ファイルディスクリプタが開きっぱなしになっていることが問題だった。この場合ディスク容量は使っているがduコマンドでは見つけられなくなる。

`sudo lsof -s | awk '$5 == "REG"' | sort -n -r -k 7,7 | less` で、でかいfdを持っているプロセスを探して、1) そのプロセスをkillする、あるいは 2)gdbでそのプロセスにアタッチして`(gdb)call close(FDの番号)`をする。

今回のケース
-------------

ログファイルへのアクセスはdockerデーモンが仲介しているようで、先述のログファイルへのfdはデーモンのプロセスが持っていた。gdbでデーモンにアタッチしてcloseすることでディスクが開放されるのは確認したが、今回は運用中のサーバーだったため安全策としてデーモンごと再起動した。
【初心者向けカスタム】SublimeText2ってギャルゲーみたいだよねって話。

#SublimeText2のカスタム下準備をしてみましょう。
![151208_1.png](https://qiita-image-store.s3.amazonaws.com/0/100295/2556be6f-8e78-3a2c-3437-bb05834a0d93.png)

どうも。はじめましての人は、はじめまして。
牛丼大好きデザイナーのぽてこです。

qnoteアドベントカレンダーの8日目を(勝手に)担当します。どうもどうも。


というわけで今回のテーマは、
「SublimeText2をギャルゲーのように楽しむ方法」です。

嘘です。今回のテーマは
「SublimeText2をごりごりカスタムしていく下準備をしよう！」です。

上司から下ネタ禁止令が出ているのでド健全な記事ですが、最後まで見てくれたら嬉しいなって。


#SublimeText2って、なんぞ？
![151208_2.png](https://qiita-image-store.s3.amazonaws.com/0/100295/7b3de663-a4a7-a714-dd2a-d67fe4974a53.png)

皆さんはコーディングとかプログラミングとかをカタカタする時、どのエディターを使っていますか？
Coda、テキストエディター、SublimeText、秀丸、Brackets、、、などなど使い勝手のいいエディターがたくさんありますよね。

そのなかでも、私は[SublimeText2](http://www.sublimetext.com/2)を愛用しています。

理由は簡単。
キャッチコピーの「恋するテキストエディター」という響きが気に入ってるから……というのは半分冗談で。
Package Controlさえインストールしてしまえばカスタムも簡単にできてしまうし、カスタムしていく度に使いやすくなる育成ゲーム感がたまらない。

SublimeText2は私にとって、エロゲと言っても過言ではないのです！！！！！
（下ネタじゃないよ）

あと、入力補完が便利すぎて手放せない。入力補完たまらない。大好きです。


#まずは、Package Controlをインストールしてカスタムの準備をしましょう
まずは~~育成~~…カスタムの準備をするためにPackage Controlをインストールしてみましょう。
[Package Controlのサイト](https://packagecontrol.io/installation#st2)へ行き、コードをコピーしてきます。

![151208_3.png](https://qiita-image-store.s3.amazonaws.com/0/100295/0fef41e4-6747-c87d-c85d-96fa6151e02a.png)

コードをコピーしたらコンソールウィンドウにぺぺーっと貼り付けちゃいましょう。
コンソールウィンドウは「Ctrl + `」で表示することができます。

![151208_4.png](https://qiita-image-store.s3.amazonaws.com/0/100295/c8aa5478-1d48-9688-416b-feae0cefc30b.png)

SublimeText2を再起動すればPreferencesのなかにPackage Controlが追加されているはずです。


#日本語化をして、直感的操作を可能にしましょう。
日本語でやりとりできた方が~~攻略しやすい~~…操作しやすいですよね。
というわけで攻略の第一歩として、日本語化をしてしまいましょう。

日本語化をするには、Japanizeというパッケージを使用します。

SublimeText2をカスタムするときは先ほどインストールしたPackage Controlを使ってパッケージをいれていくという手順でカスタムしていきます。

まずはPackage Controlを開きましょう。
Ctrl(macの場合はcommand)+Shift+Pで開けます。

![151208_5.png](https://qiita-image-store.s3.amazonaws.com/0/100295/7788698f-95ac-8b36-34b8-7d987e69cb5b.png)

この画面で「install」と入力すると、Package Control: Install Packagesがでてくるはずなのでカーソールを合わせてEnterを押してみましょう。
これでパッケージのインストール準備が整いました。

準備ができたら「japan」と入力しましょう。
「japanize」というパッケージがあるのでカーソールを合わせてEnterをッターンします。
インストールが完了するとPackage Control Messagesが表示されるので、手順に従ってファイルの置き換えをして完了です。


#19日の予告とか宣伝とか。
次回は19日(土)を担当させていただきます。
テーマは「コーディング作業をちょっと楽にするCSScombを使ってみよう」です。多分。
せっかくの土曜日だし、ちょっと面白い感じにできたらいいなと思います。

また、こちらの[ぽてこブログ](http://languid-design.hateblo.jp/entry/2015/12/08/175405)に裏話的なことも書いてますのでこちらもどうぞよろしくです。


#最後に。
この記事を書いている途中で上司から下ネタ許可が下りました。
普段は下ネタ大好きなのですが、許可が下りたら下りたでネタが無くて辛かったです。

……というわけで。
ご覧くださり、ありがとうございました！
次回もぬるぬるっとSublimeText2について書くので、よろしければまたお会いしましょうヾ(⌒(ﾉ'ω')ﾉ
JIRAの Issue と連携できる無料ドローツール Drow.io for JIRA

業務でワークフローやフローチャートを書くとき、Excel を使っていたのだけれども、
例によって Excel 方眼紙を駆使することになり、面倒だなあと感じつつもしょうがなくつかっていた。
とはいえイケてるドローツールは当然有料だし、Atlassian 認証の Gliffy Addon も有料なのでお金を払ってまでは微妙。

そういえば Draw.io という完全無料のイケてるドローツールがあるという話を以前メンバーから聞いていたのを思い出し、当時は JIRA Add-on がインストール版にしかなく諦めたのだけど、今日見てみるとクラウド版にも対応していたので早速導入してみたところ結構良さそうなのでしばらく残しておくことにする。

#Draw.io for JIRA でできること
Draw.io で書いたダイアグラムを、JIRA の Issue に添付することができる。
添付したダイアグラムは、JIRA の Issue 上で閲覧することができ、
編集も Issue から開始することができる。

#描く
![start.png](https://qiita-image-store.s3.amazonaws.com/0/49096/4a723408-fbc4-ec25-0bf3-8059255aad06.png)

まず Issue  `その他` > `add draw.io diagram` をクリックする。
そうするとドロー画面が表示されるので、普通に描き描きする。

![draw.png](https://qiita-image-store.s3.amazonaws.com/0/49096/4efbf99f-4878-cddb-a766-825c093f9456.png)
相当サクサクで素晴らしい印象。
左下のほうにありますが、UML用やフローチャート用など、ステンシルの種類も豊富で使い勝手が良さそう。

![save.png](https://qiita-image-store.s3.amazonaws.com/0/49096/33beeab0-1e6c-7897-86fe-316352f1f941.png)
`Save` をクリックして保存する。

![savename.png](https://qiita-image-store.s3.amazonaws.com/0/49096/ccc3a368-6788-acea-7243-24b1f3eba1a4.png)
ファイルの名前をつけて `OK` をクリック。

#見る・編集する

![issue.png](https://qiita-image-store.s3.amazonaws.com/0/49096/ca9429c5-a8ec-8548-c58a-23aa329bf4ca.png)
右のほうに保存した図が表示される。
このように簡単に Issue にひも付けた管理や編集が可能。

![edit.png](https://qiita-image-store.s3.amazonaws.com/0/49096/8cadbf76-8c36-f610-36d9-add0ec69ece0.png)
ここから Edit、Delete、Move、拡大縮小が可能。全画面表示もいける。

#吐き出す
![export.png](https://qiita-image-store.s3.amazonaws.com/0/49096/aded351e-0f7b-1ca5-8a66-ce10bb873d95.png)
ドロー画面からさまざまな形式で Export できる。優秀！

![embed.png](https://qiita-image-store.s3.amazonaws.com/0/49096/344ffd6b-ec8c-20f2-0913-58e875e42f9d.png)
WEBサイトや google Docs に埋め込むことも可能なようですが、現時点でうまく動かない。
たまにバギーな動きが散見される。

#Draw.ioについて知る
Draw.io について知るならこの記事が詳しいです。夢が広がる。

無料で説明図を作るならドローツール「draw.io」に敵うものはないかも
http://nelog.jp/draw-io
DelayedJobにDraperでDecorateしたオブジェクトを渡してはいけない

# DelayedJob
時間のかかる処理や、絶対コケるとマズい部分での本質的ではない処理を、バックグラウンドでやってもらうためのgemの一つ。

# Draper
表示系に責任がある処理を行う、MVCに続く第4のレイヤー、Presenterを提供する、Decoratorと呼ばれるgemの一つ。導入するとviewがすごく綺麗になって感動する。
他のDecoratorとしてはActiveDecoratorとか。

# 本題
「表示系だしサービス全体でDecorateしちゃって問題ないでしょ」と``` application_controller ``` で ``` @product.decorate ``` みたいなことをしたら、DelayedJobを使用している箇所でエラーを吐いた。

```
RuntimeError: Found DelayedJob Error: ProductDecorator#user delegated to object.user, but object is nil: #<ProductDecorator:0x00 ... >
```

# 原因と対策
## DelayedJobで何が起こってるのか
そもそもDelayedJobで何が起こっているのかを調べようとgemの中身を覗いてみたけど、今の力量じゃめっちゃ時間かかりそうなので後に回す。
今回は[DelayedJob に ActiveRecord インスタンスを渡す時の注意](http://qiita.com/kuboon/items/9af5a2fd1c32b652b3e3)という記事にお世話になりました。
記事によると

>delay は巧妙な構文で仕組みを隠蔽しているが、実際に内部で起きていることは (中略) yaml 文字列を作って Delayed::Job のインスタンスを生成しているだけだ。

とのこと。
実際に自分で眺めてみても

```lib/delayed/message_sending.rb
def delay(options = {})
  DelayProxy.new(PerformableMethod, self, options)
end
```

との記述が見つかる。これがyamlになるっぽくて、その過程は参考元の記事に書いてあります。
要するにyaml文字列でDelayed::Jobのインスタンスを作ろうとした際に、加工されたオブジェクトを渡そうとすると割とハマっちゃうんじゃないだろうか。

## 対策
DelayedJobには、ActiveRecordインスタンスを生で渡すようにすればとりあえずは大丈夫そう。

# 余談
ちょっとずつでいいのでgemくらい読めるくらいのエンジニアになりたいので、時間を見つけてDelayedJobとDraperの中身を漁ろうな。

# 参考
- [DelayedJob に ActiveRecord インスタンスを渡す時の注意](http://qiita.com/kuboon/items/9af5a2fd1c32b652b3e3)
- [【Rails】ActiveJob/DelayedJobを使いこなす【基本】](http://qiita.com/shunsuke227ono/items/c29119a348f120c5c13a)
Macで展示とかするときのdotfiles風な。


展示するときに、必要なMacの設定をできるだけ自動化したいなとまとめました。
きっとEl Capitanで動くと思います。


```sh:setup_mac_signage.sh

# 自動更新OFF
echo "Disable : SystemPreferences -> AppStore -> Automatically check for updates"
defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticCheckEnabled -bool false

# 未承認のアプリでも右クリックなく開ける
echo "Disable Warning on opening new App."
spctl --master-disable

# ノーティフィケーションセンターはいらん
echo "Disable Notification center."
launchctl unload /System/Library/LaunchAgents/com.apple.notificationcenterui.plist

# 自動ログインに。
echo "Setup auto login."
defaults write /Library/Preferences/com.apple.loginwindow autoLoginUser $(whoami)

# リモートマネジメントを許可。sshログインとか
# echo "Enable Remote Management."
# /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -restart -agent -privs -all -allUsers


# デスクトップピクチャは黒いものに。ほんとは自分で真っ黒なpng用意するほうがいい。
echo "Change Desctop Pictures"
osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Solid Colors/Solid Gray Pro Ultra Dark.png"'


# 起動時のクラッシュワーニングはいらん
echo "Disable crash working on application start."
defaults write NSGlobalDomain NSQuitAlwaysKeepsWindows -bool false


# ウィンドウ復元無効化
echo "Disable resume on start"
defaults write -g ApplePersistenceIgnoreState YES


# クラッシュレポーターは出さないよ
echo "Disable crash reporter"
defaults write com.apple.CrashReporter DialogType none


```

実行は、色々変えるので要注意＆自己責任で。
このコマンド一発

```sudo sh -c "$(curl -fsSL https://git.io/vokPq)"```



2015-12-09 追記&修正。contributor @gff02521


### 関連投稿

[Macアプリを開いている間はスリープさせない２行。](http://qiita.com/asus4/items/02b5096a937bbd419f3e)

[Gist版](https://gist.github.com/asus4/329a614e90b3a713329c)
GitHub に登録している公開鍵を取得する

よく忘れるのでメモ。

GitHub に登録した公開鍵は全世界に公開されていて、アカウント名の後ろに `.keys` をつけると取得できる。

こんな感じ。
https://github.com/a-suenami.keys

これ意外と知らない人多いっぽいけど、こいつを Chef や Ansible のようなプロビジョニングのプロセスから利用するようにするとセキュリティ設定とかを自動化できるし結構便利。
Railsアプリケーション作成

#開発環境
Cloud9
Ruby (2.2)
Rails (4.2)

#準備
###アプリの作成
```
$ rails new [apps]
$ cd [apps]
```
###サーバの起動と停止
```
起動
$ rails s -p $PORT -b $IP
停止
Ctrl+c
```
###Git管理
```
$ git init
$ git add .
$ git mv README.rdoc README.md (README.md編集)
$ git commit -m "first commit"
```
###GitHubにリポジトリを作成

###GitHubへpush
```
$ git remote add origin [xxx.git]
$ git push origin master
```

#初期化
**config/application.rb**

```
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.test_framework false
end
```
**app/assets/javascripts/application.js**

```
削除 //= require turbolinks
```
**app/views/layouts/application.html.erb**

```
削除 'data-turbolinks-track' => true
```
Slackでチャンネル内の特定のメンバーに通知を行う


Slackでチャンネル内の特定のメンバーに通知を行いたい時ってありませんか？

```
個別に通知したい人全員のメンション入れるのは面倒くさいし漏れがあるかもしれないし...
@hereとか@channelだと全員に通知行っちゃうし...
対象以外の人にも念のため伝えたいからDIRECT MESSAGESだとダメだし...
```

そんな時に使えるのがSlackbot Responsesです。
そうです。一番最初にSlackを使い始めた時に遊んだ**アレ**です。

こんな感じで、「When someone says」に「◯◯のみなさん」とか呼びかけたいグループ名、「Slackbot responds」に対象のメンバーのIDを入力します。

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/52904/206cd727-13e0-6ab4-0533-d6850dce1c45.png)


Slackでグループ名を含めた投稿をすると、コメントの後にslackbotがメンションを自動的に入れてくれます。便利です。

![comment.png](https://qiita-image-store.s3.amazonaws.com/0/52904/b91256f7-8641-bdbf-3e0a-7a1c5a0fa5c6.png)


なお、「Customize Your Team」に「Slackbot Responses」が表示されない場合は、「Team Settings」=>「Permissions」から「Slackbot Responses」を有効にすると表示されると思います。

![disable.png](https://qiita-image-store.s3.amazonaws.com/0/52904/aa01996b-234a-6c7e-04f2-38da266f5913.png)

#追記(slackにグループ機能がありました。)
http://japan.cnet.com/news/service/35072771/
http://blog.animereview.jp/slack_group/
コミュニティドリブンのウェブ地図「sandmaps」について

# gsimapsのワイルドなフォークsandmaps
国土地理院はウェブ地図「地理院地図」のソースコードを https://github.com/gsi-cyberjapan/gsimaps で公開しています。こちらでは、国土地理院によって運営されている地理院地図が管理されています。

一方で、世の中のITは進んでいます。すぐには地理院運用に回せない技術についてプルリクエストがあったこと（https://github.com/gsi-cyberjapan/gsimaps/pull/74 ）をきっかけに、地理院地図のサンドボックス的なレポジトリが生まれました。こちらは sandmaps という名前で https://github.com/sandmaps/sandmaps.github.io というレポジトリで管理されています。sandmaps は、地理院運用には時期尚早なものを含めて、新しい試みをワイルドに実施することを方針としています。

sandmaps の運営主体は地理院ではなく The Sandmaps Project というコミュニティであり、sandmaps はコミュニティドリブンな運営を目指しています。

# マニフェスト
sandmaps のマニフェストについては、https://github.com/sandmaps/sandmaps.github.io/wiki/design%20principle に記載されています。ここでは、その項目のみ再掲します。

- if the geeks shall inherit the gsimaps
- sandmaps is a sandbox
- always choose the wilder option
- simpler is better, smaller is better
- open
- don't be evil. do the right thing
- laziness, impatience, hubris
- fitter, happier, more productive, comfortable
- YAGNI (sandmaps is a showcase)
- always live on the edge

# 技術的な特徴
現在時点の sandmaps の技術的な特徴は、次の2点です。
## モダンな管理
miya0001 さんの尽力により、かなりモダンな管理が実現しています。
### Travis CI を用いた自動構築・自動デプロイ
Travis CI を使用して、master に変更を反映すると、自動的に必要な npm モジュールを持ってきてスクリプトを minify & uglify し、gh-pages にデプロイするようになっています。

see https://github.com/sandmaps/sandmaps.github.io/pull/8

### Travis CI のバッジ敷設
Travis CI での処理結果を表示するバッジを README に追加し、ビルド状況がわかるようになっています。→ https://github.com/sandmaps/sandmaps.github.io/blob/master/README.md

see https://github.com/sandmaps/sandmaps.github.io/pull/9

### エディタのインデントの統一、テスト
.editorconfig により、エディタのインデント設定等を統一しています。sandmaps では、Ruby の流儀を過剰に採用して、JavaScript でも「ソフト2タブ」としています。

また、https://github.com/sandmaps/sandmaps.github.io/blob/master/tests/tests.js にあるように、テストを導入しています。現在のところ、テストの内容はそれほど多くはありませんが、それでも gsimaps.js の修正ミスでヘッダが空白で復活するなどのエラーを捉えることに成功したりしています。

see https://github.com/sandmaps/sandmaps.github.io/pull/10

## コンパクトなスクリプト
sandmaps が gsimaps から引き継いで保持しようとする最も重要な機能は「layers.txt」https://github.com/gsi-cyberjapan/layers-dot-txt-spec を使って様々なタイルデータを重ね合わせる機能です。それ以外の機能は、一度すべて削ぎ落としてしまい、その結果、Leaflet 1.0 のような新技術への対応余地を見出すことができればと思っています。

このため、スクリプトを大幅に削除する試みをしています。

スクリプト削除の究極系は frogcat さんのフォーク https://github.com/frogcat/sandmaps.github.io → http://frogcat.github.io/sandmaps.github.io/ が「スクラッチから作る」というアプローチですでに示されていますが、sandmaps 本体では、gsimaps からスクリプトを削っていくというアプローチを実施中です。

gsimapsとsandmapsの主要な JavaScript ファイルと CSS ファイルの大きさを比較すると、次の通りです。

|          |gsimaps             |sandmaps                  |
|:---------|:-------------------|:-------------------------|
|JavaScript|js/gsimaps.js 632KB |js/gsimaps.min.js 138KB   |
|CSS       |css/gsimaps.css 79KB|css/gsimaps.css 70KB      |

sandmaps の JavaScript はかなり小さいですが、この値は minify & uglify をした結果であることに留意は必要です。
Perl6で Channelプログラミング

Goでプログラムを書いた人であれば並列処理を書くのであれば Channelを使いたいと思いますよね. Perl6でもそれが可能です. Perl6ではずばり [Channel](http://doc.perl6.org/type/Channel)というクラスが標準で提供されています. Channelを使ったサンプルプログラミングを示します.


## コード例

並列に GETを行い, その Statusを調べるプログラムを以下に示します.

```perl
use v6;
use HTTP::Tinyish;

my @urls = (
    "http://www.vim.org",
    "https://www.gnu.org/software/emacs/",
    "http://sakura-editor.sourceforge.net/",
    "http://syohex.org/not-found",
);

my $c = Channel.new;
for @urls -> $url {
    say "Fetch: $url";
    start {
        my $agent = HTTP::Tinyish.new;
        my %res = $agent.get($url);
        $c.send($url => %res<status>);
    }
}

for @urls {
    my $r = $c.receive;
    printf "URL: %s, StatusCode: %d\n", $r.key, $r.value;
}
```

- `Channel.new`で新しいチャネルを作成.
- `Channel#send`でチャネルにメッセージを送信
- `Channel#receive`でチャネルからメッセージを受信


## 結果

並列に取得しているので実行結果は実行のたびに異なることがあります.
(2015年 12月 8日現在の rakudoの実装では本体の問題により大量の警告が出ます)

```
Fetch: http://www.vim.org
Fetch: https://www.gnu.org/software/emacs/
Fetch: http://sakura-editor.sourceforge.net/
Fetch: http://syohex.org/not-found
URL: http://syohex.org/not-found, StatusCode: 404
URL: http://sakura-editor.sourceforge.net/, StatusCode: 200
URL: http://www.vim.org, StatusCode: 200
URL: https://www.gnu.org/software/emacs/, StatusCode: 200
```

## おわりに

Perl 6での Channelを使ったプログラミングを紹介しました. Goのような感じで並列処理を書くことができます.

Perl5では並列プログラムを書くことが非常に面倒というかそもそもほとんどの人が使っていないという状態でしたが, Perl6では Channelの他にも便利な並列処理プリミティブがあり並列処理がとても簡単に書くことができます.

2015年 12月 8日現在の実装では並列には動いても異常に CPUリソースを喰ったり問題が山積みです. 利用の際はご注意ください. クリスマスまでにちゃんと動くのだろうか :sweat_smile:
法人番号システムのWeb‐API機能をビジネス活用しよう（申請編）

　こんにちはy-okudaです。私はファーストサーバでバックエンド系のシステムを担当しています。

　職業柄、情報セキュリティについてやコンプライアンスに関して日々色々とインプットを得るようにしていますが、そのあたりの分野での今年のトピックと言えば、やはりマイナンバー法のインパクトが大きかったと思います。しかし、むしろ私が興味を持ったのは、それに隠れて？同時に運用が開始された**”法人番号”**なるものなのですが、みなさんご存知でしたでしょうか。

#法人番号とは#
　マイナンバーが個人にひとつひとつユニークな番号が付与されるのと同じく、国内の法人・団体に対して登記と同時に与えられるユニークな13桁の識別番号が法人番号です。
　これは法人登記情報がベースとなっているため、管理面においては**マイナンバーとは全く正反対で、全てが公開情報**となっており、国税庁自身が次の4つの形式（いずれも無料）で情報提供を行っています。

 1. Webサイトでの検索・閲覧
 2. ダウンロード
 3. 全件データの情報記録媒体による提供
 4. Web-API機能

　この中で私が注目していたのが、4つ目の**Web-API機能**です。法人番号をキーに登記情報が自由に検索でき、XML形式のレスポンスで商号や郵便番号、住所などを得ることができます。すでに12月1日から正式運用されています。

　「**[Zenlogic](https://zenlogic.jp/)**」のお申込みフォームなどにも、もちろんサインアップの機能やそれに伴う法人名や住所の入力欄がありますが、お客様に最初に法人番号を入力いただくことによって入力補助にも使えますし、簡易な実在確認手段としても使えそうです。この番号自体も公開情報ですので、取扱いのセキュリティポリシーについてもあまり心配はありませんので、これを利用しない手はありません。

　なお、法人番号については国税庁のサイトにFAQが用意されていますので、詳しくはこちらをご覧ください。
　https://www.nta.go.jp/mynumberinfo/FAQ/03houjinbangou-kohyo.htm

#Web‐API機能を使うには#
　上記4つの提供方法のうち、Webサイトでの閲覧やダウンロードはいつでも誰でも行うことができますが、Web-API機能の利用については申請制になっていますので、まず国税庁に届出情報を送信し、**アプリケーションID**を入手する必要があります。甚だ簡単ですが、以下にその流れを説明しておきます。

1.法人番号システムWeb-APIの概要
　まず下記のサイトで概要や注意事項を確認しておきましょう。
　http://www.houjin-bangou.nta.go.jp/webapi/index.html

2.アプリケーションIDの申請
　Webフォームから申請ができますので、実際に申請を行います。
　フォームの案内に従って必要事項を入力して行きます。
　https://www.houjin-bangou.nta.go.jp/webapi/riyo-todokede/
　![alt](https://lh3.googleusercontent.com/hfAkozmZNgQpqQwZ8S7E_iTLqkeyvumarGkW8z7bID3SvbTYmpveuW3-1-V2g8B8N21GhrbAbrTa6zFnNGujd8I50_e4dxmDQ1zB4yxOX6Bw1L_cwwRiK7qMpKgOBlIr9ydMpyXMuKvLwtOCaYYTr57xj-Ntf5LR8VzGmluQNbbPezsC3UPfv7fNW7GxHA9RSaYbZzqn_gonA4iILcgiVozDK3BRrxBsbGkdQh3ull8b6YId0NFB2WzGJSpeDUhX-aBkzEk3XU6PXVXSOK7YXrsvngAZ54uF7LIP_n3csE25ydVJYgalEDmXCYuDFHhj_k8rOi-fg9CePVBl8T_T3eI6ameZw7qVM2ff3_3ijuksbiM2qdxXQedNV8j5mp_mAQViWqOAML03PRYCYp4Z378DmanY-2VppRnguxSBvIOMUBihwelAzBPTh9r9IIgq8enJok8pD6pBgOg__Xwu1R7ew8XMguIshJtTOXEAr5l1dEorrbEYMx5fEE-9EXcO-h7WisIwUdahXOmKHgmfQzfdbY7jG2uggci8X2ut2Q=w741-h559-no)

3.アプリケーションIDの発行届出の完了
　全ての入力を終えると、完了画面が表示されました。
　アプリケーションIDは**郵送**で送られてくるそうですので、じっくりと**1週間ほど**待ちましょう。
　https://www.houjin-bangou.nta.go.jp/webapi/riyo-todokede/
　![alt](https://lh3.googleusercontent.com/4FUsmjPv6YVNXNr4_wCp3rroXq3j82TNy1RTyYFAyYxntl4Emg23OUfdw9bEfxmnFMgSCpQqrNmLmiKk6mU4kW4WdbIJ20F8F4LRFs0YLOJ0vI5aj4dkPHi2YohDcZlQIqSZDLGzdBO0X7SupoxEszvtapAyY8zqyNkS_qR81L_wFmuQJfhK-Hvfl6pA08OHSO4UeRAD3v5ijuc-o8cv5j1Rcx5jI29Kf7bs03A6LjZvGG8u9-C9OCHFgwJKM5N8D_9sK0S_ooWV5jJwP4jDkaq730ZcsWxmY8hL7WmgbOvjyC1lfb00sFUL6Fto4CbaxrN64Mx6XmrNmzQtF_Hr_S9QnFkXHb5c3d95Fp8yNZ6LdnRtgl0qFJVso_p06KRMajo-adefvqu6SZo_DOJDV1UfS2mQeuYlsxwJmlU9pITwI9DBxgSkOSwQn8ah38SFcaGUE9XynjFNvvySdgFqIQM6F4ZPh631MUtOkR4tj8AcYADRoFlp7YHbfMB1iGruENNspxQ3AShZikCMD2N5kR_S6MLrB7rDYHyG8cbGlA=w741-h558-no)

※記録媒体（DVD）による提供については書面での依頼が必要です。詳しくは下記をご覧ください。
　http://www.houjin-bangou.nta.go.jp/download/baitaiteikyo/

#次回予告#
　今回は法人番号とはどういったものかと、利用申請の方法までを解説しましたが、次回は実際にこのAPIを利用方法を中心に書きたいと思っています。
ldapのマルチマスタ設定とELB越しにldaps通信設定

備忘録です。

### 構成：
`ldap1`　<-- multi master replication --> `ldap2` <-- `ELB` <-- read only(ssl) -- `ldap-proxy1`

こんなかんじで。


### replication設定
とりあえずreplication関連の設定を抜粋してとっておきます。
（本物はchefでやっててattributeが散在でかなりわかりにくいので脳内整理したかっただけ）

```ldap1：slapd.conf
# Global section
serverID    1
# syncrepl directive
syncrepl        rid=001
                provider="ldap://ldap2.hoge.com"
                bindmethod=simple
                binddn="uid=Rep,ou=System,dc=hoge,dc=com"
                credentials={SSHA}vt1Wi0m**********************
                searchbase="dc=hoge,dc=com"
                schemachecking=on
                type=refreshAndPersist
                retry="60 +"
mirrormode on
```

```ldap2：slapd.conf
# Global section
serverID    2
# syncrepl directive
syncrepl        rid=001
                provider="ldap://ldap1.hoge.com"
                bindmethod=simple
                binddn="uid=Rep,ou=System,dc=hoge,dc=com"
                credentials={SSHA}vt1Wi0m**********************
                searchbase="dc=hoge,dc=com"
                schemachecking=on
                type=refreshAndPersist
                retry="60 +"
mirrormode on
```

```ldap-proxy1：slapd.conf
# Global section
serverID    3
# syncrepl directive
syncrepl        rid=001
                provider="ldaps://elb.public.address:10636"
                bindmethod=simple
                binddn="uid=Rep,ou=System,dc=hoge,dc=com"
                credentials={SSHA}vt1Wi0m**********************
                searchbase="dc=hoge,dc=com"
                schemachecking=on
                type=refreshOnly
                retry="60 +"
                tls_cacert=/etc/openldap/certs/hoge.cacrt
                tls_cacertdir=/etc/openldap/certs
                tls_reqcert=demand
                interval=00:00:00:30
mirrormode off
```

### ELB設定
ELBはServerCertとKeyをいれて
listnerはSSL:10636->TCP:389で
Route53にA(ALIAS)レコード登録しといて
ldap-proxy1のproviderにldaps::/アドレス:listner-portと指定しcacert認識できるようにする
とつながる。
たぶん。

### コツなど
typeをrefreshOnlyにすると常時接続じゃなくて時々再接続にいきましてSSLとかELB越しな場合にいいかんじに。
（常時接続系はELBとは相性悪いようだった）
mirrormode offだとreadonlyになります。
chefだとproviderとかserveridはnodeのjsonで管理に。
複数AWSアカウントまたぐ感じだとclient側のproviderはdata_bagsに入れるといいかんじでした。
VPCpeeringすればSSLにしなくてよくてもっと簡単かと。
今回はVPCpeeringはAWSアカウント間はできるけどやりたくないという話でSSLすることに。

### 参考
[第20回 OpenLDAPの冗長化対策【2】：そろそろLDAPにしてみないか？｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ldap/0020)
[Amazon ELBをうまくつかうには、KeepAliveを有効にしよう。Timeoutは60秒よりだいぶ長くしよう。その背景。 | debiancdn](https://debiancdn.wordpress.com/2012/06/14/amazon-elb%E3%82%92%E3%81%86%E3%81%BE%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%86%E3%81%AB%E3%81%AF%E3%80%81keepalive%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%82%88%E3%81%86%E3%80%82timeout%E3%81%AF60/)
[AWS Blackbelt 2015シリーズ Elastic Load Balancing](http://www.slideshare.net/AmazonWebServicesJapan/aws-blackbelt-2015-elastic)

以上。
c++ builder XE4, 10.2 Tokyo > fileIO > デスクトップのパスを取得 > char buf[MAX_PATH]; / SHGetSpecialFolderPathA(HWND_DESKTOP, &buff[0], CSIDL_DESKTOP, FALSE);

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

デスクトップのパスを取得したい。

参考
http://stackoverflow.com/questions/17933917/get-the-users-desktop-folder-using-windows-api

```Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	char buff[MAX_PATH];
	SHGetSpecialFolderPathA(HWND_DESKTOP, &buff[0], CSIDL_DESKTOP, FALSE);

	ShowMessage(String(buff));
}
```
mysqlにhaproxyのチェックユーザー作成

haproxyにてmysqlのヘルスチェックを行っていた時に、エラーが頻発して、コネクションが解放されずに溜まってしまい、最終的には接続ができなくなった問題がありました。

```haproxy.cfg
option mysql-check user haproxy
```

ここではhaproxyユーザーがmysqlに登録されていないために発生したようです。
mysql側にhaproxyユーザーを作成して、解決しました。
AWSよく見るページメモ

## はじめに
AWSを使う時によく見るページのメモです。

## インスタンス生成時にみる鉄板ページ

* [0から始めるAWS入門：概要](http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)
* [0から始めるAWS入門①：VPC編](http://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b)
* [0から始めるAWS入門②：EC2編](http://qiita.com/hiroshik1985/items/f078a6a017d092a541cf)
* [0から始めるAWS入門③：ELB編](http://qiita.com/hiroshik1985/items/ffda3f2bdb71599783a3)
* [0から始めるAWS入門④：RDS編](http://qiita.com/hiroshik1985/items/6643b7323183f82297b2)
* [0から始めるAWS入門⑤：AMI・冗長化編](http://qiita.com/hiroshik1985/items/ab6b6e085fa941ea0456)

何をするにもこのページが僕の基本になってる。
感謝です。

## セキュリティグループ

* [AWSセキュリティーグループのメモ](http://qiita.com/syou007/items/48c85023ce6cbe245ab0)

今更見ることもないけど、、、たまにポート番号を忘れるので。

## ユーザー追加

* [Amazon EC2にSudoユーザーを追加する](http://qiita.com/syou007/items/f3feaa6688ce70900642)

だいたいChefで行うので、あまり使わないけど。

## S3

* [RubyからS3を使ってみる](http://qiita.com/katsuyoshi/items/d693e57eadc40465e7e6)
* [Railsで開発環境はpublicに書き込むS3にアクセスするクラスを書いた。](http://qiita.com/syou007/items/44d92104c71f845d31fc)

`aws-sdk`は仕様が変わりやすいので注意

## RDSの設定

* [RDSで日本語が文字化けする問題](http://qiita.com/reoy/items/e355debf1e2b2abd703b)

UTF8の設定は初めにやらないと悲劇が起こる。

## IPアドレス固定

*[Amazon EC2編～複数IPを付けてみよう～](http://recipe.kc-cloud.jp/archives/6513)

EIPだけで大抵は問題ないけど。
MySQL俺的まとめ

授業で扱った内容のまとめとして記します。誰かの役に立てばいいと思います。

>参考文献　”データベースの基礎”
>著者　永田　武

ログイン　
mysqｌ -h サーバー名　-u ユーザー名　データベース名　-p パスワード

列の抽出
select 　列名、列名２、列名３...　from テーブル名

すべての列の抽出
select * from テーブル名

テーブルの作成
create teble テーブル名 (
)

行の追加
insert into テーブル名 values(値１、値２、値２);

行の削除
delete from テーブル名　where 条件(列名);

行の更新
update テーブル名 set　列名＝値　where 条件;

二つ以上の条件
select 列名　from テーブル名　where 条件１　and 条件２;

テーブルの削除　
drop table テーブル名;

ビューの作成(もともとあるテーブルから作る)
create view テーブル名(列名1,列名２) as select 列名１、列名２ from テーブル名 where 条件１;(ビューの範囲を指定)

権限の付与（GRANT文）

GRANT　権限名　ON テーブル名 TO ユーザ
たとえばユーザ０１に商品の表のデータ参照と変更の権限を与えるGRANT文は
grant select, update on 商品 to user01;

教科書　P80

どのようにデータベースからほしい情報を抜き出すか

本日学ぶ内容
・関係演算子
・論理演算子

関係演算子
否定　<>

mysql では　数字は'10' 囲んでもよいし　10 囲まなくてもよい
文字列は必ず囲むこと

select * from テーブル名 where 点数　<> '10';　（１０ではない行を抽出）

select * from テーブル名　where 点数　>= 10; (１０以上の行を抽出)

以下　<= ,> ,< も同様


論理演算子

論理演算子の優先順位P84

select * from テーブル名　where not 商品名 = '定規' ; 定規以外の行を抽出

select * from テーブル名　 where 商品名 = '定規' or 単価 <150;
 
not -> and -> or

・その他の演算子

・between ～以上～以下
select * from テーブル名　 where 単価　between 100 and 150;　（１００以上１５０以下）

・in いずれかの値と等しい

select * from 商品2 where 商品名 in ('ボールペン','消しゴム','定規');　（ボールペンまたは消しゴムまたは定規）

select * from テーブル名 where 商品名　in (select 商品名 from 商品2 where 単価 between 100 and 150); など

・like 演算子
like演算子は、指定した文字列のデータのパターンマッチングを行うときに使用する。＾
select * from 都道府県　where 都道府県名 like '山%';　(山から始まる都道府県名を抽出)
select * fro 都道府県　where 都道府県名 like '%山%' ; (山を含む都道府県名を抽出)
select * from 都道府県　where 都道府県名　like '_山_'；（真ん中が山の３文字の都道府県を抽出）

・集合関数

select sum(列名)　from テーブル名;

select sum(点数) from 受験結果; 点数の合計値を出す.

select avg(点数) ・・・

select max(点数)・・・

select min(点数)・・・

select count(列名)・・・（指定した列のNULL以外のデータの個数を抽出）

副問い合わせ


select 受験番号,点数 from 試験成績　where 点数 >= (select avg(点数) from 試験成績);

in演算子を用いた副問い合わせ
select 学生番号,学科,名前 from　学生　where  学生番号 in (select 　受験番号　from 試験成績4 where 点数　>= 60 )；

表名.(ピリオド)列名    (違う列を比較することができる)
gitでpull requestする先のbranchの変更点を先に取り込む方法

# 概要
gitで、developをlocalにcloneしてきて、そこからbranchを切って、pushして、pull requestを送る、みたいな流れはよくあると思う。
その時に、developが更新されていて、その変更点を先に取り込んでおきたい時の方法。

# 方法

```
git checkout develop
git pull origin develop
git log #最新になっているか確認
git checkout feature/reportpage #開発中のbranchに移動
git rebase develop
# 競合を解決
git rebase --continue
git push -f feature/reportpage
```
詳細！ Swift iPhoneアプリ開発入門ノート


私がObjective-C でのアプリ開発初心者の時にお世話になった大重美幸さんの「詳細！ Objective-C iPhoneアプリ開発入門ノート」の Swift2 版です。
![IMG_0376.jpg](https://qiita-image-store.s3.amazonaws.com/0/60473/3bb62b69-36e3-671f-34ee-c9eba17b42e3.jpeg "IMG_0376.jpg")

Swift1.2版も出ていましたが、Swift2 版になって 最新Swift の復習も兼ねて改めて見直してみました。Objective-Cの版では言語シンタックスよりも実際に動作するUIを使った実際に動作するアプリを作ることに重点が置かれていましたが、このSwift 版ではより言語シンタックスの解説にページが割かれています。これはSwift になってPlaygroudが使えることも影響しているでしょう。特に実際にはよく使われるけれども初心者には少し難しい「クロージャ」や「ジェネリクス」、「オプショネルチェイニング」や「イニシャライザ」などもこのシンタックスの中で説明されているので、Swift のシンタックスをより深く学習することができます。ただし、iPhone アプリ初心者にとっては少し難解かもしれません。
Part3 のiOSアプリ作成の部分でもiOS9から導入されたSize クラスやStackView もしっかりと説明されていますから、最初の段階からUIの制約設定なども学ぶことができます。
書籍の構成としてはObjective-C の版からそれほど変わっていません。掲載されているサンプルは、それぞれのチャプターでの学習項目の動作を確認するにはよくわかり、リストもわかりやすくなっています。サンプルも豊富なので、実際のアプリを作っている時に似たような機能を使おうとする時に参考になります。Part3 のアプリ作成の部分はわかりやすく初心者向けになっていますが、その前のPart2 の言語シンタックスのボリュームが増えた分だけPart2 で挫折を味わう初心者も出てくるかもしれません。
初心者の方はPart2 と Part3 を並行して学習する方が進歩が実感できるかもしれません。
大重さんにはここから中級者に向けて言語仕様ではエラーハンドリングを取り上げ、プロトコルやジェネリクスをもっとしっかり解説し、プログラム作成ではEventKit やAddressBook などのより深いAPI を扱った中級者向けのノートを出していただければと思います。
あえて欠点を探すならば、まだ初版第１刷とはいえ本文中の誤記が少し多いように思います。
情シス（コストセンター）が利益を生むために


はじめに
---

興味ある人は皆無と知りつつ、社内システムの中でも経費精算の話を。技術ネタではないです:sweat_drops: 
個人・法人問わず:moneybag:利益:moneybag:を生み出し続けることが、なんだかんだ使命ですよね。
会社組織でコストセンターと見なされる情報システム部に、たまたま所属しているので取り組みを書きます。

コストセンターで利益を生む:moneybag:
---
水で火を起こせるか、という話です:bomb: 
社内システムを例にプロフィット化の手段をいくつか挙げます

1. 自社内システムを商品化して売りまくる
* 自社内システムの継続的改善して社員の生産性を徹底的に向上させる
* アメーバ経営の協力対価を採用する
* 出来のよいフリーミアムへシフトして支出をなくす
* 外だしして出来たリソースでプロフィットサイドに移る

:point_right::point_right::point_right:今回は5.について。

何しよう？
---
（個人的には）外だししたいものが社内には盛りだくさん。アウトレットで物色する感覚です。
今回目を付けたのが、経費精算。外だし前の状態が下表です。

| 評価視点 | Before | 
| --- | --- | --- |
| 利便性 | :-1::-1::-1: |
| 操作性 | :-1: |
| TCO | :-1: |
| 個人的な好き嫌い | :-1::-1::-1: |
※上表は個人見解に基づきます

**仕事と言えども、好きでもないものと一緒に居続けることは苦しい**:bomb: 


経費精算クラウド:cloud: 
---
善は急げ、さっそく、餅は餅屋ということで経費精算サービスを採用。

**外だし成功**:clap: 

（先日、IDCFがコンカーを採用したプレスリリースがありました）
![スクリーンショット 2015-12-18 14.46.37.png](https://qiita-image-store.s3.amazonaws.com/0/103499/e21b1a67-6566-80f4-92aa-2ad19bee6c3c.png "スクリーンショット 2015-12-18 14.46.37.png")
https://www.concur.co.jp/casestudy/IDC-Frontier


コストセンターで利益を生めたか？
---
で、利益を生めたか？というと・・・

**まだまだです**:angel: 

利便性があがり、管理コストもかなり減少しました！当然か。

| 評価視点 | Before | After | 
| --- | --- | --- | --- |
| 利便性 | :-1::-1::-1: | :+1::+1: |
| 操作性 | :-1: | :+1: | 
| TCO | :-1: | :+1::+1: |
| 個人的な好き嫌い | :-1::-1::-1: | :+1::+1: |
※上表は個人見解に基づきます

画面はこんな感じです。
![スクリーンショット 2015-12-18 18.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/103499/55e9bce5-72f3-d17c-0da0-e588a91482bf.png "スクリーンショット 2015-12-18 18.19.13.png")

今後、空いた時間でAPIを使った画面開発を取り組む予定。
https://developer.concur.com/api-reference/

APIやコンカーオープンプラットフォーム戦略を知ると、只者ではない感じがします。



まとめ:tada: 
---
* 外部サービスで管理から解放。時間ができた:v::v: 
* 時間ができると欲がでて、こだわりたくなった:bicyclist:  
* プロフィットサイドに移るのは時間がかかりそう:turtle: 
* 水で火を起こすことができるらしい:fire: 

ご清聴ありがとうございました:bow:
MySQLのgeometry型で○km以内の場所を取得してみました

これは[Gaiax Engineers' Advent Calendar 2015](http://qiita.com/advent-calendar/2015/gaiax)の8日目の記事です。

Gaiaxで主にPerlを書いてます@mitaniです。
最近は[TABICA](https://tabica.jp)という「地域の暮らしを旅する」をコンセプトにした、地元の人が開催する旅(ツアー)の予約サービスの開発を行っています。

# TABICA(たびか)へのレコメンド機能追加
今回、特定の場所(過去の予約や、閲覧している旅など)から近くの旅をレコメンドする機能を実装する事になりました。

以下は、レコメンド機能の実装の際にやってみたまとめになります。
MySQLのgeometry型については、エンジニアネタとしては使い古された感じもありますが大目に見てもらえると幸いです。

# 既存のデータ
[TABICA](https://tabica.jp)ではGoogleマップを利用して旅の開催場所を表示するために、MySQL(5.6系)で各旅の位置(緯度経度)をgeometry型で保持しています。

以下のようなテーブルに

```sql
CREATE TABLE `spot` (
  `id` bigint(16) unsigned NOT NULL,
  `latlng` geometry NOT NULL,
  PRIMARY KEY (`htm_id`),
  SPATIAL KEY `latlng` (`latlng`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
```

以下のようなデータが入っています。

```sql
mysql> SELECT id,ASTEXT(latlng) FROM spot;
+----+---------------------------------------------+
| id | ASTEXT(latlng)                              |
+----+---------------------------------------------+
|  1 | POINT(139.7454299032688 35.65858405958573)  |
|  2 | POINT(139.8106947541237 35.71006652116823)  |
+----+---------------------------------------------+
```

idには各旅固有のidが、
latlngには該当の旅の場所の緯度経度が入っています。

**ASTEXT**
geometry型をそのまま取得するとバイナリが取得されて人には読めないので、文字列で結果を取得します。

**POINT**
座標から特定の場所(点)を表すデータ型。

# 近い順に旅を取得
上記のテーブルからまずは **特定の旅(id=1)** の場所から近い順に旅のidを取得しようと思います。

```sql
SELECT
  s2.id,
  GLENGTH(GEOMFROMTEXT(
      CONCAT('LINESTRING(',
          X( s1.latlng ),' ',Y( s1.latlng ), ',',
          X( s2.latlng ),' ',Y( s2.latlng ),
      ')'
  ))
) AS distance
FROM spot AS s1
  INNER JOIN spot AS s2
WHERE s1.id = 1 AND s1.id != s2.id
ORDER BY distance;
```

上記で、**特定の旅(id=1)** から近い順に旅を取得する事ができました。
id=1の緯度経度から、id!=1の緯度経度まで線を引いて、線の長さが短い順に並べるという具合です。

**GLENGTH**
LINESTRINGの長さを取得。

**LINESTRING**
POINTとPOINTを繋いだ線を表すデータ型。

**X**
経度

**Y**
緯度

**GEOMFROMTEXT**
geometry型への変換。

**CONCAT関数**
これは説明不要だと思いますが、文字列結合です。

# 近い順？？
上記のSQLでは、近い順に旅を取得することができましたが、このままでは1000kmも2000kmも離れてる旅がレコメンドされる事になってしまい、とても近いとは言えません。
今回は歩ける距離ということで、1km以内を近い旅としました。

そこで問題となるのが、GLENGTHで取得できる距離の単位が**度数**なこと。
まずは**1kmが何度なのか**を知る為に**地球の外周が何kmなのか**を把握する必要があります。

Google先生曰く、地球の外周は約40075kmとの事なので、
40075km / 360度 ≒ 111.3194km
1度は、約111.3194kmのようです。
(およその数字にしているのは、地球が完全な球体ではない為です)

1 / 111.3194 ≒ 0.0089831601679492
1kmは、約0.0089831601679492度ですね。
(すでに誤差があるので、もう1km≒0.009度にしてしまってもいいかもしれませんが)

先ほどのSQLに条件を追加して、**特定の旅(id=1)** から約1km以内の旅を近い順に取得してみます。

```sql
SELECT
  s2.id,
  GLENGTH(GEOMFROMTEXT(CONCAT(
      'LineString(',
        X( s1.latlng ),' ',Y( s1.latlng ), ',',
        X( s2.latlng ),' ',Y( s2.latlng ),
      ')'
  )))
  AS distance
FROM spot AS s1
  INNER JOIN spot s2
WHERE s1.id = 1 AND s1.id != s2.id
GROUP BY s2.id HAVING distance <= 0.0089831601679492
ORDER BY distance
```

上記のSQLで**とある旅(id=1)** から約1km以内の旅を近い順に取得することができました。
これで、条件が何km以内であっても取得できそうです。

# 明日(9日目)の記事は？
明日はGaiaxの図書委員長こと @kyrieleison さんです。
当記事より100倍は役立つと思いますのでお楽しみに。
AssetManagerEx

AssetManagerExを使ってみた。

公式：
http://www.cocos2d-x.org/wiki/Assets_manager

---

##まとめ
用意するもの。
マニフェストファイル＝３種

- ローカル：マニフェスト　＜初回起動時に読み込む。バージョンや、リモートにあるマニフェストのアドレスが必要。
- リモート：バージョンマニフェスト　＜バージョン情報などを書く。
- リモート：マニフェスト　＜バージョン情報などに加えてダウンロードさせたいファイルの情報を書く。

初回実行時：
　ローカルのマニフェストから情報を取得。
リモートのマニフェストを二つ共ダウンロードする。
（書き込み可能領域に保存される。）
バージョン情報、ファイル情報が共に更新されていた場合。
そのファイルをダウンロードしてくる。
　ダウンロード完了後
リモートのマニフェストファイルが保存される。
保存時のファイル名は規定の物がつけられる。
　project.manifest
　version.manifest

実行

```c++
auto am = AssetsManagerEx::create( "project.manifest", writablePath()+"folder" );
am->retain();
am->update();
```

AssetManagerExに関連するイベントの取得方法。
　EventAssetsManagerEx
　EventListenerAssetsManagerEx
 
---
不明点のメモ
マニフェストの以下の項目の用途
```
"searchPaths" : [
]
```

---

####以下、失敗時のメモ

urlやファイルについて記述したマニフェストファイルを用意する。
これをサーバーに保存した。

中身。

実装コード
１
 auto am = AssetsManagerEx::create(manifest_url, path);
 am->update();

失敗した。
cocos2d: fullPathForFilename: No file found at image/project.manifest. Possible missing file.


project.manifestファイルが存在しないと言われる。
どうやら、設定したストレージパスの中に"project.manifest"を配置する必要があるらしい。
_cacheManifestPath = _storagePath + MANIFEST_FILENAME;

解決：
　　とりあえず、サーバーに保存したものと同じものエラーで示された場所に置くことにする。


失敗した。
cocos2d: fullPathForFilename: No file found at https://example/ex_project/resource/version.manifest. Possible missing file.

なので、今度は　version.manifest　を配置します。
と思いきや、、、待てと、
なぜURLが表示されている？　マニフェストに記述した値が間違ってるかもしれません。

解決：
AssetsManagerEx::create(manifest_url, path);
この時に渡す　第１パラメータはurlではなくversion.manifestのファイルパスだった。


失敗した
cocos2d: fullPathForFilename: No file found at image/project.manifest.temp. Possible missing file.

内部的にはtempとして一旦DLしたマニフェストファイルを保存しているっぽい。？？
違う、意味不明。

そもそも、その前にエラーが出ていた、これはなんだ
File parse error 10 at <\235,
    "re>
ただただ、マニフェストファイルの記述が間違っていた。"!=”
振り出しに戻る。
　やはりversion.manifestが存在しないところから始まる。


・・・
まずはダウンロードが始まらないということが問題。

バージョンパラメータの比較で同値になってる何故だ
ローカル0
リモート2
比較時＝0
リモートはどこいった？
Java JNA でネイティブライブラリの検索パスを設定する方法

Java JNAで、NativeLibrary.addSearchPathを使用することで、ネイティブライブラリ（DLLやSOなど）の検索パスをプログラムから設定することができます。

JNAを使用する場合、ネイティブライブラリ(DLLやsoなど）をパスの通った場所（WindowsだとC:Windows\System32）に置くか、Eclipseを使用している場合だと「実行構成」の「環境」に「PATH」という環境変数を作ってネイティブライブラリの検索場所を指定する、という方法がありますが、どちらも環境設定が若干面倒で、gitやsvnから開発環境をチェックアウトした直後に、その設定を忘れていてマトモに動かない、といったことが結構発生しますので、そのようなケースに便利かと思います。

以下、Tomcat(動作確認環境は Tomcat8 )での使用例です。ネイティブライブラリは WEB-INF/lib 配下に配置している前提です。

```java:TestServletContextListener.java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import com.sun.jna.NativeLibrary;

@WebListener
public class TestServletContextListener implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent event) {

		String path = event.getServletContext().getRealPath("/WEB-INF/lib/");
		NativeLibrary.addSearchPath("hogehoge", path);

	}

	@Override
	public void contextDestroyed(ServletContextEvent event) {

	}

}
```
PHPを動かしたことが無い初心者プログラマーが、PHPのプログラムをapacheで実行するまで(for Macユーザー)


## 1. Apacheの動作を確認する

MacにはApacheが標準でインストールされている。

以下のコマンドでApacheを起動。

```bash
$ sudo sudo apachectl start
```

PCのパスワードの入力を求められるので、入力する。

次にWEBブラウザ(Safari or Chrome)で、```http://localhost/index.html```にアクセスする。

これで```It Works!```と表示されていれば成功。

## 2. PHPの動作を確認する

### 2-1. 最初は上手く動作していないことを確認

以下のコマンドでドキュメントルートディレクトリに移動する。

```bash
$ cd /Library/WebServer/Documents
```

ここで、```sample.php```というファイルを作ってみる。

```bash
$ sudo vim sample.php
```

これでできたファイルを以下のように編集してみる。

```php:sample.php
<?php
  print 'It Works!';
?>
```

保存するときは以下のコマンドで。

```bash
:wq!
```

この状態で```http://localhost/sample.php```にアクセスすると、編集した内容がそのまま表示されているはず。

これはPHPのプログラムがApacheで動作していないから。

### 2-2. PHPを有効にする

そこでApacheの設定を変える。

```bash
sudo vim /etc/apache2/httpd.conf
```

これで、コメントアウトされている、

```conf:httpd.conf
# LoadModule php5_module libexec/apache2/libphp5.so
```

という部分を、以下のように```#```を消してコメントアウトを解除する。

```conf:httpd.conf
LoadModule php5_module libexec/apache2/libphp5.so
```

この状態で、以下のコマンドでApacheを再起動する。

```bash
$ sudo apachectl restart
```

これで再び```http://localhost/sample.php```にアクセスすると、今度こそ```It Works!```と表示されているはず。

### 2-3. 日本語を有効にする

先ほど作成したファイルを、

```php:sample.php
<?php
  print '日本語を表示';
?>
```

と編集して```http://localhost/sample.php```にアクセスすると、文字化けしているはず。
これは日本語の利用が許可されていないからなので、次に日本語を有効にする。

以下のコマンドで、設定ファイルの雛形(default)をコピーする。

```bash
$ sudo cp /etc/php.ini.default /etc/php.ini
```

コピーした```/etc/php.ini```を開き、以下の部分を、

```ini:php.ini
;default_charset = "UTF-8"
```

以下のように```;```を削除して日本語を有効にする。

```ini:php.ini
default_charset = "UTF-8"
```

これで```http://localhost/sample.php```にアクセスすると、日本語がちゃんと表示されている。
nginx 起動ポートの変更

nginx で使用するポートの変更(Ubuntu)

このファイルの設定を変更すればOK
sudo vi /etc/nginx/sites-enabled/default


変更前

```
server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;
```

変更後

```
server {
        listen 81 default_server;
        listen [::]:81 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;
```
OpenCV3 インストールバトル

openCV3 + python(2.7) のインストールメモ

# 環境

* Ubuntu 14.04 Desktop

# 準備

ビルドに必要そうなライブラリ等のインストール。
全部apt-getですませちゃう。(おそらく不要なものも含まれているはず)

```
$ sudo apt-get update
$ sudo apt-get install git cmake python-numpy python-dev libpng12-dev libjpeg-turbo8-dev libtiff5-dev libgtk-3-dev libeigen3-dev libopencv-dev
```

# OpenCV3
ソースをとってくる。
xfeatures2dを使いたいがそれはopencv_contribにおるので
それもとってくる。

```
$ git clone https://github.com/Itseez/opencv.git
$ git clone https://github.com/Itseez/opencv_contrib.git
```

つぎにcmakeを走らせる。
フラグで指定することでopencv_contribもまとめて面倒みてくれる。

```
$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D WITH_EIGEN=ON \
        -D OPENCV_EXTRAMODELUES_PATH="<path/to/opencv_contrib>/modules" \
        ..
$ make
$ sudo make install
```

cmakeの出力を見て自分の使いたいモジュールなり、ライブラリなりがちゃんと使えそうかみるとよい。

# 注意

ライブラリ追加忘れとかでcmakeし直すときはちゃんとCMakeCache.txtを消し去りましょう。
【OSX】ネットワークインターフェースUP時に静的ルーティング設定を行う


```bash:static-route.sh
#!/bin/sh

# TODO 既存設定の有無チェック
route delete <宛先アドレス>

# TODO ゲートウェイへの疎通待ち
route add -host <宛先アドレス> <ゲートウェイ> <ネットマスク>
```

*※root権限で実行させるため /Library/LaunchDaemon/ 以下に入れる

```xml:/Library/LaunchDaemons/static.route.on.ifup.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>toggle.static.route.on.ifup</string>
  <key>LowPriorityIO</key>
  <true/>
  <key>RunAtLoad</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
    <string>/path/to/static-route.sh</string>
  </array>
  <key>WatchPaths</key>
  <array>
    <string>/etc/resolv.conf</string>
    <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
  </array>
</dict>
</plist>
```

```bash:launchctl
sudo launchctl load /Library/LaunchDaemons/static.route.on.ifup.plist
```
Rubyスクリプトを使って、ファイルの文字エンコードを変更する話

# レガシーマイグレーションっぽい話

昔作成されたhtmlファイルの文字エンコードがUTF-8でなかったので、全部UTF-8に置換する必要がでてきた。

## しかし、環境依存文字が紛れていた！！
「①」とか。これが入っていると置換処理するときにエラーの原因になるので、回避したい。

# 解法
1：先にUTF-8に変換して保存する

1-1:エンコード形式をutf-8に指定して開く
1-2:１行ずつ読み込む
1-3:書き込み処理を行う

# サンプルコード

ruby のバージョンは 2.1.5 です
<pre>

# 第一引数に変換元のファイルパスを、第二引数に変換先のファイルパスを記述している

#書き込み用に、新しい配列を用意する。
newLine = Array.new

#まず、ファイルを開く
File.open(ARGV[0],"r:UTF-8") do |file|

#１行ずつ読み込む
#each do だとうまくいかなかった。

	while readLine = file.gets

		newLine.push(readLine)
	
	end
#読み込み処理終わり
end

#書き込むパスを決定する
writeName = ARGV[1]

#書き込み処理をする。
File.open(writeName, "w:UTF-8" ) do |file|

	newLine.each do |line|
		file.write(line)
	end
	
end

</pre>
WordPressの投稿データを、カテゴリー別に引っ張ってくるSQL

# こんなケース

WordPressの便利なところは、とりあえずブログ感覚で情報を発信できることや、プラグインなどを入れてカスタマイズしやすいところにあると思う反面、かゆい所に手が届くような機能を用意するのは以外と難しいような。


* ニュースなど、頻繁に更新する部分はWordPressで公開
* それ以外のページなどは直接HTMLやら生PHPとかで 

なんていうケースも多いかなと思います。

# WordPressの外だと直接SQLを投げる必要がある

以下、WordPressの投稿内容などがデータが入っているテーブルの接頭辞を　"wpfoo_" とみなします。

##　現時点で、公開中のデータを表示する

記事そのもののデータは、wpfoo_postsに記載されているので、
単純に公開中のデータから投稿した日時が新しい順に取得する場合、下記のようなSQLを投入します

<pre>
SELECT id, post_author, post_title, post_content
FROM  `wpfoo_posts` 
WHERE post_status =  "publish"
ORDER  BY post_date DESC 
</pre>

ところが、「特定のカテゴリに属する記事」かつ「記事のスラッグでカテゴリ分別は可能だが、カテゴリのIDがわからない」という制約条件が加わるので、少し話がややこしくなります

* wp_posts タイトルや投稿本文などが存在する
* wp_terms　カテゴリ名とスラッグが保存されている
* wp_term_relationships 投稿のIDとタクソノミーIDが関連付けられている
* wp_term_taxonomy タクソノミーIDとカテゴリーIDが関連付けられている

ザッと、これだけのテーブルが絡んできます。
スラッグ名から投稿とカテゴリの関連付けにたどり着くまでが少しややこしいです。
そんな時は、問題点を細かく分解して少しずつ解いていきます

## 特定のスラッグを持つターム（カテゴリ、タグ）のIDを取得

まずは、スラッグ"hoge"を持つカテゴリのシリアルID(term_id)を取得するケースを想定します。

<pre>
SELECT term_id
FROM wpfoo_terms
WHERE slug =  "hoge"
</pre>

## タームIDから、対応するタクソノミーIDを取得する

タームID は　wp_termsテーブルに記載されているカテゴリなどを一意に分けるID。
タクソノミーIDは、wp_term_taxonomy テーブルに記載されている。また、一つのタームに複数のタクソノミーが存在することもある。


https://ja.forums.wordpress.org/topic/12180

ちょっとややこしい話ですが
<pre>
select term_taxonomy_id from  wp_newstest1_term_taxonomy
as tt inner join wp_newstest1_terms as ts term_taxonomy_id
on tt.term_id = ts.term_id 
</pre>


## 特定のスラッグを持つカテゴリに属する投稿のうち、公開中のデータを新しい順に取得する場合

条件が多い分、投げるSQLも長くなります

<pre>
SELECT id, post_author, post_title, post_content
FROM wpfoo_posts
WHERE post_status =  'publish'
AND id = (

SELECT object_id
FROM wpfoo_term_relationships
WHERE term_taxonomy_id = ( 
SELECT term_taxonomy_id
FROM wpfoo_term_taxonomy AS tt
INNER  JOIN wpfoo_terms AS tm ON tt.term_id = tm.term_id
WHERE tm.slug =  "hoge"  )
)
ORDER  BY post_date DESC 
</pre>

サブクエリが入り組んでいて見苦しいですが・・・。
ここに至るまでに、最初のSQLから徐々に進めてきました。
ColorboxがiOS版safariでズレる

# 現象
ColorboxがiOS版safariで、上下中央に寄らないことがある。

## 環境
・レスポンシブ
・モーダルでyoutubeを再生する

## 原因
safariのウィンドウサイズが変化するため

## 解決策
colorboxにpositionを再計算させる。

最初は[こちら](http://www.united-bears.co.jp/blog/archives/4535)を参考に動かしていたが、
動画の読み込みの関係（？）なのか、動画部分のみ上手くいかず。
setTimeoutでタイミングをずらすことで、上下中央になった。

html

```
<a href="xxxx" class="hoge"><img src="xxx.jpg" alt=""></a>
```

js

```
 $(window).on("resize load" , function(){

        if( parseInt( $(window).width() ) < 740  ){
        //スマホ
          $(".hoge").colorbox({
                iframe:true,
                width:"99%",
                height:"90%",
                onComplete: function() {
                    setTimeout(function(){
                        $.colorbox.position(0);
                    },1000);
                }
           });
        } else {
          $(".hoge").colorbox({
                iframe:true,
                width:"1000",
                height:"613",
           });
        }
    });
```
RSpecで作ったexampleの一覧をテストの実行なしに出力する


## やりたいこと

RSpecで作ったexampleの一覧をテストの実行なしに出力したい。
（つまりテスト項目一覧がほしい）

## コマンド

Rails（Spring）で実行する場合

```
$ bin/rspec -f d --dry-run --order defined
```

Bundle execで実行する場合

```
$ bundle exec rspec -f d --dry-run --order defined
```

### オプションの意味

- `-f d` = ドキュメント形式で出力する。`--format documentation`と書いても良い。
- `--dry-run` = テストを実行しない（Dry run）
- `--order defined` = 定義されている順に実行する。`spec_helper.rb`等でランダム実行を指定していなければ省略可。

## 出力例

```text
$ bin/rspec -f d --dry-run --order defined

ContactsController
  administrator access
    behaves like public access to contacts
      GET #index
        with params[:letter]
          populates an array of contacts starting with the letter
          renders the :index template
        without params[:letter]
          populates an array of all contacts
          renders the :index template
      GET #show
        assigns the requested contact to @contact
        renders the :show template

# 省略...

NewsRelease
  example at ./spec/models/news_release_spec.rb:4
  example at ./spec/models/news_release_spec.rb:5
  example at ./spec/models/news_release_spec.rb:6
  returns the formatted date and title as a string

Phone
  does not allow duplicate phone numbers per contact
  allows two contacts to share a phone number

Finished in 0.00696 seconds (files took 1.66 seconds to load)
82 examples, 0 failures
```

## 応用：フィーチャスペックだけを一覧化する

```text
$ bin/rspec spec/features -f d --dry-run --order defined   

About BigCo modal
  toggles display of the modal about display

News releases
  as a user
    adds a news release
  as a guest
    reads a news release

User management
  adds a new user

Finished in 0.00072 seconds (files took 1.71 seconds to load)
4 examples, 0 failures
```

## 参考資料

- [Command line - RSpec Core - RSpec - Relish](https://relishapp.com/rspec/rspec-core/v/3-4/docs/command-line)

## その他

上の実行例で使ったコードは電子書籍「[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)」で使われているテストコードです。

- [everydayrails/rails-4-1-rspec-3-0](https://github.com/everydayrails/rails-4-1-rspec-3-0)
KiCad を（プロキシ環境の）Windows で使ってみる

## <i class="fa fa-paw fa-fw"></i>はじめに

寒くなると電子工作の季節かなと思い，久しぶりに基板の製作をしたくなった．スイッチサイエンスさんが基板製造サービスも開始されたのでだいぶ敷居が下がったと思う．

今までは，`Eagle 5` を使ってそれほど不便は感じなかったけど，`KiCad 4.0.0` がリリースされたので一度使ってみようと思ったら，嵌まった:expressionless:

チュートリアルで躓いて心が折れそうになった．時期によったら，二度と起動しなくなったと思うが，押しのけ配線が体験したかったので調べてみた．Linux や OS X で試してないのでわからないが `Windows` のネットワークがよくないのかなと思う．プロキシ環境で `KiCad` を使う人は少ないのかな．

## <i class="fa fa-leaf fa-fw"></i>インストール
[KiCad EDA](http://kicad-pcb.org/)の `Download` から，環境にあったインストーラをダウンロードしてインストールする．

環境変数の `Path` がおかしいので，`Pcbnew` を立ち上げて，メニューバーの【環境】→【環境変数の設定】で`パス`をインストールしたフォルダに書き換える．

## <i class="fa fa-leaf fa-fw"></i>トラブル
取り敢えずチュートリアル（KiCadことはじめ）を進めていたら，`CvPCb` を起動すると，「CvPcb でフットプリント読み込み中にエラーが発生しましたと」と表示され，先に進めなくなった．

適当に検索すると，GutHub のライブラリの統廃合のため，参照先がおかしくなったみたいなことが掛れていたが，エラーメッセージの画面が違った．よくあるプロキシ環境のため，`KiCad` がお外にいけないのが原因だと `netsh winhttp...` などもしてみたが，ダメだった．

そろそろ，`KiCad` を使うのをやめようかと思っていたら [KiCad.info Forums](https://forum.kicad.info/t/github-cvpcb-behind-a-proxy/277) が見つかった．

## <i class="fa fa-leaf fa-fw"></i>対策
フットプリント（ライブラリ？）をローカルに持って来れば解決するらしい．

[KiCad/kicad-source-mirror](https://github.com/KiCad/kicad-source-mirror/tree/master/scripts)の中にそれっぽいスクリプト(library-repos-install.sh)があったので使ってみる．

`MSYS2 Shell` で作業する．（ディレクトリなどは適当に）

```
$ mkdir -p ~/Documents/Electronics/KiCad
$ cd ~/Documents/Electronics/KiCad
$ curl -O https://raw.githubusercontent.com/KiCad/kicad-source-mirror/master/scripts/library-repos-install.sh
```

```
$ ./library-repos-install.sh --install-prerequisites
```

を実行して，必要なツールの確認．`git,sed,curl` が無ければインストールする．
`library-repos-install.sh` をテキストエディタで開いて `WORKING_TREES` を変更する．

```
$ vi library-repos-install.sh
---
WORKING_TREES=${WORKING_TREES:-~/Documents/Electronics/KiCad/kicad_sources}
---

$ ./library-repos-install.sh --install-or-update
```

ダウンロードが終わるまでしばらく待つ．(sudo 関連のエラーが出るが気にしない．気になる方は，`/library-repos-install.sh` の `sudo` を削除する)

ここからは`コマンドプロンプト`で作業する．

```
copy kicad_sources\library-repos\kicad-library\template\fp-lib-table.for-pretty  %USERPROFILE%\AppData\Roaming\kicad\fp-lib-table
```

最後に `システムの環境変数` の `KISMOD` を `C:\Users\{ユーザ名}\Documents\Electronics\KiCad\kicad_sources\library-repos`に設定する．

取り敢えず，フットプリントとの関連付けが出来るようになったので，チュートリアルを進めることにする．