OmniAICreator/Qiita-1.07M huggingface dataset:
FromBodyで指定したPostリクエストがnullを受け取る件

# どういうこと？
こんなコントローラを書いたとする。例なのでバリデーションのチェックや例外とかは気にしない。

```
[HttpPost("/api/post_something")]
public async Task<ActionResult<bool>> PostSomething([FromBody] SomeRequest request)
{
  var ret = await SomeService.DoSomething(request);
  return Ok(ret);
}
```
ここで`SomeRequest`は自分で定義したクラスだ。例えばこんな感じだとしよう。

```
public class SomeRequest
{
  public string Memo { get; set; }
  public User UserInfo { get; set; }
}
```
Userクラスは名前と年齢を持つだけのクラスとする。折角なのでコンストラクタも定義しておくとしよう。

```
public class User
{
  public string Name { get; set; }
  public uint Age { get; set; }

  public User(string name, uint age)
  {
    Name = name;
    Age = age;
  }
}
```
至ってシンプル。それっぽいjsonを書いてリクエストを投げてみよう。

```
{
  "memo": "これは試験的に投げるリクエストだよ。",
  "user_info":
  {
    "name": "ほげ子",
    "age": 17
  }
}
```
するとrequestはSomeRequestのインスタンスに正しくマッピングされず、nullになる・・・。
一体何故？
# 解答
Userクラスにデフォルトコンストラクタを定義していないのが原因。こうすれば正しくマップされる。

```
public class User
{
  public string Name { get; set; }
  public uint Age { get; set; }

  public User() {}

  public User(string name, uint age)
  {
    Name = name;
    Age = age;
  }
}
```
# 経緯
複数のクラスを入れ子にしたクラスのメンバーを持ったリクエストメッセージを指定したら、どうにもリクエストが正しくマップされなくて小一時間悩んだのがきっかけ。例はかなり単純なのですぐに気づきますが、何のエラーも出ないので遭遇した時は頭を抱えました。
Python3 とりあえず理解する例外処理

#例外処理について
いまいち理解できなかったので、ざっくり覚えて使ってたらなんとなくわかってきた

##try:
```python:
try:
   r = x + y
   print(r)
   z = True
```
ここには処理したい内容を記入
この場合 r に x + y を代入した後rを出力する
後々の判定で分かり易くするため最後にz に True を代入

##except:
ここにはエラーが起きた場合の処理を書く
TypeErrorと書いてあるのはエラーの種類
エラーの種類とエラーが出た時にコンソールに出てくる英文の左端の方にかいてあるやつ
エラーが起きたら z に False を代入

```python
except TypeError:
    z = False
```

#finally:
```python
finally:
    if z:
        print("エラー起きてないよ")
    else:
        print("エラー起きたよ")
```
ここにはエラーが起きようが起きまいが最後に処理する項目を書く
この場合zの中身を判定して文字を出力



#どうなるか
```python:エラーにならない場合
x = 1
y = 2

try:
    r = x + y
    print(r)
    z = True

except TypeError:
    z = False

finally:
    if z:
        print("エラー起きてないよ")
    else:
        print("エラー起きたよ")

# 結果
>>> 3

>>> エラー起きてないよ
```
***r = 1 + 2***
***print(r)***
見て分かるようにエラーになる処理がないので
最後の ***z*** に ***True*** が代入され ***try:*** 内の処理は無事成功
エラーがー起きようが起きまいが処理する***finally:***に飛んで
ifで z を判定、z は True なので ***print("エラー起きてないよ")*** が実行される

```python:エラーにならない場合
x = 1
y = "文字"

try:
    r = x + y
    print(r)
    z = True

except TypeError:
    z = False

finally:
    if z:
        print("エラー起きてないよ")
    else:
        print("エラー起きたよ")

# 結果
>>> エラー起きたよ
```
x は***数値***で y は***文字列***
文字列型と整数型を + する、加算は出来ないので所謂くっつける場合はstr(整数型)としないとTypeErrorが発生します
なので、ここでエラーが発生して r に代入どころか次の行の print(r) にも行けず
***except TypeError:*** に飛んで ***z = False*** の代入をします
おなじみ***finally:***はエラーが起きようが起きまいが処理するので
z を判定すると False なっているので ***print("エラー起きたよ")*** が実行されるという

本来は

```
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
このようなエラーが出て処理がプログラムが停止するけども
例外処理をすることによって、エラーが発生しても停止せずに処理を続けることができる


#コードを臨機応変にさせよう
【TC39 Proposals】Math.seededRandoms()

# 注意書き

2019 年 10 月 9 日に開催の [#tc39_study](https://web-study.connpass.com/event/147538/) 用に作成した資料です。
執筆時点で TC39 の Proposals に上がっている機能を紹介します。
将来的に JavaScript（ECMAScript）に取り入れられるかもしれませんし、取り入れられないかもしれませんし、紹介内容から仕様が大きく変更になるかもしれません。
TC39 の承認プロセスについては、https://tc39.es/process-document/ をご覧ください。

---

# Math.seededRandoms()

従来の `Math.random()` と `window.crypto.getRandomValues()` は乱数種の設定をすることができず、乱数種の制御が必要な場合は外部ライブラリ等を使用する必要がありました。
本 Proposal は、乱数種の設定ができる擬似乱数生成器（PRNG; Pseudo Random Number Generator）を導入します。
単体テストや実験などで再現性のある乱数列が必要な場面で役立ちます。
また、以下の乱数を使ったHoudiniのデモで、実行毎に結果が異なる問題を解消することができます。
https://css-houdini.rocks/rough-boxes/

本記事の執筆時点で Stage 1 です。

---

# 使い方

core-jsのPolyfillが使えないため、コードは [spec](https://github.com/tc39/proposal-seeded-random) からの引用です。

---

## PRNGの作成と乱数生成

`Math.seededPRNG({ seed })` によってPRNGオブジェクトを作成します。
`seed` プロパティを持ったオブジェクトを引数に与えることで乱数種を設定します。
長いビット長の乱数種を必要とする乱数生成アルゴリズムが採用されたら、`seed` はNumberではなくなる可能性もあります。

PRNGオブジェクトの `random()` メソッドを呼び出すことで擬似乱数を生成します。

```javascript
const prng = Math.seededPRNG({seed:0});
for(let i = 0; i < limit; i++) {
  const r = prng.random();
  // do something with each value
}
```

---

## PRNGの複製

`seed` getterによって、PRNGの現在の *state* を得ることができます。
*state* をseedとして新しいPRNGに渡すことで、PRNGの複製ができます。
以下の例では、複製した `clone` と元の `prng` が同じ擬似乱数を返すことが示されています。

```javascript
const prng = Math.seededPRNG({seed:0});
for(let i = 0; i < 10; i++) prng.random(); // advance the state a bit
const clone = Math.seededPRNG({seed:prng.seed});
// prng.random() === clone.random()
```

`seed` getterを持つので、PRNGの複製は以下のようにも書くことができます。

```javascript
const prng = Math.seededPRNG({seed:0});
const clone = Math.seededPRNG(prng);
// prng.random() === clone.random()
```

---

## サブPRNGの作成

一つの乱数列を複数の用途に使う場合の制御を簡単にするために、サブPRNGを生成できます。
サブPRNGはPRNGオブジェクトの `randomSeed()` メソッドを使います。

```javascript
const parent = Math.seededPRNG({seed:0});
const child1 = Math.seededPRNG({seed:parent.randomSeed()});
const child2 = Math.seededPRNG({seed:parent.randomSeed()});
// child1.random() != child2.random()
```

---

## その他

* ユーザーの環境（ブラウザやNode.js、それらのバージョン）に依存せずに同一の乱数列になるように検討されています
    * このProposalではアルゴリズムは変更できず、一意に決められる必要があります
    * 生成速度と乱数の性質のバランスを考慮してアルゴリズムが検討されています
* PRNGオブジェクトをIteratorに対応することが検討されています

---

# Polyfill

core-js内にあるものは2018年1月時点の仕様であり、上記の仕様と大きく異なります。

---

# 所感

科学技術計算やコンピュータグラフィックスであると便利なやつ。
ただ、まだ検討事項が多くてStageが進むのは遅いかも。

---

# 参考情報

* https://github.com/tc39/proposal-seeded-random
C言語　構造体とポインタ　実践を意識rev2

[前の記事](https://qiita.com/Banayad/items/436f86156bd49df358e2)から引き続きコーディングです。
コメントでためになる意見を頂き、だいぶパクってしまってます(笑)
ざっくりと当初の期待通りの動きにはなってきたので、
あとはエラーケースを想定したり？ユーザー数拡張したり？何をしていこうかな～

```c:userinfo.c
#include "stdio.h"
#include "stdint.h"					// defined uint8_t　ここに潜んでいたのか！
#define NAME_SIZE		( 100 )   
#define AGE_SIZE		(  10 )   
#define ADDRESS_SIZE	( 100 )   
#define SEX_SIZE		(  10 )   
#define PHONE_SIZE		(  20 )   

