OmniAICreator/Qiita-1.07M huggingface dataset:
間違ってpushした内容を取り消す


1. 対象のブランチをチェックアウトする

```
¥ git checkout develop
```

2. 間違ってpushしてしまったコミットIDをメモする

```
¥ git log
commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # これね
Author: hogehoge <hogehoge@gmail.com>
Date:   Fri Nov 11 18:08:18 2016 +0900

    途中コミット
```

3. リバートする

```
¥ git revert XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # コミットID指定する
コミットした時に出るコメント画面?が出るので、コメント書いて保存する
```

普段、基本的にはSourceTree使っているのだけど、リバートがどうやってやるのか分からなかった。

4. pushする

```
¥ git push origin develop
```
mysqlの初期化方法

#mysqlの初期化方法

**もうダメだ！全部最初に戻したい！そうゆう時のためのメモ**

##1.datadirの下を全部消す！
クエリ
`> show variables like 'datadir';`
か
my.cnf
`[mysqld]
datadir		= /var/lib/mysql`
で調べて、消す！

`sudo rm -r /var/lib/mysql/*`

##2.mysqlユーザーになる
`sudo su - mysql`

##3.DB初期化
`mysql_install_db --datadir=/opt/vcs/mysql --user=mysql`

>この時、 --user=mysqlを忘れると起動しないので注意
[ERROR] Fatal error: Can't open and lock privilege tables: Table './mysql/user' is marked as crashed and last (automatic?) repair failed
vagrantの共有フォルダ synced_folder について

#vagrantの共有フォルダ synced_folder について

vagrantでは、デフォルトでカレントディレクトリが共有される
https://www.vagrantup.com/docs/synced-folders/
>By default, Vagrant will share your project directory (the directory with the Vagrantfile) to /vagrant.
>>デフォルトで、Vagrantはあなたのプロジェクトディレクトリ（Vagrantfileのディレクトリ）を/vagrantに共有します。

つまり、以下のディレクトリ構成で実行すると「/project」が「/vagrant」として共有されてしまうのです。
>ホストの
>/project/Vagrantfile
>　　　　/mysql
>　　　　/web_app1
>　　　　/web_app2

が

>ゲストの
>/vagrant/Vagrantfile
>　　　　/mysql
>　　　　/web_app1
>　　　　/web_app2

って見えちゃう

##デフォルトの共有を止めるには、config.vm.synced_folderで、disabled: trueすると良い
```Vagrantfile.sample
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "hoge/package"
  config.vm.box_url = "https://s3-ap-northeast-1.amazonaws.com/hoge-private-repo/hoge/private_image.json"

  #config.vmに書くと、ゲスト全部に適用されます。
  config.vm.synced_folder '.', '/vagrant', disabled: true # デフォルトの共有を行わない

end
```

##共有したいディレクトリは、個別に設定を追加する
```Vagrantfile.sample
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "hoge/package"
  config.vm.box_url = "https://s3-ap-northeast-1.amazonaws.com/hoge-private-repo/hoge/private_image.json"

  #config.vmに書くと、ゲスト全部に適用されます。
  config.vm.synced_folder '.', '/vagrant', disabled: true # デフォルトの共有を行わない

  # DBサーバー
  config.vm.define "dbserver" do |atomic|
    atomic.vm.hostname = "dbserver.local"
    atomic.vm.synced_folder "./mysql", "/var/lib/mysql", owner: "mysql", group: "mysql"
  end
  
  # APサーバー
  config.vm.define "apserver" do |atomic|
    atomic.vm.hostname = "apserver.local"

    #複数のディレクトリを共有したいときは、別々に書く
    atomic.vm.synced_folder "./web_app1", "/var/www/html/web_app1", owner: "apache", group: "apache"
    atomic.vm.synced_folder "./web_app2", "/var/www/html/web_app2", owner: "apache", group: "apache"
  end
end
```

#最後に
一度、共有されるとトップディレクトリ「/vagrant」は残っていましたので、消す必要がありました。


config.vm.synced_folderの所は、vagrant reloadしてあげないと、Vagrantfileへの変更が適用されない

atomic.vm.synced_folderの所は、vagrant　provisionでも適用される
HomebrewによるTypesafe Activatorのinstall

