OmniAICreator/Qiita-1.07M huggingface dataset:
element-plusのDatePickerでSuspenseを使い非同期で扱う。

# はじめに
vue3でDatePicekerをいろいろと調べてみた。
でも、どれもコンポーネント内で非同期で選択できない日を設定することができなかった。
例：予約アプリで、apiに予約済みの日付を問い合わせて表示する
そこでvueのSuspenseを使い対応してみた。
今回はelement plusを使ったが他のDatePickerでも大丈夫だと思います。


# コード
``` App.vue
<template>
  <Suspense>
    <template #default>
      <DatePickerComponent></DatePickerComponent>
    </template>
    <template #fallback>
      <span>読み込み中…</span>
    </template>
  </Suspense>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import DatePickerComponent from './components/DatePickerComponent.vue';
export default defineComponent({
  name: 'App',
  components: {
    DatePickerComponent
  }
});
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```


``` DatePickerComponent.vue
<script lang="ts" setup>
import { ref } from 'vue'
const select = ref('')
let list:Date[] = []
const disabledDate = (time: Date) => {
  let result = list.find(v => v.getTime() == time.getTime())
  if(result){
    return true;
  }
  return false
}
const sleep = async () => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(1)
    }, 3000)
  })
}
await sleep();
/*ここから先はapiからデータが取れて前提。今回は明日が選択不可にしています*/
const date = new Date();
let tomorrow = new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0,0);
tomorrow.setDate(tomorrow.getDate() + 1)
list.push(tomorrow)
</script>

<template>
  <el-date-picker
      v-model="select"
      type="date"
      placeholder="Pick a day"
      :disabled-date="disabledDate"
  />
</template>
```

# まとめ
本当はdisabledDataの中で非同期で扱いたい。
例えば、来月に移動したときに、いつdisbaledにするかapiに聞きたいから。

#参考
git
https://github.com/kawamurashin/vue3-suspense-el-test1
【クエリビルダ：拡張表現】Random関数を使ってみる

今回は、[Sharperlight](https://sharperlight.jp/)の数ある拡張表現関数の中から、**Random**関数を使ってみます。
この関数を使用すると指定した範囲内の数値をランダムに算出してくれます。
### 元となるクエリの準備 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから`クエリビルダ`を起動します。
システムのカスタム定義のデータセットを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3d318c97-0a66-d5a1-dcbe-9b85747cceb1.png)
カスタム定義のデータセットはこのように作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4a4e1b63-4ef2-edf8-cd19-500462b59529.png)
クエリ結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cb8a4280-dbbf-0d35-e92d-0f41faa16999.png)
### Random関数の追加 ###
出力領域の右クリックから**拡張表現を追加**を選択します。
`一般`タブで**出力参照名**と**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1fd5f07f-a2ec-4f04-84b3-ff892836dbc1.png)
`拡張表現`タブに移動し、関数一覧より**Random**関数を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。
テンプレートを以下のように編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7027cb12-2c13-fec5-263a-69f0526372b8.png)
出力列の定義はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6f211bfa-8f4e-90bc-78fd-981624f5ff5d.png)
### 結果 ###
指定した範囲内の値が算出されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cc7b3736-ba65-4b31-07cd-720f351ff382.png)
レポートのデザイン上、ご利用の必要性が発生した場合は是非試してみてくださいね。

では、失礼します。
FactoryBot で save 時に context を渡す

# 前置き: validation_context とは

避けたい `validation` がある時など、`validation` の条件に `validation_context` を利用し、

```app/model/user.rb
class User < ApplicationRecord
  before_validation :set_bar, unless: -> { validation_context == :hoge }
  # ...
end
```

`save` 時に、`context` を指定してあげれば、`validation` を避けられます。

```app/controller/user/user_controller.rb
class User::UsersController < User::ApplicationController
    def create
        @user = User.new(user_params)
        @user.save(context: :hoge)
        # ...
    end
    # ...
end
```

ただ、この動作を `FactoryBot` だとどうすれば良いのか分からなかったので、書いときます。

# 本題: FactoryBot での context 指定

結論としては `to_create` を使えばできます！

例えば、`to_create` で `context` を指定して `save` する `trait` を作成して、

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    trait :context_hoge do
      to_create { |instance| instance.save(context: :hoge) }
    end
    # ...
  end
end
```

`create` 時に指定すると、作成した `trait` を指定すると、上手くいきます。

```spec/requests/user/users_controller_spec.rb
RSpec.describe User::UsersController, type: :request do
  let!(:user) { create(:user, :context_hoge) }
  # ...
end
```

## 余談

`validation_context` は以下の記事のようなハマりどころもあるので、使わないで済むなら、使いたく無いなぁ。

https://qiita.com/kakudaisuke/items/e9805b382646b41355f9

# 参考

- [Custom Methods to Persist Objects](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#custom-methods-to-persist-objects)
- [factory_botでvalidationをskipしたいときの方法](https://kossy-web-engineer.hatenablog.com/entry/2021/05/16/112235)
Ubuntuに特定バージョンのansibleインストールする

# はじめに

まだまだ新人エンジニア(2年目)です。
前にansible関連はコンテナ化できたのでそれでいきたかったが、Ubuntuにansibleのインストールを急遽行いたい事情ができたため残しておきます。
settingjsonの中身、ansibleの特定のバージョンのインストールに詰まったので紐解いていきます。

## 経緯
1. ansibleを公式の通りにインストール
2. ファイルを開くと赤い線が出るのなんで。。
3. settig.jsonの中身(yaml.schemas)が原因だと気付く。
4. 設定を変えたいけど現状使ってるansibleのバージョンにしないと中身も修正の必要出てくるか。。？
5. アンインストール=>インストール
6. 最新バージョンインストールしてくれるけど特定のバージョンのインストールの仕方分からん
7. 特定のバージョンのインストール
8. settig.jsonの中身(yaml.schemas)をなんとかする。。？

## この記事で行うこと

**ansibleのアンインストール=>ansibleの特定のバージョンのインストール 2.9.6**
**settings.json : yaml.schemaの修正**

## ansibleのアンインストール=>インストール

何も入っていなければ飛ばして問題ありません。

このサイト見てアンインストールしました。
https://www.thelinuxfaq.com/ubuntu/ubuntu-17-04-zesty-zapus/ansible?type=uninstall
```
ansible --version
sudo apt-get purge --auto-remove ansible
```

以下のコマンドとかでインストール可能なansibleのバージョン見ておくとよい。
[[Ubuntu] apt-get まとめ](https://qiita.com/white_aspara25/items/723ae4ebf0bfefe2115c)
```
# どちらかで
$ sudo apt-cache showpkg ansible

$ sudo apt-cache madison ansible
ansible | 5.10.0-1ppa~focal | http://ppa.launchpad.net/ansible/ansible/ubuntu focal/main amd64 Packages
ansible | 2.9.6+dfsg-1 | http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages

# 公式の手順のままインストールする際にバージョン指定
# =2.9.6+dfsg-1をつけなければ最新バージョンインストールしてくる。
$ sudo apt-get install ansible=2.9.6+dfsg-1

$ ansible --version
ansible 2.9.6
～～～
```

これで特定のバージョンのインストール完了。
次はsetting.jsonの設定を見直してくる。。

## settig.json : yaml.schemas

### 環境にあっていない設定がある。。

[Ubuntu への Ansible のインストール](https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html#ubuntu-ansible)
公式みてUbuntsにインストールしたが既にあるファイルを開くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628058/aded7b8b-885c-729c-99fc-b9314f731515.png)

```
#　内容
Unable to load schema from 'https://json.schemastore.org/ansible-role-2.9': Request vscode/content failed unexpectedly without providing any details.
```

まずvscodeのsetting.jsonのyaml.schemasの中身に存在しないURLがありました。
これが問題なければ調べることもなかったかな。。(´;ω;｀)

とりあえずURLがないと言われているので消してみる。
するとbecomeの部分がなんか怒られている。もぐら叩きかな

```yaml
# Incorrect type. Expected "boolean".yaml-schema: Become
    become: yes
