OmniAICreator/Qiita-1.07M huggingface dataset:
conda VS pip ~どちらを使うかはYOU次第~

こんにちは、Natsumiです。
現在機械学習エンジニアとして1ヶ月働いております。
前職はSEでした。
本記事では機械学習を行う際に苦労したcondaとpipについてまとめたいと思います。
間違いや誤認がありましたらご指摘いただけると幸いです。

#目次
1. condaとは
1. pipとは
1. condaとpipの比較
1. 注意事項
1. 最後に
1. 参考文献

## 1. condaとは

Anaconda には conda コマンドがインストールされており、パッケージのインストールや、実行環境の作成・切り替えなどを行います[1.1]。
Conda環境は独立したPythonの実行環境で、他の環境に影響を与えずにPythonのバージョンを用途によって切り替えたり、パッケージをインストールしたりできます[1.1]。
商用利用時には有償版が必要です[1.2]。
Anacondaのリポジトリからインストールする時は、conda環境を有効にしてから以下のコマンドを使います。
私は[Anaconda](https://www.anaconda.com/products/individual)をインストールしてcondaコマンドで環境構築を行なっていました。


```
$conda activate
(base)$conda install 'パッケージ名'
```

## 2. pipとは
pip は、[The Python Package Index](https://pypi.org/) に公開されているPythonパッケージのインストールなどを行うユーティリティで、Python 3.4以降には、標準で付属しています[2]。

パッケージのインストールは、pip の install コマンドで行います。
インストール方法は以下です。

```
$pip install 'パッケージ名`
```

## 3. condaとpipの違い

pipとcondaの違いは、PyPIとAnacondaのそれぞれに付随したインストール・管理ツールであることです。
PyPIとAnacondaはPython用ソフトウェア公開サービス（リポジトリ）です。現状それぞれソフトウェア管理の形態が異なりますので、併用することが難しいです[3]。

## 4. 注意事項

Anaconda下でpipを使うと予期せず環境が破壊され、最悪の場合Anaconda自体の再インストールが必要になります。pipは慎重に使いましょう。

## 5. 最後に
私はMacユーザでAnacondaを使用していましたが、今度はpip環境を作成しようと思っています。

pyenvなどでの開発となると思われるので環境構築しましたら追記で情報をアップデートしたいと思います。



## 参考文献

[1.1]https://www.python.jp/install/anaconda/conda.html

[1.2]https://and-engineer.com/articles/YUGdqRAAACIAsGy_

[2]https://www.python.jp/install/windows/pip.html

[3]https://and-engineer.com/articles/YUGdqRAAACIAsGy_

https://www.python.jp/install/anaconda/pip_and_conda.html
機械学習でかんたんアバター作成　Photo2CartoonをiOSでつかう

#アバター作成モデルがiOSでつかえる

<img src="https://user-images.githubusercontent.com/23278992/147394190-01a2c6be-5056-4f83-b4af-3f494dad47f4.png", width=300> <img src="https://user-images.githubusercontent.com/23278992/147394192-46de7634-c3ce-481f-afa5-8a7ab4603f2e.png", width=300>

写真にアバター風の漫画エフェクトをかけてくれる機械学習モデル。

#機械学習モデルを扱うのは難しそう？
とはいえ、機械学習モデルをつかうのはたくさん手順が必要なんじゃないの？

#変換済みのCoreML Modelをつかえばかんたん
変換済みのものがこちらにございます。これをつかえばすぐにiOSでアバター変換ができます。

#かんたん手順
[**CoreML-Models**](https://github.com/john-rocky/CoreML-Models)からPhoto2CartoonのCoreMLモデルをダウンロードします。
プロジェクトにドラッグします。
Visionで実行します。

```swift
guard let model = try? VNCoreMLModel(for: photo2cartoon(configuration: MLModelConfiguration()).model) else {fatalError("model initialization failed")}
let coreMLRequest = VNCoreMLRequest(model: model)
coreMLRequest.imageCropAndScaleOption = .scaleFill
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
try? handler.perform([coreMLRequest])
guard let result:CVPixelBuffer = coreMLRequest.results?.first as? VNPixelBufferObservation else { return }
```

お手持ちの画像で試すだけなら、ダウンロードしたmlmodelファイルを開いて画像をドロップすると、アバターに変換されます。

<img width="600" alt="スクリーンショット 2021-12-26 7 22 43" src="https://user-images.githubusercontent.com/23278992/147394578-b7b28213-5b44-41fd-9d06-adc77ba2888f.png">

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
簡単な開発内容をお書き添えの上、お気軽にご連絡ください。
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
.vimrcの設定例

プログラムコーディングには10年以上vimを使っています。
統合開発環境(IDE)は確かに便利なのですが、パソコンが重くなってしまうことが多く、それに比べるとvimはシンプルなエディタなのでサクサクプログラミングできるのがその理由です。

自身の中で標準的なvimの設定ができてきたのでメモしておきます。

```:.vimrc
set enc=utf8
set number
set tab=4
syntax on
```

* enc：文字コードを指定します
* number:行の先頭に行番号を表示します
* tab:インデント時に何文字下げるかを指定します
* syntax:ソースコード記載時に予約語などを自動で色付けします
逆上がりの原理　何度やっても下に落ちてしまう現象の解説と対策を説明

#結論
逆上がりの原理を2点で説明します。逆上がりができない方は逆上がりの原理を知らない方が多いです。ずばり、助走をつけて鉄棒に近づける方向に腕で体を引き続けると逆上がりができます。この原理を「慣性力」「円運動」の2つで説明します。

#1点目　慣性力
逆上がりをするときは誰も回るように押してくれません。その押して欲しい力として、「慣性力」というものが必要です。慣性力とはモノが動き続ける力を指します。モノが動いていると、ずっとその動きをし続けるように世界が力を生み出してくれます。例えば、乗り物に乗っているときにブレーキを踏むと前に倒れそうになる力です。ブレーキを踏まなければ、ずっと同じ早さで前に進んでいるはずなので、世界が皆さんを後ろから前に押してしまうんです。

#2点目　円運動
円運動とは鉄棒を中心(横から見て)に回る時の動き方を指します。円運動をするときは、常に回る中心に向かって力を加え続けないといけません。例えば、縄跳びを回し続けるには、手に持つ部分で常に縄を引っぱっているからです。回る中心に向かって力を加えないといけない理由は慣性力が原因です。円運動は慣性力に逆らわないとできない運動です。なぜなら同じ運動をしているわけではなく、動く向きが常に変わっているかです。

#まとめ
話は戻りますが、逆上がりをする人は鉄棒を中心に円運動を行っています。助走をつけることで、動き始めます。腕で体を鉄棒に近づける方向に引くと、慣性力に逆らう力が生まれて、円運動し続けて、逆上がりができます。中学校で習う「慣性力」と高等学校で習う「円運動」の組み合わせで逆上がりを説明しました。https://ja.wikipedia.org/wiki/%E9%80%86%E4%B8%8A%E3%81%8C%E3%82%8A
djangoでsqliteの代わりにMySQLを利用する

# 目的
djangoのチュートリアルなどは基本的に準備の要らないsqliteで行ってきたが、より実務に合わせたものにしたく、使われることの多いMySQLを今回は利用する
# 実施環境
### ハードウェア環境
| 項目 | 情報 |
|:-:|:-:|
| OS  |macOS Catalina(10.15.7)   |
|ハードウェア   |  MacBook Air (11-inch, Early 2015) |
|プロセッサ   | 1.6 GHz デュアルコアIntel Core i5|
|メモリ   |  4 GB 1600 MHz DDR3 |
|グラフィックス   |  intel HD Graphics 6000 1536 MB |
### ソフトウェア環境
| 項目 | 情報 |
|:-:|:-:|
| homebrew  | 3.3.8 |
| mysql | Ver 8.0.27 for macos10.15 on x86_64 |
| python  | 3.8.12 |
| django  | 3.1.2 |
| anaconda  | 4.10.1 |
| pip  | 21.2.4 |



# 前提
・python3系
・django
・homebrew
等がインストール済みであること

# 概要
1. MySQLのインストール
2. MySQLの起動
3. データベースの作成
4. djangoのsettings.pyを修正
5. ドライバのインストール
6. sqliteの時と同様にマイグレーション

# 詳細
### 1. MySQLのインストール
homebrewでmysqlをインストールする

```
brew install mysql
```
今回は8.0.27(最新版)をインストール
### 2. MySQLの起動
インストールしたMySQLを起動する

```
mysql.server start
```
mysqlのアクセスユーザー名とパスワードを設定する

```
mysql -u root -p
```
### 3. データベースの作成

```
mysql> create database test_db;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
```
### 4. djangoのsettings.pyを修正

```settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # sqliteからMySQLに変更
        'NAME': 'database_name', # 3で作成したプロジェクトで使用する予定のデータベース名
        'USER': 'root', # MySQLのユーザー名
        'PASSWORD': '', # ユーザー名と共にログインに利用したpassword
    }
}
```
### 5. ドライバのインストール
#### ドライバって何？
[こちら](https://wa3.i-3-i.info/word11403.html)にも記載のあるように一般的には
**マウスやキーボードやCPUやモニタなどのデバイスを動かすためのソフトのことをドライバという**

pythonでMySQLを使う場合にもpythonがMySQLに接続するためのドライバが必要となる。
ドライバはいくつか種類があるが、推奨とされているmysqlclientを利用する

```
$ pip install mysqlclient
```


### 6. sqliteの時と同様にマイグレーション

```
python manage.py makemigrations
python manage.py migrate
```
マイグレーション完了といきたいところですが、

```
django.db.utils.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/opt/anaconda3/envs/djangoenv/lib/plugin/caching_sha2_password.so, 2): image not found")
```
このようなエラーが表示された場合は[こちらの記事](https://qiita.com/satoryosato@github/items/611809ebfb28c689ae8e)を参考にユーザーの認証方法を変更する。

マイグレーションをもう一度実行する

```
python manage.py makemigrations
python manage.py migrate
```

```
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying tinder.0001_initial... OK
Applying tinder.0002_auto_20211219_1625... OK
```

気持ちいい！！！！
# 参考文献
https://qiita.com/kanazawa1226/items/e222604943c500801746
小道具：([括弧])を統一する

tuple() と list[] の混在をなくす小道具。

```python:deeplistuplify.py
def deeplistify(data):
    if type(data) in (tuple, list):
        return [deeplistify(d) for d in data]
    return data

