OmniAICreator/Qiita-1.07M huggingface dataset:
【BigSur】 アプリケーションを開くためのアクセス権限がありません。の対処法 

この記事は[and factory Advent Calendar 2020](https://qiita.com/advent-calendar/2020/andfactory)の10日目の記事です。
昨日は@nanoyatsuさんの[【Android】DaggerなんもわからんかったけどHiltをやりました](https://qiita.com/nanoyatsu/items/ad7f86ae5f80483f5d08)でした。
iOSエンジニアなのでAndroidよくわからないですが凄そうですね！！

## はじめに
BigSurにしてからアプリケーションを開こうとするとこの様なアラートが表示されることがあります。

![スクリーンショット 2020-12-10 15.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678728/e184c127-395f-87a2-9985-491e87108530.png)

いやー困りましたねー
コレジャアシゴトガデキナイヨー（棒）
## 原因
![スクリーンショット 2020-12-10 15.37.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678728/c6cbf6cd-991c-d7ce-7e1d-d2c9ed450664.png)

クラッシュログを見るとコード署名が無効となっていました。

## 対処法
コード署名が無効となっていたので削除すればいいんじゃね？ってことで

```
codesign --remove /System/Applications/hogehoge.app
```
このコマンドを実行して署名を削除します。

**署名を削除するとアプリケーションを開くことができる様になりました！**

![スクリーンショット 2020-12-10 15.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678728/2c8cb4b6-bb55-1e6a-ae4a-7367a9b7f634.png)

## あとがき

iosエンジニアなので次はちゃんとiOS系の記事書きます💪
Linuxで一時的にフォルダ、ファイルを作成するグループを変更する

# 目的
メインのプライマリーグループを変えたくないが、一時的に作成されるファイルやフォルダのグループを所属している別のグループに変えたいということがあるときに使うコマンドにつて記載します。

たまにしか使わず、まいどまいどコマンドを忘れてしまうのでメモとして記載しておきます。

# 使い方
ユーザhogeのプライマリーグループがhoge, その他にfugaに所属していたとします。
mkdir, touchなどでディレクトリやファイルを作成すると、オーナがhoge、グループがhogeのディレクトリやファイルができます。

以下のコマンドを実行後

    $ newgr fuga

mkdir, touchなどを実行すると、オーナがhoge、グループがfugaのディレクトリやファイルが作成されます。

１コマンドだけグループを変えたい場合は

    $ sg fuga -c "touch test"

のようにsgコマンドを使うと、パラメータで渡したコマンドにだけ影響を受けるようになります。
いろいろな分野へのAI活用

##これを書こうとした理由
私の家は農家で、主に祖父母が作業しています。
しかし、二人ともかなり高齢なので作業がつらくなっているのがわかります。
そこで何か解決策はないかと調べたところ農業でAIを活用するというものを見つけました。
一見、何の接点もないような二つですが、いろいろなところで活用されていることがわかりました。
そこでAIは他のいろいろな分野にも活用されているのではと思いこの記事に決めました。
##日常に活用されるAI
１．Alexa
Alexaは、高性能スピーカーEchoに搭載されている音声認識アシストAIです。
Alexaには、「スキル」と呼ばれる拡張機能があり、スキルを覚えさせることで
新しい行動ができるようになります。
２．SJ-TF49C
SJ-TF49Cは、しゃべるAIを搭載した冷蔵庫です。
SJ-TF49Cは、冷蔵庫の中の食材から献立を提案したり、ユーザーが定期的に購入している食材について
これまでの購入時期から割り出した周期をもとに、「そろそろ○○がなくなるころではないですか？」
などと教えてくれたりもします。
３．ルンバi7/i7＋
ルンバはもう知らない人はいないのではないかと思うくらい有名です。
その中でもルンバi7/i7＋は、ルンバ史上最も賢いルンバというふれこみで注目を集めいています。
AIが活用されている機能としては、スマートマッピングが挙げられます。
これは、部屋の間取りや環境をルンバが学習、記憶することで、
より効率的なルートで掃除をすることができるようになったとのことです。
また、どの部屋やエリアをいつ掃除する、といったスケジュールも立ててくれるので、
掃除はルンバに任せっきりでも安心です。
##感想
調べてみた結果このほかにも様々な分野に活用されていることが分かった。
自分が思っているよりもずっとAIは進化していてとても驚いたと同時に、過去だは不可能と言われていた
ようなロボットとの会話などが今では当たり前にできているのだなと知って人間を超えてしまう日も来るのではないか
とも思ったので次はAIにおけるデメリットなども調べたいと思った。
mixhostでデータベースを作成・管理する方法

mixhostでデータベースを作成する方法のまとめです。
mixhostはCpanelというサーバー管理ソフトを採用しているため、操作しやすいと思います。
##データベース作成・管理の3ステップ
①[データベースの作成](#midasi1)
②[ユーザーの作成](#midasi2)
③[ユーザーの権限の付与](#midasi3)
<a id="midasi1"></a>
<a href="#midasi1"></a>
###①データベースの作成
まずは、そのmixhostで扱うサーバーのCpanelにログインします。

ログインしてスクロールすると、「データベース」が見えるので、その中の「MySQL Databases」をクリックします。

新しいデータベース作成の欄に新しいデータベース名を入力したら「データベース作成」をクリックします。
そうすると、新しいデータベースは作成されます。

ステップ①
**Cpanel→データベース→MySQL Databases→新しいデータベースの名前入力→データベース作成**
<a id="midasi2"></a>
<a href="#midasi2"></a>
###②ユーザーの作成
既存のユーザーで操作するなら別ですが、データベースごとにユーザーを分けている場合は新たにユーザーを作成する必要があります。

こちらも同じく、「MySQL Databases」内で操作します。
先ほど、データベースを作成した欄を少し下にスクロールすると、「新しいユーザーの作成」の欄があります。

そこで、データベース同様ユーザー名を割り当てて、パスワードを入力し、「ユーザーの作成」ボタンを押すと新たにユーザーが作成されます。

ステップ②
**Cpanel→データベース→MySQL Databases→新しいMySQLユーザーのユーザー名、パスワード入力→新しいユーザー作成**
<a id="midasi3"></a>
<a href="#midasi3"></a>
###②ユーザーの権限付与
新たにデータベースを作成してもそのデータベースは誰が扱って良いのかということを決める必要があります。そこで、指定のユーザーに権限を与えます。
これもMySQL Databases」内で操作します。

先ほどのようにユーザーを作成した欄を少し下にスクロールすると、「ユーザーをデータベースに追加」の蘭狩り、ここでどのユーザーをデータベースに加えるかということを指定します。

それぞれ、MySQLユーザーと権限を与えたいデータベースを選択して「追加」をクリックします。

そうすると、「ユーザー権限の管理」画面に飛びます。そこで、そのユーザーにどの権限を与えるかを選択して、「変更」をクリックすると、そのユーザーがそのデータベースで管理を行うことができます。

ステップ③
**Cpanel→データベース→MySQL Databases→ユーザーをデータベースに追加
→新しいMySQLユーザーのユーザー名と新しいデータベースの選択→追加→ユーザー権限の管理
→どの権限を付与するか決める→変更**

##まとめ
mixhostはCpanelで操作が一貫してできるので簡単にデータベース作成もできますね。
WSL2でCentOS Streamを使う

先日、[CentOSが開発方針を変更ーー「CentOS 8」は2021年終了、今後は「CentOS Stream」に注力 | OSDN Magazine](https://mag.osdn.jp/20/12/10/091500) なんてなことが話題になりました。

そこでWSL2でもCentOS Streamを使ってみようと思ったのでやってみました。結果的に、今年のアドベントカレンダーに書いてきた以下の3つの記事全部に関連する内容になりました。

- [ストアアプリではない方法でディストリビューションを導入](https://qiita.com/matarillo/items/77d960d440fd19d7e533)
- [WSL2でカスタムカーネルをビルドして使う](https://qiita.com/matarillo/items/bcae7e61ada3d1a7f9a4)
- [WSL2で仮想ディスクイメージをマウントする](https://qiita.com/matarillo/items/b944e2ef0cd2f8ab76ab)

## お手軽な方法

[CentOS Streamのrootfsを抽出しておいた](https://github.com/matarillo/CentOS-Stream-WSL2/releases/tag/8-20201019.1.x86_64)ので、ここからrootfs.tar.gzをダウンロードして、[コマンドラインからインポート](https://qiita.com/matarillo/items/77d960d440fd19d7e533#%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)してください。

## 公式の配布物をもとに自分でやってみる方法

[CentOSのクラウドイメージ配布サイト](https://cloud.centos.org/centos/8-stream/x86_64/images/)から、CebtOS Stream 8のqcow2イメージをダウンロードします。ファイル名が「CentOS-Stream-GenericCloud-8-20201019.1.x86_64.qcow2」のやつです。

[WSL2で仮想ディスクイメージをマウントする](https://qiita.com/matarillo/items/b944e2ef0cd2f8ab76ab)の手順に沿ってqcow2をマウントします（WSL2で作業するには[カーネルをビルド](https://qiita.com/matarillo/items/bcae7e61ada3d1a7f9a4)する必要もあります）。

途中はこうなりますよ。

```
$ sudo qemu-nbd -c /dev/nbd0 /mnt/c/<path>/<to>/CentOS-Stream-GenericCloud-8-20201019.1.x86_64.qcow2
```

パーティション `/dev/nbd0p1` をマウントしたディレクトリ（ここでは `/mnt/centos-stream` としておきます）に移動します。

`tar`コマンドで、マウントしたディレクトリを丸ごと圧縮します。

```
$ cd /mnt/centos-stream
$ sudo tar -zcpf ~/rootfs.tar.gz `sudo ls`
```

できあがった `~/rootfs.tar.gz` をWindowsから見えるところに移動して、あとは[コマンドラインからインポート](https://qiita.com/matarillo/items/77d960d440fd19d7e533#%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)しましょう。
[Ruby] slice!メソッド　

##一言
何日かぶりの投稿。
最近また中国語の勉強を始めました。
プログラミング面白いけど、行き詰まったらやる気が駄々下がりになる。
とにかくググりまくってる今日この頃です。

というわけど本題・・・

##slice!メソッドについて

先日は「sliceメソッド」について少々語ったわけですが、
今回は[!]がついてる方について語ろうと思います。

またまた以前に解いた問題の２回目に挑戦。
「任意の文字列の最初の2文字を最後尾に持ってこい」とのお達し。

※出力例：
left2("Hello") → lloHe
left2("java") → vaja
left2("Hi") → Hi

こんな感じに出せと・・・。

で、回答は

```ruby
def left2(str)
  cutPaste = str.slice!(0, 2)
  puts str + cutPaste
end
※こちらの形はご指摘いただきました。
　引数として与えられたオブジェクトを破壊的に加工するようなメソッドが有用な場合もありますが，避けるのが無難です。
　コメント欄ご確認ください。

left2("Hello")
left2("java")
left2("Hi")

```

簡単に解説
任意の文字列から[slice!]を使い、最初の2文字を取り除きます。
　↓
その後、取り除いたやつを後ろに足してあげる　

参考　[slice! 公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/String/i/slice=21.html)

カットアンドペーストしてあげた感じです。
解説を見ると・・・

```ruby
puts str[2..-1] + str[0..1] 
```

簡単に説明すると、3文字目からの文字と、最初の2文字を指定。
最初の指定した2文字を後ろに持ってくるだけ。
これだけで十分だったというオチ・・・。

先日と同じようなオチですみません。
でもいろんな出し方があるという面白さもあるから飽きません。
また何か気づいたこと、気になったことありましたら投稿します。
Production環境でAction Cable + Redis(ElastiCache)を使用する

毎度デプロイ時に迷走するので、自分用のメモです。
問題点等があれば、ご指摘頂けますと幸いです。

## 前提
- 開発環境でのRedisは問題なく動作すること
- アプリケーションへのドメイン設定が完了していること
- ElastiCacheの設定が完了していること
- .envを導入済みであること

### 使用バージョン
- Ruby:2.6.5
- Ruby on Rails: 6.0.3

## アプリケーション側
```ruby:/config/routes.rb
Rails.application.routes.draw do
  # action cable
  mount ActionCable.server => '/cable'
end
```


```env:.env
REDIS_HOST="【ElastiCacheのエンドポイント】"
REDIS_PORT="6379"
```

```ruby:/config/initializers/redis.rb
Redis.new(:host => ENV['REDIS_HOST'], :port => ENV['REDIS_PORT'])
```

```ruby:/config/environments/production.rb
config.action_cable.disable_request_forgery_protection = true
config.action_cable.allowed_request_origins = ['https://【ドメイン名】, %r{https://【ドメイン名】.*}, 'http://【ドメイン名】', %r{http://【ドメイン名】.*}]
```


```ruby:/config/environments/production.rb
  config.session_store :redis_store, {
    :servers => {
        :host => ENV['REDIS_HOST'],
        :port => ENV['REDIS_PORT'],
        :db => 0,
        :namespace => 'sessions'
    },
    :expire_after => 1.days
  }
```

```yml:/config/cable.yml
production:
  adapter: redis
  port: 6379
  url: redis://<%= ENV['REDIS_HOST'] %>

```


## サーバー側
### nginxの設定
```conf:アプリケーション名.conf
upstream unicorn_server {
    server unix:/var/www/projects/【アプリケーションディレクトリ】/tmp/sockets/.unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name 【ドメイン名】;
    gzip on;

    keepalive_timeout 5;

    # Location of our static files
    root /var/www/projects/【アプリケーションディレクトリ】/public;

    location ~ ^/assets/ {
        root /var/www/projects/【アプリケーションディレクトリ】/public;
        location ~ .*.(js|css|html|svg)+$ {
            gzip_static on;
            gunzip on;
        }
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://unicorn_server;
            break;
        }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /var/www/projects/【アプリケーションディレクトリ】/public;
    }

   location /cable {
        proxy_pass http://unicorn_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection Upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

```
電子カルテのメリットとデメリット

来年、母が看護師の仕事を再開することになり、「電子カルテ」というものを使用して仕事をすることになると聞きました。
そこで、「電子カルテ」が実際どういうものなのか気になったため少し調べてみることにしました。
##電子カルテとは
簡単に言うと
**患者さんの情報（患者さんの氏名、住所、既住職など一人一人異なる情報）が載った紙のカルテを電子化したもの**
です。

また、医療会計や薬剤システムなどをオンラインで連携し、治療経過などの情報を知ることができ、記録の検索や分析を担うことができます。
さらに、電子カルテには大きく２つの種類があり、病院向けとクリニック向けの電子カルテがあります。
##普及率
厚生労働省の調査結果を見てみると、かなりの増加傾向があり、たくさんの病院で使用されていくだろうということがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869427/cb51fc0f-48d9-60e4-b5c8-84d9bc1fc9d3.png)
電子カルテシステム等の普及状況の推移
https://www.mhlw.go.jp/content/10800000/000482158.pdf
##メリット
メリットは大きく分けて４つあります。

**1,管理スペースの削減**
患者さんのデータはサーバ内に蓄積され、保存されるので、紙のように保存するスペースが必要なくなる。

**2,業務効率の向上**
紙カルテよりもあらゆる面で時間が短縮される。

**3,ミスの防止**
書き間違い、読み間違いなどのトラブル（ヒューマンエラー）の防止になる。

**4,情報の共有、確認がスムーズに**
入力後すぐに反映され、編集する際にもすぐにできるため情報を入力する側も見る側も時間や手間がかからずに済む。

##デメリット
使いやすそうな電子カルテだが意外とよくない面もあります。

**1,電気に依存**
停電などのトラブルでシステムが停止してしまう可能性がある。
（自家発電装置で対応している医療機関が多い）

**2,使うのに慣れが必要**
パソコンが不慣れな人にとっては大きな負担になる。

**3,コストがかかる**
初期費用だけでなく、運用費もかかってしまう。

**4,セキュリティでのリスク**
院内のどこにでもアクセスできるようになり情報漏洩の危険性がある。
##まとめ
ミスや保存スペースが減り、業務の効率が上がるメリットがある一方デメリットも少なくはないので導入するにはしっかり考えてみないといけないなと感じました。
母もこれから電子カルテを使うのでこのことを教えて、紙カルテよりも効率よく楽に業務をこなしてほしいです。
【第6回】Python で競馬予想してみる 　~ LightGBM ：馬券の回収率 ~

前回、ロジスティック回帰に見切りをつけて LightGBM で学習モデルを作ってみた。
競馬予想で重要なのは、モデルの精度よりも馬券の回収率が目的になるので、とりあえず馬券の回収率を計算できるコードを追加してみるのだ

前回：[【第5回】Python で競馬予想してみる 　~ LightGBM ~](http://localhost:8890/notebooks/keiba_ver4.3%EF%BC%88lightGBM%EF%BC%89.ipynb)

# ベースとなるモデル
前回（[【第5回】Python で競馬予想してみる 　~ LightGBM ~](http://localhost:8890/notebooks/keiba_ver4.3%EF%BC%88lightGBM%EF%BC%89.ipynb)）作成したモデルをそのまま使用
コードが汚くなってきたのとデータフレームを作り過ぎてしまったので、関数化したほうが便利なのかなと思いつつコードを整理して、再学習

###　AUC
前回と変わらず（あたりまえなのだ）`0.770`くらい

```txt:Out
train  roc_auc_score = 0.801985175031238
eval  roc_auc_score = 0.7701583550634967
```

###　ROC曲線
きれいな曲線描いてます（良い悪いは別として）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895631/6ab3a098-3428-4abe-1003-605e2e58cc09.png)

## 回収率の計算方法
LightBGM に学習させる前に、X_train X_test のデータフレームから 回収率に必要そうな 単勝オッズ, `複勝配当, 人気, 確定着順, 3着以内` のデータの入ったデータフレームを作成しておいた。
下の `df_rslt`

```python:build.ipynb
# データの分割を行う（学習用データ 0.8 評価用データ 0.2） stratify:層化抽出
X_train, X_eval, y_train, y_eval = train_test_split(dataX, dataY, test_size=0.2, stratify=dataY)

# 学習データの修正
X_train = X_train.drop(['レースID(新)', '単勝オッズ', '複勝配当', '人気', '確定着順', '3着以内'], axis=1) # 不要なデータを削除

# 検証データの修正
df_rslt = X_eval[['レースID(新)', '単勝オッズ', '複勝配当', '人気', '確定着順', '3着以内']]
X_eval = X_eval.drop(['レースID(新)', '単勝オッズ', '複勝配当', '人気', '確定着順', '3着以内'], axis=1) # 不要なデータを削除
```

![スクリーンショット 2020-12-10 14.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895631/f14ab4d0-74fd-0c83-30b0-ad68604c0222.png)

###回収率の計算方法
このデータフレームに、`y_pred_proba`, `y_pred` を追加
`y_pred` は、`y_pred_proba` の数値を 0.5 を境に 1と 0に変換（今回は使わなかったが。。）
そして、`y_pred_proba`の値を 0 から 1 までスライドさせながら単勝と複勝の回収率を計算した。

```python:build.ipynb
y_pred_proba = model.predict(X_eval)
y_pred = np.where(y_pred_proba < 0.5, 0, 1) # 1と0に変換

df_rslt['予測'] = y_pred_proba
df_rslt['予測1'] = y_pred
df_rslt.drop(['予測','予測1','馬券期待値', '馬券期待値2'], axis=1) 
```

```python:build.ipynb
# 単勝と複勝の回収率を、y_pred_proba の閾値を変化させながら計算
gain_tan = {}
gain_fuku = {}
n_sample = 100
for i in tqdm(range(n_sample)):
    threshold = i / n_sample
    
    gain_tan[threshold] = df_rslt[(df_rslt['予測'] > threshold)&(df_rslt['確定着順'] == 1)]['単勝オッズ'].sum()/len(df_rslt[df_rslt['予測'] > threshold])
    gain_fuku[threshold] = df_rslt[df_rslt['予測'] > threshold]['複勝配当'].sum()/len(df_rslt[df_rslt['予測'] > threshold])
```

####単勝の回収率
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895631/22a6200d-0d5b-7146-e763-9e3fccad3b30.png)

####複勝の回収率
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895631/8d645095-0d60-6154-f5c8-f36a876762db.png)

`y_pred_proba` の閾値 0.8を超えるとグラフがばらつくので、サンプル数を確認すると 20万件中の 600件
かなり少ないのだ
![スクリーンショット 2020-12-10 15.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895631/4db7b60c-65a9-fbcb-e1b0-76e9ccaaefef.png)

今回、回収率の計算ができるモデルも完成。今回はここまでなのだ:wave:
コードを書きながら、馬券の買い方次第でもどうにかなりそうな気がしてきたが。。

次回は特徴量の整理して、回収率の変化を見るのだ

***
参考：[【機械学習】競馬予想AIの回収率を上げた意外な方法とは？〜前編〜【Python】](https://www.youtube.com/watch?v=e15tY5CidYI&t=1011s)
***
[Oracle Cloud]Oracle Linux8 に vnc 接続してみた

Oracle Cloud 上に Oracle Linux 8 でコンピュートインスタンスを起動し、オンプレミスのWindowsから vncで接続してみた。

今回は、opc ユーザで作業を実施

# vncserverのインストール＆パスワード設定
vncserver を インストール

```
$ sudo dnf group install "Server with GUI" -y 
$ sudo dnf install tigervnc-server tigervnc-server-module -y
```
vnc パスワードの設定

```
$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
$
```

# vncserverの初期設定
vncserver.users ファイルに接続ユーザを追加
例） :1=opc

```
$ sudo vi /etc/tigervnc/vncserver.users
```

```vncserver.users
# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
# :2=andrew
# :3=lisa

:1=opc 
```

vncserver-config-defaults ファイルにデフォルト設定を追記
session=gnome
geometry=1280x1024

```
$ sudo vi /etc/tigervnc/vncserver-config-defaults
```

```vncserver-config-defaults.
# Several common settings are shown below. Uncomment and modify to your
# liking.

# securitytypes=vncauth,tlsvnc
# desktop=sandbox
# geometry=2000x1200
# localhost
# alwaysshared

session=gnome
geometry=1280x1024
```

# vncserverの起動

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now vncserver@:1.service
$ sudo systemctl status vncserver@:1.service
```
# vncviewerでの接続
(Windows PCからの接続の場合) powershell から Port フォワーディング
<VNC server host>に接続するコンピュートインスタンスのパブリックIPアドレスを指定

```
PS C:\> ssh -L 5901:localhost:5901 opc@<VNC server host>
```

vncviewer で localhost:5901 へ接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/3d9b8e55-902a-3089-49d9-6edf12fb9ddc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/f74fb46b-e03f-1a7b-3fa9-cedd4114c8dd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/2dab8231-1533-b6ae-6b8f-a154ebc91c3e.png)


# おわりに

Oracle Linux 8 に対して vnc で接続することができた。
サーバのバージョンは隠そう

##はじめに

 - HTTPレスポンスヘッダーにはPHPやnginxのバージョン情報が含まれる。
 - 本番環境などでは、PHPやnginxのようなサーバ側の設定でバージョンを含めないようにする必要がある。


##なぜ隠す必要があるのか
 - 使用中のバージョンの脆弱性が明らかになった場合に攻撃の対象にされやすい。
 - 攻撃に有用な情報を取得される可能性がある。

##設定について
簡単にですが、PHPとnginのバージョンの非表示の設定について記載しておきます。
###PHPの設定 
 - php.iniを開く

 - php.iniを以下のように修正する。


```
expose_php = On
```

の記述を

```
expose_php = off
```
に変更する。

###nginxの設定
 - nginx.confのhttpディレクティブに server_tokens off; を追加

```
http {
    server_tokens off;
    ~
```


###確認方法

- chromeのNetworkタブからHTTPレスポンスヘッダーを確認する。

- chromeの拡張機能のwappalyzerなどを使用する。

##おわりに
バージョンを非表示にしていないことで、セキュリティ上のリスクが高まることになります。
本番環境を作る際などには気をつけましょう。
[Swift] Keyboard Extensionが有効化されたかチェックする

Keyboard Extensionの収容アプリには「有効化したら画面遷移する」という挙動を示すものがあります。

この動作は非常に単純で、まず次のような関数を定義します。

```Swift
func isKeyboardActivated() -> Bool {
    let bundleName = "hogehoge"       //自分のKeyboard ExtensionのBundleIDを指定する。
    guard let keyboards = UserDefaults.standard.dictionaryRepresentation()["AppleKeyboards"] as? [String] else{
        return true
    }
    return keyboards.contains(bundleName)
}
```

`"AppleKeyboards"`というキーで、ユーザが有効化しているキーボードのBundleIDを全て取得できるので、その中に含まれているか確かめればOKです。

あとはこの関数を「バックグラウンドから復帰したタイミング」などで呼んであげれば有効化されたかチェックができます。

~~ただ、今のところ「どのキーボードが開かれているか」を取得できていません。ご存知の方がいらっしゃったら教えていただきたいです。~~
開かれているキーボードの取得方法がわかりました。「[[Swift] 現在開かれているキーボードを取得する](https://qiita.com/ensan_hcl/items/b6de38ee8ad8d66b24de)」をご覧ください。
APIが想定していない値をAPIの向こう側に伝える方法

# はじめに

[SENSYN Robotics](https://www.sensyn-robotics.com/)(センシンロボティクス)の中山です。
Webアプリやそのインフラ周りと、Web側とドローンの接続を行うデバイスドライバ的な部分を担当しています。

ミドルウェアのAPIが想定していない値をミドルウェアの後ろにいるカスタムソフトウェアに渡したいことがあり、そのための方法の一つを紹介します。

# なにをしたいか

下記の図のような呼び出しの流れで、フロントエンドとバックエンドは自作、ミドルウェアはソースコードが公開されていない製品を使っています。フロントエンドからミドルウェアのAPIを呼び出すと、ミドルウェアが引数に応じた処理をしてバックエンドを呼び出します。

```
{フロントエンド}  --> {ミドルウェア} --> {バックエンド}
```

このとき、ミドルウェアのAPIが想定しない値をバックエンドに渡して処理をしたいケースがあります。実際にあったのは下記のようなパターンです。

* 正の値しか受け付けないAPIを経由して、バックエンドに負の値を渡したい
* フロントエンドが渡すオブジェクトが特殊な種別であることを、バックエンドに伝えたい

# 解決方法

ミドルウェアのAPIは変更できないため、APIに渡す値に細工をし、バックエンドでその細工を解釈できるようにする、というのが基本的な方法になります。

例として、正の値しか受け付けないAPIを経由して、バックエンドに負の値を渡したいケースを考えます。

このときは渡したい値が倍精度の浮動小数点型(double)で、実際には整数部が4〜5桁、小数点以下は二桁までの精度があれば十分でした。ということは、それより下の桁に負であることを示す情報を入れてやれば、バックエンドに負の値を渡せそうです。そこで、こんなアイデアを思いついて実装しました。

* フロントエンドの処理
    * 正の値の場合
        * 小数点二桁で四捨五入して0.001を足す (`987.654` → `987.65` → `987.651`)
    * 負の値の場合
        * 小数点二桁で四捨五入して絶対値を取り、0.006を足す (`-987.654` → `-987.65` → `987.65` → `987.656`)
* バックエンド
    * 小数点以下三桁が0.005未満なら、小数点以下三桁を切り捨てる (`987.651` → `987.65`)
    * 小数点以下三桁が0.005以上なら、小数点以下三桁を切り捨て、符号を負にする (`987.656` → `987.65` → `-987.65`)

フロントエンドで足している値とバックエンドの判定で使う境界値が異なるのは、浮動小数点の誤差による判定間違いを避けるためです。

この例では1bitの情報(正負)を渡しているのでこのようになっていますが、判定の境界を細かく区切ることでバックエンドに伝える情報量を増やすことも可能です。

# 問題点

当然ですが、フロントエンド、バックエンドの開発者がこの手法を使っていることを知っている必要があり、気をつけてメンテナンスしないと簡単に壊れます。コードも理解しにくいものになるため、本当に他に方法がないとき以外は使うべきではありません。

必要になった場合も、ミドルウェアの開発側に拡張のリクエストをし、それが実装されるまでのつなぎとしてこの手法を適用するのがいいのではないかと思います。

# まとめ

* APIのデータ型が持つ情報量より送るべき情報量が少なければ、他の情報を混ぜ込んでAPIの向こう側に伝えることができる
* メンテナンスが辛くなるので、乱用すべきではない
納期直前に徹夜したくない

# はじめに
  - 対象: タスクが期限内に終わらない人/（時間足りないと嘆きながら）徹夜しがちな人
  - 参考書籍： 『なぜ、あなたの仕事は終わらないのか（著: 中島聡)』

---
宿題が終わらず徹夜。課題が終わらず徹夜。締め切りが守りきれず徹夜。
しかし、成果物は目も当てられないようなひどいもの。
誰しもがこう言った経験をしたことがあるでしょう。
本記事は上記を解決すべく書かれた『なぜ、あなたの仕事は終わらないのか（著: 中島聡)』のまとめ、ひいては感想です。

# 仕事がおわらない原因
**最後に頑張る**
期限まで3ヶ月あるから余裕だろう。と思って悠長にすごしていたら、もう期限の1週間前。
もちろん3ヶ月の期間を想定して成果を期待しているものを、1週間でこなせるはずもありません。
ここでの原因は**「時間に余裕を感じ、最後までやらなかった」**ということでしょう。徹夜と同じです。

**やるべきことがわかっていない**
仕事に手をつけた。とりあえず思いつくことから手当たり次第やってみる。
あれもいるな、これも必要だな、なんて作業を進めていく。
期限直前になり機能の確認をしてみるとコアの部分が疎かになっていたこと気づいた。修正に時間が必要なため納期に間に合わない。
ここでの原因は**「やることがわかっていない、そして優先順位をつけていない」**ことでしょう。

# 解決策
**時間に余裕を感じ、最後までやらなかった**
解決策: **最初に頑張る**
これは決して最初**から**最後まで頑張る、という意味ではありません。
最初**だけ**頑張るのです。
ではどのくらい頑張るのかというと、「全体の仕事の8割を最初の2割の期間で終わらせる」くらいです。
具体的な数字を出してみると、
10日後が納期なら2日で、1ヶ月なら1週間弱で8割終わらせる感覚です。
8割終わらせたあとは残りの期間で心の余裕とともに残り2割の仕事をこなしていけばいいのです。
では8割の仕事とはどのくらいなのでしょうか。

**やること、優先順位がわかっていない**
解決策: **やることをリスト化、その中で優先順位をつける**
まず納期までが長い仕事は10〜１５日くらいになるまで分割します。期間を縦に切っていくイメージです。
10日〜15日であれば2日〜3日が２割の期間に相当しますね。
その期間（10日〜15日）でやるべきことをリスト化し、優先順位ごとに並び替える。
できたリストの上から8割がそのままその期間にすべき8割の仕事量となります。

# 何すればいいの
1. 期限を10~15日になるまで分割する（期限が15日以下ならそのまま）
2. 分割した分だけ仕事も分割する（ここでは10日〜15日サイズになるはず）
3. 2を8割がわかる程度に分割しリスト化する
4. 優先順位をつける
5. 上から8割を把握する
6. 分割した期間の2割の期間をしる
7. 6で知った期間で5をこなす。

上記を繰り返すのみです。

# 終わりに
以上で仕事、タスクが終わらない理由、解決策、実践方法を見てきました。
実践できれば期限間近に徹夜しなくてすみそうじゃないですか？
1日サイズになったなら15分単位くらいのTodoリストにまとめてみてもいいと思います。
個人的にゲームみたいにこなしていけるのが楽しいです。
最後まで読んでいただきありがとうございます！
#1 Ruby始めました 「たのしいRuby 第６版」第一章 1−1 はじめてのRuby

Rubyを勉強して私のプログラム習得方法をブログに残していきます。
この記録と同じように学習すれば、同じような結果まで辿り着けることでしょうｗ
教科書「たのしいRuby 第６版」が素晴らしいので、本が素晴らしいと言うことでｗ

今までこんな親切な本見たことないくらい、素晴らしい社会に変貌していますので、20年前とはエライ違いで本当にいい時代ですね。

他でも役立つRuby書籍と知識
https://www.sejuku.net/blog/241

Ruby書籍と学習ガイド
https://magazine.rubyist.net/articles/0059/0059-Ruby-Rails-Beginners-Guide.html

一章は昨日、環境までとPrint文字表示なんで、そこはまあ飛ばして、変数、コメントからやりましょうｗ

しかし、バックスラッシュがmacで出せないｗ
altと¥で\出ましたｗ

それでは書いたものは、実際にどう処理されるのか処理系を使い学んで行きます。
https://tanoshiiruby.github.io/6/opal.html


#1−9 変数　P.39

```ruby
x = 1
y = 2
area = (x*y) / 2
```

・プリント＋変数は #{変数名}

```ruby
print "三角形の面積 = #{area}\n"
```

このEditor表示見たなものも優れものｗ
マウスでポイントするとちゃんと変数が分かります。
素晴らしい。


#1−10 コメントを書く P.42

＃のあとはコメントになりますので、自由にメモ帳としてテキストを残しておきます。
コメント履歴は本当に最重要です。

```ruby
# あとで修正するときに自分でわかるようにしておかないと全て忘れますｗ
# 絶対にコメントを残しましょう。
# 誰も触らないので、自分だけ分かればいいは辞めましょう。
# 誰が見ても分かる様に、そして修正しやすいように、絶対にコメントを残しましょう。

x = 1  # 高さ
y = 2  # 底辺
# 計算する
area = (x*y) / 2
# 出力する
print "三角形の面積 = #{area}\n"
```

#1−11 条件判断 if ~then ~end　P.43~45

もしそうならこう、trueなこう、Falseならこうみたいな条件文です。

then省略可能。

=は代入なので、

等しいは ==
小： ≧　は　=>
大： ≦　は　>=

if ~elseも同じ。
もしならこれ、elseならこれ。

```ruby
t = 800
if t >= 830
 Print "Good Morning\n"
else
 print "Sleeping\n"
end
```

t は 800
もし t が 830 より大きいなら
　Good Morning
違うなら
　Sleeping

こんな感じで分岐させて判断させて決めていくｗ
人間の実生活そのものですｗ


#1−12 繰り返し While　P.46

繰り返し処理。
do省略不可。

回数.times　繰り返し処理。


```ruby
t = 10
whlie t <= 1
 Print t, "\n" 
　t = t - 1
end
```
```ruby
t = 10
while t >= 1
 p t
 t = t - 1
end
```

教科書の逆のカウントダウンですｗ

Editorで色がつくとスペルミスがあると白くなるので、分かりやすいですね。
私は昔からテレコする癖があり、スペルテレコ、数字テレコ、分数テレコ、途中式でテレコ、はい 落第みたいなｗ
あと頭文字大文字注意ですかね。必ず小文字。あと全角、半角スペースも注意。

動作しないのはそういう記述ミスばかりですｗ


##コメント

１日目にしてプログラムの全貌が学べましたねｗ
これ以上のものはありませんｗ
ほぼこれだけで組み上がっていますｗ

これが凄い分かりやすいｗびっくりしまくりｗ
https://speakerdeck.com/machu/zerokarawakarurubychao-ru-men-falsebu-kifang?slide=7


あとはこの単純な文章を本当に緻密に組み上げていくことでコンピューターは判断してこうして、ああして、これしてとずっとやっている訳です。
そう考えると凄いことですねｗ
【Stereo Depth】AnyNet : 複数解像度でStereo Matchingを行う

<h1>Anytime Stereo Image Depth Estimation on Mobile Devices</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e87e78b8-3ae4-82f7-4a68-24a18f77b049.png)

2 stage Refinementならず4 stageのネットワークを作ったら良い感じだったらしい。

<h1>新規性</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/3b855bdf-db55-23c5-f704-07cc0b17014f.png)


<h2>U-Net Feature Extractor</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2439a215-8eb1-c9a9-788e-16cc28062c04.png)
Unetを使うことで同時に複数サイズのFeature Mapを得れるのね。賢い

<h2>Distance-Based Cost Volume</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5ddb727a-3b40-96ee-0e3f-5cb2c76b821e.png)
Cost Volumeを作る際はPSMneのようにConcatenationするか、Inner Productを取る方法が一般的であるが、Anynetでは差分を取っている。
個人的にInner Productの方が相関性が見えるから良いと思ったのだが。

恐らくInner Productをやっていないから、実験したら面白いかも。
計算コストは同じはずだし

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ba681f86-c1cc-f960-9de6-2eb0e9b49405.png)
かなり早い！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f05caa50-27d1-90ae-10ca-148294710a07.png)
PSMNetに比べて精度は劣っているがスピードが格段に早い

<h1>結論</h1>
・Real time systemに使いたいならAnyNetあり
Stereo Depthで初の精度のあるReal time system(10Hz)なのではないだろうか

<h1>参考文献</h1>
Anytime Stereo Image Depth Estimation on Mobile Devices
https://arxiv.org/pdf/1810.11408.pdf
AnacondaがインストールされたPCをゲットしたのでPythonに触れてみた

<h2>挨拶</h2>
こんにちは。HAAAAANと申します。
先日AnacondaがインストールされたPC(MAC)を入手しました。
Pythonにはノータッチでしたので何もわからず、
Anacondaって何やと言うところから調べて、簡単なPythonのコーディングを行いましたので、過程を書いて行こうかと思います。
（まだあまりよくわかってない）

<h2>環境</h2>
macOS
Anaconda
Spyder4.1.4


<h2>Anacondaって何</h2>
インストール済みでしたのであまり考える事はなかったのですが、
下記サイトを参照しました。

<a href="https://techacademy.jp/magazine/33341">Anaconda Navigatorを利用してPythonの開発をする方法を現役エンジニアが解説【初心者向け】<a>

Python開発において必要な環境がこれで揃うと言う解釈で良いかと思います。
おまけにGUIだから直感的にわかるので初心者に優しい（たぶん）


<h2>早速コーディングをしてみる</h2>
先述のAnacondaの中に搭載されているIDEの、”<b>Spyder</b>”を利用してみることにしました。
取り急ぎ、テストコードを実行してみようと思い基本的なコードの書き方を下記サイトで
学びました。

- <a href="https://qiita.com/Channel/items/cc15291c1ed626b8566d#two">Python3の標準入力のやり方一覧<a>
- <a href="https://qiita.com/Fendo181/items/a934e4f94021115efb2e">Python3基礎文法<a>

初心者が出力コードを書く際の"Hello World!"ですが、最近は湯婆婆のセリフを借りてきたものが流行っているようで、今回は下記サイトを参考に湯婆婆になってみました。

- <a href="https://qiita.com/Nemesis/items/c7192a7c510788d2cba2">Javaで湯婆婆を実装してみる</a>
- <a href="https://qiita.com/everylittle/items/aae58c241194c0e5f515">Python 3で湯婆婆を実装してみる</a>


<h2>コード</h2>
```Python:qiita.py

import random

class Yubaba():
    print("契約書だよ。そこに名前を書きな。") 
    yourname = input()  ##名前(文字)入力されたものをyournameに格納

    print("フン。「" + yourname + "」と言うのかい。贅沢な名だね。")        
    num = random.randint(0,len(yourname)-1)  ##0から入力文字数-1のうちのランダムな整数を返す。5文字なら0~4 
   
    print("今からお前の名前は「" + yourname[num] + "」だ。いいかい、「" + yourname[num] + "」だよ。分かったら返事をするんだ、「" + yourname[num] + "」!!")  ##yourname[num]は"yourname"に格納された文字列の"num"番目の文字を表す    

Yubaba()
```

<h3>結果</h3>
```Python:qiita.py
契約書だよ。そこに名前を書きな。

梶谷隆幸
フン。「梶谷隆幸」と言うのかい。贅沢な名だね。
今からお前の名前は「隆」だ。いいかい、「隆」だよ。分かったら返事をするんだ、「隆」!!
```


<h2>所感</h2>

温泉に入りたくなりました。
昔Javaを少しかじっており、最近はSwiftを勉強していたのでモダン言語って
すっきりかけていいなあと感じております・・・

出力文でさえ、「system.out.print」が「print」で済みますからね。
データ型宣言すらしなくていいし。
LINE WORKSとLINE、そしてチャットボットを連携した営業効率化

#はじめに

この度はじめてAdvent Calenderを書かせていただきます、[hachidori](https://hachidori.io/)と申します : )
hachidoriはLINE WORKS社の連携パートナー、LINE社のSales PartnerおよびTechnology Partnerのチャットボット開発企業です。

#LINE WORKS × チャットボットで業務効率化
さて、今年1年でかなり市民権を得た**「LINE WORKSとチャットボットの連携」**。
日報の提出や階層が深いファイルの呼び出しなど、様々な業務効率化用途に利用されるようになってきました。
![hachidori_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939877/97e73dcd-8027-d4cf-c006-1826e1f3b6c9.png)

#営業業務の効率化ニーズが増大
実は最近、業務効率化ニーズに加えて**「営業効率化」**用途でお問い合わせをいただくことが増えています。

- 「営業支援管理ツールとLINE WORKS、そしてチャットボットを連携したい」
- 「営業担当の負担を減らしたい」
- 「とにかくなんとか楽にならない？」.......

ご相談内容は幅広ですが、営業活動の効率化に課題を持っているお客様は多い様子。

このAdvent Calendarでは、あまり知られていない**「LINEとLINE WORKSとチャットボットの連携でできる営業効率化」**について書かせていただきます！

#「LINE WORKS × LINE × チャットボット」

「LINE WORKS × LINE × チャットボット」連携は、ざっくりと言うと
**「LINEで定型質問に自動応答→必要な時にだけLINE WORKSで営業担当者などの人的対応にバトンタッチすることができる機能」**です。

例えば、営業活動を行う上で、まだ関係値ができていないお客様はいきなり営業マンのLWとつながることに抵抗があることが多いです。
また、抵抗がなかった場合は、チャットツールのカジュアルさゆえ質問しやすく営業マンの負担が大きくなりがちです。
![スクリーンショット 2020-12-09 10.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939877/fc97f2b9-7e5f-e591-548c-2f532e103aad.png)



これを解決するのが本連携です！

お客様にはまずLINEの公式アカウントとつながっていただき、チャットボットがよくある質問に自動回答。
温度感が高くなった際のみLINE WORKSで営業担当に連絡することができるようになります。
![スクリーンショット 2020-12-09 9.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939877/83af7f8a-9096-d82f-5c97-368cd0fe3eed.png)


- **心理的障壁による顧客の離脱防止**
- **営業マンの負担の大幅軽減**

いずれもを叶えられるのが本連携の魅力です。
![スクリーンショット 2020-12-09 10.50.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939877/80803ce7-8669-bcc6-0c55-a24ae677563f.png)



#おわりに

今回はあまり知られていない連携機能についてを紹介させていただきました。
お客様も営業マンにも、どちらにもプラスになる機能なので、是非多くの方に知っていただけたらとっても嬉しいです！

来年も皆様にとって良い1年となりますように。

[hachidori](https://hachidori.io/)
<br>
IntelliJ IDEA 2020.3 (Community Edition) でLombokプラグインの不具合によりビルドエラー

2020/01/05 追記
EARLY ACCESS版をインストールすることで問題は解決しました。
https://confluence.jetbrains.com/display/IDEADEV/IDEA+2020.3+latest+builds

EARLY ACCESS版で不具合が解決したバージョン

```
IntelliJ IDEA 2020.3.1 (Community Edition)
Build #IC-203.6682.168, built on December 29, 2020
Runtime version: 11.0.9.1+11-b1145.63 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 1964M
Cores: 12
Registry: scala.erase.compiler.process.jdk.once=false
Non-Bundled Plugins: org.intellij.scala
```

2020/12/11 11:00 追記
~~LombockプラグインのGithub issue を見たら、現在不具合対応中とのこと。~~
~~回避策が分かったら追記します。~~
バグの修正は完了して、バージョン `203.6565` でリリースされるとのことです。
https://youtrack.jetbrains.com/issue/IDEA-257311

色々やってみましたがうまくいかなかったのでダウングレードして、リリースを待ちます。


## IntelliJ IDEA の詳細バージョン(不具合発生時)

```
IntelliJ IDEA 2020.3 (Community Edition)
Build #IC-203.5981.155, built on December 1, 2020
ランタイム・バージョン: 11.0.9+11-b1145.21 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows Server 2016 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 2023M
Cores: 3
Registry: scala.erase.compiler.process.jdk.once=false
Non-Bundled Plugins: com.potniype4kin.intellij-textile, de.netnexus.camelcaseplugin, Lombook Plugin, org.intellij.scala, com.github.tomasmilata.intelliroutes
```

## IDEAのビルドエラーメッセージ

Lombokを使用している箇所で以下のエラーメッセージが表示されます。（日本語化済み）

```
java: シンボルを見つけられません
```
【Java】プリミティブ型

# Javaのプリミティブ型

についてまとめました。

## プリミティブ型とは

簡単にまとめると

- **Javaのデータ型の一つ**
- **Javaのいわゆる基本な型のことで、値型とも言う**
- **メモリのスタック領域に値が入っている**

## 【説明】

Javaではプログラム中の全ての変数は使用する前に以下のように宣言が必要になります。

```java
データ型 変数名 = 値;
```

変数の宣言時にはデータが保有する値のデータ型を指定してあげます。

## 【特徴 / メリット】

全部で8種類あります。

ビット数が大きいほど表現できる範囲は広い


| 種類         | 型名    | 扱える範囲                                              | 
| ------------ | ------- | ------------------------------------------------------- | 
| 整数型       | int     | -2147483648 ～ 2147483647 までの整数                    | 
| 文字列クラス | String  | "Java"、"自分"、"Mac" などの複数の文字                  | 
| 浮動小数点型 | double  | ± 1.8 × 10308 ～ ± 3.4 × 10 - 324 さらに細かい数字      | 
| 論理型       | boolean | true ( 真 ) or false ( 偽 ) 真偽知                      | 
| 文字型       | char    | "あ" 、 "虹" などの一文字の文字列                       | 
| 整数型       | short   | -32768 ~ 32767 までの整数                               | 
| 整数型       | long    | -92223372036854775808 ～ 9223372036854775807 までの整数 | 
| 整数型       | byte    | -128 ～ 127 までの整数                                  | 
| 浮動小数点型 | float   | ± 3.4 × 1039 ～ ± 1.4 × 10 - 45 細かい数字              | 


## 【まとめ】

値の範囲については覚えなくてもいいという意見があったのであえてここでは載せませんでしたが、Silverでは名前の引っ掛け問題などがありそうなので、データ型の名前と格納できる値は必ず覚えておきましょう。

## 参考文献・記事

- [徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=pd_lpo_14_img_0/356-5238196-1895250?_encoding=UTF8&pd_rd_i=4295007625&pd_rd_r=1c21865b-a9fe-43e8-ac01-46170e44abca&pd_rd_w=9El0Q&pd_rd_wg=hh5Hc&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=72AVH18EM90CKG00CH5W&psc=1&refRID=72AVH18EM90CKG00CH5W)

[https://techacademy.jp/magazine/22653](https://techacademy.jp/magazine/22653)
PG BATTLE 2020参戦記 ～チーム結成法、注意点、作戦など～

# はじめに
[フューチャー Advent Calendar 2020](https://qiita.com/advent-calendar/2020/future) の11日目の記事です。
今年の４月に新卒で入社し、FutureのTechnology Innovation Group（TIG）に所属しています。仁木です。普段は土日に競技プログラミングのコンテストに参加したり、会社の競技プログラミング部に所属して[バチャコンを開いたり](https://note.future.co.jp/n/nda51c959f75a "Future未来報：入社１か月の新人が競技プログラミングのバーチャルコンテストを企画するまで")しています。

本記事では、10/24に行われた[PG BATTLE 2020](https://products.sint.co.jp/pg_battle)で社内で３人一組の２チームで参加してきたので、チームができるまでや事前に立てた作戦、当日参加した個人の感想を共有できればと思います！２チームで参加し、１６位と１９位でした。

#PGBattleとは
毎年秋ごろに開催される**競技プログラミングのチーム戦**です。決まった時間にオンラインで問題が配信され、９０分で問題セットを解き、チームの合計点数を競うというものでした。
同じ学校や会社の人で、１チーム３名を作り、３人がマシュマロ、せんべい、かつおぶしという難易度の問題セットに分かれて解く戦いでした。誰がどの難易度のセットを解くかは事前に決めておいて、会当日はチーム間で相談禁止というルールでした。

#参加を決めるまで
競技プログラミング部の先輩部員が去年、一昨年と参加していて、部内で今年も開催されるという先輩の投稿を見たのがきっかけでした。私ははじめ投稿を見たときはチームで足を引っ張ってしまうかもと思って手を挙げなかったのですが、先に手を挙げていた方々がゆるいチームでやりましょうという雰囲気だったので、参加してみたい気持ちが勝ち、手を挙げて参加してみることにしました。

#チームでやったこと
申込とチーム作り、作戦会議についてお話しします。
参加すると手を挙げたのは４月新卒４名、７月新卒１名、８月キャリア入社１名でした。キャリアの方は同じく競技プログラミング部の部員さんでしたが、ほぼ初めましての方だったので、申込やチーム作りではハングアウトを利用してお互いの自己紹介やレートを確認することから始まりました。

##申込とチーム作り
当時の申し込み期間は7/10~10/11(その後10/20へ延長されました)だったのですが、締め切りぎりぎりの金曜日にHangoutsに集まっで申込とチーム作りをしました。

**チーム決めはまずレート順で並べて、上から２名ずつをかつおぶし、せんべい、マシュマロの順番で割り当てる方法で決めていきました。**　その後、直近のコンテストに参加しているかどうかで少し順番をかえたりしました。
私は一番下だったので、マシュマロを解くことになりました。（チームの足を引っ張りたくないのでとてもやる気になったのを覚えています。）
申請では、Hangoutsで会話しながら登録したため、メールアドレスなど必要な情報をスムーズに埋めることができました。初対面の人もいたので、チーム名を決めるのが一番難しかったです。

当日は以下のチーム名で参加しました。私はHello Future World!チームで参加しました。Osaki Chopstick 🥢illageは、[OCV(Osaki Code Village)](https://twitter.com/future_ocv "公式Twitterはこちら")という競技プログラミング部の名前をもじっています。お箸の絵文字は当社のロゴと似ているので好んで使われています笑

 * Hello Future World!
 * Osaki Chopstick 🥢illage

##作戦会議
６名中５名が初参加だったので、参加前に、それぞれ調べたことで情報共有会しようという話になりました。当日はTOPSICというプログラミング判定サービスを利用して提出するため、事前に用意された練習問題を解いて慣れておくことや、過去問を解いてきての所感などを共有しました。

特に**TOPSICの使い方を調べておけたのが良かった**です。注意点は以下でした

 * 一つの問題が解けたら**保存ボタンを押す**
 * すべての問題に挑戦し終わるまで**最終提出しない**
 * **最終提出は一度きり**なので、ボタンを押す前にコーナーケースをよく確認する
 * 時間以内に解けないと判断した場合はすぐ最終提出する　
* **チームが同点の時は最終提出するまでの時間が短いチームが上位になる**ため
* 正確さ、解けるかどうかの見極めも重要でした
 * （参加後に気づいたこと）回答時間は１００分オープンしている中での９０分だったようです


#自分でやったこと
私は一番簡単なマシュマロの問題セットを担当しました。過去問を見る限り、４問あるなかで、最初の３問は問題なく解けそうでした。昨年の同セットの最終問題が難しかったことと、申込が遅かったのであまり時間がなかったことがあり、**過去問に関連する分野に絞って学習・復習**しました。見事、去年と同じダイクストラ法の考え方で解ける問題が４問目に出てきたので当日は全問正解することができました！

参考にしたページを載せておきます。

 * 2018年過去参戦記事→ https://future-architect.github.io/articles/20190513/
 * 2019年過去問ページ→ https://products.sint.co.jp/q_list

最終問題の傾向アルゴリズムを復習し、**当日使えそうなクラスをすぐ参照できるようにスニペット化**しておきました。私の学習した内容は以下です。

 * bit DP, 半分全列挙
 * ダイクストラ法, 経路復元

#感想＆来年は一緒にぜひ
チーム名決めや結果発表などで社内の人とわいわい出来たので、手を挙げて参加してよかったなと思っています！普段参加しているコンテストでは全完より先に時間が来てしまうので、全部解き終わって最終提出ボタンを押してゆっくりする時間ができたのが新鮮でした笑　

PG BATTLEならではの面白さもあり、**『自分が提出したコードが全部のテストケースを通っているか』の結果がわかるのが提出後数時間後**でドキドキしながら待つところや、解説放送を見ながらTwitterで参加者と一緒に盛り上がったり、チームの人と結果発表をみて盛り上がったりできたのが楽しかったです。

当社の競技プログラミング部の部員さんはフランクに質問できたり、イベント情報を流してくれます。
私も一員として、バチャコンを企画したり、部内でHTTFの振り返り会でアルゴリズムの解説をしてみたりしています。一緒にわいわい楽しめたらいいと思っていますので、ご縁があればぜひ一緒にやりましょー
indexOf を非表示にする方法

今回はmixhostをレンタルしている人にむけて、indexOfを非表示にする方法を紹介したいと思います。 
##原因
なぜindexOfが表示されてしまうかとそのディレクトリに表示するページがないからです。

もし、表示するべきページがあればそのページに飛ぶのですが、表示するべきページがないため、内部構造が丸見えになってしまうindexOfが表示されてしまうのです。
また、indexOfが見えてしまうのはサイトの脆弱性を露呈していることにもつながります。

勿論すでに表示するべきページができているのであれば、それをサーバーにアップロードすれば良いのですが、開発途中であったり、ドメインを取得したばかりだとそのようにはいきません。
そのため、今回はまだそのドメインで開発途中の方向けの内容となっております。

##万能な方法
###.htaccessを用いる
.htaccessはそのサイトの設定に関わるような重要な記述が書かれています。
そこに何らかの設定を加えることでindexOfも非表示にできるという考え方です。

具体的には

```:.htaccess
Options -Indexes
```
という記述を加えた.htaccessをindexOfが表示されてしまうディレクトリにアップロードします。
そうすると403エラーが表示され、アクセスが制限されます。

記述を加える場所は一番最後で大丈夫です。元々ある.htaccessを利用する場合他の記述を消さないように気をつけてください。

ちなみにwordpressだと`wp-content/uploads`の中に.htaccessはございます。

.htaccessは重要な設定が書かれていることが多いので、FTPソフトを用いてローカル内にバックアップを残してから行うことをおすすめします。

##簡単な方法（mixhost対象）
mixhostを利用している人は管理画面からこの設定を変更することができます。

まず、mixhostのコントロールパネル(Cpanel)に移動してください。
そうすると、「詳細」の中に「インデックス」の欄があると思います。そこをクリックしてください。

その中に public_htmlというディレクトリがあります。そこの右側の「編集」ボタンを押すと、4つの選択肢が出るのでそこで「インデックスなし」を選択すると同じ設定にできます。

まとめるとこうです。
**Cpanel→詳細→インデックス→public_htmlディレクトリ→編集→インデックスなしを選択**

これで.htaccessで設定したようにindexOfにアクセス制限ができます。
この方法の場合.htaccessファイルのバックアップを取らず、記述の変更をするという手間がないので楽です。
2021年3月までにPython3エンジニア認定基礎試験を受験します！

2021年3月までにPython3エンジニア認定基礎試験を受けたい．
Python3エンジニア認定基礎試験とは，基本的なPythonのエンジニアリングスキルを測る民間の資格試験．
サードパーティが公開している模擬試験を受験してみたが，単なるコーディング以上に，インタプリタ等一般的な基礎知識も問われていた．
自分はコーディングはできるが，こうした一般的な知識の勉強をしたことはなかったため，これを良い機会としてしっかりと勉強に取り組みたい．
SCD30からI2Cで取得したデータが0xdd埋めになる

# 結論
読出し時にクロックストレッチ分ウェイトが必要
SCD30なら30ms(150ms)待機しないと正常なデータが取得できない

>読み込みコマンドのアドレス部分送信
↓
クロックストレッチ(30ms)分ウェイト
↓
読み込みコマンドのコマンド部分送信
↓
3ms以上のウェイト
↓
I2Cから読出し


みたいな流れで正常データが取得できた

<a id="#DATASHEET"></a>
# データシート
- [SCD3x データシート](https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/9.5_CO2/Sensirion_CO2_Sensors_SCD30_Interface_Description.pdf)
【responder】http通信で音声ファイルを送受信する

## これは何
ローカルにある.wavファイルをリモート のサーバーにhttpで送信したい。
そのサンプル用に作ったファイルの紹介です。

## プログラムとしては何をしているの？
音声ファイルをhttpで送信するには、base64でバイナリに変換してから送る方法があるそうです。

## リクエスト側

```py
import base64
import requests


def post_file():
    url = "http://localhost:5042"
    file_name = 'sample.wav'

    with open(file_name, 'rb') as f:
        data = f.read()

    data_bytes = base64.b64encode(data)
    files = {'file': data_bytes}

    requests.post(url, data=files)


if __name__ == '__main__':
    post_file()
```


## ホスト側

```py
import base64
import responder

api = responder.API()


@api.route("/")
async def on_post(req, resp):
    data = await req.media()
    data_bytes = base64.b64decode(data['file'].encode())

    with open("wav_file.wav", 'bw') as f:
        f.write(data_bytes)


if __name__ == '__main__':
    api.run()
```
macOS Mojave 上のSafari バージョン14.0.1 (14610.2.11.51.10) で input type="file"が動かない

# 現象

macOS Mojave 上のSafari バージョン14.0.1 で

```
<input type="file">
```

が動作しなくなっています。

# 報告

https://discussionsjapan.apple.com/thread/252057820

https://discussions.apple.com/thread/252073152

# 原因

Safariのバグが原因のようです。どうやらファイルへのアクセス権限周りのバグの模様。

Catalinaでは動いているようです。

# 対策

https://stackoverflow.com/questions/64843459/input-type-file-on-html-form-not-working-on-safari-version-14-0-1-14610-2-11-51

## 解決策1

Safariに対してフルディスクアクセスの権限を与えることで解決した、という報告もあるようですが、僕の環境ではなおりませんでした。

## 解決策2

```
<input type="file" accept=".xls,.xlsx,.xlsb,.txt,.csv,.tsv"/>
```

のようにしてaccept属性を追加することで解決した、という報告がありました。

手元の環境で試してみたところ動作するようでした。

とりあえず全部のファイルを許可するのであれば、以下のようにしてワイルドカードで許可すればよいのかもしれません。


```
<input type="file" accept="*"/>
```

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers


html的に意味があるのか、と言われればないと思うので、あくまで今回のバグ回避用かなとは思いますが。。。
Unity手抜きミニマップの作り方

Unityでゲーム作った時、ミニマップをコード書かずに実装できて興奮したので、書きました。

###ステージ作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/edd9e531-c6f8-5dac-613c-47e2ad0aec7a.png)

###上からステージ全体が移るようなカメラを一個置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/3ce69146-2213-bc5d-95ef-db2402482b4d.png)

カメラの設定はこう。数値は要調整
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/b8b23429-cbe7-cacf-54bc-f613d3a43c42.png)


###RenderTexture作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/103aa749-cdc6-6f7f-d37b-f0b0932b14cd.png)

RenderTextureの設定は今回はこう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/a7beb7e5-ca95-d890-860a-de3a46730daa.png)

###CanvasにRaw Imageを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/d2138d13-aa50-d5da-1ded-c41122418073.png)

###Raw Imageに作ったRenderTextureをアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/dec132a6-c620-21dd-369b-828b97dd61a1.png)

###さっき作ったミニマップ用のカメラにもRenderTextureをアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/a55d060a-38c4-2d73-13b5-ec17688fd322.png)

###プレイヤー・敵に、ミニマップに移るようなものを装着（超邪道）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266584/6c376ede-780b-f98b-4011-3662bd73ff18.png)

###完成
![image.gif](https://i.gyazo.com/ef4bebbead46857c9ca3aea16a49ac46.gif)

###課題
・レンガのテクスチャなど、マップは映す必要はなさそう
・もちろんミニマップに、3Dモデルも移ってることになるので、この〇と△だけが移るようにしなくてはいけない
・ミニマップも回転する（プレイヤー視点のミニマップにする）となると、これでは通用しなくなる

###参考
Unityでゲームを作ろう！ ミニマップの作り方1
・https://unity.moon-bear.com/unitychan-coin/minimap/

大変参考になりました。ありがとうございました。
JSTQB Advanced Levelに敗北したお話

いやー難しかった！！！
悔しい(T^T) くぅぅ～

今回は今年2月に開催したJSTQB Advanced Levelを受験して感じたこと、もっとこうすれば良かったなーと思ったことを自分の戒めとして記事にしようと思います（かなり落ち込みました。。。）
これから受験する人の手助けになれば幸いです。

#JSTQB Advanced Levelとは
JSTQBとは「 Japan Software Testing Qualifications Board」の略称であり、日本におけるソフトウェアテスト技術者資格の運営組織です。
要は、ソフトウェアテストに関する知識を認定する資格の事です。
JSTQBについてもっと知りたい方はこちらをご確認ください。
http://jstqb.jp/index.html

※受験するきっかけはこちらの記事に記載しておりますのでご一読ください！
https://qiita.com/iki122/items/991480c3572362065d33

#受験してみて感じたこと
受けてみての率直な感想は「むっず。。。」でした。

まず一つ言えるのは圧倒的に勉強が足りていなかったことが挙げられます。
FLの時はシラバスの用語を覚えることを中心にやっていてどちらかというと広く浅く勉強していました。
ALもFLと同じように広く浅く勉強していてまんべんなく漏れがないようにやっていたことがあまり良くなかったのかなと思います。
そもそもテスト技法を実用できるレベルまで達していなかったことも大きな要因でした。

要因にもある通り、ALは事例系問題がメインでテスト技法を実際に使えるかどうかがポイントになってくるので広く浅くやるのではなく一つの議題をより深堀っていくことが重要なのかなと感じました。
また、知らないテスト技法がないようにシラバスに出てくる技法の使い方まで調べておいて理解を深めておくこともかなり効果的だと思います。
ユーザーストーリー系の問題が想像以上に多く、あまり勉強していなかったので苦戦しました。

#次回に向けて
受験してみて感じたことにも記載ある通り、テスト技法を実用できるレベルに達していなかったのでシラバスだけでなく他の参考書なども読みながら勉強していきたいと思います。
また、シラバスでは各章ごとにかける時間が違うので優先度をつけて勉強するといい結果につながりやすくなるのかもしれません。

##勉強の優先順位
1章 テストプロセス – 300 分
2章 テストマネジメント： テストアナリストの責任- 90 分
3章 テスト技法 – 825 分
4章 ソフトウェア品質特性のテスト - 120 分
5章 レビュー - 165 分
6章 欠陥マネジメント – 120 分
7章 テストツール – 45 分

個人的に勉強しておけばよかったと思う優先度順は3章→1章→5章→4章、6章→2章→7章になります。
※シラバス準拠
http://jstqb.jp/syllabus.html

##必須と思うテスト技法
特にテスト技法は自分で扱えるようにしておいた方がいいと思うので
必須で覚えておいた方がいいテスト技法を一部紹介したいと思います。
###同値分割法
　・システム/ソフトウェアへの入力データを「同じ処理が行われる」と想定したパーティションに振り分ける
　・パーティション内のデータは、システム/ソフトウェアで同じ処理が行われるため、同じものとみなせる
　・パーティション内の代表的なデータでテストをすれば、同じパーティション内の他のデータもテストしたものとみなすことができる
![同値分割法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541094/a4f2f35e-6f72-1018-3774-4aabe5692b86.png)


###境界値分析
　・同値パーティションの境界上の値に対する多くの欠陥が潜んでいる。それを効率よく検出するための技法
![境界値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541094/769bcb30-1842-a3ac-f537-39c55eb293fe.png)


###デシジョンテーブルテスト
　・デシジョンテーブルの規則(入力条件の組み合わせに対する結果)を用いて、テストケースを設計する
　・入力データや入力条件に対する出力結果(処理や動作)を表にまとめたもの
　・複雑な論理を把握するのに効果的
![6809551-47ca8b9aa250ce37b70628a17f8fb6717cab71a8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541094/9aad0a2c-497f-f043-84a4-89acfa9b42fc.png)


###状態遷移
　・状態遷移テストは、状態遷移図/状態遷移表を用いてテストケースを設計する
状態遷移図
　・状態が遷移する様子を図に書いて図形や矢印などのビジュアルで表現したもの
　・システムが持つ状態の種類、システムの開始/終了、状態間の遷移が表現される
　・状態遷移図は、無効な遷移を除外し、有効な遷移のみを表現する
![状態遷移.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541094/ce7ac891-e08c-7750-2893-35582abbeabc.png)

###ユースケーステスト
　・ユースケース記述(ビジネスシナリオやシステムの使い方)に基づいてテストケースを設計
　・ユースケースとは、アクター(ユーザーや他のシステム)とサブジェクト(テスト対象のシステム/ソフトウェア)の相互作用を記述したもの

他にもホワイトボックステスト技法や経験値ベースのテスト技法が存在します。
特に3章のテスト技法については時間が多く設定されているので、
シラバスに記載ある技法を列挙してみて勉強の比重を整理してみるのもいいかもしれません。

#まとめ
振り返ってみてやはり勉強時間が足りなかったことが今回の一番の敗因なのかなと思います。
シラバスもかなり量があるので上記のように優先度を付けて勉強していき、
特に3章のテスト技法だけで体感3分の1以上は出題されていた気がするので重点的に復習していきます。
参考書の練習問題や模試などを解いて、自分の弱点を知り、補っていけるようにしていきたいと思います。
ほんとは「合格しました！！」で記事書きたいと思っていましたが、
今回は敗北してしまったので素直に受け止めて合格したときに改めて報告できればと思います。
TensorFlowJs で笑顔じゃないと使えないSNS作ってみた

昨日９日目は@wintia さんの AzureKinectで肩乗りペットでしたね。
あなたもクソは肩に乗せましたか？

くそは肩に乗せてたまま、10日目に参りましょう！

## みなさんのSNSはポジティブな投稿で溢れてますか？

さて突然ですが、みなさんのSNSはポジティブな投稿で溢れてますか？

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Twitterでは、ユーザーが前向きなつぶやきをする直前のタイムラインにはポジティブなツイートのほうが4%多く、ネガティブな投稿の前のタイムラインには、4%ネガティブな投稿が多い可能性が高い、という研究について読んだ。<br><br>前向きな投稿をし続けると、Twitter全体が明るくなるかもですね。</p>&mdash; けんすう@マンガサービスのアル (@kensuu) <a href="https://twitter.com/kensuu/status/1332470575575429121?ref_src=twsrc%5Etfw">November 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ポジティブのタイムラインになるのであれば、ポジティブになれるらしいんですよ！

僕がポジティブじゃなくなったら、僕のせいじゃなくて、タイムラインのせいじゃん！！

ポジティブタイムラインのSNSを使いたいですよね！

どうしたら、、ポジティブにな投稿を、、ってことで見つけたアイデアはこちら。（FBの埋め込み方法わからぬ）
https://www.facebook.com/1047637624/videos/10221576486775332/


笑顔にならないと開かない扉！なるほど。これだ！

笑顔で、ネガティブなこと、投稿できるやつおらんでしょ？！

というわけで

## 今回作ったクソアプリ

↓↓↓↓↓↓↓↓↓↓↓
https://emoemo.netlify.app/
↑↑↑↑↑↑↑↑↑↑↑
ロード最適化してないから、クソ重いよ！w

![127.0.0.1_5500_index.html(iPhone 6_7_8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6531/f1d45c16-f4a1-7958-e4ab-7b890a2ffde4.png)

悲しい顔や、ビビった顔すると、薄くなって SNSは見れないし、投稿もできません！
![Screen Shot 2020-12-10 at 14.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6531/2e81b63a-7755-a606-64aa-4737a5678b44.png)

みんな笑顔で投稿するんだ！

## 技術的なお話
レポジトリ
https://github.com/yahsan2/emoemo

### 笑顔の判定
基本的にはこちらの記事を参考に vue に置き換えてつくっています。
github にコードも公開されていて非常に勉強になりました。
https://book.mynavi.jp/manatee/detail/id=99887

ですので、モデル自体はこの中の記事で紹介されている
> 感情認識の学習済みモデルは公開レポジトリoarriaga/face_classification - GitHub 

を利用していますし、さらに TensorFlowJS が読み込み可能な形にコンバートされたモデルとして利用させていただいてます。
https://github.com/PonDad/manatee/tree/master/2_emotion_recognition-master

ですので、学習自体はやってない！モデルがすでにあるものを使うとめちゃくちゃ楽チンですね。

こんな感じで 感情のデータが返ってくるので、あとは probability 利用して、opacity などを調整してます。

``` js
      let prediction = await this.model.predict(tensor).data();
      this.results = Array.from(prediction).map((p,i)=>{
        return {
            probability: p,
            color: COLORS[i],
            emoji: EMOJIS[i],
            className: CLASSES[i],
            classNumber: i
        };
      }).sort((a,b)=>{
          return b.probability - a.probability;
      }).slice(0,6);
```

詳細はコードを見たらわかると思うよ！

### firebase 
で作ってます。よく巷に溢れてやつ。

詳細はコードを見たらわかると思うよ！

### その他
フレームワーク: https://vuetifyjs.com/en/
vue で俊足で作るなら楽チンなので利用するが、今回はあんま意味なかった気もする。

アバター: https://avataaars.com
クソアプリですし、ログインをさせるのもめんどいと思い、とはいえ違う人感を出したかったので、ランダムで作成。

名前：くそアプリですし、ログインさせるのも、名前書くのもめんどいと思い、３匹のこぶた形式でランダム作成

```js
        name: function() {
          const sizes = ['こ', 'おお', '']
          const animals = ['クマ', 'ネコ', 'ブタ','ネズミ','イヌ','ゾウ','キリン', 'タヌキ', '炭治郎']

          const animal = animals[Math.floor(Math.random() * animals.length)];
          const size = sizes[Math.floor(Math.random() * sizes.length)];
          const count = Math.floor(Math.random() * 10) + 1
          return `${count} 匹の${size}${animal}さん`
        }()
```
詳細はコードを見たらわかると思うよ！

## まとめ
アドベントカレンダー間に合わないので、雑な技術的説明 de とりあえず公開！w
何か気になるところ教えて欲しいことあれば返事するので、twitter かコメントで教えてください

皆さんも笑顔で、ハッピーなクソアプリライフを！
明日も楽しみですね！
Elmしか知らない駆け出しエンジニアが伝えたいElmへの愛。

# Elm…愛してます。
こんにちは、僕は2020年の4月からElmからエンジニアのキャリアをスタートさせました。
かれこれ8ヶ月がたった今、ぴーぴー（わからへんー！:confounded:）って泣きながら手を動かしていた赤ちゃんレベルから、ようやくよちよち歩きをしながら毎日開発しております。
###**そんな僕はElmが大好きです。**
右も左もわからないあの日から、共に歩いてきました。
Elmは特にバージョンも変わってないので、歩いてたのは僕だけというガチレスは凹みます:zipper_mouth:

今日は**Elmの愛おしい部分**を語らせてください。
Elm愛を語るにはとんだ若造で恐縮なのですが、いかんせん僕はElmしか知らないのです。
(知らないと言うと語弊がありますが、実務で使える技術とは程遠いです）

なので、説明として間違っていることもあるかもしれません、感覚的で、抽象的な説明が多くなってしまうかもしれません。:bow_tone1:
それでも、恥を忍んで皆さんにElmの楽しさや面白さをできるだけ言語化し、お伝えしたいなと思うのです。

# 知ってほしい「Elmの、ここが愛らしいんだって。」
### 1. 厳しさと優しさを兼ね備えた、信頼できるイイヤツ。
Elmは何に厳しいって、**「型」**にめちゃくちゃ厳しいです。いわゆる静的型付け言語に分類されていて、いかなる例外を許さない、なんともストイックな言語です。Elmの公式HPでも、「[実行時エラーは起きない(No Runtime Exceptions)](https://elm-lang.org/)」と明言し、特徴の第一個目に書いてあるくらいです。なんとも心強いですね。実際、僕の開発経験上コンパイル時に必ずElmのエラーに関しては検出してくれます。

それに、厳しいだけじゃないんです！実はすごく優しい部分も持っていて、コンパイル時のエラーメッセージが実に丁寧です。「ここの型とあそこの型が合ってないよー！こんな風に直してね！」くらいのテンションで教えてくれるのです。

「Elmってマイナーだし、とっつきにくそう…」って始めは思ってたのですが、個人的には、**このコンパイルエラー時の優しさがあるからこそ初心者にElmを勧めたい**くらいです。

### 2. 洗練されている（気がする）。
これは感覚的な部分にも近いかもしれません。なので、少し具体的にElmの数ある特徴の中でも僕が好きなカスタム型を紹介させてください。Elmには**カスタム型**といって我々の手によって”型”を定義することができる特徴を有しています。（他の言語でも類似のものはあるそうですね！）

例えば、カスタムタイプを使えば「メッセージの送信ステータス」というのを表現する必要があるとき、

```elm
type alias Model = 
    { sendMessageStatus : SendMessageStatus
    }

type SendMssageStatus 
    = ReadyToSend String
    | Sending
    | Sent
```
こんな風に表現することができます。
昔の僕はこんなに不格好な書き方をしていてElmの特徴を全然活かしきれていませんでした。(レビューで恥ずかしい思いをしたと同時に、めちゃくちゃ感動した覚えがあります。)

```elm
type alias Model =
    { messageToSend : String
    , isSending : Bool
    , isSent : Bool
    }
```
これだと、事実上ありえない状態(**isSendingとisSentが同時にTrueになることはないはず！**)が作れてしまうのでElm的にはナンセンスなModel設計なのです。いやーElm...かっこいいですね。


### 3. まだあまり注目されていない大物感。
Elmってまだまだ知名度低いなと感じます、ぶっちゃけ。社外のエンジニアの友人とかに「Elmで開発してるよ！」とかいっても、「Elm...はて？聞いたことはある気が...」くらいなことが多かったりするんです。おまけに、海外のとある記事によると、[*「2019年に今一番学ばないほうがいい開発言語で1位」*](https://www.codementor.io/blog/worst-languages-2019-6mvbfg3w9x)を獲得してしまう始末。
「Elmは思ってるより悪くねーよ！！」と浅はかな僕は、ノーロジックで感情的に叫びたくもなりますが、そう思われているのも事実です。

でもなんだかそんな知名度の低さや人気の無さが嬉しかったりする気持ちもあるんです。「なんだかElmは一味違う。わかる人にはわかる。」そういった玄人好みの雰囲気を醸し出してくれている気がするのです。
みんながみんな、いいよ！最高だよ！っていうモノとか映画とかって逆に惹かれなかったりしませんか？笑　今でこそ大人気ですが、きっと初期のテスラも邪道と見られていたはずです。**「今に見てろよ！Elmはビッグになるからな。」**って、根拠もないのになんかそんな感じです。

## もっともっと魅力があります！
今この記事は僕の背伸びしていない等身大で伝えられるElmの精一杯です。正直に言って、まだまだ浅いです。Elmの奥深さはこんなもんではありません！正直悔しい！ 

[弊社](https://www.fringe81.com/)にはElmに精通した、本当に尊敬できるメンバーが沢山います。**週に一回は”びわ会”という名で社内勉強会も開催しています。**そんなメンバーと切磋琢磨しながらこれからも精進していきます。:fire:

## あとがき
改めて8ヶ月間を振り返って、自分が「Elmとどう向き合ってきたかな？どんな思いを持ってたかな？」というのを整理してこの記事を書きました。
ここまで、すごくポジティブに書きましたが、実際のところ未経験からエンジニアにキャリアチェンジをして、開発を始めた頃は七転八倒で、何度も開発に苦しんでいたのも事実です。幾度となく思い通りに行かない悔しさや、わからないことに対するフラストレーションを溜めてばかりでした。その度に周りに助けられました（感謝）。またそんな話も記事にしようかな。

おわり