OmniAICreator/Qiita-1.07M huggingface dataset:
.NET WebView2を利用して、WinFormやWPFでPDFを表示する

# やりたいこと
WinFormやWPFで表示しようとなると、AcrobatSDKが必要だとか
サードパーティライブラリが必要だとか、Win10のAPIを利用して画像を生成するだとか、色んな記事があります。
正直めんどいし、なんだったら割と簡単じゃない。(難しくはないんですがめんどくさいは否めない)
AcrobatSDK利用すると余計な機能が付いてくる、サードパーティだと料金が発生するかもだし、
配布時のライセンス問題も気にしなきゃとか、Win10のAPIで画像生成は、
所詮画像を生成するに留まるし、生成処理に時間もかかる等で、個人的には不満が多かったです。

ただ表示したいだけなのに。なんでこんなめんどいの？世の中からPDF無くなったらいいのに。。。
特定の環境下じゃないと再現できないドキュメントフォーマットなんて、HTML以下でしょ。
なんでこんなに世の中で流行ってんのさ。
なんて思った事も過去にありました。

***そんな事を今でも思い悩んでる貴方に！***

ただ表示したい！なんだったら印刷等もしたい！という場合に
私がお勧めしたい、多分これ以上ないだろうという簡単実装を紹介します。

難しいお話は全く無くて、単純にMicrosoft Edgeベースのブラウズが出来るコントロールである
Microsoft Edge WebView2を利用し、表示するという方法です。つまりEdge任せです。

# 条件
Windows 11、10、8.1、7等。

Win32 C/C++
.NET framework 4.5以降
.NET Core 3.1以降
.NET 5
.NET 6
WinUI 2.0(プレビュー)
WinUI 3.0

実行環境にWebView2ランタイムがインストールされている事。

Visual Studio 2017以降

詳しくは、Microsoftの公式ドキュメントを参照してください。
[Microsoft Edge WebView2 の概要](https://docs.microsoft.com/ja-jp/microsoft-edge/webview2/)
[WebView2 アプリと WebView2 ランタイムの配布](https://docs.microsoft.com/ja-jp/microsoft-edge/webview2/concepts/distribution)
# 実際にやってみる

環境は、下記の通りです。
Windows 10 Pro 64bit 21H1
Microsoft Visual Studio Community 2019

今回はC# WindowsForm +.NET Freamwork 4.8の例で紹介します。
(もちろんVisualBasicだろうが、C++でも問題ありません)
## １ NuGet パッケージマネージャーでWebView2をインストールする
空のWinformプロジェクトを作り、NuGetからWebView2を取得し、コントロールを使えるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464438/0607ff87-4a13-e7ee-f1c2-d5f327ab1aca.png)

## 2 フォームにButtonとWebView2を追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464438/dd9d8c6d-fbd7-34ee-46c6-33042774d53e.png)

## 3 WebView2にPDFを読み込ませる処理を書く

PDFのファイルパスをURIにしてWebView2のSourceプロパティに渡す処理を書きます。
お決まりのパターンです。なんにも難しくないです。

```C#:C#
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                ofd.Filter = "PDFファイル(*.pdf)|*.pdf";
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    this.webView21.Source = new Uri(ofd.FileName);
                }
            }
        }
    }
```

## 4 動かしてみる
ビルドして実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464438/06ad6e08-9d5c-7667-3256-31dd3703f7f2.png)

以上です。ちゃんと表示されてます。
(手書き系等の機能は除いて)EdgeでPDFを表示した結果と全く同じです。
なので文字検索や回転、印刷や保存もできます。
# 5　感想
いや、簡単すぎる！！SDK？API？なんだったの？ってなりました。
Webブラウザを利用するという点でチート技だとも言えますが、
単に表示したいだけというニーズはあると思います。それをお手軽に実装するという点では有りかと。

一点だけ難癖を付けると、WebView2ランタイムなるものが必須であること。
このランタイムは、再配布可能という事になってるので、ライセンスの心配は無いでしょう。
他の方法も似たような事情を抱えるので、Microsoft謹製環境のみで実装できるのはうれしい事ではないでしょうか。

URIで渡す為、もちろんインターネット上のPDFも渡せますし、
試してないですが工夫次第ではSharePoint上のPDFファイルのURLとか、
Teamsに添付したPDF等も扱えるかも・・・？

なんにせよこんなに簡単に実装出来るんだから、活用しやすいかと思います。

また、WebView2の利用できる範囲が広い事。条件を満たせば、懐かしのWin7でも利用できるってのは、
一部の環境では大歓迎な実装方法なのではないでしょうか。
随分と時が経ってしまいましたが、まさしくWin7時代にこんな感じの仕組みが欲しかったものです。

PDFを表示するアプローチとして、あまりこの方法の紹介記事が無いようだったので、紹介しました。
参考になればと思います。
【AWS】LambdaからDynamoDBを呼ぶときは、タイムアウト時間を設定変更しようの巻

# 起きたトラブル

`APIGW <-> Lambda <-> DynamoDB`のようなシンプルな構成で、DBの中身をサーバレス配信するようなAPIを作ったとき、ごくまれにLambdaがタイムアウトを起こした。Lambdaのランタイムはnodejs。

↓ランダムに大量リクエストを飛ばしてみると、全体の0.1%未満ながら、間違いなく5秒タイムアウトしている🤮
![IMG_0106 3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1050582/ab04e172-0f16-8534-f02c-1cfbb4a0ab73.jpeg)

Lambdaのタイムアウト時間は自由に設定変更できるが、30秒タイムアウトに設定しても改善しない。
(そもそも30秒もかかっていたら使い物にならないけど。)



# なにがまずいのか

aws-sdkの仕様書より抜粋↓

