OmniAICreator/Qiita-1.07M huggingface dataset:
Canon DR-X10Cのガラス面を外して清掃する方法

#1. はじめに

Canon DR-X10Cのガラス面は、外せるようになっています。外しやすい個体と、慣れないと外しづらい個体があります。分解は自己責任でお願いします。

#2. ガラス面を外しやすい個体

ガラス面を外しやすい個体は、ガラス面をスライドするだけで外せます。あとはブロワーで埃を飛ばしたり、ガラス面の両面を富士通のクリーナF1を染み込ませた布で拭いたりするだけです。

DR-X10C
![20210526_181615.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/589573d8-80d9-5762-83f0-4579678873d9.jpeg)
カバーオープン
![20210526_181623.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/48234420-badc-6362-da6c-54a984f256b0.jpeg)
上側のガラス面を左から右にスライドさせて外した状態
![20210526_181641.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/b3e71907-ff7f-4e2d-fc92-2994551d827f.jpeg)
外した上側のガラス面
![20210526_181644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/cde63079-2447-7cc9-828d-575cee0bf6cd.jpeg)
左右反転した裏側
![20210526_181651.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/9284299f-b4ef-eae7-c6ad-871282764e3b.jpeg)
下側のガラス面を右から左へスライドさせて外した状態
![20210526_181707.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/a2fc8fb3-e470-c83e-24d1-bf039e44dc0b.jpeg)
外した下側のガラス面(画像下)
![20210526_181709.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/3b97ce03-1e65-4cd8-403f-273e85516916.jpeg)
左右反転した裏側(画像下のみ)
![20210526_181723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/7806041a-15d5-dac3-a4c3-e319b75642ad.jpeg)
清掃後、元に戻した状態。元に戻すのは、外した場所に入れて逆側にスライドさせるだけです
![20210526_181804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/de1bc186-af5b-04f0-8bcb-4d75f6714ed3.jpeg)

#3. 慣れないとガラス面を外しづらい個体

外しづらい筐体は、ツメで一箇所押さえられていて、そのツメをマイナスドライバー等で押さえながらガラス面をスライドさせる必要があります。左右両側にネジがありますが、外す必要はありません。

DR-X10C
![20210526_180626.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/9a897704-3856-00fd-cdbd-1401d9b9ef80.jpeg)
カバーオープン
![20210526_180642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/bb4292c9-05dd-8616-16f1-cf2b192e6304.jpeg)
上側は右下の黒い部分にツメがあります。内側にあるようで見えません。
![20210526_180700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/54832067-6564-38e1-b943-072672c41f6e.jpeg)
下側は左上の黒い部分にツメがあります。内側にあるようで見えません。
![20210526_180710.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/341d43b5-3aa1-26f9-3bb6-41c0d96e8c90.jpeg)
上側のガラス面を左から右にスライドさせて外した状態
![20210526_180843.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/d87c3d4e-18e4-0a1b-8dc7-6c47819e6cbe.jpeg)
外した上側のガラス面
![20210526_180848.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/d14744ee-b692-b4a6-b284-d2fffe0655d5.jpeg)
左右反転した裏側
![20210526_180905.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/1867508f-0a98-a43a-fb88-08aae88ae7c7.jpeg)
外した下側のガラス面(画像下)
![20210526_181002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/10eb9e45-4449-91d9-46cb-dc04562cea32.jpeg)
左右反転した裏側(画像下のみ)
![20210526_181018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534247/a6c19ef9-3d7a-06b6-1634-83066981bb13.jpeg)
元に戻すのは、外した場所に入れて逆側にスライドさせるだけです。カチッとツメがはまります。
[C++] 文字列からGUIDに直す / GUIDの比較

# もくじ

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと

指定のGUID(`{381b4222-f694-41f0-9685-ff5bb260df2e}`とかそういうやつ)とほかのGUIDを比較して、一致してるのかどうか、というのを確認したいシーンがあった。

具体的には、Windowsの電力プランの設定で、「バランス」が選択されてるのかどうか、というのを知りたいときに、電力プランはそれぞれGUIDを持っていて、それが一致するかということをしたかったので、GUIDの一致確認をしたかった。

で、その際、`guiddef.h`というところに定義されている`GUID`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/082ea39b-1137-eb51-fa2c-c439149817e2.png)
を使うのだが、まずここに自分の指定のGUIDを入れるのをどうやるのか？(手動で順番に値をいれるようなことはしたくない)となったので、好きな値を`GUID`に入れるのと、`GUID`どうしを比較、一致確認する方法を調べた。

# やりかた

`combaseapi.h`に定義されてる`CLSIDFromString()`という関数を使用して、文字列で書いたGUIDから`GUID`をまず作成し、そのあと`guiddef.h`にある`IsEqualGUID()`という関数を使って比較をした。

※`IsEqualGUID()`は、memcmpで中身が全く一緒かどうかを見てるだけっぽい。

# サンプル

`<combaseapi.h>`をinclude必要。
(今回`PowerGetActiveScheme()`を使うので、一緒に`<powersetting.h>`もincludeしている)

```cpp
#pragma comment(lib, "PowrProf.lib")
#include <Windows.h>
#include <powersetting.h>
#include <combaseapi.h>
#include <string>

int main()
{
    GUID srcGuid;
    //GUID srcGuid = { 0x381b4222, 0xf694, 0x41f0, 0x96, 0x85, 0xff, 0x5b, 0xb2, 0x60, 0xdf, 0x2e };
    GUID* targetGuid;
    
    // GUID文字列からGUIDに変換
    CLSIDFromString(L"{381b4222-f694-41f0-9685-ff5bb260df2e}", &srcGuid);//「バランス」の電力プランのGUID

    // 今選んでいる電力プランのGUIDを取得
    PowerGetActiveScheme(NULL , &targetGuid);

    // 比較する
    if (IsEqualGUID(*targetGuid, srcGuid) == TRUE)
    {
        MessageBox(NULL, L"今、バランスの電力プランを使ってます", L"", MB_OK);
    }

    system("pause");
}
```

# 追記

`CLSIDFromString()`を使わなくても、普通に構造体に値を入れる感じで下記のようにすれば任意のGUID値を作ることができる。

```cpp
    GUID srcGuid = { 0x381b4222, 0xf694, 0x41f0, 0x96, 0x85, 0xff, 0x5b, 0xb2, 0x60, 0xdf, 0x2e };
```

`<combaseapi.h>`の関数は、`CLSIDFromString()`よりも、その逆の`StringFromCLSID()`とか`StringFromGUID2()`とかの、GUID⇒stringに直す方がよく使いそうな気がする。

# 参考

OLECHARはワイド文字列

https://qiita.com/tadnakam/items/d4d01850490a09af590c

https://docs.microsoft.com/ja-jp/windows/win32/api/combaseapi/nf-combaseapi-clsidfromstring

https://stackoverflow.com/questions/32784982/how-to-convert-from-platformstring-to-platformguid
MinicondaとVS CodeによるWindows10上でのポータブルPython環境の構築

# 背景
会社支給のノートパソコンによっては管理者権限が与えられておらず、便利なアプリケーションも管理者権限無しでインストールする必要があります。
この記事ではMinicondaとVS Codeを管理者権限無しでインストールし、実際に使用出来るようにするまでを備忘録として残しています。

# 対象
Windows 10 64bit版