typedef struct user_info {			
	uint8_t	 name[NAME_SIZE];
//  uint32_t  age;                  //デーモン閣下は100054才。
	uint8_t  age[AGE_SIZE];			//半角数字以外も入力されることを考慮するとこっちがいいのか。
	uint8_t  address[ADDRESS_SIZE];
//	uint8_t  sex;	         		//0:男　1:女　2:秘密	bool型は避けておこう。
	uint8_t  sex[SEX_SIZE];			//0入力後のEnterで止まってしまったのでこっちに
	uint8_t  phoneNumber[PHONE_SIZE];
}UserInfo;

UserInfo_input(UserInfo* user) {
	printf("名前を入力してください->");
	scanf_s("%s", user->name,sizeof(user->name));

	printf("\n年齢を入力してください->");
	scanf_s("%s", user->age, sizeof(user->age));

	printf("\n住所を入力してください->");
	scanf_s("%s", user->address, sizeof(user->address));

	printf("\n性別を入力してください->");
	scanf_s("%s", user->sex, sizeof(user->sex));

	printf("\n電話番号を入力してください->");
	scanf_s("%s", user->phoneNumber, sizeof(user->phoneNumber));

}

UserInfo_save(UserInfo* user) {
	FILE* fp;
	fopen_s(&fp, "test1.txt", "w");
	fprintf_s(fp, "【名前】\n%s\n", user->name);
	fprintf_s(fp, "【年齢】\n%s\n", user->age);
	fprintf_s(fp, "【住所】\n%s\n", user->address);
	fprintf_s(fp, "【性別】\n%s\n", user->sex);
	fprintf_s(fp, "【電話番号】\n%s\n", user->phoneNumber);
	fclose(fp);
}

int main(void) {
#if 0 
	UserInfo* userP;
	UserInfo user;
	userP = &user;
	UserInfo_input(userP);
	UserInfo_save(userP);
#else //これでいいのか！
	UserInfo	user;
	UserInfo_input(&user);
	UserInfo_save(&user);
#endif

	return 0;

}
```
telnetによるrootログインの設定

# 概要　
実務にて、telnet経由でrootユーザがログイン可能となるように設定する必要が生じたため、 telnetのインストールからログイン確認までの手順を記録しときます。
（通常こんなことしてはいけない）

# １．テスト環境
VMwareにてCentOS7を最小構成でインストール済み。SSH接続できる状態である。

```
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```
# ２．準備
## 2-1. telnetクライアントおよびサーバの確認
```
[root@localhost ~]# yum list installed | grep telnet
[root@localhost ~]#
```
ヒットなし。インストールされていないことを確認。

## 2-2. telnetクライアントおよびサーバのインストール
```
[root@localhost ~]# yum -y install telnet telnet-server
```

## 2-3. 自動起動の有効化
必要な場合のみ実施。

```
[root@localhost ~]# systemctl enable telnet.socket
Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.
```
自動起動の確認。

```
[root@localhost ~]# systemctl list-unit-files | grep telnet.socket
telnet.socket                               enabled
```
## 2-4. Firewallの設定
source addressのみ、実行環境に合わせて指定すること。

```
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule "rule family="ipv4" source address="192.168.11.0/24" service name="telnet" log prefix="telnet" level="info" limit value="1/m" accept"
success
```
設定を反映する。

```
[root@localhost ~]# firewall-cmd --reload
success
```

## 2-5. telnetの起動
```
[root@localhost ~]# systemctl start telnet.socket
```



# 3. telnet経由のrootログイン設定
## 3-1. rootユーザでログインできないことを確認
```
Kernel 3.10.0-957.el7.x86_64 on an x86_64
localhost login: root
Password:
Login incorrect

localhost login:
```

## 3-2. /etc/securettyの編集
securettyは、rootログインを許可する端末を指定するファイルである。
同時接続させたい数だけptsを追記する。
設定はファイル編集のみで反映される。

```:/etc/securetty
pts/0
pts/1
pts/2
```

## 3-3. rootユーザのログイン確認
現在使用中の端末はttyコマンドで確認できる。

```
Kernel 3.10.0-957.el7.x86_64 on an x86_64
localhost login: root
Password:
Last login: Tue Oct  8 22:52:38 from ::ffff:192.168.11.2
[root@localhost ~]# tty
/dev/pts/0
```
以上。

# 備考
pts(疑似端末)は自動で作成される。 
試しにTeraTermを3つ起動して、SSHで接続したら３つ（0~2）まで自動生成された。

```
#ls /dev/pts
0 1 2 ptmx
```

# 参考
 - [CentOS7でtelnetを有功にする](https://qiita.com/montblanc18/items/8b4fd2cf150913c6e1c2)
 - [rootログインの制御](http://capm-network.com/?tag=root%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E5%88%B6%E5%BE%A1)
 - [pts - スペシャルファイル (デバイス)の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/p/pts.4.html)
pandas→networkx→pyvisでネットワーク分析＆可視化(その3）

[前回](https://qiita.com/niship2/items/07dda072837c571338e0)のつづき。

# 1.前回
from_pandas_edgelist。で読み込んだノードに属性を付ける方法として、networkxのset_node_attributesを使って

    nx.set_node_attributes(G, node_attr_dic)

でnode_attr_dicという風に辞書を使えばOKと書いた。


# 2.失敗
しかしこれをpyvisで読み込ませてみると、せっかく入れたnode_attr_dicがすべて消えてしまうという素敵なことが起こっていた！
振り出しにもどる。



# 3.修正
ということで、結局辞書を使わず、最初に存在するエッジ情報(edges)からnode_dfを生成し、そこにpyvis用の属性情報を追加するという流れでやることに。

    import networkx as nx
    edges = pd.DataFrame({'source': ["A","A","A","B","B","C","C","D","E"],
                      'target': ["B","C","D","D","C","E","D","E","A"]}) 
    G = nx.from_pandas_edgelist(edges, edge_attr=True)


これでedgesというデータフレームを作成してから、

    def re_construct_network(edge_df):
        #nodeの生成
        G = nx.DiGraph
        G = nx.from_pandas_edgelist(df2,source="source",target="target") 

        #node_df生成。一回edgelistからnetworkxを経由してノードリストを生成しておく。
        node_df=pd.DataFrame(list(G.nodes()),columns=['nodes']).sort_values(by='nodes')  
         #この段階でnode_dfに列を追加して属性候補を入れても良い。  

        #edgelistの再生成（）
        edges=[]
        for index, row in edge_df.iterrows():
            edges.append((row[0],row[1]))
        
        #nodeをpyvisに読ませる＋同時にedgeをpyvisに読ませる。
        g = Network(height='500px', width='750px',directed=True)
        node_id = node_df['nodes'].tolist()　#
        node_x = ~~(出力時のx位置) #lambda式などでの処理もOK
        node_y = ~~（出力時のy位置)
        node_value = node_df['///'].tolist()
        node_title = node_df['~~~'].tolist()
        node_color = node_df['$$$'].apply(setcolor).tolist()　#色指定の関数を外に出してlamda式で使う。
        node_label = node_df["%%%"].astype(str).tolist()
            
        #add_nodesで指定できるのが ["size", "value", "title", "x", "y", "label", "color"]
        g.add_nodes(node_id,label=node_label, title=node_title,color=node_color)
        g.add_edges(edges)
        g.toggle_physics(True) #動かしたい場合
        g.show_buttons(True)   #出力後の調整バーを入れる場合
        g.show("network_pyvis.html")
    
    
以下を実行すればnetwork_pyvis.htmlとして出力結果が見られる。

    re_construct_network(edge_df)

g.add_nodesとg.add_edgesをする際にIDとして
node_idを指定して、node_idとedge_dfのsourceとtargetの要素が一致する
必要がある点がミソ。
ちょっと手間がかかるけど、node_dfに色々属性渡して保持できるのは便利。
twitモジュール使ってキーワード指定したつぶやきをリアルタイムで抽出する

# はじめに
twitモジュールが便利すぎたので記念に投稿。

# 参考書籍
[JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック](https://www.amazon.co.jp/JS-Node-js%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC-%E3%83%8D%E3%83%83%E3%83%88%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4883379930/ref=sr_1_fkmr0_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=node.js%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94&qid=1570546373&sr=8-1-fkmr0)

# 実行環境
・Windows10
・VirtualBox 
・Vagrant 2.2.5
・Node.js v6.17.1
・Twitter Developers 登録済み

# モジュールのインストール
ソースコード置き場に移動して以下のコマンド実行。
成功すると、同ディレクトリ上にnode_modulesディレクトリができあがる

```
[vagrant@localhost 02-twitter]$ npm install twit --no-bin-links
/vagrant_data/src/ch06/02-twitter
mqw twit@2.2.11
  mqw request@2.88.0
    mqw http-signature@1.2.0
      mqw sshpk@1.16.1
        tqq asn1@0.2.4
        tqq bcrypt-pbkdf@1.0.2
        tqq dashdash@1.14.1
        tqq ecc-jsbn@0.1.2
        tqq getpass@0.1.7
        tqq jsbn@0.1.1
        tqq safer-buffer@2.1.2
        mqq tweetnacl@0.14.5

