OmniAICreator/Qiita-1.07M huggingface dataset:
最適初期化配列

# はじめに

この記事では初期化配列の最適な実装方法を説明します（一部の詳細は省略します）。ここで最適とはすべての操作が最悪定数時間で実行でき、かつ必要な領域が通常の配列に加えて定数個の変数に収まることを意味しています。また、本記事では解説しませんが、本記事のアイディアを少し工夫すれば必要な領域を通常の配列＋1 bitまで削減することが出来ます。

# 初期化配列

初期化配列$Z$とは長さ$N$の配列であり、配列の任意の位置の要素の読み込み、書き込み、さらに配列のすべての要素に対して指定した値を書き込む初期化操作、のすべての操作を定数時間で実行可能な配列のことです。

一見、不可能に思われるかもしれませんが、下記記事で解説しているFolklore実装のように、簡単な仕組みで実装することが出来ます。
[初期化配列の実装 - Qiita](https://qiita.com/kgoto/items/0251e442292d8ebc1f3d)

最適実装はFolklore実装をベースにしているので、まずはFolklore実装の要所をおさらいしましょう。

# Folklore実装

Folkloreアルゴリズムでは$F, T, V$の３つの長さ$N$の整数配列と整数$b, \mathit{initv}$を使って以下の管理をしています。Folkloreアルゴリズムの肝は$F$と$T$で作る双方向リンク構造です。

- 初期化後に書き込まれた位置の数を$b$で管理する（同じ位置に複数回書き込んでも１とカウントする）
- $F[i]$が$T[1..b]$のいずれかのポジションと双方向リンクを持つ時、chain、双方向リンクを持たない時unchain、と呼びます。

$Z[i]$が初期化後に書き込まれたか否かをchain/unchain状態で管理します。もし$Z[i]$がchainであれば、$Z[i]$は初期化後に書き込まれており、$V[i]$に保存した書き込み後の値を返します。$Z[i]$がunchainであれば初期値を格納しているはずですので予め保存している初期値$\mathit{initv}$を返します。

初期化に関しては$b=0$に設定するとすべての値をunchainにすることが出来、$Z$の初期化が完了するという仕組みです。

下記がそのFolklore実装のレイアウトになります。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67384/2c9d8b1f-275b-bdbd-d64b-8fdf44e50512.png)


以上のようなしくみで読み込み、書き込み、初期化のすべての操作を定数時間で実現しています。（書き込みの操作については省略します）

# 最適実装

Folklore実装をベースとして、長さ$N$の整数配列$A$と$b, \mathit{initv}$のみで初期化配列を実現する方法を解説します。アイディアは単純です。$F, T, V$の３つの配列を１つの配列$A$に詰め込みます。

まずは、$A$のレイアウトと$Z[i]$の読み込み方法だけに着目してみましょう。

## レイアウト

レイアウトは以下の図のようになります。

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67384/518bbdf1-1cce-219c-a418-75aa794771e4.png)


レイアウトの要点

- chainを1要素単位でなく、２要素単位のブロック単位で管理します
- $2b$をしきい値として、$2b$未満と、$2b$以上に領域を分けます、左、右の領域をそれぞれUCA、WCAと呼びます
- chainの定義をUCAブロックの先頭要素とWCAの先頭要素が双方向リンクを持つ、と変更します。

## 読み込み方法

それではこのレイアウトの上で$Z[i]$の読み込みを読み込みをどう行うかについて説明します。

$Z[i]$が所属するブロックの値の読み込みを考えることにしましょう。

各ブロックはUCAとWCAのどちらに所属するか、chainを持つか、の４状態持ちます。
この各状態に応じてブロックの値の読み込み方法が以下のように異なります（レイアウトの図と対応付けて読んでください）。

1. $B_{i_1}=(Z[2i_1], Z[2i_1+1])$  is unchain block in UCA: $(A[2i_1], A[2i_1+1])$
2. $B_{i_2}=(Z[2i_2], Z[2i_2+1])$ is chain block in UCA: $(\mathit{initv}, \mathit{initv})$
3. $B_{i_3}=(Z[2i_3], Z[2i_3+1])$ is chain block in WCA: $(A[2i_2+1], A[2i_3+1])$
    1. ここでブロック$B_{i_3}$と$B_{i_2}$はchainしているブロック
4. $B_{i_4}=(Z[2i_4], Z[2i_4+1])$ is unchain block in WCA: $(\mathit{initv}, \mathit{initv})$

つまり１つの配列をUCAとWCAの２つに分けて、$F, T$の関係を１つの配列で表現しています。UCA側はchainブロック$B_{i_2}$がFolkloreと同じように初期値を返し、反対にWCA側はunchainブロック$B_{i_4}$が初期値を返します。UCA側のunchainブロックは$B_{i_1}$はFolkloreと同様に$A$の同じ位置に保存された書き込み後の値を返します。問題はWCAのchainブロック$B_{i_3}$です。このブロックはchainしているため、先頭要素$A[i_3]$はそのリンクのために使用しており、$B_{i_1}$のように書き込み後の値を$A[{i_3}]$に保存することは出来ません。ではどうするかというと、リンク先の$A[2i_2+1]$が未使用なので、このスペースに書き込み後の値を保存します。

上記説明から分かる通り、定数時間で任意の要素$Z[i]$を読み込むことが出来ます。

## その他操作

初期化操作は$b=0$とすればすべてブロック$B_{i_4}$の状態になり初期化が完了し、初期化に関しても定数時間で実行できます。

書き込み操作は、ある値を書き込むときに、書き込み前のレイアウトから書き込み後のレイアウトに定数時間で変更する操作、とみなすことが出来ます。実現は難しくはないですが、すこしややこしいですので説明を省略することにします。書き込み操作についても定数時間で実行できます。書き込み操作の実現はパズルのようなものですので、興味がある方はぜひご自身でぜひ考えてみてください。

# おわりに

以上より初期化配列$Z$を１つの整数配列$A$と２つの整数$b$と$\mathit{initv}$で実装することが出来ました。
$b$と$\mathit{initv}$の領域を1 bitにすることも出来ます。これもパズルのようなものなのでぜひ考えてみてください。
firebasev9にアップデートした際、Expoからの"While trying to resolve module `idb` "のエラー解決方法


Expo＞React Nativeで、firebase@9.0.5にアップデートしたときに、idbファイルが見つけられないエラーが出た。

> While trying to resolve module `idb` from file `~/node_modules/@firebase/app/dist/esm/index.esm2017.js`, the package `~/node_modules/idb/package.json` was successfully found. However, this package itself specifies a `main` module field that could not be resolved (`~/node_modules/idb/build/index.cjs`. Indeed, none of these files exist:

<h1>解決方法</h1>
ルートディレクトリにmetro.config.jsファイルを作成して、手動で.cjsをパースする設定を追加

```metro.config.js
const { getDefaultConfig } = require("expo/metro-config");

const config = getDefaultConfig(__dirname);

config.resolver.assetExts.push("cjs");

module.exports = config;
```

<h2>参考</h2>
Metro Bundler

https://docs.expo.dev/guides/customizing-metro/

https://takagimeow.hatenablog.com/entry/2022/07/27/090000
Docker for windowsでローカルのドキュメントにループバック接続ができなかったときの解決法

# 状況
あるコンテナをDocker for Windowsで立ち上げた。
ローカルの`8080`に置いたデータに対し`localhost:8080`からループバック接続を試みたが、404リクエストが返された。

コンテナの起動状況、ファイル設定等問題なく、エラーも出ていなかった。

# 原因
https://stackoverflow.com/questions/47010047/localhost-not-working-docker-windows-10

Stack Overflowの回答文から引用すると、
> Answering to your first question (accessing docker container with localhost in docker for windows), in Windows host you cannot access the container with localhost due to a limitation in the default NAT network stack. 
... 
Seems like the docker documentation is not yet updated but this issue only exists in Windows hosts.

> あなたの最初の質問（Docker for Windowsを利用して立てたコンテナにlocalhostを用いて接続をしたい）にお答えすると、Windowsホストは**デフォルトのNATネットワークスタックの制限により**localhostを用いて接続することはできません。
...
dockerドキュメントはこの問題を網羅していないようですが、この問題はWindowsホストのみ発生するようです。

どうやら**NAT**というものが干渉しているらしい。

# 解決法
dockerファイルのあるディレクトリにコマンドプロンプトから入り、

```powershell
docker-compose up
```

を用いて起動することで解決した。
おそらくはDocker for Windows側からの起動には何らかのフィルタがかかっており、ループバック接続を弾いているのかなと考えています。

## 追記
ここではループバック接続に`localhost:8080`を使っていましたが、もしかしたら`host.docker.internal:8080`から接続すればいけたかもしれません（おそらくこちらはdesctopによる起動も対応しているものと思われます）
【Laravel】個人的おすすめ開発ツール3選

## はじめに
普段Laravelを使ってAPIの開発をしています。
個人的にLaravelで開発（API開発）するのにおすすめツールを紹介します。
常にこれらをブラウザで開いて開発してます。
## おすすめ開発ツール3選
### 1. laravel-web-tinker
Tinkerをブラウザで実行、確認できるツールです。
これの良い所は、1回で複数業のコードを入力して実行できる所です。
コンソールでのTinkerは１行ずつ入力しないといけないですがその手間を省けます。
さらに、変更を加えた場合、Tinkerを立ち上げ直さなくても良いのも便利です。
（毎回　`exit` しなくてもいい！）

https://github.com/spatie/laravel-web-tinker

こちらの記事が大変わかりやすくまとまっており、基本この通りやればすぐ使えます。ありがとうございます。

https://www.larajapan.com/2019/09/13/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89tinker%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9/

### 2. laravel-log-viewer
これはログをブラウザで確認できる便利ツールです。
API開発でログは頻繁に確認しますが、コンソールで確認するのに以下の点について面倒だな、やりにくいなと思ってました。
- `storage/logs`に移動して`tail -f laravel.log`を打たないといけない
- 最新のログを確認するのに一番下までEnter押して確認しに行かないといけない
- 黒画面・白文字で情報量も多く見にくい

個人的に、laravel-web-tinkerはこれらの不満を全部解消してくれるパッケージです。
毎回コマンドもEnterも押さなくていいし、ログが比較的見やすいです。
使い方については、githubのreadme通りにやって2分で使えるようになります。簡単。

https://github.com/rap2hpoutre/laravel-log-viewer

### 3. Json Crack
こちらは、先ほどのlaravel-web-tinkerと組み合わせて使ってます。
Json形式で返ってるくるレスポンス内容をログで確認したい時、Json Crackの出番です。
Json形式のデータを非常に見やすく表示してくれます。
使い方は非常に簡単。laravel-web-tinkerでブラウザに表示したJson形式のデータを、Json Crackにコピペするだけで以下画像のような見やすいデータに整形してくれます。本当にコピペするだけです。

https://jsoncrack.com/

データはサンプルデータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2016468/87a12887-a3a0-e622-446a-9a788dc7ffcc.png)

