OmniAICreator/Qiita-1.07M huggingface dataset:
GraalVMのインストールで実行したことのメモ


JavaをDockerやLambdaなどコンテナサーバレス環境でJavaを使うにあたって新しいランタイムを試したかったので環境設定をメモする。

GraalVMの情報については以下からダウンロードを実行する。
英語だけど基本的にインストール方法などは全部乗ってる。
[https://www.graalvm.org/22.1/docs/getting-started/windows/](https://www.graalvm.org/22.1/docs/getting-started/windows/)

解凍後以下場所にダウンロードしたファイルを配置する。

※以降はgraalvm-ce-java19の場合

C:\Program Files\Java\graalvm-ce-java19-22.3.0

## IntellJでの設定（Windows場合）

プロジェクト構造を選択

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/24043dea-7169-3565-5186-13678e8e2127.png)

さっき設定したディレクトリをJDKに選択する。

![figure3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/7fc1ceb8-4321-e061-9e4d-a18b2e287945.png)

実行を押して実行が可能になったらOK

## IDE以外で実行する場合(WIndows)

OS側で実行する場合（Windows）

コマンドで呼び出しが可能になるようにPATH変数に追加する

`setx /M PATH "C:\Program Files\Java\graalvm-ce-java19-22.3.0\bin;%PATH%”`

システム環境変数からJAVA_HOMEの変数をGraalVMのフォルダパスに変更する。

`setx /M JAVA_HOME "C:\Program Files\Java\graalvm-ce-java19-22.3.0”`

コマンドプロンプトを開きなおしechoコマンドで変数に反映されているかを確認する

（cmdは同じ画面だと設定値を再読み込みしないため）

`echo %PATH%
echo %JAVA_HOME%`

javaのバージョンを確認しGraalVMになっていればOK

2023/01/07追記

## M2 Macへのインストール方法

curlで落とそうとすると失敗するのでWebからダウンロードする。

https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-22.3.0

AppleSiliconなのでaarch64を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/c9f930d4-a225-e798-f72a-2dc45d34ab82.png)

残りは以下コマンドを実行

```
# Downloadしたディレクトリへ移動
❯ cd Downloads/

# JavaVMのフォルダへ移動
❯ sudo mv graalvm-ce-java11-22.3.0 /Library/Java/JavaVirtualMachines
❯ cd /Library/Java/JavaVirtualMachines

# 入っているか確認する。
❯ ls
adoptopenjdk-11.jdk      graalvm-ce-java11-22.3.0 jdk1.8.0_05.jdk

# 環境変数PATHに追加する
❯ export PATH=/Library/Java/JavaVirtualMachines/graalvm-ce-java11-22.3.0/Contents/Home/bin:$PATH

# Javaのバージョンの確認
❯ java -version
openjdk version "11.0.17" 2022-10-18
```
XAMPP + Eclipse + Xdebugの初期設定でつまづいた件

# はじめに
会社でEclipseにxdebugを導入する際に、何かと苦戦したためXAMPP + Eclipse + Xdebugの導入で同じように悩んでいる方の参考になれば幸いです。

また私の環境はこのような形でした。
・Windows 10 Pro
・XAMPP(php 7.4.29, xdebug 3.1.6)
・Eclipse


# Xdebugのバージョンによって表記が異なることが原因であった。
実際に「XAMMPP Eclipse Xdebug 導入」などで調べると、導入方法を記載したサイトが幾つかヒットしますが、そのほとんどがXdebug2.xの書き方でした。

公式サイトを確認してみると、以下の表記変更があったこと、デバッキングポートが9000 ⇒ 9003に変更されたことが分かりました。
URL: https://xdebug.org/docs/upgrade_guide/ja

私が導入していたXdebugは3.1.6であったため、XAMPPのphp.iniの以下の部分を3.x用に変更したところ、無事にブレークポイントで止まりました！

```diff: php.ini
- xdebug.remote_connect_back = 0
+ xdebug.discover_client_host = 0
```

```diff: php.ini
- xdebug.remote_autostart = 1
+ xdebug.start_with_request = yes
```

```diff: php.ini
- xdebug.remote_enable = 1
+ xdebug.mode = debug
```

```diff: php.ini
- xdebug.remote_host = client.hostname
+ xdebug.client_host = client.hostname
```

```diff: php.ini
- xdebug.remote_port = 9000
+ xdebug.client_port = 9003
```

# 参考サイト
https://zenn.dev/fagai/articles/f7da0b618683c8
PostgreSQLのbakファイルの導入(一旦削除と再作成)

## PostgreSQLのダウンロード：<br>
* https://www.postgresql.org/download/<br>
* https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

## PostgreSQLを操作できるアプリ：
* pgAdmin4:<br>
    + https://www.pgadmin.org/download/<br>

* DBeaver:<br>
    + https://dbeaver.io/download/


## PostgreSQLのデータ(.bak)導入：   <br> 
直接にpsqlで導入すると、エラーが発生する場合、データベース一旦削除して再作成するため：<br>
    (以下の操作はSQL言語ですので、pgAdmin4の[Query Tool]またはDBeaverの[SQL エディタ]で操作する可能)<br>
* DB削除：<br>
    + アクティブの項目を停止<br>
```
select * from pg_stat_activity
```
```
select pg_terminate_backend([pid])
```

+ DB削除
DROPコマンドでDBを削除する<br>
```
DROP DATABASE [DBname]
```

* DB削除(ターミナル)：<br>
ターミナルでDBを削除する可能：
+ DBに関するプロセスを探す：
```
ps aux|grep [DB名]
```
+ プロセスを停止：
```
kill [pid]
```
+ DBを削除する：
```
dropdb -U [ユーザー名] -h [ipアドレス] [DB名]
```

* psqlでデータ導入：<br>
+ DB作成<br>
```
create DATABASE [MercuryDB名] 
```
+ データ導入 <br>
```
psql -h [ip address] -U [username] [MercuryDB名] < [MercuryDB.bakファイル] (ファイルのパスを含む)
```

* psqlでデータ導入(ターミナル)：<br>
ターミナルでDBを再作成とデータ導入する可能：
+ DB作成<br>
```
createdb -U [ユーザー名] -h [ipアドレス] [DB名]
```
+ データ導入<br>
```
psql -h [ip address] -U [username] [MercuryDB名] < [MercuryDB.bakファイル] (ファイルのパスを含む)
```
Windows11でCtrlキーが押しっぱなし状態になる現象に見舞われたが、ようやく原因が分かった

Windows11にアップグレードして早2か月。

多少のバグなどは目をつぶってきたが、ここにきて致命的なバグに当たった。


**ふとした時に、Ctrlキーが押されっぱなし状態になるのだ。**


なんだそんなことかと思った君。これは結構困るのだ。

例えば、JIRAなどCtrl+Enterがコメント送信に割当たっているアプリケーションを使っていると、

改行しようとEnterを押した瞬間、書き半端の内容が投稿されてしまう。

コメント欄を一時的にメモ代わりに使おうと思ったら、うっかり送信されてしまうのだ。

恥ずかしい内容を書いていた日には、もう会社にいられなくなる。（そんなヤツいるか）

まぁ、とにかくCtrl押しっぱなしは困るのだ。


結論から話そう。私の場合、**原因はDeeplであった。**

Windows版のアプリケーションを入れて、ショートカットキー（初期値はCtrl+CC）で翻訳をかけると現象が出ることが判明。

Deeplが起動しない状態で同じショートカットキーを押しても現象出ないので、Deeplがトリガーとなっていることは間違いない。

対応策としては、ショートカットキーを変えることだ。アプリを開いて翻訳すると、ショートカットキーを変えても効果がなかったので、下のアプリ内部で表示する方を選んだ。（Deeplに割り当てても本来のfunctionキーの操作は働いてしまうので、注意）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267148/dc54da99-a9b5-ce48-134c-4a8a8f1f4350.png)



ネットで、同じ現象に見舞われていると思われる人の投稿が数件見つかるが、それに対する対応策は、

「固定キー機能を無効にする」という意見が大半を占める。

しかし、私の場合はそれでも改善しなかった。

これをQiitaに書くべきか迷ったが、Qiita住民ほどCtrlキーを使う人種もいないだろうと思い、投稿した。

根本的な解決にはならないかもしれないが、参考になれば幸いである。
npm-run-allで複数の処理を実行する　メモ

## npm-run-allとは？？
複数の処理を1つのコマンドでできるようになるツール
`buildを入力して実行`→`exportを入力して実行` から
`1つのコマンドを入力`→`buildとexport`が実行されるようにできる

## やってみる
Next.jsの静的HTML書き出しを行います
***1\.従来の実行方法***
```
npm run build 
-------------
npm run export
```
と2回コマンドを入力しなければなりません

***2\.npm-run-allでの実行方法***

まずは`npm-run-all`をインストール
```
npm i -D npm-run-all
```

