OmniAICreator/Qiita-1.07M huggingface dataset:
ColaboratoryをVPSのように利用したら、機械学習の世界が広がった

## やること
ColaboratoryにSSHでログイン  

## Colaboratoryとは
- Googleが提供する機械学習研究用の実行環境
- Jupyter Notebookをインターフェースとしている
- 各種ライブラリがデフォルトでインストールされている
- 無料でGPUを利用できる（有料版は性能アップ）

## 動機
上に書いたとおり、各種ライブラリがデフォルトでインストールされており、実際に利用したいバージョンと異なる事がある。  
Jupyter Notebookは細い単位で出力を確認しながら進める作業には向いているが、行数の多い処理は扱いづらく感じるところがある。  

**GUIではなくCUIでColab環境を利用したい。**

## 構成
まず考えるのはSSHでのログインなのだが、Colab環境にはグローバルIPが割り当てられておらず、任意ポートに外からアクセスできない。  
よってトンネリングで回避する必要がある。  
何やかんやで環境を用意するのが面倒なのでNgrokというサービスを利用した。  
※Ngrokはグローパルに公開されたアドレスを発行するため、公開鍵認証を設定している。（有料版は細かいアクセス制御可）

### トンネリング by Ngrok
Ngrokクライアントを実行しているサーバとNgrokサーバ間でトンネリングが設定され、Ngrokの用意したグローバルアドレスからトンネリング先へアクセスが可能となる。

![スクリーンショット 2022-03-29 13.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169919/7cc6d1e9-2dc7-7fad-50ae-eb324f8ef0dd.png)


## 環境構築スクリプト
スクリプトの上部、設定箇所を適宜変更、Colaboratoryに貼り付けで実行するだけ。  
実行完了時にsshコマンドが画面上に出力されるので実行でログイン完了。  
```
$ ssh -i /path/to/private_key root@1.tcp.ngrok.io -p 11111
```

### やっている内容
1. sshd起動
1. パスワードログイン不可
1. 公開鍵設定（事前にローカルで鍵のペアを作っておく）
1. ngrok起動
1. ngrokの発行したアクセス情報を取得、コピペできる形に整形

### スクリプト
```
# 設定
## Colabサーバに登録する公開鍵情報
ssh_public_key = "ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
## Colabサーバに登録の公開鍵と対の秘密鍵パス情報（繋ぐ元の端末のパス）
ssh_private_key_path = "path/to/local_private_key"
## Ngrokの認証情報 https://dashboard.ngrok.com/get-started/your-authtoken
ngrok_authtoken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# ---

# SSH
## 公開鍵を設置
! mkdir /root/.ssh && echo $ssh_public_key > /root/.ssh/authorized_keys
! chmod 700 /root/.ssh/ && chmod 600 /root/.ssh/authorized_keys
## インストール・起動
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
get_ipython().system_raw('/usr/sbin/sshd -D &')

# ---

# Ngrok
# インストール・起動
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip
! ./ngrok authtoken $ngrok_authtoken
get_ipython().system_raw('./ngrok tcp 22 &')

# ---

# アクセス情報を取得する
import requests
import json
import time
from urllib.parse import urlparse
time.sleep(1)

content = json.loads(requests.get("http://localhost:4040/api/tunnels").content)
key = ssh_private_key_path
netloc = urlparse(content['tunnels'][0]['public_url']).netloc
host = netloc.split(":")[0]
port = netloc.split(":")[1]

print(f'$ ssh -i {key} root@{host} -p {port}')
```

## 最後に
私はColab、Ngrok両サービスの有料版を利用しているが、紹介のスクリプトは無料でも行けるはず。  
普段利用している環境構築スクリプトは上記と異なり、学習状況の通知やモデルのバックアップなどの機能があり規模が大きいので紹介を断念。  

Colabでコスパ良い機械学習ライフをどうぞ。  

## 利用サービス
### Colaboratory
https://colab.research.google.com/

### Ngrok  
https://ngrok.com/
忘れそうなzodスキーマメモ

## 概要
この記事は、著者が最近使った中で特に忘れそうなzodのスキーマについて簡単な説明とサンプル、使い方をまとめたメモです。

zod自体の説明、インストール方法や本記事で説明していないスキーマ等についてはライブラリの[README.md](https://github.com/colinhacks/zod)をご覧ください。

## スキーマ

### z.array
配列型を表すzodスキーマ

```typescript
const stringArraySchema = z.array(z.string())
// 以下の記法と同様
// const stringArraySchema = z.string().array()

type StringArray = z.infer<typeof stringArraySchema>
// string[]
```

### z.nullable
nullable型(null許容型)を表すzodスキーマ

```typescript
const nullableStringSchema = z.string().nullable()
type NullableString = z.infer<typeof nullableStringSchema>
// string | null
```
前述のarrayに利用すると以下のようになる(nullではなく空配列にしたほうが扱いやすい)

```typescript
const　nullableStringArraySchema = z.array(z.string()).nullable()
type NullableStringArray = z.infer<typeof nullableStringArraySchema>
// string[] | null
```

### z.optional
optional型(undefined許容型)を表すzodスキーマ

```typescript
const optionalStringSchema = z.string().optional()
type OptionalString = z.infer<typeof optionalStringSchema>
// string | undefined
```

### z.nullish
nullableかつoptionalな型を表すzodスキーマ
```typescript
const nullishStringSchema = z.string().nullish()
// 以下の記法と同様
// const nullishStringSchema = z.string().nullable().optional()

type NullishStringArray = z.infer<typeof nullishStringSchema>
// string | null | undefined
```

### z.literal
literal型(string型, number型, boolean型などの特定の値)を表すzodスキーマ

Date, bigint型は記事投稿時点でサポート対象外

```typescript
const messageSchema = z.literal("message")
const oneSchema = z.literal(1)
const trueSchema = z.literal(true)

type Message = z.infer<typeof messageSchema>
// "message"
type One = z.infer<typeof oneSchema>
// 1
type True = z.infer<typeof trueSchema>
// true
```

### z.union
union型を表すzodスキーマ

```typescript
const stringOrNumberSchema = z.union([z.string(), z.number()])
// 引数が配列であることを忘れやすいので注意
// 以下の記法と同様
// const stringOrNumberSchema = z.string().or(z.number())

type StringOrNumber = z.infer<typeof stringOrNumberSchema>
// string | number
```

前述のliteral型と合わせて利用すると、以下のようになる
```typescript
const someHttpStatusSchema = z.union([z.literal("200"), z.literal("404")])
type SomeHttpStatus = z.infer<typeof someHttpStatusSchema>
// "200" | "404"
```

### z.nonempty
空文字列を許容しないstring型を表すスキーマ

```typescript
const nonemptyStringSchema = z.string().nonempty()
type NonemptyString = z.infer<typeof nonemptyStringSchema>
// string(空文字は許容しない)
```

nonemptyとは逆に、空文字列のみを許容するstring型は以下のように書く
```typescript
const emptyStringSchema = z.string().length(0)
type EmptyString = z.infer<typeof emptyString>
// string(空文字のみ許容する)
// z.string().empty()のような書き方は記事投稿時点では存在しない
```

### z.any
any型(どの型でも許容する型)を表すzodスキーマ

型を定義している意味がなくなるので、使う場合は要注意

```typescript 
const anySchema = z.any()
type Any = z.infer<typeof anySchema>
// any
```

### z.unknown
unknown型(どの型でも許容する型)を表すzodスキーマ

unknown型はany型とは異なり、型が確定するまでプロパティやメソッドを参照できない

```typescript
const unknownSchema = z.unknown()
type Unknown = z.infer<typeof unknownSchema>
// unknown
```
指定したテーブルのインデックスを再編成（REORGANIZE）する方法 SQL Server

### 環境
SQL Server 2012

### 参考
前回の以下の投稿に若干手を加えて作成しました。
[SQL Server の指定したテーブルのインデックス名を取得する方法](https://qiita.com/azumabashi/items/c84482e0485766b737e0)

### ストアドプロシージャを実装する
```
CREATE PROCEDURE [dbo].[sp_INDEX_REORGANIZE]
  @schema_name VARCHAR(MAX),
  @table_name VARCHAR(MAX)
AS
BEGIN
  DECLARE [cur_index_name] CURSOR FOR
  SELECT   I.name AS IndexName
  FROM     sys.objects AS O
               INNER JOIN sys.schemas AS S
                  ON O.schema_id = S.schema_id
               INNER JOIN sys.indexes AS I
                  ON O.object_id = I.object_id
  WHERE    S.NAME = @schema_name
           AND O.name = @table_name
           AND I.is_disabled = 0;

  OPEN [cur_index_name];

  DECLARE @index_name VARCHAR(MAX);
  DECLARE @sql VARCHAR(MAX);

  FETCH NEXT FROM [cur_index_name] INTO
    @index_name;

  WHILE (@@FETCH_STATUS = 0)
  BEGIN
    SET @sql = 'ALTER INDEX ' + @index_name + ' ON ' + @schema_name + N'.' + @table_name + ' REORGANIZE';
	PRINT @sql;
	EXECUTE (@sql);
    FETCH NEXT FROM [cur_index_name] INTO
      @index_name;
  END

  CLOSE [cur_index_name]
  DEALLOCATE [cur_index_name]
END
```

### ストアドプロシージャを実行する
```
DECLARE @schema_name VARCHAR(MAX);
SET @schema_name = 'dbo';

DECLARE @table_name VARCHAR(MAX);
SET @table_name = 'ITEM';

EXECUTE sp_INDEX_REORGANIZE @schema_name, @table_name;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/c6b18d6a-fe2a-be6e-f41d-ce605d1c0546.png)
開発前の準備「とにかくローカルに表示する！プロジェクトに参加していく！」3

<br>

### 【この記事を読むのは、こんなことに困った時】

 ・既存のサイトをローカルにクローンしてたけど画像は本番からダウンロードしたい！
 ・FTPの「WinSCP」で対象のサイトからダウンロードしてきたいファイルや画像がある！
 ・「WinSCP」はWindows！！あなたのサイト情報は筆者にはわからないよ！ということで。。。

---

#### 【環境構築手順メモ　ー➂】

###### ＜前提＞
PC：Windows
Webサーバー：IIS
言語：html css C# PHP JS TS
作成：HP
その他：リモートからプロジェクトをクローン

###### ＜きっかけ＞
サイト引継ぎの際の環境構築。

<br>

---

#### 【手順の流れ】

➀ ローカルにプロジェクトを用意する
➁実行環境の導入（npm install）
➂IIS（ローカルサーバー）の設定
➃サイト表示の確認　　◀今回はここ！
➄画像がコード管理から外されている場合はダウンロード（git管理下ならこの作業は不要）◀今回はここ！

※前回の➂はここから[戻る](https://qiita.com/kusaharajiji/items/abb20f7da971bc032f9e)

<br>

---

#### 【手順】
#### 「④サイト表示の確認」

###### 1. クローンしておいたプロジェクトを表示させる
　　　　・VScodeで開いてそのターミナルでコマンド「npx gulp」
　　　　（※ちなみに停止コマンド「Ctrl + C」）

　　　　とにかく、エラー出なければOK。ここまでは本当に表示させるだけの作業です。

<br>

###### 　ーこれで表示に問題なければ完了です（想像してた表示だ～ならOK）ー

<br>
<br>
<br>

...が私はまだでした。
サイトは立ち上がったのですが以下の以下の問題が発生。

- 画像が表示されていない！
　だって、画像がリモートの管理下じゃなかったんだもん！

<br>
<br>
<br>

#### 「➄画像がコード管理から外されている場合はダウンロード」

###### 1.PCにFTPが入っているか確認（「WinSCP」「FileZilla」など）
　　　　※なければダウンロードしましょう➡[参考URL](https://www.kagoya.jp/howto/it-glossary/web/ftp/)


###### 2.FTP「WinSCP」でダウンロード手順を確認してみる
　　　　※筆者が使用中のWinSCPで大まかに流れを確認
　　　　　（別のFTP使用してる人は当てはまらないかも）

　　　　・WinSCP起動したら「新しいサイト」をクリック、
　　　　　もしくは既存のサイトを選択「管理(M)」➡「新規サイトとして複製(C)」

　　　　・以下の画像箇所（右のセッションの設定）を設定してゆく
　　　　　（サイトなどによって違うので各々でチェックしてみてください）
![FTP設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661441/e8cf470a-5970-ff2e-1574-07f0c2d416a3.png)

　　　　以下は「設定(D)...」先のディレクトリ設定です。好みでどうぞ。
　　 　　→リモートディレクトリ(R)UP先のパス指定
　　　　　→ローカルディレクトリ(L)自分のPCにあるプロジェクトパス指定

![スクリーンショット 2022-03-29 113613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661441/58045e7f-f102-fd83-172e-37efbac38bf1.png)


　　　　・設定できたら「保存(S)」をクリック

　　　　・サイト登録できたら「ログイン」

　　　　・必要なimg直下をローカルにダウンロード
　　　　　（欲しいフォルダがローカルに無かったら新規作成しておこう）

　　　　・ダウンロード完了したら「1. クローンしておいたプロジェクトを表示させる」同様
　　　　　「npx gulp」で立ち上げてみる。

---

#### 　「➃サイト表示の確認」「➄画像がコード管理から外されている場合はダウンロード」２点が完了しました！

###### これで環境構築完了しました！

どうでしょう？きちんと表示されましたか？
ここからはさらに追加で

<br>

###### 「まだちゃんと表示されないんだけど編」です！

というか、筆者はこの続きの設定が必要でした。。。

- ➅[「まだ画像表示されないんだけどIISで【SSI】設定が必要だった！」](https://qiita.com/kusaharajiji/items/d2f827e1c7bbfee8f55a)

- ➆[「cssが効いてないんだけど！？ルーティング設定必要なサイトに当たってしまった！」](https://qiita.com/kusaharajiji/private/30394e9df68aa3e40344)
　※この記事はURL限定にしています。参考に記事なるよう改善点が多いので。。。

<br>

---


#### 【気になるワード】---記事内でより理解を深めたいワード
 
- [FTPとは？](https://www.kagoya.jp/howto/it-glossary/web/ftp/)
- 今回教えてもらったけどFTP設定で必要な詳細はどこから調べてこりゃいいの？
【Java】SpringBootでPaging＆Sortしてみた。

# 参考

https://reflectoring.io/spring-boot-paging/

# pom.xml
```xml
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
```

# Repository
```java
@Repository
public interface SampleUserRepository
    extends CrudRepository<SampleUserEntity, Integer>, JpaSpecificationExecutor<SampleUserEntity> {
}
```

# Service
```java
  public SampleUserSearchResponse search(SampleUserSearchRequest request) {
    Specification<SampleUserEntity> specs = // generate specifications in some way
    PageRequest pageRequest = PageRequest.of(request.getPage(), request.getSize(),
        sortBuild(request.getSortKey(), request.isDesc()));

    Page<SampleUserEntity> sampleUsers = sampleUserRepository.findAll(specs, pageRequest);

    int totalPage = (int) Math.ceil((double) sampleUsers.getTotalElements() / request.getSize());

    return new SampleUserSearchResponse(totalPage,
        modelMapper.map(sampleUsers.getContent(), new TypeToken<List<SampleUserDto>>() {
        }.getType()));
  }
```

# Request
```java
public class SampleUserSearchRequest {
  private String name;
  private Integer age;
  private String sortKey;
  private boolean isDesc;
  private int size;
  private int page;
}
```
Python: ProcessPoolExecutorでの並列処理を検証してみた

ProcessPoolExecutorの動きが、Processと違ってあまり期待通りじゃないように見えたので、検証してみました。

executor.map()のresultをprint()してもあまりよくわからないので、time.sleep()を入れながらファイルを作成させて、ファイルができる順番やタイミングを観察してみました。

```python
import time
from concurrent.futures import ProcessPoolExecutor

def f(args):
    wait_seconds = args
    time.sleep(wait_seconds)
    try:
        with open(f"{wait_seconds}.txt", "w") as file:
            print(f"{wait_seconds}", file=file)
    except FileNotFoundError as e:
        pass
    return wait_seconds


if __name__ == "__main__":
    params = [
        (1),
        (7),
        (2),
        (3),
        (4),
        (5),
        (6),
    ]

    with ProcessPoolExecutor(max_workers=3) as executor:
        [print(r) for r in executor.map(f, params, chunksize=3)]
```

# 結果

ファイルができた順番。

```bash
1.txt
3.txt
6.txt
4.txt
7.txt
2.txt
5.txt
```

executor.map()のパラメータ chunksize=3 により、paramsが３つずつの集団に仕分けされて、各集団ごとは逐次処理になるようです。

```python
params = [
            (1),
            (7),
            (2),
            (3),
            (4),
            (5),
            (6),
        ]
```

↓

```python
グループ１：
            (1)
            (7)
            (2)

グループ２：
            (3)
            (4)
            (5)

グループ３：
            (6)
```

なので、


```bash
1.txt <- グループ1の1番手
3.txt <- グループ2の1番手
6.txt <- グループ3の1番手（グループ3はこれで終わり）
4.txt <- グループ2の2番手
7.txt <- グループ1の2番手
2.txt <- グループ1の3番手
5.txt <- グループ2の3番手
```

となるようでした。
そういうのだったのか。

ちなみにchunksizeを上げるとオーバーヘッドがものすごく、128とかにすると起動に数分かかりました。
max_workersやCPU、処理の内容と綿密にご相談ですね。
指定したテーブルのインデックス名を取得する方法 SQL Server

### 環境
SQL Server 2012

### 試し

```get_indexname.sql
SELECT   S.name AS SchemaName,
         O.name AS ObjectName,
         I.name AS IndexName
FROM     sys.objects AS O
             INNER JOIN sys.schemas AS S
                ON O.schema_id = S.schema_id
             INNER JOIN sys.indexes AS I
                ON O.object_id = I.object_id
WHERE    I.is_disabled = 0
ORDER BY ObjectName

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/7ab1bea0-0390-1a91-95b4-64a767c605ce.png)

### ストアドプロシージャを実装する
```CREATE_sp_GET_INDEX_NAME.sql
CREATE PROCEDURE sp_GET_INDEX_NAME
  @schema_name VARCHAR(MAX),
  @table_name VARCHAR(MAX)
AS
BEGIN
  DECLARE [cur_index_name] CURSOR FOR
  SELECT   I.name AS IndexName
  FROM     sys.objects AS O
               INNER JOIN sys.schemas AS S
                  ON O.schema_id = S.schema_id
               INNER JOIN sys.indexes AS I
                  ON O.object_id = I.object_id
  WHERE    S.NAME = @schema_name
           AND O.name = @table_name
           AND I.is_disabled = 0;

  OPEN [cur_index_name];

  DECLARE @index_name VARCHAR(MAX);

  FETCH NEXT FROM [cur_index_name] INTO
    @index_name;

  WHILE (@@FETCH_STATUS = 0)
  BEGIN
    PRINT 'INDEX[' + @index_name + ']';
    FETCH NEXT FROM [cur_index_name] INTO
      @index_name;
  END

  CLOSE [cur_index_name]
  DEALLOCATE [cur_index_name]
END
```

### ストアドプロシージャを実行する
```
DECLARE @schema_name VARCHAR(MAX);
SET @schema_name = 'dbo';

DECLARE @table_name VARCHAR(MAX);
SET @table_name = 'ITEM';

EXECUTE sp_GET_INDEX_NAME @schema_name, @table_name;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5c699ee4-e2b4-fea7-1a44-808f5c0b6aa0.png)
Ginで特定のパスの場合にログを出さない方法

```gin.Default()``` を利用していると
```
func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}
```
のように `gin.Logger()` `gin.Recovery()`
が適用されてしまう。
ここで適用されているgin.Loggerは設定が変更できないので
`gin.New()` を利用して

```
r := gin.New()
r.Use(gin.LoggerWithConfig(gin.LoggerConfig{SkipPaths: []string{"/healthcheck"}}))
r.Use(gin.Recovery())
```
のように手動で設定しgin.LoggerConfigにSkipPathsを設定する
gin.Recovery()の設定を忘れると500エラーを吐いた場合にginが落ちてしまうので注意！
【React × Typescript】useStateでオブジェクト型の型指定をする方法

## useStateでオブジェクト型指定する方法


Reactで{number: 0, title: "", image_url: ""}というオブジェクト型レスポンスがあるAPIを叩き、これを
useStateで型指定して取得したい場合、、、

1.まず~~interface~~typeで扱うプロパティでオブジェクト型をつくる（例：HogeObject）
※interfaceは拡張機能として、名前の型(interface)定義が複数ある時に自動的に一つの定義にマージしてくれるDeclaration merging機能があるがたまたまグローバルに定義されている型と同じ名前をつけてしまい拡張してしまうこともあり、この観点からすると型が弱くなる気がするので、今のところ通常のアプリ開発であればtype一択かな
```typescript:hoge.tsx
type HogeObject = {
  number: number;
  title: string;
  image_url: number;
}
..
```

2.作ったオブジェクト型をuseStateの引数に渡して「初期値」と共に定義
```typescript:hoge.tsx
..
const [hogeItems, setHogeItems] = useState<HogeObject>({number: 0, title: "", image_url: ""});
```

3.取得したオブジェクトに欲しい値のプロパティを渡してデータをrender
```typescript:hoge.tsx
  return (
      <ContentsCards
        cardContentsPath1={"/hoge/1/project/" + hogeItems.number}
        cardImageUrl1={hogeItems.image_url}
        cardTitle1={hogeItems.title}
        cardName1="hoge"
```
以上です
filterFindで制御しているwhere句を一時的に取り消す

ふと仕事で「src/Model/Table/HogesTable.phpで設定している設定をコントローラー側で止められないかな」と思い立ちました。
ほとんどの場合は論理削除されているデータは表示させる必要はないので、filterFindでdeletedが0のものしか取得しないようにしていますが、たまに削除済みのデータも必要になる場合があります。

cakephp2の記事はたくさん出てきたのですが、3と4の記事は出てこなかったのでこちらに書き残しておきます。

## やりたいこと
```
$this->Hoges->find('all')->toArray();
```
と書いても自動で論理削除されているレコードが取得出来ないように設定されているので
一時的にコントローラーで論理削除されているデータも取得できるようにしたい

## やったこと
src/Model/Table/HogesTable.php
```
class HogesTable extends Table
{
    ...
    public function beforeFind(Event $event, $query, $options)
    {
        if(isset($options['getDeleteRecords']) && $options['getDeleteRecords'] === true){
            //何もしない
        }else{
            $query->where([$this->aliasField('deleted') => 0]);
        }
    }
}
```
src/Controller/HogesController.php
```
$hoges = $this->Hoges->find('all', ['getDeleteRecords' => true])->toArray();
```

※getDeleteRecordsという名称は便宜上こう書いただけなので、何でも構いません。

簡単でしたね！
grayでもgreyでもCSS的にはいいんですね

# 「グレー」はgray？ grey？
たぶん常識だったんだろうけど知らなかったので…。

私は前者「gray」だけだｚと思っていたのですが、CSS的には「両方OK」らしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376864/9f37c18a-ead9-ea43-ca6d-579c1c527e06.png)

ライトグレーとかも両方OK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376864/a76f5395-ee14-8e3b-4f46-361bfbd95143.png)


辞書的には、アメリカ英語とイギリス英語の違い、らしいです。
https://dictionary.goo.ne.jp/word/en/grey/#ej-37411
> gray, (英)grey 


英語圏でも「生きてく強さ」を身につけたいと思います。
Nomad Mobile スマホ版 Notes クライアント

# スマホアプリで登場した Notes クライアント
Apple とのアライアンスが… という言い訳で IBM が長年リリースをためらっていた？スマホアプリ版の Notes クライアントが HCL Nomad という名称でリリースされています。
Notes を使った事がある人向けに乱暴に一言で説明するとスマホアプリ版の Notes クライアントであり、通信は NRPC でありローカルにレプリカも作れるのでオフライン利用もできてしまう上に ECL の警告まで出るという呆れる程 Notes クライアントなモバイルアプリです。公式の製品資料 [HCL Nomad Mobile の紹介資料](https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0075738) にもそんな雰囲気で紹介されています。

# ストア審査が不要なモバイルアプリ開発に
一方でアプリ開発に視点を変えるとモバイルアプリ開発に必要な Swift, Object-C, C++ などの言語や HTML/JavaScript の様な Web アプリ開発の知識なしに Visual Basic や Excel マクロの様な PC 系ツールの開発者がストアの審査やアプリ配布に悩む事なしに、格安・即効でエンドユーザーへ自作のアプリをモバイル利用させる基盤として扱う事ができます。この辺がためらわれていた原因なのかなと憶測してしまいます。

# スマホを向いた機能拡張が続々と
PC や Mac 版の Notes クライアントには無い、スマホカメラからの撮影した写真をそのままリッチテキストに添付する機能や Nomad Mobile 用に用意された[スマホ画面内にフローティングさせるメニューの追加](https://help.hcltechsw.com/dom_designer/11.0.1/basic/wn_new_properties_for_mobile.html)、位置情報が利用できる LotusScript の [NotesGPS](https://help.hcltechsw.com/dom_designer/12.0.0/basic/H_NOTESGPS_CLASS.html) クラスや縦長の画面アスペクト比のデバイスで活用されるフレームセットの画面遷移を優先付けする機能や[画面の縦横比を把握](https://help.hcltechsw.com/dom_designer/12.0.0/basic/wn_hide_columns_or_fields_from_smaller_screens.html)してレスポンシブ対応させる機能などモバイルでのアプリ利用を促進する機能が続々と追加されています。 

# 既存アプリの互換性
気のなる既存 NotesDB が動くかどうかですが、どうやら MacOS 用に提供されている [HCAA](https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0074176)(HCL Client Application Access) をベースにしているらしく、**要は Notes クライアントの Basic 版相当なので**、既存の Notes クライアントで使っていたアプリケーションは**ほぼ動きます**。細かく見たい方は、[制限事項](https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0078489)をチェックしてください。

# Domino サーバーとの接続
スマホやタブレットからの通信が Domino サーバーにダイレクトにアクセスできる環境であれば、Notes クライアント同様に NRPC(1352番ポート) で通信させてください。Domino サーバーが公衆通信から遮断されたイントラネットなどにある場合は VPN 接続やこのための通信を想定した [SafeLinx サーバーをプロキシ利用して HTTPS でスマホから通信させる](https://www.panagenda.com/ja/blog/%E9%81%8A%E7%89%A7%E6%B0%91%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEsafelinx%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97/)機能も提供されています。

# ダウンロードはストアから
iPhone / iPad / Android
Apple Store - HCL Nomad for iPhone/iPad
https://apps.apple.com/jp/app/hcl-nomad/id751904885
Google Play - HCL Nomad for Android Tablet
https://play.google.com/store/apps/details?id=com.lotus.nomad
![NomadMobile.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2437712/10561750-36b4-37eb-3a07-765374835be2.jpeg)

# 使いやすいアプリにするために
ネイティブのモバイルアプリのようなデザインと操作性、カメラやGPSといった機能を利用した業務アプリケーションの開発を、サンプルアプリケーションを通して紹介するセミナーが実施されました。
[HCL Nomad Mobile アプリ開発セミナー (リプレイ、資料、サンプルアプリのダウンロード)](https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0101403)
Dockerでコンテナ内のプロセスからホストのプロセスに接続する方法

Linuxの話です。WindowsやMacでは以下の設定は不要らしい。
Docker単体で使う場合とDocker Composeを使う場合の2パターンを解説。

# 共通事項
以下の設定で`host.docker.internal`がホストのアドレスに解決される。よってコンテナ内のプロセスからこのドメイン名に接続するとコンテナ外のホストのプロセスに接続できる（ホストは`0.0.0.0`等のアドレスで待ち受ける必要あり）。

# Docker単体で使う場合

```sh
docker run --add-host host.docker.internal:host-gateway IMAGE
```

## 解説
`--add-host` でコンテナ内の`/etc/hosts`にエントリを追加できる。ここで`host-gateway`を名前解決先に指定するとホストのアドレスにしてくれる模様。

# Docker Composeを使う場合

```yaml
services:
  SERVICE:
    image: IMAGE
    extra_hosts:
      - host.docker.internal:host-gateway
```

## 解説
`extra_hosts`でコンテナ内の`/etc/hosts`にエントリを追加できる。ここで`host-gateway`を名前解決先に指定するとホストのアドレスにしてくれる模様。

# あとがき
Docker Composeの場合はよく解説されているが、Docker単体の場合はあまり出てこなかったので一応書いた記事。
Excel VBAでセル内文字列の1文字ごとのフォント名を取得する

## はじめに

日本語版のExcelで文字列を入力していると、記号やギリシャ文字などが勝手に別のフォント(大抵は Calibri、時々Segoe UI Symbol、など)に変わることがあります。単一セルのフォントが変わってしまった場合は直すのも簡単なのですが、場合によっては文章の途中でフォントが変わってしまうこともあります。そこで、セル内の1文字ごとのフォント名を取得してみました。

## ワークシート

![excel_vba_fontnames_in_cell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307310/ad0af7c9-c548-3007-621f-7a406f11b684.jpeg)

## コード

```vb
Sub GetFontNamesInCell()
  Dim n
  For n = 1 To Len(ActiveCell.Value)
    Debug.Print n & ": " & ActiveCell.Characters(n, 1).Font.Name
  Next
End Sub
```

## 結果

```vb:イミディエイト
1: BIZ UDゴシック
2: BIZ UDゴシック
3: BIZ UDゴシック
4: BIZ UDゴシック
5: BIZ UDゴシック
6: BIZ UDゴシック
7: BIZ UDゴシック
8: BIZ UDゴシック
9: BIZ UDゴシック
10: Calibri
11: BIZ UDゴシック
12: Calibri
13: BIZ UDゴシック
14: BIZ UDゴシック
15: BIZ UDゴシック
16: BIZ UDゴシック
17: BIZ UDゴシック
```
HS105を設定してみた

昨年のブラックフライディーにamazonでHS105が1000円を切る値段だったので、購入してみました。発送が1週間後くらいで、おそらくプライムほいほいだったのではないかと思われす。

HS105はKasaというスマホアプリで設定を行います。TP-Linkはもう一種類スマートプラグを作っていてそちらはKasaではないようです。

設定前はHS105がWIFIアクセスポイントになって、スマホが接続してアプリから実際のアクセスポイントの情報を流し込むようです。

ローカルのみの設定でもDHCPでデフォルトルートが渡ってしまうと勝手にインターネットと通信されてしまう可能性があります。これはセキリティー上あまり嬉しく無いので、ブロックするようにしました。

我が家はFreeBSD上のdnsmasqでDHCPを配っているので、この設定ファイルにHS105のMACADDRESSを指定して固定IPにします。

```:/etc/dnsmasq.conf
dhcp-host=60:a4:b7:xx:xx:xx,192.168.1.161
```

ipfwでこのIPの通信を遮断します。

```
/sbin/ipfw -q add 19 deny ip from 192.168.1.161 to any
```

tcpdumpで確認してみたところ、ntpサーバーやn-devs.tplinkcloud.com(n-aps1-devs.tplinkcloud.com)と通信しようとしていました。
AWS Lambda /tmp領域が10GBまで拡張できるようになったのでディスク読書速度を測定してみた。

# はじめに
いままでLambdaのエフェメラルストレージ(以下/tmp)は512MBまでだったが、2022年3月24日から10GBまで拡張できるようになった。

https://aws.amazon.com/jp/blogs/aws/aws-lambda-now-supports-up-to-10-gb-ephemeral-storage/

そこで512MBと10GBでディスクの読み書きスペックに違いがあるかを確認してみた。

# 結論から
/tmpサイズ増減によるディスク読書速度は変化は見られない。
Lambdaメモリを増やすとディスク読書速度は大幅に向上する。
ファイル読み書きサイズが大きい処理ならばLambdaメモリは大きくする。

# 計測方式
ddコマンドによる簡易的な計測
Amazon linux2からddコマンドコピーおよびzipファイルにしてLambda Layerに登録。

tmp領域のサイズによって書き込みサイズを変化させる。
`　512MBの場合 　　　　448MB書き込み = bs=64K count=7k`
`10240MBの場合　　　　9600MB書き込み = bs=64K count=150k`

``` lambda_handler.py
import subprocess

def lambda_handler(event, context):
    out = subprocess.run(["df", "-h"])
    print(out)
    print("書き込み速度")
    out = subprocess.run(['dd', "if=/dev/zero","of=/tmp/benchmark", "bs=64K", "count=150k", "conv=fdatasync"])
    print(out)
    print("読み込み速度")
    out = subprocess.run(['dd', "if=/tmp/benchmark","of=/dev/null"])
    print(out)
```

# 計測結果
多少ばらつきはあるが概ねエフェラメルストレージサイズによる変化はないように見える。
10GBメモリだとSSD並に速度が出ている。

|エフェメラルストレージ(MB)  |Lambdaメモリ(MB)|読み込み速度|書き込み速度|
|---|---|---|---|
|512|128|21.3 MB/s|74.1 MB/s|
||256|96.3 MB/s|150 MB/s|
||512|263 MB/s|226 MB/s|
||1024|491 MB/s|435 MB/s|
||10240|921 MB/s|520 MB/s|


|エフェメラルストレージ(MB)  |Lambdaメモリ(MB)|読み込み速度|書き込み速度|
|---|---|---|---|
|10240|128|31.5 MB/s|33.9 MB/s|
||256|31.6 MB/s|40.0 MB/s|
||512|32.9 MB/s|50.3 MB/s|
||1024|53.2 MB/s|69.1 MB/s|
||10240|376 MB/s|615 MB/s|
AfterEffectsでコインが宙を舞うアニメーションを作ってみた

下のような回転させながら扇形に広がっていく3Dコインの動画を作ります。
![コインが舞うアニメ_gifmagazine.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/68e5b076-3bbb-23d0-fbad-6ddad3726a34.gif)

AfterEffectsの基本的な操作ができる方を対象とした記事です。
（A）コイン（B）背景（C）キラキラの3要素を組み合わせて作ります。

# 1）コンポジションの設定
新規コンポジションを作る時に「基本」ではなく「3Dレンダラー」のタブを選択して、CINEMA4Dを選択します。こうすることで3D表現が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/8d17fcc0-f4a2-6ec2-2204-b560f388003d.png)

# 2）3Dコインを作る     
今回はX軸、Y軸、Z軸を360度どう回転させてもいいように裏表で同じように作ります。![名称未設定-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/e8de9137-a9f0-647b-65d9-b8ba84c732f0.jpeg)

構造は以下の通り
⑤の厚さ50の枠の中に④の厚み30のコインの中身をいれることで、裏表それぞれ10の高さの縁ができます。
その上に②（裏は⑤）の縁取りだけの少し明るい黄色い丸い枠を乗せる
裏表両面にドルマークを真ん中に配置する
![A4 - 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/9be01c56-ced8-2ef8-078f-a78c118b7199.png)
こうすることで裏表両面にドルマークのついた3Dのコインになります。

# 3）コインに動きをつけていく
画面下の真ん中あたりから、飛び出してくるアニメーションを作るだけ。
最後のフレーム（この場合は7fps）で最終的な配置にレイアウトをしたら、0秒にフレームを移動させ全部選択してセンターに配置します。
1. メニューバーの [ ウィンドウメニュー ] ＞ [ 整列 ] をクリック
2. タイムラインパネルのレイヤーを選択
3. 整列パネルから任意の整列機能を選択

これでほぼ画面の中心に集まります。ここを起点として扇形に
アニメーションには必ずイージーイーズをつけましょう。
自然界では重力が働いているためリニアな動きにはなりません。イージーイーズをつけることでよりリアルが動きが表現できます。

# 4）背景のアニメーション
白い逆台形（逆三角形）のシェイプを作って不透明度25％に設定。
エフェクトのブラー（方向）で方向0°、ブラーの長さ50で縦方向にぼかしをかける。
作ったものを複製して縦横の大きさを変えて重ねます。
↓0fpsの時の背景画像
![light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/ca533aa2-53aa-249c-669d-e1f298adf6bd.png)
![light3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/3bd23580-849b-4f63-201d-143229eb0214.png)
![名称未設定-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/5e89fef1-cee8-f49f-007c-94cd6af6f4a6.jpeg)
逆三角形の下をアンカーポイントに指定して、スケールアニメーションを0→100％に設定し、これを複製して画面下の真ん中を中心に扇形に配置します。
下から上に飛び出していくような白い線のアニメーションができるので、コインの動くタイミングに合わせます。

# 5）白い星（キラキラ）をつける
こんな形のキラキラアニメーションを作ります。
![名称未設定-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/362fc329-d21a-60f6-f4b8-a04f550c162c.png)
星型のシェイプを配置して、スケールのアニメーションを設定します。
最終的に適正な大きさを100％とした場合、scaleの値を0％→105％→100％
という風にいったん105～110％まで拡大してからすこし小さくなって100％とします。
![scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1555848/60531d2c-a90e-315d-de55-aface7d6c9b0.png)

# 6）3つの素材を配置してタイムライン上でアニメーションのタイミングを合わせれば完成です。
配列を文字列に変換する際の注意点

## 環境
node.js v10.19.0
Ubuntu 20.4

## 動作確認
配列を定義します。
```node.js
var ary = [];
```

空の配列が返されます。
```node.js
console.log(ary);       // => []
```

存在しない要素を指定すると、undefinedが返されます。
```node.js
console.log(ary[0]);        // => undefined
```

空の配列に値をセットします。
```node.js
ary.push("米原");
ary.push("彦根");
console.log(ary);           // => [ '米原', '彦根' ]
```

配列かどうか判断する方法です。
```node.js
console.log(Array.isArray(ary));        // => true
```

型で判断するやり方もあります。 ただし、object型ではあることは分かっても、arry型であるかまでの判断はおこなえません。
```node.js
console.log(typeof(ary));           // => object
```

配列を文字列にするには、２通りのやり方があります。
```node.js
console.log(ary.join());            // => 米原,彦根
console.log(ary.toString());        // => 米原,彦根
```

少し強引っぽい印象ではあるが、このようなやり方で配列⇒文字列に変換する方法もあります。
```node.js
console.log(ary + "");              // => 米原,彦根
```

このように記述すると、配列が文字列に変換されてログ表示されることになります。つまり、[米原,彦根]と配列でログ出力されることを期待していたが、米原,彦根と文字列でログ出力されることになります。
```node.js
console.log("aryの内容は? : " + ary);
```

確かに、配列型でなくなっていることが確認できます。
```node.js
console.log(Array.isArray(ary + ""));       // false
```

String型になっています。
```node.js
console.log(typeof(ary + ""));      // => string
```

配列型を表示させたい時は、このようなログ出力の仕方もできます。
```node.js
console.log("aryの内容は? : %O",  ary);      // [米原,彦根]
```
Laravel 環境にによる分岐処理

# 概要

- Laravelにて.envのAPP_ENVの値いよって処理を分岐させたい時の条件部分を簡単にまとめる

# 紹介


### ローカル開発環境かどうかの判定

```php
if (app()->isLocal()) {
    // ローカル開発環境でのみ実行したい処理
}
```

### 本番環境かどうかの判定

```php
if (app()->isProduction()) {
    // 本番環境でのみ実行したい処理
}
```
Ubuntu18.04　ROS 【Melodic】 OAK-D 設定方法

![Screenshot from 2022-03-29 10-55-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040271/2bc138f0-5fcd-76c7-eb36-13437546bb55.png)

いつのまにかOAK-DがMelodicでもすんなり動作するようになっていたので、
メモしておきます。

# 環境
Ubuntu18.04
ROS　Melodic
Python3
Oak-D

# 設定方法

```
cd ~

sudo wget -qO- https://raw.githubusercontent.com/luxonis/depthai-ros/main/install_dependencies.sh | sudo bash

sudo apt install python-rosdep #(melodic) 
#or 
sudo apt install python3-rosdep

sudo rosdep init

rosdep update

```
VCSツールインストール

```
pip install vcstool
```
WS設定
```
mkdir -p oakd_ws/src

cd oakd_ws/src

git clone https://github.com/ros-perception/vision_msgs.git

wget https://raw.githubusercontent.com/luxonis/depthai-ros/main/underlay.repos

vcs import src < underlay.repos

rosdep install --from-paths src --ignore-src -r -y

source /opt/ros/melodic/setup.bash

catkin_make

source devel/setup.bash
```

# 動作確認

```
cd ~/oakd_ws

source ~/oakd_ws/devel/setup.bash

roslaunch depthai_examples stereo_node.launch
```
実行結果
![Screenshot from 2022-03-29 10-55-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040271/2bc138f0-5fcd-76c7-eb36-13437546bb55.png)

以上



# 参考
https://github.com/luxonis/depthai-ros
Oracle Analytics Cloud：最初に表示するダッシュボードを指定する

# はじめに
[前回](https://qiita.com/tyo38/items/6fa9493accae5984f87b "各ダッシュボードへのメニュー風のリンクを作ってみる")はカスタム画像をアップロードして、メニュー用のダッシュボードを作成しました。
でもメニュー用ダッシュボードをせっかく作成しても、そのダッシュボードを開くのに手間取ってしまっては便利に使えません。
そこで、このダッシュボードが必ず最初に表示されるように設定します。

# PORTAL PATHで最初に表示するダッシュボードを指定する
PORTAL PATHという設定項目を使って、最初に表示されるダッシュボードを管理者が指定することができます。
そのためには、表示したいダッシュボードのカタログ上のパスを事前に取得しておく必要があります。

### ダッシュボードのパスを取得
クラシックホームページを表示します。
「カタログ」メニューをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/6a626800-dc25-2102-058e-9cb310d878e6.png)
表示したいダッシュボードへのパスを確認します。
今回は、「共有フォルダ」の直下にある「01. 販売分析」というフォルダの中に保存した「メニュー」というダッシュボードを使います。
「メニュー」ダッシュボードの「その他」メニューから「プロパティ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4406d9c6-2544-8571-1acd-5f9e1051e9c5.png)
プロパティ画面に表示される「場所」＋「/」＋「名前」を連結したものをメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c865e735-aae1-e94f-bcaa-61578f7071a1.png)

:::note
この例では「/shared/01. 販売分析/_portal/メニュー」となります。
:::

### コンソールでPORTAL PATHを設定
「ナビゲータ」アイコンをクリックし、「コンソール」メニューを表示して「システム設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0a77083e-63db-4e34-980e-c0c5e048af0f.png)
「Other」セクションの中の「Portal Path」にメモしておいた、ダッシュボードのパスを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/756d7fba-a618-3feb-6da2-2e7c2abf20d6.png)
上部の「Restart」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5b2eb81e-da1f-0f64-40e6-9c96b662999a.png)
「OK」をクリックして、しばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/87b718ca-123c-5e95-dc6d-0efadee44e78.png)

# 動作確認
コンポーネントの再起動が終了したことを確認して、あらためて「～/ui/analytics」を開きます。
ホームではなく、指定したダッシュボードが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a35b4de8-b596-c1b4-d32e-0492f6be2ca2.png)

# 各ユーザが自分で初期表示ダッシュボードを決めるには
クラシックホームページの右上にあるアイコンをクリックし、「マイ・アカウント」を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/075ca14b-f7cf-248c-8e0d-95dded2b8e97.png)
「プリファレンス」タブの「開始ページ」で指定したダッシュボードがログイン後に表示されます（Portal Pathの設定よりも優先されます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b207cfb9-3220-7d74-1b75-39692f5933f7.png)
EC-CUBE4 特定のルート除外して特定のルートにプレフィックスをつける方法


```diff_yaml:app/config/eccube/routes.yaml
controllers:
    resource: ../../src/Eccube/Controller/
    type: annotation
customize_controllers:
-    resource: ../../app/Customize/Controller/
+    resource: ../../app/Customize/Controller/**/**
    type: annotation
+    exclude: '../../app/Customize/Controller/Api/'
+ customize_api_controllers:
+     resource: ../../app/Customize/Controller/Api
+     type: annotation
+     prefix: /v1
+     name_prefix: v1_api_
```

`exclude` を記述しなかった場合、`customize_controllers` の定義で1つ、`customize_api_controllers` の定義で一つ（プレフィックス付き）の2つが、ルーターに登録されてしまう。

例えば、以下のようなルートを追加した場合。

```php
<?php

declare(strict_types=1);

namespace Customize\Controller\Api;

use Eccube\Controller\AbstractController;
use Eccube\Entity\Member;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;

class MeController extends AbstractController
{
    /**
     * @Route("/me", name="me", methods={"GET"}, condition="request.headers.get('Accept') === 'application/json'")
     */
    public function me(): JsonResponse
    {
        $user = $this->getUser();

        if ($user === null) {
            return $this->json([
                'logged_in' => false,
                'member_id' => null,
            ]);
        }

        assert($user instanceof Member);

        return $this->json([
            'logged_in' => true,
            'member_id' => $user->getId(),
        ]);
    }
}
```

先ほどの `exclude` の記述がない場合は、下記画像の左側のように、2個のルートが登録されます。
`exclude` の記述がある場合は、下記画像の側のようになります。

![スクリーンショット 2022-03-29 11.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2019/785d9aaa-5c1b-9c37-7ccf-372842e3c38b.png)
[ROS2] C++で一度だけトピックを購読する

### はじめに
Ubuntu18.04のサポート期間終了も近づきつつあったのでROSからROS2へ更新を行いました．
ROS2関連の情報はまだまだ少なく，公式ドキュメントもあまり整備されていません．
今回はC++（rclcpp）において，コールバック関数ではなく`wait_for_message`関数を用いてトピックを一度だけ購読してみます．
（トピックの一度限りの購読に関して日本語はおろか英語でも全くと言っていいほど説明しているサイトがなかった．結構需要はあると思うのですが…）

### wait_for_messageを用いたトピックの購読
[rclcpp::wait_for_message](https://docs.ros.org/en/ros2_packages/rolling/api/rclcpp/generated/function_namespacerclcpp_1af3333ef9ec680d55315afc21ef754f7b.html)についての詳しい情報はリンクのドキュメントを参照してください．
以下が`wait_for_message`関数を用いた簡単なトピック購読のサンプルコードになります．
サンプルではsensor_msg/Image型のトピックを読み取ります．

```subscribe_topic_once.cpp
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/wait_for_message.hpp>
#include <sensor_msgs/msg/image.hpp>
#include <chrono>

int main(int argc, char* argv[]){
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("subscribe_topic_once");
  sensor_msgs::msg::Image image_msg;
  std::string topic_name = "sample_topic";
  auto timeout = std::chrono::milliseconds(100);

  bool is_successful = rclcpp::wait_for_message(image_msg, node, topic_name, timeout);
  if(is_successful){
    // 購読に成功したときの処理
    RCLCPP_INFO(node->get_logger(), "SUCCESS");
  }else{
    // 購読に失敗したときの処理
    RCLCPP_ERROR(node->get_logger(), "FAILURE");
  }

 return 0;
}
```

引数は
・第1引数...成功したときに受信メッセージを格納する変数
・第2引数...ノード
・第3引数...購買するトピック名
・第4引数...タイムアウト時間
となります．

タイムアウト時間内に受信に成功すると，image_msgに受信内容がセットされ，関数はtrueを返します．
もしタイムアウト時間内に受信できなかった場合はfalseが返されます．

<<2022/04/18追記>>
ROS2ではrclcpp::Nodeクラスを継承してノードを構築していくことが推奨されています．もしクラスを用いてノードを作る場合wait_for_messageの第2引数にshared_from_this()を入れます．参考サイトは[ここ](https://answers.ros.org/question/353828/getting-a-nodesharedptr-from-this/)です．

```.cpp
rclcpp::wait_for_message(image_msg, this->shared_from_this(), topic_name, timeout);
```
まだ試していませんが，これを使えばwait_for_message以外のNodeへのポインタを引数に必要とする関数も使用できるはずです．
Stripe Payment Linksの支払いページリンクを、QRコードで取得・シェアする方法

StripeのPayment Linksを利用することで、コードを書かずに商品の注文や定期課金の契約ページを作成することができます。

https://stripe.com/jp/payments/payment-links

また、国内外の消費税・付加価値税の自動計算やアップセル・クロスセル、コンビニ決済やApple Pay/Google Payなどにも、管理画面からの設定１つで対応しています。

![スクリーンショット 2022-03-29 10.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8ee39350-e5ea-d6b4-1c7e-dd2641c43d7c.png)

この記事では、支払いリンクをより便利に使う方法として、「リンクのQRコード化」を紹介します。

## 支払いリンクをQRコード化するメリット

支払いリンクをQRコードにすることで、以下の例のような、顧客がリンクをクリックできない場面でも簡単に申し込みページへのリンクを取得できるようになります。

- 店舗・イベントスペースなど、オフラインの場で決済・申し込みしてもらいたい場面
- イベントやピッチなどでプレゼンテーションする際に、スライドに埋め込みたい場面
- 名刺やチラシに印刷し、読んだ人がすぐにページにアクセスできるようにしたい場面

## Stripe Dashboardから支払いリンクのQRコードを発行する方法

2022/3までは、QRコードを発行するために別のWebサービスやアプリを利用する必要がありました。

ですが、現在はQRコードの発行もStripe Dashboardから行うことができます。

Stripe Dashboardにログインし、QRコードを発行したい支払いリンクの詳細ページに移動しましょう。

![スクリーンショット 2022-03-29 10.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/b775d789-5de7-20a1-da09-3cad1d7c594d.png)

支払いリンクのURLが表示されているエリアに[QRコード]ボタンが表示されています。

これをクリックすると、支払いリンクのQRコードが生成されます。

![スクリーンショット 2022-03-29 10.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/b6af8b4c-f58b-fae0-ed4f-e1ac6f2256bf.png)

### ダウンロードした画像を印刷して利用する
ダウンロードした画像には、「スキャン支払い」のテキストも含まれています。

![qr_test_cN25ls3q1d6SbYY3ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/01228c67-fa2f-7d19-9171-a556e4de94a9.png)

オフラインで利用したい場合は、この画像をそのまま印刷しておくとよいでしょう。

### [クリップボードにコピー]して、資料やデザインに埋め込む
[クリップボードにコピー]を選択することで、一度画像をダウンロードしてから再アップロードする手間を省くことができます。

クリップボードにコピーされた状態になりますので、Google Docsなどでペーストすると、そのまま画像を埋め込めます。

![スクリーンショット 2022-03-29 10.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/c7f5fd64-8e95-ed55-9116-a970475bc329.png)

埋め込んだ後は、必要に応じてトリミングやサイズの調整などを行いましょう。

印刷したい場面でも、デザインツールを利用したい場合や「対応する決済方法」などの情報を追加したい場合には、こちらの方法が便利です。

## おわりに

最近のスマートフォンでは、スクリーンショットや画像を保存してカメラロールに入れることで、QRコードの内容を読み込むことができる機種も存在します。

![image0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/2fce2a0f-1ef7-491c-07a7-b549b1f9801d.png)

そのため、URLの共有に加えてQRコードの発行も行うことで、より多くの場面で顧客にリーチできる可能性が生まれます。

SNSをメインにしている方や、オフラインでの販売が中心の方でも、この支払いリンクとQRコード出力機能を利用することで、Stripeを便利に利用できます。

Zapierを組み合わせることで、発送業務の自動化なども期待できますので、ぜひお試しください。

https://zapier.com/apps/stripe/integrations

# [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
cscの作法 その74

# 概要
cscの作法、調べてみた。
taskやってみた。

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc task.cs

```

# サンプルコード


```
using System;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.Linq;

namespace WindowsFormsApp4
{
	public partial class Form1 : Form {
		Button button1;
		private BackgroundWorker bw;
		public Form1() {
			button1 = new Button();
			button1.Location = new Point(30, 30);
			button1.Text = "test";
			Controls.AddRange(new Control[] {
				button1
			});
			button1.Click += Button1_Click;
		}
		private void Button1_Click(object sender, EventArgs e) {
			bw = new BackgroundWorker();
			bw.WorkerReportsProgress = true;
			bw.DoWork += Bw_DoWork;
			bw.ProgressChanged += Bw_ProgressChanged;
			bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
			bw.RunWorkerAsync();
		}
		private void Bw_DoWork(object sender, DoWorkEventArgs e) {
			foreach (var i in Enumerable.Range(1, 5))
			{
				Thread.Sleep(1000);
				bw.ReportProgress(i * 20);
			}
		}
		private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {
			Text = string.Format("{0}%", e.ProgressPercentage);
		}
		private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
			MessageBox.Show("終わり！");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}



```

以上。
cscの作法 その73

# 概要
cscの作法、調べてみた。
BackgroundWorkerやってみた。

# 参考にしたページ

https://qiita.com/Since1967/items/2903bb26febb444abd02

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>csc bw.cs

```

# サンプルコード

```
using System;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.Linq;

namespace WindowsFormsApp4
{
	public partial class Form1 : Form {
		Button button1;
		private BackgroundWorker bw;
		public Form1() {
			button1 = new Button();
			button1.Location = new Point(30, 30);
			button1.Text = "test";
			Controls.AddRange(new Control[] {
				button1
			});
			button1.Click += Button1_Click;
		}
		private void Button1_Click(object sender, EventArgs e) {
			bw = new BackgroundWorker();
			bw.WorkerReportsProgress = true;
			bw.DoWork += Bw_DoWork;
			bw.ProgressChanged += Bw_ProgressChanged;
			bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
			bw.RunWorkerAsync();
		}
		private void Bw_DoWork(object sender, DoWorkEventArgs e) {
			foreach (var i in Enumerable.Range(1, 5))
			{
				Thread.Sleep(1000);
				bw.ReportProgress(i * 20);
			}
		}
		private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {
			Text = string.Format("{0}%", e.ProgressPercentage);
		}
		private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
			MessageBox.Show("終わり！");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}



```

以上。
cscの作法 その72

# 概要
cscの作法、調べてみた。
threadやってみた。

# 参考にしたページ

https://qiita.com/Since1967/items/2903bb26febb444abd02

# サンプルコード

```
using System;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsFormsApp4
{
	public partial class Form1 : Form {
		Button button1;
		public Form1() {
			button1 = new Button();
			button1.Location = new Point(30, 30);
			button1.Text = "test";
			Controls.AddRange(new Control[] {
				button1
			});
			button1.Click += Button1_Click;
		}
		private void Button1_Click(object sender, EventArgs e) {
			for (int i = 1; i < 6; i++)
			{
				Thread.Sleep(1000);
				Text = string.Format("{0}%", i * 20);
				Application.DoEvents();
			}
			MessageBox.Show("終わり！");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}



```

以上。
フランスに修行に行けなくなった料理人が、未経験でIT業界にジョブチェンジした話。

# 自己紹介
はじめまして。
未経験からエンジニアに転職した『ゆうき』です！！
私は現在都内のSESで勤務をしており、Javaをメインに業務を行っております。
私が、IT業界に入るまでの経験を記事にしていきたいと思います。


## フランス修行に行くことを決意した料理人が飲食業界を離れた理由

私は小学生の頃から『コックさんになる！！』と発言していたほど、調理師になるのが夢でした。
その夢はずっと変わらず専門学校も地元の調理の専門学校に行き、
新卒で入社したレストランは、
西麻布にあるミシュラン1つ星のレストランでした。

4年ほど飲食経験を積んだ時に、フランスに修行に行きたいという気持ちが強くなり、
フランス修業に行くことを2019年の年末に決意しました。

しかし、決意を固めた2020年にコロナウイルスが大流行し、
私はフランス行きをストップするしかありませんでした。

1年間以上足止めを食らってる中で、飲食業界のどんどん変わっていく姿にものすごい不安を感じました。
また私は2021年に結婚をし、将来のことを考え悩み抜いた末、飲食業界から離れることを決意しました。

## なぜ飲食業界からIT業界に？
最初は飲食の事以外全く考えてこなかったので本当に苦労しました。
しかし、その中でどんな仕事を選んでもいいという事が、とてもワクワクしました。
私は転職エージェントに登録し、色々と仕事を探していたのですが、
特にやりたいことが見つからなかったので仕事は全然決まりませんでした。

そんな中、
ー『昨今はエンジニアが不足している』
ー『エンジニアは手に職がつく』
ー『未経験からエンジニアになれる！！』　
のような記事を見かけ、

直感的に
　エンジニアって仕事やってみたい！
　　　パソコンとか使って仕事してみたい！！
　　　　　リモートワークってやつやりたい！
と思いました（笑）

また、手に職がつくというのが、飲食業界と似ていたので、勉強次第でスキルアップできるという点に魅力を感じました。

しかし、私はPCを持っていなかったので、すぐさまMACを購入し、Progateを始めました。
この時が2021年2月です。
この頃は、プログラミングの奥深さなどまだ全然知らなかったので、
実際にプログラミングやってみても楽しいから、エンジニアになろう！！ぐらいの感覚で決めました。

## プログラミングの学習方法
当時はフロントエンドに興味があったため
HMTL, CSS, JavaScript, Vue.js, Firebase
を独学で学習しました。

 [学習資材]
Progate, Dotinstall, Udemy, YouTube

## 良かったこと /  悪かったこと
■良かったこと。
・最低限の出費で学習できた
・自分ひとりで学習できる力がついた
・転職活動の際に独学経験を伝えることで、印象は良かった気がする

■悪かったこと。
・手詰まりになった時に先に進めない時間が長くなり、学習スピードは遅かった
・気軽に質問出来る環境が少ない
・独学期間を短くし、転職活動をもっと早く開始していても良かった
・IT関係の資格を取得すればよかった

## 継続は力なり。
独学中では、1つのエラーで1日潰れるなんてことはよくありました。
その時は、エンジニアに向いていないのかな　と思ってしまいそうになる気持ちもありましたが、
開き直って『未経験なんだから分からないなんて当たり前。』
と自分に言い聞かせ、学習を進めました。

『継続は力なり。』
独学をしてる時は、この言葉にしがみついていました。
継続してやってるんだから、絶対力になってくれよ！って思いながらPCのエラー場面を見ていました（笑）
エラーが解消したときの喜びは相当大きかったですね。

## 終わりに
まだまだ、私は経験の浅いエンジニアですが、これからも情報を発信していければ良いなと思っております。
未経験からのエンジニア転職は険しい道程ではあると思いますが、
エンジニアが不足しているというのは事実なので、諦めなければ必ず転職できると思います！！
最後まで読んでいただきありがとうございました。
ばいば〜い
MySQLで特定のテーブルのみをバックアップし、特定のテーブルのみをリストアする方法

# 特定のテーブルのみをバックアップする方法

```
$ mysqldump -u ユーザー名 -p データベース名 テーブル名 > hoge.sql 
```


# 特定テーブルのみをリストアする方法

```
$ mysql -u ユーザー名 -p -D データベース名 < hoge.sql
```
【css】a:hoverが効かない時


## 【問題】「画像はリンクホバーa:hoverが効くのにdivはきかない！？」

#### 【解決回答】div要素に聞かせたいホバーはcssにdisplay: block;を追記。

いつもは画像素材を用いて、その素材をホバーで変色させることが多かったのですが、
以下のようなhtmlに:hoverでカーソルを乗せた時にdiv要素を少し透明にしようとしたら効かず。
scssファイルを考え直す。

##### 元コード
```.html
<div>
  <a href="/xxx/xxx">
    <div class="div-btn"><span>詳細はこちら</span></div>
  </a>
</div>
```

```.scss
a:hover {
    opacity: 0.6;
}
```
##### 解決コード
scssにdisplay: block;を追記

```diff_scss
a:hover {
    opacity: 0.6;
+   display: block;
}
```

display: block;で親要素のサイズに合わせることができるらしい。

<br>

---

### 参考リンク

 - [aタグを親要素のサイズに合わせるやり方と、aタグをbutton状にする調整法まとめ](https://ponsyon.com/archives/1679#a%E3%82%BF%E3%82%B0%E3%82%92%E8%A6%AA%E8%A6%81%E7%B4%A0%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95)
vuetifyの画面の上下左右にコンポーネントをレイアウトしたい時のコンポーネント

# 参考
UIコンポーネントのApplication
https://vuetifyjs.com/ja/components/application/#application-30b330f330dd30fc30cd30f330c8

# for who?
「vuetifyよくわからん！」
「v-なんとかってよくわからんけど書いてる」
「vuetifyのドキュメントってどこ見ればいいんだ？」
的な人。

# Application コンポーネントとレイアウト
めっちゃざっくりした説明とかイメージは↓↓

### レイアウト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/f57aea2c-9914-8f7d-22a1-adffa4881f25.png)

### ひとこと説明

コンポーネント|ひとこと
---|---
v-system-bar|常に上（優先）
v-app-bar|常に上
v-navigation-drawer|左右
v-content|真ん中らへん
v-footer|常に下
v-bottom-navigation|常に下（優先）

ほんとに初心者向けですね。
とりあえずこんなイメージがあれば、調べた時に出てきても
「配置だけやな」
って素数を数えなくても落ち着くことができればいいなと思います。
AWS DBS(Database - Specialty) 受験記

# この記事について
AWS認定のDBS（Database - Specialty）に合格したので、そこに至るまでの対策等を紹介していきます。

# 前提
AWS認定で、既に所持している資格

- CLF
- SAA
- SOA
- DAV
- SAP([受験記](https://qiita.com/hirorinjp5/items/8e3723b7e8f60428de94))
- DAP([受験記](https://qiita.com/hirorinjp5/items/8289fbfabc5dc6c4ab7b))

# 受験までの流れ
2022/03前半: 勉強開始（おおよそ3週間）
2022/03後半: 受験

# 試験対策

## 1. AWS問題集
試験対策本もないので。いつもの通り使います。
ちょっとお値段は張りますが、回答の説明についても丁寧に記述されており、かなり有用です。
問題数がまだ少ないので、2周くらいしておくといいです。

[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com)

金銭的に厳しいといったことがあれば、以下のUdemyの教材も良いです。

## 2． Udemy
英語版を購入して、翻訳を使いつつ解きました。
本番試験も機械翻訳的な部分があるので、そちらに慣れる意味でも対策になります。

[Practice Exam | AWS Certified Database Specialty](https://www.udemy.com/course/practice-exams-aws-certified-database-specialty/)

## 3. 認定公式ページのサンプル問題
下のほうにある「試験の復習」にサンプル問題があります。試験ガイド等もあるのでぜひ読んでおきましょう。

[AWS Certified Database - Specialty](https://aws.amazon.com/jp/certification/certified-database-specialty/?ch=sec&sec=rmg&d=1)

## 4. 模擬試験
無料で受けられるのと解説も丁寧なので、是非。

[スキルビルダー](https://explore.skillbuilder.aws/learn/catalog?ctldoc-catalog-0=se-%22AWS%20Certification%20Official%20Practice%20Question%20Sets%22?devops=sec&sec=prep)

## 5. Blackbelt
問題集等を解いていて、わからないなというサービスを中心に読んでいくことで理解が深められます。
SAPで事前に読んだので、今回はほとんど読むことはありませんでした。

[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

# 試験所感
分野が絞られており、解答の検証に時間がかからないので、そこまで時間もかからず終えることができました。
見直しフラグは気になる所があればつけておきましょう。
わからない問題が2,3問、ふんわりとした問題が5問程度という感覚でした。

# さいごに

### 勉強期間について
勉強期間を3週間取ってしまいましたが、2週間以下で良かったと思います。

### 試験について
サービスの幅が狭い分、解答は絞り込みやすかったです。
データベース自体の問題は少なく、AWSのサービスについての問題が中心といったイメージです。
しっかりとデータベースのサービスについて理解しておくほうが良さそうです。
C#を始めてSwiftも始めた人の感想 本のレビュー的な

こんにちは
今回はタイトルの通り、「Swiftに挑戦してみました」ということで読書感想文になります。
参考にした本はこちら↓

**Swift UI対応 たった2日でマスターできる iPhoneアプリ開発集中講座 Xcode13/iOS15/Swift 5.5対応**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965244/349953b2-0423-df50-6485-0fcc4e8be11e.png)
アフィリエイトとか広告とかそういうのではないので、もし興味があればご自身で検索してご購入を。

# Swiftを触ってみて
面白かったです。
以前ご紹介した構造体(struct)ばっかりです。
クラスの方が少ないですね。
問題は、Apple専門用語がちょこちょこ出てくるので、そこに慣れることができるかどうか。
Apple特有の「言い換え」がところどころあり、みたことねぇよこんな言葉！って感じです笑
とはいうものの、底辺初心者プログラマーもどきの僕でもはぇ〜という感じで理解しやすいように感じます。
しかし構文はやはり慣れないですね…ちょっと特殊な雰囲気を感じます。
小説家で言えば太宰治と夢野久作くらい違う(？)
VBAを書いているような感じもあり、JavaScriptを書いている感じでもあり、他にも色んな言語が混ざってるような感じで独特です。

# 紹介した参考書について
僕が買ったこの本自体、誤植は少なかったのでほぼすんなりサンプルのまま写経できました。(誤植は最後の最後の方に一つありました…)
説明もわかりやすく丁寧で、後々同じ内容が出てきた時にさらっと復習させてもらえるくらい丁寧です。
127Pで出た〇〇というキーワードが、364Pで再度出てきた時に再解説してもらえるというユーザビリティ溢れる一冊です。
まぁ上記の例が実際にそうなっているかは知りません。こんな感じで解説してくれるよという適当な例です。
「C#でマルチプラットフォームアプリ作ればいいじゃん」なんて言っていた僕に、「Swiftで作る方向性」を提案してくれた本で、かなり迷っています笑
SwiftとXCodeでiOSアプリを開発できるのは知っていたけど、ここまで作りやすいのかとちょっとびっくり…

# 今後の展望
現状、C#の内容を主に更新(勉強)していますが、僕の本来の目的はアプリ開発なので、一旦Swiftを極める方向にシフトチェンジするのもありかなと思っています。
MAUIやXamarinなどを含め、アプリケーション(デスクトップもモバイルも)に特化した開発を極めたいですね。
それに、記事を作成できるほど心と時間に余裕がない！笑(と勝手に焦っているだけです)
そうなると一応毎日投稿しているQiita自体、頻度を減らす必要がありそうです。
いつの間にか止まっているかも笑

というわけで今回もお付き合いいただきありがとうございました〜
pythonのlambdaとmap関数について

lambdaをなんとなくで使用してきて、混乱することがよくあるので整理しました
一緒に使われているイメージのあるmap関数についてもまとめています

## 結論
基本形と例になります
### lambda
```
基本形
(lambda 引数: 戻り値)(渡す値)

例
(lambda x: x*2)(2)
結果
4
```

### lambda+map
```
基本形
map(lambda 引数: 戻り値, iterable(listやdictなど))

例
list(map(lambda x: x*2, [1, 2, 3]))
結果
[2, 4, 6]
```

## lambda
### lambdaとは？
lambdaは無名関数を使用するための記法になります
名前付きの関数を作成するほどではない簡単な処理をしたいときに使用されます

基本形

```
lambda 引数: 戻り値
```

次のような関数と同じ意味になります

```
def func(引数):
    return 戻り値
```

引数を渡す場合

```
(lambda 引数: 戻り値)(渡す値)
```


実際に動かしてみると次のようになります

```
l = (lambda x: x*2)(2)
print(l)

l = (lambda x, y: x*y)(2, 4)
print(l)


4
8
```

## lambda+map

### map関数とは？
map関数は、listなどの各要素に処理を行いたい場合使用されます


基本形

```
map(callable, iterable)
```

#### callableとは？
関数のように呼び出すことができるオブジェクトのことです
関数以外にはクラスなどが当てはまります

#### iterable とは？
繰り返し可能なオブジェクトのこと
for文で回せるオブジェクトの認識でよさそうです

iterableの例としては、listやdictなどがあります

<br>

実際に動かしてみると次のようになります
map関数の返却値はmapオブジェクトのため、値を取得するためにはlistに変換する必要があります

```
def func(x):
    return x*2

l = list(map(func, [1,2,3]))
print(l)

[2, 4, 6]
```

次にfunc関数をlambdaと置き換えてみます
こうすることで簡単な処理であれば、１行で実行することができます

```
map(lambda 引数: 戻り値, iterable)
```

実際に動かしてみると次のようになります
引数が複数の場合も試してみました

```
l = list(map(lambda x: x*2, [1, 2, 3]))
print(l)

l = list(map(lambda x, y: x*y, [1, 2, 3], [1, 2, 3]))
print(l)

[2, 4, 6]
[1, 4, 9]
```

## 終わり
lambda、map関数について整理しました
lambdaというよりmap関数の理解が不足していて、混乱していたような気がしました