```

YAMLのyesはtrueと同じと書かれているサイトがかなりあるので別に書き方に問題があるようには思えない。
[VSCodeでYAMLを編集してたらIncorrect type. Expected "string".](https://qiita.com/ogrium/items/95660cf5655e455d6f22)で似たようなことになってます。

```json
{
    "yaml.schemaStore.enable": false
}
```

構文エラー的なものは表示されなくなった。
外部に良い設定があればyaml.schemasに記載した方が便利だろうなとは思うが一旦力尽きたのでここらにしておきます。たぶん今はYAMLの拡張機能が色々補ってくれているんだろうなーぐらいの認識で申し訳ないですが。。

やるとしたら[JSON Schema Store](https://www.schemastore.org/json/)でansible関連のものを利用して、必要なものは設定する必要があるかと思っていた。
雰囲気的にはこんな感じかと考えてた

```json  
{
    "yaml.schemas": {
        "https://raw.githubusercontent.com/ansible-community/schemas/main/f/ansible.json#/$defs/playbook": "*/playbook.yml",
    }
}
```

## 最後に
分かったこと
- apt-getは最新版をインストールしてきてくれるが、バージョンインストールも可能。(バージョンの調べ方)
- setting.jsonについて
- あとは全員devcontainerを使うことを私がお祈りしていることでした。

ここまでお読みしてくださりありがとうございました。簡潔に纏めるのは難しいですね(´・ω・)
こういう部分でこけてしまうのが辛いですが、次同じようなことがあってもなんとか出来る気がします。
Next.js ✖️ TypeScriptのプロジェクトをbuildしようとしたらエラーが発生した

## 概要
初めてNext.js ✖️ TypeScriptのプロジェクトをbuildしようとしたら複数のエラーが発生したため解決方法を備忘録のため投稿する。

## 環境
■ Nodeバージョン
16.16.0
■ TypeScriptバージョン
4.7.4

## Linkの使用
発生したエラー。
```
Error: Do not use an `<a>` element to navigate to `/`. Use `<Link />` from `next/link` instead.
```

下記コードを記載していたがLinkを使用する必要がある。
```tsx
<a href="/" >〇〇</a>
```

下記に変換後エラーが解消された。
```tsx
<Link href="/">
  <a>〇〇</a>
</Link>
```

## 関数コンポーネントをpagesフォルダの外に配置

エラー
```
Generating static pages (0/9)TypeError: Cannot read properties of undefined (reading '００')

// 以下の同じようなエラーが出ていたので省略
```
外部の関数コンポーネントをpagesフォルダ配下に格納していたことによりエラーが発生した。

```pages/index.tsx
import Header from '../components/header'

<Header />
```

上記コードのimportしているファイルをpagesフォルダの外に配置してパスを変更して解決できた。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その011

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
構成と設定の学習　にある練習問題11問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup

なお、こちらの内容はYouTubeでも公開しております
https://www.youtube.com/watch?v=hWPNzGyv4RI

<iframe width="560" height="315" src="https://www.youtube.com/embed/hWPNzGyv4RI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


問題はこちらです
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2cb421d4-c1ab-584b-edb6-c3fd538b1147.png)

今回の問題はレポートの閲覧設定の問題ですね。

皆さんいかがでしょうか
正解はBです

レポートの閲覧できる。閲覧できないの設定はレポートフォルダで設定可能です
あらかじめ経営陣と共有するレポートフォルダを作成し、レポートのフォルダを変更しましょう



Aが間違っている理由について解説します

組織の共有設定はレコードの共有の話ですね
今回はレポートの共有の話なので誤りです


Cが間違っている理由について解説します

レポート名を変更しても共有には影響ないです


Dが間違っている理由を説明します

私の非公開レポートにレポートを格納すれば、自分しかレポートを見ることができないので誤りです。

本日の内容はここまでです

みなさん楽しく元気にSalesforceを学びましょう
【クエリビルダ：拡張表現】DivSafe関数を使ってみる

今回は、[Sharperlight](https://sharperlight.jp/)の数ある拡張表現関数の中から、**DivSafe**関数を使ってみます。
この関数を使用すると除算を行う場合に、**0で割るわり算**によるエラーを防ぐことができます。
### 元となるクエリの準備 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから`クエリビルダ`を起動します。
システムのカスタム定義のデータセットを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f7b1135b-971a-9717-54d6-719ba701aed1.png)
データセットの定義はこのようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d0669c26-ca1d-6f18-83e4-56180ef4b120.png)
クエリ結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d05bdc12-90dc-8e2e-321c-71d2093093f6.png)
### DivSafe関数の追加 ###
出力領域の右クリックから**拡張表現を追加**を選択します。
`一般`タブで**出力参照名**と**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/47d2630c-5c4c-0dcb-d64b-b365d3a9b232.png)
`拡張表現`タブに移動。関数一覧より**DivSafe**関数を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。
テンプレートを以下のように編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e3352a03-df4b-d32b-ac00-0f5f0876d564.png)
出力列の定義はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/613dd934-5236-2993-4941-c1d233921d69.png)
### 結果 ###
**0で割るわり算**によるエラーを防いでいることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9a4b2bd6-6dd1-54e4-b9dc-b130cc7cbb58.png)
レポートのデザイン上、ご利用の必要性が発生した場合は是非試してみてくださいね。

また、SharperlightにはRound、Floor、Mod、Cos、Sin、Tanなどの一般的な数学関数も用意されています。

では、失礼します。
ipadでjavascriptのconsoleを見たいよう（涙）

## 初めに

俺・「僕はプログラミングが趣味の中学生。学校でもらったipadでプログラミングをしている。今日は、javascriptで無限ループを作りたいんだけど、consoleが見たいなぁ」

俺・「せんせ、ipadの開発者ツールってどうやって起動するの?」

せんせ・「ipadでは開発者ツールはないよ。アプリを入れてみたら?」

俺・**「アプリ入れられへんねん。」**

せんせ・*「乙w」*

俺・「googleせんせ、なんか方法ない?」

gooooogle・「知らんわ。」

俺・「涙」


## 対処法

https://gist.github.com/developit/60b810cbcb55e1da198a634218adcc90

```tiny-console.js```を使う！

これを使うと、ブラウザやスマホでもconsoleが見えるようになります。

javascriptのエラーも表示してくれて、かなり便利。
早速設置していきましょう。

### 設置方法
```html
<script src="https://iwb.jp/s/js/tiny-console.js"></script>
```
なんと、これを```<body>```〜```</body>```に配置するだけ！
そうすると、ページの下に
![67B53657-B57D-4B60-9F56-3B019225B473.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/0bc15da7-c0e7-809b-a73a-10b3b614f241.jpeg)
こんなconsoleが表示されます。

エラーもある程度表示されます。
![F6B23E89-675C-4601-87A0-4F8DCC8F464D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/e75db878-266f-51e3-3016-4c6a38b3cacb.jpeg)


もちろん、
```javascript
console.log("^-^");
```
も表示されます。

![4BD8848A-ED49-40E3-852A-5969CFB05ACC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/87a08082-b4ea-1478-4cb4-f4f7454f44a4.jpeg)

あと、下のreplという欄から任意のコードも実行できます。
![9B87063B-0649-46B0-87F9-5E63C415BFFF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/0b0166ed-c9e5-1f8d-e6ef-d3bc3df6bff7.jpeg)

こんな便利なものがあったなんて、知りませんでした。
みなさんも、ご活用ください!


https://gist.github.com/developit

@developitさん、ありがとうございます。


## 追記
「ホーム」に載ってました！ありがとうございます。
この記事によって、ipadでの開発がもっと便利になれば、幸いです。
![3F8FAB54-B2F0-4F2B-9B65-73895D59C5CF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/501f6b81-8c7e-5cf2-3e4b-5684d71bacf3.jpeg)
Stripe Elementsを利用したカートシステムで、カートの変更や割引などPayment Intentsの変更を反映する

ECサイトやウェブサービスでは、送料や割引の適用などで決済フロー中に請求金額が変わることがあります。

その場合、StripeのPayment IntentsとElementsを利用して決済を提供している場合、Payment Intentsの`amount`を更新して対応します。

```bash
stripe payment_intents update pi_xxx --amount 1090
```

この変更をPayment Elementsなどに反映させたい場合、`useElement`のもつ`elements.fetchUpdates`が利用できます。

```tsx
const PaymentForm: React.FC = () => {
  const elements = useElements()

  return (
    <form>
      <PaymentElement />
      <button onClick={async () => {
        await elements?.fetchUpdates()
      }}>Sync</button>
    </form>
  )
}
```

`fetchUpdates`を実行することで、Payment Elements内で表示される金額を更新できます。

![スクリーンショット 2022-06-24 18.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/3dea014c-810a-b201-b53b-6c06fa8f43b6.png)

変更後のPaymentIntentsを再取得したい場合は、`useStripe`の`retrievePaymentIntent`を実行しましょう。

```tsx
const PaymentForm: React.FC = () => {
  const elements = useElements()
  const stripe = useStripe()

  return (
    <form>
      <PaymentElement />
      <button onClick={async () => {
        await elements?.fetchUpdates()
        await stripe?.retrievePaymentIntent('pi_xxxx_secret_xxxx')
      }}>Sync</button>
    </form>
  )
}

