OmniAICreator/Qiita-1.07M huggingface dataset:
VMwareTools を, FreeBSDでつかうには、pkg install open-vm-tools-nox11　だけでいいです。

VMware ESXi や、Fusion で、FreeBSDを使うには、VMwareToolsが必要です。
これを入れないと、VMwareの管理画面でVMのステータスが取得できません。
また、VM側で、時計が狂います。

そこで、FreeBSDの場合は、

pkg install open-vm-tools-nox11 で、入れます。
(X使ってる場合は、pkg install open-vm-tools)

VMwareTools FreeBSDでググると。

compat6xをいれろとか。

/etc/rc.confに、ずらずらかけとか書いてありますが

全部もう賞味期限切れです。


いまは、なにもしないでいいです。

--------
という結論にいたるまで、確証がえられず時間をつぶしたので、このエントリかきました。
チャットコミュニケーションの落とし穴～そんなつもりじゃなかったのに～

この記事はエイチーム引越し侍 / エイチームコネクトの社員による、[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hikkoshizamurai-connect) 6日目の記事です。

## はじめに
今年に入ってコロナの影響により、他人と直接顔を合わせる事が減ってきました。
逆にチャットやメール等の文章だけのやりとりや、ビデオ会議システムを使っての会話が今まで以上に増えてきているのではないでしょうか。
特にチャットは送信側はいつでも送る事ができ、受信側は自分の都合の良いタイミングでメッセージを確認する事ができます。
メールよりも気軽でレスポンスも比較的早く、映像が無い分プライベートを見せたくない人にとっても心理的ハードルが低く、文章はログとしての後から振り返る際の手助けにもなります。
そんなメリットも多いチャットですが、残念ながらデメリットも存在しています。
そんなデメリットを、私のヤラカシを元に意識した方が良いと感じた点を３つ解説していきたいと思います。

なおzoom等のビデオ会議システムがあればそれだけで解決できるケースもあります。
あくまでチャットのみにコミュニケーション手段が限られる場合を想定しています。

### １．相手がどんな状態の時に見てくれるかなんて分からない
まず、私が考える中でコレが一番の課題ではないかと思っています。
対面で会話するときは相手の表情や雰囲気を感じて、以下のような事を感じ取る事ができます。

1. 忙しそうか
* 誰かと話しているか
* 熱意があるか
* 機嫌が悪そうか
* 自分の発言に対してどのような感情を抱いたか

これらの情報により話す内容や話し方を変えてみたり、場合によっては話しかける事自体を止めたりするのではないでしょうか。
これが文字だけのチャットになると、情報量が一気に減少します。
1,2は相手が都合の良いタイミングで確認できるので問題ないですが、3により話しかける事自体を回避をする事はできず、4が感じ取れるほど文章に感情が出てきてしまっていたら手遅れである可能性が高いです。

ちなみに私は相手のミスを冗談まじりでやんわりと伝えようとしたらキレさせてしまいました。
文章だけでは相手の地雷を見つけ辛く、踏んでしまってもすぐには気づかない場合があります。
皆さんはこの失敗をしないように心に留めておいて頂けると幸いです。

### ２．相手がいつ見てくれるかなんて分からない
自分の都合に合わせてメッセージを確認できるのがチャットのメリットではありますが、
それが逆にデメリットに繋がるケースも存在しています。
例えば、至急の際に対面では使えていた以下の手段がチャットでは使えません。

1. 相手を捉まえて、今、確実に要件を伝える
* 会話中であったとしても、割り込んで要件を伝える

これは自分がいくら空気を読んでも相手マターである以上どうしようもありません。
チャットのみという前提とは反しますが、複数の連絡手段を用意しておく事やプッシュ通知等を活用して手数を増やし、連絡が繋がる確率を高める事で対策しましょう。
ただし鬼電等やり過ぎにはご注意を。
他の支給案件が重なっている事だって良くあります。

また、自分自身に対しても同様の理由で連絡を取りたいと思っている人がいるかもしれません。
集中していると滞りがちになりますが、チャットはコマメにチェックしましょう。（戒め）

ちなみに私はこれにより業務が期限に間に合わなかった事も、間に合わない原因になってしまった事もあります。
たぶん身に覚えのある人も多いのではないでしょうか。

### ３．メッセージ投稿は１回で完結させないと最後まで見てくれない...かも
タイピング速度の速さは人それぞれだとは思いますが、同じ内容を口で言うのと比べると時間が掛かる人の方が大半ではないでしょうか。
例えば受けた相談に対して無理だと回答しなければならないとき、私は以下の流れで回答する事が多くあります。

1. 無理という結論を伝える
2. その理由を伝える
3. 代替案を提案する

これは口頭であれば流れが途切れる事が無いので問題は特にないのですが、チャットだと話が変わってきます。
もし1,2,3で区切って送信してしまった場合に、相手へ与える印象が変わってしまうのです。
1時点では無理というネガティブな事だけが伝わり、2が送られてきてもそれの言い訳にしか感じられません。
3で初めて前向きな方向に向かうのですが、ネガティブな1と2だけの時間がどうしても長くなってしまいます。
1→2→3と進むにつれて文章量が多くなりがちなので投稿が遅れ、余計に1と2だけの時間が長引きます。
場合によっては3の投稿前に相手に反感を抱かせてしまうかもしれません。
これを避ける為に、１つの投稿で完結させる事がオススメです。

ただし相談をしてくる相手は何かしらの不安を抱えている場合が多く、長文を打っていると長時間相手を不安なままにさせてしまうかもしれません。
メッセージを見た事と返答を打っている事だけ先にお伝えしてあげるのが良いかもしれません。

## まとめ
以上、注意喚起に見せかけた失敗暴露でした。
皆さんは同じ失敗をしないように、私を反面教師にしてください！

