OmniAICreator/Qiita-1.07M huggingface dataset:
GitLabをDockerコンテナで起動

# はじめに
業務の中でGitLabとAWXを使用したCICD環境に触れる機会がありました。

それと同じような環境を自分でも構築してみたい、勉強がてら気軽に検証できる環境を構築したいと思い、まずはGitLabをDockerコンテナで起動させてみることに。

本記事ではGitLabをDockerコンテナで起動するために実施したことを紹介します。

## 環境

- Ubuntu 20.04 LTS
- Docker version 20.10.7



## イメージの取得

GitLabのDockerイメージは[ここ](https://hub.docker.com/r/gitlab/gitlab-ee)にあります。

Docker pullコマンドを実行します。

```
$ sudo docker pull gitlab/gitlab-ee
Using default tag: latest
latest: Pulling from gitlab/gitlab-ee
35807b77a593: Pull complete
5de1c691df49: Pull complete
a9608775a0bd: Pull complete
c51cf31e3c16: Pull complete
803835994a8a: Pull complete
6b08dcdbeee2: Pull complete
f6ba44e7c742: Pull complete
c81892b985f4: Pull complete
Digest: sha256:f27e65c1ed79df94f1add05c77ef6f37d46441343e06787a5cec17a78ed552a1
Status: Downloaded newer image for gitlab/gitlab-ee:latest
docker.io/gitlab/gitlab-ee:latest
```

doker imagesを実行し確認します。

```
$ sudo docker images
REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
gitlab/gitlab-ee   latest    0583d8671a45   7 days ago     2.46GB
```

イメージの取得ができていることが分かります。


## コンテナ起動

イメージの取得ができたら、実際にコンテナを起動させてみます。
既に80ポートで他のコンテナが起動していたため競合を避けるため8010ポートを指定しました。

```
$ sudo docker run --detach \
     --hostname gitlab.example.com \
     --publish 4431:443 --publish 8010:80 \
     --name gitlab \
     --volume /srv/gitlab/config:/etc/gitlab \
     --volume /srv/gitlab/logs:/var/log/gitlab \
     --volume /srv/gitlab/data:/var/opt/gitlab \
     gitlab/gitlab-ee
0d3c373b6c9438b6cce59412338ee49e4270e1eb6fd75ddef10bc69b8267ced4
```

プロセスを確認します。

```
$ sudo docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED        STATUS                  PORTS                                                                                    NAMES
49f531500305   gitlab/gitlab-ee     "/assets/wrapper"        12 hours ago   Up 12 hours (healthy)   22/tcp, 0.0.0.0:8010->80/tcp, :::8010->80/tcp, 0.0.0.0:4431->443/tcp, :::4431->443/tcp   gitlab
```



## アクセス

コンテナが起動できたので、アクセスしてみます。

コンテナ起動時に指定したポートへアクセスします。
![image-20210929164504203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/bd15584f-ccaf-ef1c-9535-271c2eda5ea7.png)

サインイン画面が表示されました。

無事GitLabをDockerコンテナで起動させることができました。



## サインイン

実際にサインインしてみます。

初期ユーザとしてrootユーザが存在しています。

パスワードはコンテナ内の/etc/gitlab/initial_root_passwordに記載されているので下記コマンドで確認します。

```
$ sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: ************************************
```

表示されたパスワードでサインインします。

![image-20210929165457620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/f35e7abf-c407-0102-e76a-5440de2b292e.png)


サインインできました。



## おわりに

DockerコンテナでGitLabを起動できました。

次は同様にAWXをDockerコンテナで起動させてみようと思います。
データの前処理で使ったPythonコード(csv読み込み、データ確認)

# はじめに
データの前処理をする際に使用頻度の高かったコマンドのメモ。
詳細は、pd.read_csvとかで検索してください。
負荷の低い処理とかについては勉強中、もっと楽な書き方などあれば誰か教えてください。

以下に分けて書いていく予定。

- データの読み込み、確認 ←今回はこれ
- データの加工、書き出し
- 数値データの処理

環境：Python 3.8.5(Windows)、Anaconda、Spyder など

## カレントディレクトリを作業フォルダに移動
```python
import os
os.chdir("C:/Users/xxx … ")
```
## csvの読み込み

### データフレームにcsvの内容を格納する
```python
import pandas as pd

file = "./data/datafile.csv" 

# zipやgzファイルのまま読み込みも可能
df = pd.read_csv("./data/datafile.csv.zip")
df = pd.read_csv("./data/datafile.csv.gz")

# そのまま読み込むと1行目=ヘッダー、index列なしとして読み込む
df = pd.read_csv(file)

# index_colでインデックス行を指定
df = pd.read_csv(file,index_col=0)

# herderでヘッダ行を指定(それより上は破棄)
df = pd.read_csv(file, header=0)
df = pd.read_csv(file, header=[0])
df = pd.read_csv(file, header=None)

# usecolでカラムを指定して取得
df = pd.read_csv(file,usecols=["time"])

# keep_default_na=Falseとすると、欠損値を自動でNanにしなくなる(データ型がstrになるが)
df = pd.read_csv(file,keep_default_na=False)

# nrowsで読み込む行数を指定
df = pd.read_csv(file,nrows=10)

# skiprowsで読み込みを飛ばす行数を指定
df = pd.read_csv(file,skiprows=10)
df = pd.read_csv(file,skiprows=range(1,10))

```

### フォルダ内の全csvを取得
```python
import glob

import_dir = "C:/Users/xxx … "

files = sorted(glob.glob(import_dir + '/*.csv'))
        
# CSVファイルの中身を読み出して、データフレームのリスト形式にまとめる
csv_list = []
for file in files:
    csv_list.append(pd.read_csv(file))

```

### データフレームを結合
```python
# 下方向に結合する
con_csv = pd.concat(csv_list)
# ignore_indexで元データのindexを破棄して番号を振りなおす
con_csv = pd.concat([df1,df2], ignore_index=True)

# 右方向に結合する
con_csv_1 = pd.concat([df1,df2], axis=1)
```

## データの内容を確認する
### データの中身を確認
```python
# データの先頭を表示(デフォルトは5行)
df.head(3)

# データの末尾を表示
df.tail(3)
```

### データ型などを確認
```python
# カラムごとのデータ型を取得
df_types = df.dtypes

# インデックス数、カラム数、データ型を確認
df_info = df.info()
```

### カラム名、インデックスの一覧を取得
```python
# カラム名一覧を取得(index形式で出力される=list形式ではない)
df.columns

# インデックス一覧を取得(index形式)
df.index
```

### データフレームの要素を参照する
```Python
# データフレームの1データを取得する 
d = df.iat[1,2]

# データフレームの1列を取得する
col = df["time"]
col = df.iloc[:,3]

# データフレームの1行を取得する
row = df.iloc[3,:]
```

## 参考
調べているときはだいたいこの2サイトにたどり着くことが多かったです。
[note.nkmk.me](https://note.nkmk.me/pandas/)
[DeepAge](https://deepage.net/features/pandas/)
ラズパイでモバイルWi-Fiのバッテリーを監視する

# 課題
私は外出と自宅でモバイルWi-Fi(Huawei Speed Wi-Fi NEXT W06)を兼用しています。
しかし、たまにモバイルWi-Fiのバッテリーが切れて、一時的にネットが使えなくなるのがストレスでした。
リチウムイオン電池的にも、過放電状態は良くないので、ラズパイでバッテリーを監視して、充電が減ったらGoogle Homeで通知する仕組みを構築しました。


# 調査
ラズパイからバッテリー監視できないかなぁ、と考えていたら、そういえば、モバイルWi-Fiの管理画面(```http://192.168.100.1/html/login.htm```)にアクセスしたときに、右上に、バッテリー表示されるじゃん！と思いだしました。
![Screen Shot 2021-09-30 at 22.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101736/872d8ac6-f716-1039-ab28-2896999c3dac.png)

この辺をどうにか使えないかなぁと、開発者モードで調査していたら、JavaScriptで```G_MonitoringStatus```という変数に、バッテリー残量が格納されているという事がわかりました。
![Screen Shot 2021-09-30 at 22.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101736/58907bc2-c054-0fd4-9524-dacb6eeba86b.png)

# 設計
ここまで分かったら後は作業です。ChromiumでモバイルWi-Fiの管理画面(```http://192.168.100.1/html/login.htm```)にアクセスして、G_MonitoringStatusの値をJSONとしてパースして、"BatteryLevel"か"BatteryPercent"を参照して、充電が減っていたら、Google Homeに喋らせます。
![sequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101736/679ca70d-96f4-61a5-80d8-90e33e6aaabe.png)

Google Homeに喋らせる機能は[google-home-notifier](https://github.com/noelportugal/google-home-notifier)を使用しています。
google-home-notifierは、ラズパイ上で```http://localhost:8091```にリクエストすると、Google Homeの8009番ポートに音声再生リクエストを送ってくれます。
そうすると、Google HomeはHTTPリクエストをRaspberry Piに送って、Raspberry Piから音声データを貰いに行きます。図だとGoogle Homeとの通信を一緒くたにしていますが、使用するポートは異なるので、気をつけてください。

ソースは適当ですが、[ここ](https://github.com/kim-tom/Huawei-Speed-Wi-Fi-NEXT-W06-Battery)に置いておきました。

# 参考文献
[GitHub - google-home-notifier](https://github.com/noelportugal/google-home-notifier)
[GitHub - node-castv2-client](https://github.com/thibauts/node-castv2-client)
Anaconda Prompt on Windows Terminal

Windows TeminalでAnaconda Promptを使う方法
試してないけどたぶんcmdじゃなくてpowershellでもいける

#設定
##全般
###コマンド ライン 

```
cmd.exe /k "<your_path_to_anaconda>\Scripts\activate.bat"
```

###開始ディレクトリ

```
%HOMEPATH%
```

###アイコン

```
<your_path_to_anaconda>\Menu\Iconleak-Atrous-Console.ico
```
scala spark勉強備忘録⑥ とりあえず決定木の回帰

引き続きとりあえず機械学習、
今回は決定木を

 ```
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.regression.DecisionTreeRegressor

val categoricalCols = trainDF.dtypes.filter(_._2 == "StringType").map(_._1)
val indexOutputCols = categoricalCols.map(_ + "index")

val stringIndexer = new StringIndexer().setInputCols(categoricalCols).setOutputCols(indexOutputCols).setHandleInvalid("skip")
val numericCols = trainDF.dtypes.filter{ case (field, dataType) => dataType == "DoubleType" && field != "price"}.map(_._1)
val assemblerInputs = categoricalCols ++ numericCols
val vecAssembler = new VectorAssembler().setInputCols(assemblerInputs).setOutputCol("features")

val dt = new DecisionTreeRegressor().setLabelCol("price")
val stages = Array(stringIndexer, vecAssembler, dt)
val pipeline = new Pipeline().setStages(stages)
dt.setMaxBins(40)
val pipelineModel = pipeline.fit(trainDF)

val predDF = pipelineModel.transform(testDF)
val regressionEvaluator = new RegressionEvaluator().setPredictionCol("prediction").setLabelCol("price").setMetricName("rmse")
val rmse = regressionEvaluator.evaluate(predDF)
TsukuCTF 2021 - Beach 100

#問題

https://tsukuctf.sechack365.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d5c8eb13-9956-0f9c-1f07-2eef03f22234.png)

#解いてみた

画像を見てみます。

2枚目に特徴的なCのオブジェが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6b2ad4ad-ebd9-cc24-69d6-78d5b716edac.png)

googleで検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ab562a4a-4291-4dff-9e28-7ace390b4f1b.png)

何個かヒットしたので それらから海が判明しました。一応google mapで確認してみます。
正面からは建物があったりしてストリートビューで行けそうになかったんですが、横からぎりぎり見えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a3385c69-4260-51b0-1aa6-44a4c710f5a1.png)

ということでここに近いJRの駅が答えです。
10年後の自分のために。

https://qiita.com/official-events/12fc7bacec894d33a981

# 経歴
・理系高校→文系大学卒
・エンジニア1年でリタイアし公務員
・その後再びエンジニアとしてやり直し
・今はデータエンジニア・MLエンジニアみたいなポジション

# 10年後までの目標
具体的には書かないけどお金がたくさんほしい。

# 資格など
やろうやろうでやってないもの。
この機会に取っておきたい。。。

・GCPのデータエンジニアとMLエンジニア資格
・JDLAのE資格（たかい。。。）
・Cousera　ML
・ヘルシンキ大AI講座

# 技術的なもの
この辺が弱いよなぁと感じている。

・英語
・線形代数・微積分
・マネジメント
・設計

# 習慣にしたいもの
英語も大事だけどまずは英語。

・英語
・論文読み
・英語
・英語

# 雑記
10年後、どうなんだろうか。
何が残って、何が消えてるのか。
頑張って理解した誤差逆伝播がクソの役にも立たない世界にはなっていませんように・・・
Ubuntu20.04でUSB-Cからの映像出力ができない問題を直した話

##概要

Dell Inspiron 5405にUbuntu20.04とRegolith1.6を入れて、Windows脱出！時代はi3-wm！と息巻いていたが、USB-Cからの映像出力(いわゆるDP alt mode)が動作しなかった。
具体的には、一瞬認識する→すぐに切断を繰り返し、画面がチカチカする。
USB-Cが駄目なら、HDMIを使えばいいじゃない。と言われそうだが、最近買った新しいモニタには、自分のラップトップのHDMIだとMaxの解像度を出せない。困った。

##詳細
とりあえず`dmesg -ew`で何が起こっているかを見てみる。すると一度認識はしているものの、

```bash
[drm]Failed to add display topology,DTM TA is not initialized.
```

みたいなエラーが出ている。どうもこいつが悪そうだ。

## 解決策
いろいろ調べた結果、似たような症状の記事を見つけた。
[【Ubuntu 20.04】外部モニターを認識しない場合の対処法](https://qiita.com/peachft/items/0c4d3f25c33dcd0c1d86)
どうもUbuntuにデフォルトで搭載されている`gdk3`に何らかの不具合があるらしい。

```bash
$ sudo apt install lightdm
```

インストールすると自動でディスプレイマネージャーを選択する画面が開く。`lightdm`を選択してやり、一度再起動する。

無事映った。

## おわりに
真偽不明だけれど、調べている限りAMD系のGPUで起こる問題のような香りがした。
また`lightdm`の問題か`Ubuntu`の問題か、はたまたハードウェアの相性かわからないが、USB-Cケーブルの裏表で映る/映らないが分かれる。
確かにUSB−Cにも裏表の概念はあるけれども。謎。

参考 【Ubuntu 20.04】外部モニターを認識しない場合の対処法 https://qiita.com/peachft/items/0c4d3f25c33dcd0c1d86
8-5.カスタムセル上のボタンを押して画面遷移をしたい

8-5.カスタムセル上のボタンを押して画面遷移をしたい

IBActionに画面遷移の処理を書きたいが、ViewControllerじゃないと書けない。

Delegateを使うと解決できる
委任側: カスタムセル CollectionView
受託側: ViewController


受託側
① 
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "xxx", for: indexPath) as! xxx
cell.delegate = self
②
extension ViewController: yyy {
// デリゲートメソッド
func zzz() {
// 画面遷移の処理を書く
}

委任側
① 
protocol yyy {
func zzz()
}
②
var delegate: yyy?
③
@IBAction func ooo() {
delegate?.zzz() 
}
TsukuCTF 2021 - YUUGEN 100 

#問題

https://tsukuctf.sechack365.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/02119608-7931-79d4-a51f-cd7e6568cd31.png)

#解いてみた

動画を見てみると列車が右から左に走る動画でした。
列車の先頭を見ると「無限」と書いてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/955d112c-2889-9ff1-6bdf-385f37eb2abf.png)

そのあとに「SL人吉」という文字が見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/eeb32b95-29f6-ca95-3bb6-6351efc92ef6.png)

googleで検索してみますと鬼滅の刃の無限列車でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/158d4e34-3bd6-4ad7-9d8a-aac0076e5107.png)

どこからどこに行く列車なのか調べると熊本から博多に行く列車のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5060f11a-5dd8-8dfe-0bea-3e31493eb56a.png)

問題文にある「JR線 駅ナンバリング路線図」を見ると熊本は書いてないですが、荒尾から博多のどれかになりそうです。
終点博多はたぶん止まると思うので博多を除いても28駅もあるのでまだ何かで絞り込む必要がありそうです。

動画ファイルのプロパティを見てみると2020/11/03 13:44と書かれていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f45266d5-c899-39b7-43d2-43b9ede891d3.png)

何時にどこの駅を通過する予定なのかわかればかなり絞れそうです。
熊本8:35　～　博多13:04とあるので13:44にはすでにゴールしてから40分も時間がたってしまっているという話になってしまいます。
交通遅延でもあったのでしょうか。

いずれにせよ博多周辺ということはわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6c522bb3-4bed-2c63-dd3a-cbfdd965bb09.png)

この建物たちをgooglemapで確認します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6f9a1371-9f76-4f7f-f77b-c1eee9379e75.png)

これで正解でした。
8-3.UITableViewCellのLabelをAutoLayoutで位置を決めたい

8-3.UITableViewCellのLabelをAutoLayoutで位置を決めたい

セル上のラベルを、仕様書で指定された位置に配置したい


スタイルはデフォルトで用意されているPlanなどを使うと便利だが、任意の位置に配置できない。そこでCustomを選択して、手動でUILabelをCellに追加する。そうすると位置を指定できる。
CraueFormFlowBundleを使った時にバリデーションが効かない時の解決法


`Symfony`でマルチステップなフォームを作る時に便利な`CraueFormFlowBundle`というライブラリがあります。

https://github.com/craue/CraueFormFlowBundle

こちらを使って、マルチステップなフォームを作った時にバリデーションが効かない時があったので、その時の対応方です。


# 事象

このようなフォームを作った時に、フォームタイプ全体にかかるバリデーションが効かず、`field1`と`field2`の両方が空でもバリデーションが通ってしまった。

```php:src/Form/TestFormType.php

class TestFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('field1', TextType::class, [
                'required' => false
            ])
            ->add('field2', TextType::class, [
                'required' => false
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Data::class,
            'constraints' => [
                new Callback([
                    'callback' => function (Data $data, ExecutionContextInterface $context) {
                        if ($data->getField1() === null && $data->getField2() === null) {
                            $context->buildViolation('どちらか一つは入力してください。')
                                ->atPath('field1')
                                ->addViolation();
                            $context->buildViolation('どちらか一つは入力してください。')
                                ->atPath('field2')
                                ->addViolation();
                        }
                    },
                ]),
            ],
        ]);
    }
}
```


```php:src/FormFlow/TestFormFlow.php
class TestFormFlow extends FormFlow
{
    protected function loadStepsConfig()
    {
        return [
            [
                'label' => 'step1',
                'form_type' => TestFormType::class,
            ],
            [
                'label' => 'confirm',
                'form_type' => FormType::class,
            ],
        ];
    }
}
```


# 解決策

`CraueFormFlowBundle`を使うと、フォームのバリデーショングループが`Default`から変わってしまうのが原因だった。
`FromType`で指定しているバリデーションは、バリデーショングループが`Default`として設定されているので、バリデーショングループに`Default`が設定されていないと、バリデーションのチェックが行われないということでした。

`FormFlow`の方で、バリデーショングループを`Default`とするように設定してあげればOK。


```php:src/FormFlow/TestFormFlow.php
class TestFormFlow extends FormFlow
{
    protected function loadStepsConfig()
    {
        return [
            [
                'label' => 'step1',
                'form_type' => TestFormType::class,
                'form_options' => [
                    'validation_groups' => ['Default'],
                ],
            ],
            [
                'label' => 'confirm',
                'form_type' => FormType::class,
            ],
        ];
    }
}
```
8-2.UICollectionView  画面の回転に合わせてセルのサイズを変更

8-2.UICollectionView  画面の回転に合わせてセルのサイズを変更

このタイミングで行う
    override func viewWillLayoutSubviews() {
        super.viewDidLayoutSubviews()
        // 画面の回転に合わせてCellのサイズを変更する
        listCollectionView.collectionViewLayout.invalidateLayout()
        listCollectionView.reloadData()
    }


ここではタイミングが遅い
override func viewDidLayoutとSubviews() {
}
8-1. UICollectionViewCellの幅をLabelの文字数に合わせる方法

8-1. UICollectionViewCellの幅をLabelの文字数に合わせる方法

UICollectionViewDelegateFlowLayout
メソッド sizeForItemAt()
cell.label.sizeToFit()
return CGSize(width: cell.label.frame.width ...)

UI CollectionViveFlowLayout()
layout.estimatedItemSize = .automaticSize
7-2.Rswift

7-2.Rswift

R.Swift

// ストーリーボードからビューコントローラーを取得する
let view = R.storyboard.main.FooViewController()


StoryboardからViewControllerを生成する書き方
ViewControllerのクラス名が変わっても大丈夫になる。


ビルド時にリソースファイルを生成するようにする
Xcodeでプロジェクトを開く TARGETSで製品ターゲットを選択 > Build Phases > +をクリック > New Run Script Phase > ドラッグ&ドロップで「[CP] Check Pods Manifest.lock」と「Compile Sources」の間に移動
M1 MacにJavaの環境構築

#はじめに
OracleのサイトからJDKインストールしていたが、中々インストールまで辿り着けなかったので今回、azulのサイトからJDKダウンロードした流れをまとめていきたいと思います。

#$ java -versionのメッセージ

```
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```

JDK未インストール状態にて、$ java -versionのコマンドを打つと上記のメッセージが表示。
単純にJDK未インストールであるのでインストールを催促されるメッセージが表示される。

#Eclipseを使うべきではない理由

Javaの開発環境といえば、IDE(統合開発環境)であるEclipseは初学者には難しいのでおすすめはできない。
理由が以下の通り。

* Eclipseは高機能すぎて動きが遅い
* 高いPCスペックを要求する
* 初学者は挫折しがち

#JDKインストール
[azulサイト](https://www.azul.com/downloads/?os=macos&architecture=arm-64-bit&package=jdk)からJDKダウンロード


#インストール確認方法

```
$ java -version
```
下記表示されたら インストール成功している

```
openjdk version "17" 2021-09-14 LTS
OpenJDK Runtime Environment Zulu17.28+13-CA (build 17+35-LTS)
OpenJDK 64-Bit Server VM Zulu17.28+13-CA (build 17+35-LTS, mixed mode,
```

#VS Code設定
Java extension pack インストール

#Hello, world!表示

* パレット(⌘+⇧+P)から Javaと入力し Create Java Project選ぶ
* プロジェクト名を決定
* src/App.java を開く
* Run押して実行


#参考動画
https://www.youtube.com/watch?v=pDBW2U-JxFM
5-6.MARK TODO FIXME

5-6.MARK TODO FIXME

Xcodeの上部にあるFunction Menuに見出しを表示することができます。

swift使用可能
//MARK: *****
//TODO: *****
//FIXME: *****


swiftで区切り線を引きたい場合は
区切り線表示
//MARK:- *****
//MARK: - *****
//TODO: ***** -
//FIXME: ***** -
MARKに区切り線を付けるにはMARK:の後か１つスペースを空け"-"を書き、スペースを空けてコメントを書くことにより行の上に区切り線が引かれます。
TODO、FIXMEはコメント後にスペースを１つ空けて"-"で行の下に区切り線が引かれます。
5-5. UITextView 入力中にスクロール

5-5. UITextView 入力中にスクロール

入力/編集中にスクロールさせる方法
入力文字がキーボードの下に入り込まないようにする

① TextViewの参照アウトレットとデリゲートを設定する


② viewDidLoad()でkeyboardFrameを変更するためのデリゲートと通知を設定する

NotificationCurrent.default.addObserver(
self,
selector: #selector(keyboardWillShow(sender:)),
name: UIResponder.keyboardWillShowNotification,
object: nil
)

③ キーボードのフレームを取得して、コンテンツのインセットとスクロールインジケーターを変更して、TextViewをスクロールする関数を作る

@objc
private func keyboardWillShow(sender: NSNotification) {
textView.contentInset = UIEdgeInsets.init(top: 0, left: 0, bottom: キーボードの高さ120, right: 0)
textView.scrollIndicatorInsets = textView.contentInset
}
5-4. トルツメ 制約の優先度を利用する方法

5-4. トルツメ 制約の優先度を利用する方法 

Viewの中にボタンが5つある
条件によっては、最良ボタンを非表示にして、なしボタンを左端に寄せたい


SuperView
最良 なし 寄付 引け 指成

SuperView
なし 寄付 引け 指成


Storyboard 
なしボタンの制約を設定する
① Leading spase to SuperView 
(LeadingをSuperViewのLeadingに合わせる)
priority 1
② Leading spase to 最良 
(Leadingを最良ボタンのTrailngに合わせる)
priority 999

ViewController
なしボタンの制約をアウトレット接続をする
① NSLayoutConstrain xxx
② NSLayoutConstrain yyy

任意のタイミングで制約の優先度を指定する
① NSLayoutConstrain xxx.priority = 999
② NSLayoutConstrain yyy.priority = 1

① SuperViewへの制約が優先されて、なしボタンが一番左端へ配置される
② 最良ボタンへの制約が優先されて、なしボタンが最良ボタンの横に配置される
Flutter:Firebase Security Rulesの単語についての説明を和訳した

#Flutter:Firebase Security Rulesの単語についての説明を和訳した

原文はVScodeを使い、カーソルをあてて確認しました。

## request
リクエスト変数は、そのパスで行われるリクエストを表すために、条件の中で提供されます。リクエスト変数は、入力されたリクエストを許可するかどうかを決定するために使用できるいくつかのプロパティを持っています。

## request.resource
リソース変数には、書き込まれているドキュメントに関するデータやメタデータが格納されています。これはリクエスト変数と密接に関係しているが、リクエスト変数には、書き込まれているドキュメントではなく、リクエストされたパスにある現在のドキュメントが含まれる。

## request.resource.data
開発者から提供されたデータは、request.resource.dataに表示されます。これは、フィールドと値を含むマップです。

## request.resource.data.size()
文字列の文字数を返します。
リスト内の項目数
マップ内のキーの数

## request.resource.data.values()
マップ内のすべての値をキー順に並べたリストです。

## request.resource.data.keys()
マップ内のすべてのキーのリストです。

## request.resource.data.in(key)
目的の値がリスト内に存在する場合はtrueを、存在しない場合はfalseを返します。
目的のキーがマップ内に存在する場合はtrueを、存在しない場合はfalseを返します。

## request.resource.path
パス変数には、リクエストが実行されるパスが含まれています。

## request.path.size()
文字列の文字数を返します。
リスト内の項目数
マップ内のキーの数

## request.path.matches(regex)
正規表現のマッチングを行い、文字列が指定された正規表現にマッチした場合はtrueを返します。Google RE2の構文を使用しています。

## request.resource.path.split(regex)
指定された正規表現に従って文字列を分割し、文字列のリストを返します。Google RE2の構文を使用しています。

## request.auth
認証されたユーザーがCloud Firestoreに対してリクエストを実行すると、auth変数には、ユーザーのuid（request.auth.uid）とFirebase認証JWTのクレーム（request.auth.token）が入力されます。

## request.time
リクエストされた時間を返します
5-3.未読アイコンの位置を共通化

5-3.未読アイコンの位置を共通化

ラベルの幅が可変なので、未読アイコンの位置をどのように制約で制御するか

したいこと:
未読アイコンの位置をラベルの文言の右上に配置したい。


View
	Label 親ビューの幅に従う
	View
ImageView 親ビューの幅に従う


View
	View
		Label　幅の指定はなし　X軸とY軸の座標を真ん中に指定
		ImageView　Leadingを、LabelのTrailingに合わせるように制約をつける
	View
10年前学んでおきたかったもの

筆頭は英語。異論は認める。

せっかくの企画なのでステッカー欲しさに便乗。

https://qiita.com/official-events/1e99fc384200c38548fd

10年前、初めてエンジニアになり、組み込みの現場で叩き上げられて、今はAI分野のエンジニアをしています。
10年もあれば技術は移り変わるし、受け持つ仕事も社会も変わり、環境や会社が変わる人もいると思います。

結局、英語や数学、課題をどう解決するかみたいな経験則が今一番武器になっているのかなと若輩者ながら思っています。

特定の言語を極めても、ずっと同じ言語を使い続ける人って稀でしょうし（知らんけど）

AI分野に絞って考えると、あまりにも技術の変遷が早すぎる。
凄いナントカカントカって新しい技術に手を出すより、微積分みたいな基本や、英語でドキュメントを読む力、一人で問題を解決する力みたいなものが最後には物を言うのかな、と思ったり思わなかったり。

今学生している人は学校のお勉強しっかりやってれば間違いないと思う。
自分でアプリ作ってサービス作って。。。ができない人（私だ）は特に。


何が言いたいかというと、英語を時間のある時にしっかりやっておくべきだったと思った回数が、これまで生きてきて書いたバグの数より多い、ということ。
英語ができないことが色んな選択肢を減らしてしまってる。

ググるときの検索の幅もそうだし、会社も住む国も。。。
飛び込めばどうにかなるんだろうけど、越えられないハードルにみえるんだよなあ。
5-1. 画面の回転制御

5-1. 画面の回転制御

画面ごとに回転制御をしたい


// 回転方向の指定
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait // 縦のみ 回転させない
}

.allButUpsideDown // 全ての向きに回転を許す
4-1.シングルトンパターン

4-1.シングルトンパターン

GoFの23のデザインパターン


シングルトンパターン
最も有名なデザインパターン。
インスタンスが1個しか生成されないことを保証したいときに使う。オブジェクト指向言語にグローバル変数と同等の機能を実現させるためのもの。

class xxu {
static let shared = xxx() // 自動的に遅延初期化される
private init() {
// 外部からのインスタンス生成をコンパイルレベルで禁止
}
}

たくさんのインスタンスからアクセスされると困るとき
毎回、インスタンス生成をするのが手間
共通的な情報を保持して、メモリを節約したい
ときに利用
BigQueryのクエリにかかる分析料金確認方法

# 概要
- 作成したクエリで分析を行うとき、料金がどの程度発生するか知りたい
- 料金項目について書かれているサイトは多いがGCPサイト上でどのように確認すればよいかわからない
- 本記事では画像つきで解説 

# 分析料金確認
## 分析料金
そもそも、分析にかかる料金は設定等していなければ処理されたデータ量（バイト）で決まる。

`1TB`ごとに`5ドル（約550円）`（毎月1TBまで無料）

しかし、入力したクエリに対してどの程度のデータ量が処理されるかみたい

## 処理されるデータ量の確認方法
例えば、下記のようなクエリをBigQueryのコンソール上に入力したとき、

```sql:ページ別ランディング数・離脱数・直帰数算出クエリ
WITH t1 AS (
  SELECT
    hits.page.pagePath AS pagePath,
    CASE WHEN isEntrance THEN 1 ELSE 0
    END AS is_ent,
    CASE WHEN isExit THEN 1 ELSE 0
    END AS is_exit,
    CASE WHEN totals.bounces = 1 THEN 1 ELSE 0
    END AS is_bounce
    FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
      UNNEST(hits) AS hits
  WHERE
    _TABLE_SUFFIX between  '20170701' AND '20170731'
)
SELECT
  t1.pagePath,
  SUM(t1.is_ent) AS entrance,
  SUM(t1.is_exit) AS exit,
  SUM(t1.is_bounce) AS bounce
FROM t1
GROUP BY 1
ORDER BY 2 DESC
```

下記画像の赤枠部分に、このクエリを実行すると分析されるデータ量が表示される。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/925ec5de-b153-7ad2-ab62-2dd6c2e94208.png)
ここでは、このクエリの実行で10.4MBのデータ量が発生することがわかる。つまり、このクエリで発生する料金は0.0052円（実質タダ。。。）


### 全列SELECTした場合
ここで、BigQueryでやってはいけないとされる`*`でSELECTした場合、データ量はどうなるか見てみる。このデータ量プレビュー機能が正しければ増えているはず。

```sql:全列指定した場合
SELECT
  *
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
```

上記クエリ実行で発生するデータ量は`5.4GB`と表示された。
先程の約520倍、料金も2.7円発生することになる。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/777d619f-701b-564a-d63f-5a0a3d8fffee.png)

## その他発生する料金
### ストレージ料金
BigQuery上のストレージにデータを保存する場合、料金は下記の通り

アクティブストレージ：`1GB`ごとに$0.023 （約2.53円）（毎月10GBまで無料）
長期保存：`1GB`ごとに$0.016（約1.76円）（毎月10GBまで無料）

### 分析定額サービス
月額：$2,400(約26.4万円)/100スロット（追加スロットは100単位で購入可能）
年額：$2,040 (約22.4万円)/100スロット（追加スロットは100単位で購入可能）

# 参考サイト
- BigQuery公式ドキュメント：https://cloud.google.com/bigquery/pricing
- BigQueryサンプル：https://ex-ture.com/blog/2019/03/14/6-sqls-for-ga360-bigquery/
[Kubernetes] システムメトリクス簡単に整理した (Prometheus)

# システムメトリクスの種類


|メトリクスを収集可能にするやつ|集めるメトリクス|PrometheusOperatorのCRD|Prometheusのscrape role|メトリクス例|
|---|---|---|---|---|
|[prometheus/node_exporter](https://github.com/prometheus/node_exporter) (DaemonSet)|hardware and OS metrics (*NIX kernelからExposeされるもの)|`PodMonitor`| `pod` |`node_cpu_seconds_total`, `node_disk_io_time_seconds_total `|
|[kubernetes/kube-state-metrics](https://github.com/kubernetes/kube-state-metrics) (Deployment)|Kubernetes オブジェクトのステート|`ServiceMonitor`| endpoints |`kube_storageclass_created`|
|`kubelet` (各ノード)| コンテナメトリクス `cadvisor`, `resource`, `probes` |`ServiceMonitor`|endpoints|`kubelet_volume_stats_available_bytes`|
|[kubernetes-sigs/metrics-server](https://github.com/kubernetes-sigs/metrics-server) (Deployment)|オートスケーリングパイプライン(HPAとかVPA)用のコンテナメトリクス |Monitoring ツールで集めない|Monitoring ツールで集めない|なし|

# ダイアグラム

![metrics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/8f83b13d-dc99-5a65-6cba-834b74f1b1a5.png)

コメント:

- システムメトリクスのソースは、３つ `kube-api-server`, `kubelet`とHostのKernel
- Prometheusは、それぞれ`kube-api-server`は`kube-state-metrics`経由、 `kubelet`はPrometheusから直接Scrape、Hostはnode_exporterを経由してメトリクス収集
- PrometheusOperatorを使わなくてももちろんMonitoringできる
- PrometheusOperatorは、`PodMonitor`や`ServiceMonitor`によって、Prometheusのscrapeのconfigを設定できるようにしてくれる
- PrometheusのMetricsをCustomMetricsAPIにしてHPA/VPAをするともっと図が複雑になる(今回は書いてない)
- Prometheusのadditional-scrape-configを使ってもkubeletのメトリクスを取得できるがどちらがいいのかは現状よくわからず
- metrics-serverはkubectl topでcontainerのmemoryとcpu使用率を表示するのにも使用される

# 参考

- [https://github.com/prometheus-operator/prometheus-operator](https://github.com/prometheus-operator/prometheus-operator)
- https://github.com/kubernetes-sigs/metrics-server
- https://github.com/prometheus/node_exporter
- [prometheus-operatorでPodのメトリクスを収集する](https://zenn.dev/oke_py/articles/4bffe433eb37a9377367)
- [Metrics For Kubernetes System Components](https://kubernetes.io/docs/concepts/cluster-administration/system-metrics/)
3-3. トルツメ StackViewを利用する方法

3-3. トルツメ StackViewを利用する方法

Storyboard
① UIView「UIStackViewに入れる
② UIStackViewき制約をつける leading, trailing
ViewController
③ UIViewをoutlet接続する
④ UIViewをhiddenに設定すると、UIViewの部分が詰められる
[Ruby] AtCoder過去問 B - Not Found

##はじめに
AtCoderの過去問をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc071/tasks/abc071_b

##B - Not Found
入力を受け取ります。
変数にそのまま文字列として受け取ります。

```ruby
s = gets.chomp
```

sの中に含まれていないアルファベットが知りたいので、荒技かもしれませんが、a~zの全てが入っている文字列を変数alfに代入し、```alf - s```ができればいいのではないかと考えました。
実際にはdeleteメソッドを使用します。

もし、,残ったalfの中身がnilだったら全てのアルファベットが使われているので、出力はNoneになります。

alfはアルファベット順に並んでいるので辞書順です。
一番先頭の文字を出力すれば答えになります。

```ruby
s = gets.chomp

alf = "abcdefghijklmnopqrstuvwxyz"

if alf.delete(s) == nil
  puts "None"
else
  puts alf.delete(s)[0]
end
```
3-2.UICollectionViewカルーセルがスクロールできない

3-2.UICollectionViewカルーセルがスクロールできない

現象:
横スクロールのCollectionViewがスクロールできなくなる
端までスクロールするとセルが残像する

結論:
StoryboardでCollectionViewの上にStackViewを配置していたことが原因だった。それを削除すると解決した。

試したこと:
CollectionViewのセルのサイズを設定するメソッドの値を変えてみる。
insetForSection() ? 中央寄せにするためにインセットを設定するメソッドをコメントアウト。
CollectionViewクラスを定義して、Storyboardの CollectionViewのクラスに指定する。そのクラス内のviewDidLayout() ？　でcontentSizeとboundsのサイズをログ出力してみる。contentSizeのwidthが変化していたのがおかしかった。
PlayGroundで、最小単位の実装で動かしてみる。

StoryboardでAutoLayoutに矛盾のエラーが出ていた。
3-1. カルーセル CollectionVivewの選択により、PageViewを切り替える

3-1. カルーセル CollectionVivewの選択により、PageViewを切り替える

メモが紛失中


参考記事

UICollectionViewControllerとUIPageViewControllerでSmartNewsっぽいあのUIをお手軽に実現する
https://qiita.com/kazuhiro4949/items/ccac697ee734843f7512
ABC106 C - To Infinity から学んだ

https://atcoder.jp/contests/abc106/tasks/abc106_c

![abc106_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/5e7b0873-f002-a7f5-ca4e-94456905ddc2.png)
![abc106_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/b13b6fc6-2ef1-397c-4f0a-e4e99656e475.png)
![abc106_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/035b34f3-b5bc-f1eb-1e14-00416cde495d.png)
![abc106_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/409721b3-bca8-66e9-07a6-328f3f1a62db.png)

訳が分からず、回答を確認

https://www.youtube.com/watch?v=OdJH-io-sVw

訳が分かっていなかったのは自分だった。
つまり問題を誤って認識していた。

1211 => 12211 => 122211 と考えていた。
それは違う
1211 => 12211 => 1222211 だ。
恥ずかしさがこみ上げる。結局、ちゃんと声に出して読んでないから失敗した。
次は自惚れず、基本に忠実に声に出して正しく考えよう。

```ToInfinity.py
S = list(input())
K = int(input())

for s in S:
    if int(s) == 1:
        K -= 1
        if K == 0:
            print(1)
            exit()
    else:
        print(s)
        exit()
```

***
時間を空けて再チャレンジ。

S の中で not "1" の index を見つける。
K 文字目という要求が not "1" index より小さいか、大きいかで答えが決まる気がした。

```abc106c.py
S = input()
K = int(input())
ref = 0
for i in range(len(S)):
    if S[i] != "1":
        ref = i
        break

if K < ref+1:
    print("1")
else:
    print(S[ref])
```

無事 AC. no hint で解けて良かった。
ML-EM(Maximum Likelihood - Expectation Maximization)法 徹底解説

#ML-EM法 徹底解説
## ML-EM法とは
放射線分布推定で主流な手法で，最尤推定(Maximum Likelihood Estiamtion)をEMアルゴリズムによって行う枠組みのことです．

日本語で丁寧に解説された文献がなくて理解するまでに時間がかかったので書くことにしました．

## 問題設定


## 導出
#### 尤度関数
単位時間にガンマ線を検出した個数がポアソン分布に従うと仮定します．
投影平面上のピクセル$j$の平均強度が$\lambda_j$であると推定しているため，
この状態におけるガンマ線を検出する個数の期待値は，
$\displaystyle \mu=\displaystyle\sum_j t_{ij}\lambda_j$
と表せます．

イベント$i$におけるカウント数が$y_i$だったとすると，その確率$p_i$は，
$\displaystyle p_i(y_i|\mu_i)=Poisson(y_i|\mu_i)=\frac{\mu_i^{y_i}e^{-u_i}}{y_i!}$
となります．
配列　.mapと.filter　復習

#今回の内容

* 配列操作で使う`.map`と`.filter`について復習

#コードと簡単解説

##.map

* 配列内の値、全てに同じ処理をして、配列を作成します。

* 今回の場合、全ての値を`-10`しています。

```Swift:
   let intArray = [123,10,30,77,55]

   override func viewDidLoad() {
        super.viewDidLoad()
        
        let mapResultArray = intArray.map({$0 - 10})
        print(mapResultArray)  
   }

```

```Swift:print結果
   [113, 0, 20, 67, 45]
```

##.filter

* `.filter({$0 > 60})`の`({})`内を満たす値だけを取得して配列を作成します。

* 今回の場合は、`60より大きい`値だけの配列を作成しました。

```Swift:
   let intArray = [123,10,30,77,55]

    override func viewDidLoad() {
        super.viewDidLoad()
       
        let filterResultArray = intArray.filter({$0 > 60})
        print(filterResultArray)
    }
```

```Swift:print結果
   [123, 77]
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
【Firestore】データの登録、取得ができないエラーについて

# エラー内容
```
Error: {"code":"permission-denied","name":"FirebaseError"}
```
Firestoreにデータを登録、またそのデータを取得しようとしましたが、上記エラーが出てきました。

# 関連するロジック

https://www.wakuwakubank.com/posts/723-firebase-firestore-query/

上記記事を参考に、以下ロジックを導入。

```sample.tsx
// 一部省略してます

import { db } from "../../firebase";
import firebase from "firebase/compat/app";

(async () => {
  try {
    const userRef = await db.collection('users').add({
      name: {
        first: 'tarou',
        last: 'yamada',
      },
      score: 80,
      birthday: firebase.firestore.Timestamp.fromDate(new Date(1980, 10, 15)),
      createdAt: firebase.firestore.FieldValue.serverTimestamp(),
      updatedAt: firebase.firestore.FieldValue.serverTimestamp(),
    })
    const userDoc = await userRef.get()
    console.log(userDoc.data())
  } catch (err) {
    console.log(`Error: ${JSON.stringify(err)}`)
  }
})()
```

# エラー解決手順
まず冒頭で示したエラーの文章そのままで、Google検索してみました。

```
Error: {"code":"permission-denied","name":"FirebaseError"}
```

https://blog.katsubemakito.net/firebase/firestore_realtime_2

そこで出てきたこちら↑↑の記事内に、関連してそうな箇所を見つけました。

>Firestoreにセキュリティルールを設定する

という項目を見つけ、その中の

```
service cloud.firestore {
  match /databases/{database}/documents {
    match /chatroom/room2/messages/{document} {
      allow read:  if true;
      allow write: if request.auth.uid != null;
    }
  }
}
```
この箇所を参考にして、

```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read:  if true;
      allow write: if request.auth.uid != null;
    }
  }
}
```
このように書き換えてみました。

# 結果
その結果、エラーは無事解消され、firestoreにデータが保存されました。

# まとめ
現在webアプリを制作中ですが、firebaseの機能を使って、誰かの役に立つようなアプリを作れるように頑張ります。
pythonでcsvを読み込んで辞書型変数に格納

#はじめに
pythonでcsvを読み込み、辞書型の変数に格納するコードです。

######環境
python3.9.6

#CSVの読み込み

######CSVファイル(test.csv)

```
1,2,3,4
apple,orange,banana,grape
りんご,おれんじ,ばなな,ぐれーぷ
```

######CSV読み込んで辞書型変数に格納するpythonコード

```python

import csv

#CSVファイルを開く
with open("./test.csv", "r", encoding="utf-8") as csvfile:
    #CSVファイルを辞書型で読み込む
    f = csv.DictReader(csvfile, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
    #辞書型で出力
    for row in f:
        print(row)
```

######出力結果

```
{'1': 'apple', '2': 'orange', '3': 'banana', '4': 'grape'}
{'1': 'りんご', '2': 'おれんじ', '3': 'ばなな', '4': 'ぐれーぷ'}
```
公式のUnity2D入門をv2020.3でやってみる(4)



[前](https://qiita.com/DiveMasakazu/items/25f89a903a7853082501)



## ワールドとのインタラクション　投射物の作成

* 弾の設定
* 物理演算の設定方法
* 弾の発射方法

`rigidbody2d.AddForce(direction * force);`
のような感じで物体に外力を加える。

`public 変数を作成し、projectilePrefab を呼び出します。プレハブはアセットとして保存された GameObject なので、GameObject 型にする必要があります`
は今までのチュートリアルの何処かにあったかな・・・と思って見返してもpublicでGameObjectは定義していなさそう。
`public GameObject projectilePrefab;`

弾の発射は
`GameObject projectileObject = Instantiate(projectilePrefab, rigidbody2d.position + Vector2.up * 0.5f, Quaternion.identity);`
とあるけど、2番目の引数のVerctor2.up*0.5fが最初分からなかったけど
[ここ](https://docs.unity3d.com/ScriptReference/Vector2-up.html)を見ると
`Vector2(0, 1)`
と同値

ボタンが
`Input.GetKeyDown(KeyCode.C)`
とCだけど、コントローラとかを考えると移動みたいに何かあるはず。
ということで検索すると
`Input.GetButtonDown("Fire1")`
でとりあえず取得できる（古いやり方？新しいInput対応版はとりあえず見ていない）
と思ったらすぐ後ろに書いてあった。。。

`オブジェクトの作成時に Unity が Start を実行せず、次のフレームで実行する`
`Start とは逆に、Awake はオブジェクトが作成されたとき（Instantiate が呼ばれたとき）にすぐに呼ばれる`
ややこしや

* レイヤーの考え方
* 判定の消し方
* 遠く離れた物体の削除

レイヤーの衝突設定は
Edit > Project Settings > Physics 2D
衝突後に物理演算やめるには
rigidbody2D.simulated
何度か出てきてるけど、当たったものが何かの判定はこのeがnullかで行えば良い、みたい。
(Class.Typeみたいなので判定しなくてもよい)

```
EnemyController e = other.collider.GetComponent<EnemyController>();
if (e != null)
```

## カメラ

* Cinemachine パッケージの導入
* カメラの設置とキャラクターの追随
* カメラの移動制限

パッケージインストールでいきなりエラーが出た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2081290/bba25ad1-6511-a826-fa67-1d807d49ab8f.png)

Unityの再起動で解決。
次に「メニューバーの上部にある Cinemachine > Create 2D Camera 」
がどこにあるのか一瞬分からなかったけど、普通にファイルとか編集の所に追加されていた。
なお平行投影サイズ（Orthographic Size）は最初から５だった

Polygon Collider 2Dで
`削除キーを押しながらドラッグすることで、ポイント（五角形の一番上のポイントのようなもの）を削除することができます`
のやり方がよく分からないが、どうやらCtrlキーを押しながら「辺」をクリックすると消える模様。
`最後のポイント設定で値を丸めて、ボーダーが直線になるようにします`
は結局やり方がわからず放置。

## ビジュアルスタイリング　パーティクル

* 演出のスプライト作成
* パーティクルシステムの作成

パーティクルの設定は多すぎて覚えられないので、とりあえず覚えない。

* パーティクルを利用するためのコード

publicにインスペクタ上で割り当てたオブジェクトはプロジェクトからも割り当てられるけど、
「自分の子要素」にあるオブジェクトを割り当てないと（同じ名前でも）ダメっぽい。（それはそう）


## ビジュアルスタイリング　ユーザインターフェース（ヘッドアップディスプレイ）

  * Canvas作成
  * 画像の配置

日本語に変換している場合はキャンバスグループを作成だと思われる。
サイズは固定かスケールかで選択できて、Scale With Screen Sizeを使いたいけど
とりあえずチュートリアル通り固定で進める。

画像のサイズ、アンカーの扱い等はチュートリアルだけだといまいち分かり辛い。
やってる中で分からなかったのはピポットの動かし方。
そのままドラッグしても画像が動く。アンカー設定でShift押しながらやっても青丸は動かない。
最終的に下までやって動作させてみたらおそらく想定通りに動いているので、表示上だけの問題か。


* コード中でのUnityEngine.UI.Imageのusing
* static化してアクセス

`public static UIHealthBar instance { get; private set; }`
でstaticなオブジェクトへのアクセスを作成は少し前のプロパティとかいうものと同じ書き方。


眠くなってきてしまったので最後らへんのソースをあまりじっくり見ること出来てないので続きはまた次回
⇒2021/10/2 更新

よく見ると`mask.rectTransform.rect.width`のrectTransformは初出ぽい。
transform.positionはあった(あとrigidbody2d.position）
rectTransformはUI要素限定で、ピクセル単位での操作用なのかと思ったが
[ドキュメント](https://docs.unity3d.com/ja/current/ScriptReference/RectTransform.html)を見ると
`RectTransform は GUI のために使用されるだけでなく、他のことにも使われます`
と書いてあるので、試しに普通の2Dオブジェクトの正方形を置いてから矩形トランスフォームのコンポーネントを設置できたので、使おうと思えば使えるという事だと理解。
問題はSetSizeWithCurrentAnchorsのようなメソッドの書き方で
[ドキュメント](https://docs.unity3d.com/ja/current/ScriptReference/RectTransform.SetSizeWithCurrentAnchors.html)を見てもaxisには「サイズを指定する軸」としか書いてないためRectTransform.Axis.Horizontalを指定すればいいという事まではチュートリアルだけでは理解が難しそう。
10年後のために今勉強しておきたい技術

# 10年後のために今勉強しておきたい技術

今後の標準を検討してみた。

## Rust

バッチ処理など高速化が求められるプログラムの標準に。

## ServerLess

EC2等で動いてるほとんどのプログラムはServerLessのコンテナに置き換えられる。

## Flutter

アプリ開発の標準に。

## Server Side Typescript 

RubyやPHP等のBE言語もTSに。

## MonoRepo

マイクロサービスはMonoRepoで集約が標準に。

## GitOps

すでに標準かも。
HTML タグの種類について　パート4

<h2>SPANタグについて</h2>
DIVタグと同じひとつの範囲として定義する為のものでインライン要素になっています。
<h2>入力フォーム用タグの使い方</h2>

入力や送信フォームを作成するのに絶対必要なタグはFORMタグです。
画面上には空白のフォームが出来上がっています。

その次に使うタグはINPUTタグです入力欄やボタンが作成できますが、必ずtype属性で設定してください。
type属性設定一覧
フォームボタンまたはリセットボタンを作成　type="submit"
凡用ボタンを作成　type="button"
１行のテキストボックスを作成　type="text"
パスワード入力欄を作成　type="password"
ラジオボタンの作成　type="radio"

セレクトボタンを作成するタグはSELECTタグを使います。
また、複数行のテキスト欄を出す場合はTEXTAREAタグを使います。

部品とラベルを関連付けるのに必要なのはLABELタグです。

例）

`````
<!----フォームを作成しています。--->
<form>
<!-----ラジオボタンの作成----->
<input type="radio" name="部品名"　value="" check="">
<texrarea name="text1" rows="" cols="">  
</form>

```
こんな感じにプログラムになります。
10年前の自分に伝えたい、勉強しておきたかった技術

#  10年前の自分に伝えたい、勉強しておきたかった技術

## typescript

coffeescriptはやめてtypescriptを使え！

## PHP

Laravel一択！

## コンテナ関連

フルコミットでOK

## output

ローカルPCに山のようにある勉強メモやプログラムをwebに上げろ!
【AWS CloudFormation】CAPABILITY_IAM と CAPABILITY_NAMED_IAM どう使い分けたら良いのか

# 概要
AWS CLI を用いて、CloudFormation のスタックを作成する時に、
Capabilities を要求される場面があるかと思います。

その時に、`CAPABILITY_IAM` と `CAPABILITY_NAMED_IAM` どっちでも通るけどどっち使えばいいんだ？ってなることがあったので、公式リファレンスの自分の理解をこの場にまとめます。

# そもそもどういう場合にCapabilitiesが必要になるのか
作成する CloudFormation のスタックの中のリソースに IAM リソースがある場合です。

>AWS CloudFormationがスタックを作成するために、スタックテンプレートに特定の機能が含まれていることを明示的に確認する必要があります。
参考: https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html

AWS のドキュメントにもある通り、CloudFormation がスタックを作成するために、特定の機能が含まれていることを明示的に示す必要があるということです。

# では、2つの違いは
それでは `CAPABILITY_IAM` と `CAPABILITY_NAMED_IAM` は何が違うのでしょうか。
それはカスタム名の IAM リソースがある場合とそうでない場合です。
IAM リソース名は指定しない場合、`<CloudFormationスタック名>-<CloudFormationリソース名>-<ランダム文字列>`で作成されますが、これを任意の名称に指定することもできます。

名称を指定した（=カスタム名）IAM リソースがある場合は `CAPABILITY_NAMED_IAM` のみ。名称を指定しない場合は、[どちらでも指定することが出来る](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)様です。

# まだ2つほどCapabilitiesはある
上で紹介した 2 つ以外にも、`CAPABILITY_RESOURCE_POLICY` および `CAPABILITY_AUTO_EXPAND` なるものが存在する様です。（参考: https://docs.aws.amazon.com/ja_jp/serverlessrepo/latest/devguide/acknowledging-application-capabilities.html ） 

`CAPABILITY_RESOURCE_POLICY` に関しては以下のものがリソースとして存在する場合に必要な様です。
>AWS::Lambda::LayerVersionPermission,AWS::Lambda::Permission,AWS::Events::EventBusPolicy,AWS። IAM: ポリシー,AWS::ApplicationAutoScaling::ScalingPolicy,AWS::S3::BucketPolicy,AWS::SQS::QueuePolicy, およびAWS::SNS::TopicPolicy。
参考: https://docs.aws.amazon.com/ja_jp/serverlessrepo/latest/devguide/acknowledging-application-capabilities.html

`CAPABILITY_AUTO_EXPAND` に関しては 1 つまたは複数のネストされたアプリケーションが含まれているアプリケーションで指定する必要がある。とあり、具体的には[こちら](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)でサンプルとして用意されているものと同様のリソースが当てはまるようです。
タイトルとは少し逸れてしまうので、詳しくは公式ドキュメントを参考にしてみて下さい。


# まとめ
CloudFormation で作成されるスタックのリソースの中にカスタム名の IAM リソースがあれば `CAPABILITY_NAMED_IAM`。
IAM リソースの名称を指定していない場合は、`CAPABILTY_IAM` `CAPABILITY_NAMED_IAM` どちらも使える様です。（とはいえ、不必要に NAMED の方を使う理由も無さそうですが）
【Vue.js+Rails】herokuデプロイ時の「 Cannot find module '@vue/babel-plugin-jsx'」の対処

RailsにVue.js3を導入してjsxファイルを書いてherokuにデプロイしようとしたところ掲題のエラーが発生し対処に時間がかかったため、その備忘録です。
（railsとvue.jsを使ってPFを制作中の初学者ですので内容に不備があればコメントで指摘頂けると幸いです。）

#エラー発生の経緯
Vue.jsでjsxを使用するため公式ドキュメントにならって下記コマンドを入力。
https://github.com/vuejs/jsx-next

```
npm install @vue/babel-plugin-jsx -D
```
ローカル環境では問題なくjsxファイルが読み込まれたのでherokuにデプロイしようとした所

```
 ERROR in ./app/javascript/packs/application.js
       Module build failed (from ./node_modules/babel-loader/lib/index.js):
       Error: Cannot find module '@vue/babel-plugin-jsx'
```

というエラーが発生。エラー表示をコピペしてググっても解決法が分からずに途方に暮れていました。

#原因特定の過程

ローカル環境ではjsxファイルが表示されていたということは開発環境ではbabel pluginは読み込まれていたことになる。
↓
本番環境だけ読み込まれない設定になっている？
↓
npmでインストールした中身はpackage.jsonに表示されることを知る。
↓
package.jsonファイルを確認。

```package.json
 "dependencies": {
    .
    .
    .
    .
    "@vue/compiler-sfc": "^3.2.19",
    "turbolinks": "^5.2.0",
    "vue": "^3.2.19",
    "vue-loader": "^16.8.1"
  },
  
  "devDependencies": {
    .
    .
    .
    .
    "@vue/babel-plugin-jsx": "^1.1.0",
  },
```
ざっくり上記のような内容。

↓
"devDependencies"は開発環境のみで必要なプラグインが保存されているので本番環境で読み込むためには"dependencies"の中にインストールする必要がありそう。
↓
一度アンインストール

```
npm uninstall @vue/babel-plugin-jsx 
```

↓

再度"--save"を付けてdependencies内に読み込まれるようにコマンド実施。

```
npm install --save @vue/babel-plugin-jsx 
```
↓
dependenciesに追加され、devDependenciesからは削除されていることを確認。

```package.json
 "dependencies": {
    .
    .
    .
    .
    "@vue/compiler-sfc": "^3.2.19",
    "turbolinks": "^5.2.0",
    "vue": "^3.2.19",
    "vue-loader": "^16.8.1",
    "@vue/babel-plugin-jsx": "^1.1.0" 
  },
  
  "devDependencies": {
    .
    .
    .
    .
  　　　,
  },
```
#結果

herokuにデプロイできた。
AtCoderログ：0129 - ABC 220 C

# 問題

https://atcoder.jp/contests/abc220/tasks/abc220_c

# 回答
## 回答1 (AC)
数列 $B$ は数列 $A$ を $10^{100}$ 回繰り返されているので、無限にあると思って問題ないでしょう。数列 $A$ の要素の和が sum であるとき、$X$ を sum で割った商を q、余りを r とすると、和が $X$ を越えるのは数列 $A$ を q 回繰り返した後であることがわかります。後は数列 $A$ の初項からの和を求め、r を越える所を探すことになります。コードは以下のようになりました。

```C++:abc220c-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int64_t n;
  cin >> n;

  int64_t sum = 0;
  vector<int> a(n);
  for ( int i=0; i<n; i++ ) {
    cin >> a.at(i);
    sum += a.at(i);
  }

  int64_t x;
  cin >> x;

  int64_t q = x/sum;
  x -= sum*q;

  int i = 0;
  while ( x>=0 ) {
    x -= a.at(i);
    i += 1;
  } 
  
  cout << n*q+i << endl;
}

```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc220/tasks/abc220_c/editorial) → [公式解説](https://atcoder.jp/contests/abc220/editorial/2683)
回答1と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0128 - ABC B](https://qiita.com/RoadLynton/items/b53da052ed19b4a3d1bb)
Electron - Hello World


Electronでアプリを作ってみます。

※ 検証環境
Windows 10 Home, Node:v14.17.4, Electron:v15.0.0

# プロジェクトの作成

まずNode.jsのプロジェクトを作ります。
entry pointは Electronアプリの慣例にならって main.js とします。

```
> npm init
...
package name: (...) プロジェクト名
version: (1.0.0)
description:
entry point: (index.js) main.js
test command:
git repository:
keywords:
author:
license: (ISC)
...
```

Electronをローカルインストールします。

```
npm i -D electron
```

# アプリの実装

アプリのメインプロセスになる main.js を作成します。

```js:main.js
const { app, BrowserWindow } = require('electron')

function createWindow () {
  // ウインドウ作成
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
  })

  // index.htmlの内容でウィンドウ表示
  mainWindow.loadFile('index.html')
}

// Electronの初期化完了時に呼ばれる
app.whenReady().then(() => {
  createWindow()

  // Mac用処理
  app.on('activate', function () {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// (Mac以外は)ウインドウが全部閉じられたら終了
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})
```

ウィンドウの描画内容となるindex.htmlを次の内容で作成します。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>
```

# アプリの実行

コマンドラインで以下のように実行します。

```
node_modules\.bin\electron .
```

Hello World!とウィンドウに表示されれば成功です。

## npm startで実行できるようにする

毎回electronのパスを打つのは面倒なので、`npm start` で起動できるようにしましょう。

package.json 内のscriptsにstartの定義を追加します。

```json:package.json
  "scripts": {
   "start": "electron .",
   "test": "echo \"Error: no test specified\" && exit 1"
  }
```

すると、次からはコマンドラインで以下の通り実行すれば起動できるようになります。

```
npm start
```

# 参考

Electron Quick Start
https://www.electronjs.org/docs/tutorial/quick-start
ツイートを見れないツイッターをつくったー

# 課題
これまで何時間Twitterを見たか？
これから何時間Twitterを見るのか？

人生は、それほど長くない。
Twitterで得られる情報が役立つこともあるが、殆どの時間は、tittytainmentをしゃぶっているか、無駄に感情を揺り動かされて、時間を無下にしているだけである。収支バランスを考えると、圧倒的に赤字だ。

人は、Twitterを見て時間を溶かすのではなく、
もっと生産的な活動を通して、人生を豊かに過ごした方が幸福だろう。
アンチコメントで自死など、もってのほかだ。

スマホのTwitterのUXが問題だと思う。無限に情報が流れてきて、無限に時間を溶かしてしまう。それが彼らのビジネスなので当然だが、SNSは生産者として有効活用してこそ価値あるものの、tittytainmentをしゃぶっているだけでは、ただ闇雲に人生を消費するだけである。

思い切って、スマホからTwitterを削除して、生活すればよいのだが、
仕事上ツイートせざるを得ないケースも多いだろう。

そこで今回は、スマホ上でツイートを見れないTwitterインターフェースの開発に取り掛かった。

# Vision
LINEからツイートを送信する。ツイートした結果をbotが返してくれる。
<iframe width="560" height="315" src="https://www.youtube.com/embed/sI7cZj2Luwg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

どうしても他の人のツイートが見たければ、PCから見る。
インプレッションの確認も、病的に毎分チェックするより、後でPCで見れば十分だろう。

# 設計
最初はラズパイでサーバーを立てようと思ったが、誰もがラズパイを持っているわけではないし、高価なので無料のWebサービスを組み合わせて設計した。

![sequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101736/32a2f2cc-09a4-32bd-c44f-f05ead6115ab.png)

LINEはLINE Messaging APIというAPIを用意している。LINEの受信をWebhookとして、外部サービスにHTTPで通知できる。ツイート用のアカウントを作成して、Webhookにより、Google Apps Scriptに通知する。

Google Apps Scriptは、Webサービスとして無料でデプロイできて、Webhookを受信して、任意の処理ができる。
Google Apps Scriptで、Web hookを受信したら、Twitter APIを使用して、受信したメッセージをそのままTwitterに投稿するようにする。投稿した結果は、LINE Messaging APIで返信する。

# 参考文献
HTTPってなんやねん！API全然わからん！って方は、
・[Webを支える技術: 山本陽平　著](https://gihyo.jp/book/2010/978-4-7741-4204-3)

LINE Messsaging APIをGoogle Apps Scriptで使用する方法は、
・[Google Apps Script で LINE Bot を作成する](https://www.ois-yokohama.co.jp/oisblog2018/archives/6935)

Google Apps Scriptで、Twitter APIを叩く方法は、
・[GASでTwitterAPIを叩いてみる](https://tech-cci.io/archives/4228)

あとは、公式ドキュメント等を読んで頑張ってください。
Power Automate: SharePoint の チェックインコメントを取得する

# 概要

SharePoint でのバージョン機能を利用した際に
チェックインの自動通知時に、チェックインコメントを一緒に通知させる

Automate の Action でコメントが取得出来なかったので、SharePoint Rest API でのコメントを取得する方法を記録

# フロー概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5cf6a4f6-3881-20e4-ff29-f2f35a0e2f80.png)

ポイントだけ JSON とか記述して説明

## バージョン履歴取得

```url:バージョン履歴取得例
_api/web/lists/getbytitle('Documents')/items(@{items('Apply_to_each_6')?['ID']})/versions
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8719c767-0e85-5b84-de14-ae236157220a.png)

https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest#working-with-list-items-by-using-rest

## バージョン履歴のJSON解析

```json:必要なとこだけに削除
{
    "type": "object",
    "properties": {
        "d": {
            "type": "object",
            "properties": {
                "results": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "FileVersion": {
                                "type": "object",
                                "properties": {
                                    "__deferred": {
                                        "type": "object",
                                        "properties": {
                                            "uri": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            },
                            "VersionLabel": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "FileVersion",
                            "VersionLabel"
                        ]
                    }
                }
            }
        }
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/40cbd23f-3631-a70b-0cf0-97deb39cd54e.png)

## 変更検知したバージョンにフィルター

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/de76b8c3-0ed3-40e4-b3e3-ffaee228476e.png)

あとは、CheckInCommentを取得して、よしなに

# keywords

how to retreive "Check In Comment" in SharePoint by Power Automate 

# 補足

Apply to Each が二回存在しているが、特に意味は無い
単に動的コンテンツ取得した際に配列だった為に自動で挿入されるものというだけ
First() とかでフィルターしたほうがフローは簡単になるけど、面倒なので放置してるだけ。
PrePoMaxとCalculiXの構造と連携

Ihor Rokach氏が作成したPrePoMaxの資料[PrePoMaxとCalculiXの構造と連携（バージョン：2.0.0、作成：2021年6月25日）](http://www.tu.kielce.pl/~rokach/instr/PPM_struktura.htm)を機械翻訳にかけました。

# はじめに

![ppm_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/30bf74ec-7655-7fd1-8f71-37a3d1ea0721.png)

PrePoMaxとCalculiXの関係は、FemapとNastranの関係とまったく同じです。
PrePoMaxはプリ・ポストプロセッサーです。
つまり計算のためのモデルの準備と結果の表示を行います。
CalculiXはFEM解析のみを行います。

# PrePoMaxの入力データ

PrePoMaxは以下を読むことができます。

1. 独自のPMX形式のFEMモデルファイル。このファイルには、CADモデル、FEMモデル、そして（オプションで）計算結果が含まれています。
2. INP形式（Abaqus/CalculiXプログラム形式）のFEMモデルファイル。このファイルタイプにはCADモデルが含まれていないため、修正が非常に困難です。
3. BRep、IGES、STEP、STL形式のCADファイル。
4. NEU（ニュートラル形式、多くのFEMプログラムで使用される）、VOL（Netgenプログラム形式）、Mmg（Mmgプラットフォームプログラムライブラリ形式）の他のプログラムで作成された有限要素メッシュ
5. CalculiXの計算結果 - FRDの拡張子を持つファイルで、CalculiXが分析を終了した後に作成されます。

# PrePoMax出力データ

PrePoMaxの唯一の出力データは、INPの拡張子を持つ入力CalculiXファイルです。
これは大きなテキストファイルで、任意のテキストエディターやPrePoMaxの内部エディターで編集できます（多くの状況では、そうすべきです）。
このようにして、PrePoMaxではまだ実装されていないCalculiXのコマンドをこのファイルに追加できます。

# CalculiXの出力ファイル

実際、CalculiXは、他の多くのプログラムと連携しているため、多くの種類のファイルを作成できます。
しかし、PrePoMaxユーザーにとって重要なのは以下のとおりです。

1. FRD - メッシュ全体の計算結果のファイル。メッシュの節点にのみ結果が格納されるので、他のさまざまなポストプロセッサーでの表示が容易になります。
2. DAT - 選択された節点または要素のセットに対するオプションの結果を含むテキストファイル。
3. 診断ファイル - 診断情報を含む、拡張子がcvg、12d、outなどのテキストファイル。