package.jsonを見てみると
```typescript
"devDependencies": {
    "eslint": "8.20.0",
    "eslint-config-next": "12.2.3",
    "npm-run-all": "^4.1.5"
  }
```
`"npm-run-all": "^4.1.5"`が追加された

次に`scripts`の部分を変更する
元は↓
```
 "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "export": "next export"
  },
```

変更後↓
```
"scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "export": "run-s build next:export",
    "next:export": "next export"
  },
```

` "next:export": "next export"`を追加し、
`"export": "run-s build next:export",`で`build`の後`export`されるようになる
※`-s`コマンドは直列に実行するという意味

linuxでは`build && export`のように`&&`を間に入れることでできるらしい
基本情報の問題を解いてて役立つ数学

# 2のk乗(0<=k<=n)の総和(kは整数)

```math
\sum_{k=0}^{n}2^k = 2^{n+1}-1
```
<details><summary>証明</summary>

```math
\sum_{k=0}^{n}2^k = 2^{n+1}-1\cdots(＊)
```
とする。
(1)
(＊)は $n=1$ のとき、

$(左辺)= 2^0+2^1=3$、$(右辺)=2^2-1=3$となり、成立する。
(2)
(＊)が$n=m$のとき成立すると仮定する。
すなわち、
```math
\sum_{k=0}^{m}2^k = 2^{m+1}-1\cdots(＊＊)
```
が成立すると仮定する。
このとき、
```math
\begin{eqnarray}
\sum_{k=0}^{m+1}2^k 
&=& \sum_{k=0}^{m}2^k + 2^{m+1}\\
&=& 2^{m+1} -1 + 2^{m+1} (\because(＊＊))\\
&=& 2 * 2^{m+1} - 1\\
&=& 2^{m+2} - 1
\end{eqnarray}
```
となり、$n=m+1$でも(＊)は成立する。
(1)、(2)から、数学的帰納法によりすべての自然数$n$について
```math
\sum_{k=0}^{n}2^k = 2^{n+1}-1
```
は成立する。

</details>

## 例題

**2個の文字AとBを使って、長さ1以上7以下の文字列は何通りできるか。**

## 一般的な解き方

```math
\begin{eqnarray}
\sum_{k=1}^{7}2^k
&=&2^1+2^2+2^3+2^4+2^5+2^6+2^7\\
&=&2+4+8+16+32+64+128\\
&=&254
\end{eqnarray}
```

## この公式を使った解き方

```math
\begin{eqnarray}
\sum_{k=1}^{7}2^k
&=&2^8-1-2^0\\
&=&256-1-1\\
&=&254
\end{eqnarray}
```

:::note
$-2^0$を忘れないように注意しましょう
:::


# まとめ
TeXの記法めんどくさすぎだろ！
何か思いついたら追加する

# 参考文献(TeX記法について)

https://qiita.com/shepabashi/items/27b7284d1f0007af533b

https://zenn.dev/wsuzume/articles/b0b3a51cac5d7fe4555b

https://www.irohabook.com/latex-eqnarray
バイナリとは【メモ】

よくバイナリという言葉を耳にするが、意味がわかっていなかったのでここにメモを残す。

## バイナリとは
- 元々２進数という意味。
- そこから「コンピューターが扱うデータ」という意味になった。（人間には普通は読めないので）
- なので、主にテキストデータ以外のデータやファイルのことを指す。
バッファリングとは【メモ】

Swiftに限らずの話だが、バッファリングとはなにかわからなかったためここにメモ。
## バッファリングとは
- 複数のオブジェクト間でなんらかのデータのやり取りをする際に、送受信データを一時的に保存しておくこと
    - Youtubeなどの動画において、バッファがあることで動画がスムーズに再生されるようになっている。
VNCを使わずにサーバー上の画面をリアルタイムにみる

## 手順

Linuxサーバーにポートフォワードつきでログインします

```
$ ssh リモートサーバー -L 8000:localhost:8000
```

ログインしたら以下のrubyスクリプトを起動します

```screen.rb
require 'webrick'

srv = WEBrick::HTTPServer.new(:Port => 8000)
srv.mount_proc '/' do |req, res|
  res.content_type = "image/jpeg"
  res.body = `export DISPLAY=:0;import -window root jpeg:-`
end
srv.start
```

```lang:bash
$ ruby screen.rb
```

手元のブラウザで `localhost:8000` にアクセスするとサーバー上の画面がブラウザ上から見れます。リロードすれば最新の画面が見れます。

## 依存モジュール

- imagemagick
    - 画面キャプチャをとるのにimagemagickを使っています。
- webrick
    - ruby3からは標準モジュールではなくなっているのでない人は入れてください。

## ソース解説

- webrickを使ったシンプルなサーバーです。
- エンドポイントは1つだけです。
- リクエストがあると、外部コマンド呼び出しで、画面キャプチャのコマンドを呼び出しています。
- 画面キャプチャのコマンドが`export DISPLAY=:0;import -window root jpeg:-` となっています
    - DISPLAY環境変数をセット（私の環境では:0に設定しています）
    - importコマンドでキャプチャをとる
        - ウィンドウはすべて（rootを対象に）
        - jpeg形式で標準出力に（jpeg:-)
Grand Central Dispatch用語集

## GCDとは？
- iOSにて、並列実行タスクをするために提供している言語機能のこと。
- 開発を行うにあたり、DispatchQueueを使ってスレッドでの処理を管理することができる。
- また、GCDのQueueは追加されたタスクを追加されたのが早い順番から処理する性質を持っている。

## 用語集
- プロセス
    - アプリケーションの実行インスタンスのこと。
- スレッド
    - プロセスが実行する処理などを格納したもの
- タスク
    - スレッドに格納される具体的な処理の単位のこと
- キュー
    - アプリケーションに含まれるスレッドを管理するためのAPIのこと。
    - スレッドの作成、管理の役割を担う
randメソッド

# はじめに
乱数の実装をする際に必要な知識を忘れないために記録に残す

## randメソッド
randメソッドで乱数を実装することができます。


    # 使い方
    rand(欲しい乱数の数)
    randメソッドを使うと手軽に乱数を生成できます。randメソッドに引数として数を渡すと「0」から「渡した数 - 1」の間でランダムに数を返します。

    rand(100) # => 0〜99の中から１つ整数をランダムに返す

    rand(1..5) # => 1~5の中の整数を返す
効率的なコードレビューのために

### コードレビューの参加者

- レビュアー: 他の人が作成したコードをレビューする人
- pr作成者:本人が作成したコードを他の人にレビューしてもらう人

### コードレビューとは
コードレビューとは、ある開発者がコードを作成すると、別の開発者が決められた方法でフィードバックをやり取りする過程のことです。 この過程を通じて本人が発見できなかったミスを他の人が発見し、コードの副作用(Side effect)とエラーに早期に対応でき、開発内に定められたコンベンション規則を維持し、技術負債を減らすことができます。 また、複数の開発者が参加することで、問題解決のための技術実装方法論について共有することもあります。

効果的なコードレビューを続けるためには、レビュー担当者の姿勢がとても重要です。 レビューの5つのルールをもとに、レビュー担当者がどのような姿勢で臨めばいいのか見てみましょう。


### レビューアの姿勢

レビュアーがコード改善の必要性を感じ、レビューを残すなら、十分な理由によって裏付けられる必要があります。 
もしコードレビューが主観的または抽象的である場合、レビューは混乱を感じる可能性があります。 
そのため、フィードバックを作成する際にレビューが改善の必要性を感じられるように具体的な理由を作成すると良いでしょう。


### pr作成者の姿勢
レビュアーの意見を尊重することをベースとしています。

NG事例を紹介します。
- 社内ルールが決まっていないのであなたのレビューは拒否する->NG
- あなたのレビューはこんな点が足りないから私は皆の合意があるまではあなたのレビューは拒否する->NG
(実際に実務で経験しました。 w)

このような場合は、コミュニケーションのコストをかなり上げる方式です。
すべてをルール化することはできません。 もしruleが必要なら、コードレビュー中に提起するのではなく、コードレビュー後に提示するのが正しいプロセスです。
レビュアーの時間も重要なので、このようなレビュアー以外の部分を話すよりは、レビュアーの意見を最大限尊重する方向が効率的です。



### どうやって効率的にコードレビューをするの？

ビジネスの価値を実現するために最も重要なことは時間だと思います。
その時間に対するコストを削減する方向で、二つの側面を考慮したルールを定めるとよいでしょう。

- コミュニケーション·コスト
- 優先順位判断

についてルールを決めていきたいです。


### コミュニケーションコストを削減するためのPnルール

私たちは相手と会話をする時、「言葉」という言語的表現の他にも「表情」、「手振り」などの非言語的表現も積極的に活用します。 
オンラインでコードレビューを行う場合、「文」だけで考え、感情を含む意見を伝えるため、伝達力が相対的に不足し、
これにより軽い冗談が相手に真剣な話として伝えられる状況が演出され、blockerになることもあります。
コードレビューのコメントに「Pnルール」を使用して、レビュー担当者がコメントを強調したい程度を表現します。


### 「Pnルール」