[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2020](https://qiita.com/advent-calendar/2020/hikkoshizamurai-connect) 6日目の記事は、いかがでしたでしょうか。
ToDoリストにドラック&ドロップ機能を実装してみた


今回は前回作ったtodoリストにドラック&ドロップ機能を実装してみた


##ドラック&ドロップ
≻https://blog.ver001.com/javascript-dragdrop-sort/
https://www.ipentec.com/document/javascript-list-sortable-item
https://ja.javascript.info/mouse-drag-and-drop

###更にドラック&ドロップを実装して順番を変える

記事を参考にそのまま書いてみた

```js
document.querySelectorAll('.drag-list li').forEach (elm => {
	elm.ondragstart = function () {
		event.dataTransfer.setData('text/plain', event.target.id);
	};
	elm.ondragover = function () {
		event.preventDefault();
		this.style.borderTop = '2px solid blue';
	};
	elm.ondragleave = function () {
		this.style.borderTop = '';
	};
	elm.ondrop = function () {
		event.preventDefault();
		let id = event.dataTransfer.getData('text/plain');
		let elm_drag = document.getElementById(id);
		this.parentNode.insertBefore(elm_drag, this);
		this.style.borderTop = '';
	};
});
```
ほぼコピペに近いが一応書いてみた
初めてみるメソッドが多い.....
この時に起きた問題が
・クリックできない
・vscodeに```event```が非推奨だと言われる





・クリック出来ない問題
原因を探索
1.```.list```を```#list```に修正

2.追加ボタンをクリックされた時の処理の```showTodo```いかに入れてみたら```setData```が未定義だと言われた。
setDataについて調べてみる→
≻https://developer.mozilla.org/ja/docs/Web/API/DataTransfer/setData
単純なミス


3．draggableが機能してるか確認
デベロッパーツールで確認したらついてたが動かなかった
一応htmlでliにdraggable属性をつけてみて動くか確認した所動かなった
だからdraggableについて調べてみる
そしたらdarggableはjqのライブラリjquery UIにもあるとわかったが今回はhtml属性のdraggableを使いたいと思う。
調べたところ概ね間違っていなさそう
リストには

```js
newItem.setAttribute("draggable",true)
```
でdraggable属性を追加した。
これがないとドラックしようとしたら複数のリストが一緒に動いてしまい正しく作動しなかった。


4．答えをコピペして弄ってみる
そしたらidを振っていないとドラック&ドロップしても反映されない（ドラック&ドロップは出来る）

そうするとCSSの```cursor:pointer```によって左右されている事がわかった。
これでdraggableについても完結した


####しかしドラックが出来てもドロップが出来ない。
正しい方にはドラックした時に青線が出てきているが、自分が書いたものには出てこないので、そこに問題があると思う。

idを振っていなかった。
今回はリストの番号に使った変数を再利用した

```js
      newItem.setAttribute("id",count2)
```


まだ出来なかったが、確認した所```querySelectorAllが間違っていたので修正したら青線で出て無事に変更することが出来た。


それからドラック&ドロップしたときに番号も変更できるようにしたい。
ドラック&ドロップしたときにshowTodosで出来るかもしれないのでやってみる。
しかしドラック&ドロップ関数の最後に追加したら青線も出なくなってしまった。


###削除ボタンを押してからドラック&ドロップが出来なくなった。
追加ボタンの所に書いてあったのをshowTodosの最後に持ってきたら使えるようになった。


###もし追加or削除ボタンで更新したくないなら
前のバージョンで配列に入れないリストを作ればいけると思う。

>draggableについて
https://www.pazru.net/html5/DragDrop/010.html


4．text/plainとは


・なぜeventは非推奨なのか
単純に引数にeventを記述すれば問題なくなった

>https://developer.mozilla.org/ja/docs/Web/API/Event/preventDefault



draggableとは
>https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/draggable
論理型ではなく、列挙型属性とは？

###ドラック&ドロップしてdoingとdoneを分ける

時間がある時に実装してみたいです
>画面いっぱいにドラック&ドロップ（順番など関係なし）
https://q-az.net/elements-drag-and-drop/
Raspberry PiでNo space left on deviceと出てきた

##はじめに
まったく活用できていないラズパイを使おうとOSをインストールし、pipを入れようと思ったらNo space left on deviceと出てきた。
##空き容量を確かめる
OSをインストールしたばかりなので空き容量の問題ではないと思ったが、とりあえず

```
$ df -h
```


で空き容量を確かめた。
その結果なぜか/dev/rootのファイルサイズ1.5GBでused100%になっていた。
SDカードは16GBを使用しているので、空きがないのはおかしい。
##解決

```sh
$ sudo raspi-config
```
から設定に行きAdvanced Optionsを選択した後にExpand Filesystemを選択。
なんとかなった。  

##おわりに
この手のエラーはよくある事(?)なのか分からないが、いつもと同じ方法でOSをインストールし、なぜこうなったのか謎だ。自分は初心者なので、おそらく初歩的なミスだと思う。
精進します。

##参考にさせてもらったサイト
https://arkouji.cocolog-nifty.com/blog/2014/05/raspberry-piapt.html
except KeyboardInterrupt, e:となった時の対応方法


# 事象 : yumをアップデートしようとしたら失敗した
- 環境 : Cloud9(EC2 instance / Amazon Linux 2)

```bash
$ sudo yum -y update
  File "/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
```

## 原因 : Pythonを2.7から3.7へバージョンしたから
1. [バージョンアップ時にalternativesを使用してバージョンアップを図った](https://qiita.com/ponsuke0531/items/33078c90742db2349944#%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E5%AF%BE%E5%BF%9C--python%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%923%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)
1. なのでpythonへのリンクが無理やり「2.7」から「3.7」へ付け替えられた

> もともとはpython2.7へのシンボリックリンクでしたが、3.5をインストールした際に勝手に付け替えてしまったために2系で記述されたpythonスクリプトが3.5の構文に合致しなくなってしまいました。
> [pythonバージョンアップによる/bin/yumのsyntaxエラー [except KeyboardInterrupt, e:] &#8211; yoseatsu.me](https://yoseatsu.me/article/4983)

```bash
$ ls -la /usr/bin/ | grep python
lrwxrwxrwx  1 root root          24 Dec  7 05:07 python -> /etc/alternatives/python
lrwxrwxrwx  1 root root           9 Nov  6 19:45 python2 -> python2.7
-rwxr-xr-x  1 root root        7048 Aug 27 21:23 python2.7
-rwxr-xr-x  1 root root        1846 Aug 27 21:23 python2.7-config
lrwxrwxrwx  1 root root          16 Nov  6 19:45 python2-config -> python2.7-config
lrwxrwxrwx  1 root root           9 Nov  6 19:57 python3 -> python3.7
-rwxr-xr-x  2 root root        7048 Aug 27 22:02 python3.7
lrwxrwxrwx  1 root root          17 Nov  6 19:57 python3.7-config -> python3.7m-config
-rwxr-xr-x  2 root root        7048 Aug 27 22:02 python3.7m
-rwxr-xr-x  1 root root         173 Aug 27 22:02 python3.7m-config
-rwxr-xr-x  1 root root        3210 Aug 27 21:16 python3.7m-x86_64-config
lrwxrwxrwx  1 root root          16 Nov  6 19:57 python3-config -> python3.7-config
lrwxrwxrwx  1 root root          14 Nov  6 19:45 python-config -> python2-config
```

### 対応 : リンクを張りなおす
参考 : [yumが壊れたので修理する - Ken01のブログ](http://gamsj2015.hatenablog.com/entry/2018/03/04/114132)

「リンクを張りなおす」「スクリプトを修理する」から選ぶようですが
「スクリプトを修理する」は大変そうだし、他でまた問題が出ても嫌だし
ということで「リンクを張りなおす」をする

```bash
# alternativesにPython2.7を登録して
$ sudo alternatives --install /usr/bin/python python /usr/bin/python2.7 2

# alternativesでPythonを2.7に変更してpythonのリンクを張りなおす
$ sudo update-alternatives --config python

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
 + 1           /usr/bin/python3
*  2           /usr/bin/python2.7

Enter to keep the current selection[+], or type selection number: 2

# yumが動くようになった！
$ sudo yum -y update
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                                             | 3.7 kB  00:00:00     
amzn2extra-docker                                                                                                                                                                      | 3.0 kB  00:00:00     
...
Complete!
$
```
TensorFlowをつかうと結果が毎回変わる現象にあった話

# 概要
KerasのXceptionモデルをファインチューニングする機会があり、その際使っているのはTensorFlowだった。

# 起きたこと
全く同じ実行をしているのに結果が毎回違う。
※今回は２値分類だったのでF値をみていたが、最大で10％も精度が変化していた。。。。


# 疑ったこと
- 単純にソースのバグ

# 原因
TensorFlowのランダム性

# 解決策
TensorFlowのランダムシードを固定

```
import tensorflow as tf
tf.random.set_seed(0)
```

# おきもち
まさかランダム性で精度が10％も変わるものなのか。。。と驚愕だった
Oracle Multitenant 1

久々に検証環境触るので前までやってたことを思い出すところから
現在のPDB作成状態

```
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB1$SEED                  MOUNTED
         4 ORCLPDB1                       READ WRITE NO
         5 ORCLPDB2                       READ WRITE NO

SQL> select PDB_ID, PDB_NAME, APPLICATION_ROOT, APPLICATION_PDB, APPLICATION_SEED, IS_PROXY_PDB, REFRESH_MODE, SNAPSHOT_MODE from dba_pdbs;
  PDB_ID PDB_NAME        APPLICATION_ROOT   APPLICATION_PDB   APPLICATION_SEED   IS_PROXY_PDB   REFRESH_MODE   SNAPSHOT_MODE
       2 PDB$SEED        NO                 NO                NO                 NO             NONE           MANUAL
       3 ORCLPDB1$SEED   NO                 YES               YES                NO             NONE           MANUAL
       4 ORCLPDB1        YES                NO                NO                 NO             NONE           MANUAL
       5 ORCLPDB2        NO                 YES               NO                 NO             NONE           MANUAL
```

ORCLPDB1$SEED:
アプリケーションPDBシード

ORCLPDB1:
アプリケーションルート

ORCLPDB2:
アプリケーションPDB
リベンジ！コロナの陽性者数を予測してみた。[Python]

# 概要
- コロナ陽性者数を予測したい！！！
- [前回](https://qiita.com/kuro_take/items/c2c523195c379f09a5d9)の記事の精度を超えたい！！！リベンジしたい！！！

# 使ったデータ
- [オープンデータ｜厚生労働省](https://www.mhlw.go.jp/stf/covid-19/open-data.html)の陽性者数のcsvになります。

# 実行結果
- **11/1から12/31**までの日本のコロナ陽性者数を予測。
- 赤線は実際の陽性者数、青線は予測の陽性者数。


![corona_202012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/9da19c98-7255-5135-b140-86406615d6be.png)

# まとめ
- [前回](https://qiita.com/kuro_take/items/c2c523195c379f09a5d9)との相違点はグラフの様式とSARIMAモデルのパラメータの値。精度が上がった！！
- パラメータを上手く設定できれば精度が上がる？

# おまけ
- **11/1から来年の3/31**までの陽性者数を予測。
- ５０００人までいきそう。。。

![corona_202103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/988199ba-1417-3232-2965-c569869b1c44.png)


# おまけのおまけ
- **11/1から来年の12/31**までの陽性者数を予測。
- マイナスの陽性者数が出てる？！？！

![corona_202112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763295/6938cfea-d03d-4501-5f9f-245fe8a3a9cf.png)


# コード
```Python
# 基本のライブラリを読み込む
import pandas as pd
# グラフ描画
from matplotlib import pylab as plt
# グラフを横長にする
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
import matplotlib as mpl
mpl.rcParams['font.family'] = ['serif']


# データの準備
df = pd.read_csv("pcr_positive_daily.csv")

corona = pd.Series(df["PCR 検査陽性者数(単日)"].values,
                       index=pd.to_datetime(df["日付"]))

# SARIMAモデル（季節自己回帰和分移動平均モデル）
import statsmodels.api as sm

sarima = sm.tsa.SARIMAX(
    corona, order=(2,1,3), 
    seasonal_order=(0,1,1,30), 
    enforce_stationarity = False, 
    enforce_invertibility = False
).fit()

# 予測
corona_pred = sarima.predict('2020-11-01', '2020-12-31')

# 実データと予測結果の図示
plt.plot(corona, label='original', color='red')
plt.plot(corona_pred, label='predicted', color='blue')
plt.xlabel("date")
plt.ylabel("Corona positive")
plt.legend(loc='best')

# # 予測値
# print(corona_pred)

```

# 参考
- [TV朝日の視聴率推移をSARIMAモデルで予測してみる](https://qiita.com/mshinoda88/items/749131478bfefc9bf365)
プログラマーになってから読んだ本のおすすめ10選

Ateam Lifestyle Advent Calendar 2020 の10日目は株式会社エイチームライフスタイルの@msm_2 が担当します。

今回はプログラマーになってから読んだ本の整理をする中で、読んでいてよかったな思っている本を紹介します。
読んだ本の順番はランキングではないのでご注意ください。

## 1冊目: マスタリングTCP/IP―入門編―

### 内容
TCP/IPについて詳しく知りたいときに読むと良い本かと思います。
ネットワークやTCP/IPの歴史についても説明がされているため、内容が濃いように感じます。
この本を読むことで、これまで雑に理解していた部分を詳しく知ることができたので、復習の意味を込めて読んでみても良いかもしれないです。

### こんな方におすすめ
* ネットワーク周りの知識をつけたい人
* ネットワークについてこれから学びたいと感じている人

##  2冊目: エッセンシャル思考 最少の時間で成果を最大にする
### 内容
「エッセンシャル思考」について説明する本です。
エッセンシャル思考とは何を大切にし、何を捨てるべきかについての考え方になります。この本の序文で説明されている「より少なくより良く」はいままで自分がやってきたことが、やらなくても良かったことかもしれないと気が付かせてくれる良い言葉だとおもいます。この言葉以外にも、シンプルでわかりやすく考え方について説明がされているため読みやすかったように感じます。

### こんな方におすすめ
* やることが多いけど何を捨てるべきかわからない
* 本当にこれはやるべきなのだろうかと悩んでいる人

##  3冊目: 栢木先生のITパスポート教室

### 内容

ITパスポートの試験勉強におすすめの本になります。
この本はわかりやすくまとまっているので、IT業界に入ったばかりの人に読みやすと思います。

### こんな方におすすめ
* IT業界に入ったばかりの人
* ITパスポートを受ける予定の人

##  4冊目: リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

### 内容
どういった構文や変数名の付け方が良いかを説明してくれている本になります。
実例を交えながら説明をしてくれるため、良いコード、良い変数名がどういったものかを学ぶことができます。
読みやすいコードとはなにかについて説明書されているので、初学者の方は読んで置くと良いと思います。

### こんな方におすすめ
* コードを書き始めたばかりの人

##  5冊目: 新装版　リファクタリング　既存のコードを安全に改善する

### 内容
リファクタリングをしていくことの良さと、どうリファクタリングをしていくのかについて書かれている本です。
既存コードをどう安全にリファクタリングするかを手法と合わせて説明されています。
本の最終ページには、各章で説明がされていた手法ページへの参照と簡単な説明がされているため、索引として使えるので便利です。
Java, Ruby, JavaScriptそれぞれに対して本が出ているので自分がよく書く本を読んでみると良いと思います。

### こんな方におすすめ
* リファクタリングの手法について学びたい人

## 6冊目: Clean Architecture　達人に学ぶソフトウェアの構造と設計

### 内容

著者がこれまでの経験から良い設計とは何であるかを説明している本になります。
この本の中で「アーキテクチャのルールどれも同じである」と作者は説明しています。
これまで作者が得た経験をもとに、どういったシステムを作りどう組み立てて来たかを説明しています。
ソフトウェアアーキテクトが果たすべき役割と、どうシステムを構築するかについて、考え方を学ぶ上で良い本だと思います。

### こんな方におすすめ
* 設計について学びたいと感じている人

##  7冊目: 小さなチーム、大きな仕事　働き方の新しいスタンダード

### 内容
新卒入社半年目くらいに先輩におすすめされた本になります。
章ごとに短く説明書され、読みやすい本になります。
本の著者は16人のチームで大きな収益を上げています。そのチームの考え方と仕事の仕方について説明がされています。内容も冗長に説明がされているわけではなく短く簡潔にまとまっているため、サクサク読むことができます。

### こんな方におすすめ
* 仕事のやり方に悩んでいる人
* 何に力をいれて仕事するべきか考えている人

##  8冊目: テスト駆動開発 

### 内容
TDDの実践方法をTODO形式で説明してくれる本になります。
本の中ではTODOを記述し、落ちるテストを書き、テストを通すTDDのリズムを知り学ぶことができます。
また、PHPUnitやJUnitなどのxUnitフレームワークのについての説明もされています。
テストコードを書くためのいくつかのパターンも紹介されているため、テストコードの書き方を体系的に学ぶことができます。
この本の第一章を読むだけでもテストを書きたくなってきます。テストケースがレッドからグリーンになる快感を知ることができる良い本だと思います。

### こんな方におすすめ
* テストコードを書きたいがどういった書き方をするべきかわからない人
* テストコードを書いていきたい人

##  9冊目: レガシーコード改善ガイド

### 内容
この本の序文には「テストコードのないコードはレガシーコード」だと定義をしています。ただ、本の内容はテストの書き方を説明する本ではなく、既存のシステムを理解、テスト、改修、機能追加するための手法について紹介している本になります。
各章がFAQの形をとっているので、自分が困っている事柄について答えを探すために読んでも良いと思います。
この本は読むたびに新しい発見があるので、時々読み返すようにしています。

### こんな方におすすめ
* 普段書いているコードがレガシーに感じるが直し方がわからない人
* 巨大なコードと戦っている人

##  10冊目: プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則

### 内容

プログラミングをするための指針となる「前提」「原則」「思想」「習慣」「視点」「手法」「法則」について説明がされています。
抽象度が高い事柄が多いため、初学者のうちに読むと内容を理解しきれず難しく感じ、中級者くらいの人をターゲットにしていると思います。
参考文献が充実しているので、興味を持った部分の参考文献を読むような、本を探すための本としても使えるかと思います。
知っている知識、知らない知識を洗い出し、知識の整理のためにいい本かと思います。

### こんな方におすすめ
* タイトル通り3年目までの方
* 昔から言われているプログラミングの原理原則について知りたい方
* 技術が生まれてきた背景を知りたい方


# 最後に
最後まで読んでいただき、ありがとうございました。
本を読むことで今まで自分が知らなかった知識を知ることができ、新しい考え方を取り入れることができると思っています。
今回紹介した本は有名な本ばかりですが、興味を持って手にとっていただけたら嬉しいです。

明日は@poncoが「メンタル豆腐の3年目デザイナーが鉄筋メンタルを作るためにやったたった1つの習慣」を公開いたします。どうぞお楽しみに！
コレクションに格納した日時フィールドが日本時間になっていない件



## えっ、どういう事？
えー、多分表題を見てもピンと来ない方がほとんどなので一から説明します。
まず、下の氏名、日付を指定したcsvがあります。
![clipboard-202011270937-avhbr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/b1d898c9-faf3-dc61-67a1-68d19f372c14.png)


これを **Utility - File Management** オブジェクト内 **Get CSV Text As Collection** アクションを
使って、csvファイルの中身をコレクションに格納します。
![clipboard-202011301000-imeym.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/917e3945-757b-26e6-8598-c0505ac5d4ed.png)

## コレクションに格納すると・・・・
![clipboard-202011270939-h8o2u.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/608495df-1369-3196-8c47-ebc859e71ba0.png)

あれ、日付が違う・・・・
そうなんです。実は日時のフィールドタイプってUTC（協定世界時）で取得しているんです・・・
つまり、日本時間に計算しなおすとUTCから９時間後になります。

## じゃあ、あらかじめフィールドタイプをテキストで取れば良いんじゃない？
そーですよね。そー思うじゃないですか。
でも・・・
![clipboard-202011270957-tzajp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/c1f07b03-458e-9570-801e-ed54a89b52b2.png)

テキストタイプに指定してもダメなんですよ・・・・

## **UTC To Local** アクションを使う
ではどうするのか
そんな時は、 **Utility - Date and Time Manipulation** オブジェクトの **UTC To Local** アクションを
使います！

### 中身はこんな感じ
データアイテムを指定して、変換するタイムゾーンIDを入力します
そうすると指定のタイムゾーンに変換したデータアイテムを戻り値で返す仕組みになっています。
![clipboard-202011271003-qv66r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/824101fe-5156-817d-740e-8ee84cb47583.png)
![clipboard-202011271008-kasf9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/20fe019b-522c-d80b-e6b6-8e1ba9fab603.png)


## これを使ってcsvから取得したコレクションを日本時間に直そう
では、早速日本時間に直す処理をしましょう。
**UTC To Local** アクションをプロセスにセットして
![clipboard-202011271034-mqtmw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/0c01d9c4-384f-e093-784d-495f41ec0078.png)

UTCはコレクション内の日付フィールドを参照するように設定
Time Zone IDは日本時間に変換するため、Tokyo Standard Timeに設定
返す値もコレクション内の日付フィールドを指定
![clipboard-202011271045-ptzzs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/3d5bbf78-fd24-19ee-7c46-960187b29c01.png)


## 今回はコレクションアイテムなので繰り返しステージを置く
今回はcsvファイルから取得したコレクションアイテム内の日時データアイテムを使うので
**UTC To Local** アクションを繰り返しステージで囲みます。
![clipboard-202011271056-euxww.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/bb12cb88-ac14-f553-e622-5ffcd40d8a86.png)
![clipboard-202011271042-zebmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/62cf2201-2e61-09e6-13c1-97a0d9ea0659.png)

## これで準備完了
![clipboard-202011271048-ex3wx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/d907bc09-d2f1-1db9-e3f7-0b194d07f0c7.png)
これで一通り実装がそろったので早速、実行してみましょう。

### 実行すると？
![clipboard-202011271057-o7mmq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/14c410ae-e9bb-ea8d-67ca-21ca146cba12.png)
**UTCから９時間後の日時になっていますね！**

## まとめ
今回は、既存のアクションをプロセスの繰り返しステージを囲んでの
実装となりましたが今後、手が空いた時にコレクション内の日時データを
まとめて指定のタイムゾーンに変換出来るアクションを作成したいと思います！
LaravelでAWSのSESからメール送信する方法

### 環境
Laravel：7.3
AWS SESリージョン：Tokyo(ap-northeast-1)

## 前提
・メールアドレスがある

## やること
①composerでAmazon AWS SDK forPHPをインストールする
②SESにメールアドレスを登録する
③サンドボックスの解除
④SESのAPI使えるようにAIMでユーザー作る
⑤Laravelの設定(.env)
⑥試しにメール送信


### ①composerでAmazon AWS SDK forPHPをインストールする
---
composer.jsonに以下を記載し`composer update` する。

```
"aws/aws-sdk-php": "~3.0"
```

②SESにメールアドレスを登録する
---
`Mails` > `Verify a New Email Address`の順でクリック

メールアドレスを入力して`Verify This Email Address`をクリック

入力したメールアドレスに認証用のURLが記載されたメールが届きますので、URLを開いて認証を完了します。

③サンドボックスの解除 
----
https://laraweb.net/knowledge/7083/

これ参考にしてくれぇ

④SESのAPI使えるようにAIMでユーザー作る
---
`サービス(左上)` > `IAM` > `ユーザー` > `ユーザーの追加` > `任意の名前入力 + プログラムによるアクセスにチェック入れる` > `次のステップ(右下の青いやつ)` > `[既存のポリシーを直接アタッチ]をクリック` > `[AmazonSESFullAccess] をアタッチ` > 後はなんもいじらないで青いボタン押す。

###重要↓
※`最後まで進むと、「アクセスキー」と「シークレットアクセスキー」が表示されますので、CSVでダウンロードするかメモしておきます。`

⑤Laravelの設定(.env)
---

```
MAIL_MAILER=ses  //他の記事だと MAIL_DRIVER=ses ※config/mail.phpで確認してください
MAIL_FROM_ADDRESS=上で登録したメアド
MAIL_FROM_NAME="メールの送り主の名前になる"(何も書かないとExampleで送られる)
SES_KEY=上でメモした[アクセスキー]
SES_SECRET=上でメモした「シークレットアクセスキー」
SES_REGION=ap-northeast-1 //これ東京リージョンです
```

⑥試しにメール送信
---

````
 sudo php artisan tinker

>>> Mail::raw('mail 本文', function($message) { $message->to('送りたいメールアドレス')->subject('subjectだよーん'); });
=> null  ←これ成功！メール確認して届いてたら成功!
````
---

※上で成功したのに仮にお問い合わせフォームとかでエラー出たら自分で書いたソースを疑った方がいいかもです。。。知らんけど。

終了
serializerを使って紐付けされたモデルの値を簡単に取る方法


###概要
プログラミング初心者がRailsでAPIを作るときの発見を書いてみました
誰かの参考になれば幸いです

###やりたいこと

comment_serializerでcommentモデルに紐づいているuserモデルの中のaccountnameだけをjsonで渡したい




####model同様にhas_manyなどを使用して書く

```comments_serializer.rb

class CommentSerializer < ActiveModel::Serializer
  attributes :id, :content
  
  has_many :user
end

```
これでも取ることができるがuser_serializerファイルの作成やattributesの記述だったり色々と面倒
もっと簡単に値を取得したい！！


####objectを使用する

```comments_serializer.rb

class CommentSerializer < ActiveModel::Serializer
 
  attributes :id, :content, :accountname

  def accountname
    object.user.accountname
  end

end

```
objectを使うことでuser_serializerファイル作成も行うことなく値を取ることができる
SQLハック

#SQLハックとは
たかがSQL　されどSQL 実務で通用することを狙ってのページです。
#SQL
MySQLを想定しています。圧倒的に業務ではOracleだったのでOracleについての言及していることもあります。

#モチベーション
喜びをもって道を切り開く。
SQL is an extremely in demand skill. Tons of jobs use SQL
NEXT STEP NEXT STEP
SQL獲得は素晴らしいスキルをあなたは手に入れるということです。

#前提知識
・Progateの道場コース以外は完了しておくこと。
#参考図書等
・［データベースの気持ちがわかる］SQLはじめの一歩 WEB+DB PRESS plus
https://www.amazon.co.jp/dp/B07JHJDTVX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

・SQL 第2版 ゼロからはじめるデータベース操作
https://www.amazon.co.jp/dp/B01HD5VWWO/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

・SQL for Data Analysis　Udacityで部分的に学ぶ。
#コンテンツ
・用語
・シラバス
・TAKEAWAY

#シラバス
select * from a_table;
SELECT id, name FROM a_table;
select * from a_table where a <> 0 AND b <> 0;
select * from a_table where no = 1 OR no = 2;
select a from b where (   or   ) and (( or ) and )
　←　or より　andが強いため（）で括る必要がある。
limit
order by
name NOT LIKE 'A%' AND name LIKE '%d';
xxdate BETWEEN '2016-01-01' AND '2017-01-01'
select * from a_table where text like '%SQL';
select * from a_table where text like 'SQL%';
select * from a_table where text like '%SQL%';
select * from a_table where text like '%¥%%';
is NULL
is NOT NULL
Select a AS "コード" ,
CASE 
	when a = 1 then '男'
	when a = 2 then '女'
	else '未定義'
End as "性別" From a_table;
SELECT COUNT(*) FROM accounts;

SELECT COUNT(id) FROM accounts;
←　NULLは数えない。

#TAKEAWAY
##日付の型
Oracle
https://qiita.com/ponsuke0531/items/57bc035f129922b1b0de
注　日付の型がきちんとしていないとINSERTできない。できても問題が・・・
##0割回避
 A few accounts have 0 for total, so I divided by (total + 0.01)


##GROUP BY
Any column in the SELECT statement that is not within an aggregator must be in the GROUP BY clause.

The GROUP BY always goes between WHERE and ORDER BY.
Python-LEGO MindstormsでPIDライントレース その２

[前回](https://qiita.com/Hiroki-Fujimoto/items/bf032a4d9a067269c8b0)はev3dev環境で用意されているメソッドを利用して簡単にPID制御を用いてライントレースする内容だった。
用意されているメソッドを利用すると簡単に実装できるが、センサーなどを併用した処理ができなかったので、今回は自力でPID制御を実装していく。


## EV3について
教育版 [LEGO® MINDSTORMS EV3](https://afrel.co.jp/product/ev3-introduction)

## 本記事内での環境  
* PC
Windows10
Python 3.7.3
開発環境 VisualStudioCode  

* EV3
ev3dev
[APIリファレンス](https://ev3dev-lang.readthedocs.io/projects/python-ev3dev/en/stable/spec.html)

環境構築やソースコードの作成、実行は[こちら](https://qiita.com/Hiroki-Fujimoto/items/6ce278411ca151fee750)

## 今回利用するEV3のモデル
今回も前回に引き続きEV3を走行させるために`ベースロボ`というモデルでモーターを利用して走行を行う。
<img width="300" alt="80.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/fe1e725d-1ba6-8c52-3192-6d9aa0a7cb5b.jpeg">

これに加え今回はタッチセンサーも利用する。

## 参考

* [ArduinoでSTEM教育​ 実践編：ライントレースカーをPID制御する](https://stemship.com/arduino-jissen-pid/)
* [pythonを使ってev3をp制御](https://note.com/komaru_blog/n/ncbd58f5d32fc)

## ソースコード
~~~ pid-2.py
from ev3dev2.motor import OUTPUT_B, OUTPUT_C, LargeMotor, MoveSteering, SpeedPercent
from ev3dev2.sensor.lego import ColorSensor, TouchSensor
import time

touch = TouchSensor()
color = ColorSensor()
lm_b = LargeMotor(OUTPUT_B)
lm_c = LargeMotor(OUTPUT_C)
stm = MoveSteering(OUTPUT_B, OUTPUT_C)


#カラーセンサーによる白黒の反射光取得
def get_bw():
    global black, white
    print('push for white')
    while not touch.is_pressed:
        pass
    white = color.reflected_light_intensity
    print('white intensity: {}'.format(white))
    while touch.is_pressed:
        pass

    print('push for black')
    while not touch.is_pressed:
        pass
    black = color.reflected_light_intensity
    print('black intensity: {}'.format(black))
    while touch.is_pressed:
        pass
    return black, white



#PID走行をする関数
def pid_run(kp_value, ki_value, kd_value, b, w):
    global last_error
    pid_value = 0
    midpoint = (b + w) / 2
    last_error = 0
    cs = color.reflected_light_intensity
    error = cs - midpoint

    pid_value = kp_value * error + ki_value * (error + last_error) + kd_value * (error - last_error)
    stm.on(pid_value, SpeedPercent(20))

    last_error = error



def main():
    get_bw()
    while not touch.is_pressed:
        pid_run(0.5, 0.3, 0.5, black, white)
    lm_b.stop(stop_action='brake')
    lm_c.stop(stop_action='brake')



if __name__ == '__main__':
    main()

~~~

`get_bw()`で走行前にライントレースコースの白部分の反射光値と黒線部分の反射光値を取得する。取得した白と黒の反射光値は`pid_run()`の引数b,wに入れられている。
前回の用意されているメソッドを利用したPID走行ではメソッドから処理が抜け出せなかったため、センサーなどによる割り込み判定などができなかった。今回は`main()`にあるとおり、タッチセンサーが押されるまでPID走行を継続し、押されたらwhileループから抜け出し走行を終了するような処理になっている。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/rSHXBsIU3zQ/0.jpg)](http://www.youtube.com/watch?v=rSHXBsIU3zQ)
Tensorflow-gpu で Resource exhausted error が起きた意外な理由

#概要
意外な理由で Resource exhausted error が出てどハマりしたので解決策を残しておきます．

#状況
- tensorflow-gpuを使って深層学習のモデルをいくつか試していた．
- ずっと問題なく動いていた model_A が，ある日突然 Resource exhausted error を吐いて動かなくなった
- コードは動作時と全く同じ（gitHubで確認済み）
- conda の仮想環境も全く同じ

#原因

model_Bを動かすために，`$HOME/.keras/keras.json` の設定を書き換えてしまっていた．

```json:keras.json&#x20;(for&#x20;model_A)
{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_data_format": "channels_last" 
}
```

```json:keras.json&#x20;(for&#x20;model_B)
{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_data_format": "channels_first"
}
```

#コメント

model_B で model_A の設定を使うと，単純に配列の型が違うというエラーが出るので簡単に気付けるのですが，逆だとメモリ不足のエラーが出るようで，原因の特定に苦労しました...
恐らくサンプル数の部分を1サンプル内のある次元の大きさとみなしてしまうことが原因かと．
yet-another-cloudwatch-exporterでCloudWatchのコストを削減する

# PrometheusでCloudWatchメトリックを取得したときのコスト問題
久しぶりの投稿です。

CloudWatch用のPrometheus Exporterとして [Officialなcloudwatch_exporter](https://github.com/prometheus/cloudwatch_exporter) や [golang実装のcloudwatch_exporter](https://github.com/Technofy/cloudwatch_exporter) がありますが、それとは別の [yet-another-cloudwatch-exporter](https://github.com/ivx/yet-another-cloudwatch-exporter) について書こうかと思います。

弊社でも当初はgolang版でRDSやAuroraのメトリックを取得していたらCloudWatchの料金が高額になってしまいました。。。

[Amazon CloudWatch の料金](https://aws.amazon.com/jp/cloudwatch/pricing/)
CloudWatch APIの課金体系はAPIリクエスト数によるものなので、AWS RDSのメトリック全部(25個ぐらい)を5分おきに取得した場合、1つのInstanceで月額2USD程度なので微々たるものです。
が、台数が増えたりCloudFrontなども取得するようにした場合にメトリックの数だけ課金が増えていきます(この時点で気づけばよかった・・・)。
案の定、翌月に請求額でビビった次第です。

CloudWatchでメトリックを取得するAPIには **GetMetricStatistics** と **GetMetricData** があり、**GetMetricStatistics**は1度に1つのメトリックしか取得できませんが、**GetMetricData**は1度に**最大500コ**のメトリックを取得できます。
で、前述の cloudwatch_exporter は **GetMetricStatistics** を使用しているため、取得するメトリック・対象Instanceが増えるとCloudWatch API数も増えていきます(当然ですが・・・)。

# yes-another-cloudwatch-exporterについて
前述が長くなりましたが、そこで弊社では yet-another-cloudwatch-exporter(後述YACE) へ置き換えることでコストを削減させています。

[ivx/yet-another-cloudwatch-exporter](https://github.com/ivx/yet-another-cloudwatch-exporter)
[Improving the Prometheus exporter for Amazon CloudWatch](https://sysdig.com/blog/improving-prometheus-cloudwatch-exporter/)

####YACEの良い点
- GetMetricData で複数のメトリックを1度のAPIコールで取得してくれる

- exporter内でDimensionを取得してGetMetricDataを実行してくれるので設定ファイルがシンプル

```
discovery:
  exportedTagsOnMetrics:
    ec2:
      - Name
    ebs:
      - VolumeId
  jobs:
  - type: es
    regions:
      - eu-west-1
    searchTags:
      - Key: type
        Value: ^(easteregg|k8s)$
    metrics:
      - name: FreeStorageSpace
        statistics:
        - Sum
        period: 600
        length: 60
```
- Prometheusからのscrapeによりメトリックを取得するのではなくProxyとして動作するため、Prometheus側で30秒おきとしても直近に取得(デフォルトでは5分おきにYACEがメトリックを取得する)したものを返す

- クロスアカウントに対応しており、1つのNamespaceに対して複数のアカウント分の設定ができる

```
  jobs:
    - type: ecs-svc
      regions:
        - eu-north-1
      roleArns:
        - "arn:aws:iam::111111111111:role/prometheus" # newspaper
        - "arn:aws:iam:2222222222222:role/prometheus" # radio
        - "arn:aws:iam:3333333333333:role/prometheus" # television
      metrics:
        - name: MemoryReservation
          statistics:
            - Average
            - Minimum
            - Maximum
          period: 600
          length: 600
```

YACEのおかげでAPI数が大幅に減らすことができ、コストも半分以下にまで下げることができました。

# おわりに
現時点ではNamespaceに制限があるため、すべてのサービスのメトリックが取得できないようです。
また、GetMetricDataを使用しているのは **Auto-discovery** のJobだけで **Static** のJobでは**GetMetricStatistics**が使用されるので注意が必要です。
CloudWatchのコスト増・APIスロットリングでお悩みの場合に選択肢の1つとしてアリかと思います。
【KDD2020 Workshop採択論文紹介】GCNで時系列予測！？

明示的にグラフ構造でないデータに対してもGraph Convolution Network(GCN)が使える！？

ドコモの久保田です。この記事では、データマイニングの国際会議であるKDD2020で開催されたThe Second International Workshop on Deep Learning on Graphs: Methods and Applications (DLG-KDD’20)に採択された私たちの論文"Time-aware GCN: Representation Learning for Mobile App Usage Time-series Data"を紹介します。論文はKDDの[リンクのページ](https://deep-learning-graphs.bitbucket.io/dlg-kdd20/)からダウンロードできます。

![2020-11-20-10-31-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541251/31a73e9e-4644-91f0-5a3c-148810b2a352.png)

# KDD2020の投稿傾向
KDD2020のOpening[^1]でResearch Trackのトピックごとの投稿論文数が報告されていましたが、上位2つが以下のトピックに関するものでした。

+ Graph Mining 260本
+ Representation Learning 168本

Research Trackの採択論文数217本から見ても多くのグラフ関連の論文や表現学習に関する論文が投稿されていたようです。
私たちの論文が採択されたのはKDD Workshopですが、Graph×Representation Learningというトレンドに乗った内容になっています。

# どんなもの
時系列データをグラフデータとして捉えることでGCNを適用し時系列データのよりよい表現を獲得するというものです。
今回は、アプリログを用いて、アプリログのデータの特性を考慮した手法を提案しています。

普段スマホでアプリを利用しているとき、このようなことがありませんか？

+ 通勤中に普段はTwitterを見てTikTokを見るが、なんとなくの気分で今日はTikTokから見始めた
+ NewsPicksのアプリで気になった記事をEvernoteにメモするようにしているが、今日はNewsPicksを見ているときに友人からLINE通知が来てLINEを開いた

これらの例のように、通勤中にSNSを見るやNewsPicksを見た後にEvernoteにメモするというユーザの習慣に基づく長期的なアプリ利用のパターンは、あまり変化しないと考えられるが、短期的な利用はユーザの気分や通知等により変化する可能性があります。

よりよい表現を獲得するうえで、正確に時系列のパターンを学習するlong-short-term memory(LSTM)などの手法では対処できない可能性があります。

このような状況において、短期的なアプリ利用の変化による影響を軽減しつつアプリ利用に関するよりよい表現を獲得するために、GCNを用いた手法を提案しています。

# 提案手法
## GCNを適用するためのグラフ構築
GCNを適用するには、グラフ構造のデータが必要であり、より良い表現を獲得するためにはアプリログから時系列情報を保持したグラフを構築する必要があります。これを実現するために、以下の手順でアプリ利用に関するグラフを構築します。

1. アプリログからスライディングウィンドウを用いて$n$個のアプリを抽出(これをアプリ利用系列と定義)
2. あるアプリ利用系列$S$に注目して、アプリをノード、アプリ間の利用時間間隔が$\Delta t_{\text{th}}$であれば、アプリ間にエッジを張ることでアプリ利用グラフを構築

## よりよい表現を獲得できたかを評価
アプリログのより良い表現を獲得できたかを、次のアプリを予測するタスクとして定義します。また、次のアプリを予測するタスクをGCNで実現するためにグラフ分類問題として捉えることで実現します。

提案手法のT-GCNのアーキテクチャを下図に示します。 
![2020-11-20-11-14-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541251/13dc1aa1-cbf8-ea34-e769-c34b79a4cef1.png)


# 実験
実際のアプリログのデータセットを用いて評価を実施します。
ベースラインはLSTMと既存研究から時間差$\Delta t_{\text{th}}$以内の直前のアプリのみからエッジを張る手法(T-GCN-SEと定義)として実験を行いました。

時系列情報をどのように考慮してグラフを構築するかが精度に影響を与えると考え、アプリ間でエッジを張る時間差$\Delta t_{\text{th}}$を変化させて実験を行いました。

![2020-11-20-11-14-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541251/664c786a-66a8-f945-a490-b5d719f525e0.png)


結果としては、ある程度の長さの時間差内のアプリ簡にエッジを張ることが有効であることが分かりました。

最後に、ベースライン手法との比較を示します。
![2020-11-20-11-15-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541251/3bc45f06-5739-4711-ca0e-3ae9c1e91bf1.png)

提案手法であるT-GCNがベースライン手法よりも精度が向上することを明らかにしました。
特に、accuracy@10では、LSTMと比較して3.6%の精度向上を確認しました。

# 実装
実装に関しては、Deep Graph Library(DGL)[^2]を利用しました。Pytorchから使える点と、tutorialに事例が豊富に記載されていおり参考にしながら実装できたので、実装コストが低くかった点が魅力的でした。

# 最後に
KDD2020のTutorialや本会議にも参加していましたが、オンライン開催だったこともあり発表動画が好きなだけ見れたので良い部分もあったなと思いました。こういった学会発表などに関しても全面的に支援してくれる環境はとても恵まれているなと思います。これからも事業的に貢献し、学術的にも貢献があるような研究開発を実施していきたいですね（来年は本会議へ！）。

最後まで読んでいただきありがとうございました。

[^1]: KDD2020のOpeningは以下のリンクから閲覧できます。
[^2]: https://www.dgl.ai/
[所要時間1時間]GASでWork fun なSlack botをさくっと実装してみた

## はじめに
皆さんは仕事をしていて、なんとなく夕方ごろに集中がきれてしまうこととかないでしょうか？
私はあんまり長く集中が続かないタイプなので、夕方ごろになると注意散漫になったり、やらなければならないタスクより取りかかりやすいタスクを消化をするといったことになりがちです。

その問題を解決するために、夕方17時になったら自分の好きな「[左ききのエレン](https://alu.jp/series/%E5%B7%A6%E3%81%8D%E3%81%8D%E3%81%AE%E3%82%A8%E3%83%AC%E3%83%B3)」のモチベーションをあげる名言を投稿してくれるSlack botをGASで作ってみました。

## 実装内容
**[GAS側]**
* Google Sheetsで投稿したい「名言」を管理
* GAS の「時間指定トリガー」でスクリプトを実行
**[Slack側]**
* ワークフロービルダーのWebhookで「名言」を受け取り、Messageを送信
#### [イメージ図]
![slackbot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584011/123e4a39-5cf9-64d9-db6f-cebfcf0a64d6.png)
 
## 手順
1. Slackのワークフロービルダーで[Webhook]のワークフローを作成して、投稿用のURLを取得する (参考：[ワークフロービルダーガイド](https://slack.com/intl/ja-jp/help/articles/360035692513-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%89)）

2.Webhookの変数設定でGASから送信する「名言」を受け取るための「変数(ここではword)」を設定する
![webhook-slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584011/105c9183-7ae3-cd60-c75e-16eed3340ed1.png)

3.Google Sheetsで投稿したい「名言」を入力
![power_words.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584011/a7faf527-1419-02e6-7b6d-511c70624178.png)

4.Google Spread Sheetの[Tool] > [Script Editor]からGASを開く
5.GASで下記のようにコードを実装

``` power-words.js
function main() {
  let word = getWord()
  postToSlack(word, WEB_HOOK_URL)//SlackのWEB_HOOK_URLを取得(いずれPropertyとかで取ってくるようにします)
}
function getWord() {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  let sheet = spreadsheet.getSheetByName('words')
  let firstRow = 4
  let lastRow = 14
  let colIndex = 2
  let rowIndex = Math.floor(Math.random() * (lastRow - (firstRow - 1))) + firstRow 
  return sheet.getRange(rowIndex, colIndex).getValue()
}
function postToSlack(word, webhookUrl) {
  let body = {
    "word" : word
  }
  let params = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(body)
  }
  UrlFetchApp.fetch(webhookUrl, params);
}
```

6.時計のアイコンからGASの「時間指定トリガー」の設定画面を開く
![timer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584011/cd8104ec-1cb2-07c0-d4d3-d0a51df86ade.png)

7.「名言」を投稿したい時間に`main`関数が実行されるようにセット

=> 
完成!! 
月~金の夕方17時にこんな感じのメッセージがSlackに投稿されます！
![elen-bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584011/d310e569-ad98-5688-aa01-890163ef1040.png)


## 終わりに
これまであまり使ったことがなかったのですが、GASを使うことでモチベーションアップしてくれるSlack botをわりと簡単に実現することができました。
時間指定トリガーなど使いやすい機能が標準であるので、今回のようにちょっとした課題を解決したい場合にはGASは結構良い選択肢だな〜と思いました。

実装にあたっては、[社内メンバーのアドベントカレンダー投稿をSlackに通知するBotをGASで作ってみた](https://qiita.com/cold-wisteria/items/640d50edeffea05dae86)を大いに参考にさせていただきました。

「クソみたいな日にいいもんつくるのがプロだ」っていう名言を励みに、今後は夕方以降も楽しく開発をしていこうと思います！
 
## 参考
* [社内メンバーのアドベントカレンダー投稿をSlackに通知するBotをGASで作ってみた](https://qiita.com/cold-wisteria/items/640d50edeffea05dae86)
* [GAS（Google Apps Script）：トリガーで指定した時刻にスクリプトを実行する](https://note.com/tamo_3/n/n6a5453454259)
* [【GAS】スプレッドシートのランダムな行データを取得してツイート（GAS×TwitterBot⑤）](https://moripro.net/gas-spreadsheet-random-tweet/)
* [Google Apps Script > UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object))
multipass を Windowsで使う

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに
WindowsでもUbuntu multipassは動くそうなので、試してみました。

# 1. インストーラーダウンロード

Releases · canonical/multipass
https://github.com/canonical/multipass/releases
から最新のmultipass-1.x.x+win-win64.exeをダウンロードします。

これは、Windowsのインストーラーになります。
どこか適当なところにダウンロードしてください。

# 2. インストール

ダウンロードしたインストーラーを起動します。

## 2-1. インストール実行確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/556dab51-85d5-9c10-21e3-ae11e4a50e5f.png)

## 2-2. ライセンス確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/73af8d3a-687a-c9e6-d6db-f2227988e919.png)

## 2-3. 使用するハイパーバイザーを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/83507024-8d46-d250-1cb4-ab96a99baa9c.png)
Hyper-Vでよいと思います。

## 2-4. 実行パスを追加する指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d9de2c65-64b8-c35a-003e-5571eafa3963.png)

## 2-5. 実行バイナリーをインストールする場所を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/8828bbde-0fd9-9c01-365c-c6dcd64f25a2.png)

## 2-6. インストールコンポーネントを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1ac8f13d-68ef-6d85-7f32-1769e069b4de.png)

## 2-7. 再起動確認画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/3ea834ba-1253-af31-d053-c6e9ac4a132e.png)

## 2-8. 再起動後 multipass バージョン確認
`multipass version`で正しくインストールされたか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/c6c0d780-05a1-3419-ef93-b5b0d35abe33.png)

# 3. Multipassを動かしてみる

## 3-1. multipassでイメージを確認
`multipass find`で仮想マシンイメージを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/704b9f77-8f43-22dc-d4f8-ce1e0d81b06c.png)

## 3-2. Ubuntu 18.04を起動してみる
`multipass launch 18.04`でUbuntu 18.04を起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/60c7576d-0f4e-8f36-99eb-7b5806f02e8e.png)

## 3-3. 起動確認
`multipass list`で起動しているVMを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1eacfdc9-f34a-3263-f102-45de6c8f8f0d.png)

## 3-4. ログイン

`multipass shell` でログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/21fab7c0-36cc-936e-a4c6-4dcdb7a9d515.png)

# 4. 申し訳程度のGUI

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/a5bc441c-4120-6d3f-a4fc-edcc1f906381.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d1518cb8-4966-d9ee-eee2-63cccff9fe11.png)


# 5. Hyper-Vから見る

こんな風に見えていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/962e71a5-651e-0338-fbfa-c6fc52b913d0.png)

# 6. まとめ

Ubuntuと同じ感じで利用できるのは便利ですね。
しかし、WindowsにはWSL2もあるので便利さ的にはWSL2の方が良いです。

Ansibleのテストなどには、multipassとかでも良いかも知れませんね。

# 7. 参考資料

仮想マシンマネージャmultipassをWindowsとmacOSで試してみた · hnakamur's blog
https://hnakamur.github.io/blog/2019/10/17/multipass-on-windows-and-macos/

仮想環境multipassを試す - Qiita
https://qiita.com/u1and0/items/4926da3bef17853d33d1

Ubuntu 20.04でMultipassをブリッジネットワークで動かす - Qiita
https://qiita.com/ynott/items/d8cf08c1f4a279e37177
Firebase Authenticationで作成されたユーザーのIDをFirestoreで独自に定義したユーザードキュメントのIDとして使う方法

Firestore Authenticationで管理されているIDをFirestore上の独自に定義したユーザーコレクションと連携したいケースはよくあると思います。
`add()`を用いると自動でIDが生成されてしまいますが、`doc()`の第一引数に任意のIDを取ることができるので、
`doc()`でイニシャライズしてから`set()` を用いドキュメントを作成すれば任意のIDをドキュメントに設定できます。

以下例

```
final user = {
  'name': 'hoge',
  'profile' : 'huga'
}

