OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript初心者のためのエラーガイド

### 1. Uncaught TypeError: Cannot read property 'b' of undefined at ...
##### 解釋 : Undefinedのbというプロパティーを読めません。
##### 例 : 
> a = undefined;
 // undefined
 a.b
 // Uncaught TypeError: Cannot read property 'b' of undefined at ...

#### *ポイント : bではなく、aがundefinedです。
---
#### *対策1 :
> if (a) {
 a.b = ...
}
// aがundefinedでは無い時だけ、実行できます。

#### 対策2 : Optional Chaining
> c = a?.b;

---
### 2. Uncaught TypeError: Cannot read property 'b' of null at ...
##### 例 : 
> a = null;
 // null
 a.b
 // Uncaught TypeError: Cannot read property 'b' of null at ...

#### *ポイント : bではなく、aがnullです。

---
### 3. Uncaught TypeError: a.b is not a function at ...

##### 例 : 
> a = {}
 // {}
 a.b()
 // Uncaught TypeError: a.b is not a function at ...
console.log(a)
// {}
// undefined

#### *ポイント : オブゼットa内に、function bが無いこと。

#### *対策 :
> Uncaught TypeError: a.b is not a function at ...と言うエラーが出た時は、console.log()で確認しましょう。

---
### 4. Uncaught ReferenceError: a is not defined at ...

##### 例 : 
let a, const a のように宣言してない時

import a from 'library';
const a = require('library'); 
のようにimport、requireの宣言してない時

---

### 4. Function位置に対する理解や注意点

##### 例 : 
> setTimeout(() => {
console.log('hello');
}, 2000);
// 正しい : 予想通り、2秒後に'hello'を出力

> setTimeout(function {
console.log('hello');
}, 3000);
// 正しい : 予想通り、3秒後に'hello'を出力

> setTimeout(console.log('hello'), 4000);
// 正しく無い : 直ぐに'hello'を出力