#### P1: 必ず反映してください (Request changes)
レビュアーは、PRの内容がサービスに重大なエラーを発生させる可能性を秘めているなど、重大なコード修正が必ず必要と判断される場合、P1タグを介してレビュアー要求者に修正を求めます。 レビュー要求者は、p1タグについてレビュー担当者の要求を反映したり、反映できない合理的な意見を通じてレビュー担当者を説得できなければなりません。

#### P2:積極的に考慮してください (Request changes)
作成者はP2について受け入れるか、もし受け入れられない状況であれば、適切な意見を聞いて討論することをお勧めします。

#### P3:なるべく反映してください (Comment)
作成者は、P3について受け入れ、又はもし受け入れがたい状況であれば反映できない理由を挙げて説明し、又は次に反映する計画を明示的に（チケット等で）表現することを推奨します。 Request changesではなくCommentと一緒に使用されます。

#### P4:反映してもいいし、次に行ってもいいです (Approve)
作成者はP4については何の意見も付けずに無視しても構いません。 その意見を反映した方がいいか悩んでみる程度で十分です。

#### P5: ただの些細な意見です (Approve)
作成者はP5について何の意見も付けずに無視しても構いません。

FYI）Pnルールは、コミュニケーションは最大の費用だという問題意識から、これを解決するための文化を背景に根拠として作成されました。 Pnルールはコードレビューの他にも、teamsの会話などのテキストでのコミュニケーションでも活用すれば良いでしょう


### レビュー優先順位の判断を助けるD-nルール


#### D-0 (ASAP)
緊急の修正事項ですぐにレビューしてください。 
アプリのエラーによって障害が発生したり、ビルドされないなど緊急イシューが発生した時に使用します。

#### D-N (Within N days)
「Working Day基準でN日以内にレビューしてください」
一般的にD-2タグを多く使用し、重要度が低かったり日程に余裕がある場合はD-3~D-5を使用することもあります。


### 終わり
コードレビューには、テクノロジー組織の働き方、文化が反映されています。


- 低文脈コミュニケーション志向の文化
- コミュニケーション費用を高い費用と考える文化
- 非同期コミュニケーションを目指す文化

この文を通じて技術組織でどのような文化が効率的なのかを理解し共感できる機会になればと思います。

*個人記録ですので、様々な部分でリファレンス参考にしました。 ご了承ください.
Python Language - Comprehension（内包表記）

Python では、いくつかの言語がサポートしている内包表記 (Comprehension) が使用可能です。

__5.1.3. List Comprehensions__
https://docs.python.org/3.9/tutorial/datastructures.html#list-comprehensions

__リスト内包表記__
https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%83%88%E5%86%85%E5%8C%85%E8%A1%A8%E8%A8%98

ここでは、以下の代表的な Data Type について、簡単な使用方法をご紹介します。

- String (Str)（文字列）
- List（リスト）
- Tuple（タプル）
- Set（集合）
- Dictionary (Dict)（辞書）

