OmniAICreator/Qiita-1.07M huggingface dataset:
Slack Appを別ワークスペースに移行する方法

システムにSlack通知機能を組み込むため、Slack Appを作成していたのですが、
以前とある事情によりSlackワークスペースの削除が迫られたことがありました。
その時ふと、Slack Appへの影響が気になりまして、対処方法について調べることにしました。

Slackはヘルプセンターが充実していますが、
ワークスペース削除時の影響について言及している記事は発見できなかったため、
サポートに問い合わせて確認してみました。

# Q1. ワークスペースが削除されるとSlack Appも削除されるか？

A. 削除される。

Slack Appの作成時にワークスペースの選択があることからも分かりますが、
紐付きがあるためワークスペースを削除すると、Slack Appも削除されてしまいます。

作成済みAppの一覧でもワークスペースとの関連性が確認できます。
https://api.slack.com/apps


# Q2. Slack Appを他のワークスペースに移行する方法はあるか？

A. manifestを用いて擬似的に移行する方法がある。

manifestはSlack Appを構成する基本情報や設定がデータとして構造化されたもので、
この仕組みによりコピーが容易に行えるとのことです。
以下にその流れを解説します。

### 注意点
厳密には`移行`でなく`作り直し`のイメージなので、
App IDやClient IDなどが以前と変わってしまいます。

自前のWebサイトなどにSlackのOAuth認証を組み込んでいる場合は、
適宜書き換える必要がありますので気をつけましょう。

## 手順
### 1. 移行したいSlack Appのページから「App Manifest」を開く
![スクリーンショット 2022-04-11 18.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/7480980e-0bef-effd-c289-80b1de51c79d.png)

### 2. 「Copy to Clipboard」を押下してコピーする
![スクリーンショット 2022-04-11 18.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/cf41afc0-75ae-bc98-f055-068436e3b261.png)

### 3. App一覧で「Create an App」を押下し「From an app manifest」を選択する
![スクリーンショット 2022-04-11 18.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/daa39ec3-a84d-cd17-181e-a4adf73d68cd.png)

※既に作成されたAppが存在する場合、ボタン名は「Create New App」と表記

### 4. Appを作成するワークスペースを選択する
![スクリーンショット 2022-04-11 18.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/d50ac19b-b769-427e-1272-1da70de37aae.png)

### 5. 2でコピーしたmanifestを貼り付ける
![スクリーンショット 2022-04-11 18.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/051d3ec4-cabc-64fc-2c0b-4d8bdad6166a.png)

### 6. 作成内容が問題なければ「Create」を押下する
![スクリーンショット 2022-04-11 18.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1139641/ba5d0078-236b-cc2f-77d0-ed3e8fc1a989.png)

これで別ワークスペースにAppを移行することができました。
サービス解約理由アンケートに「回答しない」を用意しよう

僕の場合、解約時に「解約理由」のアンケートが表示されると、答えるのも面倒なんでてきとーに1番目の回答を選んでしまうことが多い。

アンケートが必須で面倒であるほど、アンケート精度は下がるのではないのだろうか？

それならば「回答しない」の選択肢を設けてしまおう。
ユーザーとして見ても、解約にわずらわされないサービスは、非常に優良であるように思える。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/2dad73c7-c229-3aa3-d79f-a007b5695f96.png)

そして「解約が簡単」だということは「解約が難しいから次回契約をやめておこう」という心理ハードルを下げられるということだ。

解約が難しいサービスは悪である。











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Microsoft365】Windows端末の紛失・盗難時に利用できるMicrosoft Intuneの機能とは？(備忘録)

# はじめに
情報システム部門に常駐していた際にWindows端末の紛失・盗難時に利用できるIntuneの機能について調査をしていたので、調査で分かった内容を元に記事を書いていきたいと思います。

:::note info
本内容についてMicrosoftサポートにも問い合わせております。
Microsoftサポートから届いた回答も踏まえて、記事を書いております。
:::

# そもそもIntuneとは？
![スクリーンショット 2022-04-15 9.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/d1d5a91a-c37c-2876-67b7-5e35356ed932.png)

モバイルデバイスとモバイルアプリの管理が行えるクラウドサービスになります。
Microsoft365の中に付いている機能になります。

