OmniAICreator/Qiita-1.07M huggingface dataset:
API Gateway+Lambdaでパラメータを受け取ろうとしたがeventがnullだった話

## 概要
API GatewayからLambdaにパラメータを渡す方法を記載

## 困ったこと
Lambdaの方でクエリパラメータを使いたくて色々調べていて「event」から取れるよ！という記事が沢山あったがそもそもeventが空の状態になってしまっていて、積んでしまっていた。。。

## 解決方法
原因はAPI Gatewayの設定にあって、
メソッドを選択して
![スクリーンショット 2022-12-18 9.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/8c1f9464-7591-bb2b-aaf3-3745290a6a28.png)
右の画面にある「**統合リクエスト**」を選択すると
![スクリーンショット 2022-12-18 9.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/dc38c934-139c-14bb-001e-37e642f98e10.png)
Lambdaプロキシ統合の使用という項目がOFFになっていた
![スクリーンショット 2022-12-18 9.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/fc4bb778-cfc4-0498-b173-4ff580073db3.png)
こちらをONにすると
![スクリーンショット 2022-12-18 9.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/b1e3a496-b19b-a6c8-16b3-9329347869fd.png)
Lambdaの方でeventが受け取れるようになった
【Docker】apacheイメージで静的ページを表示させる

## Dockerfileを作成

```dockerfile
FROM httpd:latest
COPY ./index.html /usr/local/apache2/htdocs/
EXPOSE 80
```

```index.html
<!DOCTYPE html>
<html>
    <head>
        <title>hello!</title>
    </head>
    <h1>hello!</h1>
</html>
```

## コンテナ作成

### イメージ作成
`docker build -t apache_page ./`

### コンテナ作成+起動
`docker run -p 80:8080 --name apache_page -d -it --rm apache_page bash`

`-p` ポート番号を割り当てる。
`-d` バックグラウンドでコンテナを起動する

### localhost:8080にアクセス
![スクリーンショット 2022-12-18 9.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/32d738f3-9794-37c3-e804-15c2782e897a.png)

ページが表示されることを確認。


## docker-compose.ymlで作成

docker-composeを使うと、さらに簡単に構築できる。


```docker-compose.yml
version: '3'

services:
  apache_page:
    platform: amd64 # M1　Macを使用時、コンテナがうまく動作しない時に指定
    ports:
      - "127.0.0.1:8080:80"
    build:
      context: .
      dockerfile: Dockerfile

```

コンテナ起動
`docker-compose up -d`

curl
`curl localhost:8080`

以下のレスポンスが返って来ればOK

```
<!DOCTYPE html>
<html>
    <head>
        <title>hello!</title>
    </head>
    <h1>hello!</h1>
</html>
```


## 参考・関連記事

https://zenn.dev/ikuraikura/articles/a9cf216d31bda937a429

https://engineer-ninaritai.com/docker-port-expose/

https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53
今年の振り返り 2022 

# はじめに
香川のある企業でシステムエンジニアをしています。

最近はコードを書くことがなくなってしまい、同じシステムの運用保守をしていると、世間から取り残されているように感じてきました。
東京から転職してきた人から話を聞くと、「未来」から来たのかと思ってしまいます。

なにか情報収集できたらと思い、今年からUdonTechに参加しました。

# 1.UdonTechに参加して
今年の1つの出来事はUdonTechへの参加でした。
UdonとTechだけでいろいろな人が集まって交流して、そこからなにか新しい行動が生まれるだけでも面白いなと思いました。

## コミュニティに参加して悪いことはない！
あまりコミュニティとかに参加したりはしなかったですが、
何度か宴会に参加して、視野がかなり広がりました。

香川でITエンジニアとして働いている方と話をするだけでも
やっていることや働き方など、刺激的でした！

## 技術的なイベントには参加できず 
Setouchi-i-Baseで開かれるイベント情報も
いろいろ情報収集できましたが、参加できず。
来年は、ぜひ。

# 2.今年の振り返り
## AIアート
キーワードを入力することで、AIで画像が自動生成される。
https://midjourney.com/
風景だと、人が書くよりもかなりうまい。
AIに勉強させて、絵を描かせるAIアーティストもでてきましたね！
AIの活用を仕事でもしてみたいです。

## NFT
NFTアートが盛り上がっているニュースがあったので
息子が絵をかいてOpenSeaで出展してみました。
子どもの絵では、まったく売れず。
集めたくなるようなものでないと売れないですね。
来年は試行錯誤してみます！

## AWS
マネージドサービスを触り始めました。
サービスの組み合わせで、実際にシステム構築やってみたい！

## PM（プロジェクトマネジメント）
初PMで大きいプロジェクト。
思っていた以上に心身ともに疲弊。来年本番移行に向けて、もうひと踏ん張りです。
みなさんのPMエピソード聞いてみたいですー！

## 久しぶりの海外
海外に行くといろんな人種の人がいて
日本と比べて、多様性の中での生活ができるなーと実感。
英語でのコミュニケーションをみんなしている。
最近は仕事で、日本人だけでもいろいろな考え方の人と働いていると
多様性の中で子どもを育てるほうがいいのか、円安なので外貨を稼ぐほうがと
海外移住をちょっと考えました。

# 3.まとめ
他にも、個人的によくないことが後半に多々あったので
来年は上がるしかないと思って、引き続き、人生楽しみたいと思いますー！
最近書いたコスパのよいシェルスクリプト（ターミナルから離れずに翻訳）

# 何これ？
最近短いシェルスクリプトを書いたら、意外と使用頻度が高かったのでメモっておく。Amazon Translateをコマンドラインから使うだけのもの。

# 誰向け？

俺。その他、以下のような人
* 英語を頻繁に読み書きしないといけない人
* `aws`とか`jq`コマンドが入っているややインフラな人
* 翻訳のためにわざわざターミナルから離れたくない人


```shell:translate.sh
getopts "j:e:" OPT

case $OPT in
  j) SOURCE=en; TARGET=ja; S_FLAG="🇺🇸"; T_FLAG="🇯🇵" ;;
  e) SOURCE=ja; TARGET=en; S_FLAG="🇯🇵"; T_FLAG="🇺🇸" ;;
  *) echo "Usage: $0 {-e|-j} <sentence>"; exit; ;;
esac

REGION=ap-northeast-1

echo "$S_FLAG  → $T_FLAG"
aws translate translate-text \
  --region $REGION \
  --source-language-code "$SOURCE" \
  --target-language-code "$TARGET" \
  --text "$OPTARG" \
  | jq -r .TranslatedText
```

# 使い方

シェルのエイリアスを以下のように設定

```shell
ej='/path/to/translate.sh -j'
je='/path/to/translate.sh -e'
```

```
% je "あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。"
🇯🇵  → 🇺🇸
That strong wind from Ihatovo, the blue sky that is cold at the bottom even in summer, the city of Molio decorated with beautiful forests, and the glaring grass waves in the suburbs.
```

```
% ej "That strong wind from Ihatovo, the blue sky that is cold at the bottom even in summer, the city of Molio decorated with beautiful forests, and the glaring grass waves in the suburbs."
🇺🇸  → 🇯🇵
イハトヴォからの強風、夏でも底が冷たい青空、美しい森に彩られたモリオの街、郊外のまぶしい草の波。
```

# 学び
[イーハトーブとは、宮沢賢治による造語で、賢治の心象世界中にある理想郷を指す言葉である。](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%83%8F%E3%83%88%E3%83%BC%E3%83%96)

Cheers, 🍻
MLOpsにおけるML-based Software Delivery Metrics 

DevOpsの状態に関する最も憤慨した研究では、著者は、エリート/高性能組織のソフトウェア開発と提供の有効性を捉える4つの主要な指標、つまり展開頻度、変更のリードタイム、平均復元時間、および変更失敗率を強調しました。これらのメトリックは、MLベースのソフトウェア配信を測定および改善するのに役立つことがわかっています。次の表では、各メトリックの定義を示し、MLOps に接続します。

