OmniAICreator/Qiita-1.07M huggingface dataset:
Rxは実装によって動きが違うのを意識しよう

# TL;DR
- UniRx最近触りだした。
- なんかちょいちょい思ってたのと違う動きがある
- 他の言語と比較してみたらやっぱりちがうっぽいので、Reactive Streams標準化が待たれる

# はじめに
最近UniRxを触りだしてLINQ式の書き方に四苦八苦しながら開発してたマンです。
実装の差異については、他の記事でも結構触れられてるので、そちらにおまかせするとして、
今回は`onFinaly`の実装の差異に付いて調べました。


# RxJava2.0.8
```kotlin
        Observable.create<Int> { it.onComplete() }
                .doFinally { Log.d("hoge", "onFinally") }
                .doOnDispose { Log.d("hoge", "onDispose") }
                .subscribe(
                        { Log.d("hoge", "onNext") },
                        { Log.d("hoge", "onError") },
                        { Log.d("hoge", "onComplete") }
                )
                .dispose()
 ```

```logs
04-21 20:41:17.194 5151-5151/yashims85.me.prayground D/hoge: onComplete
04-21 20:41:17.194 5151-5151/yashims85.me.prayground D/hoge: onFinally
```

ちなみに、最初の一行をEmptyにすると、`onCompleted`の代わりに`onDispose`が、
同じく、最初の一行でonErrorを発行すると、`onCompleted`の代わりに`onError`が出力されました。
つまり、
> onFinally: (onCompleted || onError || onDispose) の後に実行される

# UniRx
```C#
        Observable.Create<int>(it =>
            {
                it.OnCompleted();
                return Disposable.Create(() => Debug.Log("onDispose"));
            })
            .Finally(() => Debug.Log("onFinally"))
            .Subscribe(
                it => Debug.Log("onNext"),
                e => Debug.Log("onError"),
                () => Debug.Log("onComplete")
            )
            .Dispose();
 ```

```logs
04-21 21:29:57.841 25969 26045 I Unity   : onComplete
04-21 21:29:57.849 25969 26045 I Unity   : onDispose
04-21 21:29:57.856 25969 26045 I Unity   : onFinally
```

ちなみに、同じく、`OnCompleted`を発行している部分を消すと、`onDispose` `onFinally`が出力され、
`OnCompleted`を`OnError`に変えると、`onError` `onDispose` `onFinally` が出力されます。

つまり、
> onFinally: onCompleted,onErrorは関係なく、 onDispose の後に実行される

# まとめ
RxJava2.x系はReactive Streamsという標準化にそって開発を進めてるとのことで、そちらがよりデファクトと言えそうです。
しかし、UniRxはLINQの流れを汲んでおり、こちらもある意味では正当と言えそうです。

同じRxだからといって、油断してると思わぬ実装差分があったりするので注意した方が良さそうです。
そして、今後は各言語どういう実装方針にしていくのか気になるところです。

(名ばかりRxで、それぞれが独自実装していく方針だとしたら、Rx採用する利点激減だなぁという所感)
Webページを表示している間自動スリープさせなくする方法

<font color="Red">※こちらの方法は現在iosでは使用出来なく、動画が全画面表示されてしまうようです。こちらに関してはJavaScriptやPHPでの対応が必要かと思います。</font>
##**画面の自動スリープをさせたくない!!**
ってある日突然思った僕がいますw
実際今考えてみると何に使うのかわからないですが、いろいろ調べていい感じのコードができたので書かせていただきます。
###まず普通に検索してみた。
![スクリーンショット 2017-04-21 21.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/159114/0fe7a2cc-d634-e109-94fe-597942ccfb9f.png)
え、こんなに出ないことってある?w(二個目はJavaScriptではなくAndroid Javaでした)

まあというわけで自分で考えることにしたんですけど、最初に「動画見てるときってスリープされないよな」って思ったわけですよ。
まあそんなこんなでできたコードを早速書いちゃいますけど、

```html
<video style="position: fixed; top:0; left:0; height:0;" muted autoplay loop>
<source src="blank.mp4">
<source src=" blank.webm">
</video>
```

