OmniAICreator/Qiita-1.07M huggingface dataset:
MS Learn の勉強1･･･「DAXの概要」の序文

どのように勉強したかの備忘録です。

https://docs.microsoft.com/ja-jp/learn/modules/create-measures-dax-power-bi/1-introduction

一文ずつ読んでいきます。

**　Data Analysis Expressions (DAX) は、計算列、メジャー、およびカスタム テーブルを作成するために Microsoft Power BI 全体で使用されるプログラミング言語です。**

(1) 何者？
　**プログラミング言語**
(2) 何に使う？
　**計算列、メジャー、カスタムテーブルを作成するため**
(3) どこで使う？
　**Microsoft Power BI 全体で使用**

所感：
　なるほど、プログラミング言語だったのですね。
　ですが、C# や VBA といったものとは少々異なるような気がします。
　早速よくわからない言葉が出てきました。
　　・**計算列**
　　・**メジャー**
　　・**カスタムテーブル**
　これらを作成すると、きっと何かイイことがあるのでしょう。
　それが何かは今はわかりませんが、いずれわかるようになると信じましょう。
　MS Power BI 全体で使用･･･って、全体って何？
　いまのところこんな所で次に進みます。

　**関数、演算子、および定数を集めたもので、これらを数式または式の中で使用して、1 つまたは複数の値を計算して返すことができます。**

(4) 構成
　関数、演算子、定数を集めたもの
(5) 成果
　計算された値を返してくれる

　**DAX を使用すると、計算とデータ分析に関する多数の問題を解決できます。**

(6) いいこと
　計算とデータ分析に関する問題を解決できる。
　別の言い方をすると、データを基にした問題を抱えていない人にはピンとこないのかも。

　**これは、既にモデル内に存在しているデータから新しい情報を作成するのに役立ちます。**

(7) もっといいこと
　今あるデータから新しい情報を得ることができる。
　見えなかったものが見えてくるということでしょうか。

　**Power BI では、さまざまな計算手法と関数を使用してメジャーや計算列を作成できます。主として、これらの手法を使うことで同様の結果を得られるようになりますが、カギを握るのはそれを適用する方法と条件を理解することです。どの手法を、どのように、いつ使用するかについて基本的な知識を持つことで、堅牢かつパフォーマンスに優れたデータ モデルを作成できるようになります。**

(8) さらにいいこと
　技術を身につけることで、さらにすぐれた「何か」を得られるかも。
　このあたりになってくると、問題意識と解決への熱量が関係してくるような気がします。
　ビジネスの渦中にいて、解決責任を求められている人に向いた道具と思われます。

とりあえずここまで。

