OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10でgit環境を作るまでのメモ。

**注意**

- 本記事は2016/03/31に作成されたものです
- OSはWindows10(64bit)です。
- 本記事には外部サイトへのリンクがありますが、その内容については保証しかねます。
  
最近windows10においてgit環境を構築したので、そのメモを残しておきたいと思います。

## インストール

windowsでgitを利用する場合、いくつか選択肢はあるようですが、今回は[Git for Windows](https://git-for-windows.github.io/)を選択。該当のページに飛び、ダウンロード&インストールするだけです。インストールガイドとしては[「私家版 Git For Windowsのインストール手順」](http://opcdiary.net/?page_id=27065)が参考になりました。

ただし当該記事ではgit用のコンソールとしてMinTTyの使用が推奨されていますが、わたしはコマンドプロンプトを選択しています。

## ローカルでgitのお勉強

Git for Windowsのインストールの際、設定さえきちんとしていればCUIからgitを利用できると思います。ここまでできれば、コマンドのお勉強ですね。学習用ツールもさまざまありますが、個人的に一番ためになったのは[ドットインストールの「git入門」](http://dotinstall.com/lessons/basic_git)だったので、それをお勧めしておきます。

## git commit に失敗する?

gitでは`git add`と`git commit`を繰り返すわけですが、コマンドプロンプトから`git commit`コマンドをたたいた場合、**コミットコメントの編集画面に移らず、プロンプトがブラックアウトしたまま、何の入力も受け付けない**という現象が起きることがあります。

gitはコメントの編集時にエディタを立ち上げる仕組みになっているのですが、windows環境ではこの立ち上げがうまくいかず、ブラックアウトしてしまうようです。したがってデフォルトで利用するエディタを設定してやる必要があります。

おのおの好きなエディタでよいと思いますが、たとえばwindowsに必ずインストールされている「メモ帳」を使う場合は以下のようなコマンドで設定することができます。

```
git config --global core.editor 'notepad'
```

またほかのエディタを利用したい場合などは[「Gitを触ってみるよ その2『WindowsでGitを使いやすくする』」](http://d.hatena.ne.jp/stellaqua/20081110/1226298802)という記事が参考になると思います。

## GitHubを利用する

さてgitコマンドが問題なく作動することを一通り確認したあとはGitHubを利用するだけですね。わたしは次のブログ記事を参考にしました:[「Windowsにgitをインストールしてgithubにpushするまで」](http://www.karakaram.com/git-install)。

懇切丁寧に説明してくれていますが、1点補足します。当該記事ではgit bashというツールにコマンドを打ち込む形で公開鍵を生成していますが、Git for Windowsを利用した場合、**その必要はありません**。Git for Windowsのインストールの際、Git GUIというツールが付随するのですが、そのツールを利用すると、コマンドを打ち込むことなく公開鍵を生成することができます。(参考:[「Github を Windows で利用する（Git GUI編）」](http://www.koikikukan.com/archives/2010/08/04-235555.php))
icomoonで好きなアイコンを追加する手順


## アイコンのSVG素材をダウンロード

* Freeのアイコン素材サイトを使う

* 白黒のFlat風アイコンならここ
	* Free vector icons - SVG, PSD, PNG, EPS & Icon Font - Thousands of free icons
http://www.flaticon.com/

* カラーアイコンならここ
	* 23,600 Free Icons - The Largest Icon Pack Ever | 
Icons8 https://icons8.com/

* SVGの色は黒を選択する

## icomoonにインポート
* IcoMoon App - Icon Font, SVG, PDF & PNG Generator 
https://icomoon.io/app/#/select

* 上記でダウンロードしたsvgをアップロードする
* 既存のicomoonのアイコンに追加する場合は、`icomoon.svg`をインポートしてから追加したいアイコンを新たに選択する
* `generate fonts`でフォントデータと`style.css`をダウンロード
* フォントデータと`style.css`を読み込むことでアイコンとして使うことが出来る様になる
* 色やサイズはCSSで調整する

簡単にフォントを追加できるので今後はよく使っていきたい。
うちのATOMはこうなっている

Atomを試しに使いはじめてみたので、
入れたパッケージやテーマを紹介してみる。

# パッケージ

## [terminal-plus](https://atom.io/packages/terminal-plus)

多分、これがなかったらAtomは使ってないと思う。
Atom上にterminalを追加してくれるパッケージ。
複数開けて、色で見分けがつけられるようにできて、ウィンドウに名前がつけられます。
Windowの追加時に初期表示されるのはその時開いているプロジェクトのルートディレクトリになります。
いたれりつくせり。

## [Sublime-Style-Column-Selection](https://atom.io/packages/Sublime-Style-Column-Selection)

矩形選択出来るようにしてくれるやつ。
いろいろあるんですが、Sublimeと同じ操作だったのでこれにしました。

## [pretty-json](https://atom.io/packages/pretty-json)

Jsonの整形。
APIとか使ったり作ってたりすると必須。

## [status-bar-clock](https://atom.io/packages/status-bar-clock)

ステータスバーに時計表示してくれるやつ。
時間の表示形式の切替とかいらなかったので一番シンプルなのにしました。

## autocomplete系

- [autocomplete-go](https://atom.io/packages/autocomplete-go)
- [autocomplete-php](https://atom.io/packages/autocomplete-php)

## [docblockr](https://atom.io/packages/docblockr)

docブロッカー。
Sublime textは日本語変換がおかしくなるけど、Atomはならないのでちょっと感動。

## [doge](https://atom.io/packages/doge)

オススメ。
（∪＾ω＾）わんわんぉ します。
和みます。

## [file-icons](https://atom.io/packages/file-icons)

TreeView向けのアイコンパッケージ。
seti-UIの開発者が作ったのも有名ですが、Gopherが潰れてたので、
こちらを採用しました

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

Sublime textでminimapのハードユーザだったので

## [imdone-atom](https://github.com/imdone/imdone-atom)

ソースに書いたTODOとかFIXEDMEとかをカンバンっぽくみせてくれるやつ。
grepしてみるのもいいけど、こっちのほうがグラフィカルでわかりやすい

## [sort-lines](https://atom.io/packages/sort-lines)

書いている内容をソートしてくれるやつ。
Sublime textにあったからAtomにもあるものだと思い込んでたら標準では搭載されてなかった。
Atom純正。

## [EditorConfig](https://atom.io/packages/editorconfig)
Atomの[EditorConfig](http://editorconfig.org/)プラグイン。リポジトリにeditorconfigファイルがあったらそれに従ってインデントとかしてくれるやつ。
EditorConfigはIDEまたいで使えるので口頭でコーディング規約があーだこーだ言いあってるよりいい。
あとAtomは言語別にインデントの設定を切り替えたりできないらしいのでそういう理由でも使ってます。

# テーマ

## [afterglow-plus](https://atom.io/themes/afterglow-plus)

Sublime textのテーマ [Afterglow](http://yabatadesign.github.io/afterglow-theme/) をAtomに移植したテーマの改良版。
（元の移植版はangular.jsのsyntaxに不備があったらしい）

# 番外編：入れたけど速攻で捨てた

## [browser-plus](https://atom.io/packages/browser-plus)

terminal-plusがあるならbrowserも！！
と思って入れてみたけど、逆に使いづらかったのでやめた
gitで直前コミットのAuthorの上書き

gitのアカウントを複数運用していると、度々コミットのユーザーを間違えることがあるのでメモ書き。
下記コマンドで直前のコミットを上書きできる。

```
git commit --amend --author="blue_goheimochi <blue_goheimochi@hogehoge.com>"
```

忘れないようにちゃんとローカルに設定しておこう。

```
git config --local user.name blue_goheimochi
git config --local user.email blue_goheimochi@hogehoge.com
```
【SSI】ssiを実装するにあたって

# ssiを実装するにあたって
そもそもこのご時世にテンプレート化してないのがいけ無いんですが、
まぁやむえない事情で（大人の事情）テンプレ化できなかったり、
古いままになってたりするコンテンツがあるんです。
そうすると修正するのに全ページ対応して確認してととても疲れる・・・
なので、自分が楽するために切り分けちゃばいいんだ！

細かい調整などはあると思いますがそこは端折ります。
ssiの追加の仕方のみ記載します！

※情報は2016年時点での記載になります。

## まずは「.htaccess」を用意する
実装するにあたり、ssiを聞かせたいコンテンツ（複数ある場合はその上層部）に.htaccessを作成して設置する。

設置する.htaccessはエディタで下記を記載して「.htaccess」というファイルを作る。

```
Options +Includes
AddHandler server-parsed html
```

これだけ。

## ssi用のhtmlを作る
切り出したい箇所をhtmlとしてきりだす。

```lang:hoge.html
<div>
hogehoge
</div>
```

## htmlに追加する場合

❌
<!--#include file="ssi/hoge.html" -->
上層のディレクトリにあるファイルは読み込めないので使用しない。

⭕
<!--#include virtual="/ssi/hoge.html" -->
別のディレクトリ指定でも、サーバの絶対パスでも指定が可能です。


## phpに追加する場合
❌
<!--#include virtual="/ssi/hoge.html" -->
PHPの場合は上記の書き方だと読み込むことができない。

⭕
<?php echo file_get_contents("ssi/hoge.html"); ?>
file_get_contentsでvirtualと同じような挙動ができる。
※相対パスで書く

以上。
IntelliJ で Gradle + Java のひな形を作る


よくやる作業をメモ。

## Create New Project

### 1
+ 左ペイン: Gradle
+ Project SDK: 1.8
+ Additional Libraries and Frameworks: Java

### 2
+ GroupId: package 名
+ ArtifactId: version なしの jar 名
+ version: 1.0-SNAPSHOT (SNAPSHOT は Nightly build のこと)

Maven – Guide to Naming Conventions
https://maven.apache.org/guides/mini/guide-naming-conventions.html

### 3

+ Use auto-import をチェック
+ Create directories for empty content roots automatically をチェック
+ Use default gradle wrapper を選択

### 4
+ Project name: ArtifactId と同じになる

## 作成後
+ VCS > Enable Version Control Integration... > Git


```bash
git config user.email "<メールアドレス>"
brew install gibo
gibo JetBrains java > .gitignore
```

気付いたら.gitignoreはgiboで自動生成する時代になっていた - Qiita
http://qiita.com/tmknom/items/c4bcebe17d25381fa45d

+ File > Project Structure...
  + Project > Project language level: 8
+ VCS > Git > Add
+ VCS > Commit Changes...

## Github で複数アカウントを使っている場合
.git/config の url にアカウント名をいれたらうまくいった。

```
[remote "origin"]
    url = https://<アカウント名>@github.com/<チームアカウント名>/<リポジトリ名>.git
```

credential-osxkeychain を使っている場合、keychan 上にアカウント分の設定 (https://github.com/<username>) を作ってあげる。

Caching your GitHub password in Git - User Documentation
https://help.github.com/articles/caching-your-github-password-in-git/

## Lombokを使う
build.gradle で war プラグインを使うと、providedCompile が使える。

build.gradle

```
...
apply plugin: 'war'

dependencies {
    providedCompile "org.projectlombok:lombok:1.16.6"
...
}
```

### IntelliJ
annotation processor を有効にする。忘れがちなので気をつける。

IntelliJ IDEA > Preferences... > Build, Execution, Deployment > Annotation Processors > Enable annotation processing

## Spockを使う

build.gradle

```
...
apply plugin: 'groovy'
...
dependencits {
    ...
    compile "org.codehaus.groovy:groovy-all:2.4.1"
    testCompile "org.spockframework:spock-core:1.0-groovy-2.4"
    ...
}

```

## Javaslangを使う

build.gradle

```
dependencits {
    ...
    compile "com.javaslang:javaslang:2.0.0-RC4"
    ...
}
```
PostgreSQLのOVERLAPSの罠

PostgreSQLには、二つの時間間隔が重なるかどうかを返すOVERLAPSという便利な演算子があります。

3/1～3/31に対して、

- 3/30～3/31は重なる？

```lang:sql
SELECT (DATE '2016-03-01', DATE '2016-03-31') OVERLAPS
       (DATE '2016-03-30', DATE '2016-03-31')
=> true
```
うんうん。

- 3/30は重なる？

```lang:sql
SELECT (DATE '2016-03-01', DATE '2016-03-31') OVERLAPS
       (DATE '2016-03-30', DATE '2016-03-30')
=> true
```
うんうん。

- 3/1は重なる？

```lang:sql
SELECT (DATE '2016-03-01', DATE '2016-03-31') OVERLAPS
       (DATE '2016-03-01', DATE '2016-03-01')
=> true
```
うんうん。

- 3/31は重なる？

```lang:sql
SELECT (DATE '2016-03-01', DATE '2016-03-31') OVERLAPS
       (DATE '2016-03-31', DATE '2016-03-31')
=> false
```
あれ？

どうやら、(from, to)の日付が同じ場合、それがもう片方の末端にあると重複しないという判定になるようです。

# 解決法

範囲型のdaterangeを使うと、正しく判定できます。

```lang:sql
SELECT daterange(DATE '2016-03-01', DATE '2016-03-31', '[]') &&
       daterange(DATE '2016-03-31', DATE '2016-03-31', '[]')
=> true
```
最後の'[]'は、開始・終了点がどちらも閉区間であることを指定するものです。

また、範囲型であれば共通部分を取得することもできます。

```lang:sql
SELECT daterange(DATE '2016-03-01', DATE '2016-03-31', '[]') *
       daterange(DATE '2016-03-31', DATE '2016-03-31', '[]') 
=> [2016-03-31,2016-04-01)
```
最後の')'は、開区間であることを示しています。

## 範囲型を使う上での注意点

共通部分がないことを表すのは、nullでも''などでもなく、emptyです。

```lang:sql
SELECT daterange(DATE '2016-03-01', DATE '2016-03-31', '[]') *
       daterange(DATE '2016-04-01', DATE '2016-04-02', '[]') = 'empty'
=> true
```
この場合のemptyは、daterange型のemptyです。

isempty()という関数も用意されています。

```lang:sql
SELECT isempty(daterange(DATE '2016-03-01', DATE '2016-03-31', '[]') *
               daterange(DATE '2016-04-01', DATE '2016-04-02', '[]'))
=> true
```
Groovyで「モルダー、あなた疲れてるのよ」に対処する

# はじめに

こちらを拝見して、「そういえばGroovyでもそういった案件があったような」気がしました。

[Ruby でモルダー、あなた疲れてるのよを出力する方法](http://qiita.com/supermomonga/items/3a3da5518ae72b35ce8b)

[Pythonでモルダー案件](http://qiita.com/aomoriringo/items/561f7fa66455676eff1e)

そこでGroovyのことをもっと勉強するために挑戦してみることにしました。

# 本題

## コード

```groovy
def mulder() {
  def msg = "モルダー あなた 疲れてる のよ".split(" ") as List
  def list = []

  Collections.shuffle(msg)  // voidを返すメソッドなのでチェーンしてない…
  def l = daru(msg).flatten()
  l.add(2, "、")            // voidを返すメソッドなのでチェーンしてない…
  l.join('')
}

ArrayList daru(ArrayList it) {
  def wlist = []
  it.collate(2).each { ws ->
    def lw = []
    ws.each { w ->
      w.collect().collate((int)Math.ceil(w.size()/2.0)).each {
        lw << it.join('')
      }
    }
    wlist << kururi(lw)
  }
  wlist
}

ArrayList kururi(ArrayList lw){
  (new Random().nextInt(2) == 0 ? [lw[2],lw[1],lw[0],lw[3]] : lw).flatten()
}

for(int i = 1; ;i++){
  def m = mulder()
  println "$i: $m"
  if(m == "モルダー、あなた疲れてるのよ"){
    System.exit(i)
  }
}
```

## 実行結果例

```
1: モルダー、あなたのてる疲れよ
2: あなよ、のた疲れダーモルてる
3: 疲れダー、モルてるあなたのよ
4: 疲れてる、モルダーあなよのた
5: モルよ、のダーあなた疲れてる
6: モルた、あなダーのよ疲れてる
7: モルダー、疲れてるのたあなよ
8: あなた、疲れてるモルよのダー
9: 疲れてる、モルダーあなたのよ
10: モルた、あなダーのよ疲れてる
11: 疲れた、あなてるのダーモルよ
12: あなてる、疲れたモルダーのよ
13: のよ、モルダー疲れてるあなた
14: あなた、のよ疲れダーモルてる
15: モルダー、あなた疲れよのてる
16: モルダー、あなたのてる疲れよ
17: モルダー、疲れてるのよあなた
18: モルよ、のダー疲れてるあなた
19: あなよ、のた疲れてるモルダー
20: モルダー、あなた疲れてるのよ
```

# 終わりに

書いてみて気になったことがいくつかありました。

+ Javaのお力添えをいただく必要が結構あります
+ クロージャをもっと使ってやりたかったけど長くなったのできっと勉強不足
+ 文字列をsplitするとString[]になるのでListに変換するのがカッコ悪い
+ とりあえずvoidなメソッドがつらい、チェーンしたいときには何か書かないと…
+ 配列のシャッフルは「Collections.shuffle」、リストは返してこない
+ rubyのeach_sliceはGroovyでは「collate」、リストを返してくれる
+ 整数の割り算で「Integer.intdiv」メソッドがあるけど切り上げはしない
+ rubyのtapを実現するならちょこっと書かないといけない、けどできる[^1]
+ Kernel#loopみたいのがないのでforループで書いた、もっといい方法があるような気が

rubyもpythonもgroovyもよく分からないので勉強になりました


## 注釈

[^1]: Groovy equivalent of Ruby's Object#tap http://stackoverflow.com/questions/17961088/groovy-equivalent-of-rubys-objecttap
用途ごとに.ssh/configを分けた

## 用途ごとに.ssh/configを分けた

* $HOME/work/sshprivate/config
* $HOME/work/sshwork/config

## 使い方

```bash:ssh
ssh -F $HOME/work/sshprivate/config mysrv
ssh -F $HOME/work/sshwork/config officesrv
```

```bash:scp
scp -F $HOME/work/sshprivate/config .bashrc mysrv:
scp -F $HOME/work/sshwork/config .bashrc officesrv:
```

## alias

```bash:ssh
alias pri='ssh -F $HOME/work/sshprivate/config'
alias wrk='ssh -F $HOME/work/sshwork/config'

pri mysrv
wrk officesrv
```

```bash:scp
alias pcp='scp -F $HOME/work/sshprivate/config'
alias wcp='scp -F $HOME/work/sshwork/config'

pcp .bashrc mysrv:
wcp .bashrc officesrv:
```
BluemixのObjectStorageをとりあえず試してみた

Bluemixのアカウントを作った記念に、Qiitaのアカウントも作ってみたので、せっかくだから色々試した内容をちょいちょい書き残していこうと思います。

第一弾は、ObjectStorage。難しいことなくスムーズに出来た。
Openstackでいうところの「Swift」を簡単に利用できる感じ。DBのバックアップとかを貯めたり、ファイルサーバ的に使うのが良いらしい（あまり詳しくない・・・）。

(1)　「スペースの作成」で、まずはスペースを作成。（作業場みたいな"枠"を作るイメージ？）

(2)　「カタログ」からObject Storageを選択。
![objectstorage_on_bluemix.png](https://qiita-image-store.s3.amazonaws.com/0/119378/c0b92343-5dc0-e684-ec7b-ed74226789f6.png)

(3)　名前とかはデフォルトのまま、とりあえず「作成」をクリック。
![create_service.png](https://qiita-image-store.s3.amazonaws.com/0/119378/c3d72952-d8a7-ec2d-ef89-1106453a2f49.png)

(4)　数分で完成！とりあえずストレージコンテナを作れるところまでは行ったみたい。

(5)　試しに1つ、ストレージコンテナ（データを貯める箱/スペース）を作ってみる。
　　「アクション」から「コンテナの追加」をクリック。つけたい名前を聞かれるので「test1」と入れる。
![addcontena.png](https://qiita-image-store.s3.amazonaws.com/0/119378/8f8aad7f-55ee-d42f-c58a-0c7a9eff0288.png)

(6)　test1が出来た。ためしにファイルアップロード。「ファイルの追加」をクリック。アップロードしたいファイルを選択。
![test1.png](https://qiita-image-store.s3.amazonaws.com/0/119378/c04347ed-603a-a3e8-6868-0ae39c9b2e6f.png)

(7)　アップロードできたらしい・・・。
![file_upload.png](https://qiita-image-store.s3.amazonaws.com/0/119378/1d1672bc-cd36-4042-a388-c805e7d26e8c.png)


というわけで、次はLinux環境からこのストレージコンテナ（test）を見るようにして、(6)でアップロードしたファイルをcatするところから始めるイメージで、書き溜めていきます。
直近のゴールとしては、DBバックアップの置き場所として、バックアップ転送＆リストアを試せれば・・・。
String の hasPrefix, hasSuffix の罠

```
Welcome to Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29). Type :help for assistance.
  1> "123".hasPrefix("123")
$R0: Bool = true
  2> "123".hasPrefix("12")
$R1: Bool = true
  3> "123".hasPrefix("1")
$R2: Bool = true
  4> "123".hasPrefix("")
$R3: Bool = false
  5> "123".hasSuffix("")
$R4: Bool = false
  6> "123".hasSuffix("3")
$R5: Bool = true
  7> "123".hasSuffix("23")
$R6: Bool = true
  8> "123".hasSuffix("123")
$R7: Bool = true
```

これ絶対おかしいだろ……
MOL2 ファイルの分割

巨大な化合物ファイルのままだと扱いにくくてバラしたいとき用メモ。

#Open Babel を使う場合
> [--splitinto (Open Babel Wiki)](http://openbabel.org/wiki/--splitinto)

```babel:適当なファイル数に分割したいとき
babel (大きなファイル).mol2 -omol2 --splitinto (分割数)
```
（ぴったり割り切れないときの端数は適当にやってくれる模様）
、、だが実は未実装？ 機能してないかも。
→ [こちら](http://qiita.com/yanagi3150/items/00a95dcbcdf8aa70baf3) のやり方がよろしいかも。
> [Options (Open Babel v2.3.1 documentation)](https://openbabel.org/docs/dev/Command-line_tools/babel.html)

```babel:１化合物ずつバラバラにしたいとき
babel -m (大きなファイル).mol2 -omol2 (prefix_)
```

#シェルでやる場合
なぜか上記のやり方で、特定のファイルで途中でコケてダメなときがわりとあるので、、

```bash:１化合物ずつバラバラにしたいとき
csplit (大きなファイル).mol2 '/@<TRIPOS>MOLECULE/' '{*}' --prefix (prefix_)
```


どうしても一律の連番 filename になってしまうので、化合物 ID とかをファイル名にしたい場合は
あとで付け替えるしかないですかね。
fluentdでメッセージにuuidを追加する方法

[fluentd-plugin-add](https://github.com/yu-yamada/fluent-plugin-add)を使用して実現出来ます。

# matchを使う場合

設定ファイル例


```
<match test.**>
  type add
  add_tag_prefix debug
  uuid true
</match>
```



## 入力例


```
test.aa: {"json":"dayo"}
```

## 出力例


```
debug.test.aa: {"json":"dayo", "uuid":"427037E7-235B-4F6C-9975-15AAC75E56C5"}
```
# filterを使う場合
設定ファイル例


```
<filter test.**>
  type add
  uuid true
</filter>
```

## 入力例


```
test.aa: {"json":"dayo"}
```

## 出力例


```
test.aa: {"json":"dayo", "uuid":"427037E7-235B-4F6C-9975-15AAC75E56C5"}
```


それぞれuuidが追加されてます。
Dr.Sum Excel Extractorを使ったExcelファイルの取り込み方

# Dr.Sum Excel Extractorとは
エクセルからDr.Sumへデータを取り込む場合、**エクセルのどの部分を抽出箇所にするのか**という情報を記した**EXSファイル**が必要になります。

Dr.Sum Excel Extractorは**EXSファイルを作成するツール**で、今回はこれの基本的な使い方をSS貼りつつ紹介します。


# ExcelをDr.Sumに取り込むまでの流れ
1.取り込み元となるExcelファイルを用意
**2. Excel ExtractorでEXSファイルを作成**
3.VTB作成
4.Dr.Sumテーブルへインポート

普段CSVやODBCを使って取り込む手順に、EXSファイルを取り込む手順が1つ追加されるだけなので、そんなに大変ではないです


# ExcelをDr.Sumに取り込むまでの手順
## 1. 取り込み元となるExcelファイルを用意

今回はサンプルデータの顧客マスタ.csvをエクセルにして、下のように適当にヘッダやら情報やらを加えてみました。
取ってきたいところはB8セルからの箇所になります。
![image0_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/4c0466bf-7633-138e-9a35-96931d4139fd.png)


## 2. Excel ExtractorでEXSファイルを作成

Excel Extractorを開き、左上の[Excelファイル選択]の右側にある[参照]を選択して、1.のエクセルファイルを選択します。
![image1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/aab7bce6-d61d-6319-9695-276f08653af4.png)

選択すると、こんな風に出てきます。
![image2_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/9df094a8-ed0c-45b0-cd4a-be1522837fe1.png)

真ん中のエクセルみたいな場所は「シート設定エリア」といってそこで取得するデータの範囲を設定します。
その下の表は「プレビューエリア」といっては実際に取り込まれる表のプレビューになります。
右側のエリアは「設定情報エリア」といって、設定した情報を文字ベースで見れる場所になります。


今回は、表が綺麗にまとまっているので、シート設定エリアの青い枠の部分を動かして、範囲を設定します。エクセルの印刷プレビューと似たような使い方なので、エクセル使える人にはやりやすいかと思います。
![image3_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/bb5bb5b8-f2fc-eda3-fb41-77433bf182d6.png)

あとは右上の[設定ファイルの保存]を押せば終了。


## 3. VTB作成
この辺はCSVの時と同様に設定
![image6_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/6b969b81-2d0a-440d-ed1c-665aad33fec1.png)

## 4. Dr.Sumテーブルへインポート
![image7_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/0cbe3900-fb77-3161-5719-de18fda43b86.png)

![image8.PNG](https://qiita-image-store.s3.amazonaws.com/0/79432/dc9fb9e7-80e4-377c-8579-342a787492ef.png)

こんな感じで正しく取り込まれました。
traceroute を ping でエミュレートする

# はじめに
- traceroute コマンドに関する小ネタです
- ルーティング経路の調査には traceroute コマンドがよく使用されますが、これを ping コマンドで代替してみます
- ネットワーク調査ツールの理解に役立つのではないかと思います

# traceroute コマンドの基本的な仕組み

- traceroute コマンドは、まずターゲットのアドレスに対して TTL=1 の UDP パケットを送信します
- もし TTL exceeded が返ってきたら TTL を +1 してパケットを再送します
- ターゲットアドレスに到達するまで TTL をインクリメントしながらパケットの送信を繰り返します
- TTL exceeded が返ってくるごとに到達地点の IP アドレスを記録することでターゲットアドレスへの経路を調べることが出来ます

# ping コマンドでエミュレート
- traceroute コマンドの挙動を ping コマンドでエミュレートするとこんな感じになります

````
$ TARGET=www.example.com; MAX=64; for i in $(seq 1 ${MAX}); do echo -n " ${i}  "; ping -t ${i} -c 1 ${TARGET} | grep exceeded | awk '{print $2}'; done
````

- Linux の [iputils](https://github.com/iputils/iputils) に含まれている ping コマンドを使用しました
- TTL は -t オプションで指定できます
- 最大 HOP 数は 64 にしました
- UDP の代わりに ICMP のパケットを送信しています
- エラー処理はしていません

# 参考
- [OpenBSD Manual](http://man.openbsd.org/OpenBSD-current/man8/traceroute.8)
- [Wikipedia](https://ja.wikipedia.org/wiki/Traceroute)
[Vimperator] フルスクリーンのときでも常にステータスバーを表示する設定

Vimperator は v3.11 (2016-01-26) から、ブラウザがフルスクリーンのときにステータスバーがデフォルトで非表示になるように変更されました。

[Release Notes](https://raw.githubusercontent.com/vimperator/vimperator-labs/master/vimperator/NEWS)

> Autohide statusbar: When entering fullscreen mode, the statusbar is hidden and temporarily showed up with command inputs.

個人的にこの変更はかなり不便でなんとかできないかと思っていたのですが、やはり同じように不便だと思った人はいたらしく、 v3.12 (2016-02-28) で `statuslinevisibility` というオプションが追加されました。

> @SammysHP added a statuslinevisibility option. Also called slv.
> The three options are `auto`, `visible`, and `hidden`.

これにより、以下の設定を追加するだけでステータスバーを常に表示することができるようになりました。

``` :.vimperatorrc
set statuslinevisibility=visible
```
ArchLinuxのインストールではPROXYにつまずく(OS X, VirtualBox)

# ArchLinuxとの遭遇
[ここ「systemd-nspawnさわってみた」](http://tweetvite.com/event/tottoruby_20)で遭遇した。

 - 新しいものが比較的取り込まれやすいらしい。
 - ローリングリリース・・・定期的なリリースが存在しないとのこと。
 - [シンプルで無駄の無いシステム](https://ja.wikipedia.org/wiki/Arch_Linux)

このようなArchLinuxの概要を知り、これは使ってみたいとインストールしてみた。

# インストールではPROXYにつまずく

- 手元のVirtualBoxへのインストールだったので、この手順を参考にした。
 - [archlinuxをVirtualBoxにインストール(1) | Cocoa-tipsを見てちょ!](http://cocoa-tips.com/?p=138)
- 「pacstrapで最小限のインストール」のところでエラー終了してしまう。
 - [PROXY経由で起きる問題](http://randomjottings.blog.fc2.com/blog-entry-2.html)らしい。
 - 同ページに書いてある変更で解決した。
- このPROXYの件以外には特に困ることはなく、ブートできるArchLinuxシステムが出来た。

# インストール完了所感

- またもPROXYでつまずいた。うまくいかない時PROXYを疑う習性が付いているので回避策発見は難しくなかった。
- システムの起動が早い。
- 「シンプルで無駄がない」というだけのことはありそう。
- CUIが基本、自分でインストールすればGUIもインストール可能ではある。
- 他の重厚なLinuxとの使い分けどころがありそうなので、引き続き普段使いとして使用してみたい。
PostgresSQLで比率を算出するSQL

PostgresSQLで比率をSQLをまとめました。
OVER句, PARTITION BY句が使えればPostgresSQL以外でもできると思います。(未確認)

# 準備

```sql:create_table.sql
--販売テーブル
CREATE TABLE product (
 id BIGINT
 ,TYPE TEXT /* 色の分類 */
 ,volume INTEGER /* 販売数 */
 ,PRIMARY KEY(id)
);
INSERT INTO product VALUES
(1, 'red', 11)
,(2, 'red', 22)
,(3, 'blue', 33)
,(4, 'green', 0)
;
```

### Tableの状態
|id|type|volume|
|--:|:--:|--:|
|1|red|11|
|2|red|22|
|3|blue|33|
|4|green|0|



# 比率算出SQL
## 全体に対する販売台数の割合

```sql
SELECT 
  id
  ,ROUND( volume::NUMERIC / SUM(volume) OVER (), 2) AS ratio /* 小数点以下2桁でまとめる */
FROM product 
ORDER BY id;
```

### SELECT結果
|id|volume|
|--:|--:|
|1|0.17|
|2|0.33|
|3|0.50|
|4|0.00|

### 解説
* `SUM(volume) OVER ()`は、全行のvolume合計数66です。
* NUMERICでキャストしているのは、整数÷整数でゼロになるのを防ぐためです。



## 色の分類に対する販売数の割合


```sql
SELECT
 id
 , CASE WHEN 
     volume = 0 THEN 0 /* ゼロ除算防止対応 */
   ELSE 
     ROUND(volume::NUMERIC / SUM(volume) OVER (PARTITION BY type),2) 
   END AS ratio
 
FROM product
ORDER BY id;
```
### SELECT結果
|id|volume|
|--:|--:|
|1|0.33|
|2|0.67|
|3|1.00|
|4|0.00|

### 解説
* `SUM(volume) OVER (PARTITION BY type)`は、typeごとの合計値です。
たとえばidが1の場合typeは'red'なので、redの合計値33が取得されます。
* CASE式を使っているのはゼロ除算対応のためです。typeがgreenの合計値は0なので、CASE式を使わないとゼロ除算してしまいます。
gnuplotでcsvの1行目(見出し行)をプロットのタイトルにする

# なにがしたい
csvファイルがこんな感じになっている事がよくある

```
		1列目		2列目	3列目	4列目		n列目
1行目	横軸見出し	見出し1	見出し2	見出し3...	見出しn...
2行目	横軸1		値11	値21	値31...		値n1
3行目	横軸2		値12	値22	値32...		値n2
...
```

グラフのタイトルを「見出し」にしてプロットしたい。
gnuplotの他、awkを用いる。



# 2列目をプロット
テストデータを以下に与える
1列目のDateTimeに対して、複数の縦軸がn個並んでいるような形のあるあるcsv。

```csv:test.csv
DateTime,midashi1,midashi2,midashi3,midashi4,midashi5
2015-12-01 00:03:00,5,8,10,41,39
2015-12-01 00:08:00,4,7,9,35,58
2015-12-01 00:13:00,5,5,6,36,60
2015-12-01 00:18:00,4,7,9,36,59
2015-12-01 00:23:00,4,7,7,59,59
2015-12-01 00:28:00,4,5,7,36,60
2015-12-01 00:33:00,3,8,9,36,59
2015-12-01 00:38:00,4,7,10,36,59
```

縦軸midashi1を、横軸DateTimeに対してプロットするとき

```gnuplot
file='test.csv'    #ファイル名指定

se g    #グリッドon
se xdata time    #横軸は時間データだよ
se timefmt "%Y-%m-%d %H:%M:%S"    #読み込む時間の形式
se format x "%m/%d\n%H:%M"    #x軸の表示方式
se datafile separator ","    #データ区切りを空白からコンマにする

p file u 1:2 w l    #fileの1列目に対して2列目をプロット
```

![midashi_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/113494/09ccf98b-8801-6852-720d-86aa04af32fb.png)


ちなみに
省略形式
se=set
g=grid
p=plot
u=using
w=with
l=line

# 2列目からn列目をプロット
awkを使ってn列目の値"n"を取得し、for文を使って1つのグラフに2からn列まで出力する。
awkの使い方はsprintfでコマンドを文字列にした後、systemコマンドで使用する。

```gnuplot
file='test.csv'

se g
se xdata time
se timefmt "%Y-%m-%d %H:%M:%S"
se format x "%m/%d\n%H:%M"
se datafile separator ","

lastrow=system(sprintf('awk -F, "NR==1{print NF}" %s',file))    #最後の列はawkの組み込み変数NFで読み込んで変数lastrowに入れる
p for[i=2:lastrow] file u 1:i w l    #fileの1列目に対してi列目をプロット
								#iは2からlastrowまで変化
```

![midashi_n.PNG](https://qiita-image-store.s3.amazonaws.com/0/113494/b6ac50d6-b7ab-4613-2b7b-c14fdffd1c1d.png)


# 1行目(見出し行)の見出しをタイトルにしてプロット
awkを使って1行目を読み出し、i列目の値をタイトルにする。
iはfor文で2～最終列まで変化する。

```gnuplot
file='test.csv'

se g
se xdata time
se timefmt "%Y-%m-%d %H:%M:%S"
se format x "%m/%d\n%H:%M"
se datafile separator ","

lastrow=system(sprintf('awk -F, "NR==1{print NF}" %s',file))
p for[i=2:lastrow] file u 1:i w l title system(sprintf('awk -F, "NR==1{print $%d}" %s',i,file))    #1行目の2列目～最後の列の文字列をtitleにする
```


![midashi_title.PNG](https://qiita-image-store.s3.amazonaws.com/0/113494/b2ddd4f7-cf4e-d2ef-9dad-cf399503239e.png)
Arch linux にNaCl_SDKを入れる

# Arch linux にNaCl_SDKを入れる

入れるだけ.メモ
[https://developer.chrome.com/native-client/sdk/download](https://developer.chrome.com/native-client/sdk/download)のページに沿っただけ

```sh
wget https://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip
unzip nacl_sdk.zip
cd nacl_sdk
./naclsdk list #←ここでコケる
```

しょうがないので`/etc/pacman.conf`でmultilibのコメントを外して`sudo pacman -Syy`して`sudo pacman -S lib32-glibc`をしてもう一回.
するとpython3のせいでこけるので,`sudo pacman -S python2`してnaclsdkのpythonの所をpython2にしてやる.そうすると`./naclsdk list`がうまくいく.

```sh
./naclsdk list
./naclsdk update
./naclsdk list #(*)がついていなかったのでupdateはこれ以上いらないみたい
```

[https://developer.chrome.com/native-client/devguide/tutorial/tutorial-part1](https://developer.chrome.com/native-client/devguide/tutorial/tutorial-part1)でサンプルをコンパイルする

```sh
cd pepper_$(VERSION)/getting_started
make serve
```
python3のprintに括弧が必要になった罪は重い.
面倒くさいのでこの時だけデフォルトのpythonをpython2にする.(悪魔的動作)

```sh
sudo mv /usr/bin/python /usr/bin/python_
sudo ln /usr/bin/python2 /usr/bin/python
```

```
ls -al /usr/bin/python
lrwxrwxrwx 2 root root 9  3月  3 20:06 /usr/bin/python -> python2.7
```
ともかくこれで,/usr/bin/pythonがpython2になった.イェイ!
そして,高度に技術的なコマンドを打ち込んだら…

```sh
cd pepper_$(VERSION)/getting_started/part1
make serve
```

見事 http://localhost:5103 でNaClが動いてるのが見られるってわけ.
古いファイルをcronで毎日退避

毎日、サーバにファイルが作成されて、FTPソフトで該当のディレクトリを開くのにも一苦労！
という時の為にcronにて以下の日次処理を設定してあげるとよいです。

```
# 本日日付のディレクトリ生成
mkdir /home/hoge/bk/data/`date '+%Y%m%d'`
# ディレクトリ生成
cd /home/hoge/bk/data
# タイムスタンプが90日前以前のファイルを本日日付ディレクトリに移動
find /home/hoge/datafiles -mtime +90 | xargs mv --target-directory=`date '+%Y%m%d'`
# アーカイブ化しgzipにて圧縮
tar -cvzf `date '+%Y%m%d'`.tar.gz `date '+%Y%m%d'`
# 本日日付ディレクトリの削除
rm -rf `date '+%Y%m%d'`
```

以上のコマンドをシェルファイルに記述し、日次でcron実行すれば毎日古いデータをバックアップディレクトリに退避できますね。


他に面白い方法ありましたらコメントください。
Rails viewをDRYに書きたい

## content_tag使える子

### あるある

```haml:repeat_yourself.html.haml
-# 親のタグの属性が違うだけだけどめんどくさいから、if文で２回書くべ
- if hoge
  .article_hoge.hoge
    %p.hogehgoe
       hogeだったら、hogeクラスとgehoクラスを付けたい
- else
  .article_hoge.not_hoge
    %p.hogehoge
       hogeだったら、hogeクラスとgehoクラスを付けたい
```
hamlでごちゃごちゃ書くこともできるけど、railsのcontent_tagを使えばいいと思うよ

```haml:dont_repeat_yourself.html.haml
- html_attr = {class:"article_hoge hoge"} #属性は別途hashで作っておく、helperとか、モデルとかで。class以外も使える dataとか
= content_tag(:div, html_attr) do
  %p.hogehoge
    hogeだったら、hogeくらすとgehoクラスを付けたい 
```

if 文で一部しか違わないviewのblockを書きたくないし、見たくない。

## modelによってpartialを分ける

```haml:repeat_yourself.html.haml
- if model == hoge
  = render 'path/hoge'
- elsif model == geho
 = render 'path/geho'
```

```haml:dont_repeat_yourself.html.haml
= render "path/#{model}"
```
CoCぽくファイル名とモデルで規約のようにして記述を減らす
UITextFieldで入力チェックする（Swift2.2）

UITextField入力チェックする場合のメモ

#結論
[UITextFieldTextDidChangeNotification](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/#//apple_ref/c/data/UITextFieldTextDidChangeNotification)を使う。
これで入力中も判定できる。

```swift
override func viewDidLoad() {
	super.viewDidLoad()
	// Do any additional setup after loading the view, typically from a nib.
	// Swift2.2の場合
	NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.changeTextField(_:)), name: UITextFieldTextDidChangeNotification, object: nil)
	// Swift2.1の場合
	// NSNotificationCenter.defaultCenter().addObserver(self, selector: "changeTextField:", name: UITextFieldTextDidChangeNotification, object: nil)
}

func changeTextField (sender: NSNotification) {
    let text = sender.object as! UITextField
    print(text)
}
```


#失敗
これだと入力確定後の判定となり一文字目が判定できない

```swift
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
   print(textField)
   return true
}
```
Lubuntu 16.04で日本語キー配列に設定

```
sudo dpkg-reconfigure keyboard-configuration
```

しただけではダメだった。

![key.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e3cdb50f-ec36-49d6-24c9-ac45fb1d8b3c.png)

* 上記のように「現在のインプットメソッド」を設定すれば解決。
空行を削除する置換(正規表現)

#空行を削除
```
前
<p>hogehoge</p>
　　　←これ{空行}
<p>hogehoge</p>
↓
後
<p>hogehoge</p>
<p>hogehoge</p>

```
##正規表現での置換
改行コードによって変わるので注意

■検索文字列
LF(Mac/Linux)の場合:
^\n
CRLF(Windows)の場合:
^\r\n
■置換文字列
(何もなし)

<img width="1195" alt="スクリーンショット 2016-03-31 15.01.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/109842/d527100f-1c01-5914-93f9-e8cbae4101a0.png">
Vagrant1.8.1 Ubuntu14.04 EC-CUBE3.0.9

# Vagrant1.8.1 Ubuntu14.04 EC-CUBE3.0.9

環境構築中に微妙にハマったので備忘録。

## 環境
Vagrant 1.8.1（boxはubuntu/trusty64を使用）
Ubuntu 14.04
EC-CUBE 3.0.9

## ハマり所
１、EC-CUBEの権限エラー（以下参照）
共有ディレクトリで作業したかったので、権限を変更する必要があった。
[Vagrant 共有ディレクトリ　権限　変更方法](http://qiita.com/kozimon/items/50a12e5eb02db7731853)

own/grpを両方とも以下のように変更。

```
"www-data"
```

２、ミドルウェアをインストール（別にハマってはいないがメモ）

```
apt-get install apache2
apt-get install mysql-server
apt-get install php5
```

３、PHPの必須モジュールをインストール

```
apt-get install php5-curl
apt-get install php5-mysql
apt-get install php5-mcrypt
apt-get install php-apc
```

４、APC拡張モジュールが有効になっていません。
APC拡張モジュールを有効にするには以下のコマンドを入力し使用可能にする。

```
php5enmod mcrypt
```

## あとがき
これで何も警告がない状態でインストールすることが出来るようになった。
![Screen Shot 2016-03-31 at 2.59.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/119345/280185c4-89e7-79d3-8500-3d8cd95c237a.png)


以上。
Jersey+JdkHttpServerでCORS対応の軽量RESTサーバを立てる

# RESTの軽量サーバを立てたい
Jerseyを使っていて、手元で軽量なRESTサーバを立てたければ、JdkHttpServer を使用するのは良い選択肢です。しかし、Webアプリケーションはnode.jsで書いていて、RESTはJavaで書いているなどという場合には、HTTPレスポンスに`Access-Control-Allow-Origin`ヘッダがないと、CORS(Cross-Origin Resource Sharing)対応じゃないからダメだよ、とブラウザに怒られてしまいます。

意外とJdkHttpServerを使用したシンプルなサンプルコードがなかったので、とても簡単なものですが以下に載せておきます。フィルタをResourceConfigに登録すればOKです。

```Java:RestServer.java
package rest.server;

import java.io.IOException;
import java.net.URI;

import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

import com.sun.net.httpserver.HttpServer;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

public class RestServer {

	public static class CORSFilter implements ContainerResponseFilter {
		@Override
		public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
	        response.getHeaders().add("Access-Control-Allow-Origin", "*");
		}
	}	
    public static void main(String[] args) throws IOException {
        URI uri = URI.create("http://localhost:8080/api/");
        ResourceConfig rc = new ResourceConfig();
        rc.register(CORSFilter.class);
        rc.packages("rest.services");
        final HttpServer httpServer = JdkHttpServerFactory.createHttpServer(uri, rc);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> httpServer.stop(0)));
    }
}
```
Reactive Cocoa でズンドコキヨシ書いてみた

# 元ネタ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# ReactiveCocoaで書くまで

しばらくReactiveCocoa使っていなくて、Swift版の勉強のために書いてみました。まずはPlayGroundでReactiveCocoaを簡単に使うWorkSpaceを作ったことがなかったので、それに取り組みました。 @bricklife さんの
 [ズンドコキヨシ with RxSwift - Qiita](http://qiita.com/bricklife/items/4bf8c0e17043498f4452)のエントリーを見て、GitHubのリポジトリをダウンロードしてみると、RxSwiftの環境が`Carthage update`で簡単に作成できるので、これをやりたいと思いました。

おなじにようにCartfileを作って、`carthage update`しても同じようにリンクを作れなくて、おかしいなと思ったら、carthageはバイナリでダウンロードする機能ができたのですね。そのため、プロジェクトをWorkSpaceに取り込むことができませんでした。

以下の方法で出来ます。
```
carthage update --no-use-binaries
```
要するに、バイナリを使用せず、コードをダウンロードするようにということです。その代わりビルドにすごく時間がかかりました。コードをダウンロードできれば、そのプロジェクトをWorkSpaceに取り込んで、スキームをReactiveCocoa-Mac>MyMacにして、一度ビルドすれば使えるはずです。

 [tomohisa/reactive_cocoa_zundoko](https://github.com/tomohisa/reactive_cocoa_zundoko)でGitHubに公開しましたのでぜひ使ってみてください。

# ReactiveCocoaでの実装
すでに [ReactiveCocoaでズンドコキヨシ - Qiita ](http://qiita.com/rizumita/items/488ccf3ca0166318ddf6)で @rizumita さんがReactiveCocoaで実装していたのですが、ストリームの流れがもう少し自然にできるかなと思って、作ってみました。

```swift
import Foundation
import Result
import ReactiveCocoa

enum Zundoko: UInt32 {
    case ズン
    case ドコ
}

timer(0.5, onScheduler: QueueScheduler())
    .map {
        _ in Zundoko(rawValue: arc4random_uniform(2))!
    }.on(next: {
        print($0)
    }).scan([]) { (array, value) in
        Array(array + [value]).suffix(5)
    }.takeWhile { $0 != [.ズン, .ズン, .ズン, .ズン, .ドコ] }
    .startWithCompleted {
        print("キ・ヨ・シ！")
    }

import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
```
基本の流れは @bricklife さんの最初のものとほぼ同じで、後、ReactiveCocoaの使い方は @rizumita さんのを参考にさせていただきました。

1. timer - 0.5秒ごとに時間をおくる
2. map - ランダムでズンかドコを生成
3. on - プリントする
4. scan - 直近５個をまとめた配列に変換
5. takeWhile - 終了条件を満たすか判断
6. startWithCompleted - SignalProducerからスタートしてSignalを生成し、Completedイベントでキヨシとプリントする

の流れとなっています。

コードの最後の２行はPlayGroundでコードの継続実行を許可する方法です。これをしないとコードが逐次終了してしまいます。PlayGroundで、アプリ上やターミナルではなくて、開発環境のコンソールでテストできるのいいですね。

# ReactiveCocoa / RxSwift
これを見て思ったのは、Swift良くなったなと。以前ReaciveCocoa Swift版が出た頃は
` -> `で無理やりつないだりして、きれいでなかったですが、今は書き方もきれいですし、配列の比較なども簡単にできるようになったので、きれいに書けるようになりました。Enumをprintで文字としてプリントできるのも嬉しいですね。あと、ReacriveCocoaとRxSwiftのコードを見比べてみると、RxSwiftはSignalProducer - Signalを気にしないでいい分、シンプルにかけている気がします。新規プロジェクトだったらRxSwiftでもいいかなと思いました。

# 課題
 [ズンドコキヨシ with RxSwift 最終版と試行錯誤の歴史 - Qiita](http://qiita.com/bricklife/items/57719545f8391ff916b0 )のように書くところまでできなかったので、もうちょっとやってみたいなと思います。
Tomcat7で`antiResourceLocking="true"`にしたらDLLの初期化で失敗⇒原因不明

teratailで質問したんですが、回答が付かなかったので、とりあえずQiitaに残しておきます。

# 前提
Tomcat Managerから配備解除すると、jarファイルが残って失敗する場合があります。
その対応として、下記サイトを参考にconf/context.xmlを修正しました。
http://ameblo.jp/spring-beginner/entry-10435382344.html

```xml:conf/context.xml
<Context antiJARLocking ="true" antiResourceLocking="true" >
```

# 発生している問題・エラーメッセージ
DLLの呼び出しで、
「java.lang.NoClassDefFoundError: Could not initialize class CLibrary」というエラーが出ます。
DLLは下記サイトを参考にして呼び出しています。
http://d.hatena.ne.jp/maachang/20110110

```
public class HelloWorld {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
        (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        void printf(String format, Object... args);
    }
     
    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}
```

# 原因の調査
検索してもエラーの原因が分からず、ひとまずサーバの状態を元に戻したら、DLLは動きました。
antiJARLockingはjarファイル用の設定なので、antiResourceLockingが原因だと考えられます。
で、antiResourceLockingをtrueにすると、DLLが動かなくなる原因が分かりません。




###補足情報(言語/FW/ツール等のバージョンなど)
* Tomcat7
* Java8
* Windows Server 2008 x64
* antiResourceLockingの公式ドキュメント（Tomcat7に https://tomcat.apache.org/tomcat-7.0-doc/config/context.html）

> If true, Tomcat will prevent any file locking. This will significantly impact startup time of applications, but allows full webapp hot deploy and undeploy on platforms or configurations where file locking can occur. If not specified, the default value is false.
antiJARLocking is a subset of antiResourceLocking and therefore, to prevent duplicate work and possible issues, only one of these attributes should be set to true at any one time.
Please note that setting this to true has some side effects, including the disabling of JSP reloading in a running server: see Bugzilla 37668.
Please note that setting this flag to true in applications that are outside the appBase for the Host (the webapps directory by default) will cause the application to be deleted on Tomcat shutdown. You probably don't want to do this, so think twice before setting antiResourceLocking=true on a webapp that's outside the appBase for its Host.
ぼくがかんがえたWebシステムのコーディング規約

数人でWEBシステムを開発しています。
プロジェクトには特にコーディング規約というものはありません。
現状のソースに倣ってコーディングしていきます。
規約はありませんが、暗黙的に守れているものはあるので、それらを文書化したいと思います。
随時追加していきます。

### 対象ブラウザ
* Firefox
* IE11

-------------------------------------------------------------
# JavaScript
### DOM要素のIDを渡すUtilメソッドは、DOM要素自身も渡せるようにする。
DOM要素も渡せた方が、getElementByIdの実行回数が減ります。


```js
/** セレクトボックスにオプション要素を追加するサンプルコード */
U.addOption(select, value, text) {
  if (typeof select === "string") {
    select = document.getElementById(select);
  }
  //セレクトボックスにオプション要素を追加する処理
};
```


### XSS対策
HTMLタグを認識させないさせないよう、innerHTMLでなくtextContent, またはdocument.createTextNodeで文字列を設定する。


# HTML

参考サイト
http://niwakasoft.jp/column/coding_conventions/
http://www.hp-stylelink.com/news/2013/10/20131001.php


### HTMLの文字コードはUTF-8
今の時代当たり前だとは思いますが、念のため。

```html
<meta charset="UTF-8">
```

### IEでの互換表示対応

IE8~IE11では「互換表示」という過去のバージョンで表示できる機能があります。
「常に最新のバージョンで表示する」よう設定しましょう。
https://msdn.microsoft.com/ja-jp/library/cc288325.aspx

```html
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
```

### headタグ内で、metaタグは先頭に記述する
metaタグの中でも、文字コード、"X-UA-Compatible"は先頭に記述してください。
ブラウザのページ解析に影響を与える要素だからです。
https://blogs.msdn.microsoft.com/ie_jp/2011/10/03/head/

```
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge" >
  <meta ...><!-- その他のmetaタグ -->
  <!-- 他のタグ -->
</meta>
```

### HTML文字参照は、`< > " &`以外使わない
文字コードがユニコード形式なら、機種依存文字なども表現できるので、HTML文字参照を使う必要はありません。また、連続した半角スペースを使いたいときは、CSSプロパティのmargin, paddingを使いましょう。

https://www.marguerite.jp/Nihongo/WWW/Introduction/HTML5/Entity.html
http://wolfrosch.com/text/2013/10/13
http://stackoverflow.com/questions/3593024/html-character-entities-and-character-encoding-set
inverse_ofを使いたくないときとは？

## そもそもinverse_ofとは？
https://twitter.com/Kirika_K2/status/700288657777754112

> ActiveRecordでhas_manyに:inverse_ofをつけてリレーション作成すると子からbelongs_toで親を参照するときに同じオブジェクトを参照する

## inverse_ofオプションを付与したくない　つまり共有したくないときとは？
非同期処理のときや、同期処理であっても、自分が関与しているところじゃないところ（他のメソッドで実は共有している書き方をしていた）で書き換えられている可能性がでてくる場合（グローバル変数ぽく）。
同じメソッド内とかだと、プログラマの意図しないバグ（うっかり書き間違い）の可能性が高いが、自分が意識していないところで共有されるような可能性がある場合は、inverse_ofオプションを付けないほうがよい場合もある。
リポジトリに変更を加えずにtravisビルドを実行(travis API経由)してみた。

# 背景・目的
githubにpushするタイミングでtravisビルド（テスト）を実行する、それも、特定のブランチ限定で、というのはよくある使い方ではないでしょうか。
基本はこの運用なのですが、自由にtravisビルドを実行したい時があります。そこで、任意のブランチを任意のタイミングで、travisビルド実行するというのをやってみました。

スクリプト作成に当たっては[ここ](http://docs.travis-ci.com/user/triggering-builds/)を参照しました。

# 事前準備
travisからアクセストークンを取得する必要があります。(環境変数 MY_TRAVIS_TOKEN)
myorganizationとmyapplicationを実行を行わせたいgithubリポジトリに設定します。(環境変数 MY_TRAVIS_REPO)
ここで設定した環境変数の値を後述のスクリプトで使用します。

実行例です。
```
$ gem install travis
$ travis login --pro
$ export MY_TRAVIS_TOKEN=`travis token --pro`
$ export MY_TRAVIS_REPO='myorganization%2Fmyapplication'
```

# スクリプトの準備
```trig-build.sh
#!/bin/bash                                                                                                                                                                                                                              

MY_TRAVIS_REPO=${MY_TRAVIS_REPO:?}
MY_TRAVIS_TOKEN=${MY_TRAVIS_TOKEN:?}

if [ "$#" = "1" ]; then
    branch=$1
else
    echo "usage : $0 <branch>"
    exit 1
fi

body="{                                                                                                                                       
\"request\": {                                                                                                                                
  \"message\": \"$branch `date +%y%m%d%H%M%S`\",                                                                                              
  \"branch\":\"$branch\",                                                                                                                     
  \"notifications\": {                                                                                                                        
    \"email\": \"false\"                                                                                                                      
  },                                                                                                                                          
  \"config\": {                                                                                                                               
    \"branches\": \"*\"                                                                                                                       
  }                                                                                                                                           
}}"

curl -s -X POST \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Travis-API-Version: 3" \
  -H "Authorization: token $MY_TRAVIS_TOKEN" \
  -d "$body" \
  https://api.travis-ci.com/repo/$MY_TRAVIS_REPO/requests
```

# travisビルドの実行
このスクリプトを使い、ブランチを指定してtravisビルドを実行します。
```
$ (path-to)/trig-build.sh develop
・・・
$ (path-to)/trig-build.sh feature/foobar
・・・
```
docker で jupyter/scipy-notebook を自分のホームディレクトリを共有して動かす

# 概要

以下のような相談を受けた

「docker jupyter/scipy-notebook を動かすと一見動いているように見えるが、
新規作成をすると、エラーで作成ができない。
コンテナ内で完結している場合はエラーがでないので、
自分のホームディレクトリを共有している場合にのみ起こるのではないか？」

# 結論

```
docker run -d --user=root -p 12345:8888 -v $PWD/test_notebooks:/home/jovyan/work -e NB_UID=$(id -u) jupyter/scipy-notebook:9f4ed032bada
```

$PWDは$HOMEとかなんでも環境に合わせる

8888 は、コンテナの中のjupyterのポート。こちらは変更しない。
12345 は、dockerの動いているホストで待ち受けるポート。こちらはあなたの環境に合わせて変更する。


# やったこと

```
mkdir -p test_notebooks/test_dir
echo “” > test_notebooks/test1.ipynb
docker run -d --user=root -p 8888:8888 -v $PWD/test_notebooks:/home/jovyan/work -e NB_UID=$(id -u) jupyter/scipy-notebook:9f4ed032bada
```

動作確認

python 2.7 新規作成したあと

```
import numpy as np
```

このあと、Ctrl+Enter

```
np.sin(np.pi/2.)
```

このあと、Ctrl+Enter

```
1.0
```

自分のホスト側での確認

```
$ ls -l test_notebooks/
total 8
-rw-r--r--    1 docker   staff         1082 Mar 31 04:56 sin1.ipynb
-rw-r--r--    1 docker   staff            7 Mar 31 04:49 test1.ipynb
drwxr-sr-x    2 docker   staff           40 Mar 31 04:49 test_dir/
```

# 感想

latest しかタグがないかと勝手に思い込んでいたが、タグはあった。

* [docker hub の scipy-notebook のタグのページ](https://hub.docker.com/r/jupyter/scipy-notebook/tags/)

# 今後

group の対応を考えたい。

# 参考

* [docker hub にある jupyterの場所](https://hub.docker.com/u/jupyter/)
* [jupyter/docker-stacks: Opinionated stacks of ready-to-run Jupyter applications in Docker.](https://github.com/jupyter/docker-stacks)
* [numpy.sin — NumPy v1.10 Manual](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.sin.html)
最新版iOS9.3でUnityアプリをビルドしたときに『Unknown type name '__declspec'』と出た時の対処法

UnityアプリをiOSビルドしたときに『Unknown type name '__declspec'』と出た時の対処法です。

今回、iOS9.3にアップデートし、それに対応してXcode7.3にバージョンアップした際にUnityアプリがiOSビルド出来なくなって焦りました笑

でも、簡単な対処法で直りました。

## ①ビルドすると『Unknown type name '__declspec'』と出る

<img width="1010" alt="スクリーンショット 2016-03-31 13.44.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/4159d3cf-577d-bc2c-ee99-96df753808f3.png">


## ②該当箇所に進む

## ③『NORETURN』を削除する

<img width="605" alt="スクリーンショット 2016-03-31 13.44.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/4a0cbe11-3ffd-160e-9458-eac8c794f91b.png">


## ④エラー感漂ってるけど、ビルドする

## ⑤あ！successした！って感じです笑

![スクリーンショット 2016-03-31 13.44.55.png](https://qiita-image-store.s3.amazonaws.com/0/23873/07a3e6d0-64ef-515a-884c-6eab91d5f1e3.png)

以上です！笑
Windows8/10でPL2303HDXのドライバーが動作しない場合の対応方法について

#はじめに
この記事は、3/21に開催された、[春のIoTリレーハンズオン@関西＜日本橋買い物ツアー＞](https://kansaiouchihack.doorkeeper.jp/events/39575)を開催した際に発生した、PL2303HDXのUSBシリアルケーブルがWindows8/10でうまく動作しない問題についての対応方法のひとつをまとめたものです。

この情報は、[関西おうちハック](https://www.facebook.com/groups/kansai.ouch.hack/)のメンバーから寄せられたものです。情報提供者の方々に感謝。

#問題の状況
PL2303HDXのドライバーは[こちら](http://prolificusa.com/pl-2303hx-drivers/)からダウンロードでき、PL2303HDXはWindows8/10もサポートしていると書いてあるのですが、実際にインストールしてつかってみるとうまく動きません。（認識はしますが、デバイスマネージャーで！印が付きます）

![image](https://qiita-image-store.s3.amazonaws.com/0/51272/b5b20973-ac77-dc47-d20f-5d429affb2e4.png)

#問題が発生している経緯
いろいろ調べてくれた方がいらっしゃいました。その結果、

 - Prolific 3.3.2.102ドライバならWindows10でも古いチップでも動く
 - 古いチップは非推奨になったので、Windows updateではこのドライバは配布はされない
 - 非推奨になった理由は、偽造チップが蔓延してきたから

情報元：[Prolific Comm To USB driver not working](https://login.live.com/login.srf?wa=wsignin1.0&wtrealm=social.technet.microsoft.com&wreply=https%3a%2f%2fsocial.technet.microsoft.com%2fForums%2fwindows%2fen-US%2f3f8e22a0-52bc-431b-a901-292096b46131%2fprolific-comm-to-usb-driver-not-working%3fforum%3dw8itprohardware%26stoAI%3d10&wp=MBI_FED_SSL&wlcxt=microsoft%24microsoft%24microsoft)

とのことでした。

#対応方法
対応方法は、[こちら](http://www.prolific.com.tw/US/index.aspx)から探して、Prolific 3.3.2.102のドライバーをインストールするということになります。
もしくは、秋月電子通商さんの[ＵＳＢ－シリアル変換ケーブル　スケルトンの質問と回答](http://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=M-00720)から過去のドライバーが取得可能です。

既に最新のドライバーを入れた後からの対応例を以下に記載します。

 1. 秋月電子通商さんの上記サイトから、v1.5.0をダウンロードしてインストール。
 2. 「デバイスマネージャーからドライバーソフトウェアの更新」を選択
 3. 「コンピューターを参照してドライバーソフトウェアを検索」を選択
 ![image](https://qiita-image-store.s3.amazonaws.com/0/51272/0bd52461-b320-c2eb-fa10-0cfa7f031b58.png)

 4. 「コンピューター上のデバイスドライバーの一覧から選択」を選択
 ![image](https://qiita-image-store.s3.amazonaws.com/0/51272/6ae1f4c5-6ba2-a892-fa5c-5d5f9ed46e09.png)

 5. 古いドライバを選択
 ![image](https://qiita-image-store.s3.amazonaws.com/0/51272/0e28f265-d8d5-ddb5-07db-3c41da0d4863.png)

以上になります。
考察 > エラー状況をどう残すか > 自作[クリップボード使用] / イベントログ関連の API 

```txt:対象環境
Windowsソフトウェア
実行PC: 開発環境PCとは別環境 (複数の端末間の通信がらみ)
```

ソフトのエラーを捕捉したい。

以下の条件があるとする

- エラー発生時にメインの動作に影響を与えない
  - メッセージボックスの表示はしない
- エラーログファイルを作らないこと
  - 隠しファイルもなし
  - ソフトが終了してからでもエラー状況を知りたい

以下のようにしてみた。

- エラー発生時は「エラー捕捉フォーム」にエラー情報を送る
- 「エラー捕捉フォーム」は通常見えない
- 「エラー捕捉フォーム」は特別な操作によってのみ表示できる
- ソフト終了時に「エラー捕捉フォーム」の内容をクリップボードに送る

上記によりソフトを一度再起動しても、前回のソフト終了時のエラー情報はクリップボードに残る。
ソフトがなんらかの原因で落ちた場合でも、クリップボードに情報が残るのではないか、と期待している。

- <font color=red>クリップボードを書き換えるので、ユーザがクリップボードを多用する環境には向かない。</font>

- 複数のソフトを走らせた場合、２つとも終了すると片方のエラー情報はなくなる
Rails + MySQL + Minitestをwerckerで回してみた


werckerを使い始めたので、minitest始めてみた。
rspecは個人的にメリットが感じられなかったので非選択。

+ fixtureをcsvでやる

fixtureはcsvで良いよ！って記事をよく見かけたんだけど、Rails4.2ではymlだけっぽい



+ dbのデータからfixtures yamlを生成する
rails4系の良い方法が見つからなかったので自作

```ruby
[Category,Employer,User,Subject].each{|model|
  hash = {}
  model.all.each_with_index{|_,i|hash[i] = _.attributes}
  File.write("tmp/fixtures/#{model.name.underscore}.yml", hash.to_yaml)
}
```

+ 日本語を含んだfixturesを取り込むと、エラーが出る。

> ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: '\xE5\x9B\xBD\xE8\xAA\x9E'

services:mysqlもrails-database-ymlもどちらもutf-8で作成される。
原因はテーブルがutf-8になっていなかったことで、schema.rbを変更して

```ruby|schema.rb
create_table "users", force: :cascade , :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8' do |t|
```
と、optionsに文字コードをセットしたら直りました。
でも、毎回手動でやってられん、どうしよう？
とりあえず、置換用の構文
> (create_table.*)(do \|t\|)
> $1, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8' $2
rails active recordで複数のテーブルをincludesするときの書き方お作法


railsであるテーブルを検索して結果を出力するときに、他の関連テーブルも一緒に検索結果に表示したい時にincludesメソッドはよく使うと思います。
で、その際に複数のテーブルをいっぺんに読み込むのに、少し困ったので備忘録代わりに。


例えば、Personテーブルに紐づく、sexテーブル、cityテーブルと、cityテーブルを通してcountryテーブルをincludeしたい時。

```ruby:model
Person.includes([:sex, city: :country])
```

※複数は()内で、更に[]でくくる
※複数の場合は、テーブル名（単数か複数かはリレーションの関係による。モデル側でリレーション定義してね）の前に：をつける
※中間テーブルとか、あるテーブルのその先のテーブルを取るときは、最初の親テーブルは後ろに：、小テーブルは前に：をつける。
モダンなエンジニアになるために：Trending repositories on GitHub today

新しいサービスやフレームワークが次から次へと登場するインターネットの世界。テクノロジーの興味主体が変わって、しばらくすると、以前の知識では分からないほど大きな変化があったりします。
ニュースサイト等やBlogで情報収集してきましたが、便利なサービスやサイトを見つけたので、参考までにここにまとめて書いてみようと思います。
***
#Trending  repositories on GitHub today
https://github.com/trending
![trendingGitHub.png](https://qiita-image-store.s3.amazonaws.com/0/119358/b24fd001-6e67-d674-182c-520be0951029.png)
ソースコードを管理するサービスGitHubで公開されているレポジトリで★が多くつけられているものをリストしています。数多くの言語、フレームワークなどが公開されているので、自分の分野以外の多くのトレンドに触れる機会ができます。
たとえば、DeepMind社のAlphaGoが李セドル氏と対局していたときは、

Rochester-NRT/AlphaGo
https://github.com/Rochester-NRT/AlphaGo

が登場。
アニメーション制作ツールのToonzがドワンゴに買収され、オープンソースプロジェクトとして公開された日は、

opentoonz/opentoonz
https://github.com/opentoonz/opentoonz

が登場していました。
眺めているだけでも、最新のトレンドに触れる機会ができるので、楽しいですよね～。
Arduino M0 Pro でマルチタスクプログラミング : デバッグ

# はじめに

この記事では，[TOPPERS/R2CA](http://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino)のデバッグ方法について説明します．

TOPPERS/R2CAの説明とサンプルの動作方法は次の記事を見て下さい．

 - [Arduino M0 Pro でマルチタスクプログラミング : インストールとサンプルの実行](http://qiita.com/exshonda/items/093870ecdcda6c79678c)
 - [Arduino M0 Pro でマルチタスクプログラミング : マルチタスク](http://qiita.com/exshonda/items/7afb12b56696cf44895e)

# ハードウエア

[Arduino M0 Pro でマルチタスクプログラミング : インストールとサンプルの実行](http://qiita.com/exshonda/items/093870ecdcda6c79678c)で説明しているハードウェアが必要になります．


# ソフトウェア

こちらもハードウエアと同様に[Arduino M0 Pro でマルチタスクプログラミング : インストールとサンプルの実行](http://qiita.com/exshonda/items/093870ecdcda6c79678c)で説明しているソフトウェアが必要になります．
加えて，以下のソフトウェアが必要になるのでダウンロードしてインストールして下さい．

 - [Atmal Studio](http://www.atmel.com/ja/jp/tools/ATMELSTUDIO.aspx#minimum-system-requirements)
  - 動作確認したバージョンは 7.0 (build 790) です．
  - ダウンロードページからoffline installer を選択すると，登録画面が出るのでメールアドレスを登録すると，リンクがメールで送られてくるのでリンクからダウンロードします．
  - ダウンロード後にインストールします．
  - インストール時にアーキテクチャを選択する画面では"SMART ARM MCU"のみを選択すれば十分です．

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/77debe61-894c-94e3-08f2-0176f58ea400.jpeg)



# ビルド

以下のファイルにAtmel Studioが関連付けされているので，ダブルクリックするとAtmelStudioが起動します．

```
.\examples\Basic\r2ca.atsln 
```

以下のようにr2ca_app.cppが表示されるはずです．通常のIDEと同様にファイルの編集が可能です．

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/84f1a6a7-0f4f-68cc-88dd-68bf68860abf.jpeg)


次にビルドをします．メニューの"Build"から"Build Solution"を選択するとビルドが開始されます．Warningが幾つか出ますが，Errorが0ならビルドは成功です．

# デバッグ

ビルド後，ボードをPCに接続してメニューの"Debug"から"Start Debugging and Break"を選択するとデバッグが開始されます．ターゲットのEDBGのファームウェアが古い場合は以下のようにウィンドウが表示されるので，Upgradeする必要があります．この場合は,あらためてデバッガを起動して下さい．

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/f430273a-dc89-2ba7-0d02-0498292b9b72.jpeg)


起動するとアセンブラが表示されるのでタブからr2ca_app.cppを表示してsetup()等にブレークボタンを置きます．

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/81c15319-3a63-b337-8c07-9571c4a57d01.jpeg)


あとは通常のデバッガと同様にスタートボタンを押すと実行が開始されてブレークポイントを置いた箇所で止まります．後は自由にデバッグ可能です．各レジスタの値もウィンドウから簡単に参照することができます．

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/106870/9bbe5ff9-6699-a493-f233-a8711ebecb22.jpeg)

# まとめ

Atmel Studioは無償でVisualStudioベースなので，Eclipseと比較して動作が軽いです．ビルドは，Makefileにより行うので，コマンドラインでの開発とも親和性が高くよい環境だと思います．