```


## 参考ドキュメント

https://stripe.com/docs/js/elements_object/fetch_updates

https://stripe.com/docs/payments/accept-a-payment?platform=web&ui=elements#fetch-updates

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

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

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

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
Distance from a point to a line「点と直線の距離 」について, sympyでsimplify()を2回実行しました。

オリジナル
projection(other)＜

https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.projection

# wikipedia

https://ja.wikipedia.org/wiki/%E7%82%B9%E3%81%A8%E7%9B%B4%E7%B7%9A%E3%81%AE%E8%B7%9D%E9%9B%A2

https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line


# sympyで
?simplify()を2回実行しました。

```python
from sympy import *
a,b,c=symbols('a,b,c',real=True)
x0,y0=symbols('x0,y0',real=True)
x,y  =symbols('x ,y ',real=True)
print("#",Line(a*x+b*y+c).projection(Point(x0,y0)).distance(Point(x0,y0)))
print("#",Line(a*x+b*y+c).projection(Point(x0,y0)).distance(Point(x0,y0)).simplify())
print("#",Line(a*x+b*y+c).projection(Point(x0,y0)).distance(Point(x0,y0)).simplify().simplify())
# sqrt((-x0 + (-a*(b*y0 + c) + b**2*x0)/(a**2 + b**2))**2 + (-y0 + (a**2*y0 - a*b*x0 - b*c)/(a**2 + b**2))**2)
# sqrt((a**2*x0 + a*b*y0 + a*c)**2 + (a*b*x0 + b**2*y0 + b*c)**2)/(a**2 + b**2)
# Abs(a*x0 + b*y0 + c)/sqrt(a**2 + b**2)
```
# 入試問題
そのものズバリ

https://mathexamtest.web.fc2.com/2013/201310561/2013105610100mj.html


点A(2,2),点B(5,3),点C(4,6)...線分ABの垂直二等分線...

https://qiita.com/mrrclb48z/items/774d1f18651b3f27fb41



# 環境

```python
import sympy
print("#",sympy.__version__)
# 1.10.1
```

# 参考
「点と直線の距離の公式」は,高校数学全分野を通し,Best3に入る超重要公式です。

https://inupri.web.fc2.com/zusiki/tenchoku1.pdf#page=2

余談ですが，”点と直線の距離の公式”を”点直”と呼ぶのは，全国的にみてメジャーなのでしょうか？＜

https://mathmathmass.exblog.jp/32210925/
Laravel EmailのHeaderとFooterを変更する

## 背景
サービス名と会社名が違う時に調べる機会があったため

## ファイル

Emailのファイルのパス
`src/resources/views/vendor/notifications/email.blade.php`

このファイルはターミナルで
`php artisan vendor:publish --tag=laravel-notifications`
を打つことで作成できる

## 何も変更しなかったら

HeaderがLaravelになっているし、そこを押すとHttp://localhost にとんでしまう。
![Mailtrap_-_Safe_Email_Testing_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/ab5e106b-1e41-078e-f15b-3649f3f33215.png)

## Headerの名前を変更したい時
` .env `ファイルの`APP_NAME`を変更する

## Headerを押したときのurlを変更したい時
` .env `ファイルの`APP_URL`を変更する

![_env_—_coetto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/c8659d11-802c-108b-da74-5b66b60b21c6.png)


## Footerを変更したい時
`php artisan vendor:publish --tag=laravel-mail`
をターミナルで打って、
`resources/views/vendor/mail/html/message.blade.php`
のFooter部分を変更する。
![message_blade_php_—_coetto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/d950e47b-6e1f-78b2-398b-bcfd4b64ea47.png)
Falco Ruleを紹介するシリーズ - Disallowed SSH Connection

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Disallowed SSH Connection」</b>です。
# Rule記述
```
- rule: Disallowed SSH Connection
  desc: Detect any new ssh connection to a host other than those in an allowed group of hosts
  condition: (inbound_outbound) and ssh_port and not allowed_ssh_hosts
  enabled: false
  output: Disallowed SSH Connection (command=%proc.cmdline connection=%fd.name user=%user.name user_loginuid=%user.loginuid container_id=%container.id image=%container.image.repository)
  priority: NOTICE
  tags: [network, mitre_remote_service]
```
# Rule概要
ホストへの新規のSSH接続を検知します。
攻撃対象領域を減らすことは、セキュリティのベストプラクティスの一つですが、SSHなどのリモートコンソールサービスへの自由な接続を取り除くことで、サーバーのリスクに対する露出を減らすことができます。
実際、SSHポートをインターネットに公開すると、最初のSSHブルートフォース攻撃は12時間以内に発生すると言われています。
関連情報として、EC2上のSSHに関する<a href=https://sysdig.jp/blog/aws-secure-ssh-ec2-threats/ target=new>こちらのブログ記事</a>もご参照ください。
許可されたホストグループ以外のホストでSSH接続が使用された場合、このRuleを使うことで検知可能です。

# Condition（条件）
`(inbound_outbound) and ssh_port`
SSHポート接続が行われ、

かつ

`and not allowed_ssh_hosts`
SSH接続を許可されたホストグループではない場合

今回は簡単な条件なので、Conditionを構成するマクロも見てみましょう。
```
- macro: inbound_outbound
  condition: >
    ((((evt.type in (accept,listen,connect) and evt.dir=<)) and
     (fd.typechar = 4 or fd.typechar = 6)) and
     (fd.ip != "0.0.0.0" and fd.net != "127.0.0.0/8") and
     (evt.rawres >= 0 or evt.res = EINPROGRESS))
```
`((evt.type in (accept,listen,connect) and evt.dir=<)) and`
イベント名がaccept, listen, connectのどれかのexitイベントで、

`(fd.typechar = 4 or fd.typechar = 6)) and`
ファイルディスクリプタがIPv4もしくはIPv6ソケットで、

`(fd.ip != "0.0.0.0" and fd.net != "127.0.0.0/8") and`
IPアドレスが"0.0.0.0"ではなく、IPネットワークが"127.0.0.0/8"でもなく、

`(evt.rawres >= 0 or evt.res = EINPROGRESS)`
イベントが成功もしくは進行中の場合

```
- macro: ssh_port
  condition: fd.sport=22
```
`fd.sport=22`
サーバーポートが22の場合

```
- macro: allowed_ssh_hosts
  condition: ssh_port
```
`ssh_port`
メインのfalcoルールファイルでは、sshアクセスが許可される特定のホストを知る方法がないので、このマクロは上記のssh_portマクロを繰り返すだけで、効果的にすべてのホストからのsshを許可します。ローカルのfalcoルールファイルでマクロを上書きして特定のホストを設定する場合、条件は "fd.sip="a.b.c.d" or fd.sip="e.f.g.h" のような感じになります。

# Output（出力）
許可されていないSSH接続

`%proc.cmdline`
コマンドライン

`%fd.name`
接続名

`%user.name`
ユーザー名

`%user.loginuid`
ユーザーのログインUID

`%container.id`
コンテナID

`%container.image.repository`
コンテナイメージリポジトリ
Check : z/OS UNIX zFS Mount Failure

You should check following command output:
```
D OMVS,F      <-- List mounted filesystems

