OmniAICreator/Qiita-1.07M huggingface dataset:
TextMeshProでアルファベットの入力をしたときに上手くいかなかったこと

# TextMeshProでアルファベットの入力をしたときに上手くいかなかったこと(2021年11月9日現在)
#### TextMeshProで、アルファベットの大文字と小文字をいっしょに使用するときに、リッチテキストタグの
#### `<lowercase>`が機能しませんでした。

#### 目標がアルファベットの大文字と小文字をいっしょに使用することなので、そこに至るまでの検証をします。

---

## 検証 : TextMeshProでアルファベットの大文字と小文字をいっしょに使用する
### 1.リッチテキストタグの`<lowercase>`が機能しないことの確認
①TextMeshProのテキストに、確認するための文字を入力

```
// TextMeshProに、以下のテキストを入力
ab<uppercase>ABC</uppercase>
AB<lowercase>abc</lowercase>
```

②結果の確認(TextMeshProのFontStyleはABの大文字指定)↓
![スクリーンショット 2021-11-09 7.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/4014f3a9-0042-08c7-1859-c29017eca508.png)

上の画像で、`<lowercase>`が大文字を小文字に変換していないことを確認(2行目)

### 2.リッチテキストタグの`<uppercase>`が機能することの確認
TextMeshProのFontStyleをabの小文字指定にして、`<uppercase>`が機能するかどうかも確認↓
![スクリーンショット 2021-11-09 7.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794916/1d0a6e9d-e766-245d-8801-a6a38f420f75.png)

上の画像で、`<uppercase>`が小文字を大文字に変換していることを確認(1行目)

---

## 結論 : TextMeshProでアルファベットの大文字と小文字をいっしょに使用するために
#### TextMeshProのFontStyleをabの小文字指定にして、大文字部分だけリッチテキストタグの
#### `<uppercase>`を使用すると実現できるようでした。

---
Docker Desktop for WindowsをWSL2で使いWordPressのローカル環境を構築する

#目的
docker+WSL2を使ってwordpressのローカル環境を構築する。

#動作環境
* windows10 home
* Docker Engine v20.10.8
* WSL2
* Ubuntu 20.04

#1.はじめに
WSL2でDocker Desktopを使えるように構築する。
※筆者はWSL2の環境はすでに構築していたので、WSL2の環境構築は別の記事を参照してください。


##1.1WSL2でdockerを使えるようにする。
DockerDesktop for windows をインストールする。
 
https://hub.docker.com/editions/community/docker-ce-desktop-windows/

Docker Desktopの設定（歯車マーク）→`「Use the WSL 2 based engine (Windows Home can only run the WSL 2 backend)」`という項目がグレーアウトし、チェックが付けられていることを確認する。
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782276/8e352023-59d4-4aeb-a6a7-3f196026ffd9.png)
`Resources`　→　`WSL INTEGRATION` → `Ubuntu -20.04`にチェックする。
![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782276/4b53225a-d26c-56a0-523a-47763a847a92.png)
これでWSL2でDockerを使う準備は出来ました。

## 1.2.動作確認
WSL2のLInuxコンソールを表示し、Dockerが使えるか確認する。

コンソールでdockerのバージョンを確認するコマンドを入力して

```
$ docker --version
```

下記のように表示されれば成功です。

```
Docker version 20.10.8, build 3967b7d
```

#2.Wordpressの開発環境を構築する。
##2.1イメージを取得する。
DockerHubから使いたいイメージを取得するには`pull`コマンドを使用する。

```
$ docker pull mysql:5.7.25
$ docker pull wordpress:latest
```

イメージがローカル環境にあるか確認するには下記のコマンドを使用する。

```
$ docker images
```

コマンドを使用すると以下のように表示されますのでこれで確認することができる。

```
mysql                    5.7.25    98455b9624a9   2 years ago    372MB
wordpress                latest     28084cde273b   3 years ago    408MB
```



##2.2コンテナを作成する
イメージからコンテナを生成して起動するには`run`コマンドを使用する。

```
$ docker run --name mysql5.7.25 -e MYSQL_ROOT_PASSWORD=password -d -p 3307:3306 mysql:5.7.25

$ docker run --name wordpress4.9.1 -v /mnt/c/Users/tattu/dev/docker/html:/var/www/html --link mysql5.7.25:mysql -d -p 80:80 -p 443:443 wordpress:4.9.1
```
`-v /mnt/c/Users/tattu/dev/docker/html:/var/www/html`でホスト側のディレクトリとDockerコンテナ内のディレクトリを共有し、WordPressのテンプレートファイルをホスト側のエディタから編集可能にします。

（MySQLの方で同じ方法で共有をかけるとエラーになってしまい出来ませんでした。エラー解決できるまではこの方法でやります。）

コンテナの一覧を表示するには下記のコマンドを使用する。

```
$ docker ps -a
```
一覧のコンテナが以下のように表記される。



```
f602f612e2d7   wordpress  "docker-entrypoint.s…"   6 minutes ago   Up 6 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   wordpress
6c7f36c22e4e   mysql:5.7.25      "docker-entrypoint.s…"   6 minutes ago   Up 6 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp          mysql5.7.25
```

##2.3動作確認
chromeのURL欄に[http://localhost](http://localhost)と入力してwordpressが開かれれば大丈夫です。

#3.まとめ
初めてWSL2とdockerを使い、wordpressをローカル環境で使用することができました。
詳しいことは書かずに手順だけを書きましたが意味は別の記事で書いていこうと思います。
初めてlinuxを触ってみて最初は慣れないと感じましたが触ってるうちに慣れていくのだろうと思いました。
（コマンド自体にまだ慣れていない）
何もいじってないコンテナなどはどんどん壊して言っても大丈夫って助言をもらったのでいろいろ試していこうと思う。
Tableau 書式設定を理解する 前編

## 前置き
　Tableauを使っていて毎回書式設定でどこをどう変えれば良いかよく分からず、とりあえずいじりまくって何とかしていますが、いい加減非効率なので一回書式設定をきちんと理解しておこうと思いまとめてみました。（11/20追記：後編、番外編も併せてごらんください）

https://qiita.com/zaki_001/items/10ce5c9155887a711f34

https://qiita.com/zaki_001/items/319efb40377dcdd11823

## 1.用語の整理

書式設定に入る前に、用語について整理しておきます。
ヘッダー・ペイン・セル・コーナーなど、正確に理解できていますか？
意外とあやふやだったりしないでしょうか？（私はあやふやでした）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/da889631-7708-1576-05b0-0b6336708c41.png)
　上の図で、青枠で囲った部分全体が`ワークシート`、緑色部分が`タイトルと見出し`、青色部分が`ヘッダー`、黄色部分が"ペイン"です。ヘッダー部分はさらに、`行ヘッダー`（下図緑色部分）、`列ヘッダー`（青色部分）、`コーナー`（黄色色部分）、`フィールドラベル`（ピンク色部分）に細分化できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/c73f4310-d09f-cde7-4c55-878d746c8b1d.png)
　ちなみに`行フィールドラベル`もありますが、上の図ではコーナーと一体化しています。行ヘッダーラベルを回転させると下図のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/71399e18-6ae6-a88e-4d44-099ca3313524.png)

## 2.網掛け
　ここから本題、書式設定について整理していきます。まずは網掛け。書式設定→網掛けを選択するとサイドバーに設定画面が表示されます。モリモリに設定してみたのが下図。
　`既定`のペインとヘッダーに色を設定することで、先ほど図示したヘッダー部とペイン部が塗りつぶされています。しかし、行ヘッダーの関東地方/四国/中部地方は`規定`のヘッダーで指定した色とは違っており、その行ペインも`既定`のペインで指定した色とは違います。これは`縞模様（行）`のペインとヘッダーに規定とは違う色を指定しているためです。同様に`縞模様（列）`のペインとヘッダーにも`規定`と違う色を設定しているため別の色になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/02fc323f-c2fd-e557-e4be-d2b978cc4318.png)
　次に`縞模様`の設定にあるバンドサイズとレベルについて見ていきます。レベルを変えてみたのが下図です。レベルが左端の時は`地域`を基準に縞模様になっていますが、レベルが右端の時は`顧客区分`を基準とした縞模様になっています。つまり、**レベルを変えることで縞模様の基準となるディメンションを変えることができます**。今回の例では行ディメンションが2つだけなのでレベルは2段階ですが、ディメンションが増えればその分レベルの段階も増えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/4fdf9583-da75-4713-8aac-236acfa943e5.png)
　今度はバンドサイズを変えてみます。下図の通り、バンドサイズが1の時は1行おきに色が変わる縞模様になっています。それに対しバンドサイズが2の時は2行沖に色が変わるようになっています。つまりバンドサイズは**何行(列)おきに色が変わるか**を変えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/e0474cfa-9fa8-4455-ae0e-987ea763cf52.png)