> timeout [Integer] — Sets the socket to timeout after timeout milliseconds of inactivity on the socket. Defaults to two minutes (120000).
(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#constructor-property)


JavaScript版のaws-sdkでは、DynamoDBのソケットタイムアウト時間がデフォルトで120000ms ( 2分間🤮 ) に設定されている。
すなわち、一度詰まってしまうと2分経過するまでDynamoDBへの通信をリトライしてくれない。
その結果、リトライ処理が呼ばれる前にLambdaがタイムアウトしてしまっていた。

こうなるとLambda内でエラーハンドルしていたとしても強制終了されてしまうため、ログにも現れないまま謎のタイムアウトとして処理されてしまう。


# 解決策

デフォルトで設定されているタイムアウト時間 (120000ms) を設定変更してやれば良い。
DynamoDBのDocumentClientを生成するタイミングでhttpOptionsとして引数を渡せば、デフォルト設定を上書きできる。
Lambdaのタイムアウト設定が5秒なら、ソケットタイムアウト200ms & リトライ上限10回くらいでちょうど良いのではないか(適当)。

```sample.ts
import { DocumentClient } from 'aws-sdk/lib/dynamodb/document_client';

const dynamoClient: DocumentClient = new AWS.DynamoDB.DocumentClient({
  httpOptions: {
    timeout: 200,
  },
  maxRetries: 10,
});
```
50年分のアニメ情報をAPI化してみた。

python勉強中なので自分用のメモ

#作成したもの

http://animeapi.pythonanywhere.com/api/article?limit=5&season_id=6&checkcount=desc

http://animeapi.pythonanywhere.com/api/article/1

http://animeapi.pythonanywhere.com/api/season/name/2022%E5%B9%B4%E5%86%AC%E3%82%A2%E3%83%8B%E3%83%A1

#50年分のデータをどう作成したか
https://anime.eiga.com/program/

↑をスクレイピングします。
Pythonには「BeautifulSoup」というWEBスクレイピング用の便利なライブラリがあるので、こちらをcronでスクレイピングすることで常に最新の情報がDBに保存されている状態を保ちます。

#api作成
フレームワークはflaskを利用しているのでflask_restfulを使って作成

参考にした記事↓

https://kazuhira-r.hatenablog.com/entry/2019/08/14/235805
EIPの逆引き設定をする

この記事は [AWS Advent Calendar 2021](https://qiita.com/advent-calendar/2021/aws) のカレンダー2の7日目の記事です。
昨日は [hi1280](https://qiita.com/hi1280) さんの [GitHub Actionsを使ったECSのデプロイメントパイプライン構築](https://hi1280.hatenablog.com/entry/2021/12/06/090000) でした。

# はじめに
- DNSを使う際、ドメインからIPを引く正引きを使うケースが多い。例えばブラウザにURLを入力してWebページを開いたり、Webページのリンクを踏んで別のWebページに遷移したりする時にドメインからIPへの変換が裏で行われている。
- 一方でメールサーバーからメールを送信したり、Webページをクローリングする際は、相手からするとIPしかわからず、IPから送信元のドメインを辿って送信元を確かめスパムかどうかなど判断したいケースがある。
- AWSを使用した時にどのように設定していくかを調べてみる。

# 設定方法

## EIPを発行する
- まずはEIPを発行する。
![Screen Shot 2021-12-08 at 21.59.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264912/55e3af8f-1389-3e02-586d-9d59dfd14c2e.png)

![Screen Shot 2021-12-08 at 22.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264912/6c72a0e5-230b-55ac-86d7-274cc4f4a1e1.png)

## 正引き設定をする
- Route53からドメイン→IPの正引きを設定する。
![Screen Shot 2021-12-08 at 22.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264912/0f15a338-c9cb-b8fc-f23c-adfc878b1e01.png)

## 逆引き設定をする
- 逆引き設定前は逆引きしてもAWSのデフォルトのドメインのまま。

```
❯ nslookup 13.114.215.38
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
38.215.114.13.in-addr.arpa	name = ec2-13-114-215-38.ap-northeast-1.compute.amazonaws.com.

Authoritative answers can be found from:
```

- 正引きで設定したものと異なるドメインを設定すると...
![Screen Shot 2021-12-08 at 22.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264912/28e215af-3174-f59c-65e2-20460e3ae674.png)

- エラーとなる。
![Screen Shot 2021-12-08 at 22.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264912/4eb22eb8-689d-429d-8d43-272415c9672e.png)

- なので、正引きで設定したドメインを設定する。
![Screen Shot 2021-12-08 at 22.03.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264912/9601c1ac-889c-8174-b4cd-a1d751471fd2.png)

- 逆引き設定が反映された🙌

```
❯ nslookup 13.114.215.38                                                                                                                                                     ✘ 1
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
38.215.114.13.in-addr.arpa	name = test.nnhiguchi.com.

Authoritative answers can be found from:
```

# 注意
- terraformでの設定も試みたが、記事執筆時点ではterraformは対応していなかった。
- 逆引き設定は2021/09に多くのリージョンで展開されたばかり。
  - https://aws.amazon.com/jp/about-aws/whats-new/2021/09/dns-elastic-ip-addresses-virtual-private-cloud/

# まとめ
- 逆引き設定は簡単にできるのでメールサーバー作成時やクローリング時などはスパムと誤認されないように設定しておくと良さそう。
SAP BTPのCloud Foundry EnvironmentにNode.jsアプリをデプロイする

この記事は[Node.js Advent Calendar 2021](https://qiita.com/advent-calendar/2021/nodejs)の12日分の記事です。

今回はNode.js+expressのアプリを作ってSAP BTPのCloud Foundry環境にデプロイする方法について説明します
#環境
OS:Windows10
Node.js：16.13.1
CF-CLI：V8

#Node.jsとは
サーバーサイドで動くJavaScriptの実行環境です。

#SAP BTPのCloud Foundry環境について
SAP BTPは、インテリジェントエンタープライズアプリケーションとデータベース、およびデータ管理機能、アナリティクス、統合機能、拡張機能が一つに統合された、クラウド環境とハイブリッド環境の両方に対応したプラットフォームです。
数百もの SAP アプリケーションとサードパーティアプリケーションの事前構築済み統合も含まれています。 

https://www.sap.com/japan/products/business-technology-platform.html

SAP BTPのランタイム環境はCloud Foundry、Kyma、ABAPの3つがあります。
今回はCloud Foundryを使用します。

#今回の流れ
・Node.jsアプリの作成
・SAP BTP環境の設定
・デプロイ


##Node.jsアプリの作成
###準備
https://nodejs.org/en/
上記からNode.jsをインストール

###アプリ作成
以下のコマンドを実行します

```bash
$ mkdir nodeApp
$ cd nodeApp/
$ npm init
$ npm install express --save
```

新規ファイルapp.jsを作成
ポートは固定にしてしまうとBTP上で動かした場合、エラーになるので注意が必要です

```app.js
var express = require("express");

var app = express();

//  listen()メソッドを実行して3000番ポートで待ち受け
var port = process.env.PORT || 3000
var server = app.listen(port, function () {
    console.log("Node.js is listening to PORT:" + server.address().port);
});

//  Hello Worldを表示
app.get("/", function (req, res, next) {
    res.send("Hello World");
});
```


package.jsonを編集します
**"start": "node app.js"　**をscriptsに追加しています


```package.json
{
  "name": "nodeapp",
  "version": "1.0.0",
  "engines": {
    "node": "14.x.x"
  },
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
```
###ローカルでの実行確認
ローカルでアプリを実行

```
$ node app.js
```
URLにアクセスしてプラウザでHello Worldが表示されることを確認

http://localhost:3000/



##SAP BTP環境の設定

###トライヤル環境に登録
https://www.sap.com/products/business-technology-platform/trial.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/deff1e3a-21ae-aed4-7bb4-67c21a706cbf.png)

###SAP BTP環境の準備
Subaccount: trial - Entitlementsから**Cloud Foundry Runtime**を有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/43cf9ed1-1e22-5bb5-c9a6-2b09ff056311.png)

Create Spaceからスペースを作成
今回はdevって名前で作成
デプロイ時に使うのでAPI Endpointをメモしておく

```
https://api.cf.us10.hana.ondemand.com
``` 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/6b8b7728-0595-73dd-f5b0-b136f5f9a024.png)

##デプロイ
###Cloud Foundry CLIのインストール
https://github.com/cloudfoundry/cli#downloads
ここらからCloud Foundry CLIをインストール
真ん中あたりにインストーラーがあります。

###デプロイ
以下のコマンドでログイン後、BTPのメールアドレスとパスワード入力

```
cf login -a <URL>
```

アプリをプッシュ

```
cf push nodeApp --random-route
```
アプリ（nodeApp）がBTP上に作成されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/17f169ec-0e19-b1a9-b8fe-3dbac3116b18.png)

アプリのメモリ等を設定したい場合は以下のファイルを作成

```manifest.yml
---
applications:
- name: nodeApp
  memory: 128m
  instances: 1
  buildpack: https://github.com/cloudfoundry/nodejs-buildpack.git
```

manifest.ymlを参照するようになるのでcf pushのみでOKになる

※参考

https://developers.sap.com/tutorials/cp-cf-download-cli.html
UEFIのCUIベースのOSを作ってる話

# はじめに
この記事は[自作OS Advent Calendar 2021](https://adventar.org/calendars/6581)の15日目用に書かれました。
おそらく10月ごろから[このページ](http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/index.html)を参考にして作り始めた自作OSがだんだん進化してきたのでこの機会に書いておきます。

# 本題
まず、このOSはEFI単体で動いたりします。ここでえらいひとからツッコミがあるかもです。
えらいひと「はぁ！？ブートローダは？！」って。
ないんですよ。ブートローダー。ごめん。
実装がめんどくさかったてゆのが1番の理由だけど、今まで大して困ってないから、まいいかな、、、って。ゆるして、、。
さて、このOSはCUIベースで動くけど、それは別に実装が面倒だったって理由ではなかったりします。私自身古いPCの黒いコンソールに緑の文字が映ってるのが大好きだっていう理由です。だから、グラフィックとかはあんまり（てか全く）やらなかったのでそこは苦労しなかったですね。ただ、その分コマンドの量とかないように力を注げればなぁって思ってます。思ってる。ここ大事ですよ。多分私のことだからがんばるでしょう（雑）。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">新しくなったフォントで自作言語～！ <a href="https://t.co/HE3u0NjfX1">pic.twitter.com/HE3u0NjfX1</a></p>&mdash; ْ (@dangomu39300363) <a href="https://twitter.com/dangomu39300363/status/1468203217708544001?ref_src=twsrc%5Etfw">December 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
だんだん暇になったり作るもの無くなったり、あとは、、、興味が出てきたりしたら手を出すつもりです。~~もう出し始めてる~~

でも、作るからには某窓とかペンギンとかリンゴマシーンみたいなので無く、なんというか、、、独創的なものというか、自分で全部考えるというか、まぁ完全に私仕様なものにしたいですねぇ。


さて、このOSを作った理由、たとえばみなさん自作OSに取り掛かる理由として「学習」とか答える人が多数派かと思うのですが、私はちょっと違います。

私はこのOS を「普段使いする」ことが目的です。ですからちょっとばかし、例えばブートローダーがないとか、そういうことはべつにやらなくてもよいのでは？と考えたわけですね。
その代わり、自分の要求に正確に答えられるよう実装しなければなりません。
ではこの自作OSでなにがしたいのか。
それは、「OS上で言語を動かすこと」です。その言語で、OS自体を改造するのです。いわば究極のカスタムOSです。
Linuxを使えばよいではないか、とかおもいました？いやいや、全部自分で作るのに意味があるのですよ。
設計からデザインから全部自分の手で組み上げるのって、かっこいいしすてきなことだとおもいませんか？
しかも、何より夢があります。
私はそう思いながら今日も自作OSの開発を続けます。
Jira Automationで定期的にタスクを起票、そして編集する


この記事は[**セゾン情報システムズ Advent Calendar 2021**](https://qiita.com/advent-calendar/2021/sisco) 9日目の記事です。


Jiraでタスク管理を行っていると毎週同じ作業があって忘れないようにチケットを切ることが良くあります。
その際、毎週同じチケットを作成するのは面倒くさいし、そもそもチケットを切っておくことを忘れたりすることがあるのでJira Automationで自動化してみました。

### 手順は簡単
Jiraのプロジェクトから「プロジェクト設定」⇒「自動化」へ遷移し、ルールを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/7a6ef5a9-da13-8478-c9ba-1e0be48a971e.png)

今回は毎週同じ時間に作成したいので「スケジュール時」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/61ed2593-31b3-9511-0eb8-05b0a48c37ab.png)

こんな感じで設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/d73f2ac0-a4c8-707a-1aee-67d650a3af8c.png)

