OmniAICreator/Qiita-1.07M huggingface dataset:
Rails 7.0にバージョンアップしたらquery_log_tagsを有効化しよう 


# Profit
- verbose_query_logs = true でない環境でrails serverのログが少し追いやすくなる
    - ActiveJobを使っている場合はジョブのログも
- スロークエリログの発生箇所が少し特定しやすくなる

# How to
Railsアプリケーションの設定に以下を追加するだけ

```rb
config.active_record.query_log_tags_enabled = true

# カスタマイズする場合は `query_log_tags=` を使って指定可能
config.active_record.query_log_tags = [ :controller, :action ]
```

# 前提知識
## Verbose Query Logsについて
Railsアプリケーションを開発していてふとログを見た時に、SQLログのすぐ下にソースコードのどの行で呼ばれたのかが出力されている (下記参照) のが地味に便利だったりする。
```
  Article Load (0.2ms)  SELECT "articles".* FROM "articles"
  ↳ app/models/article.rb:5 # <- これ
```

これはActiveRecordの [Verbose Query Logs](https://guides.rubyonrails.org/debugging_rails_applications.html#verbose-query-logs) という機能で、 `config.active_record.verbose_query_logs = true` のようにして設定を有効化できる。Rails 5.2以降にrails newされたアプリケーションであれば意図的に無効化していない限り config/environments/development.rb にこの記述があると思う。

## ActiveRecord::QueryLogs
一方で、RAILS_ENV=productionな環境では通常 `config.active_record.verbose_query_logs` がtrueではないのでrails serverのログが手元で開発している時よりも追いづらかったりする。たとえば開発用にデプロイしたRailsアプリケーションの動作検証をしていて、何か期待通りに動かないなってときにデバッグが捗らない…なんてことがある。

このようなことを改善する手段のひとつとして、Rails 7.0で追加された [ActiveRecord::QueryLogs](https://api.rubyonrails.org/classes/ActiveRecord/QueryLogs.html) が使える。ActiveRecord::QueryLogsを使うと、以下のようにSQLログのコメントにコントローラ名・アクション名やActiveJobを使っている場合はジョブ名などを含めることができる（どのような情報を含めるかはカスタマイズ可能）。

```rb
SELECT * FROM books /*application:MyApp;controller:books;action:index*/
```

#  Reference

* https://api.rubyonrails.org/classes/ActiveRecord/QueryLogs.html
* https://techracho.bpsinc.jp/hachi8833/2021_09_06/111336#1-1
* https://techblog.gmo-ap.jp/2022/06/06/rails_7_query_log_tags/
* [Ruby on Rails 7の主要な新機能・機能追加・変更点 - Qiita](https://qiita.com/ryohashimoto/items/f5382478c78f296d8291#sql%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AB%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7%E4%BB%98%E4%B8%8E%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB)
【動かして学ぶ! Python Django開発入門 第2版】python manage.py startapp accountsがNo Module nameになる

# 起きたこと
「Chapter10 Djangoに認証機能を追加する」を進めていたときに本に沿って以下を実行したところエラーが表示された。

```python:ターミナル
python manage.py startapp accounts

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "python3.8/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "python3.8/site-packages/django/core/management/__init__.py", line 420, in execute
    django.setup()
  File "python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "python3.8/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "python3.8/site-packages/django/apps/config.py", line 178, in create
    mod = import_module(mod_path)
  File "python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked

ModuleNotFoundError: No module named 'accounts'
```

# 原因
上記コマンド実行の前にリスト10．1のコード入力をしてしまっていたのが原因。

どうやら**startapp hogehoge**する前にsetting.pyやsetting_commonn.pyに追加するアプリを入力してしまうとエラーを吐き出してしまう様子。

# 対策
**本の順番に進める**
wslでelixir その13

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。
構想編

# 練習問題
shell serverを実装せよ。

# 方針
- tcpポートは、5300使う。
- genserver使う。
- system使う。
- mix new rserver



以上。
DockerでjMeterを使う方法

## 環境
Mac

## 注意点
・ローカル環境とjMeterを繋げるのが困難
・よくremote Desktopが落ちる
・文字化けが発生することがある

## 手順
(1) Microsoft Remote Desktopを事前にインストールする
https://apps.microsoft.com/store/detail/microsoft-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88-%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/9WZDNCRFJ3PS?hl=ja-jp&gl=jp


(2) docker imageをpullしてくる
> docker pull guitarrapc/jmeter-gui

(3) docker-compose.ymlファイルを作成する

```
version: "3"
services:
  web:
    image: guitarrapc/jmeter-gui:latest
    tty: true
    volumes:
      - ./scenario/:/root/jmeter/
    ports:
      - 5900:5900
      - 3390:3389
```

(4) docker-compose.ymlを起動する
(5) Microsoft Remote Desktopを起動
 新しくPC追加。
 PC Nameは「localhost:3390」

![スクリーンショット 2022-11-15 17.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/a766dc1e-d816-6b73-0eca-bf80c5d172d7.png)


(6) ユーザー名、パスはroot

(7) jMeterが起動済なので、操作する


## 参考URL
https://hub.docker.com/r/guitarrapc/jmeter-gui
React（Next.js）、Typescriptでcheckboxのchangeイベントを使うときの注意点

React（Next.js）、TypeScript にてcheckboxのchangeイベントを扱うときに、エラーが出たので、解決方法をメモしておきます。
## エラーの内容
```
Argument of type 'string' is not assignable to parameter of type 'boolean'.
```

## 修正したコード
handleChangeCheckedメソッドの引数を、e.target.valueからe.target.checkedに修正しました。
##### 子のコンポーネント
```typescript:inputCheckboxChild.tsx
import React from 'react'
interface InputProps {
  checked: boolean
  handleChange: (event: React.ChangeEvent<HTMLInputElement>) => void
}
export const InputCheckboxChild = ({ checked, handleChange }: InputProps) => {
  return (
    <>
      <input
        type="checkbox"
        checked={checked}
        onChange={(e) => handleChange(e)}
      />
    </>
  )
}

```
##### 親

```typescript:inputCheckboxParent.tsx
import React, { useState } from 'react'
import { InputCheckboxChild } from '../components/InputCheckboxChild'

export default function Test() {
  const [checkedData, setCheckedData] = useState(false)
  const handleChangeChecked = (chk: boolean) => {
    setCheckedData(chk)
  }
  return (
    <div>
      <InputCheckboxChild
        checked={checkedData}
        handleChange={(e) => handleChangeChecked(e.target.checked)}
      />
    </div>
  )
}


```
type="text"の時には、value属性を指定しせずにe.target.valueを使っていたために解決に時間がかかりました。
草莽Erlang ── 05. リスト

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## リストとは

リストは単純な値の集まりであり、複数の型や一意でない値を含むこともできます。

```erlang
> L1 = [a, 2, {c, 4}].
[a,2,{c,4}]

> [H|T] = L1.
[a,2,{c,4}]

> H.
a

> T.
[2,{c,4}]

> L2 = [d|T].
[d,2,{c,4}]

> length(L1).
3
```

https://www.erlang.org/doc/reference_manual/data_types.html#list

Erlangはリストを連結リストとして実装しています。すなわちリストの長さを得るのは線形時間(`O(n)`)の処理となります。そのため、リスト先頭への追加はほとんどの場合にリスト末尾への追加より高速です。

```erlang
> L3 = [3.14, pie, "Apple"].
[3.14,pie,"Apple"]

% リスト先頭への追加(高速)
> ["π" | L3].
[[960],3.14,pie,"Apple"]

% リスト末尾への追加(低速)
> L3 ++ ["Cherry"].
[3.14,pie,"Apple","Cherry"]
```

リストの連結には`++/2`演算子を用います。

```erlang
> [1, 2] ++ [3, 4, 1].
[1,2,3,4,1]
```

リストの減算には`--/2`演算子を用います。存在しない値を引いてしまっても安全です。

```erlang
> ["foo", bar, 42] -- [42, "bar"].
["foo",bar]
```

重複した値には注意が必要です。 右側の各要素に対して、最初に出現した要素が左側から削除されます。

```erlang
> [1, 2, 2, 3, 2, 3] -- [1, 2, 3, 2].
[2,3]
```

リストの減算の値のマッチには厳密な比較（`=:=`）が行われています。

```erlang
% 厳密には型が異なるので減算されない
> [2] -- [2.0].
[2]

% 厳密に同値なので減算される
> [2.0] -- [2.0].
[]
```

リストを扱う際には、よくリストの頭部（リストの最初の要素）と尾部（残りの要素）を利用したりします。Erlangにはこれらを扱うための`hd`と`tl`という2つの便利な関数があります。

```erlang
> hd([3.14, pie, "Apple"]).
3.14

> tl([3.14, pie, "Apple"]).
[pie,"Apple"]
```

リストを頭部と尾部に分けるのにパターンマッチやcons演算子(**`|`**)を使うこともできます。

```erlang
> [Head | Tail] = [3.14, pie, "Apple"].
[3.14,pie,"Apple"]

> Head.
3.14

> Tail.
[pie,"Apple"]
```

Erlangでは文字列もリストとして扱われます。

```erlang
> [$h, $e, $l, $l, $o] = "hello".
"hello"

> [38360,39746] = "闘魂".
[38360,39746]
```


リスト操作のための関数は`lists`モジュールにあります。

https://www.erlang.org/doc/man/lists.html

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
Shell startup/shutdown files

# Startup/Shutdown files

## zsh

### Startup

1. /etc/zshenv
2. $ZDOTDIR/.zshenv
3. /etc/zprofile (if a login shell)
4. $ZDOTDIR/.zprofile (if a login shell)
5. /etc/zshrc (if a interactive shell)
6. $ZDOTDIR/.zshrc (if a interactive shell)
7. /etc/zlogin (if a login shell)
8. $ZDOTDIR/.zlogin (if a login shell)

if ZDOTDIR is unset, HOME is used instead.

```console
$ cat .zshenv
echo 'Running .zshenv'
$ cat .zprofile
echo 'Running .zprofile'
$ cat .zshrc
echo 'Running .zshrc'
$ cat .zlogin
echo 'Running .zlogin'
$ zsh -l  # as interactive login shell
Running .zshenv
Running .zprofile
Running .zshrc
Running .zlogin
$ zsh  # as interactive non-login shell
Running .zshenv
Running .zshrc
$ zsh -c ''  # as non-interactive non-login shell
Running .zshenv
$ zsh -l -c ''  # as non-interactive login shell
Running .zshenv
Running .zprofile
Running .zlogin
```

### Shutdown

1. $ZDOTDIR/.zlogout
1. /etc/zlogout

## bash

### Startup

If the shell is a login shell,

1. `/etc/profile` (if it exists)
2. `$HOME/.bash_profile`, `$HOME/.bash_login`, or `$HOME/.profile`. (The first one that exists in this order.)

If the shell is an interactive non-login shell, 

1. `$HOME/.bashrc`

Typically, A startup file for a login shell reads `.bashrc` in it.

### Shutdown
1. ~/.bash_logout (if it exists)

### $BASH_ENV

If the environment variable `BASH_ENV` is set to a file path, the file will be read when bash is invoked as a non-interactive shell.

For example:

```console
$ BASH_ENV=<(echo "echo 'Running BASH_ENV'") bash -c ''
Running BASH_ENV
```

```console
$ echo "echo 'Running .bash_env'" > ~/.bash_env
$ BASH_ENV=~/.bash_env bash -c ''
Running .bash_env
```

## dash

## Startup

1. /etc/profile (if it exists)
2. $HOME/.profile (if it exists)

## $ENV


## Reference

* https://zsh.sourceforge.io/Doc/Release/Files.html#Startup_002fShutdown-Files
* https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
* https://manpages.debian.org/unstable/dash/dash.1.en.html#Invocation
地方銀行の自社開発企業に入社して半年、ぶっちゃけます。

### はじめに

・2022年の7月に入社してから半年間を振り返ります
・私は未経験からIT業界に入り１年間のテスター経験を経てエンジニアになりました（PG２年目）
・地方銀行の自社開発企業に入社し、バックエンドから今はフロントエンドに移動
・私が参画しているチーム内で素直に思ったことや、学び・出来事を記していきます


### 他人の振り返りはどうでもええねん、ぶっちゃけ地銀の自社開発ってどない？

というせっかちな関西人のために。。。ぶっちゃけます

正直とても充実した半年間を過ごさせていただきました。

私の一個人の偏見というかイメージでは金融系ってめっちゃレガシーでは？
という考えがあったのですがモダンな環境、フルリモート・フレックスで仕事させていただき
チームもとても良い方々で周りからも
「今の会社はすごく楽しそうでよかったね。」と言われることが増えました:relaxed:






### :bulb:1~3ヶ月

#### 前職との環境のギャップ
元々Java/SpringBootを使って開発していたのですがずっと開発業務ができたわけではなく、
別作業も多く行っていたため開発環境や仕事内容がガラッと変わり最初はついていくのに必死でした。

当時の私の心情は

「バージョン１７！？、、前８やったけど、ラムダとかストリームとか実務で使ってるの初めてみた・・」
「Intellij、Postman、Fork、Bitbuket、JIRA、MIRO、、、なんじゃそりゃ。」
「アジャイル、スクラムってよく聞くけど同じ意味？スクラムイベントとかあるんや・・」

ってな感じでした。

最初は私のスキルに応じてチームの皆さんがたくさんフォローやご教授してくださいました。

フォルダ構成の説明、OpenAPIを使ってのスキーマ駆動開発も経験したことがなかったので初めてモブプロやペアプロをしていただき、ツール等の使い方も丁寧に教えてもらいました。

そして、初めてのコードレビューも経験できた！！コードレビューして貰ってたくさん指摘いただけることがありがたいな〜っと思いましたね:cry:


#### アジャイルでの開発でスクラムに興味を持った
今までアジャイルでの開発経験がなかったのでスクラムイベントを初めて業務で経験し
とても興味を持つことができました！

:point_down_tone5:チーム内で改善できた記事はこちらにまとめているのでよかったらご覧ください♩

https://qiita.com/annayamamoto/items/52487380572cf729939f

https://qiita.com/yamamoto_anna/items/9532dbdd660d7b08e35f

また、私が入社して２ヶ月後に増員されることが決まり、アジャイルについてまとめたQiitaの
記事を評価してしてくださり、新メンバーのスクラムのオンボーディングを担当させてもらう事ができました！

なんでも挑戦させてくださるのは本当にありがたいです。

※オンボーディングで使用した記事

https://qiita.com/annayamamoto/items/e887b9655ce6daac7e00

https://qiita.com/annayamamoto/items/469959e210d8b7eadd36

### :bulb:4~6ヶ月

#### 初のテストコード経験

JUnitを使ったテストコードを書くことも初めての体験だったので最初は、ホンマに何書いてるのか
わからなさすぎて大変でした！w SpringBootは少し触ったことがあったのでまだ入りやすかったのですが
全くの未知の世界で勉強する教材等もあまりなかったのでチームの方に教えてもらいつつ
UdemyでJUnitの英語教材買って勉強してました。（英語はまっったくできません・・・・w）

今まではテスト仕様書を書いて、ローカル上で動かしそれをエビデンスとしてスクショを撮りエクセルに
せっせと貼り付けていくという地道な作業をしていたので、以前の会社ではテストの時は苦だったんですが今では『テストコード書くの楽しぃぃぃぃいいいいいいい！』ってなりましたね〜


※復習記事

https://qiita.com/annayamamoto/items/cf16379067c5a6297e67

### フロントエンドに移動

以前から、機能横断的なスクラムチームを作るためにバックもフロントも経験しフルスタックで
幅広い知識や経験をつけて行って欲しいと言われており（実際に私自身もフルスタックを目標に技術をつけいていきたいと考えていました）いつかはフロントエンドに移動しようと話していましたが
思ったよりも早くフロントに移動することができ（入社して約５ヶ月後）、初めてflutterを触りました！

flutterはまだ１ヶ月程しか触ってませんが、私はシンプルなものであればに結構簡単にUIが実装できて
やっぱり見た目の部分を作るフロント側はアプリ作ってる感があって楽しいな〜と改めて思いました。
バック側も好きですがまた違った楽しさがありますね:relaxed:

※復習記事

https://qiita.com/yamamoto_anna/items/987fc5e004f3268f92fd

チーム内でプロダクトのデザインも考えているのですが、デザインも興味があるのでこれから
少し携わられて貰えるので楽しみです。



### １年間のチーム内振り返りを聞いて
12月末、チームの１年間の振り返りを行いました。
私が入る以前は色々と紆余曲折があったみたいですがチームも変化し、新メンバーが新しい風をふかしプロダクトやチームの雰囲気が良いように変化していったんだと知りました。

みんな口を揃えていうのがやっぱり『楽しい』という言葉が多いこと
またチームへの感謝、敬意を表する言葉が多かったのが印象的です。

また、スプリントレビューでもこんなにいい雰囲気で、ちゃんと評価もしていただき
和やかな雰囲気で行えることが嬉しいと聞き、
この環境は私にとっては初めてで、他を知らないのですがとても良い環境で良い経験を積めていることに
もっと感謝しないといけないなと思えました。

### まとめ

とてもとても濃い良い経験をさせていただいた半年間でした。

毎日、開発ができていること自体私にとってはありがたいことで、幸せなことだなと思っています。
またチームや上司、会社に恵まれているなと改めて気付かせていただきました。
　
まだまだリリースに向けて大変なことがあるかと思いますが、さまざまな経験を積ませていただいて
良いプロダクトを作り上げるチームの会社の一員として少しでも貢献できればと思っています。

以上最後まで、お読み頂きありがとうございました。
Elixirから覚えるJavaScript　〜reduce関数〜

僕は普段はElixirを使ってます
必要になったのでJavaScriptの勉強をはじめました
題名はElixirから覚えるJavaScriptですが、逆もできるかも？

今日はreduceを見てみたいと思います

お題
[1, 2, 3, 4, 5]の合計をする

# Elixir
※Enum.sumはあえて使いません

```elixir
x = [1, 2, 3, 4, 5]
y = Enum.reduce(x, 0, fn x, acc -> acc + x end)
IO.inspect(x)
IO.inspect(y)

```

```elixir:実行結果
[1, 2, 3, 4, 5
15
```

# JavaScript

```javascript
x = [1, 2, 3, 4, 5];
y = x.reduce((acc, x) => acc + x, 0);
console.log(x);
console.log(y);
```

```javascript:実行結果
[ 1, 2, 3, 4, 5 ]
15
```


無事に同じ結果になりました

https://qiita.com/t-yamanashi/items/263b53d889dc5f7ddf17
Databricksノートブックでコードを共有する

[Share code between Databricks notebooks \| Databricks on AWS](https://docs.databricks.com/notebooks/share-code.html) [2022/12/21時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、ノートブック間でコードを共有するための方法をいくつかサポートしています。それぞれの方法においては、コードのモジュール化を実現し、[ライブラリ](https://qiita.com/taka_yayoi/items/0c7fc7d741aad34bf9d4)のようにノートブックでコードを共有することができます。

また、Databricksでは依存関係を持つパイプラインや戻り値に基づくif-then-elseワークフローのような複雑なワークフローにノートブックを組み込むこともできます。[ノートブックワークフロー](https://qiita.com/taka_yayoi/items/118fbc0ad8fa5471bc88)をご覧ください。

# ノートブックをインポートするために`%run`を使う

マジックコマンド`%run`を用いることで、ノートブックに別のノートブックを含めることができます。例えば、別のノートブックにサポート関数を配置することでコードをモジュール化するために`%run`を用いることができます。また、分析におけるステップを実装する複数のノートブックを結合するために使用することもできます。`%run`を使用する際、呼び出されたノートブックは即座に実行され、定義された関数や変数は呼び出し下のノートブックで使用できるようになります。

以下の例では、最初のノートブックはヘルパー関数`reverse`を定義しており、`shared-code-notebook`を実行するために`%run`マジックコマンドを実行した後でこの関数を利用できるようになります。
![](https://docs.databricks.com/_images/shared-code-notebook.png)
![](https://docs.databricks.com/_images/notebook-import-example.png)

これらのノートブックは両方ともワークスペースの同じディレクトリに格納されているので、現在実行しているノートブックに対して相対的にパスを解決できるように、`./shared-code-notebook`でプレフィックス`./`を使用します。`%run ./dir/notebook`としたり、`%run /Users/username@organization.com/directory/notebook`のような絶対パスを指定することでディレクトリにノートブックを整理することができます。

:::note info
**注意**
- `%run`はノートブック全体をインラインで実行するので、`%run`は*自身専用*のセルで実行される必要があります。
- Pythonファイルを実行したり、そのファイルで定義されているエンティティを`import`するために`%run`を*使用することはできません*。Pythonファイルからインポートするためには、[gitを用いてソースコードファイルを参照する](#gitを用いてソースコードファイルを参照する)を参照ください。あるいは、ファイルをPythonライブラリにパッケージングし、そのPythonライブラリからDatabricksの[ライブラリ](https://docs.databricks.com/libraries/index.html)を作成し、ノートブックの実行に使用する[クラスターにライブラリをインストール](https://qiita.com/taka_yayoi/items/869158c7bd3ab7c45ff4#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AB%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)します。
- ウィジェットを含むノートブックを実行するために`%run`を使用する際、デフォルトでは指定されたノートブックはウィジェットのデフォルト値を用いて実行されます。ウィジェットに値を渡すこともできます。[%runにおけるウィジェットの使用](https://qiita.com/taka_yayoi/items/4df1fd723bdab9a99b08#run%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%81%AE%E4%BD%BF%E7%94%A8)をご覧ください。
:::

### ソースコードファイルを参照するためにDatabricks Reposを使用する

Databricksの[Repo](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)に格納されているノートブックに対しては、リポジトリのコードファイルを参照することができます。

例えば、リポジトリに`power.py`ファイルが含まれているものとします。
![](https://docs.databricks.com/_images/file-in-repo.png)

このファイルをノートブックにインポートし、ファイルで定義されている関数を呼び出すことができます。
![](https://docs.databricks.com/_images/notebook-calling-file.png)

Databricks Reposのファイルの取り扱いの詳細に関しては、[Databricks repoにおける非ノートブックファイルの作業](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140#databricks-repo%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%9D%9E%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%A5%AD)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Databricksノートブックのテスト

[Test Databricks notebooks \| Databricks on AWS](https://docs.databricks.com/notebooks/test-notebooks.html) [2022/11/30時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では、Databricksノートブックにおけるいくつかのコードテストの方法をカバーします。これらの方法を別々あるいは組み合わせて使用することができます。[Unit testing for notebooks](https://docs.databricks.com/notebooks/testing.html)もご覧ください。

多くのユニットテストのライブラリはノートブック内で直接動作します。例えば、ノートブックのコードをテストするためにビルトインのPythonの[\`unittest\`](https://docs.python.org/3/library/unittest.html)パッケージを使用することができます。

```py:Python
def reverse(s):
    return s[::-1]

import unittest

class TestHelpers(unittest.TestCase):
    def test_reverse(self):
        self.assertEqual(reverse('abc'), 'cba')

r = unittest.main(argv=[''], verbosity=2, exit=False)
assert r.result.wasSuccessful(), 'Test failed; see logs above'
```

セルの出力エリアにテスト失敗が表示されます。
![](https://docs.databricks.com/_images/test-failure-output.png)

単一のノートブックにおいてテスト用の呼び出しなのか、通常の呼び出しなのかを区別するために[ウィジェット](https://qiita.com/taka_yayoi/items/4df1fd723bdab9a99b08)を使うことができます。
![](https://docs.databricks.com/_images/test-mode-widget.png)

テストコードとテスト結果を非表示にするには、セルのドロップダウンから関連するメニュー項目を選択します。結果が非表示になっていたとしても、発生したエラーは表示されます。
![](https://docs.databricks.com/_images/test-hide-code-and-results.png)

テストを定期的、自動的に実行するには、[ノートブックのスケジュール](https://qiita.com/taka_yayoi/items/c306161906d6d34e8bd5#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%87%A6%E7%90%86)機能を使用することができます。指定した[メールアドレスに通知](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a#%E3%82%B8%E3%83%A7%E3%83%96%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88)を送るようにジョブを設定することができます。
![](https://docs.databricks.com/_images/test-failure-notification.png)

# ノートブックからテストコードを分離する

テストされるコードとテストコードを分離するには、[ノートブックでコードを共有する](https://qiita.com/taka_yayoi/items/2fec7eadee14085bf53e)を参照ください。

`%run`を使った例です。
![](https://docs.databricks.com/_images/notebook-test-separate.png)

[Databricksのレポ](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)に格納されているコードに対しては、ローカルマシンで行うのと同じようにソースコードファイルでテストを実行するためにウェブターミナルを使用することができます。
![](https://docs.databricks.com/_images/test-code-repos.png)

ノートブックからこのテストを実行することもできます。
![](https://docs.databricks.com/_images/sh-unittest-invocation.png)

[Databricksのレポ](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)に格納されているノートブックに対しては、コミットごとにノートブックのテストを設定することで、CI/CDスタイルのワークフローをセットアップすることができます。[Databricks GitHub Actions](https://docs.databricks.com/dev-tools/ci-cd/ci-cd-github.html)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
DHCPクライアントとして動作するデーモン　dhclient・dhcpcdについて



DHCPクライアントはネットワークに接続する際、ブロードキャストを使用してDHCPサーバに要求を出し、IPアドレス等のネットワークの設定に必要な情報を取得。
DHCPクライアントとして動作するデーモンにはdhclientやdhcpcdなどがあります。

例えばIPアドレスを再取得する場合は
どちらのデーモンを使用する場合もまず、現在使用しているIPアドレスをリリース（解放）し、その後IPアドレスを取得しなおします。

例）dhclientの場合(-rオプションでIPアドレスをリリース)
dhclient -r
dhclient

例）dhcpcdの場合(-kオプションでIPアドレスをリリース)
dhcpcd -k
dhcpcd


●dhcpd.leasesファイル
DHCPサーバがDHCPクライアントに貸し出した、IPアドレスなどの情報が記録されるファイルのこと
M5StickCには2つ目のバッテリーがあった

M5StickCを分解していたところ、液晶の下にこんなものを発見。
見るからにボタン電池。よく見ると（乾電池の液漏れでよく見る）青緑色の結晶がこびりついています。これ、放置しておいて良いんでしょうか。
というかこれってなんの電池？
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">m5stickC の液晶下には丸いバッテリーのようなものがあるのだが、何か情報お持ちの方いらっしゃらないだろうか…<br>なにやら緑色っぽい、漏出液が固まったようなものが周りについているのだけれど… <a href="https://t.co/m7pLTNtdpS">pic.twitter.com/m7pLTNtdpS</a></p>&mdash; sull (@sullblue) <a href="https://twitter.com/sullblue/status/1610132855602171906?ref_src=twsrc%5Etfw">January 3, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 公式に聞いてみた

RTC（リアルタイムクロック）用の電池だそうです。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">you can check the voltage of it. it just the battary only for the rtc, It does not affect the whole product.</p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1610162731075899392?ref_src=twsrc%5Etfw">January 3, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
「電圧をチェックしてみて」と言われたので計ってみたところ、リポバッテリーが空のとき0.5v、リポバッテリー充電後は2.8v出ていました。
うん、バックアップになってませんね。
外してしまっていいか聞いたところ、「いいよ」ということだったので私は（自己責任で）外すことにしました。

# 予想される問題点

リアルタイムクロック用のバックアップ電源を外してしまうので、リポバッテリーが切れたときに時刻がリセットされると思います。

現在時刻を保持する必要がある場合は、電池を外すより交換したほうがいいかもしれません。
電池は端子にスポット溶接されているので交換するのは大変そうです。
未経験からエンジニアになりたい人へ：２進数について

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は２進数です。これ知らないとエンジニアとして恥ずかしいです。
![インスタスライド_202301010.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/26f391fd-92f5-d9e9-3f59-7af50ec4822e.gif)

# データの取り扱い
コンピュータの中ではデータは、0か１のビットで扱われます。ビットはコンピュータの中の最小単位です。
これは２進数というので表します。

# ２進数とは
ON=1,OFF=0で管理。　　 
これを２進数と呼びます。
0,1,2,3,4,5は、0,1,10,11,100,101,110…となります。
例えば、10進数の3は、2進数では、11で表す形になります。

# 2進数の使い方
現在で2進数を使用する事はほとんどありません。
データの大きさを表す用語はこれに関連してます。
2進数の１桁はビットです。１桁で0か１を表す事ができるためです

# 2進数の使い方２
2進数の
・８桁はバイトByte
・1024桁は、キロ KB(約1000Byte)
・KBの1024倍は、メガMB (約1000KB)
・MBの1024倍は、ギガGB (約1000MB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4003dd48-555a-bc77-ea5d-0b53c6f36045.png)

# まとめ
2進数は、コンピュータ内部では使われる。使い方は、難しければ、覚えなくても良いです。
データ容量を示す、KB,MB,GB,TB等に関連していることを知っておきましょう

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
他の Workbook のイベントを定義する

# モーダルウインドウと、モードレスウインドウ
マクロを実行しているExcelファイルではなく、他のExcelファイルを操作するマクロと言うのは、よくある話ですよね？
そして、それにユーザーフォームを使用する事も、これまたよくある話です。
例えば **「ボタンを押下すると、指定のExcelファイルを開き、そのExcelファイルにデータ入力するための入力フォームが開かれる」** という場合です。
この時、データ入力するための入力フォームは、モーダルなウインドウの方が都合が良いです。
何故なら、**入力データを記載するために開いたExcelファイルを閉じられると、面倒な事になるから**です。

しかし、ツールを使用するユーザーは、入力フォーム表示中もExcelが操作したいと言います。
入力するためのデータの一部も、Excelに記載されているデータを参照して入力しているから、という事情らしいです。

そうなると、入力フォームをモードレスなウインドウで表示してやる必要が有ります。
ユーザーフォームをモードレスのウインドウとして表示させる場合、下記の様に`vbModeless`の引数を付けて`Show`メソッドを実行します。
```vb:ユーザーフォーム「UserForm1」をモードレスで表示する
UserForm1.Show vbModeless
```
フォームを表示した後もそのままコードが実行されるので、フォームを閉じた後に実行するコードは、`Show`メソッドの後に記載せずに、別に用意してやる必要が有ります。
## モードレスにすると、他ブックのイベントが欲しくなる
他ブックのイベントを作ると、モードレスにしたくなる(菊〇宗)
冗談はさておき、入力フォームからワークブックに値を書き戻す際に、当該のワークブックが開かれたままかどうかを確認すればエラーは回避できますが、せっかく入力フォームで入力したのに、それを破棄するのはもったいない事です。
スマートに当該ブックを閉じられないようにしたい。
例えば、マクロを実行しているExcelファイル自身を閉じられないようにするなら、「ThisWorkbook」の`BeforeClose`イベントを取得して、下記の様に閉じられないようにすれば簡単です。
```vb:マクロを実行しているExcelファイルを閉じられないようにする
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = False
End Sub
```
これを、他のブックでも行いたいのです。
# `WithEvents`とは？
こういう時、`WithEvents`を使えば良いらしい。
私は今まで、`WithEvents`は、クラス内で`Event`宣言した自作のイベントを適応する為のモノだと思い込んでしました。
しかし実際には、`WithEvents`宣言したオブジェクトが標準で持つイベントを、取得する事が出来ます。
例えば、下記の例ではワークブック変数`objEventBook`を`WithEvents`で宣言しているため、ワークブックオブジェクトがフック出来る`_BeforePrint(Cancel As Boolean)`や`_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)`等のイベントも、設定する事が出来ます。
```vb:Hook_BookCloseEvent_Class
Option Explicit
Private WithEvents objEventBook As Workbook

'監視対象のワークブックを設定
Public Property Set ExcelWorkbook(ByRef objWb As Workbook)
    Set objEventBook = objWb
End Property

'監視対象ワークブックのBeforeCloseイベント発生時に実行される
Private Sub objEventBook_BeforeClose(Cancel As Boolean)
    MsgBox "このブックは、現在【入力フォーム】で使用しております", vbOKOnly, "警告"
    Cancel = True
End Sub

'クラス生成時に初期化を行う
Private Sub Class_Initialize()
    Set objEventBook = Nothing
End Sub

'クラス破棄時に後始末を行う
Private Sub Class_Terminate()
    Set objEventBook = Nothing
End Sub
```
上記の様に記載したクラスオブジェクトに対して、利用する側のモジュールには、下記の様に記載します。
```vb:Hook_BookCloseEvent_Class を利用する側
'クラスオブジェクトの宣言
Public objBCloseClass As Hook_BookCloseEvent_Class

(中略、UserForm1を呼び出すプロシージャ内)
    'クラスオブジェクトを生成
    Set objBCloseClass = New Hook_BookCloseEvent_Class
    '監視対象ワークブックを設定
    Set objBCloseClass.ExcelWorkbook = Application.Workbooks("データリスト.xlsx")
    'フォームを表示
    UserForm1.Show vbModeless

(中略、UserForm1を閉じるプロシージャ内)
    '監視対象ワークブック設定を解除(クラスの後始末で実施されてるので、不要かもしれないけど念のため)
    Set objBCloseClass.ExcelWorkbook = Nothing
    'クラスの破棄
    Set objBCloseClass = Nothing
    'フォームを閉じる
    Unload UserForm1
```
とても便利です。
これを流用すれば、マクロなしの拡張子が`xlsx`のファイルに、あたかもイベントマクロが有る様に設定できるので、応用範囲は広そうです。
2023/1/4主にITとかセキュリティの記事

セルフカストディ、2023年の常識に【オピニオン】(1/3)
https://www.coindeskjapan.com/168807/

「価値を失ったNFT」を収集するサービス、その狙いは？(1/3)
https://www.coindeskjapan.com/170151/

ビットコインマイニング企業、生き残るために必要なこと(1/2)
https://www.coindeskjapan.com/170135/

理研、量子計算機をスパコン富岳と連携　25年めど実用化(1/3)
https://www.nikkei.com/article/DGXZQOUC052OK0V01C22A2000000/

仮想通貨も「人」を見よ　DeFi経営者が語る基本動作 シンガポールのトランチェス(1/3)
https://www.nikkei.com/article/DGXZQOFL00009_Z21C22A2000000/

テレワークしている従業員を監視する5つの方法(1/2)
https://news.mynavi.jp/techplus/article/20230102-2552178/

AIが匿名のチェスプレーヤーの正体を特定してプライバシーリスクをもたらす可能性(1/3)
https://gigazine.net/news/20230103-ai-unmask-anonymous-chess-players/

自転車のヘルメットに取り付けたGoProでドローンを飛ばせないエリアの3Dマップを作成する方法(1/2)
https://gigazine.net/news/20230102-creating-aerial-imagery-bike-helmet-camera/

中高生の4分の1が不特定多数にSNS発信、3割強にはネット友だちも(1/3)
https://ascii.jp/elem/000/004/118/4118749/?series=2

インテルが10年先を見据えた最先端の半導体技術を発表　インテル CPUロードマップ(1/2)
https://ascii.jp/elem/000/004/119/4119257/?series=5

ウクライナ侵攻とドメイン名、.comの値上げ、権利侵害とDNSブロッキング(12/30)
https://ascii.jp/elem/000/004/119/4119331/

NFT取引にはウォレットが不可欠！初心者でも使いやすいおすすめウォレット5選(1/2)
https://coin-otaku.com/topic/70838

日本人が一生のうちネットに費やす時間はどれくらい？(1/3)
https://dime.jp/genre/1525337/

暗号資産を相続する時はどうすればいい？ビットコインなどを相続する場合の注意点(1/3)
https://dime.jp/genre/1523712/

現実となりつつある「AIを利用したサイバー攻撃」の脅威(1/2)
https://dime.jp/genre/1523902/

友人や同僚に薦めたいセキュリティソフトTOP3、2位「ウイルスバスター」「ZERO」、1位は？(1/1)
https://dime.jp/genre/1523881/

1ギガで何ができる？メガとの違いは？スマホの通信プラン選びに役立つ基礎知識(1/1)
https://dime.jp/genre/1516956/

モバイルの利用時間は今後6年間で34％増加、予想されるモバイルアプリ5つのトレンド(1/1)
https://dime.jp/genre/1523926/

AIによるコード自動生成使うプログラマ、安全性低いコードを書きやすい(12/30)
https://www.zaikei.co.jp/article/20221230/704065.html
coc.nvimをインストールする

Vimのプラグイン[coc.nvim](https://github.com/neoclide/coc.nvim)をインストールする手順を示した備忘録です。

# 環境
* Mac OS X Ventura Version 13.1 (M2)
* Zsh

# 手順
1. curlをインストールする
`brew install curl`
2. nvmをインストールする
`brew install nvm`
3. nvmでnodeをインストールする
`nvm install node`
4. `Plug 'neoclide/coc.nvim', {'branch': 'release'}`をinit.vimに追加する
5. Vimを開いて`:PlugInstall`
6. Vimを開いて`:CocInstall coc-jedi`

# 躓いた点
1. Homebrewでnvmをインストールしたがzsh上で`nvm Command Not Found`となる
2. Jedi not found のエラーメッセージが出てSuggetionsが出てこない

# 解決策

- [nvmをzsh上で使えるようにする](https://stackoverflow.com/a/64180871)
1. `vim ~/.zshrc`
`export NVM_DIR=~.nvm`

2. `source $(brew --prefix nvm)/nvm.sh`

- [Jedi not found error](https://github.com/neoclide/coc.nvim/issues/1496#issuecomment-1132396626)
1. Vimを開いて`:CocInstall coc-jedi`で`coc-jedi`をインストールする
たったこれだけGitHubリポジトリのDependabot設定

あるリポジトリのDependabot設定をする場合、`Settings`の中の`Code security and analysis`をクリックする。クリックすると次のような設定オプションの一覧が表示される。

![Screen Shot 2023-01-03 at 23.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103420/e7c2d66f-1844-8a3f-77fa-46aee34f6883.png)

Dependabotについての設定用ボタンは３つある。それぞれ有効化する目的は次の通り。

1. `Dependabot alerts` : 依存関係に影響を与える脆弱性があるときアラートを受け取る。脆弱性の解決には問題FixのためのDependabotのPull Request (以下、PR)を手動で生成する
2. `Dependabot security updates` :  Dependabotが問題FixのためのPRを自動で生成することを許可する
3. `Dependabot version update` : 依存関係のあるパッケージで新しいバージョンが利用可能になったことが検知されたら最新の状態に保つためにDependabotがPRを自動生成することを許可する

依存関係のあるコードの脆弱性Fixは最低限やりたいところなのでの上記 1 + 2はとりあえず有効化してよいだろう。

3の依存関係のあるコードを最新状態に保つ設定について、もし最新状態に保ちたいならば次の手順で有効化する

3-1. `Dependabot version update`ボタンをクリックし有効化する

ボタンクリックしただけではEnabledにならない。下記設定ファイルの追加が必要となる。

3-2. `dependabot.yml`ファイルを.github配下に設置

`dependabot.yml`でDependabotのリポジトリスキャンの振る舞いを定義する。例えばGo言語ベースのリポジトリならば次のような内容になる。

```go:.github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "weekly"
```
ref: [Dependabot for Golang based repositories](https://gist.github.com/magnetikonline/6f215db058e327905bce66c37f92426c)

`dependabot.yml`は追加されると`Dependabot version update`が有効化される。

なお、dependabot.ymlの詳細な設定オプションについては[dependabot.yml ファイルの構成オプション](https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file)が参考になる。

:::note info
一時的にversion updatesを停止する方法

次のように`open-pull-requests-limit: 0`の一行を追加することで一時的にversion updatesを停止できる。

理由: デフォルトでDependabotはバージョン更新に対して最大5つのプルリクエストをオープンする。Dependabot からの未解決のPRが5つあると、Dependabotは未解決の要求の一部がマージまたは閉じられるまで新しい要求を開けない。この制限を変更するにはopen-pull-requests-limitを使う。この設定を活用し0にすることで一時的にversion updatesを停止できる。

```go
version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 0
```
See also: [dependabot.yml ファイルの構成オプション - open-pull-requests-limit](https://docs.github.com/ja/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#open-pull-requests-limit)
:::

最後に、Dependabotで検知されたアラートはリポジトリメニューの`Security`から確認できる。詳しくは、[Dependabot アラートの表示と更新](https://docs.github.com/ja/code-security/dependabot/dependabot-alerts/viewing-and-updating-dependabot-alerts)が参考になる。

以上、たったこれだけ。
.bashrcについて

先頭に.がついているファイルは隠しファイルとなり、特別なファイルとなる。

.bashrcなどはbash起動時に読み込まれる。

そのためパスを通すときなどは、.bashrcや.zshrcなどにパスを書いておくことで、
pathを永続化出来る
AWS CodeCommit の HTTPS Git 認証情報を生成

# 事前知識

https://qiita.com/ryome/items/efd37c3a49b54859ba68

https://qiita.com/ryome/items/ff2804be600cd5dcd61a

# AWS IAMアカウントの作成
1. IAMコンソールを開く。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/0452b1ab-89c9-1fe9-80b3-ac9896c60514.png)
2. ユーザーの詳細を開く。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ef8d1a25-08d4-2387-a8aa-bd6828c1235f.png)
3. 認証情報の `認証情報を生成` を押下する。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/4fc25c73-8539-a5d6-196a-1b7c2ac539b9.png)
4. `ユーザ名` と `パスワード` をメモする。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/2d4f074c-06e2-0f7d-2741-bc5f9e111b07.png)
AWS IAMアカウントの作成とaws configureの設定

# 事前知識

https://qiita.com/ryome/items/efd37c3a49b54859ba68

# AWS IAMアカウントの作成
1. IAMコンソールを開く。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/5c21b837-848f-4a7c-192f-f1013e3a8c88.png)
2. `ユーザ追加` を押下する。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e08e94e8-185b-ccc3-ad10-439033ae28ef.png)
3. `ユーザー名` を入力し、`アクセスキー・プログラムによるアクセス` にチェックを付ける。
4. `アクセス権限` を押下する。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/c821400f-1748-42b8-8042-0d69ba6e27cf.png)
5. `既存のポリシーを直接アタッチ` を選択し、 `AdministratorAccess` にチェックを付ける。
6. `タグ` を押下する。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/af921c16-71d3-91cb-5afc-2f6913cbcf3a.png)
7. キーに `Name` , 値に `Admin` と入力し、`確認` を押下する。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/0d5fd169-8573-2afd-827c-7ee2f8c543da.png)
8. `ユーザー作成` を押下する。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/5218f16a-d44a-2f5b-fe2f-efdbe6ce6c83.png)
9. `アクセスキーID` と `シークレットアクセスキー` をメモする。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/086e7e61-39db-e58d-f322-6fa84e396ba4.png)

# aws configureの設定

- コマンド
```
>aws configure
AWS Access Key ID [None]: 【アクセスキーID】
AWS Secret Access Key [None]: 【シークレットアクセスキー】
Default region name [None]: 【リージョン】
Default output format [None]: 【出力形式】
```

- 実行例
```
>aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
```
zshの反映

.zshrcなどのzファイルを変更したら

$source ~/.zshrc　

で反映させる。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwi2kojp5Kv8AhUFCIgKHayFANIQFnoECBAQAQ&url=https%3A%2F%2Famateur-engineer.com%2Fmac-path-zsh%2F&usg=AOvVaw1i5VR7davf4fao_VsOiPee
ShopifyAPI::Auth::Oauth::AuthQueryでwrong number of arguments (given 1, expected 0)が出る場合（Rails7 + Ruby3.0以上）

Shopifyの公式gemを使っていて発生したエラーに対する対処法。
(Rails7, Ruby3.0以上で多分発生)
    
    filtered_params =　request.parameters.symbolize_keys.slice(:code, :shop, :timestamp, :state, :host, :hmac)
    keyword_params = Hash.ruby2_keywords_hash(filtered_params)
    auth_query = ShopifyAPI::Auth::Oauth::AuthQuery.new(keyword_params)

    auth_result = ShopifyAPI::Auth::Oauth.validate_auth_callback(
      cookies: cookies.to_h,
      auth_query: auth_query
    )

キーワード引数の挙動の変更によるものと思います。

関連するワード：Shopify gem Oauth Rails7 Ruby3.0
CSSの書き方

この記事は自分用にCSSの書き方（主にHTMLとCSSの対応方法）を書いたものです。

・CSSはHTMLで設定した文字の大きさや色、レイアウトなどを決めることができる言語である。使うにはHTMLと対応させる(紐づける)必要がある。

<h4>1.HTMLとの対応させる方法</h4>
①HTMLのheadタグにCSSのリンクを追加する。<br>
この方法ではHTMLファイルとは別にCSSを作成し、そこにCSSの記述を書く方法である。
この方法が一番オーソドックスな適用方法であり、基本的にこの方法をとっているという前提で書いていく、
そしてそのHTMLとCSSの対応方法は下の通りである。

```example.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="ここにCSSのファイルへのリンク名">
        <title>ページタイトル</title>
    </head>
~~~~中略~~~~
</html>
```
このようにHTMLファイルのheadタグに
`<link rel="stylesheet" href="ここにCSSのファイルへのリンク名">`を入力することによってHTMLとCSSを紐づけることができる。

※注意
href内に書くファイルへのリンク名はHTMLと同じフォルダにある場合はCSSのファイル名を入力するだけでよいが、別ファイルにある場合はリンクを適切に入力しなければ適用されないので注意。

②`<style>タグ`を使用する。
 こちらはHTMLの`<head>`タグにCSSを記述するものである。

```HTML:example.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>ページタイトル</title>
        <style>
            h1 { color: #ffffff; }
            p  { background-color: #000000; }
        </style>
    </head>
~~~~中略~~~~
</html>
```
このように入力することによってCSSを適用させることができる。
今回の場合すべての`<h1>`タグに文字の色を白、すべての`<p>`タグに背景色を黒とさせている。

③タグの中に直接CSSを書き込む
最後の方法は適用させたいCSSをHTMLのタグに直接書き込む方法である。
```HTML:example.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>ページタイトル</title>
        <meta name="description" content="ページの説明">
    </head>

    <body>
        <h1 style="color: #ffffff;">こんにちは</h1>
        <p sytle="background: #000000;>おやすみなさい</p>
    </body>
</html>
```
このようにHTMLのタグ内に直接CSSを書き込むことによってCSSを適用させる。

しかし、②の`<style>タグ`や③のHTMLのタグ内に直接書き込む方法は、CSSを管理するのが難しいことや単純に見づらいのでできるだけ①のCSSリンクを追加させる方法の方が良い。

<h4>CSSファイルの書き方</h4>
次にCSSの書き方を述べていく。<br>
CSSは、 装飾したい場所 { 何を変えるのか: 具体的な変更; }
のように変える。
例としては

```example.css
 /* 装飾したい場所にh1タグを指定*/
 h1 {
    /*何を変えるのかをcolor(文字の色の変更)を指定*/
    /*そして具体的な変更内容として#ffffff(HTMLのカラーコードの白)を指定*/
    color: #ffffff;
}
```

このように書いていく。
ただし、この方法ではすべてのh1タグに適用されるため、細かく個々のタグで個別に変更することはできない。

個々にCSSを適用させるには、さらにHTMLに`class`や`id`などを指定し、それとCSSを紐づける必要がある。

```example.html
    <!--タグで指定する場合-->
    <h3>メインコンテンツ</h3>

    <!--classを指定-->
    <h1 class="title">タイトル</h1>
    <h2 class="title">サブタイトル</h2>

    <!--idを指定-->
    <p id="sentence">文章１</p>
```

```example.css
    /*タグで指定する場合、タグ名を入力するだけで紐づけられる。*/
    h3 {
    font-size: 20px;
}

    /*classで指定した場合、指定した名前の前にピリオド(.)を入力すると紐づけられる。*/
    .title {
    color: red;
    background-color: white;
}

    /*このようにclassで指定した後にタグだけを引っ張ってきて、classの中の指定のタグだけを変更するということもできる。*/
    .title h2 {
    font-size: 10px;
}

    /*idで指定した場合、指定した名前の前に#を入力すると紐づけられる。*/
    #sentence {
    color: silver;
}
    
```

CSSは以上のように書いていく。
[Unity] CV VTuber Exampleのサンプルでビルドまでやってみる。

# 前提

- [[Unity] CV VTuber Exampleのサンプルを動かしてみる](https://qiita.com/na2na/items/571f3bba290ae00718d9)までやってあること。

# 前回との差異

- Unity 2021.3.16f1

# 作業

以下主に備忘録です。

## (必要なら)Unityエディタの追加

今回は説明も兼ねて、必要そうなものをイチから追加していく手を取ります。2021.3.16f1でやっていきます。
前回記事のセットアップまで済ませてあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/a7cb4b83-a040-7ac4-afd2-7e34dc30f37e.png)

## Windows向けビルドを試してみる part1

`Build Settings`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/79787676-bb69-2d6a-c3cb-662b26fa5bec.png)

特に何も変えず`Build`ボタンを押します。
保存先の指定をするダイアログが表示されるのでよしなにしてあげます。この後でAndroid向けビルドもやる予定があるので、今回は`Built/Windows`という名前で指定しました。

出来上がった(プロジェクト名).exeを起動して`WebCamTexture CV VTuber Example`というボタンを押して正しく動いていれば完了です。

## Windows向けビルドを試してみる part2

次に~~面白そうだったからという理由ですが~~Scripting BackendにIL2CPPを指定した状態でWindows向けビルドをします。

画面上部メニューより、`Edit/Project Settings...`を開きます。
次に、サイドメニューから`Player`を選択します。
PC向けの設定のあるタブの中の`Other Settings`を展開します。
スクロールしていくと、`Configuration`の中に`Scripting Backend`というのがあるのでこれをMonoからIL2CPPに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/ce7d9ffb-85a8-6e3b-3649-b1fcd8b4a1a1.png)

変更したらpart1と同じように`Build Settings`を開きます。
この時エラーが出ている場合、Windows向けのIL2CPPサポートが入っていない可能性があります。追加しましょう。
特に問題なければそのまま`Build`ボタンを押します。
今回は`Built/IL2CPP`を指定しました。

## Android向けビルドを試してみる

`Build Settings`を開き、`Platform`として`Android`を選択、そのまま右下の`Switch Platform`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/a3d96877-6286-75bf-bc62-ad9e27cf649a.png)

しばらく待つと、`Switch Platform`のボタンのところが`Build`に変わりますが、必要な設定をしていきます。

1. キーストアの設定をいい感じに誤魔化す
  `Project Settings`を開き、`Player`内のAndroidタブを開きます。続いて、`Publishing Settings`を開き、`Project KeyStore`の`Custom Keystore`のチェックボックスを外します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/12a02230-fbe1-7b90-ca71-d617405b453a.png)

2. `Target Architectures`の指定を変える(必須ではなさそう)
  1の画面のまま、`Other Settings`を展開します。`Configuration/Target Architectures`から、x86系を**すべて外すか、すべてチェックを付けるかのどちらか**の状態に揃えます。今回はすべて外した状態にします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/bd2203b8-7a13-20ac-866d-6a307212419d.png)

すべて良い感じになっているとビルドが通ります。
今回は手元のPixel5で試しました。

https://twitter.com/na2na_chang/status/1610265151504265216?s=20&t=WNaYNp_rXgOL0vzJpealHQ


### トラブルシューティング

鬼のようにコケまくりました。以下に試したことを書きます。

#### `Unable to sign the application; please provide passwords!`と言われてビルドがコケる
[[unity2019]Unable to sign the application; please provide passwords! がうっとうしい](https://tsubakit1.hateblo.jp/entry/2014/07/24/234748) を参考にしてください。

#### `前略)player\UnityPlayerActivity.javaは非推奨のAPIを使用またはオーバーライドしています。`と言われてビルドがコケる

どうやって直したか記憶が怪しい、が、
- Minimum API Levelは上げてない(API Level 22のまま)
- Custom Main Manifestは使ってない

けど何とかなってる(直後の問題解決してる間に直ってた

#### `Failed to read key AndroidDebugKey from store "C:\Users\(ユーザ名)\.android\debug.keystore": Invalid keystore format`
```powershell
cd ~/.android
Remove-Item .\debug.keystore* # 使用中で消せない場合はUnityを落としてから試す。
```
GmailなどのtextareaをEmacsで編集する

小ネタである。

昔よりは便利になったとはいえ、Gmailのメールとか掲示板の投稿とかをウェブブラウザ上で書くのはめんどくさい。Emacs上で書きたいのである。というか、Emacs以前に「メール」とか「掲示板」とかいう時点ですでに老害感が横溢しており我ながらびびった。

それはさておき、そういうとき一昔前だとウェブブラウザ側に[Edit with Emacs](https://github.com/stsquad/emacs_chrome)というアドイン、Emacs側に `edit-server.el` というのを入れて使っていたのだが、設定が複雑で何かとうまく行かなかった覚えがある。これが最近だと、ブラウザ側は[GhostText](https://github.com/fregante/GhostText)アドイン、Emacs側に[atomic-chrome](https://github.com/alpha22jp/atomic-chrome)を入れれば楽に実現できる。名前がatomでchromeって大丈夫なのかねという感じだが（[Atomはディスコンになってしまったし](https://forest.watch.impress.co.jp/docs/news/1415735.html)）、AtomやChromeだけではなくEmacsにもMozilla Firefoxにもちゃんと対応しているので、わたくしのような頑迷固陋なユーザでも安心だ。

Emacs側は、[先日のinit.el](https://www.mhatta.org/wp/2022/12/25/how-to-use-emacs-without-tears-and-joint-pain/)で下ごしらえがしてあれば、以下のような簡単な設定でいける。

```el
;; atomic-chrome
(leaf atomic-chrome
  :straight t
  :config
  (atomic-chrome-start-server)
  )
```

あとはブラウザのほうにGhostTextを入れ、ツールバーからボタンを押すと、入力したいtextareaが青くなる。あとはEmacsブラウザの双方向で編集できる。
![atomic-chrome-on-gmail.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275112/d6192238-f6d4-eaeb-ad5a-ffa3b5b91bba.gif)





---

この記事は、[個人ブログ](https://www.mhatta.org/wp/2023/01/03/edit-gmail-and-other-text-areas-with-emacs/)からの転載です。Emacs 上の Org-mode で書き、[Org2blog](https://github.com/org2blog/org2blog) で Wordpress に投稿したのと同じ原稿を、[ox-qmd](https://github.com/0x60df/ox-qmd) で変換してそのまま投稿しました。
uninitialized constant ◯◯[定数名] (NameError)への対処法

# 概要

PF作成中にdockerでサーバーの起動を試みた際、
uninitialized constant OmniAuth (NameError)というエラーが表示。
つまづいたので記録として残します。

# 対処法
    
①以下項目を確認
    ・ファイル名とclass名が一致しているか？
    ・ファイルpathとmoduleの定義が一致しているか？
    ・Railsにファイルを読み込ませているか？
 （引用元と詳細：https://qiita.com/yoshixj/items/17de45928f52264fd6a0)

②サーバー起動時に問題が発生した場合は、当該定数のGemがインストールされているか確認

以上です。

# ちなみに
私は②でした。
そもそもGemfileにomniauth-twitter(定数OmniAuthを使うためのGem)を記載していませんでした。

ミスは大体単純な所で発生しがち、気をつけます。
Ubuntu20.04 自動ログイン設定方法　設定=>ユーザからロック解除出来ない場合

ロック解除出来ない状況における対処

$sudo nano /etc/gdm3/custom.conf　で編集する。

↓自動ログインする場合、コメントアウト
#AutomaticLoginEnable = true
#AutomaticLogin = 自動ログインするユーザー名
Cookieのやり取りの仕組み

わかっているようで曖昧だったCookieについて改めて学習しなおしたことを備忘録として書いていきます。
私と同じような境遇の方の参考になればと思います。

# Cookieとは
CookieとはWebサイトがユーザーの情報を一時的に保存するときに用いられるデータのことです。
HTTPはステートレスなプロトコルなのでCookieがなければユーザーのログイン情報などを保存した状態で通信できません。
ここで使われるのがCookieです。

# Cookieのやり取り
WebブラウザがWebサーバーにHTTPリクエストを送った時に当然ですがWebサーバーはHTTPレスポンスを返します。
この時WebサーバーはHHTPレスポンスにCookieを含めて返します。このレスポンスを受け取ったWebブラウザは次回からのHTTPリクエストの受け取ったCookieの情報を載せて送信します。
こうすることでHTTPでもユーザーのログイン情報などを保存したままやりとりすることが可能となります。

# Cookieはメッセージヘッダーに含めて送信する
HTTPリクエスト、HTTPレスポンスは３つに分けられます。

・リクエスト行（HTTPレスポンスではステータス行）
・メッセージヘッダー
・メッセージボディ
の3つです。

Cookieはこのメッセージヘッダーに含めて送信します。
WebサーバーはHTTPレスポンスに「Set-Cookie」ヘッダーを含めて送信し、Webブラウザは「Cookie」ヘッダーを含めて送信します。
AtCoder Beginner Contest 122 B - ATCoderの解説を書いてみた

今回はB - ATCoderの解説でも書いてみようと思います。

こちらからアクセスできます

https://atcoder.jp/contests/abc122/tasks/abc122_b

# ①考え方
Sの部分文字列の中でATCG文字列（A, T, C, Gのみを含む文字列）の最長のときの長さを出力して欲しいというわけですね。
ではどのようにすればいいでしょうか？
入力例1をもとに考えていきましょう。
```:入力例1
ATCODER
↓
ATCODER
 TCODER
  CODER
   ODER
    DER
     ER
      R
という感じの文字列にして探索していくことで求められないかな～と考えていきます。
(cnt = 0を用意しておきます)
それぞれの文字列に対して最初から順にA, T, C, Gの文字数を
数えていき(cnt = cnt + 1)、
それ以外の場合、
次の文字列に移ります(cnt = 0と初期化しておきます)。
あらかじめans = 0というのを用意して次の文字列に移る前に、
ans = max(ans, cnt)をとり、最長時の値を求めていきます。
```
これをコードにおこすとこうなります。
```python
for i in range(len(s)):
    cnt = 0
    for j in range(i, len(s)):
        if s[j] not in a:
            break
        cnt += 1
    ans = max(ans, cnt)
```
ちなみに<font color="Red">**全探索**</font>を使っています。

# ②提出したコード
```python
import io
import sys
import statistics
import math
import queue
import heapq

s = input()
ans = 0
a = ["A", "T", "C", "G"]
for i in range(len(s)):
    cnt = 0
    for j in range(i, len(s)):
        if s[j] not in a:
            break
        cnt += 1
    ans = max(ans, cnt)
print(ans)
```

# ③まとめ
この問題は全探索を用いる問題でしたね。ただ闇雲に探索するのではなく、徐々に探索する範囲を狭めていくというのがポイントかと思います。

# ④参考文献

https://atcoder.jp/contests/abc122/tasks/abc122_b

https://qiita.com/e869120/items/eb50fdaece12be418faa#%E5%85%A8%E6%8E%A2%E7%B4%A2%E5%85%A8%E5%88%97%E6%8C%99
変数の連結　更新　自己代入　

今日もやっていきます。

int型変数では、数値が入った変数であれば、計算が可能です。
数値と変数の計算も、変数同士の計算も可能です。

まずは、変数＋数値

```java:Main.java
int number1 = 20;
System.out.println(number1 + 5);
```
変数の定義と同時に、20と言う値を代入します。
そして、次に、出力させます。```System.out.println(number1 + 5);```
```number1```には、```20```を代入しているので、結果は
```text:java.コンソール
25
```
となるわけです。

次に変数＋変数です。
```java:Main.java
int number1 = 20;
System.out.println(number1 + 5);

int number2 = 10;
System.out.println(number1 + number2);
```
```number1```には```20```、```number2```には```10```が代入されている為
```text:java.コンソール
25
30
```
となる訳ですね。

String型は、文字列の連結が可能です。
ここに関しては、int型の計算とほぼやり方は一緒です。ただ、
<font color="Red">**文字列として連結する**</font>
これだけです。
では、みていきます。
```java:Main.java
String greeting = "おはよう";
System.out.println(greeting + "田中さん");

String name = "佐藤さん"；
System.out.println(greeting + name);
```
これで、文字列の連結ができます。
文字列を連結させるからといって、```greeting```や```name```にダブルクォーテーションは付けないようにしましょう。付けてしまうと、文字列として扱われてしまいます。
文字列の連結とは言え、```変数＋変数```で、中の値を連結させようとしているので、気をつけましょう。
では、これの出力結果は
```text:java.コンソール
おはよう田中さん
おはよう佐藤さん
```
となります。

次に変数の中の値を更新していきます。

```java:Main.java
String name = "Tanaka";
System.out.println(name);

name = "Sato";
System.out.println(name);
```
```text:java.コンソール
Tanaka
Sato
```
変数の中には```"Tanaka"```を代入していました。
だから、```System.out.println(name)```で、
```Tanaka```が出力されました。
ですが、```name = "Sato"```で上書きしたので、
次の出力は、```Sato```に変わってるのがわかりますね。

次に、自己代入についてです。
なんと説明すればいいかわからないので、とりあえず、書いてみます。
```java:Main.java
int x = 10;
System.out.println(x);

x = x + 5;
System.out.println(x);
```
```text:java.コンソール
10
15
```
簡単に説明すると、元々、```x```と言う変数のなかに```10```と言うデータが入っていました。
そこに```x = x + 5```と言う式で、元の```10```に```+ 5```して代入してください、と言った感じです。
数学などの式と比べると少し変な式になりますが、プログラミングでは```=```は代入なので気にしないでください。

ちなみに、自己代入の省略した書き方があります。
```java:Main.java
未省略           
x = x + 10;     
x = x - 10;     
x = x * 10;      
x = x / 10;      
x = x % 10;     
``` 
```java:Main.java
省略
x += 10;
x -= 10;
x *= 10;
x /= 10;
x %= 10;
```

変数に1を足す、引くの場合はさらに、省略できます。
```java:Main.java
未省略
x = x + 1;
x = x - 1;
```
```java:Main.java
省略
x++;
x--;
```
これだけです。
コードをスッキリ見やすくする為には、省略できるものは、した方がいいですね。(例外の時もあるのかも、、、です)
json Lines形式への変換

# json Lines形式とは
複数のjson形式のオブジェクトを1行ずつ書き込んだ（フラット化）テキストファイルのフォーマット

- json Lines形式（フラット化）
```
{"name": "Sato", "age": 20, "city": "New York"}
```

- json 形式
```
{
  "name": "Sato", 
  "age": 20, 
  "city": "New York"
}
```

## json Lines形式の調査をした理由

json形式のビックデータをAWS Glueデータカタログに取り込む際に、AWS Athenaでデータの読み込み時にエラーとなり、json形式からjson Lines形式へ変換しなければならない事象が発生したため、変換方法を調査した。
※Glueデータカタログについて、json形式で読み込めない場合、json Lines形式への変換を考えると良い

## 変換方法

- jqコマンドの場合、-cオプションを利用
```
$ cat test1.json | jq
{
  "name": "Sato",
  "age": 20,
  "city": "New York"
}
$ cat test1.json | jq -c .
{"name":"Sato","age":20,"city":"New York"}
```

- LambdaやGlueジョブの場合、jsonライブラリのdumpsを利用
```
import json

data = {
    "name": "Sato",
    "age": 20,
    "city": "New York",
}

json_lines = json.dumps(data)

print(json_lines)
# 出力結果
# {"name": "Sato", "age": 20, "city": "New York"}
```

## json形式のデータをGlueデータカタログ上で管理するために
S3へ格納されるデータがjson形式である場合、定期的にjson Lines形式へ変換するための実装を構築することで、正常にデータを読み込むことができた。
定期的な処理はLambdaやGlueジョブ(Python Shell)を利用することで実現できるため、参考にしていただけると嬉しいです！
【シェルスクリプト】複数配列を同時に繰り返し処理する方法

## 方法

次のように記述することで複数の配列を同時に繰り返し処理できます。  

```sample.sh
alphabet=(a b c d e)
kana=(あ い う え お)
for ((i=0; i<"${#alphabet[@]}"; i++)); do
  echo "${alphabet[i]}${kana[i]}"
done

```

```terminal
$ bash sample.sh
aあ
bい
cう
dえ
eお

```
Pythonの小技３

#### DateTimeの処理
```Python
from datetime import datetime

datetime_1 = '20210321'
datetime_2 = '20210301'

# 文字列からフォーマットを指定してdatetime型へ変換
convert_datetime_1 = datetime.strptime(datetime_1, '%Y%m%d')
convert_datetime_2 = datetime.strptime(datetime_2, '%Y%m%d')
dt = convert_datetime_1 - convert_datetime_2
print(dt.days) 
print(type(dt.days)) #int
```
記号や属性の呼び方はチームでそろえた方がコミュニケーションコストを下げられると思った。

パートナーやアルバイトの方と一緒に仕事していて人によって属性の言い方、記号の名称の認識が異なっていることが多いです。

これまでなんとなくモヤモヤしていたので改めて統一を図るために調べてみました。

:::note info
チーム内の円滑なコミュニケーションのために活用ください！
私が間違えていた、人によって呼び方が異なるものを中心紹介します。
:::

## widthは`ウィドゥス`or`ワイズ`or`ウィス`or`幅`

個人的には「ワイズ」という表現は気になるので、本来の読み方からも離れているのではと思ったので調べてみました。

google検索で発音を聞くと「ウィドゥス」でdの発音少し入っているようにも聞こえます。
ただ、感覚的には「ウィス」と聞こえます。

https://www.google.com/search?q=width

じゃあいっそのこと日本語で「幅」と言ってしまうおう！
**初学者の場合「幅ってwidthのことであってますよね？」って質問が返ってきそう…。**

チームで認識がすり合わせられているなら「幅」で表現するのがいいのかな…。
Youtubeなどで英語圏のコーディング動画を見る限りではやっぱり「ウィッス」と発音されていました。

:::note info
ちなみに高さの`height`は「ハイト」でした。
:::

## `^`はハット？キャレット？
どっちでも正解のようです。
学問によっても異なるようで、数学的にはハットと呼ぶそうです。

:::note warn
これからはキャレットと呼ぶようにします…
:::

## `#`シャープ or いげた
ずっとハッシュと呼んでました…。
「ハッシュ」で「＃」に変換することができ、ハッシュタグでも検索でヒットするので間違えではないようです。

:::note
一般的な呼び方はシャープなのでそちらに変えていきます！
:::

## `&`アンパサンド or アンド
アンパサンドは長いのでアンドで呼びたいと思います。

## ごっちゃになりやすい`>（大なり）`と`<(小なり)`
右向きに広がっているのが小なり、左向きに空いているのが大なりですね。
恥ずかしながらこれまで感覚的でしたが改めて認識しました。

## `[]`ブラケット
プログラミングしていると時折耳にすると思います。
さまざまなカッコが登場するので覚えてテキストでも正確に伝えられるようにしておきたいところです。
大カッコや角カッコと呼ばれることもあると思いますが、ブラケットで統一したいものです。

## `{}`カーリーブラケット
中カッコと呼ぶことが多いと思いますが、大カッコがブラケットとするならカーリーブラケットで呼び名を統一したいと思います。

## `~`チルダ
調べるまで「チルダ」と発音したことがありませんでした…。
この記事を読んだのであれば「にょろ」とか「から」ではなくチルダと言いましょう！

## まとめ
改めて調べると適当に呼びすぎていたと反省しております…。
チーム内で認識があっていればわざわざ呼び名を変更する必要はありません。

ただ、新しいメンバーのアサイン時にコードレビュー時の指摘で齟齬が発生するなら見直したほうが良いかもしれません！