OmniAICreator/Qiita-1.07M huggingface dataset:
AOSP system/btでEclipse IDEを使う(中途半端）

--
README.mdより。
### Eclipse IDE Support

1. Follows the Chromium project
 [Eclipse Setup Instructions](https://chromium.googlesource.com/chromium/src.git/+/master/docs/linux/eclipse_dev.md)
 until "Optional: Building inside Eclipse" section (don't do that section, we
 will set it up differently)

2. Generate Eclipse settings:

  ```sh
  cd system/bt
  gn gen --ide=eclipse out/Default
  ```

3. In Eclipse, do File->Import->C/C++->C/C++ Project Settings, choose the XML
 location under system/bt/out/Default

4. Right click on the project. Go to Preferences->C/C++ Build->Builder Settings.
 Uncheck "Use default build command", but instead using "ninja -C out/Default"

5. Goto Behaviour tab, change clean command to "-t clean"
--

以下に従って作業開始。
https://chromium.googlesource.com/chromium/src.git/+/master/docs/linux/eclipse_dev.md

eclipse-inst-linux64.tar.gzをダウンロード
$ tar xvzf eclipse-inst-linux64.tar.gz
$ cd clipse-installer
$ gedit ./eclipse-inst.ini
ファイル名が違うけど多分これ。
-Xms256M　-> -Xms1024M
-Xmx1024M -> -Xmx3072M

$ ./eclipse-inst
 -> JREかJDKが必要とエラーになった。

$ java 

コマンド 'java' が見つかりません。次の方法でインストールできます:

sudo apt install default-jre              # version 2:1.11-72, or
sudo apt install openjdk-11-jre-headless  # version 11.0.8+10-0ubuntu1~20.04
sudo apt install openjdk-13-jre-headless  # version 13.0.3+3-1ubuntu2
sudo apt install openjdk-14-jre-headless  # version 14.0.1+7-1ubuntu1
sudo apt install openjdk-8-jre-headless   # version 8u265-b01-0ubuntu2~20.04

$ sudo apt install openjdk-14-jre-headless 

$ ./eclipse-inst
 -> 動いた
 -> 適当にインストールしてしまった

$ cd ~/eclipse/cpp-2020-06/eclipse
$ ./eclipse
 -> workspace設定もそのまま

Help -> Install New Software...を選択
"Work with:"でCDT - "http://download.eclipse.org/tools/cdt/releases/9.11"を選択
"CDT Main Features"と"CDT Optional Features"にチェックを入れてインストール -> Eclipse再起動
Window -> Perspective -> Open Perspective -> Other...で"C/C++"を選択（元からなってる？）
Java PerspectiveをClose（元からなってる？）

設定変更
"Build Automatically"のチェックを外す（恐ろしい設定だな）
　　Windows -> Preferencesでworkspaceを検索（buildで検索した方が速い？）チェック外す。
"Refresh using native hooks or polling"のチェックを外す（元から外れている？）
　　Windows -> Preferencesでworkspaceを検索

プロジェクト作成
File -> New -> Project... -> C/C++ -> Makefile Project with Existing CodeでNext
Project Name: aosp_bt
Existing Codec Location
aospのsystem/btの場所
ToolchainでLinux GCC選択
-> Finish

aosp_bt上で右クリック -> Properties... -> C/C++ General -> Preprocess Include Paths, Macros etc. -> Providersをクリック
"CDT GCC Built-in Compiler Settings"を選択
"Command to get compiler specs"に"-std=c++14"を追記
UbuntuのブータブルUSBメモリを作成する

新しいPCを買ったのでUbuntuをインストールする。
インストールを行うためのブータブルUSBメモリを作成する。
USBメモリのセットアップはUbuntu上で行う。

基本的に以下の公式サイトの記載通りに作業する。
Create a bootable USB stick on Ubuntu
https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu

Windows版、MacOS版もある。
Create a bootable USB stick on Windows
https://ubuntu.com/tutorials/create-a-usb-stick-on-windows

Create a bootable USB stick on macOS
https://ubuntu.com/tutorials/create-a-usb-stick-on-macos

1.必要なもの
https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu#2-requirements
・4GB以上の空のUSBメモリ（USBメモリ上のデータは全て削除されるので注意）
・Ubuntu Desktop 14.04以上
・ダウンロードしたUbuntu ISOファイル

2.Startup Disk Creator起動
https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu#3-launch-startup-disk-creator
USBメモリを挿す
Startup Disk Createrを起動
$ usb-creator-gtk

3.ブータブルUSBの作成
https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu#4-iso-and-usb-selection
アプリを起動すると
・ダウンロードフォルダに置かれているISOイメージ一覧
・PCに接続されているUSBメモリ一覧
が見える。
それぞれの一覧から使用するものを選択して”ブータブルUSBの作成”ボタンを押す。
これでブータブルUSB完成。非常に簡単。
AngularのPWAのServiceWorkerは、初期状態ではProductionのみで動く

# AngularのPWAのServiceWorkerは、初期状態ではProductionのみで動く

## 前説

[Angularの公式手順](https://angular.jp/guide/service-worker-getting-started)の通りにPWAをインストールされたものとします。


```bash
ng add @angular/pwa --project *project-name*
```

このとき、ServiceWorkerが動作するのは、Productionでビルドした場合のみです。
試しにデバッグビルドしたものをブラウザリロードした場合、サイトが開けないはずです。

## 対応手順

もしangular.json上にproduction以外の設定(例えばstaging)を作っている場合に、それらの環境でもServiceWorkerを動作させるには、以下を変更します。

### app.module.ts

```app.module.ts
    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
```

必要に応じて、 `enabled` の条件を適宜修正します。
ステージング環境にも `production: true` の設定を行うような運用ならばこの場所の変更は不要ですが、そうでなければServiceWork動作フラグを別途用意することになります。

```environment.staging.ts
export const environment = {
  production: false,
  enableServiceWorker: true,
};
```

```修正後のapp.module.ts
    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.enableServiceWorker }),
```

### angular.json

```angular.json
{
  "version": 1,
  "projects": {
    "*project-name*": {
      "architect": {
        "build": {
          "configurations": {
            "production": {
              "serviceWorker": true,
              "ngswConfigPath": "*project-name*/ngsw-config.json"

```

* `serviceWorker`, `ngswConfigPath` の２項目を、`configurations`以下の他の項目にコピー

```追加後のangular.json
          "configurations": {
            "staging": {
              // 以下２行を追加
              "serviceWorker": true,
              "ngswConfigPath": "*project-name*/ngsw-config.json"
```
## 動作確認

以上の手順をおこなったうえで変更した設定で再ビルド、ウェブページを開いてからブラウザリロードしてみてください。
正しく設定されていれば、キャッシングされたページが表示されるはずです。
Wireshark Development Release(3.3.1) をUbuntuでbuildしてInstall

WiresharkをDownload
https://www.wireshark.org/#download

"Source Code"を選択
https://1.as.dl.wireshark.org/src/wireshark-3.3.1.tar.xz

$ tar xvJf wireshark-3.3.1.tar.xz

$ less wireshark-3.3.1/INSTALL
INSTALLドキュメント確認

QtとGLibのdevelopment packagesが必要。
$ pkg-config glib-2.0 --modversion
$ pkg-config Qt5Widgets --modvers

Install Qt 5 on Ubuntu
https://wiki.qt.io/Install_Qt_5_on_Ubuntu
sudo apt install qt5-default

glibインストール。
$ sudo apt install libglib2.0-dev

$ pkg-config glib-2.0 --modversion
2.64.3
$ pkg-config Qt5Widgets --modvers
5.12.8

$ sudo apt install libpcap-dev

私の環境ではPerlはインストールされていた。
$ perl --version

This is perl 5, version 30, subversion 0 (v5.30.0) built for x86_64-linux-gnu-thread-multi
(with 46 registered patches, see perl -V for more detail)

Copyright 1987-2019, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

Pythonもインストールされていた。
$ python3 --version
Python 3.8.5

cmakeをインストール
$ sudo apt install cmake
$ cmake --version 
cmake version 3.16.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

$ cmake ./wireshark-3.3.1
cmakeでエラーになった足りないライブラリをインストール
sudo apt install libgcrypt20-dev 
sudo apt install libc-ares-dev
sudo apt install libssh-dev
sudo apt install gettext
sudo apt install qttools5-dev
sudo apt install qtmultimedia5-dev
ここまでやってやっとcmake成功。

$ make
ビルド成功
-> run/wiresharkができている
MVCとは

# MVCとは
Model（モデル）
View（ビュー）
Controller（コントローラー）
これら3つの役割の総称のことを指します。
RailsなどのWebアプリケーションの処理の仕組みのことです。

## 図解

[![Image from Gyazo](https://i.gyazo.com/0717fd8fc8fd1ae811c21ed629700aed.png)](https://gyazo.com/0717fd8fc8fd1ae811c21ed629700aed)


ざっくりと図にするとこんな感じです。
基本となるMVCですので、復習を兼ねてアウトプットしました。
説明に至らないとは思いますが、駆け出し者のアウトプットをどうか大目に見てやってください。。。
BlueZビルド＆インストール

wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.54.tar.xz
tar xvJf bluez-5.54.tar.xz
cd bluez-5.54

sudo apt install libglib2.0-dev libdbus-glib-1-dev libudev-dev libical-dev libreadline-dev

./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var
make
sudo make install
BigSurでvagrantが動かなくなった話

こういうの不慣れで読みにくいと思います。
少しでもお役に立てれば！

```terminal
vagrant up
```
すると

```
Vagrant failed to initialize at a very early stage:

The plugins failed to initialize correctly. This may be due to manual
modifications made within the Vagrant home directory. Vagrant can
attempt to automatically correct this issue by running:

  vagrant plugin repair

If Vagrant was recently updated, this error may be due to incompatible
versions of dependencies. To fix this problem please remove and re-install
all plugins. Vagrant can attempt to do this automatically by running:

  vagrant plugin expunge --reinstall

Or you may want to try updating the installed plugins to their latest
versions:

  vagrant plugin update
```
こんなので怒られます。
今回はversion更新したので2番目を使っていきます。

すると...

```
Vagrant failed to properly resolve required dependencies. These
errors can commonly be caused by misconfigured plugin installations
or transient network issues. The reported error is:

ERROR: Failed to build gem native extension.
```
こんな感じのエラーで怒られますね！！

```
../.vagrant.d/gems/2.6.6/extensions/x86_64-darwin-19/2.6.0/unf_ext-0.0.7.7/mkmf.log
```
このログ見ろって言われるので見ます。

中身見ると...

```
clang: warning: no such sysroot directory: '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk' [-Wmissing-sysroot]
```
はい出ました。今回の原因です。

```terminal
> xcrun --sdk macosx --show-sdk-path
```
こいつを打つと新しいパスがわかります。

新しいパスを該当箇所見つけて置換するもよし、
symlinkをするのもよし

私は怖いのでsymlinkしました。

余談
https://github.com/hashicorp/vagrant-installers/issues/163#issuecomment-625503064
2.2.9で直ってるよ！って言ってるけど直ってないんじゃないかなぁ...
私のせいかな？
データサイエンス100本ノック（構造化データ加工編）　SQLパート

#100本ノック：SQL
少し前にデータサイエンス協会から発表された、「データサイエンス100本ノック（構造化データ加工編）」がデータ分析の前処理の練習に非常に良いと感じた。特にSQLに関しては、データベースがなければ練習ができないため非常に重宝した。自分が忘れがちなポイントについて、個人的な備忘録としてここに挙げる。

##SQLの備忘録：100本ノックより

S-015: 顧客テーブル（customer）から、ステータスコード（status_cd）の先頭がアルファベットのA〜Fで始まり、末尾が数字の1〜9で終わるデータを全項目抽出し、10件だけ表示せよ。


```
SELECT * FROM customer WHERE status_cd ~ '^[A-F].*[1-9]$' LIMIT 10
```

S-020: レシート明細テーブル（receipt）に対し、1件あたりの売上金額（amount）が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID（customer_id）、売上金額（amount）、付与したランクを表示させること。なお、売上金額（amount）が等しい場合でも別順位を付与すること。

```
SELECT customer_id, amount, RANK() OVER(ORDER BY amount DESC) AS ranking from receipt limit 10
```

S-028: レシート明細テーブル（receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）の中央値を計算し、降順でTOP5を表示せよ。

```
SELECT store_cd, PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY amount) as amount_50per FROM receipt
GROUP BY store_cd ORDER BY amount_50per desc LIMIT 5
```

S-029: レシート明細テーブル（receipt）に対し、店舗コード（store_cd）ごとに商品コードの最頻値を求めよ。

```
WITH product_mode AS (
    SELECT store_cd,product_cd, COUNT(1) as mode_cnt,
        RANK() OVER(PARTITION BY store_cd ORDER BY COUNT(1) DESC) AS rnk
    FROM receipt
    GROUP BY store_cd,product_cd
)
SELECT store_cd,product_cd, mode_cnt
FROM product_mode
WHERE rnk = 1
ORDER BY store_cd,product_cd
```

S-031: レシート明細テーブル（receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）の標本標準偏差を計算し、降順にTOP5を表示せよ。

```
SELECT store_cd, stddev_samp(amount) as stds_amount
FROM receipt
GROUP BY store_cd
ORDER BY stds_amount desc
LIMIT 5
```

S-038: 顧客テーブル（customer）とレシート明細テーブル（receipt）から、各顧客ごとの売上金額合計を求めよ。ただし、買い物の実績がない顧客については売上金額を0として表示させること。また、顧客は性別コード（gender_cd）が女性（1）であるものを対象とし、非会員（顧客IDが'Z'から始まるもの）は除外すること。なお、結果は10件だけ表示させれば良い。

```
WITH customer_amount AS (
    SELECT customer_id, SUM(amount) AS sum_amount
    FROM receipt
    GROUP BY customer_id
)
SELECT c.customer_id, COALESCE(a.sum_amount,0)
FROM customer c
LEFT JOIN customer_amount a
ON c.customer_id = a.customer_id
WHERE c.gender_cd = '1'
      and c.customer_id not like 'Z%'
LIMIT 10
```

S-041: レシート明細テーブル（receipt）の売上金額（amount）を日付（sales_ymd）ごとに集計し、前日からの売上金額増減を計算せよ。なお、計算結果は10件表示すればよい。

```
WITH sales_amount_by_date AS (
    SELECT sales_ymd, SUM(amount) as amount FROM receipt
    GROUP BY sales_ymd
    ORDER BY sales_ymd
)
SELECT sales_ymd, LAG(sales_ymd, 1) OVER(ORDER BY sales_ymd) lag_ymd,
    amount,
    LAG(amount, 1) OVER(ORDER BY sales_ymd) as lag_amount,
    amount - LAG(amount, 1) OVER(ORDER BY sales_ymd) as diff_amount
FROM sales_amount_by_date
LIMIT 10;
```

S-045: 顧客テーブル（customer）の生年月日（birth_day）は日付型（Date）でデータを保有している。これをYYYYMMDD形式の文字列に変換し、顧客ID（customer_id）とともに抽出せよ。データは10件を抽出すれば良い。

```
SELECT customer_id, TO_CHAR(birth_day, 'YYYYMMDD') FROM customer LIMIT 10;
```

S-046: 顧客テーブル（customer）の申し込み日（application_date）はYYYYMMDD形式の文字列型でデータを保有している。これを日付型（dateやdatetime）に変換し、顧客ID（customer_id）とともに抽出せよ。データは10件を抽出すれば良い。

```
SELECT customer_id, TO_DATE(application_date, 'YYYYMMDD') from customer LIMIT 10;
```
PHPStormで「Undefined Class」が出たら試しておきたいこと

##解決法
エディタ上部のFile→Invalidate Caches/Restartを選択
![スクリーンショット 2020-11-13 17.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548334/0ea31aed-83c4-1cf5-cb59-bc1161ca7046.png)

![スクリーンショット 2020-11-13 17.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548334/acfeae6d-aad9-ddf8-f01c-82547bc8708a.png)

The caches will be invalidated and rebuilt on the next startup.
Would you like to continue?
「キャッシュは無効化されて次回の起動時に再構築されます。続けますか？」と聞かれます。
「Invalidate and Restart」を選ぶとキャッシュが削除され、エディタが自動で再起動します。
これで完了！

##経緯
つい先ほどまで出ていなかったのに、なぜか「Undefined Class」という表示が急に出現。
もちろん、クラスは定義されています。
とにかく調べてみたら、PhpStormでたまに起こるのだとか。動作高速化のためのキャッシュがたまに悪さをするようですね。
他の方の記事ではコンパイルエラーが無いにもかかわらず実行時にエラーが出てしまうという現象の時にも有効だったようなので、お試しください。
デレステ関係の分析一覧

いくつかページ作って散らかってきたので、目次的なページ

## デレステイベントボーダーpt

* [1位、2001位分析 -データ取得・整理・確認-](https://qiita.com/kazuya_minakuchi/items/04a1fcfc896f64c1e010)
* アタポン形式
  * 2001位ポイント推定
    * [1位ポイント推定-状態空間モデル-](https://qiita.com/kazuya_minakuchi/items/a0683170a3ad7ceba209)：検討段階
     * [デレステイベント「さよならアンドロメダ」 1位ポイント予測](https://qiita.com/kazuya_minakuchi/items/5aaf691a9f5ef6b533df)：実際に予測してみたもの
  * 2001位ポイント推定
     * [状態空間モデル-その1-](https://qiita.com/kazuya_minakuchi/items/cfb1de8e4dd9acd404a4)：検討段階

## 他

* [おーぷん2ちゃんねる掲示板数分析](https://qiita.com/kazuya_minakuchi/items/82849529675762b00472)
デレステイベント「さよならアンドロメダ」 1位ポイント予測

# 概要

* デレステのイベント「さよならアンドロメダ」の終了時、1位が何ポイントとっているかの予測
* イベント情報
  * 開催期間：2020/11/19 15:00 ~ 2020/11/27 20:59 (198h)
* 使ったコード：https://github.com/kzy611/dereste_event_point_ranking_1_app
* [デレステイベントアタポン形式 1位ポイント推定 -Pystanを使った状態空間モデル-](https://qiita.com/kazuya_minakuchi/items/a0683170a3ad7ceba209)でモデル作ったので、今回試しに使ってみた 

# 予測

* 点推定：1,256,410ポイント
* 区間推定
  * 50%信頼区間：1,205,837 ~ 1,307,057
  * 90%信頼区間：1,127,372 ~ 1,379,722
* グラフ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/626a1fe6-6d87-dbde-8432-44a106be6e48.png)

# 結果

* 1,300,810ポイント
  * 50%信頼区間にも入ってるので、上々の結果では？
* （ちなみに、私は獲得ポイント14,000くらいでランキング11万位くらいでした。）
Recharts Tooltipの数値をフォーマットする

RechartのTooltipの数値をフォーマットする際に迷ったので備忘録。


## Tooltipのフォーマット

Rechartでは、Tooltipを使うと、マウスオーバで数値の詳細が確認できるようになる。

```typescript
<BarChart>
  <Tooltip />
</BarChart>
```

表示される数値は、`formatter` propに関数を渡せばフォーマットできる。

```typescript
<BarChart>
  <Tooltip formatter={(value) => new Intl.NumberFormat('ja-JP', {maximumFractionDigits: 0}).format(value)} />
</BarChart>
```

TypeScrpitの場合は、`value`を数値に変換して`NumberFormat.format`に渡せばok

```typescript
<BarChart>
  <Tooltip formatter={(value) => new Intl.NumberFormat('ja-JP', {maximumFractionDigits: 0}).format(+value)} />
</BarChart>
```

変数に名前を付ける場合は、`[formatted_value, name]`の配列を返す

```typescript
<BarChart>
  <Tooltip formatter={(value, name) => [new Intl.NumberFormat('ja-JP', {maximumFractionDigits: 0}).format(+value), idToLabelMap.get(name)]} />
</BarChart>
```

## 参考

https://stackoverflow.com/questions/51382831/recharts-add-commas-to-number-on-tooltip-on-bar-chart
Django template formで渡されるパラメータを項目ごとに手動で装飾したいメモ

Python 3.8.5
Django version 3.1.2

備忘録

```
/formtest/formman$ tree
.
├── admin.py
├── apps.py
├── forms.py ★つくりました。
├── __init__.py
├── migrations
│   ├── 0001_initial.py
│   ├── 0002_auto_20201119_1155.py
│   └── __init__.py
├── models.py　★書きました
├── templates　★作りました
│   ├── base.html
│   └── formman
│       └── form.html
├── tests.py
└── views.py　★書きました

3 directories, 12 files
```


Djangoのチュートリアルやリファレンスを読んでると
以下の用に記載するとDjangoのViewはTemplateにformの項目を表示してくれると書いてあります。

```
            {{ form.as_p }}
```

こんな感じで書くんですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/c6265351-7b3c-8296-22c2-2cc7dc50b269.png)


実際にrunserverして、HTMLソースをみるとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/3a728dd0-3643-18c8-0e28-ee6ffce0e705.png)
ということは、`form.as_p`に該当するのは以下の部分。

```
<p><label for="id_id">ID:</label> <input type="number" name="id" required id="id_id"></p>
<p><label for="id_name">名:</label> <input type="text" name="name" maxlength="100" required id="id_name"></p>
<p><label for="id_number">値:</label> <input type="number" name="number" required id="id_number"></p>
```

`form.as_p`を以下のように書き換えると…。

```
            {{ form.id.label }}
            {{ form.name.label }}
            {{ form.number.label }}

            {{ form.id }}
            {{ form.name }}
            {{ form.number }}

```

おお。うまく行った。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/eff3a73f-bc92-1002-1bf7-e7ae303dbd6c.png)

これで項目ごとに装飾できそうです。
作業中のブランチ削除

#【概要】

<b>1.[結論](#1結論)</b>

<b>2.[どのように行うのか](#2どのように行うのか)</b>

<b>3.[参考にしたURL](#3参考にしたurl)</b>

<b>4.[開発環境](#4開発環境)</b>



#1.結論
GithubDesktopで`main`に戻してから、`git branch -d [ブランチ名]`をし、自分のGithubのブランチも削除しておく。

#2.どのように行うのか
ブランチを選択している状態のコンソール上で該当ファイルで` $ git branch -d [ブランチ名]`を行うと、下記のエラーが出ます。

![スクリーンショット 2020-11-19 18.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/d0747b05-f4e7-cc89-eb6b-f2f6cd01a28b.png)

なので下記の画像にある赤枠をクリックして`main`に戻します。
![スクリーンショット 2020-11-19 18.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/0703a89c-1b23-c120-b725-abbc47b3d4b5.png)

再度、コンソール上で該当ファイルで` $ git branch -d [ブランチ名]`を行うと成功します。

![スクリーンショット 2020-11-19 18.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/2e276ebc-23a0-5d2c-a7aa-0ff8af064435.png)

GithubDesktopでは削除されましたが、自分のGithubアカウントのブランチが残っているので削除します。

![スクリーンショット 2020-11-19 18.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/0f2e7cc5-adaf-69e2-b591-d10bc1bd376e.png)

![スクリーンショット 2020-11-19 18.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/e298fefc-fecd-25d7-fff9-aa82e433c15e.png)

これで間違ってブランチを作成しても、他のブランチを再度作成できます。

<br>

※ `3.アカウント機能`を既に削除している状態なので、私のGithubアカウントには残っていません。説明のため画像を用意しています。


#3.参考にしたURL

<a href="https://noumenon-th.net/programming/2019/12/29/git-branch-d/">Gitでブランチ（branch）を削除する</a>


#4.開発環境
git version 2.24.3
RSpecのテストにおいて期待されるエラーが出力されなかった話

##はじめに
画像とテキストを投稿するRailsアプリケーションで、RSpecによるテストを行っていた。
アプリケーションの設計ではテキストがない場合はツイート(投稿)が出来ないようになっている。

##テスト内容

テキストなしの投稿は保存できない、という内容のテストで以下のコードを実行した。

```ruby:spec/models/tweet_spec.rb
it 'テキストがないとツイートは保存できない' do
  tweet = Tweet.new(text: "",image: "https://i.imgur.com/GL7igry.png")
  tweet.valid?
  expect(@tweet.errors.full_messages).to include("Text can't be blank")
end

```

ところが、テキスト欄を空白にしてもtweet.valid?はtrueを返しており、"Text can't be blank"のエラーが出力されなかった。

```sh
[1] pry(#<RSpec::ExampleGroups::Tweet::Nested::Nested_2>)> @tweet.valid?
=> true
[2] pry(#<RSpec::ExampleGroups::Tweet::Nested::Nested_2>)> @tweet.errors.full_messages
=> []
```

ここで@tweet.valid?がtrueになるということは、validationがうまく機能していない可能性があるので、該当するmodelを見直してみた。

##解決法
validationの記述がなかったため、エラーが発生していなかった。
以下を書き足してもう一度テストを行ったところ、無事"Text can't be blank"のエラーが出力された。

```ruby:app/models/tweet.rb
  validates :text, presence: true
```
NUCで始めるVMware Tanzu - はじめに

# 想定読者
どれか一つに当てはまる人にとって参考になればと思います
- Kubernetes好きな人
- Hardware・ガジェット好きな人
- vSphere好きな人

# はじめに
皆様はこの2020年を、いかがお過ごしでしょうか？
こうコロナで在宅勤務の機会が多くなると、自宅環境を強化したくなりますよね？（私だけかも・・:sweat_smile:）
そう、今、ホームラボが熱いんです！
ただ、家にごっついサーバを置きたくないじゃないですか？
ちっちゃくて邪魔にならず、常時つけっぱなしでも電力食わなくて、値段もそんなに高くないマシンってないかぁと、色々と調べたら、あったんですよ。
それが、これから紹介する[Intel NUC](https://www.intel.co.jp/content/www/jp/ja/products/boards-kits/nuc.html)(Next Unit of Computing)という製品です。Intelさんマジ神です。

## VMware Tanzuについて
急に私事で恐縮なのですが、今年になってVMwareという会社に転職しました。
今、VMwareはものすごーーくKubernetesに力を入れていまして、[VMware Tanzu](https://tanzu.vmware.com/jp/tanzu)というKubernetes製品群を主力商品として投入しています。そこで私はKubernetesコンサルをやってたりします。
でも、vSphereというと、なんだか難しそうなイメージをお持ちの方もいるのではないでしょうか？
ご安心下さい！なんとこのNUCに、vSphere環境を入れることができちゃうんです。
このアドベントカレンダーを通じて、丁寧に解説していこうと思うので、NUCを触ってたら、いつの間にかKubernetesベースの最新オンプレクラウド環境ができちゃった！というところを目指そうと思っています。

## NUCでホームラボ
実は海外ではちょっと流行ってたりしますｗ
"[nuc home lab](https://www.google.com/search?q=+nuc+home+lab&tbm=isch&ved=2ahUKEwjkq9j_g6PtAhXXAZQKHcJLAokQ2-cCegQIABAA&oq=+nuc+home+lab&gs_lcp=CgNpbWcQAzIECAAQEzIICAAQBxAeEBNQ9-i1Alj36LUCYOHstQJoAHAAeACAAb4BiAG-AZIBAzAuMZgBAKABAaoBC2d3cy13aXotaW1nwAEB&sclient=img&ei=EBrBX-TjHdeD0ATCl4nICA&client=firefox-b-d)" とgoogle画像検索すると、みんなの素敵な自宅環境が見れたりします。
[William Lam さんのHome Lab特集](https://www.virtuallyghetto.com/home-lab) なんかは膨大な情報が載ってるので、安心してトライすることができたりします。
[Vue.js]v-for

<h1>v-forを使って配列を操作</h1>
```javascript
js
//データに配列を作っておきます
     data:{
        fruits:['バナナ','りんご','びわ']
```
```html
html
   <ul>
//fruitsの中身をfruitにいれる{{}}の中身に順番にfruitをいれていく
      <li v-for ="fruit in fruits">{{fruit}}</li><hr>
    </ul>
```
<ul>
<li>バナナ</li>
<li>りんご</li>
<li>びわ</li>
</ul>
<p>と表示される</p>
<h2>第２引数を渡す</h2>
```html
html
   <ul>
()で囲ってカンマで区切って第二引数
      <li v-for ="(fruit,index) in fruits">{{fruit}}</li><hr>
    </ul>
```
<p>第２引数では配列のインデックス番号が取得できる</p>
```html
html
   <ul>
//(0)バナナ のように表示される
      <li v-for ="fruit in fruits">({{index}}){{fruit}}</li><hr>
    </ul>

```



<h1>v-forを使ってオブジェクトを操作</h1>
```javascript
js
data:{
//データにオブジェクトを作っておく
    fruits{
        yellow:'バナナ',
        red:'りんご',
        orange:'オレンジ'
    }
}   
```

```html
html
   <ul>
//valueの中にオブジェクトの値を入れていく
      <li v-for = "value in fruits>{{value}}</li>
    </ul>
```
<h2>第２引数と第３引数で取得できるもの</h2>
<p>配列と同じように記述できる</p>
```html
//２番目はキー、３番目はインデックス番号を取得できる　
   <li v-for = "(value,key,index) in fruits>{{value}}</li>
    </ul>
```
<h1>全てのliに下線をつける</h1>
<p>テンプレートタグをつけて記述する</p>
```javascript
ul>
//テンプレートタグの中にv-for~を書く
        <template v-for ="(fruit,index) in fruits">
//表示させる中身はliに書く
          <li>({{index}}){{fruit}}</li><hr>
       </template>
    </ul>
```
<ul>
<li>(0)バナナ<hr>
</ul>
<p>と表示される</p>
Pythonを使って東京都家賃についての研究 (3の1)

#結果抜粋
ブログに同時掲載：
https://leoluistudio.com/blog/10/python%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%9D%B1%E4%BA%AC%E9%83%BD%E5%AE%B6%E8%B3%83%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%A0%94%E7%A9%B6-3%E3%81%AE1-%E7%B5%90%E6%9E%9C%E6%8A%9C/

##研究の目標、手法
###目標

- 東京都の家賃やそれに関連する属性の関連性を研究したい
- その関連性についての結果をグラフにして可視化にする
###手法

- 2020年8月でネットで載せていた家賃データをプログラムで自動収集（データ元：https://suumo.jp）
- 82,812建物、624,499部屋のデータを基に分析

##研究結果の抜粋​
###東京の家賃価格の分布
Xはグループに分ける家賃（円）、Yは数（kは1,000）
![L1no7V2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/29e3a49a-90b1-b726-3bf2-e25f953725b5.png)


###価格と面積の関係（23区と市部に分ける）
青い点が23区、赤い点が市部、Xは面積（平方メートル）、Yは家賃（Mは百万円）
![L2no1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/d90a0bf8-56af-a7ea-bb62-4d13990dd310.png)


###区ごとに平均価格の分布（23区）
- Xは数（kは1,000）
- Yは23区
- 箱ひげ図の見方：
    - 一番左側の線は最小値
    - 箱の左側は第1四分位点
    - 箱の中の線は中央値
    - 箱の左側は第3四分位点
    - 一番右側の線は最大値
![L2no2D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/6fc8d1cd-a60b-a3cb-1ded-98ae58e46f08.png)


###方向と区市町村の価格ヒートマップ
- Xは8方向
- Yは23区
- 色が明るいほど価格が高い
- 色が暗い（青い）ほど価格が低い
![L3no1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/33effea5-aadc-1fce-c1c4-38e4d0ec50f4.png)
ラズパイ btrfs ルートの勧め (Debian)

ラズパイは普通はSDカード起動ですが、

* 遅い
* 容量が狭い

という重大な欠点があります。USB接続SSDでこれらの問題は解決できますが、USB 3で繋がないとスピードは出ないし、古いラズパイだとUSB 2しかないしUSB接続SSDから起動できません。そこで透過圧縮を行うbtrfs を用いればこれらの問題を解決できます。USB接続SSDについては

* [Raspberry Pi 4 Model B で USB ブート](https://qiita.com/nowlinuxing/items/3c7f61bca6e5ef0d1c47)
* [https://qiita.com/nowlinuxing/items/3c7f61bca6e5ef0d1c47](https://raspida.com/rpi4-ssd-usb-boot) 

などを参考にして下さい。

# btrfs で高速化と容量増大を行う
`/etc/fstab` のマウントオプションに [compress-force=lzo](https://wiki.archlinux.jp/index.php/Btrfs#.E3.83.9E.E3.82.A6.E3.83.B3.E3.83.88.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3) を付ける。それだけ。[lazytime](https://wiki.archlinux.jp/index.php/Fstab#atime_.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3) も一緒に指定するのもよい。

ルートファイルシステムをbtrfsにするためには、Linuxカーネルまたはinitramfsにbtrfsを組み込む必要がある。しかしRaspberry Pi純正OSだとinitramfsは無いしカーネルにbtrfsが組み込まれていないため、はっきり言って相当難しい（著者はやり方わかりません）。Ubuntuはinitramfsを持っているのでもう少し簡単にできるはずだが、Ubuntuに興味が無いためやり方を調べていない（いい記事があればリンクするのでコメント欄で教えて下さい🙇。純正Debianを用いてbtrfsルートファイルシステムを作る手順は [ラズパイ用純正 Debian/Linux 起動SDカードを作る手順](https://qiita.com/nowlinuxing/items/3c7f61bca6e5ef0d1c47) にスクリーンショット付きで詳しく書いた。
【Ruby】基本文法を個人的にまとめた。

Rubyについて、理解を深めるためにまとめる。
随時更新していく。

参考文献
☆伊藤潤一『プロを目指す人のためのRuby入門』

[コマンド]
`irb`（Interactive Ruby）➡︎REPL（Read-eval-print loop、対話型評価環境）の1つ
　　　　　　　　　　　　　ターミナルで動作確認ができる

    $ irb
    irb(main):001:0> 1 + 2
    => 3
    irb(main):002:0> a = 'Hello, World'
    => "Hello, World"
    irb(main):003:0> exit

`ruby`➡︎同じくターミナルで動作確認ができる
    
    --sample.rb--
    a = 'こんにちは'
    puts a

    --ターミナル--
    $ ruby sample.rb
    こんにちは

#####【FizzBuzz】
    def fizz_buzz(n)
        if n % 15 == 0
            "Fizz Buzz"
        elsif n % 3 == 0
            "Fizz"
        elsif n % 5 == 0
            "Buzz"
        else
            n.to_s
        end
    end

    puts fizz_buzz(1) --1
    puts fizz_buzz(2) --2
    puts fizz_buzz(3) --Fizz
    puts fizz_buzz(4) --4
    puts fizz_buzz(5) --Buzz
    puts fizz_buzz(6) --6
    puts fizz_buzz(15) --Fizz Buzz

#####【unless文】
    status = "error"
    message =
        unless status == "ok"　--「if status != "ok"」と同義
            "異常発生"
        else
            "正常"
        end
    puts message

#####【case文】
    country = "イタリア"
    say =
        case country
        when "日本"
             "こんにちは"
        when "アメリカ"
             "Hello"
        when "イタリア"
             "Ciao"
        else
             "？？？"
        end
    puts say
プログラミング初心者がRailsで日記SNS作ってみた

# はじめに
日々の学びをメモして、良い感じのやつだけ共有できるようなアプリが欲しいと思ったので自作してみました.
現在、α版としてHerokuにアップしているので覗いていただけると嬉しいです。

## アプリ名
Output App

![スクリーンショット 2020-11-19 17.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771826/0984a084-063c-c1b6-642f-39462a73153d.png)

## リンク
URL : https://outputapp.herokuapp.com/
GitHub : https://github.com/tatsuhiko-nakayama/output_app

# 機能紹介

## 投稿画面

![スクリーンショット 2020-11-19 17.30.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771826/aa0f5d3c-ccc6-52b8-50f1-95cfdebffda5.png)

- ハッシュタグを入力することで情報源を共有できる
- デフォルトが非公開なのでメモとして使える
- closedボタンをopenに切り替えて公開する
- マークダウンが使える

## 詳細画面

![スクリーンショット 2020-11-19 17.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771826/c6b634e1-8a51-0193-5ca3-c543bbe76136.png)

- ハッシュタグ、参考URLへリンク
- LIKE機能
- フォロー機能
- コメント機能

## ユーザーページ

![スクリーンショット 2020-11-19 17.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771826/c4b5d1db-46b4-0e91-664a-5a1094027852.png)

- 各ステータス表示＆一覧リンク
- ユーザーの投稿(open)一覧

# ここまで作ってみて

## 所感

あまり難しい機能は実装せず、初心者でも自力でできる範囲でいろいろと実装してみました。

特にJavaScriptが勉強不足でAjaxがうまくいかなったり、改善したいところが多々あります。

## 次のステップ

テスト公開中なので、ユーザーさんの声を聞きながら使いたくなるサービスにどんどん改良していきます。

「アウトプット」と聞くと意識高い感じがして使いにくいのかなと思いつつも、特徴のない「日記アプリ」や「SNS」では既存サービスでええやんと思ったり。

その辺、試行錯誤しながら楽しく作り込んでいきたいなと思います。

# 作者スペック

- 2020年8月からプログラミングを始める
- 2ヵ月間、プログラミングスクールで学習
- 前職は営業（8年在籍）
- 現在はニート生活を満喫しつつ、Web系自社開発企業で働きたいと思っている
- 趣味は料理とYoutube

# 制作期間

11/1〜現在

# 使用技術

- Ruby / Rails
- JavaScript / jQuery
- Amazon S3
- AWS (これから）
- Docker（これから）
- Circle CI（これから）

# おわりに

テストユーザーのお願いをして使ってもらって、そこからが開発だなと思いました。

技術ももちろん大事だけど、ユーザーさんにとって使いやすかったり、感動する体験にどうやってつなげていくのか。

ご覧いただけた方いらっしゃいましたら、ぜひ感想・アドバイスお願いします。

✔︎
Vue.jsでクリップボードにコピー

##  やりたいこと
値をmethodに渡してそれをクリップボードにコピーしたい

## template部分
```
<v-icon @click="copyToClipboard(text)">mdi-content-copy</v-icon>
```

## script部分
```
methods: {
    copyToClipboard(text) {
        navigator.clipboard.writeText(text)
        .then(() => {
            console.log("copied!")
        })
        .catch(e => {
            console.error(e)
        })
    }
}
```

## その他の方法
以下の記事の様に要素を指定してその内容をコピーすることもできる様です
https://qiita.com/ikemura23/items/eec0eed63fc119606451
RubyでFirebase Authenticationが発行したID Tokenを検証する

https://firebase.google.com/docs/auth/admin/verify-id-tokens

上記URLにやり方が記載されているのですが、Rubyに関してはSDKが存在しないため自前で実装する必要があります。
https://github.com/fschuindt/firebase_id_token

こういうgemもあるのですが、Firebaseが公開している証明書をキャッシュするためだけにRedisが必要なので、Redisを使っていないプロジェクトではこのためだけにRedisを用意するのは過剰です。

https://satococoa.hatenablog.com/entry/2018/10/05/210933

JWTの検証に関してはこの記事が非常に参考になりますが、証明書のキャッシュ部分だけはRials.cacheに依存していてイマイチ。またHTTPクライアントはFaradayを利用したかったこともありFaradayを使ってなんとかいい感じにできないかと考えていたところ、いい感じのFaraday Middlewareがあったのでその紹介をします（本当はJWTの検証部分も解説しようと思ったんですが、ぐぐってみたら上記の記事を発見して書きたいことが書いてあったのでやめました）

## faraday-http-cache

https://github.com/sourcelevel/faraday-http-cache

HTTPのレスポンスのCache-Controlヘッダーに含まれるmax-ageの値を利用していい感じにキャッシュしてくれるMiddlewareです。キャッシュの保存先としてキャッシュ用のクラスのインスタンスを渡すことができ、任意の場所にキャッシュできます。サンプルではRails.cacheを渡していますが、ファイルやDBやRedisなどに保存したい場合は同じインターフェースをもつクラスのインスタンスを作成して渡すこともできます（もちろんRails.cacheのストレージをを変更しても良いです）
証明書や公開鍵に関しては、Cache-Controlヘッダーに含まれるmax-ageの値を利用してキャッシュすることが推奨されているので、このgemはうってつけです。

```rb
connection = Faraday.new do |builder|
  builder.use :http_cache, store: Rails.cache, logger: Rails.logger
  builder.request :url_encoded
  builder.response :json, parser_options: { symbolize_names: true }, content_type: 'application/json'

  builder.adapter Faraday.default_adapter
end

connection.get('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com')
```

使い方としては上記のような形です。
特段変わったことをせず普通にFaradayを使っていればキャッシュされるようになるので非常に便利です。
またloggerを設定することで、キャッシュから取得しているのかどうかがわかるようになるので、loggerも合わせて設定することをおすすめします。ログレベルはdebugなので、本番環境でやたらログが出ることもありません（本番環境のログレベルがinfo以上である前提ですが…）

## FirebaseはJWKsを公開しているわけではない罠

最初公式のドキュメントにある証明書がJWKsだと勘違いをしていてハマりました。実際は独自のフォーマットで、しかも公開鍵ではなく証明書なので、証明書から公開鍵に変換する必要があるする必要があります。
GCPではJWｋｓが公開されてるので、Firebaseも同様にJWKsだろうと思いこんでしまうと罠にはまります。
JWKsであれば、JWTのdecodeの際にjwksのHashを渡すことでJWT.decodeがいい感じに公開鍵を使って検証してくれて楽なのに残念です…。

と、記事をここまで書いて、「もしかしたらJWKｓも公開されてるのでは？」と思ってぐぐってみたところ、公式サイトにはなかったJWKsを発見しました。
https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com

これを用いれば以下のようにシンプルに書くことができます。

```rb
connection = Faraday.new do |builder|
  builder.use :http_cache, store: Rails.cache, logger: Rails.logger
  builder.request :url_encoded
  builder.response :json, parser_options: { symbolize_names: true }, content_type: 'application/json'

  builder.adapter Faraday.default_adapter
end

res = connection.get('https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
')

payload, =  JWT.decode(id_token, nil, true, { algorithms: ['RS256'], jwks: res.body })
```

シンプルに書けるようになりますが、公式ドキュメントに書かれているURLではないため、利用する際には注意してください。
LINE WORKSで頻発する処理を自動化してみた

#はじめに
皆さんこんにちは。
Advent Calendarに初めて投稿させて頂きます、アステリアの小林です！
今回は、LINE WORKSで頻発するメンバーや組織情報の追加、更新、削除を
ASTERIA Warpを利用して自動化しようという企画です。
ASTERIA Warp とは、様々なシステムやクラウドサービスと接続することができる
ノーコードのデータ連携ツールです。

詳しくは下記製品ページをご覧ください。

▼ASTERIA Warp とは？
　https://www.asteria.com/jp/warp/feature/

皆さまに無償公開している
「フローテンプレート」を使うことで、LINE WORKSに登録している
メンバーや組織の追加/更新/削除を簡単に自動化することができます。

【LINE WORKS連携フローテンプレート】 
◆メンバー管理
◆組織管理

![temp_lineworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/21e12563-67f0-9767-90fe-a99d643be78c.png)

フローテンプレート広場よりフローテンプレートをダウンロードし、
開発環境であるフローデザイナーにインポートします。

![template_hiroba_import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/10a4a635-189e-28a4-8cd8-957612efcd19.png)

#メンバー管理

![lineworks_steps.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/d0cabdcf-9e94-c79b-8658-6d4e281091aa.jpeg)

ウィザードに沿ってIDやキー、読み込むCSVファイルを指定します。
CSVファイルは、アカウントや姓、名、メールアドレスなどの情報を
フォーマットに合わせて用意しておきます。

![lineworks_csv_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/56e68819-fde1-66d5-36e2-8579c363dabf.png)

これで完成です。

![members_screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/06e64289-9430-1439-ac13-cc1f59875d7c.png)


実行するとCSVの内容に沿って、
メンバーを追加/更新/削除することが確認できました！

![lineworks_member_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/16b6b48b-1f00-e8a3-6003-1677227ad545.png)

#組織管理

![lineworks_org_steps.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/0c1e31b4-ab12-5019-4cd6-b5ea90827357.jpeg)

こちらも「メンバー管理」テンプレートと同様にウィザードに沿って
IDやキー、読み込むCSVファイルを指定します。
こちらのCSVファイルは、組織名や組織のキー、各種設定情報などを
フォーマットに合わせて用意しておきます。

▼サンプル

![lineworks_org_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/ea3be99f-6198-0dd6-74a8-41534b5263cf.png)

これで完成です。

![orgs_screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/67ca6611-4522-e1e6-4c5b-d7e5115c360a.png)


実行すると、CSVの内容に沿って、組織を追加/更新/削除することができます。

![lineworks_org_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874513/00f7872a-ee8a-c48b-de79-697166965936.png)

#おわりに

いかがでしたか？既存のテンプレートを利用することで、フロー開発せずに
LINE WORKSと連携できました。
従業員情報や組織変更が頻繁にある、または変更点が多いとき、
手動だとかなりの手間になりますが、テンプレートを使えばASTERIA Warpを介して
LINE WORKSへの反映を簡単に自動化することができます。
みなさんもぜひ活用してみてください。

今後もこのようなテンプレートを開発できればと思いますので
もしご興味ありましたら、下記個別相談ページを覗いてみてください！
(小林が会話させて頂きます！)

▼オンライン個別相談
　https://www.asteria.com/jp/contact/asteria/onlinemeeting/
UnityにadMobを入れてiOSビルドした時にxcworkspaceが生成されない

#環境
macOS Catalina 10.15.7
unity Version 2019.4.14f1 Personal
GoogleMobileAds-v5.4.0.unitypackage

#現象
UnityでiOS、Android向けのアプリを作っていて、広告を表示するためにAdMobを導入した。
公式サイトのやり方にしたがってMobile Ads Unityプラグインをダウンロード、インポートした。
https://developers.google.com/admob/unity/start#ios

UnityでFile->Build Settings->BuildからiOSプロジェクトをビルドした。
以前他のアプリにAdMobをインポートした際には、この時xcworkspaceが自動で生成されていたが、今回はなぜか生成されなかった。
xcodeprojファイルを開いてビルドすると、下記エラーが出て失敗した。

```
'GoogleMobileAds/GoogleMobileAds.h' file not found
```

#解決方法
cocoapodsがうまく動いていないらしい。
gemでインストールしていたcocoapodsをアンインストールして、homebrewでインストールし直した。

### cocoapodsをアンインストールする
ターミナルで以下を実行する。

```
sudo gem uninstall cocoapods -n /usr/local/bin
```

さらにcocoapods関連のものをすべて表示する。

```
gem list --local | grep cocoapods
```

私の環境では以下のように実行結果が表示された。

```
cocoapods-core (1.8.4)
cocoapods-deintegrate (1.0.4)
cocoapods-downloader (1.3.0)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.1.0)
cocoapods-trunk (1.4.1)
cocoapods-try (1.1.0)
```

これらをすべてアンインストールしていく。

```
sudo gem uninstall cocoapods-core -n /usr/local/bin
sudo gem uninstall cocoapods-deintegrate -n /usr/local/bin
sudo gem uninstall cocoapods-downloader -n /usr/local/bin
sudo gem uninstall cocoapods-plugins -n /usr/local/bin
sudo gem uninstall cocoapods-search -n /usr/local/bin
sudo gem uninstall cocoapods-stats -n /usr/local/bin
sudo gem uninstall cocoapods-trunk -n /usr/local/bin
sudo gem uninstall cocoapods-try -n /usr/local/bin
```

すべてSuccessfully uninstalledと表示されてアンインストールされたはず。
一応もう一度listを表示してすべてアンインストールされたことを確認する。

```
gem list --local | grep cocoapods
```

.cocoapodsを削除する。

```
rm -rf ~/.cocoapods
```

###Homebrewでcocoapodsをインストールし直す
ターミナルで以下のコマンドをすべて実行する。

```
brew install cocoapods
rm '/usr/local/bin/pod'
brew unlink cocoapods
brew link --overwrite cocoapods
```

Unityを再起動してもう一度iOSビルドしたらちゃんとxcworkspaceが生成されていた。

#参考
https://qastack.jp/superuser/686317/how-to-fully-uninstall-the-cocoapods-from-the-mac-machine
https://stackoverflow.com/questions/61116512/cocoapods-installation-failed-failed-to-build-gem-native-extension
【STM32 Cube】APB Timer Clocks の値を取得する

# コード

```c
uint32_t apb1_timer_clocks;
uint32_t apb2_timer_clocks;

RCC_ClkInitTypeDef RCC_ClkInitStruct;
uint32_t pFLatency;
HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);
apb1_timer_clocks = HAL_RCC_GetPCLK1Freq();
apb2_timer_clocks = HAL_RCC_GetPCLK2Freq();
apb1_timer_clocks *= (RCC_ClkInitStruct.APB1CLKDivider == RCC_HCLK_DIV1)? 1 : 2;
apb2_timer_clocks *= (RCC_ClkInitStruct.APB2CLKDivider == RCC_HCLK_DIV1)? 1 : 2;
```

# 解説
## `RCC_ClkInitTypeDef`
こんな定義になっています。

```c
typedef struct {
  uint32_t ClockType; // RCC_CLOCKTYPE_xxx
  uint32_t SYSCLKSource; // RCC_SYSCLKSOURCE_xxx
  uint32_t AHBCLKDivider; // RCC_SYSCLK_DIVx
  uint32_t APB1CLKDivider; // RCC_HCLK_DIVx
  uint32_t APB2CLKDivider; // RCC_HCLK_DIVx
} RCC_ClkInitTypeDef;
```

`uint32_t` になってはいますが、`APB1CLKDivider` であれば `RCC_HCLK_DIVx` の定義された値となっており、 割る数通りの値ではありません。しかし、結局のところ条件式で使うので影響はさほどありません。

## `HAL_RCC_GetClockConfig`
`HAL_RCC_ClockConfig` で設定された値を取得します。基本的には `SystemClock_Config` で設定されているはずなので、その後であれば正常な値が返ってくるはずです。

## `HAL_RCC_GetPCLK1Freq`, `HAL_RCC_GetPCLK2Freq`
![スクリーンショット 2020-11-19 17.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/f4cfd31a-e4d9-9e86-43ed-6d3c80dd4eb1.png)

この図において、`PCLK1` や `PCLK2` を取得することができます。実際はクロックソースから順に計算をしていって算出されていますが、`PCLKx` を直接取得できるのでこれを使っています。

## `PCLKx` を `APBx Timer Clocks` に変換する
```c
apb1_timer_clocks *= (RCC_ClkInitStruct.APB1CLKDivider == RCC_HCLK_DIV1)? 1 : 2;
```

`PCLKx` の値に掛け算することで `APBx Timer Clocks` の値を得ています。どんな値を掛ければいいのかよく分からなかったので、検証を繰り返してこの条件式に行きつきました。

ですが、実際のところクロックツリーというところに答えが書いてありました。`PCLKx` に掛ける値はプリスケーラーが１の時はx1。それ以外の場合はx2になるようです。なのでこの条件式で問題ないですね〜。

![スクリーンショット 2020-11-19 17.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/e32a4988-4375-b1ff-77bf-ff475af05ce2.png)

## 環境
- NUCLEO-F303RE
- STM32Cube FW_F3 v1.11.1

## 最後に
「`APB Timer Clocks` の値を取得する」 という内容自体はよく質問されている内容ではありますが、今でも使うことが出来るようなものはあまり見つかりませんでした。HAL関数のみの構成になっているのでマイコン依存ではないとは思いますが、設定次第でおかしな値を取得してしまうかもしれません。上手く取得できなかったことがあれば教えていただけるとありがたいです。
駆け出しエンジニアがG検定に合格したので学習内容をメモ


# 概要
G検定受験にあたり、振り返りのために学習メモをまとめました。
どなたかの参考になれば幸いです。

# G検定概要
[一般社団法人日本ディープラーニング協会から抜粋](https://www.jdla.org/certificate/general/)
>ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているかを検定する。
受験資格	制限なし
実施概要	試験時間：120分
知識問題（多肢選択式・220問程度）
オンライン実施（自宅受験）
出題範囲	シラバスより出題
受験費用	一般：12,000円（税抜）
学生：5,000円（税抜）

# 学習方法
平日の21:00~2300にZoomにて集まり学習を開始
1. 動画 or 書籍での個人学習(40分)
2. [DIVE INTO EXAM](https://exam.diveintocode.jp/exam)の模擬試験を受講(10分)
　※どなたでも受講可能です。
3. チーム内で学習内容を共有(10分)
　※4人くらいがちょうど良かったです。

※1~3を2週して1日2時間ほど学習する感じです。
　個人的に1番理解が遅かったので終わった後、
　復習を1時間ほど取っていたため1日3時間ほど学習しておりました。

## 書籍
[これ1冊で最短合格 ディープラーニングG検定ジェネラリスト 要点整理テキスト&問題集](https://www.amazon.co.jp/dp/4798057304?tag=g-kentei-22&linkCode=ogi&th=1&psc=1)
[最短突破 ディープラーニングG検定(ジェネラリスト) 問題集](https://www.amazon.co.jp/dp/429711609X/ref=sspa_dk_detail_0?psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFCUDBONTVBMlEyU1QmZW5jcnlwdGVkSWQ9QTA0MzI4NzEzR1ZaQVBEUkc1SE1EJmVuY3J5cHRlZEFkSWQ9QUVBSkZQRzJJWFNBUyZ3aWRnZXROYW1lPXNwX2RldGFpbCZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)

## 動画
[しろ玄IT](https://www.youtube.com/channel/UCGeK42CemsetiI_Djebz6aA)
[AIcia Solid Project](https://www.youtube.com/channel/UC2lJYodMaAfFeFQrGUwhlaQ)
[JDLA G検定模試をひたすら解説する！](https://www.youtube.com/watch?v=9_5NqeW6gc4)
[予備校のノリで学ぶ「大学の数学・物理」](https://www.youtube.com/channel/UCqmWJJolqAgjIdLqK3zD1QQ)
[一緒に学べるAIドル](https://www.youtube.com/channel/UCsjS2JbnOeivVWyZr8AEsHw/videos)
[Neural Network Console](https://www.youtube.com/c/NeuralNetworkConsole/videos)

#振り返ってみて
機械学習に関して何も知らない状態からのスタートだったこともあり書籍はとても難しく感じました。
ある程度、機械学習に関して理解がある方は書籍のみで良いと思います。

しかし、私のように事前知識がない状態なのであれば初めは解説動画をざっとみて概要を把握した後に
書籍の内容と解説動画の内容を照らし合わせながら学んでいくと効率よく学べると思います。

また必須ではないのですが、時間の確保が可能であれば数学を学び直したり、
Pythonを使用して実装したりすると楽しく学べると思います。

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

#参考URL
[DIVE INTO EXAM](https://exam.diveintocode.jp/exam)


[しろ玄IT](https://www.youtube.com/channel/UCGeK42CemsetiI_Djebz6aA)
[AIcia Solid Project](https://www.youtube.com/channel/UC2lJYodMaAfFeFQrGUwhlaQ)
[JDLA G検定模試をひたすら解説する！](https://www.youtube.com/watch?v=9_5NqeW6gc4)
[予備校のノリで学ぶ「大学の数学・物理」](https://www.youtube.com/channel/UCqmWJJolqAgjIdLqK3zD1QQ)
[一緒に学べるAIドル](https://www.youtube.com/channel/UCsjS2JbnOeivVWyZr8AEsHw/videos)
[Neural Network Console](https://www.youtube.com/c/NeuralNetworkConsole/videos)

[これ1冊で最短合格 ディープラーニングG検定ジェネラリスト 要点整理テキスト&問題集](https://www.amazon.co.jp/dp/4798057304?tag=g-kentei-22&linkCode=ogi&th=1&psc=1)
[最短突破 ディープラーニングG検定(ジェネラリスト) 問題集](https://www.amazon.co.jp/dp/429711609X/ref=sspa_dk_detail_0?psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFCUDBONTVBMlEyU1QmZW5jcnlwdGVkSWQ9QTA0MzI4NzEzR1ZaQVBEUkc1SE1EJmVuY3J5cHRlZEFkSWQ9QUVBSkZQRzJJWFNBUyZ3aWRnZXROYW1lPXNwX2RldGFpbCZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=)
空の ArrayList を新規生成するラムダ式

# Want
ファクトリメソッドとして空のArrayListを新規作成する Lambda 式を渡したいとき、次のようなラムダを渡すと Sonarqube や IntelliJ 等に "Replace this lambda with a method reference."や"Lambda can be replaced with method reference." というように直接実装を書くんじゃなくてメソッド参照にしろと怒られる。

```
() -> new ArrayList()
```

# Do
次を渡せばOK。

```java
ArrayList::new
```

# Don't
空のArrayListを用意したあとでそのインスタンスに要素を追加していく場合、次はアウト。

```java
Collections.emptyList()
```

## Why
Collections.emptyList() で生成したリストは、基本的に操作できません。
add メソッドなどを呼び出すと `UnsupportedOperationException` が発生します。

次も参考にどうぞ。
https://www.baeldung.com/java-collections-emptylist-new-list
DynamoDBで前方一致検索を実施する

#はじめに
便利で何より安いけど何かと検索についてはあんまり使い勝手の良くないDynamoDBちゃん。今日はそれで前方一致検索をする方法を考えたのでまとめておきたいと思います。事前に言っておきますがScanを使うので使いすぎにはご注意。

#最初に実際にLambdaにぶち込んだソースコードを
```python:lambda_function.py
import json
import boto3
from boto3.dynamodb.conditions import Attr

def lambda_handler(event, context):
    dynamoDB = boto3.resource("dynamodb")
    table = dynamoDB.Table(event["type"])
    title = event["title"]
    fin = title[0]+chr(ord(title[1])+2)

    queryData = table.scan(
      FilterExpression = Attr("Title").between(title,fin)
    )
    return queryData
```

#なにをしてるのか？
これはようするに入力された文字列と入力された文字列の2文字目を2つずらした文字列を用意してその間を取得しています。
今回、テストに使った日向坂46の「キュン」という曲の場合はまず「キュン」という文字列から「キョ」という文字列を作ります。
それが次の部分となります。
``fin = title[0]+chr(ord(title[1])+2)``
あとは普通にscanで差分を取るだけです。ちなみに「キュン」の場合は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861182/9dde0aae-b657-304a-b122-3ba369fa0626.png)
「キュン」から「キョ」の間なので「キュー」で始まる曲が混じってますがそれはご愛敬という事でお願いします。

#最後に
DynamoDBのscanは全件取得してから目当てのデータを絞り込むため、滅茶苦茶苦重いです。特に頻繁に叩かれる事が想定できる場合は素直にRDSを契約しましょう。ぼくはピンチケ開発者なのでまだしばらくDynamoDBで頑張ろうと思います。
pgroongaで電話番号の表記ゆれ検索などを試す

# 概要

[前回の記事](https://qiita.com/paichi81@github/items/5b3c801c978ba6e999f9)で、padrino+pgroongaの組み合わせで、既存サイトを全文検索対応した。
[チュートリアル](https://pgroonga.github.io/ja/tutorial/)に載っているような、電話番号の表記ゆれにも対応して検索しようとしたところで失敗したので、その記録。


# 問題と対策

既存のサイトはpadrino/ActiveRecordで構築されていた。
結果から書いてしまうと、テーブルのカラムがtextになっていなかったのが原因で、migration部分を書き直すことでうまくいった。

```ruby:001_create_db.rb
class CreateContacts < ActiveRecord::Migration[5.2]
  def self.up
    create_table :contacts do |t|
      t.string :name  # <= 手癖で短い文字列string 
      t.string :tel   # <= と軽い気持ちで設定していた。
      t.string :email
      t.text :desc
      t.timestamps null: false
    end
  end

  def self.down
    drop_table :contacts
  end
end
```

何の気なしに↑みたいなmigrationを書いていたが、PostgreSQL向けにはt.stringは character varying(n) として展開される様子（使っているのはActiveRecord 5.2）。
こちらを下記のようにした（手軽に対応できるうちに気づいていてよかった。あとからだと[こちらの記事](https://qiita.com/youcune/items/6fba12a757419986331e)のようにchange_columnすることになったのかも）

```ruby:001_create_db.rb
class CreateContacts < ActiveRecord::Migration[5.2]
  def self.up
    create_table :contacts do |t|
      t.text:telephone 
      t.text:tel
      t.string :email
      t.text :desc
      t.timestamps null: false
    end
  end

  def self.down
    drop_table :contacts
  end
end
```

上記のようにテーブル列の型を変更することで、チュートリアルにあるようなuse_readingを使った読み仮名検索、電話番号の表記ゆれに対応した[あいまい検索](https://slide.rabbit-shocker.org/authors/kou/db-tech-showcase-tokyo-2018/)ができるようになった。
【VScode】Emmetがtabで変換できなかったので方法をメモ

# 概要

今日仕事の際にvscodeのemmetが使えなくなり、

`command 'emmet.expandAbbreviation' not found`

というエラーを吐かれたので復旧した方法をめも。

# 解決策

⌘+, →　⌘+Fで「emmet」で検索→setting.jsonを開く

以下の部分を確認する。
この例だとerbとhtmlとejsファイルをhtmlとして変換できるようにしてある。

```:setting.json
"files.associations": {
        "*.html.erb": "html",
        "*html":"html",
        "*.html.ejs": "html"
    },
```

次に以下を確認する。
ここがtrueになっていないとtabを押しても変換されない。

```:setting.json
"emmet.triggerExpansionOnTab": true
```

最後に


⌘+Q

をしてvscodeを閉じる<font color="Red">(一度終了させないと機能しないので注意)</font>




# 参考記事
https://taiyosite.com/vscode-emmet/

[stack overflow](https://stackoverflow.com/questions/53083159/emmet-expand-abbreviation-doesnt-work-in-visual-studio-code-with-the-attributes)

[vscode公式サイト](https://code.visualstudio.com/docs/editor/emmet)
擬似クラス`○○-child`を付ける位置について

## 擬似クラス`○○-child`を付ける位置について

表題の通りです。
CSS3における疑似クラス`○○-child`（`first-child`や`nth-child`など）は、
**親要素ではなく子要素**に対して付けます。

```CSS:記述例：親要素ｄｉｖの３番めの子要素ｐの文字を赤色にする
div > p:nth-child(3) {
    color: red;
}
```

childなんてなってるものだから、親から見た相対位置で付けるのかなって思ってしまいがちですが、
つまり正しくはこういうことです。

```text:例）nth-child(n)の相対関係
誤：親から見てn番目
正：兄弟から見てn番目
```

兄弟同士での相対関係なんだから、名前がbrotherとか、あるいはせめてchildrenとかの方がイメージしやすかったんじゃないかと思いましたがどうなんでしょう。

### おまけ

ある要素のすべての子要素のうち、先頭の子要素を除外したい時は

```CSS
親要素 > *:not(:last-child){ 修飾内容 }
```

のように、セレクタの`*`（すべての要素）と、「～以外」を表す`:not()`を組み合わせると良い
【GAS×LINE WORKS】湯婆婆 Bot を実装してみた。

湯婆婆 Advent Calendar 2020 の 11 日目。

ふと Advent Calendar を見ていたら湯婆婆が進出していたので参加しました。
大人気ですね！どうぞよろしくお願いいたします。

みなさんご存じでしょうが、元ネタは Nemesis さんの [Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2) です。

# 概要

タイトルの通りなのですが、**Google Apps Script** と **LINE WORKS トーク Bot API** を利用して**湯婆婆 Bot** を実装しました。

湯婆婆 Bot の利用を開始すると、最初の挨拶メッセージで湯婆婆に
『契約書だよ。そこに名前を書きな。』と言われます

名前を告げるとその名前は奪われ、一文字の新しい名前を与えられます。

![1605684451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/98c0a89e-8880-467d-65f3-47fab88ef41f.png)

# コード

```js:yubaba.gs
const options = {
  "apiId" : "xxxxxxx",
  "consumerKey" : "xxxxxxxxxx",
  "serverId" : "xxxxxxxxxxxxx",
  "privateKey" : "-----BEGIN PRIVATE KEY-----\nxxxxxx\n-----END PRIVATE KEY-----",
  "botNo" : xxxxxxx
}

function doPost(e) {
  if (e == null || e.postData == null || e.postData.contents == null) return;
  const requestJSON = e.postData.contents;
  const requestObj = JSON.parse(requestJSON);
  const accountId = requestObj.source.accountId;
  
  const userProperties = PropertiesService.getUserProperties();
  if(!userProperties.getProperty(accountId)){
    LINEWORKS.sendMsg(options, accountId, "契約書だよ。そこに名前を書きな。");
    userProperties.setProperty(accountId, "true");
  } else {
    const name = requestObj.content.text;
    LINEWORKS.sendMsg(options, accountId, "フン。" + name + "というのかい。贅沢な名だねぇ。");
    const randomNum = Math.floor(Math.random() * name.length);
    const newName = name.slice(randomNum, randomNum + 1);
    LINEWORKS.sendMsg(options, accountId, "今からお前の名前は" + newName + "だ。いいかい、" + newName + "だよ。分かったら返事をするんだ、" + newName + "!!");
    userProperties.deleteProperty(accountId);
  }  
}
```

# コード解説

`const options` は LINE WORKS API の認証情報です。
認証情報の取得方法は下記記事を参考にしてください。
[【LINE WORKS】API 認証情報の取得方法まとめ](https://qiita.com/kunihiros/items/54853e910ed1dff9ebdc)

`function doPost(e)` で湯婆婆 Bot が受信したメッセージを受け取っています。

Google Apps Script の `PropertiesService` を使って、契約書を渡した人物かどうかを判別しています。
渡していなければ湯婆婆 Bot は `契約書だよ。そこに名前を書きな。` というメッセージを送り、`PropertiesService` に登録します。

契約書を渡した人物からのメッセージであれば、湯婆婆 Bot は**即座に名前を奪いにかかります**。
メッセージの `length` を取得し、その範囲内で乱数をひとつ生成します。
乱数の位置で文字を取り出したいので、`.slice` して取り出します。
新しい名前が出来上がったら、湯婆婆 Bot は**無慈悲に新しい名を告げます**。

名を奪い終わったので `PropertiesService` から登録情報を削除します。

これで**湯婆婆の一連の動きを再現**することができました！
やったね( ﾟДﾟ)?

# GAS の設定などなど

もし、自分も作ってみよーなんて思った方がいらっしゃったら、Google Apps Script の設定や LINE WORKS Bot の設定なんかは下記記事を参考にしてください。
[GoogleAppsScript で LINEWORKS のチャット BOT を作る](https://qiita.com/kunihiros/items/a94221ad7c9f4de84cf8)

# おわりに

ここまでお付き合いいただきありがとうございました。

LINE Bot と違って LINE WORKS はビジネスユーザがほとんどなので、こういったお遊び系は需要ないんですが、たまには息抜きも良いですよね！

むしろ、こういうの増えていって欲しい。
忘年会ネタとか。
リモート忘年会とかも多いみたいだし、ビジネス利用でもお遊び系 Bot が活躍する場もありそうなんだけどなー。

ではまた！(^^)/

# 参考にさせていただきましたm(_ _)m

[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)
[GoogleAppsScript 公式サイト](https://developers.google.com/apps-script/reference/)
[LINE WORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)
[Google Apps Scriptで乱数を使っておみくじプログラムを作る](https://tonari-it.com/gas-omikuji/)
manで基本的なコマンドの日本語表示がされない原因は？

# 環境
Vagrant + Ubuntu 16.04.5 LTS

# 対応
manのトップページを表示すると、ちゃんと日本語マニュアルが表示されるのだが。

```
$man man
```

このような基本的なコマンドが何故か英語表示される。

```
$man ls
$man cat
```

ロケールには、**ja_JP.utf8**の設定はちゃんとされています。

```
$locale -a
```

manの日本語パッケージは入っています。

```
$apt list --installed | grep manpages-ja
manpages-ja/xenial,xenial,now 0.5.0.0.20140515+dfsg-2 all [インストール済み]
manpages-ja-dev/xenial,xenial,now 0.5.0.0.20140515+dfsg-2 all [インストール済み]
```

manの各コマンド単位のパッケージが存在するか見てみると、catとlsが存在していない。何故？

```
$ls -l /usr/share/man/ja/man1/{cat,ls,man}.1.gz
ls: '/usr/share/man/ja/man1/cat.1.gz' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '/usr/share/man/ja/man1/ls.1.gz' にアクセスできません: そのようなファイルやディレクトリはありません
-rw-r--r-- 1 root root 15K 11月  7  2015 /usr/share/man/ja/man1/man.1.gz
```

取り敢えず、最新版をインストールする事に。

```
$sudo apt install -y manpages-ja manpages-ja-dev
```

インストールされたようです。

```
$ls -l /usr/share/man/ja/man1/{cat,ls,man}.1.gz
-rw-r--r-- 1 root root 1.4K 12月 16  2015 /usr/share/man/ja/man1/cat.1.gz
-rw-r--r-- 1 root root 4.0K 12月 16  2015 /usr/share/man/ja/man1/ls.1.gz
-rw-r--r-- 1 root root  15K 11月  7  2015 /usr/share/man/ja/man1/man.1.gz
```

漸く、日本語表示がされるようになりました。

```
$man ls
$man cat
```