# 手順
## Miniconda3のインストール
1. [Minicondaのダウンロードページ](https://docs.conda.io/en/latest/miniconda.html)から最新版のインストーラをダウンロードします。この記事を書いた時点ではMiniconda3-py39_4.9.2-Windows-x86_64.exeでした。
2. インストーラを実行します。Minicondaのインストーラは管理者権限が無くても実行できます。途中確認される設定は以下の通りです。[^1]
	* Install forではJust Meを選択します。
	* Destination Folderは適当なフォルダを指定します。
	* Advanced Optionsではすべてのチェックを外します。

[^1]: この方法だと、管理者権限が無くてもインストールは出来ますが、スタートメニューに登録されたりするので、完全にポータブルでは無いです。完全にポータブルな環境にするには、上記の作業を他のPC上で行い、インストール先のフォルダを丸ごとコピーしてくる、という方法をとります。

## ポータブル版VS Codeのインストール
1. [VS codeのダウンロードページ](https://code.visualstudio.com/Download)から最新版のZIPファイルをダウンロードします。この記事を書いた時点ではVSCode-win32-x64-1.55.2.zipでした。
2. ダウンロードしたファイルの中身を適当なフォルダに展開します。

## 環境整備
### Miniconda
1. ターミナル上でcondaが使用出来るようにするには、まずcondaやpythonにパスが通るようにします。例えばC:\miniconda3にMinicondaをインストールした場合、下記のようにすればcondaやpythonにパスが通るようになります。

```cmd
set MINICONDA_HOME=C:\miniconda3
set PATH=%MINICONDA_HOME%;%MINICONDA_HOME%\Scripts;%MINICONDA_HOME%\Library\bin;%PATH%
```

2. 実際にcondaやpythonにパスが通っているか確認してみます。

```cmd
C:\WINDOWS\system32>python --version
Python 3.9.1

C:\WINDOWS\system32>conda -V
conda 4.9.2
```

3. ターミナル上でcondaが使える事が確認出来たら、次にcondaを使用中の環境下でcmd.exeを使用するよう初期化します。

```cmd
conda init cmd.exe
```

これでcondaを使用してパッケージ管理や仮想環境管理が行えるようになっていると思います。

### VS Code
* 日本語化

	メニュー等を日本語化すると作業効率も格段に上がります。
	1. Visual Studio Codeを開く
	2. メニューから [View] -> [Command Palette] を選択します。
	3. [Configure Display Language] を選択します。
	4. [Install Additional Laugage] を選択します。
	5. サイドバーに拡張言語パックが表示されます。
	6. サイドバーから [Japanese Language Pack for Visual Studio Code] を探し、[Install] ボタンをクリックします。
	7. 右下にポップアップウィザードが表示されるので、[Restart Now] をクリックします。

* Python Extensionの導入

	Pythonを扱う場合必須なようです。
	1. 拡張機能を選択します。
	2. Pythonで検索します。
	3. Microsoft謹製のPython Extensionをインストールします。
	4. condaのデフォルトパスの設定を行います。
		1. メニューから [ファイル] -> [ユーザー設定] -> [設定] を選択します。
		2. python.condapathを検索し、Minicondaのcondaを実行出来るパスを入力します。もし、Minicondaを"D:\Miniconda3"にインストールした場合、"D:\Miniconda3\Scripts"を入力します。

* 標準のターミナルの変更

	詳細は分からないのですが、どうもVS Codeは何かコンソール上で実行したい場合、Windows上ではPowerShellを呼び出していて、PowerShell上ではcondaが正常に動かないようです。そのため、VS Codeが立ち上げる標準のコンソールをcmd.exeに変更します。
	1. メニューから [ファイル] -> [ユーザー設定] -> [設定] を選択すします。
	2. terminal.integrated.shell.windowsを検索し、cmd.exeを入力します。
Gitコマンド 使い方メモ addコマンド

# add
変更をインデックスに追加する

*~基本的な使用例~*

~~~
# ワーキング・ツリーにあるファイルをまとめてインデックスに追加する(カレントディレクトリ以下のみ)
git add .
~~~
~~~
# ファイルを指定してインデックスに追加する
git add ファイル名.拡張子
~~~
~~~
# ファイルを複数指定してインデックスに追加する
git add ファイル名.拡張子 ファイル名.拡張子
~~~
~~~
# 拡張子を指定して該当するファイルをまとめてインデックスに追加する
git add *.拡張子
~~~
~~~
# 複数の拡張子を指定して該当するファイルをまとめてインデックスに追加する
git add *.拡張子 *.拡張子
~~~

#### ~便利なオプション~

**-n**
**--dry-run**
> 引用：Gitの公式リファレンス（https://git-scm.com/docs/git-add）
Don’t actually add the file(s), just show if they exist and/or will be ignored.
訳：実際にファイルを追加するのではなく、ファイルが存在するかどうか、または無視されるかどうかを示してください。

下記のようにコマンドを実行すると、インデックスに追加されるファイル名が出力される（この段階では追加されない）

~~~
git add -n .
~~~
~~~
git add --dry-run .
~~~

---

**-v**
**--verbose**
> 引用：Gitの公式リファレンス（https://git-scm.com/docs/git-add）
Be verbose.
訳：長々とする（メッセージを増やす）

下記のコマンドを実行すると、インデックスに指定したファイルが追加され追加されるファイル名が出力される
この時、addされてしまうので注意

~~~
git add -v .
~~~
~~~
git add --verbose .
~~~

---

**-u**
**--update**

> 引用：Gitの公式リファレンス（https://git-scm.com/docs/git-add）
Update the index just where it already has an entry matching <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files.
If no <pathspec> is given when -u option is used, all tracked files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).
訳：<pathspec>に一致するエントリがすでにある場所でインデックスを更新します。これにより、ワークツリーに一致するようにインデックスエントリが削除および変更されますが、新しいファイルは追加されません。
-uオプションを使用したときに<pathspec>が指定されていない場合、ワークツリー全体で追跡されたすべてのファイルが更新されます（Gitの古いバージョンは更新を現在のディレクトリとそのサブディレクトリに制限するために使用されます）。

下記のコマンドを実行すると、バージョン管理されている変更されたファイル・削除されたファイルがインデックスに追加される。
新規ファイルはバージョン管理されていないため追加さられない。

~~~
git add -u
~~~

~~~
git add --update
~~~


---

**-A**
**--all**
**--no-ignore-removal**

> 引用：Gitの公式リファレンス（https://git-scm.com/docs/git-add）
Update the index not only where the working tree has a file matching <pathspec> but also where the index already has an entry. This adds, modifies, and removes index entries to match the working tree.
If no <pathspec> is given when -A option is used, all files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).
訳：ワークツリーに<pathspec>に一致するファイルがある場合だけでなく、インデックスにすでにエントリがある場合でも、インデックスを更新します。これにより、ワークツリーに一致するようにインデックスエントリが追加、変更、および削除されます。
-Aオプションを使用した時に<pathspec>が指定されていない場合、ワークツリー全体のすべてのファイルが更新されます（Gitの古いバージョンは更新を現在のディレクトリとそのサブディレクトリに制限するために使用されます）。

下記のコマンドを実行するとワークツリーに存在するファイル全てがインデックスに追加される。
「git add .」は、現在いるディレクトリ配下にあるファイルの全てが追加されるが、このオプションはディレクトリ関係なしワークツリー内全てのファイルが追加される。

~~~
git add -A
~~~

~~~
git add --all
~~~

~~~
git add --no-ignore-removal
~~~

---

## 参考資料

