OmniAICreator/Qiita-1.07M huggingface dataset:
WindowでPython3でOpenCVを使う

# Anacondaインストール
[ここ](https://www.continuum.io/downloads)から環境にあったAnacondaをダウンロードしてインストール。

# OpenCVインストール
デフォルトの環境にいれるんであれば以下のコマンドはいらない

```
conda create -n 環境名 python=バージョン番号
activate 環境名
```
以下のコマンドでopencvのパッケージを検索。

```
anaconda search -t conda opencv
```
環境にあったパッケージをインストール。自分はmempo/opencv3を選択した。

```
conda install -c menpo opencv3
```

# まとめ
Anaconda超便利。
まともに入れる用と思うとcのコンパイラ入れたりとかめんどくさいのでAnaconda使うの一択だと思う。
Zybo / VHDL > LED使用 > Verilogファイル / HardwareManager > Program Device

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro(64bit)
```

以下のチュートリアルを試した。
http://yuki-sato.com/wordpress/2014/12/31/zynq6/

チュートリアルに従い実施したところLEDの点灯まで実施できた。


## 気づいた点

### led.vファイル

テキストとして紹介されているled.vファイルと、画像として紹介しているled.vファイルが異なっていた。
テキストの方(`assign led = button;`の方)で試したところ、記載の通りの動作(ボタンを押したらLEDが点灯)となった。

### Verilogファイルの文法チェック

led.vの文法チェックについて書かれている。

> ちなみに保存した瞬間にVerilogとして正しいかが検証されます。
もし文字を間違えたりして文法エラーを起こしていたら「Syntax Error Files」に入ります。

意図的に間違った文法にして保存したところ、エラーは表示されなかった。
ファイル保存時に文法チェックをするためには、led.v上にて右クリックして「Set as Top」しておかないといけなかった。
Topの説明はリンクの後の方にある。

### Export > Export Hardwareではまる

一番はまったのが、「チュートリアルに従わずに」Export > Export Hardwareを試したことだった。

そうすると以下のエラーが出る。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0f9303f5-30ce-3bd4-7484-4465a505e697.png)

今回実施した方法ではExport Hardwareで処理できないものかもしれない。未消化。
design_1.vの代わりにled.vを用意して、led.vを使うようにしたため、Export Hardwareするための何かの情報が付随しなくなったような感じではある。

チュートリアル通りに試せば(Hardware MAnagerからProgram Deviceを実施すれば)、こういう「はまり」は起きなかった。


### RTLのSchematic

RTLのSchematicは以下のようになった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0b41e810-223f-401a-7fcd-c3701db80acc.png)
MS Office の VBA エディタでも Source Code Pro 使いたい

Source Code Pro は欧文フォントなので、VBA のエディタで使うと日本語がモジバケールしちゃいます。

でも MS ゴシックでコーディングするのツラいです。(´･ω･`)

これを使いましょう。