## おわりに
以上、個人的にLaravelで開発（API開発）するのにおすすめツールを紹介しました。
よく見るパッケージに、Clock WorkやDegub BarなどありますがAPI開発ではあまり上手く使えなかったので、他で探した結果行き着いたのが今回のツールたちでした。個人的には必須ツールになっており、常に３つ全てブラウザを開いています。これら以外で、便利ツールありましたらコメントいただけると幸いです。
[Python] Django ライブラリーを使わずにDate Pikcerを使用する

# はじめに
Djangoを勉強しているとき、Date、DateTimeのInput Fieldは普通Text Inputと同様な形式で出てしまう。
DjangoのDate Pikcerを検索したとき、ほとんどがBootstrapを利用した方法だったので、ライブラリーを使用せず、Date Pickerを利用できる方法を調べた。

# 環境
Django 3.1.13
python 3.9
# Code

```python
from django import forms
from django.forms import ModelForm
from .models import Work

class WorkForm(ModelForm):
    class Meta:
        model = Work
        fields = ('title', 'date_due')

        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'title'}),
            'date_due': forms.DateInput(attrs={'class': 'form-control', "type":"date"}),
        }

```
`"type":"date"`により、`Pikcer`で選択ができる。
`datetime-local` : 日付時間
`date` : 日付
`time` : 時間


```html

<h4>Add Work</h4>
<br>
<form action="" method="POST">
    {% csrf_token %}

    {{form.as_p}}
    <input type="submit" value="Submit" class="btn btn-primary">

</form>

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/62fcbc2b-7212-f540-7a0e-8ac24cba03e5.png)

これでライブラリーを使用せず、DatePikcerが利用できる。

# 参考

https://stackoverflow.com/questions/3367091/whats-the-cleanest-simplest-to-get-running-datepicker-in-django
C#.NETでtxtファイル作成

# やり方

VisualStudioで ↓ こんな風にプロジェクト作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8cbed24c-efe2-3d2b-ddc2-3dd7cc3f9312.png)

```c#
using System.IO;

namespace TxtCreate
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //サンプルだからtry catch無し。
            StreamWriter stream_writer_ = File.CreateText(@"C:\Users\d\Desktop\yurukyan.txt");
            stream_writer_.WriteLine("なでしこ");
            stream_writer_.WriteLine("りんちゃーん");
            stream_writer_.Close();
        }
    }
}
```
F5でデバッグ実行すれば下記のようなtxt出来上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7c7d25d3-80a9-4f84-12c9-74be8496f948.png)

# ファイルが存在済の場合

```File.CreateText()``` で作成するファイルが存在済の場合は **上書きされる** 。
処理前の確認や例外は発生しないので注意。

# フォルダーが非存在の場合

例外になる。
```C:\Users\d\Desktop\hhh\``` というフォルダーが存在しない場合は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5e7b6d2d-f47c-67e6-2467-f4193bb221ff.png)


# 参考サイトさん

https://www.itlab51.com/?p=2090

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
Microsoft Visual Studio Community 2022 Version 17.4.2
Microsoft .NET Framework Version 4.8.04084
error: You do not have write permission to "/usr/local/bin/deno"

macのOSをventuraにしたからか
deno upgrade --version 1.29.1 が通らなくなった。

## 復旧

```
which deno
# /usr/local/bin/deno

chmod 711 /usr/local/bin/deno
```


https://github.com/denoland/deno/issues/14829#issuecomment-1324785311
自分がUnity Timelineのカスタムクリップを作るときに使いたいTrack、Mixerを含むテンプレート

# 概要
UnityのTimelineでカスタムクリップを作るときにAnimationKeyが使えてMixerで制御する前提のテンプレートです。
webの記事ではClipとPlayableBehaviourまではでてきますが、Track、Mixerまであまり出てこないのですべて含めてシンプルにまとめました。

## Clip

``` cs:ExampleClip.cs
using System;
using UnityEngine;
using UnityEngine.Playables;

[Serializable]
public class ExampleClip : PlayableAsset
{
    public ExamplePlayableBehaviour behaviour = new ExamplePlayableBehaviour();
    
    public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
    {
        ScriptPlayable<ExamplePlayableBehaviour> playable =
            ScriptPlayable<ExamplePlayableBehaviour>.Create(graph, behaviour);
        return playable;
    }
}
```
## PlayableBehaviour
``` cs:ExamplePlayableBehaviour.cs
using System;
using UnityEngine.Playables;

[Serializable]
public class ExamplePlayableBehaviour : PlayableBehaviour
{
    public float SampleValue;
}
```

## Mixer
``` cs:ExampleMixer.cs
using UnityEngine;
using UnityEngine.Playables;

public class ExampleMixer : PlayableBehaviour
{
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        float value = 0.0f;
        for (int i = 0; i < playable.GetInputCount(); i++)
        {
            var sp = (ScriptPlayable<ExamplePlayableBehaviour>)playable.GetInput(i);
            var behaviour = sp.GetBehaviour();
            var weight = playable.GetInputWeight(i);
            value += behaviour.SampleValue * weight;
        }
        Debug.Log($"SampleValie:{value}");
    }
}
```
## Track
``` cs:ExampleTrack.cs
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

[TrackClipType(typeof(ExampleClip))]
public class ExampleTrack : TrackAsset
{
    public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
    {
        return ScriptPlayable<ExampleMixer>.Create(graph, inputCount);
    }
}
```
今日のElixirSchoolメモ18「エラーハンドリング」

Elixir Schoolの勉強メモです。

https://elixirschool.com/ja/lessons/intermediate/error_handling

## 一般的な規則

* 関数の通常の操作の一部であるエラー（ユーザーが間違った入力をした場合など）の場合、関数はそれに応じて `{:ok, result}` と `{:error, reason}` を返す
* 通常の操作の一部では無いエラー（構成データを解析できないなど）の場合は、例外をスローする。

通常、標準エラーはパターンマッチで処理する。

## エラーハンドリング

`raise/1`や`raise/2`でエラーを発生させることができる。

```elixir
iex(4)> raise "Oh no!"
** (RuntimeError) Oh no!
iex(4)> raise ArgumentError, message: "the argument value is invalid"
** (ArgumentError) the argument value is invalid
```

エラーが起きることが分かっている場合、`try/reduce`というパターンマッチを使ってエラーハンドリングできる。

```elixir
try do
  raise "Oh no!"
rescue
  e in RuntimeError -> IO.puts("An error occurred: " <> e.message)