はい。これだけです。
これをbodyのどこかに書きます。
すべてのブラウザで動くかはわかりませんがIE8とかじゃなければ動くと思います。
筆者のスマホのChromeでも動きました。
ちなみにセットする動画ファイルはなんでもいいんですが、様々な面で「なるべく軽いmp4とwebm」がいいと思います。
まあというわけで無茶苦茶サイズの小さいmp4とwebmを用意しましたのでここに置いておきます。※なんと驚異の合計約3KB!
[blank.mp4](https://www.dropbox.com/s/u6onruih5ovzmmo/blank.mp4?dl=1)
[blank.webm](https://www.dropbox.com/s/5vg3doeb79apubj/blank.webm?dl=1)
使うタイミングがあるかはわかりませんが、ネットで調べられないものをできるだけ減らす精神で書きましたw暇な時にでも試してみてくださいな。
swift3でTable Viewのセルの背景色を変える方法

```swift

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cell.contentView.backgroundColor = UIColor.yellow
    }

```

# 結果


<img width="376" alt="スクリーンショット 2017-04-21 21.07.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/d3c70f6e-b73c-f12e-3962-6fce0464c70c.png">


# 参考

[iOS Swift - How to change background color of Table View?](http://stackoverflow.com/questions/30679701/ios-swift-how-to-change-background-color-of-table-view)


[swift3でTable Viewのセルの背景色を変える方法](http://off.tokyo/blog/2017/04/21/how-to-change-background-color-of-table-view/)
Windows10 Creators Update でスタートボタンの右クリックから消えたコントロールパネルをスタートメニューやタスクバーにピン留めする

Windows10 Creators Update ではスタートボタンの右クリックメニューからコントロールパネルがなくなってしまいました。

以下のスクリーンショットを見ても、スタートボタンの右クリックにコントロールパネルがないことがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/cd943152-c94d-e45a-8e0f-72553c3f8694.png)

その代わりに設定調整のほとんどは設定アプリから行えるようになってはいます。しかしそれでも使い慣れたコントロールパネルを使いつづけたいというニーズはあると思います。

実はコントロールパネルの機能自体が削除されたわけではなく、単にメニューから消されているだけなので、別の方法でコントロールパネルを容易に実行できるように設定すればよいのです。

そこでこの記事では、Windows10 Creators Update でコントロールパネルをスタートメニューやタスクバーにピン留めする方法を簡単に解説します。


# 手順

1. スタートボタンを押して「コントロールパネル」または「control panel」と打ち込む
2. 絞り込み検索によりコントロールパネルが候補に出てくるので、右クリックして「スタートメニューにピン留めする」または「タスクバーにピン留め」を選ぶ

たったこれだけですが、これでコントロールパネルをスタートメニューやタスクバーに配置できます。

animated GIF のスクリーンショットもつけておきます。

![put_control_panel_on_startmenu_or_taskbar_for_CreatorsUpdate.gif.gif](https://qiita-image-store.s3.amazonaws.com/0/149350/0c01b042-7ca8-1ad2-91e5-2e3f9a63caa7.gif)
python収集中

Python try中　メモ用に公開

最初に鬼門　Unicodeの扱い、  
日本語と相性が悪いという噂について 
Unicodeで扱えるんだから何とかなるだろうと軽く考えていた。 
何とかなるだろうという事については何とかなるので安心してほしい。 
ただ、火の無いところに煙は立たないの如く、問題があるとわかっていても、詳細を知らなければ何もできない。 
外の世界はいつもこうだ

[Python2のstr/unicodeとencode/decode
（encode/decodeの解説と図表がありがたい）](http://qiita.com/yubessy/items/9e13af05a295bbb59c25)  
まず以下2つがあって戸惑う。

- str型
- unicode型

これはどちらも文字列です。
特にunicode型は文字列として扱う何かであって何かでしかないので適宜エンコード、デコードするなどして対応できた。

お互いにencode、decodeによって変換できる。

[]()
標準入力
`sys.stdin.read()`など encode に気をつけて

[Pythonでのファイル操作](http://qiita.com/zaburo/items/0ba12417dfb39fcb1555)
[open()する時のモード](http://white.s151.xrea.com/wiki/index.php?memo%2Fpython%2Fopen()%A4%CE%C2%E82%B0%FA%BF%F4)
ファイルの取り扱いにおける close() 忘れ防止について以下2つの方法

- with
- try...finaly

[公式:データ構造](https://docs.python.jp/2.7/tutorial/datastructures.html)
（＊ sequence：シーケンスについて把握しておこう）
辞書や、リストなどについて。
[filter,map,reduce,(高階関数とも言うらしい？)](https://docs.python.jp/2.7/tutorial/datastructures.html#functional-programming-tools)
リストに対して使える物である、C++で言うところのアルゴリズムみたいなやつ

[Python入門 リスト](http://www.pythonweb.jp/tutorial/list/)

[]()
辞書：マップみたいなやつ
`{"A1":"hogepiyo", "BB":"ナムー"}` こんな感じで定義できる

[lambda（無名関数、匿名関数、ラムダ式）](http://uxmilk.jp/9426)
`(lambda x,y: x+y )` これは x、y を引数に取り、 x+y の値を返す。 

[文字列処理](http://motw.mods.jp/Python/str_methods.html)


[]()
制御文
```
```
[]()
クラス

```
class CLASS_NAME() :
    value = ""

    def __init__(self) :
        pass

    def METHOD():
        pass
```
クラスメソッド
クラスメソッド宣言時に[デコレーター]をつける
`@classmethod `


-----

### 小ネタ  

[リスト内包表記の方が高速っぽい？](http://www.yoheim.net/blog.php?q=20150702)
[Pythonといえば内包表記](http://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)
> ```
> 基本構文
> [counter for counter in iterator]
> ```

for文によりiterator内の物が順番に格納される。

[]()
XML　ライブラリ
ElementTree
cElementTree ＜Cで作られているらしい、早い
plistlib

ここで、困ったこと：
XMLコメントが読み込めない。

[C言語で簡易なPythonモジュールを作る方法](http://qiita.com/sharow/items/1daf02f31d33650c14f9)
Cバインド？拡張？CPython?
ctypesを使って.dll、.soの命令を呼び出す。
ctypesを使わない方法、


コメントの書き方

```
# 1行コメント
’’’
複数行コメント
"""
コメントの中で　「'」を使う方法は、「"""」を使ってコメントをネストする。らしい...
"""
’’’
```
【初心者向け】マストドン(Mastdon)について解説

本記事はこちら(http://tegend.net/1269.html)

マストドン(以下、Mastodon)についてWeb業界では
盛り上がっているのですが、
「いまいち感覚が掴めない」
「Twitterと何が違うの？」「インスタンスが自分で立てられる？だから何なんだろ？」

っていう疑問をよく聞くので、その視点で書いてみました。

これだけ世界に広まっているわけですし、
自分も含め、少しでも新しいサービスに触れて
人生を充実できれば、と思いキーボードを
叩いている次第です。

「当たり前だろ、こんなもん」

と思っている方にも
ぜひご意見等いただければと思っていますので、
上級者の方、ご意見いただければ幸いです笑


## 1. Mastodonとは何か？(概要)
Twitter基本的な使い方は一緒ですが、認知をスムーズに行うために比較表を作成しました。

比較表

|項目|Twitter|Mastodon|
|:--|--:|--:|
|文字数|140字|500字|
|サーバー|Twitterのみ|ユーザーが自身で立てる|
|TLが流れる速度|普通|爆速|
|タイムラインの数|1つ|3つ|


## 2. Mastodonだからこそできること
Twitterに比べて何が違うのか、比較表を参考に書きました。


### 2-1. 自分でサーバ立てられ、自由に改造可能

基本自由です。また、自分でできるから規制がありません。
一見性悪説に基づくと良くない印象もあるのも事実ですが、
言い換えると"規制するルールの制定"、"Twitterにはなかったサービスを組み込む"
といった、サーバーを立てたユーザーのアイディアでサービスの拡張が可能のため、ユーザビリティの向上が見込めます。結果、使う側としても企業に縛られることなく、様々なサービスを使用することができます。


具体的なシチュエーションを挙げるとするならば、Twitter社の方針が気に入らないのであれば、別のサーバーに移住すればいいですし、どのサーバーも気に入らないのであれば、自分でサーバーを立ち上げることができます。
それに付随して、会社自身がMastodonでサービスを展開することができます。
最近ニッポン放送やpixiv等企業が参入しているというのはそういうことです笑

また、ドワンゴではニコニコアカウントでの__ ログイン機能 __ や__ ニコる __ 機能など、サーバーを立ち上げる側の個人や組織数の数に比例して使い方は更に拡がります。インターネットだからこそ成せる技術ですね笑


### 2-2. TLの流れが爆速
比較表にも記載した通りですが、実際に使ってみた所感としてTLの速さが爆速です！笑

ガンガン流れるため自分の発言(トゥート)も速攻埋もれますし笑

ネットワークに参加してる感が半端ないため中毒性高いです。


### 2-3. ネットスラングを推奨しない立ち位置
こちらも実際に使ってみた所感ですが、タイムラインを見ていて"w"や"草"等、昔のネットスラングを推奨しない環境になっている印象です。

過去の産物に囚われないこの感じ、サービスを使っていて楽しいです。

### 2-4. 検索性
こちらはTwitterの方が優れている、ということで記載してます。(比較なのでMastodonのいいとこばっか書いても俯瞰して判断できないことを考慮。)

検索性で、Mastodonはサーバーやデータベースを各運営者がバラバラに保有する構造のため、Twitterのように全体の検索ができません。災害情報や電車遅延などの公共性の高い情報のリアルタイム性では、TwitterがMastodonより優れています。

### 2-5.タイムライン
マストドンのタイムラインは全部で3つあります。
1. 自分のホームタイムライン
2. ローカルタイムライン
3. 連合タイムライン


## 3. 参加方法
では、どうやって参加するのか？
Mastodonを始める際にまずしなければいけないことは、

__ インスタンス（サーバー）を選ぶこと __

です！

インスタンスとは、上にも少し触れましたがユーザーが立てた
サーバーのことです。
と言っても最初はよくわからないと思うので、
とりあえず日本で一番登録ユーザー数が多い[mstdn.jp](https://mstdn.jp/web/getting-started)で
よろしいかと思います。

ようこそ、Mastodonの世界へ！
あとは楽しみましょう！

## 4. おわりに
すみません、終盤だいぶ省略してしまいましたが
最後までご覧いただきありがとうございました。


ところで話は変わりますが第1回オフ会が[飯田橋の方](http://okayasu.hatenablog.jp/entry/mastodonoff)で開催されたようですね。

（´-`）.｡oO(次回は西側の方でもやってくれないかな・・・
待て、いっその事自分で開催すればいいじゃん！)


ということで

__ マストドン（mastodon）mstdn.jp 第2回 非公式オフ会（自称）__

を開催しようと思います！！

場所は下北沢あたりで考えております！
お近くでいらっしゃる方はぜひ！

参加表明(10名くらいかな)集まり次第開催します！
前書きにも記載しましたが、初心者の方から上級者の方まで幅広く
和やかな情報共有ができればと思っております！
（くれぐれも論破してドヤッ！等はしないように笑）

情報がたくさん共有できる場、また、今後盛り上がるような形にできればいいな、
と思っておりますのでぜひみなさん奮ってご参加くださいねー！(^^)


ご連絡はこちらへお願いします！
t@tegend.net

では、改めまして最後までご覧いただきありがとうございましたー！！(^^)


## 参考サイト

[ねとらぼ - ポストTwitter有力候補？　500文字まで書き込めるオープンソースSNS「マストドン」が脚光浴びる](http://nlab.itmedia.co.jp/nl/articles/1704/13/news160.html)

[engadge - 話題の「マストドン」を徹底解説。Twitterとの違い・魅力から使い方・オススメサーバーまで（世永玲生）](http://japanese.engadget.com/2017/04/17/Twitter/)

[本の虫 - そろそろマストドンについて語っておくか](https://cpplover.blogspot.jp/2017/04/blog-post_15.html)
htaファイルを作ったらMACだとダメなの,,,！？

Windows由来の独占的技術のHTAファイルが面白そうでいじろうとしたらMACだった罠。

MACはダメだからWindows環境を作るの？。でも単なるファイルだからできそうなんだけどもなぁ。

ゆったり記載していく予定です。

```hta

<!DOCTYPE html>
<html>
<head>
<title></title>
<HTA:Application


/>
</head>

<body>



</body>
</html>
```
【メモ】Win32APIのLoadLibraryで、DLLが存在するにも関わらず126とか132とか196とかで失敗するケースについて

#メモ
LoadLibraryで読み込もうとしている対象のDLLが別のDLLを暗黙リンクしている場合、そのDLLが存在しなかったりするとGetLastErrorでLoadLibraryのエラーコードを参照してもわけのわからないエラーしか返ってこない。

例えば126はDLLが存在しないってエラーだけど、暗黙リンクしているDLLが存在しない場合にも126が返るので全くあてにならない。

#その他試すこと
1. LoadLibraryにDLLのファイル名しか指定してない場合はフルパスも試す
2. GetFileAttributesでファイルが本当に存在するのか確認する
3. LoadLibraryでロードしようとしているDLLをそもそも既に暗黙リンクしてないか確認
4. LoadLibraryで読み込もうとしているDLLを別のアプリが暗黙リンクしてると失敗するらしい(?)（ぐぐって出てきたから真偽は不明）
CentOS6.8 に Crowi をセットアップする。そしてはまった（解決済み）。

# Markdownで記述できるPukiwikiみたいの
最近は自分のwikiも更新することが少なく、会社ではGitばかり使っていてすっかり Pukiwiki形式を忘れてしまったのもあり、Markdown形式で記述できるQiitaクローンみたいのがないかな？と思っていたら [Crowi](http://site.crowi.wiki/) がいいらいしよ、と聞いたので早速インストールしてみた。そして・・・ｗ。

## Docker使えば早いのに
[Crowiをdocker-nodeで動かすまでのメモ](http://qiita.com/nooby/items/9b197c2b666d6b8371e1) さんの内容で簡単に行けると思いますが、ちょっとDocker使えない環境なので今回もVagrantでやってみます。
[Crowiをセットアップする(CentOS 6.8)](http://qiita.com/oshuya/items/bd12cd40d4ba49c3f00b) さんの手順が基本ですが微妙にうまくいかなかったので、俺メモ風で手順としてます。

# 前提パッケージ
Crowi 動作には、下記のパッケージをインストールしました。

- Node.js (v7.9.0), nvm (0.33.1)
- MongoDB (2.6.12)
- crowi (1.5.3)

## Node.js
[【俺用メモ】 CentOS6にNode.jsをインストールする](http://qiita.com/ozawan/items/86ca7551d59005128892#nvm%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88) さんの内容でインストールしました。そして npm も必要なので下記のように。

```bash:
$ nvm install v7.9.0
$ sudo yum install -y npm --enablerepo=epel
```

## MongoDB 
これでいいのかな？

```bash:
$ sudo vim /etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

$ sudo yum install mongodb-org
```

### Mongoをサービス化してcrowiのユーザを作成する。
手順

```bash:
$ sudo /etc/init.d/mongod start
$ sudo chkconfig --add mongod 
```

```bash:
crowi用のユーザの作成
$ mongo
> use crowidb
switched to db crowidb
> db.createUser({user: "hoge", pwd: "hoge", roles: [{role: "userAdmin", db: "crowidb"}]})
Successfully added user: {
        "user" : "hoge",
        "roles" : [
                {
                        "role" : "userAdmin",
                        "db" : "crowidb"
                }
        ]
}
> use admin
switched to db admin
> db.system.users.find()
{ "_id" : "crowidb.hoge", "user" : "hoge", "db" : "crowidb", "credentials" : { "MONGODB-CR" : "fd084f378eb51ece0b3b3e886be89ea7" }, "roles" : [ { "role" : "userAdmin", "db" : "crowidb" } ] }
> exit
```

## crowiのcloneとか
あとちょっとです。Crowi は、1.6.0 使おうと思ったけどうまくいかんかった。
ちなみに npm 実行すると結構時間かかります。

```bash:
$ sudo yum install krb5-devel gcc-c++
$ git clone --depth 1 https://github.com/crowi/crowi.git
$ cd crowi
$ git checkout v1.5.6
$ sudo npm install --unsafe-perm
```

コマンド実行ファイルを作成する

```bash:crowi.sh
export PASSWORD_SEED=hoge
export MONGO_URI=mongodb://hoge:hoge@localhost/crowidb
node app.js
```

実行してみる。

```bash:
$ chmod +x crowi.sh
$ ./crowi.sh
[development] Express server listening on port 3000
```

3000ポートにアクセスしてみる。うまくいってると思われるｗ
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/44540/81f6a145-3697-82f6-aed8-1242c670305c.png)

## 検索機能もつけてみる
こちらは、すんなりうまくいったですｗ。
> [Crowiで検索を有効化する(CentOS 6.8)](http://qiita.com/oshuya/items/05883de5cc275d87a7b8)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44540/13a52de0-0899-03c0-17dc-b3ffcd51b41e.png)
【HTML5学習】 Part.3 -セクション- 

こんにちは＾＾
3回目の投稿です。
今回はセクションを区切るタグについて書いていこうと思います。

#セクションとは#

文書におけるテーマごとの枠組みのこと。

**見出し1つにつき1つセクションがある。**
 
見出しというのは文章や節につく題名で、見出しの配下にある文章や段落などを合わせたまとまりを**セクション**と言います。つまり、見出しを置けば勝手にセクションが作られます。
これを**暗黙**のセクションというのだそう。


##セクションを作る##

従来は、h1,h2,h3などの見出しレベルによって暗黙的に階層をもたせていましたが、HTML5ではきちんと文書を構造化し、明確にすることが推奨されています。
そのため、HTML5では下記のような文書のセクションを区切るタグが用意されています。

####**article要素**####
ブログやニュースなど、メインのコンテンツ。それ自体が独立しているコンテンツで、そのセクションをそのままどこかに配信しても違和感のないものに対して使用します。


####**section要素**####

メインや副次的コンテンツ以外の意味のある情報の塊、情報を整理した方が分かりやすいものに使用します。

例えば、

```
<article>ニュース記事1</article>
<article>ニュース記事2</article>
```
とか

```
<section>
	<h1>コンテンツ見出し</h1>
	<p>コンテンツ内容</p>
</section>
```

``` 
<article>
	<section>
		<h1>ブログ見出し</h1>
		<p>ブログ内容1</p>
		<p>ブログ内容2</p>
	</section>
</article>
```

といった使い方でいいのかな？
articleはメインのものに使うってことで割と分かりやすいけど、sectionの使い方があまりピンときにくい。articleで囲ったメインコンテンツに付随してくる、まとめといた方が分かりやすいよね〜っていう情報に対して使ったらいいのかな？



###**その他のセクショニング・コンテンツ**###



<dl>
<dt>nav</dt> <dd>ナビゲーションに関するタグ</dd> <dd>グローバルメニューやサイドメニュー、ウェブサイト内の他のページへのリンクやページ内リンクのこと。</dd>
</dl>
```
<nav>
	<h1>メニュー</h1>
	<ul>
		<li><a href="index.html">トップページ</a></li>
		<li><a href="item.html">商品紹介</a></li>
		<li><a href="shop.html">店舗検索</a></li>
	</ul>
</nav>
```


<dl>
<dt>aside</dt> <dd>副次的なコンテンツ　補足情報や広告など。</dd>
</dl>
```
<aside>
<p>補足情報</p>
</aside>
```

といった感じで今回は終わりたいと思いますが、セクショニング・コンテンツ・・・なかなか使い分けが難しそうです^^;
npmモジュール開発時の動作確認に便利な npm link

npmにpublishされているモジュールの開発時に動作確認する時どうするんだろうと思って調べてみたら `npm link` という便利なコマンドがあった

# 使い方
開発するモジュール(例：redux)のディレクトリ配下で `npm link` と叩くと `prepublish` が走った後グローバルな
 `node_modules` にシンボリックリンクが作成される

```bash
~/sandbox/github.com/reactjs/redux (master ✔) ᐅ npm link

> redux@3.6.0 prepublish /Users/yamamoto/sandbox/github.com/reactjs/redux
> yarn run clean && yarn run lint && yarn test && yarn run build && check-es3-syntax lib/ dist/ --kill --print
# 略 (npm script)
/Users/yamamoto/.nodenv/versions/6.10.1/lib/node_modules/redux -> /Users/yamamoto/sandbox/github.com/reactjs/redux
```

動作確認したいディレクトリで `npm link redux` と叩く

```bash
~/sandbox/github.com/reactjs/redux/examples/todos-flow (master ✔) ᐅ npm link redux
/Users/yamamoto/sandbox/github.com/reactjs/redux/examples/todos-flow/node_modules/redux -> /Users/yamamoto/.nodenv/versions/6.10.1/lib/node_modules/redux -> 
/Users/yamamoto/sandbox/github.com/reactjs/redux
```

`node_modules` にシンボリックリンクが作成される

```bash
~/sandbox/github.com/reactjs/redux/examples/todos-flow (master ✔) ᐅ ll node_modules | grep redux
drwxr-xr-x   11 yamamoto  staff   374B  4 21 17:17 react-redux
lrwxr-xr-x    1 yamamoto  staff    67B  4 21 19:12 redux -> ../../../../../../../.nodenv/versions/6.10.1/lib/node_modules/redux
```

# yarnの場合
yarn の場合もっと良くて、単に `yarn link` したディレクトリへのシンボリックリンクになる(相対パス)

```bash
~/sandbox/github.com/reactjs/redux (master ✔) ᐅ yarn link
yarn link v0.22.0
success Registered "redux".
info You can now run `yarn link "redux"` in the projects where you want to use this module and it will be used instead.
✨  Done in 0.16s.
```

```bash
~/sandbox/github.com/reactjs/redux/examples/todos-flow (master ✔) ᐅ yarn link redux
yarn link v0.22.0
success Registered "redux".
✨  Done in 0.17s.

~/sandbox/github.com/reactjs/redux/examples/todos-flow (master ✔) ᐅ ll node_modules | grep redux
drwxr-xr-x   11 yamamoto  staff   374B  4 21 17:17 react-redux
lrwxr-xr-x    1 yamamoto  staff     8B  4 21 19:33 redux -> ../../..
```

これでnpmモジュール開発が捗りますね。

- [参考](http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears)
Raspberry Pi3にCentOS7をインストール

# おしながき
Raspberry Pi 3 に、CentOS7 をインストールします。
OSイメージは最低限のパーティション(1GB程度)しかないので、インストール後に拡張します。
無線LANアダプタを有効にします。

## 環境
* Raspberry Pi 3 Model B
* SDカード AUSDX64GUICL10-RA1
* OSイメージ CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz

## インストール
CentOSで作業します。

### OSイメージのダウンロード
ダウンロードURLは[公式サイト](https://buildlogs.centos.org/centos/7/isos/armhfp/)で調べて置き換えて下さい。

```
$ wget http://example.com/path/to/CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz
```

### SDカードにイメージを書き込む
CentOSにSDカードを差します。
今回は64GBのSDカードなので一番下の /dev/sdb デバイス が対象です。

```
$ sudo fdisk -l | grep "Disk /"
Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors
Disk /dev/mapper/centos-root: 7159 MB, 7159676928 bytes, 13983744 sectors
Disk /dev/mapper/centos-swap: 859 MB, 859832320 bytes, 1679360 sectors
Disk /dev/sdb: 63.5 GB, 63483936768 bytes, 123992064 sectors
```

```
$ xz -cd CentOS-Userland-7-armv7hl-Minimal-1611-test-RaspberryPi3.img.xz | sudo dd of=/dev/sdb bs=4M
```

## Raspberry Pi3 の設定
SDカードをRaspberry Pi3に挿して起動します。

### パーテションの拡張と無線LANアダプタを有効
/root/README に書いてあります。

#### パーテションの拡張
```
# /usr/local/bin/rootfs-expand
```

```
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        58G  768M   55G   2% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M   12M  451M   3% /run
tmpfs           463M     0  463M   0% /sys/fs/cgroup
/dev/mmcblk0p1  500M   43M  457M   9% /boot
tmpfs            93M     0   93M   0% /run/user/0
```

#### 無線LANアダプタ
```
# curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin > /usr/lib/firmware/brcm/brcmfmac43430-sdio.bin
# curl --location https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt > /usr/lib/firmware/brcm/brcmfmac43430-sdio.txt
# reboot
```

wlan0(無線LANアダプタ)が認識されている

```
# nmcli d
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0
wlan0   wifi      disconnected  --
lo      loopback  unmanaged     --
```

無線LANアクセスポイントを取得

```
# nmcli dev wifi list
*  SSID              MODE   CHAN  RATE       SIGNAL  BARS  SECURITY
   <*************>   Infra  8     54 Mbit/s  85      ****  WPA1 WPA2
   <*************>   Infra  8     54 Mbit/s  85      ****  WPA1 WPA2
   <*************>   Infra  8     54 Mbit/s  80      ***   WEP
   <*************>   Infra  6     54 Mbit/s  54      **    WPA1
   <*************>   Infra  4     54 Mbit/s  47      **    WEP
   <*************>   Infra  4     54 Mbit/s  45      **    WPA2
   <*************>   Infra  5     54 Mbit/s  44      **    WPA1 WPA2
   <*************>   Infra  8     54 Mbit/s  40      **    WPA1 WPA2
   <*************>   Infra  3     54 Mbit/s  32      **    WPA2
   <*************>   Infra  8     54 Mbit/s  30      *     WPA2
```

無線LANを設定

```
# nmcli d wifi connect <your_ssid> password <your_keyphrase>
Device 'wlan0' successfully activated with '********-*********-****-************'.
```
Ruby on Rails モデルの関連付け（初心者向け）

Ruby on Railsの勉強を進めていく中で、データモデルの関連付けについて、なぜ行うのか、どういうときにどういう関連付けを行うのか、ということがいまいちスッキリしないまま勉強を進めてしまっていたのですが、先日<b href="https://railsguides.jp/">Rails Guide</b>を読んでいてスッキリしたので、備忘録として書いてみようと思います。

自分もまだ勉強始めてそんなに経ってないので、間違ったこと言ってたら指摘お願いします。



以下は、rails guideの内容を自分なりにまとめたものなので、rials guideを読んだ方が早いかもしれませんが、興味あったら読んでみてください。

<strong>1.なぜモデルの関連付けが必要なのか</strong>

Railsでデータベースからデータを呼び出すとき、モデルクラスに属するメソッドを使って@user.nameみたいな感じで呼び出すと思います。
ユーザーモデルに属するnameという値を呼び出すときは@user.nameでいいんですけど、仮に各ユーザーが、投稿（Micropost）モデルに属する投稿(posts)データを所持しているとします。（twitterでいうと、ユーザはそれぞれ自分のツイートを所持している、といった感じです）


このとき、異なるモデルに属する（投稿）postsを呼び出したくても、モデル同士の関連付けがされていないと、@user.postsのような形で呼び出すことはできません。
この場合、Micropost.where(user_id: @user.id)のように指定する必要があります。


これを簡略化して、「この投稿はこのユーザーに属します。このユーザーはこの投稿を所持しています」とrailsに明示的に示してあげることで、@user.posts　などといった書き方ができるようになります。


このように、関係性を宣言することでより簡潔にコードを記述することができるようになります。


<strong>2. 1対1の関係（例：結婚）</strong>
例えば、婚姻関係を管理する政府系機関のデータベースにおいて、男モデルと女モデルがあった場合、1人の男に対して、結婚相手の女性は1人であると考えられますから、この場合は1対1の関係と言えるでしょう。


このとき、has_one、belongs_to　を用いますが、どっちにhas_one、どっちにbelongs_toを書くのでしょうか。


これは意味をそのまま考えればよくて、has_oneの主語となるモデルが、目的語を所持している、という状態を表します。そしてbelongs_toの主語、つまり所持されている側にはforeign_keyとして、参照する外部キーを指定して、関連付けをします。


結婚関係の場合、どちらがどちらを所持するかという判断は微妙なところですが、今回は「男が女を所持している」ということにしましょう。


その場合、男　has_one 女　　女　belongs_to 男　foreign_key 男_id　となるわけですね。
別にプログラミングの上では逆でももちろん構わないわけで、
女 has_one 男　　男 belongs_to 女　foreign_key 女_id　でも問題ないです。



ただ、それぞれにおいて、データの呼び出し方が変わってきます。男が女を所持している場合には、男を呼び出すときは「@男」でよく、女は「＠男.女」みたいな形で呼び出せます。
逆の場合、男は「@女.男」、女は「@女」で呼び出せます。
（もちろん関連付けと関係なく単体で呼び出したいときは、@男、@女、でインスタンスを呼び出せば良いです。）


どっちがいいか、というのはどういうデータの管理をしたいか、ということによります。
例えば家ごとのデータを管理したい場合、家主は男性であることの方が多いでしょうから、男に対して色々なデータを紐づける方が理にかなっている感じはしますね。
ここはプログラム的にどうっていうわけではなくて、その時々の要件に応じてつかいわけましょう、という感じですね。


では次
<strong>3. 1対多の関係</strong>
これはさくっと終わらせます。実際これは1対1の関係と考え方は変わらないし、どっちがどっちを所持しているかというのも明白です。
「1の方が多を所持している」と考えるわけですね。
1 has_many 多
多 belongs_to 1　です

1人が沢山のものを所持している、と考える方が、沢山のものが1人を所持している、と考えるよりは自然でしょう。



<strong>4. 多対多の関係（例：男女）</strong>
例として、男女の交際関係を考えてみましょう。
1人の男性が多数の女性と付き合っていることもあれば、1人の女性が多数の男性と付き合っていることもあるでしょう。



この場合、モデルの作成方法としては2つ存在しますが、違いは「関係性をエンティティとして扱うかどうか」です。
つまり、男女の関係性を実体のあるものとして解釈し、何らかの操作や情報を加えたりしたいかどうか、ということです。男女の関係性であれば、関係があるかないか、だけでなくて、「セフレ」や「結婚を前提」「遊び」「友達以上恋人未満」など、関係性に対して情報を付加したい場合には、「関係モデル」を作る必要があります。



【関係性をエンティティとして扱う場合】
「男モデル」、「女モデル」に加えて、「関係モデル」を作成します。
先ほども説明したように、関係性を表すテーブルを作成し、ある男とある女の関係性を実体 あるものとして扱うわけです。
この場合
男モデルの中には
has_many :女　through:関係
has_many:関係

と記述し、女モデルの中には
has_many :男　through:関係
has_many :関係

そして関係モデルには
belongs_to :男
belongs_to :女
と記述します。


この場合、男と女はどっちがどっちに属する、という関係ではなく「関係モデルを通して、多数の女（男）を所持しています。」と書くわけですね。
そして「関係は男と女に属している（所持されている）わけですね。」
このように「関係モデル」を新しく作ったことで、関係を実体あるものとして扱い、先ほども言ったように、「親密さ」などの情報を付加できるようになりました。




【関係をエンティティとして扱わない場合】
男モデルには
has_many_and_belongs_to :女
女モデルには
has_many_and_belongs_to :男
と記述します。

この場合、男と女は互いに所持し、所持される対等な関係にあり、非常に簡潔に記述されていることがわかるかと思います。
関係を実態として扱わない場合には、「関係モデル」を新しく作る必要はありませんが、「関係の有無のみを記録するテーブル」は作る必要があります。


関係の有無だけを記録したい場合は、こちらの方がシンプルですね。


以上、なぜモデルの関連付けを行うのか、ということに始まり、「1対1、1対多、多対多」の関係について書いてみました。
HipChatにGASから定刻通知をさせてみる＜もくもく会＞＜時間内逐次更新＞

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

本日は弊社の[もくもく会](https://www.facebook.com/events/1418816928138831/?notif_t=plan_reminder&notif_id=1492763384184125)で進めていた内容を自分なりに覚え書きしながら、共有していこうと思います。

# 背景
オズビジョンではコミュニケーションツールのメインはチャットになっています。Slack派とHipChat派がありますが、全社のスタンダードは今のところHipChatです。
普通のやりとりをするほか、定期イベントの通知や積み残しの課題数なども流していますが、**ここに課題あり。**

定刻通知用のある程度汎用的なスクリプトはあるのですが：

- HipChatのAPI v1を利用している
- EC2内のBashスクリプト＋Cronの仕組みのため、追加削除が大変

という欠点がありました。
なので今日は、API v2を使いつつ、Google Apps Scriptを利用し、Google Spreadsheetに書くだけで、誰でも定刻通知を仕込めるように、というのをもくもく会の時間でやろうと思います。

# 作業記録
## まずv2用のtokenを取得
http://qiita.com/takky/items/51f8b2942437c9897ee1
メッセージを送りたいので、Send Notification を選びます。
![image](https://qiita-image-store.s3.amazonaws.com/0/95030/6ed15994-6d87-5e21-943c-69182b0546be.png)
Expireがついた。
![image](https://qiita-image-store.s3.amazonaws.com/0/95030/1014ff09-75cb-b1f6-15cb-d2610537db4f.png)

## v2APIの使い方を調べる
- https://developer.atlassian.com/hipchat/getting-started?_ga=1.229999900.142403523.1446020867
- https://developer.atlassian.com/hipchat/guide/hipchat-rest-api/api-rate-limits
- https://developer.atlassian.com/hipchat/guide/sending-messages
- https://developer.atlassian.com/hipchat/guide/hipchat-rest-api?_ga=1.226247834.142403523.1446020867
  - Example: sending a notification message

### はまりメモ
- とりあえずまずPOSTしないといけない
- tokenはbearerに入れないとダメぽい
- とりあえず Advanced Rest Clientを使ってここまででメッセージが投げられた

![image](https://qiita-image-store.s3.amazonaws.com/0/95030/80180105-61f2-2cf6-8d59-b95160233597.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/95030/42833a2b-e549-7f27-d516-044d0dfc59fe.png)

### どうでもいいメモ
- v2だと個人にtokenが紐づくので差出人が自分になる…ｗ

## GASからPOST
POSTしたい。あと、ヘッダも独自につけないといけない

- http://shinsuke789.hatenablog.jp/entry/2015/01/03/164203

### 意外とあっさりできたコード (tokenは伏せる)

- 日本語送信できるかまだ確認していない

```js:code.gs
/**
 * HipChatに送信する
 * API v2
 */
function noticeHipChat(roomid, color, message, notify)
{
  // token
  token = 'dummydummy';
  // url
  var url = 'https://api.hipchat.com/v2/room/' + roomid + '/notification';

  // POSTデータ
  var payload = {
    "color" : color,
    "message" : message,
    "notify" : notify,
    "message_format" : "text",
  }
  // 認証ヘッダ設定
  var headers = {
    "Authorization" : "Bearer " + token,
  }
  // option
  var options = {
    "method" : "POST",
    "payload" : payload,
    "headers" : headers,
  }

  // POST通信
  UrlFetchApp.fetch(url, options);
}
```
セルに入力する文字数を制限する


# 手順

#### ① まず制限したいセルを選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/43938/832b0464-37ba-2f59-3da0-0738cc5466ca.png" width="480">

#### ② 選択した状態で「データ」メニューから「データの入力規則」を開きます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/43938/841cbd98-882d-ebaa-f46a-52157af12738.png" width="480">

#### ③ 画像のように設定します。カスタム数式の内容は以下のとおりです。

```
=IF(LEN(INDIRECT(ADDRESS(ROW(), COLUMN()))) <= 3, TRUE(), FALSE())
```

`INDIRECT(ADDRESS(ROW(), COLUMN()))` で自分自身のセルを参照しつつ、`LEN()`で長さを計算して、それが3以下であれば`TRUE`、3より大きければ`FALSE`を返します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/43938/f37b5dd0-6f8f-fd8e-5a28-f3cabd7413f9.png" width="480">

これで **入力可能な文字数を3文字までに制限する** ことが出来ました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/43938/0b2e3fbb-acd0-5a6b-089b-4a4c8fa1c936.gif" width="480">
tmux 2.4にアップデートしたら"invalid or unknown command"エラーがでるようになった

# 問題
tmux2.3から2.4にアップデートしたところ，コピーモードに関するキーバインドで"invalid or unknown command"というエラーを吐くようになってしまいました...（泣
備忘録として解決策をここに記しておきます。
詳しい解決方法は[解決への3ステップ](#解決への3ステップ)を御覧ください。


# 解決策
私は.tmux.confに次のようなコピーモードに関するキーバインドを記述しています。同じような設定をしている人も多いのではないでしょうか。

```sh:.tmux.conf
# 範囲選択後 prefix + y でコピー&コピーモード終了
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
```

tmux2.4では```vi-copy```コマンドが使えなくなっています。また，```copy-pipe```だけではコピー後にコピーモードを終了してくれなくなっています。
次のように変更することでエラーを吐かなくなりました。

```sh:.tmux.conf
# 変更後
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
```

emacs派の人は```-t vi-copy```のところが```-t emacs-copy```になっていると思います。当てはまる方は```-T copy-mode-vi```のところを```-T copy-mode```にするといいみたいです。

# 原因
tmuxバージョン2.4では[key tableに区別がなくなり](https://raw.githubusercontent.com/tmux/tmux/master/CHANGES)，これまで使えていたコマンドがリネームされたり削除されているっぽい。そのせいでバージョン2.3まで使えていたコマンドが使えなくなったみたいです。

# key table名前変更による問題を解決する詳しい方法（追記 2017/5/2）
コメントで@revivreさんに教えていただいた[詳しい解決方法](https://github.com/tmux/tmux/issues/754#issuecomment-297452143)を追記します。@revivreさん，ありがとうございました。

## 解決への3ステップ
1. フラグ```-t```を```-T```に変更する
2. ```vi-<name>```を```<name>-mode-vi```に変更する
3. 実行するコマンドの前に```send -X```もしくは```send-keys -X```を追加する

\<name\>には```copy```, ```edit```, ```choose```などのtableが入ります。
確かに[解決策](#解決策)で行ってることは，この3ステップですね。
Windowsで起動時にNode.jsのプログラムを起動するバッチファイル(.bat)を作る


# 1. 概要

Windows PCを起動したときにPowershellが起動し、そこでNode.jsのプログラムが実行されるようなバッチファイルを作成したので、そのメモです。
どこに需要があるのか分かりませんが。

# 2. 参考サイト

1. [開発に役立つ，BATファイルの書き方・パターン集　（コマンドプロンプトの定石を体系的に学び，バッチ中級者になろう） - 主に言語とシステム開発に関して](http://language-and-engineering.hatenablog.jp/entry/20130502/PatternsOfMSDOSorBAT)
2. [Windowsである一定時間待つ(wait処理)コマンドは？コマンドプロンプト標準コマンドがある | puti se blog](http://blog.putise.com/windows%E3%81%A7%E3%81%82%E3%82%8B%E4%B8%80%E5%AE%9A%E6%99%82%E9%96%93%E5%BE%85%E3%81%A4wait%E5%87%A6%E7%90%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%EF%BC%9F%E3%82%B3%E3%83%9E%E3%83%B3/)
3. [start：コマンドプロンプトを使いこなそう！](http://win-cmd.seesaa.net/article/89083750.html)
4. [Windows 10でスタートアップを設定する方法 | jMatsuzaki](https://jmatsuzaki.com/archives/15784)

# 3. 作業環境
* Windows 10

# 4. 作成方法

[参考サイト1](http://language-and-engineering.hatenablog.jp/entry/20130502/PatternsOfMSDOSorBAT)にあるテンプレートをベースに不要なものを省きました。

```dos:test.bat

@echo off

rem
rem コメント
rem

exit
```

説明は参考サイトが分かりやすいので省きます。
pauseはせずに、仕事を終えたらコマンドプロンプトが自動的に終了するようにします。

ここにフォルダを移動する`pushd`、一定時間待機する`timeout`、exeファイルを実行する`start`を記述します。

```dos:test.bat

@echo off

rem
rem 10秒後にNode.jsのファイルをPowershellで実行する
rem

pushd "C:\Users\admin\Documents"

timeout 10

start "app" "%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" "node app.js"

exit
```

# 5. 実行結果

コマンドプロンプトで10秒カウントされた後、PowerShellが起動し、'node app.js'が実行されます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/94069/9fdea771-281a-41f0-fefa-3e1e0a0ee941.png)

app.jsはひたすらtestを表示するだけです。
画面上のウィンドウメニューの名前(この場合app)は'start'の1つ目の引数で定義したものです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/94069/4779d9c6-5023-ad31-a6c3-161b20ee0321.png)

このバッチファイルをスタートアップフォルダに置けば、PCの起動と同時にバッチファイルが実行されます。
フォルダの場所は[参考サイト4](https://jmatsuzaki.com/archives/15784)を見ながら設定しました。
私の場合は`C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`に置きました。
C++のsize_tは範囲を超えるとどうなるか

##C++のsize_tは範囲を超えるとどうなるか
C++のsize_tは範囲を超えるとどうなるか、実験して見ました。size_tはCとC++で使われるもので、どちらも脆弱性を作り込みやすい言語です。
メモリサイズを指定しているので、最大値の次が0とかになったら、バッファオーバーフローとかそういった脆弱性が出るのかなーと勝手に思っていて、それあんまり良くないなーと思いつつ、ちょっと実験してみます。

環境はClionを使ってみました。

```
#include <iostream>

int main() {
    using namespace std;
    size_t value = -1000;
    cout << "valueの値は" << value << endl;
    return 0;
}
```
これを走らせてみると、結果は以下のように

　```
valueの値は18446744073709550616
```
つまり、０以下の数字を入れるとビットが反転して、すごい大きな数になるわけですね。
では、これは

```
#include <iostream>

int main() {
    using namespace std;
    size_t value = 0;
    value --;
    cout << "valueの値は" << value << endl;
    return 0;
}
```

結果は以下のように

```
valueの値は18446744073709551615
```

18446744073709551615が最大値なのかなーと思いつつ、以下のコードを実行してみました。

```
#include <iostream>

int main() {
    using namespace std;
    size_t value = 18446744073709551615;
    value ++;
    cout << "valueの値は" << value << endl;
    return 0;
}
```

結果は以下の通り

```
valueの値は0
```

つまるところ、size_tという型は、0に−１すると、18446744073709551615になり、18446744073709551615に＋1すると０になる。
そこらへんにバッファオーバーフローとかを起こさせる要因が発生するのかなーと思ったりします。
18446744073709551615を超えることってあんまりないと思いますが、計算違いして、0以下の値になることはあると思います。
そういう時にエラーを投げてくれないって、結構危険な言語だと思いました。

ちなみに、こういう、範囲を超えたら値が反転するのは、C#とかではエラーとか返してくれるのかなと思って実験してみました。

```
using System;

namespace IntegerOverflow
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			uint i = 0;
			i--;
			Console.Write (i);

		}
	}
}
```
結果は以下の通り

```
4294967295
```
実験にはMacとMonoDevelopを使いました。完全に範囲を超えて、値が反転してますね。
エラーを投げてくれませんでした。
以下を実験してみると

```
using System;

namespace IntegerOverflow
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			uint i = 4294967295;
			i++;
			Console.Write (i);

		}
	}
}
```

以下の通り

```
0
```

なんで、値を超えた時に、値が反転するのか、考察してみます。言い換えれば、「なぜエラーを投げないか」を考察してみます。4294967295ってそんなにでかい値ではないと思うのですが、場合によってはこういうのってバグの元になると思います。
恐らく、パフォーマンスの理由によると思います。つまり、値が反転する場合にエラーを投げるには、加減乗除した時に、常に範囲が超えてないかチェックする機構を走らせる必要があるんだと思います。
それがかなりコストがかかる、そして場合によっては不可能なんじゃないかと思いますね。
だから、逆に言えば、バグハンティングはこういう、値が反転しそうなところを狙っていけば脆弱性とか発見できて、バグバウンティプログラムで稼げるのかなと思いますね。
突っ込みどころ満載だと思うので、コメント歓迎です。でも、いじめないでください。
TradingViewのデモを起動するまでの手順

# 画面起動までの手順
1. [ここ](https://jp.tradingview.com/HTML5-stock-forex-bitcoin-charting-library/)から「ライブラリのダウンロード」ボタンをクリックして、認証情報を登録
2. ２、３日待機する
3. 認証情報申請時に登録したGitHubのプロフィールに紐づいたメールアドレスに登録完了の知らせが届いた後、任意のフォルダで下記のコマンドを実行する  
```
git clone https://github.com/tradingview/charting_library
```
4. 3のフォルダの場所でhttp serverを起動する(下記はPython3を使った例)  
```
python3 -m http.server
```

# 画面をみる方法
上記手順完了後、下記のURLにブラウザからアクセスする
http://localhost:8000/index.html
http://localhost:8000/intro.html
http://localhost:8000/mobile_black.html
http://localhost:8000/mobile_white.html
http://localhost:8000/test.html

# 動作概要
  JQuery、charting_library.min.js、datafeed.jsを取り込み、「TradingView.onready」で「TradingView.widget」を実行するとチャートが起動する(index.html:26〜46行目)
　　　　Version 1.11以降はJQueryが必要なくなる予定。
RDSのスロークエリログをmysqldumpslowに突っ込む

JSON形式で取得されるRDS(MySQL)のスロークエリログをcatして絶望したときに、心を落ち着けてmysqldumpslowに突っ込めるようにします。

# 用意するもの

- awscli
- jq
- mysqldumpslow [^1]

# スロークエリログのダウンロード

## スロークエリログのリストを取得

```sh
$ aws rds describe-db-log-files \
  --db-instance-identifier hoge-instance \
  | jq '.DescribeDBLogFiles[].LogFileName' -r  \
  | grep slow
slowquery/mysql-slowquery.log
slowquery/mysql-slowquery.log.0
...
```

## スロークエリログのダウンロード

`describe-db-log-files`取得されたファイル名には`/`が含まれていて邪魔なので、ファイルに保存するときに取っています。

```sh
for log in $(cat slowlog-list.txt); do \
  aws rds download-db-log-file-portion \
  --db-instance-identifier hoge-instance \
  --log-file-name $log \
  > $(echo $log | cut -d / -f 2); done
```

# スロークエリログの読み込み

取得されたスロークエリログの中身はJSONデータの奥に格納されたテキスト文字列なので、`jq`で抽出してから`mysqldumpslow`に食わせます。

```sh
$ cat mysql-slowquery.log \
  | jq -rs .[].LogFileData \
  | mysqldumpslow -
# 遅い順にソートされたクエリたち...
```

[^1]: Ubuntuでは`mysql-client`をインストールするとついてきます。
git上で変更すべきではないファイル変更してしまった

自分が、git下にあるrailsのプロジェクトをいじっていた時、変更すべきではないファイルを変更してしまった時がありその時の対処法を忘れないように以下に記載しておきます。

```
$git checkout 'ファイル名'
```

これは１つのファイルだけ一個前のコミットの状態に戻してくれる（自分の理解があっていれば）のでとても使い勝手がよろしいです。
Dockerfile の RUN gem install で Gem::RemoteFetcher::UnknownHostError に遭遇する事がある件

> use DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
> https://meta.discourse.org/t/getting-unknownhosterror-from-gem-remotefetcher-on-new-install/43464/4

上記を参考に、Docker for Mac の設定を以下の様にして様子見中。

<img width="492" alt="スクリーンショット 2017-04-21 18.22.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/22442/396b42c5-6927-6880-8c08-67eb0dbbf19d.png">

以下の Dockerfile を作り、

```:Dockerfile
FROM ruby:2.4.1-alpine

RUN gem install rubygems-update --no-document
```

以下の繰り返し実行で `Gem::RemoteFetcher::UnknownHostError` に遭遇せず。

```
$ for i in $(seq 1 10)
do
  docker image build --no-cache -t test docker/
  sleep 1
done
```
Eureka の List Sections の使い方

設定画面などを作成する際に便利なライブラリ [Eureka](https://github.com/xmartlabs/Eureka) ですが、List Sections の使い方が公式ドキュメントやサンプルではわかりにくかったので、共有します。

```swift3
import UIKit
import Eureka

class MyFormViewController: FormViewController {

    // 初期値
    var selectedFruits = "バナナ"

    override func viewDidLoad() {
        super.viewDidLoad()

        // Single Selection の List Section を作成
        form +++ SelectableSection<ListCheckRow<String>>("好きなフルーツ", selectionType: .singleSelection(enableDeselection: true))
        
            let fruitsList = ["りんご", "バナナ", "みかん"]
            for fruits in fruitsList {
                form.last! <<< ListCheckRow<String>(fruits){ listRow in
                    listRow.title = fruits
                    listRow.selectableValue = fruits

                    // 選択状態にしたい項目にのみ value をセットする
                    if selectedFruits == fruits {
                        listRow.value = fruits
                    } else {
                        listRow.value = nil
                    }
                }
            }
    }

    //
    // 選択が変更された時の処理
    //   ２回呼ばれる。
    //     １回目：　oldValue = some  ,  newValue = nil
    //     2回目：　oldValue = nil   ,  newValue = some
    //
    override func valueHasBeenChanged(for row: BaseRow, oldValue: Any?, newValue: Any?) {
        if newValue != nil {
            if row.section === form[0] {
                switch (row.section as! SelectableSection<ListCheckRow<String>>).selectedRow()?.baseValue as! String {
                    case "りんご":
                        // りんごが選択されました
                    case "バナナ":
                        // バナナが選択されました
                    case "みかん":
                        // みかんが選択されました
                    default:
                        // その他・・・
                }
            }
        }
    }
}
```

ポイントは以下ですね。
・選択状態にしたい項目にのみ value を設定する
・変更された際に値を得るには valueHasBeenChanged を実装する必要があること
・valueHasBeenChanged　が２回呼ばれること
Railsでenumを使用して都道府県のセレクトボックスを実装する

Railsでの都道府県のプルダウンは他にもやり方はありますが、今回はenumを使用して実装します。

## enumを使用するため、work_locationカラムをintegerで作成(追加)する。

```schema.rb
t.integer  "work_location"
```

## モデルに以下を記述
```job_administration.rb
  enum work_location: {
    北海道:1,青森県:2,岩手県:3,宮城県:4,秋田県:5,山形県:6,福島県:7,
    茨城県:8,栃木県:9,群馬県:10,埼玉県:11,千葉県:12,東京都:13,神奈川県:14,
    新潟県:15,富山県:16,石川県:17,福井県:18,山梨県:19,長野県:20,
    岐阜県:21,静岡県:22,愛知県:23,三重県:24,
    滋賀県:25,京都府:26,大阪府:27,兵庫県:28,奈良県:29,和歌山県:30,
    鳥取県:31,島根県:32,岡山県:33,広島県:34,山口県:35,
    徳島県:36,香川県:37,愛媛県:38,高知県:39,
    福岡県:40,佐賀県:41,長崎県:42,熊本県:43,大分県:44,宮崎県:45,鹿児島県:46,沖縄県:47
  }
```

## formに以下を記述
```_form.html.erb
<div class="field">
  <%= f.label :勤務地、求人検索エンジン用 %><br>
  <%= f.select :work_location, JobAdministration.work_locations.keys, {prompt: '選択してください'}, class: 'form-control btn btn-info' %>
</div>
```
Postfixの設定を確認する

Postfixの設定をしていて、なぜかうまく行かないとき、まず試したいこととして「現在の設定の確認」があります。

```shell-session
$ postconf -n
```

このコマンドを実行すると、現在の設定がわかります。
設定ファイルの中でパラメータ名をミスしていると、ここに表示されません。
なので、書いたはずのパラメータが出力されないなら、パラメータ名をミスしていると考えられます。
Lodashのチェーン記法について

##まえおき
Lodash はメソッドチェーンで書くことができる。
たまに書き方を忘れるのでメモ。


### 35歳を超える人の名前を取るケース

```js
var users = [
  { 'name': 'barney', 'age': 36 },
  { 'name': 'fred',   'age': 40 },
  { 'name': 'pebbles', 'age': 1 }
];
```

##チェーンを使わないと
```js
_.pick(_.filter(users, function(user) { return user.age > 35; }), 'name');

// => [ { 'name': 'barney' }, { 'name': 'fred' } ] 
```


##チェーンを使うと
```js
_(users)
  .filter(function(user) { return user.age > 35; })
  .pick('name')
  .value();

// => [ { 'name': 'barney' }, { 'name': 'fred' } ] 
```

##個人的には
チェーンのほうが見やすい。

＃チェーン記法の場合、最後に ``` .value() ``` つけないと中間オブジェクト返すことがあるので注意。

##参考
https://lodash.com/docs/4.17.4#prototype-chain
windowsでTensorFlow　その２

#概要
windowsでTensorFlowやってみた。

#プログラムの手順

##学習データの用意
[]か[,]
0,1かプラスマイナス４パイ以下とか

##モデルの作成
Xor問題ならtanhとsquare
Sin問題ならsigmoidとl2_loss
fizzbuzz問題ならreluとsoftmax

###入力、出力にplaceholder
x: [none, 1]
y: [none, 1]

###重みとバイアス用にVariable

##活性化関数を使う
relu,tanh,sigmoid

##ロス値を定義

###損失関数使う
クロスエントロピーや二乗


##最適化の方法定義
Gradient　Optimaizerで万能

##セッションを定義して学習する。
１００００回やる。
Pdedictで学習データを食わせる。

##テストデータで取り出す。
argmaxとか
推定ならoutputが１
分類ならoutputが２以上
gem kramdown 1.13.1がbundle installできない


middlemanを利用したアプリケーションをローカルで動かすために`git clone`してきたが、はまった。

```
$ bundle install
Bundler::GemspecError: Could not read gem at /Users/opiyopiyo/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/cache/kramdown-1.13.1.gem. It may be corrupted.
An error occurred while installing kramdown (1.13.1), and Bundler cannot continue.
Make sure that `gem install kramdown -v '1.13.1'` succeeds before bundling.
```

Rubyのバージョンが古いとダメみたいな記事はあったのだが、`ruby 2.3.3p222`。
新しいよね。2.3.3だから。

で困っていたのですが、解決。

```
$ rm -rf /Users/opiyopiyo/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/cache/kramdown-1.13.1.gem
$ bundle install
.
.
.
Installing kramdown 1.13.1
.
.
Bundle complete!
```

`Bundler::GemspecError`ってエラーの時は、対象のgemファイルを削除してみると良いかも。

以上！
iOSのUIWebView/WKWebViewでmovファイルがアップロードできない問題


## 問題
内容を見るとおそらくMP4でも起きるであろう問題。
問題としては、iOSでwebviewで表示しているページのinputタグからmovファイルをアップロードしようとするとクラッシュする、というもの。

調べてみるとどうやらこのバグレポートが該当するっぽい。 http://www.openradar.me/28016475

これが起こる条件としては

* WebView on iOS
* multiple属性の`input`タグ
* カメラロールからmovファイルを選択

となる。

ちなみにmobile safariでは起きない。

## 原因
複数選択可能なfileフォームでカメラロールから動画を選択すると、動画が圧縮されないというiOSのバグ。圧縮されていない動画をJavaScriptでは処理できないためクラッシュする。

## 解決
`<input type="file" multiple />` からmultiple属性を外して
`<input type="file">` として複数選択を禁止すれば良い。
単一選択フォームだとこのバグは再現しない。

ただ、こうなるとiOSユーザーにファイルの複数選択ができなくなる不便を強いることになる。
せめて動画アップロード専用のフォームを用意するくらいはしたい。
minitestでSQLのUniqueを検証する

# やりたいこと
SQLite3にもユニーク制限をかけているのでそれをminitestで確認したい

#環境
os:Windows 7
ruby:2.4.0
rails:5.0.2

# 方針
Modelにもvalidationを設定しているので直接SQLを発行して例外が発生すること検証する。

# テストコード
```ruby:user_test.rb
  test "Unique constraint of name by sql" do
    User.create(name: 'hoge')
    before_user_count = User.all.length
    assert_raise(ActiveRecord::RecordNotUnique, "Not find exception") do
      con = ActiveRecord::Base.connection
      con.execute("INSERT INTO users(name) VALUES('hoge')")
    end
    after_user_count = User.all.length
    assert_equal(before_user_count, after_user_count)
  end
```

# その他
そういえば、これを実装した後にsaveのオプションにvalidate: falseがあったのを思い出した(ただし記憶は大分古い)
今のrailsでも対象のオプションが存在するならそっちを使ったほうが明らかに速い気がする。
ipywidgetsのタブにタイトルをつける

ドキュメントのどこを探しても、Google先生にきいても見つからなかったので備忘録。

```python
from ipywidgets import Text, Tab

list = ['P0', 'P1', 'P2']
titles = {0:'P0', 1:'P1', 2:'P2'}
children = [Text(description=name) for name in list]
tab = Tab(children=children, _titles=titles)
tab
```

![613a242d-19dd-4f01-abd6-186d7dd5e49a.png](https://qiita-image-store.s3.amazonaws.com/0/22023/78fc9821-06b1-44dc-4c2a-aed98935cb53.png)
LaravelでタスクAが成功したらタスクBを実行する

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Laravel%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AFA%E3%81%8C%E6%88%90%E5%8A%9F%E3%81%97%E3%81%9F%E3%82%89%E3%82%BF%E3%82%B9%E3%82%AFB%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/)をご覧ください😀

Laravelのタスクスケジュール便利ですよね。

ジョブ管理ツールのように『タスクAが成功したらタスクBを処理する』といった事もできました。

## タスクAが成功したらタスクBを処理する

```php:app/Console/Kernel.php
class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        //毎時タスクAを実行する。成功した場合にタスクBも実行する。
        $schedule->command('app:taskB')->hourly()->when(function () {
                return Artisan::call('app:taskA');
        });
    }
}
```

## 解説

`when`メソッドはtrueのときにタスクを実行します。
`Artisan::call`はexitコードを返すので、taskAを下記のようにすることで処理結果の判定が可能です。

```php:app/Console/Commands/taskA.php
class taskA extends Command
{
    protected $signature = 'app:taskA';

    public function handle()
    {
        if (処理) {
            // 成功したら1を返す
            return 1;
        }

        // 失敗したら0を返す（何も返さない場合も0だけど明示的に）
        return 0;
    }
}
```

ステキです。
rex0220 自動採番Ex プラグイン

# kintone 自動採番プラグインVer.2のカスタマイズ（販売停止）

[自動採番プラグイン](https://cybozudev.zendesk.com/hc/ja/articles/209715393)が Ver.2 にバージョンアップされました。
[【Plug-in更新】自動採番プラグイン 機能追加・変更のお知らせ(2017/04/20)](https://cybozudev.zendesk.com/hc/ja/articles/115001967363--Plug-in%E6%9B%B4%E6%96%B0-%E8%87%AA%E5%8B%95%E6%8E%A1%E7%95%AA%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E6%A9%9F%E8%83%BD%E8%BF%BD%E5%8A%A0-%E5%A4%89%E6%9B%B4%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B-2017-04-20-)

番号桁数指定や「日付書式選択」の選択肢追加、２か国語対応など、だいぶ機能強化されています。

ただ残念なことに、「接続語設定」が必須とスマホ未対応はそのままです。
ということで、カスタマイズしてみました。

# カスタマイズ内容

- 「接続語設定」をオプションにする。
- PC/スマホ対応
- レコード追加画面で、番号に「(自動設定)」表示

これで、A00001, 201704T0001 など番号設定の自由度が上がります。
スマホ対応は、現場での要望はありそうです。

# プラグイン設定画面

プラグイン名は、「自動採番Ex」にしました。（Ex: Extension）
設定画面は、「接続後設定」がオプションになった以外は、変わりません。


![2017-04-22_12h10_45.png](https://qiita-image-store.s3.amazonaws.com/0/100572/6a31737b-04db-7f3b-6237-ddd9b37bc916.png)



# PC　レコード追加画面

見積番号に、プラグイン設定した例です。「(自動設定)」表示されています。

![2017-04-21_16h23_42.png](https://qiita-image-store.s3.amazonaws.com/0/100572/44c50774-e6dc-285f-2866-b4555bcd3693.png)

# スマホ　レコード追加画面

見積番号に、プラグイン設定した例です。「(自動設定)」表示されています。


![2017-04-21_16h34_31.png](https://qiita-image-store.s3.amazonaws.com/0/100572/07fed5f4-ae7f-4118-e919-7f4402450755.png)

# カスタマイズのポイント

スマホ対応のカスタマイズには、下記の変更が必要です。

- イベント名を　'app.record.～' から　'mobile.app.record.～' に変更します。
- APP番号は、kintone.app.getId() を使えませんので、 event.appId から取得します。
- CSS ファイルを指定できませんので、イベント処理で動的に CSS を追加します。
Tensorflow v1.0〜 keras2〜を入れる


関係ないですがtfって初期化遅くないですか？どうにかならないものか。
https://github.com/fchollet/keras/issues/1746

メモ書き程度だが、２点ほどエラーで引っかかった。
pip install tensorflowとnumpyのエラー。

バージョンが新しくなって過去コードはエラーになるものもある。kerasのConv2D関数など。
tensorflow：v1〜
keras：2.0.0〜

##環境
ubuntu14
python2.7

##cudaのバージョンを確認する
だいたいcuda7.5か8あたりを想定

```
nvcc -V
```

##cudaバージョンに合わせてtensorflowを入れる

```
pip install tensorflow      # Python 2.7; CPU support (no GPU support)
pip3 install tensorflow     # Python 3.n; CPU support (no GPU support)
pip install tensorflow-gpu  # Python 2.7;  GPU support
pip3 install tensorflow-gpu # Python 3.n; GPU support 
```

これで見つからなかったので直接指定した

Tensorflow v1.0〜 keras2〜

```
sudo pip  install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0-cp27-none-linux_x86_64.whl
```



##サンプルを動かす

```py:tf.py
import tensorflow as tf

hello = tf.constant('Hello')
sess = tf.Session()
print(sess.run(hello))

a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a+b))
```

実行してみる

```
tf.py
```

Helloと42が返ってくる

##numpyエラーが出た場合
http://sechiro.hatenablog.com/entry/2016/04/02/Mac%E3%81%ABTensorFlow%E3%82%92%E5%85%A5%E3%82%8C%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89%E3%80%81Numpy%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E3%81%AE%E3%81%A7

numpyの場所を探って指定されてる場所のフォルダ名を変える。

```
import numpy
numpy.__file__
```

```
mv numpy numpy_old
sudo pip install numpy
```

で　動いた


#setuptoolsでエラーが出る場合

Could not import setuptools which is required to install from a source distribution.
Please install setuptools.

一回消して入れ直すとうまくいった。

```
pip uninstall setuptools
pip install setuptools
```



#kerasを入れる

##インストール

```
git clone https://github.com/fchollet/keras.git
cd keras
sudo python setup.py install
sudo pip install keras
```

##kerasが動くことを確認

```
cd examples
python mnist_mlp.py
```

```
60000/60000 [==============================] - 7s - loss: 0.2438 - acc: 0.9251 - val_loss: 0.1072 - val_acc: 0.9669
Epoch 2/20
60000/60000 [==============================] - 5s - loss: 0.1016 - acc: 0.9692 - val_loss: 0.0834 - val_acc: 0.9737
Epoch 3/20
60000/60000 [==============================] - 5s - loss: 0.0748 - acc: 0.9776 - val_loss: 0.0769 - val_acc: 0.9779
Epoch 4/20
60000/60000 [==============================] - 5s - loss: 0.0599 - acc: 0.9819 - val_loss: 0.0808 - val_acc: 0.9777
Epoch 5/20
60000/60000 [==============================] - 5s - loss: 0.0501 - acc: 0.9846 - val_loss: 0.0780 - val_acc: 0.9792
Epoch 6/20
60000/60000 [==============================] - 5s - loss: 0.0428 - acc: 0.9870 - val_loss: 0.0778 - val_acc: 0.9826
Epoch 7/20
60000/60000 [==============================] - 3s - loss: 0.0367 - acc: 0.9893 - val_loss: 0.0945 - val_acc: 0.9799
```
Microsoft Projectを上手に使うための心得

#Microsoft Projectを上手に使うための心得
※Microsoft Project 2010の利用経験を前提に記述していますが、以降のバージョンでもほぼ同様です。

Projectは一定の手順を守らないとすぐにへそを曲げる厄介なツールですが、
上手く使えば非常にスピーディにプロジェクト計画を立てられるとても便利なツールです。
以下に紹介する手順をおさえて、「あ、便利なツールなんだな」と思っていただければ幸いです。
ある程度理解が進んだら、リソースの管理や基準計画など便利な使い方にも進んでください。

はじめの鉄則として、開始日と終了日を手動入力しないこと。
初期設定と入力手順をしっかり守って、できる限り日付はProjectに自動入力させることが大事。
>本稿はこちらを下敷きに独自の手順を入れています。
[ins13の日記： MS-Project の使い方](https://srad.jp/~ins13/journal/331238)

以下、初めて使うためのチュートリアルです。順番を守ってどうぞ。

## 1.ショートカットを最低限覚える
・インデント　Alt+Shift+→ / Alt+Shift+←
・タスクのリンク Ctrl+F2

劇的に楽になる。
## 2. プロジェクト情報を設定する
### プロジェクトの開始日を設定する
プロジェクトタブ>プロジェクト情報から、開始日を設定する。
一番最初のタスクがプロジェクト開始日から始まるようになる。


### プロジェクト期間中の祝日・非稼働日を記載する
プロジェクトタブ>稼働時間の変更から標準カレンダーに非稼働日を入力する。
（土日はデフォルトで入っているので主に祝日）

### 新しいタスクを自動スケジュールにする
Projectのウインドウ左下に「新しいタスク：」という項目があるため、自動スケジュールにする。
すでに手動スケジュールが作成されていた場合、すべて選択して自動スケジュールに変更する。

### リソースシートにリソースを入力する
メニュー左上からリソースシートを選択し、リソース（作業担当者など）を入力する。
基本的には名前のみでよい。

##3. タスク名をひたすら書く
他の項目は一切いらないのでガントチャートへひたすらタスクを書く。
インデントすると、上のタスクにグルーピングされます。
可能であれば、先に着手するものが上にあるとリンクする工程が楽になるし、ガントチャートもみやすくなる。

##4. タスクに期間を入力する
親タスクは自動集計されてほしいので、直接入力はしない。

##5. 担当するリソース名を選択する
リストボックスから選択する。手動入力でもいいが、表記揺れ・誤記を避けるため選択推奨。
親タスクにリソースは入れない。

##6. タスクをリンクする
リソースごとに絞り込みして、上から順にタスクをすべてリンクすると、自動的に期間が入力される。
ここではまずリソースごとにリンクする。

##7．タスクをリンクする
前工程として必須のタスクをリンクする。凝りすぎない。



以上の手順を守ると、比較的意図したとおりに動いてくれます。

##追記　MSProjectファイルは共有しない方がいい
経験から、Projectはプロジェクト管理者のみ更新してメンバーは参照のみにしておくべきと感じています。
理由は壊れやすいから。
・いつのまにか手動更新になっていたり
・開始/終了日を固定入力されていたり
・リソースを勝手に追加されてタスクの期日が半分になっていたり
・リソース名の表記が違ったり
・リンクが切れている/追加されていたり
など、ちょっとしたことで本来の「プロジェクト計画」ツールとしての機能が損なわれます。
進捗は別の方法で管理して、Projectへの実績入力はProjectを理解している人がやるべきと思います。

## 続編
[Microsoft Projectを上手に使うための心得 その２](https://qiita.com/koforest/items/79e2b79de8447fa422dc)