OmniAICreator/Qiita-1.07M huggingface dataset:
Code for Japanでのインターンの経験を振り返る

この記事は[CivicTech ＆ GovTech Advent Calendar 2021](https://qiita.com/advent-calendar/2021/civictech#)の6日目の投稿です。

初めまして。Code for Japanで2021年7月からインターンを始めました、ゆんと申します。
普段は公共政策・政治学などを学んでいる大学生です。技術的なバックグラウンドではないので、Qiitaを書くのも初めてです！

##参加したきっかけ
Code for Japanのインターンに興味を持ったのは、「ともに考え、ともに作る社会」というビジョンに共感したから。私は日本生まれ日本育ちながら、日本国籍をでないため選挙権・被選挙権がありません。違和感を感じつつも、私が地域や社会全体の課題、もしくは行政サービスなどに対して持てる手段は、選挙だけではないし、選挙だけでいいはずがない。そう考えていた時に、市民自身のスキルで課題解決をしているシビックテックの活動がとても魅力的に映りました。

##やったこと
インターンとしてはさまざまな活動に参画したのですが、中でも印象に残っているのがCivictech Challenge Cup 2021 （CCC2021）の運営と、加古川東高校でのワークショップのお手伝いです。

加古川東高校では、「自分たちのアプリデザインで加古川市をアップデートしてみよう！」と題して、地域の課題をアプリで解決するための授業が行われました。Code for Japan から外部講師として夏休みのお時間をいただいて、ワークショップを行いました。

（詳細はこちら：https://prtimes.jp/main/html/rd/p/000000037.000039198.html）

[Civictech Challenge Cup U-22 2021](https://ccc2021.code4japan.org/) の運営にも参加しました。こちらは学生・若者向けの社会課題解決型開発コンテストです。今年は200名以上からのエントリーがありました。中学生と高校生の混合チームが大賞を受賞するなど、本当に様々なバックグラウンドを持つ学生が参加してくださり、とても嬉しかったです。

（詳細はこちら：https://prtimes.jp/main/html/rd/p/000000039.000039198.html）

##やってみて考えたこと
インターン中に外山健太郎さんの『テクノロジーは貧困を救わない』を読み、とても印象的だったので紹介します。

著者はテクノロジー、主に情報技術が単体で革命を起こすことはありえないとし、テクノロジーが市民社会に果たす役割を「増幅の法則」で説明しています。アラブの春における Facebookの活用など、テクノロジーはすでに存在する市民の意志や意図の達成に貢献する（すでにある方向性を増幅させる）けれど、市民社会の力やユーザーの意図が成熟していない場合には無力、もしくは有害であるとしました。テクノロジーを社会課題の解決に使うためには、その利用する人の「心、知性、意志」が必要です。内面的成熟が見受けられず、意図や判断力、自制心がない社会や人間にはどのような介入パッケージもテクノロジーも無力である、というのです。

加古川東高校ワークショップの開催の経緯を加古川市の多田さんにお伺いしたところ、「地域の課題に対して全力で取り組むという体験を若いうちに持つことで、簡単には折れない、しっかりした体幹を持った人になって欲しい」という意図があったとお話されていました。この考えは、外山が重要視する「心、知性、意志」に通じる考え方と言えると思います。外山は、教育プログラムなどを通して自らの将来の目標設定や判断力を身につけ、それを持ち続ける自制心がある人がいて初めて、テクノロジーが効果的な「増幅」の機能を果たすといいます。

今回のワークショップとCivictech Challenge Cupは、非常に、非常に限られた時間の中ではありながら、その土台作りに貢献できたのではないかと考えています。

あと、最後に周りのインターンや社員さんにとても感謝しています。活動中に多くの失敗をしたのですが、それでも新たなチャレンジを積極的に後押ししてくれる環境がとても有難く、さらにパワーアップするため頑張ろうと身が引き締まります。

##これから
長くなりました。
振り返る機会があって初めて実感が湧くのですが、私自身がインターンを通して学び、得たものはたくさんあります。
現在、CCCを一緒に盛り上げてくれるインターンを募集中です！興味のあるU22のみなさん、声をかけていただけると幸いです。
Salesforce連携がすごいAppFlowの話

※[株式会社POLテックカレンダー2021](https://qiita.com/advent-calendar/2021/pol) 8日目の記事です。:point_right: [前回の記事](https://qiita.com/Abyss/items/06b280a09498f72530b2)

## 目的

Salesforce上のデータの変更を自前のAPIサーバに伝えたい。
ただしApex（ゲームではない）は書きたくない。知見がないので。

## やり方

連携基盤をAWS上に構築するなら結論↓これ。IaCしなければ**ノーコード**！
[Salesforce] -> AppFlow -> EventBridge -> [APIサーバ]

AppFlowは「SaaSアプリケーションとAWSサービス間で**コードなし**にデータを安全に転送できるようにする統合サービス」
ってことでまさにやりたいやつ。

#### 流れの概要
1. AppFlowにSalesforceの[変更イベント](https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_message_structure.htm)が飛んでくる。変更された項目や更新日時等が含まれる。
1. EventBridgeのイベントバスに変更イベントが流れる。
1. ルールのターゲット（[API送信先](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destinations.html)）に指定したAPIサーバにリクエストを飛ばす。リクエストの本文はイベントの中身を[変換](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-inputtransformer.html)する。

以上！としたいところだけどデバッグ、ログ、認証、監視、IaCの観点で補足（したかった）。

### 認証

Api Serverで認証したいケース。
実はEventBridgeのAPI送信先はOAuthのClient Credentialsに対応している。
なのでCognito等のIDaaSで認証情報を。。
力尽きたので後で追記します。

### ログ

開発段階でもデバッグの際に有用なので、イベントのロギングはとりあえずやっとけばいいと思う。
[datadogに飛ばす例](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destination-partners.html#eb-api-destination-datadog)。これはAPI Key認証を使って飛ばしてる。


## 参考

実は[AppFlowのワークショップ](https://appflow-immersionday.workshop.aws/en/salesforce.html)が用意されている。

#### ワークショップ概略

SalesforceからデータをAWSに持ってくる方法は二つ。

##### I. データの一覧を取得

Salesforceから一度に複数のデータを取得し、S3に保存。
リアルタイム性が不要ならこっちでいい。分析とか。

実行は2択

- スケジュール実行
- 手動実行

##### Ⅱ. 変更イベントの取得

Salesforce上のデータの変更時に都度Create/Update/Deleteイベントを飛ばしてもらう。
今回のように、変更イベントに対してリアルタイムに処理を実行したい場合はこっち。

## 代替案
今回と同じようなことはGCP（Apigee）の方でも出来そう。
AppFlow + EventBridge + StepFunctions感ある。
承認ステップ（メール）を挟めるの凄い。

https://cloud.google.com/apigee/docs/api-platform/integration/salesforce-setup-integration

https://docs.apigee.com/api-platform/reference/extensions/salesforce/salesforce-extension-101?hl=ja

## まとめ

「Salesforceって絶対、AWSのこと好きですよねー」
VScodeからsnyk SASTを利用する

snykエクステンションをVScodeに導入してSASTを利用したら思いの他便利だったので残しておきます。

１．まずアカウントを登録します。

以下に飛んで一番左の「FREE」をクリックします。

https://snyk.io/plans/

いくつか候補が出るので自分の好きなアカウントタイプを選んで作成します。
（特に沢山広告が来るという事も無いのでどのアカウントでも大丈夫かと）

２．アカウントを作成したらVScodeにエクテンションを追加します。
その前に自分がスキャンしたい言語をサポートしているか確認しましょう。

2021年12月現在以下の言語に対応しているようです。
aspx, CS, ejs, .es, .es6, .htm, .html, .js, .jsx, .ts, .tsx, .vue, .py, .java.

VScodeへのエクステンションの追加はVScode上から「snyk」を検索して、インストールという通常の手順ですがもし分からなければ以下のサイトを参考にして下さい。

https://docs.snyk.io/features/integrations/ide-tools/visual-studio-code-extension-for-snyk-code

先程作成したアカウントを登録して早速使い始めてみましょう。

自分は仕事柄、脆弱性のあるサンプルみたいな物を書く事が多いです。今回はPython-FlaskのサンプルをSnykでスキャンしてみました。

VSCodeのようなIDEを使っている人はコードを書いて、「ctrl+s」で保存みたいな事を良くやっていると思いますが、この保存の都度snykはスキャンをしてくれます。

以下の通り、きちんと？思い通りの脆弱性を指摘してくれました。（46行目:SQLインジェクション)

![snyk_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348313/fca42570-5411-ddaf-dff3-2cf95ce24255.jpeg)

他にも「Debugモードが有効になっているよ」という指摘もしてくれています。
ファイルごとにドリルダウンされているのが分かりやすいですね。
ちなみに左のパネルの「H」「M」は脆弱性の深刻度を表しているようです。「High」「Middle」かな。

他のSASTツールを使った事がある方は分かると思いますが、Request値を受け取ってからsink（この場合はexecute)までの処理経路の表示や移動も行えます。（「execute」をマウスオーバーする）

![snyk_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348313/2502400c-ef1a-e5e8-3a42-849707ed49c8.jpeg)

snykは脆弱性の指摘に特化したツールだと思っていたのですが、「CODE SECURITY」の他に「CODE QUALITY」のブロックもあってDBコネクションのクローズし忘れなんかも指摘してくれます。（このサンプルは可能な限り雑なコードを書いていたので色々出てます（笑）

snykのサーバーと通信出来る環境があれば、解析エンジン等のセットアップも必要無く、さっと書いて保存したら指摘してくれて、直したら「Ctrl+s」で保存して直ったかを確認出来る手軽さは他のツールには無い物だと思いました。

上記の他にGithubのリポと連携させて、コミットしたコードをスキャンする事も出来るので、CIに組み入れて自動化というような典型的な使い方も出来ます。あとsnykはIAC(Infrastructure As Code）のセキュリティ機能も持っていて、Dockerファイルをスキャンしてファイルの脆弱性やコンテナを構成するコンポーネントの脆弱性も指摘してくれます。今回のサンプルではカスタムコードからOSSを利用していないので指摘はあませんが、OSSの脆弱性を指摘する機能もあります。以下試しにDockerファイルをGitHubにアップロードしてスキャンしてみました。

![snyk_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348313/c6e549f9-61f7-fd63-add1-4cab5a5f9705.jpeg)

指摘内容は検証していませんが、元々脆弱性のあるコンテナをスキャンしたのでしっかり指摘してくれているように見えます。

またスキャンエンジンをインストールする必要が無いのでvscode.devで使えるエクテンションがリリースされれば、マシンパワーが無くても、いつでもどこでもコードを編集してスキャンなんて事が簡単にできそうな予感がします。（Chromebookとか）
ちょっとこういうのはワクワクします。

時間があれば他の機能もレポートしたいですね。

それでは。
右クリック→送る→「メール受信者」を削除してしまった場合の対処

職場のPCの「送る」メニューに色々と邪魔なものがあったので整理していたところ、「メール受信者」を削除してしまいました。修復方法を検索してみると「他ユーザーのSendToフォルダから拾ってくれば問題ない」という情報は見つかりましたが、今回は他ユーザーのSendToにあったものも削除してしまい、どうやら自PCのみでは修復不能な状況に。

というわけでそんな感じの動きをするスクリプトを書いてみました。

用意したもの
・mail.bat
・mail.ps1


```msshell:mail.bat
@echo off
pushd %~dp0

if not "%X_MIMIMIZED%"=="1" (
    set X_MIMIMIZED=1
    start /min cmd /c,"%~0" %*
    exit
)
powershell -NoProfile -ExecutionPolicy RemoteSigned .\mail.ps1 %1
popd
```

```powershell:mail.ps1
Param($filename)
$ret = $filename -match ".*\\(.*?)$"

$To = ""
$CC = ""
$Subject = "$filename"
$Body = ""

function CreateMailByOutlook {
	$outlookProcess = Get-Process -Name "OUTLOOK" -ErrorAction SilentlyContinue
    $needQuit = $false
    if ($outlookProcess -eq $null) {
        $needQuit = $true
    }
    $Outlook = New-Object -ComObject Outlook.Application
    $namespace = $outlook.GetNamespace("MAPI")
    $Mail = $Outlook.CreateItem(0)
    $Mail.To = $To
    $Mail.CC = $CC
    $Mail.Subject = $matches[1]
    $Mail.Body = $Body
    $attachments = $mail.Attachments
    $addResult = $attachments.Add($filename)
    $inspector = $Mail.GetInspector
    $inspector.Display()

	if ($needQuit) {
            [void]$outlook.Quit()
            [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook)
        }
}

function Main {
    CreateMailByOutlook
}

Main
```

これらを適当なフォルダに置いておき、mail.batファイルへのショートカットをSendToに置いてみました。

・実行結果

![sendto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366733/d9dbaf2c-b776-fae4-5412-e8588ed733fa.png)

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366733/c42846be-4996-8564-07e0-83c8e7e7314d.png)
cmdが動いているのが少し見えるので見た目が少しよろしくありませんが、やりたかった感じのことはできているみたいです。右クリックからメールを送ろうとしたときの「電子メールで送信: 」などの自動で入ってくる余計な文字列が邪魔だったので、その辺も自分で設定できるのは少し便利な感じはします。

スクリプトを作る方向でやってみましたが、このスクリプトではOutlook以外のメーラーを使っている場合には全く役に立たないという問題が残るので、通常の『メール受信者』を取り戻す方法も調べてみました。

そもそもこれってどういうファイルなんだろうと確認してみると、こんな感じのファイルみたいです。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366733/ba2d2366-b2f7-3514-0617-5912d93b29bb.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366733/8c4950fc-6c06-2803-dec8-c0e25305ae44.png)
どうやらファイル実体は「Mail Recipient.MAPIMail」という名前みたいです。テキストエディタで開いてみると中身は「Mail」とだけ書いてありました。

試しに自PCで「Mail Recipient.MAPIMail」(空白ファイル)を作成してみると『メール受信者』と全く同じ動作をするファイルになりました。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366733/fe6e7283-0dfd-18fd-03d6-ea0a05faa596.png)
（同じファイルを添付したのに上のやり方と添付ファイルのサイズが違うのはなんでなんだろう…？）

参考：
【PowerShell】Outlookを操作する
https://qiita.com/vicugna-pacos/items/b0f94c590f018c7e0d16

RedmineをあきらめたオレたちのPowerShellでのOutlookの自動操作
https://qiita.com/mima_ita/items/37ab711a571f29346830


追記：PowerShellを最新版にバージョンアップしたところ、メール送信したいファイルのパスに半角スペースが含まれている場合にうまく動かなくなりました。
mail.batファイルのPowerShellをコールしている行を1行修正したら動きました。

```msshell:mail.bat
@echo off
pushd %~dp0

if not "%X_MIMIMIZED%"=="1" (
    set X_MIMIMIZED=1
    start /min cmd /c,"%~0" %*
    exit
)
powershell -NoProfile -ExecutionPolicy RemoteSigned .\mail.ps1 \"%~1\"
popd
```
imgix と gcpを連携して動的にサムネイルを作成しよう

imgix って何？
サムネイルを動的に作ってくれてしかもメチャ軽くなるサービス。
月額最低1,000円から利用できるみたい。

サポートに問い合わせたら

>1000枚を超えると自動的に$ 6になります。たとえば、その月に1500のOriginイメージがある場合は$ 6になり、その月に2050のOriginイメージがある場合は$ 9になります。

とのことでした。

#GCP と連携

まずはGCP側で鍵を設定

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/81da14e5-e2ce-ccf1-51d8-f3fe4264e153.png)