詳細については、以下の公式サイトをご覧下さい。
[ビジネスを Microsoft 365 で変革](https://www.microsoft.com/ja-jp/microsoft-365/compare-microsoft-365-enterprise-plans)

例えば、以下端末の管理が可能です。
- Windows
- Mac
- Android
- iPhone

# 紛失・盗難時に利用できるIntuneの機能
Microsoftサポートに確認した際に、紛失・盗難で会社情報の漏洩防止を目的で利用できる機能は以下になるとのことでした。

- 削除
- 破棄(リタイヤ)
- ワイプ
- BitLockerのドライブ暗号化

では、それぞれの機能についてご紹介していきたいと思います。

## 削除
Intuneから対象のデバイス情報を削除して、管理対象から外す機能になります。

デバイスを削除した場合のWindows端末の挙動は以下になります。
- 端末に今までログインしていたAzureADのユーザーではログインできなくなる
- Intuneで配布していたソフトウェアが使用できなくなる

※ログインする場合は、Windowsのローカルユーザー必須

## 破棄(リタイヤ)
Intuneの管理下から対象のWindows端末を外す機能になります。

破棄(リタイヤ)を実施後のWindows端末側の挙動は以下になります。
- Windows端末内にインストールされているIntuneを使用するために必要なエージェント類の削除
- Intuneの機能で設定された各種プロファイル等が削除

※Windows端末に格納されているデータの初期化は実施されない

## ワイプ
Windows端末の設定及びディスクの内容を全て初期化する機能になります。
万が一PCを紛失した場合にデータ漏洩等を防ぐ目的で使用されます。

詳しくは、以下の記事で解説しております。

https://qiita.com/satton6987/items/a820c9e812203586c4a0

※当時常駐をしていた際に、お客様が一番仕様を知りたがってた機能になります。

## BitLockerのドライブ暗号化
Intuneにて構成プロファイルを作成して、Windows端末のBitLockerをバックグラウンドで有効化することが可能です。

Windows端末のデバイスグループを指定して、まとめてBitLockerを有効化することが可能です。

詳細については、以下の記事をご覧下さい。
[Intune で BitLocker を自動で有効化する](https://www.illuminate-j.jp/blog/m365_security3_bitlocker_intune)

# 最後に
今回は、Windows端末の紛失・盗難時に利用できるMicrosoft Intuneの機能についてざっくりとご紹介しました。
正直、Intuneの運用経験が無い中で調査を実施していたため、苦労することばかりでした。
この苦労話等は、ブログ記事等で綴ってみたいと思います。

# 参考記事
[くらめその情シス：Intuneを使ってできること、できないことをざっくりまとめてみた](https://dev.classmethod.jp/articles/jyosys-intune-possible-impossible/)
[行えるデバイス アクション](https://docs.microsoft.com/ja-jp/mem/intune/remote-actions/device-management#available-device-actions)
[Intune を使用して Windows デバイスの BitLocker ポリシーを管理する](https://docs.microsoft.com/ja-jp/mem/intune/protect/encrypt-devices)
cscの作法 その114

# 概要
cscの作法、調べてみた。
managed directxやってみた。
三角形を回転。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f31bbdb5-f9cb-eb69-3800-d7b575bddfa4.png)

# サンプルコード

```
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace mdx
{
	public partial class Form1 : Form {
		private Device device = null;
		private VertexBuffer buffer = null;
		public Form1() {
			Text = "Form1";
			PresentParameters presentParams = new PresentParameters();
			presentParams.Windowed = true;
			presentParams.SwapEffect = SwapEffect.Discard;
			device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
			buffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
			CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[]) buffer.Lock(0, 0);
			verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
			verts[0].Color = Color.BlueViolet.ToArgb();
			verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
			verts[1].Color = Color.GreenYellow.ToArgb();
			verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
			verts[2].Color = Color.Red.ToArgb();
			buffer.Unlock();
			this.Paint += Form1_Paint;
		}
		private void Form1_Paint(object sender, PaintEventArgs e) {
			device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
			int iTime = Environment.TickCount % 5000;
			float fAngle = iTime * (2.0f * (float) Math.PI) / 5000.0f;
			device.Transform.World = Matrix.RotationY(fAngle);
			device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 1.0f, 4.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
			device.Transform.Projection = Matrix.PerspectiveFovLH((float) Math.PI / 4, 1.0f, 1.0f, 100.0f);
			device.RenderState.CullMode = Cull.None;
			device.RenderState.Lighting = false;
			device.BeginScene();
			device.VertexFormat = CustomVertex.PositionColored.Format;
			device.SetStreamSource(0, buffer, 0);
			device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
			device.EndScene();
			device.Present();
			this.Invalidate();
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}



```


以上。
cscの作法 その113

# 概要
cscの作法、調べてみた。
managed directxやってみた。
三角形を描画。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ff185840-931b-ba6a-d67f-5989352c588f.png)



# サンプルコード

```
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace mdx
{
	public partial class Form1 : Form {
		private Device device = null;
		private VertexBuffer buffer = null;
		public Form1() {
			Text = "Form1";
			PresentParameters presentParams = new PresentParameters();
			presentParams.Windowed = true;
			presentParams.SwapEffect = SwapEffect.Discard;
			device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
			buffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
			CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[]) buffer.Lock(0, 0);
			verts[0].Position = new Vector3(0.0f, 1.0f, 1.0f);
			verts[0].Color = Color.BlueViolet.ToArgb();
			verts[1].Position = new Vector3(-1.0f, -1.0f, 1.0f);
			verts[1].Color = Color.GreenYellow.ToArgb();
			verts[2].Position = new Vector3(1.0f, -1.0f, 1.0f);
			verts[2].Color = Color.Red.ToArgb();
			buffer.Unlock();
			this.Paint += Form1_Paint;
		}
		private void Form1_Paint(object sender, PaintEventArgs e) {
			device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
			Matrix view,
				w;
			w = Matrix.RotationY(Environment.TickCount / 1000.0f);
			view = Matrix.Translation(0, 0, 5);
			view = w * view;
			device.SetTransform(TransformType.View, view);
			device.Transform.Projection = Matrix.PerspectiveFovLH((float) Math.PI / 4, 1.0f, 1.0f, 100.0f);
			device.RenderState.CullMode = Cull.None;
			device.RenderState.Lighting = false;
			device.BeginScene();
			device.VertexFormat = CustomVertex.PositionColored.Format;
			device.SetStreamSource(0, buffer, 0);
			device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
			device.EndScene();
			device.Present();
			this.Invalidate();
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}


```

以上。
cscの作法 その112

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

# 環境

windows 10


# コンパイル手順

```
>csc /platform:x86 /r:"Microsoft.DirectX.dll" /r:"Microsoft.DirectX.Direct3D.dll" /r:"Microsoft.DirectX.Direct3DX.dll" dx1.cs

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6a86203c-8b8d-dc0b-2a65-74838c70e660.png)

# サンプルコード

```
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace mdx
{
	public partial class Form1 : Form {
		private Device device = null;
		public Form1() {
			Text = "Form1";
			this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
			PresentParameters presentParams = new PresentParameters();
			presentParams.Windowed = true;
			presentParams.SwapEffect = SwapEffect.Discard;
			device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
			this.Paint += Form1_Paint;
		}
		private void Form1_Paint(object sender, PaintEventArgs e) {
			device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
			device.BeginScene();
			device.EndScene();
			device.Present();
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```


以上。
ほぼ自動で画像認識アプリケーションを作ろう

# はじめに

Pythonなどのコードに知識なしに、事実上のノーコードで手軽に画像認識アプリケーションを作る仕組みを作りたいと思い、学習用の写真を用意するだけで「google colabo + streamlit」でオリジナルの画像認識アプリケーションを作る仕組みを作ってみました。

無料環境のみなのであくまでその場だけで動作する簡易アプリケーションですが、簡単にAIアプリケーションが作れるということを体験出来るといいかと思います。

## 用意するもの

・学習用の画像データ
　　画像認識で分類させたい項目毎に最低でも10枚以上は用意してください。

　　用意した画像データ(jpg形式）を分類項目毎にフォルダ分けして、全体をzipファイルで圧縮します。
　　フォルダ名は英数字にしてください。

例
├── 全体のフォルダ
│   ├── dog
│     │   ├── dog1(画像データ)
│     │   ├── dog2(画像データ）
│   ├── cat
│     │   ├── cat1(画像データ)
│     │   ├── cat2(画像データ)

・googleアカウント（google colaboratory を使うため）

## 学習用のプログラムの起動

以下のリンクより学習用のプログラムを開いてください。

[学習用プログラム](https://github.com/saotomryo/Image_Identification/blob/master/Use_MobelenetV2.ipynb)

上記のページの下記のボタンをクリックして、google colaboratoryを起動します。(googleアカウントでログインしてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004109/7591e200-fd5c-ca64-1dc8-ca5c8f444329.png)


## 学習の実施

学習の実施方法は、プログラムページに記載していますが、実施する作業は以下の2つだけです。
・「ctrl F９」またはツールメニューの「ランタイム」から「全てのセル」の実行

・「ファイルの選択」ボタンをクリックからZIP形式で圧縮したファイルのアップロード

学習が完了したら自動的に学習済みモデルのダウンロードが開始します。

なお、上記方法でアップロードすると非常に時間がかかりますので、google driveを参照する手順がわかる方はgoogle driveを使うことをお勧めいたします。

## 画像認識アプリへの学習モデルのアップロード

以下のリンクより、画像認識アプリケーションを開き、ダウンロードした学習モデルをアップロードします。
（スマートフォンの場合はリアルタイムで撮影した写真を判定することができます。）

[画像認識アプリ](https://share.streamlit.io/saotomryo/image_identification/app.py)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004109/57634936-7ae9-1fed-fee7-87498f21f8a8.png)


## 最後に

上記の内容で自分オリジナルの画像認識アプリケーションを作成することができます。
アプリケーション自体も以下のgithubにおいております。
[アプリケーション](https://github.com/saotomryo/Image_Identification/blob/master/app.py)


## 次に
streamlit cloud上で動いているための様々な制約があるので、google colaboratory上で完結できるwebアプリを作成できればと考えています。
Laravelでapp.jsやapp.cssが反映されない（存在しない）ときの解決方法

# この問題が起こった時の環境
Laravel バージョン6.20.44
nvm v17.1.0以上

# 発生した問題
・デベロッパーツール確認、
app.cssとapp.jsに404 NOT FOUND

・resourcesフォルダにCSSやJSファイルがない
※どうやらLaravel5.8まではpublic > css >app.cssがあるみたいです。。
なのでsassをビルドして生成する必要があります。

・npm run watch、
npm run devでsassをコンパイルできない。

# 解決方法
1.resourcesフォルダにapp.cssがないことを確認
ある人は大丈夫なはず、、。

2.webpack.mix.jpファイルに以下の記述があることを確認
```webpack.mix.jp
mix
  .js("resources/js/app.js", "public/js")
  .sass("resources/sass/app.scss", "public/css");
```

3.resources > sass > app.scssに
cssを記述。（sassでも良い）

4.以下を実行
```
npm run dev
```
public　> cssの中にapp.cssが入っていれば成功！

5.「Error: error:0308010C:digital envelope routines::unsupported」
なエラーが出た場合、　Node.jsのバージョンを下げる
```
nvm install 14.18.1
```

6.再び以下を実行
```
npm run dev
```
public　> cssの中にapp.cssが入っていれば成功！

7.「options has an unknown property 'outputStyle'・・・・・」
とエラーが出た場合、sass-loaderのバージョンを変更
```
$npm uninstall --save-dev sass-loader
$npm install --save-dev sass-loader@7.1.0
```

8.再び以下を実行
```
npm run dev
```
public　> cssの中にapp.cssが入っていれば成功！



# この問題にぶち当たった経緯
以下の記事でLaravelを学習中、cssが反映されていない問題に遭遇しました。
https://note.com/mukae9/n/n12cc13fd4f90
Windows10でマイクロソフト”PICT”を動かしてみた

## この記事の目的

マイクロソフトのテストツールPICT（Pairwise Independent Combinational Tool）を久々に使ってみようと思ったので、Windows10上へのインストール方法や、実行方法をメモする。

## 用語の説明（説明しているサイトへのリンク）
PICTとかペアワイズ法については、こちらのサイトが分かり易いと思います。

https://gihyo.jp/dev/feature/01/sp-test/0002

## 今回の動作環境

PICTはコンソールアプリなので、そのままだと少し使いづらいです。  
従って、PictMasterというExcelのツールから使うようにしています。


PictMasterはここからダウンロードできます。

~~https://ja.osdn.net/projects/pictmaster/releases/74678~~

https://ameblo.jp/pictmaster/entry-12814890555.html

PICTのインストールも、PictMasterのマニュアルを参照するのが分かり易いと思います。

なお、上記のマニュアルではPICTのダウンロードURLが間違っているので、正しいURLを記載しておきます。
https://github.com/microsoft/pict/releases/download/v3.7.4/pict.exe
Databricks Partner Connectにおけるdbt Cloudのローンチ

[Launching dbt Cloud in Databricks Partner Connect \- The Databricks Blog](https://databricks.com/blog/2022/04/14/launching-dbt-cloud-in-databricks-partner-connect.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# レイクハウスでのデータ変換をシンプルに

dbtプロジェクトを構築、管理、監視するための高速かつ最も信頼性のある方法であるdbt Cloudが、Databricks [Partner Connect](https://databricks.com/jp/partnerconnect)で利用できるようになったことを発表できて嬉しく思っています。ご自身のレイクハウスのデータを変換するために、dbtの業界標準のデータ変換フレームワークを使いたいと考えるユーザーは、数クリックでdbt CloudをDatabricksに接続できるようになり、既存アカウントをお持ちで無い場合にはフリートライアルをスタートすることも可能です。彼らは、DatabricksのPhoton高速化クラスターを活用しつつもdbt Cloudでデータモデルを開発、テスト、デプロイできるようになり、レガシーなクラウドデータウェアハウスよりもはるかに高速にデータ変換ワークフローを実行できるようになります。この最新のインテグレーションは最近発表したネイティブのdbt-databricksアダプターに続くものであり、我々はこれによって、Databricksがdbtプロジェクトを構築し、プロダクションに移行するための最適な場所になったと信じています。

# 数クリックでdbt CloudをDatabricksに接続

これまでは、dbt CloudからDatabricksへの接続にはクレディンシャルの転送を含む複数のステップが必要でした。Partner Connectを用いることで、データ取り込みからETL、ML/AIに関するパートナーのオファリングをレイクハウスにインテグレーションすることが容易になります。今では、Partner Connectを用いることで、dbt Cloudを試すために数クリックでシームレスな体験を得ることができます。このDatabricksとのインテグレーションは、セキュアにリソースを設定し、dbt Cloudもセットアップします。数分でDatabricks上で最初のdbtモデルを実行することができます。
![](https://databricks.com/wp-content/uploads/2022/04/db-140-blog-img-1.png)

dbt CloudとDatabrikcsを接続することで、SQLデータパイプライン、生データから後段の分析、BIユースケースで利用できるデータへの変換をオーケストレートするためにこれらを利用することができます。

# dbt Cloudでコラボレーションを通じた開発を

皆様のデータチームが拡大するにつれて、dbtプロジェクトはより複雑なものになっていき、CI/CDをサポートし、データモデルを監視し、問題が起きた際にはアラートを受け取るようになる必要が出てきます。dbt Cloudは完全にホストされマネージドなコラボレーティブIDEを提供しており、インフラストラクチャを管理する必要なしに、新規メンバーがクイックにオンボーディングできるようになります。また、dbt CloudはCI/CD、堅牢なバージョン管理、ジョブスケジューリング、テスト、ドキュメントの提供、リネージュに関するターンキーのサポートを提供します。dbt Cloudは、SQLエンドポイントを含むDatabricksクラスターで実行できる標準SQLを生成します。
![](https://databricks.com/wp-content/uploads/2022/04/db-140-blog-img-2.png)

# Databricksはdbtを実行するためのファーストクラスの場所です

我々はdbtのパワーに興奮しており、Databrikcレイクハウスをdbtモデルを実行するための素晴らしい場所にするために継続的に改善を行なっていきます。Databricksでのみ利用できるPhoton実行エンジンは、dbtによって生成されたSQLを自動で高速化、改善します。これは、お使いのデータモデルが高速に動作し、追加のコード変更や最適化が不要であることを意味します。さらに、データチームはdbtを使う際の既存のアクセスコントロールとガバナンスプロセスを使い続けることができ、よりスケーラブル、かつ、管理しやすくします。

# dbt Cloudを活用しましょう

追加のコストなしにPartner Connectでdbt Cloudを利用できます。詳細に関しては、ハンズオンワークショップ[building a modern data stack with dbt and Databricks](https://pages.databricks.com/202204-AMER-VE-Build-a-modern-data-stack-with-dbt-and-DatabricksReg-page-2022-04-20.html)にサインアップしてください。スクラッチからスケーラブルなデータ変換パイプラインを構築するためのステップバイステップのガイドをウォークスルーします。あるいは、Slackチャネル`#db-databricks-and-spark`に参加してください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
マイベストプラクティス集

# 何が書いてあるか
日々のインプットの中で、お仕事や人生に良い効果をもたらすと思ったBP（常に変化）を忘れないように書いておく。
情報収集を効率的に行うこと、車輪の再発明を防ぐことで時間を大切にできるように。
あまり細かいことは書かずに存在だけを書き留めて見やすさを心がける。

# WebシステムでExcel出力
・Laravel-Excel　Excelテンプレートの読込みにも対応。



# Webシステムで日付
・moment-js　javascriptで日付操作
・Carbon　phpで日付操作

# 地図で可視化
・leafmap
・HERE

# タスクスケジューリング
・Airflow

# コード開発
- ErrorLens VSCodeでコードの静的エラーの詳細がわかる
- indent-rainbow　VSCodeでインデントを色分け可視化してくれる
- TrailingSpace　VSCodeで不要な末尾のスペースを可視化してくれる
- 「autoDocstring: VSCode Python Docstring Generator」　VSCodeでpythonのdocstringを自動生成してくれる
- 「black」　pythonのフォーマッター
- 「isort」　importの順を整えてくれるフォーマッター

# API開発
・Postman　動作確認
・Swagger　RestAPIの仕様書作成、動作確認

# テストケース管理ツール
Testlink

# デザイン
・Figma　デザイン制作、共有、レビュー
・AdobeXD　ワイヤーフレーム
・xclipboard　Linux用の状態遷移モデリングツール。テストケースの洗い出しにも使える。

# プログラムアーキテクチャ
・Jig　影響スケッチ描画ツール

# 組織論
・NetFlixのカルチャーデッキ
・「星の王子さま」の著者アントワーヌ・ド・サン＝テグジュペリの言葉「船を造りたいのなら人を呼んで材木を集めさせたり仕事を割り当て命じる必要はありません。代わりに、果てしなく続く海への憧れを説いてやりなさい。」


# メディア
・NewsPicks
・Rebuild.fm
・バイリンガルニュース
・EM . FM #EMFM
・CotenRadio
v-modelに指定したObjectが動的に更新されたけど画面に反映されない

v-modelにObjectとかを指定しているとき、メソッドとかでそのObjectの要素が変わったとしても画面に反映されない時がある。そんなときの対処方法。

問題例）
```html
<p>花子の年齢：</p><v-text-field v-model="hanako.age" readonly />
<p>年：</p><v-select items="year" v-model="selectYear" >
```

セレクトボックスで年を選ぶと、自動的に花子の年齢テキストボックスに年齢が表示される想定です。

```js
export default {
  data(){
    return {
      hanako: {},
			year: [
				2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,
				2010,2011,2012,2013,2014,2015,2016,2017,2018,2019
			],
  },
  watch: {
		selectYear: function(newValue) {
			// 花子は2000年生まれ。	
			const bornYear = 2000;
			// セレクトされた年-生まれ年 = 花子の年齢
			this.hanako.age = newValue - bornYear;
		}
}
```

yearをwatchで監視して値が変更される度に花子の年齢が計算されhanakoオブジェクトにageというキーで年齢を登録しています。

何も問題はなさそう。

でもこれだと、セレクトボックスから年を選んでもテキストボックスには表示されません。
一度カーソルをテキストボックスにあわせ、アウトすると表示されます。
なぜ...。

なぜかv-modelはObjectの値が変更されてもそれを画面に適用してはくれないようです。
そんな時、使うのが$set。
基本構文はこうです。

```js
this.$set(this.someObject, 'b', 2) // (オブジェクト, キー名, 入れる値)
```

これを今回のソースに合わせるとこうです。

```js
export default {
  data(){
    return {
      hanako: {},
			year: [
				2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,
				2010,2011,2012,2013,2014,2015,2016,2017,2018,2019
			],
  },
  watch: {
		selectYear: function(newValue) {
			// 花子は2000年生まれ。	
			const bornYear = 2000;
			// セレクトされた年-生まれ年 = 花子の年齢
			this.$set(this.hanako, 'age', newValue-bornYear);
		}
}
```

こうすると、テキストボックスをクリックしなくても自動的に画面に反映されます。

なんでObjectだと簡単に反映されないのか、いまいちVueの仕組みが分かっていないのでちゃんとドキュメント読んで理解しないとな...。
基本的にdataプロパティーを動的に変更する場合には、$setを使った方がよさそうですね。
GROUP BY　SQL　グループ化

## 用途
SQLで集計をする時などに使う

## 使用方法
```sql:書き方
SELECT 指定したいカラム名, 指定したいカラム名, ... FROM テーブル名 GROUP BY グループ化したいカラム名;
```
#### 使用するhogeテーブル
|name|color|
|:------------:|:-------------:|
|suzuki|red|
|tanaka|red|
|takahashi|blue|
|hayashi|red|
|takeda|blue|

グループごとの人数を調べたい時は下記のようにする
```sql:書き方
SELECT color, COUNT(color) FROM hoge GROUP BY color;
```
結果
|color|COUNT(color)|
|:-------------:|:-------------:|
|red|3|
|blue|2|

:::note warn
注意
グループ化したカラムは、表示しないとエラーになる。
:::

```sql:エラーになる
SELECT name FROM hoge GROUP BY color;
```
※ color をグループ化したなら color を表示させないとエラーになる。

## 検索条件を追加する
#### WHERE　⇨　グループ化する前に条件が適応される（実行される順番が GROUP BY よりも先だから）
```sql:書き方
SELECT 指定したいカラム名, 指定したいカラム名, ... FROM テーブル名 WHERE 指定したい条件 GROUP BY グループ化したいカラム名;
```
```sql:例
SELECT color, COUNT(color) AS hoge_color FROM hoge WHERE name!="takahashi" GROUP BY color;
```
※AS を使用して COUNT(color) に `hoge_color` という別名をつけて表示させるようにしている。
詳しくはこちらの記事へ
https://qiita.com/marukome/items/4bcfab2b244dbc0cde3b

結果
|color|hoge_color|
|:-------------:|:-------------:|
|red|3|
|blue|1|

※takahashi 以外の値が表示される条件にしたから、blue が 1 になった。

#### HAVING　⇨　グループ化した後に条件が適応される（実行される順番が GROUP BY よりも後だから）
```sql:書き方
SELECT 指定したいカラム名, 指定したいカラム名, ... FROM テーブル名 GROUP BY グループ化したいカラム名 HAVING 指定したい条件;
```
```sql:例
SELECT color, COUNT(color) AS hoge_color FROM hoge GROUP BY color HAVING 2 > hoge_color;
```
結果
|color|hoge_color|
|:-------------:|:-------------:|
|blue|1|

※hoge_color が 2 未満のものだけが表示される。
　
　
以下のサイトを参考に執筆しました。
- https://www.sejuku.net/blog/72923
Dockerメモ

## Dockerメモ
### 前提知識
- **Dockerホスト**
DockerEngineが動いているPCのこと
要は手元のPCのことで、macとかならDocker for macとかインストールされていれば、Dockerホストとなる

- **マウント**
ざっくりとだが、ファイル等を参照したりできる。取り付けるとか認識させると訳して読んでも差し支えない

### バインドマウント

DockerホストのディレクトリやファイルをDockerコンテンナ内のディレクトリにマウントすること

### ボリュームマウント

DockerEngin上に確保した領域をDockerコンテナにマウントさせる
確保した領域を**データボリューム**もしくはボリュームという

- 保存場所の位置を意識する必要がなくなる
    - Dockerホストは各自ディレクトリ構成が違ったりするため、保存場所の位置を意識する必要がある

- データベースのデータを保存したりする時に便利
    - コンテナが破棄されてもDockerEngine上にデータが残る

```docker-compose.yml
~略~

database:
    # 起動に失敗したら再起動する
    restart: always
    # Docker公式イメージを利用する
    image: mysql:5.7.32
    # M1macは指定する必要あり？エラーになる
    platform: linux/x86_64
    ports:
      - 3306:3306
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      #　DockerEngineに確保したvolumesにdatabaseコンテンナのデータをマウントする
      - mysql-datavolume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root

# ここの記述により、DockerEngine上にvolumesを作ることができる
volumes:
  mysql-datavolume:
    driver: local
```
iPhone初期化時のiOSバージョンに関する知見

# 初期化方法
iPhoneには次の2通りの初期化方法がある。

 * iTunesを使用して初期化
 * iPhoneの端末をリセット

# iTunesを使用して初期化の場合
リセット後にiOSバージョンは最新のOSのバージョンに更新されてしまう。
例) iOS(14.8.1)の端末を初期化 → iOS(最新の15.4(2022年4月時点))として初期化された状態になる
※こちらの情報は実際に試したわけではなく、ネット上の記事より得た情報のため、間違い補足あればコメント歓迎します。


# iPhoneの端末をリセット
こちらはiTunesストアには接続せず、iPhoneのリセットメニューから初期化した場合です。
工場出荷状態に戻すと言われていますが、iOSバージョンは例外のようで、
リセット後であってもOSバージョンはリセット前のままです。
例) iOS(14.8.1)の端末を初期化 → iOS(14.8.1)として初期化された状態になる
(当然ながらアプリは全て初期化されています)
※こちらは私のiPhone 6s Plus(iOS 14.8.1)端末を検体にした、実体験です。
undefined method `downcase' for nil:NilClassエラーの対処法

開発環境
mac OS バージョン11.6
エディタ
VScode

# やりたいこと
gravataを使ってUserのアイコン画像を表示させる。

Users#indexのページを表示させたい。


# エラー内容
```
undefined method `downcase' for nil:NilClass
```

![f6f2ba52cfc2771cff05373e7dfa3311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962714/aff9e721-4368-450c-f37f-21f83bad0d63.png)



# 原因
Usersテーブルの中にあるレコードについて、emailがnilのデータが混入していることが考えられます。
.downcaseはemailカラムの文字列を全て小文字に変換する処理で、emailがnilだと変換できないのでエラーになります。



# 解決策
```raill c```でemailがnilになっているデータがないか確認し、あったらdestroyで削除する。
（emailがnullになっているデータが1件見つかりました！）

**結果**
無事Users#indexのページを開けました！

# 参考
https://teratail.com/questions/153369
Jupyterでイメージ表示


# はじめに
個人用メモ

```py
# 必要ライブラリのインポート
import matplotlib.pyplot as plt
from PIL import Image

filename = 'abc.jpg'

# ファイルオープン
img = Image.open(filename)

# 画像表示用コード

# ここでイメージの大きさを調整
plt.figure(figsize=(10,10))

# 白黒画像の場合
plt.imshow(img, cmap='gray')

# イメージに　目盛りは不要
plt.axis('off')

# 画面表示
plt.show()
```
【React】要素の外をクリックした場合にメニューを閉じる（e.targetとe.currentTargetの違いを利用する）

## はじめに

レスポンシブ対応でよくある、あるボタンを押すとサイドメニューが展開するというものを実装していた。

そこでメニュー部分をクリックしても閉じないが、メニュー外の部分（背景）をクリックするとサイドメニューが閉じるという機能を実装した際、 JavaScriptのイベントの`e.target`と`e.currentTarget`の違いについても勉強になったのでまとめておく。

※実装したサンプルコードは以下のCodeSandboxです。ぜひ実際に挙動を試してみてください。

https://codesandbox.io/s/winter-waterfall-3cf7kb?file=/src/App.tsx

## 実装の概要

JavaScriptのイベントの`e.target`と`e.currentTarget`の違いを利用して、メニュー外をクリックしたときのみメニューを閉じるように実装する。

 `target` と `currentTarget` の違いは以下の通り。

- `target` : **イベントを発生させた**要素を取得する（実際にクリックされたDOMを取得する）
    [Event.target - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Event/target)
    

- `currentTarget` : **イベントハンドラがアタッチされた**要素を取得する
[Event.currentTarget - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Event/currentTarget)

## 実装方法

### 開閉するサイドメニューを実装する

まずは開閉するサイドメニューを実装する。

Reactの基本的な実装なので、詳細の説明は省略してコードのみ載せる。

```jsx
import { useState } from "react";

export default function App() {
  const [isShow, setIsShow] = useState(false);

  return (
    <div>
      <button onClick={() => setIsShow(true)}>Menu</button>
      {isShow && (
        <div    // 画面全体を覆う背景 
          style={{
            backgroundColor: "rgba(0, 0, 0, 0.6)",
            position: "fixed",
            top: "0px",
            zIndex: 1,
            width: "100%",
            height: "100%"
          }}
        >
          <div    // メニュー部分
            style={{
              backgroundColor: "white",
              position: "fixed",
              top: "0px",
              zIndex: 1,
              width: "30%",
              height: "100%"
            }}
          >
            <p>Menu</p>
            <ul>
              <li>Top</li>
              <li>Profile</li>
              <li>Blog</li>
            </ul>
            <button onClick={() => setIsShow(false)}>閉じる</button>
          </div>
        </div>
      )}
    </div>
  );
}
```


### メニューの外をクリックした場合はメニューを閉じる

本題の、
・メニューの内、外のどちらをクリックしたか判定する
・メニュー外をクリックした場合はメニューを閉じる
という部分を実装する。

と言っても記述は非常にシンプルで、メニュー画面全体を覆っている（背景となっている） `div` 要素に、1行追記するのみ。

```jsx
<div
  // 以下の1行を追記
  onClick={(e) => e.target === e.currentTarget && setIsShow(false)}
  style={{
    backgroundColor: "rgba(0, 0, 0, 0.6)",
    position: "fixed",
    top: "0px",
    zIndex: 1,
    width: "100%",
    height: "100%"
  }}
>
```

 この `onClick` イベントは、メニューを開いている際に画面いっぱいに表示される背景に付与しているので、 `e.target` には常にこの `div` 要素が入ることになる。

それに対して `e.currenttarget` にはクリックイベントを発生させた要素が入るので、メニュー内をクリックした場合にはメニュー部分の `div` 要素が、メニュー外（背景）をクリックした場合にはメニュー外（背景）の `div` が入ることになる。

これにより、クリックしたのが（つまり `e.currentTarget` が）メニュー外の背景だった場合は、サイドメニューを閉じるという機能を実現している。

## さいごに

要素外をクリックした場合にメニューを閉じるという機能の実装方法を検索すると色々な方法が見つかったが、私はこの方法が一番シンプルでしっくり来た。

また今回、 `[e.target](http://e.target)` と `e,currentTarget` の違いの便利さを学んだと同時に、違いを理解していないと意図しない挙動を引き起こしてしまうかもしれないので気を付けないといけないと思った。

ライブラリを使ってモーダルなどを実装すると、モーダル外をクリックするとモーダルを閉じるようにすることも簡単に出来ることが多いが、あれはどういう方法で実装されているのだろうと少し気になった。

## 参考記事

https://zenn.dev/mkt_engr/articles/12209df0aac71a
Kotlinサクッと環境構築

## はじめに
Kotlinの編集 & 実行環境をローカルに作ったので、その時の方法をまとめました。

## ゴール
Kotlinを実行する統合実行環境(intelliJ)をインストールして、「Hello World!」をコンソールに出力する。

## 実行環境
* macbook air 2017
* XOS version 12.1
* JDKはインストール済み <- JDKのインストールが分からない方は、AndroidStudioをダウンロードしてみてください。勝手にJDKがインストールされます

## 手順1 - IntelliJ IDEAのインストール
<a src="https://www.jetbrains.com/idea/download/">InterillJのダウンロードーページ<a/>に行って、自分のOSに合ったInterlliJのダウンロードボタンを押す。(ダウンロードページに行った時点で自分のPCに合ったものが表示されます。)
下の画像中央の黒い「Download」ボタンを押す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/d12b5e08-1f24-c873-1dd6-c92a8e9b49ff.png" width="500px" />

ダウンロードが完了したらIntelliJを、Applicationフォルダーにドラッグ & ドロップして移動し、アプリを立ち上げます。

## 手順2 - 新規プロジェクト作成
IntelliJをたちあげると、Welcome to IntelliJ IDEAと表示された画面にきます。画面中央の「New Project」ボタンを選択しましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/351e46a8-b3e6-10c6-eac1-2972636af979.png" width="500px" />

プロジェクト名とか使用する言語を入力する画面が表示されたら、以下のように入力して「create」ボタンを押します。
* Name - PlayGround
* Location -> 変更しない、そのまま
* Language - Kotlin
* BuildSystem - IntelliJ
* JDK - 変更しない、そのまま <- JDKがインストールされていない環境だと表示されないと思うので、JDKを別途インストールするかAndroid Studioをインストールしてください。
* Add Sample Code - チェックする <- 「Hello World!」と出力するコードが用意されます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/e6cb2763-04a9-2dc6-6a17-ccf938ba0792.png" width="500px" />

## 手順3 - Run/Debug Configを追加
ここまでくると、下の画像のようにエディターでサンプルコードが開かれた状態になるかと思います。
![Screen Shot 2022-04-15 at 8.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/54002526-3bd8-68cb-c582-ca0086c2dfca.png)
この画面の左上の方にある灰色三角形の再生ボタンのようなものを押すと、サンプルコードが実行されるんですが、コードを実行するためには、実行設定を追加する必要があります。
灰色三角形の隣の「Add Configuration...」ボタンを押してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/514eb4e4-2d86-5a07-8fad-e80e8b6c12fe.png" width="500px" />
押すと上のようなウィンドウが開かれるので、ここで「Add New」ボタンを押し、紫色のKotlinを選択してください。そうすると実行設定が追加されるので、追加された実行設定を以下のように変更します。
* Name - 「TestRunner」
* Main class - MainKt
入力したら「OK」を押下。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/622fcfba-322c-f5c7-e045-87395f4ed7e1.png" width="500px" />

これで先ほどまで灰色だった画面左うえの三角形のボタンが緑色になって押せるようになるので、三角形のボタンを押して、サンプルコードを実行します。
画面下側のコンソールに以下のように出力されたら成功です。 :clap: :clap:
```
Hello World!
Program arguments: 

Process finished with exit code 0
```
![Screen Shot 2022-04-15 at 8.34.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/806712/08ce4c7a-2f5f-a00d-0df2-9295d0599837.png)


*** 
### 参考文献
* [Get started with Kotlin - JetBrains](https://kotlinlang.org/docs/getting-started.html)
opensslでECDSAの鍵を生成する



仕事で電子署名をやることがあり、学んだことをまとめたかったので記事を作りました。
OpenSSLのバージョンは 1.0.2a と古めです。。。

# 基本のコマンド

> openssl ecparam -genkey -name prime256v1 -out keypair.pem

-genkeyが鍵生成のオプションです。
-outは出力ファイル名です。
-nameでは楕円曲線の種類を指定します。使える楕円曲線の種類は以下のコマンドで調べることができます。
> openssl ecparam -list_curves

# 鍵ファイルの形式（PEMとDER）
「基本コマンド」では、署名（秘密）鍵と、検証（公開）鍵のペアをPEM形式で生成します。
<h3>PEM形式とは</h3>任意の証明書、鍵をbase64でエンコードして以下のようにBEGIN/END行で挟んでつなげたテキストファイルです。

-----BEGIN EC PRIVATE KEY-----
鍵ファイルのbase64エンコード
-----END EC PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
証明書ファイルのbase64エンコード
-----END CERTIFICATE-----

base64エンコードとはバイナリを6bitずつに区切り、6bitデータを英数字や一部の記号に置き換えた形式になります。
以下のページにわかりやすくまとまっていました。

https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4

オプションを使うとこの鍵をPEM形式でなく、DER形式で出力することもできます。

<h3>DER形式とは</h3>
バイナリデータで、ASN.1というデータ構造によって記述されています。
ASN.1についてはこちら、

https://e-words.jp/w/ASN.1.html

DER形式の鍵を生成するときは、-outform DER をコマンドに追加します。

> openssl ecparam -genkey -name prime256v1 -outform DER -out keypair.der

DER形式ですと、秘密鍵、公開鍵にわけるコマンドがなぜかうまくいかないので、
基本はPEM形式の鍵を生成して、必要になったら、DERに変換するのがよさそうです。
AtCoder Beginner Contest 247 参戦記

# AtCoder Beginner Contest 247 参戦記

## [ABC247A - Move Right](https://atcoder.jp/contests/abc247/tasks/abc247_a)

2分半で突破. 書くだけ.

```python
S = input()

print('0' + S[:3])
```

## [ABC247B - Unique Nicknames](https://atcoder.jp/contests/abc247/tasks/abc247_b)

7分半で突破、WA1. 書くだけなんだけど、姓と名が同じ人がいてハマった.

```python
N = int(input())
st = [input().split() for _ in range(N)]

d = {}
for s, t in st:
    d.setdefault(s, 0)
    d.setdefault(t, 0)
    if s == t:
        d[s] += 1
    else:
        d[s] += 1
        d[t] += 1

for s, t in st:
    if d[s] != 1 and d[t] != 1:
        print('No')
        exit()
print('Yes')
```

## [ABC247C - 1 2 1 3 1 2 1](https://atcoder.jp/contests/abc247/tasks/abc247_c)

4分半で突破. *N*≦16なので、実際に数列を作っても問題ないので簡単.

```python
N = int(input())

S = [None] * N
S[0] = [1]
for i in range(N - 1):
    S[i + 1] = S[i] + [i + 2] + S[i]
print(*S[N - 1])
```

## [ABC247D - Cylinder](https://atcoder.jp/contests/abc247/tasks/abc247_d)

9分半で突破、WA1. 頭の中で書かないとと思ってた処理を書き忘れる凡ミス. 似たような問題が前にもあったような. 数とボールの個数のペアを deque で管理するだけの簡単な問題.

```python
from collections import deque
from sys import stdin

readline = stdin.readline

Q = int(readline())

result = []
q = deque([])
for _ in range(Q):
    query = readline()
    if query[0] == '1':
        _, x, c = map(int, query.split())
        q.append((x, c))
    if query[0] == '2':
        _, c = map(int, query.split())
        r = c
        t = 0
        while True:
            x, c = q.popleft()
            y = min(r, c)
            t += x * y
            r -= y
            c -= y
            if r == 0:
                if c != 0:
                    q.appendleft((x, c))
                break
        result.append(t)
if len(result) != 0:
    print(*result, sep='\n')
```

## [ABC247E - Max Min](https://atcoder.jp/contests/abc247/tasks/abc247_e)

52分で突破. 最大と最小を含む整数の組を直接計算できなかったので、すべての整数の組数から最大を含まない組数と最小を含まない組数を引いて、最大と最小を含まない組数を足して求めた. 最大と最小が同じ時は *L*=*R* もOKなのを見落としていたが、入出力例に救われた.

```python
N, X, Y, *A = map(int, open(0).read().split())

sections = []
t = []
for i in range(N):
    if A[i] > X or A[i] < Y:
        if len(t) != 0:
            sections.append(t)
            t = []
        continue
    t.append(A[i])
if len(t) != 0:
    sections.append(t)


def asplit(a, sep):
    t = []
    for e in a:
        if e in sep:
            if len(t) != 0:
                yield t
                t = []
            continue
        t.append(e)
    if len(t) != 0:
        yield t


result = 0
for s in sections:
    c = len(s) * (len(s) - 1) // 2
    for t in asplit(s, [X]):
        c -= len(t) * (len(t) - 1) // 2
    for t in asplit(s, [Y]):
        c -= len(t) * (len(t) - 1) // 2
    for t in asplit(s, [X, Y]):
        c += len(t) * (len(t) - 1) // 2
    result += c
if X == Y:
    result += A.count(X)
print(result)
```
Sassの基本

# SASS記法とSCSS記法がある

## SCSS
ファイルの拡張子は```.scss```を使う。
### 書き方（入れ子構造）
```scss
例）cssの場合
.footer {
     width: 50%;
 }
.footer ul {
     margin: 10px
 

例）scssの場合
.footer {
    width:50%;
       ul {
      margin: 10px;
          }
      }
```
scssはタグを使って入れ子構造で書く。

### 書き方【&記号（:hover等)】
```scss
例）:hoverや:active
cssの場合
ul {
 font: 20px;
}
ul:hover {
 color: red;
}

scssの場合
 ul {
 font: 20px;
 &:hover {
 color: red:
 }
}
```

### 書き方【&記号（.second等）】
```scss
例）
cssの場合
li {
 font:15ps;
}
li.second {
 color:red;
}

scssの場合
li{
 font:15px;
 &.second {
   color:red;
  }
}
```

### 変数
```scss
例）
$hoge-color:#7579a3; /*まず定義する*/

h1{
 color:$hoge-color; /*変数の色をh1タグに反映させる*/
}

p{
 color:$hoge-color; /* 同上　*/
}
```
基本は上記の使い方。注意点はスコープの概念がある事。
上から下へ読み込むので、下の行で定義した変数はそれより上の行で読み込めない。

### mixin
複数のコードをまとめて、複数箇所で簡単に呼び出せる機能
#### 引数が無い場合
```scss
@mixin shingou { /*定義する*/
 color: red;
 background-color: yellow;
 border: blue;
}

h2 {
@include shingou; /*呼び出す*/
 font: 10px;
 margin: 20px;
}

h3 {
@include shingou; /*呼び出す*/
 font: 6px;
 margin: 30px;
}
```
#### 引数がある場合
```scss
@mixin shingou($color1, $color2) { /*定義する*/
 color: $color;
 background-color: $color2;
 border: blue;
}

h2 {
@include shingou(red,yellow); /*呼び出す*/
 font: 10px;
 margin: 20px;
}

h3 {
@include shingou(yellow, blue); /*呼び出す*/
 font: 6px;
 margin: 30px;
}
```
引数は複数設定可能。その場合は呼び出し側でも2つ設定する。

### 関数
* ```darken(色,色のパーセント)``` : 色を暗くする
* ```lighten(色, 色のパーセント)``` : 色を明るくする
* ```rgba(色, 少数点)``` : 色の不透明度を指定する
```scss
.block {
 background-color:darken(blue,50%); /*青の色50%濃さを設定出来る*/
}
.block2 {
 backgoround-color:lighten(pink, 60%);
}
.block3 {
 background-color:rgba(yellow, 0.7);
}
```

### import
外部ファイルを読み込み、別ファイルの変数をインポートしたファイルで使用出来る。
その際、読み込む先のファイル名は「_export.scss」の様に「  **\_**（アンダースコア） 」をファイル名の頭に記載する。
主に変数をまとめたファイルを用意し、その他のファイルでimportして使用するといった事が行われる。
**_export.scss**
```scss
$my-color:blue;
$shingo:green;
```
**import.scss**
```scss
@import "_export.scss"; /*importの後に記載のファイル名の「_（アンダースコア）」と「.scss]部分は省略して「@import "export"」の記載も可能*/
h1 {
 color:$my-color; /*青色が表示される*/
 font: 20px;
}
```
Laravel Passportのoauth系ルーティングはどこで定義されているのか

# 概要

- Laravel Passportのoauth系のルーティングはどこで定義されているのか追ってみた。

# 結果

- `vendor/laravel/passport/src/Passport.php`にルーティングに関する記載があった。

    ```vendor/laravel/passport/src/Passport.php
    /**
     * Binds the Passport routes into the controller.
     *
     * @param  callable|null  $callback
     * @param  array  $options
     * @return void
     */
    public static function routes($callback = null, array $options = [])
    {
        $callback = $callback ?: function ($router) {
            $router->all();
        };

        $defaultOptions = [
            'prefix' => 'oauth',
            'namespace' => '\Laravel\Passport\Http\Controllers',
        ];

        $options = array_merge($defaultOptions, $options);

        Route::group($options, function ($router) use ($callback) {
            $callback(new RouteRegistrar($router));
        });
    }
    ```

- どうやらRouteRegistrarクラスをインスタンス化してルーティングを定義しているっぽい。当該のクラスを見てみる。
- `vendor/laravel/passport/src/RouteRegistrar.php`にて当該のクラスが定義されていて、ルーティング情報が記載されていた。（一部抜粋して下記に記載する。）

    ```vendor/laravel/passport/src/RouteRegistrar.php
    /**
     * Register the routes needed for managing clients.
     *
     * @return void
     */
    public function forClients()
    {
        $this->router->group(['middleware' => ['web', 'auth']], function ($router) {
            $router->get('/clients', [
                'uses' => 'ClientController@forUser',
                'as' => 'passport.clients.index',
            ]);

            $router->post('/clients', [
                'uses' => 'ClientController@store',
                'as' => 'passport.clients.store',
            ]);

            $router->put('/clients/{client_id}', [
                'uses' => 'ClientController@update',
                'as' => 'passport.clients.update',
            ]);

            $router->delete('/clients/{client_id}', [
                'uses' => 'ClientController@destroy',
                'as' => 'passport.clients.destroy',
            ]);
        });
    }
    ```

# ご注意

- Passportのライブラリを入れると勝手に定義してくれるけどAuthServiceProviderクラスのboot()関数に`Passport::route();`を追記して登録してあげないと当該のルートは使用できないのでご注意を
-
コンテキストの生成と消滅が、遊戯王のチェーン処理みたいだと思った話

## はじめに
こんにちは、[Ebata](https://twitter.com/ebaryo_)です。

この記事は遊戯王で遊んだことがあり、かつコールスタック内でのコンテキストの生成や消滅タイミングの理解が難しい、という狭すぎるターゲット層に届けたい記事です。

技術書を読んでいる時に、「あれ、なんか見たことあるなぁ」と思ったので共有いたします。（これTwitterでも良くない？）

## コンテキストとは

そもそも、「コンテキストって何？」という方に向けて、簡単に解説します。

> プログラミングの分野でも、同じコード記述やプログラム上の要素が、その置かれているプログラム内での位置や、実行される際の内部状態などによって異なる振る舞いをしたり、異なる制約を受けたりすることを指してコンテキストということがある。

[『IT用語辞典 e-Words』](https://e-words.jp/w/コンテキスト.html)より

つまり同じコードでも、環境が違えば違うルールのもとで実行される、ということですね。

__記事内でのコンテキストは、このルール・制約のことを指しています。__

## コールスタックとは

関数内で他の関数を呼び出すときの階層です。

例えば、
```script.js
function first(){
  second();
}

function second(){
  third();
}

...

first(); //関数を呼び出す

```
このようなコードがあった場合、`first()`が`second()`を呼び出して、`second()`が`third()`を呼び出して……。

といったように、階層的に表すことができます。これをコールスタックと言います。

## コールスタックとコンテキストの関係

「コールスタックとコンテキストはなんとなく分かった。で、どういう関係なの？」

階層表示された関数ごとに、コンテキストが存在する。ということです。変数は参照できるか、などの制約が変わります。

一番分かりやすいのは、`this`が何を参照するのか、ではないでしょうか。

```script.js
//グローバルコンテキストでは、thisはwindowを参照。
console.log(this === window);
> true

//メソッドコンテキストでは、ichiroを参照。
const ichiro = {
  name: "一郎",
  hello: function(){
    console.log("こんにちは、" + this.name);
  }
}
```

ここで、この記事の内容です。

コールスタックでは、呼び出された順番にコンテキストが生成されます。

```script.js
function first(){
  second();
}

fuction second(){
  third();
}

function third(){
  //処理
}

first();
```
この時、

1. `first()`のコンテキスト生成
2. `second()`のコンテキスト生成
2. `third()`のコンテキスト生成
2. `third()`のコンテキスト消滅
2. `second()`のコンテキスト消滅
2. `first()`のコンテキスト消滅

といった流れになります。

## 遊戯王のチェーン処理

ここからは本当に関係ないのですが、先述したコンテキストの生成・消滅の流れが「遊戯王のチェーン処理」に似ていると感じた話です。

遊戯王には、攻撃や効果の発動に対して効果を発動する、「チェーン」と呼ばれる処理があります。

例えば、`モンスターの攻撃`に対して`トラップカード`を発動し、そのトラップカードに対してトラップカードを発動することが可能です。

```yugioh.js
//ライフポイントは8000。
my_life = 8000;
enemy_life = 8000;

//攻撃に対して発動するトラップカード。
const magic_cylinder = {
  name: "マジックシリンダー",
  type: "トラップカード",
  effect: function(){
    /*
    相手モンスターの攻撃宣言時、攻撃モンスター１体を対象として発動できる。
    その攻撃モンスターの攻撃を無効にし、その攻撃力分のダメージを相手に与える。
    */
  }
}

//トラップカードに対して発動するトラップカード。
const solemn_judgment = {
  name: "神の宣告",
  type: "トラップカード",
  effect: function(){
    /*
    LPを半分払って以下の効果を発動できる。
    魔法・罠カードが発動した時に発動できる。
    その発動を無効にし破壊する。
    */
  }
}

//攻撃するモンスター。
const blue_eyes_white_dragon = {
  name: "ブルーアイズホワイトドラゴン",
  type: "通常モンスター",
  atk: 3000,
  def: 2500
}

function kougeki()=>{
  //攻撃する。
}

//攻撃後の処理。
function attack(monster){
  //①monsterが攻撃する。
  kougeki();
  //②マジックシリンダーの発動。
  magic_cylinder.effect;
  //③神の宣告の発動。
  solemn_judgment.effect;
}

//ブルーアイズの攻撃。
attack(blue_eyes_white_dragon);
```
長々と書きましたが、

1. `ブルーアイズホワイトドラゴン`の攻撃。
1. `マジックシリンダー`の効果発動。
1. `神の宣告`の効果発動。

この順番で発動され、

`ブルーアイズホワイトドラゴン`の攻撃を、`マジックシリンダー`で無効にし跳ね返す。この処理を`神の宣告`でさらに無効にする、という流れになります。

なので、このチェーン処理の順番は、

1. `神の宣告`の効果で`マジックシリンダー`無効。
1. `マジックシリンダー`は無効される。
1. `ブルーアイズホワイトドラゴン`の攻撃が通る。

となります。

この流れが、先述した『コールスタックでのコンテキスト生成・消滅のタイミング』に似ていますよね。

遊戯王をやっている方は、こう考えていただけると分かりやすいと思います。

## 終わりに

全然内容はありませんでしたが、個人的には大満足の記事になりました。こんな記事も誰かに読んでいただけたなら嬉しいです。

あと、まだ駆け出しなのでコードが汚いとかはご愛嬌。。。（成長します）
AtCoder Beginner Contest 245 参戦記

# AtCoder Beginner Contest 245 参戦記

## [ABC245A - Good morning](https://atcoder.jp/contests/abc245/tasks/abc245_a)

3分で突破. 書くだけ.

```python
A, B, C, D = map(int, input().split())

if A * 3600 + B * 60 < C * 3600 + D * 60 + 1:
    print('Takahashi')
else:
    print('Aoki')
```

## [ABC245B - Mex](https://atcoder.jp/contests/abc245/tasks/abc245_b)

3分で突破. 書くだけ.

```python
N = int(input())
A = list(map(int, input().split()))

print(min(set(range(2002)) - set(A)))
```

## [ABC245C - Choose Elements](https://atcoder.jp/contests/abc245/tasks/abc245_c)

10分で突破、TLE1. メモ化せずに死んだ.

```python
from functools import lru_cache

from sys import setrecursionlimit

setrecursionlimit(10 ** 6)

N, K = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

@lru_cache(maxsize=None)
def f(n, i):
    if i == N:
        return True
    a = A[i]
    if abs(a - n) <= K:
        if f(a, i + 1):
            return True
    b = B[i]
    if abs(b - n) <= K:
        if f(b, i + 1):
            return True
    return False

if f(A[0], 1) or f(B[0], 1):
    print('Yes')
else:
    print('No')
```

が、こんな回りくどいことをする必要なかったね.

```python
N, K = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

a = True
b = True
for i in range(1, N):
    c, d = a, b
    a = (c and abs(A[i - 1] - A[i]) <= K) or (d and abs(B[i - 1] - A[i]) <= K)
    b = (c and abs(A[i - 1] - B[i]) <= K) or (d and abs(B[i - 1] - B[i]) <= K)

if a or b:
    print('Yes')
else:
    print('No')
```

## [ABC245D - Polynomial division](https://atcoder.jp/contests/abc245/tasks/abc245_d)

77分半で突破、RE4. A<sub>i</sub>=0 のパターンを考えていなくて0の除算を出しまくって死んだ.

```python
N, M = map(int, input().split())
A = list(map(int, input().split()))
C = list(map(int, input().split()))

B = [None] * (M + 1)


def f(b, c):
    x = C[c]
    if A[c - b] == 0:
        return None
    for i in range(min(c, N) + 1):
        if A[i] == 0:
            continue
        if c - i == b:
            continue
        if B[c - i] is None:
            return None
        x -= A[i] * B[c - i]
    return x // A[c - b]


for i in range(M + 1):
    for j in range(M + 1):
        if B[j] is not None:
            continue
        for k in range(j, N + M + 1):
            x = f(j, k)
            if x is not None:
                B[j] = x
                break
        if B[j] is not None:
            break
print(*B)
```
WHERE A and (B or C)をActiveRecordで記述する方法


Railsアプリケーション開発中に、`WHERE A and (B or C)`のようなSQLをActiveRecordのデータアクセスメソッドで書くときにどうすれば良いのか少しハマったのでメモとして残します。

```sql:SQL
SELECT *
FROM model
WHERE A and (B or C) ;
```

# 結論
`merge`メソッドを使用する。
括弧に該当するメソッドが`merge`メソッドとなる。
```ruby:ActiveRecord
Model.where(A).merge(where(B).or(where(C)))
```


# 例: ポケモン
例えば、こんな感じのポケモンテーブルがあったとする
```ruby:db/migrate/pokemon.rb
class Pokemons < ActiveRecord::Migration[5.2]
  def change
    create_table :pokemons do |t|
      t.string name
      t.string type
    end
  end
end
```


## idが1~10かつ(炎タイプまたは水タイプ)のポケモンのみを取得したい場合
SQLで書くならこうなる
```SQL:SQL
SELECT *
FROM pokemon
WHERE id BETWEEN 1 AND 10
AND (type = '炎' OR type = '水'); 
```
ActivrRecordのメソッドを使用すると・・・
```ruby:ActiveRecord
@pokemons = Pokemon.where(id: 1..10).merge(where(type: '炎').or(where(type: '水')))
```

この部分だけ、何度も取得する必要がある場合は、pokemonモデルに`scope`として定義しても良い
```ruby:pokemon.rb
scope :filter_type, -> { merge(where(type: '炎').or(where(type: '水'))) }

// 呼び出し先
@pokemons = Pokemon.filter_type
```

# おまけ
## `WHERE A and (B or C or D)`
```ruby
Model.where(A).merge(where(B).or(where(C)).or(where(D)))
```

## `WHERE (A or B) and (C or D)`
```ruby
Model.merge(where(A).or(where(B))).merge(where(C)).or(where(D)))
```

# 参考

https://style.potepan.com/articles/29804.html
ITableEntity の一部のプロパティを無視する方法

# ITableEntity の一部のプロパティを無視する方法

\# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.24)、Azure.Data.Tables 12.5.0 となります.

`Microsoft.Azure.Cosmos.Table` の時にはエンティティの一部のプロパティを無視するための `Microsoft.Azure.Cosmos.Table.IgnorePropertyAttribute` クラスが存在しました. `Azure.Data.Tables` になって一見無視するための手段がなくなってしまったように見えますが、標準で存在する `System.Runtime.Serialization.IgnoreDataMemberAttribute` クラスが使えるようになっています.

以下、使用例.

```csharp
using Azure;
using Azure.Data.Tables;
using System;
using System.Runtime.Serialization;

namespace WebApplication1.Models
{
    public sealed class BillingSummary : ITableEntity
    {
        [IgnoreDataMember]
        public string SubscriptionId { get; set; }
        public int BillingAmount { get; set; }
        public bool IsFinalized { get; set; }
        [IgnoreDataMember]
        public DateTime YearMonth { get; set; }

        public string PartitionKey { get => SubscriptionId; set => SubscriptionId = value; }
        public string RowKey { get => $"{YearMonth:yyyyMM}"; set => YearMonth = DateTime.ParseExact(value, "yyyyMM", null); }
        public DateTimeOffset? Timestamp { get; set; }
        public ETag ETag { get; set; }
    }
}
```

情報源は `Azure.Data.Tables` の [CHANGELOG](https://github.com/Azure/azure-sdk-for-net/blob/Azure.Data.Tables_12.5.0/sdk/tables/Azure.Data.Tables/CHANGELOG.md#features-added) です. `12.2.0-beta.1 (2021-08-10)` で機能追加されたようです.

cf: [[FEATURE REQ] Allow specific properties to be ignored on ITableEntity implementation #19782](https://github.com/Azure/azure-sdk-for-net/issues/19782)
典型90問007 CP ClassesをPythonで解く！

# はじめに
AtCoder現在茶色(年内には緑が目標！）のあんこちゃん(@Chunky_RBP_chan)です。\
典型問題は抑えとかねばということで、★2〜★5に取り組んでいます。\
Pythonで取り組まれている方も多いと思うので自分の解答をシェアしたいと思います！

# 問題
https://atcoder.jp/contests/typical90/tasks/typical90_g

# 解法
Q人の生徒それぞれのレベルにもっとも合うクラスに分ける問題です。
二分探索によって生徒iのレーティング$B_i$が$A_j$と$A_{j+1}$の間となるjを見つけます。jがわかれば$|B_i-A_j|$と$|B_i-A_{j+1}|$の小さい方が答えとなります。
注意として、j=-1の場合とj=Nの場合$A_j$もしくは$A_{j+1}$がないので別処理が必要です。

```python
def bisect(X):
    right = N
    left = -1
    while right-left>1:
        mid = (right+left)//2
        if X < A[mid]:
            right = mid
        else:
            left = mid
    if left == -1:
        return A[right]-X
    if right == N:
        return X-A[left]
    return min(abs(A[left]-X),abs(A[right]-X))

N = int(input())
A = list(map(int, input().split()))
A.sort()
Q = int(input())
for _ in range(Q):
    b = int(input())
    print(bisect(b))
【Next.js】静的な画像ファイルの取り扱い

## はじめに
　本記事は、プログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。


## 静的な画像ファイルの取り扱い
静的な画像ファイルを配信するためには以下のようにします。
### `public`フォルダ配下に画像を追加
まず、`public`フォルダ配下に画像を追加します。
以下のように`public`フォルダに`sample`フォルダを作成し、`sample.jpg`を追加しました。

![スクリーンショット 2022-04-15 5.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/22a82fb6-ae70-a066-c212-c17e2ec2248c.png)

### `Image`コンポーネントを使用する
次に、画像を表示させるためにindex.jsに以下のように追記します。

```index.js
import Head from 'next/head'
import styles from '../styles/Home.module.css'
import Image from 'next/image' // 追記
import Link from 'next/link' 

export default function Home() {
  return (
    <div className={styles.container}>
      <Head>
        <title>Sample App!!</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <main className={styles.main}>
        <h1 className={styles.title}>
          Welcome to
          <Link href="/posts/samplePost">
            <a>Sample App!!</a>
          </Link>
        </h1>
         // 以下追記 (objectFit="contain"はアスペクト比を固定するため)
        <Image src="/sample/sample.jpg" alt="Sample Image" width={500} height={500} objectFit="contain" />
      </main>
    </div>
  )
}
```

するとページに画像が表示されます。

![スクリーンショット 2022-04-15 5.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/71e101d1-5e58-9c9e-ac85-ac9dcc51a4a3.png)


### `image`タグと`Image`コンポーネントの違い
`image`タグではなく、`Image`コンポーネントを使用することで以下の恩恵を受けられます。

* __遅延ロード__
ブラウザで画像が表示画面内に入ったとき初めてダウンロードされます。大きなページの末尾部分に配置された画像が、無駄にダウンロードされてしまうのを防ぐことができます。

* __画像の最適化__
クライアントに応じて画像ファイルを最適化して配信してくれます。

* __画像の最適化__
デフォルトで画面サイズに応じたレスポンシブ表示が行われます。