##3.枠線
　次は枠線です。書式設定→枠線を選択するとサイドバーに設定画面が表示されます。わかりやすく`規定`のセルを黒、ペインを水色、ヘッダーをオレンジ色の太線に設定したものが下図です。（ちなみに'規定'を設定すると合計と総計にも自動的に同じ設定値が入ります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/2d41bf4e-d20d-856b-ce13-bc099b0acc0b.png)
　見てみると、セルとヘッダーはきちんと設定が反映されていますが、ペインの設定値が反映されていません。また、ヘッダーも地方の境界はオレンジ色になっていません。これは、**`行(列)の境界線`がデフォルトでグレーの薄い線に設定されており、`規定`よりこちらの設定が優先されるため**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/0db89bd1-6120-fb20-9222-9f220b11afdc.png)
　試しに`行(列)の境界線`の設定をなしに変更すると下図のように`規定`のペインの設定がきちんと反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/6253b69b-ca22-0c9d-f3e8-02b037567d3f.png)
　また、`行(列)の境界線`にもレベル設定があり、網掛けの時と同様に**レベルを変えることで縞模様の基準となるディメンションを変えることができます**。レベルを最大にした場合、`規定`のセルの設定は上書きされます。（黒線が緑線で上書きされている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307669/5e724452-06b0-9390-6d30-32f01d3cce44.png)