これでユーザーアカウントのアクセスキーができました。

# imgix 側での設定

上記で作成した鍵を imgix に設定

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/c3c50fdf-73d7-c74c-31b4-2f624ac29765.png)


たったこれだけ。

# 画像を確認

https://storage.googleapis.com/pro-nail/hogera.jpg

にはもちろん画像をアップしてあるので見れる。

で、先程設定したサブドメインに変更することで

#200x200に
https://imgixgcp.imgix.net/hogera.jpg?w=200&h=200

#cropします
https://imgixgcp.imgix.net/hogera.jpg?w=200&h=200&fit=crop

#テキストも入れられる
https://imgixgcp.imgix.net/hogera.jpg?txt=The+quick+brown+fox+jumps+over+the+lazy+dog.+The+five+boxing+wizards+jump+quickly.&txt-color=000000

いやあ、かんたんですね。
Font AwesomeのSearchアイコンを検索ボックスの中に仕込む方法。

超簡単にできたので、シェア。

```html:HTML
        <div class="d-flex form-control">
          <em class="fas fa-search fa-lg search-icon-color"></em>&nbsp;&nbsp;
          <input class="search-invalid" type="search" placeholder="Ex:ULALA series" v-model="keyword">
        </div>
```

```CSS:Sass
  .search-invalid {
    background-color: #fff;
    border: 0px;
    font-size: 16px;
  }
```

![スクリーンショット 2021-12-08 16.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18072/b2e47c10-c381-b04c-c18c-9529c2d80eaa.png)


てな感じです。
前提条件としては、Vue.js （ うちは Nuxt.js ）を使いつつ、Bootstrap5とfont awesome5が入っていてと言う感じです。

なので、bootstrap5のform-controlでdivに定義し、ページ単位もしくは、assets配下のcssを上書き追加するかして、このsearch-invalidというcssをつけて、inputに標準で付いてくるCSSを打ち消せば（実質上書き）、美しく表示されると言うわけです。

いろいろ調べましたが、そこそこ面倒くさく書いてあったので、単純に表示だけ追加したければこれでいけます。
この他検索窓には、絞り込みするためのコードがJSで定義してある感じです。
[JavaScript] 文字列中での変数展開（テンプレートリテラル）

JavaScriptにおいて、文字列中に変数や式を埋め込むことができる***テンプレートリテラル***についてまとめておく。これは、```+```を用いて文字列を連結させる方法より、簡潔に書くことができる。

# 書き方
***テンプレートリテラル***を使用して、変数や式を埋め込む書き方のポイントは以下の2点である。
***①　文字列を「``` `（バッククォート）```」で囲む。***
***②　文字列に埋め込む変数や式を```プレースホルダ${}```で囲む。***
①は「```'（シングルクォート）```」ではないことに注意。

# 実装例

```javascript
const price = 120;
const number = 3;

// + を使用した場合
const plus = "単価は、" + price + "です。" + number + "個買うと合計" + price * number + "円です。";
console.log(plus);    // 単価は、120です。3個買うと合計360円です。

// テンプレートリテラルを使用した場合
const template = `単価は、${price}です。${number}個買うと合計${price * number}円です。`
console.log(template);    // 単価は、120です。3個買うと合計360円です。
```

#まとめ
今回は変数展開を中心に***テンプレートリテラル***をまとめてみた。
この***テンプレートリテラル***は他にも以下の2点の特徴がある。
①　改行コードを記述しなくても、コード上の改行が反映される。
②　「```\(バックスラッシュ)```」でエスケープ処理ができる。
Playwrightを使ったE2E_GUIテスト自動化（環境構築）

