OmniAICreator/Qiita-1.07M huggingface dataset:
deep learning from scratch

#概要
deep learning from scratch やってみた。
偶数分類、やってみた。

#参考にしたページ
http://qiita.com/Matchlab/items/25dd57c40c8bea09b64e

#写真
![zero1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/82e07a3d-0e08-6e1b-151a-096280b066da.png)


#サンプルコード

```
import numpy as np
import matplotlib.pyplot as plt

TRAIN_DATA_SIZE = 100
IN_SIZE = 8
OUT_SIZE = 3
HIDDEN_LAYER_SIZE = 6
LEARNING_RATE = 0.1
ITERS_NUM = 1001

def odd_encx(i):
	return np.array([i >> d & 1 for d in range(IN_SIZE)])

def odd_ency(i):
	if i % 2 == 0:
		return np.array([1, 0, 0])
	else:
		return np.array([0, 1, 0])

x = np.empty((0, IN_SIZE))
y = np.empty((0, OUT_SIZE))
for i in range(200):
	a = odd_encx(i)
	b = odd_ency(i)
	x = np.vstack((x, a))
	y = np.vstack((y, b))
train_x = x[TRAIN_DATA_SIZE : ]
train_t = y[TRAIN_DATA_SIZE : ]
test_x = x[ : TRAIN_DATA_SIZE]
test_t = y[ : TRAIN_DATA_SIZE]

def relu(x):
	return np.maximum(x, 0)

def softmax(x):
	e = np.exp(x - np.max(x))
	if e.ndim == 1:
		return e / np.sum(e, axis = 0)
	elif e.ndim == 2:
		return e / np.array([np.sum(e, axis = 1)]).T
	else:
		raise ValueError

def cross_entropy_error(y, t):
	if y.shape != t.shape:
		raise ValueError
	if y.ndim == 1:
		return - (t * np.log(y)).sum()
	elif y.ndim == 2:
		return - (t * np.log(y)).sum() / y.shape[0]
	else:
		raise ValueError

def forward(x):
	global W1, W2, b1, b2
	return softmax(np.dot(relu(np.dot(x, W1) + b1), W2) + b2)

W1 = np.random.randn(IN_SIZE, HIDDEN_LAYER_SIZE) * np.sqrt(2 / IN_SIZE)
W2 = np.random.randn(HIDDEN_LAYER_SIZE, OUT_SIZE) * np.sqrt(2 / HIDDEN_LAYER_SIZE)
b1 = np.zeros(HIDDEN_LAYER_SIZE)
b2 = np.zeros(OUT_SIZE)

timestep_learning = []
for i in range(ITERS_NUM):
	y1 = np.dot(train_x, W1) + b1
	y2 = relu(y1)
	train_y = softmax(np.dot(y2, W2) + b2)
	los = cross_entropy_error(train_y, train_t)
	if i % 100 == 0:
		timestep_learning.append(los)
	a1 = (train_y - train_t) / TRAIN_DATA_SIZE
	b2_gradient = a1.sum(axis = 0)
	W2_gradient = np.dot(y2.T, a1)
	a2 = np.dot(a1, W2.T)
	a2[y1 <= 0.0] = 0
	b1_gradient = a2.sum(axis = 0)
	W1_gradient = np.dot(train_x.T, a2)
	W1 = W1 - LEARNING_RATE * W1_gradient
	W2 = W2 - LEARNING_RATE * W2_gradient
	b1 = b1 - LEARNING_RATE * b1_gradient
	b2 = b2 - LEARNING_RATE * b2_gradient
test_y = forward(test_x)
plt.plot(timestep_learning)
plt.savefig("zero1.png")
plt.show()
for i in range(1, 100):
	print (i, 'odd' if test_y[i][0] < 0.5 else 'even')

```

#成果物

https://paiza.io/projects/Y66JKZYFLC0-fMroZ5p7-A
GO言語のcompressパッケージで陥りがちな罠

GO言語の便利な機能に `defer` があります。
共通の後処理を1つにすることが出来るので、ちょっとこの言語を齧り出すと、何も考えずに片っ端から、

```go
a.Open()
defer a.Close()
b.Open()
defer b.Close()
```

という書き方をするようになります。

大抵の場合はこれで問題ないのですが、compress下のパッケージに罠が仕掛けられており、ワタシのように、何も考えずに使うと見事に引っかかります。
下記が、迂闊に何も考えずに書いたコードです。

```go

import (
   // ...
  "compress/gzip"   // compress/zlib等でも同様
   // ...
)

func compress(data string) ([]byte, error) {
	b := new(bytes.Buffer) 
	gz := gzip.NewWriter(b)
	defer gz.Close() // これ

	if _, err := gz.Write([]byte(data)); err != nil {
		return nil, err
	}
	if err := gz.Flush(); err != nil {
		return nil, err
	}
	return b.Bytes(), nil
}

```

上記のコードの場合、

1. gz.Write()
1. gzFlush()
1. b.Bytes()
1. gz.Close()

の順に処理されます。
Flushを呼んでいるので、一見問題ないように思うのですが、このcompress下のパッケージ、Close時に最終的なデータを確定します。なので、値が確定する前に値を返してしまい、それが圧縮後のデータと思い込んで保存すると、解凍する際に、 “unexpected EOF” エラーという地獄が発生します。
地獄に落ちずに畜生界に留まり続けるためには、下記のように、しっかりCloseする必要があります。

```go

func compress(data string) ([]byte, error) {
	b := new(bytes.Buffer) 
	gz := gzip.NewWriter(b)

	if _, err := gz.Write([]byte(data)); err != nil {
        gz.Close()
		return nil, err
	}
	if err := gz.Flush(); err != nil {
        gz.Close()
		return nil, err
	}
    gz.Close() // これ
	return b.Bytes(), nil
}

```
active adminで特定のアクションの時だけ独自のhtml要素を用意する