D OMVS,MF     <-- List history of mount failure
```
Alternative way to list mounted filesystems
```
$ df -k
```
```
F BPXOINIT,FILESYS=D,ALL operator command
```
You need to review syslog from IPL, you can see some IOEZ or BPX messages related to mount.

Note:
- No messages written in syslog when the file system mounted by MOUNT command, so the command entered from console or automatically issued from batchjob etc., you need to check from SMF92 type 1 record.
- https://www.ibm.com/docs/en/zos/2.5.0?topic=records-smf-record-type-92

References:
- https://www.ibm.com/docs/en/zos/2.5.0?topic=command-displaying-status-zos-unix-system-services-omvs
- https://www.ibm.com/docs/en/zos/2.5.0?topic=systems-determining-file-system-owner
Linux DNS、digコマンドについて（自分用メモ

●DNS
ドメイン名/ホスト名などの名前とIPアドレスを対応させるシステム。
DNSサーバが名前とIPアドレスの対応情報（リソースレコード）を管理し、DNSクライアントからの問い合わせに対して名前解決のための情報を提供


●digコマンド
DNSサーバへ直接問い合わせて、指定した名前に関するDNSサーバからの応答を表示。また、表示する情報のタイプ（リソースタイプ）を指定する事もでき、詳細な情報を確認できるため、DNSに関するデバッギングツールとしても使用できる。

dig [オプション] [@DNSサーバ] 名前 [検索タイプ]

主な検索タイプ
・a IPアドレス（デフォルト）
・any 全ての情報
・mx メールサーバーの情報
・ns ネームサーバの情報
・soa ゾーン（ドメインの範囲）の情報
・txt テキスト情報

「@DNSサーバ」には問い合わせるDNSサーバを指定。省略した場合は、そのホストに設定されているDNSサーバに問い合わせ。

※-tオプションの後に検索タイプを指定しても情報を絞り込むことができる。



●DNSサーバに問い合わせて名前解決を行うコマンドは、「nslookup、dig、host」もある。（出力する情報が最も少ないのはhostコマンド）

host [オプション] ホスト名またはIPアドレス [DNSサーバアドレス]

オプション
・-t 問い合わせる情報の指定。digと同じく、mx、nsなどが指定できる。
・-v 詳細な出力
Stable DiffusionをWindowsかつCPUで実行してみる

## はじめに

ネットサーフィンをしてたらStable Diffusionという素晴らしいものを見つけたので、
GPUの環境でも使えたらいいなと思い調べてみました。

## 参考

zennというサイトのこちらの投稿を参考にさせて頂きました。

https://zenn.dev/karaage0703/articles/4901bf68536907

上記ではWSL2やdockerを用いて環境を構築しておりますが、
anacondaでもできるんじゃないと思ったので試行。

## gitからソースをダウンロード

https://github.com/bes-dev/stable_diffusion.openvino/tree/56b65312054d97b7b031ce8faba6310e7c120d00

こちらのページより右上の緑ボタンのCodeをクリック→Download ZIP。
Downloadしたzipを解凍して完了。

## anacondaで環境構築

新しい仮想環境を作成し、解凍したzipフォルダにcdして、コマンド実行

~~~:anaconda prompt
conda create -n py39 python=3.9  # 新規環境の作成
cd path/to/your/unpack_zip　　　 # 解凍したzipのディレクトリに移動
pip install -r requirements.txt  # 関連パッケージの取得
~~~

## 実行

acnadonda promptを**管理者権限**で実行。(管理者権限でないとエラーを吐いて終了しました)
gitのREADMEに従い、コマンドを実行

~~~:anaconda prompt(管理者権限)
cd path/to/your/unpack_zip # 解凍したzipのディレクトリに移動
python demo.py --prompt "shark in the deep sea"
~~~

数分たったら、解凍したzipファイルの中に"output.png"ができているので見てみると

![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269297/859cae76-24f3-2609-acc2-b65b39c1904d.png)

って感じの画像ができてました。

油絵チックで可愛くないし、全然深海じゃないけど、
パラメータは何もいじってないので伸びしろはあるはず。
ソースコードやREADME読んでまた何かあったら追記しようかなと思います。

余談
かっこいいリュウグウノツカイの画像が欲しくて
python demo.py --prompt "regalecus glensne"
と実行したら白い昆虫の画像が生成され発狂しかけました。

## 感想

とりあえず動かすことができてよかったです。
一方で、一枚の画像を生成するのに5分弱程度かかるので、
本当に雰囲気を確かめるぐらいの使用感かなと思いました。
image2imageも試してみたいです。以上

## 追記

HagginFaceとGoogleColabを使ってgpu環境で実行できるようです。

https://note.com/npaka/n/ndd549d2ce556

cpu使ってローカルでやるぐらいならこっちの方がよさそう。
Microsoft365のOutlookでメールヘッダーを確認する方法

# やり方

メールを開く。（別ウィンドウで開く）

左上。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/76fd3539-78b5-aa98-a8fa-dce34b047f76.png)

情報⇒プロパティ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5d08e082-4682-82b5-3d2d-7146485d1404.png)

インターネットヘッダーの部分で見れる。
（メールヘッダーの文字列のコピペも可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/af81af9f-82ac-2c92-e201-21b3ef2d227b.png)

# 参考サイトさん

https://support.microsoft.com/ja-jp/office/outlook-%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-cd039382-dc6e-4264-ac74-c048563d212c

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Outlook for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
rubyの「gem graphql-client」を使用しているときにfragmentの定義でハマった

## 内容

github: https://github.com/github/graphql-client

以下のように定義したら、

```ruby
HumanFragment = SWAPI::Client.parse <<-'GRAPHQL'
  fragment on Human {
    name
    homePlanet
  }
GRAPHQL
```

こんな感じで使えるgithubには書いてあるのに使えない。

```ruby
HeroNameQuery = SWAPI::Client.parse <<-'GRAPHQL'
  {
    luke: human(id: "1000") {
      ...HumanFragment
    }
    leia: human(id: "1003") {
      ...HumanFragment
    }
  }
GRAPHQL
```

そんな時の対処法。


```shell
... uninitialized constant HumanFragment (GraphQL::Client::ValidationError)
	from /home/vagrant/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/graphql-client-0.18.0/lib/graphql/client.rb:147:in `gsub'
	from /home/vagrant/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/graphql-client-0.18.0/lib/graphql/client.rb:147:in `parse'
    ...
```

（こんなエラーが出る）

## 結論

対処法は以下の2つ。

- fragmentをトップレベルの定数として定義する
- その定数が定義されているfragmentのNameSpaceをしっかりと書いてあげる

### 具体的には

自分の場合はgemを作っていたので、以下のような構成でプログラムを考えてました

```ruby
module Hoge
  class FugaClient
    ...

    DogFragment = GraphQL::Client.parse(<<~GRAPHQL)
      fragment on Dog {
        id
        name
        type
      }
    GRAPHQL

    GetDogQuery = GraphQL::Client.parse(<<~GRAPHQL)
      query {
        getAnimal(type: "dog") {
          dog {
            ...DogFragment
          }
        }
      }
    GRAPHQL
  end
end
```

でもこれだとエラーになってしまいます。前述の対処法の、どちらにも当てはまっていません。

> - fragmentをトップレベルの定数として定義する
> - その定数が定義されているfragmentのNameSpaceをしっかりと書いてあげる

具体的に修正すると、前者の方法であれば`fragmentの定義方法を若干変えてあげる`ことになる。

```ruby
module Hoge
  class FugaClient
    ...

    # ここを修正
    ::DogFragment = GraphQL::Client.parse(<<~GRAPHQL)
      fragment on Dog {
        id
        name
        type
      }
    GRAPHQL

    GetDogQuery = GraphQL::Client.parse(<<~GRAPHQL)
      query {
        getAnimal(type: "dog") {
          dog {
            ...DogFragment
          }
        }
      }
    GRAPHQL
  end
