OmniAICreator/Qiita-1.07M huggingface dataset:
Jupyter Notebookで作業する際の注意点(備忘録)

#1.この記事の内容

Jupyter Notebookで作業しない期間が空いたりすると忘れることがあるので，本記事に集約していく予定です．

#2. 備忘録
##2-1. 自作モジュール更新の自動反映方法
Jupyter Notebookで自作モジュール使用する際に，下記autoreloadの設定をしておかないとモジュールの更新が自動反映されないので，注意が必要です．

```
%load_ext autoreload
%autoreload 2
```

[2016年の古い記事(stackoverflow)](https://stackoverflow.com/questions/40407090/nameerror-name-pd-is-not-defined)では，メニューバーの[Kernel] → [Restart & Clear Output]を実行する回答がされていますが，[iPython公式](https://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html)にも書かれているautoreloadを使う方が便利だと思います．

#3.関連リンク

* [NameError: name 'pd' is not defined](https://stackoverflow.com/questions/40407090/nameerror-name-pd-is-not-defined)
* [autoreload](https://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html)
会社員のITエンジニアとフリーランスのITエンジニア、どちらが良いか？



「[派遣企業のマージン率を見ると、プログラマやWeb制作者ならフリーランスの方が良いと思う事について](https://qiita.com/matsu_qiita/items/786d42eba01a638f265a)」で、派遣企業のマージン率（ピンハネ）が公開されていて、派遣社員のプログラマやWebデザイナなら、フリーランスの方が全然良さそうという事を書きました。

今度は、会社員（正社員）のITエンジニアの場合はどうなのか？フリーランスのITエンジニアと比較して、どちらの方が良いのかについて、少し書いていこうと思います。

####自社サービスやコンテンツを提供している企業のエンジニアと、フリーランスエンジニア

プログラマ・Webデザイナ・インフラ系エンジニアが勤めるIT企業は、様々なタイプの企業がありますが、例えば、自社サービスやコンテンツを提供している企業に勤める会社員の場合、そっちの方がフリーランスのITエンジニアよりも良いのでは思います。

自社サービスを提供している企業には、自社のSaas系企業やITメディア企業やEC会社やゲーム会社などがあると思います。こういう企業に勤める正社員のITエンジニアで、人間関係や給与面で不満がないのなら、そのままが良いと個人的には思います。

####SI、SES企業のエンジニアと、フリーランスエンジニア

また、IT業界には、SI（SIer、ITベンダー）やSESなどのIT企業があります。

SIは、昔から多重下請け構造（ピラミッド構造）になっている開発プロジェクトも多くあるわけですが、一次請け（元請け）で給料がそれなりに高給なら、やはりフリーランスのITエンジニアよりもメリットが大きいので、そのままが良いと思います。

ただ、SIで二次請け（孫請け）以降で、給料も安くて、客先常駐のSEやプログラマなどのITエンジニアなら、フリーランスのITエンジニアの方が良いと思います。

SESの正社員エンジニアも同じで、客先常駐で条件面が悪いなら、フリーランスの方が良いと思います。

多重構造の下の階層のITエンジニアの場合、ITドカタ（IT土方）とも呼ばれますが、正社員と言っても、マージン（ピンハネ）を相当取られるので、条件面などの待遇は悪くなり、給料はかなり安くなります。手取りで30万前後程度の会社員プログラマも多くいるのはと思います。

恐らくマージンについては、自分が所属している会社のピンハネは、かなりされている場合が多いと思います。

それに、客先常駐で仕事をしているなら、正社員でも自分が所属している企業に勤める意味をほとんど感じる事がない、帰属意識がない状態になってもおかしくないです。

それだったら、フリーランスのエンジニアの方が、全然マシだと思うのです。フリーランスのメリットはまず高収入である事です。あと、プロジェクトをわりと自由に選べる事です。

同じように客先常駐（もしくはリモートワーク）でプログラマとして仕事をするなら、SESの会社員エンジニアよりも、フリーランスの方が良い条件で働けると思うので、全然良いと思うのです。

SESや多重構造の下の階層のSI会社員のエンジニアで、正社員という肩書きにこだわっている人、自分の会社に所属している意義を感じない人、今までフリーランスという選択肢を考えてこなかった人にとって、参考になれば幸いです。

#####参考サイト

・[SESの正社員ITエンジニアとフリーランスのITエンジニア](https://it-jog.com/itfreelance/sesitfreelance)
・[フリーランスのITエンジニアになるためにする事](https://it-jog.com/itfreelance/itfreelancemiscella)
・[客先常駐の派遣社員・会社員から、フリーランスのITエンジニアへの転身](https://it-jog.com/itfreelance/tofreelance)
React, Next.jsにおける無限スクロール

# はじめに
画面に描画するデータ件数が膨大で、読み込みに時間がかかるときには無限スクロールを使用するのがおすすめです。
無限スクロールとは、初回描画時はデータ全体のうちの一部だけ画面に描画しておいて、スクロールされたら描画するデータを少しずつ増やしていくというものです。

# 無限スクロール
- 今回は描画するデータが全部で50万件あることを想定して作ってみました。初回は50万件のうち100件だけ描画し、スクロール位置が8割まで行ったらまた100件追加して描画する。それを繰り返すっていう感じです

```tsx:infinite-scroll.tsx
import { useEffect, useState, useRef } from 'react'
import styles from 'pages/infinite-scroll.module.scss'

interface Item {
  id: number
  content: string
}

export default function InfiniteScroll() {
  const [allItems, setAllItems] = useState<Item[]>([])
  const [items, setItems] = useState<Item[]>([])
  const container = useRef(null)
  const onScroll = () => {
    const el = container.current
    const rate = el.scrollTop / (el.scrollHeight - el.clientHeight)
    // スクロール位置の割合が8割を超えている場合は描画するアイテムを追加
    if (rate > 0.8) {
      setItems((prevItems) => {
        const newItems = [
          ...prevItems,
          ...allItems.slice(prevItems.length, prevItems.length + 100),
        ]
        return newItems
      })
    }
  }

  useEffect(() => {
    const data: Item[] = []
    // 50万件の配列を用意
    for (let i = 0; i < 50000; i++) {
      data.push({ id: i + 1, content: `内容${i + 1}` })
    }
    setAllItems(data)
    setItems(data.slice(0, 100))
  }, [])

  return (
    <div className={styles.container} ref={container} onScroll={onScroll}>
      {/* この部分をitemsからallItemsに変更すると、初回読み込みのスピードの差が歴然です！ */}
      {items.map((item) => (
        <div key={item.id}>{item.content}</div>
      ))}
    </div>
  )
}
```

![無限スクロール.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748651/3b619fd5-8fab-8a30-2c50-47a7dbb40427.gif)
【 MRTK 】 MeshSmoother.cs スクリプトを使用する際の注意点

# はじめに
Mixed Reality Toolkit for Unity (MRTK) の Utilities に含まれている [MeshSmoother.cs](https://docs.microsoft.com/en-us/dotnet/api/microsoft.mixedreality.toolkit.utilities.meshoutline?view=mixed-reality-toolkit-unity-2020-dotnet-2.7.0) スクリプトを手持ちのオブジェクトにアタッチして、Unity Editor で実行したら、以下エラーが出力されたので、解決方法を書いておきます。 

**Console 出力**
<font color="red">**Not allowed to access on mesh 'Plane Instance' (isReadable is false; Read/Write must be enabled in import settings)**</font> UnityEngine.Mesh:get_normals ()

# やりたかったこと
MRTK の Utilities に含まれている [MeshOutline.cs](https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/features/rendering/mrtk-standard-shader?view=mrtkunity-2021-05#mesh-outlines) を GameObject にアタッチすると、以下の画像のように、アウトラインを表示することができます。このスクリプト単体 ( MeshOutline.cs ) でも使用することも可能なのですが、法線が滑らかでないメッシュ場合などでは、角が開き、アウトラインが途中で切れたような見た目になります。そこで登場するのが MeshSmoother.cs です。このスクリプトを対象のオブジェクトにアタッチすれば、自動で滑らかな法線を生成してくれます。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/d61f73eb-c9d2-6f65-86a8-8fda0888daff.png)
> [Mesh Outlines | Microsoft Docs](https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/features/rendering/mrtk-standard-shader?view=mrtkunity-2021-05) より引用

今回、手持ちの 3D モデル (Prefab) に MeshSmoother.cs アタッチしてみたのですが、上の画像の 2. のような現象が発生したため、公式ドキュメントに記載されている MeshSmoother.cs を追加でアタッチして、動作を確認したところ、以下のエラーが発生しました。

# 解決策
このエラーは、Mesh 上の法線 ( = normals ) へのアクセス権限 (Read/Write) がないことで発生しているので、Model を Unity にインポートした後、対象モデルの Inspector 画面に移動し、以下設定内容を確認します。

Model > Meshes > Read/Write Enabled にチェックを入れ、
Apply ボタンを押下することでエラーを解消することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/e07d3654-6f26-6258-97be-3b5a30d4e25a.png)

# 参考文献

- [Mesh Outlines | Microsoft Docs ](https://docs.microsoft.com/en-us/windows/mixed-reality/mrtk-unity/features/rendering/mrtk-standard-shader?view=mrtkunity-2021-05#mesh-outlines)
- [MeshOutline Class | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/microsoft.mixedreality.toolkit.utilities.meshoutline?view=mixed-reality-toolkit-unity-2020-dotnet-2.7.0)
- [Model Tab | Unity 2020.3](https://docs.unity3d.com/Manual/FBXImporter-Model.html)
【WordPress】Localを使ったテーマ作成時の初期設定

Localを利用して、WPテーマを作成する際の初期設定方法についてのメモです

# Localサイトの新規作成
左下の＋ボタン押下で、ローカル環境を新規作成する
![スクリーンショット 2021-09-02 1.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205283/33751424-33ed-b3a0-9da5-ce9130a769cc.png)

Choose your environmentではPreferredを選択
Username・Password・Emailを入力してADD SITEをクリック
でサイト作成が完了

ADMINボタンを押して管理画面にログインする。

次に管理画面の日本語化を行う
・Settings>General>Site Languageを日本語に設定
・TimeZoneをAsia>Tokyoに設定する

# プラグインをインストール
サイトに必要そうなプラグインをインストールする(この内容については要調査)。

Custom Post Type UI:カスタム投稿を簡単に
Advanced Custom Fields:カスタムフィールドの作成を簡単に
Contact Form 7:お問い合わせフォームの作成

# テーマテンプレートの設置
Local Sites＞cafeisland＞app＞public＞wp-content＞themes　の位置にテーマテンプレートフォルダを作成する。

# テーマの変更
管理画面の外観＞テーマで上記に設置したテーマを有効化する。

以後そのフォルダを触りながら、サイトを作成していく。
HTML canvasをCSS Flex, Grid Layoutに組み込む方法

#基本形

```index.html
<div class="wrapper">
    <canvas class="canvas"></canvas>
</div>
```

```style.css
.wrapper {
    position: relative;
    width: 100%;
    height: 100%;
}

.canvas {
    position: absolute;
    width: 100%;
    height: 100%;
}
```

#例） フルスクリーンの場合

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="powyLgV" data-user="hushad903" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hushad903/pen/powyLgV">
  </a> by hu (<a href="https://codepen.io/hushad903">@hushad903</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#例） フレックスレイアウトに組み込む場合

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="bGRpvRa" data-user="hushad903" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hushad903/pen/bGRpvRa">
  canvas-flex</a> by hu (<a href="https://codepen.io/hushad903">@hushad903</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#例） グリッドレイアウトに組み込む場合

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="qBjZoxd" data-user="hushad903" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hushad903/pen/qBjZoxd">
  canvas-grid</a> by hu (<a href="https://codepen.io/hushad903">@hushad903</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#残りの話

canvas本来のサイズとレイアウトされた結果のサイズは当然異なるので、そこのところの処理を`object-fit`で適当に指定する必要がある。

https://developer.mozilla.org/ja/docs/Web/CSS/object-fit

もしくは以下のようにcanvasのサイズを変更してしまう。

```index.js
const canvas = // canvas取得
canvas.width = canvas.clientWidth;
canvas.height = canvas.clientHeight;

window.onresize = () => {
    canvas.width = canvas.clientWidth;
    canvas.height = canvas.clientHeight;
    // canvas再描画
}
```

ちなみに**基本形**のCSSを用いずにcanvasのサイズを変更するのみだとリサイズ後にレイアウトが崩れてうまく行かない（と思う）。
[Rails]フォローしたユーザーの直近１週間の投稿のみ表示させる→[修正]一部追記しました

# はじめに
本日は、過去にフォロー機能を実装していたので、
せっかくなので、アプリケーションっぽくトップページには、
フォローしているユーザーのみの投稿を表示させるようにしました。

# コード
コントローラー

```ruby
  def index
    @foods = Food.order("created_at DESC").where(user_id: [current_user.id,*current_user.following_ids])
    @like = Like.new
    @ranks = Food.find(Like.group(:food_id).order('count(food_id) desc').limit(5).pluck(:food_id))
  end
```

ビューは特に見せるところはないので割愛します。
eachメソッド使ってとりあえずまずは全部の投稿を出すようにすれば良いと思います。

`order("created_at DESC")`
新しい投稿が上になるように設定。

`where(user_id: [current_user.id,*current_user.following_ids])`
フォローしているユーザーのみと言いながら、
自分の投稿も見れるようにしています。
`current_user.id`を消せばいいと思います。

[【Rails】 whereメソッドを使って欲しいデータの取得をしよう！](https://pikawaka.com/rails/where)
`whereメソッド`については、これを見れば秒で理解できます。
> whereメソッドとは、テーブル内の条件に一致したレコードを配列の形で取得することができるメソッドです。

`*`は`可変長引数`と呼ばれています。

[Rubyにおける可変長引数の使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/19841)
[メソッドの引数にアスタリスク](https://qiita.com/super-mana-chan/items/ca728d90db7c53295b15)
[キーワード引数とオプション引数についてまとめてみた](https://rails-study.net/keyword-option/#i-3)

> 可変長引数とは個数に制限を設けていない引数のことで、その引数は配列として認識されることとなります。
配列ですから、いくあっても良いってことになります。

要するに、制限をおらずフォローしているユーザーを全て取ってくるという認識ですね。

```ruby
@foods = Food.order("created_at DESC").where(user_id: [current_user.id,*current_user.following_ids]).limit(10)
```

`.limit(10)`をつけたら、最新の１０件のみ表示するなど考えましたが、
フォローするユーザーが増えれば増えるほど意味を為さなくなるので、
消しました。

と、色々考えた結果、本題にもある通り、
`フォローしたユーザーの直近１週間の投稿のみ表示`させることにしました。
冗長かもしれないですが、ご了承ください。

```ruby
  def index
    to = Time.current.at_beginning_of_day
    from = (to - 1.week)
    @foods = Food.order("created_at DESC").where(user_id: [current_user.id,*current_user.following_ids]).where(created_at: from...to)
    @like = Like.new
    @ranks = Food.find(Like.group(:food_id).order('count(food_id) desc').limit(5).pluck(:food_id))
  end
```

[Rails（ActiveRecode）で一週間分のレコードを取得する](https://qiita.com/yoshiokaCB/items/ed254817b69a7e296b7c)

# 追記
後日改めて画像を投稿してみたところ、自分が投稿したものが、
反映されておりませんでした。
???となり、先日投稿したものは確認ができます。
`rails c`をして`Time.current.at_beginning_of_day`を確認してみたところ、
`今日の0時0分0秒`となっておりました。
しかし、実際に投稿した時間は、`今日の13時30分頃`です。
これでは、`今日の0時0分0秒から１週間前まで`ということになるので、
当然、投稿したものは反映されません。

以下、修正したコードです。

```rb
to = Time.current.at_beginning_of_day
↓
to = Time.current
```
`to = Time.current`現時刻に修正しました。
以上、よろしくお願いします！

# 終わりに
記事を投稿していましたが、
なんとなく微妙だなと思い、考えながら書いていたら、
直近１週間にしよう。という着地になりました。

調べ物をしていて思いましたが、
[Railsドキュメント](https://railsdoc.com/)
知らないことだらけで、読んでて楽しいですね。

参考にしたサイトは、散らばして書きましたので、
参照ください。

明日も頑張ります！
logbackの設定ファイルにlogback.groovyを使用する

# logback.xmlからlogback.groovyに移行する
XMLだとさすがに見づらい。調べてみると設定ファイルはgroovyで書けるらしい。マジかよいつからそうなんだよ知らなかったよ。という事で試してみた。

# 取り合えずファイル出力とコンソール出力をしてくれる単純な設定ファイル
```logback.groovy
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import java.nio.charset.StandardCharsets

appender("FILE", RollingFileAppender) {
    file = "./logs/hoge.log"
    rollingPolicy(TimeBasedRollingPolicy) {
        fileNamePattern = "./logs/hoge.%d{yyyyMMdd}.zip"
        maxHistory = 7
    }
    encoder(PatternLayoutEncoder) {
        charset = StandardCharsets.UTF_8
        pattern = "%d %p %t - %m%n"
    }
}

appender("STDOUT", ConsoleAppender) {
    target = "System.out"
    encoder(PatternLayoutEncoder) {
        pattern = "%d{HH:mm:ss.SSS} %p %m%n"
    }
}

root(TRACE, ["FILE", "STDOUT"])
```

アホほど見やすくなりました。すいませんでした。ありがとうございました。

# とりあえずkotlinでテストコード
```hoge.kt
import org.slf4j.Logger
import org.slf4j.LoggerFactory

val <T : Any> T.log: Logger
    get() = LoggerFactory.getLogger(javaClass.name)

object App {
    @JvmStatic
    fun main(args: Array<String>) {
        log.error("error log")
        log.warn("warn log")
        log.info("info log")
        log.debug("debug log")
        log.trace("trace log")
    }
}
```

# クラスパスにつっこんで動かしてみる
```
ERROR in ch.qos.logback.classic.LoggerContext[default] - Groovy classes are not available on the class path. ABORTING INITIALIZATION.
```
早速怒られたぞ。何々？
**Groovy classes are not available on the class path. ABORTING INITIALIZATION.**
だと？

そりゃそうか。Groovyのランタイムがいるのか。
普通にimplementationで書けばいいよな。logback.ktsだったら話は早かったのに（小声）

今の最新は**3.0.8**なのね、了解。

```
implementation 'org.codehaus.groovy:groovy:3.0.8'
```

これをbuild.gradleに書いて、と。

```build.gradle
dependencies {
    implementation 'org.slf4j:slf4j-api:1.7.32'
    implementation 'ch.qos.logback:logback-core:1.2.5'
    implementation 'ch.qos.logback:logback-classic:1.2.5'
    implementation 'org.codehaus.groovy:groovy:3.0.8' // ← この人を追加した
}
```

お、今度はちゃんとログファイルでた。コンソールにも出た。

```hoge.log
2021-09-02 00:17:44,480 ERROR main - error log
2021-09-02 00:17:44,482 WARN main - warn log
2021-09-02 00:17:44,482 INFO main - info log
2021-09-02 00:17:44,482 DEBUG main - debug log
2021-09-02 00:17:44,482 TRACE main - trace log
```

```console.log
00:17:44.480 ERROR error log
00:17:44.482 WARN warn log
00:17:44.482 INFO info log
00:17:44.482 DEBUG debug log
00:17:44.482 TRACE trace log
```


# XML to groovy トランスレータありました
**logback.xml to logback.groovy translator**
http://logback.qos.ch/translator/asGroovy.html

これを通過させてあと微調整で大体いけそうな感じ。
注意点ってほどでもないけど、```<!DOCTYPE configuration>```があると通らなかったくらいで。
消せばいいだけなんだけどね。

見やすくなって本当に助かったというお話。
Android Virtual Deviceの新規作成

## Android Virtual Deviceとは

Androidのスマホやタブレットをシミュレートする仮想デバイス。
Android Studioでのアプリ開発において、実行・デバッグで利用。

## 環境

- Android Studio: Arctic Fox 2021.3.1

## 前提

- Intel XAHMが正しくインストールされていること
 - https://qiita.com/yiwa81/items/d009d7923bc593018bfd

## 新規作成の手順

Android Studio で以下を行う。

- Tools > AVD Manager を選択
- Create Virtual Device を選択
- Phone, Pixel2 （デフォルト）を選択し、Next
- API Level: 30, ABI: x86, Android: 11.0 （デフォルト）を選択し、Download
- Next を選択
- Finish を選択

## 実行

- 任意のプロジェクトを開く
- Run > Run 'app'
Passing object as parameter into function

Please read following code.

```Java
public class Test {

	public static void main(String[] args) {
		// Integer reference called "clz"
		Integer clz = new Integer(1);
		changeValue(clz);
		System.out.println("After called changeValue(): " + clz.toString());
	}

	public static void changeValue(Integer input) {
		System.out.println("Start changeValue(): " + input);
		input = new Integer(2);
		System.out.println("Finish changeValue(): " + input);
	}

}
```

The output is

```
Start changeValue(): 1
Finish changeValue(): 2
After called changeValue(): 1
```

# Finding

1. Changing the value of reference (ie create a new object) inside a function will not affect the original value of reference passed into
2. Before function is executed in JVM, value of reference "clz" **copy** to stack memory space "input". During execution, the change is on that stack memory space and after function is executed value of stack memory space **will not** copy back to original

# Reference

1. [Passing String as parameter to a method](https://ibytecode.com/blog/passing-string-as-parameter-to-a-method/)
未経験インフラエンジニアの技術メモ

はじめまして
ベンチャー企業でプログラマーとして活動しているまきのです。
これからインフラエンジニアに転職するので自分の技術メモ(成長日記)を残していこうと思います。

もし、見ていただいて間違えていたりアドバイスがありましたら気軽に教えていただきたいです。
よろしくお願いいたします。
ネガティブな気持ちになった時の対処法


#対象者

上司に怒られたり、恋人と喧嘩してしまった、または家族と大喧嘩して気持ちが沈み込んでる人。
元のメンタルに戻りたくても、何度も思い返してしまってなかなか脱出することができない人


#対処法

いち早くネガティブな気持ちから脱出するためには必要なことは、**嫌なことがあったら、楽しいことを計画する**ということです。
これはれっきとした心理テクニックでシチュエーション・セレクションと呼びます。重要なのは楽しいことを計画することで、その計画を実行しなくてはいけないことではありません。

シチュエーション・セレクションの例：最近頑張っていたのに嫌なことがあったから、週末にプチ旅行にいく計画をする
Swiftのナビゲーションバーの枠線を消す

#箇所
頭部のところ
![截圖 2021-09-01 23.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/e0797f84-9881-9c47-2b6d-e31aa45a3a2c.png)
#消したい画面に
```sample.swift
override func viewDidLoad() {
    super.viewDidLoad()
    let image = UIImage()
    self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)
    self.navigationController?.navigationBar.shadowImage = image
}
```
を書き込んだら消えます。
git cloneしようとしたらremote: Repository not found.に阻まれた

#この記事でわかること
remote: Repository not found.
と出たときの対処法

#背景
自身のポートフォリオとなるサイトを作る際に、GitHubを使おう！
↓
GUIからリポジトリを作成
↓
ローカルで作成していたサンプルコードをまず```git push```しよう！
↓
PowerShell開いて、```$ git clone https:///github.com/****/****.git```
↓

```
Cloning into 'myhomepage'...
remote: Repository not found.
fatal: repository 'https://github.com/****/****.git/' not found
```

↓
さっき作ったしないわけない...
あ、もしかしてアカウントのせい？
↓
じゃあどうすれば良いんだろう...←いまここ


#現アカウントの確認

とりあえず今ログインしているアカウントを調べます

```powershell
git config --global user.name
git config --global user.email
```

これが使いたいアカウントでない場合は設定し直す必要があります

#アカウントの切り替え
アカウントは先ほど確認したものに新しいものを加えるように書けば切り替えられます

```powershell
git config --global user.name <NEW_NAME>
git config --global user.email <NEW_EMAIL>
```

#SSH Keyを設定
httpsでの```git clone```を諦め、sshでやることにしました
その際にSSH Keyを設定する必要があったのでこちらの記事を参考にしました

https://qiita.com/tedkuma/items/3b539e79010a4808337c

#いざ、git clone

```
git clone git@github.com:****/****.git
Cloning into '****'...
Enter passphrase for key '/c/Users/****/.ssh/****':
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
```

はい、ということで無事解決しました
【JavaScript】重複しない整数乱数を生成する関数

##参考
[JavaScriptで重複しない乱数を生成する](https://tdyu.hatenablog.jp/entry/2019/05/04/025601)…関数化されていない重複しない整数乱数の生成方法

##やりたいこと
重複しない整数乱数を配列で生成したい + 関数として利用したい

##やったこと
重複しない整数乱数を生成する関数を参考URLのコードをちょっと改変して作成

##コード
Google Apps Script環境で実装しているためJavaScriptだと修正が必要かも。

###改変前の関数化していないコード

```javascript:randomizing.js
function randomizing(){
  var arr = [];
  numArr = []; 
  for(var i=0; i < 5; i++){
     arr[i]=i+1;
  }

  for(var j = 0,len = arr.length; j < 5; j++, len--) {
    rndNum = Math.floor(Math.random()*len);
    numArr.push(arr[rndNum]);
    arr[rndNum] = arr[len-1];
  }

  //debug
  for(var k=0; k<numArr.length; k++){
    console.log(numArr[k])
  }
}
```
実行結果

>4
>1
>2
>5
>3

###関数化したコード

```javascript:generateRandomNumArray.js
//test用
function test(){
  generateRandomNumArray(30,5);
}

//重複しない1～maxNumの整数乱数を生成する関数
/**
 * @param {number} maxNum - 取りうる最大値
 * @param {number} generateArrayLength - 生成する配列の長さ
 * @return {number[]}
 */
function generateRandomNumArray(maxNum, generateArrayLength){
  let generateArray = []; //ランダム格納用配列
  let numberArray = []; //ランダム生成用配列

  //ランダム生成用配列を作成
  for(let i=0; i<maxNum; i++){
    numberArray[i] = i+1;
  }

  //ランダム格納用配列にランダム整数を格納
  for(let j=0,len=numberArray.length; j<generateArrayLength; j++,len--){
    let rndNum = Math.floor(Math.random()*len);
    generateArray.push(numberArray[rndNum]);
    numberArray[rndNum] = numberArray[len-1];
  }

  //debug
  for(let k=0; k<generateArray.length; k++){
    console.log(generateArray[k]);
  }

  return generateArray;
}//end function
```

実行結果
>19
>25
>17
>29
>30

##あとがき
GAS+SSでランダムな規定数の行にランダムチェック的なフラグをたてたかったのだが、重複しないような乱数配列生成をしてくれるようなジャストな関数はなかった。
もしかしたらもっと短く済む方法があるかもしれない。
あと正直コードの意味がわからない、コピペでも動いてしまうって怖いね
[コーディングスキル]　アウトプット用メモ

# 用途

コーディングスキルを磨くために、随時用語を纏め内容を理解するのが目的です。

※アルファベット、50音順に纏めていきます。

# 変更履歴

9/2 sortメソッド
9/5 group by

# group by(データをグループ化する)

GROUP BY 句を使用すると指定したカラムの値を基準にデータをグループ化することができます。グループ化することでデータの数を数える COUNT 関数やデータの平均を計算する AVG 関数をグループ毎に行うことが可能。


```SQL:SQL

+--------+------------+
| name   | team       |
+--------+------------+
| 松井   | チームA    |
| 鈴木   | チームA    |
| 上原   | チームA    |
| 大谷   | チームB    |
| 坂本   | チームB    |
+--------+------------+

```

グループ化を行う「GROUP BY」と数を数える「COUNT」を利用すれば、グループごとの人数を算出出来る。

```SQL:SQL
SELECT team, COUNT(team) FROM user GROUP BY team;
```

```SQL:SQL
+------------+-------------+
| team       | COUNT(team) |
+------------+-------------+
| チームA    |           3 |
| チームB    |           2 |
+------------+-------------+

```

group byの使い方

```SQL:SQL
select [表示する要素名] from [テーブル名] GROUP BY [グループ化する要素名];
```

__条件を絞って使い方__

```
WHERE・・・GROUP BYの影響の前に条件が適応される
HAVING・・・GORUP BYの影響のあとに条件が適応される
```

[WHERE]はグループ化される前に、特定ユーザーを省く時などに使用

```SQL:SQL
+--------+------------+
| name   | team       |
+--------+------------+
| 松井   | チームA    |
| 鈴木   | チームA    |
| 上原   | チームA    |
| 大谷   | チームB    |
| 坂本   | チームB    |
+--------+------------+
```

SELECT team,COUNT(team) FROM user WHERE name!="松井" GROUP BY team;

```
+------------+-------------+
| team       | COUNT(team) |
+------------+-------------+
| チームA    |           2 |
| チームB    |           2 |
+------------+-------------+
```

[HAVING]で集計【後】を絞る

```SQL:SQL
SELECT team,COUNT(team) AS team_num FROM user GROUP BY team HAVING 3 <= team_num;
```

```
+------------+----------+
| team       | team_num |
+------------+----------+
| チームA    |        3 |
+------------+----------+
```

# sortメソッド
配列に対してsortメソッドを使用すると中身を順々に並び替えが可能。

```
array = [1, 4, 3, 2]
array.sort
=> [1, 2, 3, 4]
```

reverseメソッドを組み合わせれば降順も可能！

```
array.sort.reverse
=> [4, 3, 2, 1]
```
また、文字列にも使用可能:point_up:

```
array = [ "e", "b", "a", "d","c"]
array.sort
=> ["a", "b", "c", "d", "e"]
```

# 除数
除法（割り算）で、割るほうの数。

# 被除数

除法（割り算）で、割られるほうの数。

# フィボナッチ数列

フィボナッチ数列は、「2つ前の項と1つ前の項を足し合わせていくことでできる数列」
プログラミング言語の実装では、再帰的処理の例としてよく紹介されています。

```
1,1,2,3,5,8,13,21...

```


n番目の数(n-1)番目と(n-2)番目の数の和からなっている数列。
AtCoderでPythonを使ってTLEするときにやることリスト

どんな改善点があるかを思い出すためのリストです。細かい説明はしません。

- PyPy として提出する
- 逆に Python として提出する（再帰、文字列、タプルが多いコードで有効？）
- `input` を `sys.stdin.readline` に置き換える
- `in List` を `in Set` に置き換える
- 累乗の計算は `pow` を使う 
- `2**n` を `1<<n` に置き換える
- `while` を `for ` に置き換える
- リストの先頭に追加や削除を行いたい場合は `deque` を使う
- リストの要素を一つずつ取り出すとき index を使ったアクセスを避ける
- 再帰関数を書くときは `sys.setrecursionlimit(<再帰上限>)` も書く
- `heapq` に追加する要素はリストでなくタプルにする(ダイクストラとか)
- `bisect` が遅いときは二分探索を書く
- 二次元リストを作るとき外側のリストの方が小さくなるようにする
- `Counter+Counter` を `Counter.update(Counter)` に置き換える

# 参考にした記事
https://www.kumilog.net/entry/python-speed-comp
https://qiita.com/Hironsan/items/68161ee16b1c9d7b25fb
https://qiita.com/c-yan/items/dbf2838cdd89864ef5ac
https://linus-mk.hatenablog.com/entry/python_competitive_programming_speed_up_1
JavaScriptのオブジェクト配列を特定キーの値でuniq処理する

オブジェクト配列を特定キーの値でユニーク抽出する必要があったので調べてみたのですが、シンプルな記述が見あたらなかったので書いてみました。

1. `Array.map`で値とオブジェクトのArrayイテレータを作り、
2. `new Map(イテレータ)`で値でuniq化し、
3. `Map.values()` で オブジェクトのイテレータを作り、
4. `[...イテレータ]` でArrayにする

オブジェクトの`c`キーの値でuniq処理する例：

```js
const array = [
   { a: 0, b: 1, c: 2 },
   { a: 3, b: 4, c: 2 },
   { a: 5, b: 6, c: 7 },
   { a: 8, b: 9, c: 7 },
];

let uniq_by_c = [...new Map(array.map(obj => [obj.c, obj])).values()];
console.log(uniq_by_c);
```

```js:関数化
const uniq = (array, key) => [...new Map(array.map(obj => [obj[key], obj])).values()];
console.log(uniq(array, 'c'));
```

```js:実行結果
[ { a: 3, b: 4, c: 2 }, { a: 8, b: 9, c: 7 } ]
```
M5StackにENVⅡ(環境センサユニット)をつないでみる

M5StackにENVⅡ:SHT30（高精度デジタル温湿度センサ） とBMP280 （モバイル用に特別設計された絶対大気圧センサ）を搭載した環境センサを繋いで画面表示してみましたのでその手順を記載します
(Arduino開発環境は構築済みとします)

## 1. 「Adafruit BMP280 Library」のインストール
Arduino IDEを起動し、「スケッチ」タブ→「ライブラリをインクルード」→「ライブラリを管理」にて表示される検索窓に「Adafruit BMP280」を入力。表示されるライブラリをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/38acb3ce-77d0-b430-b526-d7d6c7281301.png)

## 2. 「ENVII」ファイルのコピー
 - M5StackのGitHub[(こちら)](https://github.com/m5stack/M5-ProductExampleCodes)に公開されているサンプルコード一式をダウンロード
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/d25b7970-529e-b28c-2dfb-90409fa4ac95.png)

 - ダウンロードした中の「M5-ProductExampleCodes-master\Unit\ENVII\Arduino\ENVII」にある3つのファイル「Adafruit_Sensor.h」「SHT3X.cpp」「SHT3X.h」を「C:\Users\<user_name>\Documents\Arduino\libraries\Adafruit_BMP280_Library」へコピー

## 3. スケッチファイル作成、ビルド＆書き込み
「M5-ProductExampleCodes-master\Unit\ENVII\Arduino\ENVII」にある「ENVII.ino」を基にしてビルド＆書き込み

以上で、液晶画面に温度、湿度、気圧が表示されます
![M5stackENV2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/6041d0a1-866b-e3d0-2486-f7f49e1300ec.jpeg)
magento、System dependenciesについて

# はじめに

magentoを、インストールしながらドキュメントを読んでいましたが、よく分からなかったところがあったので、調べてみました。

# リンクはこちら

https://devdocs.magento.com/guides/v2.4/install-gde/system-requirements.html

# 最終更新日
2021年9月01日


# 環境の情報
OS
ubuntu 20.04


# 該当の個所
System dependenciesdependencies

Magento requires the following system tools for some of its operations:
システムの依存関係
Magentoは、その操作の一部に次のシステムツールを必要とします。 

```
bash
gzip
lsof
mysql
mysqldump
nice
php
sed
tar
```

この記載されている内容がよく分からなかったので、確認してみました。

# 内容について

### bash　について
Unixシェル　かつ　コマンド。

### gzip　について
データを圧縮するプログラム。ファイルを圧縮するコマンド。

### lsof　について
オープンしているファイルを一覧表示するコマンド。

### mysqldump　について
データベースダンプするコマンド。
dump（ダンプ）とは、バックアップのこと。

### nice　について
優先度を指定してコマンドを実行するコマンド。

### sed　について
テキストファイルを編集するコマンド。
間違えてmasterで作業しちゃった(git stash)

#stashで作業内容を退避
```
※落ち着いて現状を確認
git branch -a
git status

※作業内容を退避
git stash 

※もう一度確認 → 変更が戻ってる
git status

※ブランチを切る
git switch -c develop

※退避したものを反映
git stash apply
```
## 退避した一覧確認
```
git stash list
```

## 退避するものにメッセージをつける
```
git stash save "message"
```
AWS DVA資格取得に役立つハンズオン

#はじめに
AWS初心者向けハンズオン「[AWS Hands-on for Beginners](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)」の中から、AWS DVA（デベロッパー - アソシエイト）取得に役立つハンズオンを紹介します。

DVAは、SAA（ソリューションアーキテクト - アソシエイト）と比較して、①狭く深い知識が問われ、②具体的なコマンドが出てくる問題が多いです。したがって、ハンズオンは有効なDVA試験対策になると思います。

#[AWS Hands-on for Beginners](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)とは

- 初めてAWSサービスを利用する方向け
- 解説動画を見ながら、実際にAWSサービスを操作する
- 各ハンズオンは合計1～2時間の動画構成

#ハンズオン①　AWS環境のコード管理AWS CloudFormationでWebシステムを構築する

###DVAでの出題範囲
分野1「展開」に該当

###ハンズオンで学べる主要なサービス
- AWS CloudFormation

###ハンズオンの内容

AWS環境におけるコード管理の重要性を学び、AWS CloudFormationを利用して以下の環境を構築する。クラウドベースの統合開発環境AWS Cloud9を利用して、CloudFormationテンプレートの編集、更新を行う。AWS CLIを利用してスタックを更新する。VPC、EC2、RDS、ELBを順番にスタックを分けて構築する。構築した環境の動作を確認するため、EC2上のWord Pressにログインする。

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/bdc6e119-186d-cb2f-0cb2-7ad929e3ceb4.jpeg">

#ハンズオン②　AWS Codeサービス群を活用して、CI/CDのための構成を構築しよう！

###DVAでの出題範囲
分野1「展開」に該当

###ハンズオンで学べる主要なサービス
- AWS CodeCommit
- AWS CodeBuild
- AWS CodeDeploy
- AWS CodePipeline

###ハンズオンの内容

AWS Codeサービス群を利用して、継続的インテグレーション/継続的デプロイメント(CI/CD)のための簡単な構成を作成する。

<img width="600" alt="IMG_1584.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/183cc8c6-f431-1ae9-d4a7-e992ec553b94.jpeg">

上の構成では、AWS Cloud9からAWS CodeCommitにソースコードをgit pushする。AWS CodePipelineは、そのgit pushを検知し、S3 Bucketに成果物をデプロイする。S3 Bucketは、静的ウェブサイトホスティングの設定を行っているので、自動的に公開される。

下の構成では、git pushを検知したAWS CodePipelineは、AWS Codeサービス群を連携させ、EC2 Instanceへのデプロイまで自動で実行する。

#ハンズオン③　監視編 サーバーのモニタリングの基本を学ぼう

###DVAでの出題範囲
分野5「モニタリングとトラブルシューティング」に該当

###ハンズオンで学べる主要なサービス
- AWS CloudWatch
    - CloudWatch Metrics
    - CloudWatch Alarms
    - CloudWatch Logs
    - CloudWatch Logs Insights
    - CloudWatch Events
    - CloudWatch DashBoards

###ハンズオンの内容
初めにAWS CloudFormationを利用して、モニタリング対象のアーキテクチャを構築する。

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/cd6a15cf-5299-0312-22b1-8e34aa5a560e.jpeg">

Amazon CloudWatchのモニタリングに関する以下の機能を使用する。

|機能名|主な用途|使用例|
|:--|:--|:--|
|CloudWatch Metrics|システムのパフォーマンスを確認する|EC2のCPU使用率を確認する|
|CloudWatch Alarms|メトリクスに応じたアクションを実行する|EC2のCPU使用率が90%を超えたときにメールを送信する|
|CloudWatch Logs|システムのログを監視、保存、アクセスする|EC2のログを確認する|
|CloudWatch Logs Insights|ログをインタラクティブに検索し分析する|EC2のエラーコードログを検索しグラフ化する|
|CloudWatch DashBoards|複数のメトリクスやログを1つの画面で確認する|EC2のCPU使用率、ディスクの読み書き回数、ネットワークの利用などを1つの画面で確認する|
|CloudWatch Events|イベントに応じたターゲットを利用したアクションを実行する|EC2が停止したときにメールを送信する|

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615121/f4da200e-59dc-a053-5f07-aa3f5f623dea.jpeg">

#おわりに
実際に手を動かして、AWSサービスを触るのは楽しいです（∪＾ω＾）
【JavaScript】配列とオブジェクトの違い

#はじめに
こんにちは。
JavaScriptの配列とオブジェクトの違いについてアウトプットしていきます！

##配列とオブジェクトの違い
>配列が「添字を使って格納されたデータを参照する」のに対して、オブジェクトは「名前（プロパティ）を使って格納されたデータを参照する」という点です。<br>
参考：https://atmarkit.itmedia.co.jp/ait/articles/1011/29/news109_2.html

<br>

###配列


```javascript:JavaScript
let vegetables = ['トマト', 'ナス','キュウリ'];
console.log(vegetables[0]);   // トマト
```
変数vegetablesの添字に0を指定して出力すると、参照した値「トマト」が出力される。
<br>

###オブジェクト

```javascript:JavaScript
let user = {
    name: '佐藤',
    age: 20
}
console.log(user.age);   // 20
```
変数userのプロパティageを指定して、20を出力することができる。
  
<br>

#最後に
ここまで配列とオブジェクトの違いについて簡単にまとめました。
こうやってまとめながら比較していくと覚えやすかったので、適宜アウトプットしながら学習を進めていきます！
図解まるわかり「サーバーの仕組み」アウトプット

こちらの本を読んだ時に書いていたメモです。
アウトプットと見返し用に使用します。
正直この本は分かり辛かったです、、、
図解が微妙でした、、

## 最初に

 - サーバーは落ちることが基本的にない。（落とさないような仕組みが整っている）
 - サーバーOSの日本市場ではwindowsOSが5割以上を占めている

## 導入

- 性能見積もり  
　└導入前の仮定した要件からサーバーを見積もること
- サイジング  
　└性能見積もりから、サーバーを選定すること

## インターネット

- VDI  
　└クライアントPCの仮想化
- NTPサーバー（Network Time Protocol）  
　└サーバーは以下のコンピューターに時刻を同期するためのサーバー
- SIPサーバー（Session Initiative Protocol）  
　└IP電話を制御するサーバー
 - IP電話とは？？  
　　　└VoIP（Voice over Internet Protocol）という音声データ制御技術を使って通はする方法
- SSOサーバー（Single Sign On）  
　└シングルサインオンを実現するサーバー。「リバースプロキシ」か「エージェント」を使って実現する

## 運用と処理

- 運用監視  
　└システムが正常に動いているか、サーバーやネットワークを監視すること。
- リソース監視  
　　└CPU、メモリなどの使用率の監視やネットワークのトラフィックを監視する
- ヘルスチェック  
　　└サーバーやネットワーク機器が動作しているか監視、確認する
- RPA（Robotic Process Automation）  
　└機械に自動処理させる仕組み（RPAの定義はある）
- BPMS（Business Process Management System）  
　└業務プロセスを分析、改善しながらマネジメントすること。  
　└RPAを管理することもできる
- Hadoop  
　└ビックデータ処理のOSS

## セキュリティと障害対策

- 情報セキュリティポリシー  
　└１、基本方針　２、対策基準　３、実施手順
- DMZ（DeMilitarized Zone）  
　└非武装地帯。内部ネットワークとファイアウォールの間に設ける緩衝地帯
- フォルトトレランスシステム（Fault Tolerance System）  
　└障害が発生しても稼働し続けるシステム
- クラスタリング  
　└本番系と待機系の2つのサーバーを使用する形態。本番系が故障したら待機系が起動する
- ロードバランシング  
　└複数台のサーバーを使用して、負荷を軽減する形態。
- チーミング  
　└ネットワークの出入口のネットワークカードに障害が起きた時の対策技術
- UPS（Uninterruptible Power Supply）  
　└電力供給が停止した時に一時的に電力を供給する聴き

## サーバーの導入

- 昔はクロック数をサーバー選定の基準にしていたが、現在ではCPUのコア数やスレッド数を選定の基準にするのが一般的。
- サーバーが発する熱と音は、PCと比べて桁違いに大きい。
- ITポリシー  
　└企業や団体での情報技術やシステムの活用について体型的にまとめられている規程。
- アドミニストレータ  
　└サーバーの管理者
- アドミニストレータの仕事  
　└１、ユーザー管理　２、資産管理　３、運用管理

## サーバーの運用管理

- 現在のシステムは、「安定稼働」を掲げている物がほとんど。
- 影響分析  
　└「影響範囲」と「影響度」から、システムに障害が発生したときの影響の度合いを想定すること
- CFIA（Component Failure Impact Analysis）  
　└障害の影響分析を詳細にわたって洗い出して定義する手法
- ITIL（Information Technology Infrastructure Library）  
　└企業や団体におけるシステムの運用管理のお手本や基準をまとめたもの（英国発祥）  
　　└日本の企業でもITILを参考にして運用管理が行われている
- SLA（Service Level Agreement）  
　└「サービスのレベルを体型的に示す活動」や「サービスレベルを規定した契約書」。  
　　└日本の企業の半数で導入されている。努力目標としての意味もある。
- MTTR（Mean Time To Reepair）  
　└平均復旧時間、システムが故障してから復旧するまでの平均時間。

## 本リンク
https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E3%81%BE%E3%82%8B%E3%82%8F%E3%81%8B%E3%82%8A-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E8%A5%BF%E6%9D%91-%E6%B3%B0%E6%B4%8B/dp/4798160059
Rails configファイルとは(実務ベースで解説)

# configとは
***Configration(設定)***という意味です。
Railsで***何かを設定する時***に使うファイルで、```「config.パラメーター名　= 値」```の形式で設定します。

# configの中でよく使うもの
configでよく実務で使われていたものをまとめました。

### routes.rb
ルーティングの設定でよく使われます。
ルーティングはurlみたいなものでどのコントローラーのどの処理をどのように処理を
するのかを設定するものです。

### webpack
フロントエンドnoJavascriptなどの複数のモジュール（部品)をまとめるツールです。

### application.rb
アプリ全体の設定をします。
### environment
環境ごとの設定ファイルを入れておくディレクトリです。

- ```development.rb```
***開発環境の設定ファイル***です。

コンソールでの開発環境入り方
```
rails c
```

- ```test.rb```
***テスト環境の設定ファイル***です。

コンソールでのテスト環境入り方
```
rails c -e test
```


- ```production.rb```
***本番環境の設定ファイル***です。
```
rails c -e production 
```

### credentials
システムやアプリケーションが外部のサービスやデータベースにアクセスする時に使割れる、
特定の識別情報や権限情報のことです。つまり機密情報のことです。

詳しくはこちらを読んでください。

https://zenn.dev/norihashimo/articles/074388476de22a

### initializer
初期化処理や設定情報を入れておくディレクトリです。

   
### locales
ソフトウェアやウェブアプリケーションなどのプログラムの中でで使われる、
特定の地域や言語に関連する設定やデータが記述されています。

ex)
言語: ユーザーが使用する言語コード（例: "en"、"ja"）。
国: ユーザーの地域を示す国コード（例: "US"、"JP"）

など

### boot.rb
Railsアプリケーションの***起動プロセスを設定するためのファイル***です。
このファイルは***アプリケーションが起動するときに最初に読み込まれ***、
***アプリケーションの基本的な設定***を行います。
boot.rbはconfig/application.rbから呼び出されます。


### puma.rb
```Puma```と呼ばれる***Webサーバーの設定ファイル***で、RailsアプリケーションでRackアプリケーションをサポートする性能が良くて効率的に動くWebサーバーです。
Pumaサーバーがアプリケーションをどのように実行するかや、どのポートでリクエストを待ち受けるかなどの設定を行います。

### database.yml
データベース接続の設定を行うためのファイルで、このファイルには、
開発環境、テスト環境、本番環境などの***各環境ごとに異なるデータベース接続の設定***が記述されてます。


### storage.yml
***アクティブストレージ（Active Storage）を設定***するためのファイルです。


# 参考資料 config

https://railsdoc.com/config

# 参考資料 webpack

https://udemy.benesse.co.jp/development/system/webpack.html

https://goworkship.com/magazine/how-to-webpack/#2
【応用情報技術者試験】3文字英単語帳

#◎AES
共通かぎ暗号方式の例でよく登場。
五十音順では共通鍵の後に公開鍵が来るが、AESとRSAもAESの方が先。と覚える。

#◎BPR
Business　Process　Reengineering
企業の抜本的業務改善。

#ERP
Enterprise　Resource　Planning

企業の経営資源(Enterprise　Resource)を有効に活用するため、基幹業務を統合的に管理するためのシステム。

#SLA
Service　Level　Agreement
発注者と受託者間におけるサービス品質について合意した文書。

#SOA
System Oriented Architecture
ビジネスプロセスの構築要素とそれを支援するIT基盤をソフトウェア部品であるサービスシステムとして提供するシステムアーキテクチュア。

#IPsec
IP(インターネットプロトコル)を拡張してセキュリティを高め、
➀改ざんの検知
②通信の暗号化
➂送信元の認証などの機能を
OSI参照モデルのネットワーク層レベルで提供するプロトコル。

VPNの話でよく出てくる。

#◎SSH
暗号機能や認証機能を持、遠隔にあるコンピュータに安全にログインするためのプロトコル。
通信が暗号化されるtelnet

※プロトコルとは、ルールの事

#◎SSL
インターネット上の通信を暗号化する仕組み。
SSHと似ていて、どちらも暗号化するが、
SSHは遠隔操作する時の通信を暗号化するのに対し、SSLはインターネット上のやり取りを暗号化する。

#MIME
ASCII文字しか使用できないSMTPを利用したメールで、日本語の2バイトのコードや画像データを送信するための仕組み。
メールで日本語や画像を使うために作られたお約束事


#◎IMAP４(Internet　Message Access　protocol)
電子メールの受信に使われるプロトコル。
POPとの違いは、メールサーバのメールを選択して受信が可能だという事。
※Mはメッセージ！だからメール関係！

#POP3
Post　Office　Protocol
ユーザがメールサーバからメールを取り出す時に使うプロトコル。


##★メール関係のプロトコル
受信…POPとIMAP
　POPはメールを端末内にダウンロードする。
　IMAPはメールをサーバー上に置いたままにするため、複数の端末からメールを見られる。だからインターネットアクセス！

送信…<b>SMTP</b>
　単純にメールを送信するためのプロトコル。

#◎SMTP
メールを送信する


#◎BCP
Bussiness Continuty　Plan

災害などが発生した場合も、最低限の事業が継続できるように計画を立てる事。

#◎BSC
Balance Score Card

企業を、財務・顧客・内部プロセス・学習と成果の4つから戦略を検討したもの

#◎BPO
Business　Process　Outsourcing
業務効率の向上のために、外部に業務を委託すること。

#◎BPM
Business　Process　Management
企業の目標を達成するために、継続的に改善すること

#NAS
Network　Attached　Storage
TCP/IPのコンピュータネットワークに直接接続して使用するファイルサーバ。

#RAID
磁気ディスクに障害が生じても大丈夫

#LRU
Least　Recent　Used
使用後の経過時間が最長のページを置換対象にするアルゴリズム。
最近使ってないページ。

#LFU
Least　Frequently　Used
最も回数が少ない(頻繁ではない)

#NAPT
グローバルIPアドレスと複数のプライベートIPアドレスを結びつける。

#★MMU
Memory　Management　Unit
CPUが指定した仮想アドレスを物理アドレスに対応させる。

#PWM
Pulse　Width　Modulation
信号の強度は一定でパルス信号を出力する時間(これがWidth)を調整することで、電力や電圧を制御する方式。

#PAM
Pulse　Amplitude　Modulation
パルス信号を出力する時間は一定で、信号の強度(振幅)によって制御する方式。

#CALS
computer　Aided Logistics Support
製品の情報をデータベースで一元管理し共有することで製品のコスト削減や生産性の向上を図る


#DFD
Data　Flow Diagram
データの流れによってプロセスを表現するために、データ送出し、データ受け取り、データ格納域、データに施す処理を表現する。

#UML
目的に応じたモデル図法を使用し、オブジェクトモデリングのために標準化された記述ルールで表現する。

#BPD
Business　Process　Diagram
プロセスの機能を網羅的に表現するために、一つの要件に対して生じる事象を条件分岐形式で書く。

#SOA
Service　Oriented Architecture
各業務のシステムの機能をいくつかの独立した部品に分けることによって、業務プロセスとの対応づけや他のソフトウェアとの連携を用意にする手法。

#DTD
Document Type Definition
SGML・HTML・XMLの構文を定義するスキーマ言語。
ドキュメントのタイプを定義する言語。

#XLinK
XML　Linking　Language
XMLドキュメント同士のリンクを定義するための仕様。

#CRM
Customer Relationship　Management
多様なチャネルで集客した顧客との関係を管理。

#ERP
Enterprise　Resource　Planning
企業の業務プロセスを一元管理することで、業務の効率化や経営資源の全体最適化を図る手法。

#★BCD
Binary-coded decimal
4桁の二進数で10進数を一桁で表現する方法。

#４P
Product（製品）
Price（価格）
Place（流通、場所）
Promotion（広告、宣伝）

#４C
Customer　Value（顧客価値）
Customer cost（顧客コスト）
Convenience（利便性）
Communication（コミュニケーション・対話）

#３C
Customer（顧客）
Company（自社）
Competior（競合他社）

#ICMP
データ送信中のエラーを通知するプロトコル。
**Ping監視**を行うためのプログラムに使われます

#UDP
コネクションレス型の通信を実現するプロトコル

cf:**UPS**
(Uninterruotible Power Supply)
落雷などによって停電した時に自家発電装置が電源を供給するまでに電源の役割を持つ機器。

#GIF
256色以下の画像を扱える**可逆圧縮方式**

#JPEG
デジカメなどの**フルカラー画像**を圧縮する。
一般的に**非可逆圧縮方式**

#ODM
（Original　Design Manufacturer）
自社で設計し、自社工場で生成した製品を相手先ブランドで納入する。

#DHCP
IPアドレスを一元管理し、クライアントPCに動的に割り当てる

#SNMP
Simple Network Management Pritocol
ネットワーク上の危機の情報を収集して監視する。
論文まとめ：3D human pose estimation in video with temporal convolutions and semi-supervised training

# はじめに

CVPR2019より以下の論文
[1] D. Pavllo, et. al. "3D human pose estimation in video with temporal convolutions and semi-supervised training" CVPR2019
のまとめ

CVF open access: 
https://openaccess.thecvf.com/content_CVPR_2019/html/Pavllo_3D_Human_Pose_Estimation_in_Video_With_Temporal_Convolutions_and_CVPR_2019_paper.html

公式github:
https://github.com/facebookresearch/VideoPose3D
facebook researchから出てる。商用利用不可。

モデルの略称：
VideoPose3D

以下、個人的に興味のある部分のみ、ざっくりまとめ。


# 概要
- videoに対して 3D の姿勢を推定するモデル
- 教師ありと教師なしを組み合わせて学習する（半教師学習）
- 3d-poseのラベルがあるデータに対しては教師ありで学習する
- 3d-poseのラベルがないデータに対しては3Dを2Dに再投影したものとの差などでlossを計算する
- neural networkのアーキテクチャとして dilated convolutionを用いることで、効果的に時間方向から特徴量を抽出している

以下の図のように、sequentialな2d-poseを入力とし、dilated convで畳み込み、3d-poseを推定する。

![VideoPose3D_img00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/0ad69aae-7ccd-9c95-0bcf-fca4e7045469.png)

# 手法
以下がモデルの全体像。

![VideoPose3D_img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/da56ab80-c36e-0d93-0fde-4f9408629f22.png)

上側半分が3Dのアノテーション用いた教師あり学習。左から2Dのposeを入力し、Pose modelで3Dのposeを推定する。一方 trajectory modelからは3Dのtrajectoryを推定する。

これら２つとground truthとの差をlossとする。

一方、下側は対応する3Dのアノテーションが存在する場合の教師なし学習。左から2D poseを入力し、3D poseと3Dのtrajectoryを推定する。

これらをカメラの内部行列を用いて画像座標にprojectし、2D上でlossを求める。

また推定した3Dのposeから各boneの長さを求め、これをアノテーションから取得した平均的なboneの長さと比較し、lossとする。

# 実験と結果
## 定量的評価
Human3.6MのProtocol1でのMPJPEを他のモデルと比較したものは以下。

![VideoPose3D_img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/83fdf759-b6f7-1923-508a-b8d7ae16a95a.png)

sequentialなデータを用いてfullのアーキテクチャで学習したものは概ねSOTA。

## 反教師学習の効果
以下は教師あり学習のみの場合と、半教師学習した場合との比較

![VideoPose3D_img30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/34d12ce0-bea9-b14d-e2b4-dab102fcf296.png)

オレンジの点線（教師ありのみ）に比べて黒の実線（半教師）はMPJPEが改善している。
【Laravel】ページネーションの実装方法

#はじめに
今回は簡単にできるページネーションの実装方法について説明します。

#ページネーションとは
たとえば、１ページに投稿を１００件も表示すると、ユーザーも見づらいし、表示速度も落ちるし、システムの負荷も増えてしまいますね。
そこで、そのような長いコンテンツを複数のページに分けて表示させることをページネーションといいます。

#ページネーションの実装
1) コントローラーに以下のように記述します。

```php:MenuController.php
public function index()
{
     $menus = Menu::paginate(5);
     return view('menus.index', ['menus' => $menus]);
}
```
`paginate`の引数に渡されている数字が１ページに表示する件数です。

2) テンプレートファイルに以下のように記述します。

```php:index.blade.php
{{ $menus->links() }}
```

#おわりに
これだけでページネーションを実装できるなんてびっくりですね。
ページネーションをカスタマイズすることもできるので、カスタマイズしたい人はググってみてください。
VSCodeで出力が文字化けした時の対処


どのタイミングかは不明ですが、Windows Updateを行ったタイミングで急にVSCodeの出力が文字化けしてしまいました。。。その時の対処方法を記載します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/df6490a0-8d0c-e50d-66d1-e87b59e693d0.png)

#### コントロールパネル -> 「時計と地域」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/bec53c9f-df96-8125-2a6c-7995f1100c6e.png)

#### 「地域」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/b9ab5590-b872-f3d8-1d90-2f7a1604ba2d.png)

#### 「管理」タブを選択し、「システムロケールの変更」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/455b152f-4c1f-88ec-314d-8e41d3ad0929.png)

#### 「ワールドワイド言語サポートで・・・」にチェックを入れ、OKを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/c9428bb8-7d2d-9ace-2ed8-150bef12ef2d.png)

#### 再起動を促されるので、再起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/3e798b84-e11e-e327-43e3-d05727907220.png)


再起動後、文字化けが直っていることが確認できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/5a6078f0-66b8-9411-05c4-99041ee14e34.png)
【oracle備忘録】NVLの使い方を誤った話

※この記事は、初心者プログラマの私が、業務で扱った内容に関連した箇所を
自身の学習用にまとめたものです。

##＜やりたいこと＞
・テーブルA.カラムa = 引数a
・テーブルA.カラムb = 引数b
を満たすレコードが存在するとき、変数cにテーブルA.カラムcを代入。
存在しないとき、変数cに'0'を代入し、変数cを返すファンクションを作成したい。
##＜登場する項目＞
・テーブルA
・テーブルA.カラムa
・テーブルA.カラムb
・テーブルA.カラムc
・引数a
・引数b
・変数c
##間違えたソース
~~~SQL
FUNCTION GET_VAL_C(
        引数a        IN        VARCHAR2  -- 引数aの型を定義
      , 引数b        IN        VARCHAR2  -- 引数bの型を定義
) RETURN VARCAR2
IS

変数c        VARCHAR2;  -- 変数cの型を定義

BEGIN
     SELECT NVL(T01.カラムc, '0')  -- T01.カラムcがNULLなら'0'、NULL以外ならT01.カラムcを変数cへ代入
       INTO 変数c
       FROM (SELECT カラムc
               FROM テーブルA
              WHERE カラムa = 引数a
                AND カラムb = 引数b)T01;

     RETURN 変数c;
END GET_VAL_C;
~~~
###◆間違えたポイント
FROMの括弧内のWHERE条件を満たさない場合、
FROM で参照するテーブルがNULLになってしまう。
(参照するテーブルがNULLということは、参照するレコードが存在しないということ)
NVLは、カラムの値のNULL判定であるため、レコード自体がNULLの場合は使用できない。


##修正後のソース
~~~SQL
FUNCTION GET_VAL_C(
        引数a        IN        VARCHAR2  -- 引数aの型を定義
      , 引数b        IN        VARCHAR2  -- 引数bの型を定義
) RETURN VARCAR2
IS

変数c        VARCHAR2;  -- 変数cの型を定義
件数         NUMBER;    -- 件数の型を定義

BEGIN
     -- WHERE条件で絞った場合のテーブルAのレコード数を件数へ代入
     SELECT COUNT(*)
       INTO 件数
       FROM テーブルA
      WHERE カラムa = 引数a
        AND カラムb = 引数b;

     -- 上記の条件で抽出したレコード数が0の場合、変数cに'0'を代入
     IF 件数 = 0 THEN
         変数c := '0';

     -- 上記条件で抽出したレコードが存在すれば、テーブルA.カラムcを変数cへ代入
     ELSE
         SELECT T01.カラムc
           INTO 変数c
           FROM (SELECT カラムc
                   FROM テーブルA
                  WHERE カラムa = 引数a
                    AND カラムb = 引数b)T01;
     END IF;
     RETURN 変数c;
END GET_VAL_C;
~~~
ADR: Raspberry Pi で HTTP/2 自宅ベクトルタイルサーバを立てる

Date: 2021-09-01
Status: implemented

# Context
里親ジオデータプロジェクト（Adopt Geodata project）では通常、生産したベクトルタイルは GitHub Pages を使って提供している。

しかし、生産したタイルの総量が　1GB を越えしてしまうとGitHub Pagesではホストできなくなる。

また、Raspberry Piでは例えばnginxでウェブサーバを立てることは可能であるが、多数のタイルを送付する場合にHTTP/1.1では送付が遅い印象が出る。

HTTP/2で送付できるようにすることが望ましい。

# Decision
Raspberry PiにUSB外付けディスクを接続し、nginxでサーバを立てる。

IPアドレスをDNSに登録してホスト名をつけ、Let's Encryptで証明書を取得し、nginxでHTTP/2をイネーブルした。`/etc/nginx/sites-enabled/default`の内容は次のとおり。

```
server {
  listen 80;
  root /mnt/hdd/docs;
  index index.html index.htm index.nginx-debian.html;
  server_name x.optgeo.org;
  location / {
    #auth_basic "access restricted";
    #auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
    try_files $uri $uri/ =404;
  }
}

server {
  listen 443 ssl http2;
  server_name x.optgeo.org;
  root /mnt/hdd/docs;
  ssl_certificate /etc/letsencrypt/live/x.optgeo.org/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/x.optgeo.org/privkey.pem;
  ssl_dhparam dhparam.pem;
  add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";
}
```

なお、複数のサイトをホストできるように、次のような形でシンボリックリンクを作るようにした。

```
ln -s /mnt/hdd/some_repository/docs /mnt/hdd/docs/some_repository
```

# Consequences
https://x.optgeo.org/hrlulc を稼働開始できた。

地図の立ち上がりが遅い理由は、https://x.optgeo.org/hrlulc/style.json のサイズが大きすぎることなのではないかという仮説を持っている。
UITextFieldDelegateのメソッド

## はじめに
今回はUITextFieldDelegateのメソッドについてまとめます．自分用のメモ目的です．
## 環境
Xcode 12.5.1
Swift 5.4.2
## UITextFieldDelegateのメソッド
### 1. textFieldShouldBeginEditing
```swift
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        return true
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|タップされたとき，入力可能になる直前|trueでテキスト入力可能，falseで入力不可|

### 2. textFieldDidBeginEditing
```swift
    func textFieldDidBeginEditing(_ textField: UITextField) {
        print(textField.text)//textFieldに入力された値をOptional型で出力
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|タップされて入力可能になったあと|テキストの値を取得|
### 3. textFieldShouldEndEditing
```swift
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        return true
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|キーボードのReturnキーが押されて入力が完了する直前|trueで編集を停止，falseはそのまま|
### 4. textFieldDidEndEditing
```swift
    func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
        print(textField.text)//textFieldに入力された値をOptional型で出力
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|キーボードが閉じたあと|テキストの値を取得|
### 5. textFieldShouldClear
```swift
    func textFieldShouldClear(_ textField: UITextField) -> Bool {
        return true
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|キーボードのClearキーが押されたとき|trueでクリア，falseは何もしない|
### 6. textFieldShouldReturn
```swift
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()//キーボードをを閉じる
        return true
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|キーボードのReturnキーが押されたとき|キーボードを閉じるなど|
### 7. shouldChangeCharactersIn
```swift
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return true
    }
```
|呼ばれるタイミング|できること|
|:---|:---|
|テキスト編集中|入力文字数の制限など|
## 参考
[[初心者向け]UITextFieldDelegate](https://programfromscratch.com/%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91uitextfielddelegate/)
AtCoderログ：0099 - ABC 216 B

# 問題

https://atcoder.jp/contests/abc216/tasks/abc216_b

## 問題文
> $N$ 人の人がいます。$i~(1 \le i \le N)$ 人目の人の姓は $S_i$、名は $T_i$ です。
> 同姓同名であるような人の組が存在するか、すなわち $1 \le i<j \le N$ かつ $S_i=S_j$ かつ $T_i=T_j$ を満たすような整数対 $(i,j)$ が存在するか判定してください。

## 制約
> ・$2 \le N \le 1000$
> ・$N$ は整数
> ・$S_i,T_i$ は英小文字のみからなる長さ $1$ 以上 $10$ 以下の文字列

# 回答
## 回答1 (AC)
2種類の vector 型変数 s, t に姓と名のデータを保持し、変数 i と j を i < j の範囲で変化させて、姓と名が一致する対があるかを調べていけば良いでしょう。$N \le 1000=10^3$ なので、繰返し回数は高々 $10^3*10^3=10^6$ なので処理可能です。コードは以下のようになりました。

```C++:abc216b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;

  vector<string> s(n), t(n);
  for ( int i=0; i<n; i++ ) {
    cin >> s.at(i) >> t.at(i);
  }

  string answer = "No";
  for ( int i=0; i<n; i++ ) {
    for ( int j=i+1; j<n; j++ ) {
      if ( s.at(i)==s.at(j) && t.at(i)==t.at(j) ) {
        answer = "Yes"; 
        break;
      }
    }
  }

  cout << answer << endl;
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc216/tasks/abc216_b/editorial) → [公式解説](https://atcoder.jp/contests/abc216/editorial/2558)
回答1と同じ方針ですが、姓と名のデータを読み込む度にそれまでに読み込んだデータと一致するかを調べており、高速化がなされていました。

## [AtCoder の解説](https://atcoder.jp/contests/abc216/tasks/abc216_b/editorial) → [ユーザ解説](https://atcoder.jp/contests/abc216/editorial/2570)
姓と名をまとめて集合型の変数に保存していき、要素数が n より小さいかどうかで重複のありなしを判定していました。なるほど。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0098 - ABC 216 A](https://qiita.com/RoadLynton/items/a42013a870778a8f84f9)
- 前の記事 → [AtCoderログ：0100 - 記事が100個目になりました](https://qiita.com/RoadLynton/items/4a6bfd6815fc29568a74)
C++14 で variant-lite で T, std::vector<T> な型を扱いたいメモ

## 背景

C++14 で variant-lite https://github.com/martinmoene/variant-lite を使うとします.
C++17 なら標準の `std::variant`.

グラフィックス関係のデータ構造だと,

`float, int, std::vector<float>, std::vector<int>, ...` みたいな

`T`, `std::vector<T>` な型を持つ変数がほしいときがあります. T は ~10 型くらい.
(e.g. ポリゴンの頂点データなど)


また, グラフィックス関係のコードだと実行時の処理速度も重要です.
`std::any` だと処理速度が遅くなりそうなのでグラフィックス系のアプリには向かないという問題があります(特に `std::vector` 型の変数の場合)

`std::variant` では, しかしうまい指定方法はないようです.

`using Ty = std::variant<float, int, vector<T>>` にすると, 型 T が解決できません(erase できない).

```c++
using BasicTy = std::variant<float, int>;
using Ty = std::variant<float, int, std::vector<BasicTy>>;
```

だと, `vector` には `BasicTy` が格納されるため, `std::vector<float>` なデータを memcpy で処理するというのもできません.

結局は実質一つの variant に展開となるでしょうか...

```c++
using ArrayTy = std::variant<std::vector<float>, std::vector<int>>;
using Ty = std::variant<float, int, ArrayTy>;
```

代入は ArrayTy に一度変換しなくてもうまく行きます.

```C++
Ty a;
a = 3.14f; // float

std::vector<int> iv;
a = iv; // OK
```

取得する場合は, 一度 `ArrayTy` にキャストしないとだめっぽい(`variant-lite` で確認)

```c++

Ty a;

std::vector<int> iv;
a = iv;

if (auto pa = nonstd::get_if<std::vector<int>>(&a)) {
  // fail
}

if (auto pa = nonstd::get_if<ArrayTy>(&a)) {
  if (auto p = nonstd::get_if<std::vector<int>>(pa)) {
    // got it
  }
}
```

## その他

取りうる型が ~20 個だとしても, やはりそこそこテンプレートのコンパイルで時間かかる印象があります.

そこまで型安全な Union が必要でなければ, オーソドックスに void ポインタ(or uint8_t ポインタ)で reinterpret_cast で対応でもよいかもです(コードがちょっと冗長になりますが)