Gitの公式リファレンス（https://git-scm.com/docs/git-add）
サル先生のGit入門(https://backlog.com/ja/git-tutorial/)
mnist分類結果をflask+bokehで可視化するツールを作ってみた

分類問題で画像を見ながら可視化する必要性が出てきたので,
flask+bokehで可視化ツールを作成してみた.

flaskベースにした理由はURLで画像を埋め込みたかったから.
分類結果の混同行列と特徴量空間のビジュアライゼーション(次元圧縮は別途)ができる.

mnistの性能が良すぎて混同行列の外れがほとんど出なかったため,
層を減らしたり,epochを極端に少なくしてデータを作成した.

https://github.com/notfolder/mnist-viewer

# mnist-viewer

mnistの分類結果を混同行列と特徴量の散布図で確認できるツール.
分類結果を保存したcsvファイルを読み込んで、混同行列と散布図を描画,各サンプルの画像を確認できる.

# デモ

混同行列モード
![confusion_matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490869/9185c61c-9b18-af72-2039-acdb29aa807a.png)


散布図モード
![scatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490869/3664e81b-11c2-0885-4453-9ddb6bfa50f2.png)

# 機能

mnistの分類結果を記録したcsvをアップロードすることで,下記で各画像を確認できる。

* 正解ラベルと推論ラベルのカラム名を指定することで混同行列を描く
  * 混同行列の各マスのサンプル画像を確認できる

* 次元圧縮したxとyのラベル及び色分けに使うカラム名を指定する事で散布図を描く
  * 散布図上のサンプルを選択することで各画像を確認できる

# 必要とする環境

下記環境で開発
* Python 3.9.1
* scikit-learn==0.24.2
* torch==1.8.0
* torchvision==0.2.2
* pandas==1.2.4
* flask==2.0.1
* flask_login==0.5.0
* flask_sqlalchemy==2.5.1
* flask_bootstrap==3.3.7.1
* bokeh==2.3.2

# インストール

下記コマンドで必要なライブラリをインストールする.

```bash
pip install requirements.txt
```

# 使い方

* 起動方法
```bash
git clone https://github.com/notfolder/mnist-viewer.git
cd mnist-viewer
python app.py
```

* 上記で起動後、ブラウザでport 8080を開く.
http://localhost:8080/

* 最初に「ファイル選択」でアップロードするcsvを選び、「Upload」ボタンを押す.
  * csvファイルにはmnistのtest画像の番号が'index'というフィールドに保存されていること.

* 「正解ラベル」「推論ラベル」を選択し,「混同行列生成」ボタンで混同行列を表示後,各セルをクリックする事で各サンプルの画像を確認できる
* 「散布図x」「散布図y」「色カラム」を選択し,「散布図作成」ぼたんで散布図を表示後、各サンプルを選択する事で、画像を確認できる


# 作者

mail to: notfolder@gmail.com

# ライセンス
ライセンスを明示する

"mnist-viwer" is under [MIT license](https://en.wikipedia.org/wiki/MIT_License).
【Rails】YARDOCについて

# 使い方

### ① Gemをインストールする
```terminal:ターミナル
$ gem install yard
```

### ② YARDの規則に従って、メソッド上部にコメントを記載
```ruby:yard_sample.rb
# サンプルメソッドです
#
# @param [Hash] options オプション
# @option options [Boolean] :busy 忙しいかどうかを設定 
# @return [Boolean] 成功：true 失敗：false
# @example
#  create_qiita_about_yard(options: { busy: true })
# @note 詳細は{https://qiita.com/ Qiita}を参照
# @see https://qiita.com/
def yard_sample_method(options: {})
  raise '忙しいすぎて勉強会の資料を作成できませんでした'if options[:busy]
  return true
rescue => e
  p e
  return false
end
```

### ③ 反映するコマンドを実行
```terminal:ターミナル
$ yardoc yard_sample.rb
```

### ④ ブラウザ上でYARDを確認する
◆ 方法①
app/doc配下のindex.htmlファイルをブラウザで開く

◆ 方法②
YARD用のローカルサーバーを立ち上げる

```terminal:ターミナル
$ yard server
```

http://localhost:8808 にアクセスする

# タグ一覧

### よく使うタグ

`@param`：メソッドの引数を説明
`@option`：メソッドのハッシュ引数を説明
`@return`：メソッドの返り値を説明
`@raise`：メソッドの例外クラスの説明
`@example`：メソッドの使用例を説明(インデントをずらさないとコード変換されないので注意)
`@note`：メソッドを使用する際の注意点やその他共有事項を記載する(「{}」で囲むことでリンクになる)
`@see`：URLや他のオブジェクトを書くとリンクになる

※おまけ：ファイルの大外にコメントを書くことで、「Overview」としてYARDに反映される

### その他のタグ
`@abstract`：抽象クラス/モジュール/メソッドの説明
`@api`：オブジェクトに属するAPIの説明(yardoc --queryで実行した場合のみ出力)
`@author`：作者情報
`@deprecated`：非推奨のクラスやメソッドであることを表す
`@private`：YARD出力時にオプションで出力しないようにできる(yardoc --no-private)
`@since`：メソッド・クラスが利用できるようになったバージョンを説明
`@todo`：TODOを記載出来る
`@version`：オブジェクトのバージョンを示す
Gatsby.js①　インストールからant design入れるまで

NEXT.jsっていう名前が嫌い。（意味合い的に安直でしょ？）
だから私はnuxt派。

nuxtでもJAMstack出来るけど、この度Gatsbyをいじることにしてみた。

#### ◆ Cloud9に初期インストールされているnodeのバージョンを上げる。
```
nvm install v12.16.1
nvm alias default v12.16.1
```
※初期でインストールされているのはv10なので、それだとgatsbyがインストールされない。

#### ◆ Gatsby インストール＆プロジェクト作成
```
npm install -g gatsby-cli
gatsby new [projectName] [URL]
```
※projectNameで指定した名前でディレクトリが作成され、URLは使用するテンプレートのGitHub URLを入力する（何も入力しなくてもOK）

#### ◆ AntDesignをインストールする
```
npm install antd gatsby-plugin-antd --save
```
AntDesignはalibabaが作成したCSSフレームワーク。
完璧なＣＳＳフレームワークは存在せず、いずれにしても凝ったスタイルは自分で書かないといけない。
その場合、足りないところはstyled-component形式でCSSを当てていくつもり。
Material-Uiも良いけど、AntDesignの方が初期カラーが綺麗。

#### ◆ AntDesignを使えるようにする
``` gatsby-config.js
plugins: [
  'gatsby-plugin-antd'
]
```
※gatsby-config.jsのpluginsにgatsby-plugin-antdを追加する。

#### ◆ AntDesignのボタン使用例
```
import Button from 'antd'
import "antd/dist/antd.css"

const Default = () => {
  <div>
    <Button type='primary'>PrimaryButton</Button>
  </div>
}
```

※この記事は備忘録の為、随時更新します。
【Laravel】フォームヘルパー laravelcollectiveをインストール【composer】

自分用のメモとして残します。

ここ最近はフロント側Reactで動的表示していました。。。
ど忘れしたので、メモ。

前提はLaravel6です。

#■やり方


```shell
composer require "laravelcollective/html":"6.*"
```
メモリ不足でインストールこけたら下記で再実行

```shell
COMPOSER_MEMORY_LIMIT=-1 composer require "laravelcollective/html":"6.*"
```

#■最後に
使用方法は公式やQiitaに確かチートシートあったので、そこを参考にしてください。
ソース量はそんなに変わりませんが、
一周回ってフォームヘルパーに落ち着くよね。
NoCodeで習慣化しなくていい日記アプリをつくりました

![noteサムネ_flour告知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127251/a47cd97b-a7e4-da9f-aeff-90a48a39123a.png)

こんにちは。フローリシング代表の中沢草太です。

普段メンタルヘルスのアプリを作っていて新しいアプリを公開したので紹介します。
このアプリはNoCodeのKodularを用いて開発しています。

#何を作ったのか？

習慣化しなくていい日記アプリ「[flour](https://play.google.com/store/apps/details?id=jp.flourishing.flour&hl=jp)」を作りました。
（日本語と英語に対応しています）

https://play.google.com/store/apps/details?id=jp.flourishing.flour&hl=jp


なんで習慣化しなくていいのかというと**Twitterをしながら日記を書くことができるから**です。

Twitterしている人にとっては毎日やっているTwitterを見るついでに日記をつけることができます。

####【基本的な機能】

- **広告無し&時系列のシンプルなTwitter**
- **手軽に気分を記録できるムードトラッカー**
- **気分の変化を視覚化できるグラフ機能**

![note_flour告知2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127251/db2a0873-b0c0-563b-e767-e65211878bdf.png)


このアプリは以下のような方におすすめです。

**・これ以上日記をつけるのに挫折したくない**
日記は毎日続けられないけどTwitterは毎日続けられるあなたに。

**・ツイートする前のブレーキがほしい**
投稿したあとに後悔したことはりませんか？
flourの日記はローカルに保存されるので自分しか見れません。

# なぜ作ったのか？

このアプリを作ったきっかけは自分自身が日記を続けることができなかったからです。

特にメンタルが落ち込んでいるときは日記アプリを開く気にすらなりません。

ただTwitterだったらメンタルが落ちているときでも開けて、毎日やることが苦じゃなかったんです。

周りの知り合いも同じような体験があって、落ちているときほどTwitterに触れる頻度が増える。

じゃあTwitterをしながら気分の記録ができれば毎日続けられるんじゃないか？という発想で作ったのがこのアプリになります。

ものすごく個人的な話をするとTwitterに投稿したあとに

**「うわ、これ投稿せんとけばよかった…」**

みたいなことがよくありました。

flourは同じアプリ内にTwitterの投稿とローカル保存の日記機能を持たせることでブレーキをかけられるようにしました。

<img width="300" alt="投稿画面スクショ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127251/f6bd01a7-afeb-3fe9-5fac-52a545e60f67.png">

# 今後の展望

現在アプリは基本機能のみのβ版になります。

今後は**Twitterのデータからメンタルの状態を分析、ケアをサポートする機能**を実装予定です。

このアプリはこれがメインです。

現在はこの領域を研究している筑波大やハーバードの研究者に相談しながら実装に向けた準備をしています。

# 目指していること

私はメンタルヘルスをより手軽で身近なものにしたいと思っています。

挑戦していることを一言で表現すると

**「スマホをデジタルバイオマーカーにする」**

ことになります。

今回のflourはTwitterのデータを使って誰もがメンタルの状態を把握できるようになることを目指しています。

まだ最適解が見つかっていないのですが、日々世界中の研究者の方と連絡を取りながら構想を練っています。

ただ私はエンジニアではないのでご協力いただけるエンジニアの方も探しています。

もし以下の内容にご興味を持っていただけたエンジニアの方がいたらご連絡ください。

**・スマホをデジタルバイオマーカーにするプロダクトの研究と実装**
**・Twitterデータからメンタルを予測するプロダクトの研究と実装**


Twitter → [@sotasaaan](https://twitter.com/sotasaaan)
Analytics Cloudを活用したPOSデータ分析　データ準備編② 昨年対比の計算について

# 利用環境 #

データベース：Oracle Autonomous Data Warehouse　容量(1OPCU)
BIサービス：Oracle Analytics Cloud  機能セット(Enterprise Analytics) 、容量(２OPCU)



# 用意したデータについて #

アパレル事業の店舗POS売上明細データ：　ID付きPOSデータなので、会員ID付きの売上データです。商品属性（カラーコード、サイズ）、ブランドなどは、連結済み

会員マスタデータ：会員の基本属性データですが、ポイント増減に関する情報も、連結済みのデータ






# Analytics Cloudを活用したPOSデータ分析　データ準備編②：昨年対比の計算について



商品アイテムごとに、または店舗ごとに売り上げの昨対を見たいというニーズは、POS販売分析においてとてもポピュラーな要件だと思います。

データベースにデータマートや中間テーブルを用意する方法で対応しても良いとは思いますが、集計単位や抽出条件はしばしば変わるので、BIツール側で計算した方が、柔軟性が増します。

今回も**Analytics Cloudの関数を使って売上数量について前年対比カラムを作成する方法**をご紹介します。

完成形イメージ
**売上数量の前年対比グラフ（商品アイテム別、ブランド別、店舗別、期間別）**



![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/b8db6b88-9a73-dea5-c233-e0c2ee73765b.jpeg)




# ステップ１:前年の売上数量の計算カラムを作成する　

Analytics Cloudの関数で、前期比計算をする方法は、いくつかあります。移動平均(MSUM)関数を使う方法と、Aog関数を使う方法が一般的なようです。今回は、移動平均(MSUM)関数を使った方法をご紹介します。

MSUM関数は、データの最後のn行の移動合計を計算してくれます。[MSUM関数](https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acubi/functions.html#GUID-4CBCE8D4-CF17-43BD-AAEF-C5D614A8040A)については、Analytics Cloudの製品ドキュメントの関数リファレンスの集計実行関数の項を参照してください。



この移動合計関数を利用して、前年の売上数量を計算したいのですが、基本的なアイデアとしては、**直近13か月の売上数量の移動合計 - 直近12か月の売上数量の移動合計＝前年の売上数量**ということです。



```
計算式：MSUM(売上数量,13)-MSUM(売上数量,12)
```



分析する時に任意の時点での前年計算が柔軟に算出できるようにするために、計算式は、データセットに対してではなく、Analytics Cloudのプロジェクト(レポート)にセットすることにします。プロジェクトに計算項目を追加するには、”マイ計算”を使います。左側のデータペーンの下に”マイ計算”メニュがあるので、右クリックから”計算の追加”を選択します。

![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/f42a4c77-c6c9-b654-948b-f0c86651ab44.jpeg)


”計算の編集”で、　計算式を入力し、念のため”検証”をクリックして、式が正しいことを確認してから、”保存”をクリックします。


![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/f59b2b24-e73d-528a-5dcb-3a395e308f95.jpeg)


式が正しく保存されると、以下の様に、前年売上数量カラムが作成されました。

![001-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/8128c6eb-ae48-73f6-79d1-58a9a6cd9a0f.jpeg)


# ビジュアライズの作成

作成した前年売上数量カラムについて、Analytics Cloudの可視化機能を使って簡単にビジュアライズを作ってみて結果を確認しましょう。きちんと、12か月前の値が、前年数量として表示されていることが分かります。

画面上部のフィルターに、期間や、ブランド、商品アイテム、店舗などを配置することで、任意の範囲にデータを絞り込みながら前年対比グラフを表示することが出来るのも便利です


![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/714b113c-1541-7e85-5cbc-3571921ef842.jpeg)



# まとめ

- MSUM関数を使えば、昨年対比だけではなく、対前日や、対前週、対前月など、様々な前期比の計算に応用が利きます。
- プロジェクトの”マイ計算”に計算項目を追加することによって、店舗や商品アイテム、ブランド、期間などについて任意の条件でデータを絞り込みながら、前年対比（前期比）をダイナミックに算出することが可能です。
Azure StorageEmulatorで「Server encountered an internal error please try again after some time」が発生した時の対応

# 事象
AzureStorageEmulatorを下記のコマンドで起動。

https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-emulator

```
AzureStorageEmulator.exe start 
```

起動していることを確認。

```
>AzureStorageEmulator.exe status

Windows Azure Storage Emulator 5.10.0.0 command line tool
IsRunning: True
BlobEndpoint: http://127.0.0.1:10000/
QueueEndpoint: http://127.0.0.1:10001/
TableEndpoint: http://127.0.0.1:10002/
```


AzureStorageExplorerから起動したストレージエミュレータにアクセスすると、下記の文言が表示され正常にアクセスできない。
「Server encountered an internal error please try again after some time」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/2063f2b6-90e0-dfb6-1d24-a4681655f903.png)


# 原因
わかりませんでした。。
AzureStorageEmulatorに問題があるようですが、問題の特定に至りませんでした。

# 対策
Microsoftが提供している別のストレージエミュレータ「Azurite」を使用する。

https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite

Azuriteを使用してストレージエミュレータを起動すると、ローカルストレージに正常にアクセスすることができました。
(エラーメッセージもうちょい具体的に書いてほしい。。。)
面倒くさがりな人のための ESLint

# .eslint.js の設定、何をどうすればいいのかわからん

わかります。設定回り、難しいっすよね。そんなときには、このコマンドを打ち込んでみてください。

```
# まずは eslint だけ install
npm install --save-dev eslint
or 
yarn add -D eslint
```

```
# つぎに、これを実行。
npx eslint --init
or
yarn run eslint --init
```

すると、、、？

```bash
PS C:\Users\me\eslint-sample> yarn run eslint --init
yarn run v1.22.10
$ C:\Users\me\eslint-sample\node_modules\.bin\eslint --init
? How would you like to use ESLint? ...
  To check syntax only
> To check syntax and find problems
  To check syntax, find problems, and enforce code style
```

となります。「ESLintをどういうふうに使いたいんや？」って聞かれてますね！ `node_modules\.bin\eslint` に `--init` というオプションを渡すことで、あとは選択肢に従って自分好みに設定していけば、ひな型が作成されます。 [👉参考](https://eslint.org/docs/user-guide/command-line-interface#-init)

# とはいっても、prettier 入れときたいよね？

気持ちはわかります。なので、ついでに prettier も入れましょうか。脳死でこのコマンドたたけばよいです。

```
npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier
or
yarn add -D prettier eslint-config-prettier eslint-plugin-prettier
```

できたひな型に対して、extendsのフィールドに、`plugin:prettier/recommended`を追加してあげましょう。prettierのルールを追加させたい場合は、`prettier/prettier` の箇所にごにょごにょしてあげるとよいです。

```javascript
module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  extends: [
    'plugin:vue/essential',
    'standard',
    'plugin:prettier/recommended' // 👈追加
  ],
  parserOptions: {
    ecmaVersion: 12,
    parser: '@typescript-eslint/parser',
    sourceType: 'module',
  },
  plugins: ['vue', '@typescript-eslint'],
  rules: {
    // prettier rules ;; これはお好みです、prettierのルールを適用させたい場合に使用
    'prettier/prettier': [
      'error',
      {
        printWidth: 120, // 1行当たりの文字数制限120
        singleQuote: true, // 文字列はシングルクォート強制
        trailingComma: 'all', // `,`を最後の要素に強制
        semi: true, // `;`を強制
        arrowParens: 'avoid', // arrow関数の引数の`()`が不要なら警告
        tabWidth: 2,
      },
    ],
  },
};
```

以上で終わり。七面倒くさいことはなし、これで終わりです！！

# いろいろ調べてみると、--init 系はいろいろある

そもそもフロントの設定ファイルは覚えることが大変で、バージョンが違えば書き方も違う。その度に書き方を調べては疲弊してしまいます。けれども、何かしら設定ファイルを必要とするようなもの、例えば webpack など、`init` オプションによるひな型の作成はできることを知っておけば、開発が少しは楽になるかもしれません。

フロントエンドエンジニアっぽい記事久しぶりに書きました🦀
エンタイトルメント管理 ⇒ 必要なサポートステップの設定

１．空欄を埋めてください。________ は、カスタマーサポートプロセスの必須ステップを表します。
２．正しい文はどれですか?
３．マイルストンではどのアクションを自動化できますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/f314a9fe-d661-592f-15b6-9b39c80afc16.png)
ブランチの履歴から特定のファイル（と非表示ファイル）以外を削除する


パスワードなど、**特定のファイルを履歴から削除**するというのはのはすぐ見つかったが、**特定のファイル以外を削除**するというのだと見つからなかったのでここに書いておく。

## 目的

リポジトリ内の特定のディレクトリ（もしくはファイル）を他のリポジトリと共有したい。
そのためにそのディレクトリ（もしくはファイル）のみが含まれるブランチを作りたい。

特定のディレクトリをルートにして別のリポジトリにするならそれ用の
`git subtree split` や　`git filter-branch --subdirectory-filter `があるのだが、今回は切り出したあとも`cherry-pick`で切り出し元の更新を持ってきたかったので、階層はそのままにしたかった。

## 結論

切り出し先のブランチを作成、チェックアウトしてから以下を実行する。  
※念の為作業用にクローンしてから実行することを推奨

```
git filter-branch --tree-filter 'ls |  grep -v -E "target_dir_or_file" | xargs -r git rm  -rf  --ignore-unmatch' --prune-empty HEAD
```

これで今のブランチ（履歴含む）から`target_dir_or_file`（と`.gitignore`を始めとした非表示ファイル）以外のファイルが削除される。切り出し元含む他のブランチはそのままなので、多くの場合既存のブランチとはunrelatedな状態になるはず。

前述の通り非表示ファイルが残っているが、今回は`.gitignore`くらいしかなかったので気にしないことにした。

## 参考ページ

- [git最強のオプション filter-branch - Qiita](https://qiita.com/Spring_MT/items/f60c391b5dbf569a1d12)
- [Git - git-filter-branch Documentation](https://git-scm.com/docs/git-filter-branch)
- [【Linux】特定のファイル以外を指定して削除する方法 | 社内SEのITメモブログ](https://notepad-blog.com/content/20/)
【React】TypeError: Object(...) is not a functionの解決方法

<h2>症状</h2>
ReactでuseHistoryを実装しようとしたところ、下記エラーが発生しました。
翻訳すると、「functionがない」とみたいです。

```terminal:エラー
Uncaught TypeError: Object(...) is not a function
    at UserDetail (UserDetail.jsx:43)
    at renderWithHooks (react-dom.development.js:14985)
    at mountIndeterminateComponent (react-dom.development.js:17811)
    at beginWork (react-dom.development.js:19049)
    at HTMLUnknownElement.callCallback (react-dom.development.js:3945)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:3994)
    at invokeGuardedCallback (react-dom.development.js:4056)
    at beginWork$1 (react-dom.development.js:23964)
    at performUnitOfWork (react-dom.development.js:22776)
    at workLoopSync (react-dom.development.js:22707)
    at renderRootSync (react-dom.development.js:22670)
    at performSyncWorkOnRoot (react-dom.development.js:22293)
    at react-dom.development.js:11327
    at unstable_runWithPriority (scheduler.development.js:468)
    at runWithPriority$1 (react-dom.development.js:11276)
    at flushSyncCallbackQueueImpl (react-dom.development.js:11322)
    at flushSyncCallbackQueue (react-dom.development.js:11309)
    at flushSync (react-dom.development.js:22467)
    at Object.scheduleRefresh (react-dom.development.js:24429)
    at react-refresh-runtime.development.js:304
    at Set.forEach (<anonymous>)
    at Object.performReactRefresh (react-refresh-runtime.development.js:293)
    at RefreshUtils.js:62
```

```react:UserDetail.jsx
import React, {Fragment,useReducer,useEffect,useHistory} from 'react';

export const UserDetail = () => { 
  const history = useHistory();

  function onClickEditHandle() {
    history.push(userEditHistory(state.user.id))
  }

  return (
    <button onClick={onClickEditHandle}/>
  )
}
```

<h2>解決策</h2>
useHistoryのimportのfromで指定が間違っていたため起きていたようです。

引っ張ってくる大元に該当のfunctionがなかったため、Object(...) is not a functionと言われていたようです。

```
import React, {Fragment,useReducer,useEffect} from 'react'; 
import {useHistory} from "react-router-dom";
```
Apache と CGI(Perl)  備忘録

## はじめに

タイトル通り備忘録です
インストールからローカルネットワークから呼び出す
までやったとこをつらつらと書いていきます。

## 環境_2021/05/26
Windows 10 Pro
Apache 2.4.47
Active Perl 5.28.1

##Apache
###インストール

公式サイト様よりダウンロード
https://www.apachelounge.com/
インストール画面は割愛

以下はしてもしなくてもよい
###サービスとして登録
これをしておくとWebサーバーの起動を自動化できるので楽

コマンドプロンプトを管理者起動
Apache\binに移動

```
cd C:\Apache24\bin
httpd.exe -k install
```

「Windows セキュリティの重要な警告」が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247370/22f140c7-eccd-a6a7-cfef-9775dc245dfd.png)
画像を適当に拾ってきたので画面が少し違うかも...

時と場合によってプライベート、パブリックのチェックし
アクセスを許可する(A)

サービスの確認して「Apache2.4」が追加されていればよき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247370/f0391e8d-4a24-e953-00e5-3422adee7eb2.png)

###環境変数
本当にこれはどっちでもよい
わざわざcdでディレクトリ移動がめんどくさいよって時に(´・ω・`)

システムのプロパティ→詳細設定→環境変数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247370/70126d5e-a714-41a5-5a41-0d313d544a5b.png)

ユーザー環境変数のPathへ追記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247370/6688f54b-4f34-19ff-e2e4-fbc38346223c.png)

ココではデフォPathですが
インストールで変更した場合はそれに合わせて変更

確認方法はコマンドプロンプトにて下記実行

```
httpd -v
```

バージョン情報が表示されれば問題なし

###ルートの変更

Apacheのデフォ状態だと
インストール→起動でサンプルページが表示できる様になっているが
そのままいじるのはナンセンスなので変更

とりあえず適当に
[C:\Test]を作成

ApacheのConfの編集
``C:\Apache24\conf\httpd.conf``の258行目付近

```
DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
↓
DocumentRoot "C:/Test"
<Directory "C:/Test">
```
変更後保存してApacheを再起動

```
httpd -k restart
```

ブラウザにてアクセス
``http://localhost``
``http://実行端末のIPアドレス``

多分こうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247370/f10e36da-eab3-0979-387c-f1c96e2e4adf.png)

初期設定はこんなもんで...

##CGI(Perl

ダウンロード先
https://www.activestate.com/

インストール画面は割愛で``C:\Perl64``
コマンドプロンプトにてバージョンとインストール確認

```
perl -v
```

お次にApache側でCGIが実行できる様にします

###Conf

先程と同じく
``C:\Apache24\conf\httpd.conf``
の編集

必要なディレクトリ内のオプションにExecCGIを書き込みます。
すべてのディレクトリでCGIを許可する体でドキュメントルート
ついでにディレクトリ内が見られるのが困ることが多いので
Index of /を表示しないようにするオプション
272行目付近

```
Options Indexes FollowSymLinks
↓
Options FollowSymLinks ExecCGI
```

実際にCGIもしくはperlが動作するように？？
ちょっと理解してない。。
421行目付近に2行追加

```
AddType application/x-httpd-cgi .cgi
AddType application/x-httpd-cgi .pl
```
430行目付近

```
#AddHandler cgi-script .cgi .pl
↓
AddHandler cgi-script .cgi .pl
```

確認のためにディレクトリアクセスしたときのTOPページ的な
292行目付近

```
DirectoryIndex index.html
↓
DirectoryIndex index.html index.cgi index.pl
```

Conf触ったので再読み込み的な意味での再起動
コマンドプロンプトで

```
httpd -k restart
```

###確認
C:\Testにindex.cgiを作成

Perlの確認もするのでこんな感じ

```
#!C:/Perl64/bin/perl
print "Content-type: text/html\n\n";
print "Hello World";
```
ブラウザにてアクセス
``http://localhost``
``http://実行端末のIPアドレス``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247370/1c0aad40-79ef-2e02-8b27-7d22a580c1e6.png)

###終わり

これから何回触るかってくらいなので残しておこうと思いました。
今更感満載ですが、、誰かの目に止まればうれすぃ
料理：ヘルシオ (作成途中ではあるけれど）

関連記事で、プログラムとは関係ないとの指摘をいただきました。
Cooking for Geeksのファンとしては残念な気もしますが、もっともなご指摘なので、こちらに移動することにしました。

https://plussum.hatenablog.com/entry/2021/06/06/165226?_ga=2.187171115.2086076410.1622962263-1594190019.1614326990
Couchbase Server データ管理におけるメタデータの役割

# はじめに

本稿ではCouchbase Serverにおける、メタデータの扱いについて解説します。

Couchbaseは、、ドキュメント指向NoSQLデータベースです。キーバリューストアのバリューとしてJSONデータを格納することで、クエリなど準構造化データを扱う機能を提供します。バリュー/ドキュメントのメタデータはドキュメント本体の外部で管理されます。

# メタデータ

Couchbase Serverは、ドキュメントが保存されるときに、ドキュメントに関連付けられたメタデータを生成します。

## メタデータ実例

以下は、メタデータのサンプルです。

```
{
  "meta": {
    "id": "airport_1306",
    "rev": "1-1526338d1bbb00000000000002000000",
    "expiration": 0,
    "flags": 33554432,
    "type": "json"
  },
  "xattrs": {}
}
```

## メタデータ属性
メタデータ内の属性(attribute)は次のとおりです。

### `meta`
保存されたドキュメントの標準メタデータを値とする属性

- `id`：保存されたドキュメントのキー。

- `rev`：リビジョンまたはシーケンス番号。この値はCouchbaseサーバー内部利用専用です。（クラスター間の同期〜XDCR〜が設定されている際に）ドキュメントが異なるサーバー（クラスター）で同時に更新されたときに発生する競合の解決に使用され、ドキュメントが変更された回数を表します。XDCRの競合解決に用いられます。

- `expiration`：ドキュメントの有効期限（または存続可能時間）。ゼロ以外の場合、これはドキュメントがシステムから削除されるポイントを決定します。設定方法としては、Couchbase SDK API、または、Webコンソール、CLI、またはREST APIを使用できます。ドキュメントごとに設定する他、バケットレベルで（そのバケットに保存されるドキュメントの有効期限を）設定することが可能です。

- `flags`：保存されたデータのタイプを識別したり、フォーマットを指定したりするために使用できるCouchbase SDK固有の値。

- `type`：保存されたデータのタイプ。"json"または"binary"。

### `xattrs`

拡張属性（eXtra ATTRibuteS）。特別な種類のメタデータとして、一部はCouchbaseシステム内部で利用され、一部はオプションとして、ユーザーアプリケーションによって書き込み・読み取りが可能です。
GitHub Actions で テストが失敗したときに laravel.log をみたい！

## 概要
テストがローカルでは成功するんです。
でも、GitHub Actions では、失敗するんです。
こんなこと、たまにありますよね。（泣）
phpunit の標準出力の情報だけだと、追いきれない。
laravel.log みたい！

そんなとき、GitHub Actions の yml に 以下のようなコードを仕込んで置くと、とても便利です。
処理が失敗したときだけ、 `laravel.log` を cat するのです！


## やり方

```yaml
    - name: view laravel.log
      run: cat storage/logs/laravel.log
      if: ${{ failure() }}
```


これで、GitHub Actions のコンテナに ssh ログインしなくても、
エラーを見ることができるので解決の糸口が見つかるはず！
簡単＼(^o^)／

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/fd30e260-1661-4f01-ea55-4b92050cf7f4.png)


ちなみに、 if に書いている、 failure() 関数は、 ジョブステータスのチェック関数というそうで、以下の種類があります。

- success()
- always()
- failure()

https://docs.github.com/ja/actions/reference/context-and-expression-syntax-for-github-actions#failure


## あれこれ
laravel.logを見てもわからなければ、 GitHub Aactions のコンテナにssh ログインする方法もあるので、必要に応じて。

https://qiita.com/shonansurvivors/items/cb8902acfe5c3a1b3ca0
Google Maps ActivityをFragmentへコピペするときの注意

少しハマったのでメモ

# やろうとしたこと
- Google Maps Activity のコードをそのまま新規FragmentにコピペしてMap表示するFragmentとして使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344513/e91a2588-bfb6-8ef5-631d-49ba68a3ed46.png)

# ハマったこと
- "Unresolved reference: supportFragmentManager" というエラーが出る

# 対策
- supportFragmentManager から childFragmentManager　に変更


対策前

```kotlin:Fragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }
```


対策後

```kotlin:Fragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        val mapFragment = childFragmentManager //ここが変わっている
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }
```

# 原因
- 階層ごとに呼び出すMapFragmentが違う
    - Activity→Fragment：supportFragmentManager
    - Fragment→子Fragment：childFragmentManager

公式ドキュメントはちゃんと見ないといけないよう
 
# 参考になるサイト
- [フラグメントマネージャ（公式ドキュメント）](https://developer.android.com/guide/fragments/fragmentmanager?hl=ja)
Bootstrap5 document index

Bootstrapで可能なことを、
把握するための
ドキュメントの、インデックス。

■Getting started
Introduction
Download
Contents
Browsers & devices
JavaScript
Build tools
Webpack
Parcel
Accessibility
RFS
RTL
■Customize
Overview
Sass
Options
Color
Components
CSS variables
Optimize
■Layout
Breakpoints
Containers
Grid
Columns
Gutters
Utilities
Z-index
■Content
Reboot
Typography
Images
Tables
Figures
■Forms
Overview
Form control
Select
Checks & radios
Range
Input group
Floating labels
Layout
Validation
■Components
Accordion
Alerts
Badge
Breadcrumb
Buttons
Button group
Card
Carousel
Close button
Collapse
Dropdowns
List group
Modal
Navs & tabs
Navbar
Offcanvas
Pagination
Popovers
Progress
Scrollspy
Spinners
Toasts
Tooltips
■Helpers
Clearfix
Colored links
Ratio
Position
Visually hidden
Stretched link
Text truncation
■Utilities
API
Background
Borders
Colors
Display
Flex
Float
Interactions
Overflow
Position
Shadows
Sizing
Spacing
Text
Vertical align
Visibility
■Extend
Approach
Icons
■About
Overview
Team
Brand
License
Translations


Migration
【ActiveRecord】typeカラムでエラーが出たので、原因と対処方法をまとめてみた（備忘録）

## はじめに
ActiveRecordで、「type」というカラムをもつテーブルを作成した際に、エラーになったので、原因を備忘録として残します。

## 現状

- Exerciseモデルを作成した際に、「運動の種類」＝「type」でカラムを作成。

- エクセルサイズの種類を登録した際に、下記のエラーになっている状況。

![スクリーンショット 2021-05-26 16.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/6c4e1229-77b4-0209-2bb0-c0dc136bc323.png)

めちゃくちゃ怒られてますね:relaxed:

## 原因
- Single Table Inheritanceという1つのテーブルを複数のModelで利用する仕組みとして「type」という名前をActiveRecordが利用するからみたいです。


## 対処法
- 下記のRailsガイドにも記載されているとおり、違うカラム名へ変更します。

>これらのカラム名は必須ではありませんが、Active Recordで予約されています。特別な理由のない限り、これらの予約済みカラム名の利用は避けてください。たとえば、typeという語はテーブルでSTI（Single Table Inheritance）を指定するために予約されています。STIを使わない場合であっても、予約語より先にまず「context」などのようなモデルのデータを適切に表す語を検討してください。


- migrationファイルを作成。

```
$ rails g migrate rename_[変更前のカラム名]_column_to_[モデル名(複数形)]
```

- 今回は、exercisesモデルのtypeを変更します。

```
$ rails g migration rename_type_column_to_exercises
```

- migrationファイルを編集。
 生成されたファイルにchangeメソッドを追加し、変更したいカラム名を記述する。`rename_column :テーブル名, :変更前のカラム名, :変更後のカラム名`
今回は、「運動の種類」から「運動の名前」へ変更します。

```
def change
  rename_column :exercises, :type, :name
end
```
- DBに反映するため、下記コマンドを実行します。

```
$ rails db:migrate
```
- 先程のエラーは、解消され、「type」がありませんというエラーに変わります。`type`にしていたところを`name`へ変更します。

![スクリーンショット 2021-05-26 16.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/fa4a5831-4e34-6b5c-eb30-ff45fc932dec.png)

- 無事にexercises#indexが表示されました！

![スクリーンショット 2021-05-26 16.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/4f26077c-326a-e99e-c985-876d5948e6ed.png)

## まとめ
今回のエラーは、初めてだったので、「おお、何これ？」という感じでしたが、エラー文をしっかり読むと、対処法が示されていたので、いつもよりサクッと解決できました！予約語という聞き慣れない言葉だったので、とても勉強になりました:relaxed:


## 参考文献
- [Railsガイド](https://railsguides.jp/active_record_basics.html)
- [Single Table Inheritance](https://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance)
- [ActiveRecord :: Inheritance](https://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html)
Github上でプルリク作成時のコンフリクトを修正する

# 目的

- Githubでプルリクを作成した際、コンフリクトが発生した時の解決方法をまとめる

# 只今の状況

- プルリクを作成したところ、下記の画像のようにコンフリクトが発生したので直すように促される。

    ![リクエストを使用したPDFの表示を実装_by_miriwo0104_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app_と_PdfController_php_—_laravel8_crud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2d900fdc-fb5a-bff6-9ca3-a81d674ab91c.png)

# 方法

1. 「Resolve conflicts」をクリックする。

    ![リクエストを使用したPDFの表示を実装_by_miriwo0104_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app_と_PdfController_php_—_laravel8_crud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cb447a74-76f2-5ee3-9338-ba47f39ec6a4.png)

1. 画面左部にはコンフリクトが発生しているファイルが羅列されている。右部にはコンフリクトしているソースコードが表示されている。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app_と_PdfController_php_—_laravel8_crud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/96df1c8e-66a3-4ea2-b837-50c950ed8ac4.png)

1. 右部をクリックしてエディタと同じように修正する。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app_と_PdfController_php_—_laravel8_crud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/148fb235-bf60-ce82-99ac-23a1fa19053b.png)

1. 修正が完了したら「Mark as resolved」をクリックする。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/5b6ec058-b6a9-5385-53a8-7c0cf8e0d772.png)

1. 左部のファイル名の欄に緑色のチェックマークがついたらそのファイルのコンフリクト解消完了である。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8f6a4f92-8649-00de-b785-e498b845db25.png)

1. １つ目のファイルが修正できたので次のファイルを修正する。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b4b8a6cd-c78a-0375-9063-aa55c361ed8d.png)

1. 修正が完了したら「Mark as resolved」をクリックする。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/06d29141-291c-5f5d-f634-6302fa07a5ec.png)

1. 左部のファイル全てに緑色のチェックがつくと右上に「Commit merge」のボタンが出現するのでクリックする。

    ![Resolve_Conflicts_·_Pull_Request__2_·_miriwo0104_view_pdf_laravel_app_と_PdfController_php_—_laravel8_crud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/91ad568c-9d74-bf64-36ff-734b0e95e65f.png)

1. Github上で行った修正が反映され、コンフリクトが解消された。
Nuxt.jsのComposition APIで学ぶ、TypeScriptの基本的な型定義について

## はじめに
TypeScriptの勉強を始めたので忘備録のような形で基礎的な部分からまとめていきたいと思います。
また、Vue3の新たな機能であるComposition-API+TypeScriptでの開発を目指しているので、
今回はTypeScriptの基本的な機能に関して学んでいきたいと思います。

## `String`型
```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const name = ref<String>('Taro');
  },
});
</script>
```

## `Number`型
```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const num = ref<Number>(100);
  },
});
</script>
```

## `Boolean`型
```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const isToday = ref<Boolean>(true);
  },
});
</script>
```

## `Array`型
2次元配列を作るときは、`[][]`とすれば作ることができます。

```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const arrayNum = ref<Number[]>([1, 2, 3]);
    const arrayStr = ref<String[]>(['1', '2', '3']);

    const arrayNum2 = ref<Number[][]>([
      [50, 100],
      [150, 200],
      [250, 300],
    ]);
  },
});
</script>
```

## `Tuple`型
配列に対して、型の順序を制限することができる型です。
以下の場合は、`String`, `Number`の順番で定義する必要があります。

```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const profile = ref<[String, Number]>(['Taro', 26]);
  },
});
</script>
```

## `Any`型
どんな型とも相互変換可能になります。
型システムを無視することになるので使用しないことが望ましいです。

```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const name = ref<any>('Taro');
    name.value = 2;
  },
});
</script>
```

## `Void`型
```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