def deeptuplify(data):
    if type(data) in (tuple, list):
        return tuple([deeptuplify(d) for d in data])
    return data
```

```python:テスト
>>> lt = [1, 2, 3, [4, 5, [False, (6, [7, 8])], 9, 10], 11]
>>> print(deeplistify(lt))
[1, 2, 3, [4, 5, [False, [6, [7, 8]]], 9, 10], 11]
>>> print(deeptuplify(lt))
(1, 2, 3, (4, 5, (False, (6, (7, 8))), 9, 10), 11)
```
wsl2でfzf_cdrを使ってonedrive上のファイルにアクセスするときに困ったこと

#はじめに
wsl2もfzfも便利ですよね。
特にfzfはcdrと組み合わせて履歴からディレクトリ移動できるようになると、ディレクトリ移動が爆速になります。

※参考
https://www.rasukarusan.com/entry/2018/08/14/083000

```zshrc
# fzf-cdr 
alias cdd='fzf-cdr'
function fzf-cdr() {
    target_dir=`cdr -l | sed 's/^[^ ][^ ]*  *//' | fzf`
    target_dir=${target_dir/\~/$HOME}
    if [ -n "$target_dir" ]; then
        cd $target_dir
    fi
}
```

ただ、これには問題があり、名前にスペースがあるディレクトリに移動しようとすると
no such file or directory:
と怒られてしまいます。

名前にスペースがあるディレクトリなんて作らなければいいじゃんと思うのですが、、、
会社などの組織で利用しているOneDriveと同期させたフォルダは"OneDrive - 組織名"となってしまい、スペースが入ってしまいます。
私は頻繁にwsl2からOneDrive上のフォルダにアクセスするのでfzf-cdrできないのは手間です。

#調査

```zshrc
# スペース入りのディレクトリを作成しみる。
mkdir test1\ 2

# cdで入ってみる。
cd test1\ 2
# OK

dir='test1\ 2'
cd $dir
# NG