[Homebrew](http://brew.sh/index_ja.html)を使用し[Typesafe Activator](http://www.lightbend.com/community/core-tools/activator-and-sbt)をinstallしてみます。

環境は`macOS Sierra バージョン10.12.1`になります。

## Typesafe Activatorのinstall
Typesafe Activatorをinstallします。

```
$ brew install typesafe-activator
```

## エラーがでた場合
下記のエラーが出た場合にはAppleStoreなどでソフトウェアのアップデートを行います。

```
A newer Command Line Tools release is available
Update them from Software Update in the App Store.
```

こちらのエラーが出た場合にはHomebrewなどからJava 1.8をinstallしてください。

```
typesafe-activator: Java 1.8+ is required to install this formula.JavaRequirement unsatisfied!

You can install with Homebrew-Cask:
  brew cask install java
 
You can download from:
  http://www.oracle.com/technetwork/java/javase/downloads/index.html
Error: An unsatisfied requirement failed this build.
```

エラー解消後にもう一度

```
$ brew install typesafe-activator
```

を行う事でinstallが完了します。
その後は`$ activator new`でアプリケーションの作成 `$ activator run`で起動が行えます。
Raspberry PI3とWindows10 IoT Coreのインストール

# はじめに

2016年09月01日のメモです。下書きのままになっていたので、いまさらながら公開します。

## 環境

- PC/OS : Windows10 
- Raspberry PI 3 (以下、RasPIと略します)
- microSDカード (16GB)
- microSDカードリーダー

# Raspberry PI 3へのインストール

## PC / Windows10 IoT Coreのツールをダウンロード

Windows10 IoT Coreのツール、Windows 10 IoT Core Dashboard ( https://developer.microsoft.com/en-us/windows/iot/downloads )からダウンロード。要：マイクロソフトアカウント。

## PC / Windows 10 IoT Core DashboardでWindows10 IoT Coreをダウンロード＆インストール

![image](https://qiita-image-store.s3.amazonaws.com/0/38845/69f842dd-c22c-db75-4fd5-21960556a5eb.png)

microSDカードへインストールが終わったら、RasPIへ刺す。

## RasPI / 初期設定

- RasPIで言語設定・WiFiのネットワーク設定。
- Ethernet接続してる場合、DHCP。固定アドレスの設定はできない？


## PC / IPアドレスの確認

![image](https://qiita-image-store.s3.amazonaws.com/0/38845/c74eec7a-c908-ab43-abe8-ee6004009779.png)

ちゃんとインストールできている場合「自分のデバイス」に、いまインストールしたRasPIが表示されているはず。そのRasPIのデバイスを選択して、右クリックで「IPアドレスをコピー」可能。

## PC / ブラウザで開く

ブラウザのURL欄に「http://(RasPIのIPアドレス):8080」を入力。IDとパスワードを聞かれるので、下記を入力

- ID : (デバイス名)\Administrator
- Password : P@ssw0rd 

Windows10 IoT Coreを初期値でインストールしているときIDは、`minwinpc/Administrator`。Windows10 IoT Coreをインストールしたときに入力したパスワードは使わない。パスワードは 最初の文字だけ大文字でP,アットマーク,s,s,w,ゼロ,r,d。ちょっとややこしい。

ブラウザで開いたあとは、RasPIのコンソール以上の各種設定できる。ブラウザ上で設定しておいたほうが良いと思われる項目を下記に列挙。

- タイムゾーン： Home ... Time Zone
- Windows Update : Windows Update ... Check Update   
"Your device is scheduled to restart at xx/xx/xxxx h:i:s"と書いてある場合は、その時間に再起動される。または手動で再起動。
(Windows Updateが終わるまで20分くらいかかりました)
-
【UIKit】デバイス向きとインターフェース向き

# デバイスのローテーションを検知して、アプリの見た目を最適化したい時に調べたこと。

##UIDeviceOrientation
UIDviceクラスで定義されている。どうやらデバイス自体の向き。
つまり3次元で取得できる。

```
public enum UIDeviceOrientation : Int { 
    case unknown
    case portrait // Device oriented vertically, home button on the bottom
    case portraitUpsideDown // Device oriented vertically, home button on the top
    case landscapeLeft // Device oriented horizontally, home button on the right
    case landscapeRight // Device oriented horizontally, home button on the left
    case faceUp // Device oriented flat, face up
    case faceDown // Device oriented flat, face down
}

extension UIDeviceOrientation {
    public var isLandscape: Bool { get }
    public var isPortrait: Bool { get }
    public var isFlat: Bool { get }
    public var isValidInterfaceOrientation: Bool { get }
}
```


##UIInterfaceOrientation
UIAppllicationクラスで定義されている。画面の縦表示か横表示。
分かりやすくいうと2次元の判断。

```
public enum UIInterfaceOrientation : Int {
    case unknown
    case portrait
    case portraitUpsideDown
    case landscapeLeft
    case landscapeRight
}

extension UIInterfaceOrientation {
    public var isLandscape: Bool { get }
    public var isPortrait: Bool { get }
}
```
input要素のplaceholderを画像にしたい・textareaにもplaceholderを当てたい



例えばこんなのに

```index.html
<div class="input__wrapper">
    <textarea class="input"></textarea>
    <div class="input__placeholder">名前</div>
</div>

<div class="input__wrapper">
    <input type="text" class="input" />
    <div class="input__placeholder">名前</div>
</div>
```

placholderは別な要素として置いておきつつ、wrapperでinput,textareaを囲います。

```style.css
.message__input__wrapper {
    position: relative;
    width: 100px;
    width: 50px;
    cursor: pointer;
}
.message__input {
    display: block;
    width: 100%;
    height: 100%;
    /*inputのスタイルをリセットする記述は省略*/
}
.message__input__placeholder {
    pointer-events: none;
    position: absolute;
    /*出したい画像と場所を設定*/
}
```

JSはjQueryが必要ですがこんな感じに書けばplaceholderと同じような挙動が出来ます。

```script.js
$(".input").on("focus", () => {
    $(".input__placeholder").hide();
}).on("blur", () => {
    if (0 < $(".input").val().length) {
        $(".input__placeholder").hide();
    } else {
        $(".input__placeholder").show();
    }
});

//pointer-events非対応端末のために
$(".input__placeholder").on("click", () => {
    $(".input__placeholder").hide();
    $(".input").focus()
});
```

以上です。
IE11にのみ適用するスタイルシート


いまどきIEだけ崩れてるなんてないだろ〜

...

＿人人人人人人人人人人人人人人人人人人＿
＞　 __IEはGoogle Fonts 非対応__　 ＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣

## CSS hack を使用する

弊社はほとんどの案件でブラウザ対応は最新版というありがたい環境だが、
それでもIEは崩れたりすることがある。

__一番致命的なのがGoogle Fontsによる Webフォントが使用できないことだ。__

条件付きコメントはIE9までしか対応できないため、
最新ブラウザなのにcss hackという古い手法に頼るというよく分からない状態になる。


```css:IE11のみ
@media all and (-ms-high-contrast:none){
  *::-ms-backdrop, .hoge {
    // スタイル
  }
}
```

```css:IE10以降
@media all and (-ms-high-contrast:none){
  .foo { color: green } /* IE10 */
}
```


## IEではWebフォントを諦める

一思いにバッサリ1つのフォントを指定してやる。

```css:ie.css
@media all and (-ms-high-contrast:none){
  * {
    font-family: "Yu Gothic", YuGothic, "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", "メイリオ", Meiryo, sans-serif !important;
  } 
}

```


IE用にWindowsに標準的に入っているフォントを使用して体裁を整えてあげることはできるのだが、
そこまで時間をかけるのはコストに見合わないと判断。
Githubとかのソースを動的に読み込むためにUTF-8なplain textをfetchしてsyntaxhighlighterに力技でぶち込む

# はじめに

普段はC++を書いています。

ブログとかでコードをハイライトしたいとき、最近では``highlight.js``とか``google code prettify``とか色々ありますが、私は未だに``SyntaxHighlighter version 3.0.83``を使っています。

というのはC++を書く上で「自分で型定義をどっさり追加できる」OR「C++を構文解析できる」が必須要件だからです。

後者はハードルが高すぎるので前者を満たす``SyntaxHighlighter``大好きです。

# Githubとかから動的にソースコードを読み込むには=>gist-it

さて、今日なにかソースコードを書いたら[Github](https://github.com/)とか[Gist](https://gist.github.com/)とか[pastebin](http://pastebin.com/)で公開するわけです。だれもブログにいちいちコピペなんてしません。

つまり動的にソースコードを読み込んでハイライトする必要があります。

例えばGithubのソースコードを読み込むには[gist-it](http://gist-it.appspot.com/)がありました。
Gistとpastebinは特に何もしないでもそのまま読み込めますね。

# それでも私はSyntaxHighlighterが使いたい

pastebinが何でハイライトしているか忘れましたが、Gistやgist-itは``google code prettify``を使っています。

でもそうやってあちこちから読み込んでいるとデザインがバラバラになってしまいますね！

# UTF-8なplain textをfetchしてsyntaxhighlighterに力技でぶち込むクラスを作る

というわけで作ります。

要件

- [fetch](http://qiita.com/tomoyukilabs/items/9b464c53450acc0b9574)してソースコードを非同期に取ってくる
- あかん文字はエスケープする
- HTML中に``innerHTML``を使ってぶち込む
- 全部ぶち込み終わったら``SyntaxHighlighter.all();``する(頻繁にDOMの大規模更新すると重い)

この仕様ならUTF-8なplain textが手に入れば問答無用でぶち込めるし、少しいじれば他のハイライターでも使えそう。

# 作った

https://gist.github.com/yumetodo/15c507cabf753d6d36842fe7c87edc6b

``class``初めて書いた、``fetch``初めて書いた、``Arrow function ``初めて書いた、``getter/setter``初めて書いた出遅れ勢のコードです。大目に見てください。

``this``を前もって束縛しなくていいの便利ですね。

# 使い方

いつも通り``syntaxhighlighter``のJSとCSSを読み込んだあと、

```html
<script type="text/javascript" src="https://cdn.rawgit.com/yumetodo/15c507cabf753d6d36842fe7c87edc6b/raw/2cf4c48dec052b86c0558cce5209391c4e9297aa/syntaxhighlighter_from_web.js"></script>
<div id="romaji2kana_h"></div>
<div id="Source_c"></div>
<script>
	(function(){
		let syntaxhighlight_manager = new syntaxhighlighter_from_web();
		syntaxhighlight_manager.load(
			"https://raw.githubusercontent.com/yumetodo/romaji2kana/master/romaji2kana/romaji2kana.h",
			"romaji2kana_h", "cpp", "romaji2kana.h"
		);
		syntaxhighlight_manager.load(
			"https://raw.githubusercontent.com/yumetodo/romaji2kana/master/romaji2kana/Source.c",
			"Source_c", "cpp", "Source.c"
		);
		syntaxhighlight_manager.highlight();
	}());
</script>
```

こんな風に書く。

# 動作例

[フリーソフトの旅（windows）Re:ある「プロ」の書いた、初心者向けc言語入門プログラム](http://freesofutotravel.blog94.fc2.com/blog-entry-36.html)

# 書き終わって気がついたこと

``class``ってIE11では動かないんですね。普段FirefoxとChrome使ってたから気が付かなかった。Edgeでは動いた。

# 将来

[Feature Request -- option to import file contents to be highlighted. · Issue #306 · syntaxhighlighter/syntaxhighlighter](https://github.com/syntaxhighlighter/syntaxhighlighter/issues/306)

```html
<pre class="brush: lisp" data-sh-content-uri="/home/lawlist/archives/init.el">
this will be replaced and highlighted here when content is loaded..
</pre>
```

こんな感じにかけるようにする提案が出ている。
どのデバイスでApp preview(動画)を用意すべきか？

##ワタシ、失敗しました…
iOSアプリを作成したあと、少しでも試用してもらうためにという願いを込めてiTunesConnectに動画を載せたりするわけですが、なかなか骨が折れます。

各種デバイス用の動画を作成してくれるツールというのもあるようですが、日曜プログラマの場合などなど　１つの動画で済ませたいというニーズはあるかと思います。

私も　一つの動画で済ませているタイプの人です。

ある日の通勤途中、Ready for saleになったよ！　とメールが来たので、見に行くと、「アレ？動画がない！」となりました。　　泣きながら条件を調査しましたので、シェアさせていただきます。

###成功パターン：iPhoneで、1920 x 1080の動画を作って登録
iPhone(5.5, 4.7インチ), および iPadで動画が見れる。

###失敗パターン：iPadで、900x1200の動画を作って登録
iPhone(5.5, 4.7インチ)で動画みれず。　iPadでのみ動画が見れる。

##結論（2016/11/11時点）
今度から、5.5インチiPhoneで 動画を作ります…　


っと、ここまで書いておいて なんですが、サンプルが各１個だけと心もとないので、ご参考ということで。　皆様の事例がございましたら、ぜひコメントに記載をお願いします。
CentOS7にJava8のビルドサーバ（Ant）構築手順

#はじめに
仕事の現場で「ビルドサーバどうしますか？」と聞くと
「ビルドサーバ構築しといて」と言われることよくありますよね。
（言い出しっぺがやらされる法則）
そういう人のために構築手順まとめました。

#Javaのインストール
Javaのインストールは簡単ですね。
`sudo yum install java`

javaコマンドバージョン確認
`java -version`

```
openjdk version "1.8.0_111"
```
OKですね

javacコマンドバージョン確認
`javac -version`

```
-bash: javac: command not found
```
OKですね・・・ってああ！javacがない！

簡単とか言ってすみません。
javaとjavacを含めてインストールしたい場合は以下のコマンドを実行
`sudo yum install java-1.8.0-openjdk-devel`

再度確認
`javac -version`

```
javac 1.8.0_111
```
OKですね

#Antのインストール
yumのAntは古いので最新版を取得します。
`curl -O  http://www.apache.org/dist/ant/binaries/apache-ant-1.9.7-bin.tar.gz`

解凍して配備
`tar zxvf apache-ant-1.9.7-bin.tar.gz`
`sudo mv apache-ant-1.9.7 /usr/share/ant`
`sudo ln -s /usr/share/ant/bin/ant /usr/bin/ant`

バージョン確認
`ant -version`

```
Apache Ant(TM) version 1.9.7 compiled on April 9 2016
```
OKですね

#SVNクライアントのインストール
インストールコマンド (SVNサーバとクライアント両方インストールされます)
`sudo yum install subversion`

最新版をインストールしたい方は以下を参照
[CentOS7にSubversion1.9をインストール（SSHで使用）](http://qiita.com/nyao/items/3398c126c094d4341c15)

以上で、SVNからソースを取得してAntでビルドできるようになりました。

#さいごに
言い出しっぺにやらせるとだれも言い出さなくなると思います。
そこで、今後は言い出しっぺ以外にやらせるというルールにしたらどうでしょう？
とりあえず、今後は「ビルドサーバどうしますか？」と言い出さないようにしようと思います。
docker-compose depends_onとlinksの違い

#depends_onとlinksの違い 
docker-compose.ymlを書いて、railsを使用したwebアプリケーションコンテナをmongoDBコンテナと接続しようとしたら、`depends_on`と`links`の２通りの書き方があることが判明。何が違うのか、調べてみました。
##version 1での違い
####depends_on
`depends_on`はコンテナの作成順序と依存関係を決めるものだそうで。
####links
`links`は`depends_on`の機能に加えて、［エイリアス名］（または［サービス名］）を使用してコンテナにアクセスすることができます。例として、以下railsとmongoの２つを使用したdocker-composeファイルを用意しました。	

```docker-compose.yml
  db:
    image: mongo
    ports:
      - "27017:27017"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
    links:
      - db
      - db:database
```
linksを使えば、webコンテナから`db:27017`または`database:27017`を使用してmongoコンテナにアクセスすることができます。dockerコンテナはIPアドレスを固定するのが面倒なのでエイリアスで接続できるのは便利ですね。ちなみにdbが［サービス名］で、databaseが名付けた［エイリアス名］です。

##version2での違い
docker-compose.ymlで`version:'2'`を指定すれば、以上の違いはなくなるそうです。version 1の場合は他のコンテナから［サービス名］を使って接続することができませんでしたが、version2ではcomposeファイルに書かれた全てのサービス間に自動的にリンクを張る仕様になったため、`links`とわざわざ書く必要がなくなったそうです。`depends_on`で繋げたとしても、［サービス名］や［エイリアス名］で接続できます。

####サービスの完成する順番が前後する問題

docker-composeではサービスが依存関係に従って、うまい具合に順番に立ち上がってくれるのが便利ですよね。しかし、たまにリンク先が後に立ち上がってリンクがうまく繋がらないことがあります。なぜでしょうか。

以下のredisとpostgresを使ったwebアプリケーションのdocker-compose.ymlの例を見てます。

```docker-compose.yml
version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
```

ここではwebの指定下に`depends_on`があり、コンテナを立ち上げる順番を決めています。この場合、`docker-compose up`をすることで~~①web,②「dbとredis」~~①「dbとredis」②「web」の順番でコンテナが起動し、接続されます。

しかし、<b>コンテナが起動する順番は指定すれど、出来上がるまでは待ってくれない</b>のが`depends_on`の特徴のようで、例えば接続したいデータベースが準備できていないのに先にwebアプリが立ち上がるという問題も可能性としては考えられます。

コンテナの立ち上げる順番に関する問題のトラブルシューティングに関しては[この公式ドキュメント](https://docs.docker.com/compose/startup-order/)によくまとまってます。
 

[参照元：stackoverflow.com](http://stackoverflow.com/questions/35832095/difference-between-links-and-depends-on-in-docker-compose-yml)

[参照元：Docker-compose.yml: from V1 to V2](https://medium.com/@giorgioto/docker-compose-yml-from-v1-to-v2-3c0f8bb7a48e#.ba4q6br9u)
spring-boot-devtools をパッケージに含まれないようにする

# 概要

`spring-boot-devtools` をそのまま利用すると、実行可能なjarにパッケージングした時に、`spring-boot-devtools.jar` が含まれてしまう。
含まれないようにする対応。

## `spring-boot-devtools` の設定

多分こんな感じで設定してあると思われる。

```xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>
```

## パッケージに含まれないようにする

`Spring Boot Maven Plugin`でdevtoolsを除外するようにする。
具体的には `excludeDevtools` を `true` にする。

```xml
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<!-- excludeDevtoolsをtrueにする -->
				<excludeDevtools>true</excludeDevtools>
			</configuration>
		</plugin>
	</plugins>
</build>
```

## 確認する

`mvn package` してできあがったjarを`jar -xf target/hoge.jar`などで解凍。
`BOOT-INF/lib`配下に、`spring-boot-devtools.jar`　がいないことを確認する。

## 参考

http://docs.spring.io/spring-boot/docs/current/maven-plugin/repackage-mojo.html#excludeDevtools
http://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/repackage-classifier.html
http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html
JavaScriptのエスケープと改行変換

備忘録
JavaScriptで表示する際に良く使う物。（足りてるかどうかは不明）
正規表現は毎回正解が分からないので、標準で安全な関数を用意して頂ければ良いのだが。

###エスケープ
```js
var escape = function(str){
    return 
        str.replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;');
}
```

###改行処理
```js
var nl2br = function(str) {
    return str.replace(/\r\n/g, "<br />").replace(/(\n|\r)/g, "<br />");
}
```
tr を ruby で ( シリーズ: Ruby ワンライナ ちょっとづつ 0 )

`sed` や `tr` を捨てたいのでちょっとづつ Ruby ワンライナを学ぶ．

# 参考

- http://maeharin.hatenablog.com/entry/20130113/ruby_oneliner
- http://takuya-1st.hatenablog.jp/entry/2013/08/19/194819
- http://qiita.com/bash0C7/items/749e60ff770b2e465b5e
- http://d.hatena.ne.jp/zariganitosh/20131107/ruby_oneliner_omission

# これまで

```
cat foo.txt | tr 'a' 'b'
```

# これから

```
cat foo.txt | ruby -pe '$_.gsub!("a", "b")'
```

# 所見・所感

これだけだと `tr` の方がタイプ数が少なくて楽そうに見える．しかし，これより複雑なことをしようと思うと `sed` に頼ることになる． `tr` と `sed` をそれぞれ習得するよりは Ruby でいろいろできた方が楽そうだ．
ASP.NET CoreアプリでStyleCopを使う

# やること

ASP.NET Core Web ApplicationでStyleCop.Analyzersを有効にして、コードスタイルの静的チェックを行います。

# 環境

* Visual Strudio 2015
* .NET Core Tooling Preview 2 for Visual Studio 2015

# 前提

ASP.NET Core Web Applicationが作成されている状態とします。

# 手順

## project.jsonの編集

project.jsonの"dependencies"に"StyleCop.Analyzers"のエントリを追加します。
また、rulesetを指定するため、"buildOptions"に"additionalArguments"のエントリを追加します。

```js:package.json
{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
...
    "StyleCop.Analyzers": {
      "version": "1.0.0",
      "type": "build"
    }
  },
...
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "additionalArguments": [ "/ruleset:Hoge.ruleset" ]
  },
...
}
```

# うさコメ

ところで、ASP.NET Coreアプリでコード分析(FxCop)を簡単に有効化する方法はないんかいのう(´・ω・`)？
CSSを使ってひとつの要素で描ける●（まる）の数は・・・？

*CSSで●(まる)をたくさん描きたくなったときに助かる人がいるかもしれないので、書いておきます。*

CSSで一つの要素だけで●(まる)は~~6つ描けそうです。~~ 
*※ コメントにて、box-shadowはカンマ区切りで複数指定できるとのご指摘をいただきました。そのため、実質無限にいけます。*

やり方
=========

* before、after疑似要素を使う
* box-shadowを使う

コード
=========

HTML
-----

div要素をひとつだけ。

```html
<div id="maru"></div>
````
CSS
-----

※ SCSSを使ってます

```scss
$circle-size: 10vw;
$circle-saturation: 80%;

@mixin marumaru($size, $shadow-hue) {
    display: block;
    border-radius: 50%;
    width: $size;
    height: $size;
    box-shadow: 0 $size 0 hsl($shadow-hue, $circle-saturation, 80%);
}

#maru {
    $my-hue: 0;
    position: absolute;
    left: $circle-size;
    background-color: hsl($my-hue, $circle-saturation, 50%);
    @include marumaru($circle-size, $my-hue);
    &::before {
        $my-hue: 120;
        content: "";
        position: absolute;
        left: -$circle-size;
        background-color: hsl($my-hue, $circle-saturation, 50%);
        @include marumaru($circle-size, $my-hue);
    }
    &::after {
        $my-hue: 240;
        content: "";
        position: absolute;
        left: $circle-size;
        background-color: hsl($my-hue, $circle-saturation, 50%);
        @include marumaru($circle-size, $my-hue);
    }
}
````

結果
====

こうなります感じになります。

![描画された●.png](https://qiita-image-store.s3.amazonaws.com/0/3103/351477e0-e03c-0885-aa6a-44fc8701ec7b.png)

さいごに
=======

このやり方で、たしかに●はたくさん描けます。
しかし、before・afterの疑似要素では凝ったコンテンツは書けませんし、box-shadowは本体要素の影のためshadowだけの形を変えたりすることはできません。

よって、使い所が限定されてしまう小ネタではありますが、●をたくさん描きたくなったときにお使いください。
CentOS7にSubversion1.9をインストール（SSHで使用）

#はじめに
仕事の現場で「ソース管理どうしますか？」と聞くと
「SVNサーバ構築しといて」と言われることよくありますよね。
（言い出しっぺがやらされる法則）
そういう人のために構築手順まとめました。

#Subversionのインストール
最新のSubversionをインストールしたいのでwandiscoのyumリポジトリを追加
`sudo vi /etc/yum.repos.d/subversion.repo`

centOS7にSVN1.9をインストールしたい場合は以下のように記述

```
[subversion]
name=subversion
baseurl=http://opensource.wandisco.com/rhel/7/svn-1.9/RPMS/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
```

Subversionのインストール
`sudo yum install subversion`

バージョン確認
`svnserve --version`

Subversionのリポジトリ作成
`sudo mkdir -p /var/svn/repos`
`sudo svnadmin create /var/svn/repos`

Subversion用のグループを作成
`sudo groupadd svngroup`

Subversionリポジトリのグループと権限を変更
`sudo chown -R :svngroup /var/svn/`
`sudo chmod -R 775 /var/svn/`

#SubversionへのSSH経由でのアクセス
##Subversionのユーザー
ユーザーはOSのユーザーを利用するので事前に作成
作成したユーザーに先程のグループを追加（-aオプションを忘れずに！）
`sudo usermod -aG svngroup ユーザー`

確認コマンド
`id ユーザー`

##EclipseからSSH経由でアクセス
新規にリポジトリロケーションを作成し、URLを以下のように設定
`svn+ssh://IPアドレス/var/svn/repos`
必要に応じてユーザーのパスワードやSSHキーを設定

※参考　EclipseからSubverisonにプロジェクトの追加

```
対象プロジェクトを右クリック
チーム → プロジェクトの共有 → SVN → 既存のリポジトリを選択
「拡張モード」　
「単一プロジェクトレイアウト」
「Subversion推奨レイアウト」を選択　
```

##SVNサーバと同じサーバでアクセス
Subversionを使用可能なユーザーで以下を実行（プロジェクトのチェックアウト）
`svn co file://localhost/var/svn/repos/test/trunk`

##SVNサーバと別のサーバでアクセス
Subversionを使用可能なユーザーで以下を実行（プロジェクトのチェックアウト）
`svn co svn+ssh://IPアドレス/var/svn/repos/test/trunk`
※未検証です

#さいごに
言い出しっぺにやらせるとだれも言い出さなくなると思います。
そこで、今後は言い出しっぺ以外にやらせるというルールにしたらどうでしょう？
とりあえず、今後は「ソース管理どうしますか？」と言い出さないようにしようと思います。
【LinuxBrew】UbuntuでMeCabのインストール

LinuxBrew を用いて Ubuntu に MeCab をセットアップします.
おそらくは Mac でも同じくできるでしょうが、検証環境がありませんので未確認です.
おそらくは何番煎じという記事でしょうがあしからず.

## 環境
- LinuxBrew: 
  - Homebrew 1.0.7
  - Homebrew/homebrew-core (git revision a5528; last commit 2016-11-06)
- Ubuntu: 16.04

## 本体のインストール
```bash
$ brew update
$ brew install mecab
```

確認:

```bash
$ mecab -v
mecab of 0.996
```
ちゃんとインストールできたようです.

## 辞書のインストール
MeCab を使うには辞書が必要です.

辞書の種類や特徴は [Qiita: y-ken: brewコマンドでmecab用のIPA/Juman/UniDic辞書をインストールする方法](http://qiita.com/y-ken/items/ca3a6f7d7c79fdbe703e) にあります.
というか、リンク先を後から知りこのセクションいらないじゃんって…

### IPA 辞書
```bash
$ brew install mecab-ipadic
```
オプションで文字コードの指定が可能（デフォルトはutf8）

```bash
$ mecab -d $HOME/.linuxbrew/lib/mecab/dic/ipadic
この記事を読んでいただきありがとうございます
この	連体詞,*,*,*,*,*,この,コノ,コノ
記事	名詞,一般,*,*,*,*,記事,キジ,キジ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
読ん	動詞,自立,*,*,五段・マ行,連用タ接続,読む,ヨン,ヨン
で	助詞,接続助詞,*,*,*,*,で,デ,デ
いただき	動詞,非自立,*,*,五段・カ行イ音便,連用形,いただく,イタダキ,イタダキ
ありがとう	感動詞,*,*,*,*,*,ありがとう,アリガトウ,アリガトー
ござい	助動詞,*,*,*,五段・ラ行特殊,連用形,ござる,ゴザイ,ゴザイ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
```


### Juman 辞書
```bash
$ brew install mecab-jumandic
```
同じくオプションで文字コードの指定が可能（デフォルトはutf8）

```bash
$ mecab -d $HOME/.linuxbrew/lib/mecab/dic/jumandic/
隣の客はよく柿食う客だ
隣	名詞,普通名詞,*,*,隣,となり,代表表記:隣り
の	助詞,接続助詞,*,*,の,の,*
客	名詞,普通名詞,*,*,客,きゃく,漢字読み:音 代表表記:客
は	助詞,副助詞,*,*,は,は,*
よく	形容詞,*,イ形容詞アウオ段,基本連用形,よい,よく,代表表記:良い
柿	名詞,普通名詞,*,*,柿,かき,代表表記:柿
食う	動詞,*,子音動詞ワ行,基本形,食う,くう,代表表記:食う
客	名詞,普通名詞,*,*,客,きゃく,漢字読み:音 代表表記:客
だ	判定詞,*,判定詞,基本形,だ,だ,*
EOS
```
### UniDic 辞書
```bash
$ brew install mecab-unidic
```

```bash
$ mecab -d $HOME/.linuxbrew/lib/mecab/dic/unidic/
東京特許許可局
東京	トーキョー	トウキョウ	トウキョウ	名詞-固有名詞-地名-一般		
特許	トッキョ	トッキョ	特許	名詞-普通名詞-一般		
許可	キョカ	キョカ	許可	名詞-普通名詞-サ変可能		
局	キョク	キョク	局	名詞-普通名詞-助数詞可能		
EOS
```
JavaScriptやjQueryでイベントを削除して再登録する方法


よくあるケースではないですが…JavaScriptやjQueryで設定したイベントハンドラを一時的に無効にして、もろもろの処理をした後に再びイベントを復活させたかったので、やり方を備忘録的に残しておきます。

## 取得して削除して再登録する

アプローチは単純で、登録済みのイベントを「取得」→「削除」→「再登録」これだけです。

まず、設定済みのイベントハンドラを取得する必要があります。というかイベントハンドラの取得さえできてしまえばできたも同然です。イベントハンドラは、JavaScriptやjQueryの場合、一般的には下記のパターンがあると思います。そして、それぞれに対して取得方法が変わってきます。

### onclick属性で指定

```html
<button id="hoge" onclick="doSomething();">click me</button>
```

#### 取得＆削除＆再登録

```javascript
// 取得
var event = $("#hoge").get(0).onclick;
// もしくは
// document.getElementById("hoge").onclick

// 削除
$("#hoge").get(0).onclick = "";

// 再登録
$("#hoge").get(0).onclick = event;
```

### jQueryでDOMにクリックイベント

```javascript
$("#hoge").click(function() {
	doSomething();
});	

$("#hoge").on("click", function() {
	doSomething();
});
```

#### 取得＆削除＆再登録

```javascript
// 取得
var events = [];
Object.keys($._data($("#hoge").get(0), "events")).forEach(function(k) {
  events[k].forEach(function(o) {
    events.push(o.handler);
  });
});

// 削除
$("#hoge").off("click");

// 再登録
events.forEach(function(e) {
  $("#hoge").on("click", e);
});
```


### jQueryのon()でdocumentにクリックイベント

```javascript
$(document).on("click", "#hoge", function() {
	doSomething();
});
```

#### 取得＆削除＆再登録

```javascript
// 取得
var events = [];
Object.keys($._data($(document).get(0), "events")).forEach(function(k) {
  events[k].forEach(function(o) {
    events.push({
      handler: o.handler,
      selector: o.selector,
    });
  });
});

// 削除
$(document).off("click", "#hoge");

// 再登録
events.forEach(function(e) {
  $(document).on("click", e.selector, e.handler);
});
```


### addEventListenerを直接使う

```javascript
var event = function(){
	doSomething();
};
document.getElementById("hoge").addEventListener("click", event);
```

### 削除＆再登録をする

残念ながら `addEventListener` で直接設定した場合、後からイベントハンドラを取得することはできないようです（出来る場合は教えてください 🙇🏻）。ただし、設定時にイベントを変数にとっておくことで、削除と復活自体は可能です。

```javascript
// 削除
document.getElementById("hoge").removeEventListener("click", event);

// 再登録
document.getElementById("hoge").addEventListener("click", event);
```

ちなみに以前、[jQueryで設定されたクリックイベントなどを定義している場所を調べる方法](http://qiita.com/zaru/items/b7732ebad9b732518359)という記事も書いているので、そちらも良ければ見てみてください。
Webpack2のTree Shakingを試す

社内勉強用資料。

## Tree Shakingとは？

ESモジュール形式で書かれたコードをbundleして一つのファイルにする時に、exportしているけどどこからもimportされていない、使われていないコードを削除する機能のことです。

もともとは[rollup](https://github.com/rollup/rollup)というBundlerに実装されていた機能ですが、webpackの次バージョンであるwebpack2にも実装されているということで試してみました。

## webpack2のTree Shakingの仕組み

[Tree-shaking with webpack 2 and Babel 6](http://www.2ality.com/2015/12/webpack-tree-shaking.html)

上記記事に詳しく書いています。簡潔に説明すると、まず、ESモジュール形式で書かれたJSファイルを全て結合し、そのタイミングでどこからもimportされていないexport文を消してしまいます。あとは、コードをminifyするタイミングで完全に取り除かれるという感じみたいです。

## Tree shakingを試す

### webpack2のインストール

下記コマンドでインストールできます。この記事を書いている時点では`webpack@2.1.0-beta.25`がインストールされます。

```sh
npm install -D webpack@beta
```

### ESモジュール→commonJS形式の変換を無効にする

仕組みのとこでくっつけてから不要なexport文を排除すると説明しましたが、babel-loaderでbabel-preset-es2015を使っている場合、コードをくっつける前にESモジュールがCommonJS形式に書き換えられてしまいます。
下記のように`babel-preset-es2015`のESモジュールの書き換えを無効化します。

```json:.babelrc
{
  "presets": [["es2015", {"modules": false}]]
}
```

### webpack.config.jsをwebpack2用に書き換える

`module.loaders`が`module.rules`に変更されていたりと、ちょっと書き換えが必要になります。下記記事を参考にしてください。（自分のプロジェクトはmodule.loadersの書き換えくらいで済みました）

[Migrating to Webpack 2](http://javascriptplayground.com/blog/2016/10/moving-to-webpack-2/)

### webpackを実行する

あとはWebpackを実行するだけ！

```
webpack --config webpack.config.js
```

## おまけ：比較

自分の所属するチームでwepbackを使っているプロジェクトでTree Shaking前後の容量を比較してみました。

### リッチラボで開発している広告のJavaScriptの場合

- Tree Shaking前後で比較
    - A 31.32 kB => 30.48 kB（0.84KB削減）
    - B 39.35 kB => 38.27 kB（1.08KB削減）
    - C 26.34 kB => 25.88 kB（0.44KB削減）
    - D 34.95 kB => 34.06 kB（0.89KB削減）
    - E 34.82 kB => 33.58 kB（1.24KB削減）
    - F 26.24 kB => 25.78 kB（0.46KB削減）
    - G 27.45 kB => 26.86 kB（0.59KB削減）
    - H 29.55 kB => 28.79 kB（0.76KB削減）
    - I 31.91 kB => 30.91 kB（1KB削減）
    - J 38.6 kB  => 37.6 kB（1KB削減）
    - K 32.48 kB => 31.4 kB（1KB削減）
    - L 29.04 kB => 28.47 kB（0.5KB削減）
    - M 27.05 kB => 26.46 kB（0.5KB削減）
    - N 26.61 kB => 26.1 kB(0.5KB削減）
    - O 48.93 kB => 47.23 kB(1.7KB削減）
- 広告は容量にセンシティブなので、基本的には外部のライブラリは使わない。その為、SPAに比べると依存関係は少なく、効果が薄かったのかも。
- それでも平均して **1KB** くらい容量が削減されていた

### React.jsで作ったSPA案件

- ~~なぜか30KBくらい増えてるｗ~~ webpack1と比較してたのがよくなかった
- エントリーが２つあって、bundleされたファイルが２つ出来るプロジェクト
- Tree Shakingなし:449KBと353KB
- Tree Shaking有り: **442KB** と **349KB** 
- それなりに削減された！
- `react`や`react-dom`はexternalsオプションを使ってbundleしたファイルの外にあるので効果うすそう

`reactstrap`などのReact Component系のパッケージだと結構効果高そうな予感がします。
Android TVアプリ実装時はLeanbackのXxxSupportFragmentを継承する

## LeanbackはSupportFragmentも提供しています

もう記事タイトルだけで全てを語っているので本文不要な気がしますが、いちおう書いていきます。
`Android TV`の公式実装サンプルや数少ないTV関連の記事、だいたい公式サンプル準拠で`Leanback`の`RowsFragment`や`VerticalGridFragment`を継承して実装しているのがほとんどだと思います。
ですが、ライブラリの中をみると`Leanback`が提供している各`Fragment`には、それぞれに対応した`SupportFragment`バージョンも存在します。 `RowsSupportFragment`、`VerticalGridSupportFragment`などですね。

`Android TV`はAPI Level 21以上が確定なので後方互換は今のところそこまで問題にならないと思いますが、API Level 23の時点ですでに`Fragment#onAttache(Activity)`が非推奨になってます。が、v4を使ってないとAPI Level 22以下の端末用に`onAttach(Activity)`を記述しなきゃいけない、みたいなことになっちゃいます。

ですので、これから`Android TV`アプリを開発する場合は、サンプルに書かれている`XxxFragment`を`XxxSupportFragment`に置き換えて実装していくとよいと思います。
なお、`Leanback`には`AppCompat`に対応したThemeが定義されていないので、`AppCompatActivity`を使うのは厳しそうです。
btrfs (on Ubuntu 14.04)

- `sudo apt install btrfs-tools`
- Use Disks GUI tool and create device (say /dev/sdb2).
  - Type: Custom
  - FileSystem: btrfs
- `sudo mkdir /bt && sudo mount /dev/sdb2 /bt`

参考サイト
http://centos.sabakan.red/entry/2015/11/09/073000
C++用マイクロフレームワーク作ってみた

需要は多分ない。

ヘッダオンリーなのでインクルードすれば使えます。
https://github.com/nocotan/otus

### 依存
- Boost
- [cpp-netlib](https://github.com/glynos/cpp-netlib)

### Hello World

```c++
#include "otus.h"

int main() {
    ots::otus app = ots::otus();
    app.route("/", "GET", [](ots::request req){
        return "Hello, World!";
    });

    app.run("localhost", "8080");

    return 0;
}
```

### htmlレンダラー

```c++
#include "otus.h"

int main() {
    ots::otus app = ots::otus();
    app.route("/", "GET", [](ots::request req){
        return ots::render_template("test.html");
    });

    app.run("localhost", "8080");

    return 0;
}
```

### Request

```c++
#include "otus.h"
using namespace std;

int main() {
    // initialize
    ots::otus app = ots::otus();

    // routing
    app.route("/", "GET", [](ots::request req)->string{
        cout << req.method << endl;
        cout << req.path << endl;
        cout << req.source << endl;
        cout << req.destination << endl;
        cout << req.body << endl;
        for (auto header : req.headers) {
            cout << header.name << ":" << header.value << endl;
        }
        return ots::render_template("test.html");
    });

    app.route("/", "POST", [](ots::request req)->string{
        cout << req.method << endl;
        cout << req.path << endl;
        cout << req.source << endl;
        cout << req.destination << endl;
        cout << req.body << endl;
        return "OK";
    });


    app.run("localhost", "9000");

    return 0;
}
```

### コンパイル

```
g++ -std=c++11 test.cpp -I<path to cpp-netlib> -L<path to cpp-netlib/libs/network/src> -lpthread -lboost_system -lboost_thread -lcppnetlib-uri -lcppnetlib-client-connections -lssl -lcrypto
```
ImageMagick > 画像のoverlapping > composite -compose over LN.png background.png  out.png

```txt:動作確認
CentOS 6.8
Version: ImageMagick 6.7.2-7 2016-06-16 Q16 http://www.imagemagick.org
```

透明色を持つ画像と、背景に使う画像を合成して、１つの画像にする方法を調べた。

参考 http://imagemagick.rulez.jp/archives/672

以下によりLN.png(透明色を持つ画像)と背景画像を合成してout.pngを作成できた。

```
$ composite -compose over LN.png background.png  out.png
```

### 画像は2枚まで
(追記 2017/10/03)

合成できる画像は2枚のようだ。
3枚以上で合成しようとすると、予期しない画像が生成される。
push_backとemplace_back

この記事は[初心者 C++er Advent Calendar](http://www.adventar.org/calendars/1691)の１日目の記事です。

#はじめに
みなさんはstd::vectorやstd::listで要素を追加するときに、「push_back関数よりも、
emplace_back関数を使った方が良い」と言われたりしたことがあると思います。
この記事ではその二つの関数の動作などを解説していきます。

#どこがちがうの？
std:vectorのpush_backは以下に示すように、実引数が左辺値用と右辺値用にオーバーロードされています。

```cpp
template<class T,
         class Allocator = allocator<T>>
class vector {
public:
    ...
    void push_back(const T& param);
    void push_back(T&& param);
    ...
};
```

左辺値の場合はコピーされて、右辺値の場合はムーブされます。
(ムーブについての詳細はここでは説明しません。
[他のWebページ](http://qiita.com/rinse_/items/ad0cc7e351e836595c94)
を参考にしてください。)

ここで一つパフォーマンス面で問題が発生します。  

例えば、整数を引数にとるコンストラクタをもつクラスを要素とするstd::vectorがあるとしましょう。



```cpp

class Minute{
    ...
public:
    Minute(int time);
    ...
};

std::vector<Minute> vec;

vec.push_back(12);

```

このとき、内部では以下のように動作しています。

1. 一時オブジェクトが12からコンストラクトされる

2. それがpush_backの仮引数へムーブされ、それがstd::vectorの新規オブジェクトとしてコンストラクトされる。

3. 一時オブジェクトが破棄される。

このようにコンストラクトが２回起きています。  
これは無駄ですよね。  
なので、C++11以降、コンストラクタの引数から直接コンテナの新規オブジェクトが生成できる関数が用意されました。

それが**emplace_back**なのです！！

では実装を確認してみましょう。

```cpp
template<class T,
         class Allocator = allocator<T>>
class vector {
public:
    ...
    template<class ...U>
    void emplace_back(U&&... param);
    ...
};

```

この関数は内部で**完全転送**というものを行っています。
(詳しくは[こちらの記事](http://proc-cpuinfo.fixstars.com/2016/03/c.html)をご覧ください。)

これはコンストラクタの引数を受け取ってコンテナに直接コンストラクトします。
emplace_back関数がパフォーマンス面以外で動作が変わるのは以下の場合です。

* エラーが出ない（間違っていることに気づかせてくれない）
* 追加される要素は、丸括弧で初期化されます。（波括弧での初期化ではない）

#まとめ
emplace_backは実引数がコンテナの要素型と異なるときに、push_backよりも動作が早くなり、
それ以外の場合ではほとんど変わりません。（実引数が単に変数のときなど）
pyenv for linux

# 1. installing pyenv
*getting from github*

```zsh
# git clone https://github.com/yyuu/pyenv ~/.pyenv
```

*modify environment (add)*

```zsh:.zshrc
PATH=$PATH:$HOME/.pyenv/bin
eval "$(pyenv init -)"
```

*check installed*

```zsh
# pyenv version
system (set by /root/.pyenv/version)
```

# 2. note
**required library**
`gcc` `zlib-devel` `readline-devel` `openssl-devel`
`sqlite-devel` `bzip2-devel`

**did not install pip**

```zsh
# curl -kL https://bootstrap.pypa.io/get-pip.py | python
```

# 3. check func

```zsh
# python -V
Python 2.6.6
```

```zsh
# pyenv install --list
```

```zsh
# pyenv install 2.7.12
```

```zsh
# pyenv versions
* system (set by /root/.pyenv/version)
  2.7.12
```

```zsh
# pyenv global 2.7.12
```

```zsh
# pyenv rehash
```

```zsh
#  python -V
Python 2.7.12
```

```zsh
# pyenv versions
  system
* 2.7.12 (set by /root/.pyenv/version)
```
第3回つぶやき勉強会 ~オブジェクトの地図~

```rb:復習
class Hoge
  fuga = 1
  def fuga; 2; end
  def piyo
    fuga
  end
end
hoge = Hoge.new
```

- hoge.piyo はなんですか？

----


```rb
class MyClass
  def my_method
    @v = 1
  end
end
obj = Hoge.new
```

- `obj.class.class.superclass.class` はなんですか？

----

```rb
class Hoge
end
```

- `Hoge` は変数 or 定数?
- また、それを示せ。

----

```rb
class Hoge
  class Piyo
   def piyo; 1; end
  end
end
```

- こんな書き方は可能ですか？
- Piyo のインスタンスを作る方法は？

----

```rb
class Hoge
  private 
  def hoge
    1 
  end
end
```

- プライベートメソッドをclass外から2パターンの方法で呼んでください。

----

### 解答

- 2
- Class
- 定数, Object.constants.grep(/Hoge/)
- 可能, Hoge::Piyo.new
- obj.send(:hoge), Hoge.new.method(:hoge).call
Shinyでダイアログを出すのが標準機能でできるようになってた

Shinyの0.14以降ではダイアログを標準機能で出せるようになりました。普通に検索するとshinyBSパッケージを使用したり、JavaScript(後述)を使用したりする記事が多く出てきますのでご注意ください。
[modal-dialogs](http://shiny.rstudio.com/articles/modal-dialogs.html)
<img width="179" alt="Screenshot_20161111-151600.png" src="https://qiita-image-store.s3.amazonaws.com/0/103775/1c233d57-b2e8-46f8-493f-1b239676a3b2.png">

###コード
```
showModal(modalDialog(title = "エラー", "入力が正しくありません", easyClose = TRUE, footer = modalButton("OK")))
```
####オプション
- title: ダイアログのタイトル
- size: ダイアログの幅、s/m(標準)/l
- footer: dismissボタンをつけるかどうか
- easyClose: ダイアログの外をクリックすると閉じれるようにするかどうか

###参考：古い方法
Javascriptを利用する方法は以下になります。のっぴきならない理由でver0.13以前を使わなくてはならないとかいうケースは従来通りの方法をご利用ください、、、。
####ui.R
```
tags$head(
  tags$script(HTML('Shiny.addCustomMessageHandler("jsCode",function(message) {eval(message.value);});'))
)
```
####server.R
```
session$sendCustomMessage(type='jsCode', list(value = 'alert("エラー");'))
```
巨大な CVS リポジトリを Git に移行したときの話

# 背景
歴史の長いプロジェクトでは、バージョン管理に CVS を使っている場合がある。
メンテナンス性向上のため、Git に移行させたかった。
今回移行の対象となったのは、運用期間が長く、branch も多く存在していて、いわゆる巨大なリポジトリ。

# 移行環境
Ubuntu 12.04

# 方法1 git cvsimport  (失敗)

- branch も引き継がれるはずだが、すべての branch が import できなかった。
- 新しめの branch が引き継げない模様
- 個数制限がある？

# 方法2 cvs2git (成功)
 
### ツールの準備
- http://cvs2svn.tigris.org/servlets/ProjectDocumentList ここから cvs2svn をダウンロードする
 - 名前は svn だけど git 用も一緒に入っている
- 解凍して適当に make install
- cvs2git が使えるように適当に PATH 通しておく

### データの準備
- cvs checkout の状態ではNG。***. v 等の生状態が必要。
- CVSROOT 以下と移行したいリポジトリのディレクトリ以下をローカルにコピーしてくる
 - scp -r -P 22 uzyura@xxx.xxx.co.jp:/data/cvs/CVSROOT /home/uzyura/work/soft/import/
 - scp -r -P 22 uzyura@xxx.xxx.co.jp:/data/cvs/ProjectName /home/uzyura/work/soft/import/

### データのインポート
- データをインポートさせたい場所に移動
 - cd /home/uzyura/work/soft/
- データをインポートする
 - cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=uzyura--encoding=utf-8 --fallback-encoding=utf-8 import/
 - 今回1時間ぐらいかかった。5GB ぐらいのファイルが生成

### リポジトリへ反映
- あらかじめ Git リポジトリを作成しておき、クローンする
 - git clone https://xxx/リポジトリ名.git
- インポートする
 - cd リポジトリ名
 - cat ../git-blob.dat ../git-dump.dat | git fast-import

### とある cvs ブランチ を Git の master ブランチにする
- git checkout ブランチ名
- git merge -s ours master
- git checkout master
- git merge ブランチ名
- git push origin master
oF : ポリゴンで多角形を描画する

#ofxBox2dPolygonで６角形を作成
```
ofPtr<ofxBox2dPolygon> poly = ofPtr<ofxBox2dPolygon>(new ofxBox2dPolygon);
float r = ofRandom(10, 20);    // 半径
float rsin30=r*sin(M_PI/6.0);  // x座標
float rcos30=r*cos(M_PI/6.0);　// y座標


// 座標作成
poly.get()->addVertex(mouseX - rsin30, mouseY - rcos30); // 左下
poly.get()->addVertex(mouseX - r, mouseY);               // 左
poly.get()->addVertex(mouseX - rsin30, mouseY + rcos30); // 左上
poly.get()->addVertex(mouseX + rsin30, mouseY + rcos30); // 右上
poly.get()->addVertex(mouseX + r, mouseY);               // 右
poly.get()->addVertex(mouseX + rsin30, mouseY - rcos30); // 右下
  
      
// set attributes
poly.get()->setPhysics(1.0, 0.5, 0.1);
poly.get()->create(box2d.getWorld());
```
※６角形なので、θ=30°
※描画する頂点の順番があるらしく、間違えると６角形にはならないので注意！


#三角関数
y座標 = r × sinθ
x座標 = r × cosθ
yum install/update で固まる

# 概要

環境: CentOS 6 系

放置していたサーバーの適当なパッケージを更新しようとしたら、いつまで経っても進捗せず。
とりあえず落ち着いて `Ctrl+C`

```
$ sudo yum update wget
[sudo] password for user: 
読み込んだプラグイン:downloadonly, fastestmirror, security
^CTraceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 298, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 115, in main
    base.getOptionsConfig(args)
  File "/usr/share/yum-cli/cli.py", line 229, in getOptionsConfig
    self.conf
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 911, in <lambd
a>
    conf = property(fget=lambda self: self._getConfig(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 335, in _getCo
nfig
    startupconf.pluginconfpath,disabled_plugins,enabled_plugins)
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 564, in doPlug
inSetup
    plugin_types, confpath, disabled_plugins, enabled_plugins)
  File "/usr/lib/python2.6/site-packages/yum/plugins.py", line 167, in __init_
_
    self.run('config')
  File "/usr/lib/python2.6/site-packages/yum/plugins.py", line 184, in run
    func(conduitcls(self, self.base, conf, **kwargs))
  File "/usr/lib/yum-plugins/downloadonly.py", line 27, in config_hook
    default=False, help="don't update, just download")
  File "/usr/lib64/python2.6/optparse.py", line 1020, in add_option
    self._check_conflict(option)
  File "/usr/lib64/python2.6/optparse.py", line 995, in _check_conflict
    option)
optparse.OptionConflictError: option --downloadonly: conflicting option string
(s): --downloadonly
```

なんだか見慣れないオプションがある。 `--downloadonly` ?

# downloadonly オプション

https://access.redhat.com/ja/node/395763
> パッケージをインストールせずにダウンロードだけを行うには、yum の "downloadonly" プラグインまたは yumdownloader ユーティリティを使用する二つの方法があります。

まさにこれっぽい。
`/etc/yum/pluginconf.d/downloadonly.conf` が設定ファイルなので、 `enabled=0` にすればOK

```
$ cat /etc/yum/pluginconf.d/downloadonly.conf
[main]
enabled=0
```

# 再度実行

```
$ sudo yum update wget
[sudo] password for user: 
読み込んだプラグイン:fastestmirror, security
...
```

`downloadonly` 外れてますね。よかった。
これ、あらかじめ `yum-plugin-downloadonly` をインストールしないと使えない機能のようだ。
恐らく不必要なパッケージのインストールを防ぎたかったんだろうけど、例えば脆弱性対応等で `yum update` が必要な場合もあるので、予め知っておきたかった（遠い目
ImageMagick > 大半を占める色を透明色にする > RGB値の確認 / 透明色に変換

```txt:動作確認
CentOS 6.8
Version: ImageMagick 6.7.2-7 2016-06-16 Q16 http://www.imagemagick.org
```

画像を含むpsファイルがある。それを以下のpngにしたい。

- 大半を占める色を透明色に
- pngに変換

やってみた。

## 大半を占める色のRGB値を確認

処理対象のpsファイルを簡易な名前にするためsymbolic linkを作成。

```
$ ln -fs 93179504c69857ff4f83.ps LN.ps
```

大半を占める色のチェックは以下で実行済 http://qiita.com/7of9/items/901b55c3043ac594947c

```
$ convert LN.ps -format %c histogram:info: | sort -n
...
       927: (30583,30583,30583,65535) #777777777777 rgba(119,119,119,1)
      1098: ( 2570,43690,65535,65535) #0A0AAAAAFFFF rgba(10,170,255,1)
     58832: ( 3084, 6168,63993,65535) #0C0C1818F9F9 rgba(12,24,249,1)
    193104: (65535,65535,65535,    0) #FFFFFFFFFFFF0000 rgba(255,255,255,0)
    219918: (65535,65535,65535,65535) #FFFFFFFFFFFF white
```

whiteの次に多い色は`rgb(12,24,249,1)`と分かった。

### 透明色にする

参考 http://yamaguchi-1024.hatenablog.com/entry/2015/11/15/164011
(情報感謝です)。

```
$ convert -transparent "rgb(12,24,249)" LN.ps tmp.png
````

`$eog tmp.png`にて該当部分がチェッカーフラッグ(市松模様)になっていれば透明化成功。
TravisClでLaravel5.2のテストを自動化してみる

TravisClでLaravel5.2のテストを自動化を試してみた。

##環境
テスト対象FW：Laravel 5.2
DB:Postgresql
開発環境：Laravel/homestead v0.5.0
ローカル環境:Windows10

##下準備
プロジェクトのルートディレクトリに
①.env.travis
②.travis.yml
の2ファイルを作成

##.env.travis
```.env.travis
APP_ENV=testing
APP_DEBUG=true
APP_KEY=
APP_URL=http://localhost

DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=travis_ci_test
DB_USERNAME=postgres
DB_PASSWORD=

CACHE_DRIVER=array
SESSION_DRIVER=array
QUEUE_DRIVER=sync
```

##.travis.yml
```yml:.travis.yml
language: php

php:
    - 7.0

services:
    - postgresql

before_script:
    - cp .env.travis .env
    - psql -c 'create database travis_ci_test;' -U postgres
    - composer self-update
    - composer install --no-interaction
    - php artisan key:generate
    - php artisan migrate

script:
    - phpunit
```

上記を記述後GitHubへpushするだけでテストがTravisCl上で実行される。

##参考
[TravisCl公式ドキュメント](https://docs.travis-ci.com/user/database-setup/ "TravisCl")
[stackoverflow](http://stackoverflow.com/questions/38018283/how-to-test-laraval-5-2-projects-with-travis-ci "How to test laraval 5.2 projects with Travis CI")
Ubuntu 16.04で英語キーボードを使えるようにする方法

Ubuntu 16.04で英語キーボードを使って日本語入力を不自由なく行う方法についてまとめます。


#前提
* Ubuntu 16.04 LTS
* iBus
* mozc
* 直接入力とかな入力の切り替えを`Ctrl+Space`で行う

#方法
##キーボードレイアウト変更
__※`apt`コマンド等の`dpkg`と競合するプロセスを走らせていない状態で行ってください。__
1. `sudo dpkg-reconfigure keyboard-configuration`コマンドを実行します。
2. `標準102キー(国際)PC`を選択しエンターキーを押します。<br>![Screenshot from 2016-11-11 14-25-47.png](https://qiita-image-store.s3.amazonaws.com/0/52291/edd081cd-6914-dd55-2164-2c55b16a3330.png)
3. `英語(US)`を選択しエンターキーを押します。<br>![Screenshot from 2016-11-11 14-25-56.png](https://qiita-image-store.s3.amazonaws.com/0/52291/27201f62-8847-310a-6ec6-9686452e9104.png)
4. `英語(US)`を選択しエンターキーを押します。<br>![Screenshot from 2016-11-11 14-26-02.png](https://qiita-image-store.s3.amazonaws.com/0/52291/7e64318d-e8ac-ee1b-0f9b-5f1adcec627e.png)
5. `キーボード配置のデフォルト`を選択しエンターキーを押します。<br>![Screenshot from 2016-11-11 14-26-06.png](https://qiita-image-store.s3.amazonaws.com/0/52291/ca6eb969-e734-852e-0fe7-bd4c3f5033a4.png)
5. `コンポーズキーなし`を選択しエンターキーを押します。<br>![Screenshot from 2016-11-11 14-26-10.png](https://qiita-image-store.s3.amazonaws.com/0/52291/d92fe355-9b5c-29ca-b551-2a3c760306e7.png)
6. `いいえ`を選択しエンターキーを押します。<br>![Screenshot from 2016-11-11 14-26-14.png](https://qiita-image-store.s3.amazonaws.com/0/52291/4085809c-047e-7bbd-3d88-0ca25126a91f.png)

##Mozcのキー設定変更
1. Dashホームを開き、`setting`で検索を行い、システム設定を開きます。
2. `テキスト入力`をクリックします。<br>![システム設定_034.png](https://qiita-image-store.s3.amazonaws.com/0/52291/f56a1618-06cc-8925-44c5-ef454217507d.png)
5. 次のソースへ切り替えと前のソースへ切り替えをそれぞれ適当なキーに設定します。<br>![テキスト入力_037.png](https://qiita-image-store.s3.amazonaws.com/0/52291/7aa0c471-5d65-8522-edf8-7823fee81355.png)
6. Mozcの`ツール`ー`プロパティ`をクリックします。
7. キー設定の`編集`をクリックします。<br>![Mozc プロパティ_048.png](https://qiita-image-store.s3.amazonaws.com/0/52291/4c00e310-f841-aa36-6e2b-0d9c63c69962.png)
8. 以下のようにキー設定を追加します。

|モード|入力キー|コマンド|
|:--:|:--:|:--:|
|直接入力|Ctrl Space|IMEを有効化|
|入力文字なし|Ctrl Space|キャンセル後IMEを無効化|

9. ログインし直します。




#参考文献
* [Ubuntu 14.04 betaでキーボードレイアウトを日本語に戻す ibus-mozc編 - 旧ID:itiriのブログ](http://ubuntu.hatenablog.jp/entry/20140403/1396524520)
* [第319回　Ubuntu 14.04と日本語入力：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0319)
IE9でcanvasでの画像合成する時の落とし穴回避法

### 別ドメインのcrossOriginはサーバーで許可していても、img.crossOriginがあってもダメ

同じドメインに配置する必要がある

## 画像のcontent typeが　application/octet-stream
（サーバーでの画像をブラウザで直接閲覧した際にダウンロードがいきなり走る設定の状態）
だと画像が取得出来ない

### imageのonloadが走らない場合があるので
setInterval で回しながらwidthが入った時か、デカイ画像だとwidthに値が入っても読み込みがダメな時があるので、

```js
if (0 < img.width && img.complete){
    // onload走ったのと同じ処理
}
```

で一安心
Mac Jenkins 環境設定

#jenkinsをインストル後の環境変数設定
jenkinsは、初期ではPATHが設定されていないので、以下の実行したいユーザーなどでPATHを確認

```
$ echo $PATH
/Users/******/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

Jenkinsの管理　＞　システムの設定　＞　グローバル プロパティ　＞　環境変数

```
キー　PATH
値　  /Users/******/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```
NCL / NetCDF > National bordersの線を消す > mpOutlineOn をFalseにする

```txt:動作確認
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

National bordersの表示を消す。

参考 http://www.ncl.ucar.edu/Applications/mapoutlines.shtml

> To turn NCL map outlines on or off, set the mpOutlineOn resource to True or False. You can also turn map fill on and off by setting mpFillOn resource to True or False to turn on/off map fill.


以下の追加でNational bordersの線を消すことができた。NCL / NetCDF >

```ncl
res1@mpOutlineOn = False
```
Opencv3.1.0とCUDA8.0RCでのmakeに失敗するとき


エラー文は一番下に。
CUDAのサポートを必要としていなければ、根本的な解決はさておきとりあえずCUDA support OFFっておけば、インストールはできる。

さまざまなサイトで紹介されているcmakeの文面で
cmake -D WITH_CUDA=ON
↓
cmake -D WITH_CUDA=OFF
としておけばＯＫ。


>[ 20%] Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_gpu_mat.cu.o
In file included from /usr/local/cuda/include/cuda_runtime.h:78:0,
                 from <command-line>:0:
/usr/local/cuda/include/host_config.h:115:2: error: #error -- unsupported GNU version! gcc versions later than 5.3 are not supported!
 #error -- unsupported GNU version! gcc versions later than 5.3 are not supported!
  ^
CMake Error at cuda_compile_generated_gpu_mat.cu.o.cmake:208 (message):
  Error generating
  /opt/opencv-build/opencv/build/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/./cuda_compile_generated_gpu_mat.cu.o
modules/core/CMakeFiles/opencv_core.dir/build.make:63: ターゲット 'modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_gpu_mat.cu.o' のレシピで失敗しました
make[2]: *** [modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_generated_gpu_mat.cu.o] エラー 1
CMakeFiles/Makefile2:1942: ターゲット 'modules/core/CMakeFiles/opencv_core.dir/all' のレシピで失敗しました
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] エラー 2
make[1]: *** 未完了のジョブを待っています....
[ 20%] Built target pch_Generate_opencv_phase_unwrapping
[ 20%] Built target pch_Generate_opencv_structured_light
[ 20%] Built target pch_Generate_opencv_stitching
Makefile:160: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2
CodeIgniterでDBのsequenceを取得すると2・3個ずつ値が進んでしまう時の対応

#現象

CodeIgniterで、シーケンスの値を取得するためnextvalを発行すると、取得する値が増分の設定値を超えて増えてしまう。



```php:oracleのシーケンスでnextvalの値取得
$sql = 'SELECT test_seq.nextval AS NEXTVAL FROM dual';

$query = $this->db->query($sql);

$row = $query->row_array();
echo "nextval: ".$row['NEXTVAL']."<br>";

```

シーケンスを増分1設定で上のコードを2回実行したとき、結果が下のように値が2増加してしまっている。。。

```php:2回実行した結果

nextval: 1
nextval: 3

```


フォーラムでも取り上げられているが、
http://forum.codeigniter.com/thread-17356-page-2.html
CodeIgniterで値を取得すると、2・3回アクセスされているようです。(それパフォーマンス的に良くないのでは？)


#解決策

simple_queryで**値を取得せずに**、"NEXTVAL"を実行して値を1つ進めた後"CURRVAL"で値を取得する。

```php:シーケンス取得

public function get_new_id($seq_name)
{
    $sql = 'SELECT ' . $seq_name . '.NEXTVAL FROM DUAL'; // シーケンスを進める
    $this->db->simple_query($sql);//値を取得しない

    $sql = 'SELECT ' . $seq_name . '.CURRVAL FROM DUAL'; // シーケンスの取得
    $query = $this->db->query($sql);
    $row = $query->row_array();

    return $row['CURRVAL'];
}

```
jupyter つかって、windows で、tunnel して、mysql のデータをとってくる

#### jupyter から、ssh でトンネルして、mysql データベースを操作可能です。便利です。（jupyter でなくてももちろんよいです。）

anaconda を普段使っていて、jupyter も使うような人が対象です。
paramiko と、sshtunnel をインストールします。conda-forge にありますので、conda だけでインストールできます。
pandas の import は結構時間かかるので、読み込み時間を計測しています。

```
# port 番号も適宜変更してください。
# ssh の port は、88099 
# remote の port 3306 mysqlのつもり 
# local  の port 3307 なんでもいいですが、覚えやすいように、3306 + 1 

import os,sys,re,platform
import pymysql
%time import pandas as pd
import codecs

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ('ログイン先',88099),
     ssh_username="ユーザ名",
     ssh_password="パスワード",
     ssh_pkey="/Users/hoge/.ssh/hoge_key など",
     remote_bind_address=('127.0.0.1', 3306),
     local_bind_address=('127.0.0.1', 3307)
)

server.start()


# ここで、適当に処理、下記は、show tables して、pandas に放り込んでいます。

conn = pymysql.connect(host='127.0.0.1',port=3307,
db='データベース名', user='データベースユーザ', passwd='データベース',
charset="utf8")
xdf = pd.read_sql('show tables', con=conn)
conn.close()

server.stop()
```