export default defineComponent({
  setup() {
    const name = computed((): void => {
      console.log("I'm Taro");
    });
  },
});
</script>
```

こちらはよく関数で使われる型となります。
関数に関しては以下の記事をご確認ください。

https://qiita.com/Ryo9597/items/956daec2cbc91b423782

## `Object`型
```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

interface profile1 {
  name: String;
  age: Number;
}
export default defineComponent({
  setup() {
    const profile1 = ref<profile1>({ name: 'Taro', age: 26 });
  },
});
</script>
```

## `Union`型
```vue:sample.vue
<script lang="ts">
import { defineComponent, ref, computed } from '@vue/composition-api';

type dayOfWeek = '日' | '月' | '火' | '水' | '木' | '金' | '土';

export default defineComponent({
  setup() {
    const array = ref<(String | Boolean | Number)[]>([1, true, 'Japan']);
    const dayOfWeek = ref<dayOfWeek>('日');
  },
});
</script>
```

## Utility Typesに関して
以下の記事をご確認ください。

https://qiita.com/Ryo9597/items/eff692d7c9f29fc7c66e

## ジェネリクスに関して
以下の記事をご確認ください。

https://qiita.com/Ryo9597/items/9929e1f6621a138ed5a6
Nuxt.jsのComposition APIで学ぶ、TypeScriptのジェネリクスについて

## ジェネリクスとは
「抽象化されたデータ型」を表現する機能です。
同じようなコードを別の型だからという理由で、複数書いているときなどに使います。

では、実際にサンプルコードを書いていきます。

## ジェネリクスの簡単な具体例
`text`も`number`も引数で受けた値を`return`で返しているだけですが、型が違うためコードを分けています。

```vue:sample.vue
<script lang="ts">
import { defineComponent } from '@nuxtjs/composition-api';
export default defineComponent({
  setup() {
    const text = (val: string): string => {
      return val;
    };
    const number = (val: number): number => {
      return val;
    };
  },
});
</script>
```

これがその他の型でもあるとしたらすごく冗長ですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/a8464937-c9b2-453e-bd27-bbcca89c3ec0.png)

ということで、ジェネリクスを使いましょう！

```vue:sample.vue
<script lang="ts">
import { defineComponent } from '@nuxtjs/composition-api';
export default defineComponent({
  setup() {
    const option = <T>(val: T): T => {
      return val;
    };

    const text = option<string>('hello');
    const number = option<number>(100);
    const boolean = option<boolean>(false);
  },
});
</script>
```

上記では抽象的な型引数`<T>`をメソッドに与え、実際に利用されるまで型が確定しないメソッドを作成しています。

これで1つのコードを書くだけで使い回すことができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838372/99ab4b58-7d0c-2160-c4d3-c6d10368ce12.png)
Gridsearchサンプルコード

引用
https://watlab-blog.com/2020/02/20/grid-search-decisiontree/#GridSearchCV-2

```
from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn import tree
from sklearn.ensemble import RandomForestRegressor
import pandas as pd