dir='test1 2'
cd $dir
# OK
```

どうやら、cdに直接打ち込む場合はスペースの前にエスケープが入りますが、
変数で指定する場合はエスケープは不要のようです。

#解決策
```zshrc
# 修正後
# fzf-cdr 
alias cdd='fzf-cdr'
function fzf-cdr() {
    target_dir=`cdr -l | sed 's/^[^ ][^ ]*  *//' | fzf`
    target_dir=${target_dir/\~/$HOME}
　　 target_dir=${target_dir//\\/}
    if [ -n "$target_dir" ]; then
        cd $target_dir
    fi
}
```
解決策としては、単純ですがエスケープを取り除く処理を一文つけたしました。
これでちゃんと、wsl2からOnedrive上のフォルダにアクセスできるようになりました。
トラックパッドを極力触りたくないので、キーボードだけで解決する


こんにちは、[hihumikan](https://qiita.com/hihumikan)です。
この記事は、[Volare Advent Calendar 2021](https://qiita.com/advent-calendar/2021/volare)、25日目の記事です。

## 概要


この記事は、MacOSで出来るだけトラックパッドを使わずに操作したいので、色々**ショートカット等をまとめた**記事となります。




## 解決したい事

- キーボード操作で出来る操作を知りたい　マウス触りたくねえ！！
    - 便利なショートカットを利用したい
    - ソフトウェアで解決出来るならそれも利用したい
    - 時間短縮出来るコーディングがしてみたい


## 入力操作

| コマンド          |     ショートカット内容             |
| -------------------- | ------------------------ |
| command + C          | コピー                   |
| command + V          | ペースト                 |
| command + Z          | 取り消し                 |
| control + o          | 改行                     |
| command + M          | 最前面のウィンドウをDockにしまう |
| command + W          | 最前面のウィンドウを閉じる       |
|          command + Q            |             アプリケーションを終了する            |
| option + command + D | Dock の表示／非表示      |

## カーソル移動

| コマンド          |     ショートカット内容             |
| -------------------- | ------------------------ |
| option +  ← or →         | カーソルから一単語移動                  |
| command + ← or →         | 行頭,行末まで移動                       |
| command + ↑ or ↓         | 文章全体の先頭,行末まで移動             |
| control + o              | 改行                                    |
| option + delete          | 左側の1単語を削除                       |
| shift + command + ← or → | カーソルから行の先頭,行末までを選択     |
| shift + command + ↑ or ↓ | カーソルから文章全体の先頭,最後まで選択 |

## 画面操作

### Shiflt
ちょうど良くショートカットのみで画面分割してくれるやつ
https://github.com/fikovnik/ShiftIt
![](https://i.imgur.com/KC8qfnz.jpg)



---

### デスクトップ間をショートカットで移動できる設定
![](https://i.imgur.com/BY6u3Eh.png)



---

### hyperswitch
ウィンドウ間の選択をCommand+tabのようにするやつ
https://bahoom.com/hyperswitch
![](https://i.imgur.com/jgTC3Hl.jpg)



## 感想

以上です。案外と使っていないけど便利そうなショートカットキーがあるので是非習得したいですね・・・。 Chromeの拡張機能で[Vimライクに使えるやつ](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)もあるらしいです。

VSCodeとかXcodeのショートカットキーも暇があれば追記したいと思います。

ありがとうございました。

## 参考文献
https://support.apple.com/ja-jp/HT201236
✨キラキラPC✨を作ろう（主要部品の選定編）

仮題を「キラキラの何かを作る」と適当に決めてしまいました・・・
その時点では、LEDを使ってMTBのハンドル端につけるライトを作ろうと思っていました。
しかしその後、現メインPCが調子悪くなり始め、Windows 11対応のために前々から考えていた新メインPC計画に着手したので、ライトは部品を少し買って放置してしまいました。
そこで今回は予定を変更し、✨キラキラPC✨の設計について書きたいと思います。

#「キラキラ」を再定義

キラキラ（きらきら）の意味は主に3つあると思います。

1. ✨光り輝く✨さま
- ✨際立って立派な✨さま（古文？）
- ✨おしゃれなカフェで作業できる職種✨（「✨キラキラエンジニア✨」など）

上の1.ではただのゲーミングPCになってしまいます。
メッキとかイルミネーションの類の✨無駄に光るもの✨は嫌いなので却下。
2.と3.を両立することを考えます。
つまり✨**高性能と持ち運べることを両立**✨すればよいわけです。

# 現メインPC・メインモバイルPCについて

主要パーツの仕様は以下の通りです。

## 現メインPC

- **大きさ L 481mm x W 205mm x H 458.5mm** 重い
- Core i5-6600K
      - 4-cores(4-threads)
      - 3.5GHz(TB 3.9GHz)
      - 91W
      - 2015年発売
      - **Windows 11非対応**
- DDR3 24GB
- Radeon RX470
- NVMe SSD 250GB+いろいろ

## メインモバイルPC（VAIO SX14）

- 14インチ、1kg
- Core i5-10210U
    - 4-cores(8-threads)
    - 1.6GHz(TB **4.2GHz**)
    - **15W**
    - 2019年発売
- LPDDR3 8GB
- iGPU
- NVMe SSD 1TB

## CPUに関して

現メインPCよりメインモバイルPCのほうがCPU性能がいいようです
(ベンチマーク https://www.cpu-monkey.com/ja/compare_cpu-intel_core_i5_10210u-941-vs-intel_core_i5_6600k-521)。
**6分の1程度の消費電力で同等以上の性能**はすごい。
そしてメインPCと呼ぶにはちょっと性能不足を感じてしまいます。
Apple M1にも

## GPUに関して

GPUに関しては、現メインPCには3画面(ときどき4画面)繋いでいるのもあり、5画面化した例のグラボを使用。
これはさすがにRX470が勝利。
マイクラを重めの設定で動かしても、CPUに律速されてしまうほど。

## ストレージに関して

現メインPCはファイルサーバーを兼ねていて、HDDが4つも搭載されています。
重く大きいのはストレージの影響が大きいです。

## 可搬性に関して

現メインPCの運搬は車が必要なので、カフェに持って行くのが大変。

# 新メインPCをキラキラPCにする条件

✨**高性能と持ち運べることを両立したキラキラPC**✨にするために、以下の条件を課します。

- CPU：6600Kより大幅に性能向上
- GPU：RX470以上
- メモリー：仮想マシンやAutocad CFDなどの重めのソフトウェアを考え、16GB以上
- ストレージ：NVMe SSDx1~2枚
- 大きさ：ペットボトル、モバイルモニターなどと一緒にバッグに入れられる
    - よく使うバッグはだいたい370mm x 270mm x 130mmくらいまで入る
- 将来的にアップグレードできるように、特殊なパーツは使用しない

これで主要パーツはだいたい決まりますね。

# 新メインPCの主要パーツ

## CPU

12世代Coreを採用します。
i5-12600K以上ならコア数倍以上、性能は数倍、電力効率も現行CPUの中で抜群（≒冷やしやすい）です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/3dcfb051-7e22-e0d8-be06-0905b0311296.png)

## GPU

RX470でもいいですが、現行だとGeForce GTX 1650やRTX A2000あたりが候補に挙がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/519e7d59-6583-22a9-b355-e8fef990c6cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/74b415b8-461b-08a8-17ee-b4cfc910ac89.png)

## メモリー

DDR4は飛ばすと決めていたので、**絶対にDDR5**。
現メイン機より大きい✨32GB✨にしたいです。
でも今はDDR4の倍程度の値段で売られています。
買う時までに安くなるといいですが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/28b845e6-29be-0996-1649-0851b38a1980.png)

## ストレージ

（ファイルサーバーを別マシンにし）1TBくらいのSSD1枚で済ませます。
足りなくなったら大容量で安いSSDを追加すればいいのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/b4b4fc05-ec1a-c0cd-d458-8d7aeed09f3a.png)

## マザーボード

このサイズならMini-ITX一択でしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/e977428a-0070-a239-208e-167d4bdcb58a.png)
ただ、Mini-ITXでDDR5となるとまだ選択肢が1つしかなく、とても高価です。
2製品目が出てから、そのとき安いほうにしようと思います。

## ケース

大きさの条件からDan Cases A4 SFXくらいしか選択肢がありませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2333288/2ed730ea-6a02-de5f-4123-f56fd239127e.png)
かっこいい！採用！といきたいところですが、お値段・・・
ライザーケーブルの相性や安定性、吸気口のホコリ対策のしにくさも気になります。

さて、ケースとか電源とかどうしましょう？？？
（この記事を見ている人はわかっていると思いますが）

続く？
CREとしてどのようにアナリティクスを活用していくか

# はじめに
この記事はHamee Advent Calendar 2021 - Qiita の22日目の記事です。（遅れました）
https://qiita.com/advent-calendar/2021/hamee

僕は現在、SaaS型のBtoBサービスのCREチームに所属しています。
所属から1年半ほど経過しましたが、今時点で「ガンガンCRE活動できてるぜ！」という実感が得られていないので、どういうことができていると実感が得られそうなのか今一度考えてみることにします。

# CREって？
CREには以下の役割があるそうです。

> ・カスタマーの不安を取り除くこと
> ・エンジニアリングの視点で信頼感を高めるための活動を行っていくこと 
> https://karakuri.ai/media/727#:~:text=%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%83%BC%E3%81%AE%E4%B8%8D%E5%AE%89,%E3%81%A3%E3%81%A6%E3%81%84%E3%81%8F%E3%81%93%E3%81%A8

そして、それを実現するために必要なスキルは以下であると言われているようです。

> 1. データ分析・統計の知識
> 2. WEB開発の経験
> 3. 現場のメンバーとのとのコミュニケーション能力
> 4. 未知のテクノロジーへの対応力

この中でも特に1は、**「カスタマーの不安を取り除くこと」**を達成するのに必要不可欠な要素でしょう。
データ分析・統計の知識を得るだけではなく、どういった形で活用できるかを探っていく必要もあるでしょう。

# 何を分析するのか

「データ分析しよう」と言っても一体何を分析すればいいのでしょうか。
CREの目的は**「カスタマーの不安を取り除くこと」**であるとすると、データから**カスタマーの不安**を見つけ出せることが重要であると考えられます。

**不安**と言っても抽象的なので、実際にはCRE自身が定量的に**「こうなっている場合はカスタマーが不安」**という**指標**を決める必要があるかと思います。
顧客分析においてここが一番難しいところなのではないでしょうか。

「どのように指標を決めるべきなのか？」

## 優れた指標

以下の書籍に、顧客分析における**優れた指標**についての記載がありました。

https://www.amazon.co.jp/Lean-Analytics-%E2%80%95%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%81%A8%E6%B4%BB%E7%94%A8%E6%B3%95-LEAN-%E3%82%A2%E3%83%AA%E3%82%B9%E3%83%86%E3%82%A2%E3%83%BB%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB/dp/4873117119

結論から言うと、**「これまでと異なる行動ができる」**指標が**優れた指標**とあります。

そのためには以下の3つを満たしている必要があります。

### 比較ができる
時間軸（去年と今年）、ユーザーグループ（無料体験ユーザーと契約ユーザー）と言った比較ができるものがあること。

### わかりやすい
覚えやすく、議論に使いやすく、数値の変化を行動に取り入れやすいこと。

### 比率や割合
単純な回数等ではなく比率であること。

これらを踏まえた上で、A/Bテスト、コホート分析等、分析方法は様々ありますが、今回は割愛します。

## SaaSサービスの分析
同書9章にてSaaS企業のアナリティクスについて触れています。
この章では**「エンゲージメントの計測」**と**「チャーン」**について解説されています。

エンゲージメントの計測は訪問頻度、訪問の度にどのくらい利用するか、何をしているかを計測することです。
本書ではエンゲージメントの計測について以下のように述べている。
> エンゲージメントを計測するデータ駆動の手法は、製品やサービスがどれだけ定着しているかだけでなく、誰が定着していて、あなたの取り組みが報われているかどうかも示すものでなければならない。

チャーンの計測はサービスを離脱した人の割合(解約だけでなく非アクティブユーザーも)
> SaaSでは、チャーンが全て

と本書にあるが、他のサブスクリプション等の書籍でも必ず触れられるので、SaaSのデータ分析における重要項目でしょう。
エンゲージメントやチャーンの分析はビジネスサイドの役割となる場合が多いのかもしれませんが、**「カスタマーの不安を取り除くこと」**を叶えるにはCREとしてこれらを意識して分析・改善していく必要があるでしょう。

# さいごに

具体的な指標は述べていませんが、チャーン等を意識した開発を行っていこうと考えています。

初のアドカレでしたがなかなか内容が決められず遅れての投稿になってしまいました。
セーフですかね。アウトですか。（2021/12/26 02:43:05）
【LaTeX】卒業論文始まる

この記事は[CPS Lab Advent Calender 2021](https://adventar.org/calendars/6489)の25日目の記事です.
# はじめに
メリークリスマス🎉
今日から卒論，修論の時期ですね！
でも，論文書くにもLatex環境構築の壁[^1]があります．
今回はこの環境構築について論文の書きやすさに着目して書いていきます．

## 要件

- すぐに見せることができる．
- loacal環境をぐちゃぐちゃにしない．
- バージョンの管理ができる．

この3つの要件を満たす環境を構築します．


## イメージ
![構成のイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169599/6eda7a2d-2ddb-b11a-52da-ab677ca655dd.png)


サイズの重い画像やpdfはGoogleDriveへ，その他はgithubで管理します．
また，Dockerを使うことで，ローカル環境を汚さずに済みます．[^2]
さらに，gitで管理することでコードのバージョンまで管理することができるのです．

## vscode
1. vscodeの拡張機能で[LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)をインストールしてください．
![スクリーンショット 2021-12-22 20.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169599/2a8e1456-30cf-0f70-a348-752820534dcf.png)

2. vscodeで「command + ,」[^3]で設定を開き，「latex」で検索します． settings.jsonで開いて該当箇所に下記を追記します．

```json
    "latex-workshop.latex.tools": [
      {
        "name": "latexmk",
        "command": "latexmk",
        "args": ["-synctex=1", "-interaction=nonstopmode","-file-line-error", "-outdir=%OUTDIR%", "%DOC%"]
      }
    ],
    "latex-workshop.chktex.enabled": false,
    "latex-workshop.docker.enabled": true,
    "latex-workshop.docker.image.latex": "tianon/latex",
    "latex-workshop.latex.autoBuild.run": "onSave",
    "latex-workshop.latex.outDir": "output",
    "latex-workshop.synctex.afterBuild.enabled": true,
    "latex-workshop.view.pdf.viewer": "tab",
    "latex-workshop.latex.clean.subfolder.enabled": true,
    "latex-workshop.latex.autoClean.run": "onBuilt",
    "latex-workshop.latex.clean.method": "glob",
    "latex-workshop.latex.clean.args": ["-c", "%TEX%"],
```
この設定で，「dockerの有効」，「保存で即ビルド」，「一時ファイルの削除」，「生成されるpdfのフォルダを指定」を設定しています．
詳しくは[公式リファレンス](https://github.com/James-Yu/LaTeX-Workshop/wiki)を参照してください．

## Docker
Docker自体の環境構築は書きません．

imageをpullしてきます．以上です．

```bash
docker pull tianon/latex
```
## ファイルの作成
作業用のフォルダを作ってvscodeで開きます．
作業用フォルダに「.latexmkrc」を作り，下記をコピペします．

```perl
#!/usr/bin/perl
$latex = 'platex -kanji=utf8 -guess-input-enc -interaction=nonstopmode %O %S';
$bibtex = 'pbibtex -kanji=utf8 %O %B';
$dvipdf = 'dvipdfmx -p a4 %O -o %D %S';
$pdf_mode = 3;
$pdf_previewer = 'open -a Preview';
```

あとは，texを開いてビルドします．生成されたpdfは同じフォルダ内のoutputフォルダ内にあります．

## git
githubで論文用のリポジトリを作成します．
あとは，作業フォルダで「commnd + `」でターミナルを開き，論文用のリポジトリ（hogehoge.git）を設定します．

```bash
git init .
git remote add origin hogehoge.git
```
重たいデータ（画像やpdf）は.gitignoreで回避するといいでしょう．

```
./output/*
./images/*
```

## Google Drive
上記で.gitignoreしたフォルダをGoogleDriveに追加します．


https://www.google.com/intl/ja_jp/drive/download/

GoogleDriveの[設定]→[フォルダを追加]で.gitignoreしたフォルダを追加します．

## さいごに
以上でいい感じのLaTeX環境が整いました！！
良い卒論ライフを！



[^1]: overleafでいいよね...?
[^2]: OSアップデート等で環境が破壊されるのを回避！
[^3]: windowsは知らない
VisualStudioでフォームに画像を表示する

環境
Visual Studio 2015 (Win10標準の.net4.6がデフォルトで使えるため）

手順
１，新規プロジェクトを作る
２，フォームにPanelをドラッグする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492471/67494051-2f8a-1f0b-be35-cedd48bda4bf.png)

必要であればPanel1のDockをFillにする．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492471/3d037b30-cc4a-8f96-53f1-7738119d4150.png)