#### 環境
以下の Python 3.9 / Linux 環境で確認します。
```shell
$ uname -si
Linux x86_64

$ python3.9 -V
Python 3.9.13

$ python3.9
Python 3.9.13 (main, Jun 15 2022, 11:24:50)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-13)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
### List
先の Python Tutorial の Link にもあるとおり、内包表記を使用する場面が最も多いのが List ではないかと思います。
例えば、以下のようなものが挙げられます。
```shell
>>> LIST=[x for x in range(0,20,2)]
>>> type(LIST)
<class 'list'>
>>> LIST
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
```
### Set
Set は List 同様に内包表記を使用することができます。例えば、上記の List の例を少し変更するだけで可能です。
```shell
>>> SET={x for x in range(0,20,2)}
>>> type(SET)
<class 'set'>
>>> SET
{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
```
### String (Str)
str() で List 同様に内包表記を使用してみます。
```shell
>>> STRING=str(x for x in range(0,20,2))
>>> type(STRING)
<class 'str'>
>>> STRING
'<generator object <genexpr> at 0x7ff4d208ec80>'
```
この場合、generator object が作成されます。
また、str() に List で内包表記を指定すると、[] に囲まれた全体が文字列として作成されます。
```shell
>>> STRING=str([x for x in range(0,20,2)])
>>> type(STRING)
<class 'str'>
>>> STRING
'[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]'
>>> STRING[0]
'['
>>> STRING[1]
'0'
>>> STRING[2]
','
>>> STRING[-1]
']'
>>>
```
Str における簡便な例としては、join() の内包表記で作成する方法があります。
```shell
>>> STRING=''.join([str(x) for x in range(0,20,2)])
>>> type(STRING)
<class 'str'>
>>> STRING
'024681012141618'
```
### Tuple
Tuple で List 同様の内包表記を使用すると、generator object が作成されます。
```shell
>>> TUPLE=(x for x in range(0,20,2))
>>> type(TUPLE)
<class 'generator'>
>>> TUPLE
<generator object <genexpr> at 0x7ff4d208ef20>
```
tuple() で内包表記を使用すれば可能です。
```shell
>>> TUPLE=tuple(x for x in range(0,20,2))
>>> type(TUPLE)
<class 'tuple'>
>>> TUPLE
(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)
```
### Dictionary (Dict)
Dict では、List の例に倣って Key と Value を内包表記で指定することができます。
```shell
>>> DICT={x: x for x in range(0,20,2)}
>>> type(DICT)
<class 'dict'>
>>> DICT
{0: 0, 2: 2, 4: 4, 6: 6, 8: 8, 10: 10, 12: 12, 14: 14, 16: 16, 18: 18}
```
この例では、Key の型は int になります。
```shell
>>> for K in DICT.keys():
...     print(type(K), end=" ")
...
<class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> >>>
```
Key の型を Str にすることも可能です。
```shell
>>> DICT={str(x): x for x in range(0,20,2)}
>>> type(DICT)
<class 'dict'>
>>> DICT
{'0': 0, '2': 2, '4': 4, '6': 6, '8': 8, '10': 10, '12': 12, '14': 14, '16': 16, '18': 18}

>>> for K in DICT.keys():
...     print(type(K), end=" ")
...
<class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'str'> >>>
```
Sipsデータ 2　備忘録

作業内容

フォルダの構成
　Client2-----D:\S_DATA-----BAT　　 　(Python実行ファイル,BATファイル、Config.ini等）
                　　　　　　　　　　　      ｜
  　　　　　　　　　　　　------Today_SIPS（サーバーからコピーされたファイル群）
      　　　　　　　　　　　 ｜
          　　　　　　　　　　　　------SIPS　　　 (Pythonスクリプトにより移動されたファイル群）

config.ini
 [DEFALUT]
    取り急ぎPath関係を設置。
　　path = os.chdir("D:\S_DATA\BAT")としてカレントを移動してからIniファイルを読み込み
　　その都度移動させることにしている。

TXTファイルの読み込みと移動
　list_file_name =  os.listdir(Today_sips)
  　for i_file_name in list_file_name:
    　　　join_path = os.path.join(Today_sips,i_file_name)
       　 with open(join_path,encoding="CP932", newline='') as f:
　　　　　　　csvreader = csv.reader(f)
　　　　　　　content = [row for row in csvreader]  

　encording='UTF-8' だと読み込めないと怒られたのでshift-jisに変更。web上に解決策が載っており助かるのだが
　やっつけになるが故に意味を知らずに進めている事に不安がある。

　今これを見ていると、csv.readerで読み込む必要があるのか？
　
　この先だが、直接的sqliteに放り込むのか、必要なデータを一旦、配列、panndas、タプルなどに
　代入してから入れる方がいいのか？
　ちょっと考える。
【技術書まとめ】HTML&CSS コーディング・プラクティスブック 2 実践シリーズ

引き続き今のCSSを学ぶために本書を手に取った
参考になった箇所をメモ。

### 作成サイト

https://keen-pegasus-f74da3.netlify.app/

### ルート\<html\>のfont-size:100pxにして全体をremで管理する

```css
:root {
  font-size: 100px; /* 20pxは0.2remとなる */
}
```


### remベースのテキストの基本設定

```css
/* テキストの基本設定 */
body {
  color: var(--darkgray);
  font-size: 0.16rem;
  font-family: sans-serif; /* Windowsではメイリオ、macOSやiOSでは「ヒラギノ角ゴ」で表示される */
  line-height: 1.8;
}
```

### ヒーローイメージを画面の高さに合わせる

```css
html, body, .hero {
  height: 100%; /* 100vhだとモバイルではブラウザアドレスバーなどを含んでオーバーフローしてしまう */
}

body {
  overflow-y: scroll;
}
```

### 擬似要素で読み込んだSVG画像のサイズ指定

- SVGはレスポンシブ設定されていないとCSSでサイズ指定できない
    - `viewBox="0 0 31.7 26.4"`
    - `<img>`で読み込んだ場合はCSSでサイズ調整できる


### スクリーンリーダー用のテキストを非表示にする設定

- 米政府デジタルサービスチーム18Fの設定
    - https://accessibility.18f.gov/hidden-content/

### 左右の余白がある状態で画像を横いっぱいに広げる

```css
.item .photo {
  /* 左右の余白の分だけマイナスマージンで広げる */
  margin: 0 calc( var(--side) * -1 );
}
```

### 横並びにした画像を重ねる

```css
.item.cafe .fig1 {
  flex: 1 1 auto; /* 伸縮あり */
  
  /* 重ねる幅を決める */
  margin-right: -0.47rem;
  margin-bottom: 0.38rem;
}

.item.cafe .fig2 {
  flex: 0 0 43vw; /* 伸縮なし */
}


.item.cafe .fig2 img {
  /* 重ねる幅を決める */
  height: 1.56rem;
}

.item img {
  /* 画像がオリジナルサイズより大きくなることを許可する */
  width: 100%;
  object-fit: cover;
}
```

### お知らせで文字数が可変の横並びにする

![スクリーンショット 2022-11-15 9.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282504/0aa4dbb2-7582-1b05-a259-bc7413bee50c.png)


`flex-wrap: wrap`にして、足して100%の固定幅で並べる

```css
.news dl {
  font-size: 0.16rem;
  display: flex;
  flex-wrap: wrap; /* wrapにする */
}

.news dt {
  flex: 0 0 1.57rem;
}

.news dd {
  flex: 0 0 auto;
  width: calc(100% - 1.57rem); /* <dt>を100%から日付の幅を引いた値にする */
}
```

### widthを指定したときに改行しないようにする

```css

.hours dd {
  flex: 0 0 auto;
  width: calc(100% - 4em);
  margin-left: 0;
  white-space: nowrap; /* 自動改行を禁止する */
  overflow: visible; /* オーバーフローを表示する */
}
```

#### CSSグリッドで同様なことをする

```css
.hours dl {
  display: grid;
  grid-template-columns: auto auto;
  column-gap: 1em;
  justify-content: center;
}
```
Apache Airflowの環境変数を使用する

# Apache Airflowとは

Apache AirflowはOSSのワークフロー管理ツールです。DAG（有向非巡回グラフ）を用いてワークフローを作成し、各種データの取り込み、加工などの処理のワークフロー制御を行うことができます。
また、AWSなどのクラウドプロバイダーからApache Airflowのマネージドサービスが提供されているため、比較的に導入、利用がしやすいツールとなっています。
この記事ではAirflowのバージョン2.2を使用しています。

# Apache Airflowの環境変数の使用

Apache AirflowではDAGから使用可能な環境変数(Variables)をAirflow UIのAdmin画面を通して設定可能です。  

## 環境変数(Variables)の設定

- Airflow UIで「Admin」 → 「Variables」を選択します。
  ![mwaa-handson-var-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/a08cfdfb-1f73-311f-ec4b-2318c8959b55.png)
- 「+」を選択します。
  ![mwaa-handson-var-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/9ba32168-0adf-30a3-090f-e6bcd45ebaad.png)
- 環境変数のKey, Valを設定し「Save」をクリックします。
  ![mwaa-handson-var-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/ed863f12-aacb-82f4-8903-4e73bed24892.png)
- 環境変数(Variables)に登録できたことが確認できます。
  ![mwaa-handson-var-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/e91fd7a7-794e-112c-9a9f-6c4435c74b52.png)

## DAGのコードで環境変数を利用する

DAGのコードでは`Variable`のimportをまずはする必要があります。  
`Variable.get(Key値)`で環境変数のValueを取得することができます。

```python:コード例
from airflow.models import DAG, Variable
output_table_name = Variable.get("output_table")
```
intra-mart ユーザー定義 JavascriptのVerについて

intra-martのユーザー定義のJavascriptを作成して、エラーになったので、備忘録として残す。

## Javascript
[ArrayBuffer](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer "ArrayBuffer")を使うために、以下の機能を作成した。

```
function str2ab(str) {
  const buf = new ArrayBuffer(str.length);
  const bufView = new Uint8Array(buf);
  for (let i = 0, strLen = str.length; i < strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}
```
## 実行結果
```
jp.co.intra_mart.system.javascript.EcmaError: ReferenceErrorです。""ArrayBuffer ""が定義されていません。
```
## 調査
IM-LogicDesignerのユーザ定義「Javascript」は、サーバサイドで実行されるJavascriptとなる。
サーバサイドJavascriptは、サードパーティライブラリとして Rhinoを導入し、バージョンは 1.7R4 を利用。

参照：2022 Spring(Eustoma) リリースノート : サードパーティ ライセンス一覧
https://document.intra-mart.jp/library/iap/public/iap_release_note/texts/license/index.html

Rhino 1.7R4 は、JavaScript 1.7 で利用可能な内容、および、一部の JavaScript 1.8 や ES2015 以降の書き方が利用可能。

参照：Rhino ES2015 Support
https://mozilla.github.io/rhino/compat/engines.html

## 原因
ArrayBufferは、サーバサイドJavascriptエンジンであるRhinoでサポートをしていないメソッドであることがエラーの原因。
View Drawing Cycle

- 普段、iOSアプリを開発していて、Viewの描画サイクルをなんとなくで理解していた節があったため、ここにメモを残す。
## Viewの描画サイクルを理解する
### 始めに
- ユーザーがアプリに対して何らかの処理を実行すると、そのイベントがイベントキューに追加され、アプリ内のオブジェクトにディスパッチされます。そして、その処理終了後にメインランループに処理を戻した上で、ビューのレイアウトと描画を制御するアップデートサイクルが走ります。

### アップデートサイクル
- 一度制御がメインループに戻ると、システムはConstraintsを元に、Viewのインスタンスを生成します。
- その際に、なんらかのビューが次の更新サイクルで変更が必要であると、記述されていた場合に、システムは一度その更新用のレイアウトパスの前にConstraintsをかけます。

### 遅延されたレイアウトパス
- ちなみに、ここでいう「遅延されたレイアウトパス」とは、なんらかのビューの変更を次の更新時にするにあたってのConstraintsのレイアウトパスのことを指します。
- つまり、ViewController生成時でなく、後々サイズを大きくしたかったり、動きをつけたかったりするオブジェクトに必要なレイアウトパスのことです。また、UIComponentに含まれていないものを`draw(_ rect: CGRect)`などを通して表示したい時になります。
- まず、Constraintsは基本的にViewController生成時に追加されます。（おそらくviewDidLoad時）
- しかし、その生成時には動的なレイアウトの変更はシステムによって、すぐに処理されるわけではなく、そのまま「遅延されたレイアウトパス」としてシステム内にとどまる。
- なので、動的にただレイアウトを変えようとしてもこのままでは何も変わらない。

### 解決策
- `setNeedsLayout()`を呼ぶことで、この問題に対処できる。
- ドキュメントによると、実際に「遅延されたレイアウトパス」には以下の２つのパスが含まれるらしいです。
    - update パスは、必要に応じて制約を更新します。これは、すべてのビューコントローラで updateViewConstraints メソッドを呼び出し、すべてのビューで updateConstraints メソッドを呼び出します。
    - レイアウトパスは、必要に応じて、ビューのフレームを再配置します。これは、すべてのViewControllerで viewWillLayoutSubviews を呼び出し、各ビューで layoutSubviews を呼び出します。

### Constraintsのアップデートの仕組み
- Viewが更新される際は、`func draw(_ rect: CGRect)`という関数が呼ばれる。

### ビューの再描画のために必要な関数

- `setNeedsDisplay()`とは
    - `setNeedsDisplay()`はあるViewに対して再描画を強制させる関数です。
- `layoutIfNeeded()`
    - これが呼ばれた時にただちにレイアウトのアップデートをすることができる。animationのConstraintsをかける際に、よく使われる。
- `layout Subview`
    - これは`overriding func`であり、Viewの生成時に呼ぶことができる。つまり、ここにおいて、Viewの`corner radius`などを呼ぶのが適している。
    - ViewControllerにおける`viewDidLayoutSubviews()`とやっていることは同じ。

## まとめ
- 基本的にViewが変わった際に、オートレイアウトがシステムによって計算されることによってレイアウトは自動的に変更される。
- しかし、ために自らシステムに対してレイアウトをアップデートし、計算をさせる処理を走らせる必要がある。
円グラフを表示する(SPSS Modeler データ加工逆引き10-2)

# 円グラフを表示する（新グラフ）

![スクリーンショット 2022-11-15 14.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d753ae96-154b-01d7-9c4d-9dca4f139519.png)

## 1.想定される利用目的

・分布の確認
・ばらつきのあるグループ間の比較


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/pie_chart.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-11-15 14.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cbeae558-ee17-934c-938f-4518a0acfda0.png)

入力するデータを確認するため[テーブル]を実行します。
![スクリーンショット 2022-11-15 14.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4affcee5-cbc0-b20d-b848-c0ef1635b94f.png)

[グラフボード]ノードで従来の円グラフを表示します。

<img width="400" alt="スクリーンショット 2022-11-15 14.28.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e8d752db-777e-817c-e61b-bccf529069e1.png">

[ユーザー入力]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ef9f2d0-77cb-20ba-4894-df147b7e4b05.png)

円グラフを選択します。

![スクリーンショット 2022-11-15 14.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/880e057f-0768-8259-a993-8e8dde6d7225.png)


以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-15 14.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f1234325-ffaf-7281-75d4-d01dd7b2d337.png)

![スクリーンショット 2022-11-15 14.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ac533801-18ed-b03a-9678-1566e3f5dc66.png)


#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
パスワードリセット機能の実装

# パスワードリセット機能の実装

## 実装
１完成イメージを掴む

http://localhost:3000/loginの「パスワードをお忘れの方はこちら」のリンク以降を実装
・config/routes.rbにリンクの追加

２リンクを押した後はパスワードリセット申請画面を表示
.controllerおよびviewの追加

３メールアドレスを入力して、送信すると、パスワード再発行メールを送信
.Mailerを追加
.ControllerでMailerを実行
.完了後はメッセージ付きでトップページにリダイレクト

４メールからパスワードリセット用のリンクに遷移
・config/routes.rbにリンクの追加
.controllerおよびviewの追加

５パスワードリセット用の画面でフォームにパスワードと確認用パスワードを入力して、更新するボタンを押すことでパスワードを変更
.Controllerの追加
.完了後はメッセージ付きでトップページにリダイレクト

６更新したパスワードでログインできることを確認

より詳しいな流れは[こちら](https://osamudaira.com/247/)
MacでSQL Serverを動かしてsqlcmdとNode.jsからアクセスしてみる（2022）


node.jsからSQL Serverいじる必要が発生するかもしれないのでメモ。

## SQL Serverの起動

MacでSQL Serverを動かすにはDockerを使います。

```bash
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P@ssw0rd!" -p 1433:1433 -d mcr.microsoft.com/mssql/server
```

>パスワードが簡単過ぎるとだめみたい。

## sqlcmd

SQL Server標準のクライアントツールをインストールします。

>使いにくいのでpythonツールであるmssql-cliを利用しようと思いますたが、Python3.10.xで動かず断念。
>[Azure Data Studio](https://learn.microsoft.com/en-us/azure-data-studio/download-azure-data-studio?view=sql-server-ver16&tabs=win-install%2Cwin-user-install%2Credhat-install%2Cwindows-uninstall%2Credhat-uninstall)という感じGUIツールも使えます。

### インストール

インストールはBrewでできるみたいです。

```bash
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew install mssql-tools
```

### 利用

簡単な操作方法は[こちら](https://qiita.com/zaburo/items/6edf7c05c5d4f5e039eb)をご覧ください。

#### ログイン


```bash
sqlcmd -S server -U user -P password
```

#### データベース作成

```bash
create database testdb;
go
```

#### データベース切替

```bash
use testdb;
go
```

#### テーブル作成

```bash
create table members(
 id int identity(1,1) primary key,
 name nvarchar(32),
 age int
);
go
```

#### データ挿入

```bash
insert into members(name,age) values('hoge',10);
go
```

## Node.jsからアクセスしてみる

以前はSQL Serverへの接続には[tedious](https://github.com/tediousjs/tedious)というモジュールを使っていましたが、最近は[node-mssql](https://www.npmjs.com/package/mssql)というのがあるみたいなので、そっちを利用してみます。

>開発元は同じようです。


### インストール

```bash
npm install mssql
```

### 実装

本当はpoolとか使ったほうがいいのでしょうけど、とりあえず接続＋Selectのみ。

```js:index.js
const sql = require("mssql");

const config = {
    server: "localhost",
    user: "sa",
    password: "P@ssw0rd!",
    database: "testdb",
    options: {
        // enableArithAbort: true,
        encrypt: false,
    }
};

(async () => {

    try {
        const conn = await sql.connect(config);

        const query = await conn.query("select * from members");
        query.recordset.forEach(async row => {
            console.log(`id: ${row.id} name:${row.name} age:${row.age}`);
        });

        conn.close();
    } catch (e) {
        console.log(e);
    }

})();
```

### 動作確認

```bash
node index.js

id: 1 name:hoge age:10
```

## 参考

* https://setsuna-no-matataki.hateblo.jp/entry/2021/03/20/165058
今期のチーム目標100のリスト -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の5日目の記事です

今回は他のチームでもおそらくやっているところが少ないであろう、通称「100のリスト」を紹介します。
100のリストは明日紹介する「月別ビンゴ」と一緒にやることでより効果的かと思いますので、明日も見ていただければと思います。

# 前回

https://qiita.com/Sicut_study/items/2ab0f13176d83de7e1b5

# Chapter#4 今期チームで何を達成したい？

じん「KPTふりかえりをすることでドラッカー風エクササイズが今後もやるべき取り組みだということがわかりましたね」
ベープ「もしドラと何も関係ないことがよくわかりました！！」
ミュート「そこはもともとわかってたでしょ（笑）」
アール「ところで、次はチームとしてどんな取り組みをするのでしょうか？じんさんどんどん新しい取り組みをするので次も楽しみです」
じん「新しい取り組みをするうえで、私が個人的にやっていることがあるので、それを今回はチームに取り入れたいと思います！」
アール「じんさん多趣味でいろいろな特技持っていますし、それを取り入れたらさらにチャレンジできそうですね」

# 100のリストについて

100のリストとは半期に1度(半期が会社の区切りの為)、チームで達成すべきこと100項目を箇条書きにしたリストを指しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/e35e32fa-120b-b6ca-4d03-99b99151086b.png)

これが実際に私たちが[HackMD](https://hackmd.io/)という全員でMarkdownを編集できるサイトに書いている100のリストです。

期初にチームでこの100のリストをとにかく埋めていきます。
期初で100項目埋めるのは難しいので、それ以降思いついたことをどんどん書くようにしています (12月に期末になりますが現在110個ほど書かれていました)

そして、この項目を1つでも達成することを目指して日々の開発や勉強、チームでの取り組みなどを行っていきます。
実際に達成した項目を消していき達成数を増やしていくのがチームとして楽しみになっているので積極的に新しいことにチャレンジする文化ができました

この100のリストですが、元々はこのツイートをみて素敵だなと思いアレンジしたものになります

https://twitter.com/toriga_niwa/status/1541697587669245952?s=20&t=HBrDXl2nAUbYL5aPGGrWJA

元々ネタは「ちいかわ」のようですね

普段プライベートでも1年の初めに100個やりたいことを書いて暇があれば達成のために動くようにも心掛けています！

![FhpLvPxaUAA09Qm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/ea5f9946-bdc4-20de-39f9-c286f16afa73.jpeg)

# 次回



# おわりに

今回はチームで取り組んでいる「100のリスト」について紹介しました
やりたいことを明確にすることで、やる機会を作ることができるとてもよい取り組みだと思っています。
まずは小さなことでもよいので100項目来年度から埋めてみるとよいのではないでしょうか
ふりかえりを大事に -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の4日目の記事です

今回はふりかえりについて説明していきたいと思います。私のチームでも特に大切にしているイベントですが、なぜふりかえりを頻繁にやるのか、そのメリットが伝われば嬉しいです。

# 前回

https://qiita.com/Sicut_study/items/d6a6351c525e519724e7

# Chapter#3 あなたならこれからもやる？

アール「ドラッカー風エクササイズで自分に得意なことがないのがよくわかりました」
ミュート「今後どのように成長していけばいいかもわかったので良い機会でした」
じん「もう終わりの雰囲気になってるけど、新しい取り組みをしたらちゃんとふりかえりをやるように今後チームではしましょう」


ベープ「ふりかえりってアジャイルでいうレトロスペクティヴってやつだよね？今じゃなくてそのタイミングでもいいんじゃない？」


じん「レトロスペクティヴはスプリントの開発についての振り返りをする場で、今回のふりかえりは今回のイベント、ドラッカー風エクササイズをしたことについてふりかえりをします。このイベントがどんなメリット/デメリットがあったか、また社内にこの取り組みをもっと広めた方がよいのかなどを振り返りを通して決めていきたいと思います」

# ふりかえりについて

私たちのチームではふりかえりを大切に仕事をする文化があります。

主に使うふりかえりの手法は「KPT」です。

スプリントや取り組みに対して、Keep(続けること/良かったこと)、Problem(問題点)、Try(次回やること、今後やること)、それぞれに対して意見を出し合うようにしています。

スプリント終わりのレトロスペクティヴでのふりかえりならこの内容がたくさん出ることが大切です。

私たちはこのふりかえりを新しい取り組みをしたときには必ずやるようにして次回の改善や、そもそもこの取り組みをやるべきなとかの判断材料にしています。

たとえば、輪読会を開いた時の最後にふりかえりをすることで、輪読会のスタイルや、もっと効率よくみんなが学べる方法を考える機会にしています。

また初めての取り組みの最初にだけふりかえりをするというわけではなく、例えばこの後の記事で詳細は書きますが、モブプログラミングであれば導入してから1ヶ月ほどは毎日最後に5分程度のふりかえりをして、チーム内のローカルルールなどを使ってより効率的な開発を目指していました

チームでは色々な新しい取り組みをしていますが、それをチームの中で閉じていては会社の成長にはつながりません。いい取り組みはしっかりと社内に広げていくべきです。そこで、ふりかえりをしてこの取り組みは社内に広めていくべきなのかというところまで考えるようにしています。

ふりかえりについては他にも「Fun Done Learn」や「YWT」などもあります。

スプリント終わりのレトロスペクティヴはだんだんと意見が出にくくなるので(振り返ることがなくなる)、時々ふりかえり手法を変更することもおすすめです。

# 次回

https://qiita.com/Sicut_study/items/ab6ce11bc185d217881c

# おわりに

今回は簡単にふりかえりのお話しと、なぜふりかえりを大切にしているのかをまとめてみました。

新しい取り組みをしたあとにそれを検証することはとても大事です。やらないと勿体無いのでぜひやってみてください
まずはドラッカー風エクササイズでメンバーを知る -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の3日目の記事です
今回から実際にチームで取り組んできて、今後もやっていきたいと思えた取り組みについて紹介します。

まず始めはチームに新しいメンバーが入ってきた時や、新しいチームを結成するときにぜひ最初にやってほしい**ドラッカー風エクササイズ**です

# 前回

https://qiita.com/Sicut_study/items/a3f62efc43617fdddebd

# Chapter#2 話しづらくないですか？

じん「前回みなさんには今後私たちのチームでやっていこうとしているイベントとその内容について紹介しました」
ベープ「本を読んできたのでなんとなくイメージはつきました」
ミュート「アジャイルって結構会議的なの多いよね。そんな話す内容あるのかな。。。」
アール「私とじんさんはレトロスペクティブ何度もやってますが、やはりやるたびに反省点がなくなってきます。これが問題なんですよね。あとは知らないメンバーだと変な見当違いなこと言えないので私も意見言いづらいことあります」

じん「良いチームになるにはまずは、全員が思ったことを躊躇せずにいえる関係になることが大事なので今日はみんなでドラッカー風エクササイズをしてそれぞれのことを知っていければと思います」

ミュート「聞いたことないな。。。」
ベープ「もしドラってやつですね」

じん「それとは関係ないですｗ」

# ドラッカー風エクササイズについて

ドラッカー風エクササイズは、4つの質問に答えることで相互理解と期待のすり合わせを行うチームビルディングの方法です

質問は
1. 自分は何が得意なのか
2. どういう風に仕事をするか
3. 他のチームメンバーに期待することは何か
4. 自分が大切にしている価値観は何か

それぞれが4つの質問に対して答えていき、発表をしていきます

# 実際に行う

今回私たちはこちらの記事をみて「ドラッカー風エクササイズ・ペパボエディション」を行いました

https://tech.pepabo.com/2017/07/07/the-drucker-exercise/

質問は以下の3つです
1. 自分は何が得意か
2. チームメンバーは自分にどんな成果を期待していると思うか
3. 他のチームメンバーに期待することは何か

ワークショップには`Mural`という付箋ツールを利用しました
各項目に10分以内に8個以上答えるルールで行いました。8個は思いついたらすぐ書かないと間に合わないので、思っても書くのを躊躇する内容も書かなければならないです。
内容は本当になんでもOKとしたので期待されていることを堂々と描くようにしました(特に私が先導して)

以下が実際に行った際のMuralです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/87874cc6-4446-90fa-ebe3-4be5679ae020.png)

最後に他のメンバーの発表を聞きながら、実際に期待していることを追加で青い付箋で書いて貼ってあげました
(私は1つだけ期待されていることが追加されました)

# 振り返り

後日の記事でも書こうと思いますが、私のチームでは「振り返り」というのを大事にする文化にしています
新しく始めた取り組みについてもしっかり振り返りをすることで、他のチームに進めたほうが良いか、今後同じ取り組みをやったほうがよいかなどの検証をしています

今回の振り返りは以下になりました (振り返りについては後日の記事で紹介します)

**楽しかったこと/良かったこと**
- 各々の特徴が知れた
- 各自の得意としていることがわかって楽しかった
- この会そのものがにぎわっていてよかった
- まじめな話もあってよい
- みんな自由にかけた
- 年次関係なく楽しくやれた

**できたこと**
- チームの雰囲気を知れた
- 今後も続ける
- みんなちゃんと発言で来た
- 初の試みだけどみんな8個かけてた
- ドラッカー風エクササイズをやれた
- 得意分野見つけるの大変
- 得意がない状態での得意を伝えるの難しい

**学んだこと**
- とにかくやってみる
- 楽しく仕事をする
- 得意分野をみつけたい
- 改めて得意なことをみつけるの難しい
- デザインみんな苦手
- なにができるのかわかるのがいい
- コミュニケーションとれる
- 期待されていることがわかる
- 各自の意識がわかった

5分程度ですがけっこう振り返りがでてきて、チームとしては今後も機会があれば行うという結論になりました

# 次回

# おわりに

今回はドラッカー風エクササイズの紹介でした
チームを始めるうえでどれだけ早くメンバー同士が仲良くなるか、信頼できるかはけっこう大事だと思っております
プロジェクトの開始時などに30分程度でぜひやってみてください

# 参考

https://tech.pepabo.com/2017/07/07/the-drucker-exercise/
チームで行っているスクラムイベント -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の2日目の記事です

実際にチームでやっていることについて要点を押さえて説明していきます。
今回はアジャイルについてお話ししますが、アジャイル自体の詳しい話はしておりません。あくまでチームでやっていることについて簡単に紹介していきます。

# 前回

https://qiita.com/Sicut_study/items/c00818757e499aa0d022

# Chapter#1 スクラムってなにやるの？

ベープ「ところで、これから俺らは何すれば良いの？」
じん「まずは、スクラム開発やアジャイルについて学んでからよくやるスクラム開発の＊＊イベント＊＊の導入をしたいと思います」
ミュート「アジャイルについて何も知らないんだけど、なにからすればいいですか？」
じん「みなさんには社内の福利厚生である書籍購入申請で購入したこの本を配りますので1週間程度で読んできてください。仕事中に時間をとっていただいて大丈夫です」

そうするとじんは２つの本をカメラに写した

**SCRUM BOOT CAMP THE BOOK【増補改訂版】 スクラムチームではじめるアジャイル開発**

https://amzn.asia/d/8kK3ZiL

**ここはウォーターフォール市、アジャイル町 ストーリーで学ぶアジャイルな組織のつくり方**

https://amzn.asia/d/8XNxpzF


ベープ「本読むの苦手なんすよね」
アール「私も苦手です」
じん「苦手な方もあると思ったので、ストーリー性を重視した読みやすい本を選んできました！特にウォーターフォール市は最後の展開が熱いのでおすすめです」

じん「スクラムを学ぶにはまず一通り概要を知ることから始めるのが1番早いので頑張ってきてください」
一同「がんばります、、」

そこから1週間仕事中に本を読む時間をつくり、しっかりと最後まで読めるようにサポートを行った

- 1週間後 -

ベープ「ウォーターフォール市めっちゃ面白かったです！最後ほんとに胸熱な展開だったし、内容もわかりやすくて読みやすかったです！」
アール「もう一つの方も図やイラストがたくさんあって読みやすかったです」

私「では、スクラムやアジャイルについてなんとなく概要がわかったようなので私たちが今後やる取り組みについて説明します」

# スクラムイベントの取り組み

私のチームでは1スプリント1週間で開発を行っています。
イベントは定番のものを基本的にやっており、周りと変わったことをしているというのはないです。

## デイリースクラム

朝会と言われる毎日5-10分程度行われるイベントです
ここでは、前日までの作業の進捗を報告するとともに困っていることなどをチームに共有しています

しかし、このデイリースクラムはこのあと「モブプログラミング」を導入することで廃止になります
夕方にデイリースクラムをやっていることもありましたが、朝に行うことでダラダラと仕事を始めることが少なくなりました

## プランニング

スプリントの初めの日に行います
今週でどのタスクに着手するかという計画を立てていきます

1時間程度で行うことが多いですが、タスクが複雑な場合は2時間程度とることもあります
ここではまずタスクボードを確認して今回やるタスクを優先度の高い順から1つ選びます
選んだタスクに対して完了するまでの工数を見積もるのですが、私たちのチームではこの段階で作業を手順レベルにまで分解した**TODOリスト**を作成しています

このときなるべくチームの中で若い人にTODOリストを作らせるようにしています。(事前に作ってきてくれるとありがたい)
そうすることでチケットから具体的な実装方針というのを描ける能力ができてきます。
またこの後のアドベントカレンダーでも説明しますが、このTODOの細かさがテスト駆動開発にも大きくつながってくるため、作ったTODOを実装イメージがわいている人が手直ししてより具体的なTODOにするようにしています。

修正が入ることでどんどんタスクを見積もる精度が上がってきます。
またタスク完成までに時間がかかるもの(チームではSP5以上)のものは、タスクを2つに分解してそれぞれにストーリーポイントを付けるようにしています。

そして、1週間でまだ時間に余裕がありそうな場合にさらに次の優先度の高いタスクの見積もりをしています

## リファイメント

スプリントの真ん中の日に1時間程度行われる再度プランニングをするというイベントです
ここでは、割り込みで入ってきた作業を現在のタスクと入れ替えるために見積もりを行ったりと1スプリントのタスクを変更・調整しています

## レビュー

スプリントの最終日に1時間程度で実際にプロダクトオーナーに作成しているものを見せて、相違がないかなどをチェックしています
ここで分からない点などを質問したり、要望を受け取ることで手戻りを少なくするようにします

## レトロスペクティブ

スプリントの最後に1時間程度で行われる振り返りの会です
このスプリントでどのようなことがあったか、どのような点が良かった/悪かった、次回どうするとよいかなどを話し合っています。

振り返りはかなり大事なので、ここでどれだけ話が盛り上がるかは重要視しています

# 次回

https://qiita.com/Sicut_study/items/d6a6351c525e519724e7

# おわりに

今回は簡単にチームでやっているスクラムイベントをまとめてみました
だいたいスクラム開発をやっているところと同じにはなりますが、プランニングをかなり大事にするチームの文化があるのは会社でも珍しい気がします。
はじまり -モブプロ開発を行なっているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の1日目の記事です
こんにちは、Watanabe Jin(@Sicut_study)と申します。

このアドベントカレンダーではモブプログラミング(モブプロ)で開発をしているチームがどのようにして信頼できるチームにまで成長できたのか、そこでの取り組みについて物語調で記事にしていきます。

記事1つ1つで小さな取り組みについて紹介しているのでぜひチームでやってみてください！

# Chapter#0 チームのはじまり

この物語はとある小さなシステム会社のとあるチームのお話です

上司「みなさん集まっていただいてありがとうございます」

画面には見知らぬ人を含めて5人の顔が映っていた
最近はすべての会議がZOOMで行われており、緊張感が漂っている

上司「今日からみなさんには1つのチームとしてとある社内システムの開発を行ってもらいます。このシステムは外部発注を行っていたのですが、予算が尽きてしまったので続きの20%ほどを手の空いている皆さんに任せたいと思います」

このプロジェクトではRailsを用いた開発を行うというもので、社内で初めて外部発注したシステムである。普段の社内のシステムのデザインとは異なる部分が多くあるため、チームとなった4人誰もが簡単には理解できるコードではなかった

「久しぶりのRailsですが頑張ってコード追ってみます」

そう最年少の私は言った。
私はこの時、新卒入社でAシステム会社に入り3年目のエンジニアである
入社後、機械学習や自然言語処理の開発を行い、現在Web開発をしている
好きな技術はコンテナ開発、色々な技術を幅広く触っている

「form層とかservice層ってやったことないなぁ」

30代中盤のミュートさんがそうつぶやいた
この方はチームの中でもっとも社歴が長いエンジニアである
名前の由来はズームでよくミュートの状態で話していることからきている
好きな技術はアクティブレコード

「まぁなんとかなるんじゃないですか」

明らか適当な感じで言っているのが伝わるこの方はベープさん
今回のメンバーで2番目に業界経験がある方である
元々JavaやDB周りを専門に仕事をしていた。Rails開発は少しやった程度で主にチームのPMのような立ち回りで仕事をしていることが多い
好きな技術はダジャレを言うこと

「自分はよくわかってないですが、頑張ります」

20代後半の男はそう自信のなさそうにつぶやいた
この方はアールさん、私の2つ上の先輩である。元々は営業サイドでお仕事をしており、1年前にエンジニアに社内転職してその頃から私が指導を行っている。
名前の由来はR言語を触ったことがあるところからきている
好きな技術は現在模索中

上司「私も帰ってきたコードはまだほぼみれていないのですが、ゆっくり理解しながら完成まで持っていってほしいです」
ミュート「期限はいつごろまでですか？」
上司「本番利用開始が8月なので約3か月間になります」
ベープ「ほぉう」
上司「その後に開発してほしいのも既に決まっているので来期はこの4人でチームとなって動いてもらいます」
じん「次のシステムって何つくるんですか？」
上司「次は社内の技術レベル向上を一環に社内システムを新しい技術で作っていただこうと思っています。技術選定はじんさんにお任せします」
じん「なるほど。それは次の開発が楽しみです」
アール「私あまりチームの役に立てるかわからないですけど、宜しくお願い致します」

ここで会議は終了した
ZOOMに残っていた新チームの4人は話し合う

じん「ところでミュートさんとベープさんはスクラムでの開発経験はありますか？アールさんは私と一緒にずっと開発してきたのである程度スクラムは理解できています。社内的にはスクラム開発で進める流れになっているのでこのチームでもスクラム開発をしていきたいです」

ミュート「スクラムはなんちゃってでしかやったことないな。デイリースクラムくらいは毎日やってたけど、あとはよく知らない」
ベープ「私もそんな感じですね」

じん「なるほど。なら私もアールさんが経験あるので実際にやりながら慣れていきましょう」
アール「今回はじんさん、今回はTDD(テスト駆動開発)で進めていきますか？」
じん「ミュートさん、ベープさんはテスト駆動開発はされたことありますか？」
ベープ「私は自動テストすら書いたことないですね。前職も手動テストだけでした」
ミュート「Rspec(Railsのテストライブラリ)は書いてますが、TDDはやったことないです」

私はムムっとした顔をする。まさかのテスト自体もそこまで書いたことないという状況で不安が芽生えた

アール「ちなみに私もじんさんとテスト駆動で実際にペアプロしながらやりましたが、1人でかけるってほどではないです」

じん「では今後このチームで動いていくわけですし、今後はスクラム開発で進めていき、テスト駆動を教える、全員がよくわからないコードというのを考えてモブプログラミングで進めていきましょう」

一同「モブプログラミング？」

じん「詳細はあとで勉強会を開きます。とりあえず上長を説得してモブプログラミングで進めていいか許可を取ります。それまでアジャイル開発に慣れていきましょう」

こうして全く知らないメンバー、アジャイルについてほぼ知らない状態からのシステム開発が始まったのである…

# 次回

https://qiita.com/Sicut_study/items/a3f62efc43617fdddebd

# おわりに

今回は物語調で終わってしまいましたが、次回から実際の取り組みについて簡単に解説しながら紹介していきます。
いいねやコメントなどお待ちしております。
Robloxで他のスクリプトに書かれた関数を呼び出したい

## やりたいこと
複数のPartのScriptから同じ関数を呼びたいという目的です。そうすれば、各PartのScriptに同じ関数を書かなくていいから。
今回は、DisplayPartにSetValueという関数を書いておいて、ButtonPartからそのSetValue関数を使います。
[参考](https://create.roblox.com/docs/reference/engine/classes/BindableFunction#OnInvoke)
## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/1ac81f39-6123-d2ee-b7d0-0b11ce73195d.png)


## 手順
1. DisplayPartの下にBindableFunctionを追加する。
1. BindableFunctionの名前を変更する。今回はSetValueFunction。
1. SetValueFunctionの下にScriptを追加する
1. ButtonPart.ButtonScriptから、displayPart.setValueFunction:Invoke(1) とかくと、これが使える

## コード

```lua: setValueFunction
local bindableFunction = script.Parent
local displayPart = bindableFunction.Parent

wait(1)

local function setValue(intValue)
	displayPart.answerValue.Value += intValue
end

bindableFunction.OnInvoke = setValue

```

```lua: ButtonPart.ButtonScript
local ButtonPart =  script.Parent
local clickdetector = ButtonPart.ClickDetector
local displayPart = workspace.DisplayPart
local colorMemory = ButtonPart.BrickColor
local MY_NUMBER = 1

--先に宣言しておかないといけない
local function countMouseClick(player)
	print("1")
	ButtonPart.BrickColor = BrickColor.new(0.7,0.9, 0.9)
	displayPart.setValueFunction:Invoke(1)  --他の関数に記載されている関数を呼び出す
	wait(0.2)
	ButtonPart.BrickColor = colorMemory
end

wait(1)
--初期化中はanswerValueを叩かれると困る

clickdetector.MouseClick:Connect(countMouseClick)
```
重要なのは、displayPart.setValueFunction:Invoke(1)のみ。
ほかは今回関係ないです。

## 最後に
これで、他のScriptに書かれた関数をつかう事ができました！便利ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/ee01e8b5-b07b-639a-631e-b5af90793aaf.png)
amplify push のエラーと戦う

# ブランチを切り替えた時に、切り替え前に作成したlambda funtionがローカルのコードから消えてpushするパターン

## 症状
### error1

```
CloudFormation template is missing in the resource directory
/Users/xxxx/Documents/xxxxx/xxxxx/amplify/backend/function/functionXの名前
```

不要になっている/Users/xxxx/Documents/xxxxx/xxxxx/amplify/backend/function/functionXが残ってないか確認する


### error2
```
Resource is not in the state stackUpdateComplete
```
このときに
Backend environments＞アクション＞詳細＞最新のデプロイアクティビティを確認（ここはエラーになったら見た方が良い）
UPDATE_FAILEDを探すと


```
2022/11/15, 23:21:29	functionYの名前 (function)	｜ UPDATE_FAILED｜Parameters: [functionXの名前] do not exist in the template

```
がある

## 原因
- Aブランチ
    - functionX追加
    - 元々あるfunctionYがfunctionXを利用する
    - 開発を完了（AWSにpush済み）
- 別の修正をするためにBブランチを作る
    - ブランチからfunctionXは存在しなくなる。
    - amplify pushするとエラーになる

## 解決方法

amplifyの環境にfunctionXが残っていてさらにfunctionY→functionXの依存関係が残っているので以下の手順を行えばpushできる
- Bブランチでamplify pull
- functionYがfunctionXを利用する関係を切る
- functionXを削除する（依存関係を切らないで削除するとエラーになる）amplify remove function
- amplifi push
- Bブランチをコミットまで戻す
- amplifi push

全部のlambda functionを消して、pushするのが早いかも。
Ubuntu 20.04でasdfを使ったElixirのインストールスクリプトを作る

Elixirのインストールは`apt install`で可能ですが
どうしても、指定したバージョンでインストールしたい場合があります
その時にasdfを使うと便利です

`apt install`に比べて少しだけ手間があるのでインストールスクリプトを作ってみました

https://github.com/t-yamanashi/install/tree/main/elixir_asdf_install

# 使い方
```
$ git clone https://github.com/t-yamanashi/install
$ cd install
$ cd elixir_asdf_install
$ sh asdf.sh
$ sh elixir20.sh
```

# スクリプトの中身を覗いてみよう

asdf.sh (asdfをインストールするスクリプト)
```sh
#!/bin/sh
sudo apt update
sudo apt install git curl git
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.1
echo ". $HOME/.asdf/asdf.sh" >> ~/.bashrc
echo ". $HOME/.asdf/completions/asdf.bash" >> ~/.bashrc
source ~/.bashrc
```

elixir20.sh (asdfを使ってElixirをインストールするスクリプト)
```sh
#!/bin/sh
sudo apt -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk

asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git

asdf install erlang 24.0
asdf install elixir 1.12.2
asdf global erlang 24.0
asdf global elixir 1.12.2
```

`erlang 24.0` と　`elixir 1.12.2`を書き換えれば好きなバージョンをインストールできます
[Flutter]signInWithAuthProviderやFirebaseAppPlatform.verifyExtendsが見つからないエラーの解決策

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

本日はFlutterのトラブルシュート記事です。

最近巷でflutterのfirebaseのmethodが見つからねーといってビルドできない問題が発生しているようなので、2つの解決策を紹介します。

## エラー内容

firebaseを使ってるプロダクトでビルドすると下記のようなエラーが発生します。

```
    ../../../.pub-cache/hosted/pub.dartlang.org/firebase_auth-3.8.0/lib/src/firebase_auth.dart:623:25: Error: The method 'signInWithAuthProvider' isn't defined for the class 'FirebaseAuthPlatform'.
     - 'FirebaseAuthPlatform' is from 'package:firebase_auth_platform_interface/src/platform_interface/platform_interface_firebase_auth.dart' ('../../../.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.10.1/lib/src/platform_interface/platform_interface_firebase_auth.dart').
    Try correcting the name to the name of an existing method, or defining a method named 'signInWithAuthProvider'.
            await _delegate.signInWithAuthProvider(provider),
```

自分のプロダクトでもやろうとしたらこんなエラーも出ました。

```
../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.24.0/lib/src/firebase_app.dart:18:25: Error: Member not found: 'FirebaseAppPlatform.verifyExtends'.
    FirebaseAppPlatform.verifyExtends(_delegate);
```

## 解決策1

この方のツイートがとても参考になりました。

https://twitter.com/ogasho1028/status/1585896594624622592?s=20&t=-SCm6x5LN5ZUTw0C0ul1jw

答えとしてはパッケージのバージョンをdependency_overridesで上書きするといいようです。

https://twitter.com/ogasho1028/status/1585900381967912961?s=20&t=YupLzXo-yzdAFiz8c7DeUQ

```pubspec.yaml
dependency_overrides: 
  firebase_auth_platform_interface: 6.7.0
  firebase_core_platform_interface: 4.5.1
```

## 解決策2

自分はこっちで解決できたのですが、素直にfirebase周りのパッケージのバージョンをupgradeしたら治りました。

https://github.com/firebase/flutterfire/issues/9806#issuecomment-1315839233

```pubspec.yaml
  firebase_messaging: ^14.1.0
  firebase_core: ^2.2.0
  cloud_firestore: ^4.0.5
```

## まとめ

まとめると、firebase周りの見つからないエラーは

- 依存関係に要注意！
- upgradeすれば治る！

です。

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
Ghost + MySQLを Dockerで動かす

mysqlのポートが使われていたので変更している。

```docker-compose.yml
version: '3.1'

services:

  ghost-compose:
    image: ghost
    restart: always
    volumes:
      - ./ghost:/var/lib/ghost/content
    ports:
      - 3001:2368
    environment:
      database__client: mysql
      database__connection__host: ghost-db
      database__connection__port: 3303
      database__connection__user: root
      database__connection__password: password
      database__connection__database: ghost

  ghost-db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_TCP_PORT: 3303
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - 3303:3306
    expose:
      - 3303
```
CDNのjQueryをImport Mapsで読み込ませる方法

jQueryはもう使わないけど、一例として、、

```html:index.html
<!DOCTYPE html>
<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Sample Import Maps</title>
  <script type="importmap">
    {
      "imports": {
        "jQuery": "https://code.jquery.com/jquery-3.3.1.js"
      }
    }
  </script>
  <script type="module" src="./js/sample.js"></script>
</head>
<body>
  
  <div id="count">0</div>
  <input type="button" id="up" value="+">
  <input type="button" id="minus" value="-">

</body>

```

```js:sample.js
"use strict";

import 'jQuery';

$(window).on('load', function(){
    console.log('loaded!');

    let count = 0

    $('#up').on('click', function () {
        $('#count').html(++count)
    })
    $('#minus').on('click', function () {
        $('#count').html(--count)
    })
})
```

- jQuery以外のCDNでも使えそう
- CDNでなくてもローカルのJSファイルもできる
- 検索しても情報が少ない
- ES Modulesで書いてるので`index.html`はWebサーバー環境で見てください
LPC812MAXのI2Cを使い、AQM0802A液晶で文字表示(簡易版)


x mbed2リビジョン144
x リビジョンの変更ができる人むけ


x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!

目的
I2C液晶のテスト


![o_cop237.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c1881c28-34bd-d883-6496-3b201dd1fd2c.jpeg)



```c++


//AQM0802A_DEMO1_812_1

#include "mbed.h"

//I2Cの初期化  SDA SCL  812
I2C i2c(A4, A5);

//i2cバッファー
char data_read[4];

//初期レジスター
char INIT_com[] = {
    0x0, 0x38, //1
    0x0, 0x39, //2
    0x0, 0x4,  //3
    0x0, 0x14, //4
    0x0, 0x70, //5
    0x0, 0x56, //6
    0x0, 0x6C, //7
    0x0, 0x38, //8
    0x0, 0xC   //9
};

//画面のクリアレジスター
char INIT_cls[] = {0x0, 0x1};


//一文字の表示
void ns_putc(char ch)
{

    //文字を設定
    data_read[0] = '@';
    data_read[1] = ch;

    //I2Cに送信
    i2c.write(0x7C,data_read,2);
    wait_ms(2);

}//ns_putc


//文字列の表示
void ns_puts(const char *str1)
{

    //文字の中身がゼロか
    while (*str1) {

        //一文字出力
        ns_putc(*str1 ++);

    }//while

}//ns_puts


//カーソルの移動
void setCursor(int col, int rows)
{

    //位置を設定
    data_read[0] = 0x0;
    data_read[1] = 0x80 +  (rows * 0x40) + col ; //カーソルを移動

    //I2Cに送信
    i2c.write(0x7C,data_read,2);
    wait_ms(2);

}//setCursor


//メイン関数
int main()
{

    //液晶の初期化
    for (int ii = 0; ii < 9; ii++) {
        i2c.write(0x7C,&INIT_com[ii << 1],2);  // ii << 1 = ii * 2
        wait_ms(2);
    }//for

    //画面のクリア
    i2c.write(0x7C,INIT_cls,2);
    wait_ms(2);

    //表示
    setCursor(0, 0);
    ns_puts("HELLO");
    setCursor(0, 1);
    ns_puts("WORLD");

    //無限ループ
    while(1) {}

}//setup




```