|Metric	|DevOps	|MLOps|
|:--|:--|:--|
|展開頻度	|組織はどのくらいの頻度でコードを運用環境にデプロイしたり、エンド ユーザーにリリースしたりしていますか?	|ML モデルのデプロイ頻度は、 1)モデルの再トレーニング要件(頻度の低いものからオンライントレーニングまで)。モデルの再トレーニングには 2 つの側面が重要です 1.1) モデル減衰メトリック。 1.2) 新しいデータの可用性。 2) デプロイ プロセスの自動化のレベル (手動デプロイ と 完全に自動化された CI/CD パイプラインの間)。|
|変更のリードタイム	|コミットされたコードから本番環境で正常に実行されるコードに移行するのにどのくらい時間がかかりますか?	|変更の ML モデルのリードタイムは以下に依存します 1)デプロイ/サービング用のMLモデルを完成させるためのデータサイエンスの探索フェーズの期間。 2) ML モデルのトレーニング期間。 3) 展開プロセス中の手動ステップの数と期間。
|平均復元時間 (MTTR)	|サービス インシデントまたはユーザーに影響を与える欠陥 (計画外の停止やサービスの障害など) が発生した場合、サービスの復元に通常どのくらいの時間がかかりますか?|	ML モデルの MTTR は、手動で実行されるモデルのデバッグの数と期間、およびモデルのデプロイ手順によって異なります。ML モデルを再トレーニングする必要がある場合、MTTR は ML モデルのトレーニング
| 変更失敗率 |運用環境への変更またはユーザーにリリースされた変更のうち、サービスが低下し (サービスの障害やサービスの停止など)、その後修復が必要 (修正プログラム、ロールバック、修正、修正プログラムが必要など) に何パーセントがもたらされますか。 | ML モデル変更の失敗率は、現在のモデルを展開する前にデータを使用して ML モデルをテストすることによって減少する可能性があります。以下についても考慮する必要があります 1) ML モデルのトレーニングとサービング用のデータセットが一致すること。 2) ML モデルをデプロイする前に、モデルを使用して予測を行い、予測の精度を検証すること。 3) モデルを展開する前に、モデルを使用して業務ロジックをテストすること。 4) ML モデルのデプロイプロセスを自動化すること。


ML の開発と配信プロセスの有効性を向上させるには、上記の 4 つの主要な指標を測定する必要があります。このような効果を実現するための実用的な方法は、最初に CI/CD パイプラインを実装し、データ、ML モデル、ソフトウェア コード パイプラインのテスト駆動開発を採用することです。
育児に「ぴよログ」使ったのでログファイルをJavaScriptで扱いやすくしてみた

https://qiita.com/advent-calendar/2022/iotlt

アドベントカレンダー2022IoTLTの17日目です！