アクションは「課題の作成」を選択し、必要なフィールドを入力
この際、期日に```{{now}}```を設定しておくとその日が期日となるのでボードやフィルターを使っているプロジェクトであればひっかけてリマインドすることも可能ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/e2267179-62b1-d8f0-c01c-62a0a9646df3.png)

これで必要最低限は完成ですが、今回は作成したばかりの課題を【TODO】から【進行中】にトランジションしておきたいと思います。
本題とはズレますがこれは私のチームではボードを使ってタスク管理をしており、毎朝ミーティングで今日行う作業を【進行中】に移動する運用を取っているからです。

Automationの中で作成した課題に対して操作を行うためには少し工夫が必要です。
シンプルに以下のフローを作成しても新規作成された課題のトランジションは行われません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/3d0872c5-d6f7-1783-12b7-d665cb5865af.png)

これは、ルールのメインブランチが、作成された課題ではなく、トリガーの課題に常に適用されるためです。たとえば、「課題の作成」アクションの後に「課題に関するコメント」アクションを追加すると、作成された課題ではなく、トリガーの課題にコメントが追加されます。
詳細は公式ドキュメント参照⇒https://support.atlassian.com/cloud-automation/docs/jira-automation-branches/

なので「課題の作成」アクションの後には「新しいブランチ」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/da920c53-273e-a32c-bb2b-67afd369ca22.png)

そしてブランチで対象とする課題は「最も最近に作成された課題」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/61b693a5-10c4-8315-45bf-8d27e593de11.png)

ブランチの中でトランジションのアクションを実行します。
最終的には以下のようなフローになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/37062b6a-2aa1-4cf2-3029-303e704799ae.png)

完成です！
mq エイリアスキュー

define QALIAS(QA.XXX) TARGET(QC.XXXX) 

エイリアスキューは自分側に作って
ターゲットキューは相手側にあるキュー名を指定する。
※チャネルは別で作ってあること前提
※MQクラスタ環境ではこれで作成するみたい
Webex Messaging でMarkdown記法を利用しよう！

この記事は、Webex Advent Calendar 2021の9日目 💫 として投稿しています。
Webex Advent Calendar 2021: https://qiita.com/advent-calendar/2021/webex

# 前置き
昨今のテレワークの普及により、
メールやチャットをはじめとする非同期コミュニケーションの重要性に気づき始めた私です。
電話や会議のような同期コミュニケーションも依然として欠かせないものではありますが、
会話の履歴を残せたり、中断されることなく作業に集中ができたり、時差がある相手ともやりとりができたり・・・非同期コミュニケーションには良いところがたくさんありますね。
個人的には、特にチャットは仕事に必要不可欠なものになりました。

ところで、非同期コミュニケーションでは表情や声のトーンを使わずに、文字だけで情報を伝える必要がありますね。
ですから、相手にとってわかりやすいメッセージであることが非常に大切ですよね。
本稿では、Webexのビジネスチャット  **「Webex Messaging」** でより読みやすいメッセージを作成するコツの１つである、 **Markdown記法** をご紹介します～！
少しの工夫でグッと、相手に伝わりやすくなりますよ👍

# まずはじめに
まずは以下の手順でマークダウン記法を有効にしましょう。
もし"M↓"アイコンが出ていなければ、マークダウン記法は有効になっていないので有効化が必要です。

1. "書式 Text"アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/3a04bd41-84d4-756b-13bd-0ab298b69a92.png)

1. 「マークダウン有効」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/a43d4b0a-2dfb-58d8-6f9a-cd445301ac51.png)
 
1. "M↓"アイコンが表示されていれば、マークダウン記法が有効になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/835abe34-1227-6a15-c8da-570a5a2125af.png)


# 1. 見出し
行頭に`1-6個の半角シャープ+半角スペース`を書きます。
イベントの告知など、情報の多い文章では積極的に見出しを活用してメリハリをつけましょう。

記述例

```
# 見出し
## 見出し
### 見出し
#### 見出し
##### 見出し
###### 見出し
```

表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/ea62c25c-8b55-5961-e395-bbfac4c9ed6d.png)

# 2. 太字
前後に`半角アスタリスク`を２つずつ付けます。
長い文章の場合、キーワードは太字で強調しましょう。

記述例

```
なんと！**太字**もできます！
```

表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/68885151-7b59-6471-1cfe-8e1e9c70dc58.png)


# 3. 引用
行頭に`半角大なり+半角スペース`を書きます。二重引用なんかもできます。ご存じでしたか？
他人の発言と自身の発言を区別することができます。

記述例

```
> 引用
>> 引用の引用
>>> 引用の引用の引用
```
表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/d9ce2466-5af1-ba24-3f2f-98547f84d935.png)

# 4. ハイパーリンク
` [表示文字](URL)` 形式でハイパーリンクを作れます。
長ったらしい共有リンクをそのまま送ると見づらいですよね。

```
[Webexアドベントカレンダー](https://qiita.com/advent-calendar/2021/webex)
```
表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337931/83d5b4af-607d-0145-f8dd-126d6d420b33.png)

# 最後に
最後まで読んでくださりありがとうございます！
ぜひ今日から使ってみてくださいね🤗
ビジネスチャットの場合は、絵文字を効果的に使うとか、
アイコンをキャッチ―な画像にすることも大事かな～と思います💡アイコンなしの人、ウン十年前の画像の人、誰だかわからないのでアップデートしてくださ～い！



# 免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、私の所属する組織の意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、私の所属する組織や他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任から私の所属する組織を免責することに同意したものとします。
Macで文字の範囲選択、逆スラッシュの出し方

![スクリーンショット 2021-12-08 22.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/3087590f-a056-b64f-9b12-03b82e1f8044.png)

久しぶりの投稿、Google ColaboratoryでPythonを始めた。
その中で改行したいけど逆スラッシュが出せなかった。

解決法は option + ¥　を押すと逆スラッシュになる。

![スクリーンショット 2021-12-08 22.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/3d1555ff-b565-697b-0f57-39734bc1cc36.png)

また文字を範囲で選択したい時トラックパッドでやるのは面倒なので、キーボードでもできることを知った。

これはShift + 矢印キーの右左を押せばできる。
![スクリーンショット 2021-12-08 22.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2284920/a2bdc812-d071-d882-c881-b924f773a88c.png)

また範囲選択した状態で’や”や（）　などがその範囲で入力できるのでいちいち戻って入れる手間が省ける。
SmbFileでハマった話（Java）

#SmbFileでファイル共有認証が通らない。（Java）
最近、WindowsのSMB（共有フォルダ）のファイル操作で使ったSmbFileでハマったので、需要なさそうだけど残します。

SMB（共有フォルダ）のファイル操作を行いたいときに使おうとしたjcifsのSmbFile。
使い方としてはJava標準のFileクラスと使い方はほぼ同じです。
とはいえFileクラスをラップしてたりするわけではなく、全く関係ないので注意です。

初案件で右も左もよくわかってない初心者向け。
#パスにユーザ名、パスワードを含めるやり方

```
　String rootPath = "smb://ユーザー名:パスワード@サーバー名/共有フォルダ名/"
　SmbFile file = new SmbFile(rootPath);
```
これでいけると思いきや、ユーザ名またはパスワードが不正といわれる。

もしかして、Active Directoryのドメインが抜けているから認識されない？

```
　String rootPath = "smb://ドメイン名;ユーザー名:パスワード@サーバー名/共有フォルダ名/"
　SmbFile file = new SmbFile(rootPath);
```

ドメイン名追加したらうまくいきました。

ローカルからアクセスするんだから、ユーザ名もいらないんじゃね？とか思いましたが、ちゃんとドメイン名まで必要になる。
Active Directoryでアカウントが管理されている場合は注意しましょう。

##その他
・Windowsだと「\」バックスラッシュでパスを区切りがちですが、「/」スラッシュなので注意。
・末尾には必ず「/」が必要。
・smb://はプロトコルです。https://みたいなイメージ。
　（ぼくは初めCドライブみたいなものかと思ってました。全然違います。）
・サーバー名はIPアドレスでもDNS名でも行けるらしいです。

##参考
・https://javadoc.io/static/org.codelibs/jcifs/2.1.3/jcifs/smb/SmbFile.html
[UiPath] バックグラウンドプロセスを急いでまとめてみた