npm WARN enoent ENOENT: no such file or directory, open '/vagrant_data/src/ch06/02-twitter/package.json'
npm WARN 02-twitter No description
npm WARN 02-twitter No repository field.
npm WARN 02-twitter No README data
npm WARN 02-twitter No license field.
[vagrant@localhost 02-twitter]$ ls
node_modules  twi-app-test.js
```
# Twitter APIキーを確認する
1. [Twitter Developers](https://developer.twitter.com/content/developer-twitter/ja.html)にログインする
2. 画面右上あたりにある[Get Started]クリック
3. 画面真ん中あたり[Create An App]クリック
4. 画面の指示に従ってアプリ登録に必要な事項を記入＆登録
5. 登録されたら４種のキーが発行されるのでメモとる
   ↓↓みたいなやつがもらえる

```:キーは使われると困るので伏字(***)にしてます
Consumer API keys
******************* (API key)
@@@@@@@@@@@@@@@@@@@ (API secret key)

Regenerate
Access token & access token secret
???????????????????? (Access token)
!!!!!!!!!!!!!!!!!!!! (Access token secret)
```

# プログラムの作成
ごく短いプログラムを作る↓↓

```
// Twitterを使ったテスト
var Twit = require('twit');

// 以下正しいキーを設定
var T = Twit({
    consumer_key:'*******************',
    consumer_secret:'@@@@@@@@@@@@@@@@@@@',
    access_token:'????????????????????',
    access_token_secret:'!!!!!!!!!!!!!!!!!!!!'
});

// Javascriptに関するつぶやきを表示する
var stream = T.stream('statuses/filter', {track: 'Kaggle'} );
// つぶやきがあったときに呼ばれるイベントを設定
stream.on('tweet', function (tw) {
    var text = tw.text;
    var user_name = tw.user.name;
    console.log(user_name + "> " + text);
});
```

# うごかしてみる
実行結果は↓↓。　※試しの雰囲気を見てほしいだけなので名前とかは伏字にしときます
起動してぼんやり眺めるだけでもなんとなく楽しいかもしれない。

```
[vagrant@localhost 02-twitter]$ node twi-app-test.js
????> RT @MLBear2: 幸いにも上位に入れたので初めてSolutionを投稿しました。特殊なコンペ(?)だったので他コンペにそのまま流用で きるノウハウは多くないかもですが、adversarial validationをあえて完全無視したとか、他のsolutionが書いてないよ…
????> @radekosmulski @jeremyphoward @kaggle @RSNA @threader_app
????> Curiosamente, las mayores dificultades que encuentro son la manipulacion de datos previa entrada a la red, y que el… https://t.co/jHmvM68xdu
```
自分用メモ(editとDelete)


<h2>Edit</h2>

edit_post_path(post)
→postオブジェクトを渡しているので、post.idを渡している(Railsはオブジェクトを一意に表す値を取得しようとするから)
→/posts/id/というようなパスが生成




<h2>bundle install と bundle updateの違い</h2>

「前提」
(設計図)gemfile・・・gemfileに書くもの全ては書いてない
90記載

↓設計図を元に作るーbundler(gemfileに書いてないもの残り10を取ってくる)

(設計した結果)gemfile.lock
100記載

「bundle update」

gemfileを元に
↓
bundle update
↓
gemfile.lockを更新

「bundle install」
A,B,Cをgemとする。Bのアップデート後をB'とする。
gemfileにA,B,C
gemfile.lockにA,B'が記載されているとする




gemfile.lock 
↓
bundle install 
gemfile.lockに書かれている A,B'のgemをインストール
gemfile.lockに書かれていなくて、gemfileに書かれているgem Cをインストール
↓
gemfile.lockを更新

→gemfile.lockにもともと記載されていたgemはアップデートされない



<h2>bundle install とbundle updateの使い分け</h2>


新しい環境に変わった・新しくgemfileに新しくgemを記載した(ローカル環境で行う)
↓
bundle install
※本番環境で行うと、gemが更新されクラッシュするので注意
ーーーー

gemのバージョン更新
↓
bundle update


参考
https://qiita.com/lasershow/items/1a048d03ddaaba98171e

<h2>ユーザーmodel作成</h2>
メルアドはデータベースレベルで一意性を保ちたいので、indexつけて、それをunique: trueにする

bcryptとpassword_digest作ったら
models/user.rb　にhas_secure_passwordを書く
→仮想属性password と password_confirmationが作られる



DB
疑問↓
データベース単位で受け取れる値を決めた方が良いのか(db:migrate前でデータの制約)
データ送信時にデータを検証した方が良いのか
ローデータから、特定の列に絞ってまとめたデータセットを作る

データベースから抽出したデータではなく、そこからある列を軸にデータをサマリたものを分析のローデータとして使いたい場合、私はpivot_table機能を使ったうえで、csvに出力と再読み込みをしている。


#データの例
下記のようなデータセットを想定する。

受注番号           |    商品番号        |    受注数　　　    |
|:----------------:|------------------:|:------------------:|
| 1111             |          A01      |         2          |
| 1111             |          A02      |         3          |
| 1111             |          A03      |         1          |
| 2222             |          A01      |         1          |
| 2222             |          A02      |         4          |

上記のデータを、受注番号が1列目、商品番号を列名に持つテーブルに整形したい。

整形した後のテーブル
      A01 A02 A03
1111   2   3   1
2222   1   4   0

#プログラミング
下記が筆者のプログラミング。改善点をぜひ指摘してください……。

```ruby:qiita.rb
import pandas as pd
from pandas import Series, DataFrame
raw_data = pd.read_csv('url.csv')

#ピボットテーブル形式でまとめる
df = raw_data.pivot_table(values = ['受注数'], index = '受注番号', columns = '商品番号',aggfunc = 'sum')
#NaNを0に置き換える
df = df.fillna(0)

#csvに出力
df.to_csv('url_2')

#出力したcsvを読込
df2 = pd.DataFrame(pd.read_csv('url_2'))

##列名を整える（最初の列名は受注番号、それ以降はカテゴリ名が来るようにする）

#カテゴリ名を取得
titles = list(df2.iloc[0,1:])

#最初の列名を”受注番号”にする
titles.insert(0,'受注番号')

#列名を変更
df2.columns = titles

##最初の2行を削除（不要なので）
df2 = df2.drop(df2.index[[0,1]])

```

pivot_tableを使ってcsvへ出力→再入力という手間をかけなくても、groupbyとかでスマートにできないか、と思うのだけれど、イマイチ妙案が浮かばない…。
label.html

### `<label>`タグの指定方法
- <label>タグで囲う場合

```
<label>
  <input type="radio" name="radio">ジャガイモ<br>
  <input type="radio" name="radio">さつまいも<br>
</label>
  <input type="submit" value="芋センターへ送信する">