​​​​今回はSeleniumのように無償で利用できるテスト自動化ライブラリ「Playwright」について紹介させていただきます。
本記事では、Playwrightのインストールと動作確認までの記事となります。

今後、使い方やちょっとした応用編の記事を自分用としても投稿しようと考えています。

# 1.はじめに
Playwright とは、Microsoftが中心になって開発するNode.js上からブラウザを操作するためのライブラリです。
https://github.com/microsoft/playwright​​​​​​​
2020年冬にリリースされ、以下の言語とブラウザに対応しています。

|言語|対応ブラウザ|
|---|---|
|JavaScript|Chrome|
|TypeScript|Edge|
|Python|Firefox|
|C#|Safari|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/1b4c9ac8-afb1-ed96-594c-67533dcfb9ee.png)

# 2.Playwright_環境構築
PlaywrightはNode.jsをベースとして動くライブラリのため、下記のものをインストールする必要があります。

- Node.js (インストールの参考サイト：https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b）
- npm (Node.jsをインストールすることで同時にインストールされます)

本稿では、下記のバージョンでPlaywrightを使って解説していきます。

|環境|
|---|
|Windows 10 20H2|
|Node.js v14.15.4|
|npm 6.14.10|

# 3.インストール
1.作業用フォルダを任意の場所に作成する
2.コマンドプロンプトを起動し、作業用フォルダに移動する
3.下記コマンドを実行する

```
$ npm init -y
```

4.作業用フォルダ内に、「package.json」が作成されていることを確認する
5.確認後、下記コマンドを実行する

```
 $ npm install -D playwright
```

6.動作用のスクリプトファイルを作成する。(test.js　内容は以下をコピペする)

```JavaScript:test.js
 const { chromium } = require('playwright');
 
 (async () => {
     const browser = await chromium.launch();
     const page = await browser.newPage();
     await page.goto('https://www.whatismybrowser.com/');
     await page.screenshot({ path : 'example.png'});
     await browser.close();
 })();
```
7.コマンドプロンプトから下記のコマンドを実行し、動作確認を行う

``` 
$ node test.js
```

![Playwright_l環境構築.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/c4bce9f2-0842-e138-dec9-815d904b7af3.gif)


# 4.キャプチャリプレイ
Playwrightでは、ユーザー操作を記録しコードを自動生成する機能があります。
この機能ではChromiumをデフォルトとしてブラウザを起動しコード生成を行います。
以下の操作手順のコードを自動生成したいと思います。

**【記録する手順】**
１．WikipediaのTOPページを開く
２．検索欄に[ test ]と入力し検索
３．[ ソフトウェアテスト ]の項目(link)をクリックする

**【作成手順】**
1.コマンドプロンプトを起動
2.作業用フォルダの場所へ移動
3.以下のコマンドを実行

```
$ npx playwright codegen "URL"
```
※”URL”には、テスト対象のWebページのURLを記述してください
（例えば、Wikipediaだと```$ npx playwright codegen "https://ja.wikipedia.org/wiki"　```
4.ブラウザが起動するので、操作を行う
操作を行うと右側にplaywrightの画面が表示され操作を記録されます
5.記録画面のコードをコピーし、ブラウザを閉じる

![Playwright_キャプチャリプレイ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/3a8e8d94-ccef-2d6e-4cae-0c12daf885ac.gif)

# 5.おわりに
今回は環境構築とキャプチャリプレイでのコード生成について執筆しました。
次回以降はコーディングでのPlaywrightスクリプト生成（Web要素の識別、アサーションなど）を執筆しようと思います。

-以上
Google Cloud AutoML Tables を使った太陽光発電量予測

KCCS APIサービスの過去気象予報を利用した太陽光発電量予測について、過去の記事で一般的に日射量と太陽光発電量に相関関係があるといわれているため日射量をつかって予測する、とのべました。

https://qiita.com/kccs_api1/items/360d6b135030f46eb5b1

今回は、一般的にいわれている太陽光発電量と日射量の相関関係がある説は正しいのか、Google CloudのAutoML Tablesをつかって検証してみたいと思います。


###データ作成
まずは、上記の記事を参考として、1時間ごとの過去気象予報と発電量のデータを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194651/9d89de07-13d3-cd11-6cb8-ed0cdfb82420.png)

####項目一覧

| 項目名 | 内容 |
| :--- | :--- |
|timestamp|対象日時|
|pv|1時間の発電量|
|wind_speed|風速（m/s）|
|wind_direction|風向（360度）|
|temperature|気温（℃）|
|humidity|相対湿度（%）|
|rain|降雨量（mm/h）|
|total_cloud|全雲量（%）|
|upper_cloud|上層雲量（%）|
|middle_cloud|中層雲量（%）|
|lower_cloud|下層雲量（%）|
|isolation|日射量（W/m^2）|
|altitude|南中高度|
|angle|南中角度|

###AutoML Tablesでのトレーニング
上記ファイルをAutoML Tablesでトレーニングしてみます。
ターゲット列(目的変数)に「pv」を設定し、その他は特徴量とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194651/7438a934-f3fd-67ea-4bc7-9cdf6ff21132.png)

###トレーニング完了後
####精度
トレーニングが完了すると、精度が表示されます。
r^2※1をみると、精度は良さそうです。
※1: r2乗（r^2）は、ラベルと予測値間のピアソン相関係数の2乗です。この範囲は 0～1 で、値が高いほど高品質のモデルであることを示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194651/28cf501c-be66-1471-7ca5-72c5e805afb5.png)


####特徴量の重要度
トレーニングが完了すると、特徴量の重要度が出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1194651/e94b9dda-05b1-ed64-5ef7-c7eec825e389.png)

###考察
やはり、日射量が最も相関があることがわかります。
南中高度も相関がありそうですが、昼間に発電することを考えると、擬似相関ともいえるのでは、と考えました。
風速が他の特徴量と比較して高いことが想定外でした。
こちらの原因を探ってみるのも面白いのかな、と思いました。

逆に、降雨量がほとんど相関がない、というのも想定外でした。
降雨量をそのまま特徴量として使うのは適切ではないのかもしれません。

AutoML Tablesは、どの特徴量が有効なのか分からないとき、そもそも、これらの特徴量を使ってどの程度、精度が高いモデルを作れるのかをみる時に有効かと思います。
sliceとspliceの違いそろそろ覚えるぞ！！

sliceとspliceがしっかりと使い分けられるように備忘録として残しておく。
元々この2つのメソッドがあるのは知っていたが、オリジナルアプリを作成した時に一度も使っていなかったので、すぐ使えるようにと思って書いていく。
すぐ使える状態にあれば、オリジナルアプリのコードの幅がもう少し広がったと思う。

## slice
sliceは断片、一部分という意味。
**元の配列に変更を加えず、新しい配列を生成する。**

#### array.slice([start[, end]])
・startは取り出しの開始位置を示すインデックス
※startが指定されなかった場合は、インデックス0から開始される。
※startが入れるのインデックスの範囲よりも大きい場合は、空の配列が返される。  
・endは取り出し直前の位置を示すインデックス
※end自体は含めず、その直前までを取り出す。
※endが省略された場合は、配列の最後まで取り出す。  

```javascript
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

const newAnimals = animals.slice(2,3);

console.log(animals)     //Array ["ant", "bison", "camel", "duck", "elephant"]
console.log(newAnimals)  //Array ["camel"]
```  

**返り値**
sliceは元の配列を変更せず、新しい配列を返す。  

## splice
spliceは接合する、繋ぎ合わせるという意味。
**元々の配列に変更を加える。**

#### splice(start, deleteCount, item1)
・startは配列を変更する最初の位置  
・deleteCountはstartの位置から取り除く個数を示す整数
※0だった場合はどの要素も取り除かれない。 

・item1は配列に追加する要素
※要素を指定しなかった場合、splice()は単に配列から要素を取り除く。
　

```javascript
const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');

console.log(months); //Array ["Jan", "Feb", "March", "April", "June"]
```

## 結論
　細かい使い方の違いはあるけど、sliceが新しい配列を生成し、spliceが元々の配列に変更を加えるという大きな違いを理解してあとは使いながら理解していければなって感じですね（笑）。
ドキュメント読みながらまとめてみると理解が深まったのであとはどんどん使っていきます！
PythonのSubscriptableなオブジェクトとIterableなオブジェクトの違い

#きっかけ
TypeError: XXXX object is not subscriptable
となってしまったのはなぜ？

# 定義
## Iterable
一度に自分のメンバーをリターンすることのできるオブジェクトのこと。
```__iter__()```メソッドや```__next__()```メソッドを持つ。
StrもIterableである。
## Subscriptable
obj[key]でメンバーを取得できるオブジェクトのこと。ListやDictionaryもSubscriptableである。
```__getitem__()```メソッドを持つ。

#関係性
___Iterable ⊂ Subscriptable___
である。つまり、IterableではあるがSubscriptableではないブジェクトがある。
例えばsetである。setオブジェクトは順番を保証しないので、当然インデックスも存在しない。よって次のようにiterationできるのに、インデックスを指定するとnot subscriptableというエラーが出る。

```
se = {'aa','bb','cc'}
for x in se:
  print(x)
```

↓

```
aa
bb
cc
```

となるが、

```
se = {'aa','bb','cc'}
print(se[0])
```

↓

```
TypeError: 'set' object is not subscriptable
```
である

