OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoderでRuby学習13 二次元配列の作り方

## はじめに
Rubyおよびアルゴリズムの学習の一環として競技プログラミングに参加しています。
ここでは、学習の中で学んだことをアウトプットしています。

今回は二次元配列の作り方について。
第三回アルゴリズム検定第二問[ダイナミック・スコアリング](https://atcoder.jp/contests/past202005-open/tasks/past202005_b)において、
二次元配列を使いたい場面が出てきました。
ここで少し手こずったので、復習の為にまとめておきます。

## やりたいこと
以下のようなことがやりたくて、二次元配列を作ろうと思いました。

例えば、
ある試験に3名の参加者（1,2,3）が参加する。
その試験では、3問の問題が出題される。
参加者ごとにそれぞれの問題に解答出来たかどうかを管理する。

イメージは下記のような感じです。

```ruby:イメージ
# ①こんな感じの二次元配列を作っておく
[[0, 0, 0],[0, 0, 0],[0, 0, 0]]

# ②参加者1が1問目に正解したら、該当の要素に1をいれる
[[1, 0, 0],[0, 0, 0],[0, 0, 0]] #第一要素の配列の最初の要素に 1 

# ③次に参加者3が2問目に正解したら、該当の要素に1をいれる
[[1, 0, 0],[0, 0, 0],[0, 1, 0]] #第三要素の配列の2番目の要素に 1 
```

## ①最初にやったこと（間違い）

```ruby
ary = Array.new(3, Array.new(3, 0))
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]
```
見た目としては作りたいものが出来ているのですが、
解答の記録を入れようとすると

```ruby
ary[0][0] = 1
print ary
# => [[1, 0, 0],[1, 0, 0],[1, 0, 0]]
```
第一要素の配列のみに変更を加えているつもりが、全ての配列に影響を与えてしまいました。

## ②mapメソッドを使って（正解！）

```ruby
ary = Array.new(3).map{Array.new(3,0)}
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]

ary[0][0] = 1
print ary
# => [[1, 0, 0],[0, 0, 0],[0, 0, 0]]
```
結果としてはmapメソッドを絡めることで、無事イメージ通りの配列を作ることが出来ました。

## 何が違うのか
上記の①、②の二次元配列は、見た目は完全に同じですが、どうやら全く違う性質を持つようです。
何が違うのかを考えていきます。

### Arrayクラスのnewメソッド　①について
[リファレンス](https://docs.ruby-lang.org/ja/latest/method/Array/s/new.html)には下記のように書かれています。

> new(size = 0, val = nil) -> Array
>> 長さ size の配列を生成し、各要素を val で初期化して返します。
>> 要素毎に val が複製されるわけではないことに注意してください。
>> 全要素が同じオブジェクト val を参照します。

```ruby:例
ary = Array.new(3, "foo")
p ary                     #=> ["foo", "foo", "foo"]
ary[0].capitalize!
p ary                     #=> ["Foo", "Foo", "Foo"]
```
この例では、各要素の"foo"は全て同じオブジェクトであることが示されています。
説明文通り全ての要素が同じオブジェクト val になるということです。

となると、①で作った二次元配列は以下のようなイメージでしょうか。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517040/04acf40c-d641-6433-6c57-bf41131ca24d.jpeg)

配列の中では要素が3つに分かれているように見えても、結局は同じひとつのオブジェクトを参照しているだけ。
どの要素に変更を加えようが、変更されるのは同じオブジェクト、ということのようです。

![Array.new(3, Array.new(3, 0)).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517040/2948ae70-3a7a-6419-2bbb-340ba5321b4b.jpeg)

こんなイメージでしょうか。



### mapメソッド ②について
[リファレンス](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/collect.html)には下記のように書かれています。

> map -> Enumerator
> map {|item| ... } -> [object]
>> 各要素に対してブロックを評価した結果を全て含む配列を返します。
>> ブロックを省略した場合、上で説明した繰り返しを実行し、
>> その結果として得られる配列を返すような Enumerator オブジェクトを返します。

```ruby:例
# すべて 3 倍にする
p [1, 2, 3].map {|n| n * 3 }  # => [3, 6, 9]
```
mapメソッドは、eachメソッドのように配列オブジェクトから要素をひとつずつ取り出し、
ブロック{}内の処理を行った結果を配列として返します。

ということは、②で作った二次元配列は以下のようなイメージになるでしょうか。

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517040/5672bed0-0f35-0724-d32f-0a992232d3b9.jpeg)

各要素に対して別個に配列の生成を行うため、それぞれ独立したオブジェクトとして存在している。
だから、別個に変更を加えることが出来る、ということのようです。


## 最後に
以上、二次元配列の作り方でつまずいたポイントについて、自分なりにまとめてみました。
リファレンスなどを読みながらまとめたつもりですが、
もし間違いなどございましたら、ご指摘いただけると嬉しいです。
【プログラミング初心者】Swift練習問題~フィボナッチ数列~

# 問題
引数に与えた整数までのフィボナッチ数列を配列として返す関数を作成し、コンソールログとして出力してください。
※負の数が与えられた場合は空配列を返してください。

```swift:関数例
func getFibonacci(limit: Int) -> [Int] {
    ...
}

print(getFibonacci(limit: 1000))
```
```:出力例(1000以下のフィボナッチ数列)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
```
【備考】
フィボナッチ数列は`a[n+1]=a[n]+a[n-1] (n≧0)`という漸化式で表されます。
また、`a[0]=0`、`a[1]=1`という初期値が与えられます。
従って、`a[2]=a[1]+a[0]=0+1=1`、`a[3]=a[2]+a[1]=1+1=2`...というように計算することができます。

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/5af7e45aaaa2175c9ae1)

# 最後に
別の問題は以下に掲載しています。
また本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載も以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/
【プログラミング初心者】Swift練習問題~フィボナッチ数列~回答例

# フィボナッチ数列
## 回答例
```swift
func getFibonacci(limit: Int) -> [Int] {
    guard limit >= 0 else {
        return []
    }
    // 現在の値（初期値: a[1] = 1）
    var currentNumber = 1
    // 前項の値（初期値: a[0] = 0）
    var preNumber = 0
    
    var fibonacci: [Int] = [preNumber]
    
    while currentNumber <= limit {
        fibonacci.append(currentNumber)
        // 更新
        let nextNumber = currentNumber + preNumber
        preNumber = currentNumber
        currentNumber = nextNumber
    }
    return fibonacci
}
```
## 解説
フィボナッチ数列の漸化式は`a[n+1]=a[n]+a[n-1]`と表されます。
`a[0]=a[-1]+a[-2]`、`a[1]=a[0]+a[-1]`は計算できないためそれぞれ初期値として0, 1という値が与えられます。
現在の判定される値として`currentNumber`前項の値として`preNumber`を変数として定義しそれぞれa[0], a[1]として初期化します。

あとは`while currentNumber <= limit`でリミットに達するまでループを回します。
判定処理後、配列に追加し次の値に更新しています。
Python3 Windowsのレジストリから不正なキー名候補を検索する

Windowsのレジストリから不正なキー名候補を検索するコードです。`"\uFEFF"`のeast asian widthが`"N"`（`unicodedata.east_asian_width("\uFEFF") == "N"`）だったので、このような文字を含むキー名をすべて取り出してくるコードです。出力後にレジストリを目視で確認して整理することを目的としています。

Microsoft Payとやらのよく分からないキーがヒットしたのは見なかったことにしています。

```py
import unicodedata
import winreg
from pprint import pp


def str_has_east_asian_width_N(s):
    return any((unicodedata.east_asian_width(c) == "N" for c in s))


def get_winreg_invalid_candidates(key, path, candidates=[]):
    for i in range(0xffffffff):
        try:
            name = winreg.EnumKey(key, i)
        except OSError:
            break
        if str_has_east_asian_width_N(name):
            candidates.append([name, path])
        try:
            get_winreg_invalid_candidates(
                winreg.OpenKey(key, name),
                path + "\\" + name,
                candidates)
        except FileNotFoundError:
            pass
        except PermissionError:
            pass
    return candidates


invalid_candidates = []
invalid_candidates.extend(get_winreg_invalid_candidates(
    winreg.HKEY_CURRENT_USER, "HKEY_CURRENT_USER"))
invalid_candidates.extend(get_winreg_invalid_candidates(
    winreg.HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE"))
invalid_candidates.extend(get_winreg_invalid_candidates(
    winreg.HKEY_USERS, "HKEY_USERS"))
invalid_candidates.extend(get_winreg_invalid_candidates(
    winreg.HKEY_CURRENT_CONFIG, "HKEY_CURRENT_CONFIG"))
pp(invalid_candidates)
```
プログラマだけど真空管アンプ制作はじめます

はじめまして。
Qiita初投稿です。
いろんな人に読んでもらいたいと思いつつ、自分のためのメモ/日記のような気持ちで書いていくため若干読みづらいかも知れませんがご了承ください。