```

参考
[`<input>`の使い方とtype属性の一覧をサンプル付きで紹介](https://webliker.info/39533/)
Webhookで使われる署名検証をRubyで実装する

自分用メモ

```
digest = OpenSSL::HMAC.digest("sha256", "key", "data")
signature = Base64.strict_encode64(digest)    // UDH+PZicbRU3oBP6bnOdojRj/a7DtwE32Cjjas4iG9A=
```
npmでのモジュールのインストールしたときに失敗した時の対処法

# はじめに
Windows上でVirtualboxを使って開発環境を作ったとき
共有フォルダ設定を使ったパス上でnpm install...してるとエラーがでた。
これの対処法をメモ

# 参考
https://qiita.com/sansaisoba/items/0fd5c77c9fbbfe61a629

によると、
　Windows環境（と、Windowsホストの共有フォルダにVagrantなどからnpmを実行した場合）では、
　npm installで以下のエラーが発生することがある。
…だそうです。

自分の環境は、Windows+Virtualbox+Vagrantなのでまんま同じシチュエーションだった。。。

# やること
npm install [モジュール名] --no-bin-links
という感じで末尾にオプションを作る

実際は↓↓な感じ。twitモジュールをインストールするときはこうする。

```
$ npm install twit --no-bin-links
```
知っ得ハンズオン はじめての迷路脱出 ~AWS RoboMakerと強化学習~を受講したよ(2019年10月8日実施）

##知っ得ハンズオン はじめての迷路脱出 ~AWS RoboMakerと強化学習~を受講したよ

![IMG_0581.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1ee4f3a9-8479-4578-af85-faf3fbc69d3f.jpeg)
![IMG_0583.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bbdd1fc3-0dad-ff13-b86e-7b0557355950.jpeg)
![IMG_0584.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/47d0d50f-38a2-cc55-ba4e-5a520493c6e3.jpeg)

テキストは、Githubで公開されています。
https://github.com/aws-samples/aws-deepracer-workshops/blob/master/Workshops/2019-AWSSummits-AWSDeepRacerService/Lab1/Readme-Japanese.md

18時30分から開始して、1時間後には、ROSのGAZEBOでシミュレーターが動いています。
残念ながら、学習モデル作成には1時間以上かかるために時間中には終わりませんが・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3400aa8f-cfbb-bfc9-99fa-51ed7446ce4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3a1dd1a1-257b-5261-88d8-62fa4e130a4d.png)

AWS上でROSの環境を構築し、GazeboやRvizを簡単に構築し、さらに、学習までできるというのは一見の価値ありです。

##Gazeboのシミュレーションのマップ
Blenderで製作されたそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0c202a27-d5b1-b161-c32a-392d0ea359be.png)

余談ですがRvizのxacroをVSCodeで作成も可能になったようです。
https://kuwamai.hatenablog.com/entry/2019/10/06/193715
これでクラウドだけでシミュレーション可能になりましたね。

AWS RoboMakerはROS2対応をしていくそうなので、今後、AWS RoboMakerでクラウドからROSのノードを操作できるようになるのではないでしょうか？

##シミュレーション料金
AWS RoboMakerの1シミュレーションユニット1時間あたり0.5ドル程度とのことです。
今回は5シミュレーションなので、1時間動かすと、2.5ドル程度かかるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6e5d94b2-3d56-9ce0-2b5e-988737d118e2.png)

##学習データ
bundleフォルダのoutput.tarファイルを送ることで、フリート管理は依存関係を含めて、移動可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2eacff5a-3427-967c-563f-31f6df4e4628.png)

ただし、Intel系用に作っており、Arm系については、「モデルをロボットにデプロイ (オプション)」を追加で行うようにとのこと。
https://aws.amazon.com/jp/robomaker/resources/train-a-robot-using-reinforcement-learning-project/5/

##終了後は
いつものことですが終了後はリソースの削除を行う事。
Android版Chrome(ver77)でブラウザのcomfirmダイアログが消える原因

## 現象
フォームの入力画面において、ボタンをタップするとwindow.confirmダイアログが一瞬表示されたのちに消える。
→ダイアログのOKボタンでformのPOST送信処理を実行しているので送信できない！
確認した端末：Android(6,7,8)版chrome(ver77)。  
※iOS版は未確認。
**Android版chrome(ver76)では発生しませんでした。**

## 原因はFacebook Pixel

こちらの記事と同じ条件で発生しました。
[Facebook Pixel CodeとGoogle Chrome75の相性が良くない件について](https://qiita.com/neeton_iwasaki/items/ffb7e05b1eb7c2fadba2)

ボタンをクリックした時にFacebook PixelのPOSTが悪さをしています。
[Facebook Pixelとは](https://developers.facebook.com/docs/facebook-pixel)

## Facebook Pixelはページ内のどのjsが呼び出しているのか？
ページ内の管理担当外のどこかに埋め込まれた`<script>`タグが怪しいのでChrome Developer Toolsを使ってつきとめます。
マーケティング担当領域の計測関連のjsが呼び出していました。
![developer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452282/3df63d9b-cad6-f450-431f-1a0bc1ccbee7.png)
1. ［Network］パネルを開き、左のFilterとある入力欄に`fbevents.js`と入力
2.   Initiator列を見る。（fbevents.jsの呼び出し元が表示されている）
3.  呼び出し元のjsがHTMLの`<script src="~.js">`に記述されていなければ、更にそのjsのInitiatorを確認
※ページのソース内の`<script src="~.js">`にたどり着くまで繰り返す

## 対処方法
1. そのページだけfbevents.jsを呼び出さないように修正する
2. Facebook Pixelのコードをカスタマイズする。（特定のボタンだけイベント追加させるなど）  
対応方法参照:[Facebook ピクセル のコード埋め込みについてメモ](https://qiita.com/kubio/items/1a14d635f602ca6b2572)
[Facebook Pixel Advanced](https://developers.facebook.com/docs/facebook-pixel/advanced)
4. confirmのOKボタンを押した後のPOST送信処理を修正する  
対応方法参照:[Facebook Pixel CodeとGoogle Chrome75の相性が良くない件について](https://qiita.com/neeton_iwasaki/items/ffb7e05b1eb7c2fadba2)

# 参考
この記事は以下の情報を参考にしました。大変お世話になりました。
-  [Facebook Pixel CodeとGoogle Chrome75の相性が良くない件について](https://qiita.com/neeton_iwasaki/items/ffb7e05b1eb7c2fadba2)  
-  [Facebook ピクセル のコード埋め込みについてメモ](https://qiita.com/kubio/items/1a14d635f602ca6b2572)
CCNA Securityに受かったので、その時を振り返る(2019年2月に受験)

# 前略プロフィール
- 年齢 ３１歳(2019/10/08時点）
- 職種　インフラエンジニア（サーバからネットワークまで、わりと幅広くやってます）
- CCNP R&S 取得済み
- 情報処理技術者試験（SC)は４回連続落ち(だいたい午後２で死亡)
- TOEIC ７１５点

# CCNA Securityを受験しようと思った理由
- 未知の知識を**英語のみで勉強**し、**英語で受験**をしてみたかった。
- Ciscoが好きで、何かCiscoの試験を受けたかった。
- 受ける科目を検討した際、今後はSecurityとWirelessが伸びる分野だと確信した。
- 情報処理技術者試験でSC(セキュリティ)を受け続けていたので、とりあえずCCNA Securityを取得してみることにした。

# 参考書籍&サイト
- [CCNA Wireless 200-355 Official Cert Guide (Certification Guide)](https://www.amazon.co.jp/gp/product/1587144573) 
 - 全部で５００ページくらいあるが、CCNPで学んだ知識も少しは出てくるので、入りやすかった。

- [CCNA Security 210-260 Certification Guide: Build your knowledge of network security and pass your CCNA Security exam (210-260)](https://www.amazon.co.jp/gp/product/1787128873/) 
 - こちらも５００ページほどあるが、図が多く、頭に入りやすい感じだった。

- [３1 Days Before Your CCNA Security Exam: A Day-By-Day Review Guide for the IINS 210-260 Certification Exam](https://www.amazon.co.jp/gp/product/1587205785/) 
 - ページ数は300ほど。読みやすさは上記に挙げた書籍の中では一番だった。31 Days Before Your CCNA Security Examと謳ってるけど、これを１ヶ月読むだけで受かるほど内容が濃くないので要注意。

- [Securitytut](http://www.securitytut.com/)
いわゆる口コミサイト。
クラムメディアと同様で邪道と思われるかもしれないけれど、実際の試験ではOCG(Official Cert Guide)で網羅されていない問題も出題されるため、受験した人の体験談を読むことも試験対策の一つだと思う。こんな問題が出るよ、とまで事細かく書いてくれている記事もあるが、実際に試験を受けてみたところ、Securitytutで話題になっていた問題についての出題率は半分程度だった。

# 購入機器
 - [ASA５５２０](https://www.cisco.com/c/ja_jp/support/security/asa-5520-adaptive-security-appliance/model.html)
![ASA5520](https://www.cisco.com/c/dam/en/us/support/docs/SWTG/ProductImages/Security-ASA-5520_frnt_back_rt_1000.jpg "ASA5520")
 - 神田のネットワーク機器を扱っているお店で購入。中古で25,800円。

### 購入理由
 - 実機を触ることによる記憶力の向上と、実機があることによるモチベーション維持のため。
 - 試験ではコマンドからの設定だけではなく、ASDMと呼ばれるGUIによるツールの操作方法についても問われますが、実機が無いとASDMの操作について確認が出来ないため。
 - 余談ですが、このASA5520、ライセンスの都合でFirewallとしての機能は死んでいますが、VPNの設定は出来るし、ASDMで接続も可能なので、CCNA Securityの勉強に支障はありませんでした。
 - 参考までに、ASDMの管理画面です：
![SnapCrab_NoName_2019-10-8_23-1-40_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/80682274-f4b7-f791-6112-18281becbc7a.jpeg)

# 勉強方法
- 上に挙げた本をすべて読み通す。
- ASA５５２０を使って、実際にコマンドを使って設定・構築する。コマンド及びASDMでいじりまくる。
- Securitytutや、受験体験記などを読み漁る。個人ブログは信憑性が高くてオススメです。

# 試験について
- 全部で約65問
- D&D(ドラッグ&ドロップ): 3問
- Simulation: 1問
- MC(Multiple Choice、選択問題): 60問くらい
- 試験時間: 120分(英語で受験したので試験時間が伸びましたが、120分も悩む程度の知識だとfailすると思います。)
- 合格点: 860/1000点
- 結果: **877点**(超ぎりぎりでした)

# 今後、受験する人へ
- ２０２０年にCCNAの試験が大きく変わろうとしています。CCNA SecurityについてもCCNAの試験に包含されます。受験勉強に１ヶ月から２ヶ月ほどかかることを鑑みると、今から受験を目指すべきかどうか、慎重に考えるべきと思います。
- CCNA Securityに限った話ではないのですが、試験は英語で受けることをオススメします。Ciscoの試験は日本語訳が意味不明なことが多く、そこで惑わされるくらいなら英語で受けたほうが楽です。
- CCNA Securityで得られる知識はCCNP R&Sで学んだセキュリティの知識に加えて、VPNやIPS(特にCisco機器特有の取り扱い)についての基礎を学ぶ感じです。**この資格を取得したからと言って、VPNマスターにはなれません。**
Travis CIでの.NET Core 3.0の設定

プロジェクト自体を.NET Core 3.0に対応させていれば、あとは.travis.ymlでdotnetのバージョンを3.0.100に設定するだけ。

```yaml:.travis.yml
# 設定の例
language: csharp
dotnet: 3.0.100
mono: none
env:
  global:
    - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
    - DOTNET_CLI_TELEMETRY_OPTOUT: 1