[→次の勉強へ](https://qiita.com/max_kamitoda/items/cc6875fc56fc513715b6)
Pythonでやってみた設計パターンの実装

# 値オブジェクトの実装

---

## 構成

- 自己紹介
- 値オブジェクトとは
- マネーの実装
- まとめ

---

## 自己紹介

- カキギカツユキ
- ネット通販の会社で業務システムを開発運用しています
- あと、売掛金・買掛金管理の管理業務しています
- その前はシステムエンジニアとしていろんな会社のシステム開発をしていました

---

## 値オブジェクトとは

> IDに基づいた等価性を確保していない、MoneyやDate Rangeなどのシンプルな小型オブジェクト。
>
> エンタープライズアーキテクチャパターン

> 値の種類ごとに専用の型を用意するコードが安定し、コードの意図が明確になります。このように、値を扱うための専用クラスを作るやり方を値オブジェクト(Value Object)と呼びます。
>
> 現場で役立つシステム設計の原則

> エンティティの同一性を追跡するのは本質的なことだが、それ以外のオブジェクトに同一性を与えてしまうと、システムの性能を損なうことになり、分析作業が増え、さらに、すべてのオブジェクトの見た目が同じになってしまうことでモデルが台無しになりかねない。
>
> エリック・エヴァンスのドメイン駆動設計

---

## マネーの実装

```py
import unittest
import hashlib


class Money:
    def __init__(self, amount, currency) -> None:
        self.__amount = amount
        self.__currency = currency

    def __str__(self) -> str:
        if self.__currency == 'JPY':
            return f'¥{self.__amount}'
        elif self.__currency == 'USD':
            return f'${self.__amount}'
        else:
            return f'{self.__amount}'

    def __eq__(self, other: object) -> bool:
        return(self.__amount == other.__amount and self.__currency == other.__currency)

    def __hash__(self) -> int:
        encoded_currency = int(hashlib.sha256(
            self.__currency.encode("utf-8")).hexdigest(), 16) % (10 ** 8)
        return hash(self.__amount + encoded_currency)

    def add(self, other: object) -> object:
        if self.__currency != other.__currency:
            raise ValueError('異なる通貨では計算できません')
        return Money(self.__amount + other.__amount, self.__currency)


class TestMoney(unittest.TestCase):
    def setUp(self) -> None:
        self.千円 = Money(1000, 'JPY')
        self.一万円 = Money(10000, 'JPY')
        self.千ドル = Money(1000, 'USD')

    def test_金額を表示する(self):
        self.assertEqual(str(self.千円), '¥1000')
        self.assertEqual(str(self.一万円), '¥10000')

    def test_外貨金額を表示する(self):
        self.assertEqual(str(self.千ドル), '$1000')

    def test_金額は等しい(self):
        self.assertEqual(self.千円, Money(1000, 'JPY'))
        self.assertNotEqual(self.千円, self.千ドル)

    def test_通貨を保持している(self):
        財布 = {self.千円}
        self.assertTrue(self.千円 in 財布)
        self.assertFalse(self.千ドル in 財布)

    def test_金額を合計する(self):
        二千円 = self.千円.add(Money(1000, 'JPY'))
        self.assertEqual(str(二千円), '¥2000')
        with self.assertRaises(ValueError, msg='異なる通貨では計算できません'):
            self.千ドル.add(Money(1000, 'JPY'))



unittest.main(argv=[''], verbosity=2, exit=False)
```

---

## まとめ

- 正直めんどくさい
- 慣れてくると普通に便利
- 基本形を指で覚える

---

## 参照

- エンタープライズアプリケーションアーキテクチャパターン マーチン・ファウラー  (著), 株式会社テクノロジックアート (翻訳), 長瀬嘉秀 (翻訳, 監修)
- 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法 増田 亨  (著) 
- エリック・エヴァンスのドメイン駆動設計 Eric Evans (著), 和智右桂  (翻訳), 牧野祐子 (翻訳), 今関剛 (監修)
コンソールアプリ.NET 5.0でZXing.NETを使ったQRコード読み取り

# 目的
現在最新環境でZXing.NETを使ったWindowsのコンソールアプリでQRコードを読み取る。
QRコードが含まれた画像ファイルをコマンドライン引数で指定するようにする。

# 前提条件
+ Visual Studio 2019でC# / .NET 5.0 / コンソールアプリ　で新規プロジェクト作成済状態

## ライブラリ追加

<dl>
  <dt>NuGetで以下の２つのライブラリをインストール。</dt>
  <dd>ZXing.NET ver.0.16.6(2020/10/9版)</dd>
  <dd>System.Drawing.Common (最新の安定板)</dd>
</dl>

## ソースコード作成
Hello Worldアプリをベースに例えば　こんな感じに。

```Program.cs
using System;
using System.Drawing;
using ZXing;

namespace namespaceHogeHoge
{
    class Program
    {
        static void Main(string[] args)
        {
            // load a bitmap
            Image bmpImg = Bitmap.FromFile(args[0]);
            try
            {
                Bitmap bitmap = new Bitmap(bmpImg);
                BarcodeReader reader = new BarcodeReader();
                Result result = reader.Decode(bitmap);
                Console.WriteLine("'" + result.ToString().Trim() + "'" + "was found.");
            }
            catch (Exception)
            {
                Console.WriteLine("Image not found");
            }
        }
    }
}
```

## ビルドして実行してみる
おわり
3.7(標準) 負の二項分布

## 方針

負の二項分布について書く．X~NB(r,p)のとき，Xは「ベルヌーイ試行がr回成功するまでにX回失敗する」という確率変数である．確率密度関数は次の通り．二項係数の左下の添字に-1があるのは，最後は必ず成功なため．

```math
f_X(x)={}_{x+r-1}C_xp^r(1-p)^x
```

積率母関数は，

```math
\begin{align}
M_X(t)&= \sum_{x=0}^\infty{}_{x+r-1}C_xp^r\{e^t(1-p)\}^x\\
&= p^r\{1-e^t(1-p)\}^{-r}\sum_{x=0}^\infty{}_{x+r-1}C_x\{1-e^t(1-p)\}^r\{e^t(1-p)\}^x\\
&= (\frac{p}{1-e^t(1-p)})^r
\end{align}
```

問題は，負の二項分布が変数変換によってカイ二乗分布に収束することを示すものである．カイ二乗分布については5.1で詳しく書く予定．自由度mのカイ二乗分布に従う確率密度関数Yの積率母関数は，

```math
\begin{align}
M_Y(t)&= \int_0^\infty \frac{(\frac{1}{2})^{m/2}}{\Gamma(\frac{m}{2})}y^{\frac{m}{2}-1}\exp\{(t-\frac{1}{2})y\}dy\\
&= \frac{(\frac{1}{2})^{m/2}}{\Gamma(\frac{m}{2})}\frac{\Gamma(\frac{m}{2})}{(\frac{1}{2}-t)^{m/2}}\int_0^\infty \frac{(\frac{1}{2}-t)^{m/2}}{\Gamma(\frac{m}{2})}y^{\frac{m}{2}-1}\exp\{-(\frac{1}{2}-t)y\}dy\\
&= (\frac{1}{1-2t})^{m/2}
\end{align}
```

である．負の二項分布から変数変換したYと，カイ二乗分布の積率母関数が一致することを示せば良い．負の二項分布の積率母関数にはexpが含まれているのにカイ二乗分布のそれには含まれていないことから，expは漸近展開で近似しそう，と見通しを立てる．

ちなみに，この手の「確率変数がある条件のもとある分布に収束する」ことを示す問題は積率母関数をゴリゴリ変形すれば大体なんとかなる．5章で出てくる中心極限定理も，積率母関数の変形で証明する．

## 答案

```math
\begin{align}
&X\sim NB(r,p)\ \Rightarrow 2pX\\
&Z\sim \chi_{2r}^2
\end{align}
```

である時，YとZの積率母関数は次のようになる．

```math
\begin{align}
M_Y(t)&= \mathbb{E}_{X\sim NB(r,p)}[e^{tY}]\\
&= \mathbb{E}_{X\sim NB(r,p)}[e^{2ptX}]\\
&= \{\frac{p}{1-e^{2pt}(1-p)}\}^r\\
&= \{\frac{1}{\frac{1}{p}-e^{2pt}(\frac{1}{p}-1)}\}^r\tag{1}\\
M_Z(t)&= \mathbb{E}_{Z\sim\chi_{2r}^2}[e^{tZ}]\\
&= \int_0^\infty \frac{(\frac{1}{2})^r}{\Gamma(r)}z^{r-1}\exp\{-(\frac{1}{2}-t)z\}dz\\
&= (\frac{1}{1-2t})^r\tag{2}
\end{align}
```

p→0の時，(1)式が(2)式に収束することを示す．指数分布を漸近展開すると，

```math
e^{2pt}=1+2pt+\mathcal{o}(p)
```

より，

```math
\begin{align}
(1)&= \{\frac{1}{\frac{1}{p}-(1+2pt+\mathcal{o}(p)(\frac{1}{p}-1)}\}^r\\
&= \{\frac{1}{1-2t+\mathcal{o}(p)}\}^r\\
&\approx (\frac{1}{1-2t})^r,\ \ \ as\ \ p\rightarrow 0
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【小ネタ】Windows環境でgo get がプロキシの関係で入らないとき


# はじめに

つまづいたのでメモ

## Vesrion

go version go1.14.4 windows/386

## 何が起きたか

プロキシ環境下で go getするとうまくいかない。

> A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

Git の設定やVisualStudioCodeの設定を見直してもうまくいかない。

## どうしたか

コマンドプロンプトを開いて以下の環境変数を宣言

```
SET http_proxy=プロキシURL:ポート番号
SET https_proxy=%http_proxy%
```

そして、go get

```
$ go get -v github.com/labstack/echo
go: downloading github.com/labstack/echo v1.4.4
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: github.com/labstack/echo upgrade => v3.3.10+incompatible
go: finding module for package github.com/labstack/gommon/log
go: finding module for package github.com/labstack/gommon/color
go: downloading github.com/labstack/gommon v0.3.0
go: finding module for package golang.org/x/crypto/acme/autocert
go: downloading golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
go: found github.com/labstack/gommon/color in github.com/labstack/gommon v0.3.0
go: found golang.org/x/crypto/acme/autocert in golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
go: downloading github.com/mattn/go-colorable v0.1.2
go: downloading github.com/mattn/go-isatty v0.0.9
go: downloading golang.org/x/net v0.0.0-20210226172049-e18ecbb05110
go: downloading github.com/valyala/fasttemplate v1.0.1
go: downloading golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading golang.org/x/text v0.3.3
github.com/mattn/go-isatty
github.com/valyala/bytebufferpool
golang.org/x/text/transform
github.com/mattn/go-colorable
github.com/valyala/fasttemplate
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
golang.org/x/crypto/acme
github.com/labstack/gommon/color
golang.org/x/text/secure/bidirule
github.com/labstack/gommon/log
golang.org/x/net/idna
golang.org/x/crypto/acme/autocert
github.com/labstack/echo

```

うまくいった！

## おわり
[Unity]HMDの右目にキャラクターが表示されない

# やったこと
![スクリーンショット 2021-07-27 162825.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546120/186eb2ca-bc9f-167a-405e-10657895adc1.jpeg)


- Project Setting > XR Plug-in Managerで設定をチェック。
- Stereo Rendering Mode をMulti Passに変更。

# 原因
キャラクターに使われているshaderがsingle instance viewに対応してない。
ex) VRMのMToon shaderなど。
アジア太平洋地域におけるAI成熟度のトレンドとベストプラクティス

世界中で、組織の戦略やロードマップが世界的な出来事の変化によって揺れ動いていますが、その中でAIはどのような役割を果たしているのでしょうか。 企業は、[激動の時代に俊敏性を高めるためのソリューションとして、AIへの取り組みに大きく舵を切っている(英語)](https://pages.dataiku.com/white-paper-enterprise-ai-for-business-preparedness)ことが判りました。これはアジア太平洋地域（APAC）も例外ではありません。

IDCとの提携による2020年版InfoBriefのリリースと2021年版IDC InfoBriefのリリースの間に、AIジャーニーを開始する企業の数は2倍になっていると見ています。さらに、すでにAIジャーニーを開始していた企業については、より高いAI成熟度を示し、実験的な試みを減らし、繰り返しの施策を増やし、より調整の取れた方法を取っているといえます。

 *[→ 無料ダウンロードはこちら：2021 IDC InfoBrief『人工知能の実践導入 − 確かな成果を達成するために』](https://pages.dataiku.com/apac-dataiku-idc-infobrief-2021-japanese)*

ここでは、2021年IDC InfoBriefのトップハイライトとして、2021年から2022年、おびそれ以降のAPACのAI成熟度のトレンドとベストプラクティスをご紹介します。


####ビジョン（またはユースケース）の欠如はない
世界的な健康危機が発生する前、リーダーたちはAIを自分の事業のための戦略的投資と考えていました。その動機は、APACの地域や業界によって異なりますが、全体的には、生産性の向上、アジリティーの改善、顧客満足度の向上などが期待されていました。2021年、未曾有の世界的な経済危機に直面しても、この未来への眼差しと投資への意欲は比較的変わっていません。

明確に言うと、すべての企業がAIに投資しているわけではありません。APACでは、「AIを使わない」組織の数は依然として高いままです（69％ vs. 2020年には80％）。しかし、投資している企業にとっては、有益なユースケースには事欠きません。APACでAIに投資している企業の上位のユースケースは、複数のビジネスラインや業界にまたがる広範で水平なプロジェクトから、よりカスタマイズされた垂直方向に特化したユースケースまで多岐にわたっています。
![APAC AIユースケース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/a95547ac-ae8c-c44a-20e3-44a19e634e21.png)


####複雑さが増すにつれ、プロセスの必要性も並行して増加
APACの2021年の最も重要なトレンドの一つは、AIシステムの体系的な実行と継続的な改善を保証するプロセスの重要性が高まっていることです。  AIに投資している企業の全体的な成熟度が高まり、2020年にはステージ1や2だった企業の半数が、現在はステージ3や4になっているという状況を考えれば、これは理にかなっていることです。 

運用中のモデルが増えるということは、より複雑になるということであり、"AI導入の効果的なコミュニケーション、トラッキング、学習、適応のために、データ、モデル、ビジネスオペレーションを標準化し、監視する"必要性が出てきます。すべてはリスクを軽減することに帰結しますが、その答えの一部は、[AIのガバナンス(英語)](https://pages.dataiku.com/ai-governance-capgemini)が健全であることを保証することです。
![モデル開発と実働の課題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/603a4008-5a76-4ecf-3aa8-821a6ef7be8f.png)


プロセスの成熟度を高めるのと同時に、AIのための組織構造や[運用モデル](https://pages.dataiku.com/coe-best-practices-jp)も変化していきます。集中型のセンター・オブ・エクセレンス（CoE）は、知識やAIのノウハウを組織全体に分散させるハブ・アンド・スポーク型に自然と変わっていきますが、集中型のモデルはまだ人気があります。例えば、2019年にはAIスキルを持つスタッフのうち、CoEなどのグループに常駐しているのはわずか24%に過ぎなかったところが、現在ではAIスキルを持つスタッフの44％がそうなっていいます。

####テクノロジーは依然として重要な要素であり、唯一の要素ではない
データ、人、テクノロジー、プロセスの役割は、組織の成熟度によって異なります。AIへの取り組みを始めたばかりの企業や成熟した企業では、人材とプロセスが重要な役割を果たし、データは企業がより最適化された段階に到達するために重要な役割を果たします。例えば、AIに投資しているAPACの企業のデータ準備度の平均スコアは、5点満点中2.6点に過ぎず、改善の余地が大きいことを示しています。

テクノロジーに関していえば、AIに投資している組織の43%が、Dataikuのようなエンタープライズプラットフォームを導入してリソースを統合しています。これに加えて、[クラウドはAIテクノロジーの分野において(英語)](https://blog.dataiku.com/ai-ready-architecture-in-the-cloud)、より優れたデータモビリティー、相互運用性、スケーラビリティーを提供するという付加価値があります。エンタープライズアナリティクスおよびAIプラットフォームの導入に加えて、エンドツーエンドで機能するテクノロジーを採用し、[AIをチームスポーツにする(英語)](https://techcrunch.com/sponsor/dataiku/ai-is-a-team-sport-heres-how-you-can-build-a-winning-squad/)ことは、APACをはじめとする世界各国の組織にとってのベストプラクティスです。 



**<font color="Teal">APACにおけるAI成熟度のトレンドとベストプラクティスについて、より詳細をご覧いただけます。公開されたばかりのIDC InfoBriefの全文をご覧ください。<font>**
**[レポートはこちら](https://pages.dataiku.com/coe-best-practices-jp)**




*原文：[Trends & Best Practices for AI Maturity in APAC, July 2, 2021](https://blog.dataiku.com/ai-trends-apac)*
javascriptの||と&&について理解する

##||(パイプライン二つ)の意味
左側がfalseなら右側を返す

```javascript
const num = null;
const fee = num || "金額未設定です";
console.log(fee); //　金額未設定です
```
#####javascriptのfalsyな値の一覧
* false
* 0
* -0
* ""
* null
* undefined
* Nan

##&&(アンパサンド二つ)の意味
左側がtrueなら右側を返す

```javascript
const num2 = 100;
const fee2 = num2 && "何か設定されました";
console.log(fee2); //"何か設定されました"
```
【CSS】 background-size: cover; 画像周りに余白

#発生した問題
メイン画像を貼った時に、画面いっぱいに表示させようと思ったのだが、どうしても周りにスペースができてしまった。

#解決法
```css
body {
   margin: 0;
   padding: 0;
}
```

#原因
原因は「user agent stylesheet」と呼ばれるもの。

「user agent stylesheet」とは、ブラウザ毎に設定されているデフォルトのCSS設定のこと。

これがあると、自分が設定した覚えのないCSSもブラウザによって反映されることがある。

#対策
自分が設定した覚えのないCSSもブラウザによって反映されることがあるのでリセットCSSで対策する。
【Google Cloud Day'21】「救急医療 ICT における Google Cloud の利活用」を視聴して

救急医療 ICT における Google Cloud の利活用
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d2-ml-03
"過酷を極める医療現場。その過酷さの要因の 1 つが事務処理業務。この事務処理業務が音声入力により、劇的に改善される可能性が今社会実装されていっております。
本セッションでは、医師でありエンジニアである TXP Medical 代表取締役社長の園生が、医療現場で音声入力がどう活用されているのかを現場の声を交えながら語ります。"

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>救急現場などでは、雑音などが多いとおもいますが、正確に音声を入力することは大変だったとおもいます。何か工夫された点などありますか</th>
		<td>音声入力のマイク性能自体は、iphone等のスマホデバイスはかなり優秀です。当社で独自に工夫しているのは、音声入力テキストをそのまま記録に残すのではなく、その中の重要な情報のみ抽出するという「コマンド入力」です</td>
	</tr>
	<tr>
		<th>救急医療現場で紙が残ってるのはごく一部の病院ですか？電子カルテ等で電子化されていると思っていたのですが。。。</th>
		<td>救急車を年間2000台以上受け入れている病院が、救急車全体の90%以上をカバーしています。これらの病院はほ100%電子カルテを導入していますが、ほぼ100%の病院で、紙のメモで救急車情報を記載し、ホワイトボードに貼り付ける運用をしています。</td>
	</tr>
	<tr>
		<th></th>
		<td>この理由は、氏名や生年月日、保険証を確認できない患者はカルテに登録できないという構造的問題や、保険証の登録がそもそも病院到着後何分もかかることがあるというのが原因です。そもそも電子カルテでカバーできない業務が救急では大量に発生します</td>
	</tr>
	<tr>
		<th>医療用語などのは別途学習させた、モデルを開発されたのでしょうか</th>
		<td>医療用語は、人力での辞書構築チームを社内に有しています。つまり、自社開発モデルです</td>
	</tr>
	<tr>
		<th>シーンごとにテキスト置換をさせるモジュールについて、もう少しおしえてください</th>
		<td>「バイタル入力」「処置入力」などかなりspecificなシーンごとに、使う用語が限定できるため、この特徴を利用して高精度なテキスト置換をしています</td>
	</tr>
	<tr>
		<th>医療用語の学習データはどのように準備されたんでしょうか。</th>
		<td>NEXT Stage ER導入病院との共同研究契約にて、数十万人の実診療データを用いて、医療関係者の10人程度の辞書チームと協働して開発しています</td>
	</tr>
</table>


<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>会社概要</th>
		<td>&quot;</td>
	</tr>
	<tr>
		<th>TXP Medical株式会社&quot;</th>
	</tr>
	<tr>
		<th>病院の課題</th>
		<td>救急では、書くほうが早いのでデジタル化していない情報が散在している</td>
	</tr>
	<tr>
		<th>解決策</th>
		<td>救急専用アプリ。音声入力などができる</td>
	</tr>
	<tr>
		<th>ドクターカーでの利用</th>
		<td>音声入力は医療業界で理想的な結果が出ないことが多い。そこを独自の分析で正確性をたかめている</td>
	</tr>
	<tr>
		<th>なぜGCPか？</th>
		<td>ここは触れられてなかった</td>
	</tr>
</table>


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/42cc268e-b32e-c0dd-176f-e3b890b42446.png)


![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2ae2faf3-e14e-4134-ae74-54a2b5ce8919.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/c921c789-1ccb-5fb4-359c-e52518d75d4b.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/2b9bce93-6784-4e50-ac7b-85866bacbcbc.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/cddb442c-6118-0c62-017d-81ff33cf1779.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/44099319-dca7-4de8-c345-11ded85a2105.png)
mapやfilterを使用した配列の処理

##map
繰り返し処理を行うメソッド

#####配列を受け取って、新しい配列を作る

```javascript
const nameArray = ['ゆう', '吉田', '佐藤']
const nameArray2 = nameArray.map((name) => {
  return name;
})

console.log(nameArray2); // ['ゆう', '吉田', '佐藤']
```
#####配列を順番に表示する
```javascript
const nameArray = ['ゆう', '吉田', '佐藤'];

//一行で済む場合はブラケット{}を省略できる。
nameArray.map((name) => console.log(name)); // ゆう, 吉田, 佐藤
```

#####map関数に順番の概念を持たせる
第二引数を指定することで、インデックス番号を代入できる

```javascript
nameArray.map((name, index) => console.log(`${index + 1}番目は、${name}です`));

/*1番目は、ゆうです
 *2番目は、吉田です
 *3番目は、佐藤です*/
```
#####map関数内に条件分岐を実装する
```javascript
const newNameArray = nameArray.map((name) => {
  if (name === "ゆう") {
    return name
  } else {
    return `${name}さん`
  }
})

console.log(newNameArray);
/*ゆう
 *吉田さん
 *佐藤さん*/
```

##filter
条件付きの繰り返し処理を行い新しい配列を作るメソッド

```javascript
//奇数の値のみを取り出して新しい配列を作る
const newNumArray = numArray.filter((num) => {
  return num % 2 === 1;
})

console.log(newNumArray); //[1, 3, 5]
```
【Google Cloud Day'21】「『学びを、もっと、新しく。』 〜 AI で進化するスタディサプリの学習体験 〜」を視聴して

『学びを、もっと、新しく。』 〜 AI で進化するスタディサプリの学習体験 〜
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d2-ml-02
2020 年度はコロナ禍の到来によって教育業界での DX も進み、オンライン学習がより身近になった 1 年でした。スタディサプリもより良い学習体験をお届けするべく、発話判定など GCP を活用した AI 機能を実現し進化を遂げています。本セッションでは、AI Platform、BigQuery、Speech-to-Text といった機能の活用事例とともに、裏側でどのような工夫をしているのかについてご紹介いたします。

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>音声認識の前処理・後処理で工夫されている点について教えて下さい</th>
		<td>前処理としては、ピッチの調整やローパスフィルタなどいくつかヒューリスティックなアプローチを試して効果がありそうなものを入れています。また後処理も、smartphone と smart phone のように期待する結果と異なってしまうところの名寄せなどをログを見ながら継続的な改善を実施しています（採点処理の部分）</td>
	</tr>
	<tr>
		<th>字幕機能について、校正なしの状態でどの程度の音声認識精度が出ているのでしょうか？</th>
		<td>インドネシア語については肌感７割程度の精度となっています。数式や英語のように多言語が混ざることなどもあり、教育コンテンツならではの難しさがあるためと考えています。</td>
	</tr>
	<tr>
		<th>音声認識結果の利用方法ですが、字幕生成には人手修正を入れていますが、検索用には人手修正を入れていないように見えました。分けた理由などはありますでしょうか。</th>
		<td>ご指摘の通り、現状パイプラインの実装上分かれてしまっているのですが、今後修正して校正後に ES の更新をかけて検索にも反映されるようにしていく予定です。ご質問ありがとうございます。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>スタディサプリについて</th>
		<td>AIによる学習効率最適化をどのようにやっているかを、本講演で説明</td>
	</tr>
	<tr>
		<th>AIの役割</th>
		<td></td>
	</tr>
	<tr>
		<th>講義道が検索機能</th>
		<td></td>
	</tr>
	<tr>
		<th>字幕表示機能</th>
		<td></td>
	</tr>
	<tr>
		<th>スピーキングフィードバック機能</th>
		<td></td>
	</tr>
	<tr>
		<th>学習レコメンデーション機能</th>
		<td></td>
	</tr>
	<tr>
		<th>データ分析基盤について</th>
		<td></td>
	</tr>
	<tr>
		<th>GCPの効果</th>
		<td></td>
	</tr>
</table>


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4552a771-3bc8-776f-939b-d33411d30a09.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/39588d74-f1c6-ba4f-091b-be58d88c1aa9.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/23614c97-ff02-888c-4df4-b7a618907a91.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3d4e162f-abc1-03b5-39df-7ba207c9e8b9.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8f2ec0df-c41f-ccdb-6593-50f80ff8d149.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/c1f76bf9-cf3d-dfe3-1b58-bb38279abcdd.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a9a75862-0aae-932e-9a7f-60584cc022ed.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/08e2b6e3-0525-82c0-e16d-052696a13a64.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/6411b84d-378c-c31b-649f-9bf94b931339.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b7c5d508-d025-d678-8f09-fbe0634e5ebe.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3f52d250-c1a0-8ce1-51d7-21fecc9dddd0.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/3fb6390f-b39e-11f4-b82c-36b775023338.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d6162c33-5025-9549-3307-e75adacf02cf.png)
備忘：MySQLでデータベースの中身を確認する方法

よく忘れて、探すので備忘

本当にデータが登録されているかとかで使う

##まずはターミナルからMySQLに接続する

ルートで接続

```sql
mysql -u root
本当は危険
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 276
Server version: 5.6.51 Homebrew
```
参考
https://www.dbonline.jp/mysql/connect/index3.html

##データベースを選択する

```sql
use cooklog; 

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
```
使うデータベースがわからない場合は
`databese.yml`で確認

```.yml
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: cooklog_development
  pool: 5
  username: kiyomasa

  host: localhost

test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: cooklog_test
  pool: 5
  username: kiyomasa

  host: localhost
```

参考：https://www.dbonline.jp/mysql/database/index3.html

##テーブルを確認

```sql
mysql> SELECT * FROM favorites;
+----+---------+-----------+----------------------------+----------------------------+
| id | user_id | recipe_id | created_at                 | updated_at                 |
+----+---------+-----------+----------------------------+----------------------------+
|  1 |       1 |        23 | 2021-07-26 23:38:18.303379 | 2021-07-26 23:38:18.303379 |
+----+---------+-----------+----------------------------+----------------------------+
1 row in set (0.00 sec)

mysql>  SELECT * FROM users;
+----+------------+-------------------+--------------------------------------------------------------+----------------------------+----------------------------+
| id | name       | email             | password_digest                                              | created_at                 | updated_at                 |
+----+------------+-------------------+--------------------------------------------------------------+----------------------------+----------------------------+
|  1 | sample1_18 | wanko1@prog-8.com | $2a$12$WbBJmW91Y4qDNBqy/h17A.XHpknRAD4NHtgXGO6YURP3U6IuKUMeS | 2021-05-09 04:45:52.315260 | 2021-07-25 04:43:25.422336 |
|  3 | aaaaa      | wanko5@prog-8.com | $2a$12$PBkaJE.sc5VI2Nl5UsBLle.rmUbmxkz0NDTSUXoaOcQ4MtKGc1ox. | 2021-06-21 22:02:01.573754 | 2021-06-21 22:02:01.573754 |
|  4 | aaaaa      | wanko6@prog-8.com | $2a$12$jKle2Pi5vIrNQ3tacVeo8ugTpy/IzR37Heyq3q76pvlmc3.joWl2G | 2021-06-23 22:18:20.534653 | 2021-06-23 22:18:20.534653 |
+----+------------+-------------------+--------------------------------------------------------------+----------------------------+----------------------------+
4 rows in set (0.01 sec)
```

参考：https://oreno-it3.info/archives/853
「サービスメッシュ」と「APIゲートウェイ」の違いについての私の理解

# 我々にはサービスメッシュが必要なのでは！？ 

とりあえず、こちらの記事を読み、3ページのチートシート（診断フローチャート）をご覧ください。

[APIゲートウェイとサービスメッシュの違い：一般記事｜gihyo.jp … 技術評論社](https://gihyo.jp/dev/column/01/prog/2020/04/api_servicemesh)

# 「サービスメッシュ」と「APIゲートウェイ」はどう違う？

サービスメッシュもAPIゲートウェイも、

- 認証
- ロードバランス
- 通信経路

といった関心事をアプリケーションから分離し、アプリケーションを簡素化する・システムを効率化するという点では似ています。

しかし、両者は適用される領域が異なります。

サービスメッシュとは「サービス内（East-West）」、事実上は「K8Sクラスターの中」での通信に関するデザインパターンです。代表的なツールとしては Istio があります。

一方、APIゲートウェイは、サービスの間（North-South）の通信に関するデザインパターンです。代表的なツールとしては Amazon API Gateway, Ambassador, Kong などがあります。
javascriptのスプレッド構文

##スプレッド構文とは

配列を展開したり、まとめたりすることができる構文


#####配列を展開する
```javascript
const array = [1, 2]

console.log(array); // [1, 2]
//スプレッド構文
console.log(...array); // 1, 2

//↑は↓と同じことを行っている
console.log(array[0], array); // 1, 2
```

#####分割代入の際に配列を部分的にまとめる
```javascript
const array2 = [1, 2, 3, 4, 5];
const [num1, num2, ...array3] = array2
console.log(num1); // 1
console.log(num2); // 2
console.log(...array3); // [3, 4, 5]
```

#####配列のコピーや結合
```javascript
const array4 = [10, 20];
const array5 = [30, 40];

const array6 = [...array4];
console.log(array6); //[10, 20]
array6[0] = 100;　//配列の中身を変更
console.log(array6); //[100, 20]　変わってる！
console.log(array4); //[10, 20]　参照先の配列は変わっていない！

const array7 = [...array4, ...array5];
console.log(array7); //[10, 20, 30, 40]
```

スプレットじゃなくてそのまま代入すればいいじゃん！

```javascript
const array8 = array4;
console.log(array8); //[10, 20]
```

確かに代入されてる！けど...

```javascript
const array4 = [10, 20];

const array8 = array4;
array8[0] = 100;
console.log(array8); //[100, 20]　変わってる！
console.log(array4); //[100, 20]　参照先の中身まで変わってる！
```

中身を変更すると、参照先の配列の中身も変わっている！！（参照わたし）
だから、配列のコピーや結合を行う際はスプレッド構文を使用する
Before starting UiPath:ロボ開発で作る資料

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

★★★この記事はUiPathブログ発信チャレンジ2021サマー、7/27の記事です。★★★

今回は、ちょっとしたシリーズです。UiPathを使うに当たって、UiPathの機能ではなく、コンピュータ言語を使う上での基礎知識を展開していこうと思います。

#ロボ開発で作る資料

ロボット開発をする前に、業務部門での業務の内容、手順を共有する必要があります。
　　　　「ロボ前フロー」 …  今業務部門でどのような手順で遂行しているか、業務部門がまとめたもの
　　　　　　ここには、処理タイミング、先行業務、後続業務なども書かれていると参考になります
　　　　「ロボ後フロー」 … ロボットが担務する業務範囲を明確にし、 業務部門側での手順の変化などを、ロボ開発者がまとめるもの
　　　　　　業務部門側でロボットを実行する前に準備する事、実行後に行う事が書かれている事が望ましいです
　　　　「処理フロー」 … ロボットの入力情報、出力情報、処理内容を概要として、ロボ開発者がまとめるもの
　　　　　　アクティビティレベルまで細かくする事はありません。ある程度の処理の括りで機能が書かれている事が望ましいです
　　　　「ロボット」 … 「処理フロー」に著した処理内容を具現化します
　　　　　　「処理フロー」を参考に、ロボットを構築していきます。「処理フロー」≒「ロボット」となります。

コンピュータの世界では、「処理フロー」から「ロボット」を作成しているのに、「ロボット」を【正】として捉える事があります。
それは「実際に動いているものが一番正しい」からです。
不思議なもので、「処理フロー」通りに機能していなくてもです。
なぜなら、「ロボット」が実際に業務部門側で動いているからです。
ですので、改修の要望があった時に見る「処理フロー」では、ある程度の見積もりしか出来ず、実際には「ロボット」の中を見て参考にする事があります。

その際、
　　　　・ここでこんな処理をしているのがなぜだか分からない！
　　　　・「処理フロー」に著しているこの機能がどこに実装しているか分からない！
　　　　・どんなレイアウトのファイルを対象にしているのかが分からない！
など、困ってしまいます。

「処理フロー」に、補助資料（シート）を用意し、
　　　　・処理の大まかな流れ
　　　　・難解そうなロジック（特に「代入アクティビティ」上の計算式）
　　　　・入力ファイルのレイアウト
　　　　・出力ファイルのレイアウト
併せて、「処理フロー」上の処理概要名と「ロボット」上のアクティビティの「表示名」とは一致させた方がいいです。
「処理フロー」上の処理概要名で、ロボットの中を検索すると、箇所が特定しやすいですね。

##おわりに
いかがでした？

資料はどこまでを用意するか、どのレベルまで記述するか、どのように維持していくか。。。答えはありません。
お読みの皆様の部署、会社で決めていっていければいいと思います。ただ、重要なのは、部署内部で共有するものか、部署間で共有するものかを明確にしていけば、自ずと必要な情報は決まりますね。

是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
PySpark なんちゃって匿名加工

# **PySpark備忘録**
## 実現したいこと
緯度経度に匿名加工を施したい
ただし、匿名加工に関しての手法としては特段難しいことをしているのではなく
最後の3桁ほどを"000"としたい程度
小数点は13位まで

緯度経度の撮りうる値としては以下が考えられる
- 1.2345678910111
- 123.4567891011121
これを上記に従って下３桁を"000"とした場合
- 1.2345678910000
- 123.4567891011000
となって欲しい

## 考えられるコード

```sample.py
"""
Python, Pandasで行う場合のサンプルコード
ただしconvert関数の挙動の確認はしていないのでこんな感じの処理が行いたいんだな程度での認識
"""
import pandas as pd

def convert(longitude_latitude):
    longitude_latitude = str(longitude_latitude)[0: -3] + "000"
    return longitude_latitude

df = pd.read_csv(file_path)
df["longitude"] = df["longitude"].apply(convert)
df["latitude"] = df["latitude"].apply(convert)
```

## 試したコード
```spark.py
df_result = df_input\
    .select(
        F.concat(F.col("latitude").substr(1, 12), F.lit("000")).alias("latitude"),
        F.concat(F.col("longitude").substr(1, 12), F.lit("000")).alias("longitude")
)
```
この処理を行うとこのように変換されてしまう
- 1.2345678910111→1.2345678910000
- 123.4567891011121→123.45678910000
つまり桁数が足りない

# 小数点以下の対応
```spark.py
df_result = df_input\
    .select(
        F.concat(F.col("latitude").substr(-13, 10)).alias("after_the_decimal_point_not_anonymized")
    )
```
こうすることで
- 1.2345678910111→2345678910
- 123.4567891011121→4567891011
が取得できる

## 実現できるコード
```spark.py
df_result = df_input\
    .select(
        F.concat(
            F.split("latitude", "[.]")[0],
            F.lit("."),
            F.concat(F.col("latitude").substr(-13, 10)),
            F.lit("000")
        ).alias("latitude_mask")
)
```
エラー：この文字は、エンコーディングMS932にマップできません

メモ程度に。
IntelliJ IDEAを使っている人向け。

# UTF-8でエンコードされていないのが原因

下記をConfigrationに追加すると解決する

```
javac -encoding utf-8
```

![2021-07-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/974c421d-0bb6-38ee-9f7f-bd23009345c9.png)
![2021-07-27 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/7c3a96fb-d359-61c9-1e73-6c96ff708fe2.png)
[Rails]seedファイル使い方

今回はRailsで開発を行っていく中で、便利な機能`seedファイル`の使い方について解説していきます。

きっと便利に開発を進められるので、参考にしてみてください。

#seedファイルとは

開発段階のデータ作成方法として、実際にcreate機能を実装してからアプリを操作してデータを作る方法や`rails c`からデータを作成する方法などがありますが、どちらも大量のデータを作ろうとすると正直めんどくさいです。。

そこで使われるのが`seedファイル`です。

seedファイルのメリットとして、

- 開発段階で動作確認用に初期データを入れられる
- データベースをリセットしても、seedファイルに入っている初期データは再び使える
- 一度に大量のデータを作成できる

というメリットがありますので、開発するときに便利なので、知っておいて損のない機能となってます。

初期データとして管理者のデータも入れられるので、管理者が必須なアプリの場合は、使う場合が多いです。

#初期データ作成

では、実際に初期データを作っていきます。

seedファイルはデフォルトで搭載されていて、`dbディレクトリ直下`の`seeds.rb`にコードを記述していきます。

```db/seeds.rb
# Postモデルのデータを作る
Post.create!(
  content: "てすとほげ",
  user_id: 1
)
```

これで、Postモデルのcontentカラムが「てすとほげ」、user_idが１のデータが作成できます。

記述できたらデータベースに反映させます。

```
$ rails db:seed
```

コマンド実行後、rails cで確認してみましょう。

```
$ rails c
001 > Post.all
:
```

作成したデータが確認できたら、反映できています。

#複数のデータを作成

１つのデータを作成することができましたので、複数のデータを作りたいときはこの記述を何個も作っていったらいいのね、、、

```db/seeds.rb
# Postモデルのデータを作る
Post.create!(
  content: "てすとほげ",
  user_id: 1
)
Post.create!(
  content: "てすとほげ２",
  user_id: 1
)
Post.create!(
  content: "てすとほげ３",
  user_id: 1
)
：
```

`とてもDRYなコードとは言えないですよね`

複数のデータを作りたいときは、`timesメソッド`を使うと一括でデータが作成できます。

```db/seeds.rb
# 一括で10個のユーザーデータを作成
# 10回繰り返し処理を行う
10.times do |n|
  User.create!(
    # n + 1で数字が重複しないようにする
    email: "test#{n + 1}@test.com",
    name: "テストユーザー#{n + 1}",
    password: "testhoge"
  )
end
```

これで、userが10個作成できます。
バリデーションでユニークを指定している場合は`n + 1`でデータが重複しないようにしておきます。

では、データベースを反映させて、rails cで確認してみてください。

```
$ rails db:seed
$ rails c
001 > User.all
:
```

#データベースのリセット方法

今あるデータを削除して初期データを入れたいなど、データベースをリセットしたい場合の処理をお伝えしておきます。

データベースをリセットする場合は、以下のコマンドを実行します。

```
$ rails db:migrate:reset
```

これで、データベースがリセットされたので、seedファイルの初期データを投入していきます。

```
rails db:seed
```

これで、記述していた初期データが反映されました。

#まとめ

seedファイルは、管理者や一括でデータを入れたい場合に非常に便利な機能です。

seedファイルをうまく使って、開発を進めていきましょう！
DataFrame  ソート

#概要
変数に対して、
**.sort_values(by="カラムorカラムのリスト", ascending=True**
とする列の値が小さい順にソートされる。

**ascending=False**と指定すると大きい順になる。

リストの場合、順番が早いカラムが優先的にソートされる。




```python
import numpy as np
import pandas as pd
np.random.seed(0)
columns = ["apple", "orange", "banana", "strawberry", "kiwifruit"]

#DF作成
df = pd.DataFrame()
display(df)

#ランダムに要素の数を作成
for colum in colums:
    df[colum] = np.random.choice(range(1, 11), 10)

#インデックスを設定
df.index = range(1, 11)

#第2引数にascendingを指定しない場合はascending=Trueとして処理される。
df = df.sort_values(by = columns)

display(df)
```

#出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/2bb5a37b-5c15-bc0b-6a93-349a40bce217.png)



columnsはリストなので順番が早いappleが優先されソートされる。
javascriptの分割代入

分割代入を使用すると

```
const MyProfile = {
  name: "ゆう",
  age: 18,
}

const test1 = `名前は${MyProfile.name}です。年齢は${MyProfile.age}です`
console.log(test1); //名前はゆうです。年齢は18歳です。
```

これを

```
const MyProfile = {
  name: "ゆう",
  age: 18,
}

const {name, age} = MyProfile

const test2 = `名前は${name}です。年齢は${age}です`
console.log(test2); //名前はゆうです。年齢は18歳です。
```

のように書くことができる。
iTerm2を使って開発サーバーへ簡単にsshアクセス

## 初めに

複数の開発サーバーへsshする機会が増えたので、現在使っているiTerm2の機能を使ってサーバーログインのフローを自動化できるかを調べました。その結果を共有していきたいと思います。

## ソフト
* macOS BigSur 11.4
* iTerm2 Build 3.4.8

## 開発サーバーごとにProfile作成
iTerm2の[Perferences]-[Profiles]の設定画面で、左下の「+」ボタンをクリックして新たなプロファイルを作成する。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308923/33532662-fc22-8e48-ab3b-32ed8f94898f.png)


順番を追って、入力項目を説明します。

* `Name` Profileの名前。分かりやすくで大丈夫。
* `Shortcut Key` このProfileを呼び出すためのショットキー。
* `Tags` Profileのタグ。複数のProfileをグループ分けて管理しやすくなります。入力しなくても問題なし。
* `Badge` ターミナル右上で表示されるバッジ文言。サーバー名を入力すると現在どのサーバーにいるのかを教えてくれます。
* `Command` Profileが適用された後実行される操作。プールダウンメニューから[Command]を選択して、入力欄にsshのコマンドを入力すると自動的にssh接続します。

Profile作成した後、対応の`Shortcut Key`を押せば新しいターミナルが開き、自動的にssh接続します。

## Password Manager機能を使ってパスワード入力
セキュリティーのため、ssh接続するときパスワードが要求され場合が多いです（プライベートキーのpassphraseやLDAPパスワードなど）。Password Manager 機能を使って、パスワードの管理や入力は出来ます。

iTerm2で　`Command` + `Option` + `F` のショットキーで Password Manager が呼び出せます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308923/fd5f0694-2a3e-de1e-7cd4-799d5a195f56.png)


左下の「+」ボタンでパスワード情報を入力して保存します。
使う時は保存されたアカウントリストから正しいものをクリックするだけで、パスワードが入力されます。

> Triggerを設定すると、「Password：」の文言が出現したら自動的に Password Manager を呼び出すことができます。
>> iTerm2の[Perferences]-[Profiles]の設定画面で、該当プロファイルの[Advanced]タブでTriggerの設定ボタンがあります。
>>`Regular Expression` トリガーになる文言の正規表現。
>>`Action` トリガーが点火するアクション。ここは"Open　Password Manager"にします。
>>`Instant` チェックを入れるとトリガーのマーチング操作はEnterキーを待たずに実行されます。
>> ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308923/0b606cc9-b52f-6668-2197-4c1efe60bc22.png)


## 終わりに
iTerm2 の機能を使って開発サーバーへのssh接続を楽にする方法を紹介してきました。
もし誤りやアドバイスがありましたらご指摘ください。
Windows postgreSQLのテーブルの列追加の動作について

前回はテーブルを作って表示させるところまでした。

https://qiita.com/Atsulabo/items/cfb089d1ccd5f82ab34d

https://qiita.com/Atsulabo/items/32a006c271f0e7b5435a


ここで、列追加する時にふと思ったことがあった。
たとえば、
末尾にVARCHAR型の列を追加する

```
ALTER TABLE （テーブル名） ADD COLUMN （新列名） （列の型）;
```
   
他に、既存の列名を変更

```
ALTER TABLE （テーブル名） RENAME COLUMN （古い列名） TO （新列名）;
```

ということはできる。

しかし、指定の列の右？左？に列追加する方法はないのだろうか？
と思って調べてみた。

> ADD COLUMNで新規カラムを追加できるが、位置指定できないので以下の通りに設定。 
([Postgres カラムを指定の位置に追加する|私的雑録](http://php.o0o0.jp/article/postgres-column) より)

なんと、できないのである。（ありがとうございます！）

代わりに上記のサイトでは、
列を追加した新テーブルを作り、そこに旧テーブルのデータを流し込む、ということをやっている。
そのコマンドは多分上記の記事の肝だと思うので、リンク先をみていただければ。
ここでは紹介しません。

テクニックとして覚えておくこととする。

今回はたまたま、末尾に列を追加すればよかったので、やらなかったが、
指定の列追加があったときのために調べておいた。
【EmEditor】小技マクロ集


#初めてに
個人的に「EmEditor」を使用する機会が多いですが、かんたんなこと
ですが自分で使っているマクロです


#マクロ
##縦項目をすべてカンマ区切りに変更

```js:縦項目to横項目_カンマ.jsee
//縦項目をすべてカンマ区切りに変更
document.selection.Replace("\\n",",",eeFindReplaceEscSeq | eeReplaceAll,0);
//最後のカンマを削除
//document.selection.EndOfLine(false,eeLineView);
document.selection.Replace(",$","",eeReplaceAll | eeFindReplaceRegExp,0);
//改行２回
document.selection.NewLine(1);
document.selection.NewLine(1);
````


```:実行前
AA
BB
CC
DD
EE
FF

```

```:実行後
AA,BB,CC,DD,EE,FF

```

##縦項目をすべてカンマ区切りに変更(文字列対応)

```js:縦項目to横項目_カンマ_文字列.jsee
document.selection.Replace("^",",\x27",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("$","\x27",eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("\\r\\n","",eeReplaceAll | eeFindReplaceRegExp,0);
```

```:実行前
AA
BB
CC
DD
EE
FF
```


```:実行後
,'AA','BB','CC','DD','EE','FF'
```
SPA（シングルページアプリケーション）について

##SPAとは

リクエストに応じで毎回htmlファイルを返すのではなく、
画面の描画、遷移をjavascriptで表現するアプリケーション

##従来のwebシステム
ユーザーのリクエストに応じて毎回htmlファイルを返していた。

##SPAを使用したwebシステム
最初のページを表示する際は従来のwebシステムと同じくhtmlファイルが受け取られる。
その後は、ユーザーの「サイト詳細ページが見たいよ」などのリクエストに応じて、そのページを表示するために必要なデータのみをサーバーから頂戴して、それをもとにjavascriptでDOMを操作してページを書き換えるというシステム。
htmlファイルはそのままだが、画面が変わったように見える。

####メリット
* 画面遷移をする際にページが毎回読み込まれて画面がチラつくのがなくなる。
* 表示速度が速い（サーバーから受け取るのがデータのみである為）
パッケージマネージャー、モジュールバンドラー、トランスパイラ復習

##パッケージマネージャー
・ファイル同士の依存関係を自動的に解決してくれる。
・import先が明示的にわかる

```
import { hoge　} from './fuga'
```
・世界中で公開されているパッケージをコマンド一つで利用可能にする。

代表的なものとしてnpm,yarnなどがある。

それまで単一のファイルに処理が書かれていたjavascriptが「これ複数のファイルに分けた方が見やすくていいよね」みたいな考え方から、ファイルを分割して、それを\<script>タグで読み込むみたいな形がとられていた。
でもこれだと、どのファイルからどんなものが読み込まれているのかが視覚的にわかりにくかった。
そこで生まれたのがパッケージマネージャー。
どのファイルから何を読み込んでいるのかが明示的にわかるようになったり、世界中の開発者が公開している便利なパッケージをコマンド一つでインストールできるようにしたりした。

npmのレジストリからパッケージをインストールして、その実態はnode_modulesというファイルに格納されている。
どのようなパッケージをどのようにインストールしたのかはpackage.jsonやpackage.lock.jsonファイルに記述されている。

##モジュールバンドラー
複数のjavascriptファイルを一つにまとめるためのもの。

代表的なものとしてwebpackがある。
パッケージマネージャーによって分割されたモジュールやパッケージは本番環境で実行する際、一つにまとまっていた方がパフォーマンスが良さそうだよねという考えから、本番用にビルドする際はそれらを一つにまとめるようにした。
その際に使用するのがモジュールバンドラー。ファイル同士の依存関係等も考慮した上でファイルをバンドルしてくれる。

##トランスパイラ

新しいjavascriptの記法を古い記法に変換してくれるもの。
代表的なものとしてbabelがある。

javascriptのバージョンES６で、さまざまな便利な記法が追加されたが、その記法に対応していないブラウザがいくつかあった。でもそのためにES6で書くのを諦めてES2015などで記述するのはあまり効率が良くないと考えられたため、ファイルを実行するときに新しい記法を古い記法に変換してくれるツールが開発された。
それがトランスパイラ。
【AWS】オンプレ環境と複数のVPCを接続する方法（Direct Connect）

# ネットワークサービス

## VPCと外部との接続

### ◉AWS Direct Connect（DX）
- オンプレミス環境（自社環境）とAWS（VPC）の間を専用線で接続するサービス
- 通常はオンプレ環境とVPCを**一対一**で接続する
- プライベート環境と高速ネットワークで安定した通信を行うことができる

:::note info
Direct Connectゲートウェイを利用することでオンプレ環境と全リージョンの複数VPCを一対多で接続可能となる
:::

### ◉Site to Site VPN(Virtual Private Network)
- IPsecを用いてオンプレミス環境とAWS間を接続する方法
- DXと比べると品質は下がるが低コストかつ短期間で導入できるメリットがある

:::note info
IPsec（Security Architecture for Internet Protocol）
IPパケットを暗号化して盗聴や改ざんを防ぐ技術
:::

### ◉仮想プライベートゲートウェイ（VGW：Virtual Private Gateway）
- **オンプレ環境とAWSを接続するときに利用するゲートウェイ**
- DXやSite to Site VPN接続するときに**あらかじめ用意しておく**


### ◉VPCピアリング
- 異なるVPC間をプライベート接続するサービス
- **インターネットを経由せずにAWSプライベートネットワーク内で直接通信できる**
- 異なるAWSアカウント間でも接続可能だが**ネットワークアドレスが一致or重複する場合は接続できない**

:::note info
VPCはAWS上に独立したプライベートネットワーク空間を作成するため本来はVPC間での直接的な通信はできない
:::

#### ◎VPCピアリングとDirect Connectゲートウェイの接続例
[![Image from Gyazo](https://i.gyazo.com/a0c93623930a66155c32bca1a9cc5a31.png)](https://gyazo.com/a0c93623930a66155c32bca1a9cc5a31)

### ◉AWS Transit Gateway
- VPC内に**ハブ機能**を持ったゲートウェイを配置するサービス
- ネットワークを**簡素化し一元管理**することができる

[![Image from Gyazo](https://i.gyazo.com/33141415bb5a3dfb632b0fa21bb3a3ca.png)](https://gyazo.com/33141415bb5a3dfb632b0fa21bb3a3ca)


### ◉VPCエンドポイント
- **AWSのプライベートネットワークから各種AWSサービスへのアクセスやAPIコールを行うことができる**
- 通常はインターネットを経由して行う

#### ◎ゲートウェイ型
- **ルートテーブルに指定されたターゲットを追加する方法**
- **Amazon Simple Storage Service（S3）／Amazon DynamoDB**などのAWSサービスへプライベート接続することができる

#### ◎インターフェイス型（AWS PrivateLink）
- **APIコールに対してインターネットを経由せずにプライベート接続する方法**
- **Amazon CloudWatch／Amazon Simple Queue Service（SQS）**などのAPIコールに対してプライベート接続することができる

:::note info
API（Application Programing Interface）
他サービスのソフトウェアの一部を共有できる仕組み
:::

#### 参考
https://aws.amazon.com/jp/transit-gateway/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc

https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/
Visual Studio Code で使用できるショートカット

# はじめに
VSCodeで使える便利だけど覚えられないショートカットを、忘れない為にまとめてみました。  
ヘルプ > キーボードショートカットの参照 でショートカット集が見れます（英語ですが・・・）

# 表示
| ショートカット | 動作                                          |
| :------------- | :-------------------------------------------- |
| Ctrl+Shift+E   | エクスプローラにフォーカス / トグル           |
| Ctrl+R         | 最近ひらいたもの                              |
| Ctrl+Shift+V   | マークダウンのプレビュー / トグル             |
| Ctrl+K V       | 画面分割してマークダウンのプレビュー / トグル |
| Ctrl+@         | ターミナルの表示 / トグル                     |
| Ctrl+↑ / ↓     | スクロール                                    |
| Alt+← / →      | 前へ戻る / 進む                               |

# エディタ操作
| ショートカット    | 動作                          |
| :---------------- | :---------------------------- |
| Ctrl+F4, Ctrl+W   | エディタを閉じる              |
| Ctrl+K Ctrl+← / → | 前 / 次のグループにフォーカス |

# 編集
| ショートカット      | 動作     |
| :------------------ | :------- |
| Ctrl+Shift+Alt+矢印 | 矩形選択 |
| Ctrl+F2 | 選択ワードの全マッチを選択 |

# ショートカットの編集
VSCodeはショートカットを自分で編集することができます。

1. File → Preferences → Keyboard Shortcuts をクリック
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/f15f57d2-d690-c391-d5de-2ca087901f5b.jpeg)

1. 右上のマーク![keybindings.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/2e7c4b2d-fde4-9371-7f34-2f4b3191a64d.jpeg)をクリックする
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/9f96c6aa-3632-1747-cd9f-2fdca1709e56.jpeg)


1. 好きなショートカットを記載する
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/930c0fdd-ca4b-67af-0d0d-266cb661acef.jpeg)


## おすすめショートカット
```json
[
    {
        //Ctrl + N で、新規ファイルを作成する
         "key": "ctrl+n"
        ,"command": "explorer.newFile"
    }
    ,{
        //Ctrl + shift + N で、新規フォルダを作成する
         "key": "ctrl+shift+n"
        ,"command": "explorer.newFolder"
    }
]
```
【Python】通知処理を行うための準備（参考になりそうなリンク集め）

#初めに

Pythonを利用して、通知を行うための方法の ネタ集めのリンクとなっています
実際に自分でこれが利用できるかは別として

##今の処の目標
・twitterのハッシュタグでのデータ取得と
・その中でも複数のハッシュタグを取得して、取得後に適切なテキストに書き込む
・ストリーミング再生を取得して流すとこ
・ストリーミング再生をDiscordのBot複数に同時に流せるようにする。
・DiscordのBotはコマンドラインでURLを渡すことによって再生

#ネタ集めのリンク集

##通知系(api)

Lineに通知する方法
https://udemy.benesse.co.jp/development/app/line-bot-making.html


PythonからTwitterAPIを用いてDMを取得してみる
https://int-0x80.hatenablog.com/entry/2017/03/25/192126


##ストリーミング再生

実際にダウンロードせずにPythonを使用してYouTubeビデオからオーディオだけをストリーミングできますか？
https://www.fixes.pub/program/429272.html

##Python掲示板

熱門話題
https://www.fixes.pub/topics-21.htm
AtCoderログ：0038 - ABC 211 B

# 問題

https://atcoder.jp/contests/abc211/tasks/abc211_b

## 問題文
> $4$ つの文字列 $S_1,S_2,S_3,S_4$ が与えられます。
> この中に、H , 2B , 3B , HR がそれぞれ $1$ つずつあるか判定してください。
> ただし、全ての $S_i$ は H , 2B , 3B , HR のいずれかと一致します。

## 制約
> ・$S_i$  は H , 2B , 3B , HR のいずれかと一致する


# 回答
## 回答1 (AC)
4つの文字列 s.at(0), s.at(1), s.at(2), s.at(3) に H, 2B, 3B, HR がそれぞれ 1 つずつあるための条件は、全ての文字列が異なっていること、つまり s.at(0)!=s.at(1) かつ s.at(0)!=s.at(2) かつ s.at(0)!=s.at(3) かつ s.at(1)!=s.at(2) かつ s.at(1)!=s.at(3) かつ s.at(2)!=s.at(3) が成立することです。これを書き下したコードは以下のようになります。

```C++:abc0211b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  vector<string> s(4);
  for ( int i=0; i<4; i++ ) {
    cin >> s.at(i);
  }
 
  if ( s.at(0)!=s.at(1) && s.at(0)!=s.at(2) && s.at(0)!=s.at(3) &&
       s.at(1)!=s.at(2) && s.at(1)!=s.at(3) && s.at(2)!=s.at(3) ) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }  
}
```

## 回答2 (AC)
重複の可能性がある要素の(個数ではなく)種類の数をカウントする場合には、set 型変数を使うのが便利です。set 型変数 result を用意して文字列を追加し、その要素数が 4 ならば全ての要素が異なっていることがわかります。コードは以下のようになりました。

```C++:abc211b-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s;
  set<string> result;
  for ( int i=0; i<4; i++ ) {
    cin >> s;
    result.insert(s);
  }
 
  if ( (int)result.size()==4 ) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }  
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc211/tasks/abc211_b/editorial) → [公式解説](https://atcoder.jp/contests/abc211/editorial/2286)
回答1と同じ方針でしたが、全ての条件を書き下さず、for 文を使って処理していました。

# リンク
- 前の記事 → [AtCoderログ：0037 - ABC 105 B](https://qiita.com/RoadLynton/items/3fba438c4a744b0ced0c)
ServiceNowアプリケーションと基本テーブル対応表

### 概要
ServiceNow開発で一番覚えるべきことは機能ごとの管理テーブル
基本機能に絞って、アプリとテーブルの対応表を作成した。

### 対応表

| アプリケーション | 英名 | 対応テーブル |
|:-:|:-:|:-:|
|  フォーム | Form  | sys_ui_form  |
| リスト　|  ListLayout   |  sys_ui_list | 
| リストコントロール  | ListControll   |  sys_ui_list_controll | 
| 関連リスト |  related list   |  sys_ui_related_list | 
| 表示ルール |  rule view   |  sysrule_view | 
| UIページ |  UI page   |  sys_ui_page | 
| ビジネスルール |  business rule   |  sys_script | 
| スクリプトインクルード |  script include   |  sys_script_include | 
| 予定スクリプト |  auto script   |  sysauto_script | 
| イベント登録 |  event register   |  sysevent_register | 
| UIポリシー |  ui policy   |  sys_ui_policy | 
| ロール |  role   |  sys_user_role | 
| アクセスコントロール |  acl   |  sys_security_acl | 
| システムプロパティ | property   |  sys_properties | 
| メッセージ  | message   |  sys_ui_message | 
| アプリケーションメニュー  | application menu   |  sys_app_application | 
| アプリケーションメニュー(mobile) |  application menu   |  sys_ui_application | 
| モジュール |  module    |  sys_app_module | 
| モジュール | (mobile)   |  sys_ui_module | 
| 通知 |  notification    |  sys_notification | 
| サービスポータル  | service portal    |  sp_portal | 
| サービスポータルページ  | service portal pages   |  sp_page | 
| サービスポータルウィジェット  | service portal  widget  |  sp_widget | 
| ポータルページ  |  portal page   |  sys_portal_page | 
| カタログアイテム |  catalog item  |  sc_cat_item | 
| レコードプロデューサー |  record producer   |  sc_cat_item_producer | 
| カタログ |  catalog   |  sc_catalog | 
| カテゴリ |  category   |  sc_category | 
| カタログUIポリシー |  catalog ui policy   |  catalog_ui_policy | 
| 変数セット | variable set   |  item option new set | 
| カタログクライアントスクリプト |  catalog_crient_script   |  catalog_script_client | 
| エクスポート定義 |  export definition   |  sys_export_definition | 
| フロー |  flow  |  sys_hub_flow | 
| アクション  |  |  sys_flow_step_definition | 



```javascript:
function cancelTicket(){
      var answer=confirm("Are you sure you want to cancel this record?");
      if (answer==true)
      {
          gsftSubmit(null, g_form.getFormElement(), 'cancel_change'); //MUST call the 'Action name' set in this UI Action
      }
      else
      {
          return false;
      }
}
if(typeof window == 'undefined')
      {
      current.state = 8;
      current.update();
      action.setRedirectURL(current);
      gs.addInfoMessage('The current change request has been cancelled.');
}
```
【Kubernetes】イメージを更新するたびに最新のイメージをpullする no.13

![名称未設定のデザイン (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cc71d648-2fbe-2899-5a77-1b0dd3a42bbb.png)

Kubernetesにおいて、Containerのイメージを更新するとき、イメージ名にtagがついてないと更新する事ができなかった。

ただ、タグを変えなくても最新のイメージを引っ張ってこさせることもできる


>①イメージ名の後ろに:latestを付ける

>②imagePullPolicy: Alwaysにする

![2021-07-27_8-09-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d523875b-aa92-9d18-6285-8f8377fd875c.png)

①か②のどちらかをyamlファイルのcontainerの設定に書けば、最新のイメージを引っ張ってきてcontainerが作られる。

①と②の両方どちらも書いていてもエラーにはならない。
【Git】チームから学ぶGitの使い方　コンフリクト修正編

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* コンフリクトの対処方が知りたい方


#目的

* コンフリクトを修正して正しくブランチに反映すること

#実際の手順と実例
###0.前回までの流れ

https://qiita.com/nao0725/items/5435e611cb54bfb0c9ea


###1.コンフリクトとは
* Gitをマージする際に、自分のファイル上の作業と他人の作業が重複してしまった際におこる状態です。
* チーム開発では必ずと行っていいほどコンフリクトが起きます。

###2.コンフリクト修正方法

私が遭遇したコンフリクトの修正方法は２パターンあります。
　①GitHub上で修正する方法
　②Terminalで表示され、エディタで修正する方法

①GitHubで修正
　a.GitHubでプルリクをおくった後に修正することができます。

　b.GitHubのを下の方にスクロールしていくと**Resolve conflict**という灰色のボタンがあるのでクリックします。

　c.下記のような表示がでます。

````
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
<<<<<<<<HEAD
    <h1>コンフリクト怖い</h1>
========
    <h1>コンフリクトが起きても焦らないで</h1>
>>>>>>>>9vafv38sva9df9av8adf5vn2nevr89q4
    <script src="sample.js"></script>
  </body>
</html>

```

```
<<<<HEAD
 自分の作業で変更した箇所
=====
 マージしようとしたブランチ
>>>コミット番号（もしくはブランチ名）
````

というように表示されるのでどちらを削除するかチームで話し合いながら進めましょう！

　ｄ．この後はGitHubのコンフリクト修正箇所の右上に**Mark as resolved**というボタンがあるのでクリック


⚠　コンフリクトの量が多すぎるとGitHubが処理できなくて、**Resolve conflict**が押せないときがあるので注意です。その場合の編集はTerminal上で同じ作業を行えばOKです。



#参照

>(コンフリクトが解消できない！Resolve conflictsが押せない！！)[https://qiita.com/Masataka_Sugi/items/6b2a0005aa4f283d0fdd]
>[【GitHub】コンフリクトとは何か？エラーコメントの見方と解決方法の基本について紹介](https://vector-ium.com/github-conflict/)
独習Java新版まとめ(第２章)

<b>2-1　変数</b>
変数を複数宣言するときは原則として１つ１つ個別の文として宣言
変数はCamelCaseで戦闘箱文字にしてそれ以降は大文字スタートだが、クラスはPascal記法で頭から大文字

定数の宣言
final データ型 定数名 = 値

<b>2-2 データ型</b>
データ型は基本型と参照型に分けることができる
Javaの基本型はbyte/short/int/long/float/double/boolean/charのみ
また数値を示すときは基本的にint型を採用
浮動小数点も目メモリに特に制限がない限りはdoubleを使用

booleanはfalseを０やtrueを１などをみなすことはできない
Java10以降ではvarキーワードを使用することで変数を宣言するときにデータ型を省略できる
varは初期値から型推論をするのでいきなり使うことはできない

<b>2-3 リテラル</b>
リテラルとはデータ格納できる値そのもの、また、値の表現方法
浮動小数点リテラルは<仮数部>*10*符号<指数部>
データ型が勝手に決められて困る場合にはlomgの時はLでfloatはFでdoubleはDを用いる

<b>2-4 型変換</b>
狭い方から広い方に変更するのはOkだが、逆はだめ
型キャストは(データ型)変数

<b>2-5 参照型</b>
Javaの参照型はクラス型/インターフェイス型/配列型と分別できる
newキーワード クラス名 変数名 = new クラス名(引数....)
メゾットはインスタンスを作成して.メゾット名(引数)
参照型はオブジェクトが参照の値を持たない状態

配列の宣言はデータ型[] 配列名 = {要素1, 要素2....}
要素の追加等はできない
多次元配列はデータ型[][]配列名 = new データ型[要素数１][要素数2]
しかし長さがそろわないときもあるのでその際にはどちらかだけ固定してその行ごとに後で指定していく
var list = new int[3][];
list[0] = new int[2];のように
また、この時宣言する数は要素数なので注意が必要
なんとなく使ってたビルド、ホスティング、デプロイに関してざっくりと理解する

#本記事
・本記事はビルド、ホスティング、デプロイに関しての記事となります。大雑把に概念を理解しようとする記事です。

#ビルドとは
>プログラミング言語で書かれたソースコードなどを基に、実行可能なファイルや配布パッケージを作成する処理や操作のこと。また、組み立てられた実行ファイルなどの特定の版を指す場合もある。

プログラムの元ネタ（ソースコード）から、実際に動くプログラムをつくり出す作業。
ソースコードいバグがないか解析を行い、問題なければ実行できる形のファイルに変換し(コンパイル)、組み立てる。

上記の過程を説明すると以下の通り。




#ホスティングとは
>サーバーを借りること。レンタルサーバーと呼ばれることもある。また、このサーバーを置いておく場所のことをデータセンターと呼ぶ。

#仮想専用サーバー
仮想専用サーバー（VPS）が主流。仮想化技術を用いて利用者ごとに仮想サーバーを構築し、専用サーバーのような機能を持たせるもの。

#デプロイとは
作ったプログラムを然るべき場所に配置・設定し、使える状態にすること。
ビルドした実行可能なファイルを専用の実行環境で使える状態にすること。曖昧な使い方をするようなので、ざっくりと理解した方がよいかもしれない。

#参考文献

https://wa3.i-3-i.info/word12775.html

https://wa3.i-3-i.info/word16767.html

https://garafu.blogspot.com/2018/11/build-deploy-release-rollback.html

#最後に
最後までお付き合いいただきありがとうございました。
本記事でわかりにく、等ございましたら、参考文献を一度読まれることをお勧めします。
form_withについて学んだこと

フォームを記述する際にhtmlとrailsでヘルパーメソッドを使って記述した場合の違いをまとめてみた。

```html
<form aciton="/posts" method="post">
  <input type="text" name="content">
  <input type="submit" value="送信">
</form>
```
`action="/posts"`localhost:3000/postsへ記載内容をリクエストする
`method="post"` httpメソッドでpostを指定
`type="text"`１行のテキストボックスを作る
`name="content"`contentという名前を指定している
`type="submit"` フォームを実行するボタンを作る
`value="送信"` 「送信」という初期値を入力する

```ruby
<%= form_with url:"/posts", method: :post, local: true do |form| %>
  <%= form.text_field :content %>
  <%= form.submit '送信' %>
<% end %>
```
`method: :post`httpメソッドでpostを指定。初期値は:postなので、postメソッドを使う場合には省略可能
`local: true`form_withはデフォルトでAjax（リモート送信）を行うことになっているので、それをキャンセルする。
`form.text_field`１行のテキストボックスを作る
`:content`「content」というキーを設定する
`form.submit`フォームを実行するボタンを作る

***参考にしたサイト***
[Qiita](https://qiita.com/oreo/items/82183bfbaac69971917f) "Markdown記法一覧"