この記事は、[UiPath Advent Calendar (produced with UiPath Friends)](https://qiita.com/advent-calendar/2021/uipath) の 8日目の記事です。

----

2019.10 から、UiPath のプロジェクトテンプレートに「バックグラウンド プロセス」というプロジェクトテンプレートが存在します。あまりこれを活用している事例を耳にしないので、記事にしてみました。

# バックグラウンドプロセスとは

公式ドキュメントによると、「1つのフォアグラウンド プロセスとともに、同じ Robot で並行して実行できるプロセス」とあります。いまいち分からないですね。

## フォアグラウンドプロセス

上記の説明の中に「フォアグラウンド」とあります。これは「最前面」「表面」「前景」という意味を持つ英単語ですが、ことIT用語としては「アクティブな状態である操作対象」と考えてください。
UiPath の世界では、フォアグラウンドプロセスは「画面操作が含まれるプロセス」と表現することが出来ます。多くの方が自動化で作成するプロセスのことですね。
そしてバックグラウンドプロセスとは、この「フォアグラウンド プロセス」の対義語です。すなわち「画面操作が含まれないプロセス」と捉えてください。ここでのポイントは、「UiPath による画面の操作がないこと」です。

## フォアグラウンドプロセスの制約

さて、数多ある業務（＝プロセス）を同時に作業できれば、作業効率としては素晴らしいですよね。
ところが Windows には、ひとつのログオンセッションにおいて複数のUI操作を同時に出来るような仕組みはありません。したがって画面操作を含む処理というのは、同時に実行することが出来ません。
これがために、UiPath においても一度に実行できるプロセスは1つのみとなっています。

## 制約からの解放

上記の説明を改めて確認しましょう。「画面操作を含む処理」は同時に実行できません。逆を返せば、画面操作を含まない処理は同時に実行できる、ということになります。
今まで UiPath では、プロセスが画面操作を含むか否かを判別していませんでしたので、そのプロセスが同時実行できるもの（画面操作を含まないもの）であっても、同時に実行することは出来ませんでした。
これが 2019.10 以降では、画面操作を含まないものであることを明示することが出来るようになり、ついては同時実行ができるようになったのです。

# バックグラウンドプロセスのメリット

バックグラウンドプロセスのメリットを、私は以下のように捉えています。

## 複数のバックグラウンドプロセスを同時に実行できる

これまでのご説明でご理解いただいているかと思いますが、バックグラウンドプロセスは複数のプロセスを同時に実行させることが出来ます。
また説明にもあるように、バックグラウンドプロセスが動いている状態であっても、フォアグラウンドプロセスは実行することが可能です。

## 常駐タスクとして運用することが可能

画面操作が含まれず、ひとの作業を阻害しない状態で実行ができます。したがって、一定条件でループ処理を組んで、継続的に実行させることが出来ます。

# まとめ

「画面操作を含まない処理」というのは、さほど多くないかもしれません。しかしメリットを活かすことで実現できることはたくさんあると思います。ぜひアイデアを出して、実際に試してみてください。
CakePHPで、save()はtrueなのに保存できない問題について


# はじめに

　今回、CakePHP4で色々やっている中で、save()メソッドでtrueが返ってくるのに何故か実際にデータは
保存できていないという事象に至りました。

　あくまで私の環境下での原因ですが、備忘録として記録いたします。
　なお、コードはサンプルなので例外処理等不要な記述は省いています。

## 前提（今回のコード）
　form内に複数ボタンを設置しなければいけない事象があったため、<button>にvalueを持たせ、条件分岐をしていました。
サンプルとして、以下の感じになります。

```index.php

<?= $this->Form->create($entity, ['url' => ['controller' => 'Sample', 'action' => 'index']]) ?>
    // フォームの内容

    <?= $this->Form->button('',['type' => 'submit', 'name' => 'buttonType', 'value' => 'create']) ?>
    <?= $this->Form->button('',['type' => 'submit', 'name' => 'buttonType', 'value' => 'delete']) ?>
<?= $this->Form->end() ?>
```

```SampleController.php
public function index()
{
    /** 初期表示メソッド **/

    if($this->request->is(['post', 'put'])){
        $request = $this->request->getData();
        $buttonType = $request['buttonType'];
         // buttonの名称によってメソッドの切り替え
         switch($buttonType){
             case 'create':
                 return $this->create($request);
             case 'delete':
                 return $this->delete($request);
             default:
                 return $this->redirect([
                     'controller' => 'Error',
                     'action' => 'index'
                 ]);
         }
    }
}

public function create($request)
{
    $entity = $this->Model->newEntity($request);
    
    if($entity->hasData()){
        return $this->redirect($this->referer);
    }

    if($this->Model->save($entity)){
        dd('保存成功');
    }else{
        dd('保存失敗');
    }
}

public function delete($request)
{
    // 削除
    $this->Model->delete($request['id']);
}
```

## 事象
冒頭やタイトルでも記述しましたが、何故か「保存成功」と出るのに、DBを見てもデータはない・・・
という状態でした。

## 解決法
今回の事象については、以下の対処で解消することができました。
**Before**

```index.php
return $this->create($request);
```
**After**

```index.php
$this->create($request);
break; // switch文の中のため
```
はい、たったこの１行でした。
保存するメソッドを`return`で呼び出ししていたのがダメだった理由でした。
本質的な原因が突き止められていないので、「なんか動いた」という恐怖な状態です・・・。


原因がわかる方がいらっしゃればご教授願います。
後日私自身で原因が突き止められたら記事に追記させていただきます。
Raspberry pi picoで作るVGAシステムコンソール

#はじめに
　シリアルポートを介して制御するシングルボードコンピュータを利用していると、キーボードとモニターを直接接続して作業したいときがあります。このような作業の際に用いる、キーボードでの入力とモニターでの出力表示を可能にする機器を、シリアルコンソールとよびます[^1]。これまでにPICやAVR等のマイクロコントローラを利用したシステムコンソールが知られています[^2]。一方、Raspberry pi pico（以降、pico）を使用した例は、2021年10月頃まで知りませんでした。

[^1]: https://ja.wikipedia.org/wiki/コンソール
[^2]: 例えば、https://hackaday.io/project/165325-uterm

#RC2014 Pi Pico VGA Terminal
　2021年11月に、シングルボードコンピュータのRC2014にUSBキーボードとVGAモニタを接続可能にする「RC2014 Pi Pico VGA Terminal」（以降、VGAターミナル）が公開されました[^3]。

https://z80kits.com/shop/rc2014-pi-pico-vga-terminal/

https://rc2014.co.uk

　このVGAターミナルにプログラムを書き込んだpicoを搭載して使用することで、キーボード入力とVGA出力が可能になります。
　VGAターミナルの配線は公開されており[^4]、公開情報によると、PCBはRC2014専用に設計されていますが、Raspberry pi用のVGAアダプタ（以降、Gert VGA 666）[^5]やPimoroni Pico VGA Demo Base（以降、VGAデモボード）[^6]を使うことでもVGAシリアルターミナルを作製することが可能だとわかりました。

https://github.com/fenlogic/vga666

https://shop.pimoroni.com/products/pimoroni-pico-vga-demo-base

[^3]: https://rc2014.co.uk/modules/pi-pico-vga-terminal/ 
[^4]: https://rc2014.co.uk/wp-content/uploads/2021/11/Pi-Pico-VGA-Terminal.pdf
[^5]: https://github.com/fenlogic/vga666
[^6]: https://shop.pimoroni.com/products/pimoroni-pico-vga-demo-base

#Picoterm
　Pico用のプログラムは、picotermとして、gihubで公開されています[^7]。公開されているものはソースファイルとUF2ですので、目的に合致したUF2ファイルをpicoにコピーすることで、すぐに利用することが可能です。キーボードの種類として、USとUKの設定から選択でき、画面に表示される一行の文字数として、カラー表示の40文字と、白黒表示の80文字の設定から選択できます。

https://github.com/RC2014Z80/picoterm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/14bfc7bf-0e0d-b5de-0953-b712c3f49f9f.png)
図．（左）カラー表示一行40文字、（右）白黒表示一行80文字

[^7]: https://github.com/RC2014Z80/picoterm

#Pimoroni Pico VGA Demo BaseでVGAシステムコンソール
　picotermでは、TXをpicoのGP20に、RXをGP21に設定しています。VGAデモボードでは、GP20とGP21、GNDが基板上にスルーホールとして用意されているので、これらのスルーホールを使って、シングルボードコンピュータに接続可能です。
　一つ注意しなくてはいけないのが、GP21のRXには3.3 Vより大きな電圧のものを接続できない点です。VGAターミナルでは、10 kΩと22 kΩの抵抗で作製した分圧回路を介して接続するようになっています[^4]。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/24c401b7-2eff-cf7c-4dae-14a8fd4317cb.png)
図．VGAデモボードのRX、TXの場所。白地に黒の横棒はGND


#Gert VGA 666でVGAシステムコンソール
　picotermのVGA出力は、RGB555なので、配線が大変ではあるものの、手元にRaspberry PiのGPIO端子に接続可能なGert VGA 666をpicoに接続してVGA出力が可能です。手元にGert VGA 666がある場合にお勧めです。
　この組み合わせでも、RXであるpico本体のGP21は3.3 Vより大きな電圧のものを、直接接続できないので注意してください。

![IMG_20211208_2156212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/ed03ad85-6952-7c82-89b0-46d400006360.jpeg)
図．RGB用に左側のpicoに右側のVGA666の端子を接続。この後に、GNDとTX、RXの配線を行う。

#おわりに
　今回のpicoの出力では、RGB555を選択していましたが、RGB222での出力にすると、画像出力に占有される端子数を減らせます。またVGA出力だけでなく、HDMI出力やコンポジット出力も可能なので、様々な出力形式に対応できるかと思います。
db2 