[Source Han Code JP](https://github.com/adobe-fonts/source-han-code-jp)

> Source Han Code JP（日本語メニューネーム：源ノ角ゴシック Code）は、Source Han Sansに含まれるプロポーショナル・ラテン・グリフを、Source Code Proのモノスペースのラテン・グリフに変更した派生フォントです。ラテン・グリフは、日本語の仮名や漢字とマッチするようにサイズを調整し、正確に667ユニット固定字幅に設定されています。Source Han Codeは、プログラミングやhtml/CSSの記述、ターミナルでのテキスト表示やコマンド入力などで、ディスプレイでの和欧表示用UIフォントとしての利用を想定しています。



- このフォントをインストールします。
- VBA のオプションで、フォントを選択します。選択するのはこれ (R のところはお好きなウェイトを）
    - 源ノ角ゴシック Code JP R (日本語)

フォントはすこし大きめなのでポイントを下げた方がいいかもです。
また Mac に較べて、細く表示される感じなので、Light より Reglar の方が読みやすかったです。
Julialangで外部ライブラリを使わずにppmファイルを書き出す

Char型だとダメで、Cuchar型の配列だと、writeで配列を指定するだけでOK。


```jl
function saveppm(fname,  w,  h, img)
    open(fname, "w") do fp
      write(fp, "P6\n");
      write(fp, "$w $h\n");
      write(fp, "255\n");
      write(fp, img)
    end
end

img = Array(Cuchar,WIDTH * HEIGHT * 3)
for i = 1:length(img)
    img[i]=Cuchar(round(Int,rand()*255))
end

saveppm("image.ppm", WIDTH, HEIGHT, img)
```
JavaScriptで指定したURLにページ遷移する方法


例えば、`http://example.com`へ遷移したい場合、

```js
location.href = 'http://example.com';
```
とするか、

```js
location.assign('http://example.com');
```
とします。両者の違いですが、[location.href property vs. location.assign() method](http://stackoverflow.com/questions/10302905/location-href-property-vs-location-assign-method)によると速度的な違いから`location.href = '...'`を使う方が良いとする人が多いようです。

また、上の2つの方法はページ遷移がブラウザの履歴に残るため、遷移後に戻るボタンで元のページヘ戻ることができますが、

```js
location.replace('http://example.com');
```

とした場合、ブラウザの履歴に残らないため、戻るボタンで元のページヘ戻ることができません。

## 参考
- [パーフェクトJavaScript：書籍案内｜技術評論社](https://gihyo.jp/book/2011/978-4-7741-4813-7)
- [location.href property vs. location.assign() method](http://stackoverflow.com/questions/10302905/location-href-property-vs-location-assign-method)
Zybo > Vivado > XDC > (Target) > Vivado上のデザインで変更した内容がTargetとしたファイルに書き込まれる

Working with Constraint Sets
https://www.youtube.com/watch?v=5igmZMS0-0g&index=31&list=WL

XDCのファイルに対して`(Target)`という設定をする。

3:56あたり
- ファイル上で右クリック
- Set as Target Constraint File

こうすることで、Vivado上のデザインで変更した内容がTargetとしたファイルに書き込まれるようだ。
技術英語 > Switching from one view of a system to another is [mentally strenuous]

@ Code Complete (4211 / 36077)

> Switching from one view of a system to another is <font color=red>mentally strenuous,</font>

http://ejje.weblio.jp/content/strenuous
> `2 〈仕事・行為など〉奮闘を要する.

Readable Codeなどでもmental overloadを如何に下げるかで良い設計になると記載されている。
JetBrains IDE で Souce Code Pro の ExtraLight を使いたい

環境は Mac です。オチがしょうもないので、あらかじめ断っておきますｗ

WebStorm/PHPStorm などの JetBrains IDE のエディタのフォントを Souce Code Pro の ExtraLight にしたい。

でも、JetBrains IDE のフォント設定ではフォントのウェイトを選べません。

どうすればいいでしょう。

簡単な解決法は、

> Source Code Pro を Mac にインストールする際に、ExtraLight と Bold だけをインストールする。

です。

ふざけんなって声が聞こえてきそう。ごめんなさい。
でも僕自身がこの方法を思いついたときには「そうか！それでいいんだ！」って思ったんでｗ
僕自身がそうなんですが、ExtraLight や Light をお気に入りの方は、Regler とか使わないでしょ？使わないなら入れない、でOKじゃないすか？

あと一つ。

今、[Source Han Code JP](https://github.com/adobe-fonts/source-han-code-jp) というフォントがありましてですね。

> Source Han Code JP（日本語メニューネーム：源ノ角ゴシック Code）は、Source Han Sansに含まれるプロポーショナル・ラテン・グリフを、Source Code Proのモノスペースのラテン・グリフに変更した派生フォントです。ラテン・グリフは、日本語の仮名や漢字とマッチするようにサイズを調整し、正確に667ユニット固定字幅に設定されています。Source Han Codeは、プログラミングやhtml/CSSの記述、ターミナルでのテキスト表示やコマンド入力などで、ディスプレイでの和欧表示用UIフォントとしての利用を想定しています。

これ、なかなかいいです。こちらも、EL や L を使いたければ、上記の方法で使えます。
Macで使うアプリケーションまとめ

#mac OS sierraで使用するアプリケーション達をまとめておく
##背景
macを買って一年が経つが、色々なアプリケーションをインストールし散らかし(特にhomebrewとmacportによる)、ssdの使用容量が図1のようになってしまったため、研究がひと段落したこのタイミングで断捨離をすることとした。
##目的
- sierra入れたので、これを機にクリーンインストールしアプリケーション周りをすっきりさせる

##主要なアプリケーション
- プログラミング用環境
    - Xcode
    - Netbeans
    - Android Studio
    - Atom
    - nano(デフォルトではなく[homebrewよりインストール](http://qiita.com/KoriCori/items/12c4309bd38b096d5bb9))
        - [nanorcの設定](https://github.com/scopatz/nanorc.git)
- メーラ
    - Thunderbird
- ブラウザ
    - Safari
    - Chrome
    - Firefox
- SNS
    - LINE
    - Facebook
    - Twitter
    - Hangout
- クラウドストレージ
    - Google Drive
- フィットネス管理
    - Fitbit Connect
- 文書作成
    - Latex
- ソースコード管理
    - Git
    - Mercurial
- ソースコード管理クライアント
    - GitHub Desktop
- 文字コード変換
    - nkf
- 動画編集関連
    - youtube-dl
    - ffmpeg
- Homebrewで入れたもの(なにがなんだかわからなくなってるので、一旦保留)
    - fontforge(Ricty)
    - coreutils(gls)
    - mercurial
    - ghostscript
    - nkf
    - youtube-dl
    - ffmpeg
```shell-session 
$brew list

ant			imagemagick		opencore-amr
boost			isl			openjpeg
brew-cask		jpeg			openssl
c-ares			lame			opus
cairo			libass			pango
czmq			libbluray		pcre
d-bus			libcaca			pixman
emacs			libffi			pkg-config
faac			libgcrypt		python
fdk-aac			libgpg-error		python3
ffmpeg			libmpc			r
fontconfig		libogg			readline
fontforge		libpng			rsense
freetype		libquvi			rtmpdump
frei0r			libsoxr			ruby
fribidi			libtasn1		sdl
gcc			libtiff			sl
gdb			libtool			speex
gdbm			libvidstab		sqlite
geoip			libvo-aacenc		texi2html
gettext			libvorbis		theora
ghostscript		libvpx			tree
git			libyaml			vim
glib			little-cms2		x264
gmp			lua			x265
gnutls			mercurial		xvid
gobject-introspection	mongodb			xz
graphviz		mpfr			yasm
harfbuzz		nettle			youtube-dl
icu4c			nkf			zeromq
```

- macportでinstallしたもの
    - エラーでて見れない...


- リモートアクセス
    - TeamViewer
- 画像操作ユーティリティ
    - ImageMagick
- 画像編集ツール
    - GIMP
- Terminal用カラースキーマ
    - Solarized
- lsのカラーリング
    - gls
- プログラミング用フォント
    - Ricty
"nil"というリテラルを可能な限り書きたくない


##はじめに
他人のSwiftのコードを見ていると、
（この書き方、あまりSwiftっぽくない。）
と思うことがよくあります。
そこで、私が気になったSwiftの作法について取り上げて行きたいと思います。

第二回は「"nil"というリテラルを可能な限り書きたくない」です。

##具体例
例えば、以下のようなコードを書く人がいます。

###よく見るパターン
```Swift
var nohirap: Int? = nil
if nohirap != nil {
	//何か処理をする
}
```

これは、他の言語ではよくあるnilないしnullのチェック方法ですが、
Swiftにはもっと優れたnilのチェック方法がいくつかあります。
※この記事ではOptional型については深く言及しません。

###Optional binding
```Swift
var nohirap: Int? = nil
if let nohirap = nohirap {
	//nilじゃなければこのifに入る
	NSLog(nohirap.description) //ifの中ではアンラップされた状態で扱える
}
```

###Optional Chaining
```Swift
var nohirap: Int? = nil
NSLog(nohirap?.description ?? "") //nilだったら空文字を表示する
```

###guard
```Swift
var nohirap: Int? = nil
guard let nohirap = nohirap else {
	// nilだったらreturnされる
	return
}
NSLog(nohirap.description) //アンラップされた状態で扱える
```

##ここからが本題
Swift経験者であれば、通常はnilチェックの際にOptional bindingなど、先程挙げた手段を取ると思います。
ですが、以下のような場合では"よく見るパターン"に陥りがちな人が結構います。

```Swift
var nohirap: Int? = nil
if nohirap != nil {
	NSLog("ログ") //nilチェックをした変数を使わない
}
```

何故なら普通にOptional bindingやguardを使おうとすると、letで定義しているのにもかかわらず未使用なため、コンパイラに警告されるからです。

```Swift
var nohirap: Int? = nil
if let nohirap = nohirap { //ここに警告が出る
	NSLog("ログ")
}
```

###提案
しかし、個人的にnilというリテラルはなるべく書きたくないし、nohirap != nilはSwiftのモダンな書き方ではないと思うので、以下のような書き方を提案します。

```Swift
var nohirap: Int? = nil
if let _ = nohirap {
	NSLog("ログ")
}
```

```Swift
var nohirap: Int? = nil
guard let _ = nohirap else {
	return
}
NSLog("ログ")
```

これならコンパイラに警告されることなく、かつnilというリテラルを使うこともなくnilチェックができます。

##まとめ
Swiftではnilチェックの時にnilリテラルを使わない方がモダンな書き方だと思うので、let _をおすすめします。
クロスプラットホームGUIライブラリいろいろ

使えそうなものだけ挙げます
# [Qt](http://www.qt.io/)
キュート。Qt5.7 (2016/06/16 latest)。KDE Desktopに使われている。

+ Langurage : C++, QML
+ IDE : [Qt Creater](https://wiki.qt.io/Qt_Creator)

## Qt言語バインディング
+ [PyQt](https://www.riverbankcomputing.com/software/pyqt/intro) : Python。Qt5サポート。
+ [QtRuby](https://techbase.kde.org/Languages/Ruby) : Ruby。リンク切れ激しい。Qt4サポート
+ [Qt Jumbi](http://www.qtjambi.org/) : Java。Qt4サポート

# [GTK+](http://www.gtk.org/)
GTK+ 3.20.6 (2016/05/23 latest)。GNOME Desktopに使われている。

+ Langurage : C
+ IDE, Designer : [GtkBuilder](https://developer.gnome.org/gtk3/stable/GtkBuilder.html)

## [GTK+言語バインディング](http://www.gtk.org/language-bindings.php)
以下に挙げたのはOfficialのものだけ。OfficialのものはリリースやAPIの安定性が保証される。


+ [gtkmm](http://www.gtkmm.org/en/) : C++
+ [JavaScript in GNOME](https://wiki.gnome.org/JavaScript) : JavaScript
+ [PyGObject](https://wiki.gnome.org/Projects/PyGObject) : Python
+ [Vala](https://wiki.gnome.org/Projects/Vala) : ValaというGNOME Desktop開発に特化した言語

# [Tk](http://tcl.tk/)

+ Langurage : Tcl

## [Tk言語バインディング](http://wiki.tcl.tk/17264)
たくさんある。

+ C
+ C++
+ FORTRAN
+ Go
+ Haskell
+ Lua
+ Perl
+ Python
+ R
+ Ruby

などなど

# [wxWidgets](https://www.wxwidgets.org/)
wxWidgets 3.1.0 (2016/02/29 latest)

+ Langurage : C++
+ IDE : 特になし

## wxWidgets言語バインディング

+ [wxPython](https://wxpython.org/) : Python。個人的によく使う。[Project Phoenix](https://wiki.wxpython.org/ProjectPhoenix)でPython3.xに対応しようとしている。
+ [wxRuby](http://wxruby.rubyforge.org/wiki/wiki.pl) : Ruby。2009/9/9 latest。古い。
+ [wxPerl](http://www.wxperl.it/) : Perl。0.9928 (2015/12/20 latest)

# [FOX Toolkit](http://fox-toolkit.org/)
FOX Toolkit 1.6.51 (2011/03/15 ? latest stable) 結構古い。

+ Langurage : C++
+ IDE : 特になし

## FOX Toolkit言語バインディング

+ [FXPy](http://fxpy.sourceforge.net/) : Python。2002年からUpdateなし。古い。
+ [FXRuby](http://www.fxruby.org/) : Ruby。[RubyGemのページ](https://rubygems.org/gems/fxruby/)で最新版確認。1.6.34 (2016/04/26 latest)


# 適宜追加していきます。
ソースコードこうやって書いてます

# このページについて
[ソースコードって実際のところどういうふうに書いていますか？](https://note.mu/ruiu/n/n1083b2a5d547)という記事を読んで、自分自身はどうやってコード書いているんだっけ？と棚卸ししてみたくなったので書いてみます。
ふだんJavaで書いているのでそのつもりで読んでください。（他の言語になってもあまり変わることはないと思いますが。）

# 基本情報
業態：SI
プログラミング歴：9年

# 共通的にやること
何かの区切り（コード実装終わった、これから難易度高いところやる・終わった、帰宅するタイミングなど）でコミットしておく。

# 新しく何かを１から作る場合
1.　やりたいことの整理
　とりあえず作る機能が何を満たせば良いのか腹に落とすところから始めます。
　要求が曖昧な場合もあるので、そういうものは一旦曖昧だなと割り切ってしまいます。
　（コード書いた時に、もやもやしている部分が結構コードに出てきて、そこからアイデアが出たりもするので。）
1.5. 脳内プログラミング
　1をやっている時に技術的に課題が出てきそうな箇所について、可能そうかどうか、何を使って実装すれば良さそうかを頭の中で模索します。
　成功するイメージが沸かない場合は、難易度的にヤバい機能なので、一旦周りに「この機能はヤバい気がする」と匂わせておきます。
2. 実装
　細かいこと（エラーチェックとか）はほっておいて、エイヤーでアウトラインを書いてしまいます。
　この時はテストコード動かしながらとかはやってないです。（どかっと書く派です）
3. テストの実装
　テストデータの作成とテストコードを書いていき、想定通りの動きになるまでデバッグします。
4. プログラム構造の整理
　テスト結果が思った通りオールグリーンになったところでエイヤーで作ったコードの構造が綺麗にしていきます。
（最初からある程度構造を考えながら書いているけど、もっと綺麗にできるところないかなと、自分の書いたコードに向き合う時間を作ってます）
エラーチェックなんかもここで全て実装します。
（5.） 書いたコードを捨てる勢いで綺麗にする
　括弧づけで偶にみたいな感じにしましたが、新しいものを作る時は結構起こしていることですw
　構造を整理しているうちに、あ〜これもっとこう書けばよかった！と思ってしまったり気づいてしまったり。。。　
　そんな時は、時間があれば書いたコードをぶっ壊す勢いで修正をかけます。
　そんなに大胆に変更してもテストコードとテストデータがあるので、あまり時間はかからないです。

と、こんなことをやっているうちにソースが洗練されていくという自分的方程式です。（他人が見て洗練されているかどうかは判らないですけども。。。）
作り直す勢いで書き直すのは、多い時だと２〜３回繰り返してるかもしれないです。（それだけ手を動かすのだけは速いっていうことで許して。。）

# ソースの改変を行う場合
1. とりあえずテストを走らせる<BR>
どのメソッドがどういう想定で動くように作られているのかを頭に入れてます。
また、一応全部グリーンだよね、ってことも確認しておきます。
2. ソースの修正<BR>
改変の場合は、結構慎重に直してます。１メソッド直したらテストも直して走らせるってことをして変なことになっていないよね、ということを確認しながら進めてます。

# コードが何かの原因でぶっ壊れたら
「あ〜なんかぶっ壊した、ワカンネ！」と周りに聞こえるように言ってから、潔く最後のコミットに戻します。

# コードを書いている途中で仕様が変わったり、追加された場合
軽微なものは盛り込んで、そうでないものは後回しにしています。
後回しにする理由は、書いているプログラムに何か問題が発生した場合に、原因がどこにあったのかを解りやすくするためです。
また、一旦仕様に手が入る前の状態で作りきった後で対応するという風にした方が、進捗が遅れないように感じます。
※作りきっていない物に処理を追加したりしてプログラムの構造も変えようとすると変更の難易度が高くなるような気がする

# 終わりに
ソースコードをぶっ壊して作り直す下りはあまり共感されないに違いない。
Bitrise、Crashlytics利用時のFastlane設定方法（Android編）

基本的には[iOS編](http://qiita.com/shymst/items/36461d7fbbd7c6e4aab2)と同じ。

`fastlane init`の際に聞かれる`.json`は証明書のことなので、Google Developer Consoleで発行する。

## bitrise.ymlの設定
最初の設定は`primary`となっており、どのブランチからでもビルドが走ってしまう。
例えば`master`ブランチがpushされた時のみ、ビルドさせたい場合は以下の手順で変更を行う。

`Workflow Editor`を開き、左メニューから`bitrise.yml`を開く。

トリガーの設定をする為に以下を追記する。

```
trigger_map:
- pattern: master
  is_pull_request_allowed: false
  workflow: master
```

※単純に追加しただけでは、エラーが起こる場合がある。
その際は、`workflow:`の下の行が`primary`になっていないか確認する。
もし、`primary`のままだったら`master`に修正する。


## crashlytics-developtools.jarをDL

配布には`crashlytics-developtools`のパスを指定しなければいけないので
まず、`crashlytics-developtools.jar`をダウンロードする。
これは、Fabric.ioの[Ant向けビルドツール](https://www.fabric.io/downloads/ant)に含まれている。
Fabricの `Download Plugins`から`Build Tools > Ant` を選んで`crashlytics.zip`をDLし、
以下の場所に配置する。

```
(Project Directory)/fastlane/crashlytics-devtools.jar
```
Fastfileに不足していたjarファイルを指定する。

設定後は以下の記述になる。

```
  lane :crashlytics do
    gradle(task: "assembleDebug")

    crashlytics(
      notes: "fastlaneによる配布",
      api_token: ENV["CRASHLYTICS_API_TOKEN"],
      build_secret: ENV["CRASHLYTICS_BUILD_SECRET"],
      groups: "developer",
      apk_path: "app/build/outputs/apk/app-debug.apk",
      crashlytics_path: "fastlane/crashlytics-devtools.jar"
    )
  end
```

## テスト配布までの流れ

- Bitriseのアカウント作成
- Fabricのアカウント作成・Android Studioにプラグインを導入
- Google Developer Console でAPIを発行
- Fastlaneを導入
- FastFileを編集
- Bitriseのworkflowを作成
サービスを開始するときに意外に苦労するロゴ集めと、商用利用ガイドライン

デザイナーさんとプログラマーさん向けに。
申請の必要なものもあるので注意が必要。

#Twitter
https://about.twitter.com/ja/company/brand-assets
![02_Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/133838/a4601174-69be-75bf-451e-508668441ab9.png)

#Youtube
https://www.youtube.com/yt/brand/ja/using-logo.html
![01_YouTube.png](https://qiita-image-store.s3.amazonaws.com/0/133838/c9dc4d03-34e0-baf4-01b7-08734425bb22.png)

#Google+
https://www.seeklogo.net/technology-logos/new-google-plus-icon-vector-73768.html
![05_Google+.png](https://qiita-image-store.s3.amazonaws.com/0/133838/95c6ad31-67da-dcf3-d0cc-9d8d2706e884.png)

#Facebook
https://www.facebookbrand.com/
![04_Facebook.png](https://qiita-image-store.s3.amazonaws.com/0/133838/5096cf3d-e01d-2968-f4e8-8026a25e1e18.png)

#Instagram
https://www.instagram.com/press/
![03_Instagram.jpg](https://qiita-image-store.s3.amazonaws.com/0/133838/7274675b-4369-ea09-554e-d9af7c55256a.jpeg)

#ニコ動
http://commons.nicovideo.jp/search/tag/%E3%80%90%E5%85%AC%E5%BC%8F%E3%80%91%20%E3%80%90%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%8B%95%E7%94%BB%E3%80%91
![06_niconico_movie.png](https://qiita-image-store.s3.amazonaws.com/0/133838/4bbe5bf5-d9ac-dcc6-fd7c-62a3d361bfb1.png)

#Vimeo
https://vimeo.com/about/brand_guidelines
![07_Vimeo.jpg](https://qiita-image-store.s3.amazonaws.com/0/133838/63cb1201-d132-02d2-882d-a637efc909d3.jpeg)

#pinterest
https://business.pinterest.com/en/brand-guidelines
![11_Pinterest.png](https://qiita-image-store.s3.amazonaws.com/0/133838/5f7e87ca-13b7-74fe-6315-092f9c492b79.png)

#OKWave
http://www.okwave.co.jp/ri/about/logo/index.html
![40_okwave.jpg](https://qiita-image-store.s3.amazonaws.com/0/133838/2a6c0129-f8ad-3cc0-520a-0d95b16743e9.jpeg)

#はてな
http://hatenacorp.jp/press/resource
![41.png](https://qiita-image-store.s3.amazonaws.com/0/133838/79cdc7f2-d26c-8c3a-46ee-640ca8c78d2c.png)

#Qiita
https://increments.zendesk.com/hc/ja/articles/204009729-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3
![44_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/133838/092eed0a-74f3-f7bf-7676-6d6b2ce7ae72.png)

#GitHub
https://github.com/logos
![45_GitHub.png](https://qiita-image-store.s3.amazonaws.com/0/133838/a2624b92-c1d4-aa7d-0cf0-cbea1f46108d.png)

#pixiv
http://www.pixiv.net/brand_terms.php
![48_pixiv.jpg](https://qiita-image-store.s3.amazonaws.com/0/133838/c5ae129e-4f47-57eb-d7c5-f39eda8639e1.jpeg)

#amazon
https://www.amazon.co.jp/gp/help/customer/display.html?ie=UTF8&nodeId=201748040
![54_amazon.jpg](https://qiita-image-store.s3.amazonaws.com/0/133838/1d8ae48b-f4a0-fc87-6fea-fc346f1424e5.jpeg)

#app-store
https://developer.apple.com/app-store/marketing/guidelines/jp/
![56_AppStore.png](https://qiita-image-store.s3.amazonaws.com/0/133838/170bce29-9aa2-527c-a6d1-d29f7add598c.png)

#chatwork
http://www.chatwork.com/ja/download/cw_logo.html
![57_chatwork.png](https://qiita-image-store.s3.amazonaws.com/0/133838/be1fcac8-93ab-4db6-97af-1b5126c86e65.png)
atomでPHPのデバッグ

PHPのビルトインサーバを使用して、atomでデバッグしてみた。

## 前提
下記がインストール済みであること
- PHP（5.4以上）
- Xdebug
- php-debug（atomのパッケージ）

## 設定
php.iniに以下の設定を追加する
※php.iniの場所がわからない場合は`phpinfo()`で確認

```
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
```

## ビルトインサーバを起動
php.iniで設定したxdebugのportに合わせて起動する

```
php -S localhost:9000 -t [DocumentRootのフルパス]
```
または、ドキュメントルートに移動してから起動

```
cd [DocumentRootのフルパス]
php -S localhost:9000
```

## atomでデバッグ
### デバッグウィンドウを開く
cintrol+option+D（mac）、または画面下のPHP Debugをクリックしてデバッグウィンドウを開く
![2016-07-16 00-46-12.png](https://qiita-image-store.s3.amazonaws.com/0/128475/bd4d2c2f-9706-d88e-bfed-c41a484a078f.png)

### ブレークポイントを設定する
対象行の左のエリアをクリックすると、ブレークポイントが設定できる
![2016-07-16 00-31-46.png](https://qiita-image-store.s3.amazonaws.com/0/128475/483d3dac-9e4c-cd6e-440e-863317bb016b.png)

### 対象ページにアクセスする
ブレークポイントで止まるので、あとはステップ実行など自由に操作
以下のように変数の内容も確認できる
![2016-07-16 00-48-36.png](https://qiita-image-store.s3.amazonaws.com/0/128475/40304f90-8e5f-e24a-ccee-e01f8216f710.png)
csvをrubyでユニークする.

##はじめに
rubyでスクレイピングしてきてcsvに吐き出したのだが、電話番号やら店舗名やらで重複している。そこで、二重配列をユニークする必要があった。

スクレイピングしてきたcsvのカラムは
**[大カテゴリ、中カテゴリ、少カテゴリ、店名、住所、電話番号]**
という感じ。

## uniqメソッドにブロックを渡して解決
例えばcsvはこんな感じ
```
csv1 = [["大カテゴリ","中カテゴリ","少カテゴリ","店名","住所","電話番号"]
        ["A","B","C","D","E","03-0000-0000"]
        ["F","B","E","R","A","03-0000-1232"]
        ["Y","T","G","H","C","03-0000-0000"]]
```

電話番号でユニークしたいとすると、
uniq後はこうなってほしい
```
csv2 = [["大カテゴリ","中カテゴリ","少カテゴリ","店名","住所","電話番号"]
        ["A","B","C","D","E","03-0000-0000"]
        ["F","B","E","R","A","03-0000-1232"]
```

こうすればできたよ。
```
csv2 = csv1.uniq{|item| item[5]}
```

[uniqメソッドのリファレンス](http://ref.xaio.jp/ruby/classes/array/uniq)
IntelliJですばやくCodeigniter環境を構築する


【参考】
[IntelliJですばやくPHP開発環境を構築する](http://qiita.com/master-of-sugar/items/64955c57f95bc89dedcd) 
↑の記事でPHPの環境自体はほとんどOK。
  

まずは公式サイトからダウンロード
---
[https://codeigniter.com/](https://codeigniter.com/)

![スクリーンショット 2016-07-15 23.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/128479/ab7f076d-97d1-4123-af24-af4210df3520.png "スクリーンショット 2016-07-15 23.58.50.png")

CodeIgniter-3.0.6.zipが落ちてくる

プロジェクトを配置する
---
CodeIgniter-3.0.6.zipを解凍すると`CodeIgniter-3.0.6`ができるので、適当な名前にリネームする、
今回は`test`とでもしておく
上記参考で作成した`php-sample`プロジェクト配下に`test`プロジェクトを配置する  
![スクリーンショット 2016-07-16 0.23.28.png](https://qiita-image-store.s3.amazonaws.com/0/128479/99623042-9b3b-c7e8-3b90-6183036e18fe.png "スクリーンショット 2016-07-16 0.23.28.png")

起動設定を修正する
---
Run -> Edit Configurations
`php-sample`から`php-sample/test`に変更する 
![スクリーンショット 2016-07-16 0.35.37.png](https://qiita-image-store.s3.amazonaws.com/0/128479/b2b3ade2-fd55-7cbc-3d40-1e38747f8b9b.png "スクリーンショット 2016-07-16 0.35.37.png")
 ブラウザで起動確認を行う
---
以下のURLをブラウザで開く  
[http://localhost:8000/](http://localhost:8000/)  
  
以下の画面が表示されれば成功 ![スクリーンショット 2016-07-16 0.24.22.png](https://qiita-image-store.s3.amazonaws.com/0/128479/42fbfcb2-e09f-a30f-6db7-049e952931af.png "スクリーンショット 2016-07-16 0.24.22.png")
Stack を使って Haskell をインストールする

Haskell 開発環境のインストールは、以前は Haskell Platform を使うのが定番でしたが、現在は [Stack](http://haskellstack.org/) を使うのが定番となっています。

この記事では、Stack をインストールした後で（Stack 自体のインストールはプラットフォームごとに異なりますので Stack のページを参照してください）、実際に Haskell 開発環境をどのように整えるか書きます。

# Stack を使って Haskell 開発環境をインストールする操作手順

Stack のインストール直後はまだ GHC が使えません。Stack で GHC のインストールを行うには次のようにします。

## 方法 1 : プロジェクトを新規作成して GHC を使う

Stack のページを見ると、まず `stack new` でプロジェクトを作成し、そのディレクトリに入って `stack setup` を実行せよ、と書いてあります。

その通りに実行すると、GHC がまだダウンロードされていなければダウンロードされ、インストールが行われます。インストールが終わると、プロジェクトディレクトリの内側で、`stack ghc` コマンドで GHC を使うことができるようになります。

## 方法 2 : プロジェクトを新規作成せずに GHC を使う

前述の方法ではプロジェクトを作成することが前提となっています。しかし、プロジェクトを作成せずに GHC を使うことも可能です。そのためには、プロジェクトディレクトリの外側で `stack setup` を実行します。

すると、同様に GHC のインストールが行われます。これで、どのディレクトリにいても `stack ghc` で GHC を使うことができるようになります。

# Haskell 開発環境がインストールされる場所

上記の方法で、どちらも `ghc` というコマンドが PATH が通った場所にインストールされたわけではありません。実際に GHC がインストールされるのは、`~/.stack` ディレクトリ以下です。これを `stack ghc` と、`stack` コマンド経由で実行します。

# プロジェクトを作成する場合としない場合の違い

`stack new` でプロジェクトを作成すると、そのプロジェクトで使う Haskell 開発環境のバージョンなどの情報が書かれた `stack.yaml` ファイルがプロジェクト内に生成されます。`stack setup` は、`stack.yaml` に記述された内容をもとに GHC のインストールを行います。

プロジェクトの外側で `stack setup` を実行した場合は、`~/.stack/global-project/stack.yaml` に記述された内容をもとに GHC のインストールを行います。つまり、個々のプロジェクトの設定の代わりに、グローバルプロジェクトという特殊なプロジェクトの設定が使われることになります。

# Haskell 開発環境のバージョン

最初に `stack.yaml` ファイルが生成されるときに、Haskell 開発環境のバージョンが `stack.yaml` に書かれます。`resolver: lts-5.18` などと書かれている行がそれです。`stack setup` は、そこに記載されたバージョンの Haskell 開発環境を使えるようにします。

Haskell 開発環境のバージョンを変更したい場合は、`stack.yaml` の `resolver` の行を書き換えてから `stack setup` を実行します。

グローバルプロジェクトを使う場合、最初に生成された `~/.stack/global-project/stack.yaml` の設定を使い続けることになります。そのため、グローバルプロジェクトで新しい Haskell 開発環境に更新したい場合は `~/.stack/global-project/stack.yaml` の `resolver` の行を書き換えてから `stack setup` を実行します。

`resolver` の行に記載するバージョンですが、最新バージョンは [LTS Haskell](https://www.stackage.org/lts) のページを見ると分かります。また、使用可能なバージョンの一覧は [lts-haskell: LTS Haskell build plans](https://github.com/fpco/lts-haskell) のページを見ると分かります。

# もっと簡単に GHC を呼び出したい

毎回 `stack ghc` というコマンドで GHC を使うのは少々面倒です。シェルでエイリアスを定義しておくのが楽かと思います。bash や zsh の場合は、`~/.bashrc` や `~/.zshrc` に以下のように定義しておくと良いです。

```
alias ghc="stack ghc --"
alias ghci="stack ghc -- --interactive"
alias runghc="stack runghc --"
```

# まとめ

Haskell 開発環境を整えるには Stack を使えばいいという話はあるものの、実際にどのように整えるのかがどうもはっきりしないと感じていたのでまとめました。ツッコミ歓迎です。
Apt-Get Issue Of Update From Source under HTTPS

When use `apt-get update` after add an https source to source list of apt on debian, an error came out as,

    E: The method driver /usr/lib/apt/methods/http could not be found.

It seems to be caused by the CA list on local is out of date, or simply not exists.

If apt still works well, use 

    apt-get install apt-transport-https ca-certificates

to install the CA.

If your apt-get is too broken to do this, you can download the package directly from 

> https://packages.debian.org/jessie/apt-transport-https 

and install it with dpkg -i. Of course, you may need to confirm the version of debian.
[Rails] Deviseでユーザ情報更新後に元の画面に戻る

その他のリダイレクト処理でも`root_path`を参照するような場合にそれより前に`user_root_path`を参照するので、それを上書きする

``` controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def user_root_path
    edit_user_registration_path
  end
end
```
Amazon LambdaとKinesis Stream構成の初歩的な「あるあるトラブル」と対策

# 目的

Amazon LambdaとKinesis Stream構成の初歩的な「あるあるトラブル」で時間と労力を無駄にしないことです。

# 想定読者

下記のいずれか

- これから初めてAmazon LambdaとKinesis Streamを使おうとしており、それぞれのサービスについて概要と基本的な動かし方は知っているが、運用経験は無い人
- 上記に当てはまる人に対して、基礎的な（バッド）ノウハウを共有したい人

かつ

- Lambda FunctionでJavaのコードを使いたい人

です。

# 前提

Kinesis Streamをイベントソースとして、Lambda FunctionでJavaのコードを動かすこと。

# 本題
自分が遭遇したトラブルの原因別に問題と対策（唯一解ではない）をまとめてみました。

## Lambda Functionのメモリ割り当て不足に起因する問題

- Javaで実装したハンドラーが実行されない

マネジメントコンソールからメモリ割り当て量を選択する仕組みが実行プラットフォームを考慮していないため、動作が現実的ではない構成が選べてしまいます。
JavaはJVM立ち上げのためにある程度のメモリを必要するため、最低限でも256MBは割り当てないと動きません。
最小構成である128MB割り当てで実行し、エントリーポイントにすら辿り着いていないログを見て唖然とするのはみんなが辿った道？です。
改修したらclassファイル増えて必要なメモリ量が増えた結果、突然動かなくなったという話もあります。
割り当てメモリをケチるのは後回しにしましょう。

## Lambda Functionのリトライ制御不足に起因する問題

- 同一データに対する処理の重複
- データロスト

イベントハンドラーが例外をスローした場合、Kinesis Streamから再度同じデータ列を最初から読み込む形でハンドラーが再実行されます。

例えば、バッチサイズを10にしていて、Kinesis Streamから読み込んだ5件目のデータの処理中に例外をスローしたとすると、リトライによって1件目から4件目までは同じ処理が2回実行されることになります。
さらに、5件目のデータそのものが不正で、確実に例外をスローするような場合、延々とリトライが繰り返されることで6件目以降のデータに対して処理が実行されません。これは放置するとデータの生存期限（デフォルトで24時間）を過ぎるまで続き、場合によってはデータロストに繋がります。

例外発生を想定してtry～catchするのは当然として、エラー対応のポリシーを定めて関係者で合意すると良いでしょう。
エラー対応のポリシー決定に際しては、リトライによる自動復旧がどの程度見込めるか否かでエラー原因を分けると良いです。

データロストや重複をある程度は許容できる状況で一番単純なポリシーは「不正データは読み捨てて存在しないものとして扱い、関連システムの障害によるエラーは復旧までひたすらリトライするのに任せる」というものだと思っています。
これは同一データに対する処理の重複もデータロストも完全には防げない分、設計と実装のコストを少なく抑えながら、正常系の動作継続を優先できます。
テキストまたはファイルの内容をSlackに投稿用

何かのバッチの実行結果をSlackに投稿するものをGo言語で作る。
Go言語のflagパッケージを使って引数指定できるようにする。
ファイルに出力した結果も投稿したいので、ファイル名も引数指定できるようにする。
※現状はファイルはutf8じゃないと日本語が文字化けする。

下記を参考に作成
[今更やけど、Go言語でSlack APIを使ってみた！！](http://blog.shinofara.xyz/archives/290/)
[Go言語のflagパッケージを使う](http://ryochack.hatenablog.com/entry/2013/04/17/232753)



```go:notifySlack.go


package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

var (
	IncomingUrl string = "https://hooks.slack.com/services/**********************************"
)

type Slack struct {
	Text       string `json:"text"`
	Username   string `json:"username"`
	Icon_emoji string `json:"icon_emoji"`
	Icon_url   string `json:"icon_url"`
	Channel    string `json:"channel"`
}

func main() {
	var (
		text     string
		username string
		emoji    string
		iconurl  string
		channel  string
		filename string
	)

	flag.StringVar(&text, "text", "", "text")
	flag.StringVar(&username, "username", "testbot", "username")
	flag.StringVar(&emoji, "icon_emoji", ":chicken:", "icon_emoji")
	flag.StringVar(&iconurl, "icon_url", "", "icon_url")
	flag.StringVar(&channel, "channel", "#general", "channel")
	flag.StringVar(&filename, "filename", "", "filename")

	flag.Parse()

	if len(text) == 0 && len(filename) > 0 {
		contents, err := ioutil.ReadFile(filename)
		if err != nil {
			fmt.Println(contents, err)
			return
		}
		text = string(contents)
	}

	params, _ := json.Marshal(Slack{
		string(text),
		string(username),
		string(emoji),
		string(iconurl),
		string(channel)})

	resp, _ := http.PostForm(
		IncomingUrl,
		url.Values{"payload": {string(params)}},
	)

	defer resp.Body.Close()

}

```

SlackAPIのURL(IncomingUrl)はSlackのApp&Integrationから
「Incoming WebHooks」を検索
「Add a Configuration」で追加、生成した「Webhook URL」を貼り付ける。

「Slack API」を使う方法と、「Incoming WebHooks」があるが、どっちがいいかはよくわからなかった。
[Slack APIを使用してメッセージを送信する]
(http://qiita.com/rubytomato@github/items/6558bfdb37d982891c09)

実行方法は

```
go run notifySlack.go -text "メッセージ” -icon_emoji ":dolphin:" -channel "#random"
```

または
```
go run notifySlack.go -filename "abc.txt” 
```
Scalaで素数判定　試し割り法


# 試し割り法
自然数nが$2 \leq k \leq \sqrt n$となる全ての自然数kで割り切れない場合は素数、一つでも割り切れるkが存在する場合素数でないとする判定方法です。

# Scalaのコード
## for式使用版
ループにより実装したコードです。

``` Scala
  def isPrime(n: Int): Boolean = {

    if (n < 2 || (n > 2 && n % 2 == 0)) {
      return false
    } else if (n == 2) {
      return true
    }

    for (i <- 3 to Math.sqrt(n).toInt by 2 ) {

      if (n % 3 == 0) {
        return false
      }
    }

    return true
  }
```

## 再帰呼び出し版
再帰呼び出しを使ってfor式を無くしたコードです。
scala.annotation.tailrecアノテーションを使って末尾再帰になっているかチェックしています。

``` scala

  def isPrime(n: Int): Boolean = {

    if (n < 2 || (n > 2 && n % 2 == 0)){
      return false
    } else if (n == 2) {
      return true
    }


    @annotation.tailrec
    def loop(n: Int, m: Int): Boolean = {

      if (m * m > n) {
        return true
      } else if (n % m == 0) {
        return false
      } else {
        loop(n, m + 2)
      }
    }

    loop(n, 3)
  }

```
Electron で作成されたリッチなマークダウンプレビュアー Shiba をソースからビルドした際の備忘録

[Electron と Polymer と TypeScript でリッチなマークダウンプレビュアー Shiba つくった](http://rhysd.hatenablog.com/entry/2015/08/03/090646) で作者が紹介している [Shiba](https://github.com/rhysd/Shiba) に個人的に欲しい機能を加えられないかと検討していて、そもそも自力でビルドできるかを確認したのでメモしておく。

## 記述時の環境

- [VineSeed](https://vinelinux.org/vineseed.html) ([Vine Linux](https://vinelinux.org/) 開発版) 64bit
- [nodebrew](https://github.com/hokaccha/nodebrew) use v6.3.0
- ruby 2.2.4p230 (2015-12-16 revision 53155)
 - ruby-rubygems-2.4.5
 - rubygem-rake-10.4.2

## グローバルにインストールが必要なもの

- node.js パッケージ
 - bower
 - typings
- Ruby Gem パッケージ
 - slim

electron 関連パッケージは、ローカルインストールでも可。(以下の手順で自動でインストールされる。)

## 前項パッケージのインストール

```
$ npm install -g bower
$ npm install -g typings
$ gem install slim
```

## Shiba のビルド(実行)

```
$ git clone https://github.com/rhysd/Shiba.git
$ cd Shiba
$ npm install
$ npm start
```
## パッケージ化

Linux 向け実行体を作成し、zip にする場合の例。

```
$ ./node_modules/.bin/electron-packager . Shiba --platform=linux --arch=x64
$ zip -r Shiba-linux-x64.zip Shiba-linux-x64
```
ElixirのEnum.reverse() の実態は :lists.reverse/1 なので速い

タイトルで言い切ってますが、Enum.reverse()の実態は :lists.reverse/1 です。

Erlang(結果として Elixir も)のリストは片方向リストのため、リストに値を追加する場合は、このような感じで先頭に追加して、最後に反転させるのがセオリーだそうです。

<b>UPDATE: 例を直しました</b>。

```erlang
> A = [1|[]].
> B = [2|B].
> C = [3|C].
> C.
[3,2,1]

> lists:reverse(C).
[1,2,3]
```

この lists:reverse/1 関数は BIF（組み込み関数）としてCで実装されているため、非常に速いようです（そのうちベンチしたい。。。）。

で、Elixir ではどうなっているのか調べてみたところ、そもそも Elixir の List モジュールには reverse に該当する関数がありません。

まさか `:lists.reverse([3,2,1])` のようにして Erlang の関数を直接呼ぶ必要があるのか？　と一瞬思いましたが、そんなことはありませんでした。理由は定かではありませんが、List ではなく Enum の中に `Enum.reverse` という関数がありました(arity は 1 と 2）。

Elixir 版もちゃんと BIF になってるのかと思い実装を見てみたところ、 lib/elixir/lib/enum.ex でこのように実装されていました。。。

```ex
 @spec reverse(t) :: list
    def reverse(enumerable) when is_list(enumerable) do
      :lists.reverse(enumerable)
    end
```

結局 `:lists.reverse/1` を直接呼んでいるだけなので、結果として BIF で実装されていると言えます。

というわけで、リストに要素を追加する時は Erlang と同様に、先頭に要素を追加していき、最後に `Enum.reverse/1` を呼べばいいということがわかりました。
「さくらのクラウド」でサーバにログインせずにDBサーバを構築する

さくらのクラウドで以下のような構成を作っていました。

![WS000157.png](https://qiita-image-store.s3.amazonaws.com/0/101811/111d09b8-f58c-ed5b-4146-75ff7357d369.png)

WebサーバにNIC2つ持たせてグローバルIPアドレスとプライベートIPアドレスの両方をつけます。
DBサーバはプライベートIPだけつけて、Webサーバ・DBサーバ間の通信はプライベートサブネット経由です。
VPCルータはDBサーバにパッケージ入れたりアップデートしたりする用です。
(AWSでいうところのNATインスタンスとして使っています)

WebサーバはグローバルIPアドレス持っているので直接SSHログインできるんですが
DBサーバへSSHログインするには
1. Webサーバを踏み台にしてSSHログイン
2. VPCルータとVPNを張る(サイト間VPNまたはリモートアクセス)
の2種類の方法がありますが、今回ハンズオン用の構成なので
1.だと参加者さん混乱するらしく
2.だとVPNの設定するだけで時間が足りなくなっちゃいます。

というわけで、DBサーバに一切ログインせずにインストールと設定をするスタートアップスクリプトを書きました。

```
#!/bin/sh
# @sacloud-once
# @sacloud-desc (このスクリプトは、CentOS6.8でのみ動作確認しています)
# @sacloud-password required shellarg maxlen=20 para1 "MySQLのrootユーザパスワード"
# @sacloud-password required shellarg maxlen=20 para2 "MySQLのwordpressユーザパスワード"
PARA1=@@@para1@@@
PARA2=@@@para2@@@
yum -y install mysql-server
service mysqld start
chkconfig mysqld on
echo "UPDATE mysql.user SET Password=PASSWORD('$PARA1') WHERE User='root'" | mysql -u root
echo "create database wordpress" | mysql -u root
echo "grant all privileges on wordpress.* to 'wordpress'@'10.0.0.11' identified by '$PARA2'" | mysql -u root
echo "FLUSH PRIVILEGES" | mysql -u root
```

やっていることは
1. 最初にrootパスワードとwordpressユーザパスワードを入力する(コンパネにフォームが出ます)
2. MySQLをインストールして起動させて自動起動を有効にする
3. rootパスワード設定
4. データベース「wordpress」を作成
5. wordpressユーザを作成
です。

実運用に使うならこれではいろいろ不足でしょうが、デモなので。
「違法では無いが不適切」な点などありましたら御指摘いただけると幸いです。
ruby-csharp_script のサンプルコードまとめ

サンプルを gist に置いたので、まとめました。

* [ruby-csharp_script sample #1](https://gist.github.com/masoo/1770f7b8006b436e8c151cc81a9adf93)
* [ruby-csharp_script sample #2](https://gist.github.com/masoo/682f4bf623797a95e6c12b909ac49c8a)
* [ruby-csharp_script sample #3](https://gist.github.com/masoo/89bb091ae3e0f0f98fbcbee9c8d546db)
* [ruby-csharp_script sample #4](https://gist.github.com/masoo/f9e38e256f074fdba7e7c56e3d62d0ec)
* [ruby-csharp_script sample #5](https://gist.github.com/masoo/5004692b0d9af7449858585b0920c2fc)
* [ruby-csharp_script sample #6](https://gist.github.com/masoo/b751c1f580febb2e6e556eefc4a7d33c)
* [ruby-csharp_script sample #7](https://gist.github.com/masoo/647856fd145f6de34408a77e25c18452)
* [ruby-csharp_script sample #8](https://gist.github.com/masoo/8af86667141c6d944154af79d4cee8f4)
ボッチ開発マンだった文系高専卒の新卒エンジニアが実案件で使ったコマンドたち

スマートデバイス・テクノロジーのOrganizationアカウントが作成されて、社内の意識の変化から1投稿/週を基本に！ということからいきなりネタにぶち当たったのでコマンドの話をしようと思います。

## Gitコマンド

まずは、手始めに並行開発では欠かせなくなってきているであろうGitコマンドたちから

### とりあえずリストアップ

- git add
   - git add /path/to/file
   - git add -p
   - git add .
- git commit
   - git commit -m
   - git commit --amend
- git push
   - git push -u origin branch-name
   - git push --delete origin branch-name
- git pull
- git clone
   - git clone https://example.com/git/repository.git
   - git clone -b develop https://example.com/git/repository.git
- git checkout
   - git checkout branch-name
   - git checkout /path/to/file
   - git checkout -b new-branch
- git branch
   - git branch
   - git branch -m
- git reset
   - git reset HEAD /path/to/file
   - git reset --hard
   - git reset
- git merge
   - git merge branch-name
- git fetch
   - git fetch --all
- git rm
   - git rm -rf /path/to/directory
   - git rm --cached /path/to/file
- git rebase
   - git rebase -i HEAD~hoge
- git revert
- git blame-someone-else
- git rev-parse --abbrev-ref HEAD
- git diff
- git init
- git stash
   - git stash pop
   - git stash clear
   - git stash drop
- git status

### 詳しい説明

見た感じなんだこれ？って言うGitコマンドがあるかと思います。
そういうものだけ説明します。

```bash
$ git add -p
```

部分的にstagingしてあげるためのコマンド。
これ使うぐらいなら `tig` コマンド使ったほうがいいよ？って言われたのが去年...

[tigでgitをもっと便利に！ addやcommitも](http://qiita.com/suino/items/b0dae7e00bd7165f79ea)

```bash
$ git commit --amend
```

結構有名ですが、初心者の方のために!

`amend` は修正するという意味があります。

間違えたコミット名を修正するときや、ちょっとした修正なのにコミット数増やすのは嫌だという時に使います。

```bash
$ git push --delete origin branch-name
```

リモートブランチを削除するコマンド。特にGUIを使いたくない私みたいな人におすすめです！！

```bash
$ git clone -b develop https://example.com/git/repository.git
```

リモート先にあるブランチ名を指定してcloneする

```bash
$ git rm --cached /path/to/file
```

Gitで管理しないように弾きます

```bash
$ git rebase -i HEAD~hoge
```

過去のコミットを編集したりなんだりできる強いコマンド

[【備忘録】過去のコミットメッセージを変更する](http://nnsnodnb.hatenablog.jp/entry/how-to-git-rebase)

以前に私のブログで書いたので見てもらえたら嬉しいです！！

```bash
$ git blame-someone-else
```

社内Gitを使っているのに `git log` を使うと見事に自分のGitHubアカウントがバレちゃった！！ｱﾊﾊﾊﾊﾊみたいなことがあるのでこの便利なコマンドでAuthorを変更します。

[jayphelps/git-blame-someone-else](https://github.com/jayphelps/git-blame-someone-else)

使い方は上記リポジトリを参照

```bash
$ git rev-parse --abbrev-ref HEAD
```

現在のブランチ名を表示します。

大体こんな感じで大丈夫でしょうか？？

## UNIXコマンド

あんまりないかもしれませんが、あとMac専用のコマンドもあるかもしれませんが、リストアップだけ

### リストアップ

- tree
- jq
- cd
- rm
- mv
- wget
- curl
- ssh
- python
- vim
- open
- ssh-add
- ssh-keygen
- ruby

まだあるかもしれないですがなんか思いつかない。

## 感想

実際、今までガチボッチ開発マンだった私ですが特に増えたコマンドはなかったです。
実業務でも実際にこれだけ使えれば+αのコマンドが使えれば全然余裕だと思います。

UNIXコマンドは基本的になんか私がGUI嫌いだからCUIでドヤリング決めてるだけです。
また、 `Python` は今している案件のテストデータ自動生成ツール(通称：錬成陣)するときに怪人なので3時間程度で4つ作りました。Python3系ばかり触ってきたのでPython2系はちょっと懐かしかったりなんだったり...
ruby 1.9.3 utf8 encoding

http://stackoverflow.com/questions/7699018/in-ruby-on-rails-are-encoding-utf-8-and-config-encoding-utf-8-differe

http://stackoverflow.com/questions/20521371/set-utf-8-as-default-for-ruby-1-9-3

ruby 1.9 使用 us_ascii 作为默认encoding
ruby 2.0 使用 utf-8作为默认encoding

ruby 1.9.3

```rb
a = "测试一下咯"

puts a
```

```bash
vagrant@precise64:~/data$ ruby 2.rb 
2.rb:1: invalid multibyte char (US-ASCII)
2.rb:1: invalid multibyte char (US-ASCII)
```

http://stackoverflow.com/questions/5359928/make-ruby-1-9-regard-all-source-files-to-be-utf-8-encoded-even-if-recompiling

```bash
vagrant@precise64:~/data$ env RUBYOPT='-Ku' ruby 2.rb 
测试一下咯
```

```bash
vagrant@precise64:~/data$ RUBYOPT='-Ku' ruby 2.rb 
测试一下咯
```

no space between =
iOS初心者が読んでおきたいテキスト5選

iOS初心者が読んでおきたいテキスト5選をご紹介します。

#プロの力を身につける iPhone/iPadアプリケーション開発の教科書 
これから始める方に読んで欲しいテキストです。
ライフサイクルやCoreDataについて詳しく書かれています。

![](https://images-fe.ssl-images-amazon.com/images/I/51b4eb0+T5L._AA320_FMwebp_QL65_.jpg)

#UIKit徹底解説 iOSユーザーインターフェイスの開発 
UIKitを少し深掘りしたい方向けのテキストです。
CollectionViewの理解が深まります。

![](https://images-fe.ssl-images-amazon.com/images/I/51VZf26YRLL._AC_US320_QL65_.jpg)

#上を目指すプログラマーのためのiPhoneアプリ開発テクニック iOS 7編 
iOS開発に慣れてきた方向けのテキストです。
![](https://images-fe.ssl-images-amazon.com/images/I/41Io4sXRclL._AC_US320_QL65_.jpg)

#iOS開発におけるパターンによるオートマティズム 
iOSの設計パターンを学びたい方向けのテキストです。
![](https://images-fe.ssl-images-amazon.com/images/I/5103tEtQ63L._AC_US320_QL65_.jpg)

#よくわかるAuto Layout
AutoLayoutを定型的に学びたい方向けのテキストです。
![](https://images-fe.ssl-images-amazon.com/images/I/51ErGEl5xgL._AC_US320_QL65_.jpg)

## 番外編

###リーダブルコード
言わずと知れた必読本です。
![](https://images-fe.ssl-images-amazon.com/images/I/51Jng8DGENL._AC_US320_QL65_.jpg)

### エンジニアのためのGitの教科書 実践で使える！バージョン管理とチーム開発手法
![](https://images-fe.ssl-images-amazon.com/images/I/51aLCBQwgsL._AC_US320_QL65_.jpg)

##その他
他にも良いテキストがあれば教えて下さい。
特にSwiftの良書に巡りあえていません。
Dockerコンテナ内で操作 attachとexecの違い


7/16 hidekuroサンからのコメントを受けて修正

# Dockerのコンテナで動作中のシェルへの接続方法

sshdをコンテナ内に立てることなしにシェルに接続する方法として以下の2つがある。

1. docker attach コンテナ名
2. docker exec -it コンテナ名 /bin/bash

じゃあ、この2つの違いってなによ?
ということで整理してみた。

## docker attach コンテナ名
~~こっちは単純にdockerコンテナ内で既に起動しているシェルの標準出力につなげるイメージ？？~~

コンテナで起動しているPID=1のプロセスの標準入出力(STDIN/STDOUT)に接続(attach)する。


## docker exec -it コンテナ名 /bin/bash

こっちはdockerコンテナで任意のコマンドを実行させる。
-itオプションについては意味合いは以下の通りらしい

|オプション名|内容|
|---|---|
|i|標準入力(STDIN)を開いたままにする|
|t|擬似ttyに接続する。ディスプレイ(STDOUT)をつなぐイメージ|

# (結果)ログイン方法の違いによる影響

attachとexecではexitコマンドを実行した場合の挙動が違うみたい。

- (補足) 以下の様な形でnodejs001コンテナを立ち上げている

```Bash:コンテナ起動コマンド
sudo docker run -d --name nodejs001 --hostname nodejs001 -p 80:80 -i -t node /bin/bash
```

まあ、普通。
ポート転送やらはたまたま立ち上げたコンテナがそうだっただけなので、気にしないでね。

## attachの場合

```Bash:attachの場合
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS                NAMES

55905169b4b0        node                "/bin/bash"         29 hours ago        Up 11 minutes             0.0.0.0:80->80/tcp   nodejs001
$ sudo docker attach nodejs001
root@nodejs001:/#
root@nodejs001:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:23 ?        00:00:00 /bin/bash
root        12     1  0 13:35 ?        00:00:00 ps -ef
root@nodejs001:/# exit
exit
 sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
55905169b4b0        node                "/bin/bash"         29 hours ago        Exited (0) 4 seconds ago                       nodejs001
```

見てわかる通り、attachの場合は既にコンテナ内で立ち上がっているPID=1の/bin/bashに対して標準入出力を接続(attach)する形になる。

exitするとコンテナそのものが停止する。
(プライマリプロセス(PID=1)が終了するから?)

## execの場合

```Bash:execの場合
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
55905169b4b0        node                "/bin/bash"         29 hours ago        Up 32 seconds       0.0.0.0:80->80/tcp   nodejs001
$ sudo docker exec -it nodejs001 /bin/bash
root@nodejs001:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:40 ?        00:00:00 /bin/bash
root         6     0  0 13:41 ?        00:00:00 /bin/bash
root        11     6  0 13:41 ?        00:00:00 ps -ef
root@nodejs001:/# exit
exit
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
55905169b4b0        node                "/bin/bash"         29 hours ago        Up About a minute   0.0.0.0:80->80/tcp   nodejs001
```

こちらは新しく/bin/bashプロセスが立ち上がっており、
そちらで標準入出力を行っている。
exitしてもexecした際に実行された/bin/bashプロセス
が終了するだけなので、コンテナは停止しない。

# (結論)execとattachどっちを使うべき

個人ならご自由に。

実際に外向けのサービスを使ってたり、
他の人と同一のコンテナを共同利用しているのであれば、
execの方が **不意にコンテナが止めてしまったりといったことが起きづらいため** ベターだと思う。

まあ、自分が作業するシェルのプロセスくらい
**拾いもんじゃなくて自分で確保せいや** と言う観点では、
execの方が行儀がよろしいかなと。
d3.jsでParticleをSVGのPath上で動かす

#version
d3.jsのversionは**4.1.0**です。

#Code
[今回使用した全コード](https://github.com/naoyashiga/dataViz-playground/blob/50f21cd57372854aa0245aba8fff4ece5fa8a9ca/sketch/tutorial/pathInterpolation/test/src/js/components/Visualization.js)

#demo
![スクリーンショット 2016-07-15 22.36.36.png](https://qiita-image-store.s3.amazonaws.com/0/26043/66f5c8be-7a5f-3dd5-564d-67ce24984f63.png "スクリーンショット 2016-07-15 22.36.36.png")

[demo: "d3jsはこういうこともできるっぽいw 使い道はわからない😇](https://twitter.com/naoyashiga/status/753941666373906434)



・参考
これをversion4の書き方にして、いろいろいじってみました。
[Point-Along-Path Interpolation - bl.ocks.org](http://bl.ocks.org/mbostock/1705868)

#ランダムの座標

##SVG全体の大きさを定義
```js
this.margin = {top: 10, right: 10, bottom: 0, left: 0};

this.width = window.innerWidth - this.margin.left - this.margin.right,
this.height = window.innerHeight - this.margin.top - this.margin.bottom;
```

##range
```js
const vertexLength = 4;
const posX = d3.range(vertexLength)
.map(d3.randomUniform(0, this.width));

const posY = d3.range(vertexLength)
.map(d3.randomUniform(this.height));
```
rangeを使って配列を作ります。

[d3-array/README.md at master · d3/d3-array](https://github.com/d3/d3-array/blob/master/README.md#range)

##zip
```js
d3.zip([1, 2], [3, 4]); // returns [[1, 3], [2, 4]]
```
二つの配列を上のように操作できます。

```js
const particles = d3.zip(posX, posY);
```

[d3-array/README.md at master · d3/d3-array](https://github.com/d3/d3-array/blob/master/README.md#zip)


#Pathを描画
##curveCardinalClosed
```js
this.path = this.svg.append("path")
.data([particles])
.attr("class", "myPath")
.attr("d", d3.line().curve(d3.curveCardinalClosed.tension(0.5)));
```
curveCardinalClosedを使って閉じた曲線を描きます。

[d3/d3-shape: Graphical primitives for visualization, such as lines and areas.](https://github.com/d3/d3-shape#curveCardinalClosed)

#Particleを描画
```js
this.circle = this.svg.selectAll(".point")
.data(d3.range(particleLength))
.enter().append("circle")
.attr("r", 3)
.attr("class", "particle")
.attr("transform", (d, i) => {
  return "translate(" + particles[0][0] + ")";
});
```
始めの位置はすべて同じにしたかったので、particles[0][0]にしてます。

#Transition

##attrTween

```js
transition() {
    this.circle.transition()
    .duration(10000)
    .delay(function(d, i) { return i * 50; })
    .attrTween("transform", this.translateAlong(this.path.node()))
    .on("end", () => {
      this.transition();
    });

}
```

- delay
	- delayすることで微妙に開始時間を遅らせて、particleそれぞれが順々に動くようにしている
- attrTween
	- interpolaterというのを使って値の補完をしてる

[d3-transition/README.md at master · d3/d3-transition](https://github.com/d3/d3-transition/blob/master/README.md#transition_attrTween)


```js

translateAlong(path) {
    var l = path.getTotalLength();
    return function(d, i, a) {
      return function(t) {
        var p = path.getPointAtLength(t * l);
        return "translate(" + p.x + "," + p.y + ")";
      };
    };
}
```
- i
	- index
- a
	- ここではcircle
- t
	- 0~1までの値
	- 割合がわかる


[SVGPathElement - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/SVGPathElement)
fireBaseでDBを作成してiOSから保存、読み込みを行う方法


setupに関してはfirebaseの説明通りに進めばok
日本語＋画像付きなのですごくわかりやすいです。
<img width="714" alt="スクリーンショット 2016-07-14 23.18.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/64331/648c1c15-03a6-0843-60d4-46be216ac429.png">


セットアップが完了したら、DBようの設定を追加します。

まず、podfileに以下を追加、pod updateを行う

```
pod 'Firebase/Database'
```

```
var databaseRef:FIRDatabaseReference = FIRDatabaseReference()//DB
```

```
//DB
databaseRef = FIRDatabase.database().reference()
```

読み込む

```
func readFbData() {
        databaseRef.observeEventType(.ChildAdded, withBlock: { snapshot in
            let id = snapshot.value!.objectForKey("id") as? String
            }
        })
    }
```

保存

```
func saveFbData() {
     let pokeData = ["id": "001", "no": "1"]
    databaseRef.childByAutoId().setValue(pokeData)

}
```
コンソールでキー入力を一文字づつ読み込む

例えば簡単なCLIのゲームや[peco](https://github.com/peco/peco)のようなキーボード入力が一回あるたびに何か動作させるものを作りたい場合は、OSの機能に働きかけ、端末の動作を変えることで実現できます。

Rubyでの場合を紹介しますが、
基本的にどのプログラミング言語でもこの端末の機能に触ることができれば実現できるはずです。

# ルーク、io/consoleをつかえ

Rubyでは、標準添付ライブラリー`io/console`で使えるようになる[IO#raw](http://docs.ruby-lang.org/en/2.3.0/IO.html#method-i-raw)を使用します。
主要なOSに対応しているのでwindowsでもlinuxでもmacで同じように使えるでしょう。

「ふつうに`IO#getc`でいいじゃん」と思う方は`irb`などで`STDIN.getc`を実行してみましょう。

```
$ irb
irb(main):001:0> STDIN.getc
asdf...
```

エンターキーを入力するまで文字の読み込みが始まらないことが分かります。

では`require 'io/console'`してから`STDIN.raw(&:getc)`を実行してみましょう。

```
$ irb
irb(main):001:0> require 'io/console'
=> true
irb(main):002:0> STDIN.raw(&:getc)
=> "a"
```

一文字入力した途端にirbに戻ってきます。

# しくみ

端末には一般的に**rawモード**と**cookedモード**があるようです。(他にもnoechoモードなどもあるが省略)

私たちが普段使っているようなものはcookedモードで、

- CTRL+Cなどのようにシグナルを送れる
- 一行分バッファリングするので途中でカーソル移動したり消したりできる
- 端末に入力した文字が表示される

という特徴があります。

逆にrawモードは

- シグナルを送れない
- バッファリングしない
- 端末に入力した文字を表示しない

という特徴があります。

Rubyでもこのモード切り替えが簡単に操作できるようになっていて、

- `IO#raw`: ブロックの間だけrawモードにする
- `IO#cooked`: ブロックの間だけcookedモードにする

と使い分けることができます。

以降ずっとrawモードにするIO#raw!などもあるのですが、rawモードのままプログラムを終了すると、
コンソールの表示が変な感じになったりします。
ブロック付きで使うと、たとえエラーが起ころうとブロックを抜けるときに自動的に元の状態に戻してくれるのでおすすめです。

以下は入力したキーボードのバイト値を、
キーボードを打つ毎に端末の左上に表示するサンプルです。

```rb
#! /usr/bin/env ruby

require 'io/console'

$stdin.raw do |io|
  while true
    ch = io.readbyte
    exit 0 if ch == 3 # CTRL+Cで終了
    print "\e[H" # カーソルをコンソールの左上に移動する
    print "\e[0K" # 前の文字が残らないようにする
    print ch
  end
end
```

このようにエスケープシーケンスなどと組み合わせれば、タイピングゲームやオレオレエディタなんかも作れて夢が広がります。

# Cでの実装

基本的に`#include <termios.h>`でつかえるAPIを利用します。

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html

実践的な実装は https://github.com/ksss/mruby-io-console/blob/master/src/io-console.c あたりをご参考ください。
macでしか動作確認してない & win対応してないですが……。
Jenkins と ccache を組合せて使用する時の設定方法

# Jenkins とは

CI ツールですね。
https://ja.wikipedia.org/wiki/Jenkins

# ccache とは

compiler cache の略で、ビルド時間短縮のツールですね。
https://ja.wikipedia.org/wiki/Ccache

# 組み合わせると

per commit build がサクサク回せるようになりそうですね。
というわけでやってみます。

# 結論

Jenkins と ccache を組合せて使用する時の設定方法は以下の点に気をつけましょう。

* ccache の設定は Jenkins のシェルスクリプト内でやる
* ccache directory は jenkins のディレクトリ内を指定

言い変えると、

* jenkins のシェルスクリプト外でいくら設定してもその設定は使われない
* ~/.bashrc に ccache の設定を書いてても jenkins は読みに行かないし、
* jenkins のシェルスクリプト内で source ~/.bashrc や source /home/user/.bashrc しても有効化されない
* jenkins ディレクトリ外 /home/user/.ccache あたりを設定しても有効化されない

# 詳細

具体的にやってみます。
ビルドしたいものを `buildScript.sh` 、
`${home}` を `/home/user/` 、
とします。

環境は Ubuntu14.04 です。

# ダメな例その1

console でいくら ccache の設定をしても jenkins には反映されません。

```:console
export CCACHE_DIR=hogehoge
export USE_CCACHE=1
```

もしくは

```
cat ~/.bashrc
略
export CCACHE_DIR=hogehoge
export USE_CCACHE=1

source ~/.bashrc
source /home/user/.bashrc
```

```:jenkins 
./buildScript.sh
```

# ダメな例その2

CCACHE_DIR に jenkins ディレクトリ外 /home/user/.ccache あたりを設定しても有効化されません。

```:jenkins 
export CCACHE_DIR=/home/user/.ccache
export USE_CCACHE=1

./buildScript.sh
```

## 動作する例

```:jenkins
export CCACHE_DIR=/var/lib/jenkins/.ccache
export USE_CCACHE=1

./buildScript.sh
```

### 補足

`/var/lib/jenkins/` は Jenkins のデフォルト初期ディレクトリのようです。
`CCACHE_DIR` 未設定のとき `ccache -s` で ccache の設定を確認すると、
`cache directory                     /var/lib/jenkins/.ccache`
と表示されます。
＃ 詳しくないので詳しい方指摘お願いしますｍｍ

# 高速化結果

私の手元のとある OSS のビルドでは以下の結果となりました。
Jenkins のみ(都度全ビルド)： 2時間半
Jenkins + ccache ： 6分半
「サポートされるオブジェクト セットは 1 つの型につき 1 つだけです。」と言われたら、

# 「サポートされるオブジェクト セットは 1 つの型につき 1 つだけです。」と言われたら、

メッセージの全文はこれ

> サポートされるオブジェクト セットは 1 つの型につき 1 つだけです。オブジェクト セット 'Resources' と 'XXXResources' の両方に型 'MyApp.Models.Resource' のインスタンスが含まれる可能性があります。


引き起こす原因はいくつかあるようだが、私の場合は `DbContext` のエントリだった。

```csharp
public virtual IDbSet<Resource> Resources { get; set; }
    :
public virtual IDbSet<Resource> XXXResources { get; set; }
```

もちろん、こうすべきだ。

```csharp
public virtual IDbSet<Resource> Resources { get; set; }
    :
public virtual IDbSet<XXXResource> XXXResources { get; set; }
```

30分もかけて、ボケた頭でソース触るなという、鉄板な教訓が得られたという話。
今日はもう終わり。


### 確認した環境

- ASP.NET MVC 5
- Visual Studio 2015 Community
- Windows 10