final res = await _auth.createUserWithEmailAndPassword(
     email: 'hoge@hoge.com', password: 'hugahuga');

FirebaseFirestore.instance
  .collection('users') //自分で定義したユーザーコレクションのpath
  .doc(res.user.uid)
  .set(user);
```

**補足**
コードの例はdartで書かれています。
【Github】巨大なファイルを送る際は、＜＞Codeの右側の「Releases」から

## 【Github】巨大なファイルを送る際は、＜＞Codeの右側の「Releases」から

右側の項目

Releases
No releases published

Create a new release
以下のように圧縮ファイルをreleasesに保存することができます。
https://github.com/[グループ名]/[プロジェクト名]/releases/new

* [グループ名],[プロジェクト名]を入れてみてください。入れないとリンクエラーになります。

（１）tag version
（２）release title
（３）その他説明文章
（４）↓　に「圧縮ファイル　zip」〜２G まで

（１）〜（４）を入力料したら
「Publish release」ボタンを押下して保存することができます。

よくある勘違い送信したんだけどちゃんと送れていない場合
（１）〜（４）抜きもれていないか？確認しましょう

確認方法は２つ

releases
https://github.com/[グループ名]/[プロジェクト名]/releases
リリース名でみれます

tags
https://github.com/[グループ名]/[プロジェクト名]/tags
タグ名でみれます

* [グループ名],[プロジェクト名]を入れてみてください。入れないとリンクエラーになります。

## 関連記事

[【Github】一覧](https://qiita.com/sunstripe2011) - Github 操作まとめ
【About】(https://qiita.com/sunstripe2011) - サンストライプ

---

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１ WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)

緩募


### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
https://twitter.com/sunstripe2011

#### プログラミングラボ
https://twitter.com/PLab2020

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

#### トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

### キャリア教育事業

#### 青空プログラミング
[![青空プログラミング100px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/603d53ab-828b-645e-a415-1b6f158d7356.png)](https://actcoin.jp/project/detail.php?id=600)

[![ダウンロード (9).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/9bde9318-28c2-ce74-d4c5-326168061bcc.jpeg)](https://www.youtube.com/hashtag/%E9%9D%92%E7%A9%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

#### 広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集

## ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております

## ビヨンドXプロジェクト

[ビヨンドXプロジェクト全体会議](https://www.youtube.com/playlist?list=PLaR6-YWiGWkYhEHWnt8f1z-JC0g3nwwC9)
マンガでわかるお邪魔妖怪アンチパターン

![B863DC91-5EA0-4984-B8C3-9A32A8B6C51A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/7ff81fdd-d426-9ddd-0752-ecb5f0f7f7e0.png)
http://wiki.c2.com/?PolterGeists

プログラムの文脈とは何の関係もないように見える、神出鬼没なオブジェクトが現れるパターンです。原文ではポルターガイストと言われています。

妖怪やポルターガイストは普通の人の目には見えないけれど、あるとき突然現れて、勝手に家具を動かすなどの悪さをしますね。プログラムコードの妖怪が厄介なのは、消してしまうと結果が変わることがある点です。

こういったオブジェクトはたいてい、プログラムのフローとは異なる空間 (グローバル変数や static フィールド、長寿命なコンテキストなど) での副作用を利用した制御をしています。この副作用に、いつも通るからと、当初意図されたもの以外の振る舞いが追加されている場合もあり、誰もその作用を把握できていない謎の処理になっていることもよくあります。

そうしたお祓いしにくい妖怪が最初から住み着かないように、できるだけ入出力でのみデータを扱うプログラムを書き、副作用を用いるにしても、その名前から作用が明らかなものにし、そこに複数の余計な処理を含まないようにしておきましう。
Ruby , Ruby on Railsの根っこを理解するための基礎知識①　〜基礎用語〜

#【ディレクトリとファイルの作成・実行コマンド】
##ディレクトリの作成

```
$ mkdir 作りたいディレクトリ名
```

##ファイルの作成

```
$ touch 作りたいファイル名.rb
```

##ファイルの実行

```
$ ruby 実行したいファイル名.rb
```

※「.rb」はRubyの拡張子

#【基礎用語】
##データ型
オブジェクトが文字列なのか数値なのかを区別する種類のこと
※例”1”は文字列のデータ型なので、.to_iメソッドで整数に変換し計算を行う
##文字列
データ型の一種で、テキストデータ
##数値
データ型の一種で、計算を行える数字データ
##変数
文字列や数値、計算などを定義されたデータ
※「変数名 = 数値や計算など」で代入し、「p 変数名」などにて、呼び出したり、出力する
####＜使用例＞
「date = 2020」と定義すれば「p = date」と書いた時「2020」と出力される
※「=」は等しいと言う意味ではなく、左の値に右の値を代入する（定義する）と言う意味となる
##配列
同じ括りのオブジェクトを一つにまとめる事
「変数名 = [“A”,”B”,”C”]」などで定義し、「p 変数名[インデックス番号]」などで呼び出したり、出力する
####＜使用例＞
「fruits = ["リンゴ", "メロン", "バナナ”]」と定義した時、「p fruits[1]」と書いて、「メロン」と出力される
※インデックス番号は0から始まる番号
##ハッシュ
まとめられた値のデータ型につける事ができる名前の事
「変数名 = [データ1, データ2, データ3]」などと複数のデータがまとめられた時に何を意味するか分からなくなってしまわないよう「変数名 = { ハッシュ名1: データ1, ハッシュ名2: データ2, ハッシュ名3: データ3}」とラベルをつける事で、p 変数名[:ハッシュ名]と呼び出せるように出来る
####＜使用例＞
「fruits = { name: 'りんご', price: 100 }」と定義する事で、「p fruits[:name]」と書けば「’りんご’」と返ってくる

#【メソッド】
プログラムが実行された時に行われる処理の事
デフォルメされたものもあれば、自分で作る事もできる関数のようなもので、「.」に続けて記載する事で、呼び出し使う事ができる
####＜使用例＞
「length」と言うデフォルメされている文字数を返すメソッドを使う場合、「p "りんご".length」と記載する事で、「3」が返ってくる
※メソッドを呼び出すオブジェクト（例で言う”りんご”）のことをレシーバと呼び、メソッドを実行して返ってくる結果を返り値と呼ぶ
####＜自分で定義する方法＞
「def メソッド名」でメソッドを定義する宣言を行い、処理を書いた最後に「end」で括り、メソッド名を書いて呼び出し使用する事ができる
####＜自分で定義する時の使用例＞

```ruby:
def apple
  p "りんご"