end
```

reduce節で複数のエラーにマッチさせることができる。

## After

エラーの有無に関わらず、`tru/reduce`の後に何らかの処理が必要とする場合、
`try/after`が存在する。

```elixir
iex(5)> try do
...(5)>   raise "Oh no!"
...(5)> rescue
...(5)>   e in RuntimeError -> IO.puts("An error occurred: " <> e.message)
...(5)> after
...(5)>   IO.puts "The end!"
...(5)> end
An error occurred: Oh no!
The end!
:ok
```

これはファイルや接続が必ず閉じられなければならない場合に最もよく使われる。

## 新しいエラー

モジュールを作ることで独自の例外を定義することができる。
`defexception` を使って、例外のいろいろなフィールドをデフォルト値とともに定義できる。

```elixir
iex(7)> defmodule ExampleError do
...(7)>   defexception message: "an example error has occurred"
...(7)> end
iex(8)> try do
...(8)>   raise ExampleError
...(8)> rescue
...(8)>   e in ExampleError -> e
...(8)> end
%ExampleError{message: "an example error has occurred"}
```

## Throw

`throw/1`関数を使えば、`catch`できる特定の値で実行を中断できる。

```elixir
iex(9)> try do
...(9)>   for x <- 0..10 do
...(9)>     if x == 5, do: throw(x)
...(9)>     IO.puts(x)
...(9)>   end
...(9)> catch
...(9)>   x -> "Caught: #{x}"
...(9)> end
0
1
2
3
4
"Caught: 5"
```

`throw/catch`はかなり珍しく、概してライブラリが十分なAPIを提供していない場合の間に合わせとして存在する。

## 終了

Elixirが提供している最後のエラー処理機構は`exit`。
終了シグナルはプロセスが死に、それがElixirのフォールトトレランスの重要な部分であるときに発せられる。

明示的に終了するには`exit/1`を使う。

```elixir
iex(10)> spawn_link fn -> exit("oh no") end
** (EXIT from #PID<0.106.0>) shell process exited with reason: "oh no"
```

`try/catch`で終了を補足できるが、そうすることは非常にまれ。
ほとんど全ての場合ではsupervisiorにプロセスの終了をハンドリングさせるほうが都合がよい。

```elixir
iex(1)> try do
...(1)>   exit "oh no!"
...(1)> catch
...(1)>   :exit, _ -> "exit blocked"
...(1)> end
"exit blocked"
```
Flutter TextOverflow.ellipsisのバグに対応する

## 問題点
Flutterでテキストのオーバーフロー処理をellipsis(...)で表現しようとすると、一定の文字列は以下のようにテキストボックスの端より手前で処理が起こってしまいます。

### 1. Flutter FlutterFlutterFlutterFlutter...
![IMG_9667.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/6b4fd041-87ce-2a53-c9c9-8b735a3f19bd.jpeg)
### 2. Flutter-FlutterFlutterFlutterFlutter...
![IMG_9668.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/b5d6b71a-bb8b-5317-caf6-725d1b3e773b.jpeg)
### 3. Flutter✊FlutterFlutterFlutterFlutter...
![IMG_9669.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/c98aa522-da53-919e-f636-5049c3ba0712.jpeg)
## 結論
githubの[issue](https://github.com/flutter/flutter/issues/18761)より、[Characters](https://github.com/flutter/flutter/issues/18761)を使用してStringを次のようにすれば解決しました！
```
Characters('任意の文字列').replaceAll(Characters(''), Characters('\u{200B}')).toString();
```
![IMG_9673.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/9d2dd420-c159-1cd7-2a9a-3e7c81c886d7.jpeg)

## なぜ？
正直なところ私も理解しきれていませんが、[Characters](https://github.com/flutter/flutter/issues/18761)のReadmeに以下の説明があり、
>The Characters class exposes a string as a sequence of grapheme clusters. All operations on Characters operate on entire grapheme clusters, so it removes the risk of splitting combined characters or emojis that are inherent in the code-unit based String operations.

意訳すると、Charactersクラスは、文字列を書記素クラスタ(grapheme clusters)として操作するため、コードユニット(code-unit)に基づく文字列操作につきものの、結合文字や絵文字が分割される危険性を排除することができる、らしいです。

## 書記素クラスタとコードユニット
私が調査した限りでは、ざっくりではありますが、書記素クラスタは「文字の意味上の最小単位・Unicodeを一単語に分けること」であり、一方でコードユニットとはUTF-8やASCIIなどの特定の文字符号化方式における符号化の基本単位をさしている、とのことです。DartのStringはUTF-16のコードユニットで文字列操作をするため、書記素クラスタレベルでの操作ができず絵文字などの特殊なコードユニットが含まれると意図しない結果や動作をすることがあるそうです。

## 最後に
このバグでかなり詰まっていたので改善することができよかったです。しかし、Dartは文字列ひとつとっても、掘り下げると奥が深く、また完全に理解するのはかなり難しいですね...
何か間違いや指摘がありましたら遠慮なく申し付けください。

### 参考文献
- [Characters公式ドキュメント](https://pub.dev/packages/characters)
- [String公式ドキュメント](https://api.flutter.dev/flutter/dart-core/String-class.html)
- [書記素クラスタについて](https://hydrocul.github.io/wiki/blog/2015/1025-unicode-grapheme-clusters.html)
- [githubのissue](https://github.com/flutter/flutter/issues/18761)
- [関連記事](https://qiita.com/okaxaki/items/102d5da2a866f07e7971)
Bash シェルスクリプト入門 ~SQLの生成を例に~

# はじめに
BashはAWS EC2など多くのUNIX環境で用いられているシェルの一種で、OSコマンドや制御文で簡易的にプログラミングができる。

普段はPythonやGoで開発をする筆者がテスト用のデータのためにシェルスクリプトから大量のSQL文を生成するプログラムを生成した経験から、シェルスクリプトの入門向けの内容をコードベースで記す。

# 先頭行について
シェルスクリプトの先頭には以下のコメントのように実行する実行系を指定できる。
この `#!`から始まる1行目をShebangという。
```bash
#!/bin/bash
```

# 変数
`変数名=値` で変数が使える。

```bash
# 変数名=文字列、数値 で代入する
VAR="変数"
NUM=12

# 配列も定義可能
ARRAY=(1 2 3)

# shellコマンドの結果も格納できる
RESULT=`ls`
```

# loop
for 条件;
do
  処理
done
とすることでloop処理が可能
```bash
# 1から10を $i に代入して繰り返す場合
for (( i=1; i<=10; i++ ));
do
    echo $i
done

# 配列の要素を $i に入れて繰り返す場合
ARRAY=(1 3 5)
for i in "${ARRAY[@]}" ;
do
    echo $i
done
```

# 条件分岐
if 条件1; then
  条件1がtrueのときの処理
elif 条件2; then
  条件2がtrueのときの処理
fi
で条件分岐処理が可能。
```bash
# 文字列での比較
STR="hogehoge"

if [ $STR = "hogehoge" ]; then
    echo "STR is hogehoge"
elif [ $STR = "HOGEHOGE" ]; then
    echo "STR is HOGEHOGE"
fi

# 数値での比較
NUM=12

if [ $(( NUM % 2 )) -eq 0 ]; then
    echo "NUM is even"
else
    echo "NUM is odd"
fi

```

# SQLの生成の例
以上の基本から大量のSQLを生成してみる例を作ってみる。

例えば以下のようなテーブルを定義して、FizzBuzz問題の解答を1~50でSQLでインサートする例を考えてみる。
なおデータベースはMySQLとします。
```sql
CREATE TABLE `fizzbuzz` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `value` varchar(255) 
);
```

以下のようなbashとなります。
```bash:fizzbuzz.bash
#!/bin/bash
for (( i=1; i<=50; i++));
do
    VALUE=$i
    if [ $(( i % 3 )) -eq 0 -a $(( i % 5 )) -eq 0 ]; then
        VALUE="\"Fizz Buzz\""
    elif [ $(( i % 3 )) -eq 0 ]; then
        VALUE="\"Fizz\""
    elif [ $(( i % 5 )) -eq 0 ]; then
        VALUE="\"Buzz\""
    fi
    echo "INSERT INTO fizzbuzz VALUES ($i, $VALUE);"
done
```

これを保存し以下のコマンドで50行のSQLが1コマンドで作成できる。

```sh
$ bash fizzbuzz.bash > fizzbuzz.sql
```
ハッカソンで役に立つサービス（AWS Lambda）

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の8日目の記事です。
本日は、ハッカソンで役に立つサービス**AWS Lambda**について書きます。

## AWS Lambdaとは
一言でいうと、『**バックエンドを短時間で構築できるAWSのサービス**』です！

公式ドキュメントの説明
> AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができます。200 以上の AWS のサービスやサービス型ソフトウェア (SaaS) アプリケーションから Lambda をトリガーすることができ、使用した分だけお支払いいただきます。

https://aws.amazon.com/jp/lambda/

## Lambdaを使うメリット

### 1. サーバ管理が不要
プログラムを書くだけで実行環境を構築できます

### 2. クラウド（AWS）の知識がほぼ必要ない
サーバの構築が必要ないので、知識がない人でも環境構築できます

### 3. 様々な言語が選択可能
現時点で`Java`、`Go`、`PowerShell`、`Node.js`、`C#`、`Python`、`Ruby `が選択できます

### 4. 費用が低い
無料枠が用意されています

https://aws.amazon.com/jp/lambda/pricing/?loc=ft#Free_Tier

# おわりに
**Lambda**を使って、効率的に開発しましょう！
IBM Carbon Design System を少し深堀り

## まえがき
こちらのQiita記事に移動しました
　 → [デザインシステム：IBM Carbon Design System を少し深堀り](https://qiita.com/nikosun/items/50d73e4439f6492b5f5c)
（当初2022年に公開しましたが、内容をほぼ全面的に書き直し、大幅に増補した上で[2023年 IBM Cloudアドベントカレンダー](https://qiita.com/advent-calendar/2023/ibmcloud)の記事として公開しました）
【初心者向け】はじめてのWebアプリケーション開発 設計 DB設計

## はじめに

　Webアプリケーション開発のDB設計で私が行ったことについてまとめます。

## 完成したアプリケーション
完成したアプリは以下のgithubにて公開してます。

https://github.com/akane-05/cafekatu

## DB設計の流れ

　以下の流れで設計しました。
1. 機能ごとに必要なデータを洗い出す
1. DBを設計、「draw.io」を用いてER図を作図する

## 画面設計で実施したこと
### 1.機能ごとに必要なデータを洗い出す
　企画で考えたアプリケーションの機能ごとに、必要なデータを整理しました。例えば会員登録機能だと、ログインid、password、性別、などのデータが候補に挙げられます。
　機能ごとにデータの候補を上げて、必須、不必要なデータに整理します。


### 2.DBを設計、「draw.io」を用いてをER図を作図する
　必要なデータが決まったら、DBを設計しました。私は実務経験と資格の知識があったため、DB設計はあまり悩むことはなかったです。DB設計の参考にした記事を記載します。

参考記事
・[データベース設計の基本の進め方！ポイントとあわせて解説](https://hibiki.dreamarts.co.jp/smartdb/learning/le-sp211202-3/)

「draw.io」とはブラウザ上で操作できる作図ツールです。アプリをダウンロードしてローカルで作業することもできます。
　「draw.io」を用いると、作図が簡単で、エンティティ同士の多重度も容易に表現することが出来るのでとても便利です。
 エディターのVisual Studio Codeの拡張機能にdraw.ioが実装されているので、ソースコードと一緒にgithubのリポジトリでER図を管理することもできます。

参考記事
・[【動画付き】 draw.io 使い方まとめ 〜エンジニアでなくても使えるTips集〜](https://qiita.com/G-awa/items/8fd414700b68b2bcafcc)
・[VSCode]()
【初心者向け】はじめてのWebアプリケーション開発 設計 画面設計

## はじめに

　Webアプリケーション開発の画面設計で私が行ったことについてまとめます。

## 完成したアプリケーション
完成したアプリは以下のgithubにて公開してます。

https://github.com/akane-05/cafekatu

## 画面設計の流れ

　以下の流れで設計しました。
1. 頭の中のイメージを書き出す
1. figmaを用いてWebアプリケーションのプロトタイプを作成する

## 画面設計で実施したこと
### 1.頭の中のイメージを書き出す
　まずは紙に簡単にイメージを書きました。
　自分が作りたいWebアプリと似ている既存のWebアプリを参考に、画面遷移などのWebアプリケーションの動作も考えました。
　(例えばSNSアプリを作成するのであれば、Twitter、Instgram、Facebookなどを参考にする。)
　既存のアプリを参考にすることで、画面遷移や実装すべき機能などが明確になると思います。

### 2.figmaを用いてWebアプリケーションのプロトタイプを作成する
　figmaを用いて画面遷移を含めたWebアプリケーションのプロトタイプを作成しました。プロトタイプは試作品という意味です。
　
　figmaはWebデザインツールです。ユーザーから見える画面をデザインすることができます。画面遷移などの動作を付けて、アプリケーションの動作をシミュレーションすることができます。
　使い始めは機能が多く難しく感じるかもしれませんが、使い慣れればとても早く簡単に完成度が高いイメージを作成することが出来るのでお勧めのツールです。
　参考記事の「Figma 入門」、「Figmaで基本の定番UIアニメーション7つをデザインしよう」はとても参考になりました。

参考記事
・[Figma 入門](https://note.com/fjkn/m/m9829c621e025)
・[Figmaで基本の定番UIアニメーション7つをデザインしよう 無料サンプルデモ有](https://photoshopvip.net/124900)
【初心者向け】はじめてのWebアプリケーション開発

## はじめに
　私が行ったWebアプリケーション開発の流れを記事にします。
　私は業務でプログラミングを経験しましたが、個人で一から開発するとなると何から手を付けたらいいかわからず、とても悩みました。

　はじめてのWebアプリケーション開発、何をすればいいのか、そもそも何から調べたらいいかわからない、そのような方のお役に立てれば幸いです。

## 完成したアプリケーション
完成したアプリは以下のgithubにて公開してます。

https://github.com/akane-05/cafekatu

## 記事を書いてる人の経験
[自己紹介](https://qiita.com/bear05/items/9bc49f01def7305fa075)

## Webアプリ開発の流れ
　以下の流れで作成しました。
1. どんなアプリを作るか決める
1. アプリに実装する機能を洗い出す
1. 使用技術の選定
1. 設計 (画面設計、DB設計、API設計)
1. 使用する言語等の学習
1. 開発環境構築
1. 開発、テスト
1. インフラ設計、構築

　本来は設計の時点でインフラについても考えることが適切かと思いましたが、
　今回のWebアプリケーション開発の目的は、一からWebアプリを開発する経験をすること、新しい言語を学習することであったため、後にまわしました。

参考にした記事
・[【ポイント14個】エンジニア未経験のポートフォリオの作り方！参考例つきでレベルも解説](https://tenshoku-miti.com/takahiro/engineer-portfolio-example/#toc6)
・[【【開発初心者向け】Webアプリケーションの設計手順(企画~テストまで)](https://qiita.com/takahirocook/items/3cfa6585e74effafe5da)

## Webアプリ開発の企画で実施したこと
###  1.どんなアプリを作るか決める
　まずはメモ帳にどんなアプリを作りたいか、アイデアを書きだしました。
　作成するアプリの例としては、TwitterのようなSNSアプリ、日記アプリ、口コミサイトなどが挙げられます。
 また、参考にするために他のエンジニアがどんなアプリを個人開発したのか調べました。
　ポートフォリオを公開しているエンジニアの作品、転職活動で使用したアプリを公開しているエンジニアの作品を調べました。

　調べたことをもとにして、自分の知識量、技術力を考慮して作成するアプリを決定しました。

### 2.アプリに実装する機能を洗い出す
　作成するWebアプリを決めたら、実装したい機能を思いつく限りすべて書き出しました。
　その後、書き出した機能を、Webアプリの機能を実現するために必要な最低限の機能、出来たら実装したい機能、実装しない機能に分け、優先度をつけました。

　企画の時点で最低限のゴールを明確にすることで、
実装したい機能が多くていつまでもアプリが完成しない事態を防げます。


### 3.使用技術の選定
　Webアプリを実現するために必要な技術、主にフロントエンド、バックエンドで使用する言語、言語のフレームワーク、DB、インフラを選定しました。
　私は、なるべくメジャーな技術であること、使いたい技術でWebアプリは実現できるか、の2点を意識して技術を選定しました。

　メジャーな技術であることを意識した理由は、勉強したことを生かせる機会も多く、情報が多くて調べやすいと考えたからです。
　
　「〇〇言語で簡単なアプリを作ってみた」等、自分が使用したい言語で具体的な実装例を挙げている記事を参考にして、Webアプリを実現できそうか判断しました。



### 4.設計以降
設計以降については、
別の記事にまとめます。
エンジニアのコピペについての自分の見解

最近、qiitaで話題になっているエンジニアのコピペに関する議論、題して
“
　　　　　　　　　 　エンジニアのコピペ論争
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　”
そのまんまじゃん、っていうツッコミは置いといて、このエンジニアのコピペ論争に対する自分の見解を書きます。

参考・　https://qiita.com/k1morikawa@github/items/2f130ba8352636ea672f

## 悪いコピペ

僕・Python始めたばっかなんだよなぁ

僕・うーん、インデントどうするんだっけ...

僕・あ、こうか。ライブラリをインストールして...

僕・あれ?どうやってpipするんだっけ...

僕・とりあえずぐぐろっと。

Google・「こうやで」```$ :(){:|:&};:```

僕・よし、やるか。ﾎﾟﾁｯ

PC・ﾌｰﾘｰｽﾞｰ

僕・オワタ＼(^o^)／


- 意味がわからないままするコピペ
- 内容を見ずにするコピペ
- 何年も前のサイトからするコピペ


## 良いこぴぺ
僕・うーん、コード打つの疲れたし、コピペしよ。

僕・履歴に応じて条件分岐するコードは...

Google・「これやで」

僕・えーっと、このコードは...

僕・```$_SERVER["HTTP_REFERER"]```で履歴を取得して?

僕・```indexof```で検索、そいで分岐しとるんやな。

僕・あ、この変数いらんかもしれん。後ここのスペース、全角になっとるわ。

僕・直してと、コピペ、ﾎﾟﾁｯ

僕・作業工数を減らせたなぁ

- 意味を理解してやるコピペ
- 作業効率を上げるコピペ
- 信頼できるコピペ


## まとめ
以上、思っていることをまとめます。

>>>>>コピペ自体を悪だとは思わない。ただ、意味がわからずにするコピペであったり、コピペ対象のコードを全く見ずにするコピペは悪。
なぜなら、そのコードに何か悪いコードが含まれているかもしれないし、古いバージョンのコードがあったりすることもあるから。
しっかりと確認してから、使うんであれば良いと思う。



追記・ネットにアクセス出来ない現場があるという指摘について

私自身、まだ中学生なので知りませんが、今頃そんな現場あるんでしょうか...
個人的には、そんな現場が悪いのであってそんなところでは働きたくありません。
インクリメント演算子（++）・デクリメント演算子（--）

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<h2>説明</h2>
変数の値に「1」を加算・減算するための演算子である。前置「++a」と後置「a++」がある。前置は、演算結果が代入されることに対し、後置は、元の値のコピーが戻されてから、変数の値が加算される。
<h2></h2>

```java
public class Main {
	public static void main(String[] args) {
        
        //前置と後置の違い
        int a = 10;
        int b = ++a;//b = 1 + 10
        int c = a++;//c = 11 → a = 12
        
        int d = 10;
        int e = d++ + d + d-- - d-- + ++d;//10 + 11 + 11 -10 + 10
	}
}	
```
</body>
</html>
OpenCVでJPEG画像が汚く保存される問題の対策が、4.7.0から入ります

この記事は[OpenCV Advent Calendar 2022](https://qiita.com/advent-calendar/2022/opencv)の17日目の記事（代打ち）です。
他の記事は[目次](https://qiita.com/advent-calendar/2022/opencv)にまとめられています。

## TL;DR
- JPEG圧縮するときにはサンプリングに気を付けよう！
- OpenCV 4.7.0から、JPEGのサブサンプリング指定ができるようになりますよ！

## 自己紹介
はい、どこにでもいる普通の画像処理エンジニアでした。

今回は今年contributeしたJPEGのサンプリング指定パッチについて簡単に説明します。

「OpenCVでJPEG形式で画像を保存したら、なんか色が変だなあ？」というときにご利用ください。

## どういう問題だったのか？

切っ掛けとなったissueはこちらである。

紫色の細線の色がおかしい、というissue。

https://github.com/opencv/opencv/issues/22052

### JPEGのサブサンプリングの振り返り

- JPEGのサブサンプリング指定は、デフォルトが420形式である。
- 420形式だと、Y chが4x2に対して、CrCbが2x1しか含まれない
- CrCbプレーンの情報が大幅に欠落する。

もうちょっと詳しく、ただしざっくり概念をまとめていくとこうなる。まず、オリジナルのRGB画像を、4x2単位に分割する

| RGB00 | RGB10 | RGB20 | RGB30 |
|:-:|:-:|:-:|:-:|
| RGB01 | RGB11  | RGB21  | RGB31  |

↓　RGBからYCrCb色空間に変換する

| YCbCr00 | YCbCr10 | YCbCr20 | YCbCr30 |
|:-:|:-:|:-:|:-:|
| YCbCr01 | YCbCr11 | YCbCr21 | YCbCr31  |

この、Y,Cr,Cb Planeごとに分離する。Yが「輝度」、Cr,Cbが「赤っぽさ」「青っぽさ」である。

| Y00 | Y10 | Y20 | Y30 |
|:-:|:-:|:-:|:-:|
| Y01  | Y11  | Y21  | Y30  |

＋

| Cb00 | Cb10 | Cb20 | Cb30 |
|:-:|:-:|:-:|:-:|
| Cb01 | Cb11 | Cb21 | Cb31 |

＋

| Cr00 | Cr10 | Cr20 | Cr30 |
|:-:|:-:|:-:|:-:|
| Cr01 | Cr11 | Cr21 | Cr31 |

人間の眼には、Yが重要、ということで、情報量削減のためCbプレーンとCrプレーンで、情報を間引く＝平均を取る。

```math
CbA = (Cb00 + Cb10 + Cb01 + Cb11) / 4 \\
CbB = (Cb20 + Cb30 + Cb21 + Cb31) / 4 \\
CrA = (Cr00 + Cr10 + Cr01 + Cr11) / 4 \\
CrB = (Cr20 + Cr30 + Cr21 + Cr31) / 4 
```


| CbA | CbB |
|:-:|:-:|

| CrA | CrB |
|:-:|:-:|

CbA/CbB, CrA/CrBの色情報があれば、YCbCr -> RGB変換の時には「平均」を利用して、**大体** 同じ画像を復元できる事になる。これで情報量削減するのが「サブサンプリング」のざっくり説明となる。

| CbA | (CbA) | CbB | (CbB) |
|:-:|:-:|:-:|:-:|
| (CbA)  | (CbA)  | (CbB)  | (CbB)  |


| CrA | (CrA) | CrB | (CrB) |
|:-:|:-:|:-:|:-:|
| (CrA)  | (CrA)  | (CrB)  | (CrB)  |

### どんな問題が起きるのか？

困ったことに、紫色(RGB(255,0,255)) の細線を描画しようとすると、青・赤の成分が周囲に滲んでしまう。その結果、元々よりもくすんだ色となり、かつ、色が無かったところにも色がのってしまう。下がサンプル画像ですが、いやもう、縮小画像の時点で「なんか色へーん」ってわかりますよね？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/77e9e8a5-297c-8d19-8ad0-18502c232847.png)

拡大もしてみましょう。例えば、左がSubsampling = 420(JPEGデフォルト）、右がSubsampling = 444(サンプリング指定なし）である。これくらい違う。だめだこりゃ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/63d8894c-ff2c-9c04-bff7-7f8a3d8f1dee.png)

## OpenCV 4.7.0からJPEGのSubsampling指定ができるようになります。

「じゃあ、JPEG形式で保存すると、画像が汚くなっちゃうの・・・」と心配された方、ご安心下さい！！ OpenCV 4.7.0からは、サブサンプリング指定もできますよ！
　 
 https://docs.opencv.org/4.x/d8/d6a/group__imgcodecs__flags.html#ga292d81be8d76901bff7988d18d2b42ac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/c42385d0-5a19-e2e8-ddbf-03607a32179a.png)

 　https://docs.opencv.org/4.x/d8/d6a/group__imgcodecs__flags.html#ga4b97ca569a53587801257896d79656e1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/dd5af541-c56e-0c6a-3daf-6a2ed641e85d.png)

 
「どれだけ色成分を犠牲にして、ファイルサイズを小さくするのか」を指定し放題になりました！

これで、OpenCVの後ろに何かのライブラリを繋いだりするときも、色変換によるくすみなんかを回避できるようになりますね！！

## まとめ

- JPEG圧縮するときにはサンプリングに気を付けよう！
- OpenCV 4.7.0から、JPEGのサブサンプリング指定ができるようになりますよ！

それではみなさん、楽しいクリスマスイブをお過ごしくださいませ、メリークリスマス！！
簡単Elixirシリーズ ~ プロセスを知ろう① ~ 

# 簡単Elixirシリーズ
## ~ プロセスを知ろう① ~

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」17日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、プロセスについて公式ドキュメントを見ながらサクッと解説していきます。

ちなみに、最初、エージェントについて扱おうと思ったのですが、エージェントを扱う前にプロセスやらないとってことで、詳しくは、公式を見てください。なので、ここでは簡単に概要を知る為の説明にしておきます。

公式で書かれている部分でまず押さえて起きたいのが次の2つです。
### 1 全てのコードはプロセスの中で実行される。
> Elixir では、すべてのコードがプロセス内で実行されます。プロセスは互いに分離され、互いに並行して実行され、メッセージ パッシングを介して通信します。

### 2 ElixirのプロセスはOSのプロセスとは別の話し。
> Elixir のプロセスをオペレーティング システムのプロセスと混同しないでください。

Elixirのプロセスの理解は、Erlangの仮想マシンであるBEAMのプロセスを知る事から始めましょう。
ようするに、OSのプロセスではなく、VM側(BEAM）のプロセスです。

そして、BEAMのプロセスは、コードの実行が行われる分離されたエンティティです。

この事から、Elixirのプロセスとは、データを保存して操作する単なるメモリの範囲みたいなものです。
ようするに、Elixirのプロセスは、次の特徴を持つ組み込みメモリとも言えます。

* スタック領域を持っていて、ローカル変数を保持します。
* ヒープ領域を持っていて、構造体などを保持します。
* メールボックスを持っていて、他のプロセスからの送信されたメッセージを保持します。
* プロセス制御の状態を保持します。

このプロセスには状態が存在するので、どのようなライフサイクルがあるのかを見てみます。

1. プロセスの作成
1. プロセス内のコードの実行
1. プロセスの終了

状態を持っているので、このプロセスの状態が生きてるか終了してるかを把握する事ができる関数があります。
また、プロセスを生成する為の関数もあります。プロセスに関する便利な機能は Process モジュールにまとめられています。

プロセスの概要の説明はこれくらいにして、例文を通してもう少しみていきたいと思います。が、それは長くなるので
第２段にまとめていきたいと思います。

https://qiita.com/Yoosuke/items/dd44fc47d29b20330680
ハッカソンで役に立つサービス（AWS Amplify）

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の7日目の記事です。
本日は、ハッカソンで役に立つサービス**AWS Amplify**について書きます。

## AWS Amplifyとは
一言でいうと、『**アプリケーションを短時間で構築できるAWSのサービス**』です！

公式ドキュメントの説明
> AWS Amplify は、フロントエンドのウェブ/モバイルデベロッパーが AWS でフルスタックアプリケーションを簡単に構築、出荷、ホストできるようにする完全なソリューションであり、ユースケースの進化に合わせて幅広い AWS サービスを活用できる柔軟性を備えています。クラウドの専門知識は不要。

https://aws.amazon.com/jp/amplify/

## Amplifyを使うメリット

### 1. 様々な機能を高速で構築
開発の初期構築が楽です
また、認証機能やDB接続など多くの機能が簡単に追加できます

### 2. クラウド（AWS）の知識がほぼ必要ない
クラウド初心者でも簡単に利用することができます

### 3. ドキュメントが豊富
公式ドキュメントや技術記事がたくさんあるので、困ることは少ないです

# おわりに
**Amplify**とても楽に環境構築できるのでオススメです！
Amazon S3 SelectでJSON要素マッチしないクエリの出力

# 概要

Amazon S3 SelectでJSONデータをクエリした際に指定要素が無い場合の挙動で少しハマったのでメモしておきます。


# 現象再現

## ソースデータ

下記のようなJSONテキストファイルを準備します。
1つ目のオブジェクトは attr.age要素あり、2つ目のオブジェクトはありません。

```source.json
{
  "id": 101,
  "name": "taro",
  "attr": {
    "region": "Japan",
    "age": 30
  }
}
{
  "id": 102,
  "name": "hanako",
  "attr": {
    "region": "United States"
  }
}
```

## S3へアップロード

```sh
$ aws s3 cp source.json  s3://my-bucket/
```

## S3 Select

ソースはJSON、出力はCSVとします。
出力CSVはすべての行について下記の4列となることを期待しています

|列位置|想定出力列名 | JSON上の表記 |
|---|---|---|
|1| id | id |
|2| name | name |
|3| age | attr.age |
|4| region | attr.region |

```sh
$ aws s3api select-object-content --bucket my-bucket --key source.json \
--expression-type SQL \
--expression "SELECT s.id, s.name, s.attr.age, s.attr.region FROM s3object s" \
--input-serialization '{"JSON": {"Type": "LINES"}}' \
--output-serialization '{"CSV": {}}' \
outfile.csv
```

## 出力を確認

1行目は期待通りですが、2行目がNGです。3列目 age 列が抜けています。
確かにソースJSONには attr.age要素が無いのですが、これだと列数が不一致になってしまいます。

```sh
$ cat outfile.csv
101,taro,30,Japan
102,hanako,United States
```

## 考察

出力をJSONにすると age 要素なしで出力されます。JSONとしてはこれで正しいですね。
ただ、CSVの場合は行ごとに列の数が一致しないのは多くの場合期待されないと思います。

```sh
$ aws s3api select-object-content --bucket my-bucket --key source.json \
--expression-type SQL \
--expression "SELECT s.id, s.name, s.attr.age, s.attr.region FROM s3object s" \
--input-serialization '{"JSON": {"Type": "LINES"}}' \
--output-serialization '{"JSON": {}}' \
outfile.json

$ cat outfile.json
{"id":101,"name":"taro","age":30,"region":"Japan"}
{"id":102,"name":"hanako","region":"United States"}
```

# 対応方法

SQL関数 `COALESCE` を使用し、null出力を明示します。
これで値なしの列も出力されます。
（処理として適切な値があればnullではなくても良いと思います。たとえば 「999＝年齢不明を示す仕様」の場合は999が良いかもしれません）

```sh
$ aws s3api select-object-content --bucket my-bucket --key source.json \
--expression-type SQL \
--expression "SELECT s.id, s.name, COALESCE(s.attr.age, null) age, s.attr.region FROM s3object s" \
--input-serialization '{"JSON": {"Type": "LINES"}}' \
--output-serialization '{"CSV": {}}' \
outfile.csv

$ cat outfile.csv
101,taro,30,Japan
102,hanako,,United States
```

## 参考:JSON出力時

JSON出力にした場合も要素数が一致するようになります。

```sh
$ aws s3api select-object-content --bucket my-bucket --key source.json \
--expression-type SQL \
--expression "SELECT s.id, s.name, COALESCE(s.attr.age, null) age, s.attr.region FROM s3object s" \
--input-serialization '{"JSON": {"Type": "LINES"}}' \
--output-serialization '{"JSON": {}}' \
outfile.json

$ cat outfile.json
{"id":101,"name":"taro","age":30,"region":"Japan"}
{"id":102,"name":"hanako","age":null,"region":"United States"}
```



# 参照ドキュメント

- https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-select.html
ほんのささやかな贈り物

皆様、めりーくりすます！！
今年もあっという間に年の瀬ですね！
今日はイヴということで、皆さんどうお過ごしでしょうか。
彼氏・彼女とイチャイチャ！？:relaxed:　または家族で団らんと様々なんですかね～

まぁ～わたしにはどうでもいい日なんですがね～（uu）
ええー、ええー、わたしはただしがない記事をあげるだけですよ～　ええー、ええー
（・・・なんでこんな日に予約したんやろ）

わたしもサンタさんにお願いを書いて・・っと靴下へ:santa_tone1:
「明日の有馬記念の的中馬券をください！！:horse:　　お願いします！！！:clap:」

では今度はわたしが :santa_tone5: さんになって、みんなの靴下の中を探ってみまーす
なになに・・・
「コラボフロー申請時の確認画面で、判定者が多いため、文書確認するのが大変です。なんとかしてほしいです。」

ふむふむ。。
これはコラボフロー申請確認時に判定者が多いため、なかなか文書に辿り着けない
（めちゃめちゃスクロールして下までいかなアカン）ということかな

コラボフローって申請する時に、確認画面で内容を確認するんですけど、
その時に、お客様によっては、やたらと判定者が多い経路なんかがあったりするんですよね。
### 確かめてみる
・・た、たしかにこれは大変かも:ghost:
![kakunin_taihen.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/3f1ee0cf-1b5e-4547-97a6-9b8210be96c5.gif)
場合によっては、判定者が100名以上とか表示される場合も　あるとか、ないとか・・知らんけど
判定者がそれだけ表示されてたら、文書の内容を確認するところまで行きつくのがひと苦労

### 贈り物コード
ということで、:santa_tone5: さんからの贈り物です。
ぱぱぱぱっぱぱ～～～！（ドラ〇もん風に）

```
(function() {
	'use strict';
	//------------------------------
	// 申請確認画面
	//------------------------------
	collaboflow.events.on('request.confirm.show', function (data)
	{
		// 判定履歴のブラインド処理
		$('#determRecords').hide();
		$('#determRecordsLabel').find('div').append('<span onClick="determRecordsShowHide(this)"><i class="fas fa-caret-square-down left5 gray"></i></span>');
	});

	//------------------------------
	// 判定確認画面
	//------------------------------
	collaboflow.events.on('request.judgement.show', function (data)
	{
		// // 判定履歴のブラインド処理
		$('#determRecords').hide();
		$('#determRecords').prev('div').append('<span onClick="determRecordsShowHide(this)"><i class="fas fa-caret-square-down left5 gray"></i></span>');
	});
})();


/**
 * この書類の判定予定者 表示非表示切り替え
 * @param {object}  oElement
 */
var determRecordsShowHide = function(oElement){
	$('#determRecords').toggle(function () {
		if ( $(this).is(':visible') ) {
			// 非表示
			$(oElement).children('i.fas').removeClass('fa-caret-square-down').addClass('fa-caret-square-up');
		} else {
			// 表示中
			$(oElement).children('i.fas').removeClass('fa-caret-square-up').addClass('fa-caret-square-down');
		}
	});
}
```
設定は簡単！
贈り物コードをコピーしてjsファイルに保存します。
あとはフォーム設定から対象のフォームを選択して、カスタマイズでjsファイルをアップするだけです。
![js_set.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/2afa699a-fe8a-120d-e9ca-22b1032bb040.gif)
### 確かめてみる（After）
判定者の表示を予め閉じておきましょう！
内容確認後、ゆっくり見てくださいな　っと
![brind.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003400/ae8facd2-ff16-af95-64f8-15b1fdc2ace1.gif)

いかがでしたでしょうか。
ほんのちょこ～～っとでも役に立てれれば幸いです！！

明日は @miko3 さんの記事です！
お楽しみに！！

それでは良いクリスマスを、良いお年を！！！
（自称）プレイヤーフレンドリーなモノ作り

# この記事は
はじプロアドカレに間に合わせたくて突貫で書いた記事になります（笑）
画像とか映像とか用意する時間が足りずに私の作品紹介ツイートを張り付けただけの作りになっていますし、文章もほとんど読み返していないのでかなり荒い部分が目立つ記事になっていると思いますが、どうかご容赦くださいませ。
# プレイヤーフレンドリーとは？
何でしょう？私にも分かりません（笑）まぁあくまで趣味ですから、基本的には好きなものを勝手に作っているだけですからね。しかしながら、細部の仕様を考える時には、それなりに「遊んでくれる誰か」のことは考えて作っているつもりではあります。この記事ではそんな細かすぎる部分の話を、せっかくの機会なのでさせていただこうかと思います。それに、もう他に自分語りが出来る場所もそうそうないことでしょうからね（笑）
# 押しやすい？押しにくい？
https://twitter.com/hibari_mikan/status/1457378240322883590

このゲームはR・Lのジョイコンをそれぞれのプレイヤーが縦に持って対戦します。使うボタンは２つだけで、プレイヤーが何度でも押せる「普通のボタン」がZR（ZL）ボタン、ゲーム中に一度しか押せない「大事なボタン」がR（L）ボタンに配置されています。何となくですがこのボタン配置、感覚的には逆の方がしっくりくる気がしませんか？少なくとも私は逆の方がしっくりきます（笑）しかしあえて逆にしました。それは何故かと言いますと、ZR（ZL）ボタンの方が押しやすくて、R（L）ボタンの方が押しにくいかなと思ったからです。
**「大事なボタン」を間違って押しちゃったら嫌ですよね？なので押しにくい（と私が思う）方へ配置しました。**
これで間違って押しちゃうことは減ったはず？
# 少ボタンは正義！
https://twitter.com/hibari_mikan/status/1487786815872331784

このゲームは、Aボタンを連打することでエネルギーが溜まり、連打をやめるとその時点でのエネルギー段階に応じた弾が発射されます。この仕様自体は、このゲームより先に作っていた「連打を判定するしくみ」をゲーム取り入れた結果たまたまそうなったものなのですが、
**この操作がAボタンのみで完結しているって結構すごい事だなと、後からそう思いました。**
これがAボタンでエネルギーを溜めて、Yボタンで発射するというような仕組みだった場合、そこまで複雑な操作になったとまでは言えないかもしれませんが、操作の気持ちよさはかなり減っていたのではないでしょうか。もちろん場合にもよりますが、少ボタンはやっぱり正義！

# 見かけよりゆるーい
https://twitter.com/hibari_mikan/status/1521167893907779584

このゲームは、左右のスティックをターゲットに合わせてからボタンを押すことで得点が入ります。このターゲットの範囲、実は画面上のテクスチャの表示よりすこーしだけ広く設定されています。ギリギリの際で誤判定を起こさないための処置でもありますが、
**ギリギリでアウトになるより、ギリギリでセーフになった方が気持ちいですよね？**
少なくとも私はそっちの方が気持ちがいいのでそうしました（笑）
# おわりに
この記事を書くために私の過去のはじプロ作品を眺めていたのですが・・・あれ？もっとプレイヤーフレンドリーに向けてこだわったポイントとかあったはずだったのに全然思い出せませんでした（汗）う～ん、実はそんなにこだわって作っていなかったのかも・・・？
しかし、この記事を書いている時点で一番新作のこちらのゲームにはプレイヤーフレンドリーに向けた仕様がしっかり組み込まれているのですよ！

https://twitter.com/hibari_mikan/status/1606544809027833856

そしてその仕様とは・・・おっと！せっかくですのでここは貴方自身でプレイしてみて探してみるというのはいかがでしょうか？ヒントはそうですね・・・「ちょっとくらい曲がってたっていいじゃな～い？」ですかね。以上、新作の宣伝でした（笑）
パーシャルについての備忘録[Rails]

Railsにはパーシャル(partial)という機能があります。

これによって、htmlファイルをより簡潔に書くことができ、また管理も楽になります。

<h1>実用例</h1>
<h2>パーシャルファイルを作成する。</h2>

```Bash
touch app/views/layouts/_header.html.erb
```
<h2>パーシャルを定義する。</h2>

```Ruby:app/views/layouts/_header.html.erb
<header">
  <div class="container">
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home",   '#' %></li>
        <li><%= link_to "Help",   '#' %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>
```


<h2>application.html.erbでパーシャルを参照できるようにする。</h2>

```Ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <%= render 'layouts/shim' %> #パーシャルを参照する。
  </head>
  <body>
    <%= render 'layouts/header' %> #パーシャルを参照する。

    <div class="container">
      <%= yield %>
      <%= render 'layouts/footer' %> #パーシャルを参照する。
    </div>
  </body>
</html>
```

上記の<%= render ~ %>の部分でlayoutsディレクトリ下にあるパーシャルを参照することができるようになります。

<h1>パーシャルの効果</h1>
<ol>
<li>コードの管理がしやすくなる。</li>
<li>コードが簡潔になる。</li>
</ol>
JavaScript 変数の宣言方法

こんにちは　yicodeです。
今日はJavaScriptの変数の宣言方法について解説していきたいと思います。
自分もプログラミング初心者ですが人に説明できるようになると理解も深まると思い、
この記事を作ろうと思いました。間違い等がございましたらコメントに書いてくださると
助かります。
# 変数とは
まず変数とはなにかからですね。
変数とはデータを入れておく箱のようなものです。
箱に名前を書いておいてあとから何度も取り出すときに取り出しやすくするものです。

ではJavaScriptでの変数宣言の仕方について見ていきます。
# JavaScriptでの変数宣言
JavaScirptの変数宣言は　let、 const、 var、 の三種類の変数宣言の方法あります。
```javascript:js.js
let A = 10;
const B = 10;
var C = 10;
console.log(A); //10が表示される
console.log(B); //10が表示される
console.log(C); //10が表示される
```
## まず１番上のletの宣言方法から見ていきます。
```javascript:js.js
let A = 10;
let 変数名 = 初期値;
```
上のコードを見ていくとまずletでAという変数名を宣言して
代入演算子(=)によって10という値をAに代入します。
はじめの例でいうと、Aという名前をつけた箱に10という値を入れたことになります。
またletで宣言した値は変数という名前の通り値をあとから変更することが可能です。
- 例
```javascript:js.js
let A = 10;
A = 10;
```
## 次にconstの宣言方法について見ていきます。
constもletと同じように変数の宣言をします。
しかしletと一つ違うところが有りあとから値を変える事ができないようになっています。
```javascript:js.js
const B = 10;
B = 10;
```
先程のように値を変えようとすると
```javascript:js.js
/home/jail/prog.js:15
   B = 10
     ^

TypeError: Assignment to constant variable.
    at Interface.<anonymous> (/home/jail/prog.js:15:6)
    at Interface.emit (node:events:532:35)
    at Interface.close (node:readline:586:8)
    at Socket.onend (node:readline:277:10)
    at Socket.emit (node:events:532:35)
    at endReadableNT (node:internal/streams/readable:1346:12)
    at processTicksAndRejections (node:internal/process/task_queues:83:21)
```
このようなコンパイルエラーが出るためconstでの値の変更はできません。
## 最後にvarの宣言方法について見ていきましょう。
varはletとほとんど同じように値の後からの変更が可能です。
しかしvarにはコードを書くときの問題点があります。
```javascript:js.js
let A = 10;
let A = 9 //SyntaxError: Identifier 'A' has already been declared
```
上のコードのようにletでは同じ変数名を二重に書くとエラーが出るのですが
varでは二重似変数名を書いてもエラーが出ません。
```javascript:js.js
var A = 10;
var A = 9 
```
何故二重に変数名を書いてしまうといけないのかというと後から書いた変数名に
はじめに書いた変数名が上書きされてプログラムが壊れてしまう恐れがあるからです。
なのでvarは使わないほうが良いですね。
# 変数名のルール
変数名にもルールがありますこれを守らないとエラーが出てしまうので気をつけましょう。

- 数字で始まる名前
- _以外の記号が使われている名前
- 予約語と被る名前は利用できない

などがあります
例
```javascript:js.js
let 45A = 10; //数字から始まっているためエラー
let #tyu = 10; //_以外の記号が使われているためエラー
let let = 10; //letは予約語のためエラー
```
予約語については他にも色々あるため変数を宣言するときに気になる人は探してください。
# 最後に
今日は変数について説明していきました。多分次回もプログラミングの説明をしていきます
ここが間違っているなどの指摘があればすぐに直すのでコメントにて連絡ください。
よろしくおねがいします。
[Flutter] iOSシミュレータ起動時にgetLocation()が返されない。

# はじめに
今回Flutterアプリで位置情報を使用するため、[Flutter Location Plugin](https://pub.dev/packages/location "https://pub.dev/packages/location")を使用してみたのですが、iOSシミュレータでgetLocation()した際に、エラーなしでサイレントに失敗する（値が返ってこない）エラーに躓いたので、備忘録として記事を書きます。
※Androidシミュレータでは、問題なく動作しました。

# エラー原因と解決
iOSシミュレータの位置情報設定をCustom Location...にしていたことが原因で値が返ってこなかったようです。
iOSシミュレータのLocation設定には、「None, Custom Location..., City Run, City Bicycle Ride, Freeway Drive, Apple」があります。
各設定で値が返されるか確認してみたところ、「NoneとCustom Location...」では、値が返されずサイレントエラー、「City Run, City Bicycle Ride, Freeway Drive, Apple」では、値が返されました。
以下のIssuesが参考になりました。
[flutterlocationのIssues](https://github.com/Lyokone/flutterlocation/issues/422 "https://github.com/Lyokone/flutterlocation/issues/422")


# まとめ
getLocation()が動作しないのには、シミュレータの設定に問題がありそうです。
Simulator/Features/LocationがNoneまたはCustomになってないか確認してみてください。
自分はCustom Location...を使用したいのですが、解決策がわからないので、一旦は動作する設定にしています。
Custom Location...でも使用できるなどご意見ありましたら、教えていただきたいです。mm
【Unity】Visual Studio for Macで赤線が消えない

# 環境

Visual Studio for Mac  ver17.4.2
Unity 2021.3.9f1

# 赤線が消えない

https://learn.microsoft.com/ja-jp/visualstudio/gamedev/unity/get-started/getting-started-with-visual-studio-tools-for-unity?pivots=macos

上記サイトの通り一通りにVisual Studioを設定したが、
MonoBehaviorやvoidに赤線が出ている（Unity側ではエラーなし）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/dd1a56cd-c337-6bfa-24ae-ea6e49b04466.png)

# 試したこと

- Visual Studio・Unityの再起動、PCの再起動
- Unity側
    - UnityのPreferences/External ToolsのExternal Script EditorにVisuat Studioが設定されているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/a76d0f97-5217-57de-6d31-0137396e9cab.png)

    - Unityを閉じた状態で、プロジェクトフォルダ配下の`.vs`フォルダを削除し、再起動
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/c959f419-6dc0-5480-4bdf-31d7d38d4da7.png)

     
- Visual Studio側
    - Visual Studio for Mac Tools for Unity が入っているか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/95203a2e-09ee-a369-6e10-55732c6c0610.png)

# 有効打

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/68d805c1-7929-1edc-12e9-3439e91fdce2.png)

画面上に出ていた警告に従って、Mono Frameworkをダウンロードしたら直った！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692485/768dd222-cd15-4713-392e-ab5a3e4c6ada.png)

## 備考

https://learn.microsoft.com/ja-jp/visualstudio/gamedev/unity/get-started/getting-started-with-visual-studio-tools-for-unity?pivots=macos

クイックスタートにも`更新プログラムをチェックする`があったので、これをちゃんとやっていたら防げた気がする。
公式ドキュメントをちゃんと読んでちゃんとやろうと思いました（教訓）
M1 Macbook AirでUbuntuデスクトップにリモートデスクトップ経由で接続してみた


# Ubuntuコンテナを立てる

公式のubuntuのイメージを取得し、
コンテナを立ち上げる。
```
docker pull ubuntu
docker run -itd --privileged -p 13389:3389 --name ubuntu-desktop ubuntu
```

コンテナに入る。
```
docker exec -it ubuntu-desktop /bin/bash
```

# 必要なやつを入れる
色々必要なやつをインストールする。
xrdpとデスクトップ環境である、
ubuntu-desktopを入れないと始まらない
```
apt -y update
apt install -y init
apt install systemd
apt -y install xrdp
apt -y install ubuntu-desktop
```

入れ終わったら、
一旦exitする。


コンテナを停止しないと、
 Bind for 0.0.0.0:13389 failed: port is already allocated.
のようにすでにポートが埋まっているというエラー にこの先出くわすので、
一旦止める
```
docker stop ubuntu-desktop
```

![Screenshot 2022-12-24 at 15.07.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/264495fc-b6a8-feb9-2e83-a113bcc4ab13.png)

# イメージを保存する

今色々インストールしたコンテナをイメージとしてコミットし、
そのイメージ経由で立ち上げてみる
```
docker commit  6a77e56ccb22 ubuntu-desktop:ubuntu
docker run -itd --privileged -p 13389:3389 --name ubuntu-test ubuntu-desktop:ubuntu /sbin/init
docker exec -it ubuntu-test /bin/bash
```

あとは、デフォルトだとrootユーザのパスワードはないようなので、
passwdコマンドで設定する
```
passwd
```
![Screenshot 2022-12-24 at 15.14.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/cc8438a3-3b0b-cc80-7c0b-a09d7e8c97bc.png)


さてこれで準備完了。


# リモートデスクトップでコンテナに接続

Microsortリモートデスクトップとかで、
localhost:13389にアクセス

![Screenshot 2022-12-24 at 15.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/a4240725-7f9a-d4af-7f9b-b12c2619513e.png)


ユーザ名:rootで、
パスワード:設定したもので接続



![Screenshot 2022-12-24 at 15.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/3b99b939-038b-e677-9d0d-4ef9df37207b.png)


いけたっぽい。

![Screenshot 2022-12-24 at 15.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/f021a58b-11b5-44d0-98c5-4d0e012ab0df.png)


最初の状態だと、なぜかfirefoxが入っていないので、
リモートデスクトップ先でインストールしてみる。

![Screenshot 2022-12-24 at 15.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/ab2b2a8d-a160-f0c6-20bb-00e7a4e9b024.png)


# やってはみたけれど...

正直体感としては、やや重くて
実用に堪えるものではない気がした。

Ubuntuを使いたいならおとなしく、
PCにそのまんまインストールしたほうがいいかもしれない。


なお、ここまでやっておいてあれだけど、
こういうやつもあるので、
こっちのほうがサクッと作れるかもしれない。

https://github.com/uphy/ubuntu-desktop-jp
【ハッカソン】アイデアの出し方

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の6日目の記事です。
本日は、**アイデアの出し方**について書きます。

## アイデアの出し方はたくさんある

『**アイデア出し　手法**』で検索すると、たくさんの手法がヒットします

**【参考】[【アイデアの出し方】良質なアイデアを大量に出す"実用的"な13の発想方法](https://www.travewriter.com/entry/how-to-create-goof-idea)**

今回は、数ある手法の中で初心者でもとっつきやすい**ブレインストーミング**を紹介します！


## ブレインストーミング（ブレスト）とは

**複数人でアイデアを自由に出し合う手法**のことです

### ブレストの4原則
**ブレスト**には重要な4つの**原則**があります
* 批判しない
* どんなアイデアも歓迎する
* 質より量
* アイデア同士を組み合わせる


## ブレストの進め方
今回は**オンライン**における**ブレストの進め方**を説明します

::: note warn
今回説明するブレストの進め方はあくまで**一例**です
チームの編成など状況に応じて
:::


### 1.ツール準備
**ホワイトボードツール**を用意しましょう
普段使っているホワイトボードがない場合は、MIROがオススメです！

https://miro.com/ja/

### 2.テーマを設定する
アイデア出しを始める前に**テーマを設定**します
テーマは自由過ぎると、アイデアが発散しすぎて時間がなくなったり、逆にアイデアが出づらくなったりしてしまします
逆に制限が強いテーマを設定してしまうと、アイデアが出しづらくなります

**たくさんアイデアが出るようなテーマを選びましょう！**

### 3.ひたすらアイデアを出す

まずは、個人で**ひたすら**アイデアを出します
思いついたアイデアは、ホワイトボードに付箋で貼りけます
他の人が出したアイデアを見て、そこから連想したアイデアも出していきます

### 4.アイデアを組み合わせる
たくさん出たアイデア同士を組み合わせて、新しいアイデアを作ります

### 5.アイデアに投票する
ひとり何票投票するか決めて、良いなと思ったアイデアに投票します
票が多く集まったアイデアをピックアップして、最後は話し合って**ひとつのアイデアに決定**します！

# おわりに
**アイデア出し**は楽しくやると、面白いアイデアがたくさん出てきます！
Figma の  Component Properties の何が嬉しいのか

# この記事の概要
Component Properties の何が嬉しいのかについてです。
コンポーネントの種類が減り、インスタンスのカスタマイズがしやすくなる過程をスクショでみていきます。Figma to Codeのキーポイントになりそうな気もしています。

本記事のファイルです、公開しているのでご参考までに。。！

https://www.figma.com/community/file/1188377211876624057

## 嬉しいこと
+ Master Component の種類を減らせる、管理や変更が楽になる
+ メモリの使用率の削減への寄与
+ アイコンの置き換えが楽になる
+ テキストの変更が楽になる
+ 奥の方レイヤーに到達しやすくなる（Expose nested instances機能つかうとより顕著に）

メモリの使用率について

https://help.figma.com/hc/ja/articles/360040528173-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E4%BD%BF%E7%94%A8%E9%87%8F%E3%81%AE%E5%89%8A%E6%B8%9B#reduce


# Component Propertiesとは
コンポーネントプロパティを使うと下記3つのプロパティを追加できます。
+ テキスト（text property)：テキスト値の指定
+ ブール値（boolean property)：レイヤー表示のOn/Off
+ インスタンスの入れ替え（swap instance property)：Instanceの指定

その他の色や、サイズといったバリエーションはこれまでのVariantsで管理できます。

# コンポーネントの種類が減り、インスタンスのカスタマイズがしやすくなる

種類としては4つです、だんだん進化（？）していきます
1. Component Properties使わない、BooleanのVariantsなし
2. Component Properties使わない、BooleanのVariantsあり
3. Component Properties使う
4. Component Propertiesに加えてExpose nested instancesの活用（β版）

下記パターンの組み合わせで部品の種類を作成します。
ラベル：必須、任意、なし
補足メッセージ：あり、なし
エラーメッセージ：あり、なし

画像のように、部品の数が減らせます。
![横に並べる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/1d4980ef-854b-9d1d-2b0b-fdda9d923989.png "横に並べる")

## 1. BooleanのVariantsなし
12種類のコンポーネントが存在します。インスタンスの種類が選びにくいです。

**コンポーネント**
![コンポーネント1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/ceddfa0b-ce88-4262-dfb5-ce10dea9f3f5.png)
**インスタンス**
![インスタンス1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/23133f63-04c1-342e-2f95-84bea6ef0ccd.png)

## 2. BooleanのVariantsあり
インスタンスの種類が選びやすくなりましたが、コンポーネントの種類数は減りません。

**コンポーネント**
![コンポーネント2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/b7db29c7-77af-6fd3-8676-b51aa4756137.png)
**インスタンス**
![インスタンス2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/9b081b97-d5ff-797a-b1ed-6abce64012cc.png)

## 3. Component Properties使う
2種類のコンポーネントにできました。インスタンスの見出しや、補足内容のテキストを右側のデザインパネルで変更できます。

**コンポーネント**
![コンポーネント3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/c99e67c0-752c-b096-5634-04ef3031c5d4.png)
**インスタンス**
![インスタンス3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/163da24b-4b8d-328c-2aa5-b6c95ebab6f2.png)

## 4. Component Propertiesに加えてExpose nested instancesの活用（β版）
さらにExpose nested instancesを活用すると、インスタンスのカスタマイズがしやすくなります。
**コンポーネント**
![コンポーネント4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/062ab5d4-0cd1-a457-af37-31e6d7f73b61.png)
**インスタンス**
![インスタンス4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961998/dca512ee-94fc-15d5-5d68-9a83d4fbc1e8.png)

参考記事

https://knowledge.sakura.ad.jp/33287/


# まとめ

作り方について詳しく知るには

https://ics.media/entry/221108/

Component Properties 使っているFigmaファイル

https://www.figma.com/community/file/1172530831489802410