# データを用意する
X = df['GDP'].values.reshape(148,1)
y = df['乳児死亡率']

test = pd.read_csv("./data/infant_mortality_test.csv")
testX = test[["GDP"]]
testy = test['乳児死亡率']

# グリッドサーチ用のパラメータを辞書型で設定
param = {
    'n_estimators':[1,10,100],
    'max_leaf_nodes':[20,25,30],
    'max_depth':[1, 2, 3, 4, 5],
    'min_samples_leaf':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'min_samples_split':[2, 3, 4, 5]}

# GridSearchCV
'''学習器、パラメータリスト,cv'''
RFR = GridSearchCV(RandomForestRegressor(),   # グリッドサーチで決定木を定義
                   param, cv=5)
RFR.fit(X, y)                           # フィッティング

best_rfr.fit(X,y)
best_rfr.score(testX, testy)

# スコアとパラメータの組み合わせ
scores = RFR.cv_results_['mean_test_score']
params = RFR.cv_results_['params']

# 結果の確認
best_rfr = RFR.best_estimator_
print('最良条件:\n', best_rfr)
print('訓練スコア:\n', best_rfr.score(X, y))
print('テストスコア:\n', best_rfr.score(testX, testy))
for i in range(len(scores)):
    print(scores[i], params[i])