### 長くなったので続きは[後編](https://qiita.com/zaki_001/items/10ce5c9155887a711f34)で
後編投稿しました。[こちら](https://qiita.com/zaki_001/items/10ce5c9155887a711f34)


## 　

https://qiita.com/zaki_001/items/f2e7087dc3b0fa2efae8
順列PをSwiftで書いただけの記事

AからEの5人を一列に並べるときの並べ方を全部あげなさい的な問題である。
ちょっと苦労したのでついでにここに上げる。

```
func factorial(of source: Int) -> Int {
	var result = 1
	for i in 1...source {
		result *= i
	}
	return result
}

func permutations<T>(of values: [T]) -> [[T]] {
	guard values.isEmpty == false else {
		return [[]]
	}
	var result = [[T]](repeating: [], count: factorial(of:values.count))
	result[0] = values
	var dataEnd = 0
	let last = values.count - 1
	
	func inPermutations(ref: Int, target: Int) {
		if target != last {
			inPermutations(ref: ref, target: target + 1)
			for i in target + 1...last {
				dataEnd += 1
				result[dataEnd] = result[ref]
				result[dataEnd].insert(result[dataEnd][i], at: target)
				result[dataEnd].remove(at: i + 1)
				inPermutations(ref: dataEnd, target: target + 1)
			}
		}
	}
	
	inPermutations(ref: dataEnd, target: 0)
	
	return result
}

print("start")
print(permutations(of: [1, 2, 3, 4, 5, 6]))
print("end")
```

# 感想
変更しないで下に投げるものと、変更した上でカウンターを加算して下に投げるものを区別して書く、というところへ辿り着くのに時間がかかってしまった。

変更はインサート&リムーブをしているが、結果のキレイさにこだわらなければ交換もありかと思います。

インサート&リムーブで5を前に
[1, 2, 3, 4, 5]
[5, 1, 2, 3, 4]

交換で5を前に
[1, 2, 3, 4, 5]
[5, 2, 3, 4, 1]
build.gradle.ktsでMavenリポジトリにpublish

===
日記

環境
---
- Gradle 7.1
- Kotnin 1.6
- Nexus Repository Manager 3.36.0


[サンプル](https://github.com/kyoya-p/samples/blob/master/2021/SNMP4J/Snmp4jUtils_KtJvm/build.gradle.kts)

build.gradle.kts に [Maven Plugin](https://docs.gradle.org/current/userguide/publishing_maven.html)を追加
---
https://docs.gradle.org/current/userguide/publishing_maven.html

さらに、publish対象モジュールの名前とバージョンなどを定義

```build.gradle.kts
plugins {
    kotlin("jvm") version "1.5.31"
    `maven-publish`
}

//...

publishing {
    val myGroupId = "jp.live-on.shokkaa"
    val myArtifactId = "snmp4jutils"
    val myVersion = "1.1"

    publications {
        create<MavenPublication>("maven") {
            groupId = myGroupId
            artifactId = myArtifactId
            version = myVersion
            from(components["kotlin"])
        }
    }
}

```

ローカルリポジトリへのpublish
---
個人で使うならこれで十分

```
gradlew publishToMavenLocal
```
`$HOME/.m2/repository` 以下に成果物ファイルがコピーされる。


指定したローカルリポジトリへのpublish
---
デフォルトのリポジトリ(`Maven`)と区別するため、リポジトリ名(例えば name="ProjectLocal"`)を指定

```
publishing {
//...
    repositories {
        maven {
            name = "ProjectLocal"
            url = uri(layout.buildDirectory.dir("repos"))
        }
    }
}
```

```
gradlew publishMavenPublicationToProjectLocalRepository
```

プロジェクト中のディレクトリ `build/repos/` 以下にリポジトリが生成される。


リモートリポジトリへのpublish
---

```
gradlew publish
```

例は[自前のNexus repository Manager](https://qiita.com/shokkaa/private/dd842d210d2f1fda7b1d)のデフォルトレポジトリ(maven-releases)にpublishしている。

```build.gradle.kts
plugins {
    java
    `maven-publish`
}

group = "jp.wjp.shokkaa"
version = "1.0"

publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
        }
        repositories {
            maven {
                url = uri("http://192.168.3.115:8081/repository/maven-releases")
                isAllowInsecureProtocol = true // 非セキュアの場合
                credentials {
                    username = System.getenv("MAVEN_USER")  // example: MAVEN_USER=admin
                    password = System.getenv("MAVEN_PASSWORD") // example: MAVEN_PASSWORD=secret-word
                }
            }
        }
    }
}
```



参考
---
- https://qiita.com/kgmyshin/items/87f560172c31c2fbd899
- https://levelup.gitconnected.com/publish-a-maven-package-to-github-with-gradle-fabc6de24d6
Databricksにおけるzipファイルの取り扱い

[Zip files \| Databricks on AWS](https://docs.databricks.com/data/data-sources/zip-files.html) [2020/8/18時点]の翻訳です。

Hadoopは圧縮コーデックとしてzipファイルをサポートしていません。Apache Sparkにおいては、GZip、BZip2のテキストファイルや他のサポートされている圧縮フォーマットは、適切な拡張子が設定されていれば自動で解凍されるように設定することができますが、zipファイルを読み込むためには追加のステップを実行する必要があります。

以下のノートブックでは、zipファイルをどのように読み込むのかを説明しています。一時ディレクトリにzipファイルをダウンロードした後に、ファイルを解凍するためにDatabricksの`%sh zip`[マジックコマンド](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E6%B7%B7%E6%88%90%E8%A8%80%E8%AA%9E)を実行します。このノートブックで使用しているサンプルファイルに対する`tail`ステップは解凍されたファイルからコメント行を削除します。

ファイルに対する操作を行う際に`%sh`を使用するときには、結果は`/databricks/driver`に格納されます。Spark APIを用いてファイルをロードする前に[Databricks Utilities](https://docs.databricks.com/dev-tools/databricks-utils.html)を用いてファイルをDBFSに移動することもできます。

## Zipファイルを取り扱うPythonノートブック

https://github.com/taka-yayoi/public_repo/tree/main/zip_file

## Zipファイルを取り扱うScalaノートブック

https://docs.databricks.com/_static/notebooks/zip-files-scala.html

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.68.dylibの解決方法

# 環境
macOS Big Sur ver11.6
Rails 6.0.4.1

# エラー内容

学習のために、railsで新規アプリを作成しようと際に、

```
$ rails　new　（アプリ名）
```
を実行したところ、以下のエラーが発生しました。

```
(省略)
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
         run  bundle exec spring binstub --all
* bin/rake: Spring inserted
* bin/rails: Spring inserted
       rails  webpacker:install
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.68.dylib
  Referenced from: /usr/local/opt/node@14/bin/node
  Reason: image not found
sh: line 1: 28331 Abort trap: 6           node -v
sh: nodejs: command not found
Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/
```
どうやら「node.jsがありません」と表示されているようですが、そんなことあるのかと疑問に思い、言われたとおりに

```
$ brew install node
```
こちらのコマンドを実行して、node.jsをインストールしようとしたところ、

```
Warning: node 17.0.1 is already installed and up-to-date.
To reinstall 17.0.1, run:
  brew reinstall node
```
「既にあるよ」と言ってます。　ん？どうしてだろうと思って色々と調べてみました。
先ほどのエラー文のここの部分が臭いと思い、ここに絞って調査しました。

```
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.68.dylib
```
`dyld`は`Dyanmic Library`といい、ここの箇所は「実行時に読み込むライブラリが正しく読み込みできない状態になっている」という意味で、今回問題になっているライブラリはicu4cというものになります。
エラーの直接的な原因は、正直分かりませんでした。
アプリを作成しようとした際に、突如このエラーにハマり、原因がよく分からなかったのですが、調べたところ、**brew updateによるライブラリのバージョンアップにより古いバージョンのnodeと新しいバージョンのnodeが相互干渉を引き起こしていた**
可能性が考えられました。

# 解決方法

直接的な原因はよく分からなかったのですが、このエラーの直接の答えは[こちら](https://www.codegrepper.com/codeexamples/php/dyld%3A+Library+not+loaded%3A+%2Fusr%2Flocal%2Fopt%2Ficu4c%2Flib%2Flibicui18n.68.dylib)にありました。[こちら](https://github.com/nvm-sh/nvm/issues/1184#issuecomment-460701361)も参考にしました。

**解決方法**

```
$ brew uninstall --ignore-dependencies node icu4c
$ brew install node
```

これで、再度、'rails new'を実行すると、無事エラーが解消され、正常にアプリを作成することができました。

```
(省略)
✨  Done in 7.01s.
Webpacker successfully installed 🎉 🍰
```
brew doctorでWarningが発生した時の対処法

パッケージマネージャーHomebrewの現在の状態を表示するdoctorコマンドの警告文について、自分が遭遇した２つの警告文についての解決方法を記載します。

```
$ brew doctor 
Your system is ready to brew.
こちらが正常です
```

## 警告内容

### Warning: Some installed formulae are deprecated or disabled.

この警告は1つのアプリケーションに対して複数のバージョンがインストールされている状態であり、ターミナルに表示されている`ilmbase`、`mysql@5.6`を`uninstall`することで解消します。

**エラー文**

```terminal
MacBook-Pro ~ % brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Some installed formulae are deprecated or disabled.
You should find replacements for the following formulae:
  ilmbase
  mysql@5.6
```
**解決方法**

```
$ brew uninstall ilmbase 
$ brew uninstall mysql@5.6
```

---

### Warning: Broken symlinks were found. Remove them with brew cleanup:

この警告は壊れたシンボリックリンクが残っている場合に表示されます。
指示通り`brew cleanup`を実行します。

**エラー文**

```
Warning: Broken symlinks were found. Remove them with `brew cleanup`:
  /usr/local/share/man/man5/package-locks.5
  /usr/local/share/man/man5/shrinkwrap-json.5
MacBook-Pro ~ % brew cleanup
Removing: /usr/local/Cellar/freetype/2.10.4... (64 files, 2.3MB)
Removing: /usr/local/Cellar/ghostscript/9.53.3_1... (668 files, 89.3MB)
Warning: Skipping git: most recent version 2.33.1_1 not installed
Removing: /usr/local/Cellar/gnu-getopt/2.36.1... (10 files, 199.3KB)
Warning: Skipping heroku/brew/heroku: most recent version 7.59.1 not installed
Warning: Skipping heroku/brew/heroku-node: most recent version 12.21.0 not installed
Warning: Skipping ilmbase: most recent version 2.5.7 not installed
Removing: /usr/local/Cellar/libffi/3.3... (17 files, 540.2KB)
Removing: /usr/local/Cellar/libomp/11.0.0... (9 files, 1.4MB)
Removing: /usr/local/Cellar/libtiff/4.2.0... (248 files, 4.4MB)
Removing: /usr/local/Cellar/libtool/2.4.6_2... (71 files, 3.7MB)
Removing: /usr/local/Cellar/little-cms2/2.11... (21 files, 1.2MB)
Warning: Skipping node@14: most recent version 14.18.1 not installed
Removing: /usr/local/Cellar/openexr/2.5.4... (152 files, 6.9MB)
Removing: /usr/local/Cellar/openjpeg/2.3.1... (516 files, 14MB)
Removing: /usr/local/Cellar/pcre/8.44... (204 files, 5.8MB)
Warning: Skipping pcre2: most recent version 10.39 not installed
Removing: /usr/local/Cellar/webp/1.1.0... (39 files, 2.4MB)
Removing: /usr/local/Cellar/x265/3.4_2... (11 files, 35.8MB)
Pruned 2 symbolic links and 2 directories from /usr/local
```

**解決方法**

```
$ brew cleanup
```
Sonoscan | Best Pathological Lab in Kolkata

![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2264485/40b87030-0b83-b5fc-4c3a-960ec845e134.jpeg)
Sonoscan is one of the best diagnostic service providers in Kolkata. It is a NABL accredited laboratory with state-of-art facilities like pathology, neurology, cardiology with MRI, C.T scan facilities. Best Pathological Lab in Kolkata.
技術書書きたいですか？じゃあRe:View使おうね。

# はじめに
ども。僕です。

最近になって技術書を書く機会がありました。そこで、

「あーーーTexで書くのめんどくせー」

とか思ってました。Texって環境構築めんどいし。
Texっぽくてきれいに書けるやつ、ないかなーと調べてみると、

**「Re:View」**

という単語をみつけました。どうやら、同人技術書では多く使われているものっぽい。

こいつを使ってみっか！！
ということで、まとめていきます。

# Re:Viewとは

> Re:VIEWは電子書籍と紙書籍のための、簡潔かつ強力なデジタル出版ツールです。コンピュータ書等の技術書籍（紙・電子）の商業出版や同人出版に利用されています。
引用：https://reviewml.org/ja/

つまり、いろんなテンプレートあって技術書かけるぞ！！ってやつです。
出力形式も色んな種類があって、

- EPUB
- PDF (LaTeX)
- InDesign (IDGXML)
- Markdown
- plain text (TOPBuilder Text Markup Language)

があります。

主に出力するのはPDFだと思います。しかし、PDF出力には**「LaTeX」**環境が必要になります。


「Texいるん？？じゃあDocker使おうか」

ということで、Dockerで環境を作りましょう。

# 環境構築

環境構築において、Re:Viewには初期設定をGUIでやってくれるサイトがあります。
[Re:VIEW Starter](https://kauplan.org/reviewstarter/)というサイトに行ってみましょう。

zipファイルでダウンロードできるので、ダウンロードしましょう。

そんでもってDockerfile

```Dockerfile:Dockerfile
FROM kauplan/review2.5
```

あとはdocker-compose.ymlを適当に書いて使いましょう。

[ユーザーズガイド](https://kauplan.org/reviewstarter/reviewstarter-usersguide-20210715.pdf)に色々あるんで呼んでみましょう

Re:ViewはTexのようにコマンド実行してビルドしてPDFにします。
なのでMakefileを使ってビルドなりなんなりの機能を楽にすることをおすすめします。

てかさっきのユーザーズガイドにこの世のすべてが詰まってます。みましょう。


# まとめ
Re:Viewをつかって今、技術資料づくりをしてるんですけど、記法も複雑でもないし、結構書きやすいですね。
デザインもそれなりにかわいいです。

技術書っていうより、MarkdownとTexの中間に位置するようなイメージですね
Markdownよりデザインがきれいで、Texより環境構築が楽だけど、レポート向きではない

みたいな。。

何かしらの機会があったら使ってもいいかもしれません。


では。
CSS Generator Tools　※随時更新

#1, CSS clip-path-maker
<font color="Red">**写真の加工にとても便利**</font>

http://bennettfeely.com/clippy

[<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e4c0e09b-2d69-d229-bd59-ed8fc520a719.png">](http://bennettfeely.com/clippy)

###【使用例】
https://youtu.be/hQjlM-8C4Ps

#2, ColorZilla
<font color="Red">**Google Chrome拡張機能**</font>
<font color="Red">**ウェブサイトの配色を簡単に取得できる**</font>

https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=ja

[<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/b9c6d9c6-2e0d-e5eb-7eaf-c8d77a145a7e.png">](https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=ja)

#3, CSS Gradient

<font color="Red">**トーンカラーの作成に便利**</font>

https://cssgradient.io/

[<img width = 700 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6f93d1d3-6cb2-a6c3-bfd1-aabe1d76cc44.png">](https://cssgradient.io/)

###【使用例】

https://youtu.be/-bll7l-BKQI
Anaconda再インストールした話

#あらすじ

TSUBAMEを使うようになってはや数ヶ月．†TSUBAME完全に理解した†と思っていた食べごろうに悲劇が訪れた．
anacondaで新しい県境を作りパッケージをインストールしていたところ，このエラーにぶち当たる．

```bash:error
[Errno 122] Disk quota exceeded
```

....???????





何事かと思い調べたところ，単純にインストールするだけの容量がないとのこと．





.................???????????????????????????（２回目）






えっだってグループのストレージってテラ単位でありましたよね....?と，バカ丸出しの食べごろうは先生に質問してしまう
も，
**>>>>>>>>>>普通にホームディレクトリ使ってました<<<<<<<<<<<**
（それはそう）



なので，グループのストレージを教えてもらい，anacondaをそちらに入れ直すことに．


#アンインストール

### anacondaのキャッシュを消し去る
 * `$ conda install anaconda-clean`する
 * `$ anaconda-clean`する
 
### anacondaのデータを消し去る
 * anacondaをインストールしておいたディレクトリに移動しておく
 * `$ rm -rf ./.anaconda_backup`する
 * `$ rm -rf ./anaconda3`する
 
### `.bashrc`ファイルをきれいにする
大抵のサイトには`.bash_profile`をきれいにしろ，と書いてあるんだけど，私の環境では`.bashrc`に記載があったのでこっちをいじりました．
なんか，`.bashrc`は`.bash_profile`が起動時に読み込んでくれる設定らしい．違いはよくわからないけど記載がある方をいじればいいと思うよ．知らんけど．

 * ホームディレクトリに移動しておく
 * `$ vim .bashrc`する
 * 以下のような`conda initialize`に囲まれた記述があると思われるので，消す．（再インストール時に設定ミスった時用に，メモ帳か何かに残しておくと良いかも)

```bash:.bashrc
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/hoge/fuga/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/hoge/fuga/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/hoge/fuga/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/hoge/fuga/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
```

#再インストール
ほぼ昔の自分の手順通りにした．
ただし，インストール直後から「anacondaをアップデートしろ」とうるさかったので[ここ](https://www.anaconda.com/products/individual#linux)から最新版のURLを探してインストールした方が二度手間にならずに済むかも．

### インストーラをゲット

```bash:install＿anaconda
$ mkdir anaconda-install
$ cd anaconda-install
$ curl -O https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
$ chmod +x Anaconda3-2021.05-Linux-x86_64.sh
$ ./Anaconda3-2021.05-Linux-x86_64.sh
```

### 利用規約
エンター長押しで読み進め，yesを入力

### インストール先の変更
ここが再インストールの目的になるので慎重に.

```bash:install
Anaconda3 will now be installed into this location:
/hoge/fuga/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
[/hoge/fuga/anaconda3]>>>
```

と出力されるので，ここでインストールしたい場所（今回の場合ならtsubameグループストレージのパス）を入力してからエンター．

```bash:入力例
[/hoge/fuga/anaconda3]>>>/gs/hs0/sample_group/my_dir/anaconda3
```

### `.bashrc`の更新はやってもらう

```bash:
Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/ユーザ名/.bashrc ? [yes|no]
[no] >>>
```

と聞かれたら，yesでエンター．
ここでうっかりnoにしてしまった場合，先程メモ帳に残しておいた古い`.bashrc`の対応するパスを書き換えてから再度 `.bashrc`に書き込めばおk．（食べごろうは無事しくじったのでこの方法で難を逃れました）

### VScodeをインストールしない
迷わずNo．

#終わりに
これでconda環境は新しくできたはず．
場所を移動させたかっただけなのだが，pathの変更とか必要？と思うとめんどくさくて入れ直してしまった．
また新しく環境作り直さなくちゃなあ〜
【2023年6月更新】ibmcloud, kubectl, oc, slcli コマンドのインストール (Mac版)

#はじめに
本記事では、ibmcloudコマンド、kubectlコマンド、ocコマンドのインストール方法について記載します。
新環境にインストールする際に、それぞれ検索し直すのが面倒だったので、ここにまとめてみました。
それぞれ公式サイトにも記載がありますので、合わせてご確認ください。

# ibmcloud コマンドのインストール
githubページの[ibm-cloud-cli-release](https://github.com/IBM-Cloud/ibm-cloud-cli-release/releases/)に従いインストールします。
```
# curl -fsSL https://clis.cloud.ibm.com/install/osx | sh
Current platform is linux64. Downloading corresponding IBM Cloud CLI...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9.7M  100  9.7M    0     0  46.5M      0 --:--:-- --:--:-- --:--:-- 46.7M
Download complete. Executing installer...
Bluemix_CLI/
Bluemix_CLI/bin/
Bluemix_CLI/bin/ibmcloud
Bluemix_CLI/bin/ibmcloud.sig
Bluemix_CLI/bin/NOTICE
Bluemix_CLI/bin/LICENSE
Bluemix_CLI/bin/CF_CLI_Notices.txt
Bluemix_CLI/bin/CF_CLI_SLC_Notices.txt
Bluemix_CLI/autocomplete/
Bluemix_CLI/autocomplete/bash_autocomplete
Bluemix_CLI/autocomplete/zsh_autocomplete
Bluemix_CLI/install
Bluemix_CLI/uninstall
Bluemix_CLI/install_bluemix_cli
Install complete.
```
自身の使用環境に当てはまるインストーラを選択しダウンロードし、インストーラを実行することでも可能です。

### プラグインをインストール
ibmcloudコマンドには様々なプラグインが存在します。
必要に応じてインストールしてください。

#### 全てのプラグインをインストール
```
yes | ibmcloud plugin install -a
```

#### プラグイン一覧表示

```
# ibmcloud plugin repo-plugins -r 'IBM Cloud'
```

#### kubenetes-serviceプラグインのインストール例

```
# ibmcloud plugin install kubernetes-service
```

#### softlayer（classic IaaS）プラグインのインストール例

```
# ibmcloud plugin install sl
```
その他のインストール方法は[こちら](https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli)

# kubectl コマンドのインストール
```
brew install kubectl
```


# oc コマンドのインストール
```
brew install openshift-cli
```


### 3. OpenShift へのログイン
1. [Red Hat OpenShift on IBM Cloud コンソール](https://cloud.ibm.com/kubernetes/clusters?platformType=openshift)で、アクセスするクラスターをクリックします。
2. 「Actions...」ドロップダウン・リストで`Connect via CLI`を選択します。
3. 次の画像のようなサイトに飛ぶので、`Log in with this token` 行をコピーしコマンドラインへペーストして実行します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/973e0296-9e72-eed9-51c3-e94646ee5dbf.png width=60%>

### 4. oc コマンドの実行例
oc get nodes、oc status の実行結果です。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/a1827c3c-a947-25ad-69a0-43414c3c7fe5.png width=70%>

https://www.ibm.com/docs/ja/eam/4.1?topic=cli-installing-cloudctl-kubectl-oc

# slcliコマンドのインストール
githubよりレポジトリをcloneし、pythonスクリプトを実行します。
その他のインストール方法は[こちら](https://softlayer-api-python-client.readthedocs.io/en/latest/install/)。
```
$ git clone git@github.com:softlayer/softlayer-python.git
$ cd softlayer-python
$ sudo python3 setup.py install
```
Power BI Desktopで凡例グラフ。系列ラベルオプションも初使用【操作の復習＆いろいろ試す②】

##まずはデータの更新

以前行った、「Power BI Desktop」を（自分が）復習するために行なった操作の続きです。

少し横道にそれますが、MacBook Air M1チップ搭載機で「Parallels Desktop 17 for Mac」を動かし、「Power BI Desktop」を使っています。
先日、「Windows 11」（プレビュー版）に更新し、その後日Windows Updateも行ったところ、「Power BI Desktop」のレスポンスがよくなった感触です。
使いやすくなりました。

https://qiita.com/text_owleyes/items/834025a44d4ef6228be8

データは以下から「http」で取得しています。

https://www.ecdc.europa.eu/en/publications-data/data-daily-new-cases-covid-19-eueea-country

「データの更新」で差審のデータを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/0d4d78e6-7a06-a661-4a3d-a4430b0060f3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/dfab3a7d-36fd-35a3-a755-de479fccfcdf.png)

##凡例グラフ作成

左パネルの「凡例」に国などのエリア情報があるフィールド（この場合「countriesAndTerritories」）をドラッグすると、エリア別のグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/22082065-8793-0bc2-0f30-2e437c1c4e15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/01db8a79-c07f-1716-6ce8-e414c6e07a6c.png)

途中の数値がないエリアは表示されないことがあるので、ドラッグしたフィールドの右端をクリックし、「データのない項目を表示する」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/7e261092-0ba0-cd73-e99c-7d954245d5aa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/431d5e1c-7b06-cd66-91dc-dbd13dd26ff7.png)

##系列ラベルオプションを初めて使う

右パネルにある各種スタイルを設定する画面に、以前はなかった「系列ラベルのオプション表示」というメニューがありました。
有効にすると、グラフ右側先端の「凡例」で指定したエリア名が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/3b2cd01c-d201-4bd8-e2ba-c567bf12d27d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/805afe47-2b15-b353-f27d-87e0f48f3a16.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/df7b4c24-8b38-ed18-3170-d3285d8f0bc7.png)

これまで欲ししたかった装備なのですが、標準機能ではできませんでした。
詳細設定ができるので、サイズなど変更し、見やすくしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/0a7c174a-832e-00ee-a231-1af9017fc006.png)

表示されるのは一部だけで、「表示密度」を調整して表示数を変更することはできないようです。
この機能の有用性を確認するために、グラフ側の表示本数を変更します。
フィルターパネルでエリア「countriesAndTerritories」の表示を「cases（感染者数）の平均の上位5」に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/053ebff2-280b-6b3c-29f1-1253210955ff.png)

系列ラベルの文字サイズやフォントをもう少し変えて、見やすくしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/f82222b4-ec60-e938-9a9f-54fb3018c209.png)
　
**了**
webp（ウェッピー）のメリットと mac での使い方

## 概要

今後、webp が主要になると考えられるので、自分用に備忘録として、メリットと使い方を簡単に記載する。（思ったけど本当に読み方、ウェッピーで合ってんのか...）
**(2022/02/15にPhotshop2022でwebpが完全にサポートされたので、下記読む必要なし!)**

## 環境

macOS: Big Sur
ver: 11.5.2

## webp とは

WebP とは、2010 年に**Google**から発表された画像フォーマットのことで、拡張子は「.webp」です。
2021 年 11 月時点での対応ブラウザは、Chrome、Firefox、Edge、Safari 等です。IE は対応してない。

## webp を使用するメリット・デメリット

### メリット

**非可逆圧縮**なのに、**アルファチャンネル**を扱えるということ、つまり JPG と PNG や GIF のメリットを併せ持つ画像フォーマットであること。

### デメリット

対応ブラウザが少ないことだったが、現在の主要ブラウザの中で非対応なのは IE のみなので問題ないと言いたいところ。しかし、両対応の処理を書く必要があるので少し面倒でミスを誘発することがある。

## mac における webp の使い方（Photoshop で）

1. プラグインをダウンロード<br>
   [WebPShop の Github](https://github.com/webmproject/WebPShop/releases)から`WebPShop_0_4_0_Mac_Universal.zip`（適宜最新のものを）をダウンロードする。
2. Photoshop にプラグインをインストール<br>
   解凍した`WebPShop.plugin`を Plug-ins フォルダ（Applications/Adobe Photoshop 2021/Plug-ins）にコピーする。2021 年 11 月に Photoshop 2022 がリリースしたが、現状使えなかったので 2021 との使い分けが必要（2021 年 11 月中旬）
3. macOS のバージョンが 10.15 以降の場合（10.15 以前のものは不要）<br>ターミナルから WebPShop の検疫をバイパスさせる必要がある。<br>
`sudo xattr -r -d com.apple.quarantine "/Applications/Adobe Photoshop 2021/Plug-ins/WebPShop.plugin"`
4. JPG や PNG で書き出した画像を WebP 画像にする<br>
   PhotoShop で JPG や PNG で書き出した画像を開き、「保存」または「別名で保存」を選択し、フォーマット項目を「WebPShop」に指定することで WebP 画像を作成することができる。

### 参考

WebP の実装方法はこちらが分かりやすかったです。[【SEO 対策】画像形式 webp を使ってみよう](https://blog.codecamp.jp/seo-measure-webp)
未経験でRPA?実際どう？

#はじめに
未経験でSierに転職し、RPAに半年間携わりました。
言語を用いたコーディング開発に従事することをイメージしていた私にとっては、
少し驚きの配属でしたが、貴重な経験ができたと思っています。
そこで、
「初めての現場としてRPAはどうだった？」、「技術的にはどのようなことが学べる？」
などの視点で、私の体感を正直に話していこうと思います。
"IT業界の門を叩いたばかりで、これからRPAに携わる可能性がある、もしくは携わる”
という方の参考になれば幸いです。

#幅広い工程を経験
真っ先に思いつく、RPAの現場に配属されて1番良かったと思える部分があります。
それは、仕様検討、設計、テスト、デモ、本番稼働といった幅広い業務にメインの担当者として従事できたことです。
RPAはシステム開発とは異なり、開発規模が比較的小さいため、一つの開発案件を短期間かつ少人数で進めていきます。
そのため、半年という期間の中でも、前述した工程全てに携わり、複数の開発案件、改修案件に携わることができました。
正直、未経験一年目なんて、"設計をひたすら"、"テストをひたすら"パターンもあり得るなと思っていたのですが、、、
実際は、
自分で仕様を詰めたものを開発し、テストを行い、ロボット稼働をお客さんの前で実施し、ロボットがうまく稼働して、「億劫だった作業がはかどります。本当にありがたいです」という感謝の言葉もセットでいただくという、フルコースを味わうことができました！
もちろんシステム開発程の技術レベルや規模感ではありませんが、開発案件の最初から最後までを全うする、"小さな成功体験"を積めたのは、RPA現場に配属されたからこそのメリットでした。
未経験の自分にとっては、この上ない経験ができたと思います。

#技術的に学べる事
基本的にRPAはフローチャートをベースにローコードで開発を行います。
なので、しっかりとフローチャートを元に処理ロジックを構築していく能力が身に付いたと思います。
開発の題材は主に、
業務システムへの情報登録、情報抽出、Ofice関連業務(エクセル、Outlook)など、
直観的に理解しやすいものなので、ロジック構築に対する敷居が低いのもRPAのメリットです。
言語開発では、このフローチャートの構築に各言語のお作法が加わるというイメージなので、言語開発を今後考えている方でも、RPA開発は良い経験になると思います。

#あえてデメリットを正直に言うならば
IT分野の未経験の方などは、これから技術的な知識をたくさん吸収していきたいと切望している人も多いと思います。
RPAは短いスパンでどんどん開発を行っていくため、比較的短期間で多くの開発案件や改修対応に携わることができると思います。
しかし、基本的にはローコードでのシンプルな開発(システム開発と比べると)のため、個人差はあると思いますが比較的早い段階で、新たな技術的な学びが減ってくる可能性があります。
IT分野で技術的な知見を広げていきたいという人にとっては、長期間RPAに携わることはデメリットとなる可能性はあると思います。
(RPAは良いとゴリ押ししても良かったのですが、正直にそこはデメリットだと思ったので記述しました笑)


#さいごに
最後までお読みいただきありがとうございます。
RPAをやってみての個人的な体感を書かせていただきました。
IT未経験の自分にとって、RPAの現場は自身を成長させる
良い土壌であったことが伝えたかったです。
是非、未経験、新卒エンジニアの方は参考にしてみてください！
AWS認定 ソリューションアーキテクトアソシエイト（SAA）に合格するまで

AWS認定**ソリューションアーキテクトアソシエイト（SAA）**に合格しました。合格までの道のりを記録しておきます。

※この記事ではオンライン試験の詳細など、クラウドプラクティショナーの記事と重複していて、不要な箇所は省略してあります。
https://qiita.com/hiyanger/items/a36c6a20e4a8876b737f

###概要
・AWSの**中級**の試験で、**アーキテクト**の他には**デベロッパー**、**運用**と全３種類ある。
・アーキテクトなので**設計分野**がメインの試験です。
・受験料は**15,000円**
・試験時間は**140分**
・出題数**65問**
・合格は0~1000点間で**720点以上（72%以上）**
・合格率は**50%程度**（実際の数値なしなので噂レベル）
・受験はピアソンかPSI（オンライン受験可能）

###予備知識
AWSへの移行や、既存AWS環境の保守などを片手間レベルでやったりしてたので、若干知識はありました。EC2、RDS、ELB、S3等主要なシステムはざっくり把握していた感じです。また、クラウドプラクティショナーを直前に取得してます。

###勉強期間
今回はちまちま勉強していたので、勉強期間は約3ヶ月。トータル時間は60h程度です。

###学習の流れ & 教材
**①徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/d05e99a2-df0e-bbfd-d047-58a9b150c144.jpeg" width=20%>
おそらく一番人気があるだろうと思われる教本です。とりあえず掴みとして一通り読みました。模擬試験も実施。

**②Udemy「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」**
https://www.udemy.com/course/aws-associate/
模擬試験だけやりました。１→２→３の流れで３周して、すべて80%以上にしました。

**③AWS認定資格試験テキスト**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/6c396b0b-da27-743e-5c7f-145b29be457b.jpeg" width=20%>
②に終了時点で知識の定着が甘いと感じたのでもう１冊読みました。項目がサービスありきで書かれてるので、すごく読みやすいです。模擬試験も実施。最後の単語チエックリストも良かったです。ボリュームは①に負けますが、ポイントの抑えられている良本です。

**④Udemy「AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集」**
https://www.udemy.com/course/aws-knan/
最後の総仕上げです。２→３を２周やりました。最終的にどちらも合格ラインの72%前後くらいまでしか詰められませんでした。（４、５、６はやってません。１は②の３とほぼ同じ模擬試験なので一回だけやりました）当日の試験はこの問題集くらいのレベルです。

###試験
試験までの流れはクラウドプラクティショナーと同じ。
https://qiita.com/hiyanger/items/a36c6a20e4a8876b737f

問題の傾向としては、**S3、ELB、CloudFront、CloudWatch、AutoScaling、Lambda**あたりがよく出たように感じます。意外だったのはストレージ系で**EFS**がよく出ていたことです。それぞれ２、３問はでていたかと思います。

模擬試験通り、問題文がそれなりに長く、実際にシステムをイメージして回答するものが多いので、疲れます。時間もそれなりにかかって、終了時点で残り時間は30分程度でした。軽く見直して終了。

今回も厳しいかも…と感じましたが、無事合格。736点でギリギリでした。

反射的に答えられる問題が少ない傾向は、クラウドプラクティショナーの時よりも一層強くなっており、難易度の上がり具合も強く感じました。問題文を読んでシステムが正しくイメージできること、そのイメージに対して自分の知識から適切な設計を導けるかがポイントです。

クラウドプラクティショナーのときも書きましたが、単純な暗記ではなく、各サービスを正しく理解して自分の中で確実に消化しきることがより重要だと感じました。

###さいごに
この試験でAWSの知見が設計レベルでより深まりました。個人的な話ですが、試験は一旦ここまでにして、今後はハンズオンを進めます。この記事でもこれから受験する人の合格に貢献できたら嬉しいです！！
「docker-compose exec php-fpm /bin/bash」でコンテナにログインできない

##Laravelやdockerの練習がしたかった
Laravel + dockerの環境を構築していたらコンテナに
入れない事件が発生しました。

対処方法自体は大したことではなかったのですが、
備忘録として残しておくことにします。

dockerの経験はまだまだ浅いので問題あれば
教えてください。。

###まずはdockerイメージを作成
```
docker-compose build --no-cache
```

・・・ドキドキしながらも、これは成功！

###次はdockerコンテナを起動
```
docker-compose up -d
```

どうだ・・・？？

```
Creating network "hoge_project_default" with the default driver
Creating hoge_project_mysql_1 ... done
Creating hoge_project_php-fpm_1 ... done
Creating hoge_project_nginx_1   ... done
```

これも成功！！
順調にいきそうでよかったよかった。



### コンテナに入る
```
docker-compose exec php-fpm /bin/bash
```

しかし、、、

```
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"C:/Program Files/Git/usr/bin/bash\": stat C:/Program Files/Git/usr/bin/bash: no such file or directory": unknown
```

ああああああああああ！！！！
やはり簡単にはいかないか。。

###原因
Windows homeで実施していたのですが、先程叩いたコマンドの

```
docker-compose exec php-fpm /bin/bash
```
の「/bin/bash」に問題があったみたいです。

どうやら今回構築したdockerコンテナでは、
「docker exec」した際に「bash」コマンドが使用できないらしい。。

代わりに

```
docker-compose exec php-fpm /bin/sh
```
を実行したところ無事成功しました！

このエラーは私だけではなく、色々な記事で同じ内容を見かけました。
Macで実施した時は問題なかったのに、Windowsでやったら今回のエラーに
出くわしたので、環境も関係あるのか。。？

もし教えてもらえれば幸いです！
最後まで閲覧いただき、ありがとうございました！
自分にとって良い技術書に出会うための判断方法

## はじめに
何か技術を学びたい時、本の購入が選択肢に出てくると思います。
インターネットで調べると本の数が多いことから、どの本が良いのか悩んだ経験はありませんか？

この記事は技術書を買うときに自分にとって良い本を判断する方法を僕なりに紹介したいと思います。


## 想定する読者

- ある技術を学びたいが、どの本が自分に適しているのかわからなくて悩んでいる人

## 前提

- Amazonで本が購入できること
- （できれば）kindle版で無料サンプルを見れること

## Step1 自分の学びたいことを明確にする

本を探す前に大前提として自分が今何を学びたいのかを明らかにする必要があります。
これができていないと自分に適した本を探すことができません。
最悪の場合、自分には価値のない本を購入してしまい時間とお金の無駄になってしまいます。

僕なりの方法ですが、`技術名` + `何ができるようになりたいのか`　の組み合わせで考えられていると本探しがスムーズにできると思います。

### 技術名
`React`  `Ruby` `AWS`　の粒度なので、これは簡単ですね。

### 何ができるようになりたいのか

次にその技術を使って何をできるようにしたいかを明確にします。

例えば以下の通りです。
`React`の`Hooksを使って状態管理を実装できるようにしたい`
`Rails`の`アーキテクチャを理解して実装できるようになりたい`
`AWS`を使って`可用性の高いアーキテクチャを構築できるようになりたい`

ここまで明確にしていれば、ネットサーフィンしていても迷わずに効率よく購入ができます。

## Step2 紹介サイトでよく出てくる本を見つける

Amazonに行く前にGoogleで「技術名 + 本」と検索します。
「React 本」のように検索をしてください。

すると、その技術書のオススメを紹介するサイトがいくつか検索で見つかります。
3,4つくらいざっと確認してどのサイトにも掲載されてる本を探してください。
サイトの特色によって紹介されてる本に偏りがありますが、良い本はどのサイトにも掲載されています。

また、併せてサイト作成者の評価文を確認してください。
Step1の内容が学べそうであるかをチェックします。


## Step3 Amazonの評価が高いか確認

Step2でピックアップした本について、僕は念の為Amazonの評価とコメント欄を確認します。
あまりに評価が低い場合はStep2に戻り別の候補を検討します。

## Step4 Amazonの無料サンプルで目次に学びたい内容があるか確認

以下の条件が必要になります。
揃っていないとできないためスキップしても構いません。

- Kindleアプリ、Kindle端末がある方。
- 本のkindle版（電子書籍）が存在すること

Amazonの商品ページに「無料サンプル」というボタンがあります。
これを押してkindleで冒頭の数ページ確認できます。
僕がいくつか試したところ、ほとんど本が目次まで確認できました。
この目次にStep1で確認した内容が含まれているか確認します。

Step1の内容が学べないと感じたら、Step2に戻り別の候補を検討します。

## Step5 最終判断

Step1〜3(4)の内容が全て問題ない場合は購入を検討してもOKだと思います。

## 最後に

技術書を読むと毎度「早く読んでおけばよかった！」と思ってしまうので、いい技術書には早く出会いたいもんですね。

この記事の方法が最善だとは思いませんが、少しでも皆さんの本選びの助けになれば幸いです。
Laravel withCount ある商品の購入人数を知りたい時（同じユーザーが複数回購入しても1回でカウントする）

# はじめに
題名の通りですが、ある商品の購入者数をカウントしたい場合があるとします。
<font color="blue">__同じ人が何回購入しても、売れた個数を1個としてカウントしたい__</font>場合の処理を紹介します。
ランキングを表示する際に同じ人が何度も購入してた場合、その購入数を1回でカウントしたい時に実装しました。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [テーブル構成](#テーブル構成)
2. [商品のランキング表示処理](#商品のランキング表示処理)
3. [試してダメだった事](#試してダメだった事)
4. [最後に](#最後に)

<!-- 各チャプター -->
# テーブル構成
まずはテーブル構成ですが、goods、payments、usersテーブルがあるとします。
リレーションの処理はこちらでは省略しますので、自身で書いて下さい。

【テーブル構成】
users → ユーザー情報
goods → 商品の情報
payments →　購入履歴情報 (中間テーブル)
※<font color="blue">paymentsは中間テーブルなので、goods_idとuser_idを持っています。</font>


# 商品のランキング表示処理
・withCountで、ある商品のグッズの購入数を取得できます。
・<font color="blue">__同じユーザーが複数回購入しても1回でカウントする為にdistinctを用いています。__</font>
　distinct → 重複するuser_idを1つにまとめる。
・最後にorderByで購入者が多い順に並べ替えています。

```
// GoodsController.php

// 商品ランキングページを表示する処理
public function index()
{
    // グッズの購入人数を取得して、人数順に並び替える
    $goods_ranking = Goods::getPaymentsCount()->orderBy('payments_count', 'DESC');

    return view('user.index', ['goods_ranking' => $goods_ranking]);
}
```

```
// app/Models/Goods.php

public function scopeGetPaymentsCount($query)
{
    // withCountでリレーション先のそのグッズの購入数を取得する
    return $query->withCount(['payments' => function ($query) {
　　　　　　　　　　　　　　　　// distinctで重複する。user_idを1つにまとめる
        $query->select(DB::raw('count(distinct(`user_id`))'));
    }]);
}
```

# 試してダメだった事
クエリビルダーのgroupByとwithCountを組み合わせて取得してみましたが、エラーが出て、うまく取得できませんでした。
いけそうでいけないです・・・良い方法があれば教えて頂きたいです！！

```
public function scopeGetPaymentsCount($query)
{
   // withCountでリレーション先のそのグッズの購入数を取得する
　　　　　　　return $query->withCount(['payments' => function ($query) {
　　　　　　　　　　　　　　// groupByで重複する。user_idを1つにまとめる・・・事が出来ませんでした・・・
   　　　　　　　　$query->groupBy('user_id');
　　　　　　　}]);
}
```


# 最後に

ちなみにクエリビルダーのjoinとgroupByを組み合わせても実装自体は可能です。
経験が浅いので、良い方法があれば是非教えて下さい！！
ここまで読んで頂き、ありがとうございました。
スクラム開発とは



#スクラム開発とは
スクラム開発とは、アジャイル開発の1つ。
コミュニケーションを主体とした開発手法。

##特徴
・プロダクトへの作業は、バックログ（タスクを書いたカード）で管理する
・少人数チーム。メンバー全員が、リーダーのつもりで開発を行う
・固定の1～4週間の短期間（スプリント）で開発を区切り、計画を立てる
・プロジェクト状況について、メンバー間で毎日話し合う時間を設け、必要があったら方向修正をする

##スプリントバックログ
プロダクト・バックログからスプリント期間分を抜き出した「チームのタスクリスト」のこと。

##プロダクトバックログ
プロダクトやその先のビジョンを実現するために「必要な作業やつくるべき機能をあげたリスト」のこと。


#スクラム開発メリット
・常に日々のミーティングで仕事の方向性を確認・修正しているため、進捗状況を正確に把握できチームのタスクをスケジュール通りに進めやすい。

・スプリントは期間が短めで成果物はスプリントの度にフィードバックを受けるため、仕様変更に対応しやすい。

・開発チーム・メンバーの能力を把握することで生産性も改善しやすい。

・プロジェクトの見通しが明確になる

#スクラム開発デメリット

・開発中にチームメンバーから離脱者がでると、プロジェクトの進捗に大きな影響が出ることがある。

・個人が負担するスキルの幅が広いので、メンバー間のスキルレベルに差があると、作業量に偏りが生まれる
【Flutter】駆け出しエンジニアが読んでおくべき記事【随時追加】


# 基礎

https://www.flutter-study.dev/

https://flutter.dev/docs/resources/architectural-overview


https://www.raywenderlich.com/24499516-getting-started-with-flutter


https://www.solutelabs.com/blog/flutter-tutorial-for-beginners-step-by-step-guide

# アーキテクチャ

https://flutter.dev/docs/resources/inside-flutter

# 開発ヒント

https://flutter.dev/docs/cookbook






# デザインパターン・状態管理

https://mkobuolys.medium.com/


https://medium.com/flutter-jp/state-1daa7fd66b94

# DB

https://flutter.dev/docs/cookbook/persistence/sqlite

https://blog.codemagic.io/choosing-the-right-database-for-your-flutter-app/

# CI

https://devcenter.bitrise.io/jp/getting-started/getting-started-with-flutter-apps/
【Flutter】ウィジェットを秒でラップする【VSCode】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2256518/a99550d7-a125-51d7-c3d7-23d7914ed659.png)

# はじめに

Flutterはとても優れたフレームワークです。
ウィジェットを組み合わせるだけで簡単にUIを作ることができて
それなりのアプリが作れてしまいます。

しかしそのウィジェットでアプリを構成する上で誰しもが通る問題があります。
それは

**ウィジェット構成を変えたいときに面倒**

です。

そして今回は**MacにてVSCodeを使ってこの問題を解決する方法**をご紹介します。

# 本記事で解決する問題

例えばFlutterで以下のようなコードを書いているとします。

```dart

import 'package:flutter/material.dart';

class SampleWidget extends StatelessWidget {
  const SampleWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text("here is sample widget"),
    );
  }
}

