OmniAICreator/Qiita-1.07M huggingface dataset:
意外と間違えるVue.jsのバージョン確認方法

#間違い
```shell:
% vue -V
@vue/cli 4.1.1
```
一見合ってそうですが、このコマンドではVue.jsのプロジェクトを簡単に立ち上げるためのパッケージ「Vue CLI 」のバージョンが表示されてしまいます。

#正解
##プロジェクトごとにインストールしている場合
```shell:
% npm list vue
vue-hoge@1.0.0 /Users/fuga/project/vue-hoge
└── vue@2.6.10 
```

##グローバルにインストールしている場合
```shell:
% npm list -g vue
/usr/local/lib
└── vue@2.6.10 
```
IO::Compress::Zipでzipファイルを作る

Perl Advent Calendar 2019 の10日目です！！
昨日はskajiさんでした。

---

この間、IO::Compress::Zipで、zipファイルを作成したのですが、記事が少なそうでしたので、簡単な使い方紹介をしようと思います。

# IO::Compress::Zipとは
https://metacpan.org/pod/IO::Compress::Zip
>IO::Compress::Zip - Write zip files/buffers

IO::Compress::Zipはfileやbufferからzip fileを書き出してくれる君です。

# 実行環境
MacBook Pro
OS: macOS Mojave
Perl v5.28.2

# 使い方

## zip fileを開いて、zipを作る。
IO::Compress::Zipの第一引数にpath、もしくはfilehandleを渡すと、そのファイルを開いて、zipファイルを作ってくれます。
ちなみに、渡したfilehandleは、IO::Compress::Zipのclose時に、内部でcloseしてくれるようです。

```perl
use strict;
use warnings;

use IO::Compress::Zip qw/$ZipError/;

my $out = 'test.zip';
my $z = IO::Compress::Zip->new($out, NAME => 'test.text') or die "zip failed: $ZipError\n";
$z->write("hello zip\n");
$z->write("hello perl\n");

$z->close();
```

もしくは、

```perl
use strict;
use warnings;

use IO::Compress::Zip qw/$ZipError/;

my $out = 'test.zip';
my $fh;
open($fh, ">", $out) or die("error :$!");

my $z = IO::Compress::Zip->new($fh, NAME => 'test.text') or die "gzip failed: $ZipError\n";
$z->write("hello zip\n");
$z->write("hello perl\n");

$z->close();
```

```shell
$ perl test_zip_file.pl
$ unzip -l test.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       21  12-04-2019 14:36   test.text
---------                     -------
       21                     1 file
```

## bufferにzipを作る。
IO::Compress::Zipにscalarのリファレンスを渡すと、そこに書き込んでくれます。

```perl
use strict;
use warnings;

use IO::Compress::Zip qw/$ZipError/;

my $out = '';
my $z = IO::Compress::Zip->new(\$out, NAME => 'test.text') or die "zip failed: $ZipError\n";;
$z->write("hello zip\n");
$z->write("hello perl\n");
$z->close();

print $z;

my $fh;
open($fh, ">", "data.zip") or die("error :$!");
print $fh $out;
close $fh;

```

bufferに作成したzipファイルは、そのままfileに出力することができます。

```
$ perl test_zip_file.pl
IO::Compress::Zip=GLOB(0x7fcf48005908)
$ unzip -l data.zip
Archive:  data.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       21  12-06-2019 16:34   test.text
---------                     -------
       21                     1 file
```

# ちょっとハマったこと
zipファイルを作る際、NAME option(`NAME => 'test.text'`) を入れてあげないと、unzipできなくなるので注意が必要です。
https://metacpan.org/pod/IO::Compress::Zip#Name-=%3E-$string
https://stackoverflow.com/questions/55043193/zip-archive-contain-files-without-names-how-to-unzip-it

```shell
$ unzip -l test.zip
Archive:  test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       21  12-04-2019 14:41
---------                     -------
       21                     1 file

$ unzip test.zip
Archive:  test.zip
mapname:  conversion of  failed
```

---
以上になります。

明日は、codehexさんです。
良いクリスマスを！
AWS re:Invent 2019で発表【Amazon SageMaker Studio】

![2019-AWS-reInvent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/e487a935-3df1-f80a-a3d9-02bdf66bc659.png)

AWS re:Invent 2019で新たなサービスがドドン！と発表されました！
特に機械学習のサービスは豊富なリリースが発表され、大注目されています。

今回は初心者の方向けに分かりやすく「Amazon SageMaker Studio」というAWSの機械学習における幅広いサービスを一つの画面で実行できる環境について、ご紹介させて頂きたいと思います。

##AWS re:Inventって？
AWSイベント 公式ページより
>AWS re:Invent は、AWSやパートナーによって多くの新サービスや新機能が発表と、 1,800 を超えるセッションや最新のテクノロジーの展示やデモンストレーションが行われます。
またテクノロジーを満喫できるパーティ re:Playなどの様々なプログラムがラスベガスのエリアで開催される、AWS最大にして世界規模のカンファレンスです。


#Amazon SageMaker Studio
画像は公式サイトより。
![2019-12-12_16h13_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/e6ace04c-6f10-f47d-2b51-89cd525afdf2.png)

Machine learning開発に必要なすべてのツールを統合したWebベースの統合開発環境(IDE)。
AWSが機械学習に特化した統合開発環境としては初のサービス。

ぜーんぶまるっと統合した状態で視覚的にわかりやすく、機械学習に必要になるすべての環境が自動的に用意されています。
これにより迅速に変更を加え、結果を観察し、より速く反復することができるので反映する時間を短縮できます。開発の生産性を大幅に向上できそうです！

![2019-12-12_16h01_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/3af5d900-e3ba-3446-d5bb-83ddd33469a3.png)


Webベースで動作するので、Webブラウザから利用することができ、プロジェクトを作成する段階で自動的にインスタンスの作成やサーバのセットアップも完了しインフラの管理も必要がない仕様になっています。

###統合されているツール
* **Notebooks**
 - notebookをささっと使い始められる
* **Experiments** 
 - 機械学習の実験を構成・記録・比較できる
* **Debugger**
 - リアルタイムに自動アラートでモデルのバグを排除する
* **Model Monitor** 
 - 稼働中のモデルの監視、検出ができる
* **Autopilot**
 - どのような判断によってモデルを構築したかを、詳細に視覚化する。ユーザーのデータから最適なモデルを自動的に作成できます。

###なぜ統合開発環境が必要か
自前で機械学習を行うすべての実行環境を行おうとすると、本来は複雑な作業をする上、ツールの行き来を手動で行うのでいちいち時間がかかるといった面倒があります。
機械学習を行う手順とそれらを実行するツール間が全て別々になっているからです。

1. データの収集と前処理
2. モデリング
3. 学習
4. 評価と最適化
5. アプリケーションへの組み込み

たとえば、新しいアルゴリズム（問題を解くための計算方法や手順）を試したりハイパーパラメーター（推論や予測の枠組みの中で決定されないパラメータのこと）を設定する際、数百や数千の実験を行いますが、この実験結果をすべて手動で管理することになります。
これに時間がかかりすぎると、最善のモデルを見つけ出すことや実験の中で得た知見を活用することが非常に難しくなります。

その課題を解決するためにAmazon SageMaker Studioを使用するべきということです。

#活用法

* 作業工程、学習、訓練、データの展開や実行するプログラムを作るコードの記述。
* 実験を追跡、データの視覚化、バグを修正する作業と監視
* ノートブック、データセット、コード設定、 トレーニングの分析、アラートを管理
* モデルのチューニング、モニタリング
* データセットの前処理やパラメータを調節したり、 複製、再生したりできる
* 手順のすべては環境内で追跡
* 同じプロジェクトに対して作業している他のユーザーと、プロジェクトやフォルダを共有する機能もありそこでノートブックや成果について議論することができます。


12月12日(木)現時点ではオハイオUS Eastリージョンで使用可能です。
早く活用できるようになりたーい！


