OmniAICreator/Qiita-1.07M huggingface dataset:
画像の不正2次利用を防止する方法


案件のガイドラインで、表題の件について対応する必要があり色々調べて実装してみました。  
  
はじめに言っておきますが、完璧に防ぐのは無理です。
どう頑張っても、画像パス直だたきされると画像は表示されちゃいます。
なので、僕達にできることはあくまで「ユーザーに、簡単には保存させないようにする」までです。  

それでは、下記に対策方法をまとめます。

### ドラッグ＆ドロップを無効にする

```css
img {
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none; /* From IE10 only */
  user-select: none;
  -webkit-user-drag: none;
  user-drag: none;
}
```
CSSではどうにも Firefox や IE では無効にならないようです。
下記JSを追加します。

```javascript
// ※ jQuery を使用しております

// あとからDOMに追加した要素にもイベントを効かせるために、
// document にイベントを設定
$(document) 
  .on('mousedown', 'img', function (e) { e.preventDefault(); }); // return false でもOKか
```

これでマウスを押した際のアクションが無効化されるため、ドラッグ＆ドロップできなくなります。
このJSを使う場合はCSSの指定も不要になります。

### 右クリックでコンテキストメニューを開けないようにする
```javascript
// ※ jQuery を使用しております

// あとからDOMに追加した要素にもイベントを効かせるために、
// document にイベントを設定
$(document) 
  .on('contextmenu', 'img', function () { return false; });
```

### あとがき

結果的には、img の mousedown イベント と、contextmenu イベントを無効化するだけで画像の不正2次利用防止（ポーズだが）は実装できました。  

ちなみに、css で img に対して、`pointer-events: none` を指定すると、上記すべてに一発で対応できます。
ただ、すべてのイベントを無効にするようなので、画像リンクがクリックできなくなったり、モーダルが出なくなったりする場合があります。
なので、こちらを使用する場合は img すべてといった広範囲の適用はせず、特定の要素にのみ適用させるようにしたほうがよさそうです。
UnityでGit管理するときの設定項目

# Unityの設定
1. [Edit] -> [Project Settings] -> [Editor]を選択
- Inspectorビューを開く
- [Version Control] のModeを [Visible Meta Files] に変更
- [Asset Serialization] のModeを [Force Text] に変更

# Gitの設定
- .gitignoreを作成し以下を記述する