end
```

後者の方法では、`query内で参照しているfragmentを変えてあげない`といけない。

```ruby
module Hoge
  class FugaClient
    ...

   DogFragment = GraphQL::Client.parse(<<~GRAPHQL)
      fragment on Dog {
        id
        name
        type
      }
    GRAPHQL

    GetDogQuery = GraphQL::Client.parse(<<~GRAPHQL)
      query {
        getAnimal(type: "dog") {
          dog {
            # ここを修正
            ...Hoge::FugaClient::DogFragment
          }
        }
      }
    GRAPHQL
  end
end
```

凡ミスでしたね。

後からREADMEを見返してみると、以下の部分に書いてあることがこの内容を解決するものでした。

最初は意味が理解できなかったんですが、こういうことだったんですね。

https://github.com/github/graphql-client#:~:text=This%20works%20for%20namespaced%20constants.
Django　AuthenticationForm（ログインフォームクラス）

# [AuthenticationFormクラス](https://github.com/loggly/django/blob/master/django/contrib/auth/forms.py#L61)
- Djangoは、ログイン用のフォームを実装するためのフォームクラス（AuthenticationForm）をデフォルトで提供している
    - forms.pyで、AuthenticationFormクラスを継承したフォームクラスを定義し、ビュークラスのform_classに指定することで簡単にログインフォームをブラウザに表示することができる
    - AuthenticationFormクラスで定義されているusername, passwordフィールドに対してwidgetを適用している
    - Formクラスの親クラス（[BaseForm](https://github.com/loggly/django/blob/master/django/forms/forms.py#L67)）のself.fields

※widget：form-controlクラスやプレースホルダーといったフォームの見た目を整えるためのもの
※１：全てのフォームの部品のclass属性に「form-control」を指定（bootstrapのフォームデザインを利用するため）
※２：全てのフォームの部品にpaceholderを定義して、入力フォームにフォーム名が表示されるように指定。
```python:forms.py
from django.contrib.auth.forms import AuthenticationForm 

class LoginForm(AuthenticationForm):
    """ログインフォーム"""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs['class'] = 'form-control'
            field.widget.attrs['placeholder'] = field.label   

```
- AuthenticationFormは、Django標準のFormクラスを継承している
    - username, passwordフィールドを定義している

```python
class AuthenticationForm(forms.Form):
    """
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    """
    username = forms.CharField(label=_("Username"), max_length=30)
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)

    def __init__(self, request=None, *args, **kwargs):
        """
        If request is passed in, the form will validate that cookies are
        enabled. Note that the request (a HttpRequest object) must have set a
        cookie with the key TEST_COOKIE_NAME and value TEST_COOKIE_VALUE before
        running this validation.
        """
        self.request = request
        self.user_cache = None
        super(AuthenticationForm, self).__init__(*args, **kwargs)

    ～～省略～～
```
Deta.shの無料枠が廃止になったらCyclic.shへ移行する

# HerokuのFree Planが終了するらしい(泣)(泣)
https://blog.heroku.com/next-chapter
> Starting November 28, 2022, we plan to stop offering free product plans and plan to start shutting down free dynos and data services. We will be sending out a series of email communications to affected users.

2022/11/28までに有料版にアップグレードしてねとのことらしい。

# Cyclic.sh
⇒ [Deta.sh](https://www.deta.sh/) ⇒ [Cyclic.sh](https://www.cyclic.sh/)へ移行した

https://www.cyclic.sh/

[Cyclic.sh](https://www.cyclic.sh/)は無料で使えるクラウドプラットフォーム。
クレジットカード・電話番号不要。
デプロイしたアプリはAWS上に展開されるようだ。
主に3つのサービスが無料で使える。

1. クラウドランタイム
2. NoSQLデータベース (DynamoDB)
3. クラウドストレージ(S3)

- 無料プラン
- Herokuと違いスリープする制限はない
- GitHubのコードを変更すると即時デプロイされる
- RuntimeにはNodeが使用できる。Pythonも使えるようになるかも

![Screenshot from 2022-09-01 23-17-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/38a82a1a-85df-d533-dc98-d8855825d19a.png)


|  | [Deta.sh](https://www.deta.sh/) | [Cyclic.sh](https://www.cyclic.sh/) |
|:-:|:-:|:-:|
| 日本のリージョン | ☓ | ○ |
| タイムアウト | 10秒 | 30秒 |
| メモリ | 0.5GB | 1.0GB |
| HTTPペイロード | 5.5MB | 6.0MB |
| Node.jsバージョン | 14 | 16 |
| Cron | ○ | ○ |
| Auth | ○ | ○ |
| グラフィカル監視 | ☓ | ○ |
| S3に直接アクセス | ☓(API経由) | ○(Signed URL) |
| サブドメイン/カスタムドメイン | ○ | ○ |
| クライアントIP | ☓ | ○<br>`req.headers['x-forwarded-for']` |
| サポート | ○<br>ギットハブディスカッション | ◎<br>ディスコード |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/171f0951-ac24-4bf6-172f-9a59e3b16ec9.png)
![Screenshot from 2022-09-01 23-17-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/ecd820c1-f107-22a6-eaa7-6b683050547c.png)

https://www.cyclic.sh/vs-heroku

ファイルだけは10GBのDeta.shに置くといったハイブリッドクラウドも可能。
https://docs.deta.sh/docs/drive/http

## 環境変数の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/d8c572bd-c4f2-5722-d036-52cd371ffb9a.png)


## ログの取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/28dee8ad-120b-6ce3-09d6-65fb14de9b5c.png)

## ドメイン
Cyclic.shのダッシュボードから、任意のサブドメインの設定や、自分のドメインを設定できる。
https://a.cyclic.app/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/87edc2bd-def9-357c-0ce6-62836b0e897b.png)


今なら+1アプリ無料枠サービスしてます。下記をクリックします。

https://app.cyclic.sh/#/join/GitHub30
[Docker / Ubuntu20.04 / caffe] protobuf2.6.1をインストール

# 概要

caffeの実行に必要なprotobufのバージョンの問題で、caffeが実行できなかった。

かつてcaffeの実行のために有効だったprotobufのインストール方法を踏襲すると、現在の最新のprotobufがインストールされてしまうが、これは新しすぎてcaffeから使うことができない。

そこで、**古いprotobufをインストールしよう**というのがこの記事。


# 問題

## 当初のソースコード

```Dockerfile:Dockerfile
FROM ubuntu:20.04

RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y tzdata

RUN apt-get install -y --no-install-recommends \
    # caffe用のライブラリ: この方法だと 3.6.1 がインストールされてしまう
    libprotobuf-dev \
    protobuf-compiler \
    #  ...その他色々

# 以下略...
# 色々インストールしてるけど、今回は関係ないので省略
# この後でcaffeのbuildを行っている
```

上記のようなDockerfileだと、もしcaffeのbuildが成功したとしても、実行時（pythonからcaffeを呼び出した際）にエラーが発生する。


## Error

```bash
caffe_pb2.py TypeError: __init__() got an unexpected keyword argument 'syntax
```

# 対策

`libprotoc`のインストール方法を以下のように改める。

```Dockerfile:Dockerfile
FROM ubuntu:20.04

RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y tzdata

RUN apt-get install -y --no-install-recommends \
    # caffe用のライブラリ: この方法だと 3.6.1 がインストールされてしまう
    # が、 2.6.1 が欲しいのでコメントアウト
    # libprotobuf-dev \
    # protobuf-compiler \
    # ...その他色々

# HACK: "protobuf-2.6.1" is necessary for avoiding an error on initializing caffe.
#     You will get that error if you use "protobuf-3.6.1".
#     https://blog.csdn.net/e01528/article/details/81282343
RUN curl -sL https://github.com/protocolbuffers/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz -o protobuf-2.6.1.tar.gz \
    && tar -zxvf protobuf-2.6.1.tar.gz \
    && cd protobuf-2.6.1 \
    && ./configure \
    && make -j8 \
    && make check -j8 \
    && make install -j8 \
    && ldconfig
```

これで 2.6.1 をインストールできる。

```bash
$ protoc --version
libprotoc 2.6.1
```

`libprotoc`のバージョンを`2.6.1`にしたところ、`caffe_pb2.py TypeError: __init__() got an unexpected keyword argument 'syntax`は発生しなくなった。


# 参考にした記事

- 2.6.1のインストール方法が書かれている記事（中国語）