script:
  - dotnet restore
  - dotnet test MyProject
```

バージョンに使える数字は`dotnet --info`コマンドで調べることができる。将来新しいバージョンが出たときにはそれで調べるとよさそう。
スプレッドシートからGoogleAppsScriptでメール送信

マクロは、やったことないけど、スプレッドシートの
マクロのようなGoogleAppsScriptを使って見ました。

具体的に何をやったかというと、

+ スプレッドシートの一覧のメールアドレス宛にメールを一斉送信。
+ メールアドレス毎にメール本文の一部を変更。

そんな感じです。

参考にさせて頂いたサイトは、以下になります。
有難うございます。

以下サイトを見れば、ほぼ出来てしまうので、少し詰まったポイントだけご紹介します。

# 参考資料
- [SpreadsheetとGoogleAppsScriptでメールテンプレートに任意の文字列を埋め込んで一斉送信できるようにする](https://qiita.com/minanami/items/87641f09192be1b5010b)
- [Google Apps Script 入門](https://qiita.com/t_imagawa/items/47fc130a419b9be0b447)
- [初心者でも簡単！Google Apps ScriptでGmailを操作してメールを送る方法](https://tonari-it.com/gas-gmail-sendemail/)

# あれ？どうしようと思ったポイント
## Gmailのアカウント、複数あるけど、どれから送られるだろう。。
Gmailって、複数のメールアドレスを管理できます。
私の場合、3つのメールアドレスを受信/送信しています。

```
GmailApp.sendEmail
```
で送るときに、どのアカウントから送られるんだろうって一瞬思って、調べたら
[初心者でも簡単！Google Apps ScriptでGmailを操作してメールを送る方法・・fromアドレスの設定について
](https://tonari-it.com/gas-gmail-sendemail/#toc4)
に書いてありました。
「fromアドレスの設定について」です。

## 送る前に宛て先、本文、ちゃんとスプレッドシートから取得できているのかな・・・？
ブレイクポイントが設定できて、デバック実行がありました。。
いやいや、ほんと何か何まで至れりつくせりです。

## あれ？送信履歴が見たい。。
仕組みとして、GmailApp.sendEmail は、Gmailを使っているだけです。
なので、Gmailの送信履歴を見て見ると！
全部、送信履歴に載っています。

## 1日に送信できるメールアドレス数が決まっているので要注意！
無料アカウントだと、1日に送信できるメールアドレス数が100までです！
1通に2メールアドレスがあると、50通までです。
1通に1メールアドレスだと、100通までです。

メール送信時にハマリました。。
MySQL:覚えた知識を日々書き留める#1

タイトル通り、覚えたことをアウトプットすることで定着と理解を深めようというものです。
メモ書きですが何かの役に立てば幸いです。

#1,MySQLをコマンドプロンプトで操作

　・起動
　　`mysql -u root -p`

　・データベース作成
　　`create database データベース名`

　・データベース移動
　　`use データベース名`

　・テーブル作成
　　`create table テーブル名(カラム名)`

#2,エラーが出て解決したのでメモ
　・テーブル作成時、auto_incrementを設定したカラムは主キーにしなければならない。

　・テーブル作成時、主キーを複数設定する場合は一番最後にまとめて指定する。

例：

```sql
create table sampletable(
　　　　　　id int,
　　　　　　name varchar(10),
　　　　　　age int,
　　　　　　primary key(id,name));  
```
SQL*Plusで複数の文を一度に流す方法


#始めに(自己紹介)
最近SierからWebエンジニアになろうと思って勉強を始めました
今回の記事もその一環で、何かアウトプットの練習がしたいと思っての記事です
かなり初歩的かつわかりづらい内容かと思いますがご容赦ください

#対象
SQL超初心者
#概要
先輩からいくつかのテーブルの中身を消しておいてほしい
でも一文ずつ書くと間違えるかもしれないから一度で対象の全テーブルの中身を消すように
・・・とのこと（信用がない）

恥ずかしながらこれまで自分でSQL文を書いたことがなかったので
ググりながら書いてみた

探してもあまりピンとくる情報がなかったので(調べ方が悪いのか)
Qiita初投稿ネタついでに備忘として残しておこうと思う

#本編
###一つ目
delete from table1, table2, ... , tablen
みたいな文を流してみた
・・・エラー

どうやら複数のテーブルに対して一度にデリートはできないらしい
JOINで結合やらをしたら複数のテーブルからの削除はできるらしい。
下記、参考までに
[複数テーブルからDELETE](http://blog.higty.xyz/archives/320/)
ただ複数テーブルの全件削除の方法は見つからなかった

###二つ目
ここから記事のタイトルにあるものを実践することになります
どうやらSQL*Plusは入っているようだったので、SQLファイル(.sql)に
必要なSQL文を全部詰め込んで、それをSQL*Plusで流し込むという方法を取ることにした
[SQL*Plusとは](https://sql-oracle.com/?p=1724)

> cd SQLファイルがある場所のパス
> sqlplus ユーザID/パスワード
> @SQLファイル名


sqlファイルの中身はこんな感じ
> delete from table1
> delete from table2
> ...
> delete from tablen

これを流してみた
・・・最後の一文しか実行してない・・・

###三つ目
文の区切りとして、セミコロン(;)がないとダメらしい
> delete from table1;
> delete from table2;
> ...
> delete from tablen;

これで再度実施
・・・やっと出来た
ちなみにファイルの後ろにexitがないと実行と同時のコミットはしないっぽい

#終わりに
このくらいの記事書くのにもなかなか時間がかかった
今はProgateなどでインプット中心だけど、そこで引っかかったところとか
書いていきたいな〜と思ってます
【Rails】viewにおけるページタイトルの扱い方

##開始タグ
ページタイトルの存在がすっぽ抜けていたので設定しました。

##方法

ページタイトル例：`ログイン画面｜テストアプリ`

最初に`/app/views/layouts/`内にある何かのテンプレート内の`<title></title>`の中に以下を記述。

```html:application.html.erb
<title>
  <%= content_for?(:html_title) ? yield(:html_title) : "" %> ｜テストアプリ
</title>
```

最後に`/app/views/`以下のビューファイルに以下を記述。

```html:login.html.erb
  <% content_for(:html_title) { 'ログイン画面' } %>
```

簡単2STEP！

自分は究極にざっくりとこう解釈。

○`content_for`＝コンテンツを１箇所にまとめて他のビューでも使用できるようにしてるんじゃない？
○`yield(:html_title)`=`yield`とあるから、ビューファイルに`content_for(:html_title)`があればそこから持ってくるんじゃない？

##閉じタグ
「全然仕組み分かってないなー！」と文字に起こそうとする思い知らされますね。
「知らなければ知ればいい」と自分を励ましておきます。

##参考サイト
[ActionView::Helpers::CaptureHelper（リファレンス）](https://api.rubyonrails.org/v5.1.3/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for)
[Rails: ページタイトルはビューテンプレートのcontent_forで表示すること（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_05_15/558120)
システム時刻設定（date コマンド利用のシェルスクリプト）

こんにちは。
date コマンドを利用し、システム時刻設定（変更）を行うシェルスクリプトを作ってみました。ただし単に、BSDタイプの設定指定を Linux へ適用しただけです。12時00分ちょうどへ設定する動作例です。

```console
$ sudo date_set.sh 1200
2019年 10月 8日 火曜日 11時59分59秒 JST
2019年 10月 8日 火曜日 12時00分00秒 JST
```

```date_set.sh
#!/bin/sh
# usage: sudo date_set.sh 1200
date
if [ "$(uname)" = "Darwin" ]; then
  date "$1"
elif [ "$(uname -s | cut -c 1-5)" = "Linux" ]; then
  hh="$(echo "$1" | cut -c 1-2)"
  mm="$(echo "$1" | cut -c 3-4)"
  date -s "$hh:$mm:00"
fi
exit $?
```
node.jsをインストールしてurl指定のファイルをダウンロードする

# 前提条件
　CentOS6.5
　node.js v0.12.4 ← これをインストールする

# 手順
1. node.jsのインストール
2. sudoコマンド実行時のパスを普段のユーザのパスと同等にしてやる
3. プログラム作成
4. 実行

# 1.node.jsのインストール
CentOSにsshログインして以下のコマンド実行。
実は一度インストールした後にコマンドの再確認的な意味合いでやったので
already installedとか出てるけど、そこは気にしないことにする

```
[vagrant@localhost ~]$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.3/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7149  100  7149    0     0  10538      0 --:--:-- --:--:-- --:--:-- 25084
=> Downloading nvm from git to '/home/vagrant/.nvm'
=> fatal: destination path '/home/vagrant/.nvm' already exists and is not an empty directory.
[vagrant@localhost ~]$ nvm install v0.12.4
v0.12.4 is already installed.
Now using node v0.12.4 (npm v2.10.1)
[vagrant@localhost ~]$ nvm alias default v0.12.4
default -> v0.12.4
[vagrant@localhost ~]$ node -v
v0.12.4
[vagrant@localhost ~]$
```

# 2. sudoコマンド実行時のパスを普段のユーザのパスと同等にしてやる
nvmを利用してNode.jsをインストールした場合、sudoコマンドを利用した時に
npmやnodeコマンドが利用できないためvisudoを使って利用できるようにする

```
$sudo visudo
```
テキストファイルの編集画面に切り替わるので以下のように編集する

```
Defaults env_reset
↓↓
Defaults !env_reset