end
```

と定義した場合「apple」と書くと、「りんご」が返ってくる
####＜メソッドに引数を渡す方法＞
「def メソッド名(引数名)」と宣言し、「p 引数名」と処理を書く事で、「メソッド名(引数名)」を記載した際に入れた引数名をメソッドが受け取り出力する
####＜メソッドに引数を渡す時の使用例＞

```ruby:
def fruits(name)
  p name
end
```

と定義した場合「fruits(“りんご”)」と書けば“りんご”と、fruits("バナナ”)と書けば”バナナ”と、それぞれ返ってくる
UIAlertControllerのTextFieldから入力値を取り出す方法

## 1. TextFieldを乗せたAlertを生成

```Swift
        let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)
        alert.addTextField { (textField) in
            textField.placeholder = "テキストを入力"
        }
        
        let completedAction = UIAlertAction(title: "完了", style: .default) { (action) in
          //完了ボタンがタップされたときの処理

        }

        let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
        
        alert.addAction(completedAction)
        alert.addAction(cancelAction)
        self.present(alert, animated: true, completion: nil)
```

## 2. 入力値を取り出す

```Swift
　　　　　let completedAction = UIAlertAction(title: "完了", style: .default) { (action) in
            //1. alertのtextFieldsから特定のTextFieldを取り出します
            if let textFieldInAlert = alert.textFields?.first {
                //2. あとは通常のTextFieldの操作と同じです
                let text = textFieldInAlert.text ?? ""
                print(text)
            }
        }