#公式サイトリンク
* [AWS re:Invent]
(https://reinvent.awsevents.com/?trk=aws.amazon.com,aws.amazon.com)
* [Amazon SageMaker]
(https://aws.amazon.com/jp/sagemaker/)
* [SageMakerの料金]
(https://aws.amazon.com/jp/sagemaker/pricing/)
カルネージハートとは関係ないVue Router内でVueAppにアクセスする

カルネージハート Advent Calendar 2019 8日目の記事です。

今回はカルネージハートとは全く関係ないVue Router内でVueAppにアクセスする話です。

# route.jsの設定

```js
import Vue from 'vue'
import Router from 'vue-router'
import Home from './components/page/Home'

Vue.use(Router)

const router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
    },
  ]
});

export default router
```

こんな感じでVue Routerを設定している場合、`console.log(router)`でアクセスできる~~当たり前だ~~

```js
import Vue from 'vue'
import Router from 'vue-router'
import Home from './components/page/Home'

Vue.use(Router)

const router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
    },
  ]
});

console.log(router);

export default router
```

beforeEachで毎回API通信してなんかやりたいときも

```js
import axios from "axios"
・
・
・
router.beforeEach((to, from, next) => {
  axios.get("/api/category").then(response => {
  });
})
export default router

```

のような感じで

または

```js

router.beforeEach((to, from, next) => {
  router.app.$http.get("/api/category").then(response => {
    console.log(response.data);
  });
・
・
・
```
**app.jsなどで`Vue.prototype.$http = axios`を設定ずみ**

Axiosを使ってAPI通信も可。

## 最後に
事実上の最新作EXAが2010年に発売以降続編の情報が皆無ですが、一部の熱狂的ファンは大会を開催してゲームを続けています。ゲームを盛り上げることで続編も出るかもしれません。カルネジスト、ネジらーの皆様のご協力をお願いします！

カルネージハートファンのプログラミング知識を共有しましょう！
サウンドプログラミング[メモ]

#システムの開発と運用プラン
・Max/Mspで設計。
・足りない機能はC言語でライブラリを自分でexternal objectをビルドする。
・低レイテンシを目指し、DSPサーバーを購入してMaxでのDSP処理を移譲する。
・既存機能のプラグインは作らない。maxにインサートして使用する。
・リアルタイムインタラクティブパッチを開発していく。


#処理方法
時間領域で音データをサンプリングして、配列データとして持つ。（buffer）
周波数領域で処理する場合は、FFTを行い周波数binをインデックスとした配列データを持つ。
for文でサンプルデータを１つ１つ操作する。
あるフィルタを適応する場合、時間領域を揃えて乗算処理する。

#フィルタ設計
遅延器、乗算器、加算器の組み合わせがフィルタ設計になる。
条件を満たす最適なフィルタ係数を求める。
Z変換を使用することで、計算が分かりやすくなる。

#コンプレッサー
スレッショルドを設定して、閾値を超えているサンプルに対して圧縮率を乗算する。

#ディレイ
....
JavaにおけるHashMapの仕組みを深堀り

# HashMapの基本
- Map（key,valueの格納データ形式）の実装クラスで多分一番使われているやつ。
- Hash関数を使って高速にデータの検索が可能（配列・リストの線形検索より計算量が少ないとされる）

```
HashMap<String, Integer> map = new HashMap<>();  
map.put("Sato", 22);  
map.put("Takahashi", 24);  
map.put("Nomura", 32); 
```

# HashMapの仕組み
(1) HashMapの格納できる数が5の例で考える。
(2) ```key:Sato value:22```を格納しようとする。 
     a. Satoのハッシュ値144を算出する(例なので適当な数字です) 
     b. 144を要素数の５で割ってあまりを取得 144/5 = 28 ...4 
     c. 4に```key:Sato value:22```を格納する。

```
[0]  
[1] [Nomura, 32]
[2]  
[3] [Takahashi, 24] 
[4] [Sato,22]
```
(3) データを取り出すときは同様の計算をしてkeyからどこに目的のデータが格納されているか計算する。
(4) Hash値の余剰が衝突することもあり、同じ場所に複数のデータが格納されることもあり得る（以下の例）

```
[0]  
[1] [Nomura, 32]
[2]  
[3] [Takahashi, 24] 
[4] [Sato,22] [Ito, 98]
```

# 容量の拡張に関して 
- 要素数が増えてくるとrehashを行い格納数を増やす。Javaの場合は負荷係数を元に算出される。
- 要素数が```容量 × 負荷係数```を超えた時点でrehashが行われる。
- JavaのHashMapは、デフォルトの容量は16、負荷係数は0.75である。

# 参考文献
https://www.javatpoint.com/working-of-hashmap-in-java
「Cocoda!」でデザインガイドラインを学ぶ

この記事は「[株式会社エイチームフィナジーAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-finergy)」11日目の記事です。
デザイン関係のお話になりますので、noteに寄稿した物をシェアさせていただきます。

↓こちらからお願いします。
[「Cocoda!」でデザインガイドラインを学ぶ](https://note.com/yajimahibiki/n/n2d80d36f44d3)
データ移行をしただけなのに…（起こってしまったメール誤配信）

この記事は本番環境でやらかしちゃった人のアドベントカレンダー9日目の記事です。
https://qiita.com/advent-calendar/2019/yarakashi-production

もう15年以上前の事なので記憶も定かではないところがありますが、ご容赦下さい。

## 当時の状況

当時自分は30人くらいの、孫請・曾孫請を中心に受託開発を行う小さなSIerに居ました。
この会社、自社製品も一応あるのですが売上のメインは圧倒的に受託開発で、
PHPやPerlでのガラケーサイトの開発やら、Javaや.NETを使った業務アプリケーションの開発、大手プロバイダシステムの開発保守など、わずか3年ほどの在籍期間でしたが、実に多彩な開発案件があったように思います。

## プロジェクト内容

あるWebサイトのシステム移行でした。
Windows Server上に構築されたIIS+ASP+SQL Serverなシステムから
Linux上のApache+Tomcat+Oracleな環境への移行だったように思います。

そのサイトの利用者は会員登録をしてホテルや飲食店などの予約ができたり、各店舗からのメルマガが受信できるようになっています。

自分は前年にOracle Master 9i GOLDを取得したこともあって、DBAとしてプロジェクトに参加し、

```
* 既存DB（SQL Server）のテーブル構成の調査
* 移行先のOracleの設計と構築
* アプリケーションが書くSQLの作成
* 既存のSQL ServerからOracleへのデータ移行やそのためのプログラム作成
```

なんかを1人で担当していました。

当時のメンバーは

```
* アプリケーション開発担当者が2〜3名
* DBA（自分）が1名
* プロマネ（上司）が1名
```

という構成だったと思います。
上記の他に先方の開発担当者が3名いらっしゃいました。

DBAは自分だけだったので、念の為`上司にもDBA権限を付与`していました。

## 事件発生

ある日、いつものように実際にデータを流し込みながらデータ移行プログラムの検証を行ってたところで事件が起こりました。

その日はそれまで100〜1000人程度で検証していた会員情報の移行処理を、
一気に全員分（数万人）流し込んで、データの取りこぼしが無いか、また実行時間はどのくらいになるかを検証しようとしてました。

```
私「バッチ実行〜ポチッとな」
私「（ん〜？なんか今日はこれまでより件数の消化遅くないか…？）」
私「（メモリに乗り切らなくてswapが発生してるのか？ちょっと調べるか…）」

…数分経過

先方開発担当者A「なんか、メールが飛んできたんですけどなんでかわかります？」
私「（開発サイドが何かやらかしたかな？）」
先方開発担当者B「ほんとだ！自分のとこにも来ました！なんだこれ？」
同僚エンジニアa「本当ですね…アプリケーションではメール送信処理なんて実装してないんですが…」
先方開発担当者C「これ、外部にも飛んじゃってますよね…」
同僚エンジニアb「至急調べてみます！まずは停止させないと…」

…数分経過

先方開発担当者A「データ移行が何か関係してないですかね？」
私「えっ？」
先方開発担当者A「このメールアドレスとか、自分が立ち上げ初期に登録したやつなんですよ。そこにメールが来てるんです。」
私「え？え？え？（なんでだなんでだなんでだ？）」
私「と、とりあえずデータ移行止めてみますね！」
私「バッチ停止」

…数分経過

ALL「止まったみたいですね…」
```

## 何が起こったか

```
『おれはSQL ServerからデータをOracleに移行していると
思ったらいつのまにか4,000人のユーザーにメールを送信していた』
```


実は前日、（そしてこの日不在の）上司がOracle上にPL/SQLでメール配信の処理を書き、
それを会員テーブルの**INSERT Trigger**に設定していたのでした。

誰にも言わずに…


それにより、私のバッチ実行で会員テーブルにINSERT処理が発生、
上司のセットしたTriggerが反応し、見事にバッチを止めるまでの全員に対し「会員登録ありがとうございます」メールが送信されてしまったのでした。

## 何を学ぶか

#### 1. 報・連・相をしっかりやる
まぁ、これに尽きるんじゃないかと思うんですが、
上司はメール送信処理をPL/SQLで作成しTrigger設定したことを、
アプリケーションエンジニア側にも、DBA側にも伝えていませんでした。

上司は本プロジェクトには片足突っ込んでの参加で普段は他の案件に居たこと、
逆に他の面々は常駐して顔を合わせて作業していたので
情報共有に大きな差が生まれていたことは事実でした。

情報に格差が生じていることを誰かが気づいてケアしていれば防げた問題だと思います。
その上で、付け加えるならば

#### 2. ビジネスロジックを分散させない
「DB側にストアドプロシージャ作ってそこにビジネスロジック書いてTriggerでキックさせるなんてやらねーよ」
とか思うかもしれませんが、例えばRailsで予期せぬ`after_commit`とかが居ると同じことが起こるわけで。。。

アプリケーションエンジニア（Java側）が知らない箇所（PL/SQL）に会員登録メール送信処理が居たことで、
どこでメール送信が発生しているのかわからず、発見と停止が遅れました。

会員登録後のメール送信という処理が、普段から顔を合わせているアプリケーションエンジニアで担当していれば、
Triggerの罠に引っかかることもなかったでしょうし、
データ移行の検証時にも「これメール送信しないかテストしてからやろう」となったかもしれません。

※因みにPL/SQLで作った理由について当時上司は「会員登録後にアプリケーション側が意識せずに確実にメールが送られるようにしたかったから」みたいなことを言っていたように思います。


#### 3. 目的の処理だけが実行されることを保証した環境をつくる
これを意識したり実現するのはなかなか難しいことだとは思います。

当時、移行プログラムを何でどう作っていたのかも記憶が定かではないのですが、
例えばOracleであればダイレクト・パス・ロードの使用を検討したり、
予めTriggerを使えないように無効化しておくなどが考えられたなーと思います。

例えばRailsで言えば、Callbackを走らせたい場合なのか万が一にも走らせたく無いのか、
走らせたく無いのであれば`skip_callback`等を検討する、などでしょうか。

## 最後に

この一件から数カ月後に転職したのですが、
この日以降、転職するその日まで上司とはまともに口を利かなくなった気がします。。。

I田さん、元気にしてますか？
TWE-Liteでトイレセンサーを作る(トイレセンサーを直す)

この記事は [Wano Group Advent Calendar 2019](https://qiita.com/advent-calendar/2019/wano-group) の7目の記事となります。
主な内容はTWE-Liteのファームウェアを改変するです。

## トイレセンサーとは
トイレの使用状況を確認できるセンサーです。数年前に流行ったあれです。
センサーと電池とマイコン(TWELite)で作ったトイレセンサーから、PCに挿したUSB受信機へ電波を飛ばしてWebページから利用状況を確認できるものを、数年前の毎春行われるWanoグループエンジニア合宿で作ったのですが、
オフィスの移転で電波が届かなくなり使い物にならなくなってしまいました。
アドベントカレンダーにかこつけて直します。
![IMG_20191209_040313.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217834/465db2de-5ad5-52f2-dedf-74c3ef30f515.jpeg)


### どう直すか
作った当時~~苦情~~貴重なご意見を頂いたような気がします。

 - Webページを開くのが面倒くさい
 - 見た目が怪しい

この際合わせて解決したいと思います。
トイレから近いかつ席から見えやすい位置に受信機をおいてLEDを光らせることにしました。
TWE-Liteのファームウェアを改変して受信した信号でLEDをチカチカさせるものを作ります。

見た目については適当な箱を作ります。爆弾や盗撮カメラに見えない素敵なやつです。

## 準備
### 受信機
使用したパーツ

 - Twe-Lite　DIP
 - USB電源(適当なUSB充電器)
 - DC/DCコンバータ（5V→3.3V)
 - 適当なLED、抵抗

オフィスの天井にダクトレール(ライティングレール)が設置されているので、トイレから近い位置のライティングレールにUSB電源を挿してぶら下げます。
LEDは `DO1` `DO2`に接続しました。

### 開発環境
SDKをダウンロードします
https://mono-wireless.com/jp/products/TWE-NET/TWESDK.html

SDKマニュアルはこちら
https://sdk.twelite.info/

導入手順はSDKマニュアルで丁寧に解説されているのでそちらを参照してください。

## 改変作業
大変申し訳無いのですが、改変したソースコードは公開せず、改変した内容説明に留めます。ごめんなさい。
改変したソースコードを公開するためには[モノワイヤレス株式会社に一報](https://sdk.twelite.info/overview/policy)入れる必要があり、アドベントカレンダー前日当日にこの記事を書いているからです。事前確認とても大事。

提供されているファームウェアはいくつかあるのですが、今回は[無線タグアプリ(App_Tag)](https://mono-wireless.com/jp/products/TWE-APPS/App_Tag/index.html)を使用します。センサ種別の設定は`0x10`(アナログセンサー)です。
トイレセンサー側は提供されたタグアプリを書き込み、受信機側は改変したファームウェアを書き込みます。

### 改変内容
SDKの `/MWSDK/Wks_TWELITE/App_Tag/Parent` がApp_Tag親機にあたるプログラムです。今回このプログラムを改変します。

無線タグアプリの親機は受信したデータをUART送信するものなので、それにあたる関数`vSerOutput_Standard`に、
センサー値の判定処理を追加 `if (u16adc1 > 100 || u16adc2 > 100){ detect_flg = TRUE; }`
LEDの切り替え処理を追加 `detect_flg ? vPortSetLo(PORT_OUT1) : vPortSetHi(PORT_OUT1);` 
PINの設定は、すでに初期化処理に書かれていたので不要でした。

### 動作テスト
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/xtUHB6QIxb">pic.twitter.com/xtUHB6QIxb</a></p>&mdash; adhayashi (@adhayashi1) <a href="https://twitter.com/adhayashi1/status/1203759694528954368?ref_src=twsrc%5Etfw">December 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
動いた！
照度センサーと人感センサーで使用状況をチェックしているので、部屋が明るい＝使用中と判定しています。

## センサーの入れ物を作る
時間切れです、申し訳ない、後日更新します。
3Dプリンターで怪しくないものを作る予定です。

## 感想
開発環境の導入からSDKの改変まで思っていたよりもハードルが低くてびっくらこいた
親機をArduinoやPCに接続することが前提のような印象だったけど、TWE-Liteだけで完結したいときは選択肢としてありだと思う
ただ、アプリ自体にいろいろな機能を載せてることもあり、ソースコードは長めで該当箇所を探すのに苦労した
今回作ったものはクリスマスの夜にこっそり設置しに行こう

###さいごに
事前確認大事、LED光らせるの超楽しい
ビット列で冪集合の部分集合を表現する

[ビット列で集合を表現する方法](https://primenumber.hatenadiary.jp/entry/2016/12/01/000000)は、集合の演算を高速に行うためによく使われている方法です。 ですが、冪集合をビット列で表す方法はあまり使われていないかもしれません。普通の集合演算に加えて、面白くて効率の良いアルゴリズムを考えたので、紹介いたします。

## 集合をビット列で表す

集合$A$の要素一つ一つにビットを割り当てます(例：$a$が1ビット目、$b$が2ビット目、$c$が3ビット目)。そして、その集合を要素を含むときにそのビットが1になるビット列で表します。例えば：

```math
\begin{align}
\phi &= (000) \\
\{a, b\} &= (110) \\
\{a, b, c\} &= (111)
\end{align}
```

すると、多くの集合演算はビット演算に対応できます。(以下$A=\\{a, b\\} = (110)$、$B=\\{c\\} = (001)$とする)

|演算|集合演算|ビット演算|
|---|----|---|
|積集合|$A\cap B$| `(110) & (001) = (000)`|
|和集合|$A\cup B$| `(110) ｜ (001) = (111)`|
|補集合|$\overline{A}$|`~(110) = (001)`|
|部分集合判定|$A\subseteq B$|`(110) & (001) === (001)`|

## 冪集合とは?

ある集合$A=\\{a, b, c\\}$を考えます。するとその冪集合$2^A$は$A$の部分集合の集合となります。つまり、

```math
\begin{align}
2^A &= \{\phi, \{a\},\{b\},\{c\},\{a, b\},\{a, c\},\{b, c\}, \{a, b, c\}\}
\end{align}
```

## 冪集合の部分集合をビット列で表す

本題です。ビット列で表された集合を整数に直します(例:`(110) = 6`)。そして、冪集合の部分集合がその集合を含む時、その整数番目のビットが1となるビット列で表します。例えば：

```math
\begin{align}
\{\phi, \{a, b\}, \{a, b, c\}\} = (10100001)
\end{align}
```

冪集合も集合なので、上記に示した演算が使えます。

## メリット&デメリット

### メリット

* メモリが節約できる
* 演算が早い。（和集合演算ならば$n$を元の集合の要素数とすると、$O(2^n)$から$O(1)$になる)

### デメリット

* 冪集合の部分集合の要素数が通常少ない場合、要素のリストを作成した方がメモリ効率が良い時がある。
* $n$が大きくなると使えなくなる(32bitの場合$n\leq 5$まで。Javaの`BigInteger`とかGPUとか使えばもっとできるかもしれないけど)

## ある集合の部分集合となる集合の集合を得る

...ていうと訳わからんので、次の演算`subset`を考えます

```math
\mathop{subset}(B) = \{A'\in 2^A\mid A'\subseteq B\}
```

簡単に考えれば次のような演算で計算できます

```typescript
function subset(b: number, n: number) {
  let result = 0;
  for(let i = 0; i < 1 << n; i++) {
    if(b & i === i) result += 1 << i;
  }
}
```

$O(2^n)$ですね。こんなの遅くて使えませんね(笑)

次でできます

```typescript
export function subset(b: number): number {

  let val = 1;
  let cnt = 0;
  let tmp = b;
  while(tmp !== 0) {
    if((tmp & 1) === 1) {
      val += val << (2 ** cnt);
    }
    tmp >>>= 1;
    cnt ++;
  }
  return val & ((1 << (b + 1)) - 1);
}
```
$O(n)$ですね。どうしてこれでできるのか?説明するのが面倒なので興味がある人は考えてみてください。

## 派生

```math
\mathop{subsetStrict}(B) = \{A'\in 2^A\mid A'\subset B\}
```

```typescript
export function subsetStrict(b: number): number {

  let val = 1;
  let cnt = 0;
  let tmp = b;
  while(tmp !== 0) {
    if((tmp & 1) === 1) {
      val += val << (2 ** cnt);
    }
    tmp >>>= 1;
    cnt ++;
  }
  return val & ((1 << b) - 1);
}
```

```math
\mathop{superset}(B) = \{A'\in 2^A\mid B\subseteq A'\}
```

```typescript
export function superset(b: number, n: number): number {
  return subset(~b & ((1 << n) - 1));
}
```
```math
\mathop{supersetStrict}(B) = \{A'\in 2^A\mid B\subset A'\}
```

```typescript
export function supersetStrict(b: number, n: number): number {
  return subsetStrict(~b & ((1 << n) - 1))
}
```

## まとめ

使う機会はほとんど無いとは思いますが、誰かの役に立てたら幸いです。面白くて高速な集合演算を知っている・思いついた方がいたら教えてください！
実行ファイルの差別化と一体化

# 前置き
ひょんなことから後輩に「C言語のプログラム実行ファイルが何個もできるのを対処したい」と言われたので、ここは先輩としてバシッと答えようと思います。
前提条件としてはこんな感じです

- 使用するOSはLinuxまたはMacOS
- エディタはVSCode
- 使用するコンパイラはMinGW

こんな感じでやっていきます
# プログラムファイルを作成
とにもかくにも何をするにもまずは何かしらのプログラムを作ります
というわけで今回は画面にHello!と表示するよくある簡単なプログラムを作成します

``` sample.c
#include <stdio.h>
//画面にHello!と表示する
int main (void){
    printf("Hello!\n");

    return 0;
}
```
このプログラムを使っていきます

# 実行ファイルを作成していきます
## そもそも実行ファイルとは
そもそも実行ファイルとは人間の言葉で書いたプログラムファイルを機械が理解できる０と１の機械語に変化したものです。そしてこの人間の言葉から機械語に変化する作業をコンパイルと言います。
## では続きをやっていきます
コンパイルするときはコマンドライン、terminalなどで以下のコマンドを実行します。

```
gcc sample.c
```

これ打ち込むことで実行できます。しかし、もしバグがあるとバグがある場所とバグの種類が表示されます。なのでバグを修正し再度コンパイル作業をしましょう！
すると無事に実行ファイルができているはずです
確認の方法は
lsコマンド
コマンドを打って実行した結果ファイル名が**a.out**というファイルができていれば成功です。
この「a.out」というファイルはプログラムをコンパイルするたびにファイル内容が更新されていきます。
つまり昔コンパイルしたファイルを実行したければ再度コンパイルする必要があります。これが実行ファイルの一体化です。
でもこれって少しめんどくさいなーと感じませんか？
そこで各ファイルの実行ファイルを残す方法を次からやっていきます

# 実行ファイルの差別化
実行ファイルを差別化する方法は基本的には今までとさほど変わりません！
今まではterminalに

```
gcc sample.c
```

と記入していましたがこれに少し記述を追加します。
今回は実行ファイルの名前は「sample」にしましょう。
細かいことはすっ飛ばして結論を言ってしまうと以下のようになります。

```
gcc sample.c -o sample
```

になります。
つまり…

```
gcc ソースファイル名 -o 実行ファイル名
```

ということになります。
確認方法は先ほどと同じでlsコマンド
実行後に「sample」というファイルができていれば実行ファイルに差別化に成功です。

以上が実行ファイルの一体化と差別化です。
# まとめ
実行ファイルをプログラムごとに残したいのなら

```
gcc ソースファイル名 -o 実行ファイル名
```
実行ファイルを別に上書きされてもいいんだからね！という人は

```
gcc ソースファイル名 
```
を実行することで差別化と一体化が可能です

参考になれば幸いです！
わかってくれたかな〜後輩くん⁈
Colabolatoryで UserWarning: An input could not be retrieved. It could be because a worker has died

Colaboratoryで学習をしようとしたら、少し学習が進んだタイミングで

```
UserWarning: An input could not be retrieved. It could be because a worker has died
```

が出てしまって学習が停止してしまうという自体が起こった。
ちょっと解決まで時間がかかったのでメモ。

# 状況
Google Driveをマウントして、ドライブからデータを読み込みCNNを回していた。

# 原因
Colabolatoryのファイルストリームが学習速度に追いついていない。

どうやらColabは不正利用防止のためか、あるところからFileStreamの速度を制限するっぽい？
そうなった場合、ファイルの読み込みに失敗するため上のようなエラーになるようだ。

<追記>
google driveは仮想的にマウントされてるに過ぎないために起こる問題のようです。

# 解決策

<追記>

ファイルをZipでDriveに置き、colab直下のcontent/にcpしてから解凍する方法が最も早いみたいです。
(体感ファイル容量というよりアクセス回数に依存して時間がかかるようです)

予めDriveからファイルをすべて読みこんでメモリに置く。

colabのメモリは潤沢なので今回はこのような手法をとった。これをやるとわかるがファイルの読み込みがなかなかに遅い。
colab直下のディレクトリ(colabのセッションごとに生成されるディレクトリ)に置いても大丈夫かも知れないが、そちらは未確認。


もっと良い方法などを知っている方がいれば教えていただけると幸いです。
Rails newからの爆速Rspec導入

# Rspecの導入

## 新規アプリ作成

```
$ rails _5.2.3_ new sample-app -d postgresql --skip-bundle && cd sample-app
```

## 不要なファイルが生成されないように設定

```config/application.rb
module SampleApp
  class Application < Rails::Application
    # ここから下を追加(scaffold対策)
    config.generators do |g|
      g.javascripts false
      g.helper false
      g.test_framework false
      g.test_framework :rspec,
      fixtures: true,
      view_specs: false,
      helper_specs: false,
      routing_specs: false,
      controller_specs: false,
      request_specs: false
      g.fixture_replacement :factory_bot, dir: "spec/factories"
    end
  end
end
```

## Rspecで必要なGemの追加

```rb:Gemfile
group :development, :test do
  # 追加
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end

group :test do
  # 追加
  gem 'capybara'
  gem 'selenium-webdriver'
end
```

## bundleから諸々のフォルダ作成、SystemrSpecとFactoryBotの導入

bundle install、scaffold、db:migrate、rspec generate、factorybot generate、systemフォルダ作成、post_spec.rbファイル作成を一発で！

```
$ bundle install --path vendor/bundle && rails db:create && rails g scaffold post title:string detaile:string && rails db:migrate && rails g rspec:install && mkdir spec/system && touch spec/system/post_spec.rb
```

## chromedriverを入れてない方はこちら

```
$ brew install chromedriver && brew upgrade chromedriver
```

task_spec.rb例文)

```spec/system/post_spec.rb
require 'rails_helper'

RSpec.describe 'MyString', type: :system do
  before do
    FactoryBot.create(:post)
    @posts = Post.all.order(created_at: :desc)
  end

  describe 'xxxxxxxxxx' do
    context 'xxxxxxxxxx' do
      FactoryBot.create(:post)
      it 'xxxxxxxxxx' do
        visit posts_path

        expect(page).to have_content 'MyString'
      end
    end
  end
end
```

factories例文)

```spec/factories/posts.rb
FactoryBot.define do
  factory :post do
    title { "MyString" }
    detaile { "MyString" }
  end
end
```

## rspecテストを実行

```
$ bundle exec rspec ./spec/system/post_spec.rb
```


参考にした記事
https://qiita.com/jnchito/items/c7e6e7abf83598a6516d
https://qiita.com/naoki_mochizuki/items/1d3026a32786642fc762
Active Recordの関連付けに関する質問

###railsチュートリアル2章のモデル間の関連付けについての質問です。
UserモデルとMicropostモデルの関連付けを行いました。

関係性
親　Userモデル
子　Micropostモデル
主キーはUserモデルのidで、外部キーがMicropostモデルのuser_idとなっています。

それぞれのモデルで以下のように宣言しています。

```micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
end
```

```user.rb
class User < ApplicationRecord
  has_many :microposts
end
```

###Railsのconsoleを使って、ユーザーとマイクロポストの関連付けを確認しました。

```
$first_user = User.first
$first_user.microposts
$micropost = first_user.microposts.first
$micropost.user
```

チュートアルでは最終的にfirst_userのデータが表示されています。
しかし、エラーにはMicropostクラスでuserメソッドが定義されていないと出ていました。
ですが、以下のコードを打つと結果が上手く表示されました。

```
$first_micropost = Micropost.first
$first_micropost.user
```

userメソッドが定義されていない訳ではないと考えています。
二つのコードの違いは何なのでしょうか。
知識不足ですみません。教えていただけると嬉しいです。
IntelliJIdeaでSpring Batchのチュートリアルの環境を構築する

## 困ったこと
初めてSpring Batchを使った開発に関わることになったので、とりあえず[チュートリアル](https://spring.io/guides/gs/batch-processing/)をやろうとしてみた。
ご丁寧に[IntelliJIdea用のチュートリアル](https://spring.io/guides/gs/intellij-idea/)まであるので困ることは無いだろうと思われたが、環境構築で存外に苦戦してしまったので、構築手順を書いていく。

## 環境構築手順（19/12/06現在）

基本的なチュートリアルの内容をなぞりつつ、イチから手順を書いていく。

### ソースのclone
```
$ git clone https://github.com/spring-guides/gs-rest-service.git
```

### IntelliJIdeaを起動しImport Projectを押下
![スクリーンショット 2019-12-06 12.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/f318676c-fc00-cb16-9cd9-a0cbb81fd7c2.png)

### importするモジュールを選択する
![スクリーンショット 2019-12-06 12.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/2e59e392-547e-11b7-3d27-b3ed8ff20617.png)
gs-rest-serviceには複数のモジュールが登録されている。gs-rest-serviceをルートディレクトリとして全てのモジュールを一気にIntelliJIdea管理下に置く事は（おそらく）できない。画像ではこれからチュートリアルをやっていく人向けにinitialを指定した。

### プロジェクトモデルの指定
![スクリーンショット 2019-12-06 12.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/c3abcd58-883c-d5a4-a94d-8d3555e52f55.png)
Mavenについての説明は[こちら](http://objectclub.jp/technicaldoc/tools/maven/maven01)を参照いただくことにする。

### JDK for importerの設定
![スクリーンショット 2019-12-06 12.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/309c434c-8ae8-0835-3810-b13a21598381.png)
JDKのバージョンを指定したい場合はここで指定する（画像最下部）。SpringBatch側はJDK6以降であれば問題無いというし、筆者のIntelliJIdeaではInternal JREがJava11だったので問題ないとは思うが、別にJDKをインストールしていてそちらを使いたい場合は注意。

### あとはNext連打 + Finishまで行く
![スクリーンショット 2019-12-06 12.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/c8ecbd66-d7c2-bde6-e43f-6a019365dc98.png)

### Invalidate Caches / Restert...
![スクリーンショット 2019-12-06 12.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/68369391-9b29-e0d2-19bc-fc266dac1c50.png)
もし`@SpringBootApplication` のアノテーションなどがリファレンスエラーを起こして真っ赤になっている場合は
`File → Invalidate Caches / Restert...` を実行すると直る（かも）。

### 別のモジュールも加えたい場合
Mavenのウィンドウで別モジュールのpom.xmlを選択しimportする。
![スクリーンショット 2019-12-06 13.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/4346e3ab-e733-5ba3-f6dc-2abfc1fb5688.png)

## 完成形
![スクリーンショット 2019-12-06 13.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224108/f1096f5e-5911-3b5a-9cca-82a9d0b38db2.png)
collectionViewのReadableContentView(FollowReadableWidth)が機能しない場合

collectionViewに直接FollowReadableWidthを設定するのではなく、collectionViewの下にViewを敷いてViewに対してFollowReadableWidthを設定してみよう。

① viewを配置
② viewのAutoLayoutはConstrain to Marginsにチェックを入れて 0,0,0,0
③ viewに対してFollowReadableWidthのチェックをON
④ collectionViewを配置してcollectionViewのAutoLayoutは Constrain to Marginsにチェックを入れて 0,0,0,0
⑤ あとはいつも通りcollectionViewをセットするだけ。

[FollowReadableWidth]
<img width="261" alt=" 201<img width="272" alt=" 2019-12-09 17.47.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200840/eccf9f32-08d8-3e35-4f9a-0a2109053e55.png">


[Constrain to Margins]
<img width="261" alt=" 2019-12-09 17.45.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200840/105a6c34-2101-3684-10b1-0860c1a915ec.png">
要件定義における用語の取り扱いの難しさとその傾向

### 前置き
私は日頃、CakePHPやLaravelを利用してアプリケーションコードを書くことが多いです。
ただ、今回の記事では絶賛苦労している要件定義に関して記事を書きたいと思います。

### 要件定義の大切さ

アプリケーション構築において、「要件定義」は非常に大切な工程です。
要件定義が失敗していると、その後の工程で挽回する労力は大きなものになります。

要件定義を成功させるためには正しい現状認識が必要です。
例えば、業務アプリケーションを作成する場合は対象の業務への理解が必要になります。

さらに複数部門の業務を統合する場合は、各担当者が個別の業務を認識するだけでは足りず、
他の部門の担当者に正しく現状を共有する必要があります。

### 要件定義における用語の大切さ

正しい現状認識、現状共有のためには、正しい「用語」が欠かせません。
用語がズレていると認識にもズレが発生します。
用語が紛らわしかったり、同じ言葉でも意味が異なる場合もありますね。

例) 紛らわしい用語
- 北部九州は寒い
- 北九州は寒い

全然意味が違いますよね。(ちなみに私は北九州市出身です。)
北部九州は「福岡県・佐賀県・長崎県・熊本県・大分県」の5県を
北九州は「福岡県北九州市」を指します。
(注意) 北部九州の範囲は諸説あるそうです。

例) 同じ言葉で意味が異なる(同音異義語)
- 利益

利益と言っても、営業利益なのか経常利益なのかわかりませんよね。

例) 違う言葉で意味が同じ(異音同義語)
- FMT
- フォーマット

「FMT出して」という連絡を受け、私は目が点になりました。

### 用語の認識がずれる傾向と対策

ここからが記事の本題になります。(前置きが長いですね)
私なりに用語の認識がずれる傾向と対策をまとめてみました。

用語のズレ方については上記の同音異義語、異音同義語に大別されると思います。
どういった原因で同音異義語、異音同義語は発生するのか、私なりに考えてまとめてみました。

##### 階層の問題

　動物の分類がわかりやすい例ですが、分類上の階層が異なる言葉をまとめて使ってしまうケースがあります。
　「哺乳類」「猫」「マンチカン」これらは別の階層の言葉ですね。

　はじめに営業売上を管理していたシステムが「売上という用語で営業売上」を管理していたとします。
　その後、追加開発で経常利益も確認したという要望が発生して「売上」「経常利益」という階層が異なる用語が
　同列で利用されるケースを散見します。

##### 軸の問題

　階層ではなく、そもそも分類軸が異なるケースです。
　人間だと「性別：男女」「年齢：10代、20代...」は別の分類軸ですね。

　整理されていないと下記のようなケースになることがあります。
    20代の顧客が多いのでそこだけ性別を分けて確認したいというケースです。

[顧客カテゴリー ]
- 10代
- 20代[男]
- 20代[女]
- 30代
- 40代 
           
   このケースではわかりやすいですが、業務システムの要件定義をしているとよく見かけます。
   ビジネス上の要件もあってのカテゴリーですが、要件定義をするときはしっかり分類軸を意識して用語を分ける必要があると感じています。

##### 主語の問題

　「AさんはBさんからリンゴを買った」

　上記の文章はこう言い換えることが可能です。

　「BさんはAさんにリンゴを売った」

　こういった主語によって表現が変わるケースがあります。
　


　また、受発注を管理システムがあった際に下記のような機能名を見かけることがあります。

　「注文管理機能」

　この言葉だけでは、受注した注文の管理なのか、発注した注文の管理なのか判断がつきません。このケースも主語を意識していない用語と言えます。
　
##### まとめ

言葉って難しいですね。。。。　
ただ、この辺にこだわらないと良い案件にならないので頑張りたいと思います。

他にも何か良い傾向と対策があればコメントいただけると嬉しいですー。
コミュニティの役割

どうも、はじめまして。
CODE BASE OKINAWAのコミュニティマネージャーを務めている中司ともうします。

エンジニアでもない僕がQiitaで記事を書くのは恐れ多いですが、コミュニティ内でアドベントカレンダーをやろうとなって、せっかくなので初投稿をします。

他の方の記事はこちらになります。
[CODE BASE OKINAWA アドベントカレンダー](https://qiita.com/advent-calendar/2019/codebase-okinawa)

技術のことは書けないので、CODE BASE OKINAWAのコミュニティについて、そしてそのコミュニティが担ってる役割を書いていければと思います。

まず、CODE BASE OKINAWAのコミュニティの説明をします。

#CODE BASE OKINAWAとは

CODE BASE OKINAWAは「宜野湾西海岸を、ITビーチに。」というコンセプトに、2017年9月から沖縄県宜野湾市で始まりました。
2018年1月からプログラミング教室を開講し（2020年でもう3年目なんですね。。早い。。）、未経験からWebアプリケーションエンジニアになれるように育成しています。7期のタイミングで沖縄市になるStartup Lab Lagoonと2拠点で開催することになり、展開が広がったこともあり、これまで計150名以上の方が受講しています。ありがたいことに9期もたくさんの応募をいただいています。

僕らがやっているプログラミング教室は1から1,000時間の学習できるようなスキームを作っています。プログラミング教室が2,3ヶ月なので200〜300時間の学習をしてもらい、この教室期間中に学習の習慣を身につけてもらい、卒業後も自走し、1,000時間の学習を目指していきます。どんなことを教えているかは講師の[さぼさんが記事](https://qiita.com/saboyutaka/items/1a8c40e105e93ac6856a)に書いているので、こちらをご覧いただければと思います。

このプログラミング教室に通って、卒業後も1,000時間の学習を目指していく人たちの集まりをCODE BASE OKINAWAのコミュニティとして表現しています。

#コミュニティの役割
コミュニティの役割は、コミュニティに入っている人が各々の目標に向かって頑張れる居場所になることだと思っています。

CODE BASE OKINAWAのコミュニティに入るきっかけはプログラミング教室なので、プログラミングが未経験という立場ながら、プログラミングを使って仕事したり、なにかモノを作れるといった目標がある人たちなので、その目標を達成を目指しています。プログラミングのいいところは、未経験から始めて目標達成しても、もっと技術力高めたいなどといった新しい目標が見つかるのがいいと思っています。

その目標がある中、新しくコミュニティに入ってきた人はすでに学習が進んでいる人にいつでも相談しながら学習をすることができます。相談受ける側も自身も未経験からプログラミングを始めているのと、周りから助けてもらっていることあり、快く相談にのってくれています。この循環がうまく回っているので、各々の目標に向かって頑張れています。

あと、コミュニティに入ってる人が、というもポイントです。
コミュニティあるあるだと思っているのですが、運営する人だけがイベントや勉強会を企画して、運営する人がどんどん疲弊していって、コミュニティの動きが止まってしまう。みたいなことはよくあるんじゃないでしょうか。

ぼくらのコミュニティもそうで、ぼくや講師陣がイベントや勉強会開かないとコミュニティが動かない、というのが1年半ぐらいは続いていました。ただ、最近は卒業生が自主的にイベントや勉強会を開き、能動的にコミュニティを動かしてくれています。ほんと助かります！！


まとめると
 - 個人が目標を持つ、それに対して頑張る
 - 新しく入った人を受け入れる
 - コミュニティに入っている人が能動的になる
 
そうすれば、コミュニティに入っている人が各々の目標に向かって頑張れる居場所になっていくと思います！
"unnecessary guard around call to delete" という不思議なエラーが出た話

突然ですが以下のコードをご覧ください。
動物の種類とその鳴き声の組み合わせがmapになっていて、それを全部出力するコードです。

```go:sample.go
package main

import (
	"fmt"
)

func main() {
	sampleMap1 := map[string]string{
		"犬": "ワンワン",
		"猫": "ニャーン"}
	
	sampleMap2 := map[string]string{
		"犬": "わんわん",
		"猫": "にゃーん"}
		
	sampleMaps := []map[string]string{sampleMap1, sampleMap2}
	
	for _, sampleMap := range sampleMaps {
		fmt.Println(sampleMap)
	}
}
```

ここでもし、データの一部に出力したくない物が混じっていたとしましょう。
例えばsampleMap2が以下のようになっていたとします。

```go:sample.go
sampleMap2 := map[string]string{
	"犬":     "わんわん",
	"猫":     "にゃーん",
	"おじさん": "ぴえん"}
```

この場合、mapのkeyに"おじさん"があったら、それをdeleteで取り除いてから出力するとします。

```go:sample.go
package main

import (
	"fmt"
)

func main() {
	sampleMap1 := map[string]string{
		"犬": "ワンワン",
		"猫": "ニャーン"}
	
	sampleMap2 := map[string]string{
		"犬":     "わんわん",
		"猫":     "にゃーん",
		"おじさん": "ぴえん"}
		
	sampleMaps := []map[string]string{sampleMap1, sampleMap2}
	
	for _, sampleMap := range sampleMaps {
		if _, ok := sampleMap["おじさん"]; ok {
			delete(sampleMap, "おじさん")
		}
		fmt.Println(sampleMap)
	}
}
```

この段階では何のエラーも起きず、出力結果もちゃんと`"おじさん": "ぴえん"`が取り除かれたものになります。

##pushしたらstaticcheck Failedが出る

しかしこの変更をリモートリポジトリにpushしたところ、staticcheck Failedと言われてしまいました。
`sample.go:21:3: unnecessary guard around call to delete (S1033)`とのこと。

ローカルでは何のエラーも出なかったのに、どういうことだろう？？
というかunnecessary guardってなんぞ？

##原因
僕が書いたコードでは「mapのkeyに"おじさん"があったら、それをdeleteで取り除いてから出力」という場合分けをしていましたが、どうやらそこら辺の場合分けはGoが自動でやってくれるらしいです。

つまり、

```go:sample.go
if _, ok := sampleMap["おじさん"]; ok {
    delete(sampleMap, "おじさん")
}
```
この部分は単に`delete(sampleMap, "おじさん")`で良かったとのこと。
イメージとしては、

ぼく「このkeyを削除してほしいやで」
Gopher君「そんなこと言われても、指定されたkeyがないで……せや！ この命令は無視したろ」

的な処理なのでしょうか。細かいことは分かりません。

失礼します。
FreeBSDのqjailとvm-bhyveでbridgeを共有する方法

qjailでvnet(VIMAGE)を使っているとbridgeがbridge10という名前で自動的に作成されます。
同じサーバでvm-bhyveを使い始めた時、bridge10があるのでそのままbridge10を使う設定で運用することにしました。その後、jail環境のアップデートか何かでqjail stopをしたときにbridge10が削除されてしまい、bhyve側のネットワークが使えなくなってしまう問題にぶちあたりました。
その時の解決方法を書きます。

FreeBSDのバージョンは12.1、関係するパッケージのバージョンは↓です。

```
# pkg info | grep -e qjail -e bhyve
grub2-bhyve-0.40_7             Grub-emu loader for bhyve
qjail-5.4                      Utility to quickly deploy and manage jails
vm-bhyve-1.3.0                 Management system for bhyve virtual machines
```


# 問題発生までの環境構築メモ

qjailの構築メモ。詳しくは[こちら参照](https://qiita.com/psaxuww/items/f59210600917553571f9)

```
# pkg install -y qjail
# qjail install -h ftp3.freebsd.org
# qjail create -4 "IPアドレス" jailtest
# qjail config -w em0 -v none jailtest
# qjail start jailtest
# qjail console jailtest
```

vm-bhyveの構築メモ。詳しくは[こちら参照](https://qiita.com/psaxuww/private/9c194c87c8254ab15408)

```
# pkg install -y vm-bhyve grub2-bhyve
# kldload vmm
# mkdir /var/vm
# vm init
# vm switch create -t manual -b bridge10 public
# cp /usr/local/share/examples/vm-bhyve/* /var/vm/.templates/
# fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-virt-3.10.3-x86_64.iso
# vm iso alpine-virt-3.10.3-x86_64.iso
# vm create -t alpine -s 10G -m 512M -c 1 alpinevm
# sed -i '' -e 's/vmlinuz-vanilla/vmlinuz-virt/g' -e 's/initramfs-vanilla/initramfs-virt/g' /var/vm/alpinevm/alpinevm.conf
# vm install alpinevm alpine-virt-3.10.3-x86_64.iso
# vm console alpinevm
...インストールは省略
```

ここまでの状態だとjailもbhyveのネットワークは問題なく使用でき、
ifconfig bridge10のmemberのところはこんな感じになっています。

```
# ifconfig bridge10 | grep -A1 member
	member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 5 priority 128 path cost 2000000
	member: epair1a flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 4 priority 128 path cost 2000
	member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 1 priority 128 path cost 20000
```

ここでqjail stopしてjailを止めるとbridge10が削除されてしまい、bhyveの中のホストとネットワーク通信できなくなります。

```
# qjail stop
# ifconfig bridge10
ifconfig: interface bridge10 does not exist
```

ここでqjail startしてもbridge10は作成されますがbhyveで使用するtap0はmemberになりません。
手動でtap0を紐づければまた使えますが面倒です。


# 原因
/usr/local/bin/qjailはシェルスクリプトなのでqjail stopしたときの動きを見てみると、
qjail stopした時、ifconfigの出力結果にepairが無い場合はbridge10を削除する処理になっていました。


# 解決方法
qjailに手を入れるとかフック処理とか色々考えましたが、
epairを作っておけばbridge10は削除されないのでダミーのepairを作っておくことにしました。

```
# 手動設定用
# kldload if_bridge.ko if_epair.ko
# ifconfig bridge10 create up addm em0
# ifconfig epair9999 create
# ifconfig bridge10 addm epair9999a

# 再起動用設定
# sysrc cloned_interfaces="bridge10 epair9999"
# sysrc ifconfig_bridge10="up addm em0 addm epair9999a"

# 以下手動削除用
# ifconfig epair9999a destroy
# ifconfig bridge10 destroy
# kldunload if_bridge.ko if_epair.ko
```
OracleDB それぞれのJOINの使いどころ

# 概要
複数のテーブルの情報を結合する際に使われる JOIN ですが、
結合のルールなどで使い方が異なります。

CROSS JOIN などあまり使われてないイメージのあるものを使う機会があったので、
それぞれの使いどころをメモしておこうと思う。

# INNNER JOIN 
```sql:クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY 
```
* よく使われるイメージがある
* ON～ の条件で結合するデータのみ抽出する

# LEFT JOIN 
```sql:クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY 
```
* これもよく使われるイメージがある
* TABLE1 のデータは全件表示し、ON～ の条件で結合したデータについては TABLE2 のデータも抽出する
  * TABLE2 のみ存在するデータの行は抽出されない
  * TABLE1 を基準にして表を作るイメージ

# RIGHT JOIN 
```sql:クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 RIGHT JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY 
```
* TABLE2 のデータは全件表示し、ON～ の条件で結合したデータについては TABLE1 のデータも抽出する
  * TABLE1 のみ存在するデータの行は抽出されない
  * TABLE2 を基準にして表を作るイメージ
  * LEFT JOIN とは表示の基準が逆になる

# FULL JOIN 
```sql:クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 FULL JOIN TABLE2 ON TABLE1.KEY = TABLE2.KEY 
```
* TABLE1,TABLE2 のデータをどちらも全件表示し、ON～ の条件で結合したデータについては同一行でデータを抽出する
  * TABLE1 もしくは TABLE2 のみ存在するデータも抽出される
  * LEFT JOIN と RIGHT JOIN を合わせて、重複を削除すると FULL JOIN で抽出する内容と同じになる
* **目標データと実績データのテーブルを結合した際に、目標もしくは実績データのみのデータも落とさずに表示したいときに使った**

**TABLE1（目標データ）**

|KEY|TARGET|
|:-:|:----:|
|  A|   100|
|  B|    50|
|  C|    80|

**TABLE2（実績データ）**

|KEY|RESULT|
|:-:|:----:|
|  A|   200|
|  B|   100|
|  D|   150|

**FULL JOINでの結合後（KEYを結合キーとして利用）**

|KEY|TARGET|RESULT|
|:-:|:----:|:----:|
|  A|   200|   200|
|  B|    50|   100|
|  C|    80|      |
|  D|      |   150|


# CROSS JOIN 
```sql:クエリ例
SELECT TABLE1.*,TABLE2.* FROM TABLE1 CROSS JOIN TABLE2
```
* TABLE1,TABLE2 の組み合わせたデータを全通り抽出する
  * 表示されるデータ数は （TABLE1 のデータ数） × （TABLE2 のデータ数）
* **基準となる指標ごとに実データを利用して算出を行っていくための準備としてデータと指標の組み合わせを抽出する時に使った**

**TABLE1（指標）**

|BASE  |
|:----:|
|目標  |
|実績  |
|達成率|

**TABLE2（実データ）**

|KEY|TARGET|RESULT|
|:-:|:----:|:----:|
|  A|   200|   200|
|  B|    50|   100|

**CROSS JOINでの結合後**

|BASE  |KEY|TARGET|RESULT|
|:----:|:-:|:----:|:----:|
|目標  |  A|   200|   200|
|目標  |  B|    50|   100|
|実績  |  A|   200|   200|
|実績  |  B|    50|   100|
|達成率|  A|   200|   200|
|達成率|  B|    50|   100|



# まとめ
個人的にはCROSS JOIN や FULL JOIN の使いどころはあまりないのかと思ってたけど、
業務の中で使う機会が出てきたことに驚きがあったので、メモしておこうと思いました。

もしかしたら、使わずにすむ最善の方法があったのかもしれないけど。。。
(たぶん)最短でElasticsearch+Kibanaを構築し、サンプルログを取り込む方法

# はじめに
Elasticsearchの最新版に搭載された機能の使用感を確かめたいけど、環境準備やサンプルログの取り込みが面倒だと思っていたら何とボタン1つでサンプルログが取り込めるようになっていました。

この感動を皆様にお届けしたいと思い、(たぶん)最短でElasticsearch+Kibanaを構築し、サンプルログを取り込む方法をまとめました。

# 手順
## 1. Dockerインストール
皆さんのPCにはすでに入ってますよね。。
ここは省略します。

## 2. Dockerイメージの取得
ElasticsearchとKibanaのDockerイメージを取得します。
ここではバージョンは7.5.0としています。

```sh
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.0
docker pull docker.elastic.co/kibana/kibana:7.5.0
```

## 3. Docker Composeの作成
とりあえず動けば良いので、単純に以下のように作成しました。

```yml:docker-compose.yml
elasticsearch:
  image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0
  ports:
    - "9200:9200"
    - "9300:9300"
  environment:
    - discovery.type=single-node
    - xpack.security.enabled=false
    - cluster.name=docker-cluster
    - bootstrap.memory_lock=true
    - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

kibana:
  image: docker.elastic.co/kibana/kibana:7.5.0 
  ports:
    - "5601:5601"
  links:
    - elasticsearch
```

## 4. コンテナ作成と開始
`docker-compose.yml` と同じフォルダで以下のコマンドを実行してください。

```sh
docker-compose up
```

## 5. ブラウザでKibanaにアクセス
ブラウザで `http://localhost:5601/` にアクセスします。

## 6. サンプルデータの追加
なんとトップページが「Add Datat to Kibana」になっていました。
ボタン1つで追加できるデータには以下3種類があります。

* Sample eCommerce orders
* Sample flight data
* Sample web logs

追加したいデータの `Add data` を選択してください。
数秒で追加完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/e291f8b1-c3b8-5ac7-4d5f-4a2ffb1e659d.png)

これでサンプルログの取り込みまでが完了です。
Adafruit_ILI9341 ライブラリを使ってTFT液晶でテキスト表示


「ESP32で ILI9341 TFT液晶を動かす」
https://qiita.com/nanbuwks/items/72503cf93c5f2ed0deeb

では

「ファイル」-「スケッチ例」-「カスタムライブラリのスケッチ例」-「Adafruit ILI9341」-「graphicstest」

のサンプルプログラムを使ってTFT液晶を動かしました。


しかしながらこのプログラムでは、テキストは単に色とサイズを変化して出力するだけでした。

```

  #include <Fonts/FreeSans24pt7b.h>
  Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC,TFT_RST);
  tft.begin();
  tft.setTextColor(ILI9341_BLACK);
  tft.setTextSize(1);
  tft.println("Hello World!");

```


Adafruit_ILI9341 ライブラリで使えるテキスト描画について調べてみました。

# 環境

- ESP32 (WEMOS LOLIN32) + 2.8in TFT module
- Arduino 1.8.10
- Ubuntu 18.04

# テキスト色を指定

```

  tft.setTextColor(ILI9341_BLACK);
```

黒を指定

# テキストサイズ指定

```

  tft.setTextSize(1);
```

サイズを指定。2を指定すると縦横2倍。

# 描画位置を指定

```

  tft.setCursor(x, y);

```
テキストの左下のドット座標を指定


# 背景色を指定


```


  tft.setTextColor(ILI9341_WHITE,ILI9341_RED);  tft.setTextSize(1);


```

これで背景色が赤になります。しかしながらフォントによっては指定が無効となりました。

# フォントを指定

せっかくのドットマトリックスなのできれいなフォントにしたいですね。

```

  tft.setFont( &FreeSans24pt7b );

```
とすると24ポイントのドットフォントが使えます。
FreeSans24pt7b.hはAdafruit GFX Graphics Libraryを設定するといっしょに読み込まれます。
しかしながら必ずしも以下は必要ないぽい

```

#include <Adafruit_GFX.h>
```

使えるフォントは

「Using Fonts」(Adafruit GFX Graphics Library)
https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts


によると

>
FreeMono12pt7b.h		FreeSansBoldOblique12pt7b.h
FreeMono18pt7b.h		FreeSansBoldOblique18pt7b.h
FreeMono24pt7b.h		FreeSansBoldOblique24pt7b.h
FreeMono9pt7b.h			FreeSansBoldOblique9pt7b.h
FreeMonoBold12pt7b.h		FreeSansOblique12pt7b.h
FreeMonoBold18pt7b.h		FreeSansOblique18pt7b.h
FreeMonoBold24pt7b.h		FreeSansOblique24pt7b.h
FreeMonoBold9pt7b.h		FreeSansOblique9pt7b.h
FreeMonoBoldOblique12pt7b.h	FreeSerif12pt7b.h
FreeMonoBoldOblique18pt7b.h	FreeSerif18pt7b.h
FreeMonoBoldOblique24pt7b.h	FreeSerif24pt7b.h
FreeMonoBoldOblique9pt7b.h	FreeSerif9pt7b.h
FreeMonoOblique12pt7b.h		FreeSerifBold12pt7b.h
FreeMonoOblique18pt7b.h		FreeSerifBold18pt7b.h
FreeMonoOblique24pt7b.h		FreeSerifBold24pt7b.h
FreeMonoOblique9pt7b.h		FreeSerifBold9pt7b.h
FreeSans12pt7b.h		FreeSerifBoldItalic12pt7b.h
FreeSans18pt7b.h		FreeSerifBoldItalic18pt7b.h
FreeSans24pt7b.h		FreeSerifBoldItalic24pt7b.h
FreeSans9pt7b.h			FreeSerifBoldItalic9pt7b.h
FreeSansBold12pt7b.h		FreeSerifItalic12pt7b.h
FreeSansBold18pt7b.h		FreeSerifItalic18pt7b.h
FreeSansBold24pt7b.h		FreeSerifItalic24pt7b.h
FreeSansBold9pt7b.h		FreeSerifItalic9pt7b.h

これだけあるらしい。


しかしながらこれらは先の背景色指定はできませんでした。
あらかじめ

```

  tft.fillRect
```

などでボックスを描いておき、その中に描画することが必要となります。
Dockerを使用してNuxt.jsアプリを作成して実行する

### Use Docker to Create and Run  a Nuxt.js App

このチュートリアルではUbuntu 19.04を使用しています。

I`m using Ubuntu 19.04 for this tutorial.


一時コンテナを実行してnuxt.jsアプリを作成します

run temporary container to create nuxt.js app

```
sudo docker container run -it -v $(pwd):/app -w /app node:12.13.1-alpine /bin/sh
```

コンテナ内に、「nuxt」と「nuxt-create-app」をインストールします

Inside container, install `nuxt` and `nuxt-create-app`

```
npm install --save nuxt
npm install -g create-nuxt-app
```

完了したら、Nuxtアプリを作成できます

Once done, you can create the Nuxt app

```
npx create-nuxt-app <project-name>
```

それが完了したら、コンテナを「exit」し、プロジェクトフォルダの所有者を変更できます

Once that is done, you can `exit`the container, change the owner of the project folder

```
sudo chown -R myuser:myuser <project-name>
```

プロジェクトフォルダーに「cd」し、「Dockerfile」と「docker-compose.yml」の両方を作成します

`cd` into the project folder and create both the `Dockerfile` and `docker-compose.yml`

##### Dockerfile

```
FROM node:12.13.1-alpine 

WORKDIR /app

RUN apk update && \
    apk add git && \
    npm install -g npm && \
    npm install -g @vue/cli \ 
    npm install --save nuxt
	
ENV HOST 0.0.0.0
EXPOSE 3000

```

問題がないように、Dockerコンテナの同じバージョンを最初から使用することを忘れないでください。

Remember to use the same version from the docker container from the beginning, as to not have issues.

##### docker-compose.yml

```
version: '3'

services:
  nuxt:
    build: .
    tty: true
    command: npm run dev
    volumes:
      - .:/app
    ports:
      - "3000:3000"
```

これにより、docker-composeを実行してプロジェクトをビルドおよび実行できます

With this, you can run docker-compose to build and run the project

`sudo docker-compose up --build`

コンテナーをダウンロードしてイメージをビルドするには、最初にしばらく時間がかかります。一度完了すると、プロジェクトのホームページがURL「localhost：3000」に表示されます

This will take a while the first time, in order to download the container and build the image, once done, you can see the project home page on the url `localhost:3000`
railsでのデータの保存、更新、削除の方法　Create,Update,Delete

# はじめに
今回はrailsでのデータの新規作成、更新、削除の方法をまとめていきます。

#データの新規保存　
newメソッド+saveメソッドかcreateメソッドでレコードを新規作成します。

#####newメソッド+saveメソッドの例

```
#モデル名.new(カラム名: データ)＋モデル名.saveのセットで保存されます。
#saveメソッド忘れに注意ください。これがないと保存されません。

#以下が例です。
post = Post.new(name: "記事１", title: "hogehoge") 
post.save
```

#####createメソッドの例


```
#モデル名.create(カラム名: データ)で保存されます。
#createメソッドはnewとsaveメソッドを一度に実行できます。

#以下が例です。
Post.create(name: "記事１", title: "hogehoge") 
```

#データの更新
saveメソッドかupdateメソッドでレコードの更新を行います。
自身はupdateメソッドをよく使います。

#####updateメソッドの例


```
#モデル名.update(カラム名: データ)で保存されます。
#update前にfindでupdateをするデータを取得します。

#以下が例です。
post= Post.find(1)
post.update(name: "記事2", title: "higehige") 
```


#####saveメソッドの例

```
#モデルの各項目に値を入れていき、最後にsvaeメソッドで更新をかけます。

#以下が例です。
post= Post.find(1)
post.name = "記事2"
post.title = "higehige"
post.save
```

#データの削除
destroyメソッドかdeleteメソッドを使いデータを削除します。

#####destroyメソッドの例（モデルクラスでdependent: :destroyを指定して関連付けたデータも自動的に削除されます）

```
#モデル名.find(削除したいid).destroy(カラム名: データ)でデータを削除します。

#以下が例です
Post.find(1).destroy
#ちなみにレコード全消去したい場合は以下になります。
Post.destroy_all
```

#####deleteメソッドの例（関連するデータは削除されません）
```
#モデル名.find(削除したいid).delete(カラム名: データ)でデータを削除します。

#以下が例です
Post.find(1).delete
#ちなみにレコード全消去したい場合は以下になります。
Post.delete_all
```

# おわりに
基本的なrailsの新規作成、更新、削除について紹介いたしました。
データ新規登録時のsaveメソッドを忘れてはまらないように注意ください！！
Twitterで挙げられているプログラミングできる人の特徴をマージしてみた。

# はじめに
皆さんはTwitterやっていらっしゃいますでしょうか？
私は最近、Twitterで`#駆け出しエンジニア`とか`#プログラミング教育`とか`#競プロ`などプログラミングにまつわる話題を多く見かけるようになりました。そして、結構頻繁に見かけるのが、「プログラミングできるやつの特徴」とか「成長が早いプログラマの特徴」という特徴列挙型のツイートです。そこで、これ全部マージしたら、最強のプログラマの特徴が判明するのでは？という風に思ったわけです。

# 調査方法
私はウェブスクレイピング技術に長けているわけではないので、人力で集計した結果をまとめたいと思います。人力=主観が混じっていないと断言できないことをご了承ください。あくまで、このツイートはプログラミングできる人の特徴を述べているっぽいというパッと見の判断で集めています。

## 具体的な方法

- twitter.comの検索窓でキーワード検索
- 話題のツイートの上位200件ほどの中からそれっぽいものを抽出
- 項目をリスト化し、同様の内容をまとめる

## ツイートの検索に使ったキーワード

- できるプログラマ 特徴
- できるエンジニア 特徴
- 優秀なプログラマ 特徴
- 優秀なエンジニア 特徴
- 強いプログラマ 特徴
- 強いエンジニア 特徴
- プログラミング できる

# 集計結果

|特徴|件数|
|:---|--:|
| 謙虚・誠実・素直 | 9 |
| 行動や作業が速い | 9 |
| 事象の明確化・言語化ができる | 7 |
| 技術の知識が広くて深い | 6 |
| 新しい技術への興味・対応力がある | 4 |
| コミュ力がある | 4 |
| アウトプットしている | 3 |
| とりあえずやってみる | 3 |
| 面倒くさがり | 3 |
| 説明が上手い | 3 |
| 思考力が強い | 3 |
| 報告・連絡・相談ができる | 3 |
| 綺麗好き | 3 |
| 寡黙 | 2 |
| 検索力がある | 2 |
| 無駄が嫌い | 2 |
| 本質や核心を追求する | 2 |
| 生み出すバグが少ない | 2 |
| 記憶力がいい | 1 |
| 好奇心が強い | 1 |
| 継続できる | 1 |
| 使える道具は全部使う | 1 |
| 優先順位を策定できる | 1 |
| 問題が起こっても冷静さを保てる | 1 |
| 必ずしも頭が良いとか才能があるわけではない | 1 |
| 想像力を仮説で広げることができる | 1 |
| 拡張性を考慮した設計ができる | 1 |
| 生産性が100倍高い | 1 |
| 自分に厳しい | 1 |
| 解決することを絶対に諦めない | 1 |
| 言語にこだわらず勉強する | 1 |
| 試行錯誤できる | 1 |
| 業務時間外でも日々コードを書いている | 1 |
| 自分のスキルを正確に把握している | 1 |
| こだわりが強い | 1 |
| コードの裏の意図が見える | 1 |
| Noと言える | 1 |
| 詰まった時に見るのはQiitaではなく公式ドキュメント | 1 |
| 頭と手の動かすバランスが良い | 1 |
| 難しいことを面白いと言う | 1 |
| ショートカットをめっちゃ使う | 1 |
| マウスを使わずキーボードで完結できる | 1 |
| 独り言が多い | 1 |
| 人が集まってくる | 1 |
| 性格が悪い | 1 |
| 人生に悲観的 | 1 |
| 深夜にSlackがアクティブ | 1 |
| にゃーんと呟いている | 1 |
| アイカツ構文を履修している | 1 |
| 百合が好き | 1 |
| 筋肉 | 1 |
| イキってる | 1 |
| オタク気質 | 1 |

# 考察

挙げられている件数の多かったものを見るに、**「謙虚で素直で誠実で、行動や作業の早い人」**がプログラミングできる人みたいですね！

... ってそれ普通にプログラミング関係なく**仕事ができる（一緒に仕事したい）人**の条件じゃないんですの？？　まぁ得てして優秀な人材は仕事ができるだけなじゃくて人としてできてる人ということなのかもしれないですね。

個人的に気になった項目は「事象の明確化・言語化ができる」、「コミュ力がある」、「面倒くさがり」ですかね。プログラミングというのは結構言葉にするのが難しい事象を言語化して理解することが重要だったりするので、１つ目はかなり納得がいきます。２つ目に関しては、コードを書く能力が高ければ良いってわけじゃない、人付き合いも大事だぜって感じの印象ですね。一流のスポーツ選手は身体能力が高いだけでなく頭が良かったり人付き合いが良かったりするなぁなんて私はよく思うんですが、プログラミングの業界でも同じようです。そして、「面倒くさがり」。わかります。わたしも面倒なこと嫌いです。ここで大事なのは、面倒な目に二度と会わないように踏ん張って最初ちょっと努力して、次からは楽をしようとすることだと思うんですよね。単なる面倒くさがりじゃきっとダメでしょう。

また、リスト後半の若干の偏見があるような項目も面白いですね。確かに、私の知り合いの優秀なエンジニアはよく「にゃーん」と呟いている気がします笑。最近はエンジニアでも筋トレする方が結構いるようで、エンジニアはヒョロガリとかデブ不潔ってイメージはそのうち変わるかもしれないですね（デブ不潔イメージはシュタインズゲートのダルのイメージからくるのでしょうか？）。

# 最後に

すごい軽い気持ちで適当に調査分析をしたものなので、参考になるかは微妙かもしれませんが、こういうことをしてみると面白いですね。他にもこんな項目がある！とか言うのがあればぜひコメント欄にてお願いします！

# ツイートを参照したユーザの方々

※アルファベット順です。

- @1jkazy
- @AyaneFukui
- @channaka0531
- @Creative_SC
- @engineer_aoi
- @engineer_kossan
- @Hikaru_SaraUdon
- @HKLKDK1010
- @ho_ho_hm
- @k_miki
- @kaduma2010
- @kazu_Y_15
- @kazuki_swim0802
- @kazumoto2131
- @kitaindia
- @ledsun
- @lucifuges
- @lzpel
- @maaaato
- @miyapotemaru
- @ogaaryo
- @poly_soft
- @ramuko_samepagu
- @ry3s
- @salvbw
- @shimo_tmk
- @suin
- @Tama65535
- @tau_tau_x
- @teruyakinist
- @unary_prog
強化学習３２　Colaboratoryに進捗バーをつける。chainerrl魔改造

中学生から大学のAI初学者が対象です。

ログファイルは、ダラダラと出されても疲れてしまいます。
loggingはOSに近いところで動作するためか、使い分けが困難です。
そこで、loggingをlogファイルに出力するようします。

```python
import logging
logging.basicConfig(level=logging.INFO, filename='log')
```
このようにしてしまうと、全部がファイル出力となってしまいます。
そこで、chainerrlを魔改造します。
前にも書いてありますが、一部をchokozainerrlにして、いじっているので、そちらを変更します。
train_agent.pyとevaluator.pyのlog出力部分を一部だけ、print出力に変更しました。

そして、進捗バーをつけます。

```train_agent.py
 # add
   import tqdm
   if log_type=='pbar' :
        pbar= tqdm(total=steps,position=0)
        if step_offset>0:
            pbar.update(step_offset)
 
#必要なところに追加　１％を超えるくらい進行したらバーをupdate
    if(log_type=='pbar'):
        if(t-pbar.n)>= steps*0.01:
             pbar.update(t-pbar.n)
```
気になる方は、chokozainerRLのtrain_agent.pyの中身を見てください。
　ポイントは、position=0と設定するところです。
こうしておくと、進捗中に追加されたコンソール出力は進捗バーの下に表示されます。
　また、pbar.nですが、公式のマニュアルにも、いろいろなところにも書いていません。なので、少しだけ説明します。
　tqdmは、下記のgithubにあります。　
https://github.com/tqdm/tqdm
　こちらのソースコードからすると、pythonで書かれているようです。pipでインストールできるのでそうなのでしょう。
nはtqdmのクラスメンバー変数で、tqdmの現在値を表しています。不勉強なのでわかっていないのですが、pythonのクラス変数は、全部public変数のようです。なので、pbar.nのようにアクセスできてしまいます。
　道理で探しても、getやset関数が見つからないわけだ。

これから検証していきますが、ダラダラコンソール出力は、webクライアントに過剰な負担をかけているように思っています。
Galaxy Release v19.09が出たよ その1

# 可視化ツールが追加された
2019年9月に公開となったGalaxy Release v19.09には次の可視化ツールが追加されています

* 画像への注釈ツール![Image annotation](https://user-images.githubusercontent.com/3022518/47093799-3980c580-d22a-11e8-9f70-b58c624b7b4d.png)
    * テキストの注記と線でのマーキングが可能
* 地理情報システム（GIS：Geographic Information System）によるデータ可視化ツール![GIS](https://user-images.githubusercontent.com/3022518/57146482-affba400-6dc5-11e9-9dcd-c0d03810ca0d.png)
    * これに伴い、GISデータのシェイプファイルデータタイプをサポート
* 分子構造の可視化ツール　iCn3D　<img width="978" alt="Screen Shot 2019-12-09 at 16.35.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213053/59d85fb8-66a5-d622-a94c-4cbf087c7037.png">
* hyphy-toolsの結果の表示ツール![hyphy-vision](https://user-images.githubusercontent.com/535261/60125267-727a1e00-9759-11e9-9715-73e247a4d294.gif)
    * これに伴いhyphy_results.jsonデータタイプをサポート

今回はここまで:smile: