OmniAICreator/Qiita-1.07M huggingface dataset:
NestJSの基本的な構成 ~Controller編~

## これはなに？

NestJSを業務で使い始めて1ヶ月くらいが経過しました。
ちょっと慣れてきたなと思っていたのですが
ルートモジュールに不要なモジュールをインポートしていたりなど、基本的な構成がまだわかっていないと思ったので、理解を深めるために記事にしてみました。

自分はまだ全くわかっていないと絶望の谷[^1]に落とされたので理解を深めるために記事にしました。

[^1]: ダニング=クルーガー効果で言う谷の部分。[解説はこちら](https://note.com/twentynine/n/nd1d112ebae82)

今回はその中のControllerのまとめになります！

## この記事のゴール

以下の理解が得られることをゴールとします

- Controllerの役割が理解できること

## Controllerってなに？

Controllerはルーティングを担っています。

具体的に言うと、ユーザーからリクエストをどのパスだったらどのような処理をするのかを決めている箇所です。

Controllerでは以下の責務を持っています。

- URIの設計
- ユーザーからのリクエストを受け取る

## URIの設計

`@Controller()`デコレータを利用することでURIの設計をすることができます

```ts:cats.controller.ts
import { Controller, Get, Req } from '@nestjs/common'
import { Request } from 'express'

@Controller('cats')
export class CatsController {
  @Get('getCats')
  findAll(): string {
    return 'This action return all cats'
  }
}
```

上の例では`@Controller('cats')`と`@Get(’getCats’)`でパスの指定をおこなっています。

なのでもし上記で書いたfindAllにリクエストを送りたい場合は以下のようになります

```bash
$ curl localhost:3000/cats/getCats
## response: This action return all cats
```

## ユーザーからのリクエストを受け取る

先ほども出てきた@Requestでさまざまな情報を受け取れます。

| デコレータ一覧 | オブジェクト |
| --- | --- |
| @Request(), @Req() | req |
| @Response(), @Res()* | res |
| @Next() | next |
| @Session() | req.session |
| @Param(key?: string) | req.params / req.params[key] |
| @Body(key?: string) | req.body / req.body[key] |
| @Query(key?: string) | req.query / req.query[key] |
| @Headers(name?: string) | req.headers / req.headers[name] |
| @Ip() | req.ip |
| @HostParam() | req.hosts |

↓引用元

https://docs.nestjs.com/controllers#request-object

### User-Agent取得の例

試しにUser-Agentを取得してみます。

まずUser-Agentがどこにあるかというと

@FukuharaYohei さんの記事を引用するに`request.headers['user-agent']`にあるとわかります。

https://qiita.com/FukuharaYohei/items/963b3ff293bf32062aa2#22-get%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E6%8A%95%E3%81%92%E3%82%8B


```ts:cats.controller.ts
import { Controller, Get, Req } from '@nestjs/common'
import { Request } from 'express'

@Controller('cats')
export class CatsController {
  @Get('getCats')
  findAll(@Req() req: Request): string {
console.log(req.headers['user-agent'])
    return 'This action return all cats'
  }
}
```

先ほどのコードを少し変えたものになります。

```bash
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
```

これで`cats/getCats`にアクセスすると無事上記のようにUAが取得できるようになりました。

### Cookie取得の例

Cookieも上のrequestから取得できます。

Cookieのget, set方法は別の記事に書いたのでこちらを参考にしてみてください。

https://qiita.com/mu-suke08/items/5266ca6213026f23a8e3

## まとめ

- ControllerではURIの設計とユーザーからのリクエストに対する処理を記載できる

## 余談

実装は少しずつできるようになってきたのですが、相変わらずControllers?Providers?Modules?Services?はて？？
となっているので基本的な部分をきちんと理解していこうと思います。

ではまた！

## 参考記事

https://docs.nestjs.com/controllers

https://zenn.dev/kisihara_c/books/nest-officialdoc-jp/viewer/overview-controllers
「アプリケーションサーバ？？」となったPHPerのお話

# はじめに
業務でアプリケーションサーバについて調べる機会があったので、備忘録としてまとめたいと思います。
バックエンドの言語の中でPHPしか触ったことがないので、アプリケーションサーバについて全く知りませんでした(言い訳)。

# アプリケーションサーバ(APサーバ)とは
アプリケーションを実行するためのサーバのことです。
詳細は[こちらの記事](https://kitsune.blog/ap-server-summary)からお願いします。この記事を読むと

* Web三層構造システム
* APサーバとWebサーバの違い
* PHPは、なぜAPサーバがなくても動くのか

が理解できます。そして、これらを中心に検索すると面白い記事がたくさん出てきます。

### WebサーバとAPサーバの分離について
https://ja.stackoverflow.com/questions/18417/web%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%a8ap%e3%82%b5%e3%83%bc%e3%83%90%e3%81%ae%e5%88%86%e9%9b%a2%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6

### なぜAPサーバーをWebサーバーとして利用しないのか
https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3

### PHPは、なぜAPサーバがなくても動くのか
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

### 静的コンテンツとWebアプリケーションの配置を切り分ける
http://itdoc.hitachi.co.jp/manuals/3020/30203M0461/EM040148.HTM#ID00632

# これだけは押さえる

* APサーバはアプリケーションを実行するサーバであり、動的コンテンツを作成するのに必要である。
    * 静的コンテンツのサイトだけを公開するならば、APサーバは必要ない。
    * Webサーバ+APサーバという構成をとる場合、静的コンテンツはWebサーバに配置する。なぜなら静的コンテンツなので、APサーバとやり取りする必要がないから。
* 「APサーバでHTTPリクエストを処理すればいいのでは？」
    * Webサーバと異なり、不特定多数から多くの接続をされた場合、APサーバは十分にリクエストを捌くことができない。分けることによって負荷分散が図れて、効率の良く処理を実行できる。
    * また、Webサーバと異なり、スケールアウトが容易ではない。
* 「Webサーバでアプリケーションを実行できる場合、アプリケーションサーバは必要なのか？」
    * Webサーバ1台で十分にリクエストを処理できるなら、アプリケーションサーバは必ずしも必要ではない。

# その他おすすめ記事

* [JavaによるWebアプリケーションの仕組みをざっくり説明](https://qiita.com/mkdkkn/items/5c8b5b0ce549ac5d9014)
* [Webサーバ連携時のリバースプロキシの配置](http://itdoc.hitachi.co.jp/manuals/3020/30203M0461/EM040070.HTM)
* [Webアプリケーションサーバとは？3層構成の仕組みと導入のメリット](https://hnavi.co.jp/knowledge/blog/web-application-server/)
* [APサーバ(アプリケーションサーバ)とは？特徴4つ｜メリットと注意点を紹介](https://www.fenet.jp/dotnet/column/environment/4573/)
Laravelのマルチログインのwelcom画面にloginやregisterが表示されない場合(メモ)

https://kaiblo.com/laravel%e3%81%ae%e3%83%9e%e3%83%ab%e3%83%81%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%aewelcom%e7%94%bb%e9%9d%a2%e3%81%ablogin%e3%82%84register%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%81%aa/

こちらに移動しました。
AWS Lambdaから別Lambdaを呼び出す際にPickle形式でデータをやりとりする

Lambdaから別Lambdaを実行するのはアンチパターンにも載っている方法ですが、やってみたので書いておきます。

https://aws.amazon.com/jp/blogs/news/compute-operating-lambda-anti-patterns-in-event-driven-architectures-part-3/

# 呼び出し元

FooのdataclassをいくつかリストにしてPickle形式にシリアライズして送信先のLambdaに送信しています。
返り値もPickleで返ってくるので読み込んでプリントします。

```py
import json
import pickle
from typing import List
from dataclasses import dataclass
from datetime import datetime
from base64 import b85decode, b85encode

import boto3


@dataclass
class Foo:
    i: int
    d: datetime


def lambda_handler(event, context):

    foo_list: List[Foo] = [Foo(i=i, d=datetime.utcnow()) for i in range(10)]
    send_data_pickle = pickle.dumps(foo_list)
    send_data = b85encode(send_data_pickle).decode("utf-8")

    lambda_cli = boto3.client("lambda")

    response = lambda_cli.invoke(
        FunctionName="lambda_t",
        InvocationType="RequestResponse",
        Payload=json.dumps({"data": send_data}),
    )

    response_payload = response["Payload"].read()
    response_data_base85 = json.loads(response_payload)["data"]
    response_data = b85decode(response_data_base85)
    foo_list_with_index = pickle.loads(response_data)
    [print(f) for f in foo_list_with_index]
```

# 呼び出し先
Fooのdataclassで飛んできたリストにインデックスを付けて返すだけです。

```py
import pickle
from dataclasses import dataclass
from datetime import datetime
from base64 import b85decode, b85encode


@dataclass
class Foo:
    i: int
    d: datetime


def lambda_handler(event, context):
    receive_data_base85 = event["data"]
    receive_data = b85decode(receive_data_base85)
    foo_list = pickle.loads(receive_data)
    foo_list_with_index = [(i, foo) for i, foo in enumerate(foo_list)]
    response_data = pickle.dumps(foo_list_with_index)
    return {"data": b85encode(response_data).decode("utf-8")}
```



# 実行結果
送信元Lambdaを実行すると、送信元Lambdaで作成したFooクラスのリストに、送信先でインデックスが付けられたものが表示されます。


```
(0, Foo(i=0, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734783)))
(1, Foo(i=1, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734787)))
(2, Foo(i=2, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734789)))
(3, Foo(i=3, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734789)))
(4, Foo(i=4, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734790)))
(5, Foo(i=5, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734792)))
(6, Foo(i=6, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734792)))
(7, Foo(i=7, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734793)))
(8, Foo(i=8, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734794)))
(9, Foo(i=9, d=datetime.datetime(2022, 1, 29, 7, 41, 52, 734795)))
```
[macos] 指定ディレクトリ中のファイルURLを一括取得する

MacOSアプリをSwiftUIで作ってます。
モバイルエンジニアのEtsuwoです。

ユーザが指定したディレクトリ中のファイルURLを一括取得する方法をご紹介します。
以下の手順で説明します。

1. ディレクトリ選ぶパネルを開いてユーザに選んでもらう
2. 選択したディレクトリ中のファイルURLを一括取得

# 1. ディレクトリ選ぶパネルを開いてユーザに選んでもらう

まず、どのディレクトリの中身を一括取得するかユーザに選んでもらいます。
ユーザにディレクトリを選ばせるwindowを表示するには`NSOpenPanel`を使用します。

```swift:OpenPanel.swift
final class OpenPanelHandler {

    /// ディレクトリ選択用のパネルを開く
    func openSelectDirectoryPanel() -> URL? {
        let panel = NSOpenPanel.selectDirectoryPanel()
        if panel.runModal() == .OK {
            return panel.url // 正常にディレクトリが指定された場合はディレクトリのURL返す
        }
        return nil // 選択しなかったりした場合はnilを返す
    }
}

extension NSOpenPanel {

    /// パネルの設定を行う
    /// 今回はディレクトリのみ選択できるようカスタマイズ
    static func selectDirectoryPanel() -> NSOpenPanel {
        let openPanel = NSOpenPanel()
        openPanel.canChooseFiles = false // ファイルを選択できるか
        openPanel.canChooseDirectories = true // ディレクトリを選択できるか
        openPanel.allowsMultipleSelection = false // 複数選択できるか
        openPanel.message = "フォルダを選択してください"
        return openPanel
    }
}
```

以上の実装で、ディレクトリを選択させたい場面で`OpenPanelHandler().openSelectDirectoryPanel()`としてあげると以下のようなパネルを開くことができます。

![スクリーンショット 2022-01-29 15.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383380/a79a1634-4362-20e8-b6f5-deb208639f6e.png)

このパネルでディレクトリ選んでOpenボタン押すと`panel.url`に指定ディレクトリのURLが入ってきます。

# 2. ディレクトリ中のファイルURLを一括取得する

ディレクトリ内のファイルURLを一括取得するには`FileManager`の`contentsOfDirectory(atPath:)`を使用します。
注意点としては、`contentsOfDirectory(atPath:)`は当該ディレクトリ中のみの検索になるので、サブディレクトリや親ディレクトリの内容を検索することはできません。子ディレクトリ中の検索も行いたい場合は`enumerator(at:includingPropertiesForKeys:options:errorHandler:)`を使えば良いようです。
[参考: contentsOfDirectory(atPath:)](https://developer.apple.com/documentation/foundation/filemanager/1414584-contentsofdirectory)

今回は選択したディレクトリ中のファイルURLが取得できれば良いので`contentsOfdirectory`でOKです。

```swift:OpenPanel.swift
    private func getContentsUrls(from url: URL) -> [URL] {
        var urls: [URL] = []
        do {
            urls = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
        } catch {
            print(error.localizedDescription)
        }
        return urls
    }
```

これで先ほど`OpenPanel`を使って取得したURLを`getContentsUrls`に渡してやればディレクトリ中のファイルを配列で返してくれます。

以上です。

# 参考文献
- https://developer.apple.com/documentation/appkit/nsopenpanel/
- https://developer.apple.com/documentation/foundation/filemanager
amplify overrideを使ってCognitoのメッセージメールをSESから送信するようカスタマイズしてみた

#はじめに
こんにちは！
先日、実務で初めて [amplify override](https://docs.amplify.aws/cli/auth/override/) をつかってAmplifyのバックエンドリソースをカスタマイズしました。簡単すぎてとても驚きました。。
今回は、その際実装した内容について記事にさせていただきます。

# amplify overrideが登場するまで
Amplifyを用いて開発する以上、バックエンドリソースのカスタマイズをする際これまでですと [Amplify CLI](https://docs.amplify.aws/cli/) によるCloudFormationの更新が基本でした。ただ、一部Amplify CLIからの操作では変更できない内容については、CloudFormationのを直に編集する必要がありました。
ただ、せっかくAmplifyを使って開発しているのでなるべく直にCloudFormationは触りたくない。。そんな中、Amplify CLI v7.3.0から新たに `amplify override` という機能が追加されました。

#amplify overrideとは
[amplify override](https://docs.amplify.aws/cli/auth/override/) はバックエンドリソースの一部をCDKでカスタマイズできる機能で、CloudFormationと異なり、プログラム言語を用いてリソースの定義が行えるサービスです。これによって、これまでよりも簡単にバックエンドリソースのカスタマイズが行えるようになりました！



#実際に使ってみた

Cognitoユーザープールから配信するメールオプションを[デフォルトのEメール](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-email.html#user-pool-email-default)から[SES](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-email.html#user-pool-email-developer)に置き換えようと思います。というのも、デフォルトのEメールオプションですと、1つのAWSアカウントにつき1日50件までしか送信できないといった[制限](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/limits.html)がついてしまうからです。
今回はこれを`amplify override`でカスタマイズしていこうと思います。



##1.amplify overrideコマンドを入力

下記のようにコマンドを入力すると、`amplify/backend/auth/<resource-name>/`に`override.ts`ファイルが作られます。

```
amplify override auth
```


##2.overrideファイルを編集

ファイル内を下記のように記述します。また、今回はあくまでoverrideの機能紹介なので、SESの設定についての説明は省略させていただきますが、事前にAWSコンソールなどから作成したメールアドレスのARNを指定します。

```typescript:override.ts
import { AmplifyAuthCognitoStackTemplate } from '@aws-amplify/cli-extensibility-helper';

export function override(resources: AmplifyAuthCognitoStackTemplate) {

  // Set the user pool emailConfiguration
  resources.userPool.emailConfiguration = {
    emailSendingAccount: "DEVELOPER",
    sourceArn: "arn:aws:ses:省略",
  }
}
```

##3.amplify pushを実行して変更をデプロイ

下記コマンドにてバックエンドリソースをデプロイします。

```
amplify push
```

最後にCognitoユーザープールのコンソール上で確認してみましょう。

![スクリーンショット 2022-01-29 16.00.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275037/27294f0a-37a4-c16d-97f8-933f619b9d85.png)

反映されていますね。
画像外の`FROM E メールアドレス ARN`の項目でも、先ほど`override.ts`で設定したメールアドレスARNが設定されていました。



#おわりに
今回は amplify overrideについてご紹介させていただきました！
CloudFormationに苦手意識のあった自分にとってはとても便利な機能でした。
今後も進化していく Amplify に期待です！
可視化 SQL | 連番の中から歯抜けを見つける (その２)

# 初めに
この問題は、SQLパズル #９ 席空いてますか を参考にしています
手元に『SQL パズル』があれば問題の詳細が記載されているのでよりわかりやすいです

連続する番号の中で、既に数字で埋まっている番号と空白の番号を見つける問題を
とあるレストランでお客で埋まっていない席を見つける問題として取り上げています


# table and data
```SQL:SQL
CREATE TABLE Restaurant(
   seat integer
);

INSERT INTO Restaurant VALUES(1);
INSERT INTO Restaurant VALUES(2);
INSERT INTO Restaurant VALUES(3);
INSERT INTO Restaurant VALUES(8);
INSERT INTO Restaurant VALUES(9);
INSERT INTO Restaurant VALUES(10);
INSERT INTO Restaurant VALUES(16);
INSERT INTO Restaurant VALUES(18);
INSERT INTO Restaurant VALUES(19);
```

# 使用されているテーブルの全組合せを作る
```SQL:SQL
-- 全組合せ
SELECT R1.seat,R2.seat             
FROM Restaurant AS R1      
  INNER JOIN Restaurant AS R2 ON R2.seat > R1.seat   
```

INNER JOIN で自己結合する時に 自分(R1)より大きな数を結合している
この条件により下記の様な組合せを排除している。下の組合せは必要ありません | (R1,R2) = (3,2)

|R1|R2|
|---|---|
|2|3|
|3|2|


![rep_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242736/e3c67aa8-2502-0672-773b-4ea43d8d5726.png)



# 回答：空席の開始と終了番号
```SQL:SQL
-- 空席の開始と終了番号
SELECT R1.seat AS start
	  ,(MIN(R2.seat)-1) AS fin2
FROM Restaurant AS R1
  INNER JOIN Restaurant AS R2 ON R2.seat > R1.seat
GROUP BY R1.seat
HAVING (R1.seat + 1) < MIN(R2.seat)  
```

|start|fin2|
|---|---|
|4|7|
|11|15|
|17|17|


# SQLを細かく見てみる
■ step1
R1.seat で GROUP BY するので、R1.seat はユニークとなる
R1.seatに一番近い利用させている席を fin1 とする。上の画像で fin1(赤色)の番号
　⇒　MIN(R2.seat)

■ step2
R1.seat は使用中の番号なので、その次(R1.seat + 1)を空白を探す開始番号(start)とする
start は 空席 または 使用中

fin1 は使用中の番号なので、空白を探す終了番号を fin1の1つ前とする。MIN(R2.seat) - 1
fin2 は 空席 または 使用中

`start と fin2 の間が空席となりますが、start と fin2 は 空席 または 使用中` なので
`空白の場合を取出す必要が有ります。`step3 でHAVINGを追加し絞り込みます

■ step3
HAVING で start が fin1 より小さい条件を追加すると、正しい組合せが取得できます
空席の開始番号が終了の番号より大きくなることはありません


![rep_8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242736/4724b753-1856-74f1-b059-8823dd51d4b0.png)

# 参考文献
[SQLパズル 第2版~プログラミングが変わる書き方/考え方 | Joe Celko, ミック](https://www.shoeisha.co.jp/book/detail/9784798114132)
可視化 SQL | 連番の中から歯抜けを見つける (その１)

# 初めに
この問題は、SQLパズル #９ 席空いてますか を参考にしています

こちら新しく記事をかきなおしました

https://qiita.com/hidesroom/items/de01259d2a866c0dbc21




連続する番号の中で、既に数字で埋まっている番号と歯抜けの番号を見つける問題を
とあるレストランでお客で埋まっていない席を見つける問題として取り上げています

イメージしやすい様に1番から20番までの連番があるとします。
1,2,3,8,9,10,16,18,19番がお客さんが座っています。空白席の開始と終了番号をSQLで取り出します

#Restaurant テーブルデータ
```SQL:SQL
CREATE TABLE Restaurant(
   seat integer
);

INSERT INTO Restaurant VALUES(1);
INSERT INTO Restaurant VALUES(2);
INSERT INTO Restaurant VALUES(3);
INSERT INTO Restaurant VALUES(8);
INSERT INTO Restaurant VALUES(9);
INSERT INTO Restaurant VALUES(10);
INSERT INTO Restaurant VALUES(16);
INSERT INTO Restaurant VALUES(18);
INSERT INTO Restaurant VALUES(19);
```

#空席の開始番号と終了番号を見つける
```SQL:SQL
-- 開始番号
WITH Firstseat AS (
	SELECT (seat + 1) AS seat FROM Restaurant
    WHERE (seat + 1) NOT IN (SELECT seat FROM Restaurant)
	AND (seat + 1) < 1001
)

SELECT * FROM Firstseat

-- 4
-- 11
-- 17
-- 20
```

```SQL:SQL
-- 終了番号
WITH Lastseat AS (
	SELECT (seat - 1) AS seat FROM Restaurant
	WHERE (seat - 1) NOT IN (SELECT seat FROM Restaurant)
	AND (seat - 1) > 0
)

SELECT * FROM Lastseat

-- 7
-- 15
-- 17
```

使用されている席が seat なので
(seat + 1) が Restaurant テーブルに存在しない(NOT IN ・・・Restaurant)番号を見つけている
　⇒ 空席の開始(画像左)

(seat - 1) が Restaurant テーブルに存在しない(NOT IN ・・・Restaurant)番号を見つけている
　⇒ 空席の終了(画像右)

![rep_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242736/2a53b258-2372-ad7c-5f19-0640e319f362.png)

#上記SQLを1つにして、全体をイメージする
```SQL:SQL
-- 空席開始番号と空席終了番号
WITH Firstseat AS (											
	SELECT (seat + 1) AS seat FROM Restaurant
    WHERE (seat + 1) NOT IN (SELECT seat FROM Restaurant)
	AND (seat + 1) < 1001                              
),
Lastseat AS (
	SELECT (seat - 1) AS seat FROM Restaurant
	WHERE (seat - 1) NOT IN (SELECT seat FROM Restaurant)
	AND (seat - 1) > 0
)
SELECT F1.seat AS start, L1.seat AS finish,
	(SELECT MIN(L2.seat) FROM Lastseat AS L2 WHERE F1.seat <= L2.seat),
	(SELECT array_agg(L2.seat) FROM Lastseat AS L2 WHERE F1.seat <= L2.seat)
FROM Firstseat AS F1, Lastseat AS L1
```

空席の開始番号が決まれば、終了番号を決める
start が 4 の時は {7,15,17} 中から最小である 7 が終了番号となる
start が 11 の時は {15,17} 中から最小である 15 が終了番号となる
start が 17 の時は {17} 中から最小である 17 が終了番号となる (F1.seat <= L2.seat) **= が有る**
start が 20 の時は 20より大きい L2.seat は存在しないので空白★となる

![rep_5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242736/7e187b37-b43a-e5f0-cd94-7900229479fe.png)

#回答：空席の開始と終了番号
```SQL:SQL
-- 空席の開始と終了番号
WITH Firstseat AS (
	SELECT (seat + 1) AS seat FROM Restaurant
    WHERE (seat + 1) NOT IN (SELECT seat FROM Restaurant)
	AND (seat + 1) < 1001                              
),
Lastseat AS (
	SELECT (seat - 1) AS seat FROM Restaurant
	WHERE (seat - 1) NOT IN (SELECT seat FROM Restaurant)
	AND (seat - 1) > 0
)
SELECT F1.seat AS start, L1.seat AS finish
FROM Firstseat AS F1, Lastseat AS L1
WHERE L1.seat = (SELECT MIN(L2.seat) FROM Lastseat AS L2 WHERE F1.seat <= L2.seat)
```
下記、start が空席の開始で、finishが空席の最後の番号

|start|finish|
|---|---|
|4|7|
|11|15|
|17|17|

あ
# 参考文献
[SQLパズル 第2版~プログラミングが変わる書き方/考え方 | Joe Celko, ミック](https://www.shoeisha.co.jp/book/detail/9784798114132)
Macのショートカットキー

個人的によく使うショートカット

 コードを書く時
--------------------------------------------- 
・command + X：　切り取り＆コピー
・command + C：　コピー
・command + V：　貼り付け
・command + A：　全選択
・command + Z：　直前の削除部分を復活させる
　　　　　　　　　↓
　shift + command + Z：　復活を妨げ


 VScodeだけで使える
----------------------------------------------
・option + shift + 矢印キー：　矢印方向にコピー＆ペースト
・shift + command + L：　複数の選択範囲を、同時に変更


インターネット検索　
--------------------------------------------- 
・command + F：　　書類内の項目を検索

・command + G：　　次を検索：直前に検索した項目が次に出現する箇所を探す。
・shift + command + G：　前に出現した箇所を検索


資料を作成/閲覧
--------------------------------------------- 
・command + P：　現在の書類を印刷
・command + S：　現在の書類を保存

・shift + command + 5： スクリーンショット　/　画面収録 (Mojave 以降 )
・shift + command + 3 (or 4)：　スクリーンショット


Finder/ VScode などでファイルを操作する時
--------------------------------------------- 
・command + O：　開くファイルを選択
・command + T：　新しいタブを開く
(ダウンロードしたファイルを、他のファイルに反映させる時などにおいて使える）
・shift + command + N：　Finder で新しいフォルダを作成


ダウンロード済みのAppを開く時
--------------------------------------------- 
command + スペースバー：　Spotlight検索フィールドの表示／非表示　（これは楽）




[参考資料]
https://support.apple.com/ja-jp/HT201236
パーミッションを要求するためアプリの設定画面へ飛ばす【Swift/Kotlin】

# はじめに

Android、iOSに限らず、アプリがBluetoothやカメラを利用する際にはユーザがその権限を許可する必要があります。

許可を求めるポップアップが表示され、そこで「許可する」「許可しない」をユーザが選択します。
「許可する」が選択された場合は特に問題ありませんが、「許可しない」が選択された場合は、もう一度許可を求めたり、設定画面から許可するように促す必要があります。

設定画面から許可を促すために設定画面へ飛ばすコードを以下に記述します。

# iOS

以下のコードでアプリの設定画面へ飛ばすことができます。

```.swift
if let url = URL(string: UIApplication.openSettingsURLString) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
```

以下の画面に飛び、権限の許可ができます。
![名称未設定3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/148e39c6-8ef0-af9e-d5b2-5aeea6b4d4af.jpeg)


# Android

以下のコードでアプリの設定画面へ飛ばすことができます。（kotlin）

```.kt
val intent = Intent()
intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
val packageName = context?.packageName
val uri = Uri.fromParts(
    "package",
    packageName,
    null
)
intent.data = uri
startActivity(intent)
```

以下の画面に飛びますが、Androidの場合は画像下部の「権限」をタップした先で権限の許可ができます。
設定画面に飛ばす前にその旨を伝えてあげると親切かと思います。
![名称未設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574728/53ae4fd0-972b-ca88-49cb-21e5b4481bb1.jpeg)

[Twitter@ruemura3](https://twitter.com/ruemura3)
Ubuntu上で実行ユーザーを作成してディレクトリを共有する時のメモ

# 環境
Ubuntu 20.0.4

# 筆者がやりたいこと
git管理でpullしてきたjavaプロジェクトをUbuntu上でビルドして、実行用ユーザーを作成して実行させたい。

# 実践
まずはユーザーを作成して、普段使っているユーザーもディレクトリを参照できるようにグループへ参加します。
## ユーザー作成
```shell-session
$ sudo useradd -s /sbin/nologin ユーザー名
```
これを実行することによって、ログインできないユーザー・グループが作成された。
## グループ参加
```shell-session
$ sudo usermod -aG 先ほど作成したユーザー名 参加させるユーザー名
```
これによって、グループにユーザーが参加できる。
## ディレクトリ作成・権限付与
今回私は`/var/botapp/`というディレクトリを作成する。必要に応じて`sudo`する。

```shell-session
ディレクトリ作成
$ mkdir 作成するディレクトリパス 

権限譲渡
$ sudo chown -R 作成したユーザー名:作成したユーザー名 ディレクトリパス

権限設定
$ sudo chmod 2770 -R ディレクトリパス
```
今回はSGIDというものを設定することで、ディレクトリ内でファイルが作成されても所有グループが固定された。


:::note warn
SSHの使用上、一度SSHからログアウトして再ログインしないと権限がない状態になっていることがあります。
:::
Corne Cherryを1ヶ月使った感想



# はじめに
肩こりがひどくなってきたので、分離型キーボードに憧れてCorne Cherryを購入しました。自作キーボードと呼ばれる部類の製品ですが、自作キーボードとして一般的な半田付けによる組み立て作業が不要なキットを購入しました。半田付けとなると工具を揃えるのにもそれなりにお金がかかるので、こういうキットは本当にありがたいです。
https://www.yodobashi.com/product/100000001005761172/

キースイッチはヨドバシでいくつか試して最もフィーリングが良かったCherry MXの銀軸を購入。
https://www.diatec.co.jp/shop/det.php?prod_c=4127

キーキャップはとりあえずシンプルな無刻印タイプを購入しました。無刻印の方がかっこいいのと、後述するレイヤーの話があるので、刻印があると逆に混乱するかなと思い無刻印にしました。
https://www.yodobashi.com/product/100000001005945123/

ちなみにCorne Cherry購入前はHHKB Hybrid Type-Sを使っていました。使い勝手には全く不満はなく、むしろ一生このキーボードと生きていこうと思っていたくらいでしたが、肩こり解消のために分離型に挑戦したかったのでCorne Cherryを購入しました。

# 感想
項目に分けて感想をまとめていきます。

## 見た目はかっこいい
かっこいいです。ほれぼれします。キーキャップやケーブル、ケースも揃えたくなってきました。このあたりも自作キーボード沼と呼ばれる所以なのでしょうね。今まで興味なかった10,000円クラスのキーキャップも心の中の欲しい物リストに上がってきています。危ないです。
![IMG_6803.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/52ad19de-baf6-82b6-478d-dca816cada4b.jpeg)

レイヤーキーの場所がわかるようにシールを貼っています。娘のシールをとりあえず貼っているのでかっこ悪いですが、それを加味してもめちゃめちゃかっこいいです。

## 分離型はやはりいい
分離型はやはり体が楽です。HHKBを久しぶりに使ってみるとすごく窮屈に感じます。

とはいえ肩こりがよくなったかというと多少マシになったなという程度です。やはりキーボード作業はほとんど体を動かさないので時々ストレッチなどして動かさないといけないですね。とはえいもう一体式には戻りたくないと思えるほど分離型の使用感は良いです。

## キー配列への慣れが大変だった
慣れるのに大変でした。特に大変だったのはカラムスタッガードへの慣れでした。一般的なキーボードはロースタッガードと呼ばれ横方向に少しずつずれて配列されています。しかしCorneはそのずれがありません。代わりに縦方向に少しずれています。使い始め当初はNが遠すぎる、Bが近すぎる、という違和感が大きくてかなりミスタイプしていました。毎日寿司打で練習して今では高級コースで20,000円を超えることも普通になってきました。逆にHHKBをさわるとミスタイプしてしまうようになりました。こうなるとCorne以外のキーボードでの作業効率が落ちてしまうので、少し悩ましいです。

## レイヤー機能の使いこなしもまだ道なかば
カラムスタッガードへなれた後はレイヤーへの慣れが壁となりました。見ての通りキー数が極端に少なく42キーしかありません。これは108キーあるフルキーボードのキー数を100%として40%キーボードと呼ばれる部類になります。数字キーもファンクションキーもないため、それをおぎなうためにレイヤーという概念があります。一般的なキーボードでいうと、ShiftキーやFnキーのようにそのキーを押しながらだとキーの役割が変わる機能のことです。一般的にLowerレイヤーとUpperレイヤーという２つのレイヤーを定義して、数字キーやファンクションキー、矢印キーを割当ます。わたしの場合は以下の様なキー設定をしています。利用OSはMacBookProがメインでその上に仮想でWindowsを動かしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200471/3dddf102-aa19-e62a-6c4d-f72889b99207.png)

仕事で使いながらよく使うものを同じレイヤーにまとめたり、試行錯誤をしながら設定しました。cmdとaltの両方を左手に置くことができないので、alt-tabを使うためにlayer-1に押し込めました。親指キーがもう１個あればいいのですが。

１ヶ月も使っているとかなりなれてきて、自然と数字キーを押すときにレイヤーキーに指が伸びる様になってきました。通常のキーボードでも数字や記号を打つときはホームポジションから動くため入力速度が落ちていたことを考えると、その時と遜色のないスピードは出てきている気がします。

ちなみにHHKBは60%キーボードと呼ばれる部類で、Corneよりはキーが多いですがそれでもF1キーや矢印キーがなくFnキーでそれらを補っていました。ノーマルキーボードからHHKBへの移行もちょっと大変でしたが、今回はそれ以上に慣れるのは大変でした。しかし、ホームポジションをほぼ動く必要がなく、レイヤーキーを駆使して最小限の動きでタイピングしている時はとても気持ちが良いです。

ちなみに右親指にEnterキーがきているのですが、これはなれるとなんで親指がEnterじゃなかったんだろうくらい良いです。ただ普通のキーボードに戻ったときにEnterと思ってSpaceキーを押してしまうのは困りものです。

## 打ち心地（打鍵感）はHHKBが恋しくなる
たまにHHKBを触ると圧倒的な打鍵感にうっとりします。ただ打鍵感はキースイッチやケースなどによって大きく変化するため、いろいろ試したいなと思っています。が、それはそれでお金がかかるので、この沼に入るべきではない気もしています（時間の問題な気もします）。

今回購入したCherryMXの銀軸ですが打鍵感は好きです。ただ、底打ちしたときに指への衝撃が大きいのか１日使うと少し指が痛くなります。解消すべくoリングなど試し始めています。

打鍵音はカチカチしたメカニカルらしい音がします。HHKBの音の方が好みですが、音はあまり重要視していたいのであまり問題ないです。

#　まとめ

使用して１ヶ月が立ったので記録として使用感をまとめてみました。総じて買った良かったと思っています。半田付け不要とはいえ自分で組み立てて動いたときは嬉しかったですし、ファームウェアの書き込みなど苦労もしましたがその分愛着も湧いています。

よいところ
- 分離型は体がらく
- コンパクトなので机の上で場所を取らない
- 見た目がかっこいいので気分があがる
- レイヤー操作を駆使して最小限の動きでタイピングしていると気分がいい

なやましいところ
-　通常のキーボードに戻れない
-　cmdキーとaltキーを２つとも左手に置きたいけれどキーがたりない（なので他の分離型自作キーボードも気になっています）
-　打鍵感がHHKBにかなわないので試行錯誤が必要そう
【Salesforce】【資格】Salesforce 認定 Platform アプリケーションビルダー 合格までのあれこれ

～2022.01.29 追記～ [各試験の受験記と勉強メモ](https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd)を投稿しました！

当記事は受験体験記です。
※投稿日2022年1月（Winter ‘22）時点の情報です。
※あくまでもぴえさん個人の考えです。

#Salesforce 認定 Platform アプリケーションビルダーとは（ざっくり）
・Salesforce管理者・開発者向けの資格
・誰でも受験可能（受験資格等はない）
・Salesforceの宣言型機能について出題
・受験料：税込22,000円
・105分60問（合格基準は63％以上）
・選択式（コードや文章で回答する問題はない）
・試験終了後、即座に合否がわかる

#ぴえさんの受験記録
【経歴】
・ソフトウェア開発（C#、Java）やSalesforce構築など　3年弱
・2020/7/29 Salesforce 認定アドミニストレーター（Spring ‘20）合格
・2021/9/23 Salesforce 認定 Platform デベロッパー（Summer ‘21）合格

【受験日程とバージョン】
日時：2022/1/25　13：45～
受験方法：オンサイト受験（最寄りの会場）
バージョン：Winter ‘22

【受験データ】
ウェブアセッサーのスクショ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/3280936f-e600-e5d7-c984-5fcd42262070.png)
分かりにくいので表にしました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/1e88c935-187a-c560-1854-4adb8752a3af.png)



【感想】
・3か月前にデベロッパー試験を合格していたこともあり正直すこし侮っていました。
・1月末までの割引クーポンがあったので受けてみました。
・ちょうどいい試験日程がなく試験二日前の申し込みとなりました。
・最寄りの会場でオンサイト受験しました。
・Salesforce独特な日本語＋専門用語で解くのに70分かかりました。後にゆっくり見直しをしました。
・相変わらず微妙な問題・選択肢で出題してくるので解き終わり時の自信はイマイチでしたが、無事合格できてよかったです。
・試験を解くうえで一番役に経ったのは1年半のSalesforce実務経験かなと思います。
・この調子で標準資格は取っていきたいです。

#勉強方法
１．受験ガイドを読む
　　　[資格一覧ページ](https://tandc.salesforce.com/credentials)から取得できます
２．Trailheadの↓トレイルをする
　　　[Platform アプリケーションビルダー試験に向けた学習](https://trailhead.salesforce.com/ja/content/learn/trails/platform-app-builder-certification-prep?trailmix_creator_id=welcome4&trailmix_slug=prepare-for-your-salesforce-platform-app-builder)
３．個人が出している練習問題を解く（ぴえさんは↓のクイズレットを解いていました）
　　　[Quizlet：テキストから出題 アプリケーションビルダー問題集](https://quizlet.com/jp/478017398/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8B%E3%82%89%E5%87%BA%E9%A1%8C-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-flash-cards/)
　　　[Quizlet：ヘルプから出題 アプリケーションビルダー問題集](https://quizlet.com/jp/485314947/%E3%83%98%E3%83%AB%E3%83%97%E3%81%8B%E3%82%89%E5%87%BA%E9%A1%8C-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-flash-cards/)
４．２～４で分からない単語や疑問点をヘルプページを見たり、実際に環境を操作して確認する
　　　[ヘルプ：Service Cloud](https://help.salesforce.com/s/articleView?id=sf.service_cloud.htm&type=5)
　　　[ヘルプ：Salesforce 組織の設定および管理](https://help.salesforce.com/s/articleView?id=sf.setup_overview.htm&type=5)
　　　[ヘルプ：Sales Cloud の基本](https://help.salesforce.com/s/articleView?id=sf.sales_core.htm&type=5)
５．試験に向けた勉強メモを作成する
　　　[【Salesforce】【資格】アプリケーションビルダー試験の勉強メモ](https://qiita.com/piepie1231/items/bf79e2b96347f24a6be5)

今回は時間もなかったので効率重視で、とりあえず合格基準に達すればいい！と割り切ったやり方をしました。
１と２は必須だと思います。
３は知識の定着程度に、ちょいちょい怪しい問題があったので気になったものは逐一調べてました。
５は初めての試みでしたが、自分の言葉にすると定着しやすい自分には適した勉強法でした。
勉強時間は合計8時間くらいだと思います。（デベロッパー試験と被るところもあったのでアドバンテージありです。）

Salesforceの他資格についてはこちらの記事にまとめています↓

https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd
Git Bash で日本語が文字化けする。

##Git Bashで日本語が文字化けする##

######出力したい結果
```
$ java Main
breakfast
アサゴハン
あさごはん
朝食
```

######文字化けした結果
```
$ java Main
breakfast
▒A▒T▒S▒n▒▒
▒▒▒▒▒▒▒͂▒
▒▒▒H
```

######私が解決した方法

１：GitBashを開き、右クリック

２：一番下の Options...を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514893/09656ffd-5dc3-eed2-0afd-0ee64947f39e.png)

３：Textから
Locale　[ja_JP]
Character set　[SJIS]
に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514893/f84819cc-ba82-0b2d-f2cc-71a6d3903899.png)

これでしっかり出力されるようになりました。

<br />
######追記

上記のことだけで解決できる可能性もありますが、その前に
[bash 文字化け]
で検索し、localeの設定をbashでしないと治らないかもしれません。(exportコマンド等)
【solidity】アクセス制限（publicなど）や修飾子（view）など参考にしたサイト集

##はじめに
メモとして書いてます。
他の多くの人がわかりやすく解説してくれてるのおり、私はナマケモノなので解説はせずにリンクだけ載せます。
自分のように忘れっぽい人向けにまとめてるので、忘れたら見てください。

内容は、随時拡張していきたいと思います

##アクセス制限について
以下の4つについてです
・private
・public
・internal
・external
参考にさせていただいたリンクは以下です。それぞれの違いが表になっており、誰が見てもわかりやすい記事かと思います
https://qiita.com/ryu-yama/items/fae7e502d1bd5f0707b0

##修飾子について
以下２つの違いについてです
・view
・pure
参考にさせていただいたリンクは以下です。実験的なケーススタディも紹介してくれておりとてもわかりやすかったです
https://dev.classmethod.jp/articles/solidity_pure_view_diff/

##mappingについて
これは珍しく私が書いた記事です
https://qiita.com/matashita/items/a1f27aff2f7b53320b7b

##virtualとoverrideの解説
自分なりの理解したつもりなので書いてみました。
https://qiita.com/matashita/items/6dceb954dfcbef8a9906

##今後追加したい内容
・struct
・constructor
・contract（初歩的過ぎて要らない？）
・abstract
・library
・interface
統計検定準1級_2019年_問9の解説

2022年1月に統計検定準1級に合格しました。

合格するまでに実施したことについて、こちらのブログにまとめています。
興味があれば見てもらえると助かります。

https://corgi-komugi.com/statistical_certificate_pre1/

<br>
公式問題集の解説ならびにウェブ上の解説を読んでも理解が難しかった問題について、自分なりに解説します。

:::note warn
統計についてあまり詳しくないため、解説に至らない点があればアドバイスもらえると助かります。
:::

:::note warn
投稿内容は個人の見解であり、所属する組織の公式見解ではありません。
:::

今回は、**2019年の統計検定準1級の問9(3)**を解説します。

## 2019年の問9(1)と問9(2)
こちらの記事にて、わかりやすく解説されています。
私が追加で説明する必要はないと思っています。

https://note.com/sincerity423/n/n8e53cdb74e79

## 2019年の問9(3)
###問9(3)の問題
問9(1)と問9(2)同様、こちらの記事で確認ください。

https://note.com/sincerity423/n/n8e53cdb74e79

###問9(3)の解法
```math
\begin{align}
B_t^{(1)} - B_{t-1}^{(1)} = \Delta B^{(1)} \\\
B_t^{(2)} - B_{t-1}^{(2)} = \Delta B^{(2)} \\\
\end{align}
```

とすると、 

```math
\begin{align}
x_t - x_{t-1} 
&= x_0 + \sigma_1\sqrt{\rho}B_t^{(1)} + \sigma_1\sqrt{1 - \rho}B_t^{(2)} - (x_0 + \sigma_1\sqrt{\rho}B_{t-1}^{(1)} + \sigma_1\sqrt{1 - \rho}B_{t-1}^{(2)})\\\
&= \sigma_1\sqrt{\rho}\Delta B^{(1)} + \sigma_1\sqrt{1 - \rho}\Delta B^{(2)} \\\
\end{align}
```

よって、

```math
\begin{align}
(x_t - x_{t-1})^2 
&= (\sigma_1\sqrt{\rho}\Delta B^{(1)})^2 + (\sigma_1\sqrt{1 - \rho}\Delta B^{(2)})^2 + 2\Delta B^{(1)}\Delta B^{(2)}\sigma_1\sigma_1\sqrt{\rho}\sqrt{1 - \rho}\\\
&= (\sigma_1\sqrt{\rho}\Delta B^{(1)})^2 + (\sigma_1\sqrt{1 - \rho}\Delta B^{(2)})^2 \\\
\end{align} \\\
∵ B_t^{(1)}とB_t^{(2)}は独立なので 、\Delta B^{(1)}\Delta B^{(2)}=0 \\\

```

```math
\begin{align}
\Sigma(x_t - x_{t-1})^2 
&= \Sigma(\sigma_1\sqrt{\rho}\Delta B^{(1)})^2 + \Sigma(\sigma_1\sqrt{1 - \rho}\Delta B^{(2)})^2 \\\
&= n\sigma_1^2
\end{align} \\\
\\\
∵ B_t^{(1)}とB_t^{(2)}は独立かつ標準ブラウン運動なので 、\Sigma (\Delta B^{(x)})^2 =1
```
yについても同様に、

```math
\begin{align}
\Sigma(y_t - y_{t-1})^2 
&= \Sigma(\sigma_2\sqrt{\rho}\Delta B^{(1)})^2 + \Sigma(\sigma_2\sqrt{1 - \rho}\Delta B^{(3)})^2 \\\
&= n\sigma_2^2
\end{align} \\\

```

xとyの共分散は、

```math
\begin{align}
(x_t - x_{t-1})(y_t - y_{t-1})
&= \sigma_1\sigma_2\rho(\Delta B^{(1)})^2
\end{align} \\\
\\\
∵ B_t^{(1)},B_t^{(2)},B_t^{(3)}は独立なので 、\\\
\Delta B^{(1)}\Delta B^{(2)}=0,
\Delta B^{(1)}\Delta B^{(3)}=0,
\Delta B^{(2)}\Delta B^{(3)}=0

```

```math
\begin{align}
\Sigma(x_t - x_{t-1})(y_t - y_{t-1})
&= \Sigma \sigma_1\sigma_2\rho(\Delta B^{(1)})^2 \\\
&=n\sigma_1\sigma_2\rho
\end{align}
```

あとは、公式問題集の解説通り、
n=1000とおき、差分を1から1/10に変更し、σとρを計算する。

##参考文献
[統計検定準1級 2019年解説（問9）](https://note.com/sincerity423/n/n8e53cdb74e79)
[Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)
curlコマンドにオプションつけて色々設定

##環境
- Ruby 2.7.4
- Rails 6.1.4.4
- curl 7.77.0

##curl(読み方：カール)
curlコマンドとは、**データ転送をさまざまなプロトコルで行うことができる**コマンド。
HTTPのGET、POST、PUT、DELETEの他にもHTTPS、FTPでも対応している。

※本記事ではデータの作成、更新、削除について記す。

###curlを使ったデータの作成(POST)
`curl -X POST http://sanmple:3000/examples`でPOSTオプションが指定。

```
（コマンド例）
$ curl -X POST -d 'example[title]=hoge' http://sample:3000/examples
```

※「-d」とはdataを表しており、以上の場合POSTするデータを指定する。

###curlを使ったデータの更新(PUT)
`curl -X PUT ...`でPUTオプションが指定。

```
（コマンド例）
$ curl -X PUT -d 'example[title]=fuga' http://sample:3000/examples/1
```

###curlを使ったデータの削除(DELETE)
`curl -X DELETE ...`でDELETEオプションが指定。

```
（コマンド例）
$ curl -X DELETE http://sample:3000/examples/1
```


以上
貸出管理SaaS「カシカン」の私的運用メモ

<img src="https://casican.me/static/media/icon.04860ad9.png" width="200">

## はじめに
「[カシカン](https://casican.me/)」は、byus&co.株式会社さんがサービス展開している
社内・サークル・学校・町内会などあらゆるグループで利用できる
現在無料で提供されている備品管理サービスです。

カシカン スマホで使える貸出管理
https://casican.me/

スマホで使える無料の貸出管理 - カシカンblog
https://casican.blogspot.com/

カシカンとは？
https://casican.blogspot.com/2021/12/blog-post_26.html


**カシカンが優れていると思う点**

・本格的な在庫管理/備品管理のツールは探せば多くありますが、
　もう少し簡易に使えるものが欲しかった。

・最近はAppSheetを始めノーコードのツールもあるが、
　ノーコードとはいえ作り込みが必要であり即座に利用できるものでは無かった。

・現在無料提供されている。


## この投稿の目的
「カシカン」の使い方は「[カシカンblog](https://casican.blogspot.com/)」に詳しく書かれており、
ほとんどのことはそのブログに書かれていると思います。
その中でも利用してみて悩んだ点や分かりずらかったことを記載してみます。

※現在「カシカン」は活発に更新されており本投稿の内容も既に改善などが行われているかもしれません。
最新情報は常に「[カシカンblog](https://casican.blogspot.com/)」などを参照ください。


## 2022.1.29 「グループ管理者」の様にアカウントを設定してみる
現在「カシカン」のアカウントと権限には次のような設定があります。

（１）アカウントの種別
・「会員登録」ユーザー
・「会員証」ユーザー

（２）権限設定
・「アカウントの管理者設定」
・「メンバーによる貸出物の追加を許可する」

（３）貸出物グループ登録
・グループへ招待
・（グループ招待していない）

たたし、アカウントの種別による大括りな区別は設けられておらず、
例えば「メンバーによる貸出物の追加を許可する」を招待しているグループでチェックを有効にすると、
そのグループについては「会員登録」「会員証」ユーザーの区別なく「貸出物の登録（編集、削除）」が機能してしまいます。

そこでアカウントを「グループ管理」と「一般利用」で分けて使う場合は、
ひとつ上の権限である「アカウントの管理者」として使う必要があります。
※「メンバーによる貸出物の追加を許可する」はグループ全体に機能してしまい、個別のアカウント権限では無いのです。

■「アカウントの管理者設定」「メンバーによる貸出物の追加を許可する」の関係性のまとめの表
![カシカン_「グループ管理者」の様にアカウントを設定してみる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/6080bd36-9b15-da55-e1a4-7e83a1b1b816.png)

■「貸出物の登録」アイコンは常に表示されていますが、その中の設定で権限が分かれています（UI上の癖）
![カシカン_「アカウントの管理者に登録されたユーザー」と「一般ユーザー」の貸出品登録画面の違い.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/bebb7a1e-209a-1c5c-fe4f-2ef0c7b6fd3f.gif)

## 2023.9.4 検索欄のワイルドカードは「スペース」（半角または全角）で良い。
検索文字列内の任意の文字列を指示する場合は、「スペース」（半角または全角）で良いようです。
⇒よくワイルドカードに使われる特殊文字（" * "や" % "など）はそのままの文字として扱われてしまうのと、
特に" % "を入力すると、```サーバーエラーが発生しました。```になってしまいます。

(カシカンブログ関連記事) [検索機能について](https://casican.blogspot.com/2021/03/blog-post.html)
※本投稿時点ではワイルドカードについては記載されていないようでした。
[php] mysqli_fetch_array

https://www.php.net/manual/ja/mysqli-result.fetch-array.php

mysqli_result::fetch_array
mysqli_fetch_array

結果セットから1行取得し、それを配列として返します。 値を取得した後は、この関数をコールするたびに結果セットの次の行の値を返します 結果セットに対して行がなければ、null を返します。

データを数値添字の 配列に格納することに加えて、この関数は 結果セットのフィールド名をキーとする連想配列にもデータを格納できます。
[php] mysqli_fetch_assoc

https://www.php.net/manual/ja/mysqli-result.fetch-assoc.php

mysqli_result::fetch_assoc
mysqli_fetch_assoc

結果セットから1行取得し、それを連想配列として返します。 値を取得した後は、この関数をコールするたびに結果セットの次の行の値を返します。 もう結果セットに行がない場合には null を返します。
DeepL翻訳をコマンドラインで使えるアプリを作りました


:::note info
**2023/12/28 にアップデートを行いました**

以前は npm -g でのインストール手順でしたが、[vercel/pkg](https://github.com/vercel/pkg) を使用することにより、単一で実行出来るファイルを生成しました。

そして **Homebrew を使用してインストール**できるようになりました。

また、その他の細かい修正も行いました。

<details>

- 対話モードでの翻訳実行方法を変更しました。
- 設定ファイルの保存場所を ~/.config/dpl に移動しました。
  - (これにより、以前のバージョンではインストールし直すと設定が消える不具合がありましたが、修正されました。)
- Dependabot を導入して、定期的なアップデートを実施するようにしました。

（Windows でのパッケージ管理システムでの配布は、要望があれば行います。）

</details>

:::

# はじめに

今回は、DeepLの開発者向けAPIを利用して、Deepl翻訳をコマンドライン上で簡単に行える非公式ツールを制作したので紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638334/1125619b-15c2-84fc-6a07-c13453fbb159.png)

https://github.com/shu-pf/dpl/

# 特徴

- とにかくシンプルで気軽に使える
- 公式のAPIを使うので動作が早い
- 無料版のAPIキーに対応している

# 作った理由

最近はエラーメッセージが出た時にすぐ検索をせずに、まずは文章を読んで意味を理解するのを意識的に行っています。
その際に、DeepL翻訳アプリを立ち上げるのが面倒だったので作りました。

# デモ

まずは、動作させている画面を見てもらったほうが早いと思うので、スクリーンショットを撮りました。
このアプリには、

- 単一変換モード
- 対話型モード

の2種類の使い方があります。

## 単一変換モード

```
$ dpl "変換したい文章"
```

コマンドの引数が一つの場合に起動します。
引数が事前に設定しておいた言語に変換されます。
(この場合はターゲット言語を日本語に設定)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638334/1125619b-15c2-84fc-6a07-c13453fbb159.png)

## 対話型モード

```
$ dpl
```

コマンドの引数がない場合に起動します。
対話型で起動しながら、事前に設定しておいた言語に変換します。

**変換を確定する際には「t」だけの行を入力して改行して下さい。**

:::note info
v0では、改行のみで翻訳が行われていましたが、翻訳するための方式が変更されています。

（改行のみでの翻訳では、入力された改行が他の場所からコピー＆ペーストされたものか、変換を確定するために入力されたものかを判別することができなかったため）
:::

終わる時は 「control+C」 or 「q」 で終了してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638334/79846eca-300a-2cb4-d9da-fe6cf8016986.png)

# 使用方法

事前にDeepL APIのキーを作らなければいけません、そこだけ少し手間ですがご了承お願いします。

## 1. DeepL APIのキーを作る

使用前に、開発者向け DeepL の APIキー を公式サイトで作る必要があります。
APIキーには二種類あり、無料版と有料版があります。
無料版でもかなりの文字数を変換できるので、通常問題ないと思います。

## 2. インストール

```shell
$ brew tap shu-pf/tap
$ brew install dpl
```

## 3. ターゲット言語やAPIキーの登録

事前に発行しておいたAPIキーやターゲット言語などの登録を行います。

```
$ dpl setting
```

英→日で無料のAPIキーを使用の場合はこのような設定になるかとおもいます。

```
api type: free
auth key: XXX(本人が発行した物)
target lang: JA
```

# 感想など

## なにか物を作る時は自分で使うものを作ると受けがいい

このアプリを作ってnpmで公開したのですが、ダウンロード数の伸びがいいです。

それに比べて、その一つ前に作ってnpmで公開した物は、ほぼダウンロードされない・「別に必要ないんじゃないか」と引用リツイートで意見される散々な感じでした。

それを振り返って思うのは、
やはり、「こういう物があればウケるんじゃないか？」という物よりも、実際に自分が利用する物のほうが、確実に評価されるという事ですね。

自分ごとであれという話は、入門 起業の科学でも書かれていました。

https://www.amazon.co.jp/dp/B07P5K4DQ3

なのに、突拍子も無いことを思いついた時に限って、なぜかそのアイディアが魅力的に見えてしまうんですよね…笑

## 無意味に使うライブラリを増やさない

このアプリを作る際にこちらのライブラリを使ったのですが、

https://www.npmjs.com/package/deepl

(deeplとの通信をラップしてくれるライブラリ)

最新のAPI仕様に対して対応をしてはおらず、途中で外したという経緯がありました。
オープンソースのライブラリはメンテンスが継続的に行われるとは限らないので、本当に必要なライブラリは吟味して最小限に留める事も必要だと思いました。
[Go] ハロー ワールド

# install
https://go.dev/doc/install

# code
```go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
```

## package
コードの先頭では、このファイルに記述するコードがどのパッケージに所属するかを宣言する

## import
fmt というパッケージを import する

## func
func を使い、 `main` という function を宣言する

# command
```zsh
go run main.go
```


# Reference
https://go.dev/doc/tutorial/getting-started
【atcoder-cli】acc templatesでエラーが出て困った話

# acc templatesでエラーが出て困った話
少しでもレート上昇に繋がればと思いatcoder-cliを導入したのですが、acc templatesでエラーが出て結構苦労しました。同じことで困っている方への助けになればと思い投稿します。
## はじめに
エラーが出て苦労したのは事実ですが、私はatcoder-cliは素晴らしいツールだと感じました。ネガティブな感情の下でこの記事を書いたわけではないので、その点だけご留意いただけると嬉しいです。素晴らしいツールを開発してくださった作者の方に感謝します。(GitHubの方でも:star:を投げました。)
## 私の環境
OS: Windows10
## どんなエラーだったのか&その解決方法
### そもそもatcoder-cliのソースコードはどこにある？
atcoder-cliのソースコードのパスは以下の通りです。ユーザー名をご自身のものに変えてください。index.jsは改行の「か」の字もない感じで少し目に優しくないですが、あまり大きな変更はしないので安心してください。以下のエラー①とエラー②を解決すれば無事にacc templatesが使えるようになるはずです。

```
C:\Users\ユーザー名\AppData\Roaming\npm\node_modules\atcoder-cli\bin\index.js
```
### エラー①
私の環境の場合acc templatesを実行すると以下のエラーが出てしまいました。

```
 SyntaxError: Unexpected token  in JSON at position 0
```
何か予期しないトークンが先頭に入ってしまっているようです。JSONファイルに問題があるのかと思いチュートリアルのtemplate.jsonの内容を貼り付けて再度実行してみたのですが解説せず。atcoder-cliのソースコードをいじる必要があると感じました。

### エラー①解決方法
結論から言うと、エラー①に関してはsubstring()関数を使うことで解決できました。お使いのエディタでindex.jsを開き、「utf8」と検索すると、候補が２つ出ると思います。２つの候補の内、行数が若い方をクリックしてください。そして、以下のように変更してください。可読性のために改行を加えています。変更内容としては、

**①** 読み込んだファイルの内容を変数wに代入する。
**②** 変数qにwの先頭を除いたものを代入する。
**③** JSON.parse(q)を変数nに代入する。

以上３点です。

```javascript:index.js
const w=await i.promisify(a.readFile)(r.resolve(o,t,e.TEMPLATE_JSON_FILE_NAME),"utf8");
const q=w.substring(1);
const n=JSON.parse(q);
```
### エラー②
ここで一回ターミナルを開いてacc templatesを実行してみてください。すると、今度はこのようなエラーが出ると思います。

```
 TypeError: Assignment to constant variable.
```
「定数に代入はできないよ」と怒られてしまいました。

### エラー②解決方法
このエラーは単純に定数から変数に変更することで解決しました。エラー①で変更した部分のすぐ下に以下のような記述があると思います。

```javascript:index.js
[s,l]=await p(n);
```
この部分を以下のように変更しましょう。先頭にvarを付けるだけです。

```javascript:index.js
var[s,l]=await p(n);
```
## おわりに
この段階でacc templatesを実行すれば無事に作成したテンプレートが読み込めているはずです。この記事が少しでもお役に立てていたら幸いです。
PythonAnywhereで時計アプリをbottleとJavascriptで作る

クラウド上のサーバーでPythonのコードを実行できるPythonAnywhereで、現在の時刻を表示する時計アプリ（サイト）を作りましたので、備忘録として残します。ちなみに、Python自体は数年間、趣味で使っていますが、WEBフレームワークについてはほとんど初心者です。ご了承ください。

(2022.2.13) せっかくのシングルファイルのbottleなので、１つのファイルにまとめました。

まず、雑誌のI/O 2021年12月号にのっていた、Tkinterの時計を作ってみて、PCの画面上に現時刻を表示させることができました。これをWebアプリにして、PythonAnywhereで、urlでアクセスできるようにしようと思ったのですが、いろいろと苦労しました。

![スクリーンショット 2022-01-29 150458.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/1426057b-b1d0-48ed-c934-41d711d222e9.png)


よく分かっていなくてお恥ずかしいのですが、TkinterもWEBフレームワークかと思ったのですが、GUIパッケージで、まったく別物でした。

WEBフレームワークはFlaskやDjangoなども検討しましたが、bottleはシンプルで１ファイルで完結するとのことで、こちらを選択しました（しかし、結局はもう１つ、テンプレートファイルが必要でした）。

PythonAnywhereでのbottleの設定は、ガイドがあり、簡単でした。
勝手にhello world!のpyファイルができます。

しかし、ここに時計を表示させるコードがどこにも見つかりません。
英語のこちらのサイトによると、サーバーから情報は最初のGET requestの時にしか送れないそうです。

the server is only going to send information to your browser once in response to the initial GET request

https://stackoverflow.com/questions/22875508/how-does-one-implement-a-clock-that-updates-every-second-with-python-and-flask/22875698

しかし、ここにはjavascriptを使えばいいと書いてあり、サンプルコードへのリンクも載っていたので、それを使うことにしました。

（このサイトはjavascriptがどのように表示されるか分かるのでいいと思いました）
https://www.w3schools.com/js/tryit.asp?filename=tryjs_timing_clock

具体的には、こちらのjavascriptのファイルをテンプレートを使って、bottleから参照しました。（このテンプレートという呼び名が、ちょっとしっくりきませんでした。。）

PythonAnywhereでのコードは、勝手に作られたHello Worldのファイルをちょっとづつ書き換えたので、ちょっと汚いです。少しづつ改良したいと思います。

```python
# 東京の時刻をPythonanywhereで表示する
from bottle import default_app, route, template

@route('/')
def home():

    content = """

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>World Clock</title>
</head>

<body>
  <div class="container">
    <h1>WORLD CLOCK</h1>
  </div>
<script>

//表示形式
option={day:"2-digit",month:"short",year:"numeric",hour12:false,hour:"numeric",minute:"2-digit",second:"2-digit"};

function clockMaker(){
  let now=new Date();
  document.body.innerHTML = '';

//ただ時間を取り出すと、サーバーがあるところの時間になるため、東京時間にする
  option.timeZone="Asia/Tokyo";
  let str=now.toLocaleString('en',option);
  let splice=str.split(',')
  let time=splice[2];

  document.write("現在の東京の時刻: ", time);

}
//refresh every second
clockMaker();
setInterval(clockMaker,1000);

</script>
</body>
</html>

        """
    return template(content)

application = default_app()



```

PythonAnywhereのWeb Appの概念・使い方など、見よう見まねでやっていますが、なんとなくできてしまっています。何かいい方法や、質問などありましたら、コメントお願いします。



参考にしたサイト：
https://kuratsuki.net/2018/05/bottle-python-%E3%81%AE-web-%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E4%BD%BF%E3%81%86/
AWSロードマップ(AWS Basic基礎知識)



#目次
[1.はじめに](#1-はじめに)
[2.用語](#2-用語)
[3.ドローンでクラウド利用](#3-ドローンでクラウド利用)

#1. はじめに
ドローン✖︎クラウドの記事をよく見るけど、どうゆう仕組みで連携してるのか分からなかったので
[AWSロードマップ](https://qiita.com/KurokawaKouhei/items/4e9aa3b526f3f233bf85 "Qiita Home")で勉強をしたいと思います！
(まずはざっくり覚えて徐々に深堀していく、仕事でAWS少し触ったぐらい)

#2. 用語
![スクリーンショット 2022-01-29 13.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2181084/40bffabe-7263-e275-4950-3137d624f2ed.png)
###クラウド(クラウド・コンピューティング)とは
- ユーザーがインターネットを通じてサービスを必要な分だけ利用できる

###クラウドの利点
- 初期費用不要
- 運用、管理の負荷軽減
- システムの構築時間を短縮など

###Well-Architected フレームワーク => AWS特有の用語
- AWSユーザーの10年以上の経験からまとめられたベストプラクティス集(内容は今はいいや)

###責任共有モデル => AWS特有の用語
- クラウド事業者と利用者で責任範囲を明確にして全体のセキュリティを担保しようという考え方
- AWSの責任範囲
    - 物理的なインフラ、仮想環境を動かすハイパーバイザー(コンピュータを仮想化するためのソフト)
- 利用者（お客様）の責任範囲
    - OSから上のレイヤ

###リージョン/AZ/エッジロケーション => AWS特有の用語
- リージョン
    - サービスが提供される地域(複数のAZで構成)
- AZ
    - データセンター(通信やコンピューティングの設備を設置して運用することに特化した設備)の集合
- エッジロケーション
    - リージョンデータセンターとは別にコンテンツ配信を行う仕組み

###コストの理解
- 使用した分だけ料金を払う
- 契約するサービスによって料金が変わるので最低限の構成から始めるとよい
- AWSの料金を決める3つの要素
    - サーバー構成(台数やスペック)
    - ストレージの容量
    - AWSからインターネットへのデータ転送量
- Cost Explorer
    - リソースの使用状況、コストを可視化して分析

###タグの活用 => AWS特有の用語
- AWS上で大量のリソースを稼働させてる場合、何がどのシステムかを把握する為に使用

###3層アーキテクチャ
- サーバーを3層に分けて考える
    - プレゼンテーション層 -> デザインに特化した(画面レイアウトやフォント)
    - アプリケーション層 -> プレゼント層から受け取った情報をもとに何かしらの処理を行う
    - データ層 -> データベース

#3. ドローンでクラウド利用
- セキュリティー(セキュアフライトマネジメントクラウド)
    - ドローンで撮影した動画・画像を即座に暗号化し、クラウドにアップする事で復号できる
        - 墜落してもデータ漏洩の心配なし
    - 管理画面へwebからアクセスできて、作成/閲覧/編集が可能

こうゆうサービスの記事を見てどうゆう構成とか分かるようになりたい
Swift・CoreBluetoothで通信を行いメッセージアプリっぽいのを作った1

# 今回の内容
iOS環境下でBluetoothを使用したアプリをサンプルで作ってみました。
使用した言語、開発環境、参考書籍は以下になります。

+ Swift
+ Xcode 13.2.1
+ [iOS×BLE Core Bluetoothプログラミング](https://tatsu-zine.com/books/ios-ble-core-bluetooth-programming/samplepage)
注意点として、参考にした書籍は2015年3月23日に発行なので、Swift3で実装してあります。
そのため、最新の環境で実装する場合はSwift5の記述方法で処理を実装する必要があります。

## Bluetooth通信での端末の役割
+ セントラル 
 + 接続する端末を検索・接続をする役割
+ ペリフェラル
 + セントラル側に見つけてもらうために信号を送る
+ 共通
 + 送信するデータの書き込み
 + 受信したデータの更新

## この記事の実装の一覧
CoreBluetoothを使用して端末同士で通信してやり取りするには役割として以下の二つがあります

###### セントラル側の処理
+ 通信をする端末の検索
+ Bluetoothが使える状態かを調べる
+ 通信する端末への接続
+ 使用するサービスの検索
+ キャラクタリスティックの検索
+ 接続した端末の読み出し
+ 接続した端末への書き込み
+ データの更新

今回はセントラル側のBLEデバイスの検索だけ実装します。その後の記事は随時更新する予定です。

## BLEデバイスの検索
1.まず最初にCoreBluetoothをインポートします
![スクリーンショット 2022-01-29 14.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/35e9a08c-63e9-a0af-ce53-a9a08c4a5d09.png)
2.接続するBLEデバイスを検索します。
検索するために、CBCentralManagerクラスの変数を用意します。centralManager変数がセントラル側の処理を呼び出して
検索や接続などを行います。
![スクリーンショット 2022-01-29 14.44.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/28ea332e-102b-4c33-a9db-1ea32c818787.png)
3.私の場合、viewDidLoadでcentralManagerを初期化しています。
![スクリーンショット 2022-01-29 14.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/ee759008-fa75-c992-13da-3536818c418f.png)
4.初期化後、BLEの状態を取得します。BluetoothがOFFの場合、ONする必要があります。
![スクリーンショット 2022-01-29 14.53.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/640ed885-7fcf-9a78-913f-e1299f23acfe.png)
5.こちらでは、UIボタンをタップしたときに周辺のBLEデバイスを検索する処理になります
![スクリーンショット 2022-01-29 14.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/2349c76a-010d-110e-bb95-f6d1afb960bf.png)
6.スキャン結果を受け取る
ここでは発見したBLEデバイスをコンソールに表示しています。
最初の段階で接続したいBLE端末があるかを確認するためです。
![スクリーンショット 2022-01-29 14.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/c757de0b-a496-66dd-07fb-461e0b9eec53.png)

## 注意点
Bluetoothを使う際に気をつけたいのは、info.plistファイルにBluetoothを使用することを記述する必要があります。
Infomation Properth Listで +を押しPrivacy - Bluetooth Always Usage Descriptionを追加します。
この記述をしないとBluetoothの機能を使う際にエラーが出てくるのではまりやす箇所だと思います。
![スクリーンショット 2022-01-29 14.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207076/c1555cc4-9ce7-8eea-2036-661908da78b1.png)

以上の手順でセントラル側でBLEデバイスを検索することができます。
技術系の投稿は今回が初めてなので、拙い記事ですがこれから少しづつ記事の質を高めていきたいと思います。
次回はセントラル側でBLEデバイスに接続する記事を書きます。
[Swift・CoreBluetoothで通信を行いメッセージアプリっぽいのを作った2](https://qiita.com/Crow/items/6fa5655f51992390f168)
スタックについて実際にPythonを使って動かしてみた



# 目的
スタックのアルゴリズムをPythonを通じて体感で理解する

# スタックとは
> スタックは LIFO (Last-In-First-Out), データ構造に入っている要素のうち、最後に push した要素を取り出す

## スタックポインタとは
> スタックポインタは、スタックの最上段のアドレスを保持するレジスタで、スタック内で最後に参照されたアドレスを保持しています。


```python:stackSample.py
class StackA:
    # インスタンス変数
    top = 0  # スタックの先頭を表すポインタ
    st = []

    # スタックが空かどうかを判定する
    def isEmpty(self):
        return (self.top == 0) # スタックサイズが 0 かどうか

    # push (top を進めて要素を格納)
    def push(self,v):
        self.top = self.top + 1
        self.st.append(v)

    # pop (top をデクリメントして、top の位置にある要素を返す)
    def pop(self):
        self.top = self.top - 1
        return self.st.pop()

    def main(self):

        self.push(1)  # スタックに 1 を積む {} -> {1}
        self.push(2)  # スタックに 2 を積む {1} -> {1, 2}
        self.push(3)  # スタックに 3 を積む {1, 2} -> {1, 2, 3}
        self.push(4)  # スタックに 4 を積む {1, 2, 3} -> {1, 2, 3, 4}
        self.push(5)  # スタックに 5 を積む {1, 2, 3, 4} -> {1, 2, 3, 4, 5}

        print(self.pop())  # {1, 2, 3, 4, 5} -> {1, 2, 3, 4} で 5 を出力
        print(self.pop())  # {1, 2, 3, 4} -> {1, 2, 3} で 4 を出力
        print(self.pop())  # {1, 2, 3,} -> {1, 2} で 3 を出力

        self.push(6)  # 新たに 6 を積む {1, 2} -> {1, 2, 6}
        self.push(7)  # {1, 2, 6} -> {1, 2, 6, 7}

        self.pop()  # {1, 2, 6, 7} -> {1, 2, 6}
        self.pop()  # {1, 2, 6} -> {1, 2}
        self.pop()  # {1, 2} -> {1}
        self.pop()  # {1} -> {}

        # 空かどうかを check: empty の方を出力
        if self.isEmpty():
            print('empty')
        else:
            print('not empty')


stackA = StackA()
if __name__ == "__main__":
    stackA.main()


```

# 実行結果
```vim
$ C:\Users\user\Documents\python\app1>stackSample.py
5
4
3
empty
```
Tableauで人口ピラミッドを作る方法

e-statで国勢調査の年齢別人口を使って、人口ピラミッドを作る簡単な方法を紹介します。

#データ準備
e-statからデータを取得します。最新の国勢調査の年齢別人口は[ここ](https://www.e-stat.go.jp/dbview?sid=0003445097)にあります。リンク先で「表示項目選択」をクリックし、必要なデータのみを抽出します。ここでは、以下のように設定し、確定ボタンを押します。

- 表彰事項　→　そのまま
- 国籍総数または日本人　→　国籍総数
- 男女　→　総数を除外
- 年齢　→　総数を除外
- 全国～人口５０万以上の市　→　任意の都市（複数でも可）
- 時間軸（年次）　→　そのまま

ダウンロードボタンを押すとダウンロード設定画面が開きます。
ダウンロード設定のファイル形式は「CSV形式(列指向形式)」とし、他はデフォルトのまま、ダウンロードボタンを押します。
データは以下の画像のような形式です。
![データ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/78e83fc8-ab42-501a-6d4d-2c5d2b31da22.png)


# 作成方法


画像のようにピルを配置すると、男女別・年齢別の人口が表示されまが、男女とも右向きに人口が表示されるのでピラミッドになりません。
![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/6b4f2bb8-8c47-3035-6d7a-cb43d54e1a78.png)

そこで、男性人口のみ左側に表示されるように、性別が男の場合、人口がマイナスになるように計算フィールドを作成します。

```:男女別人口
IIF([男女]="男",-[Value],[Value])
```

この「男女別人口」で列のValueを置き換えるとピラミッドが表示されるので、あとは男性側の軸がマイナスになっているので、軸の書式設定のカスタムで以下のように設定してマイナス表示を消して完成です。

```:マイナス記号を表示させない書式設定
#,##0;#,##0
```
![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/d8545534-9562-dc55-7091-4cc33412c082.png)