```

以上
【Ruby】Railsを利用して画像にリンクを貼りたい【link_to】

##背景
Bootstrapを用いてリンクを装飾しようと意図したとき、適用されずあれ？ってなったので備忘録です

##結論
「link_toメソッド内にclassを指定するオプションが存在した」

##事象
そもそもなぜこの問題が起こったかですがa要素にclassを適用して、a要素の中にlink_toメソッドを記載していました。（以下のコード）

問題のコード

```html:index.hetml
<a class="nav-link" href=""> 
 <%= link_to('tweetApp',"/") %> 
</a> 
```
実際に作成されたHTMLを見ると、、、

```html:index.html
<a class="nav-link" href=""></a> 
<a href="/">tweetApp</a> 
```

あれ？a要素の中にlink_toメソッドを記載したはずなのに飛び出てますね

ここでおかしいと思い調べたところどうやらlink_toメソッド内にclassを指定してあげることでlink_toから生成されるa要素にcssが適用されるみたいです。


##解決方法
書式
link_to(リンクテキスト, パス [, オプション, HTML属性 or イベント属性])

実際のコード（今回はtext-lihgtを使用しています）

```html:index.html
<%= link_to("tweetApp","/",class: "text-light"%>
```

生成されたhtml

```html:index.html
<li class="nav-item">
 <a class="nav-link" href="">tweetApp</a>
</li>
```

無事a要素にcssが適用されました。

##参考
[Railsドキュメント:ビューについて](https://railsdoc.com/view)
エンジニア向けイベントの企画運営

この記事は[POLプロダクト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/pol)の6日目の記事です。

前回はどんな時でも果敢にボケて笑いを取りに行くゾネス君が、[検証開発を素早く安定して構築する記事](https://qiita.com/takahiro-yamada/items/2e3d60999a3e46fc5942)を記載してくれました。そんな彼からバトンを受け取ってアドベントカレンダー6日目を担当します、株式会社POLでリードエンジニアをしている高橋です。

今年も色々な出来事がありその中で何を書くか悩ましいのですが、私事ですが今年になって開発以外のお仕事として小規模ですがエンジニア向けイベントを企画、運営するようになり。普段の開発とは違う視点で物を考えて仕事をしたので、イベント企画運営で得た知見について振り返りつつ共有しようと思います。今後エンジニア向けイベントを企画運営しようとする方の一助となれば幸いです。

# 開催したエンジニア向けイベント
月1でイベント開催し、これまでに計4回イベント開催を行いました。

## 大手町もくもく会
![イベントページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130513/ae071f88-1412-7e49-b6a7-1980378508a7.png)
[イベントページ](https://pol-inc.connpass.com/event/183543/)

大手町にある弊社オフィスで行われるもくもく会を3回ほど開催しました。オフィスが大手町駅に非常に近く、(手前味噌ですが)広くて綺麗なオフィスだったので、「土曜日に集中できる提供してエンジニアが集まれる場所になりそう！」と思ってこういったイベントを開催しました。

## オンラインモブプロ会
![イベントページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130513/5f2a3bd9-8abb-32a6-76fb-62e2a70d9fd3.png)

[イベントページ](https://pol-inc.connpass.com/event/195406/)

都合により弊社オフィスが暫く使えなくなってしまったので😢、新しいイベントとしてオンラインで集まって即席チームでモブプログラミングを体験するイベントを開催しています。今月2回目を開催予定で、より良い回にしていけるように努力中です。

# 企画運営する上で大事にしていること
## 1. とにかく運営を楽にして長続きするイベントにする(長期間継続して価値を出す)
エンジニアである以上は開発でパフォーマンスを発揮する必要があり、イベント運営で開発が疎かになってしまってはよろしくないので、如何に少ないイベント運営作業で参加者に価値を感じてもらえるようにするかは大切にしました。特に普段のお仕事で工数がパツパツの自分にとって、運営作業を楽にできるかどうかは至上命題でした。

そのため、開催した両イベントは初回こそタイムスケジュールや運営の担当割り振り等、事前準備が必要ですが、2回目以降はなるべく1回目の資産を使いまわし、運営する人たちがイベントに参加さえすれば成り立つよう工夫しています。

今の所月1開催を継続できており大きな問題も発生していないので、来年以降も「続けられること」を重視したイベント運営に努めていこうと考えています。

※実は当初は何かしらのハッカソンを開催する方向で検討していましたが、

* コンテンツ企画、当日運営、集客等、どれに関しても現状のプロダクトの実力では満足の行く内容を提供できない
* イベントを1回開催しただけでは成果に乏しそうだがハッカソンのような難しいイベントを何度も開催し続けるのは現実的ではない

こういった理由からハッカソンの開催を思い直して、なるべく今の自分たちの実力でも開催し続け、徐々に知見や認知を得ていく方針に変更しています。

## 2. 出不精な自分でも参加したいと興味を持てるようなイベント内容にする

イベントを開催する上で集客が非常に大変なことは予想できたので、少なくとも普段イベントにあまり参加しない自分からみても「ちょっと参加したいな」と思える内容になるように企画段階で工夫しています。

具体的には、「大手町もくもく会」については

* 大手町駅なら自分は乗り換え無しで行けるし、東京駅が最寄りなので概ねどこからでもアクセス良い場所なので参加しやすいだろう
* 以前参加したもくもく会でランチタイムがあって、ご飯も嬉しかったし参加者と会話するのも良い体験だった

といった予想や経験を元に企画し、「オンラインモブプロ会」については

* モブプログラミングは多くのエンジニアが興味を持っているが、実際に体験できる人体験したことがある人は少なく、イベントでモブプログラミングを体験できる場を提供してみたら、興味を持ってもらえるのではないか
* (募集ページには記載してないですが)ISUCONの問題を使ってモブプログラミングを実施してみたら、ISUCONに興味があるけど踏み出せていない人には魅力的に感じるのではないだろうか

といった予想を元に企画しました。良いイベントになるようまだまだトライ&エラー中で、今後も改善していければと考えています(知見あれば教えて下さい！)

# さいごに

技術の話ではないですが、誰かのためになれば幸いです。
次のアドベントカレンダーの担当日では技術について書きます。。。
[初心者向け][sqlite3]なぜだ。コマンドでsqlite使えない。

#sqliteコマンド使えんやんけ！


題名のとおり、laravelを安定の青本で勉強していた際に、データベースの部分でsqlite3を使う機会がありました。
その際になぜかsqliteコマンドが反映されないことがあったので、メモ程度に残させていただきます。

##環境
 ● Windows10
 ● sqlite（ダウンロード方法は省きます。）
※Mac環境の方は、元から搭載されているらしく関係ないそうです。


##今回しようとしていたこと


```cmd.
sqlite3 database.sqlite
```

これを実行するも
`「sqlite3」は使用できません。`
よし、ググってみましょう。

##解決方法

###原因

「コマンドラインツールは別アーカイブになっています。sqlite-tools-win32-x86-なんとか.zipをダウンロードして取り出してください。」

とのことでsqlite-tools-win32-x86-なんとかをダウンロードし、コマンドたたいたところ、

```cmd.
sqlite3 database.sqlite
SQLite version *****
Enter ".help" for usage hints.
```

お、できました。

##まとめ
とてもしょうもないのですが、上記の通りコマンドは別アーカイブらしいので、コマンドのもダウンロードする必要があるそうです。
あまり記事がなさそうだったので、投稿してみました。少しでも参考になれば幸いです。


[参考記事](https://ja.stackoverflow.com/questions/39433/sqlite3%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)