３，プロパティのイベントからPaintのイベントハンドラをダブルクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492471/6d2f3c1a-2b09-b42a-1dba-c97bdf8b7354.png)

４,作成されたPaintベントハンドラpanel1_Paintにプログラムを記述する

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (currentImage != null)
            {
                //　画像を0,0に描画する
                e.Graphics.DrawImage(currentImage,
                    0, 0, currentImage.Width, currentImage.Height);
            }
        }

５，フォームクラスのメンバ変数にImageを登録する

    public partial class Form1 : Form
    {

        //画像ファイルを読み込む
        Image currentImage = Image.FromFile(@"C:\test\test.gif");

        public Form1()
        {
          

６，実行すると画像が表示できる
【Rails】特定のカラムのデータを配列で取得する方法【初学者の疑問点を簡潔に解説】

## はじめに
　本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
　今回の疑問点は、

　　_データベースから特定のカラムを取得して、all?メソッドで判定する方法_
　
　です。　

## 疑問点についての解説

###結論
pluckメソッドを使用して配列でデータを取得し、all?メソッドで判定する。

###具体例

```sample_app.rb

@Taro = User.where(name: "太郎").pluck('age')
@Taro.all?{ |w| w == '20' }

``` 

上記のように記載することで、
`where`でnameカラムが太郎であるレコードを全て取得し、`pluck`でさらにageカラムのみに絞り、配列で取得します。
そして、`@Taro.all?{ |w| w == '20' }`で取得した配列の要素一つ一つに対して`20`であるか否か判定され、全てが`20`であれば、trueが返されます。
`where`で取得した太郎さんが全員20歳であれば`true`になります。

selectメソッドを使うとActiveRecord::Relationオブジェクトを返すので、all?メソッドが使用できないため、配列で取得するためにpluckメソッドを使用しています。

ActiveRecord::Relationオブジェクトをeachとifを使って判定しても同じような処理を実現することはできますが、記述が長くなってしまいます。

まだ、学習を始めて2ヶ月弱のため、もっと良い書き方があれば、ご教示いただけますと幸いです。


## まとめ
時間がある時にもう少し丁寧に書き直そうと思います。
pythonのモジュールとパッケージ、ライブラリの違い

## 勉強前イメージ

イメージ的に
モジュール > パッケージ > ライブラリ って感じ

## 調査

### モジュール とは

関数やクラスをまとめたものになり、1つのpythonのファイルになります。
別のファイルから読み込んで使用することがあり、
`import XXXX` と記載して使用します。

以下のように
`print('test')` と記載して、それだけを実行させるのもモジュールになります。
以下だと `import test` になります。

![12021-12-25 # pythonのモジュールとパッケージ、ライブラリの違い - diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/eae32823-387b-19e4-2439-bfff4e85f9cf.png)


### パッケージ とは

パッケージはモジュールを集めたもので
イメージとしては複数のpythonのファイルが入ったディレクトリのようなものになります。

イメージとしては以下になります。
複数のモジュールが入ったものがパッケージで、
パッケージを呼び出すのも `import all_test` でできます。

![22021-12-25 # pythonのモジュールとパッケージ、ライブラリの違い - diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/62c50fdd-075e-c68b-9f4e-92dc4bc2bc76.png)


### ライブラリ とは

パッケージをまとめたもので、
ライブラリには2種類あります。

- 標準ライブラリ

pythonで標準に準備されているライブラリで、追加でインストールなしに使用できます。

- 外部ライブラリ

必要に応じてインストールが必要なライブラリになります。

### 全体を通して

モジュール、パッケージ、ライブラリのイメージとしては以下。
ただ、ライブラリは結構曖昧でモジュールのことを読んだりパッケージのことを読んだりする場合もあるので
一例を思っていただけますとありがたいです。

![32021-12-25 # pythonのモジュールとパッケージ、ライブラリの違い - diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9a449f13-5fe4-3ff3-f9e6-1cf28b19b851.png)


## 勉強後イメージ

雰囲気合ってた感じはするけど
結構いろいろ違うこと書いてるところもあるから難しいね。

## 参考

- [【Python】モジュールとパッケージ、ライブラリの違いについて解説！](https://py-memo.com/python/module-package-library/)
- [マスターしよう！Pythonでimportを使う方法について徹底解説！](https://www.tech-teacher.jp/blog/python-import/)
CRTPにおける基底クラスのコンストラクタ中での派生クラスメンバ関数呼び出しの実行時エラー

# はじめに
静的 Template Method パターンの実装に利用されるCRTP。
抽象クラスで実装した場合のオーバーヘッドがなくなるところがとても素敵だと思います。

それが楽しくて、馬鹿の一つ覚えのようにCRTPを使っていたのですが、基底クラスコンストラクタ中で派生クラスのメンバ関数呼び出しが含まれる処理を書き、ビルドして実行したところ、未定義領域へのアクセス違反の例外が投げられました。

当時は原因が全く分からず、悲しみに暮れてました。
原因はすごくくだらないことでしたが、備忘録として。

MSVCのC++14以降でコンパイルしてます。

# 原因
問題の派生クラスのメンバ関数中で、派生クラスで定義されているポインタメンバ変数の中身へのアクセスが含まれていたためでした。
基底クラスのコンストラクタ実行中は、まだ派生クラスのメンバ変数の初期化が行われていないはずですから、そりゃあ未定義ですよね。

なお、基底クラスのコンストラクタ中に、派生クラスで定義されている非ポインタのメンバ変数へのアクセスが含まれる場合はより危険です。
未初期化のでたらめな値を読み取りながらも、例外は送出されず、何事もなかったかのように処理を継続します。

派生クラスのメンバ変数へのアクセスが含まれなければ、基底クラスにおけるメンバ関数の呼び出しは問題なく動作します。

# 再現コード
`Base::hoge()`でポインタメンバ変数の中身へアクセスしている`Fuga::hogehoge()`が呼び出されています。
その`Base::hoge()`をBaseコンストラクタ中で呼び出したとき例外が送出されます。

```C++
// 基底クラス
template <class Derived>
class Base
{
public:
    Base()
    {
        int num = this->hoge(); // NG
    }
    int hoge()
    {
        // 派生クラスのメンバ関数を呼び出している
        return static_cast<Derived&>(*this).hogehoge();
    }
};

// 派生クラス
class Fuga : public Base<Fuga>
{
public:
    Fuga() : member(new int(5)) {}
    ~Fuga() { delete this->member;  }
    int hogehoge()
    {
        // Baseコンストラクタからの呼び出しの場合、ここでアクセス違反発生
        return *this->member;
    }
    // ポインタメンバ変数
    int* member = nullptr;
};

int main()
{
    Fuga fuga;
    int num = fuga.hoge(); // OK
    return 0;
}

```
## `Fuga::member`が非ポインタの場合
下記は非ポインタメンバ変数の場合です。
`Fuga::member`は宣言時に0初期化しているのでBaseコンストラクタ中の`num`の値も0になるように見えますが、おそらくでたらめな値が入っています。

```C++
// 基底クラス
template <class Derived>
class Base
{
public:
    Base()
    {
        int num = this->hoge(); // numにはでたらめな値が入るが、そのまま処理が流れる
    }
    int hoge()
    {
        // 派生クラスのメンバ関数を呼び出している
        return static_cast<Derived&>(*this).hogehoge();
    }
};

// 派生クラス
class Fuga : public Base<Fuga>
{
public:
    int hogehoge()
    {
        // 非ポインタなので例外は発生しないが...
        return this->member;
    }
    // 非ポインタメンバ変数
    int member = 0;
};

int main()
{
    Fuga fuga;
    int num = fuga.hoge(); // OK
    return 0;
}

```

# あとがき
どこに派生クラスのメンバ変数へのアクセスが紛れ込んでいるかもわからないので、場合によってはCRTP利用時の基底クラスコンストラクタ中でのメンバ変数呼び出しを、すべて禁止するのもありな気がしました。

往々にして当たり前のことほど考慮から抜けてしまい、原因の究明時に気づかないものですね。
類似gemを教えてくれるサイト

gemの選定時に知りたい情報No.1といえば、類似gemの一覧です（当社調べ（調べてない（当社もない）））。

しかしrubyに限らず類似ライブラリの検索というのは意外と難しく、GitHubで検索しようにもキーワードに上手く引っかからないケースが多いです。

導入後に、より要件にフィットする類似ライブラリを見つけたことのある人の割合はなんと三人に五人です（当社調べ（調べてない（当社もない）））。

検索してたら偶然こんなサイトを見つけ、共有したく、この記事を書きました。

（私以外の全人類が知っている情報でしたらすみません）

https://ruby.libhunt.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/844d7da3-e87e-b026-a101-766a3a3d8421.png)

類似gemの一覧、及び大雑把な比較情報を出してくれるサイトです。

例えばみんな大好き`Ruby on Rails`ですと、こういう情報が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/5591b09d-886a-9d2d-c2be-6133da77092e.png)

クリックすると。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/2300b8f2-c1e3-909c-af1c-9b4076a5e6cd.png)

大体の流行り具合やライセンス、メンテナンスが続いてるかの情報くらいはここでわかります。

（基準はわかりませんが、RailsのCode Qualityは低いようです……）

では、良きgem選定ライフを。
Oculus Quest 2 開発のための Unity 開発環境構築


ヒーローズリーグに応募したところ、LINE APIヒーロー賞を受賞し、副賞としてOculus Quest 2を頂きました。__LINE株式会社様ありがとうございます。__

https://protopedia.net/event/21

折角なので、Oculus Quest 2向けアプリを開発してみようとUnityのインストールを試みるも、すんなり行かなかったので記録しておきます。

# 前提

ここではMacBook Proに開発環境を構築します。

- MacBook Pro (2016)
- macOS Monterey (12.0.1)
- Oculus Quest 2

# Unity環境構築

Unityのダウンロードはこちらからできます。

https://unity.com/ja/download

## Unity Hubインストール

まずはUnity Hubをインストールします。Unity HubはUnityの複数バージョンを管理したりプロジェクトやチュートリアルなどのランチャーになるソフトの様です。

Rubyで云えばrbenvやrvmにランチャーが付いた感じと考えるとわかりやすいと思います。


普通であれば上にあるのをインストールするのですが、うまくいきませんので一番下の__Download for Mac__ を選びましょう。

![395862965ec6f39a539e0b3207557dd2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/470ad2ee-4478-44b4-1746-a01fe48d26f3.png)

よく見ると上の方はBETAとあります。BETA版をインストールすると途中で失敗してエラーが表示されます。ターミナルからsudoで権限を与えて実行するとインストールはできますが、その後のUnityのインストールで躓いてしまいますので、無難な安定板をインストールしましょう。


## Unityのインストール

インストールしたUnity Hubを起動します。サイドバーのインストールタブを選択するとインストールされているUnitのバージョンを確認できます。最初はインストールされているUnityは何もありません。(図はインストール後の物です)

![2b9ac55b5884c8a7a47613cebe1fc93f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/b01e3b4d-157f-e93d-ab7d-a9c11d0c2484.png)

右上のインストールボタンを押すとインストールするUnityのバージョンを選択できます。  

![6fedff6c2d98695455a3f9343020c315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/d0468660-8416-51a3-bf27-ee0cb4fab449.png)

ここでも一番上の推奨リリースをインストールすればよさそうと思ってしまいますが、うまくいかないので __Unity 2019.4.34f1(LTS)__ を選びます。

推奨リリースも一見問題なさそうですが、チュートリアルを進めていってAsset Store から Bolt をインストールする時に失敗しますので、Unity 2019.4.34f1(LTS)を選びます。

次にアプリ作成の対象となるプラットフォーム(デバイス)を選択します。全部で25GB程ありますので、SSDの十分な空きを作ってからインストールします。

![e30ad7770dc09c880a8fe8aaf9d03344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/7d859f02-f678-5dcb-b6f8-5e8ca4fe069f.png)

ここまでの内容はこちらを参照してます。

https://developer.oculus.com/documentation/unity/book-unity-gsg/

2019.4 LTS以上をインストールとありますが、このバージョンじゃないとうまくいきませんでしたという結果になっています。もしかしたらBoltなしでも開発できるんならUnity 2020.3(LTS)でもいいかもしれません。現時点ではそんな知識を持ち合わせてませんので、チュートリアルが動かせるのが大事です。

## チュートリアル

こちりのチュートリアルを体験して動かせることを確認。

https://learn.unity.com/tutorial/bolt-create-denger-wall?uv=2019.4


# アプリ実行

## プロジェクト作成

Unity HUBを起動しプロジェクトタブの新規作成ボタンで新規アプリを作成します。

![502d69c9ab636dc391ae74696294c9d5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/caad7f50-895f-28e6-2c9b-d1c2668c092f.png)

3Dテンプレートを選択し、プロジェクト名を入力して作成ボタンを押します。  
必要に応じて保存先を変更してください。

![6ce1a5cb7cf37776ce841f2469e40a1e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/671469ae-6649-a80f-5cc2-ddcc15b27ec6.png)


## インストール

こちらのページに従ってインストールします。

https://developer.oculus.com/documentation/unity/unity-enable-device/

地平線が見えるだけですが、Oculusアプリ開発の第一歩です。

## Next step

次はこちらを試してみるといいのではないかと思っています。←まだやってない

https://developer.oculus.com/documentation/unity/unity-tutorial/
「点字メーカープログラム」をSQLで回答したい

# はじめに

ある日、Qiitaをながめていたところ、こんな面白そうなアドベントカレンダーを発見。

https://qiita.com/advent-calendar/2021/ruby-challenge

ぜひ参加してみたかったのですが、時すでに遅しで、参加枠はゼロ。そういうわけでアドベントカレンダー終了後に勝手に参加しようと思います。勝手に参加するのであれば、言語も好き勝手に選んでいいよねということで、今回はSQLを選択しました。なお稼働確認したDBMSはMySQL8.0.23です。

# 回答

回答となるクエリは以下の通りです。もうちょっとシンプルに書けそうではありますね。

```SQL
WITH RECURSIVE
BOIN (rome, bit) AS (
            SELECT 'A', 0b100000+0
  UNION ALL SELECT 'I', 0b101000+0
  UNION ALL SELECT 'U', 0b110000+0
  UNION ALL SELECT 'E', 0b111000+0
  UNION ALL SELECT 'O', 0b011000+0
),
SHIN (rome, bit) AS (
            SELECT 'K', 0b000001+0
  UNION ALL SELECT 'S', 0b000101+0
  UNION ALL SELECT 'T', 0b000110+0
  UNION ALL SELECT 'N', 0b000010+0
  UNION ALL SELECT 'H', 0b000011+0
  UNION ALL SELECT 'M', 0b000111+0
  UNION ALL SELECT 'R', 0b000100+0
),
REIGAI (rome, bit) AS (
            SELECT 'YA', 0b010010+0
  UNION ALL SELECT 'YU', 0b010011+0
  UNION ALL SELECT 'YO', 0b010110+0
  UNION ALL SELECT 'WA', 0b000010+0
  UNION ALL SELECT 'N' , 0b000111+0
),
HENKAN (rome, bit)  AS (
            SELECT rome, bit FROM BOIN
  UNION ALL SELECT rome, bit FROM REIGAI
  UNION ALL SELECT CONCAT(S.rome, B.rome), S.bit | B.bit FROM SHIN S CROSS JOIN BOIN B
),
INPUT (txt) AS (
            SELECT 'A HI RU'
  UNION ALL SELECT 'KI RI N'
  UNION ALL SELECT 'SI MA U MA'
  UNION ALL SELECT 'NI WA TO RI'
  UNION ALL SELECT 'HI YO KO'
  UNION ALL SELECT 'KI TU NE'
),
WORD (txt, lvl, rome, rest) AS (
    SELECT txt, 0, '  ', CONCAT(txt, ' ') FROM INPUT
  UNION ALL 
    SELECT txt, lvl + 1, SUBSTR(rest FROM 1 FOR INSTR(rest, ' ')), SUBSTR(rest FROM INSTR(rest, ' ') + 1)
    FROM WORD
    WHERE rest <> ''
),
A (txt, lvl, tenji) AS (
  SELECT W.txt, W.lvl, REPLACE(REPLACE(LPAD(BIN(H.bit), 6, '0'), '1', 'o'), '0', '-')
  FROM WORD W
  JOIN HENKAN H ON W.rome = H.rome
),
B (txt, lvl, col, tenji) AS (
            SELECT txt, lvl, 1, SUBSTR(tenji FROM 1 FOR 2) FROM A
  UNION ALL SELECT txt, lvl, 2, SUBSTR(tenji FROM 3 FOR 2) FROM A
  UNION ALL SELECT txt, lvl, 3, SUBSTR(tenji FROM 5 FOR 2) FROM A
),
C (txt, col, tenji) AS (
  SELECT txt, col, GROUP_CONCAT(tenji ORDER BY lvl SEPARATOR ' ')
  FROM B
  GROUP BY txt, col
)
SELECT txt, GROUP_CONCAT(tenji ORDER BY col SEPARATOR '\n') AS tenji
FROM C
GROUP BY txt

```

実行結果は次の通り。提供されているUnitテストがあるのですが、テストケースはそこから拝借しています。

|txt|tenji|
|:---|:---|
|A HI RU|o- o- oo<br>-- o- -o<br>-- oo --|
|HI YO KO|o- -o -o<br>o- -o o-<br>oo o- -o|
|KI RI N|o- o- --<br>o- oo -o<br>-o -- oo|
|KI TU NE|o- oo oo<br>o- -o o-<br>-o o- o-|
|NI WA TO RI|o- -- -o o-<br>o- -- oo oo<br>o- o- o- --|
|SI MA U MA|o- o- oo o-<br>oo -o -- -o<br>-o oo -- oo|

# 簡単な解説

やや長大なクエリですが、おおよそ3つの部分に分けられます。

まず今回の変換対象である点字ですが、3種類に分けられます: ①母音だけからなるもの、②母音と子音を組み合わせたもの、③それ以外のもの。①はBOIN表、③はREIGAI表にまとめており、②については子音のみをSHIN表にまとめています。BOIN表とSHIN表とREIGAI表を組み合わせて、すべてのローマ字と点字を1対1で格納するHENKAN表を作成します。なおHENKAN表では点字を2進数(bit)で持っています。これは②で母音と子音を組み合わせる際に都合がよいからです (bit演算を利用している)。

INPUT表には点字に変換したいローマ字列がまとめられています。与えられる文字列は空白区切りになっているので、トークンごとに分割してやる必要があります。この分割結果が格納されているのがWORD表で、再帰SQLを活用しています。

あとはWORD表とHENKAN表を組み合わせて、文字列を求める形式に整形していきます。これをA表、B表、C表、そして最後のSELECT文で行っているわけですね。
WordPressの固定ページのテンプレートで迷子になった

WordPressを触れ始めて、早9ヶ月。
自分でサイトを作成しよう！と思い立ったところで躓いた。

カスタムテンプレートが表示されない
---
以下テンプレート用のフォルダ構成
>/template
>├　/article
>|├　page-articles.php(テストページ)
>|└　/image_gallery
>|　　└ page-gallery.php(ギャラリーページ)
>├　page-lib.php(ライブラリページ)
>└　page-top.php(トップページ)

フォルダ構成の通りにカスタムテンプレートできた！
後はこいつを固定ページで…
![screenshot_2021_12_26_template_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318223/ab1aaaab-a283-f764-fd8e-98fdc77ae98d.png)

テストページとギャラリーページのテンプレートがいない？
どうしたものかと、Google先生を頼る。
そして見つけた[サイト](https://www.webdevqa.jp.net/ja/theme-development/2%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E6%B7%B1%E3%81%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AB%E3%81%82%E3%82%8B%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88/961948972/)を見てみると
/wp-includes/class-wp-theme.php でテンプレートの深さはハードコーディングされているとのこと。

該当コード
---
<b>/wp-includes/class-wp-theme.php</b>  $\tiny{(1190行目あたり)}$

```
public function get_post_templates() {
		// If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
		if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) ) {
			return array();
		}

		$post_templates = $this->cache_get( 'post_templates' );

		if ( ! is_array( $post_templates ) ) {
			$post_templates = array();

			$files = (array) $this->get_files( 'php', 1, true );

			foreach ( $files as $file => $full_path ) {
				if ( ! preg_match( '|Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) ) {
					continue;
				}

				$types = array( 'page' );
				if ( preg_match( '|Template Post Type:(.*)$|mi', file_get_contents( $full_path ), $type ) ) {
					$types = explode( ',', _cleanup_header_comment( $type[1] ) );
				}
```

\$files = (array) $this->get_files( 'php', <font color="red">1</font>, true );
*赤文字がテンプレートを表示する階層を示しているようです。

数字を変えてみるとどうなるか実験してみた

<h2> 実験開始 </h2>
<h3>第1段階　: 階層の深さを2にしてみる</h3>
![スクリーンショット 2021-12-26 1.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318223/130fd8e7-b0d1-cf27-e7d5-a40b223a63fe.png)

迷子だったテストページのテンプレートが見つかりました。
しかし、まだギャラリーページが見つからない。でも数字を変えることで表示されることがわかった。

<h3>第２段階 : 全件表示するために深さを-1に変更してみた</h3>
![スクリーンショット 2021-12-26 1.20.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318223/1903c990-84f9-80d9-be04-761ece6a5bbd.png)

無事、テンプレートが全て表示された。
ffmpeg で TS ファイルを MP4 に無劣化で変換する

# 前フリ
とある、拡張子が .ts の動画ファイルがある。
VLC で再生してみると、シークバーを移動するときに、音声は出るが、映像が表示されるのに時間がかかる。(音ズレとは別)
VLC の変換機能で素通ししてみるが、コーデックの設定が違うのか、音声だけのファイルが出力されてしまう。
そこで ffmpeg を直接実行して、 .ts から .mp4 に変換してみた。

# コマンド

```
./ffmpeg.exe -i input.ts -c:v copy -c:a copy output.mp4
```

筆者は Windows 環境だったが、 それ以外の環境でも概ね同じコマンドと思われる。

## コマンドのオプションについて

* `-i`：入力ファイルを指定
* `-c:v copy`：ビデオコーデックを無変換でコピーする
* `-c:a copy`：オーディオコーデックを無変換でコピーする


詳細な情報や使用可能な他のオプションについては公式のドキュメントを参照のこと。
https://ffmpeg.org/ffmpeg.html

# 結果

シークバーを移動しても映像がちゃんと再生される MP4 ファイルができた！
Ruby で解く AtCoder ABC 233 D

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
https://atcoder.jp/contests/abc233/tasks/abc233_d

<font color="brown">Difficulty: 726</font>
# 解法
今回のテーマ：累積和の応用

```
入力例 1 
6 5
8 -3 5 7 0 -4
```
まず、累積和を取ります

|入力|累積和|
|--:|--:|
| |0|
|8|8|
|-3|5|
|5|10|
|7|17|
|0|17|
|-4|13|
大人の都合で`0`が入っていますが、通常の累積和とは異なり、単調増加になっていないところが応用編となります。
![20211225a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/bf3a350e-9b6e-c35d-2ee4-1a38d100871d.png)
累積和をグラフにしましたが、横軸`0`の地点から左に山登りをすると考えます。
今の地点から相対的な高さ`k`（入力例１では5）だけ高い地点を見つけます。
![20211225b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/7bc0ac33-2173-ead0-8e3e-3ee3c7d1fb01.png)
![20211225d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/e451b102-9365-b599-4749-d5619202c66a.png)
![20211225c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/623c4174-5257-8100-252c-fec156a9192f.png)
左から右に進んで、合計３つの`k`だけ高い地点を見つけました。
# 実装例1
```Ruby
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
r = Array.new(n + 1, 0)
h = { 0 => [0] }
1.upto(n) do |i|
  r[i] = r[i - 1] + a[i - 1]
  if h[r[i]]
    h[r[i]] << i
  else
    h[r[i]] = [i]
  end
end
cnt = 0
0.upto(n) do |i|
  if h[r[i] + k] && h[r[i] + k].bsearch_index{ _1 > i }
    cnt += h[r[i] + k].size - h[r[i] + k].bsearch_index{ _1 > i }
  end
end
puts cnt
```
`TLE`対策として、連想配列`h`を使用します。
また、左から右に進みますので、`h`の中身は単調増加な配列となり、二分探索`bsearch`が利用可能になります。
# 実装例2［追記］
```ruby
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
r = [0]
h = Hash.new(0)
h[0] = 1
cnt = 0
1.upto(n) do |i|
  r[i] = r[i - 1] + a[i - 1]
  cnt += h[r[i] - k]
  h[r[i]] += 1
end
puts cnt
```
いつも参考にさせていただいている @u2dayo さんのコードを移植したものです。
実装例1は`r[i] + k`でしたが、こちらは`r[i] - k`で、山登りで振り返っているイメージです。
この場合、二分探索を省略できますので、実装が軽くなり素晴らしいです。

https://qiita.com/u2dayo/items/46b86ba21d7a98e765cd#d%E5%95%8F%E9%A1%8Ccount-interval
# まとめ
+ ABC 233 D を解いた
+ 累積和 に詳しくなった
【AWS Lambda/CDK】RSSフィードをツイートするBotを作るLambdaファンクション作ってみた

# 作ったもの

特定のTwitterアカウントをRSSリーダBot化するLambdaファンクションを作ってみました。CDKで構成を管理＆デプロイします。

https://github.com/kuredev/rss2witter

# 仕組み

- AWS LambdaでRSSフィードを読み込み、ツイートします
- CloudWatch Eventsで定期実行します
- RSSフィードのURLはLambdaファンクションのコードで管理します（他に手軽な方法が思いつかなかった）

# 準備

## Twitterアカウントを準備する

Botとするアカウントを準備し、Developer Portalで以下のキーを取得します。
取得には電話番号の登録や、メールの返信等が必要なようです。

- consumer_key
- consumer_secret
- access_token
- access_token_secret

## RSSフィードを読み込みツイートするRubyスクリプト

全体のコードは[こちらのリポジトリ](https://github.com/kuredev/rss2witter)に置いていますが、ポイントだけ抜粋します。

### RSSの読み込み

RSSの読み込みには以下のライブラリを使います。
Ruby3以上ではGemとしてのインストールが必要だったので、Gemfileに `gem "rss"` を指定して `bundle install` します。

https://docs.ruby-lang.org/ja/latest/library/rss.html

`::RSS::Parser.pars` で読み込むと形式によってオブジェクトの種類が変わるようですので、形式に合った方法でタイトルやURLを取得します。

```ruby
rss = ::RSS::Parser.parse(@url)
if rss.instance_of?(::RSS::RDF)
  # RSS1.0用の処理
elsif rss.instance_of?(::RSS::Rss)
  # RSS2.0用の処理
elsif rss.instance_of?(::RSS::Atom::Feed)
  # ATOM用の処理
end
```

> RSS をパースしたい場合は RSS::Parser クラスを使います。 RSS::Parser.parse は String の RSSを パースします(使用するXMLパーサによっては File や IO オブジェクトなどでもパース可能です)。
RSS 1.0をパースした場合は RSS::RDF オブジェクト
RSS 0.9x/2.0をパースした場合は RSS::Rss オブジェクト
Atom をパースした場合は RSS::Atom::Feed オブジェクト
をそれぞれ返します。

### ツイート数＆間隔

投稿は300投稿/3時間というレートリミットがあるため、リミットをオーバーしない＆1度のLambdaファンクション内の実行で完結する範囲でツイート間隔を最大ツイート数を調整します。

今回は1時間に1実行のため、100回までは投稿できそうですが、余裕を見て1度に80回までの投稿上限としてみています。

https://developer.twitter.com/ja/docs/basics/rate-limits

## CDKでデプロイ

CDKでLambdaファンクションをデプロイします。以下のような仕様を満たすよう構成を管理します。

- Lambdaファンクションのタイムアウト: 15分
- 1時間毎に実行
- Twitter関連キーをLambdaファンクションの環境変数に設定
  - デプロイする実行環境で環境変数にあらかじめ設定しておくこと

```typescript
export class CdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const lambdaFn = new lambda.Function(this, 'Lambda', {
      runtime: lambda.Runtime.RUBY_2_7,
      handler: 'handler.handler',
      functionName: "rss2witter",
      code: lambda.Code.fromAsset(path.join(__dirname, '../lambda/')),
      timeout: Duration.seconds(60*15),
      environment: {
        TWITTER_CUNSUMER_KEY: process.env.TWITTER_CUNSUMER_KEY || "",
        TWITTER_CONSUMBER_SECRET: process.env.TWITTER_CONSUMBER_SECRET || "",
        TWITTER_ACCESS_TOKEN: process.env.TWITTER_ACCESS_TOKEN || "",
        TWITTER_ACCESS_TOKEN_SECRET: process.env.TWITTER_ACCESS_TOKEN_SECRET || "",
      },
    });

    const rule = new events.Rule(this, 'Rule', {
      schedule: events.Schedule.expression('rate(1 hour)')
    });

    rule.addTarget(new targets.LambdaFunction(lambdaFn));
```

# 参考

https://madogiwa0124.hatenablog.com/entry/2019/03/26/214228

https://maku.blog/p/nujyfsy/
Twilioを使って黒電話を携帯電話にしてみた。

# はじめに

黒電話懐かしいですよね。一昔前にはどこの家にもあったものです。
今でも、ジャンク屋やオークション等で買えるのですが、果たして使えるものでしょうか？

使えます。 Twilio を使って。

# 概要
この作品は 6月から9月の間で開催された
[**Twilio オンラインコンテスト**](https://cloudapi.kddi-web.com/twilio-online-contest-2021)
にて生まれた作品です。その後
[**ヒーローズリーグ**](https://protopedia.net/event/21/)
にも参加して話題!?になった作品です。

# デモ動画
この作品はまず動画から入るのがいいかなと思います。
まずはデモ用の動画をご覧ください。
**YouTube動画**
[**Twilioオンラインコンテスト2021 応募作品「昭和育ちなおっさんたちは黒電話を携帯する夢を実現する...」のデモ動画**](https://youtu.be/QMdDVPmwybA)

# どうなってる？
レガシー技術であるアナログ電話回線を電子回路でインタフェースして、ラズパイというゲートウェイに繋ぎ、そこから Twilio で電話回線につなぎ、SIPフォンのプロトコルを使って音声通話を実現しています。
と一言で書いても理解しずらいですが、そのあたりは別サイトの記事にしっかり書きましたのでそちらを参照ください。

**Twilioに特化した記事(ヒーローズリーグ応募用に加筆済)**
[**昭和育ちなおっさんたちは黒電話を携帯する夢を実現する...**](https://protopedia.net/prototype/2376)

**電子工作部分に特化した記事**
[**黒電話インタフェースを制作 (ラズパイに繋げられるように)してみた**](https://elchika.com/article/17ccd172-e07a-41d9-a21d-1d124f88af79/)

実現方法や原理的な事については、しっかり書いてあるので改めて追記することないかと思います。

# あおりを受けたので
こんな人におすすめの所に、ややあおり気味の挑戦状（参考記事の３つ目）を確認したので、
![煽り.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/318172bc-2393-3c7c-9c07-6b48e7791c7c.jpeg)

Adventカレンダ記事投稿に挑戦してみました。

# 基準はばっちり
基準としては

![選考基準.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211331/163d4966-85ac-0552-9692-c812e89ec111.jpeg)

との事ですが、微妙なところです。
・面白い仕組み
　⇒これは間違えいない。様々な技術を無駄遣いしまくっています。
・実生活で役に立たないことはない。
　⇒おっさんホイホイで、担いで歩いていたらみんな寄ってくるかも。
　⇒運が良ければ職務質問のターゲットにもなれる気がする。
・面白いことは、間違えない
　⇒なにより夢が叶うのって素晴らしいですよね。
まぁ、とりあえず投稿してみようと思います。

# お詫び
投稿予定日をとに過ぎて、最終日に書いているという状況です。
遅くなって申し訳ありませんでした。
STM32G031でソフトウェアシリアル1000bps(STM32G031J6M6)(USART)


目的
シリアルのテスト




![o_con172.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a441cb85-98af-f754-7135-b970c92f492f.jpeg)



いろいろ
実質1週間くらい止めていたら
コピペプログラマーや量産型プログラマーの更新が
止まる事が観測出来たので再開(レベル低く)(教授より)




```c++




int pc_putc(char ch) {

  digitalWrite(PB7, LOW);//Start
  delay(1);

  for (int ii = 0; ii < 8; ii++) { //Data x 8
    digitalWrite(PB7, (ch >> ii) & 1  );
    delay(1);
  }//for

  digitalWrite(PB7, HIGH);//Stop
  delay(1);

  return (0);
}//pc_putc

void setup() {

  //仮想シリアルの出力ポートの初期化
  pinMode(PB7, OUTPUT);
  digitalWrite(PB7, HIGH);

}//setup


//無限ループ
void loop() {

  //一文字出力
  pc_putc('A');

  //1秒の待ち
  delay(1000);

}//loop



```



おまけ


STM32G031とVSCode+STM32CubeでI2Cスレーブの受信文字をシリアル出力(受信)(STM32G031J6M6)


https://qiita.com/caa45040/items/5032e6905c9425f41495
急性中耳炎の学習モデルのつくりかた

急性中耳炎の学習モデルを作っていきましょう。
やることは簡単、以下のような流れです。

- 鼓膜画像を教師データとして登録
- 学習ボタンを押す


## 教師画像を用意していきます

- 教師画像のダウンロードURLはハンズオンにてお伝えします
- zipファイルを展開します
    - Windowsの場合、右クリックして「すべて展開...」を選択します
    - Macの場合、ダブルクリックします
- 教師画像は以下のフォルダ構成になっています
    - aom：急性中耳炎
        - 急性中耳炎の画像
        - 急性中耳炎の画像
        - ...
    - ome：滲出性中耳炎
        - 滲出性中耳炎の画像
        - 滲出性中耳炎の画像
        - ...
    - normal:正常鼓膜
        - 正常鼓膜の画像
        - 正常鼓膜の画像
        - ...

## TeachableMachineを使って分類器を作ってきます

- TeachableMachineの公式サイトにアクセス
    - https://teachablemachine.withgoogle.com/
- 「使ってみる」をクリック
- 「画像プロジェクト」をクリック
- 「標準の画像モデル」を選択
- 急性中耳炎、滲出性中耳炎、正常鼓膜のラベルを追加
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259162/8e1f5754-a158-8633-8a08-c3af9d0c5b21.png)
- 急性中耳炎、滲出性中耳炎、正常鼓膜の画像の登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259162/3d0914e4-22f5-9341-693e-fdc362d09b08.png)

## 学習を実行します

- 「モデルをトレーニングする」をクリック
- 30秒程度で学習が終わります（一般的なPCでやると1時間以上かかります）
- 学習したモデルをTeachableMachineで使えるようにする
    - 「モデルをエクスポートする」をクリック
    - 以下の手順を行ってモデルをWebAPIで使えるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259162/df0aae41-cfde-2f70-cb8b-2040e1356ad4.png)


最後にモデルIDをメモできれば完了です。
モデルIDは本編で使いますので大切に保存してください。
お疲れさまでした！！！
VBAの関数型風プログラミング用のライブラリのその後


2019年のアヴェントカレンダーの[記事](https://qiita.com/mnr_u/items/446a651a189d1accda47)に
[VBA-Functional-Library](https://github.com/mnru/VBA-Functional)という自作の関数型プログラミング 風のライブラリの記事を書きました。

これを使って表計算のシートの中でVBAの関数をテストできる仕組みを作りました。
ワークシート関数とVBAの関数は別物なので、VBAの関数の引数をシート内で変更し実行する、
仕組みは珍しいんじゃないかと思います。

いかの画面はgithubに置いている[VBA-Functional-Library](https://github.com/mnru/VBA-Functional)
の中の「VBA-Functional-Array.xlsm」のシートの画面です
それぞれテストの実行前と実行後です

![before_calc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7906/dbdb673c-a040-2928-d917-5f74e17604fe.png)

![after_calc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7906/b8cdbc5a-3a60-4b5a-3325-9c265deddb79.png)

左上の「eval」「clear」のボタンで実行前・実行後の各画面に切り替えられます

テーブルの各列の内容は以下の通りです

|項目|内容|
|:---|:--|
| check | ctualと expected の照合の内容| 
| assert | actualと expected の照合の種類 | 
| actual | 実際の計算結果 | 
| expected | あるべき計算結果 | 
| variable | 変数 | 
| function | 関数名 | 
| arg1 | 引数1 | 
| arg2 | 引数2 | 
| arg3 | 引数3 | 
| arg4 | 引数4 | 
| arg5 | 引数5 | 
| statement | VBAの記述に直したもの | 


内部的な実装はevalAとtoStringという二つの関数のおかげで比較的素直にできていると思います。

evalAは配列の先頭を関数名、それ以降を引数と解釈して計算する関数です
toStringは配列などを文字列に変換する関数で各要素の型を調べて再帰的に文字列化しています

順に動作を書き上げると

1. 各行からfunction列 からarg5列までの値を配列として抜き出し、後ろのほうの空白の要素を削除する
1. その配列をevalAで計算する
1. 計算結果をtoString関数で文字列にした結果をactual列に書き込む
1. variable列に文字列がある場合それをキーとして計算結果を辞書に書き込む
1. check列にはactual列をexpected列を照合するワークシート関数が入っているので自動的に"fail"か"pass"が表示される

variable列にある文字に_(アンダーバー)をつけるとそれ以降の行から、参照できるので、配列の配列なども計算できます

objectの代入と参照は、VBA上では、式にSetをつける必要があるので、
ともに文字列は__(アンダーバー２文字)を先頭につける規約にしています
コレクションと辞書に対しては、mkClcやmkDicという生成する関数をつくり、toStringを拡張して利用できるようにしました。他のobjectも同様の処置で利用可能になるかもしれません
怠け者な私が話題の技術情報についていくためにやった3つの地味な工夫

# ある日のこと...
Aさん「最近の技術といえば〇〇がアツいですよね〜そろそろ勉強してみようかな〜」
Bさん「〇〇社が最近めちゃくちゃ技術に力入れてますよね〜」
Cさん「〇〇の脆弱性が出たのでアプデお願いします！！」
わたし「...!?...ｱｯﾊｲ!!(無力感)」

# 新しい情報は大事。だけど情報が多すぎる
激動のIT業界では、twitterにさらっと重大情報が流れてきたりするものです。
**「じゃあ話題の情報をガンガンインプットしよう！！」**
**「twitter、GitHub、技術ブログ、ニュースサイト...」**

しかし、手当たり次第に調べるには多すぎる情報。
時間が溶けていく徒労感に何度も挫折を繰り返しました。

<img width="400" alt="スクリーンショット 2021-12-25 22.42.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893521/6fd83d89-811d-5c88-350e-ff0e330a3cac.png">
**「話題の情報だけまとめて教えてくれたらいいのに...」**
そう思ってから多少情報通になるまでのポイントをお伝えします。
怠け者と自認される方には特におすすめです。
(逆に、怠け者ではない方にはあまり参考にならないかもしれません)


# 1: SNSを開かず話題だけ拾う
私はSNSがあまり得意ではありません。
twitterを開くことにすら多少の抵抗を感じます。
やっと開いても、たくさんの情報を眺めるのはそれなりに苦労がいります。
そんな方には[Tweet Shelf](https://www.tweetshelf.com/)がおすすめです。
<img width="150" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893521/6ffb358f-33d0-86a8-c748-70b19fa2c639.png">
フォロワーがよくツイートする記事をまとめて通知してくれます
関心分野の方々をたくさんフォローしておけば、その界隈で**よく話題になっている記事だけ**を見ることができます。



# 2: 色々なサイトの更新情報を受け取る
ニュースサイトやテックブログに散らばった情報に自力で追いつくのは至難の業です。
しかもブラウザでタブを開きまくって毎日更新...なんて地獄の作業です。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893521/59cedbb1-dc64-8b28-07dd-c65240fa7043.png">

自分から追いつくのは不可能と割り切り、[Feedly](https://feedly.com/)などのRSSリーダーに頼りましょう。
興味のあるページを登録しておくことで、更新されたタイミングで通知を受け取ることができます。
Qiitaで話題の記事も通知できたりします。
さながら自分専用のニュースフィードができあがります。

# 3: フィードの体験を良くする
ニュースフィードができると、放置していても勝手に情報が入ってくるようになります。
やりましたね！これでずっと情報通！

...と思いきや、更新が溜まりすぎると見なくなります。

なので、ついついアプリを開きたくなるようなUXも大事にしましょう。
UXには好みがあると思うので、お気に入りのアプリを探してみてください。
私は[Reeder 5](https://reederapp.com/)という有料アプリが好きで使っています。

# まとめ
Aさん「最近の技術といえば〇〇がアツいですよね〜そろそろ勉強してみようかな〜」
わたし「お、それなら〇〇がおすすめらしいっすよ！」

なんて会話が増えるといいですね。

最後になりますが、最新の情報を追うだけでは力になりません。
書籍やリファレンスから得られる原理原則も大事にしましょう。
バランスが大事です。
GitHubPagesとHugoでポートフォリオを作った際のメモ

## ポートフォリオ
エンジニアならカッコいいポートフォリオが欲しい！ということで作りました。

https://forjobok.github.io/


## GitHub Pages

>GitHub Pages is a static site hosting service that takes HTML, CSS, and JavaScript files straight from a repository on GitHub, optionally runs the files through a build process, and publishes a website. 

【引用元】：[About GitHub Pages](https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages)

GitHub Pagesを使えば静的サイトが簡単に作れるってことですね。

## Hugo

>Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again.

Hugoは有名なOSSの静的サイトジェネレータの1つらしいです。
マークダウン形式で記述したmdファイルからhtmlを生成してくれます。

## 流れ
①GitHubにリポジトリを作成し、GitHub Pagesの設定を行う。
②Hugoのテンプレートを選ぶ。
③ローカル上にポートフォリオを作成。
④デプロイする。

---

### GitHubにリポジトリを作成し、GitHub Pagesの設定を行う。
リポジトリを作成します。
リポジトリ名をポートフォリオのURLのホスト名と同名(全部小文字)になるように作成します。
例) ユーザー名が`ForJobOk`の場合　→　リポジトリ名を`forjobok.github.io`とする

あとは下記を参考にGitHub Pagesの設定を行います。
【参考リンク】：[GitHub Pages サイトを作成する](https://docs.github.com/ja/pages/getting-started-with-github-pages/creating-a-github-pages-site)

---

### Hugoのテンプレートを選ぶ
[Hugo Themes](https://themes.gohugo.io/)の中からお気に入りを見つけます。
作者からの説明が丁寧に書いてあるものを選んだ方がいいかもです。

---

### ローカル上にポートフォリオを作成。
Hugoを使用する環境を手に入れるのは超簡単です。
下記コマンドを入力するだけです。
私の場合は管理者権限で起動したコマンドプロンプトでないとダメでした。

``` :Windowsの場合
choco install hugo -confirm
```

【参考リンク】：[Install Hugo](https://gohugo.io/getting-started/installing/)

あとは先ほど選んだテーマの説明通りにテンプレートをCloneしてきて編集します。

ローカル上でプレビューするには、
ポートフォリオのディレクトリに移動し下記コマンドを入力し、ローカルサーバーを立ち上げ、
http://localhost:1313/ をブラウザで開けばOKです。

```
hugo server
```

---

### デプロイする。
ポートフォリオのディレクトリに移動し下記コマンドを入力します。

```
hugo 
```

これでmdファイルからhtmlが生成されました。
あとはリポジトリに反映すれば完成です。

## 詰まったところ

### Twitterで共有した際にカードが表示されない。
ベースとなるhtmlを特定し、下記を記述して解決しました。

```html
<head>
   <meta name="twitter:card" content="summary">
   <meta property="og:title" content="hoge">
   <meta property="og:description" content="hoge">
   <meta property="og:image" content="絶対パス">
</head>
```

`og:image`は絶対パスでないとダメでした。
【参考リンク】：[OGP設定 og:image で画像を指定しても表示(反映)されない場合にチェックすべき事項](https://www.j-cool.co.jp/blog/?p=1674)

---

### なかなか反映されない
リポジトリへの変更が反映されるまでに少し時間がかかるようです。待つしかないです。

## 参考リンク
[Hugo + GitHub Pages（独自ドメイン適応）でサイトを作成・公開する](https://qiita.com/ysdyt/items/a581277dd1312a0e83c3)