OmniAICreator/Qiita-1.07M huggingface dataset:
【エンジニア向け】大阪梅田のシェアオフィスまとめ

# はじめに
新型コロナウイルスの影響により、オフィスの縮小や分散に取り組む企業が増えています。
そんな中、オフィスの分散先として、また自宅以外で仕事ができる場所としてシェアオフィスの需要が拡大しています。
大阪梅田にあるシェアオフィスの中から「エンジニアの方の仕事がはかどるのではないか？」と感じたオフィスをご紹介します。

## Busico.梅田（JR大阪駅徒歩5分）
![busico.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096769/22131ea5-a266-1d67-5ec3-04b0b5d4b82c.jpeg)

[Busico.梅田](https://www.busico.jp/umeda/)は、一部上場企業であるさくらインターネットグループ会社が運営しており、
2006年から10年以上の実績がある住所利用（登記可能）込みの金額のシェアオフィスです。
シェアデスクでは、作業姿勢の変化や体格差に応じたワークチェア、プライベートブースでは、人間工学的視点から編み出された人間の「脳」と「身体」を支えるラウンジチェアで作業を効率化させてくれます。フリードリンク・フリーお菓子もおすすめポイントです。

|施設|[Busico.梅田](https://www.busico.jp/umeda/)|
|:---|:---|
|アクセス|JR大阪駅から徒歩5分|
|営業時間|8-22時（365日）|
|利用料金|16,500 円/月～|

## billage OSAKA朝日プラザ梅田（御堂筋線梅田駅徒歩6分）
![billage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096769/f47c9629-bb5c-7f13-cf64-288acc5f18f5.jpeg)

[billage OSAKA朝日プラザ梅田](https://billage.space/osaka_asahiplaza)は、大阪・梅田の茶屋町エリアに誕生した延べ床面積約300坪の大型シェアオフィスです。
プライベート、セキュリティがしっかり守られる個室を1名からご利用いただけます。賃貸オフィスとは異なり、初期費用・月額利用料金ともシンプルな料金体系でサービスを提供しています。かつ、通常のオフィス以外に会議などに利用できるオープンスペース、会議室も完備しております。

|施設|[billage OSAKA朝日プラザ梅田](https://billage.space/osaka_asahiplaza)|
|:---|:---|
|アクセス|大阪メトロ御堂筋線「梅田」 駅 徒歩6分|
|営業時間|24時間365日|
|利用料金|13,000円/月～|

## BIZcomfort大阪 東梅田（東梅田駅徒歩3分）

![BIZcomfort.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096769/01b8341d-8238-2832-9286-f3e258933fe9.jpeg)


[BIZcomfort大阪 東梅田](https://bizcomfort.jp/osakafu/higashiumeda.html)は、東梅田駅徒歩3分の24時間365日利用可能な大阪梅田エリアのコワーキングスペース、レンタルオフィス併設のシェアオフィスです。
 法人向けのテレワーク施設や、個人向けの仕事場、自習の場としてもご利用いただけます。
飲食可能なカフェブース・モニター席有 ワークブース・WEB会議に最適なテレフォンブース・会議室もあり様々な用途に対応しています。

|施設|[BIZcomfort大阪 東梅田](https://bizcomfort.jp/osakafu/higashiumeda.html)|
|:---|:---|
|アクセス|東梅田駅徒歩3分
|営業時間|24時間365日|
|利用料金|14,3000円/月～|

## コモンルーム梅田（JR大阪駅徒歩3分）

![Common room.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096769/e8a2cd46-9373-e510-a47a-56e4554822e8.jpeg)

[コモンルーム梅田](https://common-room.jp/umeda/)は、大阪駅から徒歩3分の好立地にあるシェアオフィスです。
間仕切りのない開放的で穏やかな空間、利用者の快適さを考慮した家具等により集中力が高まります。落ち着いたワークラウンジ・集中できるブース席・打ち合わせに使えるボックス席など、バリエーション豊かな中から、好きな席を選ぶことができます。

|施設|[コモンルーム梅田](https://common-room.jp/umeda/)|
|:---|:---|
|アクセス|JR大阪駅徒歩3分
|営業時間|24時間365日|
|利用料金|17,600円/月～|

## WeWork 御堂筋フロンティア（JR北新地駅徒歩3分）

![wework.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096769/355e1a9f-b87f-7c6c-ceba-de837cc6b65b.jpeg)

[WeWork 御堂筋フロンティア](https://www.wework.com/ja-JP/buildings/midosuji-frontier--osaka)は、世界20ヶ国以上でシェアオフィス事業を展開するWeWorkの大阪梅田にあるオフィスです。
20 階建てのビル全体をWeWorkが占有しており、WeWorkらしい洗練されたインテリアデザインやアートをふんだんに取り入れたラウンジ、施錠可能で冷蔵庫とシンクを完備した、乳児のいるお母さんが安心して使えるマザールーム、授乳や祈り、瞑想などの用途に使えるウェルネスルームなど、近代的なアメニティを豊富に取り揃え、快適なビジネスライフをサポートします。

|施設|[WeWork 御堂筋フロンティア](https://www.wework.com/ja-JP/buildings/midosuji-frontier--osaka)|
|:---|:---|
|アクセス|JR北新地駅徒歩3分
|営業時間|24時間365日|
|利用料金|42,900円/月～|


# まとめ
エンジニアにおすすめと感じた大阪梅田にあるシェアオフィス情報を紹介しました。フリーランスエンジニアの方、これからフリーランスエンジニアを目指す方にとっても、会社以外の働く拠点を見つけるきっかけになれば嬉しいです。
「RDBの正しい歩き方」を読んで



削除フラグに入力する値は二種類が好ましい。
1とか0とか9,2とかNULLを含ませるのは好ましくない。

postgresの場合、削除フラグを表す場合、boolean型を使用してカラム名に「deleted」などの命名をするのが主流。
postgresでなくても**Check制約**を付与すれば妨げられる。

アプリケーション側のヴァリデーションのみで制約かけるよりもテーブル上で制約かければアプリケーションのバグから守れるし、DDLに記載することになるので明文化できる。



履歴は残しておいたほうが良いよって話
消費税率が変わった前後のタイミングで購入と払い戻しが発生したときに
売上を計算しなおさなきゃみたいなことがある。

設定マスタの消費税率カラムを0.05から0.08にした上書きしてしまうと、税率8パーセント以降の買い物はその値を参考にすればいいけど、税率5パーセント時の買い物を払い戻して計算しなおすために消費税カラムを参照すると0.08なので8パーセントの消費税率で計算されてしまう。買った当時は5パーセントだったのに計算しなおすときは8パーセントになると計算が当然ズレる。

解決策としてはテーブルに履歴テーブルを積ませる。
消費税マスタとしてデータを抽出して消費税の変更履歴を積ませる。
積ませる際には税率と有効開始日と失効日をカラムにする。

|  消費税率  |  有効開始日  |  失効日  |
| ---- | ---- | ---- |
|  0.05  |  1997-04-01  |  2014-03-31  |
|  0.08  |  2014-04-01  |  null  |

ほかにも発送状態を追う履歴を管理する場合

|  売上ID  |  発送状態  |  登録日時  |
| ---- | ---- | ---- |
|  1  |  発注済  |  2014-03-31 11:59:59  |
|  1  |  配送済  |  2014-03-31 15:59:59  |
|  1  |  納品済  |  2014-03-31 18:59:59  |
|  2  |  発注済  |  2014-03-31 23:59:59  |

売上一つの状態を上書きしていくより、いつ発注していつ配送して、いつ納品したのか履歴が残るのでトラブル時に対応しやすい。
【npmエラー】This is a problem related to network connectivity.

## 状況
ドキュメント通りにLaravelの環境構築をしていたとき

https://readouble.com/laravel/9.x/ja/frontend.html?header=CSS%25E3%2581%25AE%25E5%2587%25BA%25E5%258A%259B


Dockerで```npm install```する際、下記のエラー

```
% docker-compose exec [service名] npm install

npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm ERR! code ERR_SOCKET_TIMEOUT
npm ERR! network Socket timeout
npm ERR! network This is a problem related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network 
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2022-03-24T03_41_00_548Z-debug-0.log
```

## 原因

ネット回線が弱すぎたのをproxyエラーだと診断された可能性

## 解決方法

通信環境がいい場所で再度実行

同じエラー文でググったときに違うアプローチで解決する方法が多かったため、
こんなケースもあるよということがまれだとは思うが参考になれば…
Route 53 Resolverの料金が高くてびっくりした

こんにちは、クマ松です。

Route 53 Resolverの料金が高くてびっくりした話です。
![①AWSコスト管理Route53高い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/087a2b5e-c5ed-9b2f-058b-a8dda6b56259.png)

# 想定読者
・DNSについて概要はご存じの方
・Route53 Resolverを使うことを検討されている方

# 今回やったこと（AWS⇒オンプレのDNSサーバへの問い合わせ）
オンプレのサーバ（v~.co.jp）の名前解決を行う為に、AWS内のサービスからオンプレのDNSサーバに問い合わせをしたい。
そんなときにRoute 53 Resolver アウトバウンドエンドポイントを利用します。

![⓪構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/43571981-1dad-eb50-11ce-ae943a03e250.png)

# Route53 Resolverとは
Amazon VPC向けにDNSスタブリゾルバを提供するサービスです。

[VPC とネットワークの間における DNS クエリの解決](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver.html)

デフォルトではVPCを作成した時点でインターネット上のドメインに問い合わせをするリゾルバーが作成されます。
オンプレのDNSサーバにAWSから問い合わせをしたいとき、追加でリゾルバーを作成することが出来ます。

作成もとても簡単です。
アウトバウンドエンドポイントとエンドポイントに適用するSecurity Group、そして転送ルールを作成するだけ。
ルールにドメイン名とオンプレのDNSサーバを定義することで、VPC内のリソースが当該ドメインへアクセスをする際にAWS内のDNSサーバではなく、オンプレのDNSサーバに問い合わせをします。
![5-onpre-dns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/76edc21a-729e-f68e-05d7-640143c4a6eb.png)


## Route53 Resolver アウトバウンドエンドポイント
## 料金
ホストゾーンが25個までなら、0.50USD ホストゾーンごと/月ですので1ホストゾーン1月辺り60円程です。
Route 53 Resolverですが、0.125USD ENI ごと / 1時間となります。
ENI1つ毎に90USD(≒11,000円)/月という計算になりますが、ENIは2つ必要ですので実質180USD(≒22,000円)/月の利用料金が発生します。

![④AZ冗長.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/7572beab-2528-a31a-60b9-52623389078c.png)

## ENIは絶対2つ必要

高い可用性が求められないテスト環境において単一のAZでシステムを稼働させたいこともあるかと思います。
しかしRoute 53 ResolverのENIは仕様上2つ必要なので、ENIが2つしかない状態で「エンドポイントからの消去」を押してもIPアドレスを消すことは出来ません。

![⑤エンドポイントの削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/2ea63c4d-994e-5301-9d0b-04e93743a084.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307047/90ddb9d4-0b8c-e784-8d37-fc7038018a88.png)

「えいやっ」で作らないようにしましょう。
JSONの解析アクションで「行 '0'、列 '0' のアクション 'JSON_の解析' 入力でテンプレート言語式を処理できません: 'Required property 'content' expects a value but got null. Path ''.'。」がでたとき

Power Automateで手動実行のワークフローを作成し実行したところJSONの解析のアクションでタイトルのようなエラーがでました。

よくあるJSON解析アクションにあるサンプルコード生成に適用したサンプルがよくなかったのかな、とデータ形式にnullを追加しましたが解消しません。

待てよ、とJSON解析の１つ前のアクションの出力を確認するとOutputがnullでした。。

ここでは１つ前のアクションは「複数の項目を取得」アクションでフィルタークエリの列名を取り違えていたのが原因で1件もデータを取得できなかったことが原因でタイトルのエラーが発生していました。

お粗末なミスでありましたとさ。。🍵
プログラミング勉強でよくあったエラーなど

私がプログラミング勉強中によくあったエラーなどについてお話します。

# 言語別
## Python
かっこが全角になっていた。
```python
print("hello")
```
が正しいのですが、`（"hello"）`になっていたとか。
```python
a = 3
if a == 3:
    print("right")
else:
    print("wrong")
```
のコロンが抜けていたり、記号が違ったり。
## PHP
```php
echo "hello";
```
の最後のセミコロンが抜けていたり。（なくても動く場合もある）

# 結局は
本や学習サイトを見ていれば、教えてくれるので、すぐに解決できるものばかりですが。
今は基本的なエラーはないものの、Pythonのクラスや関数でのエラー（引数が足りない・多い・違うなど）のエラーは時々あります。それも、解決できるとは思いますが。

何かの参考になればいいです。
ゆるいスクラムからはじめてみる(Sprint Final)

## これまでのあらすじ

混乱の時期、秩序の時間を経て最終的に Sprint 7 までいきました。
わけあってプロジェクトから離れてしまったので、これをその総括とします。

https://qiita.com/yamamotodin/items/802e052094e98109b037

## 定着したもの、しなかったもの

| 名称 | 結果 | 説明 |
|:-----------|------------:|:------------:|
| 計画会議       | ○      | 開発チームと仕様を説明し話し合う場としては機能したが、細かい点まで話し合う精度の点では課題が残った        |
| KANBAN | ○ | タスクベースになったが、ゴールまでは記載されなかった |
| グルーミング      | ○ | PO系列の人たちその話し合いはうまくいっていた           |
| 相対見積もり       | ○       | ポイントをつけて開発の規模を見積もることに成功        |
| デイリー       | ✗       | やらなかった、週1の進捗会議とKANBANで進捗を管理        |
| レトロスペクティブ       | ✗       | 未導入        |
| コミュニケーション       | △       | ほんとはpublicなチャンネルで議論してほしいものが個別のDMになる傾向にあった。       |

## 総評

結論として、汎用的なプロジェクト運営にはこぎつけたが、チーム、プロジェクトとしての継続的な改善行動には至らなかった。

私が考える理由として下記

1. 計画を含めチームでの話し合いの時間が十分ではなかった。徐々に導入を試みていたが、`振り返る` ことについての利点を理解してもらうことが７つのSprintでは達成されなかった。
1. リモートワークで相互信頼の醸成に難があった。これはいろんなプロジェクトでいえることで、リーダーシップ、チームビルド、などもろもろの問題があるが、一番の問題はこの問題について話し合えなかったことではないかなと、思います。
1. 方式を敷く側の私の力不足 よい説得と理解へ導くことへの課題が私の中にあった
1. 専門の職能を買われて雇われている人たちの意識　例えばフロント、バックエンド、アーキテクト、デザイナーなどとして雇われており、それなりにスペシャリストの方々が揃っていて、チームビルド的にはすごくポテンシャルは高かったと思うが、相互によい効果（横文字でいうとシナジー）をもたらすに至らなかった
1. チームの内側への働きかけではなく、その外側にも受け皿をきちんと作ることが重要だった。組織的な事情もあったように思えます。

最後の項については今、この場で事例を書くと批判みたいになってしまうかもしれないのと、当事者ではなくなってから気づくことも多々あると思います、ので、時間をかけて考えたいです。

おわりです。

この先はかすれていて読めない。
バーチャルオフィスを利用するメリットと注意点

# はじめに
<a href="https://qiita.com/shgin04/items/dcc791642a1e457b6ee3">ITエンジニアにバーチャルオフィスがおすすめな理由</a>	
という記事がございましたが	
本記事ではバーチャルオフィスを利用する際のメリットと注意点をお話しします。


## バーチャルオフィスを利用するメリットと注意点	
バーチャルオフィスにはメリットもありますが、注意すべき点もあります。	
バーチャルオフィスを利用する目的は様々で、下記内容が全てではありませんが、検討の参考にしてみてください。	
	
###### メリット	
・コストを抑えられる	
・自宅住所を公開する必要がなくなるので、プライバシーが守られる	
・都心の一等地などに本店所在地を置くことができる	
・郵便物や宅配便等の受け取り・転送等を委託できる	
	
###### 注意点	
・他社と住所が重複する	
・銀行口座の開設が難しい場合がある	
・創業融資を受けられない場合がある	
・許認可を取得できない場合がある	
	
バーチャルオフィスでは銀行口座を開設できないという話をよく耳にしますが、	
実際、バーチャルオフィスの住所で法人口座を開設できている例もありますので、絶対に作れないというわけではありません。	
情勢や法律、また、お客様の状況にもよりますので実際にはケースバイケースのようです。	
創業融資も同様です。また、古物業や士業の届出、建設業の許可などは、バーチャルオフィスでは申請ができず、	
「実態のある営業所」といったような、机や電話などの設備が必要な業種は、バーチャルオフィスでは許可が下りない可能性が高くなります。	
	
利用にはこのようなメリット・注意点をよく理解することが大切ですね。
バーチャルオフィスを選ぶ際のポイント

# はじめに

shgin04さんの投稿で
「<a href="https://qiita.com/shgin04/items/dcc791642a1e457b6ee3">ITエンジニアにバーチャルオフィスがおすすめな理由</a>」
という記事がございましたが
本記事では、バーチャルオフィスを選ぶ際のポイントについてお話しします。


# バーチャルオフィスを選ぶ際の6つのポイント

首都圏を中心にバーチャルオフィスは数多くありますが、選ぶ際には、
以下の点に注意して選んでみてください。


###### 1．利用できる住所の価値
一等地の住所を会社の住所として利用できるのがバーチャルオフィスの1番のメリットです。
住所は会社の信用にも繋がりますので、エリアの雰囲気なども考慮して選ぶとよいです。

###### 2．料金
バーチャルオフィスは、家賃などのコストが削減できるのがメリットですが、
基本サービスの金額が安く感じても、オプション料金が発生し、結果思っていたよりも
費用が掛かってしまう場合がありますので、事前に確認が必要です。

###### 3．会議室の有無
テレビ会議などが主流となりつつありますが、まだまだ対面での会議や商談などで
会議室を利用する機会はあります。バーチャルオフィスに会議室が併設されているか、
追加料金の有無など、事前に確認するとよいです。

###### 4．運営会社
バーチャルオフィスの運営会社は、小規模な企業が多く突然閉鎖することも耳にします。
そのため、運営会社については、運営年数やホームページの更新頻度などを確認し、
長期的にお付き合いをしていける業者なのか見極めることが大事です。

###### 5．受付やスタッフの対応
無人で運営しているバーチャルオフィスもあるので、急な来客などに対応してもらえず、
取引先に不信感を与えてしまうことがあります。内覧の際に、スタッフの接客の様子や
有人受付かどうかも確認するとよいです。

###### 6．入会審査
入会審査が楽なバーチャルオフィスは、詐欺業者などが利用する可能性もあります。
ご自身の会社のイメージやブランド力を守るためにも、厳しい入会審査をしている
バーチャルオフィスを選ぶとよいです。
ITエンジニアの起業にはバーチャルオフィスがおすすめ

# はじめに
バーチャルオフィスをご存知でしょうか？
ITエンジニアにバーチャルオフィスがおすすめな理由と共に
本記事ではバーチャルオフィスについてお話ししたいと思います。

# バーチャルオフィスとは
バーチャルオフィスとは、物理的な業務スペース（事務所）を必要としないまま
事務所としての機能を実現できる『次世代のオフィスサービス』です。
業務スペース（事務所）を構えることなく
住所・電話転送・郵便物転送などビジネスに必要なオフィス機能が揃います。


# ITエンジニアの起業にバーチャルオフィスがおすすめな理由
ITエンジニアの業種は職種にもよりますが、
パソコンとインターネット環境さえあれば、作業スペースを必要としない場合も多く
バーチャルオフィスを利用しビジネスを始めるにぴったりです！


ぜひ起業の際はバーチャルオフィスの利用を検討してみてください
プログラミングコンテストチャレンジブック p56 最長共通部分列問題(C#)

### 問題
二つの文字列sとtが与えられる。これら２つの共通部分文字列の長さの最大値を求めなさい。ただし、文字列s1,s2,s3,...の部分文字列とは、si1,si2...sim(i1 < i2 < im)を表すことのできる文字列のことを言います。

### 自分(正解)
全探索で解いて、出力があっていた。しかし、この章で学習する内容は、「動的計画法」なので、その点では間違えているとも言える。
```c#
using System;

public class Program
{
    public static void Main()
    {
        int n = 4;
        int m = 4;
        int ans;

        string s = "abcd";
        string t = "becd";
        char[] s_arr = s.ToCharArray();
        char[] t_arr = t.ToCharArray();

        ans = Math.Max(exec(s_arr, t_arr), exec(t_arr, s_arr));

        Console.WriteLine("候補1：{0}",exec(s_arr, t_arr));
        Console.WriteLine("候補2：{0}",exec(t_arr, s_arr));
        Console.WriteLine("答え：{0}",ans);


        int exec(char[] arr1, char[] arr2)
        {
            int i = 0;
            foreach (char c in arr1)
            {
                int j = 0;
                foreach (char c2 in arr2)
                {
                    if (c == c2)
                    {
                        var l = i + 1;
                        var m = j + 1;

                        arr1 = arr1[l..];
                        arr2 = arr2[m..];
                        return exec(arr1, arr2) + 1;
                    }
                    j++;
                }
                i++;
            }
            return 0;
        }
    }
}

```


### 解答：動的計画法
AWS EC2で本番環境構築

# はじめに
AWSのEC2で本番環境を構築するエラーとの日々を備忘録として、ここに残したいと思います。

# 環境
ruby 3.0.2
rails 6.1.4
Nginx 12.0.0
puma 5.0

# 参考URL
https://zenn.dev/naoki_mochizuki/books/1471ce20222227
EC2で本番環境を構築する手順はこちらの記事を参考にさせてもらったので省略させていただきます。
こちらを最後までやり切った後のエラーについて書かせて頂きます。

# 本番環境へアクセス・・・
参考記事通りに進めていき、SSHでAWS上にログインした状態でこちらのコマンドを実行しwebにアクセスします。

```
sudo nginx -s reload

bundle exec pumactl start
```
これでやっと本番環境に構築できたと思ったら、
<img width="596" alt="スクリーンショット 2020-07-18 21.54.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653956/86db4f90-e124-62d3-f4cf-d9711014ab63.png">
お約束の通りエラーさんが出てきました。

# 原因
皆さん色々なアプリを作成されており、そのアプリによって原因は違いますが私の場合は、database.ymlが原因でした。

```
config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: ユーザー名
  password:　パスワード
  host: ホスト名

production:
  <<: *default
  database: データベース名
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  username: <%= Rails.application.credentials.db[:user_name] %>
  password: <%= Rails.application.credentials.db[:password] %>
  host: <%= Rails.application.credentials.db[:endpoint] %>
  pool: 20
  timeout: 1000 
```
# 対策
こちらファイルと.envという環境変数のファイルを変更していきます。

```
.env

RAILS_MAX_THREADS=5
DATABASE_HOST=RDSのエンドポイント
DATABASE_USER=マスターユーザー名
DATABASE_PASSWORD=マスターユーザーのパスワード
DATABASE_NAME=データベース名
RAILS_ENV=production 
```
```
config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS", "5" ) %>
  host: <%= ENV.fetch("DATABASE_HOST", "localhost" ) %>
  username: <%= ENV.fetch("DATABASE_USER") %>
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  database: <%= ENV.fetch("DATABASE_NAME", "my_project") %>

production:
  <<: *default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS", "5" ) %>
  host: <%= ENV.fetch("DATABASE_HOST", "localhost" ) %>
  username: <%= ENV.fetch("DATABASE_USER") %>
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  database: <%= ENV.fetch("DATABASE_NAME", "my_project") %>
  pool: 20
  timeout: 1000
```
こちらに変更したファイルになります。
こちらを変更したことにより本番環境にアクセスできるようになりました。

# まとめ
本番環境で出るエラーはログがないため、苦労しました。
MacのターミナルやGUIからAWSのデータベースに接続する方法

AWSのデータベース、Amazon RDS（マネージドリレーショナルデータベース）を使用している際に「接続先のURL変更やDBユーザーの変更」があったときのための備忘録です。

- MySQL DB インスタンスへの接続を想定しています。
- MySQL 以外へのターミナルでの接続方法については後述します。
- GUI は MySQL Workbench で検証しています。
- DBのエンドポイントとユーザー名・パスワードは管理者から配布された想定で記載しています。
- macOS Catalina (バージョン 10.15.7) を使用しています。
- VPNが必要な場合はVPNに接続した状態で以下を実施します。

## ターミナルでの接続方法

```zsh: ターミナル
mysql -h <RDSのエンドポイント> -P 3306 -u <RDSユーザー名> -p
```

`3306` の部分はポート番号です。環境によって変わる可能性はありますが、MySQLで一般的な設定の場合はそちらを使用します。

MySQLとそれ以外、各種DBの一般的なポート番号は以下ですので必要に応じて変えてください。

```
MariaDB – 3306
Microsoft SQL Server – 1433
MySQL – 3306
Oracle – 1521
PostgreSQL – 5432
```

なお、ターミナルで `mysql` と打ってみてコマンドが `command not found` のエラーになる場合は、MySQL をインストールしてから実施します。

```zsh:ターミナル
brew install mysql
```

## GUI (MySQL Workbench) での接続方法
**MySQL Community Downloads** ページから MySQL Workbench のダウンロード＆インストールをします。
https://dev.mysql.com/downloads/workbench/

※2022年3月現在、MySQL Workbench のインストールには macOS のバージョン Big Sur (11.1) 以上が必須となっています。自分は 11.1 未満の macOS を利用中なので
**MySQL Product Archives** ページから古いバージョン（今回は 8.0.17）をダウンロードしてインストールしましたが、本来であれば古いバージョンを使用するのは推奨されませんので注意してください。
https://downloads.mysql.com/archives/workbench/

### MySQL Workbench の設定

MySQL Workbench のインストールが終わったら、ホームのイルカマークのタブからMySQL Connections の `+` マークをクリックします。
![スクリーンショット 2022-03-24 10.12.38のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94442/1b603908-d22b-fa30-b276-78a75a4774d1.png)
Setup New Connection の画面で以下を設定したらOKボタンを押します。
- Connection Name: 好きな名前
- Hostname: Amazon RDB のエンドポイント
- Username: RDB のユーザ名
- Password: RDB のユーザ名に紐付くパスワード
![スクリーンショット 2022-03-24 10.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94442/8d935c1e-1e79-3345-3f60-e5c79ea35c1a.png)
ホームに戻ると接続先設定が追加され、クリックするとDBへの接続が可能です。
![スクリーンショット 2022-03-24 10.52.16のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94442/e5a8c1d7-6e63-69d6-cbbf-0a22bf116894.png)

接続に成功すると **Successfully made the MySQL connection** の表示とともにSchema等DBの内容を見られるようになりますが、**Cannot Connect to Database Server** のエラーになる場合は、

- ホスト名（RDBエンドポイント）が間違っていないか
- ユーザー名が間違っていないか
- パスワードが間違っていないか
- ポート番号が間違っていないか
- VPNが必要な場合はVPNに繋がっているか

等を確認してください。

#### 参考URL
[Amazon RDS DB インスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.Connect.html)
[Amazon RDS ハンズオン](https://qiita.com/leomaro7/items/f51fdb30bd528fa895db)
[手元のMac端末からRDSに接続する方法](https://qiita.com/j-sunaga/items/36e84f22bfabdcd9cb62)
Google Forms APIを使ったGoogleフォームの作成

この記事では, 

https://developers.google.com/forms/api/quickstart/python

の内容を元に Pythonを使ったGoogleフォームの作り方を説明します.

## 必要なもの
上記ウェブページに書かれている環境 (実行した環境)
* Python 2.6以上 (Python 3.9.10, Homebrewでインストール済み, macOS Monterey 12.3)
* Pip (pip３　２０．０．４)
* Google Cloud Platform project
  Google Cloud Platform Consoleでプロジェクトを作成. APIとサービスの有効化から　Google Forms APIを追加.
* デスクトップ用の認証情報を作成
 OAuthクライアントIDでデスクトップアプリ用を選択する. 作成後, JSONをダウンロードし, **client_secrets.json**にファイル名を変更する.
* OAuth同意画面を作っていない場合は, こちらも作成する. テスト段階では, テストユーザとして, 自身のGoogleアカウントを追加しておく.

## Google client libraryの追加
pipを使い,　Google client libraryをインストールする.
```
 pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
```

## サンプルプログラムの構成

https://developers.google.com/forms/api/quickstart/python

https://github.com/googleworkspace/python-samples/blob/master/forms/quickstart/quickstart.py

にあるファイルを持ってきて,　quickstart.py という名前で保存する.

コードの説明はしませんが, NEW_QUESTION のJSONファイルを変更すると、作成されたGoogleフォームに問題が追加されたり、形式が変更されます.

詳しくは, 下記をみてください.

https://developers.google.com/forms/api/reference/rest/v1/forms

## サンプルの実行
```
python quickstart.py
```
初回実行の場合は,　認証の画面が出てくるので, 必要な情報を確認し, 承諾（Accept)をクリックする. 

コンソールに, 作成されたフォームの情報がでます. URIのサイトにアクセスすると, フォームが作られているのがわかります.

https://docs.google.com/forms/d/e/1FAIpQLSe3D2VatUMX5OugwPggbC4bdUgCcfod4iI3CXvuWKRhdOIfPw/viewform

----
[TortoiseGit]タスクバーアイコンを変更する方法


# 方法

設定 の 全般-ダイアログ3-オーバーレイアイコン で、
任意の画像ファイルを指定する。

# ヘルプ


[ヘルプ](https://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html#tgit-dug-settings-main)の当該部分の引用と、Google翻訳の結果を載せておきます。

> Overlay Icon
> 
> tgit.icon is used with projects which wish to show the logo on the taskbar for easier identification when multiple TortoiseGit application instances of different projects are running at the same time.
> 
> If icon is not 16x16 pixels in size, it will be automatically scaled. Supported formats are .ico, .png, .jpg, .gif, .bmp. If no icon is included by that project, you may find one on you own, put it in .git folder and set the relative path in local config. e.g. .git/logo.ico If you want to disable it, you may set tgit.icon as an empty string in local config. It will fallback to a color block when disabled or load failed. Note that the advanced option GroupTaskbarIconsPerRepo should be 3 or 4 in order to use this function.

> オーバーレイアイコン
> 
> tgit.iconは、異なるプロジェクトの複数のTortoiseGitアプリケーションインスタンスが同時に実行されている場合に識別しやすいようにタスクバーにロゴを表示したいプロジェクトで使用されます。
> 
> アイコンのサイズが16x16ピクセルでない場合は、自動的に拡大縮小されます。 サポートされている形式は、.ico、.png、.jpg、.gif、.bmpです。 そのプロジェクトにアイコンが含まれていない場合は、自分でアイコンを見つけて.gitフォルダーに配置し、ローカル構成で相対パスを設定できます。 例えば .git / logo.ico無効にする場合は、ローカル構成でtgit.iconを空の文字列として設定できます。 無効にするかロードに失敗すると、カラーブロックにフォールバックします。 この関数を使用するには、詳細オプションGroupTaskbarIconsPerRepoが3または4である必要があることに注意してください。

# Note

日本語でググっても全然情報が出てきませんでしたが、
英語でググったら一発で答えが出てきましたので、
記事にしておきました。
【パブリッシャー】レポートのタイトルにフィルター値を表示してみる

[Sharperlight](https://sharperlight.jp/)**パブリッシャー**で作成するレポートのタイトルに、クエリで使用されるフィルターの値を表示します。
[クエリの公開]ダイアログの[レポートのタイトル]フィールド右横にある参照ボタンで、[参照]ダイアログを開きます。
フィルター階層に多くのオプションが用意されています。
![2022-03-24 Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3bab3e23-b33a-afd8-6b4a-aeda4513fa62.png)
実際にはこんな感じ。
![2022-03-24 Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5f794bda-c8f7-c1f0-6d61-b82c8a3bb74d.png)
:postbox:[Sharperlight](https://sharperlight.jp/)
VROC (Intel® Virtual RAID on CPU) BIOS設定

■BIOSをアップデート後、設定が初期化された為、
　Intel® Virtual RAID on CPU (Intel® VROC)のBIOS再設定

■環境
サーバー：supermicro　X11シリーズ
Chipset：Intel® C621

■[Advanced]→[Chipset Configuration]→[North Bridge]→[IIO Configuration] に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/a1da8095-3da4-21a4-7882-17b5a1009cb4.png)

■[Intel🄬 VMD technology] に進み、[Intel🄬 VMD for volume Management Device on CPU2] に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/b78bf250-3132-3c6e-0328-c6037e3aea17.png)

■一番下[Intel🄬 VMD for volume Management Device] を [Enable] へ変更
![2022-03-15_22h54_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/c6f87a1f-3534-e35b-de44-c40bea3368a6.png)

![2022-03-15_22h54_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/fc295891-afc0-4d89-5595-8a00c708b1e4.png)

■さらに、下の3項目を [Enable] へ変更
![2022-03-15_22h55_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/0a94cac3-569c-9a82-937f-b3768de8ffd4.png)

■設定を保存して一旦終了し、電源Off
![2022-03-15_22h56_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/354f0506-fc2f-830b-f2a9-e54cfe4c4f20.png)

■電源On後、Boot Option で従来の起動OSを一番上に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/af82dc83-15a8-9bea-0b19-cba21cfffe90.png)

■以上で完了
yamlファイルに定義されたIPアドレス情報でAWS WAFのIPセットを作成する

入力となるyamlファイルは以下の通り。

```
# test.yaml
list:
 - ipaddress: 192.0.2.0/24
   descripton: TEST-NET-1
   date: 20220324

 - ipaddress: 198.51.100.0/24
   type: ipv4
   descripton: TEST-NET-2
   date: 20220324

 - ipaddress: 203.0.113.0/24
   type: ipv4
   descripton: TEST-NET-3
   date: 20220324
```

yamlファイルを読み込んで、IPセットを作成するterraformコードは以下のとおり。
※バージョン情報：terraform->1.0.6, aws provider->3.58

```
locals {
  test = yamldecode(file("test.yaml"))
}

resource "aws_wafv2_ip_set" "test" {
  name               = "test"
  description        = "test"
  scope              = "REGIONAL"
  ip_address_version = "IPV4"
  addresses          = local.test.list.*.ipaddress
}
```

terraform applyを実行し、IPセットを作成する。

```
{code}
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_wafv2_ip_set.test will be created
  + resource "aws_wafv2_ip_set" "test" {
      + addresses          = [
          + "192.0.2.0/24",
          + "198.51.100.0/24",
          + "203.0.113.0/24",
        ]
      + arn                = (known after apply)
      + description        = "test"
      + id                 = (known after apply)
      + ip_address_version = "IPV4"
      + lock_token         = (known after apply)
      + name               = "test"
      + scope              = "REGIONAL"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_wafv2_ip_set.test: Creating...
aws_wafv2_ip_set.test: Creation complete after 0s [id=xxxxx]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
{/code}
```
AfterEffectsのスクリプト開発で詰まったメモ

初投稿です。
Markdown記法は不慣れなので、ご容赦ください。
今回、社内の環境改善としてAfterEffects(以下AE)のスクリプト開発を行うことになり、その時に詰まったり忘れがちだったこと、あるい便利だったものをメモとして残しておきます。
今回使用していたAEのバージョンはCC2018とCC2020です。

思い出したり、新しく詰まったことがあれば追記していきます。

# ・Window
## show()
&emsp;cc2018では、何かしらのイベント関数(空でもok)がないとウィンドウが表示されません。
&emsp;cc2020ではイベント関数がなくても大丈夫です。

## 表示モード
&emsp;Windowにはモードが3つあります。
&emsp;**dialog、palette、window**です。
&emsp;基本的にはdialogかpaletteでいいかなと思います。
&emsp;私が開発していたスクリプトで、「エクスプレッションを使用して現在のフレームで特定のピクセルのカラーを取得する」という処理があったのですが、<span><font color = "red">**CC2018ではdialogでしか動作しません**</font></span>でした(paletteではrgbが0で返ってくる)。
&emsp;どうやらCC2018では、paletteでウィンドウを作成した場合、エクスプレッションで動的に設定したvalueは0が返ってくるようです。
&emsp;ただし、CC2020では問題なく動作していました。

# ・ListBox

## selection
&emsp;選択した項目(ListItemオブジェクト)を取得するプロパティです。
&emsp;選択した項目の番号を取得したいときはselection.indexで取れます。
&emsp;また、selectionは、項目が選択されていないときはnullを返します。
&emsp;つまり、リストボックス内でクリックした場所がcolumnWidths外の場合、nullチェックしていなければエラーとなります。

&emsp;しかし、columnWidthsが適切な大きさだったとしても上記が発生する場合があります。
&emsp;それは、showHeadersプロパティがfalseの場合です。(必ずそうなるかはわかりません、すみません)
&emsp;その場合、見かけ上の大きさの半分くらいしかクリック範囲が確保されませんでした。
&emsp;なので、サイズは合っているのにクリックできない場合、showHeadersをtrueにしてみてください。

## multiselect
&emsp;trueにすると項目の複数選択が可能になるプロパティですが、前項で取り上げた**selection**の取り扱いが変わってきます。
&emsp;このプロパティがtrueの場合、selectionが配列で返ってくるようになります。
&emsp;これは、一つしか選択していない場合でも同様です。
&emsp;つまり、selection.indexはundefinedになってしまいます。
&emsp;選択した項目を取得したい場合は下記のようにします。

~~~ list.jsx
// 複数選択したいリストボックスの全要素の数でloop					
for (var i = 0; i < listbox.items.length; i++) {					
    // リストボックスの項目から、選択されているものだけを対象に処理					
    if (listbox.items[i].selected == true) {					
        // なんかしらの処理					
    } 					
}					
~~~

##### ・numberOfColumns
&emsp;一つの項目に対して表示したい列が複数(2以上)の場合の管理について。
&emsp;各列に対応した配列変数を作成しても大丈夫ですが、連想配列で管理するのがベターかなと思います。

~~~ arr.jsx
var A = [];
var B = [];
var C = [];

A.push(a);
B.push(b);
C.push(c);

//上記よりも

// こっちの方が管理しやすい気がする
var arr = [];
arr.push({"A":a, "B":b, "C":c});
~~~

# ・オブジェクト
&emsp;ここでいうオブジェクトとは、フッテージやコンポジション、GUIオブジェクトのことです。
&emsp;言語仕様上のオブジェクトではありません。(Arrayとか)

## remove()
&emsp;フッテージやコンポジションの場合、削除したいオブジェクト.remove()で削除することができます。
&emsp;このとき、app.project.itemsが切り詰められるので、インデックスでアクセスしている際は注意が必要です。
&emsp;また、独自の配列でオブジェクトを管理している場合、削除したときにその配列も切り詰めないと、そのインデックスにアクセスした場合エラーとなります(無効なオブジェクト)。

~~~ remove.jsx
var items = app.project.items;

// NG
for(var i = 1; i <= items.length; i++) {
    var item = items[i];    // 切り詰めているため、削除された場合は一つ飛ばしてしまう

    if(条件) {
        items[i].remove();
    }
}

// OK1
for(var i = 1; i <= items.length; i++) {
    var item = items[i];

    if(条件) {
        items[i].remove();
        i--;
    }
}

// OK2(better)
for(var i = items.length; i > 0; i--) {
    var item = items[i];

    if(条件) {
        items[i].remove();
    }
}

// エラー
var arr = [];
arr.push(フッテージA);
arr.push(フッテージB);
arr.push(フッテージC);

alert(arr[1].name);  // フッテージB
arr[1].remove();
alert(arr[1].name);  // エラー(無効なオブジェクト)
~~~

&emsp;GUIオブジェクトの場合、最上位の親要素(パネル).remove(削除したいオブジェクト)で削除できます。
&emsp;引数は他にテキスト指定、インデックス指定があるようですが、私は上記しか使ったことがないので詳しくありません・・・。


# ・滅茶苦茶お世話になった参考サイト様

https://sites.google.com/view/youuu4/home

https://dtpscriptin.com/

https://aejsx.hiroshisaito.net/home
Terraform の plugins を全消しする

aws provider が地味にディスク容量を食うので、カレントディレクトリ配下の plugins を消す。

## 削除対象確認

```bash
$ find -type d -name 'plugins' | grep -P '.terraform/plugins$' | xargs du -sh
182M    ./foo/bar/.terraform/plugins
182M    ./baz/qux/.terraform/plugins
   :
```

## 削除

```bash
find -type d -name 'plugins' | grep -P '.terraform/plugins$' | xargs rm -r
```

## 備考

provider plugin cache を設定することで、provider の乱立を防ぐことができる。

https://qiita.com/tonishy/items/adcf67e959dffaa03f93
Stripe BillingのテストクロックAPIを利用して、定期課金のシミュレーションをCLIから簡単に実行する

Stripeには、定期課金の時間経過をシミュレートするための「テストクロック」機能が用意されています。

https://stripe.com/docs/billing/testing/test-clocks

これを利用することで、「契約してから２週間目にプランをダウングレードした場合、次回の請求はどうなるか？」などの、時間経過が関わるテストが簡単にできるようになります。

テストクロックをGUIで操作する方法については、以下の記事がとてもわかりやすいです。

https://qiita.com/kaonaga9/items/682f1571137ae92ff592

この記事では、できるだけ１つのコマンドで簡単にテストができるようにするJSスクリプトコードサンプルを紹介します。

# コードでやるべきこと
テストクロックを使うには、少なくとも２つのコマンド・スクリプトが必要です。

## 1: テストクロック・顧客・サブスクリプションを作成するスクリプト

テストクロックを利用する場合、**テストクロック作成後に、顧客を作成**する必要があります。

そのため、以下のステップでAPIを呼び出すスクリプトが必要です。

- テストクロックを作成する
- テストクロックに関連付けした顧客データを作成する
- サブスクリプションを作成する
- 作成したリソースのIDを表示する

```js
const clock = await stripe.testHelpers.testClocks.create({
  frozen_time: dayjs().unix(),
  name: 'From js script'
})
const customer = await stripe.customers.create({
  payment_method: 'pm_card_visa',
  invoice_settings: {default_payment_method: 'pm_card_visa'},
  test_clock: clock.id,
})
const subscription = await stripe.subscriptions.create({
  customer: customer.id,
  items: [{
    price: 'price_xxxx',
    quantity: 1
  }]
})
console.log([
  `Clock ID: ${clock.id}`,
  `Customer: ${customer.id}`,
  `Subscription: ${subscription.id}`
])
```

コマンドの引数や環境変数を利用して、サブスクリプションの料金IDを変更できるようにすると、より実用的になるでしょう。

## 2: 任意の時間にテストクロックを進めるスクリプト

もう１つ必要なものは、作成したテストクロックの時間を進めるスクリプトです。

ここでは、「対象のID」と「進めたい時間（UNIX TIME）」の２つを指定します。

```js
await stripe.testHelpers.testClocks.advance('clock_xxxx', {
  frozen_time: dayjs().add(1, 'month').unix()
})
```

サンプルのように、dayjsなどの日付操作ライブラリを利用することで、「１ヶ月後」などの相対的な日付操作がやりやすくなります。


# CLIツールにする場合

このようなテスト機能は、社内・チーム用のCLIツールにすると便利です。

[oclif](https://www.npmjs.com/package/oclif)を利用する場合、以下のようにオプションを設定することで、より使いやすく、共有しやすくなります。

```typescript
import {Command, Flags} from '@oclif/core';

export default class Hello extends Command {
  static flags = {
    clockId: Flags.string({
      char: 'c',
      description: 'Test Clock ID',
      required: true,
    }),
    fronzenTime: Flags.integer({
      char: 'f',
      description: 'UNIX Time',
      required: true,
    }),
  };

  async run(): Promise<void> {
    const {
      flags: {
        clockId,
        fronzenTime,
      },
    } = await this.parse(Hello);
    await stripe.testHelpers.testClocks.advance(clockId, {
      frozen_time: fronzenTime,
    });

    this.log('Complete!');
  };
};
```


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

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

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

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
PowerPointで図形を整えたい

# __はじめに__

PowerPointで資料やフロー図を作成する際、矢印がどうにも斜めになっている気がして真っ直ぐにしたい！
頑張って手で修正したものの、やっぱり歪んでいる気がする。ということで、図形を真っ直ぐにする方法を忘備録的に残したいと思います。

## __使い方__
<dl>
　<dt>とりあえず矢印を真っ直ぐ引きたい</dt>
　　<dd>「shift」キーを押しながら線を引っ張るだけ。これが一番簡単な方法。</dd>

　<dt>斜めになっている矢印を真っ直ぐにしたい</dt>

　　![スクリーンショット 2022-03-24 10.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2103265/34417e69-6e55-b7e0-13c6-2f3476e6714f.png)

<dd>（画像は大袈裟に斜めにしていますが）図形（矢印）を選択して右クリックをすると、
「配置とサイズ」という項目があるので、そこから「サイズ」の「高さ」を
「0 cm」にすると、「shift」キーで引いた線と同じように真っ直ぐに。</dd>

![スクリーンショット 2022-03-24 10.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2103265/ddcf530f-c62e-b01e-b220-9c477f99d331.png)

<dt>他の図形でちょっと応用</dt>　　<dd>個人的にはあまり使う機会がなさそうですが、曲線タイプのも倍率などを調整することで
綺麗に整形することもできるので、他の図形でも応用がきき意外と重宝しそうです！</dd>

![スクリーンショット 2022-03-24 11.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2103265/652c3b74-7baa-88d9-9013-35b4e061548c.png)

<dt>個人的に結構使いそうな機能（おまけ）</dt>

 <dd>フロー図的なものを作ると、四角と矢印を大量に使うので配列を整えたい場合は
「図形の書式設定」から「整列」からお好みで整えると、しっかり等間隔に。</dd>
</dl>


## __最後に__

あまり頻繁にPowerPointを使う機会もなかったため、今まで手動で整形していましたが
意外と便利機能が備わっているもので、あまり面倒くさがらず「こんな機能ないかな？」と思ったら
やっぱりとりあえず探してみた方が良いですね…反省！
[Go/gin] GETリクエストに配列でパラメータを渡す方法

# 結論
- Ginコンテキストの`QueryArray()`をつかって受け取る
  - `gc.QueryArray("params[]")`
  - `gc.GetQueryArray("params[]")`
- 構造体にバインドするには、下記の通り
```go
type Req struct {
    Params []int `form:"params[]"`
}
```

# 実装
複数ステータスなどの条件で検索したい時に、フロントエンドから配列でパラメータを送れるようになります。
handlerまでのサンプルを載せておきます。

```bash
curl -X GET 'http://localhost/hoge/path?params[]=1&params[]=2'
```

```go:main.go
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	gin.SetMode("debug")
	e := gin.Default()

	assignHandler(e)

	if err := e.Run(":80"); err != nil {
		panic(err)
	}
}

func assignHandler(e *gin.Engine) {
	h := e.Group("hoge")
	{
		h.GET("/path", GetHogePath)
	}
}

type GetHogePathRequest struct {
	Params []int `form:"params[]" url:"params[]"`
}

func GetHogePath(gc *gin.Context) {
	var req GetHogePathRequest
	if err := gc.Bind(&req); err != nil {
		gc.JSON(http.StatusBadRequest, err)
		return
	}
	gc.JSON(http.StatusOK, req.Params)
}

```
https://go.dev/play/p/z5UlPJCQAWV

# テスト実装
```go:main_test.go
package main

import (
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
)

func TestGetHogePath(t *testing.T) {
	cases := []struct {
		query      string
		expected   string
		statusCode int
	}{
		{"/hoge/path?params[]=1", "[1]", 200},
		{"/hoge/path?params[]=1&params[]=2", "[1,2]", 200},
	}

	for _, c := range cases {
		// Engine不要のため無視
		res := httptest.NewRecorder()
		gc, _ := gin.CreateTestContext(res)

		req := httptest.NewRequest("GET", c.query, nil)
		gc.Request = req

		GetHogePath(gc)

		targetStatusCode := res.Code
		if res.Code != c.statusCode {
			t.Errorf("expected: %v, input: %v", c.statusCode, targetStatusCode)
		}
		targetWord := res.Body.String()
		if targetWord != c.expected {
			t.Errorf("expected: %v, input: %v", c.expected, targetWord)
		}
	}
}

```

# 参考
https://github.com/gin-gonic/gin/pull/570

https://stackoverflow.com/questions/64801244/how-can-golang-gin-get-the-array-parameters-of-get-requests-query-string
ADOPに新たなSceneを追加する

ADOPに新たなSceneを追加して学習させるための手順

※ADOPとは以下のことです
https://github.com/darglein/ADOP

# 用意するもの
- colmp 3.7　（バージョンとっても重要）
- build済みのADOP

# 概要
colmapで点群を作成し、それをADOPビルド時に作られる`./build/bin/colmap2adop`を利用してインポート
そのあと、同じくADOPビルド時に作られる`./build/bin/train_adop`を利用して学習を開始する。

# 手順

## 1. colmapで画像から点群を作成する。

以下の手順に沿ってcolmapをインストールします。
https://colmap.github.io/install.html

winやmacでビルド済みのものを取得すると一番簡単です。
linuxの場合はコードからビルドする必要があります。

※注意
`apt install colmap` でlinuxは実はインストールできたりしますが、この場合3.6が入ってしまいADOPには適合しません。
必ず最新の3.7をインストールしましょう。

インストール出来たら、点群化する対象の画像を用意して、colmapの「Automatic reconstruction」を使って点群を作成します。
具体的な使い方は以下がわかりやすいです。
https://blog.goo.ne.jp/yoossh/e/d1278b39229eca47774fe5646a2bb2d7

## colmap2adopでadopにインポートする

以下に沿いながらSceneにインポートします。
https://github.com/darglein/ADOP/blob/main/scenes/README.md

``` example
export SCENE_BASE=/local.home/Projects/ADOP/additional_material/colmap/Playground/

build/bin/colmap2adop --sparse_dir SCENE_BASE/sparse/0/ \
    --image_dir scenes/tt_playground/images/ \
    --point_cloud_file SCENE_BASE/dense_point_cloud.ply \
    --output_path scenes/playground_test \
    --scale_intrinsics 1 --render_scale 1 
```

この時`point_cloud_file `の値は、colmapで作成された、`./dense/0/fused.ply`を指定します。
image_dir は、点群に使った画像のディレクトリ
output_path　は、Sceneディレクトリ（あらかじめ作成する必要はない）
scale_intrinsics は、レンダリングのスケールを指定します。

問題なく変換がうまくいったら、次は学習に移ります。

## train_adopで学習を始める

まずは学習のためのconfigファイルを作成します。
ADOP/configにあらかじめ2つのconfigファイルがあります。

ここに、学習時の設定を入れます。
すでにあるcomfigファイルを複製して作成しましょう。
以下の条件に近いものを複製して作るとよいです。

configs/train_boat.ini　・・・露出値のバリエーションが多いシーンを撮影する場合
configs/train_tank_and_temples_multi.ini　・・・屋内シーンや露出値が近い画像の場合

### 編集対象の値
- name ・・・名称
- output_file_type・・・画像の拡張子
- scene_name・・・colmap2adopで作ったsceneディレクトリ名

マシンのスペックが高くない場合（メモリエラーなどが発生するときは以下を表記の値に変更する）

```
train_crop_size = 256
inner_batch_size = 8
batch_size = 2
```

ここまで変更ができたら、以下コマンドで学習を開始します。
（`train_your-project.ini` はご自身の環境に合わせて変更してください）
```
./build/bin/adop_train --config configs/train_your-project.ini
```

問題なければ学習が始まります。

### もし、メモリエラーが起きてしまうときは

最後の `render_scale`の値を `0.5`などに下げてcolmap2adopをやり直すとよいです。
画像の大きさなどが小さくなり、メモリの消費量が減り、学習に使えるようになります。

もし以下のようなエラーが出る場合は、colmapから出力したplyファイルに問題がある可能性が高いです。
colmapのバージョンが問題ないか確認しましょう。

```
Assertion 'point_cloud_cuda->t_normal.defined() || !params->render_params.check_normal' failed!
  File: /home/bros/ADOP/src/lib/data/NeuralScene.cpp:28
  Function: NeuralScene::NeuralScene(std::shared_ptr<SceneData>, std::shared_ptr<CombinedParams>)
abort (core dumped)
```
ubuntu内ではなく、windowsでcolmapを動かして持ってきても問題ないので、別環境で動かしてみるのも有効です。

### あとは待ちましょう

400エポックほど学習を繰り返すので、あとは待ちます。
公式曰く、12~24時間ほどかかるとのことなので、放っておきましょう。

学習が終われば、
`./build/bin/adop_viewer --scene_dir scenes/newscene`（newsceneは自身の環境によって変えてください）
で動きます。
IBMCloud VLANのTrunkが自分でできるぞ！

## 目的
IBMCloudでVLANのTrunkがユーザ自身でできるようになったようだ。
以前はサポートに連絡し、Trunkしてもらうまで待つ必要があったが、その必要がなくなった
この記事では、実際にどのように実施できるのか検証し、通信への影響も確認した。

2022/4/20 追記
IBMCloudのDocsに手順が追加されました（英語のみ）
https://cloud.ibm.com/docs/vlans?topic=vlans-configuring-vlan-trunks&interface=ui

## VLAN Trunkの追加方法
TrunkしたいVLANのポータルページに移動する。

**IBMCloudポータル**にログイン→**左上のボタン**→**Classic Infrastructure**⇨**IP Management**→**VLANs**を選択
![貼り付けた画像_2022_03_24_11_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e7042536-1ee8-2030-7430-085d2323e26a.png)

**TrunkしたいVLAN**を選択
今回はVLAN2230をTrunkする
![貼り付けた画像_2022_03_24_11_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/9d639e9b-4358-9a9c-9515-70af020b88b4.png)

**Attach trunk**を選択
![貼り付けた画像_2022_03_24_11_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/067da266-42e0-41ed-834d-003d723bfe9f.png)

Trunk可能なデバイス一覧が表示されるので、**Trunk対象のデバイス**を選び、**Attach**を選択
![貼り付けた画像_2022_03_24_11_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f96b9612-576b-968e-dfd4-c0e9d777bc57.png)

成功すると、下記のポップアップが現れるので、Trunk完了まで数分待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/38043cfa-4859-9c6a-c5dc-8cea3378cbaa.png)

ポータルをリフレッシュすると、VLAN2230が対象デバイスにTrunkされたことがわかる
![貼り付けた画像_2022_03_24_11_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e5958d7f-b85f-7fcc-c816-8b921ee80ae7.png)

## VLAN Trunkの解除方法
VLAN2230のページに移動し、**Trunkを外したい対象サーバの右にある記号**を選び、**Remove**を選択
![貼り付けた画像_2022_03_24_11_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/298e7882-c763-4039-6afa-fb8b4daf5a3c.png)

成功すると、下記のポップアップが現れるので、Trunk削除まで数分待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/003e2bb3-ec4c-6ca6-7657-f1cb73424d59.png)

対象デバイスへのTrunkが削除されたことを確認
![貼り付けた画像_2022_03_24_11_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/4f21898a-d9e4-0506-7939-48b2844c1029.png)

## Trunk追加および解除時の通信への影響
Trunk対象のデバイスから、IBMCloudのゲートウェイを通り、別のVLANへのPINGを検証したが、追加および解除時にPINGが落ちることはなかった。
今回の検証では通信断が確認できなかったが、<font color=red>落ちることを想定して実施したほうが良い</font>と思われる。
CSVもらったときに確認すること

```python
df = pd.read_csv(Titanic)
```
# 1. 行列数の確認
```python
print(df.shape)
# (891, 12)
```
# 2. データ型の確認
```python
print(df.dtypes)
# PassengerId      int64
# Survived         int64
# Pclass           int64
# Name            object
# Sex             object
# Age            float64
# SibSp            int64
# Parch            int64
# Ticket          object
# Fare           float64
# Cabin           object
# Embarked        object
# dtype: object
```
# 3. 欠損値の確認
```python
print(df.isnull().sum())
# PassengerId      0
# Survived         0
# Pclass           0
# Name             0
# Sex              0
# Age            177
# SibSp            0
# Parch            0
# Ticket           0
# Fare             0
# Cabin          687
# Embarked         2
# dtype: int64
```
# 4. 先頭5行の確認
```python
print(df.head())
#    PassengerId  Survived  Pclass  \
# 0            1         0       3   
# 1            2         1       1   
# 2            3         1       3   
# 3            4         1       1   
# 4            5         0       3   

#                                                 Name     Sex   Age  SibSp  \
# 0                            Braund, Mr. Owen Harris    male  22.0      1   
# 1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   
# 2                             Heikkinen, Miss. Laina  female  26.0      0   
# 3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   
# 4                           Allen, Mr. William Henry    male  35.0      0   

#    Parch            Ticket     Fare Cabin Embarked  
# 0      0         A/5 21171   7.2500   NaN        S  
# 1      0          PC 17599  71.2833   C85        C  
# 2      0  STON/O2. 3101282   7.9250   NaN        S  
# 3      0            113803  53.1000  C123        S  
# 4      0            373450   8.0500   NaN        S  
```
# 5. 統計量の確認
```python
print(df.describe())
#        PassengerId    Survived      Pclass         Age       SibSp  \
# count   891.000000  891.000000  891.000000  714.000000  891.000000   
# mean    446.000000    0.383838    2.308642   29.699118    0.523008   
# std     257.353842    0.486592    0.836071   14.526497    1.102743   
# min       1.000000    0.000000    1.000000    0.420000    0.000000   
# 25%     223.500000    0.000000    2.000000   20.125000    0.000000   
# 50%     446.000000    0.000000    3.000000   28.000000    0.000000   
# 75%     668.500000    1.000000    3.000000   38.000000    1.000000   
# max     891.000000    1.000000    3.000000   80.000000    8.000000   

#             Parch        Fare  
# count  891.000000  891.000000  
# mean     0.381594   32.204208  
# std      0.806057   49.693429  
# min      0.000000    0.000000  
# 25%      0.000000    7.910400  
# 50%      0.000000   14.454200  
# 75%      0.000000   31.000000  
# max      6.000000  512.329200
```
Windows11でCORTONA3D VIEWERの起動

`VRML`で書き出された3Dモデルを開きたくなったが、windowsでのブラウザは`CORTONA3D`というものしかないらしい。
`CORTONA3D`は`InternetExplorer`でしかサポートされていないので、Windows11でIEを起動するところから調べた。
(古いchromeやfirefoxでは動くようです）

セキュリティー的にはダメダメなので、自己責任で行うこと。

# InternetExplorerのショートカットの作成

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1379242.html

# CORTONA3Dのインストール

http://www.cortona3d.com/en/cortona3d-viewer-download

これで、IEのアドレスバーに`.VRL`のアドレスをコピペし、アドオンを許可するとみることができる。
cscの作法 その59

# 概要
cscの作法、調べてみた。
モーダルウィンドウやってみた。

# 参考にしたページ

https://qiita.com/kob58im/items/a4ce3cb64b0f14080ab9


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/23c62088-d05d-e3ec-96fd-8ef8481ad929.png)

# サンプルコード

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

class MainForm : Form
{
	Button btn;
	MainForm() {
		Text = "Main window";
		ClientSize = new Size(400, 300);
		btn = new Button();
		btn.Size = new Size(200, 50);
		btn.Text = "Show sub window.";
		Controls.Add(btn);
		btn.Click += btn_Click; 
	}
	void btn_Click(object sender, System.EventArgs e) {
		ShowSubFormWithText("this is a sample."); 
	}
	static void ShowSubFormWithText(string text) {
		SubForm f = new SubForm(text);
		f.ShowDialog();
	}
	[STAThread]
	static void Main(string[] args) {
		Application.Run(new MainForm());
	}
}
class SubForm : Form
{
	TextBox txt;
	public SubForm(string text) {
		Text = "Sub window";
		ClientSize = new Size(300, 150);
		StartPosition = FormStartPosition.CenterParent;
		txt = new TextBox();
		txt.Text = text;
		txt.Multiline = true;
		txt.ScrollBars = ScrollBars.Both;
		txt.Dock = DockStyle.Fill;
		txt.KeyDown += txt_KeyDown;
		Controls.Add(txt);
	}
	void txt_KeyDown(object sender, KeyEventArgs e) {
		if (e.Control && e.KeyCode == Keys.A) 
		{ 
			txt.SelectAll(); 
		}
	}
}





```

以上。
話題の「AWS Cloud Quest」をやってみた！

# はじめに

“エンジニアファーストの会社　[株式会社CRE-CO](https://www.cre-co.jp/#top)”のクワバラと申します。

社内で共有されて情報を知ることができましたが、Amazonさんが無料のオンラインロールプレイングゲーム「[AWS Cloud Quest: Cloud Practitioner](https://explore.skillbuilder.aws/learn/course/external/view/elearning/11458/aws-cloud-quest-cloud-practitioner)」を公開してました。

クワバラ自身、経験は浅いもののAWSエンジニアとしての業務経験がありますので、AWSの知識、知恵がゲーム感覚で養えることはとても嬉しいことです。

ゲームの概要等は後述にてご説明させていただきます。

それでは、レッツゴー！！

# AWS Cloud Quest: Cloud Practitionerってどんなゲーム？
AWS Cloud QuestはWebブラウザオンラインゲームです。

プレイヤーは自分のキャラクターを作成し、オープンワールドの街の人々の問題をAWSサービスを用いて解決するのが主なコンセプトです。

ゲームはナビゲーションに従って、「Learn→Plan→Practice→DIY」の順番で進行し、AWSマネジメントコンソールを用いて、クエストを達成していきます。

途中、不明点があれば「Learn」を見直したり、動画での学習もできるため、学習コンテンツは充実していると思います。

また、実際のAWSマネジメントコンソールを使って問題を解決していくため、AWSを用いた実務にも役立つようになっています。

Amazon.co.jpのアカウント（買い物するあのアカウントです。）でログインでき、ゲーム内ではゲーム用のAWSアカウントが用意されるため、AWSのアカウント作成は不要です。

それ以外にはすべて英語という点が注意点といったところです。

# プレイしてみる！

実際に「[AWS Cloud Quest: Cloud Practitioner](https://explore.skillbuilder.aws/learn/course/external/view/elearning/11458/aws-cloud-quest-cloud-practitioner)」のサイトからプレイ環境を整えてプレイする、一連の流れをやってみようと思います。

・右上の「登録」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/c7408d42-65cb-029d-9fc3-04091242c78b.png)

・「今すぐプレイ！」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/246cf9cf-21a3-b970-1d3b-86b6a99a107e.png)

・「START GAME」でプレイ開始！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/ac86b248-a095-d25e-200f-3c7a83c4f4a2.png)

・自分のキャラを作成後、マップに出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/ea083e62-df8b-9b25-20e3-0f28a1676f69.png)

・「！」マークの人に話しかけると説明が発生、下記の流れでクエストを行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/4e82194d-16c5-4ce0-dddd-32f58b64d3d6.png)
※不明点があれば「VIDEO CONCEPTS」をクリックすると動画にて学習も可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/63c86734-109e-f29a-9556-7009254e6e39.png)

・「Open AWS Console」で学習した内容を実際のコンソールに触れながらクエストを達成していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576052/27579b7c-5a2d-f305-a6d4-d4edb358a66a.png)

基本的にはナビゲーションがあるため、それに従って実行していきました！
ただ、英語のため、僕のような英語初学者は翻訳が大変でした。。。

# おわりに
私自身、経験が浅いですがAWSエンジニアをやっておりましたので、多少できるかなと思っていた部分がありました。

ですが、知らないサービスがあったり、その度に動画学習をしたりと、知見、知恵を増やすにはとても良い教材かと感じました。

しかも無料でAWSアカウントも不要というハードルの低さにも驚きましたね。
AmazonさんもAWSエンジニア増やしたいのかなーと考えてみたり。。。:man_tone1:

すべて英語というところできついところがありますが、エンジニアをやっている身としては、身に着けて益のあるものなので、画像翻訳ソフト等用いながら使ってみると、英語の学習もしながらできるのではと感じました:information_desk_person:

3Dのオープンワールドや学習内容、ゲーム専用AWSアカウント等、とても高いクオリティだと思います！
皆さんも是非お試しください:guardsman_tone4:
cscの作法 その58

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

# 参考にしたページ

https://ufcpp.net/study/csharp/lib_string.html#regex

# サンプルコード

```
using System;
using System.Text.RegularExpressions;

class reg2
{
	static void Main() {
		string s = @"
This is a test program.
you can download it from the following page.
http://www.xxx.yyy/bin/test.php
If you have any questions about this,
please contact us by sending e-mail to the following address.
support@xxx.yyy
";
		Console.Write(">対象\n");
		Console.Write(s);
		Console.Write("\n");
		Console.Write(">メールアドレス抽出\n");
		Regex email = new Regex(@"\w*@[\w\.]*");
		Console.Write("{0}\n", email.Match(s).Value);
		Console.Write(">URL 抽出\n");
		Regex http = new Regex(@"http://(?<domain>[\w\.]*)/(?<path>[\w\./]*)");
		Match m = http.Match(s);
		Console.Write("{0}\n", m.Value);
		Console.Write("domain: {0}   path: {1}\n", m.Groups["domain"].Value, m.Groups["path"].Value);
		Console.Write(">t の付く単語全部抜き出し\n");
		Regex wordIncludingT = new Regex(@"\w*[tT]\w*");
		for (m = wordIncludingT.Match(s); m.Success; m = m.NextMatch())
			Console.Write("{0}  ", m.Value);
		Console.Write("\n");
	}
}





```

# 実行結果

```

>対象

This is a test program.
you can download it from the following page.
http://www.xxx.yyy/bin/test.php
If you have any questions about this,
please contact us by sending e-mail to the following address.
support@xxx.yyy

>メールアドレス抽出
support@xxx.yyy
>URL 抽出
http://www.xxx.yyy/bin/test.php
domain: www.xxx.yyy   path: bin/test.php
>t の付く単語全部抜き出し
This  test  it  the  http  test  questions  about  this  contact  to  the  support

```

以上。
本日の基礎練習問題(22/3/24)

# 問題
メソッドに3つの整数a b cを与えます。
・「aとbの差が1」または「aとcの差が1」であり、かつ「bとcとの数値の差が2以上」の場合はTrue
・それ以外はFalse
と出力するメソッドを作りましょう。

出力例：
close_far(1, 2, 10) → True
close_far(1, 2, 3) → False
close_far(4, 1, 3) → True

ヒント
返り値を絶対値（この場合は正の整数）に変換する際はabsメソッドを使いましょう。

# 私の回答
```
def number_far(a,b,c)
  x = (a-b).abs
  y = (a-c).abs
  z = (b-c).abs

  if x == 1 && z >= 2
    puts "True"
  elsif y == 1 && z >= 2
    puts "True"
  else
    puts "False"
  end
end
```

# 解説
まずa,b,cの整数の差をabsメソッドを使用しx,y,zに代入。
その後「aとbの差が1」または「aとcの差が1」であり、かつ「bとcとの数値の差が2以上」の場合のif文を作り、
それ以外は"False"の出力する。

# 模範回答
```
def close_far(a,b,c)
  x = (a-b).abs
  y = (a-c).abs
  z = (b-c).abs

  if x == 1 && z >= 2
    puts "True"
  elsif y == 1 && z >= 2
    puts "True"
  else
    puts "False"
  end
end
```

# 模範解説
まず、2~4行目の記述で、abcそれぞれの差分を算出し、絶対値に変換します。

そして6行目のx == 1 && z >= 2で、「aとbの差が1」であり、かつ「bとcとの数値の差が2以上」を検討しています。
同様に8行目のy == 1 && z >= 2で、「aとcの差が1」であり、かつ「bとcとの数値の差が2以上」を検討しています。

条件式は、以下のようにまとめて記述することもできます。
```
if (x == 1 && z >= 2) || (y == 1 && z >= 2)
  puts "True"
else
  puts "False"
end
```

# 感じたこと
数値の差を求めるabsメソッドを学習できたことは嬉しい。
日々いろいろなメソッドに触れていく中で、メソッド数の多さに驚いている。
毎日1つでもメソッドを覚えられるよう精進していきたい。

もしアドバイスやご指摘等ございましたらぜひお願いします！！

以上
cscの作法 その57

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

# 参考にしたページ

https://qiita.com/kob58im/items/fa37ef75f18b915c025f

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ee0fb22a-5ae0-1c38-a929-47249b511418.png)

# コンパイル手順

```
>cd csc

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

>csc Replacer.cs MyRichTextBox.cs

>Replacer

```


以上。