railsで管理画面を作るには[active admin](https://github.com/activeadmin/activeadmin)が便利ですね。

ちょっと手の込んだことをし始めると、active adminに用意されているhtmlの要素とは別に特定のactionでフォームなどのhtml要素を表示させたくなります。

例えば、index actionでform要素を表示させたい場合には

```ruby
# app/admin/hogehoge.rb
index do
  body do
    render "partial_form"
  end

  ...

end
```

```erb
<%# app/views/admin/hogehoge/_partial_form.html.erb %>

<%= form_tag({ action: :index }, { method: :get }) do %>
  <%= text_field_tag(:text_field) %>
  <%= submit_tag(:submit) %>
<% end %>
```

のようにすると、index actionに独自のformを用意できる。
partial使ってるのがポイントで

```ruby
body do
  form_tag({ action: :index }, { method: :get }) do
    text_field_tag(:text_field)
    submit_tag(:submit)
  end
end
```
のように書くとtext fieldが表示されず、ボタンが1つ表示されるだけになる。
アプリに組み込んだJuliaを0.6に対応するには

# 背景

- [Julia 0.6 リリース! - Qiita](http://qiita.com/bicycle1885/items/f4bf03618775af13370a)

にて、0.6のリリースを知ったので、

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Julia0.6になったから早速travis ciでmruby-juliaビルドしてみたらやられたｗ　jl_initが仕様変更されて、文字列引数を取らなくなったorz代わりの関数が新設されてるのかぁ / “Teach jl_in…” <a href="https://t.co/NVmK06qpY8">https://t.co/NVmK06qpY8</a></p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/877050026140160000">2017年6月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 0.6に対応するにあたり変更が必要だった箇所

## jl_initの引数が変更に


### 変更前

```c
jl_init(JULIA_INIT_DIR "/../bin");
```

多分、0.6以前の公式のドキュメントには
jl_init(JULIA_INIT_DIR)との記述があるが、この記述だとPkg.add系が正常に動かない。

### 変更後

```c
jl_init();
```

Julia自身が自分のライブラリのパスを自力で取得するようになった。
また、新規に、旧jl_init同様に利用者がパスを明示的に指定するAPIも新設されている模様。

##　jl_showが廃止された

もともと問題があったようで、

- https://github.com/JuliaLang/julia/pull/21299

このプルリクで削除された。

代わりに、上記のURLのように

```c
jl_call2(jl_get_function(jl_base_module, "show"), jl_stderr_obj(), jl_exception_occurred());
```

とjl_showより低レベルの以前からあるJuliaのAPIを利用することで対応可能。

# Windowsではスタックを8MBに増やす必要がある

julia 0.6.0では

- [embedding crash (?) on Windows · Issue #22320 · JuliaLang/julia](https://github.com/JuliaLang/julia/issues/22320)

にあるように

```shell-session
editbin /stack:8000000 juliaGaHaitteru.exe
```

とスタックのサイズを増やす必要があった。

# 関連記事

- [mruby-juliaでPythonもmrubyから呼び出せるようになった](https://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
- [IJuliaをHerokuの無料枠で動かした](https://abrakatabura.hatenablog.com/entry/2016/03/07/205816)
- [JulialangにHTTP2サーバーをさせたら](https://abrakatabura.hatenablog.com/entry/2015/12/10/070837)
- [Julia言語で任意の点を散布図に描画するには](https://abrakatabura.hatenablog.com/entry/2016/11/12/081354)
- [1/7がつくる楕円をJulia言語でプロットする](https://abrakatabura.hatenablog.com/entry/2016/10/29/075535)
- [aobenchをjuliaでやってみた](https://abrakatabura.hatenablog.com/entry/2016/07/15/074022)
- [Juliaで日本語のワードクラウドをやってみた](https://abrakatabura.hatenablog.com/entry/2018/06/24/102702)
自習環境としてのRaspberry Pi

はじめまして。@atworks です。
[Qiitadon](https://qiitadon.com)を見ていたら僕も投稿してみたくなったので書いてみます。
今回は僕の自習環境について。

# 背景
普段、しがないプログラマとして、どこぞの会社に常駐して開発作業に勤しんでおります。
現在いる会社では、インターネットへのアクセスは可能ですが、見られないウェブサイト、ウェブサービスなんかもバリバリあるような環境です。

開発内容は、極めてレガシーなWebサービスです。もうちょっとモダンなことやりたいんですよね。なのでお勉強の日々です。

平日はノートPCを持ち歩いたりも出来ないので、Raspberry Pi3で勉強しています。
最初は手持ちのAndroid機にtermuxというターミナルエミュレータアプリを入れてみたのですが、トリッキーなのでバイナリも少なく、termuxを使えるようにするだけで手一杯でした。
開発環境は外部にあったほうが使いやすいなと感じ、しかしクラウド環境となるとパケット代もかかるし、ということで行き着いたのがRaspberry Piというわけです。

# 環境紹介
というわけで僕の勉強用開発環境はこんな感じです。RaspberryPi3 ModelBに2000mlAhのモバイルバッテリーをつないでスマートフォンからアプリ（ConnectBot）で接続してます。。KindleFireで本を見ながらお勉強という内容です。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184265/b4f1a9b7-5b72-70b0-740d-a921991a6578.png)

手持ちのモバイルルーターに繋がるようにし、固定IPアドレスにしています。キーボードはMicrosoft Universal Mobile Keyboardです。

バッテリーは5V2.4A出力可能を売りにしてるものですが、RaspberryPi3 ModelBの最大消費電力は2.5Aらしく、ちょっとヒヤヒヤしながら触ってます。
まあ、消費電力が大きいのはUSBハブ機能の部分らしく、USBポートへの電源供給とかがなければだいじょぶかなとは思ってます。 

![982aa7b2c2044b33.jpg](https://qiita-image-store.s3.amazonaws.com/0/184265/a7a55b42-94c6-f6d4-ff2c-62d02ea1af91.jpeg)

電源はなんとかなってますが、USBのコネクタが緩くて、起動したままカバンに入れていると電源オンオフを繰り返している場面がありました。おそらくそれが原因でSDカードが1回壊れてしまい、ファイルシステムが壊れてKernel Panicになってしまったこともあります。悩ましいですね。
とりあえず、100円ショップでメッシュなケースを買い、それに入れることで無駄な電源オンオフは軽減されました。


VimはパッケージのままだとPythonとかLuaとかを利用しているプラグインが動かないので、↓の方法をそのままやってビルドしてます。
[vim-jp » Linuxでのビルド方法](http://vim-jp.org/docs/build_linux.html)

# 家での使用法

家のWiFiにも繋げられて、同じ固定IPにすることでアクセスしやすくしています。

家ではPCから接続もしてますが、寝る間際とかはiPad Pro（2015年版12.9インチ）でやってます。

![1e5a730de306bd5b.jpg](https://qiita-image-store.s3.amazonaws.com/0/184265/41134974-1528-103c-d0a5-ea106dc0346f.jpeg)

アプリはCodaで、ターミナル機能を使用。画面分割出来て便利！と思いきや電子書籍アプリはSplitViewに対応していないんですよね。
なので電子書籍を画面キャプチャし、Pagesアプリに貼り付けて参照してます。
これだとキーボードで本が隠れなくて便利です。


工夫次第でいろんな自習ができますよね！是非！
てはじめに（編集中）

genericsの基本について

例）

```
List<String> list = new ArrayList<>();
list.add("aaa");
list.add(1); //コンパイルエラー
```

- [x] List に　入る型を明示できる
- [x] 

ジェネリック型クラス内で型変数Eをnewするのは禁止

```
class Owner<E>{
  E createObject(){
    return new E();
  }
}
```

コンパイルエラー

- [ ] タスク1
- [x] タスク2

[Qiita](http://qiita.com "てすと")

<dl>
  <dt>型パラメータ</dt>
  <dd><>の中の変数部分。</dd>
  <dt>型変数</dt>
  <dd>型パラメータに修飾される変数</dd>
  <dt>型引数</dt>
  <dd>ジェネリック型を使用する際に<>に渡す具体的な型。List<String>のString部分</dd>
  <dt>パラメータ化された型</dt>
  <dd>型引数を渡して実際にしようできる型。List<String>そのもの</dd>
</dl>

List<String> を宣言すると

```
class List<String> {
	private String element;
	String get() {
		return element;
	}
	void put(String e) {
		this.element = e;
	}
}
``` 

が内部的に創出される。（未確定）
[めも]Android Studioで、テスト(androidTestの方)する時に出るエラー

意外とはまるので、めも。

#エラー:zero-argument constructorの方
コードの自動生成で起こりがちなエラー。

表示されるエラー:
>java.lang.Exception: Test class should have exactly one public zero-argument constructor

##対処法: 引数なしの(デフォルト)コンストラクタを作る。

```
CalculatorInstrumentationTest() {
    super(CalculatorActivity.class);
}
```

サンプルコード全体は、[Testing Support Library / AndroidJUnitRunner / JUnit サポート](https://developer.android.com/topic/libraries/testing-support-library/index.html#ajur-junit) を参照して下さい。※そのままでは動きません。
(動かすためにコンストラクタを作ろうとしてはまるエラーですが・・)

##原因: コードを自動生成すると、引数付きのコンストラクタが生成されるので。

自動生成されたコードの例 (エラーが発生します)

```
CalculatorInstrumentationTest(final Class<CalculatorActivity> cls) {
    super(cls);
}
```

##参考:
[Stackoverflow - Why is the Android test runner reporting “Empty test suite”?](https://stackoverflow.com/questions/14381694/why-is-the-android-test-runner-reporting-empty-test-suite)

----
#エラー:Empty test suiteの方
テストの設定がおかしいと発生するエラー。

表示されるエラー:
>Test running failed: Unable to find instrumentation info for: ・・・
Empty test suite.

##対処法: テストの設定を変更する
1.Run / Edit Configurations...
2.Android Testsなどの下にある、各テストの設定を開く
3.General / Specific instrumentaion runner (optional)の設定を、AndroidJUnitRunnerに変更する。
※通常は、デフォルトでこの設定になっているはずです。

##参考:
[AndroidのTestまとめ](http://qiita.com/shikajiro/items/bc1c3f29356ca17297e9#%E7%9B%B4%E3%81%90%E3%81%AB%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%8B)
直ぐにテストを実行できない問題にはまる のあたりを参照。
オープンソースカンファレンス2017沖縄にいってきた！

土曜日はこちらに参加してきました！
[オープンソースカンファレンス2017 沖縄](https://www.ospn.jp/osc2017-okinawa/)


各ブースでお話聞いてみたことのメモ 🌼

#Jet BRAINS
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/171147/1fff20f0-2bb5-84f4-3488-79a8858defcb.jpeg">

今ホットな話題を教えてくれた。
内容は「 **統合開発環境上で、GitHubへの操作が可能** 」というもの！

実際に操作しているところを見せてもらいましたが、
GitHubへのコメントの閲覧、そして追加が統合開発環境上でできていました！

ひとつの画面上で確認できるため、ブラウザと統合開発環境をいったりきたりしなくてOKだという点がすごく便利だなあ～と感じた。

詳しくはJetBrainsのHPを参照！
[Upsourceを使ってできること](https://www.xlsoft.com/jp/products/jetbrains/upsource.html)

＊
そして今回ご縁もあって、わたしの会社でも
ハンズオン講座を開いてくれることになりました！なんて嬉しい！！
またこちらも記事に書けたらなと思います 🌼 お楽しみに！


#Apache Camel  と LibreOffice
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/171147/2ea50406-503f-25e2-14f6-ccdcdc46a215.jpeg">
####**Apache Camelについて**
自分で内容を整理してみると、意外と理解できていなかった。。
oh..

検索してみるとdaikuroさんの記事に分かりやすく「Camelでできること」がまとめられているようなので引用しています↓
[Apache Camel (Java)を使うと開発が楽になる７つの理由](http://qiita.com/daikuro/items/5e22c78c0342fde04b87)


####**LibreOfficeについて**
つづいてはLiberOfficeさん。

MicrosoftさんのWordやExcel、PowerPointなどを普段利用していますが、
同じように「書く」「表にする」「スライドをつくる」がLiberOfficeさんのツールでもできるのだとか！

さらにチームで連携できたり。便利！

ざっくりですが、いろいろな仕組みがあるとのこと！

海外では国の機関レベルでの利用がされていたりと
活用事例もあり、日本でも導入事例はいくつかあるとお話してくれた。( LibreOfficesさんの歴史ももう10年以上にもなるとか )
ためしに一度つかってみようと思う。

#MySQL
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/171147/6b3b79ec-2730-2833-8b84-3a3717a7cf8c.jpeg">

つづいてはMySQLさんのブースへ。

お話をきいていると驚いたことが！
実は2年ほど前に、Java Küche の勉強会で講師としていらっしゃってくれていたとか。
[RDB 最前線 2017 ( Doorkeeper情報 )](https://java-kuche.doorkeeper.jp/events/29720)
＊Java Küche は沖縄で活動しているエンジニアのコミュニティです。

わたしも Java Küche で活動に参加させてもらっていることもあり、
RDB勉強会としてまた開催できたら嬉しいなと思いました。

MySQLやOracleなどなど。それぞれの特徴、使い分け、最新情報について学べる勉強会ニーズあるかな。( ← 個人的には参加したい！ )
その辺も相談しながら企画していきたいなー！
#グッツ編
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/171147/4443670d-60c5-82ad-5ffc-744fdf7a82d9.jpeg">
会場でたくさん資料をもらいました！



今回は急ぎだったこともあり、講演会は聞けませんでした。
また来年も参加しようと思います！
[2017年のタイムテーブルも盛りだくさんでした ←](https://www.ospn.jp/osc2017-okinawa/modules/eventrsv/?id=1&noform=1)





＊
次回はうちの会社でも出展側にまわれるかな？
いろいろ案を練っていかなくちゃ 🌼

以上です！
【使えなくなりました💧】wikipediaの背景を変える

# 追記
キモの拡張機能が使えなくなったので、この記事の内容はおそらく再現しないです

![qiita1.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/0d59b89a-a0c1-d286-ed9e-90d0dbbee278.png)

⏰この記事の内容は約1分で実行できます。

【注意】素人が書いた記事です。なまあたたかいめでみてね

#まとめ
- 任意のwikipediaページの背景に好きな画像が出てくるようになる
- 猫でもわかる簡単さ
- chrome限定
- chromeの拡張機能ありき
- chromeの拡張機能「stylish」、便利

つまり

1. chrome開く
2. 拡張機能「stylish」入れる
3. 新規スタイルを作る
4. こぴぺ

でできる

#まとめない
##stylishを入れる
chromeで下のリンクに飛んで、chromeに追加をぽち
[Chrome ウェブストア](https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdn![qiita2.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/ec3406f1-e1dd-a36c-fd52-7abb74451510.png)
ngjfgmeleoegfcffe)

ウィンドウの右上（ツールバーの右端）のこれをぽち
![stylish.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/d7a54e29-c2d3-5ed8-8575-02b0e12c6183.png)

点点点をぽち、スタイルを作るをぽち


##スタイルを作る


名前つけて、適用先を決めて、コード書く、保存、以上

![qiita3.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/913412e4-a38f-7941-fc5d-dcb29ed49af9.png)
##コードの例

~~画像のurlにローカルを指定する方法がわからなかったので、
頭悪いなと思いつつどっかから拾ってます（本当に頭悪い）~~

ここでまとめました
[stylishでcssを弄るとき、background-imageをどこから拾うか](http://qiita.com/namahoge/items/cd33ffd3df36930d7a8d)

あとurlがhttpだと怒られてhttpsだと怒られなかったりするの注意

サイズとか位置は適当に

```css:wikipedia
[class*="mediawiki"]{background-image:url("https://i.imgbox.com/4q9m3xDi");background-size:1700px auto;background-repeat:no-repeat;background-attachment:fixed;background-position:left bottom;}
#mw-page-base{background-image:url("https://i.imgbox.com/4q9m3xDi");background-size:1700px auto;background-repeat:no-repeat;background-attachment:fixed;background-position:left bottom;}
#content{background-color:rgba(255,255,255,0.5);}
#mw-panel{background-color:rgba(255,255,255,0.5);padding-left:0px;margin-left:8px;}
#p-logo{background-color:rgba(255,255,255,0.5);left:0px;}
#mw-head-base{background-color:rgba(255,255,255,0.5);}
#firstHeading{background-color:rgba(255,255,255,0.3);}
```

少しばかしコメント付けてみる

```css:wikipedia
/* 見出しより上に背景画像をいれる*/
[class*="mediawiki"]{background-image:url("https://i.imgbox.com/4q9m3xDi");background-size:1700px auto;background-repeat:no-repeat;background-attachment:fixed;background-position:left bottom;}
/* 見出しより下に背景画像をいれる */
#mw-page-base{background-image:url("https://i.imgbox.com/4q9m3xDi");background-size:1700px auto;background-repeat:no-repeat;background-attachment:fixed;background-position:left bottom;}
/* メインコンテンツの背景を白くする */
#content{background-color:rgba(255,255,255,0.5);}
/* 左のリンクの背景を白くする＆余白が変だったので弄る */
#mw-panel{background-color:rgba(255,255,255,0.5);padding-left:0px;margin-left:8px;}
/* ロゴの背景を白くする＆余白が変だったので弄る */
#p-logo{background-color:rgba(255,255,255,0.5);left:0px;}
/* 見出しより上の背景を白くする */
#mw-head-base{background-color:rgba(255,255,255,0.5);}
/* 見出しの背景をさらに白くする */
#firstHeading{background-color:rgba(255,255,255,0.3);}
```

でした

#リンク
- 背景画像の本家様  
http://waka3.web.fc2.com/
- 背景に使った画像  
https://i.imgbox.com/4q9m3xDi
- stylish 提供サイト  
https://userstyles.org

#ヒトリゴト
初めて書いた記事です。読んでくださってありがとうございます

```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

（精一杯小声で）
　　$\textsmall{い　い　ね　く　だ　さ　い}$




ヒトリゴトだよ（恥ずかしいこと　聞かないでよね　:notes:）
html entity to UILabel.text for emoji HTMLエンティティな絵文字をUILabelに表示する

```objc
NSString *nowComment = @"&#12345;" //example
NSData *comData = [nowComment dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *attributedOptions = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                               NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding],
                                                };
NSAttributedString *attributedText = [[[NSAttributedString alloc] initWithData:comData options:attributedOptions documentAttributes:nil error:nil] autorelease];
label.text = attributedText.string;
```

重いです。UITableViewなどでスクロールのたびに作り直すとスクロールがかくつきます。
laravel5.3以下でselectタグ内のoptionタグにプロパティを追加出来るカスタムタグ

5.4からはLaravelCollectiveのhtml helperが提供してくれる昨日なので以下は用済み。
5.3以下のlaravelを使っている場合はoptionタグにプロパティを追加することが出来ないため以下のようにカスタムタグを作成する必要がある。

コード自体は [LaravelCollective](https://github.com/LaravelCollective/html/blob/5.4/src/FormBuilder.php#L571　LaravelCollective) から持ってきただけ。
なので基本的には5.4にアップデートをしてもカスタムタグを呼び出している箇所を通常のHtmlHelperのselectメソッドに書き換えれば問題なく動くはず。

## ソースコード

### カスタムタグ

```php:resources/macros/select_addable_option_property.php
<?php
Form::macro('selectAddableOptionProperty', function(
        $name,
        $list = [],
        $selected = null,
        array $selectAttributes = [],
        array $optionsAttributes = []
    ) {
        $selected = $this->getValueAttribute($name, $selected);
        $selectAttributes['id'] = $this->getIdAttribute($name, $selectAttributes);
        if (! isset($selectAttributes['name'])) {
            $selectAttributes['name'] = $name;
        }
        $html = [];
        if (isset($selectAttributes['placeholder'])) {
            $html[] = $this->placeholderOption($selectAttributes['placeholder'], $selected);
            unset($selectAttributes['placeholder']);
        }
        // laravel 5.4 option method
        $option = function($display, $value, $selected, array $attributes = []) {
                $selected = $this->getSelectedValue($value, $selected);
                $options = ['value' => $value, 'selected' => $selected] + $attributes;
                return '<option'.$this->html->attributes($options).'>'.e($display).'</option>';
        };
        // laravel 5.4 optionGroup method
        $optionGroup = function ($list, $label, $selected, array $attributes = []) use ($option){
            $html = [];
            foreach ($list as $value => $display) {
                $html[] = $option($display, $value, $selected, $attributes);
            }
            return '<optgroup label="'.e($label).'">'.implode('', $html).'</optgroup>';
        };
        // laravel 5.4 getSelectOption method
        $getSelectOption = function($display, $value, $selected, array $attributes = []) use ($option, $optionGroup){
            if (is_array($display)) {
                return $optionGroup($display, $value, $selected, $attributes);
            }
            return $option($display, $value, $selected, $attributes);
        };
        foreach ($list as $value => $display) {
            $optionAttributes = isset($optionsAttributes[$value]) ? $optionsAttributes[$value] : [];
            $html[] = $getSelectOption($display, $value, $selected, $optionAttributes);
        }
        $selectAttributes = $this->html->attributes($selectAttributes);
        $list = implode('', $html);
        return "<select{$selectAttributes}>{$list}</select>";
});
```

### 呼び出し側ソースコード

```php:index.blade.php
{!!
Form::selectAddableOptionProperty(
	"name_property",	// name属性
	[					// 選択項目
		1=>"one",
		2=>"two",
		3=>"three"
	],
	null,				// selectedのindex
	$properties,		// selectタグのプロパティ
	[					// 選択項目のvalue値 => ["属性名" => "属性値"]
		1=>["class"=>"one class name",
		2=>["class"=>"two class name"],
		3=>["class"=>"three class name"]
	]
)
!!}
```

呼び出し側のコードは実務で作ったやつをサンプルように引数を加工したので動かなかったら勘弁な！！！
開発環境をMacからLinuxに移行するためのメモ

## 背景
* Docker-for-mac が `:cached` 実装されたけどそれでもまぁ遅いなぁと思ってたらLinuxだと早いよって聞いて、せやなって思った。
* Macbook 12" (2016 Early) にデュアルブートでLinux入れようとしたけどドライバが未対応だった（くっそ）
* 諦めかけてたら会社に落ちてたWindowsマシン借りれたので移行してみた

## ディストリビューション
* Zorin OSをチョイス
* 理由は、なんかかっこいいから。Ubuntuベースが良かったけどUnityやだなぁと思ってたらなんかマシそうだった。
* https://zorinos.com/

## インストール
* USBメモリ（借り物）にバーンっと焼き上げて、ドーンっとパーティション切ってインストール
* ふつうだった

## shell
* fish
* oh-my-fishいれる
* `omf install peco` でペコれるようにしておく
* .configとかは適当に持ってくる。適当に。 
* `omf install flash` でワイが大好きflashテーマいれとく

## Intellij Idea
* 適当に `~/Applications/intellij-idea-2017-1-4` みたいなディレクトリほってそこにポイッ
* 毎回 `idea.sh` 叩くとかないわぁって思ったので以下をメリッと作ってDesktopから叩けるようにする

```~/.local/share/applications/.intellij-idea-2017-1-4.desktop
[Desktop Entry]
Version=1.0
Type=Application
Name=IntelliJ IDEA 2017
Icon=/home/takyam/Application/intellij-idea-2017-1-4/bin/idea.png
Exec="/home/takyam/Application/intellij-idea-2017-1-4/bin/idea.sh" %f
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupWMClass=intellij-idea-2017-1-4
```
* Intellijの設定はMacからポイってもってきたけど、Keymapは使いまわせないから設定しなおした

## Docke
* https://docs.docker.com/engine/installation/linux/ubuntu/
* 何も考えずに↑に書いてあるとおりにやったらインストールできる
* `docker-compose` はバイナリ持ってくるか`pip`で入れろって書いてあった
* https://docs.docker.com/compose/install/
* `sudo` しなきゃいかないことくらいで、基本的にハマるぽいんとはなかった

## トラックパッド
* Macbookに慣れてるので1本指は左クリック、2本指は右クリック、がよかった
* Windowマシンなのでご丁寧に右下あたりは1本指クリックでも右クリックにしてくれる（くっそ）
* 以下のファイルをおいてスタートアップに登録するこで右クリックエリアを消し去った
    * 参考） https://askubuntu.com/questions/602193/how-to-disable-right-click-on-the-touchpad

```~/.synaptics-custom-settings.sh
#!/bin/bash
synclient RightButtonAreaLeft=0
synclient RightButtonAreaTop=0
```

## キーボード
* ハードウェア的には普通の109っぽい日本語キーボードだったけど指が受け付けてくれなかったので英字キーボードで利用
* どこで設定するのが正しいのかわからんかったけど、 `Fcitx設定` ってとこでキーボードのマークおして、英字に変更
* CapsLockは控えめに言って滅びればいいと思うんだけどくっついて来てたのでCtrlに変更
* TweakTool にCapsLockキーの扱い設定できる何かがあったのでぽちぽちしたら設定できた

### 細かいマッピング
* `xev` でキーコードはわかる
* `xmodmap -pke > ~/.Xmodmap` で設定吐き出せるしここから修正できる 
* つっても `add control = Muhenkan` の1行だけでOK
* `~/.profile` に `xmodmap ~/.Xmodmap` 書けばいいとの噂（未検証）

### 日本語入力
* Mozcを使う
* 「入力メソッド」とか「地域と言語」とかからなんかいい感じに設定
* 画面右下のMozcアイコンのプロパティからキーバインドはいい感じに設定する

## Forklift代替
* S3にGUIでアクセスしたかった
* MacだとForkliftつかってた
* 代替として DragonDisk ( http://www.s3-client.com/ )を一旦使ってみる

## Git
* diff-highlightに実行権限なかったりするのでつけとく
* `dpkg -L git | grep highligh` とかでインストールされてる場所さがしてぺろぺろ

## Sequelの代替
* IntellijのDatabaseツールでいいやってことにした（重いけど）

## ディスプレイ
* https://wiki.archlinuxjp.org/index.php/HiDPI
* Archのを参考に設定できた
* TweakToolだと整数しか指定できない気がする（気のせい？）

## 残タスク
* 行頭・行末・単語単位でのキャレットの移動のキーバインド
    * Ctrl+ <- -> で行頭・行末に
    * Alt+ <- -> で単語送り
    * みたいな感じでバインドしたい
    * .inputrc 周りなのかなーと思っていじいじしたけどなんかいい感じにできない
* Terminalのタブ切り替えをCtrl+Tabにしたい（なんかいい感じにできない）
* タッチパッドジェスチャー
    * https://askubuntu.com/questions/92169/touchpad-gestures-to-change-workspace


## 感想
* ZorinOSがWindows/Mac代替になるかと言うときつい
* つってもUbuntuよりはとっつきやすいんじゃって気分
* 使いづらいなぁ・・・と思うことの8割は指がこの日本語キーボードに馴染んでないだけなので慣れの問題
* 所詮LinuxなのでGUIの洗練具合とか、GUIで設定できること、みたいなところはアレでソレ
* Dockerのパフォーマンスは天と地。月とスッポン。マジ最高。
* うっ・・・うぅ・・・うっ！！って感じでwebpack-dev-server動いてたのが、うぅ・うっ！！！くらいになった感じ
Knowledgeをdebian8 jessieで動かすたったひとつの方法

# Knowledgeをdebian8で動かすたったひとつの方法

##参考
via http://qiita.com/laviee/items/afa82cbf5e36e85d45e3
via https://www.rosehosting.com/blog/how-to-install-tomcat-8-on-debian-8/

##apt-getで更新する

```bash
apt-get update && apt-get upgrade
apt-get install unzip wget
```

##java-packageでOracleのJava8を入れる
via https://wiki.debian.org/JavaPackage

####ユーザーで make-jpkg
```bash
sudo apt-get install -y libgl1-mesa-glx libxxf86vm1
make-jpkg jdk*
```
すごく時間がかかる。
####ルートでdpkg -i

```bash
dpkg -i oracle-java8*

update-alternatives --display java
update-alternatives --config java 
```

##UbuntuのJVMを入れる。

この作業はライセンス的に良くないので上記のjava-packageの方法をご検討ください。


```bash
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer
java -version
```

##debianのtomcat8をインストール

```bash
apt-get install tomcat8 tomcat8-admin tomcat8-common tomcat8-user

nano /etc/profile.d/tomcat.sh
```

debパッケージを生成した場合

```nano
JDK_HOME=/usr/lib/jvm/jdk-8-oracle-x64
```

UbuntuのJVMから入れた場合

```nano
JDK_HOME=/usr/lib/jvm/java-8-oracle
CATALINA_HOME=/etc/tomcat8/
export JDK_HOME CATALINA_HOME
```


##ルートフォルダとデータベースフォルダの所有者の変更

```bash
chown -R tomcat8:tomcat8 /etc/tomcat8/
chown -R tomcat8:tomcat8 /usr/share/tomcat8
```


##tomcat8のマネージャーの設定

```bash
nano /usr/local/tomcat8/conf/tomcat-users.xml
```
の
```
<tomcat-users>
```
に
ユーザ名：tomcat
パスワード：password
と設定するとき、

```xml
<tomcat-users>
   ....
   ....
   <role rolename="manager-gui"/>
   <user username="admin" password="password" roles="manager-gui"/>
   ....
   ....
</tomcat-users>
```
と設定します。


##OpenJDKをアンインストールしてJAVA8の1つだけにする。

```bash

apt-get remove openjdk*


nano /etc/init.d/tomcat8
```

##UbuntuのJVMから入れた場合　/etc/init.d/tomcat8を書き換える
コレっぽい所をこう書き換える


```bash

        for jvmdir in /usr/lib/jvm/java-${java_version}-openjdk-* \
                      /usr/lib/jvm/jdk-${java_version}-oracle-* \
                      /usr/lib/jvm/jre-${java_version}-oracle-* \
                      /usr/lib/jvm/java-${java_version}-oracle
```

/etc/init.d/tomcat8
を保存したら実行

```bash

/etc/init.d/tomcat8 restart

cd /var/lib/tomcat8/webapps

wget https://github.com/support-project/knowledge/releases/download/v1.9.0/knowledge.war
```

##managerにアクセスして設定する
localhost:8080/manager
にブラウザでアクセスして前にtomcat-users.xmlに設定したユーザとパスワードを入れてログイン。
knowledgeを起動するボタンを押して

localhost:8080/knowledge
にアクセスする。

##最後に
以上、急ぎ足でメモ。わからない所やつまづいた所があったらコメントしてください。
私もメモのし忘れがあるかもしれません。
HTMLで使う装飾文字（ルビ、上付き、下付き、インデント）

よく使う装飾文字（ルビ、上付き、下付き、インデント）のまとめです。

# ルビ

```sample.html
<ruby><rb>佐藤</rb><rt>さとう</rt></ruby>
```
例：<ruby><rb>佐藤</rb><rt>さとう</rt></ruby>


# 上付き文字
```sample.html
<sup>上付き文字</sup>
```
例：100万人<sup>※1</sup>

# 下付き文字
```sample.html
<sub>下付き文字</sub>
```
例：H<sub>2</sub>0

# ぶら下げインデント
```sample.html
<p class="bracket">ぶら下げインデント</p>
```

```sample.sass
p
  font-size: 16px
  &.bracket
    padding-left: 2em
    position: relative
  &.bracket:before
    content: "※1"
    position: absolute
    left: 0
    top: 0
```

例：※1 こんな感じのがやりたい時


> 参考サイト（ぶら下げインデントについて詳しくまとまっています）
> http://www.acky.info/tips/css/00006.html
> *掲載許をいただいています。
【Mac】macでVerilogHDLを動かす

# はじめに
ちょうど学校の授業でハードウェア記述言語なるものを習う上で演習を行うらしい。その時VerilogHDLで記述したものをコンパイルするらしいが、sublimeTextでコンパイルできないものかと思って調べたらできたので、メモする。

# 環境
- SublimeText3

> インストール済みパッケージ一覧
　・SublimeLinter-contrib-iverilog
　・SystemVerilog
　・Verilog Automatic
　・Verilog
　・VHDL
とりあえずVerilog系、あるだけ入れてみた。Syntaxハイライトとかあるし、自動補完系もあるから、入れた方が楽だと思う。

- Icarus Verilog

> $ brew install icarus-verilog でインストールすることが可能。関連パッケージも自動インストされる

# 準備
上記のパッケージをインストールすれば、Verilog系のSyntaxは使えるようになっているが、Sublime上でiverilogを用いてコンパイルすることができない。なので、自分でsublime-buildを作る必要があるようです。Sublimeの`Tools > Build System > New Build System`を選択。そして以下をそのまま貼り付けて、保存。保存名はなんでもいいけど、拡張子だけは変えないように。

・2017/07/18 追記
brewでインストールした際、インストール先は`/usr/local/bin/`であり(`which iverilog`などで確認可能)、pathが通っていないのでコンパイル・実行できないようでした。El Capitan以降のMacOSではSIPにより`/usr/bin/`や`/bin`などのディレクトリにはroot権限でも変更ができないようになりました。なので、インストールした`iverilog`をフルパスで読み込むことで実行できるようにします。

``` bash:iverilog.sublime-build
{
	"cmd": ["/usr/local/bin/iverilog", "-o", "$file_base_name", "$file"],
	# "cmd": ["iverilog", "-o", "$file_base_name", "$file"],

	"variants":
	[
		{
			"name": "Run",
			"cmd": ["/usr/local/bin/vvp", "$file_base_name"],
			# "cmd": ["vvp", "$file_base_name"],
		}
	]
}
```
`Tools > Build System > iverilog（保存名によって異なる）`を選択すれば、Sublime上でコンパイル・実行することができる。`command + b`でコンパイルできる。実行したいときは`shift + command + b`で`Run`を選択すればできる。

# 実験
以下にサンプル（HA）を書く。コピペして、コンパイル・実行

``` verilog:ha.sv
// 半加算器 ha.sv
module ha(a,b,s,c);
    input       a,b;
    output      s,c;
            
    assign s=a^c;
    assign c=a&b;
endmodule

// 半加算器haのテストベンチ ha_tb.sv
module ha_tb;
    reg     a,b;
    wire    s,c;

    ha ha_i(.a(a), .b(b), .s(s), .c(c));

    initial begin
        $dumpfile("out.vcd");
        $dumpvars(0,s);
        $monitor ("%t: a = %b, b = %b, s = %b, c = %b", $time, a, b, s, c);
    end

    initial begin
    			a=1'b0; b=1'b1;
		#10		a=1'b1;
    	#10		b=1'b0;
    	#10		a=1'b0;
    	#10		$finish;
    end
endmodule
```
これの実行結果としていかが表示されれば終わりです。（人によって表示形式や内容は変わっているかもしれません）

``` out.vcd
VCD info: dumpfile out.vcd opened for output.
                   0: a = 0, b = 1, s = 0, c = 0
                  10: a = 1, b = 1, s = 0, c = 1
                  20: a = 1, b = 0, s = 1, c = 0
                  30: a = 0, b = 0, s = 0, c = 0
[Finished in 0.0s]
```

# さいごに
Verilogを使うことでかなり簡単に回路シミュレーションをできるので、マスターできるようになりたいですね
MFC の CList も拡張 for 文で回す

## 概要

これは「以前 [MFCの CArray や CStringArray を拡張 for 文で回す](http://qiita.com/_meki/items/8f2fe2656ee6fb129b61) という記事を書いたので、じゃあ次は `CList` を回したいよね！」という記事です。

`std::begin` と `std::end` の適切な実装を与えてあげるという方針は `CArray` や `CStringArray` と同じですが、 `CList` の場合は若干コードが複雑です。 

## 最終的なコード

まずヘッダかどこかに以下のようなコードを書きます。

```cpp:ヘッダかどこか見えるところ
template <typename T>
struct CListIterator
{
	CList<T>* _Cont = nullptr;  // コンテナへのポインタ
	POSITION _pos = NULL;       // 現在のリスト要素位置を指すポジション
	T* _data = nullptr;         // 現在のリスト要素へのポインタ

    // std::end で使うコンストラクタ
	CListIterator() { }

    // std::begin で使うコンストラクタ
	explicit CListIterator(CList<T>& Cont)
	{
		_Cont = &Cont;
		_pos = _Cont->GetHeadPosition();
	}

    // ++ 演算子定義。ダミーで実際には何もしない。
	CListIterator& operator ++ ()
	{
		return *this;
	}

    // 参照演算子。CListのインターフェースとの兼ね合いでこの中で次の要素位置を取得している
	T& operator * ()
	{
		_data = &_Cont->GetNext(_pos);
		return *_data;
	}

    // for ループの終わりをチェックするための比較演算子
	bool operator == (const CListIterator<T>& other) const { return this->_pos == other._pos; }
	bool operator != (const CListIterator<T>& other) const { return !((*this) == other); }
};

namespace std {

  // CList 用 std::begin
  template<typename T>
  CListIterator<T> begin(CList<T>& _Cont)
  {
	  return CListIterator<T>(_Cont);
  }

  // CList 用 std::end
  template<typename T>
  CListIterator<T> end(CList<T>& _Cont)
  {
	  return CListIterator<T>();
  }
}
```

上記のイテレータと `begin, end` が定義されていると拡張 for 文で CList が回せます。

```cpp:main関数内
CList<CString> clist;
clist.AddTail(_T("hello"));
clist.AddTail(_T("world"));

wcout.imbue(std::locale(""));

// CList<CString> を拡張 for で回す
for (CString& s : clist) { wcout << (LPCTSTR)s << endl; }
```

```:コンソール出力
hello
world
```

## なぜこれで for が回るのかの解説

VC++ のコンパイラでは拡張 for 文は以下のように別のコードの短縮形と見なされているような気がします（＊ちゃんと確認してない^-^）。

```cpp:拡張forコードがこうだとすると
for(auto& element : Cont)
{
  // do something
}
```

```cpp:このようなコードとして解釈される
for(auto it = std::begin(Cont); it != std::end(Cont);++it)
{
  auto& element = *it;

  // do something
}
```

上記の理解が正しいとすると、あるコンテナ `Cont` で拡張 for 文を使えるようにするには最低限以下の仕様を満たせば良いことになります。

- `Cont` を引数に取るグローバル関数 'std::begin', 'std::end' を実装する。
- `begin, end` の戻り値の型は何でも良いが、その型は `++` 演算子、 `!=` 演算子、 `*` 演算子を実装している。
- `begin` の戻り値に `++` を繰り返していると `end` の戻り値と同じ値になる（末尾を保証）。

この方針に基づき CListIterator という構造体を作って `++, !=, *` 演算子を実装し、内部的な帳尻を合わせたら上手く for が回せました。
Dockerでpython3環境を準備する


2017/09/05 gg_hatanoさんからtypo指摘いただき修正しました。多謝。


# 目的
Docker上でpython3のコードをテストするための環境として
python3のコンテナが欲しかったので動作確認までを行ってみた。

# 手順
## python3コンテナの準備

Officialなイメージがあるのでそれを使う。
今回はpython 3.6を利用する。

```bash
sudo docker pull python:3.6
```

## python3コンテナの起動

```bash
sudo docker run -d --name hoge python:3.6 /bin/bash -c 'tail -f /dev/null'
```

## 軽い動作確認
今後いろいろやっていくのでpipなどを使えるかを確認。

```bash
sudo docker exec -it hoge /bin/bash
# pip --version
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)
```
ちゃんと行ける。
ここには載せていないが、djangoのモジュールを導入したりも
問題なく実行できた。

# まとめ
公式のpython3のコンテナイメージをベースとしてpython3を
使ったテスト環境の構築は容易に実行はできそうな感じ。
サイズが700MB弱と公式イメージにしてはずいぶん大きいので
中身を作りこめばもっと小さくすることは可能そう。

必要なモジュールとアプリケーションコード、必要な環境変数などを
突っ込めば特に工夫なくテスト環境としては構築できそう。
[ #UE4 ]Blueprintの関数のピンに説明をつける

関数のBlueprintの入出力のピン（引数、戻り値）に対してコメント説明を付けられる隠し機能？について。

# TL;DR

- JavaDoc形式でDescription中に説明がかきこめる
- 入出力ピンの説明はピンにホバーした時のTooltipに表示されるようになる
- 多人数で開発する際にちゃんとドキュメント化しておくと迷わなくて便利なのでおすすめ

# 環境

- UE4.16以降
    - 4.14ぐらいから機能自体は実装されているが、クラッシュするバグがある

# 入出力ピン説明付けられない問題

Blueprintの関数ノードそのものには説明がつけられる欄が用意されているが、入出力ピン（関数的に言えば引数や戻り値）には説明がつける欄が用意されていない。そのため、ピン数が多いノードはどのピンに何をどう繋げばよいのかわかりにくいという難点があった。

今回紹介する方法で説明を追加することで、きちんと入出力ピンに説明を追加し、しかもピンにホバーした時に表示することができるようになる。

# 説明追加方法

やりかたは関数BPの説明欄（Description）のテキスト中に、JavaDoc方式でコメントを書き込むことで実現可能。以下のタグが対応している。

## `@param`

```javadoc
@param [ParamName] ...
```
<img width="215" alt="func_param_doc.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/54764/0cca1db1-5b9e-7eac-6055-c0c680485fae.png"><img width="135" alt="func_output_pin_doc.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/54764/e090ac57-6a3e-dc4a-c44a-cd07e75d059f.png">


入力ピン（引数）、および出力ピン（戻り値）の両方のピンに説明を追加することできる。


C系の関数と異なり、Blueprintの関数は複数の戻り値を出力ピンという形で返すことができるが、`@param`タグも戻り値の説明ができることに注意。


## `@return`/`@returns`

```javadoc
@return ...
```
<img width="229" alt="func_return_doc.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/54764/803170ac-2938-9ca6-4a5a-77b671a03557.png">


**`ReturnValue`という名称の** 出力ピンの説明を追加することができる。出力ピンの名称は **固定で複数説明できない** ことに注意。


# ノード自体への特別な説明追加方法

以下のタグはBPのノード自体への特別な説明表示ができるようになる。

## `@note`/`@see`

```txt:description欄のサンプル
this is sample 
日本語ドキュメント


@note this is Note!
@see this is see!
```
<img width="293" alt="func_note_see_doc.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/54764/65e31d63-9940-f3cf-a43c-7df559782d44.png">



# 補足：説明欄（Description）内での改行

デフォルトでは1行文しかスペースがないが、Shift+Enterで改行することができる。
もっとも横幅が全角１０文字ぐらいしかないのでテキストエディタ等で入力してコピペしたほうが容易かもしれない。

# 補足その２：BPマクロ

BPマクロは残念ながら非対応。この機能がつかえるのは内部的に`UK2Node_CallFunction`を継承したノードのみ。
Hanamiにrake taskを追加する方法

自分でRakeタスクを作る場合、Railsプロジェクトの場合は`lib/tasks/`に`.rake`ファイルを作ります。しかしHanamiの場合はそのようなディレクトリはありません。なので一工夫する必要があります。

まず、Rakefileに以下の行を足します。

```rb:Rakefile
Dir[File.expand_path('../tasks', __FILE__) << '/*.rake'].each { |file| load file }
```

`tasks`ディレクトリを作り、そこにrakeファイルを置きます。

```rb:tasks/clear_users.rake
desc "Clear users"
task clear_users: :environment do
  UserRepository.new.clear
end
```

`:environment`をつけることでプロジェクトのエンティティなどを読み込んでくれます。

```
> bundle exec rake -T
rake create_user  # Clear users
rake environment  # Load the full project
rake spec         # Run RSpec code examples
```

認識してくれました！

以上です。

## 参考

http://hanamirb.org/guides/projects/rake/
各種WebサービスのAPIキーなどの管理コンソール


* 主に自分用メモ。「サービス名 + developer」とかで毎度検索してる気がするので、まとめておく。<ブクマしとけよ

## twitter
* https://apps.twitter.com/
 
## facebook
* https://developers.facebook.com/apps/

## google
* https://console.developers.google.com/

## line
* https://business.line.me/ja/companies/

## yahoo!
* https://e.developer.yahoo.co.jp/dashboard/
webpack+babel な環境で yarn link XXX で入れたパッケージを使った時にbabel-plugin関連で怒られる時

今作業してるプロジェクトでは`babel-plugin-xxx`を使ってるけど、XXXプロジェクトではそのプラグインを使っていない様な場合に起きるそう。

```bash
ERROR in /aaa/bbb/.../eee/fff.js
  Module build failed: ReferenceError:
    Unknown plugin "transform-decorators-legacy" specified in "base" at 0,
    attempted to resolve relative to "/aaa/bbb/.../eee"...
```

## 解決方法

### `babel-loader`の`exclude`でXXXプロジェクトも除外されるようにする。

```js
      {
        test: /\.js$/,
        exclude: /node_modules|XXX/,
        loader: 'babel-loader',
        options: {
          plugins: ['transform-decorators-legacy']
        }
      },
```

### `resolve.symlinks`に`false`を指定する

何か問題がない限りはこっちを使ったらいいと思います。

```js
  resolve: {
    /* ... */
    symlinks: false
  },
```
letの遅延評価で困る具体例

letの遅延評価は各it,example内で定義したものが呼ばれない限り実行されなくなります。
そのせいで困る具体例をあげます。
例えば、let!のところをletにすると、User.allが[ ]になります。User.findとかもできません。
（http://qiita.com/jnchito/items/cdd9eef2ed193267c651#2-%E7%84%A1%E9%A7%84%E3%81%AA%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%AE%E6%99%82%E9%96%93%E3%82%92%E7%84%A1%E3%81%8F%E3%81%9B%E3%82%8B）

```
  describe “sugoi_method" do
    context “すごい処理をした場合" do
      let!(:user) {create(:user, id: 1, email: 'user@basicinc.jp')}
      it “すごいデータがつくられる" do
          User.all #-> [User~]
      end
    end
  end
```

```
  describe “sugoi_method" do
    context “すごい処理をした場合" do
      let(:user) {create(:user, id: 1, email: 'user@basicinc.jp')}
      it “すごいデータがつくられる" do
          User.all #-> [ ]
      end
    end
  end
```

# 注意
letは、このような動作になりますが、
遅延評価は無駄な初期化の時間をなくせるので有効に使うべきではあります。
例えば、let!にした場合、itごとに変数が初期化されます。
つまり、その分、使わない変数のための処理にかける時間が多くなります。
「let!使いすぎはよくないよ」と言う解説を見かけるのは、その理由からです。
備忘録_iframe関係(モーダルコンテンツの中身として)


iframe対応をした際の備忘録
※設定とかは簡易的に記述

##使用したもの

- [tingle.js](https://robinparisi.github.io/tingle/)


##問題1 - モーダル時に背景固定(iOS)

iOS端末でモーダルを開いた時に背景を固定する。
その際に、背景位置を維持する必要がある。
※今回はモーダル内でもスクロールがあるため、タッチイベントを止めることはできなかった
※width: 100%;にしてあげないと、クリックのタイミングでbodyが画面幅を超える

```
var current_scrollY;

// OPEN MODAL
$( '.js-open' ).on( 'click', function(){

	current_scrollY = $( window ).scrollTop(); 

	// 固定処理
	$( 'body' ).css( {
		position: 'fixed',
		width: '100%',
		top: -1 * current_scrollY
  	});

} );

// CLOSE MODAL
$( '.js-close' ).on( 'click', function( e ){

	// リセット処理
    $( '#wrapper' ).attr( { style: '' } );
    $( 'html, body' ).prop( { scrollTop: current_scrollY } );

});
```


##問題2 - iframe要素の高さ指定問題(iOS)

iOSではiframeに直接高さ指定ができなかった。
iframe要素をラップする要素に対して高さを指定することで対応
※iframe要素に対しては高さ/幅ともに100%を指定

```
<div class=iframeWrap">
	<iframe></iframe>
</div>
```

```
.iframeWrap {
	width: 80%;
	height: 200px;
}

iframe {
	width: 100%;
	height: 100%;
}
```


##問題3 - iframe内要素のスクロール問題(iOS)

「-webkit-overflow-scrolling」と「overflow」を組みわせて対応
※問題2のサンプルを利用

```
.iframeWrap {
	width: 80%;
	height: 200px;
	
    -webkit-overflow-scrolling: touch;
    overflow: auto;
}

iframe {
	width: 100%;
	height: 100%;
}
```


##問題4 - iframe内の要素の高さを取得

モーダルの高さを可変にするために、iframe内の要素の高さを取得する

下記のサイトを参考にさせてもらって対応
http://dtp.jdash.info/archives/jQuery_iframe_auto_height_script



##結論

iOSのモーダル処理が結構面倒だった。
基本的にiframeは避けたいってなった。。。

ただ、tingle.jsは良かった。


##参考にさせていただいた記事
http://qiita.com/gonshi_com/items/5a86fc415dcccfb04e2a#comment-475a95b4b8d993098233

http://qiita.com/hanuman6/items/404f2e4611c17648eebe#_reference-ad87098836f21f93bc80

http://qiita.com/ta__ho/items/904290fa0c8c60b25af1
よく使うreact-nativeコマンド

# よく使うreact-nativeコマンド

最近react-nativeを触り始めたので、使っているコマンドを書いていきます。

## プロジェクト作成
```.bash
$ react-native init AwesomeProject
# react-native init PJ名
```

作成時にreact-nativeのバージョンを指定したい場合

```bash
$ react-native init AwesomeProject --version 0.45.1
# 上記だとreact-nativeのバージョン0.45.1でプロジェクトが作成される
```

## iOSシミュレータ起動

```.bash
$ react-native run-ios --simulator="iPhone 4s"
# --simulator="hoge" hogeの部分でシミュレータのバージョンを指定できる
```
rootディレクトリ配下にindex.ios.jsがないとエラーになる。
使用できるシミュレータの一覧の参照は以下のコマンドで可能。

```.bash 
$ xcrun simctl list devices
```

## Androidシミュレータ起動
```.bash
$ react-native run-android
```

こちらも同じくrootディレクトリ配下にindex.android.jsがないとエラーになる。

## サーバを立ち上がる
```.bash
$ react-native start
```
ローカルでサーバが立ち上がる。
何もしていないとreact-nativeのHPへのリンクが表示されるだけで使いみちがわからない。

## 終わりに

使うコマンドやわかったことが増えたら随時更新していきます。
heroku 忘れがち

heroku アプリ一覧
`heroku apps`
アプリ強制消去
`heroku apps destroy --app アプリ名 --confirm アプリ名`
アプリ用を作成
`heroku create アプリ名`
**アプリ名を指定しない場合はheroku側で名前が付けられる**

herokuでmysql設定
`heroku addons:cleardb:ignite --app アプリ名`
`heroku config --app アプリ名| grep CLEAR_DATABASE_URL`
`heroku config:set DATABASE_URL='一個前のコマンド結果 CLEARDB_DATABASE_URL:以下を入力' --app アプリ名`
mysql忘れがち

`create database データベース名;`
データベース作成
`show columns from テーブル名;`
テーブルのフィールド情報を表示する。
`show tables;`
テーブル一覧
`drop table テーブル名;`
テーブル名を消去する
`create table テーブル名(field);`
テーブルを作成する
`desc テーブル名;`
テーブルのフィールドを表示する
`mysql -h ホスト名 -u ユーザー名 -p`
外部のデータベースにアクセスする　例えばheroku mysqlとか
一連のデータフレームをまとめて加工

先日教えてもらったのでメモ。

## サンプルとやりたいこと

以下のように，Global Environmentに連番で形が同じデータフレームが存在するとします:

```r
data_list <- paste("data", 1:3, sep = "")
for(i in 1:length(data_list)) {
  assign(
    data_list[i],
    data.frame(
      x1 = rnorm(10),
      x2 = rnorm(10)
    )
  )
}
```

これで，data1からdata3までのデータフレームが作られます。ここで，これらのデータフレームに対して，同じような処理(例えば，`x3 = x1 + x2`のような変数を新たに作成させる)をしたいんです。

でも今回の場合，リストに束ねられているのではなく，それぞれのデータベースがその環境にある状況で，悩んでました。

## やり方その1

自分で思いついたのが，`get()`でデータフレームを呼び出し，それを`for`で回すというやり方でした:

```r
library(dplyr)
for(i in 1: length(data_list)) {
  get(data_list[i]) %>%
    mutate(x3 = x1 + x2)
}
```

確かにこれでやりたいことはできましたが，どうもforを回すのに抵抗が出てしまう…

## やり方その2

こちらが教えてもらったやり方:

```r
library(dplyr)
l <- lapply(data_list, get, envir = globalenv())
l <- lapply(l, mutate, x3 = x1 + x2)
```

`get`も`lapply`を使って一気に取得する，なるほどでした。ありがとうございました。

**Enjoy!**
PHP Manual 読書会(7回目)(制御構造1)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回:[PHP Manual 読書会(6回目)(演算子#2)](http://qiita.com/amesho/items/12a907685fad10b52eec)

## [制御構造に関する別の構文](http://php.net/manual/ja/control-structures.alternative-syntax.php)

> PHPは、いくつかの制御構造、つまり、if、 while、for、 foreach、switch に関する別の構文を提供します。 各構造において開き波括弧をコロン(:)、閉じ波括弧をそれぞれ endif;,endwhile;, endfor;,endforeach;, endswitch;に変更するのが 別の構文の基本的な形式となります。


+ if
+ while
+ for
+ foreach
+ switch

これらは、通常の構文の他に別の構文を提供するようだ。

```php
<?php

$a = 1;

?>

<?php if ($a == 1): ?>
ok
<?php endif; ?>
```

if .. endif; という形で囲む形で使用できる。


## [declare](http://php.net/manual/ja/control-structures.declare.php)

> declare 文は、あるコードブロックの中に 実行ディレクティブをセットするために使用されます。

現状使用出来るディレクティブは以下の3つ。

+ [ticks](http://php.net/manual/ja/control-structures.declare.php#control-structures.declare.ticks)
+ [encoding](http://php.net/manual/ja/control-structures.declare.php#control-structures.declare.encoding)
+ [strict_types](http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict)

### [ticks](http://php.net/manual/ja/control-structures.declare.php#control-structures.declare.ticks)


> tickとはdeclareブロックの実行中にパーサが N個の低レベル tick 可能な文を実行するごとに 発生するイベントのこと
> Nの値は declareブロックのディレクティブの箇所で ticks=Nのように 指定します。


```php
<?php

declare(ticks=1);

function handler() {
    echo "tick\n";
}

register_tick_function('handler');

echo "hello\n";
echo "hello\n";
```

```
tick
hello
tick
hello
tick
```

### [encoding](http://php.net/manual/ja/control-structures.declare.php#control-structures.declare.encoding)

> スクリプトのエンコーディングをスクリプトごとに指定するには encoding ディレクティブを使用します。

```php
<?php

declare(encoding='');
```

設定してないとwarningsがでるので注意。

### [strict_types](http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict)


> ファイル単位で厳密な型チェックを有効にすることもできます。 この場合は、宣言されたとおりの型でない限りは受け付けず、 TypeError をスローします。

```php
<?php

declare(strict_types=1);

function num(int $num) {
    return $num;
}

echo num(1.1);
```

```
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to num() must be of the type integer, float given, called
```

付けない場合は、以下

```php
<?php

function num(int $num) {
    return $num;
}

echo num(1.1);
```

```
1
```

違う値になってしまうので、型チェックあった方が良いですね。
node.jsアプリをWindows Service化

# node.jsアプリをWindows Service化

node.jsアプリをWindows Serviceにして使用する意味もあまりない様に思うのですが、情報を手に入れたので試して見ます。

# 使用モジュールのインストール

npmで以下をインストールします。

+ [winser](https://github.com/jfromaniello/winser)

```
npm install winser
```

# 使用方法

## package.jsonの修正

package.jsonのscriptsにinstall/uninstall scriptを追加します。
serviceの開始で使用されるスクリプトはデフォルトで`start`になります。
また、service名称のデフォルトはpackage.jsonの`name`になります。

```
{
    ~ 省略 ~
    "scripts" : {
        "start" : "node app.js",
        "install-service" : "winser -i -a",
        "uninstall-service" : "winser -r -x"
    },
    ~ 省略 ~
}
```

上記で使用しているオプションは以下のとおり。
以下以外のオプションはwinserのReadmeを参照。

|オプション|説明|
|:--|:--|
|-i|windows serviceとしてインストール|
|-a|インストール直後にアプリを起動|
|-r|windows serviceをアンインストール|
|-x|アンインストール前にserviceを停止|

## サービス登録

package.jsonに追加したinstallスクリプトを実行

```
npm run install-service
```

## サービス削除

package.jsonに追加したuninstallスクリプトを実行

```
npm run uninstall-service
```
【Swift】俺はデリゲートなんか使わない。

# 環境
Swift 3.1
Xcode 8.3.3

# はじめに
Swiftを勉強中の初心者です。RubyとPythonをちょっとしかやったことがありません。
デリゲート難しいし、使う意味がわかりませんでした。
だからデリゲートを使わない実装をしてみました。

# 実装内容
「TextField(textField)に文字列を入力した後、**returnを押したら** Label(label)にその文字列が表示する」

![032d4bb4a0add2be1948bec3e048227f.gif](https://qiita-image-store.s3.amazonaws.com/0/160547/a226f72c-098f-c562-c722-63a750a64696.gif)


# 俺はデリゲートなんか使わない
**結論：できませんでした。**
同じ実行結果は得られましたが、「 **returnを押したら** 」という処理をどうすればいいのかわかりません。
辛うじてできた最終的な実装内容は、「TextField(inputText)に文字列を入力後、 **button(fromFieldToLabel)を押したら** Label(outputText)に入力された文字列が表示される」というものです。

![005c8194729f917d5f8db590273fd42b.gif](https://qiita-image-store.s3.amazonaws.com/0/160547/66776385-0fa7-ef4c-7a2f-43e7c293601d.gif)


```swift:ViewController.swift
import UIKit
// TextField(inputText)に文字列を入力後、 button(fromFieldToLabel)を押したらLabel(outputText)に入力された文字列が表示される
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  // TextFieldとの関連付け
  @IBOutlet weak var inputText: UITextField!
  // Labelとの関連付け
  @IBOutlet weak var outputText: UILabel!
  // Buttonが押された時に実行されるメソッド
  @IBAction func fromFieldToLabel(_ sender: Any) {
    // キーボードを閉じる
    inputText.resignFirstResponder()
    // 入力された文字列を取得
    let text = inputText.text
    // 取得した文字列をLabelに表示
    outputText.text = text
  }
}
```

Swift経験者の方であれば実装可能なのかもしれませんが、そのような記事は見つかりませんでしたし、もちろん私は到底実装することはできませんでした。

私はここで初めて **デリゲートの必要性** を実感することになります。

・**自分では実装できないけど、デリゲートを利用すればSwift開発元のAppleが用意してくれている便利メソッドが使える！**
・**たとえ将来的に自力で実装できたとしても、自力で実装するよりもすでに用意されているメソッドを利用した方がはるかに楽じゃん！**

ここにきてようやくデリゲートの説明がしっくりしてきます。

「**returnを押したら**」という処理はデリゲートを利用すれば簡単に実装できるんです。


# デリゲートを用いた実装

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {//ViewControllerクラスをUITextFieldDelegateに適用する

  @IBOutlet weak var textField: UITextField!
  @IBOutlet weak var label: UILabel!

  override func viewDidLoad() {
    super.viewDidLoad()
    // delegateの通知先を自分自身に設定
    textField.delegate = self
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }
  
  // delegateの通知内容を指定する
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    // キーボードを閉じる
    textField.resignFirstResponder()
    // 入力された文字列を取り出す
    let text = textField.text
    // 取得した文字列をLabelに表示
    label.text = text
    return true
  }
}
```
追加実装した内容は主に3つです。
**1. クラスにデリゲードを適用させる**
**2. デリゲートの通知先を自分自身に設定する**
**3. デリゲートの通知内容を指定する**

# 参考文献
デリゲートの説明は私がするより他の記事を読んでいただいた方がわかりやすいと思います。
デリゲートの概念を理解するためにわかりやすかったサイトや記事を紹介させていただきます。

[Swift言語を学ぶ](http://tea-leaves.jp/swift/content/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)
[プロトコルとデリゲートのとても簡単なサンプルについて](http://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca)

# デリゲートとの戦いは続く
`inputText.delegate = self` ってなんや...
次回：[【Swift】hogehoge.delegate = self は何をしているのか。](http://qiita.com/JumpeiYoshimura/items/7667e0cc81ad91016f03)
Excel×APIで円貨レート早見表を作る

## 概要
暗算が苦手なので、旅行先の買い物で脳内レート変換がつらい。
ので、事前に早見表を作ります。
![スクリーンショット 2017-06-20 20.49.06.png](https://qiita-image-store.s3.amazonaws.com/0/157742/21805ac6-3e7b-587e-73e8-f3825e92d85d.png)


## 使ったもの
- Windows10
- Excel2016
- 外為オンラインのAPI [http://www.gaitameonline.com/rateaj/getrate](http://www.gaitameonline.com/rateaj/getrate)

## 手順
(1) 新規Excelファイルでデータ＞Webからを選択。APIのURLを入力する
![img1](https://qiita-image-store.s3.amazonaws.com/0/157742/337741ca-a285-2ce0-d848-22fda5b42504.png)
　
(2) Documentを選択してWebビュータブを開くと、目的のJSONデータが取得できているので編集する
![img2](https://qiita-image-store.s3.amazonaws.com/0/157742/15b99c4a-9763-8106-3e26-91e8537a5299.png)
　
(3) クエリーエディタが開くので、Childrenカラムの「⇔」を押してカラムを展開していく
![img3](https://qiita-image-store.s3.amazonaws.com/0/157742/0a2fb7fb-b97f-801f-8dd1-b2f07127266c.png)

(4)続けて2回ほど展開していくと、目的のJSONデータがBODY行のChildren.Children.Textカラムの中にあるので、余分な行・列を削除する
![img4](https://qiita-image-store.s3.amazonaws.com/0/157742/f9a5c96b-4ab8-a590-9dc1-6236f159ae9f.png)

行の削除＞上位の行を削除から、HEAD行（上位1行）を削除し、Text以外の列を選択して列を削除
![img4-2](https://qiita-image-store.s3.amazonaws.com/0/157742/870d1d40-f3cb-9a8b-65e9-f9db48bd8f18.png)
　
(5) データセルだけが残ったら、変換＞テキストの列＞解析＞JSONを選択し、解析後のカラムをまた展開していくと、テーブルに目的のデータが取り出せる
![img5](https://qiita-image-store.s3.amazonaws.com/0/157742/bf688362-1258-b98c-0b39-bb0c3d079416.png)
　
(6) 今回の目的に添うように列を並び替えたり、JPYを含むデータだけにフィルタする
![img6](https://qiita-image-store.s3.amazonaws.com/0/157742/57d1da72-561b-59db-8db9-f8ddd9026895.png)

(7) ホーム＞閉じて読み込むを選択すると、シートに展開される
![img7](https://qiita-image-store.s3.amazonaws.com/0/157742/0159ddb4-5cb1-9c5a-76ef-b410e3e2d481.png)

(8) あとはお好みで見やすく。iPhoneのExcelAppからはデータソース更新は無理だったので、旅行出発前にPCで更新しましょう
![img8](https://qiita-image-store.s3.amazonaws.com/0/157742/149d049e-afad-5e62-ca14-22890e8ac5d3.png)


## 参考
- [ExcelでPowerQueryを使ってデータ収集分析](http://qiita.com/mosugi/items/71df310b35db81722d1e)
- [[小ネタ]為替レートを簡単に取得する](http://qiita.com/chromabox/items/a1323225bae146c80bec)