# Defaults env_keep += "HOME"
↓↓
Defaults env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
↓↓
# Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
```

# 3. プログラム作成
以下のプログラムを作成する。ミニサイズなので全文おいとく。
拡張子は"js"

```:/home/vagrant/src/ch02/01-download/download-node.js
// urlにあるファイルを savepath にダウンロードする

// ダウンロード元URLの指定
var url = "http://kujirahand.com"

//保存先のパスを指定
var savepath = "test.html"

// 利用モジュールの取り込み
var http = require('http'); // HTTPのモジュール
var fs = require('fs');     // ファイル関連モジュール

// 出力先を指定
var outfile = fs.createWriteStream(savepath);

// 非同期でURLからファイルをダウンロード
http.get(url, function(res) {
    res.pipe(outfile);
    res.on('end', function (){
        outfile.close();
        console.log("ok");
    });
});
```

# 4.実行する
jsのファイルのある場所まで移動してnodeコマンド実行。
プログラムのつくりの問題だけど"ok"の出力があれば無事成功。

[vagrant@localhost 01-download]$ pwd
/home/vagrant/src/ch02/01-download
[vagrant@localhost 01-download]$ node download-node.js
ok

# 結果確認
同フォルダにtest.htmlができているので内容チェックして確認

```
[vagrant@localhost 01-download]$ ls
download-node.js  test.html
[vagrant@localhost 01-download]$ cat test.html
<html><body><a href="https://kujirahand.com/wiki/index.php">kujirahand.com</a><br></body></html>[vagrant@localhost 01-download]$
```

# おわりに
インストールしてしまえば結構さらっと終わった
javascriptでこんなに作りこんだことないから
ちょっと慌てるけど徐々に慣れていけばいいかなと。

～おしまい～
vim vimrc にマクロ設定

letコマンドで設定する
行頭にタブを追加し、次の行の先頭に移動するマクロ

```vimrc
:let @a="\<Esc>0i\t\<Esc>+"
```

ちなみに、vim実行時にマクロを登録したい場合は、下記でレジスタa~zにマクロが登録される。

```
q[a-z]
```

レジスタの内容を確認したい場合は

```
:reg a
```
ブラウザでシーケンス図が簡単に書ける「SequenceDiagram」を使ってみる

#はじめに

　Excelでシーケンス図書きたくないなーと思って探してたら
　[sequencediagram.org](https://sequencediagram.org/)を見つけたので使ってみた

##SequenceDiagramとは

　・登録不要で使えるシーケンス図作成WEBサービス
　・シェルっぽい？記法でシーケンス図を簡単に書ける
　・色付けとかグルーピングとか、結構いろいろできる
　・画像/SVGで保存できる　

![2019-10-08_21h42_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315491/ee21fc6f-7666-39b8-151f-8bb63e9ed3bb.png)
※記法の詳細は左のメニューにある[？]を押す表示されるヘルプを参照

##簡単なシーケンス図を描いてみる
こんな記法で簡単に作れる
[オブジェクト] <-方向-> [オブジェクト] ： [メッセージ]

**サンプル**

```
title シーケンスサンプル

Main->Sub(日本語も使える):呼び出し
Main<-Sub(日本語も使える):呼び出され
```
![2019-10-08_21h53_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315491/d37e7476-ea24-7924-184c-80d45a78b573.png)


新しいオブジェクトへのメッセージを追加すると勝手に反映される
(長くなると見づらい)

```
title シーケンスサンプル

Main->Sub(日本語も使える):呼び出し
Main<-Sub(日本語も使える):呼び出され

Main->Sub(日本語も使える):また呼び出し

Sub(日本語も使える)-->Sub2(new!):点線も書ける(ハイフンを二つ)
Sub2(new!)->Sub2(new!):自分へのメッセージも
Sub(日本語も使える)<-Sub2(new!):かける！

Main<-Sub(日本語も使える):すごいね。
```
![2019-10-08_22h04_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315491/8b573658-da86-690f-4c64-cf4b0adce69d.png)

##グループ分けや色分けもできる

色々と頑張ればいい感じに書けそう

![2019-10-08_22h27_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315491/7638344b-c027-d887-5532-41a8dc77d648.png)


```
title シーケンスサンプル
participantgroup #lightgreen **フロント**
  participant Main
  participantgroup #pink サブモジュール
    participant Sub1
    participant Sub2
  end
  participantgroup #lightblue **外部ライブラリ**
    participant Library
  end
end

participantgroup #orange **バックエンド**
  participant ServerModule
end

Main->Sub1:Sub1が
Sub1->Library:外部ライブラリを使って
Library-->ServerModule:サーバへ通信
ServerModule->ServerModule:バックエンド処理して
Library<--ServerModule:結果を返す
Sub1<-Library:Sub1が結果をもらって
loop i < x
  Sub1->Sub2:Sub2を繰り返し呼ぶ
  activate Sub1
  Sub2->Sub2:ごにょごにょして
  Sub1<-Sub2:返す
  deactivate Sub1
end
  Main<-Sub1:ただいま

Main<<->>ServerModule:相互の矢印も書ける
```

#さいごに

Excelより全然書きやすくて感動した。
ほかにもJavaScriptの[mermaid.js](https://mermaidjs.github.io/#/)というライブラリもあるらしい。
クラス図も書けるとか。。。

今度触ってみよう
Jinja2 で dict の要素にアクセスしやすくなるカスタムフィルタ

Jinja2 のテンプレートを書く際に、CoffeeScript の存在演算子のようなものが欲しくなったのでそれっぽいカスタムフィルタを実装してみたと言う小ネタ。

## 問題点
例えば「新規作成」「編集」ページで同じテンプレートを使いまわしたい場合に、「新規作成」のページではフォームの中身は空でいい (もしくはデフォルト値を入力する) が、「編集」ページでは既存データをフォームに入力した状態で表示したい。

``` python
data = {
    'foo': {
        'bar': 123
    }
}
```

ただしこのとき、既存データは `data` という変数に複雑な構造で格納されており、その存在確認をした上でフォームの入力値を出し分けようとすると以下のような条件式を書かなければならない。

``` html
{% if 'foo' in data and 'bar' in data['foo'] %}
<input type="text" name="foo.bar" value="{{ data['foo']['bar'] }}" />
{% else %}
<input type="text" name="foo.bar" value="0" />
{% endif %}
```

これはとても手間がかかるし、可読性が低いし、記述が重複しているし、コードの行数もかなり長くなってしまう。良いことがない。

これをもう少し綺麗にまとめることができないかと考えた。

## CoffeeScript の存在演算子
CoffeeScript には存在演算子 (Existential Operator) と言う演算子があり[^js]、識別子に対して `?` を末尾につけると `undefined` かどうかをチェックしてくれて、さらにその後でプロパティアクセスされていてもすべて `undefined` を返してくれる。

[^js]: Optional Chaning という名前で [JavaScript にも採用されそう](https://qiita.com/uhyo/items/6cd88c0ea4dc6289387a) らしい

``` coffeescript:CoffeeScript
obj = foo: bar: 123  # { foo: { bar: 123 } }

obj.foo.bar  # 123
obj.foo.foo  # undefined
obj.foo.foo.foo  # TypeError: Cannot read property 'foo' of undefined

obj.foo.bar?  # true
obj.foo.foo?  # false
obj.foo.foo?.foo  # undefined
obj.foo.foo?.foo.foo  # undefined
```

これは「データがない場合はとにかく `undefined` が欲しい」と言う場合にとても便利で、特にアプリケーションのビューを実装する場合にこのような機能が欲しくなる。

このような機能を Jinja2 でも実装できたら上述の問題点を解決できそうな気がする。

## 実装
Jinja2 で `?` のような演算子を実装するわけにはいかないので、今回はカスタムフィルタとして実装する。

``` python
from jinja2.runtime import Undefined

def dig_nested_dict(d: dict, key: str):
    """ ネストされた dict オブジェクトから指定されたキーに対応する要素を返す
    例:
        key = 'foo.bar' を指定したとき、d['foo']['bar'] が存在すればその値を返す
        存在しなければ jinja2.runtime.Undefined オブジェクトを返す
    """
    if type(d) == Undefined:
        return Undefined()
    v = d
    for k in key.split('.'):
        if k in v:
            v = v[k]
        else:
            return Undefined()
    return v