https://stackoverflow.com/questions/69232511/what-is-the-difference-between-iterable-and-subscriptable-are-there-any-objects
11月末にリリースされたばかりのReactベースの最新フルスタックフレームワーク「Remix」を使って、小規模アプリを作ってみたかった

# はじめに
はじめまして！
会社員やりつつ、趣味で個人開発を行っております。
フロントエンジニアのふぁると申します。

【Twitterリンク】
https://twitter.com/@fal_engineer


# Remixについて
https://qiita.com/Itamaster/items/5f44dc785f3faf268fb6
> Remixとは、2021/11/23にOSSとしてリリースされたばかりの、Reactをベースにした新しいフルスタックフレームワークです。
Reactベースのフレームワークというと、Next.jsがスタンダードですが、RemixはNext.jsやGatsbyとは一線を画す設計思想となっています。
具体的には、SSG（静的HTMLを予めジェネレートし、ブラウザにはHTMLを配信する形式）を撤廃し、SSR（サーバーにレンダリングの責務を持たせる方式）、ブラウザのFetchAPI等のエコシステムを利用し処理・描画速度の向上を図っています。

# 作ったアプリ

https://tubemix.netlify.app/

## 動画を「探す」のではなく、「見つける」サービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/9bc8e8ee-6581-15fb-b30c-98aece9b1b31.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/68bc648c-0a5e-aef6-8802-7e02021de9e3.png)

テキストボックスに八文字の文字を入力し、「動画を見つける」をクリックすることで、Youtubeから適当な動画を一つ拾ってくるというアプリです。
YouTubeAPIv3を利用しています。

入力された文字と、ヒットする動画に関連性はないのですが、ヒットする動画はランダムではありません。
入力された八文字を全て文字コードにコンバートし、文字コード同士の四則演算を行い、最終的に五文字の「サーチワード」を生成しています。

動画がヒットした場合は、取得した動画のVideoIdというパラメータをiframeにセットし再生ウィンドウを生成します。

## 設計思想

imgurという画像のアップローダがあります。
imgurは某掲示板ではデファクトスタンダードとして利用されていたのですが、アップロードされているファイルのimgur内でのURLのid部分に適当な文字を入れて、「一番面白い画像出てきた奴の勝ちな！」みたいなゲームが盛り上がっていたことを思い出しました。
あれをやりたかったんです。

## なぜクソアプリとなったのか。作り込まなかったのか。

YoutubeAPIv3は、APIキーをgoogleアカウントに紐づけて利用するのですが、
APIを利用するにあたり、週あたりの利用限度が設けられています。
利用限度が週では10,000クォーターで、チャンネルの情報の取得や、idから動画を見つける、といったAPIは1クォーター程度しか使われません。
しかし、このTubeMixで使っているAPIは検索ワードを元にsearchするもので、それだけなんと100クォーターも消費されてしまうのです。
TubeMixは、動画がヒットするとも限らないのに、100回使えば一週間誰も使えなくなるという仕様なのです。

本当はランキング機能を実装してみたり、イベントを開催したりして遊びたかったのですが、これではいけません。
そもそもの仕様に問題があるのです。

## タイトルの意味

Remixの話を最初に挙げましたが、もちろんこのアプリもRemixで作り始めました。
Remixの開発サーバーではきちんと動いたのですが、なんと、Netlifyにデプロイしようとすると何度やり直してもコケるのです。
Vercelや別のサーバーにデプロイ等も考えはしたのですが、収益化も大して望んでいない（YoutubeAPIの利用規約では、動画がメインのコンテンツであるサービスでの商用利用は出来ない事になっています）小規模アプリですし、結局そんなことするくらいならReactにコンバートしてさっさと安全にNetlifyにデプロイしてしまおうと思いました。
結局、「imgurスレみたいに皆で面白い動画見つける遊びやりたい」、「Remixでサービスをローンチまで持っていきたい」の片方すら叶わなかったのです。

クォーター上限を引き上げる申請プラットフォームもあるにはあるのですが、中々承認されにくいと聞きますし、そこまで育てたいサービスでも無いので、クソアプリアドベントカレンダーのネタとして供養しようと思いました。

以上です。お目汚し失礼しました！
flagsの機能を使ってChromeの使い勝手を改善する

## はじめに
[じげんアドベントカレンダー](https://qiita.com/advent-calendar/2021/zigexn) 13日目、担当のZX1800Rです。
中古車EXやセルトレ、TCVといったじげんグループにおける自動車関連サービスのデザインを担当しております。

今回はChrome flagsを使い、ブラウザ操作をより使いやすくカスタマイズしていきます。
[Chrome flags](https://support.google.com/chrome/answer/10612145?hl=ja)の機能別にご紹介していきます。


## 動作環境
Google Chrome 96
Google Chrome 98(Canary)


## Tab Groups Save

[Chrome83](https://support.google.com/chrome/answer/9977812?hl=ja)で追加されたタブグループを保持することができます。

現状、ブラウザを閉じるとグループ化がなくなってしまうため、使い勝手はあまり良くありません。

また、[拡張機能](https://chrome.google.com/webstore/detail/tab-group-saver-save-and/ghbdjeckopemkoomopmpgjifafpcjhga)を使うと保存はできるのですが、
閉じる時と開く時に[Save]しないといけません。（この操作を忘れると消えます）


Tab Groups Saveを有効化にすると、タブグループを保持することができます。
(正確にはブックマークフォルダがそのままタブグループ化します)

### 手順
- `chrome://flags/` を開く
- `Tab Groups Save` で検索
- 有効化する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343879/9017e244-8e2c-e075-0e9b-4fd3e6ef58dd.png)

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343879/dcaae6e2-cb87-e0e7-925b-19ac638db440.gif)


## Tab Scrolling

名前の通りタブエリアでスクロールができます。

普段使っていると、いろんなファイルを同じウインドウ内で開くので、
気が付くと下図のようになっている方も多いのではないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343879/f62ed3b5-bf35-a782-c7c7-8c2d130a49b4.png)

目的のタブがすぐに見つからず面倒なので、Tab Scrollingを有効化し、見やすくします。

### 手順
- `chrome://flags/` を開く
- `Tab Scrolling` で検索
- 好きな設定に変更
    - Enabled
    - Enabled  - tabs shrink to pinned tab width
    - Enabled  - tabs shrink to a medium width
    - Enabled  - tabs shrink to a large width
    - Enabled  - tabs don't shrink

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2343879/af120784-2a83-fe46-d355-c50958565826.gif)

これでファビコンだけにならず、各タブが見やすくなります。




動画のgif変換については、こちらを参考にしました。

https://qiita.com/rorensu2236/items/de5ea9ca092b566aabef


# おわりに
他にもキャプチャが取れる機能などが追加されているので、興味のある方は是非ご覧ください。
（ちなみにキャプチャ機能は、ダウンロードボタン押した瞬間にブラウザが落ちました。）

