OmniAICreator/Qiita-1.07M huggingface dataset:
【新卒】アルゴリズム対策だけではコーディングテストに合格できない！

# はじめに <!-- h1見出し -->
<!-- 発端や概要 -->
就活をしている皆さん、コーディングテスト対策してますか？
私は、24卒で複数社のコーディングテストを受けました。
そこからわかったことを皆さんにお伝えできたらと思い、記事を書くに至りました。

# コーディングテストについて
コーディングテストとは、プログラミング力や知識を問われるテストです。実際にコーディングをすることになります。オンラインでの実施が多いです。

## 合格するにはアルゴリズムができればいい？
ネット上でコーディングテスト対策について調べると、
「〇〇株式会社は、AtCoderの緑レベルが解ければ突破できる！」
「●●株式会社はAtCoder ABCのCレベルが解ければ突破できる！」
と、アルゴリズム問題についてしか触れられていないことが多いです。

ですが、実際は…

***アルゴリズム問題の対策だけでは、突破できないことがある！***

アルゴリズムの問題以外にも、SQLなどの特定の言語が書けるか、データフォーマットの利用ができるか、などが問われることがあるからです。

*※もちろんアルゴリズム問題も出題されます。*

## じゃあ、どんな対策をすれば良いの？
アルゴリズム以外の問題が出ることがある、ということはわかったと思います。しかし、それでは開発における全ての知識を網羅しないといけなくなりますね。流石にそんな時間はないと思うので、何が出るか予測してから対策に臨みましょう。

### 出題の予測方法
募集要項にはどんな仕事をするか記述されています。
コーディングテストでは、その仕事に使う知識を問われることが多いと感じました。

### 例

- バックエンドエンジニア の場合
    - アルゴリズム
    - SQL
    - 実装問題（簡単な仕様書からアプリを作成する感じ）
- Webアプリケーションエンジニア の場合
    - アルゴリズム
    - JavaScript
    - JSON(入出力)
    - SQL
    - WebAPI

バックエンドでは、仕様書をコードに起こすような実装問題。WebアプリケーションではJavaScriptなどのスクリプト言語が問われることがありました。
このように、それぞれの職種でよく扱われる知識が出題されると考えられます。

### Tips
私の経験則からの出題確率を記します。
- 大企業
    - アルゴリズム：100%
    - SQL：30%
    - その他：20%
- 中小企業
    - アルゴリズム：100%
    - SQL：60%
    - その他：50%

このように、大企業はアルゴリズムのみの企業が多かったです。
一方で、中小企業ではSQLやその他の知識が問われることが多いと感じました。

## 対策方法について