```

値が存在しないときに `None` や `''` ではなく `jinja2.runtime.Undefined` オブジェクトを返すのは重要で、こうすることで Jinja2 の組み込みフィルタ [default](https://jinja.palletsprojects.com/en/master/templates/#default) と組み合わせて使うことができるようになる。(使用例は後述)

次に、この関数を Jinja2 のカスタムフィルターとして登録する。
例えば aiohttp と組み合わせる場合は [aiohttp_jinja2](https://github.com/aio-libs/aiohttp-jinja2) を使って以下のように書ける。

``` python
aiohttp_jinja2.setup(app, filters={'dig': dig_nested_dict})
```

ここではテンプレート内で `dig` と言う名前のフィルターが使えるように登録した。

## 使用例
登録した `dig` と Jinja2 組み込みの `default` フィルタを組み合わせると、冒頭のテンプレートは以下のように書き直せる。

``` html
<input type="text" name="foo.bar" value="{{ data | dig('foo.bar') | default('0') }}" />
```

5行だったコードが1行になったし、可読性も高くなったと思う。
Date.today.since(7.days)　←７日後

何日後：since

何日前：ago

どちらも`Dateクラスが持っているメソッドである。

```
[1] pry(main)> Date.today
=> Tue, 08 Oct 2019

[2] pry(main)> Date.today.since(3.days)
=> Fri, 11 Oct 2019 00:00:00 JST +09:00

[3] pry(main)> Date.today.ago(3.days)
=> Sat, 05 Oct 2019 00:00:00 JST +09:00
```
next.js でページリダイレクト

軽くハマったので書いておきます。
もしかしたら間違えてるかもしれないので、その場合は指摘してもらえると :pray:
react-hooks 前提です。
next.js@9 で確認しています。
今後変わる可能性があるのでご了承を。

# CSR によるリダイレクト

pushState/replaceState でリダイレクトする。
render の中で `next/router` を使う。

```typescript
import { useRouter } from 'next/router';

const HogePage = () => {
  const router = useRouter();

  // pushState の場合
  router.push('/');

  // replaceState の場合
  router.replace('/');

  return <div />;
};
```

# SSR によるリダイレクト

HTTP header でリダイレクトする。
getInitialProps でやる。

```typescript
HogePage.getInitialProps = async ({ res }) => {
  if (res) {
    res.writeHead(302, { Location: '/' });
    res.end();
  }
}
```
【Rails】RSpecでモデルのテストをする

#概要

モデルのテストの記述方法を解説します

