OmniAICreator/Qiita-1.07M huggingface dataset:
Graviton2を利用するとFargateがちょっと安く利用できるようなので使ってみた

## はじめに
**Graviton2**を利用すると**Fargate**がちょっと**安く**利用できるようなので，この記事で触る方法について書きたいと思います

## そもそもFargateとは
コンテナ向けサーバーレスコンピューティングの一種であり，Dockerのイメージファイルを作るだけで簡単にデプロイできる便利なサービスです.

公式ドキュメント：
[https://aws.amazon.com/jp/fargate/](https://aws.amazon.com/jp/fargate/)

### Graviton2
**ARMベース**で開発されたAWS独自のCPUのことを指します．
従来の**Intel製**のCPUと比べて比較的安く利用できることから，コスパに優れています．

公式ドキュメント：
[https://aws.amazon.com/jp/ec2/graviton/](https://aws.amazon.com/jp/ec2/graviton/)

### FargateでGraviton2
以前までこのGraviton2はAWSのサービス「**EC2**」でのみでしか利用できないモノでした．
しかしおよそ2カ月前に[AWS Lambdaでも利用できるようになり](https://aws.amazon.com/jp/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/)，そして今回**Fargate**でも利用できるようになりました！！

公式ドキュメント：
[https://aws.amazon.com/jp/blogs/aws/announcing-aws-graviton2-support-for-aws-fargate-get-up-to-40-better-price-performance-for-your-serverless-containers/](https://aws.amazon.com/jp/blogs/aws/announcing-aws-graviton2-support-for-aws-fargate-get-up-to-40-better-price-performance-for-your-serverless-containers/)

## 実際に利用してみる
### 新コンソール画面に移動する
2021年12月05日現在旧コンソール画面にて定義できないため，左上の切り替えボタンを押し，**新コンソール画面**に切り替えます．
（**旧コンソールでできる方**いらっしゃりましたら，やり方教えていただけると嬉しいです。。。）

![console-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/f0bea623-afb4-c0b3-6554-d82af318b33c.png)


### タスク定義を行う
**新コンソール画面**であることを確認（左上）し，タスク定義を行います．

![task-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/6b131539-5eea-3f53-e38f-92abea1ec5d9.png)

ステップ1では通常通りコンテナの設定を行います．

![task-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/e4971dd9-370c-1fb3-2dd3-aef041847b96.png)

ステップ2の**環境**内の**オペレーションシステム/アーキテクチャ**の項目を**Linux/ARM64**に変更します．
これで**Gravition2**を利用する設定が整ったので，タスク作成を行います．

![task-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949737/4e4da39a-751c-7c78-aa2a-d1f1bb3aa624.png)

### 起動する
後は通常通り起動すると**Gravition2(ARM64)**が利用されます！

## 利用料金について
従来のvCPU・vRAMと比べ**およそ2割安く**利用できます
（2021年12月05日時点）

|サービス    |Linux x86（1時間） |Linux Arm（1時間） |どれぐらい安い |
|--------|----------|---------|------|
|vCPU    |$0.05056 |$0.04045  |-19.9% |
|vRAM     |$0.00553 |$0.00442  |-20.0% |

公式ドキュメント：
[https://aws.amazon.com/jp/fargate/pricing/](https://aws.amazon.com/jp/fargate/pricing/)


## 終わりに
今回，Fargateをちょっと安く利用する方法について主に書くことができました！
通常の利用であれば**2割ほど安い**Graviton2を使う価値はあるのではと思います．
Qiita Advent Calendar の RSS を読む

[ラクス Advent Calendar](https://qiita.com/advent-calendar/2021/rakus), 7 日目の記事です。

何のためかは別記事に譲りますが、Qiita Advent Calendar の RSS を取得して処理したくなりました。なので中に何が書かれているのかを読んでまとめてみました。


# RSS とは

> RSS（バージョンによってRich Site Summary, RDF Site Summary, Really Simple Syndicatio）は、ニュースやブログなど各種のウェブサイトの更新情報を配信するための文書フォーマットの総称である。
> （Wikipedia [RSS](https://ja.wikipedia.org/wiki/RSS)より引用）

RSS は要するに XML 文書です。いくつかの異なるバージョンがあり、それぞれ使われている要素に違いがあります。

Qiia Advent Calendar ではカレンダーのトップページ URL の末尾に `/feed` を付けた URL で RSS が配信されています。画面では下の画像のアイコンがリンクになっています。

![ラクス Advent Calendar 2021 のトップページに設置された RSS のリンク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216864/1cd9447e-4786-477f-3cc5-411bb66b1985.png)

# Qiita Advent Calendar の RSS 仕様（推測）

Qiita Advent Calendar の RSS を実際見てみたところ、どうやら Atom フォーマットで作成されているようでした。

Atom フォーマットは `feed` 要素をトップレベルとして、その内部にいくつかの子要素を含むことが出来ますが、Qiita の場合含まれる可能性があるのは以下の 5 種類のようです。

* `id`: そのフィードの URL を含む識別子文字列が設定されています。
* `link`: 必ず以下の二つが設定されるようです。
  - `rel="alternate"` で Qiita トップページの URL
  - `rel="self"` でそのフィードの URL
* `title`: カレンダーのタイトルです。
* `updated`: 最終更新日時。最後にカレンダーに記事が登録された時刻が入っているかと思いきやそうでもないっぽいです。よくわかりません。また 11 月に見たときはタイムゾーン指定子が `Z` だったのですが、今見ると `+09:00` になっています。なぜ。
* `entry`: カレンダーに紐づけられた各記事の情報です。登録された記事数分含まれており、それらは紐づいた投稿枠の日付の降順で並んでいるようです。

## `entry` 要素

`entry` 要素には記事の情報が入っています。フィードのメインコンテンツと言っていいでしょう。Atom フォーマットの定義では `entry` 要素も内部に色々な子要素を含むことが出来ますが、Qiita では含まれる要素とその内容は以下のように限定されるようです。

* `id`: 記事の一意な識別子っぽいですが生成規則はよくわかりませんでした。
* `published`: 紐づいた投稿枠の日の 0 時が必ず設定されるようです。
* `updated`: 記事が実際に投稿されたか、公開された日時のようです。外部の記事の場合、カレンダーに紐づけられた日時かもしれません。
* `link`: `rel="alternate"` で記事の URL を `href` 属性に持つものが一つだけが設定されるようです。
* `title`: 記事のタイトルです。
* `content`: 記事の内容です。Atom の定義上 `type` 属性の値は `text`, `html`, `xhtml` のいずれかとなっていますが、Qiita では以下二つのうちのいずれかが使われるようです。
  - `type="html"`: Qiita に投稿された記事の場合。記事全文が `content` 要素の値として設定されます。`type` は `html` ですが、HTML のタグは取り除かれています。
  - `type="text"`: 外部の URL が紐づけられた場合。`content` 要素の値は固定で「外部記事です」となるようです。
* `author`: 記事の著者情報です。内部に複数の種類の子要素を取りえますが、Qiita では以下の一つしか設定されないようです。
  - `name`: 著者の名前。Qiita ユーザー名が設定されるようです。公開用プロフィールで名前を設定したらそちらが使われるのでしょうか。

# まとめ

ちょっと Advent Calendar の更新状況を機械的に確認したくなったので配信されている RSS フィードの中身を確認し、まとめました。RSS フォーマットはバージョンのこともあって結構複雑ですが、Qiita のものは Atom フォーマットで統一されており、さらに使われている要素も限定的なようです。

そしてよく見ると Qiita のマイページにも RSS のリンクがあるので、こっちも同様の仕様かもしれません。

# 参考

* https://validator.w3.org/feed/docs/atom.html
* https://www.futomi.com/lecture/japanese/rfc4287.html
Ruby ハッシュ　基本を復習

ハッシュの中身は


hash = { キー:値 }


hash = {key:value}


です。


中にいくつかのキーと値があるとして


hash = {key1:value1,key2:value2,key3:value3}


それらをオブジェクト.keysつまりこの場合では、puts hash.keysで


key1

key2

key3

と出力されます。


valueにもあり、puts hash.valuesで




value1

value2

value3

 出力されます。
FancyCarouselView使ってみた

# FancyCarouselView使ってみた

[「Applibot Advent Calendar 2021」](https://qiita.com/advent-calendar/2021/applibot)7日目の記事になります。

## FancyCarouselViewとは
[Haruma-K](https://github.com/Haruma-K)さんが公開したUnityのuGUI用のカルーセルビューです。
https://github.com/Haruma-K/FancyCarouselView/blob/master/README_JA.md
[Fancy Scroll View](https://github.com/setchi/FancyScrollView)をベースに作成されています。

## 開発環境
Unity : 2020.3.1.18f1
※Unity 2019.4 以上対応

## とりあえず使ってみる

[README](https://github.com/Haruma-K/FancyCarouselView/blob/master/README_JA.md)通りにやりながら、細かい点(Prefabの構造,Hierarchy)はデモシーンを見ながらで、基本的な使い方を把握できます。

<b>以下のgifまで(セットアップ、基本的な使い方)は30~40分くらいで完了</b>できました。

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2360873/2bf47ec6-c9fc-5137-4dd9-aa4f0c017cec.gif)


## 使用感
### 実装の柔軟性
[README/応用的な使い方](https://github.com/Haruma-K/FancyCarouselView/blob/master/README_JA.md#%E5%BF%9C%E7%94%A8%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)でも記述されていますが、カルーセルの基本的な仕様を満たせそうなプロパティは簡単に設定出来るようになっています。
スナップアニメーションの秒数や、イージングタイプ、一定間隔の自動スクロールなど簡単に設定することが出来ます。
<img width="400" alt="スクリーンショット 2021-12-07 6.55.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2360873/774691c0-4fa2-8d3c-3012-5aeda1f09315.png">



[README/応用的な使い方](https://github.com/Haruma-K/FancyCarouselView/blob/master/README_JA.md#%E5%BF%9C%E7%94%A8%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)でも紹介されている通り、セルの動きをカスタムしたりと自由度があり、セルの基底クラスのメソッドをオーバーライドしたり、カルーセルの公開されているメソッドを使用することで下のgifの様にボタンでセルの動きを簡単に制御することも出来ます。(CarouselViewクラスの[ScrollToメソッド](https://github.com/Haruma-K/FancyCarouselView/blob/dd0f2f6e5640145c3276a9cb2e0bdeac8ca04908/Assets/FancyCarouselView/Runtime/Scripts/CarouselView.cs#L118))
<b>ボタン制御に変更するのに、およそ10分程度の修正でした。</b>

![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2360873/dcdb996d-15e8-2b13-af82-02d053ac4e08.gif)

### 実装の容易度
実装の柔軟性でも話した通り、ボタン制御を追加したり、画面下の要素を追加したりでも数十分程度で実装、修正出来ました。
カルーセルで満たしたい欲しい機能は揃っており、すぐに実装することが可能かと思います。

## おわりに
スナップの制御など、地味にめんどくさい実装が数ステップで簡単に実装することが出来ました。

以上、[「Applibot Advent Calendar 2021」](https://qiita.com/advent-calendar/2021/applibot)7日目の記事でした。

<br>
Copyright (c) 2021 Haruki Yano
The MIT License (MIT)
https://github.com/Haruma-K/FancyCarouselView/blob/master/LICENSE.md
TypeScriptのライブラリ内で参照されているライブラリを差し替えるちょっとしたTIPS



「株式会社カケハシ x TypeScript」アドベントカレンダーの8日目の記事はライトなTIPSで失礼します。

## 背景

タイトルが意味不明感ありますが、ライブラリ内で `require/import` されているライブラリの差し替え方法を検討します。

私の背景としては `Lambda + Node.js` のバックエンドで `AWS X-Ray` を設定する時に `MySQL` への通信もトレースしたかったのですが、そのためには `MySQL` のクライアントをキャプチャする必要がありました。

以下がキャプチャの方法です。

[公式ドキュメント](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-sqlclients.html)

```typescript
import AWSXRay from 'aws-xray-sdk';
import _mysql from 'mysql';
const mysql = AWSXRay.captureMySQL(_mysql);
const connection = mysql.createConnection(config);
```

この様に、`mysql` モジュールをキャプチャして置き換えたモジュールを利用する必要があります。

ただ、実際に `MySQL` へアクセスするする際には `Sequelize` などのORMライブラリを利用するのが一般的かと思います。私の場合はTS互換の良さから [TypeROM](https://typeorm.io/#/) を利用しています。しかし、`TypeOrm`は内部で `mysql` パッケージを `import` しているのですが、そのパッケージを差し替える機能は提供されていないため、どの様に上記のキャプチャー作業をここなったら良いか悩んだのがきっかけです。

## 検討したこと

最初に検討したのはモジュールのモックです。`Jest`などテストフレームワークでモック+スパイ関数などはよく利用するかと思いますので気軽に `mysql` パッケージの置き換えができないか？と考えました。
[TypeORMのissue](https://github.com/aws/aws-xray-sdk-node/issues/272) に私と同じ課題に当たっている方がおり、主な回答としては `module-mock` というライブラリを利用する方法でした。現在は `proxyquire` というライブラリになっているのですが、`Node.js`の `require` をプロキシしてモジュールの置き換えを行うツールの様です。しかしながら、READMEでも言及がある通り、あくまでテストコード開発での利用が想定されております (モックなので当然ですが)。テスト用のツールを本番系のコードの混ぜるのは気が引ける部分があり、モックでの対応は断念しました。

## 解決案

そこで、`tsconfig.json` にある `Path Alias` の機能で `mysql` パッケージの参照先を自分のコードに置き換えることはできないかと考えました。

tsconfig.json

```js
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "mysql": [
        "./src/mysql.ts"
      ]
    },
    // ...
  }
}
```

この様にすることで、`import mysql from 'mysql';` で読みこまれるパッケージが `node_modules` の中ではなく、自作した `src/mysql.ts` に置き換わります。 ただし、エイリアスの解決には, `Webpack`や`esbuild` でバンドルするか、[module-alias](https://github.com/ilearnio/module-alias) などを利用して解決する必要があります。

次に `src/mysql.ts` の中では元々の `mysql` を読み込んで、キャプチャされた `mysql` モジュールをエクスポートする必要があります。これを実現するためには、パッケージを別の名前でインストールできる機能があると便利ですが、`npm` の Version6 以降ではインストールするパッケージにエイリアス名を指定することができきます。

今回の例でいくと、

```bash
npm install original-mysql@npm:mysql
npm install -D @types/original-mysql@npm:@typed/mysql
```

を実行するとpackage.jsonにはこの様にインストールされます。

```js
{
  "devDependencies": {
    "@types/original-mysql": "npm:@types/mysql@2.15.19",
    // ...
  },
  "dependencies": {
    "original-mysql": "npm:mysql@2.18.1",
    // ...
  }
}
```

最後に `src/mysql.ts` の実装ですが、元々のmysqlパッケージを読み込んで、`X-Ray` にキャプチャされた `mysql` モジュールを提供します。

```typescript
import { AWSXRay } from '@common/aws/xray';

// X-Rayでラップするためにmysqlモジュールを変更する
import originalMysql from 'originalMysql';

export const capturedMysql = AWSXRay.captureMySQL(originalMysql);

// @ts-ignore
module.exports = capturedMysql as typeof originalMysql;
```

以上より、TypeORM内で参照される `mysql` モジュールが、`X-Ray` でキャプチャされた物に差し替えることができました。

## まとめ

今回の解決方法は結果的に他のツールに頼らず、`TypeScript`と`npm`だけで実現できました。 `X-Ray + TypeORM` は一例ですが、さまざまな理由でライブラリ内の参照を置き換えたい場面があると思います。

悩んだ時の一助になれば幸いです。
[Datadog] 小粒なTips集・ダッシュボード編

Datadogでは、モニタリングプラットフォームとして、データの収集、整理、通知などが重要になりますが、その中でも分かりやすく情報を整理しておけるダッシュボードは、是非とも使いやすくしておきたいところです。そのための小粋なTipsを探していたのですが、今回は小粒なTipsということでいくつかご紹介します。

# テンプレート変数

ダッシュボードを作り始めると、似たようなパターンのものが複数できてきます。複製して少し変えたものがたくさんあって、どれがどれだかわからなくなります。そのような似たような複数ダッシュボードを作らないための強力な機能が、テンプレート変数です。

ダッシュボードのグラフなどのウイジェットは、どのホストのメトリクスかといったフィルタリングやグルーピングができますが、そこに変数を使って、切り替えながら見ると、あるリージョンだけの情報やあるチームだけの情報など、絞り込みの条件を変えながら見ることができます。ダッシュボードはあくまで1つなのでメンテナンスの手間や、ユーザーのアクセスの良さも得られます。

参考ブログ（英語）：https://www.datadoghq.com/ja/blog/template-variable-available-values/

上記ブログからいくつかスクリーンショットを引用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/4148173d-afb7-afc6-4d8f-9e20e44edbca.png)
このように、テンプレート変数を設定すると、ダッシュボードの上部に切り替えのドロップダウンリストが表示されます。ここで見たいスコープを選ぶと、絞り込まれたデータが表示されます。
![quick_creation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/d404b49f-9193-1289-9a6b-8a66a29844d4.jpeg)
テンプレート変数の設定もGUIでできます。変数名を決めてタグに紐付け、デフォルト値や選択可能な値のリストを設定します。あとはそれぞれのウイジェットに変数を埋め込んでいくか、"Add All"で一括追加します。（以前はこの一括追加がなくて面倒でした、、）あとは、左端をつまんで並べ替えも可能です。

テンプレート変数はとても便利なので、ぜひ活用してダッシュボードを統合していきましょう。

# Quick Graph

あるメトリクスのグラフを、ちょっと見てみたいという時のために、落書き用のダッシュボードを持っている方は多くいらっしゃると思います。Quick Graphを使えばその必要はなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/59781d79-0480-9c53-0cc9-6c419f3328b2.png)
DatadogのWebコンソールのどこにいる時でも、`g`をタイプするとQuick GraphのUIが現れます。メトリクス名やフィルタリング、計算式などを追加してグラフを見やすく整理したら、`Export`や`Copy to Clipboard`でダッシュボードにコピーできます。

# Query Valueウイジェットの画像表示

Query Valueは、四角の中にメトリクスの値を表示しておくウイジェットですが(左)、時々値に応じて日本語を表示したいという要望をいただきます(右)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/0158b0f8-0c19-a945-7820-1f34adbc797e.png)
これは直接的には実現できないのですが、画像を表示させる設定があり、あらかじめ日本語を含む画像を用意しておいて表示させることで、かなりそれらしいものができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/08cd395f-9049-317d-f6a0-7cf374ac6a29.png)
かなり楽しいダッシュボードも作れそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/0851258a-df5b-4349-c6df-3823de476f4a.png)

# ゴミ箱機能

これまで、ダッシュボードを削除するとそれっきりだったのですが、30日間は復元できるようになりました。ダッシュボードの`Recently Deleted`のリストから戻せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/a8175dc8-c67d-bfa8-3fd8-02da34a6c0b3.png)

# Macでタイトル編集時に、日本語確定で保存になってしまう問題

意外とフラストレーションが溜まりがちなのが、Macでウィジェットのタイトルなどの文字列フィールドを編集する時に、日本語確定のつもりでリターンキーを押すと、保存操作になってしまって一段前のレベルに戻ってしまうことです。英語だと便利なこの機能にイラッとされた場合は、リターンキーの代わりに`Control-m`で確定してみてください。おそらく期待通りの挙動になると思います。
これは、Emacs時代の知識でリターンキー＝C-mということで、macOSは割とEmacsバインディングが実装されているので試したところ動いたというものです。Appleのドキュメントには見当たらず、正式なバインディングではないかもしれないので、使えなくなったらごめんなさい。

以上小粒なTips集のダッシュボード編でした。Happy Datadogging!
【備忘録】デプロイ関連でエラーが起きたとき(反映されない場合も)の対処法

## デプロイ時に何らかの原因で反映がされない場合の対処法
### ①unicorn を見てみる
本番環境でunicornを見てみる。

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
```

```
ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill <確認したunicorn rails masterのPID>
...
```

消えてたらOK(1つになってたらOK)

```
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
...
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```

## ②git で戻す
根本的な解決ではないが、戻るのも手。
参考：https://qiita.com/rch1223/items/9377446c3d010d91399b

1．戻りたいところのIDを確認する

```
$ git log
```

2.下記をうつ

```
$ git reset --hard [コミットid]
```

3．pushする(1こ1こ打って)

```
$　git status

$　git add .

$　git commit -m ""

$　git push -u origin master
```

4．pushに成功しないかもしれない

```
## 強制Push
$　git push -f origin master
```
あまり良くないらしいですが強制Pushしてしまいました。
個人開発ならギリOKらしいです。
gsutil で特定の拡張子を持つオブジェクトのみを rsync する方法

この記事は [Z Lab Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zlab) の8日目の記事となります。

## TL;DR

以下は `.rpm` という拡張を持つオブジェクトのみを rsync する例なのでユースケースに応じて書き換えてください。

```bash
$ gsutil rsync -x '^(?!.*\.rpm$).*$' src_url dst_url
```

## 解説

`gsutil ls` や `gsutil cp` では `*` や `?` などの[ワイルドカード](https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames)が使えますが、`gsutil rsync` では以下のように src_url として単一の URL しか指定することができません。

```bash
$ gsutil rsync -r "gs://my-bucket/*.rpm" my-data
CommandException: Destination (gs://my-bucket/*.rpm) must match exactly 1 URL
```

これを解消するために `-x` オプションを使用して、不要なオブジェクトを除外するというアプローチを多くの方が紹介していますが、不要なオブジェクトが増える度にその命名に合わせてオプションを追加するのは面倒です。

https://stackoverflow.com/questions/69108104/gsutil-rsync-commandexception-destination-must-match-exactly-1-url

なので、先述のコマンドのように `.rpm` という拡張子を持つオブジェクトのみを rsync したいケースでは、以下のように `-x` オプションで **`.rpm` という拡張子を持っていないオブジェクトを除外する** という使い方をした方がメンテナンスもしやすいかなと考えました。

```bash
$ gsutil rsync -r -x '^(?!.*\.rpm$).*$' gs://my-bucket my-data
```

`-x` オプションでは Python の正規表現がサポートされている仕様で、上記の正規表現については以下のブログを参考にさせてもらいました。

- https://uxmilk.jp/50674
- https://qiita.com/hiroyuki_mrp/items/29e87bf5fe46de62983c#%E8%BF%BD%E8%A8%98%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E5%90%A6%E5%AE%9A%E7%9A%84%E5%85%88%E8%AA%AD%E3%81%BF

## 参考資料

- https://cloud.google.com/storage/docs/gsutil/commands/rsync
忙しさは誰のせい？改めて考えるタスクの重要度と緊急度

<h1>タスクに追われがちなあなたへ</h1>
持っているタスクが多すぎて何から手を付けていいかわからない。タスクの締切が短くて毎日忙しい。こんな経験をしている方はいらっしゃいませんか？

もしかするとそれ、タスクの管理方法を見直せば解決できるかもしれませんよ？

<h1>重要度と緊急度、意識してますか？</h1>
お仕事を整理する上で最初に意識するのはたったの2つ、それは仕事の<b>「重要度」</b>と<b>「緊急度」</b>です。誰しも一度は聞いたことがある単語かとは思いますが改めておさらいしてみましょう。

まず<b>「重要度」</b>から。これは会社やチーム、クライアントに対してどれだけ価値のあるタスクかを示したものです。<b>「重要度」</b>の高いタスクほど価値のあるタスクと考えることができます。

次に<b>「緊急度」</b>です。これはタスクの締め切りや納期を表すものです。<b>「緊急度」</b>の高いタスクほど締切が迫っていると考えることができます。

ではこれらの情報をもとに実際に仕事を分類してみましょう。

<h1>持っているタスクを分類しよう</h1>
<b>「重要度」</b>と<b>「緊急度」</b>を意識することで業務を4ついずれかに分類することができます。それぞれの高い、低いについてはひとまずあなたの主観で構いません。まずは今お持ちのタスクをそれぞれのグループに当てはめてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2174644/795713f8-e665-0ace-49ad-18fdd0ac3aab.png)
そして、図をわかりやすく説明するため、それぞれのカテゴリーをA～Dのグループに区分します。
<ul><li>重要度が「高」、緊急度が「高」をAグループ</li><li>重要度が「高」、緊急度が「低」をBグループ</li><li>重要度が「低」、緊急度が「高」をCグループ</li><li>重要度が「低」、緊急度が「低」をDグループ</li></ul>

如何でしょう？ あくまでも私の経験上ではございますが、タスク量で悩んでいる人の多くは整理してみると<b>「Cグループ」</b>のタスク数が多いことをよく目にします。

もしこれに該当する方は、<b>「Cグループ」</b>の作業に対してあまり質を重視しすぎず、ある程度時間を決めて取り組むことで時間を確保したり、場合によってはタスク納期の再検討を提案してみてもいいかもしれません。

<h1>大事にするグループを意識しよう</h1>
タスクの整理ができたら最後に大事なグループのタスクを意識してみましょう。
毎日の業務に追われていると、どうしても「Aグループ」と「Cグループ」のタスクに目が行きがちになり、大事なタスクの一つである<b>「Bグループ」</b>が疎かになりがちです。

業務を効率的にすすめるため、CやDグループに割くタスクの時間を減らしつつ、<b>「Bグループ」</b>のタスクに時間を割けるようにすることで今まで以上の成果を出せるかもしれません。

<h1>最後に</h1>
今回はタスク管理における、基本的だけど大切な「分類」についてをまとめてみました。
何だ簡単そうじゃん。と思われるかもしれませんが、毎日増えていくタスクをこまめにグルーピングし管理するのは意外と大変です。
知らなかった方はもちろんですが、既にこの手法をご存知の方でもし実践していらっしゃらないのであればこれを機会に試してみては如何でしょうか。

ちなみに余談ではありますが、筆者はタスクを付箋書いた後ホワイトボードに貼り付けた位置でA～Dのグループ分けをしていたことがあります。もし今日からやってみようという方がいらっしゃれば是非お試しください。
1時間でMavenプロジェクト作成してみた（１時間シリーズ第２弾）

まずは茶番から
####１時間でEclipseマーケットプレイスをインストールする####

新しいパソコンにEclipseをインストールした。しかし、なんとそのEclipseには私の大好きな機能「Eclipseマーケットプレイス」が使えない状態だったのだ。
これではTomcatとかSTSとか使えない（まぁ、デフォルトでついているので使えるが）ので、
「Eclipseマーケットプレイス」をダウンロードしてみることにした。

**用意するものはこちら**
・Eclipse（今回はEclipse 2021年版を使用する）

まずは、本当に使えないかどうかの確認を……

![rapture_20211207092727.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626652/1ebcf35c-7230-feba-9a1a-39933a61d948.jpeg)

……はい、というわけで1時間チャレンジ無事に成功しました。
（なんで入ってたんだ！？怖！？）

あっ、ちょっと殴らないで、石とかも投げないで！！

ここからが本題
#1時間でMavenプロジェクトについているJUnitのテストをやってみた#

1. ファイルの新規のその他のMavenからMavenプロジェクトを選択する

1. 「シンプルなプロジェクトの作成」にチェックを入れて、次へを選択する

1. 新規Mavenプロジェクトに以下を入力する
 グループID：組織名とかドメイン名とか。ネームスペース的なイメージ。
 アーティファクトID:プロジェクト名。グループIDが同じで同じ名前のプロジェクト名は存在しない
 とりあえず、今回はグループIDを「com.sample」でアーティファクトIDを「SampleMaven」にしてと。あとはそのまま完了ボタンを押す！！！！
![rapture_20211207094146.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626652/a7b40145-9d88-296f-1359-192b6ba0bc91.jpeg)

Mavenプロジェクトが作成できました！！！
あっ、まだ時間ある。
それじゃぁ、作成したMavenプロジェクトにクラスを作成して実行して確認してみよう
1. pom.xmlにJUnit(テスト用のフレームワーク)を追加する。（Maven Repositoryで探してみてね）
2. src/main/javaディレクトリにハローワールドクラスを作成する
3. src/main/testディレクトリにテストクラスを作成する

```java
public class HelloWorld {
	public static void main(String args[]) {
		System.out.println("Hello World");	
	}
}

```

実行結果

```
Hello World
```



```java
import static org.junit.Assert.*;

import org.junit.Test;

public class SampleTest {

	@Test
	public void test() {
		fail("未実装");
	}

}

```

実行結果

![rapture_20211207100042.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626652/53592fc5-6d47-1a2c-1349-989adbf55c49.jpeg)


よし、これで終わり。
次はもう少しグダグダにならないように頑張ろう
Railsで使えそうな処理のメモ書き

気が向いたらメモを追加していく

### モデルクラス一覧取得
ファイル名からクラスを取得してモデルのやつだけ集める（参考[^1]）

```.rb
constants = Dir.glob(File.expand_path("./app/models/*.rb", Rails.root)).map do |f|
  name = File.basename(f, ".rb").camelize
  Object.const_get(name)
end
models = constants.filter |constant| do
  constant.instance_of?(Class) && constant< ActiveRecord::Base && !constant.abstract_class?
end
```


[^1]: https://kitak.hatenablog.jp/entry/2013/11/10/195254
postgreSQL インデックスを使ったらどうなる？

# やりたいこと
インデックスを使うと、どうなるのか実験をします。
前の記事で、インデックスをつかわない場合を記事にしたため、差を見てみます。

# 前提
・postgreSQL1000万件のデータをinsertしたテーブルを使います
・データベースはAWS RDS PostgreSQLを使います。
　(インスタンスタイプはt3.micro)
・PostgreSQL 13
・**インデックスを作ります！！**
　(pgAdmin 4でインデックス作ったら1分以上かかりました)

以前の記事
　postgreSQLで1000万件データをいれてみる
　https://qiita.com/Tarou2000/items/40bffbb4fbb5c466740b

# 実験する内容
(1).以下のように1000万件から1つのデータを取得

```sql:SQL
select * from test
where id = 'ffff73bc-f31b-433d-b57d-54b88a814c5b'
```

(2) (1)を100回selectしてみます。

# 結論
(1)について
　SQLの完了まで0.066ms。
　やはり早い。

(2)について
　連続でSQLを実行してもCPU使用率はかわらず

# (1) select 1回の処理時間

・実行時間はこちら
　Excution Time: 0.066ms
・Index Condなので、インデックスを使ってます
　データにアクセスせずデータの場所を見つけ出してます。
![スクリーンショット 2021-12-07 0.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681795/9b766493-3461-d25a-bddf-6dcde5486b2e.png)

# (2)のselectを100回実行したときのCPU
100回順番に実行。プログラムを実行開始して終わるまでに1秒前後かかりました。
CPU負荷は変化なし。
![スクリーンショット 2021-12-07 5.08.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681795/e89b869d-e788-acec-90bf-fbc394549e85.png)




# インデックスとは
本の索引ページと同じですね
本文がデータで、索引ページがインデックス。
例えばこのデータは、60ページにあると書いてあるので、それを参照してデータを取得する感じです。
ただ、ディスク容量とのトレードオフではあります。

1000万件のデータで、
データが、805MB
インデックスが563MB
インデックスでかい！
が使うしかない。

![スクリーンショット 2021-12-07 0.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681795/8c70a873-7a7b-8f3a-d285-240ef83b8efd.png)


# 結果
というわけでインデックスを使いましょう。

# 次
次はさらなる高速化を目指して、パーティーション化を行います

# 参考
PostgreSQL - テーブルとindexのサイズを確認する
https://blog.y-yuki.net/entry/2017/07/22/000000
18桁のSalesforceレコードIDを含むカスタムレポートを作成

回答の中で紹介されていた

[18桁のSalesforceレコードIDを使用してカスタムレポートを作成/更新する](https://support.accountingseed.com/hc/en-us/articles/360041461553-Create-Update-Custom-Reports-using-the-18-digit-Salesforce-Record-ID)

元の質問
[連絡先の更新の問題](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Dy6Ld)
TableauCRMが有効になっているDeveloperEdition組織でのトラブル（同じメールアドレスで登録できない）

多分、TableauCRMに限らず特別対応のDeveloperEdition組織でも同じ対応で解決できると思う。


試した人がいました。
いいねぇ。

1. 私自身のメールアドレスとユーザー名は同じです（機能しませんでした）
2. 私自身の電子メールと別のユーザー名で（**それはうまくいきました**）
3. 別の電子メールと一意のユーザー名で（**それは機能しました**）

英語でないのでちょっと困った
[Trailmix 8-Tableau CRM >>>アクティビティで要求されたとおりに、TableauCRM対応のDeveloperEdition組織にサインアップします](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000DyJSnSAN)

[Einstein Prediction Builder TrailheadPlaygroundにサインアップする](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000E9TG3)


+ [Trailheadを使用したTableauCRMについて学ぶ](https://help.salesforce.com/s/articleView?id=sf.bi_tutorials.htm&type=5)
+ [Signing Up for CRM Analytics-Enabled Developer Edition - Error Message re email already in use.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J7YeFSAV)
+ [Start Exploring CRM Analytics module](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pf9Ed)

:::note info
ユーザー名はメールアドレスと異なっていても大丈夫です。
同じ電子メール アドレスを使用して、別のユーザー名を使用してみてください

It is okay if the username is different from the email address.
Try using the same email address but different username.
:::

+ [上記の話とメールをクリックしても検証できないとの合わせ技](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmCP9)

#  Sorry, we can't enroll you in a Salesforce Developer Edition account because the email address you entered is already in use. 

よく分からん
+ [Issue spinning up a new org](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NDTGS)

:::note
I first received the error email as mentioned above, and then a few minutes after I posted this, I got the 'verify your account' email. Not sure why I got an error first and then the verify account email later. 
:::

+ [How do I bypass a registered email error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgBJ9SAN)

同じ現象

# We can't find the Salesforce CPQ managed package. Make sure you select the right org from the Hands-on Challenge picklist

+ [Step not yet complete in Empathetic Impala Playground We can't find the Salesforce CPQ managed package. Make sure you select the right org from the Hands-on Challenge picklist](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CFxfwSAD)

説明しても全く理解されませんねぇ。私の英語では通じないみたいです（100%グーグル翻訳なのですが...）ベストｱﾝｻｰを見ても私が言っていることと同じなのですが、SFの人でないので信用してもらえないんですかね。

# 何かよく分からない

+ [開発者組織にサインアップするために3つの異なる有効なメールアドレスを使用しようとしましたが、毎回エラーメッセージが表示され続けます - 申し訳ありませんが、入力したメールアドレスはすでに使用されているため、Salesforce Developer Editionアカウントに登録できません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Kgd5i)

:::note
しばらくして確認メールが届き、組織にサインアップすることができました。最初のエラーメールはバグだったのかもしれません。
:::
第1回個人開発プロダクト供養~kotobanote~

# はじめに
この記事は[LIGTHzアドベントカレンダー 2021](https://qiita.com/advent-calendar/2021/lightz)の7日目の記事です。

アドベンドカレンダーは25日埋めないといけないのですが、なかなか埋まる人数もおりませんので、空いた合間合間を、わたしが個人で開発したあまたの埋没プロダクトの紹介で埋めていきたいと思います。

# [kotobanote](https://github.com/KTaskn/kotobalog) <- GitHubに残骸があります
kotobanoteは、小説、マンガ、アニメのセリフ、偉人の名言、先生の教えetc、自分のココロに響いたコトバをメモしてシェアしようというコンセプトで開発したサービスです。

半年ぐらいちまちま運用したのですが、当時勤めていた会社の同僚２名に１度ずつ試しに投稿してもらえた程度でまったく日の目を見ずサービスクローズとなりました。

私自身が、日頃、"いいな！"、"これはいつか使おう!"と思ったセリフをメモしているので、それをサービスとして展開すれば意外とユーザーがいるのではないか？と思って開発をはじめたのでした。
実際、自分自身は最終的に50投稿ぐらいしていたヘビーユーザーであった。

同僚がTwitterフォロワー数千のアルファエンジニアで、ツイートしてもらった日は少しばかりアクセス数も伸びたのですが、登録数はゼロだったので、サインアップ周りのUXに何か問題があったのかもしれません。

## 構成
* Docker
    * さくらのVPSが一番安いのでDockerにぜんのっけして docker-compose up が基本スタイル
* MySQL
    * PostgreSQLつかいがちなので、たまにはと思ってMySQLにした。
* Ruby on Rails
    * pythonつかいがちなので、Rails勉強しようと思ってRailsにした。Ruby良い。
* Vue
    * いま流行のSPAを使った最初のプロジェクトだったかもしれない。このときの知識が今の開発に活きている

Dockerだとか、Vueは当時の仕事で少し使いつつも、なんとなくで使っていたところがあったので、自分でガッツリ使ってみるいい機会になった覚えがある。

## 今後の展望
kotobanoteは、自分自身は結構使っていたのでカタチをかえてまた復活させたいサービス筆頭である。
みなさんもココロのメモもってますよね？それを共有したいのかどうかなんだろうか。
Alibaba Cloud WAFのデプロイリージョンを確認する方法

この記事は [Alibaba Cloud アドベントカレンダー2021](https://qiita.com/advent-calendar/2021/alibabacloud) 7日目の記事です。

Alibaba Cloud WAFにはインスタンスとリージョンの概念があります。
コンソール上では「中国」か「インターナショナル」のどちらかしか表示されませんが、API(CLI)で確認すると実際のデプロイリージョンが確認可能です。

---
# 概要
Alibaba Cloud WAF のAPI(CLI)を利用してリージョンを確認する。
確認する際には、中国とインターナショナルでエンドポイントが異なるので注意してください。

```bash
# 中国のWAFインスタンス情報を表示
aliyun waf-openapi DescribeInstanceInfos --endpoint wafopenapi.cn-hangzhou.aliyuncs.com

# インターナショナルのWAFインスタンス情報を表示
aliyun waf-openapi DescribeInstanceInfos --endpoint wafopenapi.ap-southeast-1.aliyuncs.com
```


## 背景
WAFを購入する際には、中国かインターナショナルかを選択します。
ちなみにこの２つのリージョンの選択肢は地域だけの違いではなく、費用も機能も異なっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308973/b83f9115-4953-75f5-bf88-a90a80d92f6d.png)

重要な点は、**WAFインスタンスの購入時ではなく、最初に保護するドメイン(もしくはIPアドレス)を設定した際に自動的に最寄りのリージョンにWAFインスタンスがデプロイされる点**です。

例えば、インターナショナルのWAFを購入して最初に東京リージョンのECSを保護する設定をしたらそのWAFインスタンスは東京リージョンにデプロイされます。
または、最初に香港リージョンSLBを保護したらそのWAFインスタンスは香港リージョンにデプロイされます。
しかし、どこのリージョンでWAFインスタンスがデプロイされたのかをコンソールから見る方法がありません。
そこで、先ほどのAPI(CLI)から確認をしてみてください。



```bash
#　インターナショナルのWAFのインスタンス情報から香港リージョンにデプロイされていることが分かる
{
        "InstanceInfos": [
                {
                        "EndDate": 1639152000,
                        "InDebt": 1,
                        "InstanceId": "waf_intl-sg-xxxxxxxx",
                        "PayType": 1,
                        "Region": "cn-hongkong",
                        "Status": 1,
                        "SubscriptionType": "Subscription"
                }
        ],
        "RequestId": "EB6141D2-B90
```


## その他WAFの注意点
Alibaba Cloud WAF にはハマリポイントが結構ありますので、おまけとして注意点も書いておきます。


- WAFインスタンスのリージョンを変更するには、Alibaba Cloudにチケットでリクエストが必要
- WAFインスタンスはAlibaba Cloudアカウント１つにつき、中国に１つ、インターナショナルに１つまで購入可能
- LogService連携は高額になるので注意
- WAFの保護対象ドメインは個別のサブドメインでも*(アスタリスク)でのワイルドカードでも設定できるか、個別のサブドメインで設定しないと個別に分析ができない


以上です。
明日は８日目になります。
コーチングサークルのご紹介

# はじめに
私が所属する「（株）アットウェア」 の Advent Calendar 7日目の記事です。

今年の僕のアドカレを書く動機は、2021年度の新入社員である @kazuhito_nakayama さんからいただきました。

@kazuhito_nakayama さんから「就職活動中の学生は、企業のHPやアドカレをよく見たりするものなのです！その学生さん達にアットウェアのことを知ってほしいのです（why）。だから、今年もアドカレを立ち上げました（what）」と、キラキラした眩しい瞳でお声がけいただいたのが、僕が今年のアドカレを書こうと思った動機です。

そう言えば、[誰か](https://www.ted.com/talks/simon_sinek_how_great_leaders_inspire_action?language=ja)も仰ってましたよね。

「人はwhatではなく、whyに動かされるものだ」

的なことを。

っということで、ちょっと話がズレた気もしますが... キラキラした新入社員の方に、初老に差し掛かったおじさんの心が揺さぶられたというお話でした。

そんなかんなで、この記事では「就職活動中の学生さん」向けに、アットウェア内での取り組みを1つご紹介したいなと思います。

# コーチングサークルが出来たきっかけとか
アットウェアにはいくつかのサークル的な活動があります。その中の一つが立ち上げ時期から私も参画している「コーチングサークル」です。

@kazuhito_nakayama さんを見習い、why 的なことからご紹介してみようと思います。

一番最初のキッカケは、とある社内メンバーの chat への下記のような書き込みでした。

> oh...
> コーチによりますねってめっちゃ答えてしまいそう
> https://blog.tinect.jp/?p=66220

上記の投稿に対した...

> 1兆ドルコーチ、読んでみたい

とか

> 読んだけど面白かったー、感想会とかやってみると面白いかも

![51Yc+Ga6xmL._SY344_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55853/7e5c2402-c8d7-1448-eea2-73ddfacabfc4.jpeg)

的なレスが付き、「じゃぁ、1兆ドルコーチの読書会でもやってみますか？」的なノリで始まった試みが、現在の「コーチングサークル」が出来たキッカケです。

では、続いて「１兆ドルコーチの読書会」が、どういう経緯で「コーチングサークル」と化したのか？です。

まず、1兆ドルコーチを読破した後のふりかえりで、コーチングの練習をしてみよう。ということになり、半年間ぐらいコーチとクライアント役に分かれて、週イチでコーチングセッションをしていました。

次に、その活動の「ふりかえり」で、次のような感想が共有されました。Jamboardというホワイトボードで共有された感想の一部をご紹介します（僕は、Jamboard も好きだけど、Miro とか Muralが好きです）。

## コーチングを学びたいと思う理由は？

* コーチングを学ぶと、女子にモテそうと思った
* （過去に所属していた会社で）指示を出すだけでは限界を感じていたからコーチングを学びたいと思った
* 人々の助けになりたい
* コーチングを普段の業務に活用したい
* アジャイル型の組織を作るノウハウを習得したい
* この場をキッカケにHRTをATWに広めたい

## 集まったメンバーで、次に何をしてみる？
* （もう少し、コーチングについてちゃんと学びたいから）コーチングバイブルの読書会をしてみる
* （読書で学んだことを実践できるようにするために）キリがいいところまで読んで学んだスキルを、コーチングセッションとして練習し、また次の塊的なところを読んで練習を繰り返す

![51Lqa4ZQnCL._SY291_BO1,204,203,200_QL40_ML2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55853/5d15b301-4a54-f49d-e739-273347523eeb.jpeg)

# コーチングサークルで、今、やっていること
ってな感じで「コーチングバイブルを読みながら、学んだことを実践しながら、コーチングへの理解を深めていこう」的な雰囲気で今の「コーチングサークル」の形になりました。

今は「コーチングバイブル」の3章まで読み終え、ここまでで学んだことを踏まえて下記のコーチングスキルを2人1組のペアに分かれて練習している最中です。

* 傾聴（内的傾聴、集中的傾聴、全方位的傾聴を使い分けてみて、その違いを共有する感じの練習）
* 俯瞰スキルの練習
* 比喩スキルの練習
* 認知スキルの練習



# 終わりに...
今は、6名が週に一回、1時間の時間枠（月曜日の11:30-12:30）で集まって活動しています。

メンバーの内、3名（僕も含む）は「もっと本格的にコーチングを学びたいのだ！」と、[The Coach Academy](https://thecoach.jp/)というコーチングスクールでもコーチングを学んでいたりします。

ここまででご紹介させていただいたとおり、「コーチングサークル」は、１兆ドルコーチを読んで見る → コーチングセッションを実践してみる → コーチングバイブルを読みながら実践してみる（今、ここ）と、いろいろな実験をし、その実験結果をふりかえり、次に繋げていくという感じで活動しているので、この次は何をすると僕たちは選択するのだろう？と、今から次の実験が楽しみだったりします。
チャレンジ！IchigoJam くもんのプログラミングワーク①②を動画にしてみた

#くもんのプログラミングワーク
[くもん出版さんの本２冊](https://www.kumonshuppan.com/programming/lineup-programming/?c1[]=63&ze=2)をひとつのセクションごとに動画にしてきました。
このページはそれらのまとめです。

- この本は、IchigoJamの開発者の[福野泰介さん](https://fukuno.jig.jp/)に紹介してもらいました。
- プログラミングワーク①については　[このページ](https://sites.google.com/view/prokura/ichigojam)にまとめています。
- 【おすすめポイント】IchigoJam本体がなくても、[WEBブラウザでBASIC](https://fukuno.jig.jp/app/IchigoJam/)の勉強ができます！
- 以下に、より実践的なプログラミングワーク②を私なりに再生リストというカテゴリでセクションに分けてみました。

#初級
ここには、プログラミングワーク②の０１〜０７までを収録しています。

- [【YouTube再生リスト】プログラミングワーク②：初級](https://www.youtube.com/playlist?list=PLPKfPNY87vSg8em1r9kyM2guf1_Gw5FmI)
- 主にワークブック①の復習的な内容
- 基本コマンドを使ってキャラクターベースのゲーム作成ができる

#初中級
ここには、プログラミングワーク②の０８〜１２までを収録しています。

- [【YouTube再生リスト】プログラミングワーク②：初中級](https://www.youtube.com/playlist?list=PLPKfPNY87vSjTaZmnPfRM7_18Zoz-5kYU)
- 変数を使って動きのあるゲーム作成ができる

#中級
ここには、プログラミングワーク②の１３〜１９までを収録しています。

- [【YouTube再生リスト】プログラミングワーク②：中級](https://www.youtube.com/playlist?list=PLPKfPNY87vSi1oDcRTR5VnrrsCuJNTH6q)
- クロックを使って時間に応じた処理ができるプログラムを作成できる

#上級
ここには、プログラミングワーク②の２０〜２８までを収録しています。

- [【YouTube再生リスト】プログラミングワーク②：上級](https://www.youtube.com/playlist?list=PLPKfPNY87vSiv47s2mal876dB8tnSP3WK)
- キャラクタをカーソルキーで移動させ、当たり判定を行うゲーム作成ができる

#実践
ここには、プログラミングワーク②の２８〜３７までを収録しています

- [【YouTube再生リスト】プログラミングワーク②：実践](https://www.youtube.com/playlist?list=PLPKfPNY87vSgUZHNVNnzan4sOWoXzTFH7)
- 複雑な条件判断、繰り返しループ、サブルーチンをつかって、実践的なプログラミングができる


## 編集後記
- 2021/03/13 IchigoJam関連動画の撮影開始
- 2021/06/12 ワーク②についての動画作成開始
- 動作作成にあたっては、くもん出版さんに連絡をしてあり、動画をさくせいしてることは認知いただいています。
- [簡単マイコン教室のTopページ](https://qiita.com/tmdoi/items/61be444e1879912aa2a5)
機械学習で画像を作りたかった　～2.サイズを加工する～

前回の記事はこちら
[機械学習で画像を作りたかった。～1.画像を集める～](https://ravito.hatenablog.com/entry/2020/07/16/072522?_ga=2.74114578.1269552960.1594849626-1805230172.1576318605:embed:cite)

今度はAIが学習しやすいように、サイズを256✗256に加工する。

[GANでピカチュウを描いてみる - Qiita](https://qiita.com/hideki/items/4de4928236ca15152c18#%E7%94%BB%E5%83%8F%E3%81%AE%E5%88%87%E3%82%8A%E5%87%BA%E3%81%97:embed:cite)

前回同様こちらのブログに記載されたコードを、
eclipseを使用して作ったPythonファイルに書いた。

ここで、以下の文章が「eclipseには存在してないですよ」と下赤線でエラーを吐かれた。

```Python
from PIL import Image, ImageOps
```

この画像処理に使うと思われる「PIL」ライブラリについて調べてみると、
PIL　以外に　「pillow」　があり、後者が後継機とのことだったのでこちらをインストールした。

```
pip install pillow
```

eclipseではコマンドプロンプトを開かずに、上のコマンドと同じことができる機能がある。
これによって「pillow」を入手した。

ライブラリを入手後、改めてブログ内にあるソースコードを実行、
しかしうんともすんとも言わない。

<span style="font-size: 150%">知ってた</span>

他の方と過去に自分が作ったソースコードは、必ずしもそのまま使えるとは限らない。

というわけで原因を探りつつ、初めてみたenumerate()関数について調べてみた。
これはfor(繰り返し文)と組み合わせて　番号と何かを1つずつ処理する関数だそう。
何かというのは、例えばリストであったり、数字だったり。

```Python
for i,x in enumerate(gorira_list):
 print(i,x)
```

とあれば、実行すると
0　マウンテンゴリラ
1　ヒガシローランドゴリラ
2　ニシゴリラ

というふうに表示される。

話を戻すと、
datasetフォルダを変える必要があった。

```Python
output_dirname = os.path.join('..', 'dataset', 'reshaped')
```

こちらの変数では、datasetとreshapedというフォルダに加工済みの画像を置く処理をしていたが、
自分の環境ではそんなフォルダがなかった。

そのため、datasetフォルダを、downloadsフォルダの下に作成
ファイルパスを下のように変更することで対処した。

```Python
output_dirname = os.path.join("./downloads","dataset")
```

以下が加工後の画像
![バラ加工済.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877489/e290012a-31bc-1e33-87e4-7e3e9af5be72.png)
ワークショップ「形態素解析を活用した要求仕様のレビュー」の結果

# はじめに

JaSST'21 Tokaiでワークショップ「形態素解析を活用した要求仕様のレビュー」を開催した。
ワークショップの結果を記録しておく。

# ワークショップ概要
要求仕様が自然言語のような曖昧さを含む記法で記述されている場合，曖昧に表現された文が不具合を誘発させることがあります．
本ワークショップでは，形態素解析（KH Coder）を活用し，仕様書から曖昧な文を検出する手法を体験していただきます．

参考文献：
[1] 柏原一雄，長井亘，不破慎之介，林香織，石川冬樹，栗田太郎，“要求仕様の誤解釈を検出するDomain Word Modelingの提案”，ソフトウェア・シンポジウム2020，2020
[2] 柏原一雄，新留光治，李路雲，鈴木淳，松原潤弥，不破慎之介，“要求仕様に対する形態素ベースドレビューの提案“，ソフトウェア・シンポジウム2021，2021

# ワークショップ資料
https://researchmap.jp/reve/presentations/35990394

# 参加人数
6名
予定より参加人数が減ってしまった。
予定より参加人数が減ることを想定して、参加人数上限を決めておいたほうがよかった。

# 開催形式
オンライン（Zoom）
個人ワークの時間に、どこまで進んでいるか？何か困っていることはないか？等が見えない。
また、講師の問いかけに対する反応が見えない。
まだ、オンラインでのワークショップのうまい進め方は掴めていない。
「アイスブレイクの工夫」「個人ワーク中の状況が見える工夫」が必要だった気がする。

# 展開した論文・資料
以下の論文・資料を展開し、展開した論文・資料の参考文献も興味があれば、ご参照いただくことをお勧めした。

## 柏原一雄，「要求仕様に対する形態素ベースドレビューの提案」，ソフトウェア・シンポジウム2021，2021
https://researchmap.jp/reve/published_papers/33955217/attachment_file.pdf

https://www.sea.jp/ss2021/download/22-SS2021.pdf

## 柏原一雄，「要求仕様の誤解釈を検出する Domain Word Modeling の提案」，ソフトウェア・シンポジウム2020，2020	
https://researchmap.jp/reve/published_papers/33955210/attachment_file.pdf

https://www.sea.jp/ss2020/download/SS2020-2.pdf

## 堀川透陽，「シフトレフトテストにおけるシステム要求の獲得 ～テキストマイニングを用いたアプローチ～」，派生開発カンファレンス2021，2021
https://affordd.jp/libraries/affordd-conference2021-veriserve/

## 寺西祐斗，「自動販売機システム開発文書への形式仕様記述の適用事例」，研究報告ソフトウェア工学（SE） 2016-SE-191巻 12号 p.1-8，2016	
https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=157994&item_no=1&page_id=13&block_id=8

# 参加者のふりかえり結果
* このようなツールを使って仕様書を読解する方法が有ると知り勉強になりました。
* わからなかったというか、疑問に思ったこと：アジャイルの現場などで仕様をこのモデルだけで伝える、っていうのはあんまりイケてないんでしょうか
* わかったこと：形態素解析を活用すると、同義語の表記ゆれやあいまいな部分を見つけやすくなる  
  わからなかったこと：自分がアジャイル開発のプロジェクトにいるからかもしれませんが、同義語のちょっとした表記ゆれはあまり気にしなくても良いのかな、と思いました。  
  今度やってみようと思うこと：自分のプロジェクトであいまいな部分のチェックをしてみようと思います。
* 今後やってみよう：テスト設計や仕様把握に慣れていないメンバーにこの手法を使ってみてもらうとよさそう

# 考察
* 今回のワークショップは、2時間という時間内には収まることが確認できた。ただし、効果は明確には確認できなかった。
* 自然言語で仕様が示されず、モデルで仕様が示されるプロジェクトがあることを意識できていなかった。
要素をフェードインさせようとしたらUncaught TypeErrorが出た

#結論
document.getElementsByClassName()の結果は、配列のようなものになっている
参考サイトhttps://teratail.com/questions/231849

##修正前のコードとそのエラーの内容
```custom.scss
.bg-white{
  padding: 3rem;
  opacity: 0;
  /*要素を左に100pxずらしたところに配置する*/
  transform:translateX(-100px);
  /*透過度と表示位置を1秒かけて変化させる*/
  transition:opacity 1s,transform 4s;
}
.bg-white-after{
  opacity: 1;
  transform:translate(0);
}
```

```home.html
<script>
 let bgWhite = document.getElementsByClassName("bg-white");

  window.addEventListener('load', (event) => {
    bgWhite.classList.add("bg-white-after");
  });
</script>
```
要素を取得してaddEventListenerを使って"bg-white-after"クラスを付けて
いい感じにふわっと表示させたかったのですが、
Uncaught TypeError: Cannot read properties of undefined (reading 'add')

と出てしまいました。

##試したこと

```home.html
<script>
 let bgWhite = document.getElementsByClassName("bg-white");
  window.addEventListener('load', (event) => {
    console.log(bgWhite);
    bgWhite.classList.add("bg-white-after");
  });
</script>
```
console.logで要素を取得できているか確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301963/a4ee93b8-e14f-cb14-8724-f45965fbe52a.png)
うん、ちゃんととれてる。

冒頭にも書かせていただいた参考サイトを見てみると、
HTMLのclass属性は、複数の要素につけることができる前提なので、
document.getElementsByClassName()の結果は、配列のようなものになっているとのこと。
ということで

##修正後のコード
```home.html
<script>
 let bgWhite = document.getElementsByClassName("bg-white");

  window.addEventListener('load', (event) => {
    bgWhite[0].classList.add("bg-white-after");
  });
</script>
```

そうすると、エラーが解消されて思い通りに要素が動きました。
document.querySelector　で取得するか、
クラス名で取得するときはたとえ1つの要素でも配列にして出してあげましょう。
失敗を披露できるひとは強い - 「おにいさん・おねえさん」開発者への道

[2021.11.30 にtwadaさんの講演を聴く機会がありました](https://twitter.com/e99h2121/status/1465494542841352196?s=20)。
参考: [【感想文】t_wadaさんがやってきた - Qiita](https://qiita.com/takeC74/items/52f45d3f30d56e01df3e)

> Q. 「認知負荷の高いコードを読み解ける人」が「頑張って」修正をこなしてしまうことが現場では称賛され得るが、遠回しに自分達の首を絞めていると思います（= 危険性が減っていない) どうしたらいいでしょうか？

> A. レガシーコードの怖いことはだんだんなれていくこと。新人や若手の役割が重要になっていく。日々、チームメンバーが**わからないことを分からないと表明していくことがとても大事である**。 

（ざっくり目ですが）などという問答がありました。すみません。昨日もそう書きました。
＊[質問できるひとは強い - Qiita](https://qiita.com/e99h2121/items/72132c392c072d4ab097) という話を若い人々や「知らない」人への尊敬を込めて書きました。

## 老害・おっさん・おじさん

「認知負荷の高いコードを読み解ける」、それはいつの間にか誤った成功体験の積み重ねと自信となってしまい、自分ができることをできない者 に誤った圧力をかけるふるまいになってしまう。

俗に言う「老害」の誕生です。今日「老害」は「おっさん」あるいは少しだけ丁寧に「おじさん」などと表現されます。あまりポジティブなワードではなさそうです。

## 一方「芸人」

自分の属する社内では、比較的 **ポジティブな文脈** で、**「役職は無いが組織の縦横の風通しに積極的なベテラン芸人開発者層」** を「おじさん」と呼ぶこと、が広まりつつありました。[弊社の平均年齢は30そこそこ](https://speakerdeck.com/whisaiyo/works-human-intelligence?slide=40) のようなので、40代が見え隠れしつつあるベテラン**芸人** 開発者にとって、背伸びして「おじさん」ぶりたい、陽のあたる場所に居たい潜在意識があったのでしょう。そもそも「芸人」というワードも面白いですね。達人でも玄人でもなんでもなくただ面白いことを披露している人を芸人と呼ぶのです。

ここでの「おじさん」、いずれも30代後半から40代以内です。世間のいわゆるおじさんと比較しては若手と言えます。若手のおじさんってなんやねん。もちろん、先の、ネガティブワードとしてのおじさんとの区別も少し難しいですね。

## そして降りてきたワード「おにいさん・おねえさん」

＿人人人人人人人＿
＞　おにいさん　＜
＞　おねえさん　＜
￣Y^Y^Y^Y^Y^Y￣

おにいさんおねえさんの誕生です。**30代後半から40代以内の者が、つまりいい年こいた者がおにいさんおねえさんとは全く滑稽です。**いいのです。

ここで冒頭にも紹介した [質問できるひとは強い - Qiita](https://qiita.com/e99h2121/items/72132c392c072d4ab097) に戻ります。若い人々の強みが「質問できること」わからないことを分からないと表明していくことであるとしたら、ここでおにいさんおねえさん開発者の強みとは何でしょう。

## 「失敗は成功の母」

「失敗は成功の母」という言葉がありますね。
本来、失敗にはむしろ良いことしか無いのでその失敗を披露することのメリット3つを書いてみます。

**1. アンチパターンがわかる。**
**2. 皆もよくぞ教えてくれたと思ってくれる。**
**3. もしかしたらとても勇気のある人だ、と思われるまである。**

親しみが湧く。年長者は打算的にしくじりを売り出したほうがよいです。
私の考えをお伝えしましょう。以下です。

＿人人人人人人人人＿
＞　おにいさん　  ＜
＞　おねえさんは　＜
＞　失敗の上級者　＜
￣Y^Y^Y^Y^Y^Y^Y￣


## まとめ

失敗なんてひけらかして評価が下がるかも？ いえ、誤った評価を受け続けるより全く良いです。というか今更不惑を向かえるおにいさんおねえさん開発者に失うものなどあるのでしょうか。疑問です（私は不惑です）

むしろよくぞ過去を共有してくれたと皆から思われたいし、過去の失敗、設計の失敗、誤った事例は語り継ぎたいです。

[社長室に呼び出しを受けたことはありますまいか - Qiita](https://qiita.com/e99h2121/items/a91da943d8584f8301ac)
[「失敗を許容する」なんて言われても失敗したくないです - Qiita](https://qiita.com/e99h2121/items/873281d73cc504e5a64d)
などと2020年に書きました。まだ控えめだったなと少し反省しています。失敗を披露できるおにいさんおねえさんは強いです。これもレガシーコードに立ち向かう技の一つではないでしょうか。

そういえばポジティブシンキングと酸っぱい葡萄思考 (自己正当化) も違いますね。酸っぱかった(はずだ) から葡萄取れなくて良かった、という葡萄否定じゃなく、やはり手が届かなかったという事実を認めて、でもそれを武器に、美味しい葡萄の木にありつく工夫をしたい...

冒頭の伏線回収、そして明日に続きます。以上です～。
Power Queryのベストプラクティス

## はじめに
　[Docs](https://docs.microsoft.com/ja-jp/)には、各種ベストプラクティスが掲載されています。今回は、Power Queryのベストプラクティスをみていきましょう。

## 参照

- [Power Query を使用する場合のベストプラクティス | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-query/best-practices?WT.mc_id=DP-MVP-5004418)

## 適切なコネクターの選択

例として、ODBCではなく、SQL Server コネクタを選択すると大幅パフォーマンスが上がるよと。

関係することとしては、以下
- [クエリの折りたたみ（クエリ フォールディング、query folding）](https://docs.microsoft.com/ja-jp/power-query/power-query-folding)
- 標準的な一連のステージで [データの取得 | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-query/get-data-experience)
- [Power Query の全コネクタの一覧 | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-query/connectors/)

## 早期にフィルター

**常に、クエリの初期段階またはできるだけ早い段階でデータをフィルターすること** 

（大量データ等で）不用意にやってはいけない、やりっぱなしにしてステップを残したままにしたりしてはいけないのは**ソート**です。
**ソート**ではなく、**フィルター**ですね。

**ビジュアルに使わない列も削除してしまう**（不要だとフィルターしてしまう意味）も大事です。
Power Queryのあとのデータモデル（データセット、セマンティックモデル）は必要な列のみで見通しよくなるようにしましょう。

## コストの高い操作は最後に実行

大量データの場合、並べ替えを行うと非常に時間がかかる場合があります。並べ変えは、使うとよいな、という場合以外は、使わずがいいですね。

通常のプレビューでデータ操作できる状態は、ストリーミングと呼ぶとあります。

## データのサブセットに対して一時的に作業する

先頭の何行かに絞って、処理するステップの絞る、そしてルールが固まったら、最初に絞ったステップを削除するとよい

## 正しいデータの型を

最も大事なステップのひとつですね。Any(任意)のデータタイプ(ABC123のアイコン)は、思わぬ結果になる可能性がありNGですね。

- [データ型のPower Query | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-query/data-types)

## データをざっと確認する（エクスプローラー）

[データ プロファイリング ツール](https://docs.microsoft.com/ja-jp/power-query/data-profiling-tools)を適宜利用しましょう。

## 作業内容を文書化しましょう

適用したステップはそのまま文書化になると。適宜自分がわかるものに修正すると、立派なツールベースのドキュメントになります。
私は、このステップは英語で記載されるように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/09b6ca60-7e9c-412c-d6af-614c731a923e.png)
ときどき、日本語で記載されることがありますが、わかればよいので気にしないようにしています。

英語か日本語かは、[オプションと設定]/[オプション]/[グローバル]/[地域の設定]/[クエリ ステップ]です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/152e50d4-2705-39ca-85d8-992d1fedf5bc.png)

## モジュール型のアプローチを

クエリが多数になったら分割することができると。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/8a094fee-2620-8822-1b76-6b65a88a398a.png)

これでクエリが2つに分かれます。確かに見やすいですね。

## クエリのグルーピングを

確かにこれも、適宜行うと、見やすさの向上や後でみても分かりやすいですね。


## 先々の更新時に問題が発生しないようにすること

最優先事項（トップ・プライオリティ）とのこと。
エラーが発生しないか、列の削除が影響しないか等気配りが大事ですね。

## パラメーターの使用

動的なクエリのベストプラクティスなので、適宜利用をとのこと。

## 再利用可能な関数を作成する

カスタム関数を作ったら、再利用できるようにすると尚よい、ということですね。

## （おまけ）Power Query 詳細エディターの文字拡大/縮小ショートカット

すぐ忘れるので覚書です

  [Ctrl] + [Shift] + [+] / [-]

## おわりに
　本Docsのライターの一人は、Power Queryの著書等で有名な、[Miguel Escobar](https://www.thepoweruser.com/)ですね。彼の解説等は本当にわかりやすいです。
今更だけど、Objective-CアプリにSwiftライブラリLottieを導入してみた

##はじめに
１０年以上メンテしてるアプリがあるので、いまだにObjective-Cも使っている今日この頃。
マルチプラットフォームの方がいいので、AppleのSwiftには手を出さずにきたんですが、Lottieを導入してみたら手を出さざるを得なかったので、出しちゃいました。

もう１２周年だった。 [「PRO.APP」12周年記念！](https://www.atpress.ne.jp/news/285839)

Lottieとはアプリ/webにアニメを追加できるありがたいモジュールです。After Effectsから変換できます。
[WebアニメーションはLottieがオススメ！基本の使い方完全ガイド【2020年版】](https://photoshopvip.net/121220)

##なぜに？
Swift、今まで深く調べたこともなかったんですが、iOSのLottie、Swiftで書かれてて、あ、じゃあ確かObjective-CからSwiftは簡単に呼べるはずなので、呼んでみよー・・・

呼べねー

・・・

なんでもSwiftのライブラリを出すときに、Objective-Cに対応するか選べるんだそうだ。
・・・・対応してよAirbnbさん:joy:

こんな感じですね。

https://qiita.com/zacky1972/items/6c88b26be2c2659b9d15

時代かなー。しょうがないのでSwiftでLottie呼ぶコードを作ったよ。まあすぐできたけど。

```Swift
import Foundation
import UIKit
import Lottie

@objc class MyLottie: NSObject {
    ///アニメ開始
    @objc static func playAnimation(view:UIView, name:String) {
        NSLog("playAnimation MyLottie")
        let animationView = AnimationView(name: name)
        animationView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height)
        animationView.center = view.center
        animationView.contentMode = .scaleAspectFill
        animationView.animationSpeed = 1

        view.addSubview(animationView)
        animationView.autoresizingMask =
            [.flexibleLeftMargin,
             .flexibleRightMargin,
             .flexibleTopMargin,
             .flexibleWidth,
             .flexibleHeight,
             .flexibleBottomMargin];

        animationView.play()
    }
}
```

##最後に
巷の情報だけじゃなかなかできなかったので、記事にしておきました。手抜きだけど:stuck_out_tongue_closed_eyes:
Nuxt × TypeScript環境にESLintとPrettierが設定済みの環境を構築する

## はじめに

本記事での関心事は、<b>Nuxt × TypeScript環境でESLintとPrettierを使いたいときにどのように設定すべきか</b>という点です。
自分はあれこれ調べて最終的にcreate nuxt-app でよいのでは・・・？という結論になってしまったのでこの記事を見て回り道をする人が少しでも減ってくれたら嬉しいです。

<b>※注意書き</b>
本記事はNuxt 2での設定を想定しています。Vue2とTypeScriptは型推論の問題などであまり相性がよくないのでそこまでメジャーな組み合わせではないと思っています。Vue3に対応したNuxt3のベータ版が最近出ているようですが、この記事はその文脈の記事ではありません。

## 抑えておきたいこと(eslint-plugin-prettierは使わない)

ESLintは静的解析とフォーマット機能を、Prettierはフォーマット機能を備えていますが、現推奨(2021/12現在)の手法では静的解析はESLint、フォーマッターはPrettierと明確にその役割を分担させる方法がPrettier公式で推奨されています。ESLint経由でPrettierを実行する方法だとエディタに赤い波線が大量に出てしまうなどの問題がありました。このあたりの詳細な解説は[ojisanさんの記事](https://blog.ojisan.io/prettier-eslint-cli/)が非常に参考になると思うのでぜひ見てみてください。

そのため、eslint-config-prettierを用いることでESLint側でPrettierと重複したフォーマットルールを無効化し、Prettierでフォーマット → ESLintで静的解析 のようにそれぞれ別で実行するのが現状ベターかと思われます。

タイトルにあるeslint-plugin-prettierというプラグインはESLintでPrettierを実行できるようにするプラグインなんですが、現状非推奨なため注意が必要です。「eslint prettier」と検索すると少ないですがこのやり方を紹介しているサイトも出てきます。ちなみに「Nuxt TypeScript ESLint Prettier」のように検索するとpluginで併用するやり方を紹介するページが結構出てくるのでまだ広まりきっている情報ではないのかなと思っています。

## Nuxt × TypeScript × ESLint × Prettier の環境を整える

2で踏まえたことを前提に環境を整えます。[Nuxt公式のインストール方法](https://nuxtjs.org/docs/get-started/installation/)であるcreate nuxt-appを用いてNuxt環境を作ります。今回はyarnでインストールします。

```bash
yarn create nuxt-app <project-name>
```
インストール時に聞かれる指定項目の要点は以下の二点です。それ以外は自由に設定して問題ありません。複数選択可能な場合はSpaceでチェックを入れられます。

```bash
# 実行時に指定する項目
? Programming language: TypeScript
? Linting tools: ESLint, Prettier
```

これで環境は完成です。
では、.eslintrcを見てみましょう。

```jsx
// .eslintrc
extends: [
    '@nuxtjs/eslint-config-typescript',
    'plugin:nuxt/recommended',
    'prettier'
  ],
```

ESLintのextendsの指定方法では、eslint-config-prettierをprettierと省略して記述することができます。というわけなのでeslint-config-prettierの設定は問題なし。

また、過去のcreate nuxt-appではeslint-plugin-prettierが記述されていた時代もあるようですが、現在は気にする必要もありません。

つまり、そのまま使えるんですね。

## まとめ

Nuxt × TypeScriptのESLint, Prettier環境を作ろうとしてあれこれ試行錯誤しましたが結局create nuxt-appの機能で生成してくれる環境で十分という結論に自分は落ち着きました。これ以降の設定としてVSCodeでの動作設定やpackage.jsonに記述するscriptsの設定があると思いますが、そちらは以下のteppeisさんの記事([ESLint, Prettier, VS Code, npm scripts の設定: 2021春](https://zenn.dev/teppeis/articles/2021-02-eslint-prettier-vscode))が非常に参考になるのでそちらを見てもらえればと思います。

ここまでお読みいただきありがとうございます。少しでも誰かのお役に立てば幸いです！
その女の子との出会いはあまりに唐突で、衝撃的でした。

初めまして、趣味でwebエンジニアをやってるニートこと、もがたろうです。

今日で左第五中足骨骨折歴1ヶ月になりましたので記念に記事を書いてみました。

僕がどのように骨折したのかは最後に書いていますので、気になる方は大変お手数ですが、文末までスクロールをお願いします。
気にならないって？
ですよね。

初めましてと言いましたけども、なんやかんやで実は左第五中足骨骨折する2年9ヶ月前に1つ目の記事を書いています。
でも骨折して生まれ変わったので初めましてです。

自己紹介として僕のスキルレベルを公開します。
松葉杖歴: 10ヶ月、骨折歴: 10ヶ月、左外果剥離骨折: 9ヶ月、左第五中足骨骨折: 1ヶ月、片松葉: 6ヶ月

うーん、まだまだ初心者って感じですね。骨折してから雨の日に1度転んで悶絶しましたしね。精進します。。
最近は松葉杖で歩くときに、肩甲骨を寄せて加速する、エクストリームバーストという技の練習しています。


さてさてところで、閑話休題。
みなさんはこんなコードを見てどう思うでしょうか。
CakePHPのビューです。

ニートの癖に昨日は夢の中で仕事していました。
バリデーションチェックに失敗して登録できない不具合があったので、問題のコードを見たらこんなコードが書かれていました。
決して現実で起きたことではないです。断じて！絶対！

```hoge.ctp
<div style="display:none;">
  <?php
    echo $this->input('hoge', array(
      'type' => 'text',
      'name' => 'hoge',
      // 'value' => $hoge,
      'disabled': !empty($hoge) ? true : false,
    ))
  ?>
  <p>※初回の登録以外で変更が必要な場合はサポートセンターにご連絡〜みたいなこと書いてる</p>
</div>
```

$hogeはコントローラーから渡されるデータベース上の値なんだな。
$hogeが既にデータベースに存在する場合はdisabledにするんだな！
disabledの謎の三項演算子は置いておきましょう。冗長なのはもはやどうでもいいんです。

display:noneってことは、jsで表示したりしなかったりするのかな？？
あれ、jsで何か操作してる記述が見当たらないぞ、、なぜだ、、、どこにあるんだ！！！！ワンピースはどこにあるんだああああ！！！
もしかして、サポートが現場で開発者モードでdisplay:noneを消して値を入れるのかな？

むむっ!!!
valueのコメントアウトは何だ？？
これじゃ、display:noneを書き換えても元のvalueの値がわからないぞ？？

まるで夢のようなコードです。
まあ夢の中で僕が書いたコードですからね！！決して僕以外の誰かが書いたわけじゃない！断じて！絶対！


あなたはこのコードの意図はわかりましたか？

正解は、、

hogeというinput要素を見えなくしてください！という指示があったみたいです。
valueのコメントアウトは、$hogeが機密情報なので、開発者モードでも見えなくしてという指示があったからみたいです。

なるほど、とても素直で素敵だと思います。
皆さんもそう思いますよね？
そう思ってください。
なんせ、この僕が夢の中で書いたんですからね！！

ただ、、
1つだけ言いたい、言わせてください。

指示があったら、その意図を汲み取るか、汲み取れなかったら質問しましょう。
そして、それに対して何をすればいいか考えましょう。

何故このテキストフォームを見えなくするのか考えましょう。
valueを見えなくするには、確かにコメントアウトでも見えなくなるけど、そのした場合にどうなるのか考えましょう。

- 質問1: フォームを見えなくするというのはdomからの削除でしょうか、非表示でしょうか。
- 回答1: 削除です。
- 質問2: フォームを削除する場合、初回登録もサポートがDBに直接データを入れることになると思いますが、問題ないでしょうか。また、サポートに連絡の旨の注意書きもなくなりますがどこかに記述などは必要でしょうか。
- 回答2:問題ないです。 必要ないです。

これだけ聞けば、あとは簡単ですね。
フォーム自体を消せば当然valueはそもそも見えなくなります。
コントローラ側の登録処理も消しましょう。

なお、初回の登録以外の場合はDOMにも表示しないという場合は、現実の僕ならphpでif文で条件分岐を書いて、$hogeがある場合は、スタイルはinputのdisabledの背景色のpタグで、`<p>*******</p>`みたいなのを置くと思います。
$hogeがない場合は、input要素でdisabledになることはないのでdisabledは外します。
「※初回の登録以外で変更が〜」の注意書きは条件分岐の外側に出します。

皆さんならどう実装しますか？


--------------
もがたろうは走った。えい、えいと大声挙げて自身を叱りながら原付で走った。
村を出て、野を横切り、森をくぐり抜け、ほっとした時、突然、目の前に一体の自転車が躍り出た。
一時停止線があるにも関わらず、雨にも負けず、その女の子は路地から飛び出してきた。
携帯見ながら飛び出してきた。
「気の毒だが正義のためだ！」
もがたろうはハンドル切った。フロントブレーキも目一杯かけた。
金太回った金太回った。縁石にぶつかり骨折した。
セリヌンティウスよ、ゆるしてくれ。
セリヌンティウス、私は走ったのだ。君を欺くつもりは、みじんも無かった。
ああ、もういっそ、悪徳者として生き伸びてやろうか。村には私の家が在る。羊も居る。妹夫婦は、まさか私を村から追い出すような事はしないだろう。正義だの、信実だの、愛だの、考えてみれば、くだらない。人を殺して自分が生きる。それが人間世界の定法ではなかったか。ああ、何もかも、ばかばかしい。
Marpでスライドを左右に分割する方法

# Marpとは
マークダウン形式でプレゼン資料を作成できるツール。
日本人の方が開発しているらしい。[1]（応援したい）


# スライドの左右分割

現状Marpに標準搭載されている機能のみでは実現できないため、CSSを設定し、HTMLを直接記述することで対応します。
CSSの内容については末尾に記載した引用元をご確認ください。[2]

### CSS

```css
.split {
  display: table;
  width: 100%;
}
.split-item {
  display: table-cell;
  padding: 0px;
  width: 60%;
}
.split-left {
  position: relative;
}
.split-left__inner {
  height: 100%;
  position: fixed;
  width: 50%;
}
.split-right {
  position: relative;
}
.split-right__inner {
  height: 420px;
}
```

### HTML

```html

<div class="split">
  <div class="split-item split-left">
    <div class="split-left__inner">

- 以下のQUBO形式のベイズ線形回帰モデルを獲得関数としたBBO手法
  $$ \tilde{f}(\vec{\bm{x}}\mid\vec{\bm{\alpha}}) = a_0 + \Sigma_{i}a_i x_i + \Sigma_{i < j} a_{ij} x_i x_j$$
- 離散変数を含むBBOに対するベイズ最適化手法として提案されている

    </div>
  </div>
  <div class="split-item split-right">
    <div class="split-right__inner">
      <img src="../latex/BOCS.jpg">
    </div>
  </div>
</div>
```

### 結果

![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635127/607a500c-65af-ca00-bce2-cae74702c841.png)


### 注意
- inner要素としてマークダウンやkatexを利用したい場合は、\<div>および\</div>の前後は必ず空行を挿入しなければいけないようです。



# 参考

[1] https://github.com/yhatt
[2] https://webdesignday.jp/inspiration/technique/css/3962/