最後に、今年のアドベントカレンダーの中から、
面白そうなカレンダーを見つけましたので、紹介して終わります。
[存在しない技術](https://adventar.org/calendars/6774)
jqとシェル芸でJSONを作る

# シェル芸でJSONが作りたい

JSON形式のファイルを要求するCLIツールを利用する際や、簡単なWebAPIとして静的なJSONファイルを配信するような場合、コマンドラインから簡単にJSONファイルが作れると便利です。


# 一番簡単な方法

雑に以下のようなコマンドでも目的は達成できます。


```bash
$ echo "{\"test\": \"`date`\"}" > date.json
```

できてますね

```bash
$ cat date.json
{"test": "2021年 12月 8日 水曜日 15時40分59秒 JST"}
```

しかし、コマンドの実行結果に ダブルクォートや改行が含まれる場合は、話がややこしくなります。

シェル芸といえばsedなどがパッと思いつきますが、sedでJSONのエスケープ処理を頑張って記述するのも面倒です。

# そうだjqを使おう

https://stedolan.github.io/jq/

シェル芸としては邪道かもしれませんが、餅は餅屋ということで、JSON周りの処理はjqに任せてみることにしましょう。

jqは**「既に存在するJSON形式のファイルからその要素を取り出す」**という目的で使うことが多いですが、今回のように何もないところからJSON形式のファイルを作る時にも利用できます。


```bash
# いわゆる普通のjqの使い方
$ cat date.json|jq -r '.test'
2021年 12月 8日 水曜日 15時40分59秒 JST
```

```bash
# -n(--nill-input)で入力なしでjsonを処理できる、加えて代入でjsonに要素を追加できる
$ jq -n '.test = "hoge"'
{
  "test": "hoge"
}
```

# jqでJSONエスケープ

jqは`--arg`を使うことで、変数を定義できます。

```bash
$ jq --arg variable hoge -n '.test = $variable'
{
  "test": "hoge"
}
```

この変数の中にJSONエスケープが必要な文字が入っている場合はjqがうまいことエスケープしてくれます。

```bash
$ jq --arg variable 'ho"ge' -n '.test = $variable'
{
  "test": "ho\"ge"
}
```

ここまでくればあとは簡単です。
実行したいコマンドをjqの引数として渡すことで、JSONのエスケープのことはjqに任せてJSON形式で出力できます。

(treeコマンドをそのままJSONの要素に入れることが実際にあるかは謎ですが・・）

```bash
$ jq --arg tree "`tree`" -n '.test = $tree'
{
  "test": ".\n├── date.json\n├── hello.txt\n└── world.txt\n\n0 directories, 3 files"
}
```

# 参考

https://qiita.com/Morichan/items/3ae173db33e66cb2c9a0
【Flutter】背景画像を無限にループさせる

[Teratail](https://teratail.com/questions/365279)に投稿した内容そのままなのですが、普通に有用そうなので記事としてまとめておきます。

# はじめに
ログイン画面などで、背景が延々と流れているようなアプリを一度は見たことがあると思います。
**（僕はないかもしれません）**

このような要望は、割とアプリ開発ではあるあるかなーと思ったのですが、
調べてもあまり出てこなかったので、いろいろ調べて実装してみました。

# コード全文
今回は先にコードを提示します。
`AnimationController`を使うので、`StatefulWidget`の想定です。
また、一部抜粋なのでよしなにお願いします。

```dart
// デバイスの画面サイズ（高さ）
late double deviceHeight;

// 画像の横幅
late double imageWidth;

// アニメーションコントローラー
late AnimationController controller;

// アニメーション
late Animation<RelativeRect> rectAnimation;

// contextを受け取るために、didChangeDependenciesで初期化する
@override
void didChangeDependencies() {
  super.didChangeDependencies();

  // デバイスの画面サイズ（高さ）取得
  deviceHeight = MediaQuery.of(context).size.height;

  // 画像の縦横比
  double aspectRatio = 1.8;

  // 画像の横幅計算
  imageWidth = deviceHeight * aspectRatio;

  // コントローラー初期化
  controller = AnimationController(
    vsync: this,
    duration: const Duration(seconds: 10),
  )..repeat();

  // 1枚目が終わったら止めてリピートする
  rectAnimation = RelativeRectTween(
    begin: RelativeRect.fromLTRB(imageWidth, 0, 0, 0),
    end: RelativeRect.fromLTRB(0, 0, imageWidth, 0),
  ).animate(
    CurvedAnimation(parent: controller, curve: Curves.linear),
  );
}

@override
void dispose() {
  controller.dispose();
  super.dispose();
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: PositionedTransition(
      rect: rectAnimation,
      child: OverflowBox(
        maxWidth: imageWidth * 2, // 画像2枚分
        maxHeight: deviceHeight, // 画面の高さに合わせる
        child: Row(
          children: <Widget>[
            Image(
              height: deviceHeight, // 画面の高さに合わせる
              fit: BoxFit.fitHeight,
              image: const AssetImage('画像のパス'),
            ),
            Image(
              height: deviceHeight,  // 画面の高さに合わせる
              fit: BoxFit.fitHeight,
              image: const AssetImage('画像のパス'),
            ),
          ],
        ),
      ),
    ),
  );
}

```

アプリで使うなら、`Scaffold`のbodyに`Stack`を置いて、
アニメーションする背景の上にログインボタンを置いたりして使います。

コメント書いてるので不要かも知れませんが、一応解説しておきます。

# 画面サイズ、画像サイズ取得
今回は、**画面を覆うサイズの画像**を使うことを想定しています。
縦幅は**画面より大きくなる**ようにし、横にスクロールさせるので、**横長の長方形**になるように
画像を作ったり、作ってもらいます。
（タブレットとか考えたら縦が**最低1366px**以上？実解像度を考えたらかなり大きめに作った方がいいです）

実際にアプリに表示させる画像は、縦幅は画面サイズに合わせます。
横幅はいろんな場所で指定するので、画像の縦横比を掛けて計算しておきます。

# アニメーションの設定
今回のキモは`rectAnimation`です。
**ちょうど画像1枚分アニメーションさせて、リピートで繰り返します。**
2枚目の画像が画面の左端に来たときに最初の状態に戻ることで、切れ目のないループを作り出せます。
（逆に言えば、2枚目の画像は1枚目と同じものではなく、画面に映る範囲でいいのですが、手間なので同じ画像を使用します）

# OverflowBoxで画面サイズを超える
普通に`Row`で画像を並べようとしても、うまくいきません。
ですので、`OverflowBox`を使って親より大きくなることを許可します。
縦は画面サイズの縦幅、横は画像の横幅*2で画像２枚分ピッタリになります。
セル・オートマトンで「脳」をシンプルに実装してみよう。その2 -セルの並べ方-

前回は、「セル・オートマトン」について解説しました。
この計算モデルを使って脳をシンプルなコードで実装していくのですが、今回はそのために必要とされるシンプルな「脳のモデル」について解説します。

以下の通りに何回かに分けて解説しますが、今回はその2になります。
[その1 -セル・オートマトンとは？-](https://qiita.com/yuky_az/items/17fff285101ea365982b)
[その2 -セルの並べ方-](https://qiita.com/yuky_az/items/c134fafb9311b9c15651)
[その3 -ニューロンの配置-](https://qiita.com/yuky_az/items/cc5272d1c18270c5f7b2)
[その4 -恒常性と馴化-](https://qiita.com/yuky_az/items/9fd73452f8283262e54a)
[その5 -ヘブ則の導入-](https://qiita.com/yuky_az/items/065b764f59e2720214c2)

# セルの並べ方
今回セル・オートマトンでシミュレートするのは「大脳皮質」のみです。
大脳皮質は大脳を膜状に覆う部位で、さまざまな情報を統合し「心」や「意識」などの重要な役割を担います。
ヒトの大脳皮質は、非常に大雑把にですが半球面の形状をしています。
![brain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35297/9bb56ad5-2f5e-4d16-671c-e7efd3fc9420.png)
（https://ja.wikipedia.org/wiki/大脳皮質 より引用）

大脳皮質を模するのであれば、近い形状のネットワークを作るのが妥当そうです。
しかしながら、今回は球面や半球面ではなく「トーラス」上に多数のニューロンを配置することにします。
トーラスは、以下に示すようなドーナツ状の立体です。

![Torus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35297/9a816db2-b82d-17e2-a873-0d7ebd9fc127.png)
（https://ja.wikipedia.org/wiki/トーラス より引用）

トーラスの表面は、まるで30年前のRPGのように上端は下端につながっており、左端が右端につながっている世界です。
このようなトーラスに表面上に格子状にニューロンを配置すれば、世界を「行列」として扱うことが可能になり、コンピュータ上での扱いが楽になります。
そして、この各格子、すなわちセルに仮想的な神経細胞を配置することで、仮想的な大脳皮質を作ってみることにします。

今回は、トーラスの表面上に、仮想的な神経細胞を256 × 256 = 65536個格子状に配置します。
ヒトの大脳皮質に神経細胞は約100億なので、これと比較すると大幅に少なく、昆虫程度の神経細胞数になります。
しかしながら、たとえばミツバチの場合、巣箱から餌場までの距離と方向を、太陽の方向を基準に正確に8の字のダンス言語によって仲間に伝えます。
また、ハエはアクロバティックな飛行をし障害物を難なく避けることができます。
このような昆虫の高度な認識能力、社会性は数10万個程度の神経細胞で実現されています。
そういう意味で、今回の神経細胞数65536は何らかの知能を発揮するために決して少ないニューロン数ではないかと思います。

なお、動物の神経細胞数に関してはこちらに一覧があります。
https://ja.wikipedia.org/wiki/動物のニューロンの数の一覧

今回の「その2」では、脳を模したセル・オートマトンにおけるセルの並べ方について解説しました。
「その3」に続きます。

なお、本記事の内容は、拙著「[あたらしい脳科学と人工知能の教科書](https://www.shoeisha.co.jp/book/detail/9784798164991)」をベースにしています。

【コミュニティ「自由研究室 AIRS-Lab」】
「AI」をテーマに交流し、創造するコミュニティ「自由研究室 AIRS-Lab」が活動中です。
​https://www.airs-lab.jp/​
サイコロを振る

#サイコロを振る。
pythonを用いて、簡単なサイコロ試行を実装してみる。

##必要なライブラリのインポート
```python:
import numpy as np
import matplotlib.pyplot as plt
```

##サイコロを振る
サイコロをN回振って、出目のヒストグラムを作成する。
N=100だとばらつきがあるが、N=10000だとすべての目の出現率がほぼ同等になる。

```python:
# 出目を用意
dice = [1,2,3,4,5,6]

# サイコロを投げる関数
def throwDice(N):
    result = np.random.choice(dice, N, replace=True)
    return result

# 出目のヒストグラム
plt.figure()
for n in [100,10000]:
    plt.hist(throwDice(n), bins=6, density=True, alpha=0.3, label="N={}".format(n))
plt.legend()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578196/e778f776-98a2-19ce-9a0e-070a8108b528.png)

###出目の確率を調整したサイコロを振る
イカサマサイコロを振る。
1,2,3の目に対して4,5の目は3倍出現しやすく、6の目は6倍出現しやすい。

```python:
# 確率分布を変更
pb = np.array([1,1,1,3,3,6]); pb = pb/np.sum(pb)

# 確率分布を調整したサイコロを投げる関数
def throwDicePb(N):
    result = np.random.choice(dice, N, p=pb, replace=True)
    return result

# ヒストグラム
plt.figure()
for n in [100,10000]:
    plt.hist(throwDicePb(n), bins=6, density=True, alpha=0.3, label="N={}".format(n))
plt.legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578196/baf4e7fa-704a-c51c-f2b9-0dee77dadc7e.png)

##サイコロをN投げてその平均をとる

```python:
#　サイコロをN回投げて平均をとる
def throwDiceMean(size, N):
    result = [np.mean(throwDice(N)) for i in range(size)]
    return result

# サイコロを10回投げて平均をとる試行をs回行う
plt.figure() 
for s in [100,10000]:
    plt.hist(throwDiceMean(s,10), bins=30, density=True, alpha=0.3, label="size={}".format(s))
plt.legend()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578196/56e115e1-c04b-4029-00b6-048aa708ed23.png)

サイコロの目の平均値3.5を中心とした正規分布に近づく。

##同様の試行をイカサマサイコロで行う

```python:
def throwDiceMeanPb(size, N):
    result = [np.mean(throwDicePb(N)) for i in range(size)]
    return result

# サイコロを10回投げて平均をとる試行をs回行う
plt.figure() 
for s in [100,10000]:
    plt.hist(throwDiceMeanPb(s,10), bins=30, density=True, alpha=0.3, label="size={}".format(s))
plt.legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578196/35d5157b-226a-a83b-90e7-0bc110f6557f.png)

こちらも試行回数を増やしていくほど、正規分布に近付く。
HomeAutomationいろいろ

最近のHome Automationの動向をつらつらと書いていきます

# スマート赤外線リモコンでテレビの操作
[nature remo](https://nature.global/)などでテレビを操作する場合、ある課題にぶち当たる。
電源のOn/Offが同一の信号になっている点だ。
### 課題：OnにしたいのにOffになってしまう
HomeAutomationはスマート赤外線の操作だけでなく

- 付属リモコン
- PS4やSwitchなど接続機器によるWake Up
- 手動操作

が想定される。

つまるところ、コントローラ側でテレビのステートを持たせたステートフルな操作が必要
しかし赤外線はステートフル

### 対策：HDMI CEC操作
上にも書いた通り、PS4などを点けるとテレビも勝手に起動する機能があります。
それはHDMIのCEC信号を送信すると操作できるそうです。
また、音量操作や入力切替もできるそうです。

# 家電を視覚化したい
おすすめは[これ](https://www.home-assistant.io/)
Dockerだと動作しないので(Host Networkで動作)、ラズパイ1台まるまる動作させる必要がある
利点としては

- プラグインが作成でき、ある程度自由に拡張できる(Nature Remoの拡張等)
- [アプリ](https://apps.apple.com/us/app/home-assistant/id1099568401)版もある
- DashBoardがある
- 保存先をS3やDBへ変更できる
- 見た目がイケてる

# IoT標準化団体 Matter
以前はCHIPというワーキンググループだったが、標準規格として発表する際にMatterへ(2021)
GoogleやApple、Amazonはこれに準拠していく方針を打ち出しており、ベンダーの対応が1企画に集約される。
(厳しすぎて対応数が少なすぎるApple HomeKitが普及するかも)

# おすすめのIoT製品
## スマートロック
[Sesame3](https://jp.candyhouse.co/products/sesame3)一択
他の製品は月額などが発生したりで、ランニングコストが高い。
Sesame3は買い切りでOK＋本体代が安い(本体＋Wifiドングルで1万円以下)

兄弟製品の自転車鍵の[Sesameサイクル](https://jp.candyhouse.co/products/sesame3-bike)もおすすめ。
## スマート赤外線
[nature remo](https://nature.global/)がおすすめ

- APIが公開されている
- ローカルAPIも公開されているので、サービス終了しても問題ない
- 赤外線の送信本数が多いのか、SwitchBotよりも届きやすい

## QNAP
スマート家電ではないですが、Dockerも動いてRAIDもホットスワップもやってくれる便利なNAS。
ラズパイの保存先ディスクとしてつかっていますが、とても有能。大体のことはGUIポチポチで済みます。

## NFC
iOSにはアプリの呼び出しやちょっとしたスクリプティングが実行できる[ショートカット](https://time-space.kddi.com/mobile/20191120/2783#:~:text=iOS%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%80%8C%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%80%8D%E3%81%A8%E3%81%AF,%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82)が提供されている。

iPhone12からはNFCをトリガーにショートカットの実行が可能になっており、
[NFCシール](https://www.google.com/aclk?sa=L&ai=DChcSEwjP04mrwdP0AhUJdmAKHXhnC3YYABAEGgJ0bQ&ae=2&sig=AOD64_3SFdk-aQSin5X6qlniOPdrW-M90A&ctype=5&q=&ved=2ahUKEwjdp4GrwdP0AhXEE4gKHfVaBXMQ9aACegQIARBB&adurl=)を張り付けて、iPhoneでスキャンすると呼び出すことができる。

例えば、鍵の開錠をトリガーにしたNFCを玄関前の郵便受けに着けておいて、スキャン→玄関にたどり着くころには開くといったことが可能になる。
ただ、読み取り感度が悪く使いづらいとこもある



# お～しまい
なんでもナイトコアにする２

https://qiita.com/o________o/items/48b370b0628762f42483

これの続き

#　今回やること 
早くした上でさらにピッチを上げる

なんかこれでやった実装でピッチ上がったから流用する

https://qiita.com/o________o/items/0bcb7a3695e2610ce6f6

# ナイトコアにする
ピッチ上げて早くする

```python:
import librosa
import soundfile as sf
import pydub
from pydub import AudioSegment

path = "motoneta.mp3"
path_pitchup = "pitchup.wav"
path_nightcore = "nightcore.mp3"

# ピッチあげる
y, sr   = librosa.load(path , mono=True)
y_slow  = librosa.effects.time_stretch(y, 0.5)
sf.write(path_pitchup, y_slow, 44100, format='wav', subtype='PCM_24')

#早くする
base_sound = AudioSegment.from_file(path_pitchup, format="wav")
base_sound = base_sound.speedup(playback_speed=2, crossfade=0)
base_sound.export(path_nightcore, format="mp3")

```

おしまい

# 聞いてみた

ゴミ

https://soundcloud.com/bjack_mijilme/python-nightcore

原曲

https://www.youtube.com/watch?v=DBjzZwiFy20

# 今後の展望

>リミックスの加工は主に原曲の再生速度を数％速くして、テンポとピッチを上げている

wikiに書いてあるのこれだけど、これ以上なんかやることあるかな？
音的なところでなんかあったらコメントください

あとなんかyoutubeのナイトコア動画のサムネみたいな画像作ってみようかな
【PMMP】特殊アイテムの作り方

# 謝罪ッ！
PMMPを全然触ってないので文法がガバガバだし動作しないかも（笑）
PMMP3.xの書き方です。暇があれば4.0の書き方も追記します。

# ウンコード
実はずっと前にPvP鯖を運営していました。
その際に特殊なアイテムを実装しようということで、以下のようなコードを書いておりました。

```php:EventListener.php
class EventListener implements Listener {
    public function onInteract(PlayerInteractEvent $event) {
        $item = $event->getItem();
        switch ($item->getId()) {
            case 0:
                // かっこいい機能
                break;
            case 1:
                // 面白い機能
                break;
            case 2:
                // 素晴らしい機能
                break;

            // このあともcase n:が永遠に続く。。。
        }
    }
}
```

1個の.phpファイルに複数のアイテムの処理を書いており、なんと1000行を超えてました。
今にしてみれば地獄のようなコードです。

# マシな書き方
ブレイズパウダーを持ってブロックをタップすることで、半径10m以内のプレイヤーに✟闇の炎✟をくらわせるアイテムを例に書いていきます。

## アイテムクラスを作る
pocketmine\item\Itemを継承したクラスを作成します。
ブロックをタップした際にonActivateが呼び出されるので、この中に処理を書きます。

```php:XxDarknessBurstxX.php
<?php

// 省略

use pocketmine\block\Block;
use pocketmine\item\Item;
use pocketmine\item\ItemIds;
use pocketmine\level\sound\BlazeShootSound;
use pocketmine\math\Vector3;
use pocketmine\Player;

class XxDarknessBurstxX extends Item {
    public function __construct() {
        parent::__construct(ItemIds::BLAZE_POWDER, 0, 'XxDarknessBurstxX');
    }

    // オーバーライド
    public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector): bool {
        $level = $player->getLevel();
        $level->addSound(new BlazeShootSound($player)); // 発動音
        foreach ($level->getPlayers() as $p) {
            if ($player !== $p && $player->distance($p) <= 10) {
                $p->setOnFire(10);
                $p->sendTip("闇の炎に抱かれて消えろっ！");
            }
        }
    }
}
```

## 作ったアイテムを登録する
先ほど作成したアイテム(XxDarknessBurstxX)をPocketMine-MPに登録したら完了です。プラグイン起動時に登録しましょう。

```php:Main.php
<?php

// 省略

use pocketmine\item\ItemFactory;
use pocketmine\plugin\PluginBase;

class Main extends PluginBase {
    public function onEnable() {
        ItemFactory::registerItem(new XxDarknessBurstxX(), true); // 第2引数は必ずtrueにしてください
    }
}
```

# いかがでしたか？
高評価とチャンネル登録お願いします。
Minecraftサーバ開発・運営 Advent Calendar 2021 次の記事はこちら → [非同期ってナンダ](https://qiita.com/ribnil/items/8ee46cc8e59fac8dccc6) | @ribnil 

ちな12月15日は神PMMPer ribnil の誕生日！
おめでとうribnil！
🍺Happy🚬Birthday👩
[Swift] Firebase Storageでダウンロードできない問題(Could not reach Cloud Firestore backend.)

アップロードできるし認証もできるのに、ダウンロードだけできない現象。
しかもエラーもなにもレスポンスが何一つ帰ってこない。

ログを見ると

```
Could not reach Cloud Firestore backend.
```
# 回答
https://github.com/firebase/firebase-ios-sdk/issues/7615

セマフォでメインスレッド止めてたみたい。。。(´・ω・)ｾﾞｯﾀｲﾀﾞﾒ
Google Colaboratoryでローカルランタイムを使用してみた

#はじめに
ウェブブラウザ上でpythonを実行できてソースの共有も楽に行えるGoogle Colaboratoryですが、複雑な機械学習の処理を行うと時間がかかる上にランタイムに時間制限があるため、時間制限が切れるとデータセットの読み込みからやり直す必要があり煩雑な面もあります。最終的に手持ちのgpuマシンの性能を使うことを目標に、まず今回はローカルランタイムを使用することでランタイムの時間制限という欠点を克服してみました。
Windowsを使用していれば問題なく行えるはずですが実行した環境はWin10 Pro for Workstationsです。
#jupyterのインストール
以下のリンクからインストーラをダウンロードしてガイドに従ってインストールを行います。

https://www.anaconda.com/products/individual

完了したらスタートメニューからanaconda promptを開きます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/bc4616f6-120d-52d3-e4b1-3152a06c4539.jpeg)
Google Colaboratoryと連携できるようにするため、拡張機能jupyter_http_over_wsを導入します。以下を入力します。
```pip install jupyter_http_over_ws```
つらつらと前提条件を表示した後完了すると以下が表示されます。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/982a3085-48c9-59c2-b1c8-97a937cd492c.png)
これでインストールは完了となります。
エラーが発生する場合はAnaconda Promptを管理者として実行してください。
次に以下を入力してこれを有効化します。
```jupyter serverextension enable --py jupyter_http_over_ws```
完了すると以下のように表示されます。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/b2bbbd11-8251-aa62-7fe5-bd862ff1ffb7.png)


#Google Colaboratoryの設定
同様にAnaconda Prompt上で以下を入力しjupyter notebookを起動します。
```jupyter notebook ^
--NotebookApp.allow_origin='https://colab.research.google.com' ^
--port=8888 ^
--NotebookApp.port_retries=0```
この時に表示されるhttps:以下のURLをコピーしておきます。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/68c8493d-96e5-0b9e-a6c8-3348bd3bed03.png)


画像

次にGoogle Colaboratory側の操作に移ります。Google DriveなどからGoogle Colaboratoryノートブックを作成します。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/cfed5512-b583-db51-188c-677b8d22e04c.png)
画面右上の__接続__の横にある下三角マークをクリックし__その他の接続オプション__を開きます。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/418a27a0-1bc2-c3d7-4306-7b299a6b68e4.png)
プルダウンメニューから__ローカルランタイムに接続__をクリックし、開いたウィンドウの__バックエンドURL__に先ほどコピーしたURLをペーストします。(実行したタイミングの問題で異なるURLになっていますが実際には上のものと同じ内容を入力します。)
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2299427/09260388-be15-624b-fc8c-63a1150b14c1.png)
この状態で__接続__をクリックして、先程まで__接続__と表示されていた場所が下図のように__接続済み(ローカル)__と表示されていれば接続完了です。
#注意
これで時間制限なくランタイムを使用できるようになったわけですが、今までGoogle Colaboratoryで行えていたGoogle DriveのマウントやColaboratoryに標準搭載されていたライブラリが使用できなくなるため、データはローカル参照する、URL指定して読み込むほか、ライブラリはAnaconda Promptなどから手動でインストールを行わなくてはならなくなった点は注意が必要です。
#GPUを使用したい？
これらの手順でローカルランタイムを使用できるようになりましたが、通常CPUのみを使用することになります。GPUを使用したい場合はtensorflow_gpuとこれに合致するバージョンのPython、cuDNN、CUDAをインストールし、適正な設定を行う必要があります。
バージョンの対応は以下から確認できます。

https://www.tensorflow.org/install/source#common_installation_problems
IPアドレスの例示で xxx.xxx.xxx.xxx を使うな

# 悲劇は起こった…

## ある日のLINE

A氏「IPアドレスについて教えて欲しい！」

B氏「IPアドレスっていうのは xxx.xxx.xxx.xxx っていうフォーマットの…」

A氏「このリンクなに？」ﾎﾟﾁｰ

＼ﾌﾜｰｵ♡／

B氏（YABE）

## 何が起こったのか

LINE や Twitter などの SNS は投稿されたリンクを自動的に飛べるようにしてくれます。
今回不幸なことに、この .xxx というドメインは存在し、xxx.xxx というドメインは登録されていました。


 参考：

- [ドメイン (domain)とは |「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12275.html)
- [ドメイン名の種類 JPNIC](https://www.nic.ad.jp/ja/dom/types.html)

そして .xxx ドメインの用途はよりによって…

||用途|登録対象|
|---|---|---|
|xxx|アダルトエンタテイメント業界用|アダルトコンテンツやアダルトサービスなどを提供している組織もしくは個人|

### > アダルトエンタテイメント業界用 <

## >> アダルトエンタテイメント業界用 <<

# >>> アダルトエンタテイメント業界用 <<<

_**Oh... oops**_

さらに xxx.xxx のドメインは丁寧なことに 192.168.xxx.xxx や xxx.xxx.xxx.xxx といったサブドメインもバッチリ xxx.xxx に誘導してくれます。

## 例示したいときは…

Wikipedia内に[IPv4#特別用途のアドレス](https://ja.wikipedia.org/wiki/IPv4#%E7%89%B9%E5%88%A5%E7%94%A8%E9%80%94%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)の表があります。こちらのドキュメント用のものをつかうか、ドメインを確認した上で `x.x.x.x` や `192.168.x.x`とかにしたほうがいいかもしれません。また現在ドメインに使える記号は`-`のみのため、`***.***.***.***` でもいいかも。

参照:

- IANA (Internet Assigned Numbers Authority) - [Root Zone Database](https://www.iana.org/domains/root/db)


# IPの例示・ドメインには気をつけよう！

Qiitaのようなリンクを指定できるサイトではいいですが、自動でリンクを付与してくれるサイト・サービスを使うときは気をつけましょう…
CatallaxyのクラウドIDE（開発環境編） 2021

こんにちは、あの方と呼ばれるものです。名探偵コナンが好きすぎて、そう呼ばれています。今月に入り来春公開予定のトレーラーが公開されてテンションは上がっています。
そういう理由で遅れてしまっていますが、[Catallaxy Advent Calendar](https://qiita.com/advent-calendar/2021/catallaxy) 3日目を担当します。テーマは2021年後半のCloud IDE。

クラウド上の開発環境が流行っています。きっかけはM1マシン上のDockerと言っても過言ではありません。

# Catallaxyとクラウド開発環境

2021年の春ごろにGCPを多く使うようになったので、全エンジニアレベルでGCE VMインスタンスを使うことになりました。これは当社が[GCP for Startups](https://cloud.google.com/startup)というスタートアップ支援プログラムを受けるようになったことも影響しています。それ以前は個人のPC上に構築していたエンジニアが多かったように思います。

しかし時代は2021年。AWSによるCloud9の買収から5年（[AWS Cloud9](https://aws.amazon.com/cloud9/)）もの月日が流れています。さらにGitHub Codespacesも今年の夏にGAリリースしました。我々もそろそろ開発者体験をよくしたいと思い、重い腰を上げることにしたのです :muscle: :muscle: :muscle: 

## GitHub Codespaces

当社のOrgでもBetaプログラム期間中に申し込んでいたのですが、ベータ利用申請して割とすぐに利用できるようになりました。当社のOrgで参加承認されたのがGAの数日前だったようです。1ヶ月の無償期間中があったので、ちょうど開発中であった新規プロジェクト(Repo)で1個目のCodespaces対応を急ぎ目で進めることにし、夏季休暇などがあったものの、8月19日に完了することができました。

Codespaces環境では `GIT_*` 環境変数を上書きしてしまっているようなので、コミットが本人のものに紐付きにくかったりして使いづらさはある（そしてGitのプロとしてはどうなのかなとも思う）ものの、CodespacesインスタンスサイズをCPU/メモリで4種類選べるのはコストとパフォーマンスのバランスを取るのに最適な機能だなと感じました。

## Gitpod

元々利用していたのですが、GitHub CodespacesがGAしたタイミングで価格改定があり、無償ユーザーでも月50時間までプライベートRepoで利用することができるようになりました。これによりチーム開発で一般的に使われるGitHub private repoの開発に課金することなく利用できるようになりました。1ユーザーあたり50時間なので、フルフルでコードを書く人は上限に達してしまいそうですが、非エンジニア職、PdM、では枠内に収まる人も多いのではないでしょうか。上限に達してしまった場合でも、月25ドルの課金で無制限に利用できるのはありがたいと思います。

VSCodeをホストする側で利用されるコンテナイメージとしてGitpodが標準として用意しているものがあり、何も指定されないデフォルト時には[gitpod/workspace-full](https://hub.docker.com/r/gitpod/workspace-full)が利用されます。
Gitpod導入しようとしたRepoではデータストアにMySQLを利用していたため、ベースイメージとして[gitpod/workspace-mysql](https://hub.docker.com/r/gitpod/workspace-mysql)を利用することにしました。 `.gitpod.yml` に1行書くだけなので、書き方の簡単な説明は [.gitpod.yml Reference](https://www.gitpod.io/docs/references/gitpod-yml) に譲ります。

一時期、チーム内で `gitpod/workspace-mysql` イメージを使った場合にワークスペースのstop/startを実行するとInnoDBのデータが破損してMySQLが立ち上がらない問題が発生していました。Gitpodインフラ側（Kubernetesの）でstop時にInnoDBのデータが書き終わらないケースがあったのかもしれません。 `my.cnf` に `innodb_force_recovery = 6` を書いて対応することにより暫定対応する日々が続いていましたが、1〜数週間している間に自然に解消されるようになりました。Gitpod Cloud側でKubernetes Persistent Diskの処理が改善された可能性はあります。

# 今後の課題

## データリージョン

今日紹介したGitHub CodespacesとGitpod (Cloud)では日本国内で利用する場合はそれぞれAzure asia-pacific-southeast (Southeast Asia)またはGCP us-west1 (Dalles, OR)に接続することになります。
国外へのデータ（ソースコード）持ち出しができない場合はそもそも利用できませんし、レイテンシーが十分に低くないと開発者体験が悪くなってしまいます。今後、日本国内リージョンで利用できるといいなと感じます。

## 離退職者のworkspaces管理 (Gitpodのみ)

GitHub CodespacesはGitHub Orgのメンバー管理と同一になるので、気にする必要はないのですが、GitpodはGitHubとは別の会社のサービスとなり、アカウント管理も独立しています。そのため、Orgへのメンバー追加・削除を個別にやる必要があります。今後、Gitpod Team planでSAML, SCIM対応がされるといいなと感じています。SAML対応については[過去にイシュー化された](https://github.com/gitpod-io/gitpod/issues/2526)ことがあるようですが、Gitpodチーム側でPBIに積まれた雰囲気はありませんでした。

# おわりに

Catallaxyで試し始めているクラウドIDE・クラウド開発環境について、ざざざーと紹介しました。

この記事で挙げたように（ただしクラウド開発環境に限らない）、Catallaxyではバックエンドおよびフロントエンドの開発環境を改善しつつ、開発を進めていきたいエンジニアの採用を全力で行っています。よろしければ、以下の要項をご覧ください。

https://open.talentio.com/r/1/c/catallaxy/pages/25989

明日Advent Calendar4日目は妖精さんによるCloud Runです。
bqコマンドでクエリ結果をGCSに保存(Bigquery)

# きっかけ
コマンドライン（つまりはgcloudコマンド）でBigqueryにクエリを発行し、GCSにCSVを溜めたい要件があったのですが、公式ドキュメントを見ても下記の2つの例はあるものの、"これ"と言ったものがなかった。

+ [クエリによるGCSファイル保管:EXPORT DATA OPTIONS](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements)
+ [bq query](https://cloud.google.com/bigquery/docs/bq-command-line-tool?hl=ja)

# やりたいこと
+ bqコマンドでクエリ結果をGCSにCSVで格納

# サンプル
下記が実際に通ったサンプルです。[]は適宜[]も含めて書き換えてください。
実行した環境は、google cloud shellです。

```shell:sample
bq query --nouse_legacy_sql 'EXPORT DATA OPTIONS(
uri="gs://GCSのpath/test/hoge_*.csv",format="CSV",overwrite=true,header=true,field_delimiter=";")
AS SELECT name FROM `[pj_id].[dataset_name].[table_name]` WHERE [条件]
```

## ポイント
1. WebコンソールでのQueryとは、シングルコート系のお作法が違う
    1. カッコ()内は"(ダブルコート)でくくります。
    1. クエリ内での[pj_id].[dataset_name].[table_name]は`(バックコート)でくくる
1. GCSへ保存するファイル名の名前に"*"をつける。
    1. おそらく出力ファイルが大きくなったときに連番で保存される
1. CSVの出力方法（ヘッダーの有無等）
    1. こちらを参照

#まとめ
リファレンスがなく類似記事がありそうであまりなかったので、bq query内でExport DATA OPTIONSを使ったあわせ技のお作法の参考になればと思います。
技術は大したことない中途参入者が、コミュ力で現場リーダーに一目置かれる方法

##勇気出して現場リーダーに言っちゃいなよ
まず、あなたは開発に参画しているシステムのバグ的なものに気付きました（テストの不備に気付いたとかでもいいかも）。
「大したことないっちゃ大したことないけど、放置したら後で影響でるかもだし…、
もしオイラが現場リーダーだったらこれ共有してほしいけどな～。
でもリーダーに言ったら、こんなのでいちいち言ってくんなよ！ってキレられそう…（あの人いつも激忙しそうだし）」
こんな風に迷うこと、じつは日常茶飯事ですよね。
でももう迷うことなし。エイヤ！で勇気出して現場リーダーに言っちゃいなよ。

きっとその件は、隣の同僚（新卒以来IT一筋）なら「リーダーに言う必要なし」と即言うでしょうけど。

##あなたが広い視野で提案的なことを言える人なら
さて、リーダーから冷たい反応があるのでは、と心配でドキドキしていると、
リーダーは意外なほど誠意をもってあなたに対応してくれます。
まともなリーダーなら、開発中のシステムを良くしてくれる（かも知れない）報連相は、いつでもwelcomeなのです！
IT人材は、自分の任された部分はちゃんとやってんだから文句ね～だろ、という気質になりがち。だからもしあなたが広い視野で提案的なことを言える人なら、その異能ぶりは必ずリーダーの目にとまります。
今般のコ〇ナ禍のような雇用継続の危機において、それで首がつながる！というのは現実に起きるんですよ。

##基本情報試験はとるべし
###基本情報試験は知能試験です
「基本情報なんか役に立たねからとらねーよ。」新卒からIT技術者のやつはそれでいい。
だがあなたが中途参入なら、悪いこと言わないから取りなさい。
指示と違うことをするのが一番嫌われるので、「まあ基本情報とってるやつはそういうこと少ないかな」と経験的に思ってると思われる。

##チャットツールでうざく情報共有する
###積極性・協調性をアピール
今はどこもslackやchatwork使ってるでしょ？作業中に普段経験しないことがあって、少しでも役立ちそうだったらTo All付けてlet's情報共有。
「でもこんなの皆知ってるかも知れないし…」
迷ったらやるんだよ。
「でもそんなこと誰もやってないから浮きそう」
目立つから一目置かれるんだろうが

##名もなきチャレンジャーたちへ
さて、営業職等を経験してなかなかのコミュ力持ってる人が、無謀にも（笑）IT技術者に転向しちゃうって、数は多くないけどいますよね。
これはそんな名もなきチャレンジャーたちに向けて書きました。
あなたのコミュ力は開発現場でも必ず役立ちますから！応援してますから！
（注：念のため。コミュ力だけではやってけないですからね。ITスキルを寸暇を惜しんで磨き続けて、ようやく言うことに説得力ついてくるんです）

p.s.タイトルの「コミュ力」は
「こみゅか」ではなく「こみゅりょく」ですから。
What is Cloud Computing? All You Need to Know

As we gear up for the year 2022, we are undeniably living in a Digital World. When we talk about a Digital World, we are talking about Cloud-based solutions dominating this era. The Cloud is nothing but a platform that hosts a plethora of computing resources over the internet. These services are easy-to-use and on-demand facilities that can be used on a pay-as-you-go basis. The Clouds are virtualized Data Centers, compact with computing and storage resources.

In present times, Cloud-based solutions dominate the digital world by helping various businesses with advantages like enhanced productivity, low equipment costs, traffic cost reduction, data security, unlimited storage capacity, automatic software updates, and integration, as well as enhanced productivity. It is provable to say Cloud-based applications have simplified lives and businesses to a great extent.
Significant Features of Cloud-Based Applications

    Clientele can access information stored in the cloud on any device, anytime, and from anywhere.

    App’s data is positioned in cloud infrastructure and could be partly stored on a user’s device.

    The requirements for devices to run the applications are minimum.

    Encryption, Optimization, and Compression of data, as well as backup schedules, can be set up by the user.
 
    Placid technical support to manage and support Cloud apps, infrastructure, and architecture

    When offline, the information stored on a user’s device can be accessed. When online again, the app updates and uploads the data that was generated offline to the location of the cloud storage.

Source:https://www.esds.co.in/blog/what-is-cloud-computing-all-you-need-to-know/
Postgres接続エラー「PG::ConnectionBad connection to server on socket "/tmp/.s.PGSQL.5432"」を改善

# 状況

アプリケーション開発中にserver起動をしたところ下記のエラーが発生。
直前までserver起動やコマンドエラーはありませんでした。

```irb:エラー内容
PG::ConnectionBad: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?
```

# 環境

- macOS Big Sur 11.6.1
- PostgreSQL 14.0
- Rails 6.0.3

# 対処

```irb:postgresqlの停止と再起動を試みる
 $ brew services stop postgresql
 $ brew services start postgresql
 $ brew services restart postgresql
```
エラー内容から上記を試すも改善せず。
[こちらの記事](https://stackoverflow.com/questions/39710384/cannot-connect-to-postgres-server-running-through-brew-services)を参考に`postmaster.pid`を削除して再起動してみましたが改善しませんでした:dizzy_face:


# 下記の手順で改善

```irb
#postgresql停止
 $ brew services stop postgresql

#postgresqlのディレクトリまで移動
 $ cd /usr/local/var/

#ディレクトリの存在を確認
 $ ls -la

#postgresqlのディレクトリ削除
 $ rm -rf postgresql

#postgresqlのディレクトリを再度作成
 $ initdb /usr/local/var/postgresql

#postgresqlをスタートさせる
 $ pg_ctl -D /usr/local/var/postgresql -l logfile start 
```
一応、移動して確認した前半の手順も記載しています。
その後、下記も実行しました。

```irb
 $ rails db:create
 $ rails db:migrate
```
無事に改善しコマンドが使用出来るようになりました🙌

# まとめ

どうやらPCの再起動などでpostgresqlが正常に起動しないことがあるとのこと。
今回はアプリケーション作成前からPCは起動したままなので該当せず。
直前までは問題なく動作していたので、ファイル自体がクラッシュしてしまっていたようです。

#参考

https://stackoverflow.com/questions/39710384/cannot-connect-to-postgres-server-running-through-brew-services

[PostgreSQLがMacで実行されていない](https://qastack.jp/dba/75214/postgresql-not-running-on-mac)