詳しくは[RSpecの公式サイトのモデルに関するページ](https://relishapp.com/rspec/rspec-rails/v/3-8/docs/model-specs)を参考にしてください
今回は一例としてPostモデルのテストを解説します。
前提としてPostにはアソシエーションされたCommentモデルが存在します。

```ruby:spec/models/post_spec.rb:
require "rails_helper"

RSpec.describe Post, :type => :model do
  context "with 2 or more comments" do
    it "orders them in reverse chronologically" do
      post = Post.create!
      comment1 = post.comments.create!(:body => "first comment")
      comment2 = post.comments.create!(:body => "second comment")
      expect(post.reload.comments).to eq([comment2, comment1])
    end
  end
end
```

基本はRubyの書き方と同じです。コントローラーの記述する感覚で書きます。

* `post = Post.create!`
	* postを作成、保存します
	* `create`メソッドは`new`+`save`です
	* `!`をつけると保存できなかった時にその原因を出力してくれます

* `comment1 = post.comments.create!(:body => "first comment")`
	* `post`に紐づいた`comment`を`:body => "first comment"`で作成する
	* comment2も同様です
* `expect(post.reload.comments).to eq([comment2, comment1])`
	* `post.reload.comments`の値が`[comment2, comment1]`と一致するかどうかを確かめる
	* `post.reload.comments`の`reload`はデータベースの値を再び取得するためのメソッドです

以上がモデルのテストの記述方法の一例の解説です。
これを元に自身のアプリケーションにも適応し、テストしてみてください。

**疑問、気になるところがございましたら、質問、コメントよろしくお願いいたします！！**
2019-10-08 LPC > LPCXpresso54628 > RIT (Repetitive Interrupt Timer )  > kCLOCK_Gpio3 > 3以外ではLED点滅しない

```txt:動作環境 
OS: Ubuntu 18.04 LTS
基板: LPCXpresso54628
IDE: MCUXpresso IDE v11.0.1 [Build 2563] [2019-09-01]
```


### 概要

- SDK example(s)においてrit.cを試した
- rit: Repetitive Interrupt Timer
    - 周期的にLEDを点滅するサンプルコード
- `CLOCK_EnableClock(kCLOCK_Gpio3);`の記載の意味が分からない
    - データシートやIDEの資料、SDKの資料などを探したが見つからず

### 試したこと

```
CLOCK_EnableClock(kCLOCK_Gpio3);
```
において、別途定義されているkCLOCK_Gpio0..5を試した (0, 2, 4)。

結果、kCLOCK_Gpio3以外ではLEDの点滅はしなくなった。

### まとめ

kCLOCK_Gpio3には特別な設定をしているようだ。
LED用のクロックを割り当てているのかもしれない。

資料が膨大にある割に、まとめ方がよくないので、その意味が分からない。
UI/UXについて理解する

# 1. はじめに

先日、「アプリ開発のために知っておくべきUXデザイン」と題する
フェンリル株式会社 中村 康孝氏の
セミナー講演に参加したので記事に残します。

## 1-1. 本質的な内容
勝手にグラフィックスやギミック等のテクニック的な話かと思いこんでいたところ、
実はもっと本質的な話で、非常に重要な学びとなりました。
消化出来たナレッジを記述します。

# 2. 機能ドリブンはNG
まず、陥りがちな失敗事例
## 2-1. 競合他社との差別化は注意

競合他社の意識は常ですが、
競合他社との差別化を意識しすぎると機能ドリブンに陥りがちになる。

とあるドキュメント管理アプリの話。

*「音声入力」*機能を実装すればユーザのドキュメント作成が楽になると思い込み、
それを実装する事が目的となると。。。

・公式文書などの長い文書は考えながら書くので音声入力はきつい
・音声入力は周りの人に聞こえるので、実施できる場所が限られている
・話し言葉、書き言葉のギャップ
etc

**お客様：「音声入力機能はいりません。」**

となる。

本来、目的達成のために機能があるのであって、差別化のためではない。
目的を達成するためであればどんな機能でもOK
機能ドリブンは✖️

# 3. UXとは何か？

**UX**とは、
ユーザがある目的を達成した際に、
ユーザがどう感じたか？と言う**「結果」「感想」**である
そして、その**「結果」「感想」**に辿りつくまでの手段がUIとなる
ユーザがある目的を達成する時に
どう感じるか？どうすれば満足するか？
と言うことは容易に想像できるものではく、
特定の担当者だけで決めると、絵に描いた餅になりがち。

以下2点が重要
・ユーザーを知る（第4項で詳細記述）
・サービスに関わる全員が一緒に考える

## 3-1. UXを理解するシリアルの例
シリアル（商品）があり、
シリアルをストックする容器（server）、テーブル（parts）があり、
そしてスプーンと言うUIを通して、シリアルを食べ、
食べたユーザがその時に感じた事がUXと言う結果となる。
単にシリアルの味や
スプーンの使いやすさだけでなく、
料金や場所の雰囲気などもユーザの「感想」というUXに影響するので
「商品の質」や「UIの質」だけでUXは決まらない。

## 3-2. スターバックスコーヒーの良い例
スターバックスは、**「第三の場所」**と言う言葉を使い、
コーヒーを提供するのではなく、
**「新しい体験を提供する」**をテーマに、
「体験」をベースにサービスを考えている。

つまりシンプルに
ユーザがどんな「感想」を持つか？
ユーザにどんな風に感じて欲しいか？
と考えることが重要と理解した。

# 4. HCD
3までに記述した事を具体的に実現する手段の話。

Human Centered Design

① ユーザーを調査する
② ①の結果を整理する
③ 作る
④ 確認する 

これを回す。
これが実際に良いUXを生み出すための手法。

## 4-1. ユーザーを調査する
### 4-1-1. 定量調査
ウェブアンケートやアクセス解析と言った手法。
→ 顕在的ニーズや傾向はわかる　　　
### 4-1-2. 定性調査
質を見るものであり、
インタビュー、行動調査と言った手法。
これらはアンケートと違い、一方通行ではないので
ユーザの背景や動機等深堀できる。
こちらから聞いて深堀しないと出てこないもの。

## 4-2. 調査結果を整理する

調査した事実を整理する

・ペルソナ
・カスタマージャーニーマップ　
・価値マップ

などの手法を活用。

　　※注1
　　ターゲットをデモグラで絞ってはいけない
　　ターゲットのくくりがどこかではなく、「どういう行動をする人」がターゲットか？
　　を決めることが大事。
　　色々な事実に対して、すべてをターゲットとすると大変。
　　どの事実にフォーカスしてメインターゲットを決めるかが大事。
　　どういう行動をする人がターゲットユーザか？
　　デモグラフィック情報はその後についてくるもの。
　　
　　※注2
　　最初はユーザ志向でも、後半は様々な都合でユーザ視点を忘れてしまいがち。
　　ユーザ視点に、主語をユーザに、常にここに立ち返る事が必要。

## 4-3. 作る

ブラックボックス

## 4-4. 確認する

・一般ユーザに使ってもらう
・専門家に徹底的に見てもらう

# 5. 質問
## 5-1. HCDを実際に実行するコツは？
HCDをプロジェクトのタスクとして実行していくコツは何か？

一つの回答としては、
**トップダウンで実践する事**(が近道)

実際のプロジェクトは、
コストやスケジュールなど、厳しい状況多い。
その中で草の根的にこの考え方を広めるよりも、
トップにこの考え方を理解してもらい、トップダウンで実行するのは一つの手段。

## 5-2. HCDの「作る」の部分は具体的にどのようなものか？

① ユーザーを調査する
② ①の結果を整理する

この工程を経て、
どのように設計や実装に落とし込んでいますか？
との質問をさせていただきましたが、
そこはブラックボックスにさせて頂きましたとの回答を頂戴しました。
要件定義の作業に近いものがあるとのこと。
初心者によるプログラミング学習ログ120日目

# 100日チャレンジの120日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

120日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>120日目<br><br>技術書みながらサンプルwebサイトコーディング。<br>コーディングしつつも、同じファイル作ってcssをsassで再現できるようにsassでも作成。<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1180229311351017472?ref_src=twsrc%5Etfw">October 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


↑のツイートのとおり、

1. 技術書みながらサンプルサイトコーディング
2. htmlファイルを複製
3. 技術書のcss部分をSassで書く


Sassの使い方・書き方を覚えつつ、webサイトコーディングの練習できます。
「AI×Blockchain - GMO次世代勉強会 2019 fall【渋谷】」に参加してきた

# はじめに
久しぶりの勉強会まとめです。今回は[AI×Blockchain - GMO次世代勉強会 2019 fall【渋谷】](https://jisedai.connpass.com/event/148808/)に参加してきたのでその内容についてまとめます。

# ディープラーニングの学習を効率化する[メタ学習](https://recruit.gmo.jp/engineer/jisedai/blog/meta-learning/)と[転移学習](https://recruit.gmo.jp/engineer/jisedai/blog/transfer_learning_audio_classification/)を検証してみた
最初にAIと人工知能の振り返りの話がありましたが、ここでは省略します。ベーシックなニューラルネットワークについては[過去に書いた記事](https://qiita.com/ufoo68/items/9e4ca04578ba0f5fa5ff)があります。
ディープラーニングの課題として**時間**と**お金**があります。その課題の解決のために**メタ学習**と**転移学習**を利用します。

## メタ学習
メタ学習は端的に言うと学習方法を学習する手法です。機械学習の基本となるパラメーターの最適化・loss関数などの学習プロセスすべてを学習します。ハイパーパラメータの学習には**few-shot learning**を利用して学習のコストを抑えます。
ここでは**Modal-Agnostic Meta Learning(MAML)**という手法について紹介されました。この手法を用いてRegresssionの学習に適用させました。具体的には日本気象庁の過去の100年分の月ごとの気温を教師データとして、一年間の気温の変化を学習させて高い精度を出すことができました。

## 転移学習
転移学習とは優れたタスクのモデルを使って他の学習に転用する手法です。ここでは音声に適用した例を紹介されました。実験では池と滝の音ファイルを学習させました。音の波形を画像データとして、分類のための学習コストVGG16モデルを転移学習させたものと普通のCNNと比較して学習コストを抑えられていることが確認されました。

# [Plasma](https://blockchain.gunosy.io/entry/sidechain-plasma-plasma-mvp)の研究トレンド
既存のブロックチェーンの[Ethereum](https://bitbank.cc/info/ethereum/about)はスケーラビリティという課題があります。このPlasmaはEthereumのコントラクトをより最適化させるための仕組みです。この方法を用いるとブロックチェーンを並行的に計算を行うことができるので1秒間に数十億のトランザクションが実行できると見込まれています。ここでは、Plasmaの研究の歩みについて紹介されました。Plasmaは現段階では送金のみにこの手法が適用されていますが、今後はさらに多種多様なことにこのPlasmaが適用させるために研究が進められています。

私はブロックチェーンについての知識があまりなかったので、細かい内容までまとめることができませんでした。。。Qiita書きながら聞くと細かい内容を聞き流してしまうので、細かい話を掘り下げていく形のセッションだと何もわからなくなってしまうので良くありませんね（笑）[ここのページ](https://recruit.gmo.jp/engineer/jisedai/blog/plasma-framework/)に基礎的な内容がまとまっていたのでこれを読んで勉強してみようと思います。

# 金融×最先端技術：FX予測において[ON-LSTM](https://openreview.net/forum?id=B1l6qiR5F7)と[GAN](https://qiita.com/triwave33/items/1890ccc71fab6cbca87e)は[LSTM](https://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca)に勝てるのか？
時系列予測あるあるのFX予測的なものがこのセッションでした。このFXの為替レートを**LSTM**と**GAN**と**ON-LSTM**それぞれで予測したもので比較します。用いたライブラリは**tensorflow**と**keras**でした

## LSTMで予測
データをforextesterの2018/1-2019/1の物を使い、60日ごとに区切ります（バッチサイズ）。その学習データをもとに売り買いのルールを学習させます。今回は200回の学習を行って、2.107のRMSEと0.968のCorr（相関係数）という結果で、実際に売り買いを行うと**－４５万**という結果でした。

## ON-LSTMで予測
この手法は端的に言うとLSTMの改善版です。活性化関数に**cumsum**を用いて既存のLSTMの各ユニットの独立という課題を改善させることができるとのことです。
学習回数は同様で、1.6732のRMSEと0.97のCorr（相関係数）という結果でした。しかし実際の売り買いではあまりLSTMとの変化はありませんでした。。。

## GAN+ON-LSTMでの予測
GANのGeneratorにON-LSTMを用いてFX予測の精度を高めるという試みです。学習回数は同様で、3.860のRMSEと0.873のCorr（相関係数）という結果でした。逆に精度が悪くなるという結果でした。

## statefullを使う
あまりよろしくない結果だったので、statefullの機能を追加して各バッチごとのデータを保持させるという危険な方法を試してみたとのことです。このことでLSTMとON-LSTMでより高い精度を出すことができて実際の売り買いで黒字を出すことができました。
発表資料には実装のポイントなどがまとめられているので、イベントページにUPされるであろう資料を見てみてください。

# さいごに
各セッションについての資料は後日上がると思いますのでイベントページを追っかけてみてください。機械学習もそうですが、なんだかんだでBlockchainもまだ熱い分野なんだなと感じました。
Tensorflow GPU, CUDA, CuDNNのバージョン早見表

# Tensorflow GPUとその他パッケージのコンパチ早見表

Tensorflow GPU、なぜか動かなくて禿げそう,いやマジではげそう
そんな時は！

下記ページの「テスト済みのビルド設定」を参照されてください。
https://www.tensorflow.org/install/source?hl=ja#gpu_support_2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388647/7d017e44-ad74-2831-69d8-737e28779d2e.png)



上記バージョンに合わせても動かない場合は下記をチェック！

* 表のとおりにバージョンを合わせたか？（CUDA=9ならば9.1を避けるなど）
* tensorflowとtensorflow-gpuがダブっていないか？
* tensorflow-gpuとpython系は同じバージョンでインストールされているか？
* 動かしたいソースコードはどのバージョンで作られているか？（更新ごとに関数が追加、削除されるため）
* 最新バージョンは避ける
* どう考えてもすべて合わせたのに動かない場合は、全体のバージョンを下げてみる
* GPUとの互換性はあるか？　新しいバージョンと古いGPUは相性が悪い場合がある
* 何が動かないのか明確化する
    * tensorflow-gpuはgpuを認識しているか？
    * MNISTデータセットを使ったサンプルは動くか？
    * tf系のメソッドの呼び出しでつっかかっているのか？

全ての手を尽くして、寝ても覚めてもダメなら...
nvidia-dockerを使いましょう
【Growi】 編集するときに自動でSlack投稿のチェックボックスを有効にする

# Growi 編集するときに自動でSlack投稿のチェックボックスを有効にする

## なぜやるのか

アクティビティを取りたかったから。
毎回手動でつけると抜ける可能性があるので、デフォでつけておいた方がいいかな、と。

## JSで制御追加

`/admin/customize`

`#カスタムスクリプト`

```js
//var slackCheckbox = document.querySelector('#save-page-controls input')
function slackPostTrue() {
  document.querySelector('#save-page-controls input').checked = true
}

window.addEventListener('keypress', (e) => {
  if( location.hash == '#edit' && document.querySelector('#save-page-controls input').checked != true ) {
    slackPostTrue()
  }
})
```

DOM生成のタイミングで、早い段階で呼び出すとダメなので同じ文字列が並ぶことに。
もうちょっと綺麗に書きたい感ある。
dbpediaの研究 その14

#概要

dbpediaが難解なので、手出してみる。
geoを、取得して、leafletで表示してみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0b37d36f-68c3-6489-9b52-a5eaa8af82fd.png)


#成果物

http://embed.plnkr.co/mQ0ynTQ5lVJaNFeR5RJT/

以上。