基礎コマンド
https://ameblo.jp/mubo-vi/entry-11891136857.html

REORG (データの再編成)
http://db2.blog.jp/archives/57949137.html

runstatsの確認
http://db2.blog.jp/archives/58066667.html

 db2 get db cfg for DB名

自動保守                                   (AUTO_MAINT) = ON
   データベース自動バックアップ         (AUTO_DB_BACKUP) = OFF
   表自動保守                           (AUTO_TBL_MAINT) = ON
     自動 RUNSTATS                       (AUTO_RUNSTATS) = ON
       リアルタイム統計                (AUTO_STMT_STATS) = ON
       統計ビュー                     (AUTO_STATS_VIEWS) = OFF
       自動サンプリング                  (AUTO_SAMPLING) = ON
       自動列グループ統計 (AUTO_CG_STATS) = OFF
     自動再編成                             (AUTO_REORG) = OFF
Vue Routerのインストール（Vue3）

## 内容
Vue3でVue Routerを導入する手順。
Viteで作成しているアプリケーションに、npmで途中から導入するときの手順。
[「Vite」を使用してVueプロジェクトを立ち上げる](https://qiita.com/tarian/items/f7b444aebb97a41a8478)

## 目次
- [VueRouterのインストール](#VueRouterのインストール)
- [ページに使うコンポーネントを用意](#ページに使うコンポーネントを用意)
- [router\.jsの作成](#router\.jsの作成)
- [main.jsにrouterを読み込む](#main.jsにrouterを読み込む)
- [App.vueを作成する](#App.vueを作成する)
- [画面確認](#画面確認)


## VueRouterのインストール

Vue3に対応するVue Routerは、Ver.4以降。

```bash
npm install vue-router@next
```

## ページに使うコンポーネントを用意
例）HelloWorld.vueとHelloJSX.jsxを作成

```vuejs:HelloWorld.vue
<template>
  <div class="alert alert-primary">
    <h1>{{ data.title }}</h1>
    <p class="mt-3 h5">{{ data.msg }}</p>
  </div>
</template>
<script>
import { ref, reactive } from 'vue'
export default {
  name: 'HelloWorld',
  setup(props, context) {
    const data = reactive({
      title: 'HelloWorld',
      msg: 'This is HelloWorld component.'
    })
    return {
      data
    }
  }
}
</script>
```

```jsx:HelloJSX.jsx
import { ref, reactive } from 'vue'
export default {
  name: 'HelloJSX',
  setup(props) {
    const data = reactive({
      title: 'HelloJSX',
      msg: 'This is JSX component sample.',
    })
    return () => (
      <div class="alert alert-warning">
        <h1>{data.title}</h1>
        <p>{data.msg}</p>
      </div>
    )
  }
}
```


## router\.jsの作成

`src/router.js`　を作成

```js:src/router.js
// まずはimport文でVueRouterから必要な関数などを用意する。
// ルーティングで割り当てるコンポーネント類も用意しておく。
import { createRouter, createWebHistory} from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
import HelloJSX from './components/HelloJSX.jsx'

// メモ
// export 値 で、そのスクリプトファイルをimportした時に指定の値が取り出せるようになる。
// routerオブジェクトは、スクリプトを作成後、Vue3のアプリケーションに組み込む必要がある。
// このため、exportを使ってrouterオブジェクトが外部から利用できるようにする。
export const router = createRouter({
  // createRouterの引数のオブジェクトにhistoryとroutesという値を用意する
  history: createWebHistory(),
  routes: [
    {
      path: '/',             // 割り当てるパス
      name: 'index',         // 名前
      component: HelloWorld, // 割り当てるコンポーネント
    },
    {
      path: '/jsx',
      name: 'jsx',
      component: HelloJSX,
    }
  ]
})
```

## main.jsにrouterを読み込む

```js:main.js
import { createApp } from 'vue'
import App from './App.vue'
import './index.css'
import { router } from './router' // routerオブジェクトをインポート

// routerをアプリケーションに組み込む
createApp(App).use(router).mount('#app')
```

## App.vueを作成する

```vuejs
<template>
  <div id="app">
    <div>
      <router-link to="/" class="btn btn-primary mx-2">
        Go to Top
      </router-link>
      <router-link to="/jsx" class="btn btn-warning">
        Go to JSX
      </router-link>
    </div>
    <hr>
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  name: 'app',
  created() {
    console.log('** App Created!! **') // createの確認用
  },
  mounted() {
    console.log('-- App Mounted!! --') // mountedの確認用
  },
  data() {
    return {
      title: 'Router'
    }
  }
}
</script>
```

## 画面確認

```bash
npm run dev # 開発中ですでにサーバーが立ち上がっている場合は、⌃cで一度停止して再立ち上げする
```
AtCoderで茶色になりました

# 1.はじめに
こんにちは。現在スタートアップでFlutterエンジニアをしているAosanoriと申します。最近就活のコーディングテスト対策としてAtCoderをやっていこうと思いました。先日のABC230で入茶してここまでを振り返りたいと思ったのでこの記事を書くことにしました。プログラミング経験者でAtCoderを始めてとりあえず茶色に到達したいなと思っている方にとって参考になれば幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324069/077497ea-65de-9d3c-3cff-144495673d13.png)

# 2.茶色になるまでにやったこと

### 毎週ABCに参加する
コンテストに参加しなければレートは上がらないのでできるだけ毎週参加することが茶コーダーになる一番の近道だと思います。コンテスト中に解けなかった問題を復習することも大事です。何回か出ていれば失敗することもありますが、気にせずに出続けましょう。

### AtCoderProblemsのMediumを埋める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324069/b9881432-61bd-e141-3d37-973c555a4fb7.png)

自分は教科書を読んで理解するタイプではなく問題を解いて体で覚えるタイプなので、ひとまず自分のレベルに合った問題を解くことが先決と考えました。そこで[AtCoder Problems](https://kenkoooo.com/atcoder/#/)のヘッダーの右上にちょこんと佇んでいる[Boot camp for Beginners](https://kenkoooo.com/atcoder/#/training)からMedium 100をできるだけ埋めようと頑張りました。自力で解けなかった問題は解説を読んで自力でACできるまで頑張りました。また自分は頭の回転が遅く、早解きは苦手なので爆発力を高めるために早いうちからアルゴリズムを知ってないと出来ないような問題にも手をつけていました。

### [けんちょん本](https://www.amazon.co.jp/%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/4065128447)を読む
この本はこれからAtCoderを本気で始めようとしている方にはお勧めです。基本的なアルゴリズムが初心者でも理解できるように解説されているので勉強が捗ると思います。ですが茶diffではアルゴリズムを知っていないとできないような問題は少ないなと感じたのでAtCoderProblemsのMediumを埋める方が優先順位は高いなと思いました。

# 3.茶色になった時点の記録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324069/584b5706-7fb4-17cd-1ad3-aa6d14db06bc.png)

自分は1日1ACを守っていたのでLongest Streakが長くなっていますが茶色になる上でそれはあまり重要ではないのかなと思いました。ですが少しでもいいから無理しない範囲で継続することが茶コーダーになる一番の近道だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324069/6660e939-94b2-45b8-a097-c9ef4e412439.png)

元々自分でアプリを作ったことがあり基本的なプログラミングの文法は知っていたので、あまり灰diffは解かず茶diffを中心に演習を行なっていました。茶色になるためにはABCのC問題まで解ければいいので、ある程度プログラミングの文法が慣れている方は早めにCの難易度帯である茶diffを解くことがいいのかなと思いました。


# 4.ここまでを振り返って
茶色になるまでの約90日は色々な記事やサイトを参考にしながら毎日勉強してきたのであっという間に過ぎてしまいました。勉強していく中で今まで解けなかった問題が時間を置いた後に再チャレンジをしたら解けたり、今回のABCがそうなんですが初めて4完できたりした時の達成感は凄まじいものです。自分が成長しているのがはっきり分かるこの感覚がAtCoderにハマる要因の一つかなと思いました。またアルゴリズムや数学的発想を用いた問題を解くことは自分の中では楽しいのでこのまま楽しく続けられたらなと思いました。


# 5.最後に

このままの調子で緑コーダー、最終的には水色コーダーを目指して精進していきたいと思います。
あと[Twitter](https://twitter.com/Aosanori620)もやってるのでフォローお願いします！
質問やアドバイス等ありましたらコメントしていただけると幸いです。
駄文ですがここまで読んでいただきありがとうございました。


# 6.参考
  - [AtCoder Problems](https://kenkoooo.com/atcoder/#/)
  - [AtCoder](https://atcoder.jp/home)
【Unity】アセットをラベルで整理しよう

この記事は[Unity始めた頃の自分に教えたい ゲーム開発のテクニック【スタジオしまづ 】 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/studioshimazu_unity_tips) 13日目の記事です。

アセットの管理機能の一つにラベルがあります。
これはアセットにタグ付けをして、タグごとに一覧表示できる機能です。
アセット導入時に設定をしておくと、**アセットのフォルダを辿ることなく**目的のものを見つけることができます。


# ラベルの設定方法
まずはアセットを導入します。今回は[POLYGON Starter Pack](https://assetstore.unity.com/packages/3d/props/polygon-starter-pack-low-poly-3d-art-by-synty-156819)という3Dモデルアセットを使い、ラベルでアセット内の建物プレハブを一覧表示できるようにします。

導入後、ラベルをつけたいオブジェクトをまとめて選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/559a42ff-e168-3755-4b16-1ab0d4bebfd8.png)
まとめて選択した状態で、インスペクタ右下のタグマークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/b0110383-1f65-c69e-5065-850caa5b879c.png)
ラベルの一覧から任意のものを選択します。（今回は`Architecture`を選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/cab0da3b-cb4c-c763-ff43-df99d68b5dda.png)
少し待つと選択したオブジェクトにラベルが設定され、インスペクタ下部にラベル名が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/5eddb408-9d2c-585a-2028-62d584d3be70.png)
また、ラベルは複数つけることができます。（設定方法は同じ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/968544f5-26a2-e5a3-c107-13bcf6d29ff5.png)
## オリジナルのラベルの設定方法
独自の名前のラベルを付けることもできます。

- 先ほどと同様、オブジェクト選択後にインスペクタ右下のタグマークをクリックします。
- ラベル一覧上部の検索欄につけたいラベル名を入力し、Enterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/7bf9ce07-c24f-bb90-677d-e190a6b3d683.png)

以上でラベル設定は完了です。

# ラベルを使った検索方法
- プロジェクトビュー右上にあるタグマークをクリックします。
- ラベルの一覧が表示されるので、目的のラベルを選択してください。
  - 一覧に目的のラベルがない場合は上部の検索欄にラベル名を入力して検索してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/723f4a45-ee60-15d0-593a-d5106640bd20.png)
ラベルを選択すると該当ラベルがつけられたオブジェクト一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938939/795062a0-b194-292e-ebf3-0ce48e66acd2.png)

ラベルを付けると、プロジェクトビューで**フォルダーを移動することなく**アセットにたどり着けるので、アセットインポート時に合わせて設定しておくと開発がはかどると思います。

# ラベル設定が面倒な場合
コードを書かなければいけませんが、Editor拡張を作っておくとラベル設定が自動化できると思うので、挑戦してみるのもアリだと思います。
https://zenn.dev/crowiin/articles/9603079d38e34c
適切なHTTPステータスコードを返そう

サーバサイドの処理でクライアントからのHTTPリクエストを所望の通りに捌けていないにも関わらず `200` を返していませんか？例えば、要求したリソースが存在しない場合は `404` を返すべきですが、ここでbodyに `Not found` というメッセージを入れてステータスコードを `200` にするなどしてレスポンスを返してしまうと **ソフト404** と呼ばれます。

# ソフトXXXの問題点

このようなステータスコードの返し方をしてしまうとクライアント側は混乱させられてしまいます。あるAPIのSDKクライアントを作成する場合を考えましょう。クライアント側の入力に不備があり本来なら `400` が返ってくるところで `200` が返ってきたとします。本来ならこれはクライアント側のミスなのでSDKクライアントでエラーを出すべきですが、それをするためにはレスポンスのメッセージを読んで処理を分岐させる必要が出てきます。これでは無駄な実装が発生してしまいます。

ステータスコードはコードというように、わかる人にしかわからない、プロトコルという約束事の一部になります。

# I'm a teapot

次のようなケースではどうでしょうか。
ここでサーバはティーポットです。クライアントから「コーヒーを入れてくれ」というHTTPリクエストが飛んできたときに、サーバはどのステータスコードを返すべきでしょうか。

`418` ですね。これが `5xx` ではないのはなぜかというと、ティーポットに対してコーヒーを要求するのは間違っているからでしょう。もしサーバがコーヒーとティーの複合ポットであり、一時的にコーヒーが提供できない場合は、代わりに `503` を返すべきとされています（Service Unavailable）。これはクライアント側に問題があるのではなく、サーバ側に問題が生じていたためにリクエストを処理できなかったので `5xx` が返ってきているということになります。

このようにHTTPステータスコードでは100の位の値により情報を分類し階層性を持たせています。このような性質があれば、クライアント側の実装ではHTTPステータスコードの先頭一桁の値を見るだけで処理を分岐させることもできるでしょう。

# コード

ステータスのようなコードは何もHTTPで使われるだけではありません。MySQLのエラーコードだったり、IPアドレスのような識別子だったり、これらもコードと言えます。

普段のプログラミングではあまり縁がないと思われるかもしれませんが、関数の戻り値としてBool型ではなく列挙型を使うことはあるでしょう。これは2パターンからNパターンのコードへの拡張であり、情報量が増えるのできっといいことがあるに違いありません。

というわけで、かくいう私も適切なインターフェース設計ができるようになりたいと思っているのでした。

# 参考

[HTTPレスポンスステータスコード](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)
【Flutter/Dart】Cannot provide both a color and a decoration　のエラーの解決策


### 環境

```dart
-> %  sw_vers
ProductName:    macOS
ProductVersion: 12.0.1
BuildVersion:   21A559

```

```dart
-> % flutter --version
Flutter 2.5.3 • channel stable • https://github.com/flutter/flutter.git
Tools • Dart 2.14.4
```

### 実装したかったこと


![スクリーンショット 2021-12-08 21.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565338/448cf957-4fc2-10b7-10c9-04a94dcdfb58.png)


このような角丸で背景色のあるWidgetを作成したい🔵

### エラー文

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565338/d106cc44-3877-f865-720e-a55928d0cc28.png" width="320px">

```dart
════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building Practice(dirty):
Cannot provide both a color and a decoration
To provide both, use "decoration: BoxDecoration(color: color)".
'package:flutter/src/widgets/container.dart':
package:flutter/…/widgets/container.dart:1
Failed assertion: line 274 pos 15: 'color == null || decoration == null'

```
### エラーが発生した際のコード


```dart
class Practice extends StatelessWidget {
  const Practice12({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: 
          Container(
            color: Colors.blue,
            width: 100,
            height: 100,
            decoration: BoxDecoration(borderRadius: BorderRadius.circular(16)),
          ),
    );
  }
}
```
### 修正したコード


`To provide both, use "decoration: BoxDecoration(color: color)".
'package:flutter/src/widgets/container.dart':`

ということで、答えはエラー文に書いてありました☺️

ContainerクラスのcolorプロパティとBoxDecorationを併用するのはうまくいかなそうなので、
代わりにBoxDecorationクラスのcolorプロパティを使用するように変更することで意図したWidgetが実装できました！

```dart

class Practice extends StatelessWidget {
  const Practice({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child:  Container(
            width: 100,
            height: 100,
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(16), color: Colors.blue),
          ),
    );
  }
}

```
【Vonage】Voice API開発のJWTの生成とデータセンターの設定を学ぶ


#JWT生成

Vonage Voiceでは [JWT認証](https://developer.vonage.com/ja/concepts/guides/authentication#jwts) を使用します。
ユーザー作成やクライアントSDKのNexmoClientオブジェクトの初期化などで必要になります。

JSON Web Token (JWT) とは何？

https://magazine.techcareer.jp/technology/api/9126/

##VonageのJWTはユーザー用とAdmin用が存在する

以下のようにクレームを使い分けます。

###ユーザー用クレーム

```
{
  "iat": 1532093588,
  "jti": "705b6f50-8c21-11e8-9bcb-595326422d60",
  "sub": "user_name",
  "exp": "1532179987",
  "acl": {
    "paths": {
      "/**": {}
    }
  },
  "application_id": "aaaaaaaa-bbbb-cccc-dddd-0123456789ab"
}
```

###Admin 用クレーム

```
{
  "iat": 1532093588,
  "jti": "705b6f50-8c21-11e8-9bcb-595326422d60",
  "exp": "1532179987",
  "application_id": "aaaaaaaa-bbbb-cccc-dddd-0123456789ab"
}
```

ユーザー用で存在していたsub（ユーザー名指定）と [acl](https://developer.vonage.com/ja/conversation/guides/jwt-acl#acls) が不要となります。

JWTは [JWT Generator](https://developer.vonage.com/jwt) をはじめ、[Server SDK](https://developer.vonage.com/ja/conversation/guides/jwt-acl#node) を使って生成できそうです。
作成したJWTは[ここ](https://jwt.io/)でデコードして、期待したクレームが存在するか確認できます。

###参照記事
JWTの生成方法

https://developer.vonage.com/ja/conversation/guides/jwt-acl

Vonage API オンラインツールを使用して JWT を生成する

https://developer.vonage.com/ja/concepts/guides/authentication#using-the-vonage-api-online-tool-to-generate-a-jwt



#データセンターの設定

##5つのデータセンターが存在する
Vonageでは、[5つのデータセンター](https://developer.vonage.com/ja/client-sdk/configuration/configure-data-center/javascript#data-centers-available)を利用できます。
ワシントンDC(WDC)/ダラス(DAL)/ロンドン(LON)/シンガポール(SNG)/アムステルダム(AMS)
ただし、適切に設定されていないと、WebRTCブラウザ等で着信に応答できないことがあります。

###補足

WebRTCで通話する公式チュートリアルが用意されています。

https://developer.vonage.com/ja/client-sdk/tutorials/phone-to-app/introduction/javascript

自身で公式チュートリアルを触って得たことも共有しています。

https://qiita.com/kusunoyuta/items/197839d161e9715e3564

##あるはずの会話にAPIリクエストすると404が出た
こんな記事がありました。

https://help.nexmo.com/hc/en-us/articles/115015969628

サポートからの回答を要約すると

- 会話や通話は、発信地に応じて地理的なデータセンターに関連付けられる
- 米国のデータセンターに近い仮想番号への着信があった場合、会話は米国に存在する
- アウトバウンドのAPIリクエストがSNGのデータセンターに近ければ、会話はSNGに存在する

日本の電話番号からVonage番号に発信すると、会話はSNGに存在することになります。
クライアントSDKがSNG以外のデータセンターに設定されてるとWebRTCブラウザで応答しようとしても通話に接続できません。（2021年12月現在リージョン間の連携が取れてない）

WebRTCブラウザで応答する場合は、クライアントで使用するユーザーをSNGに作成し、クライアントSDKのNexmoClientオブジェクトにはエンドポイントをSNGに指定します。

###ユーザー作成（クライアントユーザー）

```
curl -X "POST" "https://api-sg-1.nexmo.com/beta/users" \
     -H 'Authorization: Bearer '$JWT\
     -H 'Content-Type: application/json' \
     -d $'{
  "name": "ユーザー名",
  "display_name": "表示用のユーザー名"
}'
```

https://developer.vonage.com/ja/conversation/code-snippets/user/create-user

###NexmoClientオブジェクト初期化
```
const nexmoClient = new NexmoClient({
  nexmo_api_url: "https://api-sg-1.nexmo.com",
  url: "wss://ws-sg-1.nexmo.com",
  ips_url: "https://api-sg-1.nexmo.com/v1/image"
});
```

Client SDK NexmoClient オブジェクトを作成し、URL (エンドポイント)を指定する

https://developer.vonage.com/ja/client-sdk/configuration/configure-data-center/javascript#configuration
『初心者卒業！』初級から上級までのswift用語集!


#はじめに
#####swiftとは
・Apple社が2014年に発表したiOSおよびmacOS､Linuxで利用できるプログラミング言語
・2015年にOSS化
・現時点での最新Versionは4（正式リリース：2017年09月19日）
・コンパイラ言語（静的型付き言語とも言う）
・フロントエンド、バックエンドともに利用できる
・技術情報とコミュニケーションを目的としたカンファレンス「try! Swift」が毎年東京で開催されている

#初心者の自分が経験したこと
とにかくバグがうざい！笑バグの真なる脅威を感じたのはアプリの実機テストができる様になった段階の時。黄色のバグは最初のうちは見逃しがちだが、実機となると完全にデバッグしないときちんと正常に動作してくれない。あと、英語でバグの内容が書かれているのでみたことのあるバグは慣れで解決できるが、初めて見る難しいバグは対処不可能！そこから脱出するために私が実行した方法が、基礎に戻るということ。一つ一つの用語の意味を頭に完全に入れ切ることでバグを未然に防ぐことができるようになりつつある。

#用語集
・TableView(Swiftのdelegateの理解)
Swiftの独特のdelegateを自力で正しく扱えるか。

・AutoLayout
やや癖のあるAutoLayoutを自力で正しく扱えるか。

・SwiftUI
まだマストではないけど、必要！

・Alamofire, Moya (URLSession)
自力で扱えるようになりたい。始めたばかりの頃はclosureが難しい！

・Codable
せっかくならCodableも使えるようになりたい。

・Firestore
これを使って課題アプリを作る！初心者でもマッチングアプリが作れます。

・Realm (アプリ要件に合えば！マストでは無い)
扱いやすいローカルデータベース。API通信も別で挑戦してみたい。

・MVVM
綺麗にMVVMが組めていればそれなりに技術力があるように見える。

・RxSwift
RxSwiftを使うだけなら誰でもできるけど、MVVMなどのアーキテクチャと合わせて綺麗に扱えているかどうかがポイント。

・マテリアルデザイン/フラットデザインなどの理解
完全にマテリアルデザインに準拠する必要は無いけど、最低限のポイントは抑える必要あり。スキューモーフィズムの違いや変遷は抑えたい。

・適切なアニメーションライブラリの使用
正解は無いし、必ずしも必要ではない。あり過ぎても良く無い。
【NeosVR】カレンダーシステムを作ったお話　その１

#初めに
この記事は「[NeosVR #1 Advent Calendar 2021](https://adventar.org/calendars/6249)」の9日目です！
昨日は、銀鮭(@sirojake)さんの「[初心者案内に最適？NeosVRワールド紹介](https://note.com/sirojake/n/nb4e41c4456bd)」でしたω
NeosVRでの活動を発信していますので、Twitterフォローしてもらえると嬉しいですω
https://twitter.com/TewiEwi_no96

---
NeosVRの毎日の定期イベントに早朝の『NeosVRラジオ体操部』と夕方の『NeosVR健康体操』があります。
来た人に喜んでもらえるよう、写真付きで来た日が分かるカレンダーを作りましたので、解説をしていきますω
NeosVRでのモノづくりの参考になればな～って思います。

この記事は二部構成で、第一部ではカレンダー機能、第二部ではAPI周りを解説します。
![E0a5tJbUcAE4UBt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556177/2d8e41db-d212-a360-a2c9-2db7c16890b6.jpeg)
#必要知識
・DevToolTip(https://neosvrjp.memo.wiki/d/DevToolTip)
・LogiX(https://neosvrjp.memo.wiki/d/LogiX)
・UIX(https://neosvrjp.memo.wiki/d/UIX)
・GoogleAppsScriptでAPI作成(https://zenn.dev/ginjake/articles/7aca7599599a72) (※第二部)

#カレンダーの機能
・月が替わるとカレンダーが自動更新する
・どの日に出席しかユーザーごとに分かる(※第二部)
・集合写真を自動更新する(※第二部)
・スタンプを押すと外部にUser情報書込(※第二部)
・画像送信ボタンを押す外部に画像情報書込(※第二部)
・ワールド読込か更新ボタンで外部からUser情報と画像情報を読込、反映。(※第二部)
#インベントリー構成
基本的に名前はコンポーネント名になります。

Calender
┣Visual(EmptyObject)
┃┗Canvas
┃　┣Image
┃　┃┗VerticalLayout
┃　┃　┣Image
┃　┃　┃┗HorizontalLayout
┃　┃　┃　┣Text-Month
┃　┃　┃　┗Text-Year
┃　┃　┗Image
┃　┃　　┗VerticalLayout
┃　┃　　　┣HorizontalLayout(曜日)
┃　┃　　　┃┣Image
┃　┃　　　┃┃┗Text(SUN)
┃　┃　　　┃…
┃　┃　　　┃┗Image
┃　┃　　　┃　┗Text(SAT)
┃　┃　　　┣HorizontalLayout(第一週)
┃　┃　　　┃┣Image
┃　┃　　　┃┃┗Text(日数)
┃　┃　　　┃┃　┗(DayLogiX)
┃　┃　　　……
┃　┃　　　┃┗Image
┃　┃　　　┃　┗Text(日数)
┃　┃　　　┃　　┗(DayLogiX)
┃　┃　　　┗HorizontalLayout(第六週)
┃　┃　　　　┣Image
┃　┃　　　　┃┗Text(日数)
┃　┃　　　　┃　┗(DayLogiX)
┃　┃　　　　…
┃　┃　　　　┗Image
┃　┃　　　　　┗Text(日数)
┃　┃　　　　　　┗(DayLogiX)
┃　┗Image
┗Data(EmptyObject)
　┗DataTime
　　┗(DataTimeLogiX)
#LogiX
<b>・DataTimeLogiX</b>
以下のようにロジックスを組みDataTimeにパッキングします！
上からYear,Month,Dayのインプットです。
![20211208211215_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556177/cd5a449f-f0f5-87b9-ad49-bc1c84406a98.jpeg)
<b>・DayLogiX</b>
以下のようにロジックスを組みText(日数)にパッキングします！
インベントリーの構成からオブジェクトの位置を計算して日付を取得しています。
![20211208205306_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556177/b76d3758-58e0-7b89-3353-feb134883cd1.png)

#最後に
読んでくれて、ありがとうございます！
次はe1ght3の「LogiX開発を勉強するための覚書」です！
やらかしちまって自動販売機の前で泣いた話

こんにちは！入社3ヶ月目を迎えるザハです！こちらは金属加工プラットフォームを開発・運用するCatallaxyの[Catallaxy Advent Calendar 2021](https://qiita.com/advent-calendar/2021/catallaxy)の10日目の記事になります。9日目の記事はちいかわさんによる「[Reactではじめるキノコ狩り](https://qiita.com/catallaxy/items/17dc6327c10e2e3efc5e)」でした。

チャレンジングなアウトプットを虎視眈々と狙いながら、配属されたプロダクトでIssueをこなす毎日を過ごしていますが、いざ記事を書くとなると何を書いていいのやら。。。という訳で本日は、苦肉の策として、これまでの経歴でやらかしちまった&経験した話を赤裸々にお話ししたいと思います！

# 夏の秋葉原

遡ること2006年だか2007年だか、もはや昔過ぎて正確に覚えてはいませんが、レンタルサーバーが主流でサーバー操作をミスると、レンサバに電話して5000円払って、電源を入れてもらう時代の話です。はい、もちろん何度も電源リクエストしましたよ、それはもう。そんなわけで、ある時点からそういう煩わしさから開放されるためオンプレミスを選択し、会社で余っているパソコンにlinuxをいれてサーバーを運用していました。

あるクソ暑い夏の日のことです、出社するとサービスが利用できない！お客様からのクレームの嵐が待っていました。ブラウザからサイトを確認してみると、まあ504エラーですね。サーバーにsshしようもうんともすんとも言いません。こうなるとサーバーに直接ディスプレイを接続し確認するのですが、そもそもの電源LEDがついてない！！祈る思いで電源ボタンを押しましたが、まあ反応しないですよね、こういうケースは。。ハードに強いわけでもないので、とりあえず筐体を開けて、なんとなく確認するのですが、これはもう、なんてことでしょう、素人目にも見てもはっきりと分かるくらい一部のコンデンサーが、中身ハミ出すんちゃうという勢いで膨れ上がっているではありませんか。新米お一人様エンジニアだったので一大事です。もう電話から社内からやんやん言われて、もう好きにして状態。そうだアキバに行こう！アキバがなんとかしてくれる！10kgはあっただろうタワー型の筐体を抱えて電車に乗りアキバへ。真夏の炎天下の中、汗だくになりながら、パソコンショップをすがる思いでハシゴしました。今直してくれ今じゃないとダメなんだ！コンデンサ、コンデンサがーーー！！、とわけのわからない依頼をする客にお店の方もさぞ困ったことと思います。

まあ今日の今日は無理ですよね。ハンダごてとコンデンサを一つ買って帰り、ヤンヤン傍らハンダ付けしたものの、まあシンクロ率が悪かったのか動いてくれませんよね。そんなことできるのかと当時は思いましたが、結局余っているパソコンにOSを入れてHDD差し替えてサービス復旧ちゃんちゃんという話でした。今の時代であればスナップショットからvolume作ってインスタンス止めて差し替えるで済みますね。便利になったものです。

# 人質事件

時は変わって2016年。退職したエンジニアから引き継いだあるECサイトで起こった話です。GW明けの休みボケ甚だしい初日、事件は起こりました。これまた出社したらサービスが利用できないとのクレームの嵐。ただ今回は様子が違います！ブラウザで確認したところ目を疑いました。なんと商品が一つも表示されていません！！まあパニックですね。細かい調査経緯は忘れましたが、EC2でホスティングしていたMongoDBを見たときに唖然としました。

> Your DB is Backed up at our servers, to restore send 0.1 BTC to the Bitcoin Address then send an email with your server ip

ファッ！！！？？？すべてのデータは綺麗サッパリなくなっていて、bitcoinというcollectionが一つとその中に一行、メッセージが残されていました。はい、当時流行っていたランサムウェアです。原因はあまりにも簡単すぎるパスワードと、何よりびっくり、AWSのinboundのルールがなく、データベースがデフォルトポートでフルオープン。アカーーーーン！！幸い、直前のバックアップでリカバリし、犯人の要求に応えずに済みましたが、血の気が引きました。。。今、気になって調べてみましたが、当時のBTCの価値は5万円だったようなので、5000円の要求だったんかな。。安。

# ORM怖い

最後にORMについて小話を。。これまたとあるプロダクトである機能を実装し、確か顧客と営業担当者の履歴DBテーブルを作ったときの話です。このテーブルを直接コマンドラインから、削除を含む操作を行うツールを作ったのですが、テストを書かず手元で動作確認して、いざ実行してみたところ、思ったより時間が掛かりはしたものの、エラーもなくコマンドが終了したので、安堵していたのも束の間、はい、来ましたね。修羅場です。調べてみると該当テーブルのデータが綺麗サッパリなくなっているではありませんか！えっ、なんで！もうこれまたパニックですね。。。調べてみるとドキュメントにこうありました。。

> primary keyを指定しないstructでdeleteするとデータ消えるよ♡

すごい。。消えるよて。。引用しようと思いましたが、すいません。当時のドキュメントを見つけられませんでした。なので記憶から日本語で書きました。そんな感じだったかと。。言及した記事があったので、今はどうかわかりませんが、同じ思いをする人が出ないよう思いを込めて。。

[Gormが本番テーブルの数億件のデータを消そうとした話](https://scrapbox.io/keroxp/Gorm%E3%81%8C%E6%9C%AC%E7%95%AA%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E6%95%B0%E5%84%84%E4%BB%B6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B6%88%E3%81%9D%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E8%A9%B1)

オワタ、マヂカ。。バックアップからのリカバリ作業で胃の痛くなる一日でした。

# 終わりに

お前もっと気をつけろよ！という罵詈雑言を浴びそうな記事を書いてしまい戦々恐々としていますが、人間、失敗から学ぶものです。これ以来、バックエンドでは特にテスト書くマンになりました。。

年齢を重ねると昔話をしたくなるのは性でしょうか。最後までお読み頂きありがとうございます！

未来の工場を作るCatallaxyでは、自動販売機の前で泣いた方もそうでない方も、幅広くエンジニア採用の門戸を広げてお待ちしております！

[https://open.talentio.com/r/1/c/catallaxy/homes/2947](https://open.talentio.com/r/1/c/catallaxy/homes/2947)
リアルとロマンの話

## はじめまして

はじめまして。[株式会社ネッコス](https://neccos.jp/ "株式会社ネッコス")で、以下のような業務を担当している吉田と申します。

* バックオフィス業務
* 契約事務
* 営業補佐
* 要件整理

とにかくいろいろと補佐する担当です。縁の下の力持ち、本来は縁の下でこそ力を発揮するのですが、なんの因果か今回アドベントカレンダーなるハイカラなものに記事を書く役目を仰せつかりました。

自分はエンジニアではないので技術的な記事はまったく書けません。幸いなことに何を書いてもいいとのことだったので、技術・Technologyの反対の魔法のことを書きたいと思います。

## 魔法はどうやって使う？

魔法です。アニメ・マンガ・小説・ゲームにたくさん登場するあの魔法です。
みなさんは「魔法を使う」と言われたら、どうやって使うものだと連想するでしょうか？

今は、異世界転生モノと呼ばれるファンタジージャンルがかつてない人気となっていますが、
自分のまだ子供だった頃、魔法といえば、かたや魔法少女と名のついた職業の方が「**テクマクマ～**」とか「**マハリクマ～**」と唱えて使うものか、かたや魔術師とか魔道士とかいう職業の方が「**ワレハハナツー**」とか「**タソガレヨリモクラキモノー**」と唱えて使うものでした。

当時の純粋な少年の心で思ったものです。

#### 同じように呪文唱えてるのに、なんでこんなに結果が違うのか？

魔法少女が呪文を唱えると、**自分の姿が他の人に変わったり**、**なにもないところからモノが現れたりお空を飛んだり**、もう何でもありです。まさに魔法！　夢があります。

かたや魔術師が呪文を唱えると、**火が出る**、**水が出る**、**雷が出る**、**傷が治る**。なんだか地味です。現実的！

## どっちがリアルどっちがロマン

:::note info
呪文ひとつでなんでも願いが叶うなんて、夢がある。ロマンチック！
:::

かたや、

:::note info
呪文を唱えても火とか水とか自然現象が出てくるだけなんて、現実的。リアリティ！
:::

と思った人はたしてそうでしょうか？

冷静に考えてみればそもそも、

#### 現実世界にファンタジー、魔法は存在しません。

この世にないものです。空想でしかないものであれば、なんでもありにしてめいっぱい楽しんだ方がいい。

使い方はカンタン → **マハリクマー**

効果は最大級 → **なにもないところからモノが！**

お手軽カンタンに楽しめるだけ楽しんだほうがいいじゃないっていう判断、とても現実的だと思いませんか？


一方の、**火が出る**、**水が出る**、はどうでしょう？　
大気中には◯◯が満ちていて...
呪文を唱えることで◯◯にはたらきかけて...
そうすることで◯◯な現象を起こすことができる...

なんて一生懸命設定考えている理由は、

#### それくらいの魔法だったら実際あるかも？

と思いたい、そう夢を見たいわけですね。夢、ロマンです。

まとめると、

「マハリクマー」＝ロマンがあるなと思ったことは、実は現実的な判断から来ているかもしれない。
「ワレハハナツー」＝現実的と思ったことは、実は夢を見たいロマンたっぷりな思いから来ているかもしれない。

というわけで、一見して感じる印象と、実際のところは実は逆な可能性もあるってことを、魔法になぞらえて語ってみました。


## 最後に

吉田の好きな呪文は、

> カイザード　アルザード　キ・スク・ハンセ　グロス・シルク!

> 灰燼と化せ　冥界の賢者　七つの鍵を持て　開け地獄の門!

> 七鍵守護神(ハーロ・イーン)!!

です。ありがとうございました。