[IoTLT](https://iotlt.connpass.com/)は登壇したことありましたが、最近は全然ですね…

アドベントカレンダーを参加をきっかけにまた登壇目指したい！

## ぴよログとは

https://www.piyolog.com/

育児に便利なログアプリ

自分が一番便利だなってものが、ミルクを飲ませた時間のログですね

嫁さんが夜中あげててくれて、朝方自分が起きてミルクあげようとしたとき、何時間前にあげたのかとか、寝ている嫁さんをいちいち起こさなくていいのがすごくいいです

### ログの出力

![](https://storage.googleapis.com/zenn-user-upload/3cfd0a8ef438-20221218.png)

公式ではPDFで出力可能とありますが、

![](https://storage.googleapis.com/zenn-user-upload/54aadae172aa-20221218.png)

テキストファイルでも出力できます

そして

![](https://storage.googleapis.com/zenn-user-upload/1c229ea8f741-20221218.png)

色々な手段で共有できます（Androidの画面）

今回は、ここは自動化できないので、もしここが自動でGoogleDriveなんかにリアルタイムでログが共有される"てい"でやろうかなと思います

がんばれば、[こういうもの](https://www.switch-science.com/products/2455#erid10753675)とスマートフォンを常時おいておけばできるかも

## まずはJSで解析

```js:piyolog.js
const piyolog = {
  _text: '',
  title: '',
  date: null,
  dateData: []
};

piyolog.setText = (text) => {
  piyolog._text = text;
  piyolog._updateData();
};

piyolog._updateData = () => {
  const line = piyolog._text.split('----------');
  if (line.length == 1) {
    // 1日だけのログ
    const l = line[0].split('\n');
    piyolog.date = new Date(l[0].slice(6, -1));
    piyolog.title = l[0];
    console.log(line[0].slice(6, -1));
    piyolog.dateData.push(piyolog._getDateData(line[0].slice(6, -1)));
  }
  else {
    // 1月のログ
    piyolog.title = line[0];
    for (let i = 1; i < line.length - 1; i++) {
      piyolog.dateData.push(piyolog._getDateData(line[i]));
    }
  }
};
piyolog._getDateData = (dateText) => {
  const dateData = {};
  const section = dateText.split('\n\n');
  const abst = section[0].split('\n');
  dateData.date = new Date(abst[1]);
  dateData.tile = abst[2];

  const events = section[1].split('\n');
  dateData.eventsData = [];
  for (let i = 0; i < events.length; i++) {
    if (events[i] == '') {
      break;
    }
    dateData.eventsData.push({
      raw: events[i],
      time: events[i].slice(0, 5),
      type: events[i].slice(8, -2).split(' ')[0],
      val: events[i].slice(8, -2).split(' ')[1],
    });
  }

  const total = dateData.eventsData.length == 0 ? section[1] : section[2];
  dateData.total = total.split('\n'); //todo

  if (section[3]) {
    dateData.memo = section[3];
  }

  return dateData;;
};

module.exports = piyolog;
```

こんな感じに

使うときは、いったんぴよログのエクスポートしたテキストファイルをダウンロードして、

```js:app.js
'use struct';

const fs = require('fs');
const piyo = require('./piyolog');

const fileName = '【ぴよログ】2022年11月.txt';//'【ぴよログ】2022_12_1.txt'

fs.readFile(fileName, (err, data) => {
  piyo.setText(data.toString());
  console.log(piyo.dateData[3]);
});
```

![](https://storage.googleapis.com/zenn-user-upload/56b1e90d7bb9-20221218.png)

これでいったん可視化とか前回のミルクの時間から赤ちゃんの空腹度をLEDの色やサーボとかで表現できる土台ができた！

いったん今回はここまでで（IoTじゃなくなったが、タイムアップ…）


## 【追記】

https://qiita.com/search?q=%E3%81%B4%E3%82%88%E3%83%AD%E3%82%B0

結構みんなぴよログで色々やってる…記事読むの楽しいぞ！
PG16:Fast COPY FROM command for the foreign tables (修正版)

# はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 22日目の記事です。
今回はPostgreSQL 16のCOPYコマンドの性能改善項目について書いてみました。

:::note info
ソースを最新化(commit 07eef53955ea9885dd3e4701b7eaa34ccdf2ae02)し、かつ``CREATE FOREIGN TABLE``のoptionに``batch_size '1000'``を追加して再測定しました。
:::

# 概要

|項目|内容|
|:--|:--|
|タイトル|[Fast COPY FROM command for the foreign tables](https://commitfest.postgresql.org/40/2601/)|
|Topic|Performance|
|Last Modified|2022-10-31|
|ステータス|commited|
|概要|外部テーブルに対するCOPY高速化|

# 変更内容


発端となったメールを見ると、パーティションテーブル＋外部テーブルの構成に対してCOPYコマンドを実施するときの性能が向上する、というように読めます。

2022-12-23追記：[篠田さんのツイート](https://twitter.com/nori_shinoda/status/1605904562967089152)および、本機能の開発に携わっている藤田さん＠NTTからの指摘で、**``CREATE FOREIGN TABLE``の``options``にbatch_sizeオプションに'1000'を追加した環境を再構築して測定しました。**

# 検証
手元ですぐ使える環境でCOPY処理時間を測定してみます。

## 環境
* EC2インスタンス：t2.medium
* OS：AM2 Linux

## テーブル構成/測定方法
![](https://i.imgur.com/69cPNRs.jpg)

pgbench_accountsテーブルをパーティション親テーブルとして定義し、子外部テーブルをハッシュパーティションとして分割する構成にしました。
外部テーブル接続先の実テーブルはUNLOGGED/LOGGEDの両方のパターンを試してみます。
PostgreSQL 15/devel版で上記のテーブル群を構築し、パーティション親テーブルに対して100万件のデータをCOPYでロードします。

## 測定結果
各バージョン/各構成で3回測定し、その平均をとってみました。

![COPY処理時間グラフ-再測定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32626/f2a58826-3b8a-1c32-7408-d1ea5524e582.png)


**こうかはばつぐんだ！**
``batch_size``オプションの値を変化させると、どう処理時間が変わっていくのかも調べてみると面白いかもしれません。

# おわりに
パーティション＋外部テーブル構成でのCOPYの高速化の効果を試してみましたが、``batch_size``オプションの恩恵をこの構成でも受けられる、という結果がわかりました。
指摘していただいた、篠田さん、藤田さん＠NTTのお二方に感謝です。

# 参考（DDL例）
以下のDDLでテーブルを構築しました。

```sql
CREATE EXTENSION postgres_fdw;

-- remote unlogged tables
-- CREATE UNLOGGED TABLE a1(aid integer , bid integer, abalance integer, filler character(84));
-- CREATE UNLOGGED TABLE a2(aid integer , bid integer, abalance integer, filler character(84));
-- CREATE UNLOGGED TABLE a3(aid integer , bid integer, abalance integer, filler character(84));
CREATE TABLE a1(aid integer primary key, bid integer, abalance integer, filler character(84));
CREATE TABLE a2(aid integer primary key, bid integer, abalance integer, filler character(84));
CREATE TABLE a3(aid integer primary key, bid integer, abalance integer, filler character(84));

-- local parent table
CREATE TABLE pgbench_accounts (aid integer, bid integer, abalance integer, filler character(84))
  PARTITION BY HASH (aid);

CREATE SERVER loopback foreign data wrapper postgres_fdw options (port '16001', dbname 'testdb');
CREATE USER MAPPING FOR CURRENT_USER SERVER loopback;

-- local child foreign tables
CREATE FOREIGN TABLE f_a1
  PARTITION OF pgbench_accounts
  FOR VALUES WITH (MODULUS 3, REMAINDER 0)
  SERVER loopback
  OPTIONS (table_name 'a1', batch_size '1000');

CREATE FOREIGN TABLE f_a2
  PARTITION OF pgbench_accounts
  FOR VALUES WITH (MODULUS 3, REMAINDER 1)
  SERVER loopback
  OPTIONS (table_name 'a2', batch_size '1000');

CREATE FOREIGN TABLE f_a3
  PARTITION OF pgbench_accounts
  FOR VALUES WITH (MODULUS 3, REMAINDER 2)
  SERVER loopback
  OPTIONS (table_name 'a3', batch_size '1000');

```
だれかの進捗をうまく把握できないときのフレーズ集に関する一考察

## はじめに
[だれかの進捗をうまく把握できないときのフレーズ集](https://qiita.com/kobori_akira/items/9ab3e81bbf0d1c00e49f)について、私が考えたことをまとめます。
仕事でのやり取りだけじゃなくても、プライベートでも大きな課題を取り組むとき使えるなと思いました。

進捗を報連相する側としても、このフレーズを言われたら、建設的にプロジェクトが進むなと思いました。

## 考察
> 次にやることは何ですか？／このあとは何をしますか？

この質問に答えられる場合、順調に進捗が出ている状態が多いです。タスクが山盛りであっても優先度が決まってい、整理ができているときだけ明確に答えることができます。
この質問に答えられない場合、進捗が行き詰まっていることが浮き彫りになります。タスクの洗い出し、整理整頓を周りがサポートする必要があるでしょう。本人だけで抱えていると時間の浪費です。

> 〜時点でどんな状態を目指しますか？

この質問の効果は三点考えられます。
1. お互いにイメージが出来ること。方針違い、認識違いによる手戻りを防げるから
1. 大きすぎる目標を細分化できること。これにより、実行可能な状態にまでつなげることができます。
1. 逆算により、やることリストを組み立てられる

> 大変だったことはありますか？

将来、また同じところでつまづくことを避けることができます。あのとき苦労したけど、どうしたっけ？って多いんですよね。

> 「明日リリースして」って言われたら大丈夫ですか？

このフレーズは効きます。
同じ進捗率90%でも、「とりあえず動きますね」のときもあれば、「まだでたらめな動作しますね」のときもあるからです。

> どうでもいいけど話しておきたいことはありますか？

意外に効くのかもしれませね。上司の時間を取ってまでするほどじゃないけど、と考えて伝えないことってありますから。

## さいごに
私も実際に使ってみようと思います！
PythonとSeleniumとWebDriverでDownload完了簡易判定と待機

```python
import datetime
import itertools
import os
import time
```

```python
    _ = all([x for x in os.listdir(f"{os.getenv('USERPROFILE')}\\Downloads") if x.endswith(("crdownload", "tmp"))] and not time.sleep(1) and not print(f"{f'{datetime.datetime.now()}'[:-4]} download in progress...") and i for i in itertools.repeat(1))
```

※`import`を必要に応じて記述ください。
※`C:\Users\USERNAME\Downloads`がダウンロードフォルダの場合のコードです。
※`C:\Users\USERNAME\Downloads`に`foo.crdownload`や`bar.tmp`があるとループ処理状態になります。

tmp ⇒ crdownload ⇒ csv
tmp ⇒ crdownload ⇒ pdf
tmp ⇒ crdownload ⇒ zip

などのように、
Chromeでファイルをダウンロードすると拡張子が変化するので、
crdownloadとtmpの拡張子の有無による簡易的な判定です。

マルチプルステートメントにならないよう、
whileを使用せずに作成してみたところ、
黒魔術的なコードになってしまいました。

黒魔術的なコードなので代償が必要で、
crdownloadとtmpの拡張子のファイルが、
存在する間、毎秒、メモリを消費します。

黒魔術的なコードではない、
whileを使用したコードは[こちら](https://feo52.hatenablog.jp/entry/2022/12/18/080000)参照。

:::note info
参考
[python underscore](https://www.google.com/search?q=python+underscore)
[python ジェネレータ式](https://qiita.com/search?sort=&q=python+%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E5%BC%8F)
[python ジェネレータ式](https://docs.python.org/ja/3/tutorial/classes.html#generator-expressions)
[python 内包表記](https://qiita.com/search?q=python+%E5%86%85%E5%8C%85%E8%A1%A8%E8%A8%98)
[python 内包表記](https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions)
[python 短絡評価(真理値判定)](https://qiita.com/search?sort=&q=python+%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1)
[python 短絡評価(真理値判定)](https://docs.python.org/ja/3/library/stdtypes.html#truth-value-testing)
[python スライス表記](https://qiita.com/search?q=python+%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9)
[python スライス表記](https://docs.python.org/ja/3/reference/expressions.html#slicings)
[python フォーマット済み文字列リテラル](https://qiita.com/search?sort=&q=python+%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E6%B8%88%E3%81%BF%E6%96%87%E5%AD%97%E5%88%97%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB)
[python フォーマット済み文字列リテラル](https://docs.python.org/ja/3/tutorial/inputoutput.html#formatted-string-literals)
[python f文字列](https://qiita.com/search?sort=&q=python+f%E6%96%87%E5%AD%97%E5%88%97)
[python f文字列](https://docs.python.org/ja/3/tutorial/inputoutput.html#formatted-string-literals)
:::

:::note info
参考
[PythonとSeleniumとWebDriverでDownload完了簡易判定と待機](https://qiita.com/feo52/items/afb1badd28a10d04a203)
[PythonとSeleniumとWebDriverとChrome拡張機能でDownload完了判定と待機](https://qiita.com/feo52/items/7e95ea37daf05941383c)
[PythonとSeleniumとWebDriverとChrome拡張機能でDownload完了判定と待機（追加）](https://qiita.com/feo52/items/bf40f1f7b6f655cf6adb)
:::
paizaラーニング「i 番目の出力 3 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_i-thinput_step3
#### 私の解答
```Python3
n, m = map(int,input().split())
S = [""] * m
values = input().split()
for i in range(m):
    S[i] = values[i]
print(S[n-1])
```
#### 解答例
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

S = [0] * M
values = input().split()
for i in range(M):
    S[i] = values[i]

print(S[N - 1])
```
Elixir パイプ演算子 |> の正しい書き方

Elixirで一番好きな演算子は、|>(パイプライン演算子)　

書き方が色々あって、迷う事もあったので、[The Elixir Style Guide(の日本語訳)](https://github.com/kenichirow/elixir_style_guide/blob/master/README-jaJP.md#pipe-operator)をみてみました。
気を付ける点は、次の２点です。詳しい事はガイドライン見てください。

## |> を1回だけ使う記述はしない。

|> を1回だけ使う記述は、スタイルガイド違反になります。
使わない記述にするか、2回使う記述にします

使わない記述にする場合
```Elixir
# 悪い例
some_string |> String.downcase

# 良い例
String.downcase(some_string)
```

2回使う記述にする場合
```Elixir
# 悪い例
String.strip(some_string) |> String.downcase 

# 良い例
some_string
|> String.strip()
|> String.downcase 
```

1回じゃないからいって、次の記述もダメです
```Elixir
# 悪い例
String.strip(some_string) |> String.downcase |> String.codepoints

# 良い例
some_string |> String.strip |> String.downcase |> String.codepoints

```

## = の右辺として使うときは改行する
= の右辺として使うパイプライン使う事よくありますよね。
スタイルガイドでは、次の記述が推奨されてます。

```Elixir
# パターンマッチの右辺として複数行のパイプラインを使う場合は改行してから書くこと。
sanitized_string =
  some_string
  |> String.downcase
  |> String.strip
```



# 参考
https://github.com/christopheradams/elixir_style_guide
https://github.com/kenichirow/elixir_style_guide/blob/master/README-jaJP.md#pipe-operator
paizaラーニング「文字列の配列の入力 2 Python3編」

#### 私の解答
```Python3
li = [x for x in input().split()]
for ele in li:
    print(ele)
```

#### 解答例
```Python3
S = [""] * 10
values = input().split()
for i in range(10):
    S[i] = values[i]

for s in S:
    print(s)
```
paizaラーニング「i 番目の出力 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_output_step3
#### 私の解答
```Python3
li = ["good", "morning", "paiza","813", "pa13"]
print(li[3-1])
```
#### 解答例
```Python3
li = ["good", "morning", "paiza", "813", "pa13"]
print(li[2])
```
paizaラーニング「全要素の出力 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_output_step2
#### 私の解答
```Python3
li = ["good", "morning", "paiza","813", "pa13"]
for a in li:
    print(a)
```
#### 解答例
```Python3
li = ["good", "morning", "paiza", "813", "pa13"]
for ele in li:
    print(ele)
```
paizaラーニング「要素数の出力 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__string_output_step1
#### 私の解答
```Python3
li = []
li.append("Hello")
li.append("paiza")
li.append("1234")
li.append("pa13")
print(len(li))
```
#### 解答例
```Python3
li = ["Hello", "paiza", "1234", "pa13"]
print(len(li))
```
3選＠Excelのシートを最速で切り替える

### 概要

Excelのシートを切り替えるキーボード操作を3つ共有します。

いちいちキーボードから右手を離して、マウスを触って、時には◀▶ボタンを連打して、ちっさいシートタブをクリックするなんて、やってられないです。意地でもキーボードで操作してやる。

※Excel2016(デスクトップ版)、Excelオンラインにて動作確認



### ① [Ctrl＋PageUp/PageDown]
**最もシンプルな方法**です。[Ctrl＋PageUp]は左・前のシート、[Ctrl＋PageDown]は右・後のシートに移動できます。

**Excelオンラインでは[Ctrl＋Alt＋PageUp/PageDown]** に変更されています。[Ctrl＋PageUp/PageDown]はWebブラウザのタブ移動に置き換わってしまうため、Altキーも追加で押す必要があります。

Excelオンラインのショートカットキーは、ヘルプ＞キーボード ショートカット から参照できます。上記のAltつきのショートカットキーは、ググってもすぐには見つからず、Excelオンライン上のヘルプから見つけました。


![ex1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/5d509f04-fa2a-c635-453d-dc7df44acff3.png)

Excelオンライン

なお、ノートPCのキーボードでは独立したPageUpが存在せず、[Fn＋↑]などを押す必要があったりします。その場合は、[Ctrl＋Fn＋↑]・[Ctrl＋Fn＋↓]になるので、ちょっと慣れが必要。

### ② F6 ＞ 左右キー ＞ Enter

**シート数が多い時や、各シートが重い時**は、こちらがオススメ。F6キーでシートの一覧にフォーカスし、左右キーでシートを選択して、Enterでそのシートを開く操作です。

![ex2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/3b3a1644-0eee-b8ca-2eb2-d3d9381cd3db.png)
Excel2016(デスクトップ版)

**[Ctrl＋PageUp/PageDown]は、隣のシートにしか移動できない**ことが弱点です。目的のシートに行くまでの途中のシートをすべて開きながら移動していくので、シート数が多い時や、各シートが重い時は、意外と処理時間がかかりがち。一方、この手順だとシートを選択してから一度だけ開くので、処理が高速です。

Excelオンラインでは、F6ではなく、[Ctrl＋F6]で始める必要があります。単独のF6はWebブラウザに取られているため。

なお、保護ビューだと使用できません。



### ③ [Ctrl＋G] ＞ [シート名]!A1 ＞ Enter
**特定のシートを何度も開く時**にオススメ。[Ctrl＋G]は、セルを選択して移動(ジャンプ)する機能です。セル名だけでなくシート名も指定することで、シート間の移動ができます。

![ex3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/ae22b114-d4c7-544a-6560-74139ec3acb3.png)
Excel2016(デスクトップ版)

最大の利点は、**直近で移動したセルが一覧で表示**されており、そこから選択してジャンプできる点です。2,3枚のシートを行ったり来たりする時に効果を発揮します。

弱点としては、シート名を入力するのが面倒な点ですね。シート名を取得する一例として、②を応用した下記の操作を紹介しておきます。
F6 ＞ シートを選択 ＞ [Shift＋F10] ＞ R ＞ [Ctrl＋C] ＞ Esc

**Excelオンラインではジャンプの仕様が異なる**点には注意が必要です。履歴が表示されないかわりに、シートを選択できるようになっていますね。ジャンプ操作の呼び出しは、デスクトップ版と同じ[Ctrl＋G]で可能です。

![ex4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/dcac51d1-4b87-8449-e23e-859e0268902f.png)
Excelオンライン

個人的には、Excelオンラインのジャンプの使い勝手がよくて気に入っています。職場のPC(独立PageUp/Downがない)でExcelオンラインを使う場合は、[Ctrl＋Alt＋Fn＋↑/↓]と4つ押しになるので、[Ctrl＋G]でジャンプを多用していこうかなと思います。



### まとめ
##### 基本：[Ctrl＋PageUp/PageDown]
##### 遠いシート：F6 ＞ 左右
##### 往復する：[Ctrl＋G] ＞ シート名!A1
##### Excelオンライン：[Ctrl＋G]が万能

https://note.com/anpanda_44075/n/n36b2ad0d37a3
paizaラーニング「要素の挿入 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__elm_insert
#### 私の解答
```Python3
N, M, K = map(int, input().split())
A = [int(x) for x in input().split()]

A.insert(M-1, K)
for ele in A:
    print(ele)
```
解答例2とほぼ同じでした。
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])
K = int(values[2])

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

A.insert(M - 1, K)

for a in A:
    print(a)
```
#### 解答例2
```Python3
N, M, K = map(int, input().split())
A = [int(x) for x in input.split()]

A.insert(M-1, K)

for a in A:
    print(a)
```
Fluterで縦方向の画面切り替え（swiper）

## やりたいこと

TikTokやYoutube short風な縦方向のページネーションを実現したい。

<img width="250px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/348ce02c-505b-14ec-0f00-5500497d67eb.gif">

## 方法

card_swiperを利用することでできます。

https://pub.dev/packages/card_swiper

### 実装

```dart
      body: Swiper(
        itemBuilder: (context, index) => pageWidget(index),
        itemCount: pageColors.length,
        scrollDirection: Axis.vertical,
      ),
```

Listなどの実装方法と同じです。
自動スクロールや、ナビゲーションボタンも設定することができます。

gif動画のサンプルはこちらに置いておきます。

https://github.com/Yamamoto-Shohei/flutter_swiper

## さいごに

ページのコンテンツを動画にしたり、フロートボタンを配置していけば今風の動画コンテンツができます。
paizaラーニング「要素の削除 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__elm_erase
#### 私の解答
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]
del A[M-1]
for ele in A:
    print(ele)
```
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

del A[M - 1]

for a in A:
    print(a)
```
#### 解答例2
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

del A[M-1]

for a in A:
    print(a)
```
paizaラーニング「配列末尾への追加 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__push_back
#### 私の解答
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

A.append(M)
for ele in A:
    print(ele)
```
私の解答は解答例2とほぼ同じでした。
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

A.append(M)

for a in A:
    print(a)
```
#### 解答例2
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

A.append(M)

for a in A:
    print(a)
```
余白のある個人開発

# 余白ある生活

　日々に疲弊していると、良いものはできない。仕事や家庭やその他の細かいものたちに押しつぶされていると、余裕が生まれず、スムーズに生きることができなくなっている。そういった余裕を、わたしは余白と表現している。

> 「私はこの命題の真に驚くべき証明をもっているが、余白が狭すぎるのでここに記すことはできない」

　と、偉い人も書いていた。余白は大事だ。

　そして、その余白は文章を読むことで生まれる。

　本を読もう。

# 読書が余白をもたらす

　いまの人生からまったくかけ離れた書物を読むことで、実世界から逃避を行うことができて、自然と虚無の空間ができあがる。どんな本を読めばいいのかというのは、人によってさまざまな答えが出るのでよくわからない。ただ、私は一時期相対性理論とか量子力学の本を読んで、日常から離れたりした。

　そしてどういうわけか、絵が入らず、文章のみのほうが余白が生まれやすい。漫画は楽しいが、なんだか疲れる。

# 個人開発は長期戦

　個人開発は納期がなく、いつまでも開発することができる。空いた時間で行うので、スピードは遅く長期戦が予想される。（もっとも、3日の短期間でつくりきってリリース！　とやってしまう人もいる。すごい）
　長期戦ならば、自分の体を労りながら付き合っていきたいものだ。肉体的なことは別の記事に書くが、精神的なケアをするなら読書は必要な気がする。

# 読書に何かを求めてはいけない

　華氏451度という小説を昔読んだが、そこで私は「本は所詮は本でしかない」という印象を受けた。読書に対して何かを求めるのは間違っているのかもしれない。一冊の本により、人生が変わったとか、健康になったとかそんなことはない。

　ただ、堆積したり積み上がってきたりするものはある。人生になにも寄与しない文章の一フレーズがいつまでも心のそこに残っていて、それが時折自分の中でうごめいたりする。

>大事なのは、どれだけ考え抜けるかです。考えをはっきりさせようと紙に書く人もいますが、それは必ずしも必要ではありません。(中略)
その問題以外のことを考えてはならない。ただそれだけを考えるのです。それから集中を解く。すると、ふっとリラックスした瞬間が訪れます。そのときに潜在意識が働いて、新しい洞察が得られるのです
p323 フェルマーの最終定理 (新潮文庫)

　こんな文章とか。


　次こそは技術的な記事を書きたい。コードを載せる。
paizaラーニング「要素のカウント Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__elm_count
#### 私の解答
```Python3
n, m = input().split()
li = [x for x in input().split()]
ans = li.count(m)
print(ans)
```
私の解答では、文字列をカウントしていますが、解答例では、数値をカウントしていました。
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

print(A.count(M))
```
#### 解答例2
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

print(A.count(M))
```
Outlook でメモしたいときに知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。意外と何も知らなかったのが最近の Outlook なのでその話を書いていきます。

Outlook、もはやただのメーラーじゃなかった。
[ASCII.jp：Outlookの25年の歴史を整理する (1/2)](https://ascii.jp/elem/000/004/116/4116891/)
[ASCII.jp：Outlookの25年の歴史を整理する (2/2)](https://ascii.jp/elem/000/004/116/4116891/2/)

> Outlook.exeには、「メール」、「予定表」、「連絡先」、「タスク」、「ノート」という5つの機能がある。これらは現在では、Windows 10/11アプリの「メール」、「カレンダー」、「Microsoft To Do」（タスクに対応）、「付箋」（ノートに対応）の４つのアプリケーションに対応する。

便利機能が色々あります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/24dedd7c-e14d-0858-7f11-d8f197643c1d.png)

[メモを作成する - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E3%83%A1%E3%83%A2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-9e7eb168-096e-408b-9e4d-f6812a889248)
[ノートをカスタマイズします。 - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E3%83%8E%E3%83%BC%E3%83%88%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%97%E3%81%BE%E3%81%99-dfcd04c2-3d00-4daa-9b7d-35de7127b4ea)

でも使いどころが分からないんだよな... :upside_down: 
いやそれよりなによりメーラーとして検索を使いこなしたいんだが、うっかり Ctrl + F を押すと転送するメールが立ち上がる。Outlook で検索は Ctrl + E / F4 なのである。


[検索機能を使ってメールを探そう - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E6%A4%9C%E7%B4%A2%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E6%8E%A2%E3%81%9D%E3%81%86-d1b6f214-feec-4f8a-82a7-5aba24b9a7f8)
[メールの検索とフィルター処理 - Microsoft サポート](https://support.microsoft.com/ja-jp/office/%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E5%87%A6%E7%90%86-3e32b06d-a2d9-4a66-922f-78b77c41b97f)

先の [ASCII.jp：Outlookの25年の歴史を整理する (2/2)](https://ascii.jp/elem/000/004/116/4116891/2/) に戻ると

> たとえば、ユーザーが独自のビューを設計したり、既存のタスクや連絡先に独自のフィールドを追加する機能などだ。これらの機能は、Outlook.exeとExchange ServerでNotes／Dominoに対抗しようとしたことの名残だ。

てなことが書いてあって 25 年も歴史のある製品ってまあ色々あるよねと思ったのでした。そういえば

https://qiita.com/advent-calendar/2022/works-hi-3

このカレンダーも続々話題が投稿されていて面白いです (前職の主催)。今年私が知らなかったことでした :clock:
YOUは何しにジーズへ？

## 自己紹介から

昨日は@katonyonkoさんの
[趣味プログラミングのすすめ](https://qiita.com/katonyonko/items/5bbc2fe8be61d341aff5)でした。

自分は同じく初投稿で、まずは自己紹介させてください。

リーです、2019年に来日、趣味は登山とキャンプです。
今年10月からG`s ACADEMY福岡DEV12生になりました。

そもそもなぜ日本に来たのか？
一言で言いますと、仕事のストレスに耐えられず、
人生に疑問を感じ、**人生を楽しみたくて来ちゃった** ^^


### １、ジーズとの出会い

現地人のみ働いてる会社にいるので、
必然的に公用語が日本語という状態に追い込まれています。

今の仕事は各種のクリエイティブを作成すること。
HP記事だったり、LPだったり、動画だったり、デザインだったり、
お客様声だったり、、、必要があれば作る。

ややダークグレーの会社の中の何でも屋さん。
よく言えばジェネラルリスト、悪く言えば全スキル中途半端な人です。

実際仕事してみて、言葉の壁は思った以上に大きかった。
読み書きできても、一人でクリエイティブを完成できるまでの語学力はない。

そんな中何か学びたいと思って、
ジーズを選んだ理由は：

**1、**
語学は好きなので、英語のように、
**多くの人が使っていて、世界どこでも通用する言語を習得したい**
（しかも、コード書いてる時はカンニングOK!）

**2、**
ベンチャーあるあるで、会社が起業当初に想定してなかった規模になって、
社内システムがめちゃくちゃすぎて、外注でも５社以上断られた。
これだったら**欲しいものは自分で作っちゃえばいい**と思う次第でございます。

**3、**
ネットで調べて、めちゃくちゃ厳しいらしい
基本学びの場では追い込まれたいタイプなので、
**キツイーつらい〜くらいでちょうどいい!!!**

**4、**
友達がここの卒業生 笑

**5、**
起業転職も視野に入れられる。**＝選択肢を増やす。**

### ３、ジーズの課題との向き合い方

ジーズの課題は毎週えぐいです。笑
誰かが言った通り、ツナマヨのレシピを教えてもらった後、
中華のフルコースを作らせる。

それが毎週のようにやってくる。

圧倒的に技術力が足りない中、マーケー思考と語学の経験が
プラスに働いてる部分をシェアします。

#### A、誰にどう届くの？

- 毎週のようにプロダクトを作成する時、
必ず誰にどんな形で届きたいと考える。
最初から考えなくても、どっかの時点で考える。

- たとえ対象者が自分であって、自己満のプロダクトであっても、
自分がどんな人で、どんな訴求しているのも一回自己ペルソナまでやる。
自己満なら、自分をとことん満たす。

ジーズに入ってからの２ヶ月間がめちゃくちゃ自己愛溢れてます^^


#### B、"ポチらせる"＝行動させる

- cssでも、jsでも、導線でもなんでもいいんで、
一つのボタンをポチらせるにはどんな流れが必要か、
どうやったら押してもらえるかを毎週考えてます。

#### C、毎週目標＆HOW思考

- 毎週必ず自分へ課題を与えて、完成までやる。

-  うまくいかないのがデフォルトなので、
**自分がやりたいことをどうすればやれるか？**
とひたすら考える。

- 自力で無理そうな時はSOSを出す。

#### D、コンプレクスを強みに

- カタカナが苦手で、コンプレクスではありますが、
ジーズに入ってからむしろ英語読めてよかったと思うことが多い。

- 多くのDocumentationは英語なので、英語で書いていますので、
基本理解できないことがあまりない、使えるリソースが多くなる。

- YouTube教材は英語と母国語もいけちゃうので、
日本語で理解できない時は母国語に逃げられる 笑

#### E、モチベーションに頼らない

- プログラムは言語です。
言語の習得は基本長期戦で、ルーティンにしないと、
なかなかすぐ習得できないものなので、その心構えで、気長く、コツコツやる。

- いちいち結果に左右されない。
頑張っても成果が出ない時はPDCAを回す。


### ５、こんな人におすすめ

周りに比べて、できないことが多い中、
やっぱり来てよかったことが圧倒的に多いので、
これがLPにして、人におすすめするなら、、、

こんな人におすすめしたいです!

**1. 独身で日常的に物足りないと思っている方**

まじで独身のありがたみを感じます。
時間はいくらでも調整できます!!

趣味の時間を減った分、得られる満足感が大きい!!

**2. あっていいものを作りたい方**

入って２ヶ月で、最初の５週間はhtml, css, javascript,
firebase, localstorageなど、

いろんなやり方を試せる期間があって、
技術的にできていなくても、アイデアと工夫次第で、
こんなものも作れるんだ!!!となるのです。

例えば、
javascriptで診断ツールで集客できたり、
APIで欲しいデータを取り出せたり、
firebaseとgoogle spreadsheetで自動転機システムができたり、、、

使えるツールが増えて、
やりたいことを実現できるのです。


**3. 自分が持っている価値観を確かめたい方**

ジーズの同級生はみんな一人ひとり個性、感性も違って、
お互いにリスペクトし合う存在ですし、

講師陣も担任も自由にさせてくれてます。

課題は毎週出されて、お題もありますが、
お題から離れて、作りたいものを作って大丈夫です。
むしろ、それを歓迎されて、賞賛されるので、

もっと自由になりたい人には、
毎日パラダイスにいる気分になるのです!!!

気になる方はぜひ説明会でも参加してみてください。


https://gsacademy.jp/school-guidance


### 終わりに

お題で書いてるYOUは何をしにジーズへ？
に答えたいのですが、、、

現状に物足りないと感じて、海外に出てみたものの、
やっぱ何か足りない。

そんなモヤモヤにジーズに来て、
答えを探してみるのです。

答えはまだ出てきたないけど、
何かに追い込まれながらワクワクしている現在は結構楽しいです ^^

こうやって、模索しながらジーズでの旅を継続します。

明日は私がリスペクトしている、同期@saki_suematsuさんの記事です。
育児休暇という、休暇と言えないめちゃくちゃ忙しい期間の中で、毎回WAO!!!
と言わせるプロダクトを作成する素晴らしい方です。

ぜひ、明日、彼女の「育休中にG'sに入ってみたよって話」を楽しみください^^

では、まだ早いですが、みなさん、
Merry Christmas and Happy New Year!!
paizaラーニング「配列の反転 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__array_reverse
#### 私の解答
```Python3
n = int(input())
li = [int(x) for x in input().split()]
new_li = li[::-1]
for ele in new_li:
    print(ele)
```
### 解答例1
```Python3
N = int(input())

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

reversed_A = reversed(A)

for a in reversed_A:
    print(a)
```
### 解答例2
```Python3
N = int(input())

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

A.reverse()

for a in A:
    print(a)
```
### 解答例3
```Python3
N = int(input())
A = [int(x) for x in input().split()]

for a in reversed(A):
    print(a)
```
paizaラーニング「配列のソート Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__array_sort
#### 私の解答
```Python3
n = int(input())
li = [int(x) for x in input().split()]
for ele in (sorted(li)):
    print(ele)
```
私の解答は解答例3に近かったです。

#### 解答例1
```Python3
N = int(input())

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

sorted_A = sorted(A)

for a in sorted_A:
    print(a)
```
#### 解答例2
```Python3
N = int(input())

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

A.sort()

for a in A:
    print(a)
```
#### 解答例3
```Python3
N = int(input())
A = [int(x) for x in input().split()]

for a in sorted(A):
    print(a)
```
未経験エンジニア就活生へ。好きなもの作ったらみんなワクワクするのにな

# 私はこんな人です

メタップスという会社で新卒・中途採用の人事をしています。

応募書類/SNSなどなどでエンジニアさんのプロフィールは年間1000人はお見かけします。
年間に100人ってことはないですが、そこそこエンジニアの方と面談などでお話します。
会社では週に10時間くらいはエンジニアさんと会話を楽しんでいます。
コードは書けないです。（勉強したいと思い続けて10年。本当にごめんなさい。）

# 人事からみた未経験エンジニア就活の難所突破について書きます

人事視点で「これやればうまく就職できそうなのにな！」ということをツラツラ書きます。
（個人的に思うところなので、責任は取れません。本当にごめんなさい。）

「意外とそんなところ見てるんだな」
「簡単に直せそうだから工夫してみよ」
「遠慮していたけど、やってみよ」
みたいな感情になって、就活や転職活動が素敵なものとなり、
やってみたかった経験を味わえる良い出会いがあること祈りながら書きます！

# 提出書類や資料について
ここが肝です。
オンラインエンジニアスクールが最盛期だった頃は、30-40社に書類を提出しても面談にたどり着けずに終わってしまうという話もよく聞きました。
特に、未経験からの初手でSierやSESではなく自社開発のWEB系の会社を目指す場合はかなりのハードルです。

以下の項目について、特に意識して書類を提出すると、きっといいことが起きます。
それぞれ留意点を書いていきます。

## エンジニアになる理由

未経験からエンジニアを志した人の中で、動きだしてから1年後、2年後、3年後と時間が経つにつれて、エンジニアとして道を歩むことをやめる人が増えていきます。
2年後でも半分も残っていない印象です。
※スクールに通ったり、なんらかの勉強をしている方のTwitterをたくさんフォローしてきましたが、２年もすると別の職種になっていたり勉強をやめています。


なので、しっかり書いた方がいいです。
６割くらいの人は、この人はエンジニアとして続けていけなくなっちゃうんじゃないか...と不安になります。

エンジニアは、お金を稼ぐためだけでなる職種ではありません。
エンジニアは、なればすぐに自由を謳歌できる職種ではありません。
エンジニアは、「エンジニア」という肩書きを得る目的だけで目指す職種ではありません。
エンジニアは、未経験から1000時間の勉強を仮にしても即戦力になれる職種ではありません。

僕のエンジニアイメージは、
**もっと物作りが好きで職人気質と遊び心を持ったかっこいい人たちです。**

そうした姿に自分はなれるのだろうか、しっかり自分と相談をして、その答えを書類に書かれた方が素敵です。
何かワクワクするきっかけがあって、エンジニアさんを志したのだと思うので、そうしたことを丁寧に説明し、読み手の不安を打ち消してほしいです！

## ポートフォリオ
未経験からの就職の場合は、基本的にポートフォリオを作ってください！

履歴書でも、Wantedlyでも、個人サイトにでもいいので載せていただけると嬉しいです。
ログインが必要なものはテストアカウントなどと一緒にアクセスできる形で載せてください。

ここから、この記事で唯一くらいの大事なお話を書きます。

**必ず、自分が欲しいと思ったものを作ってください。**

エンジニアとして生きていくには、きっとそういう気持ちが大事なんです。
やらされている感で作ったものを載せてOKということではないです。

未経験エンジニアの方のポートフォリオでスケジュール管理やタスク管理のアプリをよく見かけますが、メイン機能はスケジュールやタスクの管理でも全然よいです。ただ自分の目的にあった機能をいれないと厳しいと思います。
例えばスケジュール管理アプリを作るとして、自分はインディーズのバンドのライブにいくのが好きだから、そういう情報の管理がしやすいように設計しようとか、ライブ会場の情報だけでなく感想もスケジュール帳に入れたかったんだよねといった自分の感情をもとにした機能が入っている必要があります。

ポートフォリオを載せることだけが目的になってしまっては、これからも目的と手段を間違えてしまうと思います。
エンジニアさんにとって（どの社会人でもそうですけど）目的と手段を間違えてしまうのは深刻な問題です。

そして、こう思うようになった理由は別になります。
人事とはいえ（エンジニアの面接官ならばなおさら）エンジニアスクールや選考課題で出されたために作成したポートフォリオかどうかは判断できます。

僕も、ここのエンジニアスクールさんはこういう課題をみんなに出しているんだな、とある程度覚えています。
つまりは多くの方は、全く同じ目的で、全く同じ方法で、ほぼ同じものをポートフォリオとして載せています。
これでは際立った自分の良さをアピールできないと思います。
そうなってしまっている方は、ぜひ自分のスキルを活かして、身近なことでよいので自分にとって便利だなというものを作ろうとしてみてください！

また致命的になってしまう凡ミスもあるので、ご注意ください。

よくある凡ミス
1. README的なものが無いor誤字脱字が多い
→コードだとtypoだしバグるかも
1. リンク切れ（４割くらいの方...リンク切れています。定期的に確認を）
→実サービスだと致命傷
1. ログインできない（テストアカウントがない&新規アカウント作成できない）
→実サービスだと報告書レベル

## GitHub
載せてください！
どんな環境で作っていたのかも伝えやすいので。

エンジニアではない私ですが、Githubに載っているコードで、さすがにな...と思うところでいいますと、大文字と小文字が入り混じっていたり、異常に変なスペースが入っていたりすると開発スキルのことはわからないですが、「（面接官という）人にみせるものなのにな」という気持ち以上に、今後チームで開発した際に、**他の人が自分のコードをあとで見ることとかを無視しちゃう性格なのかな...** などいろいろ気になりますのでNGです。

# 最後に
以上のことを確認したら、ぜひ応募してみてください！
もちろんメタップスに応募してくださったらばとても嬉しいです。
書類選考以降のハードルについては、お気軽に面談で相談にのることも歓迎です！
ぜひ、自分がわくわくするようなものを作ってみてください！！

楽しみに待っています！
paizaラーニング「配列の連結 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__array_join
#### 私の解答
```Python3
n, m = map(int, input().split())
li_n = [int(x) for x in input().split()]
li_m = [int(x) for x in input().split()]

for ele in li_n:
    print(ele)
for ele in li_m:
    print(ele)
```
リストを連結させる+演算子を知らなかったので、私の解答は上記のようになりました。
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

B = [0] * M
values = input().split()
for i in range(M):
    B[i] = int(values[i])

ans = A + B
for ele in ans:
    print(ele)
```
- リストを連結させるとき、+ 演算子を使います。
- x, y をリストとして、z = x + y のように書くと、リスト x の末尾にリスト y を連結したリスト z を生成することができます。
#### 解答例2
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]
B = [int(x) for x in input().split()]

ans = A + B
for ele in ans:
    print(ele)
```
paizaラーニング「部分配列 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__partical_array
#### 私の解答
```Python3
a, b, n = map(int, input().split())
li = [int(x) for x in input().split()]
for i in range(a-1, b):
    print(li[i])
```
私の解答は解答例2に近いです。
#### 解答例
```Python3
values = input().split()
A = int(values[0])
B = int(values[1])
N = int(values[2])

a = [0] * N
values = input().split()
for i in range(N):
    a[i] = int(values[i])

for i in range(A - 1, B):
    print(a[i])
```
#### 解答例2
```Python3
A, B, N = map(int, input().split())
a = [int(x) for x in input().split()]

for ele in a[A-1:B]:
    print(ele)
```
- スライスを用いた方法です。
- a[A-1:B] のような記法を「スライス」と言います。
- スライスはリストや文字列などに対して使うことができ、変数名[s:t] のように使うと、インデックスが s 以上 t 未満の要素をもったリストを取得することができます。
paizaラーニング

https://paiza.jp/works/mondai/array_primer/array_primer__array_elm_change
#### 私の解答
```Python3
a, b, n = map(int, input().split())
li = [int(x) for x in input().split()]
li[a-1], li[b-1] = li[b-1], li[a-1]
for i in range(n):
    print(li[i])
```
私の解答は解答例2に近い感じでした。
#### 解答例1
```Python3
values = input().split()
A = int(values[0])
B = int(values[1])
N = int(values[2])

a = [0] * N
values = input().split()
for i in range(N):
    a[i] = int(values[i])

tmp = a[A - 1]A, B, N = map(int, input().split())
a = [int(x) for x in input().split()]

a[A-1], a[B-1] = a[B-1], a[A-1]
for ele in a:
    print(ele)
a[A - 1] = a[B - 1]
a[B - 1] = tmp

for ele in a:
    print(ele)
```
#### 解答例2
```Python3
A, B, N = map(int, input().split())
a = [int(x) for x in input().split()]

a[A-1], a[B-1] = a[B-1], a[A-1]
for ele in a:
    print(ele)
```
【Go/Gin】画像を返すAPI

imagesフォルダにある画像を
(ルートURL)/(任意のパス)/(画像名)
にアクセスすることによって返してくれるAPIを作りました。

## フォルダ構成
```
root
├ images
    ├imageA.png
    └imageB.png
└main.go
```

## コーディング
```Go:main.go
package main

import (
	"github.com/gin-contrib/static"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	//画像を返す
	router.GET("/api/Image/:imageID", HandlerImage)

	router.Run()
}

func HandlerImage(ctx *gin.Context) {
	imageID := ctx.Param("imageID")

    //パスをここで指定
    path := "/images/" * imageID + ".png"

    //ここで画像を返す
	ctx.File(path)
}
```

要するに、ctx.File(ファイルのパス)で返せるというだけです。

このmain.goを実行して、
localhost:8080/api/Image/imageA
にアクセスすると、imagesフォルダのimageA.pngが表示されます。めでたしめでたし。
ニュース記事を棒読みに読ませるプログラムができるまで...(スクレイピング編)

# はじめに
　今回Pythonの勉強をする際に、最近ニュースを見ていなかったのでニュースを読み上げてくれるプログラムを作成しようかなと考えました。間違いがありましたらコメント等で連絡ください。
　この記事で行うことはWebスクレイピングを用いてWebサイトの情報を取るところまでやります。

# 目次
[環境](#環境)
[Webスクレイピングをしてみた](#Webスクレイピングをしてみた)
[sampleを作成した]($sampleを作成した)
[まとめ](#まとめ)
[参考文献](#参考文献)
# 環境
　以下の環境で動かしています

|  項目  |  値  |
| ---- | ---- |
|  CPU  | Core i5-8265U |
|  Ubuntu  |  20.04  |

　WindowsやGoogle Colaboratoryなどでも出来ますが、Ubuntuの方が個人的に好き（使いやすい）なので今回はUbuntuで進めていきます。また、今回はGoogle NewsとVOICEVOXを用いて動かしてみようと思います。

# Webスクレイピングをしてみた
　Webスクレイピングとは、サイトにある写真や文字などを抽出するコンピュータソフトウェア技術のことをいいます。
　今回はPythonのRequests_HTMLを使ってWebサイトから情報を抽出していきます。RequestsだとWebサーバで最終的にHTMLを作成するが、リアルタイムで更新するWebサイトはブラウザのエンジンで最終構築をするためWebサーバ内でできたHTMLをダウンロードしても違う内容が出てくるからです。

# sampleを作成した
　早速スクレイピングでWebサイトからデータを取得します。今回はsampleを作ってみました。sampleを実行する前にpipでRequests_HTMLをインストールします。
```
$ pip install requests_html
```
sampleです。
```python
#モジュールをインポート
from requests_html import HTMLSession

#インスタンス化
session = HTMLSession()

#URL先のデータを取得
url = 'https://news.google.com/home?hl=ja&gl=JP&ceid=JP:ja'
r = session.get(url)

#URLのHTMLをテキストに変換
r = r.text

#出力
print(r)
```
これを実行するとGoogle NewsのHTMLで書かれているものが出てきます。
ファイルはGitHubで公開しているのでクローンしたり、ダウンロードして使ってください。

https://github.com/kozenikanta/voicevox_ws

# まとめ
　今回は、スクレイピングを書きました。次回はスクレイピングで持ってきたHTMLからニュースのタイトルだけ抜き出してみようと思います。コードは書けているのですが、記事を書くのが難しい...
　なので、書き終わるまで色々なWebサイトをスクレイピングしてみてください（スクレイピングを禁止しているWebサイトもあるので注意してください。）

# 参考文献
[PythonでWebスクレイピングをする方法を解説！【入門編】](https://udemy.benesse.co.jp/development/python-work/web-scraping.html)
[requestsで取得できないWebページをスクレイピングする方法](https://gammasoft.jp/blog/how-to-download-web-page-created-javascript/)
[図解！PythonでWEB スクレイピングを極めよう！(サンプルコード付きチュートリアル)](https://ai-inter1.com/python-webscraping/)
【MYSQL】トランザクション処理

# はじめに
今回は、MYSQLにおけるトランザクション処理について記載します。

使用環境については下記の記事のものを流用します。

https://qiita.com/Yz6i1NrsEMtuL0f/items/f0eb997dea5714824fc8

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [トランザクション処理](#トランザクション処理)
1. [最後に](#最後に)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# トランザクション処理
## トランザクションに使用するコマンド
- BEGIN, START TRANSACTION
    - トランザクション処理を開始
- COMMIT
    - **変更を反映して**、トランザクション処理を終了
- ROLLBACK
    - **変更を反映せずに**、トランザクション処理を終了



## 実際の処理(ROLLBACKを使用した場合)
1.「example」データベースの「user」テーブルにて、作業を行います。現在の「user」テーブルの中身を確認します

```bash
mysql> USE example;
mysql> SELECT * FROM user;
```
結果
```
+------+----------+
| id   | username |
+------+----------+
|    1 | testuser |
+------+----------+
1 row in set (0.01 sec)
```
このテーブルにレコードを追加するときにトランザクション処理を用いて実施していきます。

2.トランザクション処理を開始して「testuser2」のレコードを追加します。
```bash
mysql> BEGIN;
mysql> INSERT INTO `user` VALUES (2,'testuser2');
```
3.レコードが追加できているか確認します。
```
mysql> SELECT * FROM user;
```

結果
```bash
+------+-----------+
| id   | username  |
+------+-----------+
|    1 | testuser  |
|    2 | testuser2 |
+------+-----------+
2 rows in set (0.01 sec)
```
この時点では、追加されていることを確認できています。
4.「ROLLBACK」コマンドでトランザクション処理を終了してみます。
```
mysql> ROLLBACK;
```
結果
```
Query OK, 0 rows affected (0.01 sec)
```
5.再度テーブルを確認します。
```
mysql> SELECT * FROM user;
```
結果
```
+------+----------+
| id   | username |
+------+----------+
|    1 | testuser |
+------+----------+
1 row in set (0.00 sec)
```
先ほど追加したレコードがなくなりました。
「ROLLBACK」によって変更が保存されずに処理が終了したことが確認できました。

## 実際の処理(COMMITを使用した場合)
1.「example」データベースの「user」テーブルにて、作業を行います。現在の「user」テーブルの中身を確認します

```bash
mysql> USE example;
mysql> SELECT * FROM user;
```
結果
```
+------+----------+
| id   | username |
+------+----------+
|    1 | testuser |
+------+----------+
1 row in set (0.01 sec)
```
このテーブルにレコードを追加するときにトランザクション処理を用いて実施していきます。

2.トランザクション処理を開始して「testuser2」のレコードを追加します。
```bash
mysql> BEGIN;
mysql> INSERT INTO `user` VALUES (2,'testuser2');
```
3.レコードが追加できているか確認します。
```
mysql> SELECT * FROM user;
```

結果
```bash
+------+-----------+
| id   | username  |
+------+-----------+
|    1 | testuser  |
|    2 | testuser2 |
+------+-----------+
2 rows in set (0.01 sec)
```
この時点では、追加されていることを確認できています。

4.「COMMIT」コマンドでトランザクション処理を終了してみます。
```
mysql> COMMIT;
```
結果
```
Query OK, 0 rows affected (0.01 sec)
```
5.再度テーブルを確認します。
```
mysql> SELECT * FROM user;
```
結果
```
+------+-----------+
| id   | username  |
+------+-----------+
|    1 | testuser  |
|    2 | testuser2 |
+------+-----------+
2 rows in set (0.01 sec)

```
今回は、レコードが保存されていることが確認できました。

<a id="#Chapter2"></a>
# 最後に
今回は、トランザクション処理について記載しました。
処理中にトラブルが発生しても「ROLLBACK」で変更をなくすことで、データの不整合を防ぐことができます。

<a id="#reference"></a>
# 参考文献
https://dev.mysql.com/doc/refman/8.0/en/innodb-autocommit-commit-rollback.html

https://dream-database-sql-seminar.com/mysql-intro-contents/mi_ch07/mi_0701/
cfn-mysql-user-providerでAurora MySQLのユーザー・権限のIaC化が出来るか

:::note info
これは [ZOZO Advent Calendar 2022 カレンダー](https://qiita.com/advent-calendar/2022/zozo) Vol.5の18日目の記事です。昨日の投稿は @curry_on_a_rice さんの 「√2の肩に無限に√2を乗せると2になる振る舞いを matplotlib でリアルタイム描画する」でした。
:::

# 概要
ZOZOTOWNではマイクロサービスによって技術選定が様々で、AWS Aurora MySQLも使用しております。
Aurora MySQLのユーザー・権限のIaC化を検討しており、AWS CloudFormationのカスタムリソースプロバイダーであるcfn-mysql-user-providerのお試し結果を記載します。

# Aurora MySQLのIaC化状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69905/eddafeca-6333-5256-1987-3ee7f7ff5b9e.png)

CloudFormationによって「Cluster/Instance, Database, Admin User」、[sqldef](https://github.com/k0kubun/sqldef)によって「Table」をそれぞれIaC化しています。

System User, Operation Userと言ったユーザーのコード化はCloudFormation, sqldefで実施できず別途検討が必要な状態でした。

# cfn-mysql-user-provider
CloudFormationのカスタムリソースプロバイダーです。
カスタムリソースを使用すると、CloudFormationテンプレートにカスタムのプロビジョニングロジックを記述することが可能になります。詳細は[AWSドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)をご覧ください。

## 試した結果：ユーザー作成はできたが権限は付与できない
結論からになりますが、cfn-mysql-user-providerを使うことでCloudFormationからユーザーを作成することができました！が、作成したユーザーへの権限付与を行うことはできませんでした。

カスタムプロバイダーのインストール、カスタムリソースを使ったユーザーの作成はGitHubリポジトリの[Installation](https://github.com/binxio/cfn-mysql-user-provider#installation)にある通りなので詳細は省きますが、下記が注意点になります。

* `VPC_ID`、 `SUBNET_ID`、 `SG_ID` はカスタムリソースのバックエンドであるLambdaのパラメーターです。接続先のAurora MySQLと接続可能なIDの指定が必要です。

下記のような簡単なCloudFormationテンプレートでAurora MySQLのユーザー作成ができました。

```
AWSTemplateFormatVersion: "2010-09-09"
Description: "MySQL User"
Resources:
  CustomMySQLUserTest:
    Type: Custom::MySQLUser
    Properties:
      User: hoge
      Password: fuga
      WithDatabase: false
      DeletionPolicy: Drop
      Database:
        Host: <db-host>
        Port: 3306
        DBName: <db-name>
        User: <db-user-name>
        Password: <db-user-password>
      ServiceToken: <lambda-service-token>
```

作成されたユーザー

```
mysql> select user,host from mysql.user where user = "hoge";
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| hoge          | %         |
+---------------+-----------+

mysql> show grants for `hoge`@`%`;
+-----------------------------------+
| Grants for kamei@%                |
+-----------------------------------+
| GRANT USAGE ON *.* TO 'hoge'@'%' |
+-----------------------------------+
```

権限付与のサポートは議論されていますが(ref. [PR](https://github.com/binxio/cfn-mysql-user-provider/pull/14))、残念ながら2022/12時点で実装はされていません。

# まとめ
* cfn-mysql-user-providerを試してみました
* ユーザー作成はできましたが、2022/12時点では権限の付与など細かい点の柔軟性がなくこちらのみでAurora MySQLのユーザー・権限のIaC化は難しそうでした
* Aurora MySQLのユーザー・権限のIaC化は引き続き検討していきます（sqldefの乗るKubernets JobにTerraformなどのツールを載せIaC化する方針が良さそうに思っています）
* もし、Aurora MySQLのユーザー・権限のIaC化でよい方法をご存知の方がおりましたらお気軽にコメント頂けると幸いです
Vue-CLIで作ったページをGo/GINで表示する最短手順

Vue-CLIで作ったフロントエンドをGinのバックエンドで配信する方法が意外と見つからなかったため、記事を書くことにしました。

# 全体的なディレクトリ構成
```
root
┝ client #フロントエンド、Vue-cliがここに
    ┝ public
    ┝ src
    (その他)
└ server #バックエンド、Goがここに
    ┝ main.go
    (その他)
```

# フロントエンドのセットアップ
普通にVue-cliを作るだけ。
```
###rootディレクトリにて

# clientフォルダ直下にvue-cliプロジェクトを作成
$  vue create client
```

# フロントエンドのビルド
フロントエンドが書けたら（特に何もしなくともデフォルトでページがあります）、バックエンド側で表示するために下記のコマンドでビルドする必要があります。

フロントエンドを更新したものを反映するには、その度にビルドする必要があります。
```
$ npm rum build
```

# バックエンドのセットアップ
こちらも普通にgo、ginのプロジェクトを作る要領で。gin/staticもインストールしていることに注意。

```
### serverディレクトリにて

#モジュールのセットアップ
$ go mod init main

#ginの取得
go get github.com/gin-gonic/gin

#gin/staticの取得
go get github.com/gin-contrib/static
```

# バックエンドの記述
フロントエンドを表示する最小コードを。
```go:main.go
package main

import (
	"github.com/gin-contrib/static"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	router.Use(static.Serve("/", static.LocalFile("../client/dist", false)))

	router.Run()
}

```

上記コードで、ルートURLからフロントエンドを閲覧することができます。

確認するには、
```
$ go run main.go
```
からの
localhost:8080
へのアクセスで見ることができます。
JupyterNotebookの見た目をカッコよくしよう

# 概要
JupyterNotebookの背景色，セルサイズ，フォントサイズ，．．．．
とりあえずいろんな設定したいけどどうすんのーー！！！

# jupyterthemesで設定をいじる
jupyterthemesとやらでJupyterNotebookの設定をいじれるらしい．
とりあえずpipでjupyterthemesをインストール．
```
$ pip install jupyterthemes
```
あとはこんな感じで設定して，(おすすめの設定)
```
$ jt -t monokai -T -N -cellw 95% -tfs 11 -lineh 160 -ofs 10
```
ノートブックを開けば，
```
$ jupyter-notebook
```
![atcorder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073654/cbc09b80-2c17-2409-a1d2-05674d521c14.png)
![template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073654/e1b3c6e0-225a-1584-13fd-7a942af1fbfe.png)
セルの横幅も広くていい感じ！

今回使ったjtのオプション
| 引数 | オプション |
|:-:|:-:|
| -t | インストールするテーマ |
| -T | ツールバー表示 |
| -N | 名前とロゴ表示 |
| -cellw | セルの横幅 |
| -tfs | セルのフォントサイズ |
| -lineh | 行の高さ |
| -ofs | 出力のフォントサイズ |

いろんなオプションがあるので，上記以外のものが気になる人は見てみてください．
[jupyterthemesの使い方](https://github.com/dunovank/jupyter-themes)
Web上でSSL証明書を発行【Certbot】

コマンドしなくてもレッツ円栗プトで発行できるようにしてみました。

<p class="codepen" data-height="942" data-default-tab="result" data-slug-hash="YzjKjrW" data-user="04" style="height: 942px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/YzjKjrW">
  Untitled</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


### 初期化

```bash
sudo apt install -y zip certbot
```

```python:server.py
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
import re
import ssl
import subprocess
import threading
from socketserver import ThreadingMixIn

class ThreadingSimpleServer(ThreadingMixIn,HTTPServer):
    pass

class CustomHTTPRequestHandler(SimpleHTTPRequestHandler):

    def do_POST(self):
        domain = os.path.basename(self.path)
        if not re.match(r'^([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$', domain):
            self.send_response(400)
            self.send_header( "Access-Control-Allow-Origin", "*")
            self.end_headers()
            return
        self.send_response(200)
        self.send_header('Content-Type', 'text/event-stream')
        self.send_header( "Access-Control-Allow-Origin", "*")
        self.end_headers()
        domain = os.path.basename(self.path)
        proc = subprocess.Popen(f'sudo certbot certonly --standalone --register-unsafely-without-email --agree-tos --non-interactive -d "{domain}"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        for line in proc.stdout:
            self.wfile.write(line)
        zip_command = f'[ -d "/etc/letsencrypt/live/{domain}" ] && sudo zip -jrq "{domain}.zip" "/etc/letsencrypt/live/{domain}" && echo "\nCertificates: https://certbot.cf/{domain}.zip"'
        proc = subprocess.Popen(zip_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        for line in proc.stdout:
            self.wfile.write(line)


httpd = ThreadingSimpleServer(('0.0.0.0', 443), CustomHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile='../privkey.pem', certfile="../fullchain.pem", server_side=True)
print("Server running on https://certbot.cf")
httpd.serve_forever()
```