普段はプログラマをしていてiOSアプリ開発を中心にお仕事してます。
このアカウントもiOSとかReact Nativeに関する投稿をゆるゆるしていこうと思って作ったものでしたが、プログラミングに関する発信は社内に留まってしまっていました。
なので初投稿がアンプ制作に関するものになってしまいました。
（今後はプログラミングに関することも発信していこうと思います。）

さて、軽い自己紹介のようなものもしたので本題に移っていきます。

## 真空管アンプ制作をはじめるワケ
6年前に購入した3万円くらいのDenonのオーディオアンプが調子悪くなってきて、新しい物を購入しようと検討していました。
社会人になってある程度お金も貰えるようになったので当たり前のように既製品を買うことを考えていました。
しかし、最近大学の後輩が自分でギターを改造しているtweetを見て、昔の記憶が蘇り、久々に自作しようと決意するに至りました。
年内の完成を目指して、勉強・設計・実装を進めていきます。

ちなみにDenonのアンプはこちら。
この価格にしてはかなりパワフルかついい音でした。
結構おすすめです。（型としては古いですが）
https://amzn.to/3f3sT9A

## どうやって進めていくか
まずは何事も準備からということで、学生時代に購入した真空管アンプの設計・実装に役立つ本を読んでいくところからはじめます。
タイトルから素晴らしい「情熱の真空管アンプ」[(Amazon)](https://amzn.to/3f7r0c1)という本です。
この本がいいと思ったところ

- 一台の真空管アンプの設計から実装までを網羅した一貫した内容
- 回路や部品についての基礎を理解するのにも役立ちそう
- 堅苦しくなく砕けすぎない読みやすい文章

しばらくはQiitaにこの本で学んだことをまとめていきます。

## 「情熱の真空管アンプ」の章構成
第一章　真空管を手に入れよう
第二章　増幅回路ベーシック
第三章　電源回路ベーシック
第四章　全段差動ベーシック・アンプ・・・設計編
第五章　部品ガイド
第六章　半導体いろいろ
第七章　工具と機材
第八章　全段差動ベーシック・アンプ・・・制作編
第九章　調整と測定
第十章　トラブルシューティング
第十一章　16A8(3結)全段差動プッシュプル・アンプの設計と制作
第十二章　アース回路
第十三章　利得、周波数特性と負帰還
第十四章　Ep-Ip特性と真空管の３定数
第十五章　真空管のバリエーション

## 真空管アンプ制作の全プロセス
1. コンセプト・構想を考える
2. 要件を決定
3. 制作宣言 (これについてはもうしちゃってるけど）
4. 予算確保 （夏のボーナスですね）
5. 回路基本設計
6. シャーシ設計
7. 購入部品リストの作成
8. 部品・工具の購入
9. シャーシの詳細設計
10. シャーシ加工
11. 構造部品の取り付け （トランス類とか）
12. 配線
13. 通電・初期調整・初音出し (感動の瞬間)
14. 連続試運転試験
15. 測定（無帰還状態）
16. 負帰還・調整▶︎微調整
17. 最終測定
18. 完成
19. みんなに自慢 （youtube投稿とか？)

一番最初のページに書いてある全プロセスをざっと書いてみました。
勉強だけでも時間かかりそうなのに、プロセス自体もかなり多いですね。
その分完成したらかなり嬉しい気がする。

## おわりに
これをもって、制作宣言を完了にしたいと思います。
勉強したことや設計した内容についてはちょこちょこ記事にしていこうと思います。
制作の段階に突入したらYouTubeに制作の様子をUPしていこうかな、、、
まぁそのとき考えよ！

次回は第一章「真空管を手に入れよう」のまとめになります。
それではまた今度。
【つまづき記録】エラー：”Default references will only be applied in edit mode”への対応方法【Unity】

#記事の内容
以下のリンクにある、立方体を平面の上を転がすという
すごく簡単そうな（おそらく実際に簡単な）チュートリアルで
つまづいてしまったので、記録をしておく。
注意：現時点でまだ解決していません。

https://www.youtube.com/watch?v=wpnMCjwZaTk

#まずは問題点
一通りチュートリアルに沿って、
GameObjectの作成やら、立方体を動かすためのScriptの作成やらを終えた。

すると、Scriptを保存し、Unityに戻り、いざHierarchyにある各GameObjectを
Script内で生成したGameObjectにアタッチしようとすると、ドロップすることができない。

よく見ると、以下のような警告が表示されている。。

![スクリーンショット 2020-06-09 0.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210288/bfc90ec9-eca2-7289-1598-5ac705f983ef.png)

とりあえず、”Default references will only be applied in edit mode”をググる。


#ググって分かったこと
####・スクリプト選択中のためにこれが発生している。
　→正直、この文章の意味がわかっていない。スクリプトを選択しないで、どうやってスクリプトのコンポーネントにゲームオブジェクトを持ってくるんだろうか。。？

####・スクリプトをGameObjectに付与→そのGameObjectのInspector上のスクリプトコンポーネントのPlayer、CenterなどにGameObjectをドラッグドロップする必要があるらしい。
　→やったけど、解決せず。

####・NullReferenceException辺り起こしていて「動いてない」
　→NullReferenceExceptionのUnityマニュアルを一目見て、拒否反応を起こしている。。

とりあえず、全く解決できていないけど、ヒントとなりそうなことでまだ理解が追いついていないことが多いので、少しずつ明日以降潰していこう。

Let's 七転び八起き
A man's walking is a succession of falls.
複数のスクロールバーを同時にスクロールする

　職場でどうやって実装するのか悩んだ、という話を聞いたので実装してみました。古いサンプルだとjQuery使ってて普段触らない人からすると訳分からないですよね。多分この実装だと問題が生じるときもありそうな気がするので、よければコメントくださいませ。

#実装内容
　基本は、スクロール時にエレメントの[scrollTop](https://developer.mozilla.org/ja/docs/Web/API/Element/scrollTop)(横スクロールなら[scrollLeft](https://developer.mozilla.org/ja/docs/Web/API/Element/scrollLeft))というプロパティを対象エレメントと同じ値に設定してあげるだけです。詳しくは下記のコードを見てください。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="r-az" data-slug-hash="ExPVNOY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="scroll_sync">
  <span>See the Pen <a href="https://codepen.io/r-az/pen/ExPVNOY">
  scroll_sync</a> by R-Az (<a href="https://codepen.io/r-az">@r-az</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##参考にした記事
http://amaraimusi.sakura.ne.jp/sample/js/scroll_rendo/scroll_rendo.html
https://wrongwrong163377.hatenablog.com/entry/2018/11/17/153430
【gulp】sassコンパイル環境作成の為のコマンド【メモ】

```index.md
# package.json作成
npm init -y

# gulp+gulpのプラグインをインストール
npm install -D gulp
npm install -D gulp gulp-sass

# gulpfile.js作成後
npx gulp

# package.jsonのscriptsに記載
"scripts": {
    "start": "npx gulp"
 },
```
Unityプラグイン/C++

# 環境
OS: windows10 pro 64bit 
IDE: VS2017 free
Unity : 
[OpenCV + aruce : ソースからビルド](https://qiita.com/tangotarou2/items/60fc99af6cb87a7204a1)の後半参照
OpenCV : OpenCV Plus Unity(無料版)

# Unityプラグイン

[gitignore](https://1drv.ms/u/s!ApO4wsxFJBbVuB2mTCQtPNrLKi3I?e=cWFgue)

[プラグインのひな型](https://1drv.ms/u/s!ApO4wsxFJBbVuBxnYJkdtMFkZsZc?e=3IScLj)

# Unityプロジェクト設定
a. Asset直下にPluginsフォルダを作成する。「\Assets\Plugins\x86_64」
b. 呼び出しテスト

```
extern "C"
{
	int EXPORT_API PrintNumber() {
		return 999;
	}
}
```

```

int main_dll(int id)
{
	const char* lpBuffer = "hogehoge.dll";
	HMODULE hModule = LoadLibrary((LPCSTR)lpBuffer);
	if (hModule == NULL) {
		assert(0);
		return 0;
	}
	g_hModule = hModule;//HMODULE

	FUNC lpFunc = (FUNC)GetProcAddress(hModule, "PrintNumber");
	return lpFunc();
}

```

C#

```
using System.Runtime.InteropServices;

	[DllImport("plugin")]
	private static extern int PrintNumber();

    // Start is called before the first frame update
    void Start()
    {
		Debug.Log(PrintNumber());   
    }
```

＜結果＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/e94943d7-28f5-5266-778d-fdbc29de5811.png)

プラグインをx64ビルドしたらUnityもx64にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/a907a277-b71b-fd9c-e546-5aa730486a30.png)

# unsafe/mcs.rsp
[メモリコピー高速化等でunsafeは有効にした方がよいです。]
(http://tsubakit1.hateblo.jp/entry/2018/05/16/210000)
[smcs.rspは名称変更](http://nakamura001.hatenablog.com/entry/20170228/1488278562)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/42a61813-2b9a-8c57-af6f-62a00e935bc1.png)

# インターフェース
C++とC#のインターフェースは色々あります。

# マーシャルコピー
Marshal.Copy メソッド

# データ受け渡し（プラグイン -> C#)
プラグインC++の方
EXPORT_API void* GetColorBuffer(int* len)

これをC#から呼んでデータを保持する。メモリコピーが発生する。C++とC#のメモリ管理の違いから必要になる。高速化もできるけど面倒。

```
{
	int len = 0;
	IntPtr colBuff = GetColorBuffer(ref len);
	byte[] dst = new byte[len];

	Marshal.Copy(colBuff, dst, 0, len); // CV_8UC4

	_Texture.LoadRawTextureData(dst);
	_Texture.Apply();

	if (m_image != null)
		m_image.material.mainTexture = _Texture;
}
```

# データ受け渡し（プラグイン <= C#)

```

int len = 10;
IntPtr data = Marshal.AllocHGlobal(len*1 );

byte[] src= new byte[len];
for( int i = 0; i< 10; i++){
src[i] = (byte)(i+30);
}
Marshal.Copy(src,0, data, len);//src ,dst
int result = SetColorBuffer(ref len, data);
Debug.Log(string.Format("{0}\n",result));

```

```

	//private static extern int SetColorBuffer( ref int len, IntPtr data );
	EXPORT_API int SetColorBuffer( int* len, void* _data )
	{
		int tlen = *len;
		BYTE* data = (BYTE*)_data;
		int sum = 0;
		for( int i = 0;i < tlen; i++){
			printf( "%x", data[i] );
			sum += data[i];
		}

		return sum+1;
	}

```


# ビルド後イベント
pluginはVSでビルドあとに自動でUnity-Assets-Pluginsにコピーするとよいです。
Unityは再起動が必要です。ホットリロードの方法もあるけど不安定になった。
パス指定は￥マーク2個のターミネートで。
駄目なときは絶対パスでかく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/bdecdd45-f334-077d-164e-c0b2fe3d14c6.png)

# デバッグ
http://satoshi-maemoto.hatenablog.com/entry/2019/07/30/155847

#参考
http://tips.hecomi.com/entry/2015/09/16/014119
AWS EC2 AmazonLinux2 MySQL rootユーザの初期パスワードの確認方法

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

# 目的

- AmazonLinux2インスタンスを作成し起動後、MySQLをインストール直後の初期rootユーザのパスワードの確認方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| AWS EC2インスタンス | AmazonLinux2 | こちらの方法を用いてイメージからインスタンスを作成→[AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |
| MySQL バージョン | 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL) | こちらの方法を用いてMySQLのインストールを行った→[AWS EC2 AmazonLinux2にMySQLを導入する。](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |

# 前提情報

- 下記の方法、またはそれに準ずる方法でAmazonLinux2のインスタンスにMySQLが導入されていること。

https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06

- MySQLのログが出力される状態になっていること。(/var/log/mysqld.logのファイルに何らかのログが出力される設定になっていること。)

# 概要

1. ログの確認
1. MySQLログイン確認

# 詳細

1. ログの確認
    1. 下記コマンドを実行してMySQLのlogファイルを開く
  
        ```terminal
        sudo less /var/log/mysqld.log
        ```
    1. 開いたファイル内で下記の様な一行を見つける。

        ```/var/log/mysqld.log
        YYYY-MM-DDTHH:MM:SS.260490Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: XXXXXXXXXXXX
        ```
    1. ファイルに記載された行の`XXXXXXXXXXXX`の部分がrootユーザの初期パスワードとなる。
1. MySQLログイン確認
    1. 開いているmysqld.logファイルを閉じる。
    1. 下記コマンドを実行してmysqldを停止する。（この作業やらなくても大丈夫かも、というよりrestartで良いやん 2022/03/07確認）

        ```terminal
        sudo service mysqld stop
        ```
    1. 下記コマンドを実行してmysqldを起動する。（この作業やらなくても大丈夫かも、こっちも同じくrestartで良いやん 2022/03/07確認）

        ```terminal
        sudo service mysqld start
        ```
    1. 下記コマンドを実行してmysqlにrootユーザでログインする。

        ```terminal
        mysql -u root -p
        >password 先ほどログファイルに出力されていたXXXXXXXXXXXXの部分を入力する。
        ```
    1. 初期パスワードをリセットしたい方は下記を参照してパスワードを再設定する。
         - [AWS EC2 AmazonLinux2 MySQLを使えるようにする](https://qiita.com/miriwo/items/c0ba0ff17c329700fc9e)

# 参考文献

- [MySQLの初期パスワードのありか](https://qiita.com/RyosukeSomeya/items/c695487588f5ac28d9f4)
写真1枚で高精度な3D画像簡単作成やってみた【0】。(空間の捉え方を確認した、網をかける)

#概要
**写真1枚で** **高精度な3D画像↓　簡単作成**できるよう。
githubは、以下。https://github.com/vt-vl-lab/3d-photo-inpainting

論文『3D Photography using Context-aware Layered Depth Inpainting』
Meng-Li Shih1　さんらは、以下。https://arxiv.org/pdf/2004.04727.pdf

ここでは、空間の捉え方を確認するために、

   1. 元画像に対して、depthを算出させ、
   2. 既にdepth算出済の状態から、元画像に**格子**を入れて、3D処理を実施。

結果は、以下。(加工前の静止画の出典は、https://pixabay.com/ja/ ）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/f049052b-988d-1778-ba9f-6e4f7382372e.gif" width=480>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/b804d6be-6484-99df-4127-e3caec856972.gif" width=480>

⇒　**水平面、垂直面がうまくとらえられている**感じがする。

#まとめ
**上記のgithubの技術のポイントは、別のところにある**と思うので、これは、**そこで使っているベースの技術**の検討になっている(初心者で、そちらに関心がいった）。


尚、下記は、おそらくgithubの著者のレベルを超えた作品。　技術の軽微な破綻を、pizza取り分けの困難さに埋設？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/7c250f80-43d5-3e1b-7538-9574183e5d3b.gif" width="300">

(下記関連も含め、【1】⇒【2】⇒【3】⇒【0】(これ）の順で、記事を記載した。）
コメントなどあれば、お願いします。

#補足
論文の内容を少し意識するとした場合、
下記は、論文のfig.6であるが、**何を説明してくれているのか、全く、わからない**、と書こうと思ったが、、、そんな作業をしていると、少しづつ、わかってきた。。。**⇒別途**。

（出典：上記論文のfig.6）
<img width="824" alt="fig6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/37e4fe7e-3032-d1b0-a3b4-722c7010a7cb.png">

今後の予定：

* 多少、この論文を読む。
* inpaintingの技術を知る（古い技術含め）
* もっと良いdepth推定があるような気もするので、最良なdepth推定（を探してそれ）と組み合わせてみる。【3】のよりもっと良いものと。（これ、depth推定の良し悪しの評価にも使える気がする。。。）:star:（たぶん、この項を最初にやる）
* pizzaを超える作品をつくる。

#関連
**本記事の作業方法等がわかる**詳細情報は、以下の関連を参照願います。

(1)
[写真1枚で高精度な3D画像簡単作成やってみた【1】。(depthがPNGで編集できるようになりましたよ。)](https://qiita.com/torinokaijyu/items/aca0dc6fb038dcd023d7)

(2)
[写真1枚で高精度な3D画像簡単作成やってみた【2】。(depthをnumpyで加工してみる)](https://qiita.com/torinokaijyu/items/e761c00c87d6a00b8c30)

(3)
[写真1枚で高精度な3D画像簡単作成やってみた【3】。勝手にdepthのみ 別の手法（intel-isl のMiDaS他）。](https://qiita.com/torinokaijyu/items/6889598b732851c2e8fd)
→　ここで、depth estimationを別のもの（2種）にしている。
　ややサンプルが難しすぎたか、共通する課題のほうが目立つような結果。

(4)
:new:[写真1枚で高精度な3D画像簡単作成やってみた【-1】。(隠れた領域が、本当に見えるのか？)](https://qiita.com/torinokaijyu/items/20a5a478881c9d00f9ac)

#役立つかもしれない情報（一連の記事【-1】～【3】総合）
【1】
・GFORCE GTX1050Ti（専用GPUメモリ4.0GB)では、
  **GPUのメモリ不足で動かない場合あり**。
　これは、**画像サイズに依存するのではなく**、
　おそらく、画像の中身で3Dの表現に必要なメモリ量の関係か何か。
　解決策、見つけていません。パラメータ変更等でなんとかなるのかも。
  赤い車ので、専用GPUメモリ3.4GB程度、白のは2.7GB程度使用されていました。
　このメモリ問題に関しては、とりえず、Google Colabとかを使うのがいいのでは？
・PNGによるdepth情報の編集を示しましたが、確か、デフォルトはnumpy?。
　そのデータ(numpy)をガタガタ扱うのができる方は、そちらを編集するのもありかも。
・PNGで表現されたdepthの情報は、どこかで正規化されている気がする。PNGのdepthのレンジを
　　変更しても結果が同じだった気がする。:star:

【3】
・全面が壁のような画像の場合、垂直面がうまく検出できないような気がする。
　　（簡単だと思うので、不思議。）depthの手法をいくつか試したが、
　　いまのところ良いものに出会ってない。
multi-fastaの改行をワンライナーで削除する

multi-fastaファイルは配列が途中で改行されている場合があります。grepなどで任意の配列を抽出する場合は改行のない方が望ましいです。

簡単に変換する方法がないかと検索すると[マルチファスタの改行をとる(perl、awk)](https://sites.google.com/site/scriptofbioinformatics/pei-lie-jie-xi-guan-xi/maruchifasutano-gai-xingwotoru-perl)にawkを用いた下記のワンライナーを掲載されている方がおられました。

```sh
cat input.fasta | awk '{if ($1 ~ /^>/) print "\n"$1; else printf $1}' > output.fasta
```

ただ、実際に実行してみると1行目に空白が入ってしまいます。

対応として、このワンライナーに続けてsedコマンドで1行目を削除することで、目的のfastaファイルを作成できました。

```sh
cat input.fasta | awk '{if ($1 ~ /^>/) print "\n"$1; else printf $1}' | sed -e '1d' > output.fasta
```
【LeetCode学習記録】ZigZag Conversionを解いた

今日は，[ZigZag Conversion](https://leetcode.com/problems/zigzag-conversion/)を解きました．その中で学んだことを記録しておきます．
なお，私はPython初心者かつ，LeetCodeのような問題も始めたばかりなので，間違いの指摘や，アドバイスなどがあればお待ちしております．

#問題設定
s="PAYPALISHIRING"という文字列に対し，numRows=3が与えられたとき，

```python:result
P A H N
APLSIIG
Y I R
```
のようにギザギザになる．outputは各行を左から順に並べた"PAHNAPLSIIGYIR"となる．

# 最初に書いたコード
## 方針
- 与えられた文字列`s`について，先頭から順に0,1,...,(numRows-1),(numRows-2),...,1,0,...のようにkey=0,1,...,numRows-1を割り当てる．
    - インクリメント/デクリメントを判断する識別子`Inc`が必要？
- keyの小さいほうから順に結合し，それをoutputとして返す．
    - どうすれば文字列を結合できる？

以上の方針から，次のようなコードを書いた：

```python
class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        #エッジケースの処理
        if(numRows <= 1):
            return s
        
        d = defaultdict(list)
        Inc = True
        key = 0
        # label 0, 1,2,...,numRows,numrows-1,...,1,0,...
        for i in range(len(s)):
            d[key].append(s[i])
            if(key == numRows - 1):
                Inc = False
            elif(key == 0):
                Inc = True
            if(Inc == True):
                key += 1
            else:
                key -= 1
                
        # join d
        ans = ''
        for i in range(numRows):
            ans += ''.join(d[i])
        return ans
```
Runtime: 64ms
Memory: 12.8MB

## つまづいた点
### 同一のkeyを持つ要素の格納方法
同一の`key`を持つ`s[i]`に対して，

```python
d[key] = s[i]
```
とすると，値が上書きされてしまった．
これは，リストのメソッド`append()`を用いて，末尾に要素を追加するようにして解決した．
リスト関係のメソッドは他にも将来使いそうなものがたくさんあるので，今後勉強していきます．

### リストを文字列に変換する方法
forループ直後の`d`は，

```python
{0: [u'P', u'A', u'H', u'N'], 
1: [u'A', u'P', u'L', u'S', u'I', u'I', u'G'], 
2: [u'Y', u'I', u'R']}
```
のようになっていた．
forループを使って結合していくのも面倒だなと思って著と調べてみたら，リストを文字列に変換してくれる`join()`メソッドを見つけた．例えば，

```python
d[0] = ['P','A','H','N']
'.'.join(d[0]) # => 'P.A.H.N'
```
のようになる．
今回は`''`内に何も入れなければ単純に連結することになる．
そして，`join`した文字列を`key`の小さい順に`ans`へ足しこんでいけば，所望の`output`が得られる．

# コードの改善
LeetCodeでは，他人の考えたコードを見れる「Discuss」がとても良い．
この問題では[こちら](https://leetcode.com/problems/zigzag-conversion/discuss/3404/Python-O(n)-Solution-in-96ms-(99.43))を参考にさせてもらった．
改善版のコードは次に示す：

```python
class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if(numRows <= 1):
            return s        
        
        d = [""] * numRows
        Inc = True
        key = 0

        for i in range(len(s)):
            d[key] += s[i]
            if(key == numRows - 1):
                Inc = False
            elif(key == 0):
                Inc = True
            if(Inc == True):
                key += 1
            else:
                key -= 1
                
        
        return ''.join(d)
```
Runtime: 28ms(<= 64ms)
Memory:12.7MB(<=12.7MB)
で，実行時間を1/2以下にすることができた．

### リスト配列の初期化

例えば，

```
L = ['','','']
```
といったリスト配列を作るとき，

```
L = [''] * 3
```
とすれば，上と同等のものが出来ることを知った．
今回は0~numRows-1までのnumRowsこの要素が必要であることが明らかであるため，こちらのほうが柔軟かつ明示的になるだろう．

### keyごとの分類の改善
今思えば，同一の`key`の場合は`append()`するよりも，最初から結合したほうが1つ手順が減らせることに気づいた．
このようにすることで，forループ後にもう一度forループを用いて文字列を結合せずに，`''.join()`のみで済む．
Ruby on Rails 5.2.0 のcheatsheet

# はじめに
初めての投稿になりますが、
よろしくお願いします。

ruby on rails 5.2 現在学習したく、何かを作ろうと思っていたところでしたが、

さすがにコマンドがありすぎて、覚えきれない。。という印象でした。

自分の今後多分使えそうなコマンド、チートシートは一応まとめます；

# サーバー起動
`rails server / rails s`
-> サーバーを起動

# 名前のルール

### コントローラー周り
コントローラー名 -> キャメルケースで、後尾に「Controller」ついています。複数形
ファイル名 -> スネークケース (snake_case), 後尾に「Controller」ついています。複数形

```ruby:articles_controller.rb
class ArticlesController< ActiveRecord::Base
 def show
    # ...
  end
  # etc
end
```

### モデル/db周り
ファイル名 -> 単数形, 全部小文字、スネークケース (snake_case)
モデルのクラス名 -> キャメルケース、単数系

```ruby:article.rb
class Article < ActiveRecord::Base
 
end
```

テーブル名 -> スネークケース (snake_case), 複数系
カラム名 -> スネークケース (snake_case), 単数系

```
+--------------------------+
| article_categories       |
+------------+-------------+
| id         | ID          |
| name       | STRING      |
| article_id | FOREIGN KEY |
+------------+-------------+

+------------------------------+
| articles                     |
+---------------------+--------+
| id                  | ID     |
| name                | STRING |
| content             | STRING |
+---------------------+--------+
```

#便利なコマンド
`rails generate controller <名前>`
-> controller作成

`rails generate migration <名前>`
-> db の migration 作成

` rails generate model <名前> `
-> model 作成

```
例) 
rails generate migration add_email_to_users email:string
```


`rails db:migrate/rake db:migrate`
-> 作成した migrate を database に反映させる

`rails db:rollback`
-> 実行したコマンドをキャンセルする

`rake db:reset`
-> db を全削除
`rake db:drop `
-> migrateを全削除


`rails generate scaffold <名前>`
-> 魔法コマンド、controller,model,viewなどは作成してくれます、
プロトタイプに最適ですが、あまり頼りにしないように注意
`rails destroy scaffold <名前>`
-> 作成したscaffold を削除する

# db コンソール周り

```
rails console
rails c
exit
```

#バンドル 周り
gemfile のファイルにアップデートする時、以下のコマンド
bundle update
bundle install
bundle install --without production 
*productionのコンフィグは除きたいとき


以上です。
【Salesforce】einstein analytics でデータ結合（augment ）を行うときの注意点

結合キーとなる項目はNULLになってはいけない。
複数結合キーがあった場合、すべての結合キーがNULLでない必要がある。

https://help.salesforce.com/articleView?id=bi_integrate_augment_match_operations.htm&type=5
新人社員がSIer運用に配属されて辛かったこと

#初めに
情報系の大学院を卒業後、大手金融のシス子に入社して4年と少し経ちました。成長したことや苦労したこと、世間でよく言うSIerの問題点についても少しづつわかってきたのでまとめを書いてみます。

#今までの経歴
・親会社が大手金融のシス子に入社
・社内WEB基盤システムの運用担当に配属される。
・WEB画面開発の助っ人として半年ほど開発・テスターを行う
・バッチ処理を行うシステムのPM補助兼プログラマになる←今ここ

#なぜSIerに入社したか
情報系の大学院を卒業したので、ITという専門業界に入ろうと考えました。コミュ障だったが、技術スキルに自信があったので、技術力を生かせる仕事がしたいと思っていました。

#入社後のギャップ
最初に配属されたのは、WEB基盤の運用担当でした。「ITなら開発でしょ」と思って、運用なんて知らない私はこれが第一のギャップでした。
配属されたのは、社内オープン系で最大のシステムでした。いわゆるRailsやSpringのような社内WEBフレームワークの一種だと思いますが、ハードや一般的でない機能まで包括しており、どのような方針で設計しているのかさっぱりわかりませんでした。

「わかんなかったら聞けよ」という声が聞こえてきますが、先輩が知っているのは細い機能だけ。後になって分かったことですが、難しい部分（設計レベルから）は外部会社に丸投げしており、プロパ社員にはノウハウがないようでした。

じゃあ、どんな仕事をするのといえば、開発担当の要望に合わせて、DBのチューニングだの、パロメータの変更だの仕事が押し付けられて、言ってしまえば雑用係です。
「そのくらい自分でやれよ」と言いたいところですが、「重要な基幹システムを扱っているので、それを操作するの人を制限するため」が理由のようです。当時は、重要な役割を任されている反面、マニュアルに沿った単純作業で、スキルが全く身につかないことに焦りを感じておりました。

#仕事への不満と不信
以下に列挙します。感情的なところもありますがご了承ください。

・開発担当からの情報連携がない
ないと言ったら「文字通り」ないです。定例確認で初めて新しい機能が追加されたことを初めて知ることは当たり前。お客様からクレームが入って、新規リリースがあったことを初めて知ることもよくあります。

これではまともな仕事になりません。

またまた、「わかんなかったら聞けよ」が聞こえてきますが、密室でどのような談合がなされているかをどのように聞けばいいのでしょう。「ここにいない人手を挙げて」というくらいナンセンスな話だと思っています。
そもそも、聞けばちゃんと説明するのでしょうか。自分だけが知っていればいいみたいな感じで話を進め、「お前には関係ない」みたいなことを言いながら、もったいぶって説明しない人には、聞くほどの信用がありません。
上部から「運用に文句を言われないように開発進捗を隠せ」と指示が出ていたことを、後になって知りました。

・マニュアルが整備されていない
運用はマニュアルに沿って定例作業を行う仕事です。しかし、世の中マニュアル通りにいかないことは小学生でも知っています。
私が思うにマニュアルは武器です。時間がたてばさび付いて使い物にならなくなります。
そういった原因は、開発によるシステム変更ですが、それが連携されません。（というか、どのようなマニュアルが存在しているか把握していないです。）
運用はどのような開発をしているか把握していないため、すれ違いが起こります。では、運用はどのように運用するのかというと、つまるところは「勘」です。なんて恐ろしい。

#では、どうしたらいいか
どうにもならないと感じました。運用にいる限り。
運用効率化という話もありますが、それは、原則、運用設計によるもので開発によって行われるべきものです。結局、開発が取りこぼした仕事をのしりぬぐいしているだけす。細かい改善のみで、枠を超えれば「出る杭は打たれます」。
偉くなれば、運用設計に口出しすることもできるかもですが、私には無理でした。

#異動しよう
チャンスが訪れたのは3年目。画面開発、つまり、私を使っている側の担当で助っ人に呼ばれることがありました。
この担当、Qiitaでは笑われてしまうような、Excelぺたぺた、CVSでリポジトリ管理しているところでしたが、それでも、今までの仕事に比べよほど専門的な仕事をしているように感じました。

その流れで、社内バッチ処理システムの開発に配属され、晴れて運用からおさらばすることができました。不満がないわけではないですが、運用は「不条理な」苦労が多かった。。

#開発としての運用への向き合い方
配属ガチャによりますが、運用になるべきでなかった。もちろん向き不向きがありますが、最新技術を学びたい人には向きません。

私は運用はエンジニアではなくむしろユーザの一部だと思っています。運用はシステムを「使う」人であり、「作る」人ではありません。その意味ではエンジニアでないです。

その意味で、原則、上流工程から運用要件を要件定義に組み込み、機能として運用設計を行うべきだと思っております。
一方で、現実には開発で実装しきれないこともあり、それを運用が人力で解決していることも理解しております。

なんとも結論しにくいですが、開発としては、状況を説明をするといった最低限の礼儀は守りたいところです。それもせずに、「運用もエンジニアの仲間」といったような、甘えた仲間意識は殺意がわくのでやめましょう。

運用が下流工程であることは事実なので、手取り足取りが必要です。知らないことは知らないことを知ってください。とにかく情報がないです。
臨機応変に対応することは当たり前ではないです。なぜならそれは、根本的には、開発担当の不備だからです。それを対応してくれた運用担当を加点評価してください。
お互い責任感を持って仕事をしたいものですね。運用の人を見かけたら、「今日もご苦労様」といった心持でお願いします。

#結局、何がわかったのか
運用設計は開発の一部なので、開発が責任を持ちましょうということ
【Julia・Genie】Genieのサーバー再起動


#ハマった内容
JuliaのWebフレームワークであるGenieでのローカルサーバ再起動時にハマってのでメモします。

#失敗例
下記のようにバックグラウンドからはローカルサーバを起動できなかったので、フォアグラウンドから起動してみました。

```julia
# JuliaのPkgモードに入ってアプリの設定を取り込む
pkg> activate GenieBookShelf
#Genieでアプリをロード
julia> using Genie
julia> Genie.loadapp("myapp")
#バックグラウンドで起動
julia> myapp.startup()
```

#成功例
下記のようにフォアグラウンドで起動すれば問題なく動きました。

```julia
# JuliaのPkgモードに入ってアプリの設定を取り込む
pkg> activate GenieBookShelf
#Genieでアプリをロード
julia> using Genie
julia> Genie.loadapp("myapp")
```
```terminal
#フォアグラウンドで起動
cd myapp  
./bin/server -l 0.0.0.0
```

#参考
https://qrunch.net/@Krjwuh1JmxFA4tb0/entries/iY5wm22VtMRj30ak
GitHub ActionsからFastlaneを使ってApp Store ConnectへIPAをアップロードする

# はじめに
GitHub Actionsを使いApp Store ConnectへIPAをアップロードする設定を行った。
特にApp Store ConnectとGitHub Actions間でのセッション更新を月に1度程度実施する必要があり、今後も管理が必要なため実施した作業などについてまとめておく。

# 環境および役割

- GitHub
    - クレデンシャルを登録/管理
       - p12ファイル、プロビジョニングプロファイルはbase64エンコードして登録
       - Fastlane関連のクレデンシャル
- GitHub Actions
    - GitHubで管理されているクレデンシャルを利用
    - 環境変数としてクレデンシャルをビルドマシンに登録
    - base64エンコードされたp12ファイル、プロビジョニングプロファイルをデコード
- Fastlane
    - cert、プロビジョニングプロファイルを登録
    - IPA作成
    - App Store ConnectへIPAをアップロード

Fastlaneが提供する証明書関連の管理機能としてmatchという機能があるようだが、base64エンコードしたプロビジョニングプロファイルなどを利用することで問題ないと判断し導入は見送った。

セットアップに時間がかかった点として、GitHub ActionsからApp Store ConnectへIPAをアップロードする際に必要な認証周りである。
今後もセッションの更新作業が必要になるがこの点については`FASTLANE_SESSION`を利用して対応した。
詳細については以下記事に詳しい。

- [fastlaneでAppleIDの2段階認証に詰まったときにやったこと](https://qiita.com/koringo2/items/5ba4ba7b4bc0d8557bc0)
- [application-specific-passwords](https://docs.fastlane.tools/best-practices/continuous-integration/#application-specific-passwords)

# FASTLANE_SESSIONの更新作業

前述の通り`FASTLANE_SESSION`についてGitHub Actions <=> App Store Connectの環境間での通信で定期的(おそらく1回/月程度)に更新をする必要がある。
手順は以下の通りとなる。

1. `fastlane spaceauth -u user@email.com` を実行
2. `Should fastlane copy the cookie into your clipboard, so you can easily paste it? (y/n)`と聞かれるためyesを選択しcookieを保存
3. GitHubで管理している該当のクレデンシャルを更新

# p12ファイル、プロビジョニングプロファイルの更新

1年に1度更新する必要があるiOSアプリ関連の証明書についてbase64エンコードしてGitHubに登録をする必要がある。
手順については概ね以下の通り。

1.証明書を更新
2.base64エンコードを実施

```
$ openssl base64 -in Distribution.p12 -out Distribution.txt
$ openssl base64 -in Production.mobileprovision -out Production.txt
```

3.base64エンコードした結果をGitHubに登録

これらの手順については以下記事に詳しい。

- [GitHub Actionsでfastlaneのmatchを使わずにAdHoc書き出しをしてからFirebase App Distributionにアップロードする](https://dev.classmethod.jp/articles/build-adhoc-on-github-actions-and-upload-to-firebase-app-distribution/)

# Appendix

- [GitHub Actionsでfastlaneのmatchを使わずにAdHoc書き出しをしてからFirebase App Distributionにアップロードする](https://dev.classmethod.jp/articles/build-adhoc-on-github-actions-and-upload-to-firebase-app-distribution/)
- [Github ActionsでiOSアプリのデプロイを自動化する](https://qiita.com/hirothings/items/0cd2561dbf6c53cf470c)
- [fastlaneでAppleIDの2段階認証に詰まったときにやったこと](https://qiita.com/koringo2/items/5ba4ba7b4bc0d8557bc0)
- [application-specific-passwords](https://docs.fastlane.tools/best-practices/continuous-integration/#application-specific-passwords)
業務でよく利用する、Visual Studio Codeショートカット

# 記事の投稿理由
業務でよく利用するVS Codeのショートカット等の情報を、自分のためにもまとめようと思います。
現在phpの開発をeclipseにより行なっております。
eclipseで既存のソースコードに対して上書き保存すると、文字コードや改行コードが変化してしまう場合があるので、上書き時はVS Codeを利用しています。
その他に、jsonに触れる場合も、VS Codeを利用しています。

# VS Codeショートカット
## 参考URL
[VS Codeマニュアル](https://code.visualstudio.com/docs/)
[VS Code キーバインド](https://code.visualstudio.com/docs/getstarted/keybindings#_keyboard-shortcuts-reference
)

### ショートカット
macを業務で利用する機会が多いので、以下のマニュアルを元に記載を進めます。
https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf

自動改行のON、OFFを切り替え。
長い文字数のJson、CSS等をテキストファイルに保存する場合便利です。
`⌥Z` Toggle word wrap

フォーマットの整形
`⌘K + ⌘F` Format selection

# 補足
業務で頻繁に利用するショートカットや、自分の業務効率が上がる、コマンドを随時肉付けしてゆこうと思います。
Google Spreadsheet でリレーショナルなデータを作る方法

## 方針

VLOOKUP の範囲にて別シートを IMPORTRANGE で指定する。

VLOOKUP の公式ヘルプは↓
https://support.google.com/docs/answer/3093318?hl=ja

## やり方

VLOOKUP の仕様は、

```
VLOOKUP(検索キー, 範囲, 番号, [並べ替え済み])
```

なので、

```
=VLOOKUP(検索キー,IMPORTRANGE("シートID","シート名!A:B"),どの列を表示するかの列ID,FALSE)
```

とかで。
[AWS] EFSの基本

#EFSとは
AWSおよびオンプレミスリソースで使用するための、フルマネージド型(=AWSが管理してくれる)のNFS(=Network File System)。

#NFSってなに
ネットワークファイルシステムの名前の通り、ネットワークを介して**複数のマシンがファイルやストレージ領域をNFSサーバを介して共有**できるようにする仕組み。このNFSサーバに当たるのがEFSと思うと個人的に分かりやすい。


#2つのストレージクラスとライフサイクル管理
利用される頻度に応じて2つのストレージクラスがある。

**スタンダードアクセス**
頻繁にアクセスされるファイルはここに格納。名前通り。

**低頻度アクセス(IA)**
こちらも名前通り。アクセス頻度が低くて長期間保存されるファイルを安く格納することができる。


**ライフサイクル管理**
初めはよく使ってたけど最近使ってないからこのファイルは低頻度アクセスに移動させようと毎回毎回考えるのはめんどくさい。
そこでライフサイクル管理の登場である。この機能を使うと、設定で「X日このファイルにアクセスしていなかったら低頻度アクセスストレージに移動させておいて」ということが可能になる。

#セキュリティ
大きく4つある。気が向いたら詳しく書きます。

**EFSでのデータの暗号化**
・保存データの暗号化
・転送データの暗号化
の2つがあります。

**IAM**
IAMが絡まないAWSリソースはあるのだろうか。EFSへのアクセスを制御できます。

**ネットワークアクセスの制御**
マウントターゲットのセキュリティグループを使用します。詳しくは筆者が理解していないので割愛。

**NFSレベルのユーザー、グループ、およびアクセス許可**
こちらも理解できていないため割愛。

#最後に
初学者なりに毎日AWSサービスで学んだことを書いていきます。間違っていたら訂正コメントお願いします。

参考
EFS:
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/whatisefs.html

NFS:
https://baremetal.jp/blog/2018/04/17/541/
https://ja.wikipedia.org/wiki/Network_File_System
【プログラミング初心者】Swift練習問題~繰り返し２~

#練習問題
##練習問題１−１
引数に与えられた少数型の配列の合計値を求める関数`sum`を作成してください。

```swift
func sum(of values: [Double]) -> Double {
    ...
}
```
回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/070c1443410ab50e7b7b#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%EF%BC%91%EF%BC%91)

##練習問題１−２
引数に与えられた少数型の配列の平均値を求める関数`average`を作成してください。
※配列の要素数が０の場合はnilを返してください。

```swift
func average(of values: [Double]) -> Double? {
    ...
}
```
回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/070c1443410ab50e7b7b#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%EF%BC%91%EF%BC%92)

##練習問題２
引数に与えられた整数型の配列の中から最大値を返す`max`関数を作成してください。
※配列の要素数が０の場合はnilを返してください。

```swift
func max(of values: [Int]) -> Int? {
    ...
}
```
回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/070c1443410ab50e7b7b#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%EF%BC%92)

#応用問題
##応用問題１
第一引数に整数配列を渡し、第二引数に整数を渡すと、整数配列の中から足したら第二引数の整数となる２つの整数を返す関数`twoSums`を作成してください。
組み合わせが見つからない場合は空の配列を返してください。
配列の先頭から検索し、解が２つ以上見つかる場合は先に見つかった組を返してください。

```swift
func twoSums(from values: [Int], target: Int) -> [Int] {
    ...
}

let values = [3, 2, 9, 1, 10]

let result1 = twoSums(from: values, target: 11)
print("result1: \(result1)")
let result2 = twoSums(from: values, target: 8)
print("result2: \(result2)")
```
```:実行結果
result1: [2, 9]
result2: []
```
上記`result1`は[2, 9]と[1, 10]がありますが[2, 9]が先に見つかるためこちらを返します。

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/070c1443410ab50e7b7b#%E5%BF%9C%E7%94%A8%E5%95%8F%E9%A1%8C%EF%BC%91)

##応用問題２
引数に与えた数字の範囲内の素数を全て配列として返す関数`getPrimeNumbers`を作成してください。
※素数とは、1 より大きい正の整数で、正の約数が 1 と自分自身のみであるもののこと

```swift
func getPrimeNumbers(limit: Int) -> [Int] {
    var primeNumbers: [Int] = []

    ...

    return primeNumbers
}

print(getPrimeNumbers(limit: 100))
```
```:実行結果
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
```
【補足】
配列への要素の追加は`primeNumbers.append(数字)`でできます。
例）`primeNumbers.append(10)`

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/070c1443410ab50e7b7b#%E5%BF%9C%E7%94%A8%E5%95%8F%E9%A1%8C%EF%BC%92)

#最後に
別の問題は以下に掲載しています。
また本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載も以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/
【Mac】MAMP のドキュメントルートを「htdocs」から変更する方法

# MAMP のドキュメントルートを「htdocs」から変更したかった

最近 PHP の勉強をはじめました。
ローカルの環境構築は MAMP で行ったのですが、デフォルトのルートディレクトリである「htdocs」では、いろいろと面倒なことに気づいたので、
変更する方法を調べたので残しておきます。

## 環境

- MAMP : 5.7
- MacOS: Catalina 10.15.3

## 結論

- MAMP → Preferences → Web Server → Document Root から任意のディレクトリをルートディレクトリに設定することができます。

## まずは MAMP を起動する
まずは MAMP を起動する。

![BFCC6CF9-8C55-40E1-AC98-011940B79DAE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485313/ead547ef-5303-8c4d-5a03-332b027a4d57.jpeg)

## 「Preferences」を開く
左上の「MAMP」から、選択することができます。

![E4CE9D0B-03A7-4389-9359-01203638D545_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485313/4b08d9e2-2a0e-740f-bcc6-7c0d25fd56f3.jpeg)

「WebServer」を選択する。

![588AB119-59F9-4431-9FC4-4A0C2D375320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485313/497c47c5-6c6b-c91a-cff6-aedc83de660a.png)

## 「Document Root」にて、任意のディレクトリをルートディレクトリに設定する。

任意のディレクトリを設定する。

![A60A0C00-2C6F-44F4-AA4F-CB581BA62728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485313/e595c6cf-eb2b-2de1-a6a5-6ef49762f3b6.png)

## テスト

1. 適当な PHP ファイルを作成し、以下のURLにアクセスする。

http://localhost:8888/ 

```MAMPtest.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php print("PHP が実行されています！"); ?>
</body>
</html>

```

2. PHP が実行されていたら成功！

![1C52D088-3602-4920-ACC1-AE0995CE3264_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485313/dc2c9f21-0ac3-6dc6-8bb4-13eeb12054ba.jpeg)

## 参考

[bridge: MAMPでファイルの保存先を変更する方法](https://bge.jp/mamp-folder-remove/)
Windows レジストリ キー名中の「\uFEFF」による文字列出力の打ち切り

レジストリキーの名前に含まれていた文字コード`\uFEFF`（ZERO WIDTH NO-BREAK SPACE）がコンソールへの出力を途絶えさせていた事件。

C++でHKEY_CLASSES_ROOT以下のキー名を出力するコードを書いていたのですが、なぜか".mpv4"以降がプログラムは動いているのに出力されなくなりました。次のような感じです。

```plain:出力の一部
.mpeg: ...
.mpg: ...
.mpv2: ...
.mpv4
```

どうしてかと直前の.mpv2で止めてデバッグしてみたら、`".mpv4"`の正体が`".mpv4\uFEFF\uFEFF"`でした。`\uFEFF` (65279)は「ZERO WIDTH NO-BREAK SPACE」という名称の通り幅0の文字であり、Visual Studio 2019のローカル変数ウィンドウでもレジストリエディタでも表示されません。一方でコンソール（Windows 10のcmd.exe）は対応していなかったのか、そこから先が出力されなくなりました。

明らかに怪しいので、アプリケーション側で対応せずレジストリエディタで「HKEY_CLASSES_ROOT\\.mpv4」の末尾から見えない空白を2回削除してひとまず解決しました。

原因として思い当たることは特にありませんでした。

いつか、レジストリキーの名前にASCII以外の文字が含まれるかのプログラムでも書いてチェックしたいです。
Gatling DSL の EL 式と Scala の変数展開が同居するとややこしい件

**（2022-03-03追記）** 本記事で取り上げた内容は [#4157](https://github.com/gatling/gatling/issues/4157) で解決され、Gatling 3.7 で取り込まれました。Gatling 3.7 以降の EL 式では、`${}` の代わりに `#{}` を利用することが推奨されています。[^1]

[^1]: https://gatling.io/docs/gatling/reference/current/upgrading/3.6-to-3.7/

---

Gatling は Scala でテストコードを記述する負荷試験ツールですが、その多くを占めるシナリオ部分は [Gatling DSL](https://gatling.io/docs/current/general/concepts#scenario) と呼ばれる[ドメイン特化言語](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%9B%BA%E6%9C%89%E8%A8%80%E8%AA%9E)で記述します。

## Gatling DSL の EL 式（Expression Language）

`Gatling DSL` の EL 式は Gatling のセッション属性(`Session attributes`)への参照を埋め込む際に利用します。

```scala
// セッション属性 foo に値を設定する
session.set("foo", "FOO")

// Session API でセッション属性 foo の値を取り出す
session("foo").as[String] // FOO

// EL 式でセッション属性 foo の値を取り出し、文字列に埋め込む
"${foo} BAR" // FOO BAR
```

基本的には `${属性名}` という記法で参照を得ますが、EL 式に組み込まれた機能を利用してもっと複雑なこともできます：

```scala
// コレクション foo のサイズを得る
"${foo.size()}"

// インデックス付コレクション foo からランダムな要素を一つ取り出す
"${foo.random()}"

// インデックス付コレクション foo から 5 番目の要素を一つ取り出す
"${foo(5)}"

// インデックス付コレクションもしくはタプルである foo から n 番目の要素を取り出す
"${foo(n)}"

// タプル foo から 2 番目の要素を取り出す
"${foo._2}"

// マップ foo からキーが bar である要素を取り出す
"${foo.bar}"

// foo があれば true を、なければ false を得る
"${foo.exists()}"

// foo がなければ true を、あれば false を得る
"${foo.isUndefined()}"

// foo を JSON 形式でフォーマットした値を得る
"${foo.jsonStringify()}"
```

`Gatling DSL` の EL 式は **`Gatling DSL` の関数に渡される String に対してのみ動作します。**

## Scala の変数展開

一方、Scala には変数展開（あるいは「文字列の補完」、`string interpolation`）という機能があります。文字列の前に補間子（`interpolator`）をつけることで、変数へ参照を埋め込むことができます。

```scala
val foo = "FOO"
println(s"$foo BAR")  // FOO BAR
```

基本的には `$変数名` という記法で値を取り出しますが、`${式}` という記法で任意の式を埋め込むこともできます：

```scala
println(s"${1 + 1}")  // 2
```

Scala に組み込まれた補完子は三種類あります。

```scala
// s 補完子。シンプルな変数展開を実現します。
val foo = "FOO"
println(s"$foo")  // FOO

// raw 補完子。s 補完子の機能に加え、エスケープを実行しません。
println(raw"{"foo":"$foo"")  // {"foo":"FOO"}
// """～""" でも raw 補完子と同じ効果を実現します。
println("""{"foo":"$foo"}""") // {"foo":"FOO"}

// f 補完子。C の printf のようなフォーマット付文字列を実現します。
val decimal = 10
println(f"$foo%s $decimal%d") // FOO 10
```

## 混在するとなにがややこしいのか

さて、Scala の変数展開では、下のような記述も許されます：

```scala
s"${foo} BAR" // FOO BAR

"""${foo} BAR""" // FOO BAR
```

Gatling DSL の EL 式にそっくりですね。実際の所、Gatling DSL でも Scala の変数展開を利用することはできますが、それぞれの機能は排他的です：

```scala
session.set("foo", "FOO")
val bar = "BAR"

"${foo} BAR" // FOO BAR         -- 1
s"FOO ${bar}" // FOO BAR        -- 2

"${foo} ${bar}" // FOO ${bar}   -- 3
s"${foo} ${bar}" // error!      -- 4
```

3 や 4 のように変数とセッション属性の取得を同時に行いたい場合は、変数をセッション属性にセットするか、式展開で `Session API` を呼ぶことで実現できます。

## 参考リンク

* [EXPRESSION AND EL](https://gatling.io/docs/current/session/expression_el)
* [文字列の補間](https://docs.scala-lang.org/ja/overviews/core/string-interpolation.html)
スライド機能をreact-id-swiperで実装したらめちゃくちゃ簡単だった話

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#Reactでスライド機能を実装したい

[こんな感じの画像をスライドで表示する機能を実装したい](https://www.houyhnhnm.jp/walkers_club_h//)

調べてみると[react-id-swiper](react-id-swiper/)が良さげでした！

#Swiper (react-id-swiper)を導入

1.react-id-swier をインストール

```
$ npm install --save react-id-swiper@latest swiper@latest
```

2.[こちらのサイトで好みのサンプルを探して実装する](https://kidjp85.github.io/example/loop-mode-infinite-loop//)。
スライドをループできる様にしたかったのでこちらを引用しました！

```react

  import React from 'react';
  import Swiper from 'react-id-swiper';
  const LoopModeInfinityLoop = () => {
    const params = {
      slidesPerView: 1,
      spaceBetween: 30,
      loop: true,
      pagination: {
        el: '.swiper-pagination',
        clickable: true
      },
      navigation: {
        nextEl: '.swiper-button-next',
        prevEl: '.swiper-button-prev'
      }
    }
    return (
      <Swiper {...params}>
        <div>Slide #1</div>
        <div>Slide #2</div>
        <div>Slide #3</div>
        <div>Slide #4</div>
        <div>Slide #5</div>
      </Swiper>
    )
  };
  export default LoopModeInfinityLoop;
```
これを参考にして、こんな感じで実装完了！

```react

const params = {
        slidesPerView: 1,
        spaceBetween: 30,
        loop: true,
        pagination: {
            el: ".swiper-pagination",
            clickable: true,
        },
        navigation: {
            nextEl: ".swiper-button-next",
            prevEl: ".swiper-button-prev",
        },
    };
.
.
.
<Swiper {...params}>
    {images.map((image) => (
        <div key={image.url}>
            <ImageStyled
                id="DonationImage"
                src={image.url}
                size="medium"
                centered
            />
        </div>
     ))}
</Swiper>
```

#参考記事
・[React で Swiper 使ってみた (react-id-swier)](https://qiita.com/ryo-hashioka/items/b10e630e54bf33435676/)
・[react-id-swiper](https://github.com/kidjp85/react-id-swiper/issues/178/)
Git専用SSH公開鍵の作成

* [自分とこの環境下におけるGit & GitLabレクチャー](https://qiita.com/NeK/private/dee76f411cf2488b6873)

通常，SSH公開鍵の作成は[ここの手順](https://qiita.com/NeK/items/2b02b271ce4040610fc8#gitlab%E4%BD%BF%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A)で行う．この場合の公開鍵は他のサービスでも使うかもしれず共用のものとなる．
ここではGit専用のSSH公開鍵を作成し，仮に再作成した場合でも他のサービスに影響がないようにする．

# SSH設定
## SSH公開鍵の作成
鍵タイプrsa,鍵のファイル名をgitlab(公開鍵:gitlab.pub,秘密鍵:gitlab)とした場合のコマンドは以下のようになる．

```terminal
$ ssh-keygen -t rsa -f ~/.ssh/gitlab
```

rsaはデフォルトなので-t rsaはいらないかもしれない．
ちなみにさらに色々書くと以下のようになる．

```terminal
$ ssh-keygen -t rsa -f ~/.ssh/gitlab -b 2048 -C "メールアドレス"
```

以下のコマンドで鍵ファイルが作成されていることを確認する．

```terminal
$ ls ~/.ssh/
```

## 利用のための設定
設定ファイルは以下となる．

* ~/.ssh/config

configファイルの最後に以下を追記する．configファイルがなければ新規作成して以下を記載する．

```text:config
HOST gitlab.mylab.ac.jp
  HostName gitlab.mylab.ac.jp
  IdentityFile ~/.ssh/gitlab
  User git
```

ここで接続先となるGitLabは便宜的に以下のようにしている．実際に使用している名前に置き換えること．

- GitLabのFQDN
    - gitlab.mylab.ac.jp

config各行の説明は以下のとおり．

- HOST [接続名]
    - 使用する接続名．例えば ssh gitlab.mylab.ac.jp で設定どおりの接続が可能．
- HostName [接続先FQDN or 接続先IP]
    - 接続先の指定．
- IdentityFile [秘密鍵]
    - 秘密鍵の指定．
    - windowsだと，"Identi<font color="Red">f</font>yFile"かもしれない．
- User [User名]
    - 接続ユーザを指定．ssh user@接続先のuserに相当．git cloneで使用するのでgitを指定．
- その他
    - Port [ポート番号]
        - ポート番号も指定可．

# GitLabでの設定
[ここの手順](https://qiita.com/NeK/items/2b02b271ce4040610fc8#gitlab%E4%BD%BF%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%AD%E5%AE%9A)にもあるように，作成したgitlab.pubの中身をGitLab上の然るべきところに張り付けておく．

# 困ったときに
## git@なのにパスワードを求められる．
httpsアクセスではなくsshアクセスで，公開鍵も設定しているのにパスワードを求められる場合に考えられること．

研究室内からみたgitlabのIPと研究室外からみたgitlabのIPがdnsのせいで異なっていたりする．この場合，configのHostNameがFQDNだと研究室外からpush出来なかったりする．

### 解決方法
~/.ssh/configのHostNameをIPで指定する．

### 解決できたか確認
以下のコマンドで，パスワードを求められず，Welcome なんとか！などのメッセージが出てればOK

```bash:terminal
$ ssh -vT git@[gitlabのFQDN]
```
アフターエフェクトの円を描くような動き　左回り　逆回り

パスのトリミング
をつかって円を描くようなシェイプアニメーションを作ろうとしたが、

スタート
開始点0%
終了点0%

エンド
開始点0%
終了点100%

で設定すると右回り

なんか反対周りはどうするのか　なかなかわからなかったのでメモしておく


上の設定プラス
スタートのオフセット360°
エンドのオフセット0

にするといいみたい。



なんかいじってたらできたけど、なんかいまいち完全に理解できていない気がする
「クロスサイトリクエストフォージェリ（CSRF）」とは

## 概要
クロスサイトリクエストフォージェリ（CSRF）とは、Webアプリに存在する脆弱性、その脆弱性を利用した攻撃方法

## 攻撃の特徴
Webアプリが、拒否すべき他サイトからのリクエストを受信し処理してしまう
ユーザーが攻撃用WEBサイトにアクセスすると不正なリクエストが攻撃対象サーバに送られる
GithubDesktopと使ってGithubと新規アプリの連携の仕方

# GithubDesktopを使ってGithubと新規アプリを連携する


###大まかな流れ
1.新規アプリ作成
2.githubDesktopに新規リポジトリ追加
3.コミット　
4.リモートリポジトリに反映



##1.新規アプリ作成
```
$  rails new アプリ名
$  cd アプリ名
$  rails db:create
```
`rails new 「アプリ名」`で新規アプリ作成。
`cd 「アプリ名」`で作成した新規アプリのディレクトリに移動。
`rails db:create`でデータベース作成



##2.githubDesktopに新規リポジトリ追加
「Add」 →　「Add Existing Repository」の順に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307555/ebbdf91d-f0c6-32da-276e-6887190f8ad5.png)


ローカルの新規アプリのパスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307555/05ce52ca-2165-5f1c-52d4-60e7aed03e05.png)


**上記で選択できない場合は
ターミナルで以下コマンドを実行してから。**

```
$ cd ~/projects/git-app
$ git init
```


##4.コミット
・初回コミット名は「initial　commit」などわかりやすいものにする。
・「commit to master」を押してコミット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307555/e234dda0-1bb8-36ee-176a-8b40140da77d.png)


##4.リモートリポジトリに反映
GitHub Desktop では、Publish ボタンを押すとリモートリポジトリが作られていない場合にリモートリポジトリも作ってくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307555/a18f872d-7346-56ac-b69d-6a1a109339dd.png)


これで連携は完了です。
ゼロから始めるLeetCode Day50「739. Daily Temperatures」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day49 「1323. Maximum 69 Number」](https://qiita.com/KueharX/items/2d18458c80aa39a0c386)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。

50回ですよ！50回！

# 問題
[739. Daily Temperatures](https://leetcode.com/problems/daily-temperatures/)
難易度はMedium。
Top 100 Liked Questionsからの抜粋です。

問題としては、それぞれの日の気温を格納したリストである`T`が与えられます。
それらの要素が入力の各日より暖かい気温になるまで何日かかるかを示すリストを返すアルゴリズムを設計してください。

例えば、`T = [73、74、75、71、69、72、76、73]`である場合、返すリストは`[1、1、4、2、1、1、0、0]`となります。

なお、気温の長さは`[1,30000]`、各気温は`[30,100]`の間で与えられるものとします。

問題を見た時、最初はえ？？なんで出力がこうなるの？と思いましたが、よくよく見てみたら自分の理解力が低いだけでした。

次の日との差とかではなく、単純に何日後にその日の気温を超えるかを導けば良いだけなんですね。

# 解法

最初に0が要素の長さ分入ったリストを用意してあげて、素直にリストを舐めていくのが分かりやすいかと思いました。
stackを使えばLIFOなので、より簡単に実装できるでしょう。

例の場合でしたら、stackと`[0]`を`T`の長さの分だけ最初に用意します。
そこからリストを舐めていきましょう。

ここで大事なのは、どういった条件付けで代入を行い、そして要素をずらすためにはどういった処理を行えば良いかという点でしょう。

この場合であれば、`stack`が存在し、かつ`T[stack[-1]]`が　前から舐めていった際の要素よりも大きい場合にのみ`ans`の要素をポップし、要素の順番から`stack`の最後の要素を引いたものを入れれば良い、ということになります。

そして、`stack`にインデックスを追加し、要素がなくなるまで繰り返し行えば`ans`の中に各日程の所要日数が取れると思います。

ここまでの流れを書いてみました。

```Python
class Solution(object):
    def dailyTemperatures(self, T):
        ans,stack = [0] * len(T),[]
        for i, j in enumerate(T):
            while stack and T[stack[-1]] < j:
                ans[stack.pop()] = i - stack[-1]
            stack.append(i)
        return ans
# Runtime: 548 ms, faster than 32.01% of Python3 online submissions for Daily Temperatures.
# Memory Usage: 17.1 MB, less than 95.07% of Python3 online submissions for Daily Temperatures.
```

おなじみの`enumerate`です。
forループの中でリスト（配列）などのイテラブルオブジェクトの要素と同時にインデックス番号（カウント、順番）を取得できる、というもので、こういったカウントと順番を両方取得して変数に代入できる優れものです。

Easy問題を何度か挟んでいたので久しぶりにこんな感じで頭を使いました。よくよく考えてみたら二点間の距離的な考え方もできそうですね。

今回はここまで。お疲れ様でした。