> window.addEventListener('click', () => {
  console.log('hi'));
// 正しい : clickをすると'hi'を出力

> window.addEventListener('click', console.log('hi'));
// 正しく無い : 直ぐに'hi'を出力

#### *ポイント : 
window.addEventListener('click', console.log('hi'));

console.log('hi')は、Functionでは無いです。
Functionの呼び出しです。
つまり、Return値です。

もう少し説明すると、
>console.log は、Functionです。
>console.log() は、呼び出しです。Return値です。
>// console.log()の値は、undefinedです。

下の２行のコードは、同じ意味です。
>window.addEventListener('click', console.log('hi'));
>window.addEventListener('click', undefined);

>window.addEventListener('click', () => {});
// () => {}は、Functionです。
>window.addEventListener('click', () => {}());
// 呼び出しためには、()を付けます。


setTimeout(console.log('hello'), 4000);
// console.log('hello')が実行されて、直ぐに'hello'を出力。
// その後、console.log('hello')はundefinedになります。
【考察】ロジカルシンキングはモテないのか？

ロジカルシンキング。
エンジニアじゃあなくても、社会人なら身につけよと啓蒙される考え方である。
私もさまざまな場所で教えられ、本で学び、自らも心掛け、実践してきたコトバである。

先ほどコロナワクチンの2回目の接種を終え、待機時間でふと考えた。
**「ロジカルシンキングはモテないのかな？」**と。

これは私の人生経験に基づく仮説である。
一般的にも「理屈っぽい人はモテないよ」とか、「めんどくさい」とか言われる。
我が家でも、最近の妻は私の話に耳を傾けなくなってきたような気がする。
息子たちも思春期を迎えたころから、私の話を真面目に聞こうとしない。
私が良かれと思って、世界の、社会の経済の動向やトレンド、ネットや書籍などで得た歴史などの先人の知恵を語るときは必ずだ。

##次男（中一）が教えてくれた気づき

注射後15分から30分は会場で待機しなければならず、スマホの電波も悪かったためすることなく暇だったわけだが、
最近の家族の私への接し方に悩む思春期の子らを持つ父親として、真面目に考察したのである。

で、ふと先週末の夕食時に言われた次男からのコトバを思い出した。

**『パパはねぇ、分かるんだよ。「あ、めんどくさい話が始まるな」って。今もそれ。』**

なるほど。
「ロジカルシンキング（Logical Thinking）がモテない」のではない。
「ロンガー トーキング（Longer Talking）がモテない」のだ。
という気づき。

アウトプットは簡潔に。分かりやすく。そして、相手が興味を持たない話は雑音でもある。
いくら自分がロジカルシンキングを身につけたつもりでいても、だ。
聞き手が話を聴いてくれないようじゃあ、ロジカルシンキングを習得したとは言えない。

思いついたダジャレに満足しながら家路についた、という話。

失礼しました。

（参考）
https://www.recruit-ms.co.jp/glossary/dtl/0000000192/
Nuxt.js のドキュメントに沿って SCSS を導入したらエラーが起きた Cannot find module '.../fibers'

# やったこと
Nuxt で SCSS を導入するにあたり、[Nuxt のドキュメント](https://nuxtjs.org/ja/) の[設定のプリプロセッサ](https://nuxtjs.org/ja/docs/features/configuration#%E3%83%97%E3%83%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5)のとこを読んで、以下を実行しました。

```zsh
yarn add -D sass sass-loader@10 fibers
```

# 起こったこと
すると、こんな感じで `fibers` というライブラリでエラーが起きました。

```zsh
ERROR ## There is an issue with node-fibers ## 

Error: Cannot find module '.../fibers'
```

# 調べてみたら
このエラーを調べると、を実行するといいよって情報がいくつかヒットします。

```zsh
npm uninstall fibers
npm install fibers
```

# 結局
自分の場合は、`uninstall & install` でもだめでした。
そこでドキュメントをみると、以下のように書いてあり、必須のライブラリではないため、
自分は fibers をインストールしないで進めることにしました。

> fibers がインストールされている場合、sass の同期コンパイル（2 倍速）が自動的に有効になります 。

# まとめ
バージョンを変えるなど試してみても良かったのですが、
fibers がなくても速度的に特に問題なかったため不要と判断しました。
エラー解消方法を探していた人には申し訳ない結論になってしまい、すみません。
Amazon Managed Blockchain を終了(ネットワーク削除)する方法

#Amazon Managed Blockchain のネットワークを削除する方法

Amazon Managed Blockchainを利用してブロックチェーンの勉強をしていたけどネットワークが必要なくなった人向けの情報です。

Amazon Managed Blockchainはそもそもネットワークを所有(メンバーとして参加)しているだけで一時間$0.3かかるので、一か月で大体三万円ほどかかります(つらい)。書籍を使って勉強している場合は基本的に操作解説部分の終わりに削除方法が書いてあると思いますが、インターネットには単体の日本語解説がなくてめちゃくちゃ焦りました。

##結論

- ネットワークのメンバーを全員削除する

以上です。
『ネットワークの最後のメンバーが削除されると、ネットワークなどのすべての関連するBlockchainの情報が自動で削除されます』と公式英語ページにありました。

簡単なことなのによぉ、なんで英語の本家ドキュメントしかねぇんだ？？？
「 Amazon Managed Blockchain 終了」とかでググっても始め方のサイトしかヒットしないので新手の詐欺かと思った。


Amazon Managed Blockchain自体は素晴らしいサービスなのでこの記事を読んで安心してバチバチに使い倒しましょう。

### 注意

個人練習用で開発している分には問題は起きないはずですが、メンバーが複数いる場合、ネットワークの所有者(Owner)をメンバーから削除してもネットワークは消えません。ネットワークの所有者以外のすべてのユーザーを削除してから最後に所有者ユーザーを削除するのが安全です。

### 参考

[AWS 公式ドキュメント(英語) 「Delete a Hyperledger Fabric Network on Amazon Managed Blockchain」](https://docs.aws.amazon.com/managed-blockchain/latest/hyperledger-fabric-dev/delete-network.html)
Goでプリミティブなアトミック操作をするならuber-go/atomicを使ってほしい話と、比較不能かつコスト0な型の話

atomicを直接使う人はそう多くないと思われるが、仮に使うようなことがあった場合は全人類標準ライブラリのsync/atomicではなく[uber-go/atomic][uber-go-atomic]を使うべきである。

## なぜsync/atomicはよくないのか

以下のようなコードにおいて、`sync/atomic`は型による保護機構が欠如しているために誤った操作に気がつくことができない。

```go
package main

import (
	"fmt"
	"sync/atomic"
)

type Money struct {
	price int32
}

func main() {
	ended := make(chan int)

	mine := &Money{price: 1}
	go func() {
		// atomic.AddInt32(&mine.price, 1) とすべきところで間違いに気が付かない
		mine.price += 1
		ended <- 0
	}()
	// atomic.AddInt32(&mine.price, 1) とすべきところで間違いに気が付かない
	mine.price += 1

	_ = <- ended

	fmt.Println(mine)
}
```

せっかく静的な型システムがあるのにこれは残念すぎる。

これは `uber-go/atomic` を使うことで対処可能である。

こちらで定義されている型を使った場合、以下のようにアトミックな操作でないコンパイル時にはじくことができる。

```go
package main

import (
	"fmt"
	"go.uber.org/atomic"
)

type Money struct {
	price *atomic.Int32
}

func main() {
	ended := make(chan int)

	x := atomic.NewInt32(1)
	mine := &Money{price: x}
	go func() {
		// mine.price += 1
		//  > コンパイルエラー
		//  > invalid operation: mine.price += 1 (mismatched types *"go.uber.org/atomic".Int32 and int)
		 mine.price.Add(1)
		ended <- 0
	}()
	// mine.price += 1
	//  > コンパイルエラー
	//  > invalid operation: mine.price += 1 (mismatched types *"go.uber.org/atomic".Int32 and int)
	mine.price.Add(1)

	_ = <- ended

	fmt.Println(mine.price.Load())
}
```

またすべての非アトミック操作ができなくなるわけではないが(dereferenceはできる)、以下のように比較しようとした場合にコンパイルエラーになる。

```go
x := atomic.NewInt32(1)
y := atomic.NewInt32(1)
fmt.Println(*x == *y)  // <-- invalid operation: *xx == *yy (struct containing "go.uber.org/atomic".nocmp cannot be compared)
```

もちろん`Load()`を使えばこれは解決できる。

## 比較不能な型

[nocmp](https://github.com/uber-go/atomic/blob/9c79392530c3be3273bd71db21239f2a5146c10c/nocmp.go#L23-L35)という型を定義してそれを使っている。

コードを抜粋すると以下の箇所。

```go
// nocmp is an uncomparable struct. Embed this inside another struct to make
// it uncomparable.
//
//  type Foo struct {
//    nocmp
//    // ...
//  }
//
// This DOES NOT:
//
//  - Disallow shallow copies of structs
//  - Disallow comparison of pointers to uncomparable structs
type nocmp [0]func()
```

ここでnocmpの定義は`[0]func()`となっており、これをフィールドとして持っている構造体は比較不能となっている。

これは[go4org/mem][go4org-mem]からもってきたそうで、こちらの定義のコメントによると

```
// (...). Its various methods should inline & compile to the equivalent operations
// working on a string or []byte directly.
```

とのことで`sync/atomic`に比べて余計なコストがかかるというパフォーマンス上の心配はしなくてもよさそうだ。

なぜこの形で定義されているのかまでは調べきれなかったが、[func型が比較不能型である点](https://golang.org/ref/spec#Comparison_operators)と上記のコメントのようにサイズ0の配列は最適化で消え去ることで0コストになるあたりを組み合わせた結果このような形になったものと思われる。

このあたりのロジックはGo本体の

- src/cmd/compile/internal/typecheck/expr.go のtoArith関数内
- src/cmd/compile/internal/types/alg.go の AlgType関数内

にある。調べた時点でのGoのバージョン(gitのrevisionだが)は

```console
$ git rev-parse HEAD
cfa233d76bcff00f46f5e5acdb17cb819a309d2b
```

だが以前のバージョンでもそれほど変わっていないものと思われる。

[uber-go-atomic]: https://github.com/uber-go/atomic/
[go4org-mem]: https://github.com/go4org/mem/blob/3dbcd07079b881f9bedb802b4099856c1e267fa1/mem.go#L42
Webサイトにおけるコピーライトの正しい書き方


<h2>コピーライト表記は必要？</h2>
Webサイトにおけるコピーライトとは、Webサイトという著作物に関わる諸権利が誰にある、またはないことを示す表記のこと。

&copy; 2021 △△△△△△　All rights reserved.

みたいなやつです。

通常はfooterにあって、```<small></small>```内に表記しなければいけません。

日本は「無方式主義」という、創作物には著作権表記なしに著作権が発生するというスタンスを取っているベルヌ条約に加盟しているため、コピーライトなしでも著作権は発生します。

しかし、個人的にはきちんとコピーライト表記はした方がいいと考えています。



スーパーの商品棚に「監視カメラ作動中」とポップアップが立てられていたら万引きしにくいのと同じように、コピーライトを明示しておくことである程度の抑止力になりうるからです。

また、実際に裁判を起こすとなった時に有利になりやすいです。

<h2>コピーライト表記に必要な要素</h2>

コピーライト表記には次の3つの要素が必要です。

<h3>コピーライト記号</h3>
「Copyright」または「&copy;」

&copy;はHTMLで表記する場合、```&copy;```と書きます。
<h3>発行年</h3>

著作物の「発行年」を記します。

製作年ではなく発行年ですので、例えば2000年に作ったものを2021年に世に出す場合、2021と表記します。

「2015-2020」のような書き方をしているものもありますが、これは2015年に発行し2020年にその更新が止まっていることを表します。

<h3>権利者の名前</h3>
権利者の名前を書きます。

著作者ではなくて著作権者であることに注意が必要です。
<h2>なくても良い要素</h2>

<h3>権利の内容</h3>

著作物についてどの程度権利を保持するのかを記します。これはブエノスアイレス条約に基づく記述ですが、日本においてはベルヌ条約が優先されるためなくても問題ありません。

この項には次の3つのうち当てはまるものを記します。

All Rights Reserved・・・全ての権利を保持している

Some Rights Reserved・・・一部の権利を保持している

No Rights Reserved・・・全ての権利を譲渡できる



<h2>コピーライト表記の書き方</h2>

上記の要素を①記号②発行年③権利者の名前④権利の内容　の順で表記します。


例）　&copy; 2021 TARO TANAKA All Rights Reserved.

webサイトに表記する場合、```<small></small>```内に書きます。



<h2>まとめ</h2>
そういえば、モラル0の悪質スクールが他所様の教材やサイトを丸パクリしていたことが発覚し炎上していた事案が記憶に新しいですね。

もしあなたの創作物が無断で誰かにパクられたら、然るべき措置を行使し痛い目見させてやりましょう。


<h2>参考<i class="fas fa-link"></i></h2>

<a href="https://www.webdeki.com/column/1557/">https://www.webdeki.com/column/1557/</a>
<a href="https://www.profuture.co.jp/mk/column/23594">https://www.profuture.co.jp/mk/column/23594</a>
raspberry pi3で最大解像度でカメラ画像をキャプチャできないときの対処法

# 出てくるエラー

```
picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources
```

# 対処法

GPUのメモリ割当を上げる

```
sudo vi /boot/config.txt
```

を起動して

```diff:/boot/config.txt
... 
- gpu_mem = 128
+ gpu_mem = 256
...
```
というふうに書き換える。

そしてリブート。
PHPStan 0.12.97 で literal-string が使えるようになっていた

`literal-string`とは何かというと、PHPDocに書いて安全な文字列かどうかをチェックするための型のようだ。

https://github.com/phpstan/phpstan/issues/5507

ここにfeature リクエストがある。
何が変更されたかというと・・・

https://github.com/phpstan/phpstan-src/pull/638/files

これだけ！？
と思ってソースを確認したら

https://github.com/phpstan/phpstan-src/commit/a5eb5b5982c867b34c8d92530a01f70f559cac43

ここでちゃんとした実装がコミットされてた。



これは便利と一瞬思ったけど、自分が必要なユースケースとはちょっとズレてるんだよなあ…。

https://github.com/nishphp/phpstan-safestring-rule

まだこの自作の拡張を使う必要があるようだ。
Xamarinで最新のOpenTKを利用できない理由

OpenTKはXamarinにバンドルされており、追加でインストールしなくても、参照に追加するだけで利用することができます。しかし、この方法で利用できるのはOpenTKのバージョンは1.0と非常に古いものです。GithubやNuGetから最新のOpenTKを導入しようとしても、本体にビルトインされているOpenTK1.0とバッティングしてしまい、利用することはできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245196/15c3819e-b11f-248d-c6d0-5dcbf52583ce.png)

GithubにあるOpenTKのリポジトリにも、複数のissueが上がっています。
https://github.com/opentk/opentk/issues/482
https://github.com/opentk/opentk/issues/647

原因は、ルート名前空間を変更せずにOpenTK1.0のソースコードをとりこんだXamarinの数年前の決定によるもの。
https://github.com/opentk/opentk/issues/810

> OpenTK開発者：現時点では、Xamarinを利用したモバイルアプリ開発(iOS, Android)でのOpenTKの利用者は、プロジェクトでOpenTKの最新バージョンを利用できない大きな問題を抱えています。これは主に、ルート名前空間を変更せずにOpenTK1.0のソースコードを独自のソースツリーにバンドルするというXamarinの数年前の決定によるものです。残念ながらXamarin側は問題解決に取り組むことを(苛立たしいことに)望んでおらず、私たちに彼らの混乱を一掃することを任せています。

OpenTK側からXamarin側に「名前空間を変更してくれ」とお願いしたが、monoの開発者であるミゲル・デ・イカザも出てきて「そっちが名前空間変えて」と回答。白熱した議論があり、Xamarinが拒否していた。
https://github.com/mono/opentk/issues/19
>varon(OpenTK開発者)：私たちが提案することは非常に単純です。XamarinがOpenTKの一部なしでは機能しない場合は、それらの名前空間を変更して、競合することなくライブラリの更新バージョンを使用できるようにしてください。

>migueldeicaza：monoにOpenTKを取り込んだ時、OpenTKはメンテナンスされてなかった。その後OpenTKが復活したが、理想的には、これは発生しないハズだった。モバイルでのOpenTKの問題の解決策は、別のアセンブリ名でパッケージを出荷することだと思います。

>varon: FXXX you, too.

変更できない理由はについてはこちら。
https://bugzilla.xamarin.com/52/52169/bug.html
> Xamarin開発者：Xamarin.iOSでOpenTK名前空間を持つ型(OpenTK.Vector2など)を使っており、これはプロジェクトで(最新の)OpenTKを利用する際に衝突します。非常に大きな問題となるため、この変更を行う予定はありません。

Xamarin側が対応してくれない以上、OpenTK側が対応するしかなく、
OpenTK4.0の開発時に、名前空間をOpenTKからOpenToolKitに変更することを決定し、一旦取り込まれた。
https://github.com/opentk/opentk/pull/842


しかし.NET 5.0と6.0検討時に、OpenTK開発者からXamarin側に、再度、要望が出された。
[https://github.com/xamarin/xamarin-macios/issues/7528](https://github.com/xamarin/xamarin-macios/issues/7528)
> OpenTK開発者：問題は基本的に、メインアセンブリで定義されたレガシーOpenTKタイプがあり、Xamarinの古いバージョン以外のバージョンのOpenTKを使用できないことです。
chamons(Xamarin)：それは私が完全には気づいていなかった興味深い問題です。私はこれを社内で検討するために提起しました。

[https://github.com/xamarin/xamarin-macios/issues/8955](https://github.com/xamarin/xamarin-macios/issues/8955)
> glopesdev(OpenTK)：.NET6からOpenTK型を移動することに関する決定はありますか？
> chamons(Xamarin)：内部的にはそれに傾いているが、まだ最終決定ではない。



そして.NET 6.0で、ついに削除されることが決まった！
https://github.com/xamarin/xamarin-android/issues/5647
https://www.nuget.org/packages/Xamarin.Legacy.OpenTK

OpenTKのリリースノートには「名前空間を栄光のOpenTKに戻しました」とある！
https://github.com/opentk/opentk/blob/master/RELEASE_NOTES.md


現在(Visual Studio 2019 version 16.10.3)では、XamarinプロジェクトにOpenTK1.0を参照に追加すると、以下のような警告がでます。.NET6からOpenTK-1.0が削除されると思われます。

```
warning XA4313: The built-in 'OpenTK-1.0' reference has been deprecated.
warning XA4313: Remove the 'OpenTK-1.0' reference from your project and add the 'Xamarin.Legacy.OpenTK' NuGet package instead.
```

おめでとう！OpenTKチーム！
Azure Synapse AnalyticsにおけるMicrosoft Spark Utilitiesにおけるノートブックの実行数の制約について

## 注意事項
本記事の情報は、2021年9月16日時点での情報です。
最新の情報については、Microsft社のドキュメントにてご確認ください。

## 内容
Azure Synapse AnalyticsにおけるMicrosoft Spark Utilitiesにて、`mssparkutils.notebook.run()`によるノートブックの実行数には明確な制約がないそうです。ドキュメント等に明確な記載がないため、今後、変更される可能性があります。

別のAzureサービスであるAzure Databricksにおける同等の機能（`dbutils.notebook.run()`）では、ジョブ実行に関する制約が適用されて、1時間当たりの同時実行数の上限が5000であることや同時実行数の上限が1000であることなどの制約があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ac7daf9b-4c5b-deea-7b9a-1524afae4242.png)
引用元：[ジョブ - Azure Databricks | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/jobs)

この制約がAzure Synapse AnalyticsとDatabricksの一方が優れているという結論にはならないとは思いますが、開発時には留意しておいた方がよさそうです。
Git/Github　コマンドチートシート

## 部分的に変更を消去

```sh
git checkout <HEAD || commit_id> <file_path>
```

## 全ての変更を消去①

git addした内容も消えます

```sh
git reset --hard HEAD
```

## 全ての変更を消去②

git addした内容は消えません。

```sh
git checkout .
```

## 他のブランチから変更を部分的に持ってくる

```sh
git checkout <ブランチ名> -- <file_path>
```

### ディレクトリごと変更を持って来る

※ 消去は持ってこれないので注意

```sh
git checkout <ブランチ名> <dir_path>
```

## リモートの消去

```sh
git remote rm <リモート名>
```

## git subtree

環境ごとに設定する必要があるため、あまり実用的ではない。

[GitHub　git subtreeの使い方 - Qiita](https://qiita.com/keitean/items/bdeb6c1548bb9a8d5dfc)

## git submodule

### サブモジュールを追加する

最初にサブモジュール化するレポジトリをcloneしておきます。

```sh
git submodule add <URL> <リモート名>
```

### サブモジュールがあるレポジトリをcloneする

```sh
git clone --recursive <URL>
```

### --recrusiveなしでクローンした場合

```sh
git submodule init
git submodule update
```

## 最初からリベース

```sh
git rebase -i --root
```

## 追跡から除外する

```sh
git rm --cached <ファイル名>
```

これに加えて、gitignoreに追記する。

## ホワイトリスト

```.gitignore
*

!.gitignore
!**/
!*.cpp
!*.hpp
!*.sh
!Makefile
```

## git remoteでできること

```terminal
usage: git remote [-v | --verbose]
   or: git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url>
   or: git remote rename <old> <new>
   or: git remote remove <name>
   or: git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
   or: git remote [-v | --verbose] show [-n] <name>
   or: git remote prune [-n | --dry-run] <name>
   or: git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
   or: git remote set-branches [--add] <name> <branch>...
   or: git remote get-url [--push] [--all] <name>
   or: git remote set-url [--push] <name> <newurl> [<oldurl>]
   or: git remote set-url --add <name> <newurl>
   or: git remote set-url --delete <name> <url>

    -v, --verbose         be verbose; must be placed before a subcommand
```

## git logを残したまま別のリポジトリに変更する方法

```sh
git remote rm origin
git remote add origin git@github.com:ユーザ名/リポジトリ名.git
```

-helpに載っていないけど、公式サイトのdocumentではrmで紹介されている。

[リモートリポジトリを管理する - GitHub Docs](https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/managing-remote-repositories#removing-a-remote-repository)

以下でもOK

```sh
git remote remove origin
```
【Python】importが必要なPythonをAWS Lambda へ移行してみた　Lambda編

#はじめに
昨日の記事からの続きとなります。

https://qiita.com/hirockio2206/items/9129b5d541452c958bf8

◆事前準備編◆
　1.macOSのデスクトップにtempフォルダを作る
　2.tempフォルダにccxtをpip3でインストールする
　3.既に作ったpythonプログラムを lambda_function.py  へリネームしてtempフォルダに入れる
　4.lambda_function.py の先頭に指定プログラムを追記する
　5.ターミナルでzipでまとめる

◆Lambda編◆
　6.AWSへログインし、5をアップロードする

◆EventBridge編◆
　7.EventBridge (CloudWatch Events)に定期実行ルールを登録する

####今回は6の説明をします。(次回7を説明します)



#手順
####6.AWSへログインし、5をアップロードする

6-1.AWSのマネジメントコンソールヘログインします。
    https://aws.amazon.com/jp/console/

6-2.上部の検索バーに　Lambda　と入力します。Lambda　をクリックします。
![スクリーンショット 2021-09-16 11.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/b9f1d941-13aa-49ca-3a4e-92becc79f92a.png)

6-3.右上の関数の作成をクリックします。
（何も関数を作成していない場合は若干画面が異なるかもしれません。）
![スクリーンショット 2021-09-16 11.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/2f9a0259-c357-30ca-d1f8-eaf31018e430.png)

6-4.[一から作成]が選択されていることを確認します。
　　[関数名] は任意の名前をつけます。(例:import_ccxt)
　　[ランタイム] はお使いのPythonのバージョンを指定してください。(例：Python3.9)
　　下にスクロールし[関数の作成]をクリックします。
![スクリーンショット 2021-09-16 12.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/30d13f24-d7ac-1b3f-bcb6-a0eff2faa03d.png)

6-5.[コードソース]＞[アップロード元]を選択し、中から[.zipファイル]を選択します。
![スクリーンショット 2021-09-16 12.05.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/d8c6f840-0e4e-f009-c684-1590cf2894a7.png)

6-6.[アップロード]ボタンを押し、手順１−５で作成した.zipファイルを選択し、[開く]をクリックします。
　　元の画面に戻ったら[保存]をクリックします。
![スクリーンショット 2021-09-16 12.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/69a161ca-6c7d-f058-0881-deb9f5ecf302.png)

6-7.[テスト]タブをクリックし、名前に任意の名前を記入します。(例：import_ccxt)
　　[テスト]をクリックします。
![スクリーンショット 2021-09-16 12.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/4ad98346-b6bc-31ef-153f-b34c88bd754d.png)

6-8.[実行結果：成功]　と出ていれば成功です！
![スクリーンショット 2021-09-16 12.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/3b53afb1-c74a-0d66-7a4c-8524d215ccf5.png)

####ハマり注意
ここで　[実行結果：失敗]　となる場合は特に以下をご確認ください。

・作成したPythonファイル名が　lambda_function.py　になっていない
・lambda_function.pyの先頭に以下が入っていない
・zipしたファイルにlambda_function.pyが入っていない

```lambda_function.py
def lambda_handler(event, context):
    return {
    }
```
#最後に
いかがでしたでしょうか。
無事AWSへPythonを移行できましたでしょうか。
今回はライブラリも同時にuploadしましたので、より実践的かと思います。

次回は定期実行をするためにEventBridgeの使い方を記載しようと思います。
ご参考になれば幸いです。

続き↓

https://qiita.com/hirockio2206/items/bfebfba8f1fc4012f1bb
Swift で Kadane's Algorithm 使って Maximum Subarray（最大部分配列）

## 問題

- LeetCode 53. Maximum Subarray: 
  - https://leetcode.com/problems/maximum-subarray/

## 解法

Kadane's algorithmで解く。動的計画法なので部分問題に分割する。部分問題は下記のように定義する。

- list の 0 から n までの間で、**listのn番目の要素を含んだ** 最大部分配列

愚直にコードで書くとこうなる。

```swift
func maxSubArray(_ nums: [Int]) -> Int {
      var dp = [Int](repeating: -1, count: nums.count)
      dp[0] = nums[0]
      for i in 1..<nums.count {
          dp[i] = max(dp[i-1] + nums[i], nums[i]) // relaxation
      }
      return dp.max()!
}
```

## ポイント

部分問題の定義にて「n番目の要素を含んだ」部分配列の総和という考えがキモとなる。

例えば、下記のケースを考える

`list = [10, -11, 21, 40]`

そして、`n=2`のときの選択肢は下記のどちらかになる。

- 0~n-1までの配列を含めると、 `20 (= 10 + -11 + 21 )`
- 0~n-1までの配列を含めないと、 `21`

この場合は最大数の`21`が選択される

## 改善

一般的な動的計画法だと答えは大抵は dp の末尾に答えが入るケースが多いけど、このケースの場合は必ずしもそうならない。

なぜなら、dp に保存されてるのは「nを含む」0~nの中の最大配列総和だから。dpの末尾だと「必ずn番目の要素を含んだ最大部分配列」が答えとして出てくる。

なので、return するときに、dpの中からmax で探してる。

```swift
  return dp.max()!
```

改善として、for の中で合わせてmaxも保存しておく。そうなると、`O(2n)`から`O(n)`になる。

最終的にコードは下記のようになる。

```swift
  func maxSubArray(_ nums: [Int]) -> Int {
      var dp = [Int](repeating: -1, count: nums.count)
      dp[0] = nums[0]
      var maxSoFar = nums[0] // <= 追加
      for i in 1..<nums.count {
          dp[i] = max(dp[i-1] + nums[i], nums[i])
          maxSoFar = max(maxSoFar, dp[i]) // <= 追加
      }
      return maxSoFar 
  }
```


## REF

- https://leetcode.com/problems/maximum-subarray/discuss/20193/DP-solution-and-some-thoughts
- https://engineer.yeele.net/algorithm/leetcode-easy-53-maximum-subarray/
【Sphinx】振り仮名を付けるためのノードの作り方

先に断っておくと、こんな真面目にやることはないと思う。
あくまでも「流儀に忠実に従えば」という話。

# サンプル

「笹本まゆ美（ささもとまゆみ）」

# 用意するクラス

```term``` ノードについては、 ```docutils/nodes.py``` で次のように定義されている。

```python
class term(Part, TextElement): pass
```

同じように定義する。

```python
class ruby(Part, TextElement): pass
class rb(Part, TextElement): pass
class rt(Part, TextElement): pass
class rp(Part, TextElement): pass
```

これと ```Text``` クラスのノードを収納することになる ```term``` ノードの、astext()が呼び出された時に「読み|用語」と返すように、termノードの改造が必要。

# これらのノードを利用する側のメソッド

```sphinx/util/docutils.py``` のSphinxTranslatorクラスにあるメソッド

```python
465     def dispatch_visit(self, node: Node) -> None:
466         """
467         Dispatch node to appropriate visitor method.
468         The priority of visitor method is:
469
470         1. ``self.visit_{node_class}()``
471         2. ``self.visit_{super_node_class}()``
472         3. ``self.unknown_visit()``
473         """
474         for node_class in node.__class__.__mro__:
475             method = getattr(self, 'visit_%s' % (node_class.__name__), None)
476             if method:
477                 method(node)
478                 break
479         else:
480             super().dispatch_visit(node)
```

#以上
サンプル、いらなかった…
VS Codeの便利な設定

MacのVS Codeで設定しておきたいこと

# ターミナルの履歴を伸縮する
`⌘+SHIFT+P`でコマンドパレットを開き、
`Terminal: Configure Terminal Settings`と入力して
設定画面を開いたあと`Terminal › Integrated: Scrollback`欄の値を調整する

```
Terminal › Integrated: Scrollback
Controls the maximum amount of lines the terminal keeps in its buffer.
1000
```
ユーザーを新規作成する

## 環境
Ubuntu 20.04

## はじめに
ユーザーを新規作成する手順について確認してみた。

## 手順
ユーザーを作成するコマンドには２種類ある。useraddとadduser。どっちのコマンドを使ってもユーザーを作成することはできるのだが、adduserを使って作成する方が望ましい。useraddはオプションを付けて、コマンド一発で作成するのに対し、adduserは対話型で作成することができる。useraddにはたくさんのオプションが用意されており、すべてのオプションを把握した上で、ちゃんとオプションをつけてあげないと、後々厄介なことになるらしい。なので、adduserを使って作成しておいた方が無難ということになる。adduserを使っても裏側ではuseraddが流れてる。adduserを使うと、途中でパスワードの設定を聞いてくるが、useraddを使った場合、パスワードはpasswdコマンドを使って別途設定してやらないとけないことになる。このように２段階踏むことになり手間が増える。

```
adduser tana
```

作成したユーザーは、このコマンドで表示して確認することになる。新規ユーザーのuidは1001で作成されている。gidも同じ1001で作成されている。uid、gidは、新規作成すると、デフォルトでは1000から連番で振られるようになっている。自分が現在ログインしているユーザーが1000で割り振られているため、1001が割り振られたということになる。

```
cat /etc/passwd
```

新規作成したユーザーと同じ名前のグループも新規で自動作成され、新規作成したユーザーはそのグループに所属されることになる。グループの一覧を表示するコマンドがこれ。確かに、グループも新規作成されていることが確認できました。

```
cat /etc/group
```

ホームの配下に、tanaディレクトリが作成されていることも確認できます。

```
ls -l /home
```

tanaユーザーにログインしてみよう。ログインすると、プロンプトがtana@vagrantに変わり、確かにログインができました。suをする場合、suとsu -の２種類存在する。su - は環境変数を引き継がないでシェルを起動させたい場合、つまり、ユーザーが個別で保持している環境変数を有効にしたい場合に使う。suは、現在ログインしている自分のユーザーの環境変数をログイン先でも引き継いで使用したい場合に使う。サーバーで複数人で共同利用している場合は、su -を使い、個人ベースで利用する分には、suの方がいいだろう。ログアウトはexitで抜ける。

```
su tana
su - tana
```

グループだけを新規に作成してみる。

```
addgroup tana_g
```

グループが作成されていることを確認する。tana_gというユーザーは存在してなく、tana_gというグループだけを新規で作ったのだが、パスワードカラムにxが入っているのは気にしなくてOK。gidはちゃんと連番で1002になっています。

```
cat /etc/group
```

先ほど作成したユーザーを削除します。ここで重要なのが、必ず-remove-homeオプションをつけることです。このオプションをつけると、home配下のディレクトリも一緒に削除されるが、つけないと削除されずに残ってしまうことになる。ユーザー作成に、useraddとadduserと２種類のコマンドが存在したが、ユーザー削除においても、userdelとdeluserの２種類のコマンドが存在している。どっちを使ってもユーザーを削除することができるのだが、Ubuntuではどうもdeluserの方を推奨しているとのこと。

```
deluser --remove-home tana
```

つぎのコマンドで、tanaユーザーと、tanaグループが共に確かに削除されていることを確認します。homeディレクトリ配下のtanaディレクトリも確かに削除されていました。tanaユーザーだけを削除したのだが、tanaグループも自動で削除されています。削除するユーザーと同一名のグループに、削除対象ユーザーしか所属していない場合に限り、一緒に削除されるようです。

```
cat /etc/passwd
cat /etc/group
```

先ほど新規作成した、tana_gグループも削除してみる。

```
delgroup tana_g
```

tana_gグループが確かに削除されていることを確認。

```
cat /etc/group
```

c'est fini:no_mouth:
【メールサーバー編】公開したアプリ(Laravel)を、ConoHa VPSを使ってメール送受信出来るまでの手順

#○はじめに
以前、[完成したアプリ(Laravel)を、ConoHa VPSを使って公開するまでの手順](https://qiita.com/baby-0105/items/4e84cd5fefe8a663ba1f)について記載しました。

その後、メールの送受信がまだだったので記載します。

#○大まかな手順
**1. ConoHa VPSで、メールサーバーを立てる**
**2. アプリケーション側の```.env```の設定を変更する**

以上です。

それでは、記載していきます。

#○メール送受信が出来るまでの手順

##①ConoHa VPSで、メールサーバーを立てる

記載すると言っても参考にした記事がかなり分かりやすく書かれています。

記事では、Railsでアプリを作成されていますが、最後のアプリケーション側の設定以外は同じです。

以下記事を参考に進めてください。

https://www.autovice.jp/articles/42

##②アプリケーション側の```.env```の設定を変更する

```.env
MAIL_DRIVER=smtp
MAIL_HOST=[メールサーバー　➡️ メールアドレスリスト → smtpサーバー記載] → 例）smtp.〜〜〜.conoha.io
MAIL_PORT=587
MAIL_USERNAME=[先ほど設定したメールアドレス]
MAIL_PASSWORD=[先ほど設定したパスワード]
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=[先ほど設定したメールアドレス]
MAIL_FROM_NAME="〜〜〜運営" ← メールの送信元名になります（任意）
```

以上です。
【Sphinx】索引ページで振り仮名を付ける方法

やり方が分かったのでメモ。

# 改変方法
## genindex.html

- ローカルの ``_templates`` にコピーした ``genindex.html`` を放り込むと、こちらを参照することを確認。
- 渡すデータに合わせて「firstname」の箇所を書き換えればいい、と分かった。

## データの渡し方

例えば「岸本あゆ美（きしもとあゆみ）」であれば、次のようなデータを渡す。

```python
[   (True, ("岸", "きし")),
    (True, ("本", "もと"), 
    (False, "あゆ"),
    (True, ("美", "み") ]
```

テンプレート側は ``{{ firstname|e }}`` の箇所を次のようにする

```jinja
{%- for is_ruby, value in firstname -%}
  {%- if links -%}
    {%- for is_ruby, value in firstname -%}
      <ruby><rb>{{ value[0]|e }}</rb>
      <rp>（</rp><rt>{{ value[1]|e }}</rt><rp>）</rp></ruby>
    {%- endfor %}
  {%- else %}
    {{ value|e }}
  {%- endif %}
{%- endfor %}
```

# 以上
【初心者向け】GETとPOSTの違いはこうやって覚えよう

#はじめに
GETとPOSTの違いは一度分かれば大丈夫だと思うので、まずはイメージをつかんでおきましょう。

#GETとPOSTの違い
###GETはその名のとおり、ページの情報をゲット（取得）したいときに使います！！
つまり、リクエストを送信したら、それに対するレスポンスが返ってきます。
SQL文でいう`SELECT`みたいなものですね。
また、GETは、URLの末尾にパラメータをつけて送信します。

###POSTはこちらから情報を送りたいときに使います！！
SQL文でいう`UPDATE` `INSERT` `DELETE`みたいなものですね。
GETと異なり、登録画面やお問い合わせフォームなどから情報を送信するため、URLの末尾にパラメータはつきません。
そのため、POSTの方がセキュリティが高いです。

#おわりに
簡単な説明になってしまいましたが、情報を**取得**したいのか**送信**したいのか、目的に応じてGETかPOSTか選ぶのが良いでしょう。
10年後のためにいま学んでおきたい技術

<h1>10年後のためにいま学んでおきたい技術
</h1>
<p>Qita10周年記念のイベントでの投稿です。
</p>
<p>10年後のために学んでおきたいのは、IT全般知識、関数型言語です。
</p>
<p>私はいま職業訓練校でIT技術を学んでいます。<br>年齢はアラサーです。同年代の方もいますが、大体の方は19歳、高校を卒業して職業訓練校に来た方ばかりです。
</p>
<p>若い彼らと学んでいて思うのは、同じことをしていたらダメだということです。<br>いま、努力したおかげで校内で自分の方が少し秀でていたとしても、彼らには10年あります。<br>それなら彼らとは違うアプローチをしなければならないと感じています。<br>当然、周辺知識も取得した上で、です。
</p>
<p>・現在学習しているのは<br>　1．応用情報、いずれは高度情報へ<br>　2．ネットワーク<br>　3．サーバー、Linux
</p>
<p>→まさしくこれは周辺知識です。<br>応用情報は10月に受験予定です。
</p>
<p>・未来のために必要だと考えているのは<br>　1．関数型言語(Haskell)<br>　2．機械学習、AI、Python<br>　3．プロジェクトマネジメント
</p>
<p>→関数型言語が将来的に時流がくるという情報を見かけました。<br>再帰に優れた言語です。(難しい)
</p>
<p>現在考えていることなので将来的に変わると思います。<br>むしろIT業界を経験していないので、確実に変わります。<br>備忘録と言ったイメージです。
</p>
Emacs：作業目的別にテーマを切り替えて使う

Emacsテーマは、Melpaから package install してお好みで選べるのでとても便利ですが、一つに絞り込むのは難しいですね。私の場合、目的に応じて３つのテーマを切り替えて使えるようにしています。

* [Peach Melpa](https://peach-melpa.org/themes) 


## 1. iceberg
普段使いで目に優しいテーマ：iceberg-theme（自作テーマ）

私の Emacsは、執筆むけに使うことが多く、日本語の文章作成、編集が大半ですので、目に優しいこのテーマを愛用しています。もともとは、Vim向けに開発された、目に優しいダークブルーの配色です。

* [iceberg.vim](https://cocopon.github.io/iceberg.vim/) 

Emacs向けに移植されたものは、幾つか存在しますが、お好みにカスタマイズしたかったので自作しました。GitHubに置いてます。

* [minorugh/iceberg.emacs](https://github.com/minorugh/iceberg.emacs) 

![Alt Text](https://live.staticflickr.com/65535/51481200845_5052d93c3a_b.jpg) 

## 2. doom-doracula
コード編集するときのテーマ：doom-dracula.theme

ごくたまに Emacs-LispやPerlスクリプトなどを編集することもあるので、そのときは視認性に優れていて多くの Emacserの間でも普及しているこのテーマを愛用しています。

![Alt Text](https://live.staticflickr.com/65535/51480502098_1b348ba32e_b.jpg) 

## 3. doom-solarized-light
執筆モードでリラックスできるテーマ：doom-solarized-light.theme

Darkroom-modeで、短い文章を書いたり、エッセイの下書き、編集などをするときに珈琲を飲みながらゆったりした気分で文字書きできるので愛用しています。メニューバーもモードライも一切なしの Fullscreen画面は白紙の上になぐり書きしているかのようで快適です。

別途 installしてもよかったのですが doom-themesの中に solarized-light.themeもあったので、そちらを使っています。

![Alt Text](https://live.staticflickr.com/65535/51481235075_cc52b356be_b.jpg) 


## 4. テーマを切り替えて使うための設定

同様の趣旨で作られたものが Melpaでも見つかったのですが、私の場合うまく作動しなかったので独自に関数を作りました。というより下記記事からのパクリです。

* [Cycle Custom Themes](https://stackoverflow.com/questions/23793288/cycle-custom-themes-w-emacs-24) 

```emacs-lisp
(leaf doom-themes
  :ensure t
  :init
  (leaf iceberg.emacs :el-get minorugh/iceberg.emacs)
  (add-to-list 'custom-theme-load-path "~/.emacs.d/el-get/iceberg.emacs/"))

(leaf cycle-custom-theme
  :config
  (setq my:themes (list 'iceberg 'doom-solarized-light 'doom-dracula))
  (setq curr-theme my:themes)

  (defun cycle-custom-theme ()
	"Switch themes to cycle."
	(interactive)
	(disable-theme (car curr-theme))
	(setq curr-theme (cdr curr-theme))
	(if (null curr-theme) (setq curr-theme my:themes))
	(load-theme (car curr-theme) t)
	(message "%s" (car curr-theme)))

  (bind-key "<f11>" 'cycle-custom-theme)
  (setq curr-theme my:themes)
  (load-theme (car curr-theme) t))
```
Digisparkでマウスジグラーを作る

# はじめに

Digisparkは安価なマイコンボードで簡単なプログラムを入れるだけで、マウスやキーボードといったHIDとして認識されるデバイスを作成可能な便利なものです。

色々なブログなどで色々なバージョンの情報が公開されているのですが、最新のMacbook、IDEではどうやってやればいいのか分からなかったのでメモ書き残します。

最近、社会におけるリモートワークが推進され、在宅ワークを許容する企業が増えてきました。一方で悲しいかな日本のマネージャーや経営層は社員がきちんと仕事しているかどうかを、社員がPCの前にきちんと座っているかどうか、で確認しようとします。なんかあまりにアホくさいので、Digisparkでマウスを左右に動かしているように見せるツールを構築し、仕事しているように見せかけるツールを作りたいと思います。営業妨害？いやいや、そんな馬鹿な監視方法止めてプロマネの一つでも社員に覚えさせなさいってことですよ。

（まあ、私の職場は外資なので２４時間働けますか体制以外はプロマネ型なので、自由時間は割と取れます。）

# 目次

1. [Macbookの環境設定](#Chapter1)
2. [Libraryの追加](#Chapter2)
3. [プログラムの書き込み](#Chapter3)

<a id="#Chapter1"></a>
# Macbookの環境設定

こちらは少し長いので私の別ページを参照してください。

https://qiita.com/mikiyugo/items/59ed92753d6bb22c2d7d

<a id="#Chapter2"></a>
# Libraryの追加
### Libraryのダウンロード

ATtinyCoreをインストールしたArduino IDEを用いてDigisparkに書き込みができるようになりました。
ではMouse.hなどのLibraryをincludeしてHIDデバイスとしての関数が呼び出せるのですが、現状これは上手く動かせませんでした。おそらくDigispark専用のLibraryを設定しないといけないです。
探してみたら以下のページからダウンロード出来るみたいです。

https://github.com/digistump/DigistumpArduino

Code>Download Zipでダウンロードしてください。

### Libraryのインストール

Aruduino IDEでは複数のインストール方法がありますが、今回は完全手動でのインストールを紹介します。
ダウンロードしたZipファイルを展開します。
digistump-avr>librariesと開くとDigisparkMouseが見つかるのでフォルダごとコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2016927/fb021a52-0a97-7690-d13e-071331aa0329.png)

Finderでアプリケーション>Aruduinoを選択し、パッケージの内容を表示させます。
Contents>Java>librariesとアクセスすると他のライブラリファイルが格納されているフォルダに行き着きます。
ここにコピーしたフォルダをペーストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2016927/113ffd2e-bdf6-711a-569b-e141c3edbaeb.png)

これでインストールは完了です。
Arduino IDEを再起動するとLibraryから確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2016927/2e218a3e-f3a5-6c24-cea7-54a3a2ad5cad.png)

<a id="#Chapter3"></a>
# プログラムの書き込み

ここまで来たら後はコードを書いて流し込むだけです。
コードの解説はしませんが、以下のページにDigisparkのマウスジグラーのコードがあるのでコピペするなり参照するなりでコードを作成し、アップロードすれば動きます。

https://ichiro-kun.com/post/925/
OracleからPostgreSQLへの移行でSQL書き換え

OracleからPostgreSQLへ移行するにあたってSQLを書き直す必要がありました。
書き換える時に出たエラーや変更した関数をいくつかピックアップしてみます。

### ERROR: subquery in FROM must have an alias
```sql
SELECT * FROM (
    SELECT 1
)
```
これではエラーとなります
PostgreSQLでは副問合せに別名は必須ですので別名をつけましょう


```sql
SELECT * FROM (
    SELECT 1
) sub
```

### DECODE関数
PostgreSQLにある復号ではないのでCASEに書き換えます 

```SQL:Oracle
SELECT DECODE('判定する値', 1, '1の場合', 2, '2の場合', 'それ以外の場合') FROM DUAL
```

```SQL:PostgreSQL
SELECT CASE '判定する値'
    WHEN 1 THEN '1の場合'
    WHEN 2 THEN '2の場合'
    ELSE 'それ以外の場合'
    END
```

### NVL関数
NVL関数はありませんのでCOALESCE関数へ変更します

```sql:Oracle
SELECT NVL('null判定する値', 'nullだった場合の値') FROM DUAL
```

```SQL:PostgreSQL
SELECT COALESCE('null判定する値', 'nullだった場合の値')
```

### GREATESTとLEAST関数の挙動の差
リストの中にnullがあった場合、Oracleはnullを返しますが
PostgreSQLはnullを無視してLEASTであれば最小値の1を返します

```sql:Oracle
SELECT LEAST(1, 2, null) FROM DUAL
```

```sql:PostgreSQL
SELECT LEAST(1, 2, null)
```

リストの中にnullが入る可能性があるかどうかでSQLを書き換えます

### シーケンス取得
```sql:Oracle
SELECT シーケンス名.NEXTVAL FROM DUAL
```

```sql:PostgreSQL
SELECT NEXTVAL('シーケンス名')
```

他にもありますがいくつかピックアップしてみました。
なぜ10年前にエンジニアを目指さなかったのか

<h1>なぜ10年前にエンジニアを目指さなかったのか
</h1>
<p>Qita10周年記念のイベントでの投稿です。
</p>
<p>少しテーマと逸れるかもしれませんが思うところがあったので投稿します。
</p>
<p>私はいま職業訓練校でIT技術を学んでいます。<br>年齢はアラサーです。同年代の方もいますが、大体の方は19歳、高校を卒業して職業訓練校に来た方ばかりです。<br>彼らと肩を並べて学習していると10年という数字がリアリティを持って迫ってきます。
</p>
<p>いくら教室内で良い点数を取っても、資格をクラスメイトに先行して取得したとしても、10年という歳月で余裕で追い抜かれていくでしょう。<br>どれほど努力しても、努力し足りない、身の引き締まる想いで毎日を過ごしています。
</p>
<p>10年前を振り返ると、2011年はジョブズが亡くなった年でした。<br>私はその頃、夜勤のパートタイムをしていて、周りの方がiPhoneを使っているのをガラケーを持ちながら眺めていました。<br>その頃のIT業界はとてもブラックなイメージで、泊まり込み、毎日徹夜が当たり前なんだろうなと思っていました。
</p>
<p>そう考えると、その頃にIT業界を目指した可能性は少ないかなとも思えます。<br>結局いま持っているもので戦っていくしかないのかな、と。<br>スヌーピーも配られたカードで勝負するしかないと言ってました。
</p>
<p>毎日、もし10年前だったら、と考えてしまいますがそれはもうしょうがないと思って、卒業まで学習を続けます。<br>黙々と経験を積み重ねるしかないですよね。<br>この記事で、考えていたことを書いたのがきっかけで気持ちが少し切り替わりました。
</p>
<p>次の10年のために頑張っていきます。
</p>
kintoneを使って部屋の換気を促してみた

Maker Faire Tokyo 2021に出展予定だった展示物になります。

今回はノーコードのkintoneと合わせて、あえてコードを書かないことを意識しました！
題して換気チェッくんです！(いつの間にか名前がついていた)

# 概要


- 温湿度センサ
- CO2センサ  
のデータをkintoneに登録していきます。  
また、CO2がある一定の閾値を超えた場合にkintoneから換気のお知らせを送るようにします。  
データは簡単にグラフ化し、推移を追えるようにします。

# 使用部品  
- Raspberry Pi 4 4GB  
将来的な拡張性も含めて強めのやつ  
- SHT31モジュールキット  
比較的精度が高く、お手頃だったので(プルアップとか考えなくていいし…)
- MH-Z19C  
CO2センサといえば、コレ！というくらいメジャーなので

# 回路図
以下の通りです。
SHT31は良いものがなかったので、別基板にしていますが、読み替えてください。
![scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/7546de89-860c-0b28-a6d4-69459948eafe.png)


# kintone設定
![kintone_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/c2981948-612a-0826-fbe6-0fb1267fe2d6.png)


ざっとハードができたところで、先にデータの受け皿としてのkintoneアプリを作成しておきましょう。
今回はシンプルにいきたいため、CO2濃度、温度、湿度を入力できる数値フィールドと、データ取得日時を入力できる日時フィールドを準備しておきます。
データが登録された時=データ取得日時としたいため、日時フィールドは初期値としてその時の日時を自動取得するようにしています。
　　
　　
次に、CO2濃度が一定以上になると換気を促すように通知するようにします。
![換気喚起.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/02fd2984-8422-49d5-02e5-3a359f61f9bf.png)
レコードの条件通知でこのように設定しておくことで、CO2濃度が1000ppmを超えるとtestというユーザーに通知されます。　　

ここまですべて標準機能でできます。手前味噌ですがなかなか便利です。




# Node-RED設定
![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/f572b683-f57b-8f70-c49a-e4ae86d7340e.png)
何と便利なことに、今回使用したセンサのnodeや、kintoneのnodeまで作られています。
つまりは'ほぼ'ノーコードでできる見通しが立ちましたね。

構成は、"getCO2"という文字列を各センサnodeにinjectします。
少し細かめにデータを取得し、平均することで外れ値を緩和したいので、15秒ごとにデータを取得する仕様とします。
そのため、getCO2は15秒に1回自動で発行されるよう設定しておきます。

MH-Z19Cのnodeは、この文字列が入力されると現在のCO2濃度と温度を取得しに行きます。
SHT31は何でも入力されると温度と湿度を取りに行く仕様のようです。

それぞれのセンサの出力はjson形式で出力されますので、"join"nodeにて合流させます。

そのままではkintoneにアップロードできる形式でないため、functionにて中身を整理します。
処理内容はこんな感じです。
msgというObjectで各データは送られてくるので、新たなkintone用のObjectに変換しているだけです。

```function.js
let retMsg = new Object();

retMsg.payload = [
  {
    'temerature':{
      'value':msg.payload.temerature_C
    },
    'humidity':{
      'value':msg.payload.humidity
    },
    'co2':{
      'value':msg.payload.CO2
    },
  },
];
return retMsg;
```

さて、ここまでで前準備は完了です。
あとはnode-REDを動作させるだけで、kintoneにデータが蓄積されていきます。
では見ていきましょう。

# グラフ
kintoneは簡単にデータをグラフ化できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/2c3a2254-2b1e-5f92-ee05-455dbb830806.png)
こう設定しておくと、分単位で平均してくれます。かんたんです。

  
この設定だと、見た目はこんな感じ。
![temperature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/c557e978-8ff1-019a-b8a4-48f3704c44a7.png)
![co2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/707b19b4-2d1d-b355-10ea-8e4236f6ec86.png)
データを見る限り、問題なく動作しているようです。よかった。

# 通知
1000ppmを超えていると最大1分に4回、換気が促される仕様です。
さすがにこれだけ換気しろって言われたらするよね…くらいの勢いで換気を促されます。
![換気してください.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2033101/37454c25-4a4e-b7bb-e162-f974ccf49af6.png)

# まとめ
展示品としてはこちらの内容は以上です。
室温によってエアコンの温度を自動で調整したり、CO2濃度が高ければ換気扇を回すなど、
色々と組み合わせると面白いと思いました。(コードを書く必要はありますが)

もしこの記事を見てkintoneに少しでも興味を持っていただけたらぜひ公式ページにも遊びに来て下さい。

kintone
https://kintone.cybozu.co.jp/

cybozu developer network
https://developer.cybozu.io/hc/ja
What are Diffusion Models?（翻訳）

# What are Diffusion Models?

本記事は[What are diffusion Models?](https://lilianweng.github.io/lil-log/2021/07/11/diffusion-models.html)を許可を得て翻訳したものです。Diffusion Modelの日本語の記事がまったくなかったので勉強がてら、翻訳してみました。誤訳や誤植などありましたらお知らせください。

# Quick Summary
 - 良い点: 生成モデルでは扱いやすさと柔軟さの両立は難しいです。扱いやすいモデルは解析的に評価ができ、例えばGaussian やLaplaceを通して安価に学習が行えますが、リッチな画像のデータセットでの表現は難しいものがあります。柔軟なモデルは任意のデータ構造に対して学習することができますが、モデルの学習、評価、生成はいつも大変です。diffusion modelは扱いやすさと柔軟さが両立していると言えるでしょう。

 - 悪い点: doffision modelの生成ステップは長いマルコフ連鎖に依存していて、処理に多大な時間がかかります。高速化手法は新たに提案されていますが、GANと比較すると依然として遅いです。

>Diffusion modelはとても新しいタイプの生成モデルで、どのような複雑なデータ分布でも学習することができ、なおかつその分布を解析的に評価することができます。
>近年ではDiffusion modelは高精度な画像を生成でき、GANでSOTAなモデルより高い精度を達成しています。

Qiitaでは数式が崩れたので、続きは[こちら](https://zenn.dev/nakky/articles/09fb1804001ff8)。
mac(Catalina, Big Sur)のnodeインストールメモ


Macのパソコンを新しくしたらnodeのインストールで躓いたのでメモ

$ node -v をしたら下記エラーが出たのでおそらくシェルがbashからzshになったことで使えなかったぽい
※OSがCatalina, Big Surの場合はzshがデフォルト

```
zsh: node: command not found
```

成功した流れ

```
$ brew install nodebrew

$ nodebrew ls-remote

v15.0.0   v15.0.1   v15.1.0   v15.2.0   v15.2.1   v15.3.0   v15.4.0   v15.5.0
v15.5.1   v15.6.0   v15.7.0   v15.8.0   v15.9.0   v15.10.0  v15.11.0  v15.12.0
v15.13.0  v15.14.0  

$ nodebrew setup
$ touch ~/.zshrc
$ echo '# nodebrew' >> ~/.zshrc
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
$ source ~/.zshrc

$ nodebrew install v15.14.0
$ nodebrew use v15.14.0 
$ node -v
7.7.6
```

#### 参考
- [nodebrewによるNode.jsのインストールからセットアップまで](https://qiita.com/krtsato/items/01793f31455f44197463)
Google Cloud Functionsで、GitHubのprivateリポジトリにある自作ライブラリを使う方法

Google Cloud Functions(以後、GCF)でアプリをデプロイするとき、Cloud Build環境でSSHキーにアクセスできません。そのため、GitHubのprivateリポジトリにアクセスできないので、アプリのソースコード上に自作ライブラリをあらかじめ組み込んでおく必要があります([公式リファレンス](https://cloud.google.com/functions/docs/writing/specifying-dependencies-python#using_private_dependencies))。

しかしながら、`pip install -t`でインストールした方法ではいくつか問題があります。

そこで本記事では、ライブラリをwhlに固めてから組み込む方法を紹介します。

<!-- more -->

## 自作ライブラリのソースコードをpip install -tで組み込む問題点

Pipfile, requirements.txtなどで依存ライブラリを一元管理できなくなります。また、自作ライブラリの依存ライブラリがアプリのソースコード下に組み込まれてしまいます。

同じライブラリを二重にインストールすることがあるので、デバッグが困難になり得るほか、アプリの容量が肥大化します。

## 自作ライブラリをwhlで組み込む
whl形式は自作ライブラリの依存ライブラリ一覧も入っているため、前述の問題が解決されます(whlのデータ構造については、[付録](#付録-whlのデータ構造)をご覧ください)。

### 1. 自作ライブラリからwhlを生成する

自作ライブラリをwhlに変換するには以下のコマンドを使用します。

※ wheelライブラリが必要なので、必要に応じインストールください。

```bash
$ python setup.py bdist_wheel
```

これにより (ライブラリ名)-(バージョン)-py3-none-any.whl などの形式でwhlが生成されます。

### 2. アプリに自作ライブラリのwhlを依存関係に追加する

whlをアプリのディレクトリ内に組み込み、Pipfileやrequirements.txtにwhlを追加します。

- pipenv(Pipfile)の場合

以下のコマンドを実行して、Pipfileに追加します。

```bash
$ pipenv install ./path/to/(whl名).whl
```

`pipenv install`後のPipfile

```toml
...(前略)...

[packages]
(パッケージ名) = {path = "./path/to/(whl名).whl"}

...(後略)...
```


- requirements.txt

仮想環境ツールを使う、あるいは直接requirements.txtに追記します。

※ 仮想環境を使っている場合も、デプロイまでにrequirements.txtにwhlを追記しておく必要があります。

```plaintext
...(前略)...

./path/to/(whl名).whl

...(後略)...
```

以上により、GCFのデプロイ時に自作ライブラリがインストールされるようになります。pipはwhlのRequires-Distに書いている依存ライブラリを見て依存関係を解決するため、アプリおよび自作ライブラリで依存関係が干渉するリスクが軽減されます。


## 付録-whlのデータ構造
whlには、ライブラリのソースコードおよびメタデータをバイナリで保持しています。whlはZIPフォーマットなので、ZIPで解凍できます([公式リファレンス](https://www.python.org/dev/peps/pep-0427/))。中を見てみると、

- ライブラリ名/: ライブラリのソースコード
- ライブラリ名-(バージョン).dist-info/: ライブラリのメタデータ

が入っています。ライブラリのメタデータの中には最低でも以下のファイルが入っています。

- METADATA: ライブラリの概要情報。バージョン、ライブラリ名、作成者情報などが入っている
  - 依存ライブラリの一覧は、METADATAのRequires-Distに記載されている
- RECORD: whl内ファイルのsha256以上のハッシュ値があり、whlの整合性が問題ないかの確認に使う
- WHEEL: whl形式のバージョンや生成方法など

METADATAの例は以下となります。

```
Metadata-Version: 2.1
Name: (ライブラリ名)
Version: (ライブラリのバージョン)
Summary: (ライブラリの説明文)
Home-page: (ライブラリ制作元の管理ページ)
Author: (ライブラリ製作者名)
License: (ライブラリのライセンス)
Platform: ([ライブラリが対応するCPUアーキテクチャ。ソースコードおよび依存関係でC言語拡張を含む場合、明示的に指定が必要になる](https://www.python.org/dev/peps/pep-0425/))
Requires-Dist: google-cloud-tasks (==1.5.0)
```

- - -

以上、ご覧いただきありがとうございました！
AWS EKS on Fargateでpodが使用しているvCPU, Memoryを表示するワンライナー

`AWS EKS on Fargete` では主にPodをホスティングしているFargateの`vCPU` `memory` に課金がされます。

各podが使用している`vCPU` `memory` は `kubectl describe pods` で取得できる、`Annotations:          CapacityProvisioned` にて確認することができます


```
$ kubectl describe pods
Name:                 hogehoge
Namespace:            default
Priority:             2000001000
Priority Class Name:  system-node-critical
Node:                 fargate-ip-xxxx.ap-northeast-1.compute.internal/xxxx
Start Time:           Tue, 14 Sep 2021 13:00:51 +0900
Labels:               app=hogehoge
                      eks.amazonaws.com/fargate-profile=fp-default

Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB

                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
                      kubernetes.io/psp: eks.privileged
```

また`describe pods`以外にも`kubectl get pods -o json` でJSON形式でpodごとの情報を出力することができるので、`jq` と組み合わせて以下のように取得することができます

```shell
$ kubectl  get pods --all-namespaces -o json \
  | jq -r '.items | .[] | [.metadata.name, .metadata.annotations.CapacityProvisioned]   | @tsv' \
  | grep vCPU 

hogehoge	0.25vCPU 0.5GB
aws-load-balancer-controller-75887bfdc9-tbl27	0.25vCPU 0.5GB
coredns-859bbbb85d-vdw97	0.25vCPU 0.5GB
coredns-859bbbb85d-wbw9p	0.25vCPU 0.5GB
```

`kube-system` で動くようなpodにも課金されるので注意が必要です


----

https://aws.amazon.com/jp/fargate/pricing/

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/fargate-pod-configuration.html
Docker の Volumes と Bind mounts

Docker の Volumes と Bind mounts について、何度読んでも意味が分からないのでまとめる。

## docker run コマンドの -v (--volume) オプション

リファレンス:  https://docs.docker.com/engine/reference/run/#volume-shared-filesystems

> -v, --volume=[host-src:]container-dest[:<options>]

> The host-src can either be an absolute path or a name value. If you supply an absolute path for the host-src, Docker bind-mounts to the path you specify. If you supply a name, Docker creates a named volume by that name.

Docker 内のファイルを共有するには、Volumes と Bind mounts という二つの方法があるが、ややこしいことに、同じオプションで Volumes と Bind mounts という異なる機能を設定する。

> A name value must start with an alphanumeric character, followed by a-z0-9, _ (underscore), . (period) or - (hyphen). An absolute path starts with a / (forward slash).

* host-src が英数文字から始まる時: Volumes
* host-src が / から始まる時: Bind mounts

## Volumes https://docs.docker.com/storage/volumes/

Volume を作る

    $ docker volume create my-vol

Volume のリスト。いつの間にか出来ているボリュームの最後に先程作った物が出る。

    $ docker volume ls
    DRIVER    VOLUME NAME
    local     0ac8a1264245c3d065e045e06f5509691df967bba733deb49052548a04c39c5e
    ...
    local     my-vol

Volume の情報を見る。

    $ docker volume inspect my-vol
    [
        {
            "CreatedAt": "2021-09-16T01:41:33Z",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
            "Name": "my-vol",
            "Options": {},
            "Scope": "local"
        }
    ]

これを見ると /var/lib/docker/volumes/my-vol/_data に実体がありそうだが、ホストが Mac だと見えない。この Volume をマウントして cont1 と名付けたコンテナを動かし、hello ファイルを作る。

    $ docker run --name cont1 -v my-vol:/my-vol ubuntu \
      bash -c 'echo "Hello, world!" > /my-vol/hello'

Volume を別の cont2 と名付けたコンテナにマウントして中を見る。

    $ docker run --name cont2 -v my-vol:/my-vol ubuntu \
      cat /my-vol/hello
    Hello, world!

ちゃんと共有されている。

## Bind mounts https://docs.docker.com/storage/bind-mounts/

Volumes を使うとホストのどこにファイルが保存されるか分からない。ホスト側の位置を指定したい時は Bind mounts を使う。

例えば cont1 で先程作った ファイルをホストにバックアップする時はこうする。

    $ mkdir backup
    $ docker run --rm --volumes-from cont1 -v $PWD/backup:/backup ubuntu \
      tar cvf /backup/backup.tar /my-vol
    tar: Removing leading `/' from member names
    /my-vol/
    /my-vol/hello

次の事が起こる。

* `--volumes-from cont1`: cont1 コンテナに使われた Volumes を全部マウントする。
* `-v $PWD/backup:/backup`: ホストの $PWD/backup をコンテナの /backup に bind mounts する。
* `tar cvf /backup/backup.tar /my-vol`: コンテナの /my-vol を /backup/backup.tar にバックアップする。
* コンテナの /backup/backup.tar の実体はホストの $PWD/backup:/backup/backup.tar なので、コマンドが終わるとホストに backup.tar が残る。

確認

    $ tar tf backup/backup.tar
    my-vol/
    my-vol/hello

## 後片付け

    $ docker container rm cont1 cont2
    $ docker volume prune
Javaで飯食ってるエンジニアがGolangを学んでみる~序章~

とりあえずJavaとの差を意識してメモ書きのように書いてみる。Go→Javaの順
序章と書いたが続くかは不明。。。

社会人になり、弊社に入社してからJavaを学んだのだが、
その時は学生時代に研究で利用していたFortranとの対比で基本的な文法は学んで言った記憶があった。
（やり方がいいかは別）

今回もJavaとGoがいずれも静的型付け言語であることを利用し、
同じことをそれぞれの文法で書いたらどうなるかを実際にメモ書きしてみた感じ。

※Editorじゃないのでミスっていたらすみませんコメントで教えてください
※全部はやってません


#コンソール出力

```Go

import "fmt"

func main(){

    var human string = "TOM"

    fmt.Printf("%sは人間です",human)
}

```

```java

public static void main(String[] args){

    String human = "TOM";

    System.out.printf("%sは人間です",human);

}

```

#if文

```Go

import "fmt"

func main(){

    var score int = 100
    if score == 80 {
        fmt.Println("素晴らしい")
    }else if score >= 60 {
        fmt.Println("よくできました")
    }else {
        fmt.Println("頑張りましょう")
    }
}

```

```java

public static void main(String[] args){

    int score = 100;
    if(score == 80) {
        System.out.println("素晴らしい");
    }else if(score >= 60){
        System.out.println("よくできました");
    }else {
        System.out.println("頑張りましょう");
    }
}

```


#for文

```Go
import "fmt"

func main(){

    for i := 1 ; i <= 100 ; i++{
        fmt.Println(i)
    }

}
```

```java

public static void main(String[] args){

    for(int i = 1 ; i <= 100 ; i++){
        System.out.println(i);
    }

}
```


#乱数

```Go
import "fmt"
import "math/rand"

func main(){

    fmt.Println(rand.Intn(10))
    
}
```

```java
import java.util.Random;

public static void main(String[] args){

    System.out.println(new Random().nextInt(10));

}
```


#完全な乱数

```Go
import "fmt"
import "math/rand"
import "time"

func main(){

    rand.Seed(time.Now().Unix())
    fmt.Println(rand.Intn(10))
    
}
```


#コンソール入力


```Go
import "fmt"

func main(){
    var input string

    fmt.Scan(&input)
    fmt.Println(input)
    
}


```

```java
import java.util.Scanner;

public static void main(String[] args){


    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine();

    System.out.println(input);
    
}
```


#引数のあるメソッド

```Go
import "fmt"

func main(){
    hoge("あいう")
}

func hoge(fuga string){

    fmt.Println(fuga)
    
}
```

```java

public static void main(String[] args){
    hoge("あいう")
}

private void hoge(String fuga){

    System.out.println(fuga);
    
}
```


#戻り値のあるメソッド

```Go
import "fmt"

func main(){
    hogehoge := hoge("あいう")

    fmt.Println(hogehoge)
}

func hoge(fuga string) string{

    return fuga
    
}
```

```java

public static void main(String[] args){

    String hogehoge = hoge("あいう")

    System.out.println(hogehoge);

}

private String hoge(String fuga){

    return fuga;
    
}
```


#ポインタ型

```Go
import "fmt"

func main(){

    var hogehoge string = "あいう"
    var hogehogePtr *string =&hogehoge

    fmt.Println(hogehoge)
    fmt.Println(hogehogePtr)
}

出力結果
>あいう
>0xc420010220

```

#ポインタ型を利用した値の更新

```Go
import "fmt"

func main(){

    var hogehoge string = "あいう"

    fmt.Println(hogehoge)

    change(&hogehoge)

    fmt.Println(hogehoge)

}

func change(hogehogePtr *string){

    *hogehogePtr = "かきく"

}

出力結果
>あいう
>かきく

```
VSCode editor.wordWrap を on にした時の折り返し行 表示方法

もともと vim が大好きだった...今も好き！...ので vscode の折り返し表示が個人的に見にくかった
https://qiita.com/ebtiag/items/1f3ccea47b789bb20800
上記ポストを読むまで『仕方ない仕様なんだろう』とあきらめていたけど 設定がGUIからも出来るようになったらしいので のぞいてみた

そうしたら 「Wrapping Indent」「折り返し行のインデントを制限します」発見！早速弄ってみた

|value|desc|sample|
|:---:|:--:|:----:|
|none|折り返いし無し<br/>**vimと一緒！**| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570185/df5631a4-83e2-01d0-e1dc-4a3ae4882bc2.png) |
|same|**規定** 親と同じ| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570185/9cd91950-8968-41b3-2474-6639f27febb8.png) |
|indent|親 +1 のインデント| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570185/e13689ca-9654-01ef-7fb1-9b8157c5b3fe.png) |
|deepIndent|親 +2 のインデント| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570185/61ec2d1a-4002-d6c9-3047-a545b67769a6.png) |

settings.json 内での項目は editor.wrappingIndent

うん 蓼食う虫も好き好きだが none を指定すると馴染み深い表記になった♪
誕生日を入力させる方法について考えてみた

生年月日を入力するフォームを作成した。

とりあえずdatepickerを表示するようにしておいた。

「選択しずらいのでプルダウンに変えてください」の声。

ただ、1965年生まれの私としてはプルダウンで選ぶのは大変なのだ!!datepickerで年を変更したほうが間違いが無いのだ!!

声の主はdatepickerで年を変更できることを知らなかった。

そうか、datepickerで年を変更できることを知っている人は少数なのかもしれない。

そこで、datepickerでカレンダーを表示するとき最初から年を表示するようにしてみた。

指定するoptionは１つ

startView: "years",

これだけ。

声の主にも評判が良かった。
「ルックアップ」コンポーネントの使い方

#「ルックアップ」コンポーネント作成時の設定項目

①API 参照名：他の要素で、このコンポーネントの値を使用する際は、このAPI参照名を使用します。


②オブジェクト API 参照名：取得元オブジェクトの API 参照名。


③項目 API 参照名：取得元オブジェクトの参照項目の API 参照名。


④表示ラベル：ルックアップコンポーネントの上に表示されるラベル。

⑤レコード ID：デフォルトで表示しておきたいレコードのID。
⇒レコードIDが分からない場合は、そのレコードのURL部分を見てください。（下図参照）
![URL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/be715ab1-ad8b-9da6-01e4-22eeb97aeb0b.png)



⑥必須：必須にする場合{!$GlobalConstant.True}を選択
　　　必須にしない場合{!$GlobalConstant.False}を選択



#例
例）商談のレコードを新規作成する画面を作成する際、取引先をルックアップ検索できるようにしたい場合。

①API参照名：ご自由に。
②オブジェクトAPI参照名：Opportunity（商談のAPI参照名）
③項目API参照名：AccountId（参照関係(取引先)のAPI参照名）
④表示ラベル：取引先名
⑤レコードID：デフォルトで表示しておきたい商談レコードのID
⑥必須：{!$GlobalConstant.True}

![サンプル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/f885b23f-7c68-3dee-c9dc-086d4bc3390d.png)



#間違いやすい?ポイント

###1. オブジェクトAPI参照名は、参照関係の子のレコード名を入力！
上記の例のように、取引先をルックアップ検索したい場合、
オブジェクトAPI参照名は、取引先のAPI名を入力するもんだと思ってたんですけど、
違うみたいです。。。

正解は、子オブジェクトの「商談」のAPI名【Opportunity】を入力するのが正解です!
これを間違えると、ずっと検索中でぐるぐるしちゃうことになるので気を付けてください:spy:

###2. 項目API参照名は、子オブジェクトの項目API名を入力
1.と同じことなんですが、項目API参照名は、子オブジェクトの項目とリレーションに書かれてるAPI参照名を入力するんですって。