OmniAICreator/Qiita-1.07M huggingface dataset:
HTMLの略語を調べてみた

HTMLのタグを覚えるためにはやっぱり意味を理解するのが一番だと思う

#主要タグ略語一覧表

|	タグ	|	元の表現	|	機能・意味	|
|	:-----	|	:-----	|	:-----	|
|	a	|	Anchor	|	ハイパーリンク。船のいかり⚓のこと	|
|	abbr	|	Abbreviation	|	略語（titleに正式名を入力）	|
|	b	|	Bold	|	重要性や気分などの意味合いを持たない、<BR>実利的な目的で注目を引きたいテキスト<BR>（旧仕様では太字）	|
|	br	|	Line Break	|	改行タグ（連続して使わない）	|
|	col	|	Column	|	テーブル列（カラム）	|
|	dd	|	Description Definition	|	記述リストの値	|
|	del	|	Delete	|	削除された内容（打消し線）	|
|	div	|	Division	|	一塊の要素	|
|	dl	|	Description list<BR />(HTML4ではDefinition List)	|	記述リスト	|
|	dt	|	Description Term<BR />(HTML4ではDefinition Term)	|	記述リストの名前	|
|	em	|	Emphasis	|	強勢強調	|
|	figcaption	|	Figure Caption	|	図表のキャプション	|
|	h1~h6	|	Heading	|	見出し	|
|	hr	|	Horizontal Rule	|	セクションやトピックの変わり目<BR>(旧仕様では水平方向に罫線）	|
|	href	|	Hyper Reference	|	ハイパーリンクのある場所	|
|	i	|	Italic	|	代替音声や気分など、質が異なるテキスト<BR>一般的な散文から区別されるテキスト<BR>(旧仕様ではイタリック・斜体）	|
|	iframe	|	Inline Frame	|	他のコンテンツを呼出して表示	|
|	img	|	Image	|	画像の表示	|
|	ins	|	Insert	|	新たにテキストを追記する	|
|	kbd	|	Keyboard	|	ユーザが入力する要素を表示	|
|	keygen	|	Key Generation	|	フォーム送信時にキーを発行（暗号化）	|
|	li	|	List Item	|	リストの項目	|
|	meta	|	Meta-information	|	HTMLファイル自体の内容を示す	|
|	nav	|	Navigation Links	|	ナビゲーション	|
|	ol	|	Ordered List	|	順序付きリスト	|
|	p	|	Paragraph	|	段落	|
|	param	|	parameter	|	objectの子要素	|
|	pre	|	Preformatted Text	|	整形済みテキスト	|
|	q	|	Quotation	|	引用（インライン要素、短文）<BR>※長文はblockquote	|
|	rb	|	Ruby Body	|	ルビが付される文字列（親文字）	|
|	rbc	|	Ruby Body Container	|	ruby内でグループ化する<BR />（HTML5で廃止）	|
|	rp	|	Ruby Parentheses	|	ruby非対応ブラウザにのみ表示させる	|
|	rt	|	Ruby Text	|	ルビ文字列	|
|	rtc	|	Ruby Text Container	|	ruby内で2つのルビを振る	|
|	s	|	Strikethrough Text	|	囲んだテキストに打ち消し線<BR />（HTML5では「もう関連性のないテキスト」）	|
|	samp	|	Sample	|	プログラムなどで出力された部分をサンプルとして示す	|
|	src	|	Source	|	画像のある場所	|
|	sub	|	Subscript	|	下付き文字	|
|	sup	|	Superscript	|	上付き文字	|
|	tbody	|	Table Body	|	テーブルの中身	|
|	td	|	Table Data	|	表のデータセル	|
|	tfoot	|	Table Footer	|	テーブルのフッター	|
|	th	|	Table Header	|	表の見出しセル	|
|	tr	|	Table Row	|	表の行	|
|	u	|	Underline	|	下線（HTML5では本来とは違う表記等を示すラベル、非推奨）	|
|	ul	|	Unordered List	|	順序なしリスト	|
|	var	|	Variable	|	変数	|
|	wbr	|	Word Break Opportunity	|	非改行中の改行	|


#参考

+ [HTML5仕様書（日本語）](http://momdo.github.io/html5/Overview.html)
+ [HTML5仕様書（英語）](https://www.w3.org/TR/html5/)
+ [HTML4仕様書](http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/cover.html)
+ [HTMLタグの読み方辞典](http://www.coolwebwindow.com/cssref/html-tag-ref.html)
+ [HTMLリファレンス（とほほのWWW入門）](http://www.tohoho-web.com/html/index.htm)
+ [ばけらの HTML リファレンス](http://www.ne.jp/asahi/minazuki/bakera/html/reference/reference)
+ [HTMLタグリファレンス（ABC順）](http://www.htmq.com/html/index.shtml)
Windowsでnpm installしてnode-gypでつまずいた時対処方法

# 概要

タイトルのとおり、OSXやLinuxあたりではnpm installできるのに
Windowsの場合にnode-gypあたりのエラーがでてnpm installできない場合の対処

今回はWindows7 32bitに入れた手順で記載。

> 以下の記事は自力で対応した時のもので、現在は以下手順を自動化してくれる[windows-build-tools](https://github.com/felixrieseberg/windows-build-tools)というものがあります。

> ```npm install```するだけでC++コンパイラやPython2.7をインストールしてくれるので
自分でやるより簡単です。

> ```
  npm install --global windows-build-tools
> ```

>　@syuilo さんありがとうございました。




# 対応手順

ざっくりいくとCコンパイラとpythonいれてnpmに使わせる設定が必要
いろいろなところで対処法が記載されているが、node-gypの[readme](https://github.com/nodejs/node-gyp)が一番わかりやすかった


## Install C++

VisualC++が必要らしい。VisualStudio2015が入っているならこの手順は不要（のはず）

[Visual C++ Build Tools](http://go.microsoft.com/fwlink/?LinkId=691126)からダウンロードしてインストールする。
結構時間がかかる。

## Install Python

pythonも必要らしい。
そしてpython3.x系は未対応ということなので2.7系をインストールする。
[python](https://www.python.org/downloads/)

インストール場所はカスタムでも問題ない。

## npm config

インストールしたC++とpythonをnpmに教える。
コマンドプロンプトから以下を叩く

pythonの方は例で記載。
例のとおり、python.exeまでの絶対パスで教えてやる必要がある
（PATHのようにフォルダの指定では×）

```
npm config set msvs_version 2015
npm config set python d:\install\python27\python.exe
```

## さぁnpm installだ

以上の手順をしたあとnode-gypのインストールをする

```
npm install -g node-gyp
```

なんかエラーがでたらrebuildすると幸せになれるかも

```
npm rebuild -g node-gyp
```

```error C2373: '__pfnDliNotifyHook2'```なんていうエラーが出たら

```
npm install -g npm@latest
```
を発行すると直るかも（[参考](https://github.com/nodejs/node-gyp/issues/972)）


# まとめ
Windowsでも上記手順でできることがわかった。
まぁWindows()でわざわざやることなくね？ということなんですけど。
おとなしくVirtualBoxでUbuntuでも入れた方が楽だろうし...
WebStorm / PHPStorm で nodeをデバッグする 


Node.js のプラグイン、webstormには標準で入ってるみたいだけど、
PHPStorm には入ってないみたいなので手動で入れます。

Setting->Plugins->Install JetBrains plugin よりNodeプラグインを選択してインストール

## 設定

Node.js の設定を行う。

Setting より Node.js and NPMの項目を見つける。

PHPStormならプラグインをインストールすればLanguagesの欄に現れるはず。

nodeのパスが正しくセットされている事を確認する事。

packagesにglobalインストールされているパッケージの一覧が表示されるはず。

## mochaを回してみる

上記 packages 一覧にmochaが入っている事を確認。

mocha のテストファイルを確認して、「Edit Configuration」 よりmochaの設定を行う

再生ボタンを押すとテストを回すことができるし、

虫のボタンを使えばブレイクポイントも回る。便利。
gitブランチ切り替え用の便利なpush/popコマンド (pushg/popg)

別ブランチをちょっといじってから元のブランチに戻りたい時はありませんか？

いつも `git checkout` で元のブランチ名を入力したりコピーしたりしていましたが、
もっと簡単に元のブランチに戻れるためのbash関数を作ってみました。
よかったら試してください。

### コマンドの説明

`pushg`

- 現在checkoutされているブランチかrevisionを記憶させる
 - .gitstack というファイルの最後に追加される

`popg`

- 前回のpushgのブランチを再度checkoutさせる
 - .gitstack から消される

※ .gitstack は各gitルートフォルダにて作成されます。

**使い方の例**

別ブランチに一時移動

```
$ git checkout my-feature
$ pushg  # 今いるブランチを記憶させる
Added my-feature to .gitstack

$ git checkout other-branch
$ popg   # さっきまでいたmy-featureに戻る
git checkout my-feature
```

前のrevisionに一時移動

```
$ git checkout my-feature
$ pushg  # 今いるブランチを記憶させる
Added my-feature to .gitstack

$ git checkout HEAD~1  # 一つ前に移動
$ pushg  # 今いるブランチを記憶させる
Added a1a1a1a to .gitstack

$ git checkout HEAD~1  # 更に前に移動
$ popg
git checkout a1a1a1a 
$ popg
git checkout my-feature
```

- checkoutが失敗しても（変更ファイルがある等） .gitstack から消されますが、  
popg 時に `git checkout` コマンドが出力されるので状況を確認してからそのコマンドを実行してください。

## セットアップ方法

`.bashrc` などの起動時に実行されるファイルにこちらの関数を追加します。
（次回接続時に関数が）

```
function pushg() {
    local GITSTACK="`git rev-parse --show-toplevel`/.gitstack"
    local BRANCH=`git symbolic-ref --short -q HEAD`
    if [ -z "$BRANCH" ]; then
        BRANCH=`git log -1 --oneline  | cut -f1 -d' '`
    fi
    echo $BRANCH >> $GITSTACK
    echo "Added $BRANCH to .gitstack"
}

function popg() {
    local GITSTACK="`git rev-parse --show-toplevel`/.gitstack"
    touch $GITSTACK
    local BRANCH=`tail -n1 $GITSTACK`
    if [ -n "$BRANCH" ]; then
        sed -i '$d' $GITSTACK
        echo "git checkout $BRANCH"
        git checkout $BRANCH
    else
        echo 'Nothing in .gitstack'
    fi
}
```

※ すぐ適応したい場合は、直接bashにコピペすることもできます。

## その他

`git status` などした時に `.gitstack` ファイルを無視させる方法

    mkdir -p ~/.config/git
    echo .gitstack >> ~/.config/git/ignore

stackの中身を確認する（gitのルートフォルダにて）

    cat .gitstack

stackを空にする（gitのルートフォルダにて）

    rm .gitstack

## ご意見

（あるいはもっと便利な方法など）
ありましたらコメントください！
[C++] Method return a reference type

```cpp
class A {
public:
    string& getStr() {
        return m_Str;
    }
    string m_Str;
};

int main() {
    // Create a A object
    A *a = new A();
    a->m_Str = "abc";

    // Get m_Str
    string& s = a->getStr();
    string s2 = a->getStr();

    // Check the address
    printf("%p\n%p\n%p\n", &s, &s2, &a->m_Str);

    // Try to change something of m_Str
    s[1] = 'd';
    cout << a->getStr() << endl;

    // Clear
    delete a;
    return 0;
}
```

Output:

```
0x7fa613c03450
0x7fff5e4a74d0
0x7fa613c03450
adc
```

Conclusion:

If you return a reference type from a method and you do not use a reference type to get the return value of this method. This will have a copy occurred.
【Docker】RancherOSで本格的な自宅サーバーを構築しよう(3) ~ rancher-agentを構築しよう ~

#rancher-agentを構築しよう

![rancher-docker.png](https://qiita-image-store.s3.amazonaws.com/0/62822/58fe1d1a-aaff-059e-b85b-a95f8b490d08.png)

## 関連記事
+ [RancherOSで本格的な自宅サーバーを構築しよう](http://qiita.com/okasho1010/items/da52b4dc12221feca55c)
+ [RancherOSでrancher-serverをインストールしよう](http://qiita.com/okasho1010/items/305e0af4545901d44a94) 

+ **[RancherOSでrancher-agentを構築しよう](http://qiita.com/okasho1010/items/500c3705d2f4610cebe0)←　今ここ**

+ [RancherOSでGlusterFSを使ってデータを永続化しよう](http://qiita.com/okasho1010/items/2620da1b2e93437e8a74)

+ [RancherOSでprivate registory でdocker imageを管理しよう](http://qiita.com/okasho1010/items/cf0a9569638d00a9e451)



+ [RancherのCATALOGのライブラリー一覧](http://qiita.com/okasho1010/items/f6875d5bce2ac6752758) 


## rancher-agentとなるサーバーにも同様にrancherOSをインストールしておく

## rancher-agentをrun
+ 以下はrancher-serverの管理画面で操作する
+ 管理画面のADMINタブ -> SETTING
	- Host Registration URL　-> something else

		```
		http://{rancher-serverのprivateIP}:8080
		```

<img width="1679" alt="Screen Shot 2016-06-07 at 10.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/7e71d579-8096-ae28-37cc-e076d8e29d4b.png">


+ INFRASTRUCTURE -> HOSTS -> Add Host
	- type

		```
		custom
		```
	- 5 Copy, paste, and run the command below to register the host with Rancher:

		```
		言われたとうりコピーする
		それぞれrancher-agentに貼り付けてコマンドを実行する
		```

	- 5 Click close below. The new host should pop up on the Hosts screen within a minute.

		```
		INFRASTRUCTURE -> HOSTS
		しばらく眺めてたらhostの画面が現れる！
		editから名前を変更しておく"agent01""agent02"とか
		```
<img width="1680" alt="Screen Shot 2016-06-07 at 10.18.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/3fe3efe2-336e-1406-3edc-12ff0429adf7.png">

<img width="1680" alt="Screen Shot 2016-06-07 at 10.20.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/3518d167-5866-85c1-2495-606e3c53fa93.png">


## 一通り完了
### サービスが展開できる用意が整った
+ rancher/server
+ rancher/agent
+ haproxy

+ [CATALOG](http://qiita.com/okasho1010/items/f6875d5bce2ac6752758) でぽちぽちやると適当なサービスを運用することができる

## 試しにwordpressを動かしてみる
<img width="1680" alt="Screen Shot 2016-06-07 at 10.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/748c51de-e1c7-ee6a-c430-6f871fdc45ce.png">


<img width="1680" alt="Screen Shot 2016-06-07 at 10.27.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/bcac1b0e-28a9-c28d-c104-e0afb8938c5b.png">

+ Launchを押すとコンテナが作られて、wpを見れるようになる！！


##今後の課題
+ コンテナが消えるとデータも消える -> NFSをつくってmysqlのデータを永続化
+ ポートが重なるとコンテナが上がらなくなる -> ロードバランサをつくってurlで分ける
+ ローカルで開発したdocker imageを本番環境でデプロイ -> registryを使ってみよう
Check! Mac で Azure CLI を使おう

こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
会社では Mac を使っているので、Mac から Azure CLI を使う方法をまとめておきます。基本的には、以下のドキュメント通りです。

参考
----
- [Azure コマンド ライン インターフェイスのインストール](https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-install/ "Azure コマンド ライン インターフェイスのインストール | Microsoft Azure")
- [CLI から Azure へのログイン](https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-connect/ "CLI から Azure へのログイン | Microsoft Azure")

コマンド リファレンス
====
インストール
----
```bash
# Node.js (及び npm ) をインストールする
$ brew install nodejs

# Azure CLI　をインストールする
$ npm install azure-cli -g
```

ログイン
----
```bash
# CLI から Azure にログインする
$ azure login
info:    Executing command login
info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code XXXXXXXXX to authenticate.
\
```
上記の状態で、 https://aka.ms/devicelogin にアクセスします。上記に表示されているコード（上記の場合は、XXXXXXXXX）を入力し、「続行」します。
![20160607_azure_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/b578c8d5-ecb0-3ecb-78cb-f9453a8d24cf.png)

Microsoft のサインインを求められるので、ログインしたいアカウントでサインインします。

![20160607_azure_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/f74c47ec-12ff-60ef-7c28-797ab8b6dd58.png)

```bash
info:    Added subscription XXX
info:    Setting subscription "XXX" as default
+
info:    login command OK
```

これでログインが完了です。

Epilogue - おわりに
====
簡単内容ですけど、備忘録で書きました。
Hash引数とキーワード引数

Hashを引数とるメソッドの呼び出し方で混乱したのでメモ

```ruby_params.rb
class ParamSample

  # ハッシュ引数
  def hash_method(h)
    name = h[:name]
    age = h[:age]
    p name + " is " + age.to_s
  end

  # キーワード引数
  def keyword_method(name, age: 0)
    p name + " is " + age.to_s
  end

end

s = ParamSample.new

# Hashを渡す１
s.hash_method name: "aaa", age: 1
# Hashを渡す２
method_param = { :name => "bbb", :age => 2 }
s.hash_method method_param

# キーワード引数で渡す
s.keyword_method "ccc", age: 30 # キーワード引数名指定が必要
```

`xxx: yyy`で呼び出すときに注意する
テラシュールブログさん作成UnityのAutoSave機能をちょい改変


[Unityに自動セーブ機能を追加してみた](http://tsubakit1.hateblo.jp/entry/20140131/1391094449)

で紹介されていたAutoSave機能を愛用させていただいていたのですが、幾つかの関数がobsoleteになり警告が出るようになっていました。そこで警告が出ないように対応しました。

おそらくUnityにマルチシーンエディット機能が入った際にobsoleteになったのだと思います。

その都合で、開いているマルチシーン全てセーブ&バックアップするようにしました。

https://gist.github.com/wakepon/b5f2802d988514dbadbc8a143e1fefd6
各言語処理系でワンライナーを走らせる方法カンペ

# awk

```sh
$ echo -e '10\n20' | awk '{print $1 * 2}'
20
40
```

# Perl

```sh
$ perl -le 'print uc"hoge"'
HOGE
```

```sh
$ echo -e '10\n20' | perl -nle 'print $_ * 2'
20
40
```

# PHP

```sh
$ php -r 'echo strtoupper("hoge");'
HOGE
```

```sh
$ echo -e '10\n20' | php -R 'echo $argn * 2 . PHP_EOL;'
20
40
```

# Node.js

```sh
$ node -e 'console.log("hoge".toUpperCase())'
HOGE
```

```sh
$ node -p '"hoge".toUpperCase()'
HOGE
```

```sh
$ echo -e '10\n20' | node -e 'process.stdin.on("data", buf => console.log(buf.toString().trim().split("\n").map(n => n * 2).join("\n")))'
20
40
```

# Ruby

```sh
$ ruby -e 'puts "hoge".upcase'
HOGE
```

```sh
$ echo -e '10\n20' | ruby -ne 'puts $_.to_i * 2'
20
40
```

# Python

```sh
$ python -c 'print "hoge".upper()'
HOGE
```

```sh
$ echo -e '10\n20' | python -c 'import sys; print "\n".join(str(int(n) * 2) for n in sys.stdin)'
20
40
```

# CoffeeScript

```sh
$ coffee -e 'console.log "hoge".toUpperCase()'
HOGE
```

# LiveScript

```sh
$ lsc -de '"hoge".to-upper-case! |> console.log'
HOGE
```
ChefTips:chef-apply で気軽に chef の Resources テスト

Chef の Cookbook を書いている時にちょっとした Resource のテストをしたくなった時は、`chef-apply`コマンドを使います。当たり前といえば当たり前の書き方ですが、例のようにパイプと組み合わせて使うと、ワンライナーで書かなきゃとか意識する必要もなく便利です。

（dry-runするために、`-W`オプションをつけています。実際に反映させたい場合は `-W`オプションをとってください）  


```rb:例
$ cat <<_EOL_ | chef-apply -s -W
> directory '/tmp/chefdir' do
>   owner 'root'
>   group 'root'
>   mode  '0755'
>   action :create
> end
> _EOL_
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * directory[/tmp/chefdir] action create
    - Would create new directory /tmp/chefdir
    - Would change mode from '' to '0755'
    - Would change owner from '' to 'root'
    - Would change group from '' to 'root'
```

参考/引用: [chef でファイルのパーミッションを設定するメモ@Qiita](http://qiita.com/ryochin/items/fb88281063e3355c9f85)
form.serializeArrayで作った配列からnameをkeyにした連想配列に入れ替える

```js:form.js
    var $form = $("#js-signup-form");
    var serialize = $form.serializeArray();
    var post_data = {};
    // 配列 -> 連想配列に
    for (idx in serialize) {
      var key   = serialize[idx]["name"];
      var value = serialize[idx]["value"];
      post_data[key] = value;
    }
```
EspressoでTabLayoutを切り替えたい


ViewPager内の子Viewに対するテストは[これ](http://qiita.com/teracy/items/8f58a9bffe3cd78c068a)でできましたが、見えていないViewに対してRobolectricの感覚で操作を行おうとすると次のようなエラーが出てしまいます。

```
Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
```

仕方ないので今度はTabLayoutを操作してViewPagerを切り替えます。

```java
public class MatcherUtil {
    @NonNull
    public static Matcher<View> TabMatcher(final Matcher<View> parentMatcher, final int index) {
        return new TypeSafeMatcher<View>() {
            @Override
            protected boolean matchesSafely(View view) {
                if (!(view.getParent() instanceof TabLayout)) {
                    return parentMatcher.matches(view.getParent());
                }
                TabLayout tabLayout = (TabLayout) view.getParent();
                return parentMatcher.matches(view.getParent())
                        && tabLayout.getTabCount() > index && tabLayout.getTabAt(index) != null;
            }

            @Override
            public void describeTo(Description description) {

            }
        };
    }
}
```

例：buttonというIDをもつViewがViewPager内2ページ目に存在するか

```java
onView(TabMatcher(withId(R.id.tab), 1)).perform(click());
onView(allOf(withId(R.id.button), isDescendantOfA(ViewPagerMatcher(withId(R.id.pager), 1)))).check(matches(notNullValue()));
```
chainerでニューラルネットワーク構築


[『ライブラリーを使わずにPythonでニューラルネットワークを構築してみる』](http://qiita.com/moji_ai/items/9ae195739093277490fe) （以下、元記事）の内容をchainerで実行してみる。

元記事は非常にわかりやすく丁寧に書かれているため是非一読をおすすめする。

# インストール

必要なパッケージを`pip`でインストールするだけ

```bash
$ pip3 install numpy scipy scikit-learn chainer
```

# 実行

IPython Notebook上で実行した

gistにも上げました
https://gist.github.com/maueki/ae4ce4de7c689c2b6a2df9fd7a9a0c31

## インポート

```py3
import numpy as np
import sklearn.datasets
import matplotlib
import matplotlib.pyplot as plt

import chainer
from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

%matplotlib inline
```

## データ生成

[元記事](http://qiita.com/moji_ai/items/9ae195739093277490fe)と全く同じ

```py3
np.random.seed(0)
X,y=sklearn.datasets.make_moons(200,noise=0.20)
plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)
```

![chainer_1.png](https://qiita-image-store.s3.amazonaws.com/0/39647/8d70231c-8bf3-8611-f002-a6612f4522c0.png)

## Chain作成

```py3
n_units = 3

class Model(Chain):
    def __init__(self):
        super(Model, self).__init__(
            l1=L.Linear(2, n_units),
            l2=L.Linear(n_units, 2),
        )
    
    def __call__(self, x):
        h1 = F.tanh(self.l1(x))
        y = self.l2(h1)
        return y
```

`Chain`クラスを継承しコンストラクタでネットワークを記述、`__call__`メソッドにforward関数を記述する

## Classifier Chain 作成

softmax関数を使った損失関数の定義等は`Classifier`クラスが隠蔽してくれるので自作する必要はない

```py3
model = L.Classifier(Model())
```

## optimizer 作成

学習、モデルの更新はoptimizerが行ってくれる。今回は元記事とは異なるがアルゴリズムとしてAdamを選択(SDGでは満足いく結果にならなかった)

```py3
optimizer = optimizers.Adam()
optimizer.setup(model)
```

## 学習

```py3
x = Variable(X.astype(np.float32))
t = Variable(y.astype(np.int32))

for _ in range(20000):
    optimizer.update(model, x, t)
```

chainerでは入力値等を`Variable`にして与える。この時入力値は`float32`, 出力値は`int32`にしないとエラーとなるため型変換をしていることに注意。

## 結果表示

```py3
def predict(model, x_data):
    x = Variable(x_data.astype(np.float32))
    y = model.predictor(x)
    return np.argmax(y.data, axis=1)

plot_decision_boundary(lambda x: predict(model, x))
```

![chainer_2.png](https://qiita-image-store.s3.amazonaws.com/0/39647/c7c96460-ff01-d4f3-612f-8d3bb96c3b1b.png)

元記事に近い結果が得られた

```py3
# https://gist.github.com/dennybritz/ff8e7c2954dd47a4ce5f
def plot_decision_boundary(pred_func):
    # Set min and max values and give it some padding
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    h = 0.01
    # Generate a grid of points with distance h between them
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # Predict the function value for the whole gid
    Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # Plot the contour and training examples
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
```
Sphinxドキュメントを本番と開発で外部リンク先を変える

Sphinxドキュメントから外部のURLにリンクをする時、複数箇所同じURLベースだったら **extlinks** 拡張を使うと便利。

```conf.py
extensions += ['sphinx.ext.extlinks']
extlinks = {'docbase': ('http://hoge.jp/docs/%s', '')}
```

```hoge.rst
:docbase:`hogeへ <hoge/fuga.html>`
```

これで、 http://hoge.jp/docs/hoge/fuga.html にリンクが貼られる。

ただ、conf.pyのextlinksにセットしたベースのURLって、本番と開発みたいな環境で切り替えたい時がある。
自分のPython力が足りなくて、苦肉の策っぽいんだけど、一応実現できている。

```conf.py
extensions += ['sphinx.ext.extlinks']

if os.getenv('BUILD_ENV', 'development') == "production":
  extlinks = {'docbase': ('http://production.jp/docs/%s', '')}
else:
  extlinks = {'docbase': ('http://hoge.jp/docs/%s', '')}
```

productionと、それ以外という手抜きな分岐だけど、この状態で

```bash
% BUILD_ENV=production make html
```

とすれば、production.jpへのリンクになって便利。

**2016/6/9 追記**
もっとSphinxらしい記述の仕方もあった。

```conf.py
extensions += ['sphinx.ext.extlinks']

if "production" in tags: # ここが違う
  extlinks = {'docbase': ('http://production.jp/docs/%s', '')}
else:
  extlinks = {'docbase': ('http://hoge.jp/docs/%s', '')}
```

これで、

```bash
% make SPHINXOPTS='-t production' html
```

としても、同じ結果が得られる。

### 参考
[ドキュメントを部分的に公開/非公開にしてビルドする - Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会](http://sphinx-users.jp/cookbook/multidoc/index.html)
JavaScriptで0÷0はNaNになるよ！


ある日、現場のソースを見てみたらこんなのを見つけた。

※簡略化してます

```js:sample
function rate (a, b) {
  var c = a / b;
  return c;
}
```

これ、aとb共に0ならどうなるの？ってことで試してみました。

```js:sample1
console.log(rate(0, 0));
// => NaN
```
NaN(Not A Number)になりました。。。
ちゃんと値チェックをいれないとダメですね。

おまけ

```js:sample2
console.log(rate(10, 0));
```
aが0以外かつbが0だと、Infinityになりました。
・a が正の数: Infinity
・a が負の数: -Infinity
めざせpythonライブラリマスター （46）browserplus

#【ライブラリ説明】
　ブラウザ操作ができる

#【準備】
　`pip install lxml`
　`pip install mechanize`
　　を事前に実行

#【プログラム】
　ここでは、qiitaのサイトにログインしてみます。

```py:browserplus.py
# -*- coding: utf-8 -*-

from browserplus import BrowserPlus

bp = BrowserPlus()

# サイトを開く
bp.open('https://qiita.com/login')

# formタグ指定
bp.select_form_by('action', '/login')

# ユーザidとパスワード設定
bp['identity'] = 'your id'
bp['password'] = 'your password'

# 送信
bp.submit()

# html表示
bp.show()
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/browserplus/0.0.1)
　[github](https://github.com/vinceau/browserplus)
ASP.NET Web APIでHello World


# ゴール

`GET /api/HelloWorld/`で文字列`Hello World`が返ってくるAPIを作ります。

```
$ curl 'http://localhost:50781/api/HelloWorld'
"Hello world"
```

# 環境

Visual Studio Community Edition 2015 Update2

# 手順
## プロジェクト作成

1. Visual Studioを起動
2. `新しいプロジェクト`を作成
3. `インストール済み`テンプレートから `Visual C#` > `Web` を選択
4. `ASP.NET Web アプリケーション`テンプレートを選択
5. `名前(N):`を`HelloWorldAPI`に変更
6. `OK`をクリック

![スクリーンショット 2016-06-07 10.23.22.png](https://qiita-image-store.s3.amazonaws.com/0/15964/39f0e503-c910-4977-379f-66f24a6c2646.png "スクリーンショット 2016-06-07 10.23.22.png")

1. `Empty`テンプレートを選択
2. `Web API`にチェック
3. `OK`をクリック

![スクリーンショット 2016-06-07 10.25.08.png](https://qiita-image-store.s3.amazonaws.com/0/15964/6a82eada-d1da-9b75-3d91-5bb7de88172d.png "スクリーンショット 2016-06-07 10.25.08.png")

## コントローラー作成

エンドポイント`/api/HelloWorld`に対応するコントローラーを作ります。

1. ソリューションエクスプローラーの`Controllers`フォルダを右クリック
2. `追加(D)` > `コントローラー(T)` を選択

![スクリーンショット 2016-06-07 10.26.28.png](https://qiita-image-store.s3.amazonaws.com/0/15964/67b79ff4-55b7-19a4-76d2-3ef428fc0d3e.png "スクリーンショット 2016-06-07 10.26.28.png")

1. `Web API2 コントローラー - 空`を選択
2. `追加`をクリック

![スクリーンショット 2016-06-07 10.43.42.png](https://qiita-image-store.s3.amazonaws.com/0/15964/03a304ad-f745-06a1-8706-a41939e579db.png "スクリーンショット 2016-06-07 10.43.42.png")

1. `コントローラー名:`を`HelloWorldController`に変更
2. `追加`をクリック

![スクリーンショット 2016-06-07 10.45.24.png](https://qiita-image-store.s3.amazonaws.com/0/15964/cd9035fb-73d9-5401-7a6e-3cc2b3e7000a.png "スクリーンショット 2016-06-07 10.45.24.png")

## Getメソッドを追加

生成された`HelloWorldController`クラスにGetメソッドを追加します。

```csharp:HelloWorldController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace HelloWorldAPI.Controllers
{
    public class HelloWorldController : ApiController
    {
        public string Get()
        {
            return "Hello World";
        }
    }
}
```

リクエストは、HTTPメソッド名で始まるメソッドにマッピングされます。

## 動作確認

デバッグ実行します。
![スクリーンショット 2016-06-07 11.13.45.png](https://qiita-image-store.s3.amazonaws.com/0/15964/f0fc0ac8-d0ff-5f71-897b-a1c066bbaf7e.png "スクリーンショット 2016-06-07 11.13.45.png")

403エラーが表示されます。気にせずURLを`/api/HelloWorld`に変更します。

![スクリーンショット 2016-06-07 11.15.54.png](https://qiita-image-store.s3.amazonaws.com/0/15964/66879717-7ba9-1bbc-8029-0b3aa0f410cb.png "スクリーンショット 2016-06-07 11.15.54.png")

無事`HelloWorld`が表示されました。

## 余談
`/api/helloworld`でも表示されます。
デフォルトではURLの大文字小文字は区別しないようです。



# 参考
- [ASP.NET WebAPIでAPIを作ってJavaScriptから呼ぶまで - かずきのBlog@hatena](http://blog.okazuki.jp/entry/2014/01/02/172001)
- [Getting Started with ASP.NET Web API 2 (C#) | The ASP.NET Site](http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api)
php testingでstatic methodのmock

https://packagist.org/packages/tototoshi/staticmock

TysonAndre/runkit7のインストール:

```shell-session
git clone https://github.com/TysonAndre/runkit7.git
cd runkit7
/usr/local/php7/bin/phpize
./configure --disable-runkit-sandbox --disable-runkit-super --with-php-config=/usr/local/php7/bin/php-config
make
make test
sudo make install
sudo vim /usr/local/php7/lib/php.ini    (extension=runkit.soを追加)
```
dropbox > 300,000ファイル以上で性能が落ちる | 100% disk usage問題

<font color=red>
(追記 2017/08/21)
ファイル数の認識間違い(30,000 -> 300,000)を訂正。
</font>
<hr>

```txt:動作環境
Dropbox 4.4.29 on Windows 8.1 pro
```

Dropboxによるdisk usage 100%問題が発生しており、dropboxの再インストール(%appdata%のクリア含む）を実施したが改善しなかった。

以下の情報によるとファイル数~~30,000~~300,000以上でパフォーマンスが落ちるようだが、それが関係しているのだろうか。

[Why is Dropbox using more CPU than usual?](https://www.dropbox.com/help/9199)
> Performance of the Dropbox desktop app starts to decrease at 300,000 files.

[How many files can I store in my Dropbox?](https://www.dropbox.com/help/39)
> If you have a lot of files and you'd like to try to improve the performance of individual computers, you can use selective sync to select only certain files to sync to your computer. 

とりあえずの対策としては、選択型同期で処理するファイルを減らすことだろうか。
dropbox内のファイル数は 276,358 だった。

<hr>
(追記 2016/06/07)

以下の２つの対策でファイル数を 67,625 まで減らした。

- 選択型同期で不要なフォルダを非同期
- 過去のデータのフォルダをzip圧縮

OS起動直後にdropboxを起動したところ2分25秒間だけdisk usage 100%になり、その後は数%になるようになった (改善した)。

~~30,000をまだ超えているので、さらに整理をした方が良さそうだが、OSが固まる事象は減るかもしれない。~~
vmware > VMware Player cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary files.

```txt:動作確認
VMware(R) Workstation 12 Pro
Windows 10 pro
```

Dropboxを使用しているイメージにてDisk 100% usage問題が発生し、VMWare全体が固まった。しばらく待機したが症状が改善しないためやむなくPCの電源を切った。

次回PC起動後、VMwareのイメージを起動しようとすると以下のメッセージが表示された。

> VMware Player cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary files.

以下のページに記載の方法で対応をした。
http://ameblo.jp/system-eng1neer/theme-10089477433.html

> (win7なら「コントロールパネル」→「システムとセキュリティ」→「管理ツール」→「サービス」
で、VMware Authorization Serviceを右クリック→開始。
CDH5をUbuntuにインストール　その1(Virtual box vagrant 編)

#1.事の経緯
最近は中小企業にも、Hadoopやらなんやらと、ビックデータ周りのコンポーネントたちが騒がれてきたので、勉強がてら環境を作成してみようと思う。　その１

#2.環境
ホスト：OS X EI Captian　core i7 16G
ゲスト：Ubuntu14.04(virtualbox)


#3.手順
##3-1 仮想マシン用のフォルダを作成する(ホスト)
mkdir test

##3-2 bentoよりUbuntuのイメージをダウンロード(ホスト)
3-1で作成したフォルダに移動して、

    vagrant box add --force test2 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_ubuntu-14.04_chef-provisionerless.box
※長いです

##3-3 Vagrantファイルの作成(ホスト)
初期化をして、Vgrantファイルを作成する
vagrant init test2

##3-4 Vagrantファイルの編集(ホスト)
vagrantファイルは以下のように修正した。主にコメントインで対応できる

```ruby:Vagrantfile
  config.vm.provider "virtualbox" do |vb|
 #   # Display the VirtualBox GUI when booting the machine
    # GUIモードあり
    vb.gui = true
 #
 #   # Customize the amount of memory on the VM:
    #メモリ指定
    vb.memory = "2048"
    #CPUの数指定
    vb.cpus = 4
  end
```  

##3-5 仮想マシンの起動(ホスト)
vagrant up
で起動する。

##3-6 デスクトップ環境の作成(ゲスト)
初めは、CUIベースなのでこれでもよいが、やっぱりGUIでしょ。ってことでデスクトップ環境をインストール
```sudo apt-get -y install ubuntu-desktop
※sudo tsksel の ubuntu-desktopからでもできます。
```
たまに失敗するので、その際は、sudo apt-get udateしてからもう一度やるとよい

##3-7 gestセッション無効(ゲスト)
認証のいらないgestセッションがUbuntuにはあるので、不要な場合は無効にする。
sudo vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
※vimがインストールされていない場合は sudo apt-get install vimでOKです

以下を付け足す
allow-guest=false

そして一旦停止
sudo shutdown now

##3-8 ubuntu全画面(ホスト＆ゲスト)
そのまま起動しなおしても、最初は、かなり画面小さい。正直使えるレベルではないくらい。そこで全画面にできるようにする。

以下のファイルを一旦デスクトップとかにコピー
[Mac]
/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso

windowsはここにある。
[Windows7]
C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso

コピーし終わったら仮想マシンのメニューで
「デバイス」→「CD/DVD デバイス」→「仮想CD/DVDディスクファイルの選択」
を選択し、上記のisoファイルを選択、追加する。

再度vagrant up で起動する。

（ここからゲスト）
そうすると、左のDockみたいなのにCDのアイコンが出てるのでそちらをクリック。
エクスプローラーが開くので右上のRunプログラムボタンを押して実行する。
※パスワードを聞かれるがそちらはvagrantでOK

※インストールが失敗する時がある
インストールするときのターミナルにgeneric linux-headers-4.2.0-35-genericを入れてくれと言われる（バージョンは違うかも）

その際は、cat /var/log/vboxadd-install.logを参照して、バージョン確認後(4.2.0-35の部分が載っているはず)以下のコマンドでインストールして再チャレンジ

    sudo apt-get install dkms build-essential linux-headers-generic linux-headers-4.2.0-35-generic

とりあえず環境はできた。次回はjavaとかCDH5とか入れていこうと思う。まずはMRv1から入れてみようかな。
めざせpythonライブラリマスター （45）xlsxwriter

#【ライブラリ説明】
　pythonからExcelに書き込みができる

#【プログラム】
```py:xlsxwriter
# -*- coding: utf-8 -*-

import xlsxwriter


# Excelファイルを作成して、シート追加
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# 列の幅指定
worksheet.set_column('A:A', 20)

# 書式設定（太字にする）
bold = workbook.add_format({'bold': True})

# A1にHello書き込み
worksheet.write('A1', 'Hello')

# A2に太字でWorld書き込み
worksheet.write('A2', 'World', bold)

# 数字で行列指定して、書き込み
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# 画像挿入
worksheet.insert_image('B5', 'imoyokan.jpg')

# Excel閉じる
workbook.close()
```

#【結果】
<img width="416" alt="excel.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/3a6f92ee-823e-c73b-6016-f1b6f293a3e9.png">

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/XlsxWriter/0.9.0)
　[github](https://github.com/jmcnamara/XlsxWriter)
Emacs + ac-php で PHP の最強コード補完

PhpStorm な人たちが、コード補完の強力さを自慢してくるので、ちょっと肩身の狭い思いをしていましたが、 これでもう負けることはありません。

**[github.com/xcwen/ac-php](https://github.com/xcwen/ac-php)**

Emacs では定番の auto-complete や、 company-mode のコード補完を強化する elisp です。
melpa にありますので、 [パッケージの初期設定](http://rubikitch.com/package-initialize/) をして、以下でインストールしてください。

```
M-x package-refresh-contents
M-x package-install ac-php
```

cli 版のPHP、 cscope の入ってない方は [こちら](https://github.com/xcwen/ac-php#install) を参考にインストールしてください。

.emacs/init.el は以下のように設定してください。

```el
(require 'cl)
(add-hook 'php-mode-hook
            '(lambda ()
               (auto-complete-mode t)
               (require 'ac-php)
               (setq ac-sources '(ac-source-php ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
               (yas-global-mode 1)
               (define-key php-mode-map  (kbd "C-]") 'ac-php-find-symbol-at-point)   ;goto define
               (define-key php-mode-map  (kbd "C-t") 'ac-php-location-stack-back   ) ;go back
               ))
```

上記は auto-complete の設定ですが、 [company-mode でも使用できます](https://github.com/xcwen/ac-php#usage-company)。
個人的には、 ac-php-show-tip を自動表示してくれる auto-complete がおすすめです。

プロジェクトのトップディレクトリに `.ac-php-conf.json` を生成させておきます。

```sh
touch .ac-php-conf.json 
```

Emacs から、 tags ファイルを生成すれば準備完了です。
(ちょっと時間がかかります)

```
M-x ac-php-remake-tags-all
```

[詳しくは本家のスクリーンショットを見てください！](https://github.com/xcwen/ac-php#ac-php--------)
![スクリーンショット](https://raw.githubusercontent.com/xcwen/ac-php/master/images/ac-php.gif)
Ciscoルータのパスワードが分からない場合の初期化方法

ルータを初期化することを毎回調べなおしているような気がしたので初期化方法を残しておきます．
自分用の備忘録です．

## 概要
この記事では，方法はstartup-configを読み込まずに起動する方法を解説しています．

## Step 1: ルーターを再起動する
reloadコマンドが使える場合は使用して再起動しましょう．
できない場合は，背面のON/OFFスイッチを使用．


## Step 2: メッセージが流れ始めたらブレーク信号を送信しましょう．
### WindowsでTeraTermを使用している場合
メニューバーの「コントロール」から「ブレーク信号を送信」を押しましょう．

### MacやLinux等でscreenコマンドを使用している場合
「Ctrl+A」 を押した後「b」を押すことでブレーク信号を送信できます．

### その他のツールの場合
Ctrl+Breakでブレーク信号を送信できることが多いようです．

## Step 3: コンフィギュレーションレジスタを0x2142に書き換えます
```zsh:
confreg 0x2142
```
コンフィギュレーションレジスタを0x2142に設定することで
start-configを読み込まずに機器を起動するという設定を行うことができます．

## Step4: 再起動を行いましょう
```zsh:
reload
```
※ 環境によってはresetコマンドを使うようです．

## Step 5: 設定を書き換えます．
この操作は慎重に行ってください．
操作を誤ると起動できなくなる可能性があります．

### ルータを初期化する場合
```zsh:
copy running-config startup-config
```
現在起動中の工場出荷状態（running-config）をstartup-configに上書きします．

### パスワードのみを初期化する場合
```zsh:
copy startup-config running-config
```
startup-configをrunning-config（今の状態）に読み込む方法ですが
コマンド実行時には，enableで特権モードに入っているため，そのままパスワードの変更が可能です．
その後，パスワードの設定を変更しましょう．

## Step 6: コンフィギュレーションレジスタを元に戻しましょう
まずは，Step1〜Step2を行ってください．
次に以下のコマンドを打ちます．

```zsh:
confreg 0x2102
```

再起動しましょう．
これで完了です．


## 追加情報
今のコンフィギュレーションレジスタの値は

```zsh:
show version
```

コマンドを使うと確認が可能です．
swift mini browserソースメモ

```swift:browser.swift
//
//  ViewController.swift
//  miniBrowser
//
//  Created by KanaeYou on 2016. 6. 7..
//  Copyright © 2016 KanaeYou. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, UIWebViewDelegate {

    @IBOutlet var bookmarkSegmentedControl: UISegmentedControl!
    @IBOutlet var urlTextField: UITextField!
    @IBOutlet var mainWebView: UIWebView!
    @IBOutlet var loading: UIActivityIndicatorView!
    
    @IBAction func bookmarkAction(sender: AnyObject) {
        //ブックマークからの処理
        let bookmarkUrl = bookMarkSegmentedControl.titleForSegmentAtIndex(bookmarkSegmentedControl.selectedSegmentIndex)
        let urlString = "http://www.\(bookmarkUrl!).com"
        mainWebView.loadRequest(NSURLRequest(URL : NSURL(string: urlString)!))
        urlTextField.text = urlString
    }

    //テキストフィールドからの入力
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        var urlString = "\(urlTextField.text!)"

        //httpがついてなかったら
        if !urlString.hasPrefix("http://") {
            urlString = "http://\(urlTextField.text!)"
        }
        
        mainWebView.loadRequest(NSURLRequest(URL : NSURL(string: urlString)!))
        //キーボードを隠す
        textField.resignFirstResponder()
        return true
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //初期ドメイン指定
        let urlString = "https://www.google.com"
        
        //webviewロード
        mainWebView.loadRequest(NSURLRequest(URL : NSURL(string: urlString)!))
        //テキストフィールドに表示
        urlTextField.text = urlString
    }

    //ローディングアクティビティー表示
    func webViewDidStartLoad(webView: UIWebView) {
        loading.startAnimating()
    }
    //ローディングアクティビティー非表示
    func webViewDidFinishLoad(webView: UIWebView) {
        loading.stopAnimating()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```
めざせpythonライブラリマスター （44）pynetviz

#【ライブラリ説明】
　グラフが描ける

#【準備】
　Anaconda2に付属のJupyter Notebookで実行しました。

#【プログラム】
```py:pynetviz.py
# -*- coding: utf-8 -*-

import networkx as nx
import pynetviz.sigmajs as nvs

G = nx.Graph()
G.add_edges_from([(1,2),(2,3),(3,4),(5,6)])
G.add_edge(1, 3)
G.add_edge(1, 6)
nvs.make_gexf(G)
nvs.make_html(drawEdges='true')
nvs.view_html()
```

#【結果】
<img width="326" alt="graph.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/99d15f02-701c-e219-8200-ccccca7feeba.png">

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/pynetviz/0.1)
　[github](https://github.com/koorukuroo/pynetviz)
Xamarin.Forms の画面(Page)のライフサイクルイベントについて

ちょっと誤解してた＆情報がなかったのでまとめてみました。

## モバイルアプリでの「画面」の基本的なライフサイクルイベント

まあ Android と iOS についてですが。

画面が表示される時のイベント（コールバック）は、簡潔には以下のようになります。

|順番|イベント|iOS(UIViewController)|Android(Activity)|
|---|---|---|---|
|1|画面がロードされる(た)時|viewDidLoad|onCreate|
|2|画面が表示される(た)時|viewDidAppear|onResume|
|3|画面が非表示になる(った)時|viewDidDisappear|onPause|
|4|画面がアンロードされる(た)時|viewDidUnload|onDestroy|

厳密にはもっと細かく、〜される前と後が iOS と Android で微妙に異なるのでだいたいこんな感じという程度と思って下さい。

もう少し細かいイベントは以前調べた以下を参考にしてみてください。

* [iOS と Android で画面表示時のコールバックを比較する - Qiita](http://qiita.com/amay077/items/52a0b0da97fe455abc08)

## Xamarin.Forms での画面のライフサイクルイベント

Xamarin.Forms では、上表のライフサイクルイベントは、アプリケーション
(Application) と、画面(Page) のイベントに分かれています。 

表に、Xamarin.Forms を追加してみました。

|順番|イベント|iOS(UIViewController)|Android(Activity)|Xamarin.Forms|
|---|---|---|---|---|
|1|画面がロードされる(た)時|viewDidLoad|onCreate|[Page.OnAppearing](https://developer.xamarin.com/api/member/Xamarin.Forms.Page.OnAppearing()/)|
|2|画面が表示される(た)時|viewDidAppear|onResume|[Application.OnResume](https://developer.xamarin.com/api/member/Xamarin.Forms.Application.OnResume()/) **※要注意** |
|3|画面が非表示になる(った)時|viewDidDisappear|onPause|[Application.OnSleep](https://developer.xamarin.com/api/member/Xamarin.Forms.Application.OnSleep()/)
|4|画面がアンロードされる(た)時|viewDidUnload|onDestroy|[Page.OnDisappearing](https://developer.xamarin.com/api/member/Xamarin.Forms.Page.OnDisappearing()/)|

画面のロード時（``viewDidLoad/onCreate``）に相当するのは、Xamarin.Forms では ``OnAppearing``、逆にアンロード時は ``OnDisAppearing`` です（名称が ``viewDidAppear`` に似てるので、画面の表示時かと勘違いしてました）。

画面の表示／非表示時のイベントは、画面でなく Application クラスの ``OnResume``, ``OnSleep`` で提供されます。

要注意なのは ``OnResume`` です。これ、画面が表示される **初回はイベントが発生しません**。
一度、アプリを背面に退避し、再度前面に持ってきたときに初めて ``OnResume`` が呼び出されます。iOS や Android の ``viewDidAppear / OnResume`` と同じだと思ってつかうとハマります。

基本的には、 ``OnAppearing`` でリソースの確保を、 ``OnDisAppearing`` で解放をすればよさそうです。

GPS など、電池消費の激しいリソースを使う場合は、アプリが背面へ隠れたら直ちにそのリソースを解放した方がよいです。その場合は ``OnResume-OnSleep`` を使いますが、前述の通り、画面初回表示時は ``OnResume`` が走らないので、少し工夫が必要です。

## 画面が回転された時

端末を横向きに回転すると、Android では Activity が破棄されて再度生成される事が知られています。

Xamarin.Forms では Android でもそのような事はなく、 ``Page.OnSizeAllocated`` が呼び出されるだけです(iOS も当然同じ)。

## 追記(２０１６．１２．２)

``OnSleep`` と ``OnResume`` が呼ばれるタイミングが Android と iOS で微妙に異なるという情報をいただきましたので、追記します。

* [Xamarin.FormsでOnSleepとOnResumeの呼ばれるタイミングをAndroidとiOSで似た感じにしたい - 眠いしお腹すいたし(´・ω・`)](http://tamafuyou.hatenablog.com/entry/2016/04/26/030639)

## 参考

* [Working with the App Lifecycle - Xamarin](https://developer.xamarin.com/guides/xamarin-forms/working-with/app-lifecycle/)
GitKraken1.41 Guiでのstage/unstageがより便利になりました

gitKraken： windows, max, linux で動くgitclient

1.4がリリースされたので、リリースアナウンスに基づいて新機能を確認しました。
（バグフィックスで１．４１になっています。）

## 塊(hunk)、行単位でのstagingが可能です。
stagedまたはunstagedのファイルを選択すると、行の左に＋または-ボタンが表示されて、
それを押すことで、行単位でstageできましたが、
今回のリリースで、行を選択したあとに、右クリックで選択行だけをstage/unstageできるようになりました。

##新しいコマンドパレットができています。
Ctrl＋Shift+Pで、コマンド補完テキストボックスがでてきて、unstaged all などが選べます。

##squash commitができるようになりました。
連続したcommitを２つ選択して右クリックすると、squash 2 commits と選べます。
コメントは、新しいほうがコメントタイトルになって、古いほうがメッセージに入るみたいです。

##GitHubとBitbucketとの認証ページが改善されています。
こちらは詳細確認しませんでした。

##以下、生アナウンスメールの英語です。

Discard hunks/lines: Want less hunks on-stage? When previewing unstaged files, you now have the option to discard hunks from that commit. You can also get really detailed by selecting lines, right-clicking and discarding those lines specifically. Hunky.
New command palette: Use shortcut  ⌘/Ctrl + Shift + P and begin typing to trigger actions that affect your repo.
Squash commits: You can now select a bunch of adjacent commits (in the same branch only), right-click and select “squash” to consolidate them into one single commit.
Authentication pages for GitHub and Bitbucket have been overhauled and much improved!
WordPressサーバー引っ越し

# やりたいこと
プライベートブログをAWS上で運用していたが、AWSの無料期間が終わり、サーバー費用が月間$3→$20に料金が跳ね上がった。
別でXServerも使っているので、そちらに引っ越し、AWSは廃止する事にした。
ついでにこの機会に必要のないプラグインの整理やテーマ変更を実施。
その手順を残しておく

# 環境情報整理
## 現環境(AWS)の情報
### OS、ミドルウェア等のVer.情報
+ php: 5.3.29
+ mysql: 5.5.42
+ Webサーバ：nginx
+ OS: AmazonLinux

###利用しているAWSのサービス
+ EC2 t2micro
+ S3 → EC2からマウントし、WordPressのメディアファイルを格納、また、日々のバックアップファイルのストレージとして利用。
+ EIP → 固定IP
+ Route53 → DNS

## 新環境(XServer)の情報
+ PHP: 5.6.18
+ mysql: 5.5
+ webサーバ: apache
+ OS: ?
+ ストレージ：メディアファイルとバックアップの格納先としてはこれまで通りS3を利用する事とする。


# 手順
## ローカル環境で検証
+ ローカル環境構築
+ AWSのWordPressのバックアップファイルからローカル環境に環境構築、動作検証
+ 必要ないプラグインの整理
+ テーマ変更

## XServerにテストドメインで環境構築して検証
+ ローカル環境→XServerにテストドメインで環境構築
+ 動作検証

## ドメイン切り替え
+ AWS → XServerを見るようにDNS設定変更
+ 動作確認
+ AWS側廃止

# 実際の作業ログ
## ローカル環境で検証
### MAMPでWordPress環境構築
+ php 5.6.10　WordPress最新バージョンでMAMP環境作成
+ dbを作成の上、wordpressをインストール

### 本番→ローカルへwordpressを移行
+ 本番wordpressのバックアップファイルにて、wordpressフォルダ配下を上書きする。

### DB移行
####インポート
本番wordpressのdbバックアップファイルから、開発環境のdbにphpMyAdminのインポートツールでimport
####URL置換
db内のURLを開発環境用に書き換え　
書き換えにはツール：[DatabaseSearchandReplaceScriptinPHP](https://interconnectit.com/products/search-and-replace-for-wordpress-databases/)を利用

+ サイトからダウンロードしたSearch-Replace-DB-masterフォルダ
をwordpressのインストールディレクトリに格納
+ ブラウザで　サイトのURL/Serach-Replace-DB-master　にアクセス![Kobito.GdGzCx.png](https://qiita-image-store.s3.amazonaws.com/0/102387/2c00936b-0b08-6fd7-2f3d-6ccfb9b29d43.png "Kobito.GdGzCx.png")

URLを入力して、dry runでテスト実行。問題なければupdate details で実行、delete me でツールの削除

####動作確認
+ プラグイン Nephila clavata　のS3の設定値が置換されてしまいうまくいかなかった　一旦プラグインを無効化、削除、再インストール＆設定でうまくいった
+ RSSがうまく吐き出されない
→テーマ変更で吐き出されるようになりそう。

## XServerにテスト環境構築
### name serverの設定
+ テストドメインのname serverの設定をXServerのネームサーバ
ns1.xserver.jp〜ns5.xserver.jpに設定する
+ 1日待ってテストドメインにて接続できる事を確認
### wordpressインストール
XServerの自動インストール機能にてインストール
mysql agt_wp2 	agt_wp2 	h99j7yua1o
### ローカル環境からXServerに移行
+ ローカルwordpressの配下のファイルにて、XServerのwordpressフォルダ配下を上書きする。(wp_config.php以外）
+ ローカルwordpressのDBをエクスポートして、XServerのDBにインポート
+ Search-Replace-DB-masterツールにてjoshi-came-dev:8888 → webprogrammer.tokyoに置換

## XServerの新環境にドメインを移行する
### XServerに環境構築
前項のテスト環境構築と同じ手順で、joshi-came-life.comにて環境作成

+ ソースをlocalから新環境に移行する
+ DBのlocalエクスポートデータをインポート


### ドメイン移行
joshi-came-life.com　お名前.comのネームサーバー設定を、AWSからXServer ns1.xserver.jp〜ns5.xserver.jpに変更する

### ドメイン移行完了後にXServerの環境構築の続きを実施
+ Search-Replace-DB-masterツールにてjoshi-came-dev:8888 → joshi-came-life.comに置換
+ BackWPUpプラグインがなぜか消えていたので、再インストールして設定。→設定情報が残っていたので完全削除＆再インストールして設定した

### AWSストップ
EC2,固定IP,Route53の設定削除

残作業はreikohidani.net 動作確認、backup設定、AWS廃止
キーワードの使い方について

Clojure のキーワードについてまとめる( Clojure 1.8 まで / 1.9 で入ってくる(だろう) namespeced maps や spec の話はとりあえずスキップ)

キーワードとは
--------------

シンボルに似たもので以下のような特徴を持つ

-   キーワードは必ずコロン(`:`)からはじまる ( `:fred` のように)
-   シンボルのようにネームスペースを含むことができる ( `:person/name` )
    -   つまり `namespace` 関数でネームスペース相当だけ取得できる
-   コロンふたつ(`::`)から始まる場合現在のネームスペースで解決される
    -   `user` ネームスペースのとき `::rect` は `:user/rect` と読める
    -   ただし、ネームスペースに対して別名で require したネームスペースをキーワードのネースペースとして利用すると、そのネームスペースで修飾される ( `example` ネームスペースを `e` として require していた場合、 `::e/foo` は `:example/foo` となる )

``` clojure
(ns example)

(ns user
  (:require [example :as e]))

::e/foo
;; :example/foo
```

<http://clojure.org/reference/reader>

(リファレンスではピリオド(`.`)を含めることが出来ないとあるけど、実際の Clojure の挙動と異なる)

関数としてのキーワード
----------------------

``` clojure
(def m {:foo 1 :bar 2})
;; #'user/m

(:foo m)
;; 1

(:baz m)
;; nil

(:baz m :none)
;; :none
```

キーワードはマップを引数にとる関数として使うことが出来る。また `get` と同様の動きをするので該当するキーがマップに存在しないときに返却する初期値を設定できる。

また関数として利用出来るので、以下のように利用することも当然可能となっている。

``` clojure
(def v [{:name "ayato-p" :id 1} {:name "alea12" :id 2} {:name "zer0-u" :id 3}])

(map :name v)
;; ("ayato-p" "alea12" "zer0-u")

(map (juxt :id :name) v)
;; ([1 "ayato-p"] [2 "alea12"] [3 "zer0-u"])

(map (comp clojure.string/upper-case :name) v)
;; ("AYATO-P" "ALEA12" "ZER0-U")

(sort (comp pos? :id) v)
;; ({:name "zer0-u", :id 3} {:name "alea12", :id 2} {:name "ayato-p", :id 1})
```

<http://clojure.org/reference/data_structures>

分配束縛でのキーワード
----------------------

分配束縛する際、分配束縛する先がキーワードであると分かっていれば `:keys` を利用することが出来ます。

``` clojure
(def user {:name "ayato-p" :id 1 :age 25})

(let [{name :name} user]
  name)
;; "ayato-p"

(let [{:keys [id name]} user]
  [id name])
;; [1 "ayato-p"]
```

また、このときネームスペース付きのキーワードであっても上手く解決されるようになっています。

``` clojure
(let [{:keys [:user/name]} {:user/name "ayato-p"}]
  name)
;; "ayato-p"
```

<http://clojure.org/guides/destructuring>

<https://github.com/clojure/clojure/blob/master/changes.md#22-map-destructuring-extended-to-support-namespaced-keys>
チーム開発でのCSS命名規則

# 命名規則

SMACSSのイメージ
Base ... サイトの基本となるスタイル
Layout ... 大枠を囲うエリア
Module ... 再利用可能なパーツ
Project ... 再利用しないページ固有のパーツ
State ... 状態
Theme ... サイトのテーマ(配色)
![a](https://hsto.org/files/4dc/24a/8dc/4dc24a8dc3fb4e758adf89af4f73f66c.png)

##基本ルール

CSSのクラスはモジュール化を意識した命名規則に従ってクラス名をつける。
単語間はハイフン区切りでつなぐ。

※例としてprofileの下層の子要素はprofile-が引き継がれる。

```html
<div class="m-profile">
  <img src="user.png" alt="User Name" class="m-profile-icon">
  <strong class="m-profile-name">User Name</strong>
  <div class="m-profile-content">
    <p>再利用性を意識した命名規則。</p>
  </div>
</div>
```

## Layout

レイアウトは.l-のプレフィクスをつける。
(レイアウトは大枠を囲うエリアとして考える)
例: header, main, side, footer...
またレイアウトの命名は .l-○○-area とする

```html
<header class="l-header-area">
    <h2 class="m-header-title">ヘッダータイトル</h2>
    <p class="m-header-text">ヘッダーテキスト</p>
</header>
```

## Module

モジュールは.m-のプレフィクスをつける。
(モジュールは再利用できる部品として考える)
例: button, tab, mordal...

```html
<ul class="m-list">
 <li class="m-list-item">リスト</li>
</ul>
```


## LayoutかModuleかわからなくなった場合

Layoutはページをエリアごとに分割するためにつける。 (header, main, footer)
Moduleは再利用可能なパーツを作るためつける。 (button, tab, mordal)
後は相談してくだしあ。

## 状態の命名

hoverなどの状態(state)を表すものはis-のプレフィクスをつける。

```html
<button class="m-button m-profile-button is-active">
   プロフィールを編集
</button>
```

## CSSファイルの記述の方法
下記のフォーマットに沿って書いてください。
結合するときに可読性が増えるのと、自分が何処から何処まで書いたのかが分かります。

```css

/*==========================================================*/

/*
担当 : sadakoa
TOPのサイドリスト部分のスタイルです。
*/

.sample {
  color: red;
}

/*============================================================*/

```

## CSSファイルの記述注意


良い例

```css
 
GOOD

.m-button {
  display: inline-block;
  padding: 0.5em 1em;
  cursor: pointer;
}
.is-primary {
  background-color: #CCAA00;
}

```

悪い例

```css
 
BAD

.m-button {
  display: inline-block;
  padding: 0.5em 1em;
  cursor: pointer;
　background-color: #CCAA00;
}

↑全てのボタンに背景色がついてるので、それを打ち消す余分なスタイルを書かないといけない😂

```
Watson IoT Platform - Node-RED - 登録されたデバイスからデータを受信する

#Node-REDのデバイス情報を書きとめます
1. [Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)の手順で作成されたデフォルトのIoTフローを開きます。
2. 上部のフロー（"Device Simulator"と表記され灰色の"Send Data"ノードから始まるフロー）の右端の青い「Send to IBM IoT Platform」をクリックして開きます。
3. "Device Type"（ここでは`thermostat`）と"Device Id"（ここでは`LivingRoomThermo1`）を書きとめておきます。
![スクリーンショット 2016-06-07 8.42.05.png](https://qiita-image-store.s3.amazonaws.com/0/125842/3d376f26-37d8-7e99-61ba-45348d5d7301.png)


#IoTサービスを開きます
1. Bluemixにログインし、画面左上の「IBM Bluemix」のロゴを選択して主メニューを表示し、「すべての項目」を選択し、作成したIoTアプリを表示します。
2. IoTアプリのタイルをクリックして選択し、メニューから「接続」を選択します。
3. 「アプリ名-iotf-service」と表示されているタイルをクリックして選択します。
4. IoTサービスの画面左側の「ダッシュボードを起動」ボタンを押してダッシュボードを起動します。
![スクリーンショット 2016-06-07 8.37.25.png](https://qiita-image-store.s3.amazonaws.com/0/125842/84cc51a8-1f77-ae2b-9dee-bd5774f4abf4.png)

5. ダッシュボードが起動したら、画面左側に並んで表示されているアイコンから「デバイス」を選択します。
![スクリーンショット 2016-06-07 8.38.02.png](https://qiita-image-store.s3.amazonaws.com/0/125842/9e3e3bf7-3e0c-f45a-4a17-eae46b2a8a98.png)

6. 「デバイスの追加」を選択します。
7. 「デバイスの追加」画面で「デバイス・タイプの作成」を選択します。
8. 「デバイス・タイプの作成」画面で「デバイス・タイプの作成」（「ゲートウェイ・タイプの作成」ではなく）を選択します。
9. デバイス・タイプとして前節のデバイスタイプ（thermostat`など）を指定します。
10. 「次へ」を押していきます。シリアル番号などはここでは不要です。
11. 作成したデバイスタイプを使用して「デバイスの追加」を行います。「次へ」で進みます。
12. 「デバイスID」として前節のデバイスID（`LivingRoomThermo1`など）を指定します。
13. 「次へ」で進み、デバイスの設定を完了します。
14. デバイス登録のダッシュボード画面で登録したデバイスを選択し、「更新」を押します。
15. Node-REDフローの左端の灰色のinjectノードのボタンを押してデバイスからのデータ送信をシミュレートし、Debugタブへデータが出力され、上記のデバイスダッシュボードでデータが受信される事を確認します。
![スクリーンショット 2016-06-07 8.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/125842/ca55d53e-e0b5-5632-33b1-46f9fd2cbf57.png)
![スクリーンショット 2016-06-07 8.50.49.png](https://qiita-image-store.s3.amazonaws.com/0/125842/81d4927a-203d-51b6-7993-b45b0df4e629.png)
Draftsight > アクティブメール受信方法

```txt:動作環境
Windows 7 pro
```

Draftsightという図面作成ソフトのインストールはアクティブ化で失敗している例がある。こちらでももれなく失敗続きだった。

色々試すうちに、以下の条件で成功率が8割程度になった。

1. 使用ユーザに管理者権限を与える
2. 使用ユーザでインストール
3. Firewallを切った状態で「管理者権限で」draftsightを起動する。「アクティブ化」というタイトルのウィンドウにてメールアドレスなどを入力してOKを選択
  - 入力アドレスへのメール送信成功時には「Draftsightアクティブ化」というタイトルのウィンドウが表示される
4. 手順3の段階で失敗していた場合は、regeditにてHKEY_CURRENT_USER > Software > SWActivationの項目を消してから手順3に戻る

参考 http://www.cadoasis.com/dst_troubleshooting/
Satomiさんの投稿が参考になった

手順3にてFirewallをONの状態でDraftsight.exeのみFirewall通過設定をした場合はメール処理は失敗した。他の.exeファイルをFirewall通過設定をすればいいのかもしれないが、調査はここまでとする。
ESP8266 > DateTime.h無効

気圧計に現在時刻をつけようとしている。

ArduinoにはDateTime.hをインクルードする方法があるようだが、ESP8266 + Arduinod IDEの組合せでは認識しなかった。

以下のようなライブラリを取込むことになるのだろうか。
https://github.com/Sermus/ESP8266_ArduinoIDE/tree/master/Espressif/ESP8266/cores/esp8266/Sming/Sming/Services/DateTime

取り込もうとしたがうまくコンパイルできなかった。

自分が使いそうな部分だけ実装する方が楽だろうか。