### アルゴリズム
職種ごとに系統の違う問題が出るとはいえ、もちろんアルゴリズム問題も出題されます。
コーディングテストでは典型問題が出ることが多いので、私は[AtCoder-競プロ典型90問](https://atcoder.jp/contests/typical90)でアルゴリズムの勉強をしました。
また、コーディングテストが英語で行われる企業の場合は[LeetCode](https://leetcode.com/problemset/all/)も利用すると良いでしょう。LeetCodeでは問題の評価を見ることができるので、比較的評価の高い問題を解くようにすると良いでしょう。

### SQL
SQLについては、実際に利用するのが早いと思います。
テーブル定義(CREATE TABLE)、挿入(INSERT)、更新(UPDATE)、削除(DELETE)および検索(SELECT)を扱えるようにしておくと良いです。特にSELECT文は、複数テーブルからのJOINや、グループ分け(GROUP BY)、副問い合わせを理解しておく必要があると感じました。

### その他の知識
その業種の開発ではどのような技術が使われているのかを調べ、その技術を利用した成果物を作成するのが良いと思います。
成果物(サイトやアプリ)を作成することで、実装力、技術の知識が養われます。しかも作成した成果物は企業に提出するアピール材料にもなるのでおすすめです。

# おわりに
コーディングテストは一夕一朝でできることではありません。早めの対策を心がけましょう。みなさんがコーディングテストに合格し、無事に合格できることを願います。

# 参考
コーディングテストに打ち勝つ-Qiita
[https://qiita.com/yohachi/items/e4bef4035da135a4808d](https://qiita.com/yohachi/items/e4bef4035da135a4808d)
コーディングテストとは？よく出る問題やすぐできる対策について解説
[https://paiza.hatenablog.com/entry/2022/11/18/130000](https://paiza.hatenablog.com/entry/2022/11/18/130000)


<!--
＜hタグ(#の数がhタグの数字に対応する)＞ーーーーーーーーー
#
##

＜コード表記＞ーーーーーーーーーーーーーーーーーーーーーーー
```言語名:ファイル名.拡張子
コードブロック
```
＜インライン(背景つき太字的な？)＞ーーーーーーーーーーーーー
`インライン表示`

＜取り消し線＞ーーーーーーーーーーーーーーーーーーーーーーー
~~取り消し線~~

＜箇条書き＞ーーーーーーーーーーーーーーーーーーーーーーーー
- テキスト
- テキスト

＜参考文献＞ーーーーーーーーーーーーーーーーーーーーーーーー
- [リンクテキスト](URL)
- [リンクテキスト](URL)

-->
[ページネーションをしよう！]Kaminariの導入方法について

# はじめに
皆さん、<b>ページネーション</b>はご存じですか？
ページネーション、それは
複数のページに分割し表示することです。![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975065/45726471-8fcf-6230-5f4a-e4f67743245c.jpeg)
グーグルの検索などでよく見る、
次のページへ進むってやつです。


ページネーションのメリットはこちらです。

::: note info 
読みやすくなる
ページの読み込み時間を短縮できる
:::

天下のグーグルが使っているので
私も真似したい！！！！
と、思った貴方！

簡単に実装する方法があります！それは、、
<b>Kaminari</b>を使えば良いのです！

ん？カミナリ？雷？何それ？
...へいSiri、カミナリってなに？
<br>
<br>
「はい、こちらが見つかりました」
![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975065/beff8d37-1467-1145-f13d-dcf843846e9d.jpeg)



はい、おふざけはここら辺にして
gemの「kaminari」を使って実装していきましょう！


# Kaminariをインストールする
①gemfireに記述(bundle installも忘れずに！)
```
gem 'kaminari','~> 1.2.1'
```

②kaminariの設定ファイルを作成します。
ターミナルに記入
```
rails g kaminari:config
```
③kaminariがページャで利用するテンプレートを作成
```
rails g kaminari:views default
```
導入はこちらで終わりです。簡単ですね。
ちなみに、bootstrapのデザインのページネーションを作りたい場合は
```
rails g kaminari:views bootstrap4
```
この入力でも可能です。

導入が終わりましたら
controllerの記述を書きます
```
# 今回はindexアクションにboardで設定しています。
def index
 @boards = Board.page(params[:page])
end
```
このように記述し、indexのビューページに
```
<%= paginate @boards %> #さっき指定した@boardsを入れています。
```

こうすることによってページネーションが適応されます！

# おわりに
Kaminariを学びました！
導入に困っている方の手助けになれば幸いです。
ご視聴ありがとうございました！
WEBGL用ゲームエンジン作ってみる ~ 1日目 ~

# はじめに

これまでR3Fを使ってWEBGLを遊んできました。
何かしら最終目標が欲しいので、3Dゲームを作るうえで、
R3Fの可能性を信じて最速で動くマルチプレイヤー用のゲームエンジンを集大成として作り始めようと思いました。

ThirdPersonでの動作検証と物理エンジンの設計はすでに完了済みです。
以下、動作検証済みの動画
https://twitter.com/sakanosho/status/1629990635074891779

以下、動作検証済みのキャプチャ図
![layera1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/88656eb9-5e9f-c4a9-bef1-9481ecc12743.gif)



今回目標とするのは、スマホでも軽快に動き、最高品質のグラフィックを提供できるような設計をできる限り考え、UnrealEngineライクに編集でき、すぐにデバッグができるようなシステムです。

アルファ版完了後はオープンソースとして公開したいです(願望)

# 設計
ライブラリ名は、NinjaGLとして作成を始めます。

## 要件
- UnrealEngineライクなエディタ
- UI周りの必要なものはテンプレートとしてある程度用意する事
- スケーラブルでスマホでも快適に動作するマルチプラットフォームである事
- WebRTCを利用したマルチプライヤー対応である事。
- エディタモードと実行モードによる素早いデバックができること。
- 玄人用のスクリプトエディタやシェーダー言語を用意する事
- ビルドしたデータは、各自React環境で実行できること。

## システム構成
個人開発なので、複雑なアーキテクチャは組みません。
Next.jsとReactで簡潔に制作をすすめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/bf385c97-e8b8-9710-e10a-f5f1179b451c.png)



## エンジン内ライフサイクル
可視オブジェクト管理領域と物理世界管理に分けています。
基本的に、接続デバイスや高級GPUありなしで、解像度や品質を動的に変更するようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/fc7fb9d2-6ad5-44ba-07e3-82ed279b907e.png)


## エディタUI画面

あんまり複雑にはしたくないと思ったので、必要最小限の機能で考えてます。
随時アップデートで機能は更新していけばいいかなみたいな感じで。
ただタッチ用のコントローラなどはサンプルプロジェクトで使うものは、デフォルトとして用意することを想定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/3c408719-41ff-f4a2-3587-38e8eb468b02.png)


## スクリプトの実装例(想定)
現状の想定、これ通りにできるかわかりませんが。

```javascript: samplescript.js
/**
* 初回実行時
**/
setup(){
    const obj = NGL.getObjectById("box1");
    // マテリアルの変更
    obj.material = new MaterialStandardMaterial({color: 0xff0000});
}

/**
* 1フレーム事の処理
**/
loop(state, delta){
    const obj = NGL.getObjectById("box1");
    // 少しずつ位置の変更
    obj.position.x += 0.1 * delta;
}
```

## 高速化のための工夫

### 独自物理エンジン
リッチな物理判定が今回の要件にはアンマッチなので、
Meshwalk.jsを改良して独自エンジンとして実装しました。
- Anmo.jsやCannon.jsに依存しない独自物理エンジン
- 高級すぎずある程度精度を荒く物理判定を行う。
- 物理判定後の衝突移動も基本考慮しない。
- スケーラブルに動的な物理世界のON/OFFの実装
- 8本木法による高速な物理判定と段階数のスケール化

### カメラレイヤーの可視化のON/OFF
一定間隔で水平座標にグリッドを引き、
カメラ座標から一定の距離にあるものだけを可視化を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/0862db29-c43a-ca14-2505-bb0b22dd0267.png)

表示できるLは接続デバイスやGPUの使用状況から可変的に動作させることで、描画のクオリティを担保しながら表示を行えます。
また、強制的に表示したいものに関しては、レイヤー0に設定することで、強制表示とします。

```javascript
// 表示
camera.layers.enable(layerNumber);
// 非表示
camera.layers.disable(layerNumber);
```

### LODの自動化

これに関して考慮するのが2点あり、
粗さに関してはカメラ距離からモデルを切り替えることで高速化につながることが1点と、近いオブジェクトに関しても、見た目上の描画するポリゴン数と物理世界で計算させるポリゴン数は異なってもいいということです。
今回はなにより高速化を考慮したいので、見た目は鮮明なものも低ポリしたものを物理世界で計算させる、もしくはシンプルなAABBとして計算させることで高速化を行います。

- 表示用の低ポリ化は基本モデルアップロード時にサーバー側に送りサーバー側で底ポリ化を行います。
追記：具体的な方法を公式Forumで聞いたところ、すぐに回答くれました。
https://discourse.threejs.org/t/automatic-low-polygon-reduction-for-glb-models/47865/6

- 物理世界の低ポリ化は以前作成した自動LODの記事で行います。
https://qiita.com/osakasho/items/16094d31b43bef8fe60a


# 最後に

長い道のりになりそうですが、
毎日作業していこうと思います。
終わっているころにはきっとWebGLマスターになっていることでしょうという妄想を抱きながら。

毎朝2時間程度と夜1時間で毎日3時間くらいは確保して進める予定です。

記事ですが毎日投稿は面倒なので、
見せられる切りのいいとこでまとめて投稿する予定です。
① Rで丸数字をさっさと扱う ㊿

# 丸数字うざー！！
はい。めんどいですね丸数字
調べても全然情報無いし。

てわけでRだけでサクッと処理するように作ってみました。
ベクトル対応なので雑に手軽に使えると思います〜

```R
pacman::p_load(tidyverse, stringr)
# 丸数字を通常数字に置き換える
marunum2num <- function(input) {
  maru_all <- "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿"
  maru_v <- str_split_1(maru_all, "")
  onetofifty <- 1:50 %>% as.character
  names(onetofifty) <- maru_v
  str_replace_all(input, onetofifty)
}
```

R の Named argumentを使った置き換えは色々と応用が効いて便利ですね
リスト内包表記

```py.qiita.py
l = []
for i in range(6):
    l.append(i)
print(l)
```
> 上で作っていたリストを1行にまとめられるのがリスト内包表記
```py.qiita.py
#  上記のコードを一つにまとめられる
#  コードがスッキリするのと、処理が早いのがポイント
#  l = [追加する式、for文]この二つを書くこと
l = [ i for i in range(6)]
print(l) 

# if文を追加して条件をつけることができる
l2 = [i for i in range(1, 7) if i % 3 == 0]
print(l2)
```
リストのメソッド

## リスト
```py.qiita.py
#  Listとメソッド
#  リストに対してメソッドを使うと要素の追加、削除が可能になる
l = [1, 2, 3, 4]
print(l)

#  リストの一番最後に追加される
#  リストに5を追加できる
l.append(5)

print(l)
```
## インデックス番号を指定して要素の追加
```py.qiita.py
# 　追加する番号を指定する方法
#  insertメソッドを用いる
l = [1, 2, 3]

#  前から数えて、2番目の位置に10を入れる
# 　上書きではなく、差し込み
l.insert(1, 10)
print(l)
```
## リストの拡張
```py.qiita.py
# 　リストの拡張
#  extendメソッドを用いる
l1 = ['nike', 'newbalance', 'adidas']
l2 = ['asics', 'mizuno', 'moonstar']

l1.extend(l2)
print(l1)
```
## 要素の削除
```py.qiita.py
#  要素の削除
#  removeメソッドを用いる、removeは最初に見つけたものを削除する
l = [1, 2, 3, 4]
l.remove(2)

print(l)
```
## removeメソッドの注意点
```py.qiita.py
l = []
for i in range(5):
    l.append(i)
# l = [0,1,2,3,4]
    
#  2を追加
l.append(2) # l = [0,1,2,3,4,2]

#  ２を消そうとすると番号が早い方の2が消える　
l.remove(2)
print(l) # l = [0,1,3,4,2]

```
PostgreSQLで文字数と正規表現をまとめてCHECKする

# はじめに

初歩的ですが、いざやろうとするとパッと思い出せないとき用のメモ書きです。

# ポイント

- 文字列の長さは**length()**
- 正規表現に一致するかを比較する演算子は~(チルダ)
- 文字数の制約はm文字以上、n文字以下で設定

# SQL文

以下は英数字と@ . _からなる1～255文字の文字列という制約をかける場合です。

```sql
  CREATE FUNCTION check_str(str text, min int , max int) RETURNS boolean AS $$
    SELECT str ~ concat('^[0-9a-zA-Z@_.]{', min, ',', max, '}$') AS result; 
  $$ LANGUAGE SQL;

  CREATE TABLE users (
    username text PRIMARY KEY CHECK(check_str(username, 1, 255)),
  )
```
リスト

## List型
```py.qiita.py
#  List型　データ構造
# 　Listとは、複数の要素が入れられる変数？
l = [1, 2, 3, 4, 5]
print(l, 'クラスは、', type(l))

#  文字列も入れることが可能
l2 = ['nike', 'newbalance', 'adidas']
print(l2)

# 　Bool値も入れることが可能
l3 = [True, 1, 'newbalance']
print(l3)

```
## 値の取り出し
```py.qiitq.py
#  値の取りだし
print(l[0])
print(l2[0])
print(l3[2])

#  range関数を用いない方法
for i in l:
    print(i)
    
print('**************************************')

# range関数を用いた方法
for i in range(len(l)):
    print(l[i])
```

## リストの中身とインデックス番号の両方を取り出す方法
```py.qiita.py
#  リストの中身とインデックス番号を取り出したい時
#  enumerate関数を用いる
#  インデックス番号、中身の順に出てくる
#  l2 = ['nike', 'newbalance', 'adidas']
for i, j in enumerate(l2):
    print(i, j)
    
print('*****************************')
    
#  enumerateを使わない方法
# 　こちらはあまり使わないらしい
for i in range(len(l2)):
    print(i, l2[i])

```
宣言型プログラミングって？


「[プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則](https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B03%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-%E4%B8%8A%E7%94%B0-%E5%8B%B2/dp/4798046140)」
この本の中で下記の文がよくわからんってなったのでGolangでコードを書いてみて理解したので解説。
> 「宣言型の表現」とは、コードの意図を伝えようとする時、できるだけ「命令型」よりも「宣言型」で表現することです。

例えば、与えられた整数の配列から、特定の条件を満たす要素のみを抽出する場合を考えます。
命令型のアプローチでは、ループを使用して条件に合致する要素を取得する必要がありますが、宣言型のアプローチでは、フィルタリングのためにGo言語の標準ライブラリに含まれる関数を使用することができます。


```go
// 命令型の例
func getEvenNumbers(numbers []int) []int {
    var evenNumbers []int
    for _, number := range numbers {
        if number % 2 == 0 {
            evenNumbers = append(evenNumbers, number)
        }
    }
    return evenNumbers
}

// 宣言型の例
func getEvenNumbers(numbers []int) []int {
    return filter(numbers, func(number int) bool {
        return number % 2 == 0
    })
}

func filter(numbers []int, filterFunc func(int) bool) []int {
    var filteredNumbers []int
    for _, number := range numbers {
        if filterFunc(number) {
            filteredNumbers = append(filteredNumbers, number)
        }
    }
    return filteredNumbers
}
```

この例では、`filter`関数は、与えられた条件に基づいて配列をフィルタリングするための抽象化された関数です。
`getEvenNumbers`関数は、`filter`関数を使用して、与えられた配列の偶数要素のみをフィルタリングします。
このアプローチは、命令型のアプローチよりも宣言型であり、関数の名前や引数、戻り値を見るだけで、コードの意図が明確に伝わるという利点があります。

### もっと簡単なコード

```go
// 命令型の例
func sum(numbers []int) int {
    total := 0
    for _, number := range numbers {
        total += number
    }
    return total
}

// 宣言型の例
func sum(numbers []int) int {
    return reduce(numbers, func(acc, number int) int {
        return acc + number
    }, 0)
}

func reduce(numbers []int, reduceFunc func(int, int) int, initialValue int) int {
    result := initialValue
    for _, number := range numbers {
        result = reduceFunc(result, number)
    }
    return result
}
```

宣言型の例では、`reduce`関数を使用して、数値の配列を単一の値にまとめる関数を作成しています。`reduce`関数は、与えられた関数によって値を累積することができ、最終的な値を返します。
`sum`関数は、`reduce`関数を使用して、与えられた配列の値の合計を計算します。

命令型のアプローチでは、ループを使用して値を合計していますが、宣言型のアプローチでは、配列を累積する抽象化された関数を使用しています。このようなアプローチは、コードの意図をより明確に伝え、再利用性が高いという利点があります。
DuckDB + Jupyter + Kepler.gl で位置情報データの可視化を試す

# はじめに

今回は、社内で紹介されていた[DuckDB](https://duckdb.org/)に関する下記の記事が気になったので試してみました！

https://zenn.dev/notrogue/articles/1193d0ab8d8eda

普段の業務ではSQLを使うことが多いので、DuckDBの特徴としてあげられている下記の点が特に気になりました。
>  - Pandas・dplyrなどに比べ、高速（クエリの最適化を行う）、SQL（表現力や移植性）が使える、トランザクションが使える
>  - ParquetやCSVの読み書き、Pands DataFrameの読み書き
>    - ローカルだけではなく、HTTP(S)、S3からも取得できるようです

この記事ではDuckDBを使って緯度経度情報を持つCSVを読み込み、Kepler.glで可視化（位置情報を扱う会社の記事なので🌏！）しています。

## DuckDBをインストール

今回はpython環境にインストールしてみました。
※[公式HP](https://duckdb.org/)にあるように、PythonだけでなくRなど色々な環境でつかえるとのこと。


インストール方法は[公式](https://duckdb.org/)にある通り、下記でＯＫです。
なお、公式の[Google Collab notebook](https://colab.research.google.com/drive/1eOA2FYHqEfZWLYssbUxdIpSL3PFxWVjk?usp=sharing)のサンプルも公開されているので、そちらを参考にサクッと使うのもおすすめです！

```shell
pip install duckdb
```

今回は、Jupyterで使ってみたいので、こちらも[公式ドキュメント](https://duckdb.org/docs/guides/python/jupyter)を参考に下記のものもインストールします。

```shell
pip install notebook
pip install jupysql
pip install duckdb-engine
pip install pandas
```

加えて、kepler.glで可視化もしたいのでこちらもインストール。

```shell
pip install kepler.gl
```



## 使ってみる

### Jupyter Notebookを開いて、必要なライブラリのインポート

```shell
import duckdb
import pandas as pd

%load_ext sql
```

### jupysqlの設定
```shell
%config SqlMagic.autopandas = True # Pandasデータフレーム化
%config SqlMagic.feedback = False # フィードバック表示
%config SqlMagic.displaycon = False # 接続先情報表示
```

### メモリ上にDBを構築してDuckDBに接続

```shell
%sql duckdb:///:memory:
```

### CSVからテーブル作成

[国土数値情報](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P30.html)からダウンロードした東京都の郵便局データをQGISでCSV化したものを使いたいと思います。

```sql
# CSVを読み込んでテーブルを作成
%%sql
create table yuubin as
select *
from read_csv_auto('tokyo_yuubin.csv'); #郵便局データの読み込み
```

```sql
# 作成したテーブルに対してクエリを投げてみる
%%sql
select *
from yuubin;
```

↓結果
![クエリ結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/5937de39-852b-165d-7b2d-a5e5a7e65eb2.png)

次は住所に「渋谷」がつく郵便局を調べてみましょう！
```sql
%%sql
select *
from yuubin
where P30_006 like '渋谷%';
```

↓結果
![渋谷抽出結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/fe39ecac-38cf-47a0-2b2a-2248e4c12dd6.png)

### Kepler.glで地図にプロットしてみる

読み込んだCSVの緯度経度（latitude, longitude）をもとにKepler.glをつかって地図にプロットしてみましょう！

まずはkepler.glをインポート
```shell
from keplergl import KeplerGl
```

続いて、先程作成したテーブルをデータフレームに格納します。
```sql
%%sql
df <<
select *
from yuubin;
```

最後に、そのデータフレームをkeplerで読み込みます。
```python
map_yuubin = KeplerGl(height=400)
map_yuubin.add_data(data=df, name='yuubin')
map_yuubin
```

そうすると、下図のようにインタラクティブなマップが表示され、グリグリ動かせます。
色を変えたり、マーカーサイズを変更したりと操作可能です。
![kepler.glで可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/aa970817-f313-bd93-6137-d687da33c8d4.png)

今回は本当にさわりの部分のみを試してみましたが、色々と活用できそうな気配なので研究していきたいと思います！
【AWS】AmazonS3　ゲートウェイエンドポイントとインターフェースエンドポイントの違い

# この記事について
AmazonS3　ゲートウェイエンドポイントとインターフェースエンドポイントの違いをまとめたアウトプットです。

# 参考
[Udemy 【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）]
(https://www.udemy.com/course/aws-knan/)

# 早見表

|ゲートウェイエンドポイント|インターフェースエンドポイント|
|:----:|:----:|
ネットワークトラフィックはAWSネットワーク上に残る|ネットワークトラフィックはAWSネットワーク上に残る
Amazon S3 パブリックIPアドレスを使用|VPCのプライベートIPアドレスを使用しS3へアクセス
Amazon S3のDNS名を使用する|エンドポイント固有のAmazon S3 DNS名を要求
オンプレミスからのアクセスNG|オンプレミスからのアクセスOK
別AWSリージョンからのアクセスNG                               |VPCピアリング、AWS Transit Gatewayを使用する別のAWSリージョンにあるVPCからのアクセスOK
課金なし|課金あり

# AmazonS3 ゲートウェイエンドポイント
ルートテーブルで指定するゲートウェイ。AWSネットワーク経由でVPCからAmazon S3にアクセスするためにルートテーブルで指定する。

＜手順＞
1.接続したいリソースが配置されているVPCにVPCエンドポイントを割り当てる。
2.ルートテーブルに、ターゲットのVPCエンドポイントのルーティングを設定する。

＜メリット＞
・インターネットゲートウェイやNATゲートウェイ不要。
・AmazonS3やDynamoDBへの信頼性の高い接続を提供。
・課金なし

＜デメリット＞
・オンプレミスからアクセスできない
・別リージョンからアクセスできない

# AmazonS3 インターフェースエンドポイント
プライベートIPアドレスを使用して、VPC内/オンプレミス/VPCピアリング/AWSリージョンを使用する別のAWS Transit GatewayにあるVPCからAmazon S3にルーティングする。

＜手順＞
AWS PrivateLink for Amazon S3で、
別のAWSリージョンにあるアプリケーション　
→ VPNおよびAWS Direct Connect経由　　
→ オンプレミスにあるアプリケーション（もしくはVPCピアリング）経由　
→ AmazonS3バケットにアクセスする。

＜メリット＞
・オンプレミスからアクセスできる
・別のリージョンからアクセスできる

＜デメリット＞
・エンドポイント固有のAmazon S3　DNS名を要求される
・課金あり
【ActiveRecord】想定通りにインデックスが使われていなくて確認したこととわかったこと

# 結論

A. ActiveRecord を使ったクエリ発行では
①可能ならハッシュ形式の条件指定をしよう
②文字列形式で指定するならプレースホルダを適切に使用しよう

B. ActiveRecord を活用しない場合は int なのか varchar なのか、ちゃんと意識してクエリ発行しないとインデックスが使われない

以上 Aについて再認識、Bについて知ることができました。

# 環境
- Ruby v2.7.5
- ActiveRecord v6.1.4.4
- MySQL v8.0.23

# 問題の概要と原因

:::note warn
実際の業務で経験した内容を外部向けに掲載可能になるよう、テーブル名などを変更し、さらに簡略化した上で記載しています。
:::

先日、想定しているインデックスが使われていないクエリを見つけてその原因を探りました。

User は、複数の Book を持つ、という前提で以下を見るようにして下さい。

```ruby
SELECT * from books where user_id = 1;
```

`Book` の `user_id` にはインデックスが張られていますが、👆のクエリはフルテーブルスキャンになっていました。ナゼ🤔？？

以下のクエリだと正しくインデックスが使われました。

```ruby
SELECT * from books where user_id = "1";
```

そうです、最初の設計ミスで books の user_id カラムは int であるべきところが varchar になってしまっていました😲
これがインデックスが使われていない原因でした。

というか、varchar なところを int で指定すると「レコードは取れるのだけどインデックスはうまく使えない」になっちゃうんですね。これ、考えたことなかったので注意すべきところだなと思いました。

この機会に、以下についてはどうなってるんだろう？ということを確認してみました。

# ActiveRecord と発行クエリについて確認

## 条件を文字列だけで指定する（生SQL埋め込み）

```ruby
Book.where("user_id = 1")
```

```ruby
SELECT `books`.* FROM `books` WHERE `books`.`user_id` = 1;
```

今回はこのような書き方になってしまっていたため、問題が生じていました。

そのまま文字列を埋め込むようなケースだと ActiveRecord は何も考慮してくれないので、このような非効率なクエリになってしまうようでした。

まぁこういう書き方に慣れちゃうと [SQL インジェクション](https://railsguides.jp/security.html#sql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)の要因にもなるコードを生むようになっちゃうのでそもそもよくない書き方です。
どうしてもこういった書き方が必要なケースについては次の[プレースホルダ](https://railsguides.jp/active_record_querying.html#%E6%9D%A1%E4%BB%B6%E3%81%A7%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%82%92%E4%BD%BF%E3%81%86)を利用する癖をつけましょう。

## プレースホルダを用いて文字列を埋め込む

```ruby
Book.where("user_id = ?", 1)
```

```ruby
SELECT `books`.* FROM `books` WHERE `books`.`user_id` = '1';
```

SQL インジェクションを防ぐために推奨されるプレースホルダを用いた書き方をすると、適切な type に修正したSQLを発行してくれました。これなら安心です。

### 補足

今回の例は簡略化しまくっているので、この例だとプレースホルダを利用する価値がないですが、本来は以下のように `1` の部分に変数を埋め込んで動的にクエリを作るようなケースを想定しています。

```ruby
# NG
Book.where("user_id = #{user_id}")
# OK
Book.where("user_id = ?", user_id)
```

## 条件でハッシュを使う

```ruby
Book.where(user_id: 1)
```

```ruby
SELECT `books`.* FROM `books` WHERE `books`.`user_id` = '1';
```

こちらもプレースホルダを用いた方法と同様に、適切な type でSQLを発行してくれました。
今回例として上げているようなシンプルなクエリを発行する場合は基本こういう書き方をすると思うので、Rails がよしなにしてくれて問題がおきない感じですね。

これに助けられ続けていたので、生SQLをよくない書き方で埋め込んでいることによって生じている今回の問題にも気づくのが遅くなりました。

# まとめ

最初に書いたことのの繰り返しですが、

ActiveRecord を使ったクエリ発行では
①可能ならハッシュ形式の条件指定をしよう
②文字列形式で指定するならプレースホルダを適切に使用しよう

またActiveRecord を活用しない場合は int なのか varchar なのか、ちゃんと意識してクエリ発行しないとインデックスが使われない


ActiveRecord ありがとう🙏
Deno: MariaDB のバージョンを表示

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
└── server_version.ts
```

```ts:server_version.ts
// ---------------------------------------------------------------
//	server_version.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { Client } from "https://deno.land/x/mysql/mod.ts"
import { config } from "https://deno.land/x/dotenv/mod.ts"

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const config_env:any = config()

const client = await new Client().connect({
  hostname: config_env.host,
  username: config_env.user,
  password: config_env.password,
  db: config_env.data_base,
})


const command:string = "SELECT VERSION ()"

const results = await client.query(command)

console.log(results)
console.log(results[0])
console.log(results[0]["VERSION ()"])
await client.close()

console.error ("*** 終了 ***")


// ---------------------------------------------------------------
```

```text:.env
host = 'localhost'
user = 'scott'
password = 'tiger123'
data_base = 'city'
```

## 実行結果

```text
$ deno run --allow-read --allow-net server_version.ts
*** 開始 ***
INFO connecting localhost:3306
INFO connected to localhost:3306
[ { "VERSION ()": "10.11.2-MariaDB" } ]
{ "VERSION ()": "10.11.2-MariaDB" }
10.11.2-MariaDB
INFO close connection
*** 終了 ***
```

## 確認したバージョン

```text
$ deno --version
deno 1.31.0 (release, x86_64-unknown-linux-gnu)
v8 11.0.226.13
typescript 4.9.4
```
mainecarftでサーバー立ち上げで躓いた事（ver1.18.2）（Java）


# 初心者のサーバー立ち上げ
この記事はサーバー初心者WEBデザイナーの備忘録です。
マインクラフトでサーバー立ち上げの際に躓いたことが合った為、知ってる人からすると当たり前のことかもしれませんが備忘録として残しておきます。

サーバーの建て方などは先人の知恵がある為、躓いたポイントのみ記載していきます。

## マインクラフトサーバー立ち上げ編
まずマインクラフトは
使用バージョンによってJavaのバージョンがが異なります。
1.7.10~1.16.5	Java8,11
1.17~1.17.1	Java16
1.18~	Java17
なのでバージョンに合わせたJavaを用意する、複数インストールしてる際は選択する必要があります。

[・CentOS 7にOpenJDK 17をインストール（Microsoft Build）](https://qiita.com/witchcraze/items/9fd48dc99759befac973 "CentOS 7にOpenJDK 17をインストール（Microsoft Build）")
[・CentOS 7にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）](https://qiita.com/witchcraze/items/014da8ee2c638737e9bc "CentOS 7にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）")
上記の記事の方を参考にインストールさせていただきました。

インストールしたJavaに切り替える必要があります。
[・【Java】複数バージョンのJavaを切り替えて使う方法](https://qiita.com/nkojima/items/e3de6052554ee1d77144 "【Java】複数バージョンのJavaを切り替えて使う方法")

これらの作業を完了後サーバーファイルを起動します

## MODサーバー立ち上げ編（Forge）
MODサーバーを立てたいと思う人は、
Forgeの導入を進めると思いますが、それもバージョンによって異なります。
また起動方法も変わる為、躓きやすい点となります。
1.17からForegのサーバー用のインストーラーを実行後、生成される
・libraries
・run.sh
・user_jvm_args
をサーバーのディレクトリに入れる必要があります。
また、サーバー起動時にはrun.shから実行する必要があります。

過去バージョンだとサーバー起動用のjarがありましたが、1.17~から消えていました。（ここで自分は躓いていました）

上手く立ち上がればMODの導入です

## MODサーバー立ち上げを振り返って
今回サーバーを立ち上げるに伴い導入したMODは全部で16個くらい入れましたが、Javaとのバージョンだったり、MODのバージョンだったりでかなり苦労しました。
その際にとても重要なのはエラー文を読み解くことだと痛感しました。
意外と簡単なところだったりします。
今回この備忘録を記載したのはだいたいのサーバー立ち上げの記事が1.12だったり1.10だったりJava8を使用するものが多く、通常のOSにインストールするもので事足りますが1.18などはJavaのバージョンで躓きました。

あとこれからVPSを借りてサーバーを立ち上げようとしている人はかならず、SSH公開鍵認証等で接続できるようにしましょう。キーフレーズだと不正アクセスされます。（一度経験しました。）
AWS SESで送信クォータの制限にぶつかった話

## はじめに
本記事はSESを初めて使用した際に陥った備忘録として投稿します。

## AWS SESとは
公式サイトには以下のように説明されています。

`ユーザー自身の E メールアドレスとドメインを使用して E メールを送受信するための、簡単で費用効率の高い方法を提供する E メールプラットフォーム`

要するに、開発したサービスの中で簡単にメール送信を行えるというものです。

## 送信クォータとは
しかしSESは無制限に使えるわけではなく制限が設けられており、
以下のような送信クォータというものが設定されています。

・24時間ごとに200件まで（変更申請可能）
・1秒ごとに1件まで（変更申請可能）
・メールの容量は1件あたり40MBまで　etc...
（詳しくは[公式](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/quotas.html)をご参考ください。）

## 発生したエラーと解決策
今回は以下のようなエラーが発生しました
```
554 Transaction faild:
Recipient count exceeds 50. The email was not sent.
```
SESでは1回の送信処理における最大宛先件数に50件という制限があり、
200件の宛先がある場合は最低でも4回に分ける必要があるということです。
何も知らず100件の宛先に一斉送信した私は当然これにひっかかりました。

解決策は主に2つです。
##### ① 最大宛先件数の上限を上げる申請をする。
##### ② 任意の件数ごとのアドレスリストを作成する。

①は簡単に思えますが、送信クォータには1秒ごとの送信件数制限もあるので
こちらにひっかかる可能性があります。
なので今回は②の方法で解決することにしました。

## 解決方法
以下の変数が設定されているとします。
```java
List<String> allAddressList // 全ての送信先アドレスのリスト
```
では実際に解決できたコードを作成してみましょう。
```java
int sendUnit = 50; // 1回の送信先件数
int allAddressSize = allAddressList.size(); // 全ての送信先件数
fot (int i = 0; i < allAddressSize; i+= sendUnit {
    List<String> subList = new ArrayList<>
        (allAddressList.subList(i, Math.min(i + sendUnit, allAddressSize));
    // 送信処理のコード省略 //
}
```

今回はsubListメソッドを使用して、新しい送信先リストを作成しました。
subListは第一引数に開始位置、第二引数に終了位置を渡すことで、
その範囲にある値のリストを新しく作成できるメソッドです。

しかし注意すべき点がひとつ、
それはsubListはシャローコピーであるということです。
シャローコピーとは参照元と同じデータを参照しているという意味です。
要するにsubListに変更があると参照元のデータも変わってしまいます。
これを防ぐためにnewで初期化し、参照元に影響が出ないようにしています。

また、今回はsubListの第二引数でMath.min()を使用しました。
これは引数のうち小さい方を取得するというメソッドです。
例えばアドレスが80件の場合、Math.min()を使用しないどうなるでしょう。

```java
int sendUnit = 50;
int allAddressSize = allAddressList.size();
fot (int i = 0; i < allAddressSize; i+= sendUnit {
    List<String> subList = new ArrayList<>
        (allAddressList.subList(i, i + sendUnit);
    // 1週目は50件まで作成できるが、
    // 2週目で81件目以降が存在せず例外が発生する。
}
```
81件目以降は存在しないのに取得しようとするため、例外が発生します。
Math.mint()を使って、
1回の送信先件数と未送信アドレス件数で小さい方をsubListに渡し、
例外が発生しないようにします。

## まとめ
今回はsubListを使うことで送信クォータの制限を解決しました。
AmazonSESは簡単に使えて手軽なため初めてでも扱いやすい反面、
様々な制限がありAWSの知識も必要になります。
同じ場面に出くわした方に少しでも役立つことを願います。
Go言語 fmt.scanで取れる値とは

タイトルの詳細を少し気になったので思ったので調べてみた。

`fmt.Scan`関数で読み取る変数は、ポインタでなければならない。
これは、`fmt.Scan`関数が読み取った値を呼び出し元の変数に格納するためにポインタを使用するためです。

具体的には、`fmt.Scan`関数は、与えられた引数のアドレスに対して読み取った値を格納します。
したがって、呼び出し元の変数のアドレスを渡す必要があります。
これは、**値渡し**ではなく、**参照渡し**の仕組みです。

例えば、以下のコードでは、`fmt.Scan`によって`&x`、`&y`に対して読み取りが行われています。

```go
var x, y int
fmt.Scan(&x, &y)
```
ここで、`&`はアドレス演算子で、`&x`は変数xのアドレスを表します。
`fmt.Scan`関数は、引数に渡されたアドレスに対して読み取った値を格納するため、`&x`や`&y`のようなポインタが必要となります。

https://pkg.go.dev/fmt#Scan
CSSを同時に簡単に変えられるようにしておきたい。定義方法と命名規則

cssの名前がどうしても分かりにくくなる。
何を目的としたcssか分かり安くできるように考えた。

自分の場合、railsの分岐によってcssの色を変える必要がある。

最初は、orangeを、

```ruby:sample.scss
my-oragnge{
 color: orange;
}
```
のような定義にしていた。しかし、これでは一度定義されたものを変えるのが非常に大変。

なので、第２弾として、色自体を定義。
```ruby:sample.scss
:root {
  --my-orange : orange;
}

.my-orange {
  color: var(--my-orange)
}
```
これで、rootを変えれば全て変更ができる！
けれども、例えば、買う側と販売側のマイページで色を変えたいなどの時は、これでは使えないし、そもそもorangeを定義するんじゃなくて、
```
買い手(buyer)：orange;
売り手(seller)：blue;
```
みたいな定義の方が分かり安い。

なので、my-orangeではなく、
```ruby:sample.scss
:root{
    buyer-main-color:orange;
    seller-main-color:green;
}

.buyer-main-color {
 color : var(--buyer-main-color);
}

.seller-main-color{ 
 color : var(--seller-main-color);
}
```
とかの方が、後から見ても色付けのclassだと分かりやすいし、何を目的とした色かも分かりやすい。
【Rails】link_toメソッドの使い方

## 概要
`link_to`メソッドはリンクを作成するためのヘルパーメソッド。HTMLのaタグの代わりに使用可能。

## 1. link_to

link_toの通常の記述方法は以下の通り。
```
<%= link_to "リンクに表示したい文字", "リンク先URL or パス" %>
```
methodオプションや属性を指定することも可能。

例）`削除する`リンクを押してデータを削除する場合
`method`で`delete`を指定することでデータを削除。また、`data:{:cofirm}`の確認ダイアログを記述することで、削除前に下部画像のように確認ポップアップが現すことができる。

```
<%= link_to '削除する', "パス", method: :delete, data: { confirm: '本当に削除してもOKですか？' } %>
```
[![Image from Gyazo](https://i.gyazo.com/d352d0fbc137231276f2aa00bb0844cb.gif)](https://gyazo.com/d352d0fbc137231276f2aa00bb0844cb)

## 2. link_to "パス" do ~ end
表示したい文字部分にHTMLタグを含む場合は、`link_to "パス" do ~ end`の書式で記述することが可能。
`do~end`のブロック内にHTML要素を記述することで、中の要素は同時にリンク機能を持つことができる。

```
<%= link_to "パス" do %>
  <span>表示したい文字</span>
  <i class="fa fa-list-ul"></i>
<% end %>
```
上記コードのブラウザ画像。`表示したい文字`、`アイコン`は両方ともリンク機能を持っている。
[![Image from Gyazo](https://i.gyazo.com/418d5e4233f7d3393dbbf0b79e81aeed.png)](https://gyazo.com/418d5e4233f7d3393dbbf0b79e81aeed)
Cloud Domains を利用していて困った話

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki）です。

Google Cloud の [Cloud Domains](https://cloud.google.com/domains/docs/overview) を利用していてちょっと困ったことに遭遇しましたので、事の顛末と解決方法を記事にします。

## この記事の対象者

- Cloud Domains を利用している方
- Cloud Domains の請求先アカウントを変更したい方
- プロジェクトの請求先アカウントを切り替える際のナレッジを知りたい方

## やりたかったこと

とある Google Cloud プロジェクトで Cloud Domains を利用してドメインを取得していました。
ある日、諸事情によりプロジェクトの請求先アカウントを変更することになりました。

Google Cloud ではプロジェクトにリンクされている請求先アカウントを変更[^1]することで、プロジェクトの利用料金の請求先を変更できます。

[公式ドキュメント](https://cloud.google.com/billing/docs/how-to/modify-project?hl=ja#change_the_billing_account_for_a_project)にも記載があるとおり、プロジェクトの請求先アカウントを変更しても、サービスの中断などは発生しません。

以下のようなイメージです。

これを
![google_ba-請求先アカウント移行前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/3fd63d62-2286-c619-6af7-aa3fee5dbbfd.png)
こうしたい
![google_ba-請求先アカウント移行後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/c1ef3028-c81a-5d84-8999-4245768d5abf.png)

## Cloud Domains の特徴

本題へ入る前に Cloud Domains について簡単にご紹介します。

ドメイン取得サービスと言うと、[お名前.com](https://www.onamae.com/) や [Google Domains](https://domains.google/intl/ja_jp/) 等を思い浮かべる方もいらっしゃるかと思います。

Google Cloud ではドメインを取得できる [Cloud Domains](https://cloud.google.com/domains/docs/overview) と言うプロダクトがあります。

Cloud Domains の特徴を簡単にまとめてみました。

:::note info 
- ドメインは自動更新
- **請求先アカウントで支払う（Google Cloud の利用料金と一緒に請求される）**
- レジストラは Google Domains
:::

Google Cloud のプロダクトなので当然かもしれませんが、ドメインの取得費用も Google Cloud の利用料金として支払いを一本化できる点は嬉しいところですね！

## 疑問

話を戻します。

フレキシブルに請求先を変更できるのは Google Cloud の良い点ですが、ふと思ったのです。

「Cloud Domains のドメインは自動更新される。プロジェクトの請求先アカウントを変更して更新日を迎えたら、**新・旧どちらの請求先アカウントに課金されるのだろう？**」

期待値としては新しい請求先アカウントに課金されてほしいです。

なぜこの疑問を抱いたのかと言うと、以下のように課金のされ方に違いがあったためです。

- Compute Engine 等ほとんどのプロダクトは**プロジェクトの費用**として課金される
- Cloud Domains は **プロジェクトに対して固有でない課金** として計上される
![プロジェクトに対して固有でない課金.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/e3863a9b-4062-1861-2cb6-c8a53ad728b7.png)


## 調査

ドキュメントを読み漁ってみましたがよくわかりませんでしたので、サポートに問い合わせたところ以下の回答でした。

「Cloud Domains は プロジェクトに対して固有でない課金 として計上されており、プロジェクトの支払先である請求先アカウントの変更に伴い、**自動的に変更されない**」

-> 要するに何もせずドメインの更新日を迎えると、ドメイン更新に伴う課金は**旧請求先アカウント**に請求される。ということでした。

😇

ほっとくと旧請求先アカウントに請求されるのは仕様と受け入れるとして、どうにか新しい請求先アカウントにドメイン更新の費用が課金されるように変更したいです。

## 解決方法

（ここに来るまで色々キャッチボールがあったのですが）
サポートの方に代替手段をご提示いただきました。ありがとうございます！

実施内容としては以下の2つです。

> 1. Cloud Domains 管理のドメインを Google Domains にエクスポート[^2]
> 2. Google Domains から Cloud Domains にインポート[^3]

なるほど。

こういうことなんだろうと思います。

- 1 のタイミングで Google Cloud の課金から外れ、Google Domains の支払方法に変更される
- 2 のタイミングでその時点のプロジェクトにリンクされている請求先アカウントに紐付く

ちなみに、上記代替手段を実施しても ドメインの課金先となる請求先アカウントを直接確認できる画面等は提供されていない[^4]ため、ユーザーからすると目に見えるものは作業前と何も変わりません。

## おわりに

請求先アカウントを変更する頻度自体はそれほどないと思いますが、Cloud Domains を利用していて困ったこととその解決方法をご紹介しました。
応用すれば別なプロジェクトに Cloud Domains 管理のドメインも移行できますね。

いつかアップデートで解決することを期待して記事は終わります！


[^1]: https://cloud.google.com/billing/docs/how-to/modify-project?hl=ja#change_the_billing_account_for_a_project
[^2]: https://cloud.google.com/domains/docs/export-domains
[^3]: https://cloud.google.com/domains/docs/import-domains-from-gd
[^4]: 2023年1月時点
[memo] TypeScriptでPythonのrange()っぽいものを使いたい

# はじめに

* TypeScript で（例えば React の JSX の中でループするような場合に）Pythonの `range()` みたいなものが欲しくなることがありますよね
* 通常は `[...Array(num)].map([_, i] => ～)` みたいな感じにしているけど、初見の人にわかりにくい気がする
* 簡易的な関数を作ってみたので、とりあえずメモ

# 実装

一応、使いまわす前提なので `export` する形で記載しました。
使うところと同じファイルに書くなら `export` は取り除いた方が良いかも。

```typescript
export function range(start: number, stop: number, step?: number): number[];
export function range(stop: number): number[];
export function range(...args:
    | [start: number, stop: number, step?: number]
    | [stop: number]
): number[] {
    if (args.length === 1) {
        const [stop] = args;
        return Array.from({length: stop}, (_, i) => i);
    } else {
        const [start, stop, step = 1] = args;
        if (step === 0) {
            throw new Exception(`range(${args})`);
        }
        return Array.from(
            { length: Math.ceil((stop - start) / step)},
            (_, i) => start + (i * step)
        );
    }
}
```

`start` とか `step` がいらないなら、以下だけでもいいかも。

```typescript
export const range = (stop: number) => Array.from({length: stop}, (_, i) => i);
```

実際に配列を作ってしまうので、Python3 ではなく Python2 の `range()` 相当ですけどね。

間違いとか、もっと良い方法があったら教えてください。

# 性能対策

以下の記事にある @kawanet さんのコメントを参考に、性能対策版を考えてみた。

https://qiita.com/suin/items/1b39ce57dd660f12f34b

`reduce()` を使って、配列を 2 回作らない対策をしたもの。
ついでに配列にスプレット構文で展開するよりも `fill()` の方がほんのすこし速そうなので。

```typescript
export function range(start: number, stop: number, step?: number): number[];
export function range(stop: number): number[];
export function range(...args:
    | [start: number, stop: number, step?: number]
    | [stop: number]
): number[] {
    if (args.length === 1) {
        const [stop] = args;
        return Array(stop).fill(0).reduce((_, __, i, a) => ((a[i] = i), a), []);
    } else {
        const [start, stop, step = 1] = args;
        if (step === 0) {
            throw new Exception(`range(${args})`);
        }
        return (Array(Math.ceil((stop - start) / step)).fill(0)
            .reduce((_, __, i, a) => ((a[i] = start + (i * step)), a), []));
    }
}
```

`start` とか `step` がいらない版：

```typescript
export const range = (stop: number) => Array(stop).fill(0).reduce((_, __, i, a) => ((a[i] = i), a), []);
```

# 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from

↑下の方に連番生成のサンプルコードがあります。

https://docs.python.org/ja/3/library/stdtypes.html#typesseq-range

↑Python3の `range()` のマニュアル。ちゃんと見るといろいろと違いますね。上記 TypeScript 版では `start` が省略できないとか。

https://qiita.com/suin/items/2653fea448fd6246437a

↑関数のオーバーロードの書き方を参考にしました。
【基礎学習/dbt】dbtコマンドのチートシート

# 今回の課題
dbtにコマンドがたくさん存在していて、
理解したかったためメモ。
※参考
* [dbt cheat sheet:17 dbt Commands You Should Start Using Today](https://medium.com/indiciumtech/17-dbt-commands-you-should-start-using-today-581998dbf8f0)
* [PDF版のチートシート](https://github.com/bruno-szdl/cheatsheets/blob/main/dbt_cheat_sheet.pdf)


## コマンド一覧
* `dbt init`: 新しいdbtプロジェクトを生成する。
* `dbt run`: プロジェクト内のすべてのモデルの処理を走らせる。
* `dbt test`: プロジェクト内のすべてのテストコードをテストする。
* `dbt snapshot`: **dbt_project.yml**ファイルで定義された**snapshots-paths**にあるスナップショットを実行する。
* `dbt seed`: **dbt_project.yml**ファイルで定義された**seed-paths**で見つかったCSVファイルをロードする。
* `dbt build`: dbt run + dbt test + dbt snapshot + dbt seedをDAG順に実行する。
* `dbt deps`: **packages.yml**ファイルに記述されている依存関係をダウンロードする。
* `dbt celan`: 同じフォルダを頻繁に削除しなければならない時に役立つ。**dbt_project.yml**ファイル内の**clean-targets**リストにリストアップして、`dbt clean`を実行することで一括で削除できる。
* `dbt compile`: `dbt run`の前に一括でコンパイルできる。`dbt run`するよりもエラーを見つける時間を節約できる。
* `dbt debug`: pythonやdbtのバージョン、python path、OS info、profiles_ymlやdbt_project.ymlなどの情報を見ることができる。
profiles.ymlやdbt_project.ymlが見つかったか、それらは利用可能かどうか分かる。
また、接続に関する情報を与え、それをテストし、必要な依存関係が見つかったかを通知する。
* `dbt list`: projectの全てのリソースをリスト化する。非常に大きいprojectかグラフィックインターフェースにアクセスできない場合に非常に役に立つ。
ノード選択と併用することで、よりきれいな結果が得られる。
* `dbt perse`: projectを解析する。projectが正しく生成されているか確認するコマンド。また、処理時間の情報も得られるので、大規模なprojectの構築時間を最適化するために利用できる。
* `dbt source`: このコマンドには、`dbt source snapshot-freshness`（旧バージョン）および `dbt source freshness`（新バージョン）の2つの利用可能なサブコマンドがある。sourceが最後に更新されたのはいつなのか、という情報を得られる。
* `dbt run-operation`: マクロのテストに最適なコマンド。マクロを呼び出すために使用する。
* `dbt docs`: ドキュメントを生成する。
`dbt docs generate`と`dbt docs serve`の2つの形式で実行することができる。
└`dbt docs generate`はプロジェクトのドキュメントサイトを生成し、-no-compileフラグと一緒に使うことで再コンパイルをスキップすることができる。
└`dbt docs serve`は、ローカルにドキュメントを生成する。
システムを考慮したテーブル設計について

# 挨拶
初めましての方は初めまして！お久しぶりの方はお久しぶりです！
最近は、ダイエットに勤しんでいるミツクマです🐻
今日は業務でテーブル設計を行ったので
その中での気づきや頂いたアドバイスを自分なりに昇華して
記事にしていきたいと思います。

# テーブル設計において必要だと思うこと
私が業務の中で気づいたり教えてもらったりした中で
大事と思ったのは以下の～点です。
- 中間テーブルの存在
- データ型の考慮
- ORマッパを考慮したテーブル定義

命名規則や第一、二、三正規など基本を抑えた上で大事だと思いました。

## 中間テーブルのが存在
初めて、テーブル設計を行いとにかく第三正規化しなきゃ！！と思っていた私にはとても
大事な箇所だと思いました。
特に何も考えていなかった私はLeft outer joinで良いんじゃね？と軽く見積もっていました。
実際は、何かしらの履歴を参照する際にはテーブルとして情報を保持しておきたいと要望を頂き
どうするべきか頭を悩ませていました。
そこで上長から、中間テーブルを教えてもらいました。
これにより、複合ユニーク制約やインデックスなども覚える事ができました。

## データ型の考慮
これについては、仕様や拡張性を考慮すると一言で片づけれるのですが
一例として、残します。

- 例1:
有効・無効などはステータスとしてintと最初設定したのですが、
"オン・オフや有効・無効など確実に２つしか状態がないのであればbooleanを設定するべき"と教えて頂きました。
そりゃ確かに…( ﾉД`)

- 例2:
複数ステータスがあるものに対して、Stringを設定したのですが
"バックエンド側でenumを作って処理することができるのでintで大丈夫ですよ"と教えて頂きました。
これについてはケースバイケースなのかな？と思っていますが
有識者の方に詳しく聞きたいところではあります。

僕の低能さを露呈しただけの例かもしれませんが、ただテーブルを作るのではなく連動するバックエンドやインフラ周りも
視野に入れてデータ型は決めるべきと思いました。

## 人工キーの重要性
"高度なORマッパー（SQLを書かないもの）などには、シーケンスなPKを設定する必要がある"と教えて頂きました。
これも先ほどの話と被る部分ではあるのですが、学生の頃では知る機会がなかったので抜き出しました。
それからは登録する際にAUTO_INCREMENTで連番を振り、それを主キーにするようにしました。
確かに、主キーが一つで済むし、繰り返し処理を行う際も簡易的にコードを組むことができるようになりました。

いかがでしたでしょうか。
私なりのテーブル設計時に必要なことをまとめてみました。
私より更なる高学者の方々が、深いところを解説してくれる記事はあるので
私は私なりに浅瀬を掘り下げてみました。
初学者の方や僕と同じような新米エンジニアの方の役に立てればと思います。
それでは、ミツクマでした！🐻
ぼくがかんがえた最強の牌操作の否定アルゴリズム


## 前提

* 山を生成するプログラムが公開されていること（再現性があればこの限りでない）
* 各プレイヤーが山を混ぜるためのシード値を事前に持っていること（これは局開始時に決定される。ただし、プレイヤーが任意に指定することもできる）

## アルゴリズム

1. 局開始する前に山を生成するシード値Aを公開する
1. 局開始でシード値Aで山を生成、その後各プレイヤー4人のシード値Bで山を混ぜる（※）
1. 局終了後、各プレイヤーのシード値Bが公開される

※ 要するに山が生成された後、各プレイヤーによって計4回シャッフルが行われる

## 牌操作が否定される理由

ツモ牌が操作されている！
↓
山生成プログラムで山が局開始と同時に固定されるのでツモ牌をイカサマすることができない
固定されていることの証明は公開されている山生成プログラムと各シード値で再現することで可能

配牌が仕組まれている！
↓
自分を含む各プレイヤーが設定したシード値Bによって山がシャッフルされているので特定のプレイヤーを優遇・不遇にする配牌にすることができない
事前にシード値Aが公開されているためシード値Bから逆算してイカサマな山を生成することも不可能

## 懸念点

各プレイヤーのシード値Bが正しく公開されていることの証明が難しいかもしれない

何故ならプレイヤーHOGEのシード値Bが使われずに（運営により）シード値Cが使われた後
シード値Cをシード値Bとして偽って公開された場合、HOGEが指摘しない限りこの不正に他3人は気づけないため

## 追記

プレイヤー4人が手を組めば任意の山を生成できなくもないが、不特定多数との対戦を目的としたゲームなら問題ではないと考える
Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「ストレージへのアクセス」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「ストレージへのアクセス」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure でのストレージの実装と管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-storage/)
◇対応するモジュール
[ストレージ アカウントの種類を確認する](https://learn.microsoft.com/ja-jp/training/modules/configure-storage-accounts/4-determine-storage-account-kinds)
[レプリケーション戦略を確認する](https://learn.microsoft.com/ja-jp/training/modules/configure-storage-accounts/5-determine-replication-strategies)
[ストレージへのアクセス](https://learn.microsoft.com/ja-jp/training/modules/configure-storage-accounts/6-access-storage)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「Azure Storageの各サービス」](https://qiita.com/fsd-jume/items/14d57b24da9b11fc2a16)

## ストレージ アカウントの種類
AZ-900の学習まとめにて扱っておりますので、復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure ストレージアカウント」](https://qiita.com/fsd-jume/items/8d46b21dec8700e149e8)

## レプリケーション戦略
AZ-900の学習まとめにて扱っておりますので、復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure ストレージの冗長性」](https://qiita.com/fsd-jume/items/9fe212829d6378d79955)

## ストレージへのアクセス
### Azure Storageサービスの標準エンドポイント
・Storageに格納するすべてのオブジェクトに一意のURLが設定
⇒ストレージアカウント名をサブドメインとして使用
・Blob Storage：`https://<storage-account>.blob.core.windows.net`
・静的なWebサイト：`https://<storage-account>.web.core.windows.net`
・Table Storage：`https://<storage-account>.table.core.windows.net`
・Queue Storage：`https://<storage-account>.queue.core.windows.net`
・Azure Files：`https://<storage-account>.file.core.windows.net`

### カスタムドメインの構成
・Blob Storage/静的なWebサイトのエンドポイントにカスタムドメインを構成可能
・HTTPSでのアクセスを有効にする場合はAzure CDNを使用
※CDN(Content Delivery Network)：コンテンツ配信ネットワーク

**◆直接マッピング(ダウンタイムあり)**
・サブドメインを含むカスタムドメインを使用
・カスタムドメインをCNAMEレコードでストレージアカウントにマップする
※CNAMEレコード：ソースドメイン名を宛先ドメイン名にマップするDNSレコード

**◆中間ドメインマッピング(ダウンタイムなし)**
・中間ドメイン`asverify`をサブドメインの前に使用
・ドメインのDNSレコードを変更しなくてもカスタムドメインをAzureが認識
⇒DNSレコード変更後にダウンタイムなしでドメインがBlobエンドポイントにマッピング

**◆例(サブドメイン：`blob.contoso.com`/ストレージアカウント：`mystorageaccount`)**
・直接CNAMEレコード：`mystorageaccount.blob.core.windows.net`
⇒`blob.contoso.com`
・中間CNAMEレコード：`asverify.mystorageaccount.blob.core.windows.net`
⇒`asverify.blob.contoso.com`

## 次の学習内容
**◆ストレージエンドポイントのセキュリティ保護**

https://qiita.com/fsd-jume/items/61fd26e2e0115c712f76

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
レビューで良く指摘されやすいコードの書き方

# はじめに
綺麗なコードの書き方はいくらでもあると思いますが、
最近、プルリクエストのコードレビューで指摘された部分をまとめました。
例文のコードは下記の形で記載させていただきます。
```diff_php
- 変更前
+ 変更後 
```

### 省略できる部分
```diff_php
- return $a > $b ? true : false;
+ return $a > b;
```
三項演算子を使う必要がない

```diff_php
- $a ? $a : $b;
+ $a ?: $b;
```
演算子にはいろんな種類があることが認識できてない

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AB%E3%83%93%E3%82%B9%E6%BC%94%E7%AE%97%E5%AD%90

### 必要ない部分
```diff_php
use Illuminate\Foundation\Http\FormRequest;
// 残したままになっている
use Illuminate\Validation\Rule;

class SearchRequest extends FormRequest
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        'keyword' => [
            'nullable',
            # 仕様変更により、条件で必須にする必要がなくなった
-           Rule::requiredIf($request->flg),
+           
    -       'max:50',
        ],
    }
```
使用していた部分を削除後に上のuseの消し忘れ

### 推奨されている書き方ではない
```diff_vue
<MyComponent

- ></MyComponent>
+ />
```

> 中身を持たないコンポーネントは、 単一ファイルコンポーネント 、文字列テンプレート、および JSX の中では自己終了形式で書くべき


https://ja.vuejs.org/guide/essentials/component-basics.html#using-a-component

Vueの書き方の理解が足りない

### インデントのずれ
PHP 4つのスペース
> インデントには４つのスペースを使用し、タブは使用してはいけません。

https://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.php

Vue 2つのスペース

https://eslint.vuejs.org/rules/script-indent.html

エディタの設定や、自動整形ツールなどの拡張機能を使う場合が多く基本的には問題ないと思いますが、筆者はSQLのEloquentで<strike>良く</strike>ズレがありました。
```diff_php
$user = User::where('email', $email)
-  ->where('first_name', $first_name)
-  ->first();
+    ->where('first_name', $first_name)
+    ->first();
```

### シングルクォーテーションとダブルクォーテーション

#### シングルクォーテーション

> 書いたままの形式で出力

https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.single

#### ダブルクォーテーション

> 変数名が展開される

https://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.double

```diff_php
- #ダブルクォーテーション
- $a = "ダブルクォーテーション";
+ #シングルクォーテーション
+ $a = 'シングルクォーテーション';
```

PHPで、クォーテーションの使い分けが理解できてない

### 1行の文字数
#### PSR-2
> 行の長さに対してハードリミットがあってはいけません。ソフトリミットは１２０文字を上限とし、実際は８０文字以内に抑えるべきです。

https://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.php


VSCodeの場合、下記を追加
```settings.json
"editor.rulers": [120]
```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961058/77901d6d-f591-4f83-e24c-022647889ebb.png)


### わかりにくい命名規則
<strike>これに関しては複合的な問題があるため、別でまとめたいと思います。</strike>

# さいごに
人が見てもわかりやすいコードが書けるようになりたい。
<strike>まずは、同じことを繰り返さないようにしないと</strike>
Windows のライセンス認証をせずにデスクトップの背景画像を変える方法。

Hyper-V で動かしている仮想環境の Windows のデスクトップ背景が変更できず、画面キャプチャの画像編集に手間がかかったため、今回は、ライセンス認証を通さずに背景画像を変える方法を紹介します。

なお、参考までに Hyper-V のホストOSとゲストOSは、共に Windows 11 Pro Insider Preview になります。


# デフォルトの背景画像
デフォルトの背景はこうなっています。
![WindowsNoLicenceChangeDesktop_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/61fe26a5-b7e2-3899-101d-baa222049234.png)

これを `設定` から変更しようとすると、このように表示されて変更することができません。
![WindowsNoLicenceChangeDesktop_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/1390109f-9a33-a2fa-258e-bf1999b11f21.png)


# 背景画像の変更手順
まず、ホストマシンから `変更したい背景画像` を `コピー＆ペースト` します。

次に `変更したい背景画像` を右クリックし、 `デスクトップの背景として設定` をクリックします。
![WindowsNoLicenceChangeDesktop_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/83fe0548-d44c-f82c-5cbe-4aa51a130647.png)

これで変更できます。
ちなみに変更後の背景はこうなっています。
![WindowsNoLicenceChangeDesktop_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/a77486c4-71c1-4fb1-e4fa-871713582d64.png)




# （追記）ウィンドウの影の非表示
トリミングの際に邪魔になるウィンドウの影も一緒に非表示にしておきます。

スタートメニューから `設定` を開き、 `システム` → `バージョン情報` を開きます。
`システムの詳細設定` をクリックします。
![WindowsNoLicenceChangeDesktop_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/a267d82b-a117-c078-6925-e2011cd05eb7.png)

パフォーマンスの `設定(S)...` をクリックします。
![WindowsNoLicenceChangeDesktop_20230221164919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/aa8c66a6-e1b6-0e8c-c989-ddd8a6b692e5.png)

`ウィンドウの下に影を表示する` のチェックを外し、 `OK` をクリックします。
![WindowsNoLicenceChangeDesktop_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212972/082ccc2d-2ef5-632f-f6a8-4998500b7a81.png)


# 備考（ライセンスについて）
Windows11 は、 `Windows Insider Preview 版` であれば、ライセンス認証をせずに利用しても問題ありません。
`Windows Insider Preview 版` は下記からダウンロードできます。

https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewiso

<!-- EOF -->
【JS】オブジェクトをforEachでループさせたい

## オブジェクトをforEachでループさせたい

配列をループさせるとき、forEachを使って以下のようにしますよね、

```js
let array = ['a', 'b', 'c','d']

array.forEach((item) => {  
          console.log(item)
        })
```


オブジェクトも同じようにforEachでループさせたい...！


```js
let obj = {name: 'Tanaka',age: '20',from: 'Tokyo',}

//しかしこれはエラーになります
obj.forEach(function (v,i) {
  // 処理...
})
```



__オブジェクトに、forEachは使えない...__

オブジェクトは、forEach()メソッドを持っていないので実行できません。

forEachを使いたいときは配列と違い一手間加える必要があります。


## ではどうするか

１度オブジェクトを配列にしてからループさせます。


Object.keys()メソッドを利用して、オブジェクトのキーだけを取り出した配列を作成し、それをループさせる。

```js
let obj = {name: 'Tanaka',age: '20',from: 'Tokyo',}

Object.keys(obj).forEach(function (key) {       
                console.log(key + "は" + obj[key])
        })

```



ぜひ参考にしてみてください。
グローバーのアルゴリズムの紹介（さわり）

最近の略歴

令和３年　３月：国立電気通信大学、博士後期課程４年退学
令和３年　５月：高知県高知市の中小企業に入社
令和４年　５月：同退社
令和４年　６月：個人事業主になった
令和４年１０月：dohouseでSES開始

---

電気通信大学ではレーザー冷却（量子力学の一分野）の実験系の研究室に所属し
シミュレーションを利用して冷却メカニズムの研究をしていました。

今回の発表は、論文紹介の予備知識的に話したパワポの抜粋です。
みにくい、わかりずらい、いろいろ至らない点があるとおもいますがよろしくお願いします。


---

![p1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192781/ee750da5-9823-463f-4eec-a5996dacc73f.png)

---

![p2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192781/ff9dd5bb-3893-0f4a-abe6-0329fd403941.png)

---

![p3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192781/3d510e0c-6ee1-ac0a-63b8-e399930ea0c4.png)

---

![p4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192781/e53c14d7-4829-fe05-09e6-9afbc1fb1e5a.png)

---

![p5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192781/9e354e46-b725-7dc5-3813-c81b960444fe.png)

---
[メモ]C# イベントの理解

C# イベントの内容を理解するためいろいろ調べました。

イベントハンドラとは、特定のイベントが発生した際に行う"処理"のことです。
イベントハンドラは”デリゲート”なんです。
イベントが発生したときに、デリゲートで渡した処理が勝手に走ってくれます。

デリゲートは、「同じ戻り値の型で同じ引数の型を持つメソッドを代入できる」
なので、イベントハンドラと同じ型の関数を作って、それを代入すればイベント発生時にその処理を実行してくれるというわけなんです。

Visual Studio を使うなら、イベントを設定したいコントロールのプロパティの「イベント」ボタン(雷状)を押して、設定したいイベント項目を探して、項目の右の欄にダブルクリックすると、イベント関数が自動的に追加される。

参考サイト：
https://itthestudy.com/c-sharp-event-handler/
🐣【Ruby入門】色んな演算子を整理してみた

時々忘れてしまうので、アウトプットとして記載する:writing_hand:

- 代入演算子の一覧表

| 演算子 | 説明 | 備考 |
|:-:|:-:|:-:|
| x = y | x に y を代入 |   |
| x += y | x = x + y | x に y を加算 |
| x -= y | x = x - y | x に y を減算 |
| x *= y | x = x * y | x に y を乗算 |
| x /= y | x = x / y | x に y を徐算 |
| x %= y | x = x % y | x に y を徐算（余り） |
| x **= y | x = x ** y | x * x * y  |
| x &= y | x = x & y |  |
| x ｜= y | x = x ｜ y |  ※「｜」は本来では半角 |
| x ^= y | x = x ^ y |   |
| x <<= y | x = x << y |   |
| x >>= y | x = x >> y |   |
| x &&= y | x && (x = y) |   |
| x ｜｜= y | x ｜｜ (x = y) | ※「｜」は本来では半角  |

- 論理演算子の応用
  - `hoge = var || "Ruby"`
    - var が nil または false でなければ var 代入。そうでなければ、 Ruby 代入
- 範囲演算子
  - `..`と`...`の違い
    - `..`は、範囲の開始から終了まで（`puts (1..3).to_a # => 1 2 3`）
    - `...`は、範囲の開始から終了の１つ手前まで（`puts (1...3).to_a # => 1 2`）
３月開催のカンファレンス５選

# DeNA TechCon 2023
開催日時：2023/03/02(木) 12:00～19:00
開催場所：オンライン

DeNAはこれまで一人ひとりに想像を超えるDelightを届けるためさまざまな事業拡大を行ってきました。

その事業はゲーム、スポーツ、ライブストリーミング、まちづくり、ヘルスケアまで多岐に渡ると共にメディカルへの新しいチャレンジも始まりました。

今回のDeNA TechConでは領域に捉われずにインターネットやAIを駆使しながらさらなる挑戦を行う私たちの取り組みをお伝えします。

それぞれの事業がアクセルを踏み込みより進化を遂げる姿を、ぜひ見に来てください！

https://dena.connpass.com/event/270750/

---

# 2023 エンジニア文化際
開催日時：2023/03/03(金) 11:00～19:30
開催場所：オンライン・オフライン([浅草橋ヒューリックカンファレンス](https://hulic-hall.com/access/))

エンジニアが学ぶ・働く・成長する文化を共に創ろう
日々の限られた時間の中でも知識や情報をアップデートしてワクワクしたい。
自分らしくいられる組織の中で、自由にイキイキと楽しく働きたい。
そして、自分の成長が世の中の豊かさにつながっていく。
そんなエンジニア文化を推進したいForkwellによる年に1度の文化祭です。

https://scout.forkwell.com/event/engineer-festival-2023/

---

# DevRel/Japan CONFERENCE 2023
開催日時
* 2023/03/10(金) 11:00～19:30
* 2023/03/11(土) 11:00～19:30
開催場所：オフライン([ビジョンセンター横浜](https://www.google.com/maps/place/%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC%E6%A8%AA%E6%B5%9C/@35.467236,139.617333,17z/data=!4m6!3m5!1s0x60185c0e577cc24d:0x15fcc93bb7b78c32!8m2!3d35.4672359!4d139.6173325!16s%2Fg%2F11c311yn5z?hl=ja))

DevRel/Japan CONFERENCE 2023は日本唯一、日本語による開発者向けマーケティングのカンファレンスです
DevRelは自社や自社サービスと、外部の開発者との良好な関係性を築くためのマーケティング手法になります

https://devrel.tokyo/japan-2023/

2023年はDevRelCon Yokohama 2023と同日日程で開催します！

https://yokohama-2023.devrelcon.dev/

---

# Security Days Spring 2023

開催日時
* 東京：2023/03/07(火)～2023/03/10(金)
    * セッション：09:00～18:00
    * 展示：10:30-17:20
* 大阪：2023/03/16(木)
    * セッション：10:00～18:00
    * 展示：10:40-17:20

開催場所
* 東京：[JPタワーホール＆カンファレンス（KITTE 4F）](https://marunouchi.jp-kitte.jp/guide/access.jsp)
* 大阪：[ナレッジキャピタル カンファレンスルーム（グランフロント大阪 北館 タワーC 8F）](https://www.kc-space.jp/accessmap/conference/#towerc-map02)

開催するのは、日々巧妙・悪質化するサイバー攻撃の動向や対策、そして変化する環境に対応したセキュリティの考え方についての情報を共有するイベント。3月7日〜10日に東京、16日に大阪にてそれぞれ実施する。
東京では、JPタワー ホール&カンファレンス(KITTE 4F)を会場に、80以上の講演と25ブースによる展示を行う。
大阪では、ナレッジキャピタル カンファレンスルーム(グランフロント大阪 北館 タワーC 8F)にて、13以上の講演と5ブースの展示を予定している。

https://f2ff.jp/secd/2023-spring

---

# Spring Fest 2023

開催日時：2023/03/17(金) 10:00～19:50
開催場所：オンライン

Spring Framework は Javaの代表的なアプリケーションフレームワークであり、登場した2002年より現在に至るまで世界中の多くのJavaアプリケーションで利用されています。 国内でも広く利用されておりますが、ユーザ間での情報交換・交流の場を提供し、さらなるSpringFrameworkの認知度の向上、普及促進を図るため、本カンファレンスを開催いたします。
申し込みは[doorkeeper](https://jsug.doorkeeper.jp/events/151363)へ

https://springfest2023.springframework.jp/