https://blog.csdn.net/e01528/article/details/81282343

- `ldconfig`が必要だということはこの記事でわかった

https://stackoverflow.com/questions/25518701/protobuf-cannot-find-shared-libraries
Databricks SQLのクエリースニペット

[Query snippets \| Databricks on AWS](https://docs.databricks.com/sql/user/queries/query-snippets.html) [2022/6/1時点]の翻訳です。

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

最初から何かを作るよりも、以前の作業内容を複製し、編集する方が簡単です。これは特に一般的な`JOIN`文や複雑な`CASE`文では顕著となります。クエリーのリストが増加すると、どのクエリーが必要な文を含んでいるのかを思い出すことが難しくなります。

クエリースニペットは、オートコンプリートを用いて共有、軌道できるクエリーのセグメントです。
![](https://docs.databricks.com/_images/snippet2.png)

こちらがシンプルなスニペットの例となります。

```sql:SQL
JOIN organizations org ON org.id = ${1:table}.org_id
```

# クエリースニペットの作成

1. サイドバーの下部にある![](https://docs.databricks.com/_images/user-settings-icon.png)**Settings**をクリックし、**User Settings**を選択します。
1. **Query Snippets**タブをクリックします。
1. **Create Query Snippet**をクリックします。
1. **Trigger**フィールドで、スニペットのトリガーを入力します。
1. オプションで説明文を入力します。
1. **Snippet**フィールドにスニペットを入力します。
1. **Create**をクリックします。

# 挿入ポイント

`${1:table}`はプレースホルダーテキストを伴う挿入ポイントです。Databricks SQLがスニペットをレンダリングする際、ドルマーク`$`とカーリーブレース`{}`は削除され、単語`table`がリプレースメントとしてハイライトされます。

:::note info
**注意**
実行時にデフォルト値を上書きする際にプレースホルダーテキストを使うことができます。
:::

ドルマークとカーリーブレース`${}`を用いて、整数値のタブ順序をラッピングすることで挿入ポイントを割り当てることができます。先頭にコロンがついているテキストプレースホルダーはオプションですが、スニペットに馴染みのないユーザーにとっては有用です。

Databricks SQLはスニペットをレンダリングする際、

```sql:SQL
AND (invoices.complete IS NULL OR invoices.complete <> '${2}')
AND (invoices.canceled IS NULL OR invoices.canceled <> '${1}')
AND (invoices.modified IS NULL OR invoices.modified_date <> '${0: this_date}')
```

テキスト挿入キャラットはクオートマーク`''`の間の2行目にジャンプします。**Tab**を押すと、キャラットは最初の行にジャンプします。再度**Tab**を押すと、キャラットは3行目にジャンプし、希望する値を入力するために、`this_date`がハイライトされます。

:::note info
**注意**
ゼロの挿入ポイント`${0}`は常にタブの順番の*最後*に来ます。
:::

# クエリースニペットの挿入

[オートコンプリートを有効](https://docs.databricks.com/sql/user/queries/queries.html#auto-complete)にしていると、クエリースニペットエディタで定義したトリガーの単語をタイプすることでSQLエディターからスニペットを呼び出すことができます。オートコンプリートはデータベースの他のキーワードと同じようにスニペットを提案します。

:::note info
**注意**
オートコンプリートが無効になっていても、**Ctrl + Space**を押して、クエリースニペットをトリガーする単語を入力することでクエリースニペットを呼び出すことができます。これは、お使いのスキーマ(データベース)で5000トークンを超えた場合にも必要になります。
:::

以下にスニペットのアイデアを示します。

- 頻繁に使う`JOIN`文
- `WITH`や`CASE`のような複雑な句
- [条件付きフォーマット](https://discuss.redash.io/t/conditional-formatting-general-text-formatting/1706/1)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
知っておくと楽になるIBM RPA小技01:レイアウトリセット

IBM RPAを使用して業務の自動化をいろいろと試している際に、これは知っておくとよいなと思った小技もこちらに投稿していこうと思います。

# 開発環境のレイアウトが変わってしまって使いにくくなった…

そんなときに手動で一から直そうとしたのですが、意外と時間もかかるしこういう何のためにもならない手間をできるだけかけたくない。そのときに教えてもらったのがレイアウトリセットです。


IBM RPAの開発画面は下記のようになっており、「ホーム」「表示」「ツール」「ヘルプ」というタブがあり、
その中の「ヘルプ」タブを選択すると下記のように「レイアウトのリセット」が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709056/892b4e0c-38d2-827f-d67a-f8b155a93369.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709056/8bb93a3b-e025-90cd-fc7d-386757d83ba1.png)

ここをクリックするとリセットしてもよいかを問われるので、はいを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709056/5476bdbe-250a-9c5f-f2e9-286b0c8be13a.png)


これで色々と操作してレイアウトが意図せず変わってしまったときにワンクリックで元に戻せます。

# 終わりに
あまりの小技すぎる小技でしたが、いかがでしたでしょうか？
IBM RPAでの業務の自動化方法もこちらで投稿予定ですが、合間合間にこのような小技も投稿させていただこうと思います。
[caffe / OpenCV4.x] error: 'CV_LOAD_IMAGE_***' was not declared in this scope への対応

# 概要

`OpenCV` version3系から4系へアップデートして`caffe`を動かそうとしたら、タイトルに記載のエラーが発生したが、なんとか対処できたので、その方法を記載する。

# Dependencies

|      |version|
|:----:|:------|
|Ubuntu|20.04|
|Python|3.8|
|caffe |1.0|
|OpenCV|4.5.5|

# 発生したエラー

たとえばこんな感じのエラーが発生した。

```bash
.../caffe/util/io.cpp:77:5: error: 'CV_LOAD_IMAGE_GRAYSCALE' was not declared in this scope
   77 |     CV_LOAD_IMAGE_GRAYSCALE);
      |     ^~~~~~~~~~~~~~~~~~~~~~~
.../caffe/util/io.cpp: In function 'cv::Mat caffe::DecodeDatumToCVMat(const caffe::Datum&, bool)':
.../caffe/util/io.cpp:183:5: error: 'CV_LOAD_IMAGE_GRAYSCALE' was not declared in this scope
  183 |     CV_LOAD_IMAGE_GRAYSCALE);
      |     ^~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [src/caffe/CMakeFiles/caffe.dir/build.make:1350: src/caffe/CMakeFiles/caffe.dir/util/io.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [CMakeFiles/Makefile2:382: src/caffe/CMakeFiles/caffe.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
```

重要なポイントは以下のポイント。

```bash
error: 'CV_LOAD_IMAGE_GRAYSCALE' was not declared in this scope
error: ‘CV_LOAD_IMAGE_COLOR’ was not declared in this scope
         cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR);
```

caffeのcmakeやmake実行時にこのようなエラーが出ている場合、以下の対処法で解決する。

# 対処法

- CV_LOAD_IMAGE_COLOR
`cpp`ソースコード上の`CV_LOAD_IMAGE_COLOR`と書かれている箇所全てを`cv::IMREAD_COLOR`に置換。
- CV_LOAD_IMAGE_GRAYSCALE
`cpp`ソースコード上の`CV_LOAD_IMAGE_GRAYSCALE`と書かれている箇所全てを`cv::IMREAD_GRAYSCALE`に置換。

# 参考にした記事

以下のissueコメントに同内容が記載されている。

https://github.com/BVLC/caffe/issues/6680#issuecomment-622989343

なかなか発見に時間がかかったので、この内容を日本語で記載したのが本記事。

# 原因について（の推測）

おそらく、`CV_LOAD_IMAGE_GRAYSCALE`や`CV_LOAD_IMAGE_COLOR`は古い書き方で、OpenCVのアップデートの中で、途中から`cv::IMREAD_COLOR`や`cv::IMREAD_GRAYSCALE`に書き換えられたのだろう。
ldapsearch 使い方メモ（サーバはActive Directory)

ldapsearch で Active Directory を検索します。

使い方を忘れていつもググっているので、メモしておきます。

# 環境

* OpenLDAP 2.5.12

以下の使い方に出てくる固有名は、このような環境を前提にしています。

<dl>
<dt> ADドメイン名
<dd> dc.example.com
<dt> ドメインコントローラホスト名
<dd> 192.168.1.2
<dt> バインドDN（接続ユーザ）
<dd> CN=Administrator,CN=Users,DC=dc,DC=example,DC=com
</dl>

# RootDSEを取得

```bash
ldapsearch -x \
-D 'CN=Administrator,CN=Users,DC=dc,DC=example,DC=com' \
-w 'パスワード' \
-H ldap://192.168.1.2/ \
-s base
```

## オプション説明

<dl>
<dt> -x
<dd> SASLの代わりに、シンプル認証を使う
<dt> -D
<dd> 接続するユーザのDN
<dt> -w
<dd> 接続するユーザのパスワード
<dt> -H
<dd> LDAPサーバのURL
<dt> -s
<dd> 検索範囲 base|one|sub|children のいずれか
</dl>

# 全部一覧

```bash
ldapsearch -x \
-D 'CN=Administrator,CN=Users,DC=dc,DC=example,DC=com' \
-w 'パスワード' \
-H ldap://192.168.1.2/ \
-b 'DC=dc,DC=example,DC=com'
```

## オプション説明

<dl>
<dt> -b
<dd> 取得対象の基礎となるDN
</dl>

# フィルタいろいろ

ldapsearchの引数に追加します。

## ユーザのみ

```
(&(objectClass=user)(objectCategory=person))
```

## グループのみ

```
(objectClass=group)
```

## コンピュータのみ

```
(objectClass=computer)
```
Helix 22.08アップデート情報

👉 より詳細は[CHANGELOG.md](https://github.com/helix-editor/helix/blob/master/CHANGELOG.md#2208-2022-08-30)を参照すること

👉 [helixのwebsite](https://helix-editor.com/news/release-22-08-highlights/)のフィーチャのみ

## はじめに

本来は7月に出るようだったが，いろいろとありすぎて8月に延期になった

ところが，PRのマイルストーンがたまらないどころか増える

PRが溜まって割とレビューが大変そう

正直8月中には無理なんじゃないかと冷や冷やしながらプロジェクトを眺めていた

が，無事に滑り込みで8月31日にバージョン22.08が登場した

これを待てずに[紹介第二弾](https://qiita.com/GreasySlug/items/11b7548848119adb6967)として先に出してしまったので内容が半分かぶっている

ただ、紹介しきれていないギリギリ出マージされたいくつかの機能やテーマの修正などがあるので再度大雑把に紹介する

## フィーチャされている機能

- Indent guides
    - 言語設定したインデントごとにガイドを表示できる
    - スペースを表示するよりも情報量が少なくインデントで判断できるので個人的には非常に良いなあと思っている機能
- Cursor line
    - テーマが設定してあればカーソルのあるラインをハイライトできる
    - 私が作ったtransparent themeはこれをつけると透明な背景にカーソル背景の灰色で一気に文字が見にくくなり入れるのを断念した
- Mode colors
    - これもテーマで設定されていれば各モードごとに色がlightlineみたいに表示される
    - すっきりとした見た目で個人的には気に入っている
- Configurable statusline
    - 今まで固定化されていたファイル名などの位置を個人で設定できるようになった
    - 情報が自分が設定した位置に簡単に配置できるのは良い
    - nvim/vimだと割と設定が難しいがこれはtomlファイルで簡単に設定できる
    - 逆に言えばスクリプトが必要な処理はまだ表示させることができない
- LSP signature help
    - LSPを使って補完をすると、その補完のヘルプ(引数の情報)が追従して表示されるようになった
    - Rustみたいな静的な言語で、関数を使うときに型情報が表示されるのでミスが減る割と便利な機能
- LSP document highlight
    - カーソルの下にある文字をLSPを使ってハイライト表示できるようになった
    - vimみたいに*で検索するのができるようになった
    - helixでの*は選択箇所(デフォルトで一文字)のハイライトなのでコンボで単語を検索しやすくなった
- LSP diagnostics picker
    - エラーの箇所をファイルピッカーを使って横断的にあいまい検索できる
    - エラーを横断的に検索できるので、大きな変更を加えたときにこれを使ってエラーの範囲を見たりできるので便利
- Jumplist picker
    - ファイルピッカーで保存したジャンプリストをあいまい検索して移動できる
    - 前までは消したバッファに移動しようとしてhelixが強制終了するバグがあったのjumplist自体を使うのを控えていた
    - まだ試しきれていないが、[”:write”, “:format”,”:save_jumplist”]みたいに組み合わせて、保存した場所ごとにジャンプできるのは便利かもしれない
- External formatter
    - LSP以外のフォーマッタを設定できる地味に便利な機能
    - そもそもまだフォーマッターがない言語や別のを使いたいときには言語設定でオフにする必要があったりと面倒くさかった
    - これがあればプロジェクトのフォルダに.helix/languages.tomlを作ってLSPの設定を上書きできるので利便性が向上した
- Bracketed paste
    - ペーストが綺麗にできるようになった
    - helixではOSのペーストを利用していた
    - これにより余計なインデントがhelix側で処理されてフォーマットが崩れる問題があった
    - また、ペーストする量が多い時にペーストというより、めちゃくちゃ早い入力みたいなぬるぬるした動作になっていた
    - これら問題が解消されたらしい

正直これ以上は細かい利便性の向上やバグの修正になるので割愛するので上記のCHANGELOG.mdを参照

## 終わりに

helix紹介第二弾でも説明したが、正直あともう少しだけ利便性が向上したらもうnvim/helixのライトユーザーはこっちに移行しても良いと思う

- 選択からのモーションという動作(nvim/vimと反対)
- 改行を一文字に含める(かなり厄介)
- 折り返しがない(個人的には問題ない)

これらエディタによって定められた制限を許せるならhelixはおすすめできるエディタになる

また，このエディタはあくまでもこれらは製作者さんの個人的な好みによってつくられており，既存のエディタ(vscode/nvim/vimなど)の代替を目標にしているのではないそう

私もこれら動きや制限を許せて，扱いやすさがnvim/vimに似ているのでお勧めしている

個人的に欲しいユーティリティの向上は以下の通り

- omni補完などの単語レベルの補完(一応PRは2個ほどある)
- エラーの文字を表示する位置がエラーの箇所と離れているので、エラーの箇所に欲しい(Matrix内で一応表示ができる改良があったりしたが、IssueはあるがPRはないと思う)
- gitのdiffをガターに表示してほしい(PRはある)
- 欲を言うとインラインメッセージとかで型情報が表示されるようになれば良い(PRはある)

これがあれば後はもう慣れるだけな感じになっている

プラグインはまだみたい

優れたプラグインはhelix本体に取り込むみたいな提案や、wasmではなくこの言語を使おう見たいな提案などいろいろとまだ混沌としている
ミニツク演習3から学んだこと

## 演習内容
ミニツクの「Ruby演習コース」演習3
URL: http://www.minituku.net/courses/500228005/contents/820836204.html

## 解答と実行例
上記サイトより引用。モジュールの解答と問題文で提示されたclassなどは同じファイルにまとめる想定です。
```
##### 本問題では以下モジュールの中身を考える。 #####
module Mail
  attr_reader :sender, :recipient, :text, :date   ### 要点１ ###
 
  def send
    puts "#{@date = Time.now}: Sending a #{self.class} to #{self.recipient}."   ### 要点２、４ ###
  end
 
  def write(text)
    @text = text
  end
 
  def to_s   ### 要点３ ###
    "#{self.class} of #{@date}:\n\nDear #{@recipient},\n\n#{@text}\n\nSincerely,\n#{@sender}"   ### 要点２ ###
  end
end

##### 以下、問題文で提示されている。 #####
class Postcard
  include Mail
  
  def initialize(sender, recipient)
    @sender, @recipient = sender, recipient
  end
end
 
card = Postcard.new("Me", "Friend")
card.write("Did you forget my birthsday?")
card.send
puts "-" * 60
sleep(2)
puts card
```

出力例
```
Tue Mar 22 11:59:16 +0900 2011: Sending a Postcard to Friend.
------------------------------------------------------------
Postcard of Tue Mar 22 11:59:16 +0900 2011:

Dear Friend,

Did you forget my birthsday?

Sincerely,
Me
```

## 学んだことなど
**解釈間違っていたらお教えください**
### 要点１「attr_readerは不要？」
要点１の行を消しても動きました。
そもそもattr_readerとはインスタンス変数のゲッターを実現するものです。
参考：https://pikawaka.com/ruby/attr_reader

ただ演習３のコードでは、外部からインスタンス変数を呼び出したりしていないので、特になくても良いのかなと感じました。

### 要点２「ダックタイピング」
要点２はダックタイピングを使ってるようです。
モジュールの中にself.classやself.recipientなどはありませんが、「呼び出し元のPostcardクラスにはきっとあるだろう（言ってしまえば、self.classやself.recipientをもつクラスなら何でもよい）」と期待する書き方をしています。

ダックタイピングについては以下が非常に分かりやすかったです。
https://qiita.com/shimgo/items/9d9fbab1e3a7c4343f7b

### 要点３「Object#to_s」
各オブジェクトにはto_sメソッドがデフォルトで定義されており、それを再定義しているそう。
オブジェクトを文字列変換しています。**puts card.to_s**じゃなく**puts card**で文字列を表示できるので少し違和感を感じます。

参考：https://qiita.com/tbpgr/items/19b42765a7b9cb292f44

### 要点４「puts内の式の展開」
・puts "#{<span>@</span>date = Time.now}～　とあるのですが、そういう書き方もあるんだな～といった感じでした。putsの上で <span>@</span>date = Time.now　を書くとかさばるからまとめているんでしょうか。
ERROR: for app  Cannot start service app: error while creating mount source path


Docker Desktopをアップデートするだけでした。
    

```
ERROR: for app  Cannot start service app: error while creating mount source path

such file or directory
ERROR: Encountered errors while bringing up the project

```



参考

https://qiita.com/sho-hata/items/579ab597e4015b9f19fe#docker-desktop-for-mac%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88

関係なかった。
PHPで保守しやすいコードを書くサンプル①　「変数に名前つける」

# 背景
今年の上半期から、界隈で話題に登っているミノ駆動様の「良いコード／悪いコード」を拝読しました。
類にもれず、こういうのをもっと実践して取り組んで行けば、長期的な開発速度はもっと上がっていくに違いない！と意気込んでおります。

https://www.amazon.co.jp/dp/B09Y1MWK9N

# 概要

* そんな背景のもと、該当書籍は主にjavaによる開発事例の記載となっているため、自分の主戦場がPHPであることもあり、「じゃあちょっと自分でPHPだったらどうなるかは手を動かしてみるか」となった次第です。
* とりあえず頭から手を動かすこと、を主眼においているため恐ろしく簡単だったり、効率がイマイチだったりするところもありますがそこはご容赦頂きたい次第です。（回を重ねていくつもりではあるので、徐々にそこは解消されていければと考えています）

# では本題

* 今回はいちばん簡単な「変数に名前を付ける」ていうやつ
* 改めてやる意味があるのかというところですが、律儀にやっていきます

## NG

```
$val1 = 10000;
$val2 = 100;
$val3 = 0.1;

$val = $val1 - ($val2 * (1 + $val3));
```

まあ当然ですけど、これがなんの処理かはこれ見ただけではわかりませんね実際…。

## OK

```
$amountMoney = 10000;
$price = 100;
$taxPercent = 0.1;

$remainingMoney = $amountMoney - ($price * (1 + $taxPercent));
```

これはわかる。何となく分かる。所持金から、商品購入した後の残金を計算している。

# まとめ（感想）

* どちらかというと今回は当たり前すぎるので意気込み回でした、次につなげます。
Python,Ruby,PHP,Java,JavaScript,Perlのファイル入出力の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlのファイル入出力の比較

# Python

https://qiita.com/onishi_820/items/f3068d5533a1f4f5ae39

# Ruby

https://qiita.com/Morio/items/8f0dc0801cfcb98d8269

# PHP

https://qiita.com/Morio/items/1deca77b370851ed914f

# Java

https://qiita.com/DeraTosev/items/77cd689da4426b892793

# JavaScript

https://qiita.com/shirokuman/items/509b159bf4b8dd1c41ef

# Perl

https://perlzemi.com/blog/20110212130370.html
取引先マスタで組織名を名寄せする(SPSS Modeler データ加工逆引き6-8)

# 取引先マスタで組織名を名寄せする(表記揺れ)

![スクリーンショット 2022-08-10 15.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aad80267-324f-523c-9f27-59c61062a02b.png)

この記事は以下のブログの「辞書（社名マスタ）を使う」と同じストリーム・データを利用しています。

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-03/

## 1.想定される利用目的

・顧客マスタや取引先マスタデータのクレンジング
・対象データの精査

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/spelling_inconsistencies.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-10 15.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dcf9810d-2e31-d159-fceb-d4eb6db6855d.png)

a.入力するデータひとつ目は以下の通りです。法人名で表記揺れが起きています。
![スクリーンショット 2022-08-10 15.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/56362f86-fca9-d477-6399-040cd38acae4.png)

b.入力するマスタは以下の通りです。
![スクリーンショット 2022-08-10 15.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e194f3d0-0e88-ada6-9854-13bda656d6e5.png)

c.[レコード結合]ノードを編集します。[レコード結合方法]は[キー]を選択し[会社名1]で[部分外部結合]します。
![スクリーンショット 2022-08-10 15.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d36226b2-6388-45b4-8736-7c3a898b84c6.png)

[プレビュー]します。[会社名2]でソートされたので修正します。
![スクリーンショット 2022-08-10 15.22.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/faaec60b-3fb1-60d2-a6d6-ee1644eba068.png)

d.[ソート]ノードを編集します。
![スクリーンショット 2022-08-10 15.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2109e69d-c98c-2c76-a4d9-3d7f9c7ed8c7.png)

[プレビュー]します。
![スクリーンショット 2022-08-10 15.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4151338f-a42c-fda5-e55d-1191951ae059.png)


#### 注意事項

18レコード目がNullになりました。これまで確認して登録してきたマスタにはない表記ですので、既存の法人名に追加するか、新規法人名としてマスタに登録します。

## 4.参考情報

#### 名寄せとデータクレンジングを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-03/

#### レコード結合を解説した記事

https://qiita.com/416nishimaki/items/be61a82c12cd83558def

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
MEEPROMMERその後

EPROM対応して、とりあえず焼けたので、忘れるので書いておきます。

https://github.com/yamori813/MEEPROMMER

ライターはターゲットのチップや処理に合わせてジャンパーを手動で切り替えるようにしました。

![MEE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/02a80027-d6f4-6d83-e14d-8e885059d8e0.jpeg)


1 = VCC/VPP -> 書き込み切り替え
24 = A9/VPP -> Signeture確認
27 = WE/A14 -> 2764/27256切り替え

1ピンはオープンでも読めるチップもありますが、読めないチップもあるのでVCCにつなぐ必要があります。

VPPの21V,12Vはテスターをつないでボリュームを回して確認します。

2764はデータ化けがでるのですがTMS27C256は焼けました。

![Fbinhg6aMAAUKkj.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3e17b819-a2fd-f202-bac7-59248dbf11a9.jpeg)

遮光用にVHSテープのラベルのシールを貼ってみました。

とりあえずZ80のSBCのFlashをDIP品のUV-EPROMに変えられたので、2764の問題はまた気が向いたら調べます。

1ピンのVCC/VPP切り替えを自動化してA14とのジャンパーにすればEEPROMでも使えるようになります。ただEEPROMは高価なので入手が難しく、やんない気がします。

Flashに焼いていたのと同じものを焼いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/11de474e-a5d0-e99f-e5c5-751ab5ca4d23.png)

FreeBSD 13Rで試しました。PC側のスクリプトがpython 3になっているのでpython 2の雪豹やEl Capitanで動きません。これも課題です。

PLCC 32ピンの5VなFlashも同じArudinoでflashromで焼けるので、とても便利です。

イレーサーは安いやつを買ってみました。チップによって、消えにくいものもあるので、最初20分くらいあてて確認してすべてFFになってなければ追加で10分を繰り返します。