```

ここで```Container```ウィジェトを```Center```ウィジェットでラップしたくなりました。

つまり

```dart

return Center(
      child: Container(
        child: Text("here is sample widget"),
      )
```

このような状態にしたいです。

しかしこれを実現するのは少し面倒です。

なぜなら一旦```Center()```を記載してその中に```child```プロパティを用意して
そこに```Container```を移動しなければなりません。

ちょっとした手間ですが、ウィジェットを構成することでアプリを作るFlutterでは
こういったちょっとした手間が積み重なって大きな時間のロスになります。

しかし逆に言えばこの手間を省けた場合、大きな効率化になりますので
アプリを作ることがグッと楽しくなります。

ではこの問題を解決する方法を紹介します。

# ウィジェットを秒でラップする

VSCodeにはたくさんのショートカットキーがあります。
そして実はウィジェットをラップするショートカットキーも用意されています。

ウィジェットをラップするショートカットキー：**command + .**

やり方は簡単。
まず先ほどの例の場合はカーソルを```Container```に合わせます。
そしてcommand+.を推します。すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2256518/a9f6a640-8fc8-0256-2378-4709a77196c8.png)

なんと**ラップ可能なウィジェット一覧が表示**されました！

あとはラップしたいウィジェットを選ぶだけ。
```Center```を選択すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2256518/d5d954f4-1fca-e90b-49db-b5f6feef414b.png)


画像のように綺麗にラップされました。

# 最後に

**command + .**をお供に楽しいFlutterライフを！
LinuxにHomebrewを入れる方法

# Homebrewとは？
MacOS でおなじみのパッケージ管理ツール。
最近、Linuxに対応してインストールが簡単になったとのこと。
昔はlinuxbrewで入れていたのでびっくりした。
（現時点での最新バージョンは3.3.2）

![スクリーンショット 2021-11-08 20.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594740/513a2b7d-581e-dc37-bd3d-f2872827a790.png)

# 早速入れてみる。
公式ページのコマンドを端末で実行（CentOS 7で試しました。）

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Enter で進めてインストール
```

# 順調にインストールが完了。次にパスを通す。
インストール後に以下の画面がでてきたので実行する。
(私の環境だと、two commandsとのことでした。)
◇Linuxで入れる手順
https://docs.brew.sh/Homebrew-on-Linux

```
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
echo 'eval ・・・・・'
eval '・・・・'
# ↑の2つのコマンドを実行
```
# 確かめる
`$ brew help`を実行しできることを確認した。

```
$ brew help

Example usage:
  brew search TEXT|/REGEX/
  brew info [FORMULA|CASK...]
  brew install FORMULA|CASK...
  brew update
  brew upgrade [FORMULA|CASK...]
  brew uninstall FORMULA|CASK...
  brew list [FORMULA|CASK...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA|CASK

Contributing:
  brew create URL [--no-fetch]
  brew edit [FORMULA|CASK...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh
```

# まとめ
簡単にLinuxにHomebrewを入れることができた。

# 参考

◇Homebrew公式ページ
https://brew.sh/index_ja

◇Homebrew Documentation
https://docs.brew.sh/

◇github
https://github.com/Homebrew/brew
Rubyで文字列に絵文字が含まれるかどうかを判定する方法（ruby-jp slackで2021/11/08に行った質問回答まとめ）

[ruby-jp slack](https://ruby-jp.github.io/)で質問したところ、識者の皆さんから回答をいただけたので、まとめます。回答いただいた皆さん、ありがとうございました。

## 端的な回答1

[unicode-emoji](https://github.com/janlelis/unicode-emoji) gemを使う。（筆者未検証）

## 端的な回答2

Unicode プロパティによる文字クラス指定を利用するのが便利、しかし文字コード沼は深い。筆者の今回の用途では以下の判定([Githubにも上げました](https://github.com/skuroki/ruby_emoji_check))でほぼ大丈夫そう。

```main.rb
PATTERN = /[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]/

STRINGS_WITH_EMOJI = [
  '🍣',
  '0️⃣',
  "👩‍👩‍👧‍👧", "☃️", "🇵","🏻", "😴", "▶️", "🛌🏽", "🇵🇹", "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "2️⃣", "🤾🏽‍♀️",
].freeze

STRINGS_WITHOUT_EMOJI = [
  '1aあア＠',
  '東京都江東区新木場２丁目２−１０',
  '黒木　慎介',
].freeze

result = true

STRINGS_WITH_EMOJI.each do |s|
  unless s.match?(PATTERN)
    puts s + 'は絵文字を含むと判定されませんでした'
    result = false
  end
end

STRINGS_WITHOUT_EMOJI.each do |s|
  if s.match?(PATTERN)
    puts s + 'は絵文字を含むと判定されてしまいました'
    result = false
  end
end

if result
  puts '判定は成功しました'
end
```

ruby3.0.1（仕事で使っているバージョン）にて確認。

## 解説

### 正規表現の文字クラス

Rubyの正規表現では[文字クラス](https://rurema.clear-code.com/3.0.0/doc/spec=2fregexp.html#string)を利用でき、これを活用することで、半角数字とかアルファベットの小文字とかの様々な判定ができます。

しかし、ドキュメントに記載されている中には、絵文字の文字クラスはありません。

### Unicodeプロパティによる文字クラス指定

Unicodeの1つ1つの文字にはプロパティがあり、「これは数字であるか」「これは16進数で使うか」「これは大文字か」などの情報が管理されています。
これをRubyの正規表現からも利用することができます。[Rubyの正規表現でサポートされているプロパティの一覧](https://github.com/k-takata/Onigmo/blob/master/doc/UnicodeProps.txt)を見ると、この中に`Emoji`があるのが確認できます。

このEmojiプロパティ（「これは絵文字であるか」ですね）を使って

```ruby
'🍣'.match?(/\p{Emoji}/) # => true
'foo'.match?(/\p{Emoji}/) # => false
```

で概ねうまく判定できるのですが、1つ落とし穴があります。

### Emojiプロパティの中には、1（半角英数）が含まれる

```ruby
1.to_s.match?(/\p{Emoji}/) # => true
```

動作確認をしていて気がついたのですが、半角数字（と、`#*`）はEmojiプロパティの中に含まれています。これは次に述べるUnicodeの仕様が関わっています。

### Unicodeの組み合わせ文字

Unicodeには、既存の文字に続けて特殊な文字を書くことで、1つの別の文字になる組み合わせがあります。

その中の1つが、`1`(U+0031)と`⃣`(U+20E3)を組み合わせた`1️⃣`です。

半角数字と`#*`はこの組み合わせの一部になるため、Emojiプロパティに含まれているようです。

なので、Emojiプロパティに含まれているけど半角数字や`#*`ではない文字を絵文字とみなすことができそうです。

```ruby
'🍣'.match?(/[\p{Emoji}&&[^0-9#*]]/) # => true
'foo'.match?(/[\p{Emoji}&&[^0-9#*]]/) # => false
1.to_s.match?(/[\p{Emoji}&&[^0-9#*]]/) # => false
```

しかし、これもうまく行かないケースがあります。先述の組み合わせ文字です。

```ruby
'1️⃣'.match?(/[\p{Emoji}&&[^0-9#*]]/) # => false
```

なお、他にもUnicodeには複雑な構成の絵文字が存在します（サンプルコードのSTRINGS_WITH_EMOJIにまとめて記載しています）が、これらについてはEmojiプロパティでmatchできるようでした。

### Emoji_Componentプロパティ

`1️⃣`は`1`と`⃣`に分けて判定されますが、`⃣`がEmojiプロパティに含まれないため、先述の正規表現ではmatch出来ませんでした。

https://util.unicode.org/UnicodeJsps/character.jsp?a=20E3&B1=Show

上記のUnicode公式サイトで各文字のプロパティが確認できます。（このサイトめっちゃ便利、教えてくださったima1zumiさん本当にありがとうございます）

Emoji_Componentプロパティには含まれているようです。組み合わせ文字用の文字はこのプロパティでカバーできそうです。

ついでに、`0-9#*`を少し一般化して、ASCII文字とします。

```ruby
'🍣'.match?(/[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]/) # => true
'foo'.match?(/[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]/) # => false
1.to_s.match?(/[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]/) # => false
'1️⃣'.match?(/[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]/) # => true
```

うまくいってそうです。

### バイト長での判定はできるか？

[バイト長が4だったら絵文字](https://qiita.com/yusukeyamane/items/79764e36cc5bd89bc9a4) という判定をしている人も過去にいたのですが、バイト長が4の文字には漢字の一部も含まれるので、少なくとも筆者の今回の用途には不向きのようでした。
RailsにおけるHTTPリクエストについて

<h1>RailsにおけるHTTPリクエストについて</h1>

1.get → 通常アクセス、ページを表示
2.post → フォームを使ってデータを送信
3.patch/put → データを更新を行う
４.delete → データの更新を行う

***
railsのアプリケーション開発を学んでるときに出てきた内容をまとめてみました。
lambdaでquerystringが取得されていない場合の解決方法 by cloudfront

# 状況
- AWSのcloudfrontを利用している。
- API GatewayとLambdaを利用してweb APIサービスを構築している。
- postメソッドをクエリパラメータで利用している。

# 発生したトラブル
- クエリパラメータ(URLの後ろに?で繋げる文字列)を利用してPOSTメソッドでLambda関数を実行したときに、querystringにクエリパラメータの値が入るはずなのに入っていない。
  - 代替ドメイン名、ディストリビューションドメイン名のurlでpostするときのみ、querystringにクエリパラメータの値が入らないという状況。

# 原因
- cloudfrontの`ビヘイビア`の設定の`キャッシュキーとオリジンリクエスト`の設定がされていなかったので、クエリパラメータが取得されなかった。

# 解決方法
`キャッシュキーとオリジンリクエスト`で、`Legacy cache settings`を選択して、クエリ文字列を`すべて`に変更して、保存すると解決します。
  - 少し待ってから、再度swaggerやcurlでpostメソッドを実行後、cloudWatchでログイベントを確認すれば、querystringに値が入っていることが確認できます。(但し、lambdaのコードの中で`print(event)`等をしていること)

![スクリーンショット 2021-11-08 22.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/74ff7124-6fcf-95db-2eaf-a3a471a1df98.png)

# あとがき
- かなりニッチなトラブルです。
- ボディリクエストのpostは問題ないのに、クエリパラメータのpostのみ影響が出るので、注意して下さい。
AWS KMS への IAM ポリシーによるアクセス許可の回避

IAM ユーザのポリシーによっては (例えば`AWSKeyManagementServicePowerUser`が付与されている場合など)、
AWS KMS のキーポリシー上、「キー管理者」や「キーユーザー」に該当のIAM ユーザが含まれていない場合でも
アクセスできてします。


これは、以下の通り、`"AWS": "arn:aws:iam::111122223333:root"`の設定によるもの。


https://aws.amazon.com/jp/premiumsupport/knowledge-center/kms-prevent-access/



```shell-session
{
    "Sid": "Enable IAM User Permissions",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "kms:*",
    "Resource": "*"
}
```

この場合、上記を以下のように`Condition`を設定することで回避できるらしい。
※`AWSKeyManagementServicePowerUser`が付与されていてもアクセス不可能になる

```shell-session
{
    "Sid": "EnableRootAccessAndPreventPermissionDelegation",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "kms:*",
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:PrincipalType": "Account"
        }
    }
}
```
ABC189のD問題の解き直し

## 概要
Atcoder Beginner Contest 189のD問題が、~~（茶色Diffの問題なのに）~~手こずってしまったのと、解説だけだとピンと来づらかったので、自分への戒めも兼ねてまとめてみました。

## 問題
N個の文字列（値は"AND", "OR"のいずれか）が与えられる。
値が`True` or `False`のN+1個の列X（x0, x1, ..., xN）に対して、以下の操作を行った時のXの個数を求める。

- $y0 = x0$
- Siが"AND"のとき、yi = yi-1 && xi
- Siが"OR"のとき、yi = yi-1 || xi
※&&, || はそれぞれ論理積、論理和

## 公式の解説
公式の解説では、答えをf(S1, ..., SN)とすると、

- SNが"AND"のとき
yN-1, xNが一意に定まるため、
$f(S1, ..., SN) = f(S1, ..., SN-1)$
- SNが"OR"のとき
xNがTrueならyN-1がなんでも良く、
xNがFalseならyN-1がTrue（一意に定まる）ため、$f(S1, ..., SN) = 2^N + f(S1, ..., SN-1)$

と場合分けができて、Siに応じて、2**(i+1)を加算していくと言った形で答えが出せる。
この方法は、数学の得意な方々には、簡単に導けるのかもしれないが、自分はそうではないので、DPを使って求めます。

## DPを使った解法
dpの配列をi番目のyがFalseのときのxの個数をdp[i][0]、i番目のyがTrueのときのxの個数をdp[i][1]で管理すると、

- i個目のSが"AND"のとき
yiがTrueなら、x, yi-1もTrue → $dp[i][1] = dp[i-1][1]$
yiがFalseのとき、yi-1がFalseならxはどちらでも、yi-1がTrueならxはFalse
→ $dp[i][0] = dp[i-1][0]*2+dp[i-1][1] $

- i個目のSが"OR"のとき
yiがFalseなら、x, yi-1のどちらもFalse → $dp[i][0] = dp[i-1][0]$
yiがTrueのとき、yi-1がFalseならxはTrue、yi-1がTrueならxはどちらでもOK
→ $dp[i][1] = dp[i-1][0]+dp[i-1][1]*2 $

と状態を定められるので、あとはこれを実装してやれば答えが導ける。

### 実装

```sample.py
N = int(input())

dp = [[0, 0] for _ in range(N+1)]

dp[0][0] = 1
dp[0][1] = 1

for i in range(N):
    s = input()
    if s == "AND":
        dp[i+1][1] = dp[i][1]
        dp[i+1][0] = dp[i][0]*2 + dp[i][1]
    else:
        dp[i+1][1] = dp[i][1]*2 + dp[i][0]
        dp[i+1][0] = dp[i][0]

print(dp[N][1])
```

## 最後に
同じ悩みを抱えている方の少しでも力になれれば幸いです。
また、最近、ブログを開設したので、良ければ[こちら](https://nikenlog.com/blogs)にも遊びに来てください。