```git:.gitignore
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*

# Autogenerated VS/MD solution and project files
ExportedObj/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd


# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage
```
- 参考:
https://github.com/github/gitignore/blob/master/Unity.gitignore
- こちらも参考:
[気付いたら.gitignoreはgiboで自動生成する時代になっていた](http://qiita.com/tmknom/items/c4bcebe17d25381fa45d) thanks [@mizoguche](http://qiita.com/mizoguche)

# めんどくさいのでスクリプト化しました
毎回、同じ作業をするのが面倒なので以下のエントリにスクリプト張ってます。
- [Unityで開発するときにフォルダ構成と.gitignoreを作る便利スクリプト](http://qiita.com/takish/items/1604b9dcb053d116b43b)

# 参考リンク
- Unityのプロジェクトはなぜ壊れるのか。原因と対策 
http://madnesslabo.net/utage/?page_id=5640
- 複数人で1つのUnityプロジェクトを管理するには
https://thinkit.co.jp/story/2015/09/02/6362
Confluenceでコンテキストパスを設定する

環境
====
Confluence 5.5
Apache 2.2
Apache Tomcat/7.0.47

設定
====
* https://XXXXX.XX.jp/wiki でアクセスできるように設定する

* Tomcat の proxy, context pathの設定

```/opt/atlassian/confluence/conf/server.xml
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8090" 
        minProcessors="5" maxProcessors="75" enableLookups="false" 
        redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="20000" 
        useURIValidationHack="false" URIEncoding="UTF-8"
        proxyName="XXXXX.XX.jp" proxyPort="443" scheme="https" />
    :
    :
    <Context path="/wiki" docBase="../confluence" debug="0" reloadable="false" useHttpOnly="true">
```

* Confluence 本体の context pathの設定

```/var/atlassian/application-data/confluence/confluence.cfg.xml
    <property name="confluence.webapp.context.path">/wiki</property>
```

* Apache の proxy 設定

```/etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
    :
    :
LoadModule proxy_http_module modules/mod_proxy_http.so
    :
    :
    :
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /wiki http://localhost:8090/wiki
ProxyPassReverse /wiki http://localhost:8090/wiki

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
```


参考URL
https://ja.confluence.atlassian.com/jira/integrating-jira-with-apache-using-ssl-203395380.html
Samba 4.2.10でAD参加できない問題

# Samba 4.2.10の問題点と対処

[BadBlock](http://badlock.org/ "Bad Block Bug")の脆弱性対応でリリースされたバージョンのようだが、SambaをActiveDirectoryのドメインメンバーと参加させている場合、環境によってはドメインに参加できなくなる不具合が含まれている。これは4.2.11以降で修正されているようだが、2016/5/26現在ではScientific linuxのパッケージレポジトリの最新が4.2.10のためドメインに参加できる状態に戻すにはsambaのダウングレードが必要になる

下記のパッケージダウングレードやアンインストールは自分の責任で行ってください。

# Sambaのダウングレード

まずはダウングレード可能なバージョンを確認する

```
yum --show-duplicate list samba
```

ひとつ前のバージョンに戻すには
```
yum downgrade samba
```

自分の環境ではこれでは依存関係の解決ができずダウングレードできなかったので、関係パッケージを取り除いてバージョン指定でインストールしなおした。

```
yum remove samba samba-common-libs samba-client-libs samba-common-tools samba-libs
yum install samba-4.2.3-12.el7_2
```

# yum自動更新からsambaを除外する

yum-cronを使っている場合は/etc/yum/yum-cron.confのexclude行にsamba* libsmb* libwb*を追記して自動更新の対象外にしておく

# 4.2.11以降への更新について

ダウングレードによってBadBlock脆弱性の影響を受けると思われるので、上記の対応はファイルサーバーを復旧するための一時的な措置となる。復旧後に時間をとって4.2.11へのアップデート計画を立てる必要がある
外部からVirtualBox内のサーバにアクセス

#概要
　VirtualBoxにポートフォワーディングの設定があったので、それを利用して仮想環境に接続します。
#手順
1.VirtualBoxの設定を開く

2.ネットワークタブのポートフォワーディングの設定を開く

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/127148/d9826afe-fb2b-f33a-42f5-1ff0ad57bf21.png)

3.新たにルールを追加する
　名前、ホストポートを任意で設定し、ゲストポートを仮想環境のApacheで設定した値にします。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/127148/3b97b345-1a25-20b7-d308-34a966572cb4.png)

以上です。
本体のPCのIPアドレス：[ホストポート]で仮想環境に接続されるようになります。
Elixir/Phoenixでjqueryを使う方法

# 環境
Erlang/OTP 21 [erts-10.0.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Elixir 1.6.6 (compiled with OTP 20)
macOS Sierra 10.12.6
node v10.5.0

# やり方
```bash
cd assets
npm install jquery --save
```
で`jquery`の`^3.3.1(2018-07-02)`が`assets/package.json`の`dependencies`に追加されていると思います

```json:assets/package.json
  8  "dependencies": {
  9    "jquery": "^3.3.1",
 10    "phoenix": "file:../deps/phoenix",
 11    "phoenix_html": "file:../deps/phoenix_html"
 12  }
```
そして`assets/brunch-config.js`の`npm`の項目を

```js:assets/brunch-config.js
 59   npm: {globals: {
 60     $: "jquery",
 61     jQuery: "jquery"
 62   }}
```
とするともうjqueryが使えるようになってます

# 試す
```js:assets/js/hoge.js
$(function() {
  console.log("jquery loaded.")
})
```
```js:assets/js/app.js
import "./hoge.js"
```
mix phx.serverで立ち上げる
http://localhost:4000

jquery loaded.とコンソールに表示されていればjqueryの導入は成功です

# 参考
http://phoenixframework.org/blog/static-assets

# 追記による注意
ここから下は以前の情報です！(2016/05/26に投稿したもの)

# 環境
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Elixir 1.3.0-dev (7d5233d)
CentOS 7
Phoenix Framework 1.1.4

# やり方
```js:brunch-config.js
  npm: {
    enabled: true,
    // Whitelist the npm deps to be pulled in as front-end assets.
    // All other deps in package.json will be excluded from the bundle.
    whitelist: ["phoenix", "phoenix_html", "jquery"] // ←　jqueryを追加
  }
```

```js:web/static/js/app.js
import "phoenix_html"
import $ from "jquery" // ←phoenix_htmlの下に追加
```

```json:package.json
{
  "repository": {
  },
  "dependencies": {
    "babel-brunch": "~6.0.0",
    "brunch": "~2.1.3",
    "clean-css-brunch": "~1.8.0",
    "css-brunch": "~1.7.0",
    "javascript-brunch": "~1.8.0",
    "uglify-js-brunch": "~1.7.0",
    "phoenix": "file:deps/phoenix",
    "phoenix_html": "file:deps/phoenix_html",
    "jquery": ">= 2.1" ←追加
  }
}
```

web/static/vender/に使いたいjqueryのjsファイルを追加

npm install --save

なんかインストールしてるみたいなの出る

終わり

# 試す
```js:web/static/js/hoge.js
$(function() {
  console.log("jquery loaded.");
});
```
```js:web/static/js/app.js
~
// import ".hoge" // ←Nao000さん指摘ありがとうございました
import "./hoge" // ←追加
```

mix phoenix.serverで立ち上げる

http://localhost:4000

コンソールにjquery loaded.が表示されていればjqueryが正常に読み込まれてる
ファクトデータとデータベースと著作権についての問答まとめ


> 念の為の注意書き
> 以下の問答は弁護士などの専門家を通したものではなく、誤りが含まれる可能性があります。

2016年5月26日、Facbeook上において、「事実情報（ファクトデータ）」と、それらをまとめた「データベース」、およびそれらをどのような法律（著作権など）で保護するのがよいかか、という[議論が起こりました](https://www.facebook.com/permalink.php?story_fbid=1035607206518453&id=100002075511572&notif_t=like&notif_id=1464164962317792)。

参加者の同意のもと、概要をストックします。

## 議論のきっかけ
ユーディー氏による2015年1月12日のブログ投稿 [ファクトデータの著作権について考える ～株価データを事例として～](http://yudypon.blog.jp/archives/20150112.html) を @nyampireが見つけたことがスタート。

## 議論の抜粋
* データ提供者が著作権を主張しようと、その事実情報に対して本当に著作権が適用されるかは別の問題
* 事実情報を収集したデータセットを、著作権をもとに保護することは困難
* ただし世の中には、著作権以外にも法律があり、特に商行為に関しては、不正競争防止法などの法律で保護するほうが筋がよいのではないか
* 日本において、データベース内の個々の事実情報データについては、著作物性は発生し得ない。ただし海外では、それらをまとめた時に、権利が発生する国がある。（EUにおけるsui generis権）
* 日本においては、データベースの著作物性、として、著作権のなかに内包した観点で処理されることもある（著作権法 2条 1項 10号の3）
* 日本における類似の判例

* NTTのタウンページ判例: 1つ1つの電話番号には創作性はないが、カテゴライズの手法に創作性がある、と判断。[判例](http://www.softic.or.jp/Ysemi/2009/6_091203/daikei.pdf)
* [翼システム判例](http://storialaw.jp/topics/precedent/598): 地図データ自体には創作性はないが、収集とメンテナンスにコストをかけて販売されているものをライバル会社が`そのまま`盗用し、販売することによって財産侵害が発生し得る。判例そのものを含んだ、[研究成果](http://homepage3.nifty.com/matsumura-lo/oboe/ronbun/200306_chizaikanri_database.htm)
* [住宅ローン金利の比較表について著作物性を否定した事例](http://storialaw.jp/topics/precedent/594): データそのものには著作物性は無く、ありふれた表形式での表現には著作物性がない、とする判例

* TPPによる、著作権の非親告罪化についても、日本においては、経済的な損害が発生したかどうかが1つの大きな判定要素になるという議論が進んでいるという認識
* よって、直接的な損害がない限り、事実情報のデータベースは著作権法では保護できないし、著作権法による保護はすべきではない、という意見

* デジタルデータの流通の観点から、著作権で守れる範囲をむやみに拡張するのではなく、その他の法律（特に不正競争防止法や民法による損害賠償請求）にもとづいて処罰するほうが望ましいのではないか

* OpenStreetMapのライセンス ODbLとDBcLでは、個別データとデータベース全体としての扱いが定められている。今後、要解説。


## より認識を共通させる必要がある事項
* 「事実情報」とは何か。

> 例えば、「過去発生したあるいは現在発生している事象」であり「複数の主体から観察可能」な情報？

* 著作権法で保護しないものを不法行為で保護してよいのかどうか

* 契約のオーバーライドはいかがなものか。（今後、詳しい意味について議論必要）

* 著作物性の無いデータ（数値、ありふれた表現の表形式など）については、著作物性が無いというだけで、事実情報とは異なる。別途まとめる必要がある

## リンクなど
議論のもととなった [ファクトデータの著作権について考える ～株価データを事例として～](http://yudypon.blog.jp/archives/20150112.html) の下部に資料へのリンクがあります。

## くさかさんによる再整理
* [Facebook くさかさんのWall](https://www.facebook.com/permalink.php?story_fbid=10205999162929281&id=1566939542&hc_location=ufi)
DockerのPythonイメージで暗号化ライブラリcryptographyを利用する

暗号化ライブラリパッケージ[cryptography](https://cryptography.io/)をDocker Pythonイメージから使う方法について。2016年5月26日現在。

## pyca/cryptographyとは
https://github.com/pyca/cryptography

### pip install cryptography

```:Dockerfile
FROM python:3-slim

RUN pip install cryptography
```

2016年5月26日現在、依存モジュールcffiがwheel提供されていないため、これではうまくいきません。


## DOs
Debianベースの場合。

```:Dockerfile
FROM python:3-slim

RUN apt install python-cffi && pip install cryptography
```

jessieだと、cffi 1.4.2が入ります。

また、自明ですが、Alpineベース(e.g., `python:3-alpine`)はこれではうまくいきません。


## DON'Ts

```:Dockerfile
RUN apt-get update && apt-get install -y build-essential libssl-dev libffi-dev python-dev
```

### 理由
イメージサイズが大きくなるため。ただし、最新のcffi（2016年5月26日現在 cffi 1.6.0）が使えるメリットはあります。


## まとめ

それでは快適な暗号化プログラミングライフを。
Ansible 2.1がリリースされて何より嬉しかったこと


Ansible2に移行してから長らく悩んでいた問題が、[2016/5/25にリリースされたAnsible 2.1](https://github.com/ansible/ansible/releases)で解決された話です。
*・・・大した話じゃないけど嬉しくて書いてしまいました。*

# はじめに

これまでAnsible 1.Xで運用していたセットアップ用Playbookを、Ansible2に移行したという人も多いんじゃないでしょうか。意外と書式が変わっていますので、Playbookをそのままでは警告が出まくって、直すの面倒でしたよね。

その面倒があったとしても、Ansible2系にすることで`block`が使えるようになったり、依存関係が書きやすくなったりと、メリットがいっぱいありました。
でも、私の環境では困っていることもあったのです。

それは **「yumモジュールの挙動がおかしい」** ことでした。


## 本記事の動作環境

- セットアップ対象ホスト: CentOS 6.x
- Ansible実行サーバー: CentOS7 + pyenv + python 2.7


## 問題のPlaybook

yumモジュールを使用してパッケージを更新する、よくあるタスクです。

```package_update.yml
- name: remove common packages
  yum:
    name: "{{ item }}"
    state: absent
    conf_file: /etc/yum.conf.nodisable
  with_items: "{{ remove_packages }}"

- name: install kernel
  yum:
    name: "{{ item }}"
    state: present
    conf_file: /etc/yum.conf.nodisable
    update_cache: yes
  with_items: "{{ kernel_packages }}"

- name: update all packages
  yum:
    name: "*"
    state: latest
    update_cache: yes
```


# 挙動の変化

## Ansible 2.0.2の問題の挙動

これはyumモジュールを使用して、(1)不要パッケージを消して、(2)カーネルをアップデートしようとして、失敗した時の例です。
パッケージ名やバージョンは本筋ではないため、適当な文字列に置換しています。

```bash
TASK [_initial_setup : remove common packages] *********************************
skipping: [hoge] => (item=[u'cups', u'dovecot'])

TASK [_initial_setup : install kernel] *****************************************
skipping: [hoge] => (item=[u'kernel-2.6.fuga', u'kernel-headers-2.6.fuga', u'kernel-devel-2.6.fuga'])

RUNNING HANDLER [_initial_setup : restart iptables] ****************************
	to retry, use: --limit @centos6/initial_setup.retry
```

・・・この残念感、伝わりますか？

- skippingと表示されているけど、更新されている。あるいは、更新不要(=ok)である。
- skippingと表示されているけど、どうやら失敗したらしい。
- 2つ目のタスクで失敗したはずなのに、なぜかHANDLERで失敗しているように見える。

*※ HANDLERを呼んでいるタスクは本記事の例では省略しています。*

yumモジュールがansible 2.0系ではデグレっていて、使い勝手が下がっていたんですよね。。。


## Ansibleをアップグレードしてみる

本記事執筆時点でAnsible 2.1はリリースされたばかりですが、pipで入れている人なら簡単にアップグレードできます。

```bash
$ pip install --upgrade ansible
```


## Ansible 2.1.0の挙動

改めて実行すると、この問題はちゃんと直ってました。

```bash
TASK [_initial_setup : remove common packages] *********************************
ok: [hoge] => (item=[u'cups', u'dovecot'])

TASK [_initial_setup : install kernel] *****************************************
changed: [hoge] => (item=[u'kernel-2.6.fuga', u'kernel-headers-2.6.fuga', u'kernel-devel-2.6.fuga'])

TASK [_initial_setup : update all packages] ************************************
changed: [hoge] => (item=[u'curl', u'curl-devel', u'lz4', u'cloud-utils-growpart'])
```

変更があればchanged、変更不要ならok。わかりやすいですね。


## 最後に

この問題は私の環境特有の話ではなくて、ちゃんと本家にIssueとして出ています。

- [Yum Module always displays as skipped #1765](https://github.com/ansible/ansible-modules-core/issues/1765)

およそ1年がかりで直ったってことですね。
Redhat/CentOS系の主要な機能なのだから、もっと早く直して欲しかったなぁ・・・
プレゼン、デモとかで使うショートカット（Mac）


すぐ忘れるのでメモ

## 外部ディスプレイ

#### ミラーリングモードに切り替え

「Command」+「F1」

## Chrome、iTerm

#### 文字拡大

「Command」+「Shift」+「+」

#### 文字縮小

「Command」+「-」

## IDEA系エディタ

IDEA系エディタ(PhpStorm等）の文字拡大、縮小のショートカット分からず…
誰かおしえてください。
Arduino LEONARDOでLM335Zの温度センサーをつなぐ

```cpp
int val = 0;
float v = 5;

void setup() {
  Serial.begin(9600);
}

void loop() {
  val = analogRead(A0);
  float temp = modTemp(val);
  Serial.println(temp);
  delay(1000);
}

float modTemp(int analog_val){
  float v = 5;
  float tempC = (v * analog_val)  * 100 / 1024.0 -273.15 ;
  return tempC;
}
```

抵抗は2KΩ

![S__40550407.jpg](https://qiita-image-store.s3.amazonaws.com/0/32555/e962806f-7117-7354-1c38-ad8eae760574.jpeg)
Proxy 環境下でJava8をUbuntu にインストールする

# あらまし

Ubuntu では PPA で Oracle製のJava8をインストールできるが、
Proxy環境下ではダウンロードエラーになってしまうので、回避する

# 本題

以下のようにすればいい

```diff:/etc/apt/apt.conf
  Acquire::http::Proxy "http://proxy:8080";
+ Acquire::https::Proxy "http://proxy:8080";
```

あとはProxy設定を変数から与えつつPPAの設定、インストール

```Ubuntu16.04の場合
sudo http_proxy=http://proxy:8080 https_proxy=http://proxy:8080 add-apt-repository  ppa:webupd8team/java
sudo apt update
sudo apt install oracle-java8-installer oracle-java8-set-default
```

# 参考

* [apt-getコマンドをProxy経由で使用する](http://d.hatena.ne.jp/mrgoofy33/20100726/1280154695)
* [Ubuntu にOracle Java 8 (PPA)をインストールする(ubuntu)](http://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d)
* [Oracle Java (JDK) 7 / 8 / 9 Installer PPA](https://launchpad.net/~webupd8team/+archive/ubuntu/java)
* [【Proxyの外に出れない僕達のために】Proxy 環境下で sudo add-apt-repository する方法【と、sudoとhttp_proxyのなんやかんや】](http://qiita.com/aKenjiKato/items/18f9b8553f8ad4117d79)

# その他
危うく社内サーバのIPアドレス晒すところであったでござるよ
初学者向け Xamarin.Forms (Prism.Forms) Todo アプリサンプル

# DEMO

まずはこちらをご確認ください。クリックすると動画を再生します。
[<img width="360" alt="Screenshot_2016-05-26-15-16-51.png" src="https://qiita-image-store.s3.amazonaws.com/0/25145/df34cc58-9185-e705-e3de-f3a6e02df6ea.png">
](http://sukobuto.com/files/ScreenRecord_2016-05-26-15-02-07.mp4)

# 作り始めるにはどうしたらいいの？

[Github 変更履歴](https://github.com/sukobuto/xf-mvvm-todo-example/commits/master/TodoMvvm) を見てください。

これから Xamarin.Forms を始める方向けに、プロジェクト作成からの流れがわかるように Github で公開しました。私がつまずいた個所の対策も含まれています。
プラットフォームは iPhone と Android です。

このコミットを過去（下）からたどることで、同じようにアプリを作ることができます。それぞれのコミットにコメントを書いていますので、VisualStudio GUI の操作内容などはそちらを参照してください。clone でもいいですが、最初はぜひ１からプロジェクトを作成して真似してみてください。

↓コメントの例（各コミットページの一番下にあります）
[![image](https://qiita-image-store.s3.amazonaws.com/0/25145/adf26320-e7da-c660-80b3-6264b995f15e.png)
](https://github.com/sukobuto/xf-mvvm-todo-example/commit/d60314bf425c2e66a276e95063cdc9e0dbd1c581#commitcomment-17625347)

諸所の変更に関する質問は、ぜひ Github 上でコミットにコメントでください！全体的な質問は↓こちらのコメント欄で大丈夫です。

## Github に不慣れな方へ

あるコミット時点の完全なスナップショットが必要であれば、コミットページの右上にある「Browse files」をクリックしてください。
![image](https://qiita-image-store.s3.amazonaws.com/0/25145/81838e02-ff33-d7af-7f5f-1556e4190afe.png)

ダウンロードしたい場合は、その先で右上にある「Clone or Download」から Download ZIP です。
![image](https://qiita-image-store.s3.amazonaws.com/0/25145/15742c13-8cbb-5d11-0b5d-abead909a9d6.png)

## JXUG の先輩方へ

マサカリを受ける覚悟はできています。
気になった点などあれば、ぜひ教えてください。

# なぜ作ったの？

私が、XAML で MVVM な初学者向けサンプルコードほしいな～ほしいな～と思って探してもなかなか見つからなかったからです。。。
C/C++でインクルードガードを自動的に追加するシェル

メモ

``` add_include_gurad.sh
for file in `\find . -maxdepth 1 \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp'   \)`
do
	if [ `cat ${file} | grep -c "INCLUDE_GUARD_UUID"`  -ge "2" ] ; then
		echo "${file} already has include guard."
		continue
	fi
	cp ${file} ${file}.bkup
	UUID=`uuidgen`
	echo "#ifndef INCLUDE_GUARD_UUID_${UUID//-/_}" >  ${file}
	echo "#define INCLUDE_GUARD_UUID_${UUID//-/_}" >> ${file}
	cat ${file}.bkup >> ${file}
	echo "#endif" >> ${file}
	echo "" >> ${file}
	rm ${file}.bkup
done

```
学生が部活やサークルで後輩にプログラミングとか開発について教える時の手順など

自分が所属する学生団体では、最初新メンバーに一定期間を使ってどのようにWeb開発をするかについて教えています。

ただ、こういったことは全国の部活とかサークルで同じように行われていることだろうな、と思ったので、自分がやってよかったこと・悪かったことなどの知見を一度まとめておこうと思います。

同じように後輩に技術について教える機会がある方は是非参考にしてみてください:smile:

## <i class="fa fa-book" aria-hidden="true"></i> 教える準備・実際に教えるときの手順について

まず、どのような手順で準備をしていったかについて触れます。

### ステップ１：どこまで教えるのかを決める

まず最初に、どの技術範囲まで教えるのかを決める必要があります。例えば、Webの開発を行うにしても、HTMLが使えるぐらいの知識が求められているのか、それともアプリケーションフレームワークによって開発できることが必要か、などによって教える内容が変わってきます。

そこで、**最終的な目標を**定めた上で、どの技術を教えていくのかを決める必要があります。

自分たちの場合、Railsによる開発ができるようになることが目標だったので、だいたい以下の様なことについて教えることにしました。

- HTML/CSS
- Ruby
- Vagrant
- Linuxコマンド
- Git
- Webのちょっとした概念
- Rails

あと、誰が教える役割を担うかもこの段階で決めた方が良いかもしれません。例えば教えるのに割く人員が２人だった場合、役割の分担をここで済ませておくと準備がスムーズになります。

### ステップ２：教える期間を決める

教える技術の内容が決まったら、次はそれらをどれくらいの期間で教えるのかを決めます。大抵は夏休み前〜夏休みまでくらいの長さになると思います。３〜５ヶ月といった感じでしょうか。

自分たちは夏休みに自由課題としてRailsでアプリ（サービス）を作ることを課題にしたので、夏休み前くらいにステップ１で述べた技術については一通りおさえるようにしました。

### ステップ３：教材の準備をする

教えることと期間が決まったら、次は教材の準備をします。

必ずしもすべて作る必要はないと思いますが、教える側の勉強にもなると思うのでできるだけ自分たちで作ったほうがいいと思います。自分が教えた時は作った教材もあれば、ネットで資料を探したこともあった、という感じでした。

教材の準備をするにしても、しないにしても**春休み**から準備ができると余裕をもって教えられると思います。自分たちの場合、春休みに多少準備はしたのですが、全部の準備は出来なかったため教えている途中は教材の準備を自転車操業的な感じで進めていったため、きつい時期もありました。

### ステップ４：実際に教える

ステップ３まで準備出来たら、あとは教えるだけかと思います。以下、自分が教える時に意識してやったことをまとめておきます。

#### <i class="fa fa-line-chart" aria-hidden="true"></i> 実践的な内容にする

座学というか、理論的な内容は（情報系の学校であれば）授業で習ってたりするので、この場ではより実践的な内容（自分でコードを打って何か作るなど）にするよう心がけました。

まぁ、これは教材を作るタイミングでの話であるように思いますが、教材が座学っぽいものでも「じゃあ、実際にコード書いてみようか」みたいな感じで何か手を動かすタイミングを作るようにしたほうがいいと思います。

#### <i class="fa fa-clipboard" aria-hidden="true"></i> 課題をだす

学生なので学校の課題もあり大変かとは思いますが、活動時間に教えた内容の復習として次の活動日までにできる課題を出すように心がけていました。

毎日活動している団体は別ですが、活動日と活動日の間に時間が空く場合は、積極的に課題を出すようにしたほうがいいと思います。

課題の内容ですが、時間がある場合は何か作ってくるようなもの、ない場合はクイズみたいなものにしていたと覚えています。

#### <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> エラーを誘発させる

Vagrantで開発環境を整える時など、サーバーまわりを操作するときはインストールや何かプログラムの実行時にエラーが起きることが多かったです。

そのエラーは、慣れたエンジニアにとってはよくあることなのですぐ直せるものだったりしますが、新メンバーにとってはわけがわからないものだと思うので、そういうものの対処法を最初から教えるのではなく、あえてエラーを起こさせて、検索などを用いてどうやって解決すればよいかを教えるようにしていました。


## 教えていてよかったこと・あまりよくなかったこと

次に、実際に自分が教えてみてよかったことと、「もう少しうまくできたかな」と思うことについてまとめておきます。

### <i class="fa fa-smile-o" aria-hidden="true"></i> よかったこと

- 教える側が逆に勉強になった
- 資料を作る能力が上がった
- 何が重要かを考え、取捨選択できるようになった

やはり学生なので、技術的な知識・能力が未熟である部分も多いと思います。そのような中で、他人に教えるために教材を作ることはこれまでに自分が学んできたことの復習にもなるので、良い機会だったかなと思います。

また、教材を作成・用意する際に、どうしても時間の都合上すべて教えきれない部分が出てくるでしょう。そこで、実際に開発をする時にどのような知識が外せないか、逆にあってもあまり役に立たない知識は何か考えて準備することは難しいことでしたが、ためになったように感じています。


### <i class="fa fa-frown-o" aria-hidden="true"></i> あまりよくなかったこと

- 教えるための準備にあまり時間を割けなかった
- 最後は時間の都合上、新メンバーまかせになった
- 予期せぬエラーに対処できなかった

完全に言い訳ですが、思いの外準備に時間がかかり、もっと時間をかければさらに良いものができるとわかりつつ、できない部分がありました。その結果、最後などは「じゃあ、あとはがんばれ」的な感じになってしまったのが残念でした。

また、起きることがわかっているエラーは良いのですが、そうでないエラーの対処に時間をかけることが多かったです。これに関しては、エラーが出たらその原因を探るのは誰か他の人にまかせ、新メンバーの教育はさっさと次に進む、などとしたほうが良かったように思います。

## さいごに

個人的に、社会人になったらこういった「人に教える」機会は絶対にあると思うので、それを今のうちに疑似体験できたのは良かったな、と感じています。

人に教えることは自分で理解する以上に難しいことですが、教えたことは自分にも返ってくるので、がんばって教えましょう！
unicorn で Hello World!

nginx + unicorn + rails という構成がごく普通だが、nginx と unicorn の接続にハマったため、問題を切り分けるためにそもそも、unicorn とはなんぞやというところからはじめることにした。

unicorn は Rack アプリを動かせるウェブサーバである。
実用性はゼロだが、unicorn だけで一度動かしてみた。

AWSで、unicorn + nginx + sinatra を動かしてみる
http://qiita.com/konpyu/items/3ba3774bcde226d7d07d
を参考にさせていただいた。

### 準備
```shell-session
$ mkdir helloworld
$ cd helloworld
$ vi Gemfile
$ vi config.ru
```

### Gemfile:

```rb
source "https://rubygems.org"

gem "unicorn"
gem "sinatra"
```

### config.ru:

```rb
require 'rubygems'
require 'sinatra/base'
class HelloApp < Sinatra::Base
  get '/' do
    'Hello World!'
  end
end
run HelloApp
```

ここまで準備したら、

```shell-session
$ bundle install
$ bundle exec unicorn
```

すると、

```
I, [2016-05-26T16:11:56.939643 #17527]  INFO -- : listening on addr=0.0.0.0:8080 fd=9
I, [2016-05-26T16:11:56.939867 #17527]  INFO -- : worker=0 spawning...
I, [2016-05-26T16:11:56.940895 #17527]  INFO -- : master process ready
I, [2016-05-26T16:11:56.941741 #17529]  INFO -- : worker=0 spawned pid=17529
I, [2016-05-26T16:11:56.942187 #17529]  INFO -- : Refreshing Gem list
I, [2016-05-26T16:11:57.006805 #17529]  INFO -- : worker=0 ready
```

と unicorn が起動。

http://localhost:8080/ で

```text
Hello World!
```

と表示される。

### 後日談

私がはまっていた問題というのは、nginx でアクセスすると、502 Bad Gateway と表示されるものだったのだが、実は、単に unicorn が起動していなかったぽい…。やれやれ。仕組みを知らずに使っていると問題の核心に近づくのに時間がかかる、という教訓だった。

nginx と unicorn は通常、Unix ドメインソケットでつなぐが、この設定は、unicorn側では、設定ファイルに、

```
listen "someappdir/app.sock"
```

などと書いておけば良いようだ。

ちなみに nginx 側は、

```
upstream app-production {
  server unix:/someappdir/app.sock fail_timeout=0;
}
```

みたいにしておく。
Bashで引数を2個ずつ処理したいとき

こんなふうに書く。

```bash:
#!/bin/bash
f() {
  local k v
  while k=$1 v=$2; shift 2; do
    echo "$k=$v"
  done
}
f k1 v2 k2 v2
```

```text:output
k1=v1
k2=v2
```
redux(Middleware: redux-saga)プロジェクトのテンプレートを作った

# はじめに

約半年ほど前(2015/12頃)、Reduxの名前をよく聞くようになったなあと感じた僕はReduxのチュートリアルをやって実際にアプリケーションを作ってみたりしてました。
そのときの感想としては「ActionCreatorでの非同期処理とかそこらへんの処理をするために[redux-thunk](https://github.com/gaearon/redux-thunk)使ってるけどすげえごちゃごちゃしてきて管理しんどいなこれ」って感じでした。
その程度の感想だったためにそこから継続的に使うことはなくオレオレFluxでの開発をしてたりしたわけですが、最近こんなエントリーを見かけました。

[redux-sagaで非同期処理と戦う](http://qiita.com/kuy/items/716affc808ebb3e1e8ac)

[redux-saga](https://github.com/yelouafi/redux-saga)というMiddlewareを使うと今までredux-thunkでがんばるしかなかった非同期処理のつらみを解消してくれるということらしく、そして実際に使ってみると本当にとてもよかったです。
これは使っていくしかないということで最近はredux-sagaを使ってSPAの開発をしています。

redux-sagaとはなんなのかみたいな話は先にあげたエントリーでとても詳しく書かれているのでここでは詳しく書きません。

# ということでテンプレートを作った

毎度毎度サーバー側用意してreduxとredux-sagaの土台作って、reactのコンポーネントの基本的なの用意して、ってのがめんどくさいだろうなと感じたためにテンプレートを用意してみました。

[redux-saga-boilerplate](https://github.com/nabeliwo/redux-saga-boilerplate)

[README.md](https://github.com/nabeliwo/redux-saga-boilerplate/blob/master/README.md)のGet startedの通りにやればredux-sagaでのSPA開発の基盤が用意できている状態になっています。全体的にそれぞれの役割を一目見てわかるようにするためにカウンターのサンプルも一応一緒になっています。
実際開発するときはこのサンプル見つつ書き換えていく感じになります。

# 使っているもの

## サーバーサイド

- Node.js
- hapi.js

特にサーバー側で大きなことをやるつもりがないのでFWとしてhapiを使って軽めな感じにしています。
ちなみにサーバーサイドレンダリングには対応させていない状態です。
`/config/default.json`を作って設定を先に記述しておく必要があります。

## クライアントサイド

- redux
- redux-saga
- react-router(routing)
- react

SPAでばりばり作るための環境にしています。
react-routerにreduxをつなげるために[redux-router](https://github.com/acdlite/redux-router)をはじめは使っていたのですが、なかなかエラーの解決ができずに結局[react-router-redux](https://github.com/reactjs/react-router-redux)を使っています。

## package.json

依存モジュールは以下のとおりです。

```json
{
  "devDependencies": {
    "babel-eslint": "^6.0.4",
    "babel-plugin-syntax-async-functions": "^6.8.0",
    "babel-plugin-transform-regenerator": "^6.9.0",
    "babel-plugin-transform-runtime": "^6.9.0",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.5.0",
    "babel-preset-stage-0": "^6.5.0",
    "babelify": "^7.3.0",
    "browserify": "^13.0.1",
    "eslint": "^2.10.2",
    "eslint-config-airbnb": "^9.0.1",
    "eslint-plugin-import": "^1.8.0",
    "eslint-plugin-jsx-a11y": "^1.2.2",
    "eslint-plugin-react": "^5.1.1",
    "uglifyify": "^3.0.1",
    "watchify": "^3.7.0"
  },
  "dependencies": {
    "babel-cli": "^6.9.0",
    "config": "^1.20.4",
    "handlebars": "^4.0.5",
    "hapi": "^13.4.1",
    "inert": "^4.0.0",
    "react": "^15.1.0",
    "react-dom": "^15.1.0",
    "react-redux": "^4.4.5",
    "react-router": "^2.4.1",
    "react-router-redux": "^4.0.4",
    "redux": "^3.5.2",
    "redux-act": "^0.4.2",
    "redux-logger": "^2.6.1",
    "redux-saga": "^0.10.4",
    "vision": "^4.1.0"
  }
}
```

トランスパイラはBABELでモジュールの読み込みはbrowserifyを使っています。
開発時はwatchifyで監視をします。

こんな感じで今後の開発のためのテンプレートにしてみました。
このリポジトリは今後もアップデートしていく予定です。
npm path.joinの罠


#この記事の目的
・最初webpackを使おうとして、なぜか`ERROR in Entry module not found: Error: Cannot resolve module`と出て、モジュールが見つからないと散々悩んでいたら、実はwebpackに関するミスではなくて、path.joinの思わぬ罠に引っかかっていたということだった。

・webpackに限らず、ディレクトリの些細な違いが影響するものにpath.joinを安易に挟むと思わぬバグを生みますよという自分への戒めと、共有のために記しておく。

#あらすじ
・path.joinは引数に入れた文字列をそのまま繋げず、ちゃっかり変えてしまう時がある

#事件現場
・gulpマンションconfig.js号室

```
+-- package.json
+-- gulpfile.babel.js
+-- gulp/
    +-- config.js	 //ここ
    +-- tasks
+-- public/
	+-- src/
		+-- index.js
```


#何が起こったか
・gulpからwebpackを操作しようとして、config.jsに以下のようなことを書いた。



```config.js
const path = require('path');

const originSourceDir = './public/src';
const originBuildDir = './public/build';

module.exports = {
    src: originSourceDir,
    build: originBuildDir,
    js: {
        srcDir: path.join(originSourceDir, 'js'),
        bldDir: path.join(originBuildDir, 'js'),
        uglify: true
    },
    webpack: {
        entry: {
            bundle: path.join(originSourceDir, 'js/index.js')
        },
        output: {
            filename: 'bundle.js'
        },
        //以下略
    }
};

```

・知らない人には是非とも知っておいて欲しい事実として

	・webpackのentryに記述するパスは`./`から始まる必要がある。
というものがある。 ~~このことを知っていたらpathの巧妙な罠に気づくのも早かったろうが........~~

・今回のケースでは、私は今まで通り
	
	・path.joinは第一引数と第二引数をそのままスラッシュで繋げてくれるもの

と考えていたわけだが、以下のような場合
	
```
const path = require('path');
const dir = './public/src';
path.join(dir, 'js/index.js') 　　//'public/src/js/index.js'　........だと？
```

おわかりいただけただろうか？最初の./がまるまる消えてしまうのだ！

・もう何が起こったかの概要はつかめたかと思われるが、ディレクトリパスをpath.joinで書いてしまっていたため、どう書いても最初に./がつかなくなってしまうのだ！

・このせいでwebpackのことばかりを深く調べまくる羽目になってしまった........

#結論
・path.joinの扱いには気をつけること！。
・最初に`./`をつけたい場合はpath.joinは使わずに、普通に文字列の連結で書くといい。
Mac（Yosemite）でマージツールMeldのインストール（Homebrewインストールも）メモ


Meldはこれ
http://meldmerge.org/


##1.XQuartzをインストール
https://www.xquartz.org/


##2.Homebrewをインストール（入っていたら飛ばす）

[Homebrew公式サイト](http://brew.sh/index_ja.html)から、インストールのコードをコピペし、ターミナルに貼り付けてEnterを押す。

![スクリーンショット 2016-04-13 18.56.58.png](https://qiita-image-store.s3.amazonaws.com/0/40940/80686bbc-7c8e-2a11-751e-48588439f042.png "スクリーンショット 2016-04-13 18.56.58.png")

###さらにHomebrew Caskをインストール

[Homebrew Cask](https://caskroom.github.io/)をいれる。

```ターミナル
brew tap caskroom/cask
```



##3.Meldをhomebrewからインストール

```ターミナル
brew search meld
```

でmeldを調べると「homebrew/gui/meld」と出てきたので、これをたたく。

```ターミナル
brew isntall homebrew/gui/meld
```

##4.pythonをインストール

```ターミナル
brew install python
```

今回は「python-2.7.11 already installed（既にインストールされています）」
と言われた。

##5.meldとたたく

```ターミナル
meld
```

すると、ウィンドウが立ち上がります
![スクリーンショット 2016-05-26 15.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/40940/0a972dda-8d1d-f77d-ccce-369537dd8b65.png "スクリーンショット 2016-05-26 15.14.22.png")



##参考にさせていただきました
http://yukotan.blogspot.jp/2013/02/meldmachomebrew-mountain-lion.html
PostgreSQLのCSV出力(Export)方法


Export方法(方法は2つある)

[ 環境 ]
psql (PostgreSQL) 9.5.3

# COPYコマンド
psqlとコマンドうってpostgres内に入ってからコマンド。


## カンマ区切り(CSV)

```psql
COPY (テーブル名) TO '(ファイルパス)' WITH CSV DELIMITER ',';
```
```具体例
COPY users TO '/tmp/users.csv' WITH CSV DELIMITER ',';
```
これでカンマ区切りで出力される。いわゆるCSV。


## NULL文字を空文字に

```psql
COPY (テーブル名) TO '(ファイルパス)' WITH CSV NULL AS '';
```
```具体例
COPY users TO '/tmp/users.csv' WITH CSV NULL AS '';
```
指定しなければ、NULL文字が「＼N」という形で出てくる。NULL AS 引用符で、NULL部分を空文字で出力できる。


## タブ区切り(TSV)

```psql
COPY (テーブル名) TO '(ファイルパス)' WITH CSV DELIMITER E'\t';
```
```具体例
COPY users TO '/tmp/users.csv' WITH CSV DELIMITER E'\t';
```

DELIMITERを「E'\t'」とします。
DELIMITERは1byteオンリーです。なので\tとか入れる2byteなのでエラーが出ちゃう。
なので、その前に大文字Eを付けることで2byteDELIMITERが使えるようになります。


### カラム名ほしい

HEADERを付ければOK。

```psql
COPY (テーブル名) TO '(ファイルパス)' WITH CSV HEADER；
```
```具体例
COPY users TO '/tmp/users.csv' WITH CSV HEADER；
```

### 各項目全部を「"(QUOTE)」で囲みたい

フォースを使うんじゃ！

```psql
COPY (テーブル名) TO '(ファイルパス)' WITH CSV FORCE QUOTE *；
```
```具体例
COPY users TO '/tmp/users.csv' WITH CSV FORCE QUOTE *；
```

### エクセルでCSV加工したい人！！！

つまりは
* タブ区切りで、
* 引用符(QUOTE)で囲んで、
* NULL文字は空文字化したい
* カラム名も表示

フォースを使うん（ｒｙ

```psql
COPY (テーブル名) TO '(ファイルパス)' WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;
```
```具体例
COPY users TO '/tmp/users.csv' WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;
```
後は文字コードがSJISになってれば完璧ですね！！
(UTF-8とかで出力してきたらiconvコマンドとかでSJIS化するだけです)

※export先予定のファイルが既に存在するときには上書きされます。


# psqlコマンド
こっちはpsqlで入る前。シェル状態で使う。


## カンマ区切り(CSV) & NULL文字を空文字に

```psql
psql データベース名 -c "SQL文" -A -F, > CSVファイル名
```
こっちでもいい。
-Fは、フォーマットオプションでデフォルトは「,(カンマ)」。


## タブ区切り(TSV)

```psql
psql データベース名 -c "SQL文" -A -F $'\t' > CSVファイル名
```
タブ区切り(tsv)ならタブであることを明記。

※export先予定のファイルが既に存在するときにはエラーが出ます(ファイルあるよ！)。
その他は割愛します！

# Import方法は？

```
COPY (テーブル名) FROM '(ファイルパス)' DELIMITER E'\t' WITH NULL AS '';
```
TOをFROMにするとインポートできる。
プログラマの考えが・・身につく本より(Python)：クラス宣言(public/privateなど)

[こちらの書籍](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%E3%81%8C%E3%81%8A%E3%82%82%E3%81%97%E3%82%8D%E3%81%84%E3%81%BB%E3%81%A9%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E6%9C%AC-%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E8%83%BD%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%88%E3%81%86%EF%BC%81-%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E6%9B%B8%E7%B1%8D-%EF%BC%B6%EF%BC%8E%EF%BC%A1%EF%BD%8E%EF%BD%94%EF%BD%8F%EF%BD%8E-%EF%BC%B3%EF%BD%90%EF%BD%92%EF%BD%81%EF%BD%95%EF%BD%8C-ebook/dp/B00MB2STXK?ie=UTF8&btkr=1&ref_=dp-kindle-redirect)よりpythonでならどう書けるか？
プログラミングの考え方を勉強中。

<h1>第5章 クラスによる問題解決 </h1>
こちらの内容でしたが、まずpythonのクラス設計を考えたことがなかったのでいろいろ検索していると[こちらQiita](http://qiita.com/0xfffffff7/items/6ef16e79fe9886acb3f2)に投稿されているとてもわかりやすい記事がありましたので参考にさせて頂きました。

最初に課題として「クラス宣言」がありましたのでpythonに書き換えてみました。
<h3>クラス宣言</h3>

```test.cpp
class sample {
public:
    sample();
    sample(int num);
    int doesSomething(double param);

private:
    int intData;
};
```

こちらを考えるときに「public」「private」で分けて考えたことがなかったので参考サイトを参照して以下変えて動かしています

```test501.py
#!/usr/bin/env python
#coding:utf-8

class Sample(object):

#public:
    #C++のsample()
    def sample1(self):
        print("sample")

    #C++のsample(int num)
    def sample2(self,r):
        return int(r)

    #C++のint doesSomething(double param)
    def doesSomething(self,param):
        return float(param)

##以下修正
    #private:
    __intData = 5  ### 呼び出しが _クラス名__変数名
    

>>>(ターミナル実行)
>>> from test501 import Sample
>>> w = Sample()
>>> w.sample1()
sample
>>> w.sample2(1)
1
>>> w.doesSomething(1.5)
1.5
>>> w._Sample__intData
5


```

最初、c++コードでは sample() もsample(1)も同じメソッド名で書いてあったのでpythonでも同じものを用意していたらエラーになり名前を変えることで動かせるようになりメソッド名の使い方も注意する点を気付かされました(´Д` )
カプセル化などテーマが続きますが、pythonのクラス設計はどうなっているのか引き続き勉強したいと思います。
[git][subversion][git svn] git-svn clone がなかなか終わらない時の対応方法

長い間、使われているSVN(Subversion)のリポジトリはコミット履歴が多く、
git-svn clone するとなかなか終わらない事があります。

この場合、履歴は不要だけど、ファイルが必要な場合は、
最新のリビジョンだけを取得することで高速化できます。

`git svn clone -r HEAD https://hogehohe.example.com/repos/fugafua`

-r HEAD オプションを指定すると、最新のファイルだけを取得します。
-r 180:200 , -r 180:HEAD のように、リビジョンの範囲指定も可能です。
google formからの送信内容をslackに投げる

#フォーム送信時に内容をslackに送信

ユーザーからのお問い合わせのフォームにgoogle formを使用している場合、通知にメールを設定することが出います。
しかし、メールの場合だと見逃してしまうことがあるので、普段チームで使用しているslackのチャンネルに送信しようと思い、GAS（Google App Script）を使用して実装しました。

##必要な情報

- google form
- google spreadsheet（解答）
- slackのtoken

##完成コード（Google App Script）

```js

//フォームが送信されたら実行
function onFormSubmit(e) {
  sendToSlack();
}

//Slackに送信
function sendToSlack(){
  var url        = 'https://slack.com/api/chat.postMessage';
  var token      = '【your_token】'; //取得したtoken
  var channel    = '【your_channel】'; //例: #general
  var text       =  trimMessage();
  var username   = '【anyone】'; //なんでもいいです。 hogehogeとかでもいいです
  var parse      = 'full';
  var icon_emoji = '【your_icon_emoji】'; //アイコンを絵文字にすることができます。僕は猫が好きなので:cat2:にしてます。
  var method     = 'post';
 
  var payload = {
      'token'      : token,
      'channel'    : channel,
      'text'       : text,
      'username'   : username,
      'parse'      : parse,
      'icon_emoji' : icon_emoji
  };
 
  var params = {
      'method' : method,
      'payload' : payload
  };
  
  //slackにポスト
  var response = UrlFetchApp.fetch(url, params);
}

// slackにメッセージとして送信したいテキストを作成する
function trimMessage(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = sheet.getLastRow(); //最終行の番号
  var column = 1; //列の左端の番号（Aの場合は1）
  var numrows = 1; //行を何行取得するか
  var numcolumns = sheet.getLastColumn();
  var values = sheet.getRange(row, column, numrows, numcolumns).getValues();
  var message = String(values).replace(/\,/g, '\r\n'); //「,」を改行に全て変更する
  return message;

}

```

##スクリプト解説
###onFormSubmit()
フォームが送信されたらここが呼び出されるように設定しました
中でsendToSlackを呼び出しています

###sendToSlack()
slackに送信するための情報を定義して、slackにpostしています。
slackに送信したいメッセージを整えるためにtrimMessageを呼び出して成形したメッセージを作成します。

###trimMessage()
slackに送信したいメッセージは、今送信されたformの中身なので、spreadsheetの一番下の行を取得するようにしました。
取得に定義したシートに対してgetRangeメソッドを使用しています。
getRangeメソッドは「**何行目**」の「**何列目**」から「**何行分**」を「**何列目**」まで取るかを引数に渡すと、対応する範囲のカラムを返してくれます！

僕が作成したtrimMessage()の中身だと、以下の部分です。

```js
//現在のシートを取得
var sheet = SpreadsheetApp.getActiveSheet();

//getRangeに渡す引数に必要な情報（何行目の、何列目から、何行分を、何列目まで）を設定
var row = sheet.getLastRow(); //最終行の番号を取得（何行目の）
var column = 1; //列の左端の番号（Aの場合は1）、（何行目から）
var numrows = 1; //行を何行分取得するか（難行分を）
var numcolumns = sheet.getLastColumn(); //最終行の最終カラムの番号を取得（何列目まで）

//設定した情報を使ってgetRangeを実行して、getValuesでレコードの中身を取得します。
var values = sheet.getRange(row, column, numrows, numcolumns).getValues();
```

valuesにはgetRange()で指定した範囲をgetValues()で取得したオブジェクトが入っています。
また、これをString（）でモジレツに変換すると、各カラムの中身が,区切りで文字列になっています。
一つ一つのカラムを改行してslackに送信したいので、,の部分をslack用の改行コードに置換しましょう。

```js
var message = String(values).replace(/\,/g, '\r\n'); //「,」を改行に全て変更する
//*formからの送信内容に,が入っていたらそこも改行されてしまうのでそこはなんとかしたい。。。

return message; // messageを返す
```

これで実際の作業は終わりです。
あとは、実際にformから送信してみたり、メニュー内の実行からonformsubmitを実行してデバッグしてみてください！

ありがとうございました！


参考：[Google Apps Scriptを使って、スプレッドシートの内容をSlackに通知する](http://www.tam-tam.co.jp/tipsnote/javascript/post8499.html)
端末のWebViewの詳細を調べる方法(Safariインスペクタ)

アプリやスマホwebページでwebViewに問題があるけど、詳細が見れなくて困った方へ。

Safariに便利な機能があります！
<img width="1019" alt="スクリーンショット 2016-05-27 10.29.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/037d35fe-e590-71fe-a687-0aca47c01d6e.png">

#1:端末のWebインスペクタをON
iOS端末の`設定`→`Safari`→`詳細`にて`Webインスペクタ`をON
<img width="375" alt="IMG_0234.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/80770/993f592f-412d-3f99-462a-c15f60b8972b.jpeg">

#2:Safari開発ツールをON
PCでSafariを立ち上げて`環境設定`→`詳細`から`メニューバーに開発メニューを表示`をON
<img width="745" alt="スクリーンショット 2016-05-26 14.23.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/dfbbfcda-fc48-72f4-ba60-786bfc1289a6.png">

#3:立ち上げ
- アプリの場合→見たいアプリをビルドします。
(立ち上げた後は調べたいwebViewページを開いておきましょう。)
- Webの場合→見たいページをSafariなどで開いておきます

#4:Safari開発メニューから対象の端末とアプリを選択
するとドーーーン。
<img width="1019" alt="スクリーンショット 2016-05-27 10.29.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/037d35fe-e590-71fe-a687-0aca47c01d6e.png">

cssを軽くいじったりとかもできます
<img width="288" alt="スクリーンショット 2016-05-26 15.01.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/80770/1cb183bb-05eb-90c1-dce3-290c8c01fd34.png">



エラーがあった時は`デバッガ`とかで観れるようです。

これは端末でsafariを立ち上げている時に関わらず、アプリ内webviewも見ることができます。
便利！
C++ UnicodeStringでchar*変換とか検索とかfloat変換とか

#普通の文字列(char*)にしたいとき
vector<string>に放り込むときとかに。
BuilderなんでAnsiString前提感はあります。

```cpp:01.cpp
UnicodeString hoge = "aiueo";
char* ch = "";

strcpy(ch, AnsiString(hoge).c_str()); // ch には "aiueo"が入る
``` 

#検索するとき
AnsiStringだとfind() UnicodeStringはPos()
ちなみにfindのreturnはunsignedです。警告にお気をつけを。
std::string.find()もsize_tなので警告注意です。見つからない場合はstd::string::nposです。
unsigned int を別個作るとかそんな感じで。

```cpp:02.cpp
UnicodeString hoge = "aiueo";
int ret = 0;

ret = hoge.Pos("u"); // ret = 3
ret = hoge.Pos("ue"); // ret = 3
ret = hoge.Pos("uo"); // ret = 0

``` 

#float変換するとき

```cpp:03.cpp
UnicodeString hoge = "3.141";
float ret = 0;

ret = hoge.ToDouble();
hoge = FloatToStrF(ret, ffFixed, 7, 3);
``` 


#UnicodeStringにしたいとき
TCHARでよくね感はあります

```cpp:04.cpp
UnicodeString hoge  = "";
AnsiString    hoge2 = "aiueo";
std::string   hoge3 = "kakikukeko";

hoge = UnicodeString(hoge2.c_str());
hoge = UnicodeString(hoge3.c_str());
```


#数字をUnicodeStringに入れる
なんとそのまま入ります

```cpp:04.cpp
int n = 20;
UnicodeString hoge = n;

``` 



### 参考
http://docwiki.appmethod.com/appmethod/1.15/libraries/ja/System.UnicodeString_Methods
SourceTreeでプロジェクトに追加したファイルが認識されない

こんにちは。
現在SourceTreeを使っているのですが、変更したファイルはファイルステータスに追加されるのですが、新規追加したファイルがファイルステータスに出てきません

一応ターミナルを開いて「git status」で更新ファイルの一覧を表示したら表示され、「git add (新規追加したファイル名)」で追加したら追加することは可能なので、純粋にファイルステータスに出てこなくなっているように思えます

この問題の解決方法をご存知の方がいらっしゃいましたら、お教え願えませんでしょうか
SourceTreeのVersionは1.9.1、OSはWindows7です
Cyberduckの操作のみでオブジェクトストレージのStaticWebを使ってWeb公開する

##オブジェクトストレージのStaticWeb概要
OpenStackのオブジェクトストレージであるSwiftはAmazon S3互換の機能が実装されております。
ストレージとしての機能はもちろん、静的ページや画像、動画などをWeb公開する機能（**StaticWeb**）も実装されていて、これだけで簡単なWEBサーバーとしてファイルを公開できます。
この機能を使うと認証なしでオブジェクトストレージのファイルを閲覧できるようになります。

#StaticWebを使うために必要なのはこれだけ
コンテナに以下の追加ヘッダーを設定することで、該当コンテナ内のファイルについて公開できます。

**対象のコンテナ(ディレクトリ)に ’X-Web-Mode: true’ のヘッダーをつける**
**対象のコンテナ(ディレクトリ)に 'X-Container-Read: .r:*,.rlistings' のヘッダーをつける**

※,.rlistings の部分はWEBページからファイルをリスティングする機能を付与します。誰でもファイル一覧が見れてしまうので、不要でしたら削除してください。

公式のswiftコマンドやREST APIでやれば済むのですが、GUIでよく使われるCyberduckだけでできないかなあとやってみたら出来ました。

ちなみにswiftコマンドでの実例は公式ドキュメントをご参照ください。
[http://docs.openstack.org/api/openstack-object-storage/1.0/content/Examples_for_static_web-dle4025.html](http://docs.openstack.org/api/openstack-object-storage/1.0/content/Examples_for_static_web-dle4025.html)

#Cyberduckでの設定方法

今回はGMOアプリクラウド・ConoHaの環境で試します。

1. Cyberduckで接続できるよう設定をおこないます。設定方法は公式サイトを参照ください。
[http://cloud.gmo.jp/docs/objectstorage/cyberduck/](http://cloud.gmo.jp/docs/objectstorage/cyberduck/)
[https://www.conoha.jp/guide/g-49.html](https://www.conoha.jp/guide/g-49.html)<br /><br />

2. 対象のコンテナを右クリックし「情報」を選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/105677/4a9a6320-1fc3-5a07-3c10-3c7ebb9a5cb9.png)<br /><br />

3. 「メタデータ」アイコンを選択し、左下の編集アイコンから「Custom Header」をクリックすると追加ヘッダーを入力できるようになるので、以下を設定。

* X-Web-Mode: true
* X-Container-Read: .r:*,.rlistings

![2.png](https://qiita-image-store.s3.amazonaws.com/0/105677/bf85ffbe-fe0a-467d-7072-29ba897c32cb.png)

4. コンテナ内にファイルをアップロードし、ブラウザからアクセスすると表示されます。URLはGMOアプリクラウド・ConoHaのコントロールパネルより確認できます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/105677/e3e26330-44c4-00e3-1dae-4ee679f92c64.png)

以上
VisualStudio for Mac (Xamarin Studio)でコードテンプレート（コードスニペット）をインポート・エクスポートする

VisualStudio for Mac (XamarinStudio) で作成したコードテンプレートはどこに保存されてるんだろうと思ったので調べてみた。

## コードテンプレートの保存場所
~/Library/VisualStudio/7.0/Snippets
~/Library/XamarinStudio-6.0/Snippets

デフォルトで設定されている項目も一度でも編集するとここに生成される。
Snippetsフォルダが無い場合は、適当な項目を編集で開いて閉じると生成される。

※Finderで見れない場合はホームディレクトリの表示オプションでライブラリを表示するようにしておく



## ファイル名

[ショートカットキー].template.xml

例）propex.template.xml

VS for Mac(XamarinStudio)上から作成するとこの書式で出来上がるので、これに従うのが無難。
VisualStudio(windows)のコードスニペットファイルと似ているけど微妙に形式が違うので注意。

## インポート・エクスポート

Snippetsフォルダに書式に従ったファイルをコピーすればインポート、別の場所にコピーすればそれでエクスポートとなる。
インポート後はVS for Mac(XamarinStudio)の再起動が必要。

## 参考

http://dreamteam-mobile.com/blog/2015/03/adding-snippets-to-xamarin-studio-example-with-mvvmcross-property-changed/
初心者向けGo言語のイ･ロ･ハ勉強会に参加しました

# 勉強会の基本情報
 * 【日　時】2016/05/24(火) 19:30 〜 21:30
 * 【会　場】レバレジーズ本社（ 渋谷ヒカリエ 17F ）（東京都渋谷区渋谷2-21-1）
 * 【参加費】無料
 * 【主　催】ヒカ☆ラボ
 * 【申し込み】https://atnd.org/events/76480

# 概要
 * Go言語の歴史
 * Go言語の特徴
 * 勉強会に紹介された資料とサイト

# 内容
## 歴史
* 誕生
    * 2009年に、googleさんによって、開発された
    * LinuxとMac OS Xのみしかサポートしていなかった
* 1.0リリース
    * 2012年3月
    * Windowsもサポートされている
* 2011年5月10日に公開された Google App Engine 1.5.0 でも、Go言語がサポートされている
* 最新バージョン
    * 1.6.2
    * 2016年4月20日にリリースされた
* トレンド
    * https://www.google.co.jp/trends/explore#q=golang
* ランキング
    * 42位(2016.05)
    * http://www.tiobe.com/tiobe_index

## 特徴
 * コンパイル型言語
    * 構文チェック、依存関係チェック、コード最適化
    * 変数の型、インポートして未使用のライブラリ、引数と戻り値の型、使われてない変数、etc...
    * 依存するライブラリも含めてビルドファイルを作成するので、別環境に持っていってもすぐに働かすことができる
    * Go言語のコンパイルは早い - Goの標準ライブラリ全体でも9秒
    * go runコマンドを実行すると、コンパイルと実行を一度に行うことができる
 * 高いパフォーマンス
    * 実際にAPIのバックエンドやバッチ処理などパフォーマンスがネックになる部分にGo言語として採用されている
 * 型の扱い
    * http://golang.jp/tag/go%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98/page/3
 * 「楽しく」「スマートに」コーディング
    * 行末のセミコロンが不要
    * ifの後のカッコが不要
    * ループはforのみで行い
    * 関数が複数の戻り値をサポートする
    * 型推論を利用した初期化が可能
* 並列処理のサポート
    * ゴールーチンやチャンネルを使って、簡単に並列処理を実装できる
* マルチコアプログラミングのサポート
    * Go言語実行時に使用するコア数を指定できる
* ソースコードのフォーマット
    * go fmtコマンドを実行することで、コードを整形してくれる

## 資料とサイト
* 公式サイト／日本語訳サイト
    * https://golang.org/
    * http://golang-jp.org/
* チュートリアル
    * https://go-tour-jp.appspot.com/welcome/1
    * https://golang.org/doc/effective_go.html
    * https://github.com/golang/go/wiki/CodeReviewComments
* リファレンス
    * https://golang.org/ref/spec
    * 翻訳： http://golang.jp/go_spec
    * http://go.shibu.jp/index.html
* 本
    * [The Go Programming Language](http://www.gopl.io/)
    * https://github.com/dariubs/GoBooks
    * http://openmymind.net/assets/go/go.pdf
* package manager
    * https://github.com/golang/go/wiki/PackageManagementTools

# 感想
* Go言語は、パフォーマンスが高くて、並列処理の実装しやすい
* 現在は、よく使っているrubyは、上記のメリットがないはずと思う
* erlangなど並列処理しやすい言語があるが、googleによって開発されたGo言語は好き（googleファン）
Ubuntuで日本語入力するためにしたこと

#概要
すごく初歩的ですが、ダウンロードしてそのまま入れたUbuntuで日本語入力できなかったので、下記処理をしました。

#やること
1. Terminalを起動（画面左の黒いやつ、Windowsでいうコマンドプロンプト）
2. コマンドとして「sudo apt-get install kasumi ibus-anthy」を入力<BR>（コピペで可、Virtualboxなら、デバイス>クリップボードの共有>双方向すると簡単）
3. アカウントのログインパスワードを入れる
4. 続けるか聞かれるのでYを入力してEnter　（しなくてもよさそう）
5. 終わったら再起動
6. System Setting（画面左の歯車）→TextEntry
7. Input source to use:の入ってるやつの下の＋を押す
8. japaneseと入力してjapanese(Anthy）をを追加(Add)する
9. ついでにもともと入ってたJapanese　←無印　を消しておくと便利
10. 入力するときに Windowsキー + Spaceキー で切り替えられる

##スクリーンショット
だいたいこんな感じ
![VirtualBox_JapInput1.png](https://qiita-image-store.s3.amazonaws.com/0/124833/6b16b304-d793-bbb3-abbe-17c0162f0fc6.png)

![VirtualBox_JapInput2.png](https://qiita-image-store.s3.amazonaws.com/0/124833/75965087-45b9-7930-c57e-3551fd6c9f18.png)


#情報源

[日本語表示と入力  CentOS 6.5>Linux >Think deeply,Do less, More effective](http://kwski.net/linux/208/)
[ 日本語の設定 Linux入門](http://linux.keicode.com/linux/japanese.php)
[MacでUbuntuを快適に使う](http://qiita.com/RyoheiMorimoto/items/a82369a83c100a646cce#%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E7%92%B0%E5%A2%83%E3%81%AE-mozc-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
Google URL Shorter を Node.JSから使用する

# ゴール
スクリプト(Node.JS)で短縮URLを取得する。
# 目的
Physical-WEBでURLを送信する場合の文字数制限に対応する為。
# 環境
raspberry pi2(jessie)
node v0.12.6
npm 2.11.2
nodebrew 0.9.5
#手順
##(1) goo.glのインストール
https://www.npmjs.com/package/goo.gl
・npmを使って
$ npm install goo.gl
・readmeにあるように
$ goo.gl www.google.com
Google requires an API key. See https://developers.google.com/url-shortener/v1/getting_started#auth
・言われました。そこで…
##(2) Google URL Shortner API key の取得
https://developers.google.com/url-shortener/v1/getting_started#auth
・プロジェクトを作成。名前は"Physical-WEB TEST"とした。
・"有効" ⇒ "認証情報に進む" ⇒ プロジェクトへの認証情報の追加ページに飛ぶのでオプションを選んで認証KEYを作成。
$ goo.gl www.google.com -k '認証KEY'
http://www.google.com -> http://goo.gl/fbsS
・上手くいった(^^♪
##(3) 実際にNode.JSから使ってみる
$ cat test_shorterUrl.js
var googl = require('goo.gl');

// Set a developer key
googl.setKey('認証KEY');
// Get currently set developper key
googl.getKey();

googl.shorten('https://developers.google.com')
    .then(function(shortUrl) {
        console.log(shortUrl);
    }).catch(function(err) {
        console.log(err.message);
    });

$ node test_shorterUrl.js
https://goo.gl/DkYLM

#結果
・以上で短縮URLを取得することが出来た。
git ls-remote --heads の --headsって何だ

git ls-remote　の機能とオプションの意味がわからなかったが、わかった。(たぶん

git ls-remote 
リモートリポジトリのコミットIDを取得する


git ls-remote --heads
リモートリポジトリの各ブランチの先頭コミットのIDを取得してくるっぽい

git ls-remoteを叩くと、
コミットID  ref/heads/ブランチ名1
コミットID  ref/heads/ブランチ名2
コミットID  ref/tags/....

などと返ってくるが、
こんなかから、ref/heads/のみを取ってくるのが、--heads オプション

refはリファレンスのこと。

リファレンスを、紐付け、ポインター、簡易的な指定方法などと解釈するとわかりやすいかも。

コミットは長ったらしいIDで表されるが、僕らは別の方法でそれを表現する。
それがリファレンス。
リファレンスにもいくつか種類がある。
そのうちの一つが、特定ブランチの一番先頭にあるコミットさん達(=heads)のこと。

[コミットID1　ref/heads/ブランチA]　　という表記は、
ブランチAの先頭コミットがこのコミットのリファレンスであることを示してる

前述のように、リファレンスには種類がある
headsの他に、tagsとか。

gitには、　tagの機能もあるっぽいのです。
これもあるコミットを簡易的に特定するリファレンスになるっぽい

・ブランチの先頭　/heads
・タグ /tags

この二つはリファレンス。

以上です。


あとがき
headsってわかりにくいですよね。
初心者の自分には、HEADと混合してしまって泣きたくなります。
Xamarin Studioのネームスペースの付け方をVisual Studio風にする

Priferences→.Netの命名ポリシー

ネームスペースをディレクトリ名に関連づけるにチェック
rootにデフォルトネームスペースを使用にチェック
ディレクトリ構造→階層構造にチェック

![76fb961a21f2386425e10bbf9430372b.png](https://qiita-image-store.s3.amazonaws.com/0/99291/c82bca04-8e10-4736-6619-bf8e58171c17.png)
Eclipse Collections Kata をやるにあたって知っておくとよさげなこと

# 前書き
JavaDayTokyo 2016でゴールドマン・サックスさんのセッションを受けて、[Eclipse Collections](https://www.eclipse.org/collections/ja/) に興味を持ったのでチュートリアルとして提供されている Eclipse Collections Kata を[ダウンロード](https://github.com/eclipse/eclipse-collections-kata)してみた。

# Eclipseでの始め方
1. [配布サイト](https://github.com/eclipse/eclipse-collections-kata) の下の方にkataをzipでダウンロード出来るところがあるので、そこからダウンロードする。
2. maven プロジェクトとしてcompany-kata、あるいはpet-kataをインポートする。
3. src/test/java 配下にテストクラスがあるので上から順番に解いていく。

# 最初にやっておくといいこと
eclipse collectionsのソースはgithubに上がっているのだけど、疑問に思ったコードを毎回githubに見にいくのは面倒…
でも、mavenのソースダウンロード機能を使うと、mavenがソースをダウンロードしてくれるのでeclipse上で見られる！
※mavenリポジトリ上のソースなので、取り込むタイミングによっては最新ではないかも。

参考）
[依存しているライブラリのソースをダウンロード](http://qiita.com/marcie001/items/cc85d0d32a591c6e6cfd)

# その他参考
[GS Collections Kata で Eclipse Collections をはじめよう！](http://qiita.com/enk/items/e533dce664e18c431bc4)
この中に記述があるpdfに答え含めて載っているのでPDFはダウンロードしておいた方がよさげ。
1回目は答えを見ても仕方ないと思う。
2回目以降に強くてニューゲームすればいい。

# ちょっと気になってること
company-kata の Exercise3Test.java で、

```java
Verify.assertInstanceOf(String.class, actualItemNames.getFirst());
```
getFirst();が非推奨になっているのだけど（ver.6.0から非推奨になったみたい）今のバージョンでの書き方は何だろう？
Android実機デバッグのデプロイでINSTALL_FAILED_UPDATE_INCOMPATIBLEというエラーがでる問題

Androidの実機に転送中にINSTALL_FAILED_UPDATE_INCOMPATIBLE というエラーがでて失敗する。ぐぐってみると一旦端末からアプリを削除すれば良いと書いてあったけどそれもだめ。

もう少し調べてみると通常はその方法で良いみたいだけど、開発環境を引っ越した場合などは元の開発環境でアプリを転送しなおして削除する必要があるようで、前の環境でアプリを転送後削除してから新しい環境で作り直したら解決した。

## 発生環境

WindowsのVisualStudio2015からMacのXamarinStudioへ引っ越し

開発
Xamarin.Android
実機
ZenFone Go

## 発生条件

1. 異なる2つの開発環境の同一プロジェクトで同じ実機を使う
2. アプリを削除せずに開発環境を変更する

## 解決方法

すでに同じアプリがインストールされている場合にでるエラーらしいが単純にアンインストールしても解決しない場合がある

1. （端末）設定→アプリ→該当アプリ削除
2. 以前の環境でデバッグ実行で実機にインストール
3. （端末）設定→アプリ→該当アプリ削除
4. 新しい環境でデバッグ実行

要は引越し前にあらかじめ削除しておけば大丈夫みたい
ただ削除しないまま新しい環境でデバッグ実行するとこのエラーがでてしまって、そうなるとアプリ削除しただけでは解決しなくなるので上記の対処が必要。
前の環境を残してなかった場合はどうなるんだろうか…
ScalaでJavaFXのHello Worldのテンプレート

よく使うのでここに健忘録。

[JavaFXサンプル・アプリケーション・スタート・ガイド](http://docs.oracle.com/javase/jp/8/javafx/get-started-tutorial/get_start_apps.htm#JFXST804) の Hello WorldをScalaにすると以下の実装になる。

```scala
import javafx.application.Application
import javafx.event.{ActionEvent, EventHandler}
import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.layout.StackPane
import javafx.stage.Stage

object Main extends App {
  Application.launch(classOf[Main], args: _*)
}

class Main extends Application {
  override def start(primaryStage: Stage): Unit = {
    val btn = new Button()
    btn.setText("Say 'Hello World'")

    btn.setOnAction(new EventHandler[ActionEvent] {
      override def handle(event: ActionEvent): Unit = {
        println("Hello")
      }
    })

    val root = new StackPane()
    root.getChildren.add(btn)

    val scene = new Scene(root, 300, 250)
    primaryStage.setTitle("Hello World!!")
    primaryStage.setScene(scene)
    primaryStage.show()
  }
}
```

実行すると、以下の様なダイアログが表示される。

<img width="307" alt="スクリーンショット 2016-05-26 13.29.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/2382/eee68c75-e9de-337c-bbfa-b6d9273b11d7.png">

あとは [JavaFX2.2のAPIの日本語訳](https://docs.oracle.com/javase/jp/8/javafx/api/) を見ながらゴリゴリ書いていく。なぜかGoogleの検索で一番にヒットしない。