```

```
# データフレームに変換してサマリをcsvに保存
df_summary = pd.DataFrame(params)                       # 辞書型のパラメータをデータフレームに変換
df_summary['Score'] = pd.Series(scores)                 # スコアをデータフレームに追加
print(df_summary)
df_summary.to_csv('summary.csv', encoding='shift_jis')  # csvファイルに結果一覧を保存
```
iOSでカメラのフォーカス距離（焦点距離）を固定する方法

iOS8以降からフォーカス距離の固定が可能になりました。

``` camera.swift
var camera: AVCaptureDevice

//　略

do {
  // AVCaptureDeviceをロックして設定
  try camera.lockForConfiguration()
  // 現在のフォーカス（焦点）距離
  print("\(camera.lensPosition)")
  // フォーカス（焦点）距離設定(0.0~1.0の間)
  camera.setFocusModeLocked(lensPosition: 0.8) { _ in
    // フォーカス（焦点）距離が固定されたら呼ばれるコールバック
    print("\(camera.lensPosition)")
  }
  camera.unlockForConfiguration()
} catch _ {
}
```
ubuntu20.04にfluent-catをインストールする

- fluent-catはtd-agentパッケージの中に含まれる
- fluent-catはTCPリクエストにのせてfluentdへログを手動送信できる

## インストール

```
sudo apt-get install -y ruby-dev build-essential
sudo gem install fluentd 
sudo systemctl disable td-agentd
```

## テスト

```
echo '{"foo":"bar"}' | /opt/td-agent/embedded/bin/fluent-cat hoge.fuga
```
Unityを用いたLookingGlassPortraitにおける録画手法について

※LookingGlassPortrait向け記事です。
音ありのレンチキュラー動画を早く作りたいんだけど
どの手法がいいか悩んでください。俺はまだ悩んでます。
***
#LookingGlassPortrait向けの録画手法
***
##1.HoloRecorderを使う
HoloPlay Unity PluginにはHoloRecorderという専用録画スクリプトが入っています。
これを使うと無音のQuilt動画（各視点が格子状に並べられた仕様）が録画できます。
***
その後、HoloStudioを用いて各LookingGlassPortrait用のレンチキュラー動画に変換し
各デバイスで見れるようになります。
※録画自体は[啓治郎さんのffmpegout for unity](https://github.com/keijiro/FFmpegOut#ffmpegout)が使われています。
***

###メリット
・LGPのパラメータに拠らないQuilt動画なので共有しやすい
・最初から同梱されているのですぐ使える
・録画時はnVidiaエンコードが選べる（速い）
***
###デメリット
・音入ってない
・レンチキュラー動画への変換に時間がかかる
***
##2.unity recorderを使う
unity recorder人気ないですけど便利です。
packagemanagerのプレビューからインストールしてgameviewで録画してください。
***
専用レンチキュラー動画が録画されるのでPC上なら全画面再生で確認できます。
スタンドアローンで動かすためにはh265で再エンコードしてください。
再エンコ後、LGPストレージにコピーしてplaylist.muにファイル名追加してください。
※HoloStudioから転送をするとplaylist.muが生成されます。
***
###メリット
・変換せずPCであればすぐ使える。
・音入ってる。
***
###デメリット
・h264/vp9しか選べずデバイススタンドアローンではh265への再エンコードが必要
・デバイス専用レンチキュラー動画なので他のデバイスで見れない。
・サイズとかアスペクト比は公式設定推奨（色付けとか）
***
##3.[FFMPEGOut for Unity](https://github.com/keijiro/FFmpegOut#ffmpegout)を使う
HoloPlay Unity Pluginには[啓治郎さんのffmpegout for unity](https://github.com/keijiro/FFmpegOut#ffmpegout)が入っている
***
結構苦労して工夫して改変したりスクリプト作れば
レンチキュラー動画も録画できるはずです。（今頑張ってる）
頑張れば音も入れられるはずです（今頑張ってる）
***
ただただ録画したいだけなら音は入らないですが録画も早いしすぐ動きます。
RecyclerViewで広告用のレイアウトを設定する

#目的
RecyclerView内に広告(バナー広告を想定)を掲載する際、広告用のレイアウトを設定する方法がLayoutManagerによって異なったため、それぞれのLayoutManagerでの設定方法のメモ

#前提
RecyclerView.AdapterのgetItemCountは広告の枠も含めた件数を返し、getItemViewTypeで該当する位置が通常のアイテムか広告か判断出来るようになっているものとします。

#LinearLayoutManager
AdapterのonCreateViewHolderとonBindViewHolderでViewTypeごとの処理に振り分けるだけ。

```java
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (viewType == ITEM_TYPE_ADS) {
        // 広告用のViewHolderを返す
    } else {
        // 通常のViewHolderを返す
    }
}
```
```java:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    if (getItemViewType(position) == ITEM_TYPE_ADS) {
        // 広告の表示
    } else {
        // 通常の処理
    }
}
```
![linear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115846/dd948d3d-8d75-60a3-fb96-7c52b6026c94.png)

#GridLayoutManager
LinearLayoutManagerでの処理に追加で、GridLayoutManagerにSpanSizeLookupを設定し、位置が広告の場合、アイテムがグリッドと同じスパンを占めることを返すようにする。

```java:
int colCount = 3;
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), colCount, GridLayoutManager.VERTICAL, false);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        if (getItemViewType(position) == ITEM_TYPE_ADS){
            return colCount;
        } else {
            return 1;
        }
    }
});
```

![grid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115846/4d2304c6-0a90-5a9c-2504-c979c0d1850b.png)

#StaggeredGridLayoutManager
LinearLayoutManagerでの処理に追加で、onBindViewHolderで位置が広告の場合、ViewHolderのLayoutParamsのsetFullSpanにtrueを設定する。

```java:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    if (getItemViewType(position) == ITEM_TYPE_ADS) {
        ((StaggeredGridLayoutManager.LayoutParams)holder.itemView.getLayoutParams()).setFullSpan(true);
        // 広告の表示
    } else {
        // 通常の処理
    }
}
```

![staggered.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115846/61231e44-b131-4001-34c8-63bfdded6d3e.png)