OmniAICreator/Qiita-1.07M huggingface dataset:
20. Valid Parentheses Easyの解説

問題文：
https://leetcode.com/problems/valid-parentheses/
正解者さん：
https://leetcode.com/problems/valid-parentheses/discuss/9203/Simple-Python-solution-with-stack

```python:正解の引用コード
class Solution:
    # @return a boolean
    def isValid(self, s):
        stack = []
        dict = {"]":"[", "}":"{", ")":"("}
        for char in s:
            if char in dict.values():
                stack.append(char)
            elif char in dict.keys():
                if stack == [] or dict[char] != stack.pop():
                    return False
            else:
                return False
        return stack == []
```
　　
　　
【ぷよぷよみたいに括弧同士を相殺するプログラム】
　　
　　
まず、
Input: s = "()"
Output: true
とする。
　　
　　
dict = {"]":"[", "}":"{", ")":"("}
⇒今後inputされる全ての括弧を先に辞書型で作成しておく。
　　
　　
for char in s:
⇒s = "()"をcharに入れていく間に下のコードを実行する。
　　
　　
if char in dict.values():
　　stack.append(char)
⇒もしも0回目のループ時に、dict内のvalue(右側の値)と同じものがcharに入っていた場合、
ループ外に用意しておいたstackリストの中に、char(s内の0番目："(")を入れる。
(0回目のループでは、charに入った要素が"("であったため、このif文が実行されて、stack = ["("]となる。)
　　
　　
elif char in dict.keys():
　　if stack == [] or dict[char] != stack.pop():
　　　　return False
⇒あるいは、もしもdict内のkey(左側の値)と同じものがcharに入っていた場合、
次のifを実行する。
もしも、stack内が空っぽだった場合、
または、dict内のcharと同じ記号が、stackリストの最後の要素を消した時の残った要素と違っていた場合、
Falseを返す。
※このif文が読み込まれた時点で、合っているかどうかに関わらず、stack.pop()が発動されて、stackリストの最後の要素が消される。
(0回目のループでは、すでにif char in dict.values():に当てはまっているため実行はされない。)
　　
　　
次の1回目のループでは、charに入る要素は")"である。
dict内のkeyと同じのため、elif char in dict.keys():が実行される。
　　
　　
elif char in dict.keys():
　　if stack == [] or dict[char] != stack.pop():
　　　　return False
⇒dict内のkey(左側の値)と同じものがcharに入っているため、
次のifを実行する。
もしも、stack内が空っぽだった場合、
または、dict内のcharと同じ記号が、stackリストの最後を消した時の要素と違っていた場合、
Falseを返す。
　　
しかし、1回目のループでも、このif文はどちらの条件とも当てはまらない。
したがって、このif文を読み込んだらstack.pop()が発動されて、
stackリストの最後の要素が消されたまま、最後のreturn stack == []が実行される。
　　
　　
return stack == []
⇒stackが[]と同じだった場合、Trueを返す。
つまり上のループ文で、ぷよぷよみたいに"("、")"が揃って相殺されていたら、stackリストが空っぽになるはず。
だから、もしstackが空っぽなら全部括弧が揃ってるからTrueだよ！というわけである。
Next.js: テーブルの表示

プロジェクトの作成

```bash
mkdir proj01
cd proj01
npm init -y
npm install --save react react-dom next
mkdir pages
```

package.json の改造

```json:package.json
{
  "name": "proj01",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
   "dev": "next",
    "build": "next build",
    "start": "next start"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "next": "^12.2.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  }
}
```

## コードの作成 ##

フォルダー構造

```text
$ tree pages/
pages/
├── Header.js
├── Layout.js
├── index.js
└── pets.js
```

```js:pages/index.js
import Layout from "./Layout"

export default function Index() {
  return (
    <Layout>
      <div>
        <h1>Hello everyone!</h1>
	<p>May/23/2022 PM 15:50</p>
      </div>
    </Layout>
  )
}
```

```js:pages/pets.js
import Layout from "./Layout";
import fetch from "isomorphic-unfetch";

export default function Pets(props) {
  return (
    <Layout>
      <div>
        <h1>Pets!</h1>
	<table>
	<thead>
	<tr>
	<th>id</th>
	<th>name</th>
	<th>category</th>
	</tr>
	</thead>
	<tbody>
          {props.pets.map(pet => (
        <tr id={pet.id}>
	<td>{pet.id}</td>
	<td>{pet.name}</td>
	<td>{pet.category}</td>
	</tr>
          ))}
	</tbody>
	</table>
<p>May/23/2022 PM 15:50</p>
      </div>
    </Layout>
  );
}

Pets.getInitialProps = async function() {
  const res = await fetch(
    `https://pet-library.moonhighway.com/api/pets`
  );
  const data = await res.json();
  return {
    pets: data
  };
};
```

```pages/Layout.js
import Header from "./Header"

export default function Layout(props) {
  return (
    <div>
<Header />
{props.children}
    </div>
  )
}
```

```js:pages/Header.js
import Link from "next/link"

export default function Header(){
	return (
	<div>
		<Link href="/">
		<a>Home</a>
		</Link>
		&nbsp;
		&nbsp;
		&nbsp;
		<Link href="/pets">
		<a>Pets</a>
		</Link>
	</div>
	)
}
```

サーバーの起動

```bash
npm run dev
```

ブラウザーで
http://localhost:3000
にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4d99d148-c583-b5be-c223-1ce0f453a91e.png)
【初心者必見！】VBAでファイルやフォルダを参照する方法

# はじめに
つい最近VBAを学習し始めた私が非常に使えるものだと思ったものを皆様にお伝えしたいと思います。
今回はフォルダやファイルを選択するコードです。
この記事が参考になれば皆様にも使用して頂きたいと思います。

# ファイル参照コード
下記がファイルを選択するVBAのコードになります。
非常に使い勝手が良いのでぜひ皆様も使用してみてください。
ちなみにこのコードはマクロファイルの「A2」に選択したファイルパスを書くという仕様になっています。
下にはフォルダ選択するVBAも書いていますので、そちらも参考にしてみてください。

```VB:GetFile
Public Sub Get_Path()
    '変数の宣言
        Dim sheetname As String
    
    'バックグラウンド処理
        Application.ScreenUpdating = False
        
    'ブック名取得
        bookname = ThisWorkbook.Name
        
    'シート名取得
    sheetname = Worksheets(1).Name
    
    'ファイル参照ダイアログの表示
        With Application.FileDialog(msoFileDialogFilePicker)  
            If .Show = True Then Workbooks(bookname).Worksheets(sheetname).Range("A2") = .SelectedItems(1)
        End With
        
    '処理を表示
        Application.ScreenUpdating = True
        
End Sub
```

# フォルダ参照コード
下記がフォルダを参照して、「A2」にフォルダパスを出力するVBAコードになります。

```VB:GetFolder
Public Sub Get_Path()
    '変数の宣言
        Dim sheetname As String
    
    'バックグラウンド処理
        Application.ScreenUpdating = False
        
    'ブック名取得
        bookname = ThisWorkbook.Name
        
    'シート名取得
    sheetname = Worksheets(1).Name
    
    'ファイル参照ダイアログの表示
        With Application.FileDialog(msoFileDialogFolderPicker)  
            If .Show = True Then Workbooks(bookname).Worksheets(sheetname).Range("A2") = .SelectedItems(1)
        End With
        
    '処理を表示
        Application.ScreenUpdating = True
        
End Sub
```

# 使用例
例えばこんな使い方も出来ます。

####コードを書いたマクロファイルにファイルを選択するボタンを作成する。

①Excel > 挿入 > 図形の順に進み、ボタンぽい図形を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/09e13a42-f474-6ece-404b-74eb91ac01f3.png)

②図形をクリック > 右クリック > マクロの登録 を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/f011edd8-37e2-b852-dce6-5857cc6ff253.png)

③このマクロ登録の画面が表示されたら、先ほど記述したマクロコードを選択し、OKを押します。
これでファイル選択するボタンが作成出来ました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/ab98f76c-8853-e66e-0329-6506e13525e1.png)

上記のように分かりやすくテキストを入れ込んでもいいかもしれませんね。

実際にボタンを押したりして試してみてください！

# 最後に
あくまで参考です！
私はまだまだ未熟ものですので、これ以外にも良いコードがあるかもしれませんが
是非使用するタイミングがあれば、使用してみてください。

最後までご覧頂きありがとうございました！！
FileMaker Data Migration Toolでのデータ移行が高速な訳（index情報の扱い方）

## FileMaker Data Migration Toolとは

FileMaker Data Migration Toolとは、Claris社から提供されている、FileMakerのデータ移行を行うためのツールです。
これはコマンドラインにて実行します。
公式情報はこちら
https://community.claris.com/ja/s/article/New-FileMaker-data-migration-tool

## FileMaker Data Migration Toolを用いない場合のデータ移行手順

FileMakerでデータ移行を手動で行うには以下のような手続きが必要になります。
* ファイルを開く
* 対象のテーブルを指定する
* インポート処理を行う
* シリアル番号のあるフィールドのオプションで「次の値」をセットする

1つのファイルに複数のテーブルがある場合はこれを繰り返します。
大量にテーブルがある場合は都度の選択が煩雑で、間違ったテーブルを指定しまうリスクもあります。
また、インポートの手法が複数ありますが、適切なものでないとセットすべき値がずれたり
シリアル番号が異なるものになるなどの危険性もあります。

FileMaker Data Migration Toolでは、これらの作業を自動的に行ってくれます。
安全確実です。

## FileMaker Data Migration Toolはデータ移行が速い

FileMaker Data Migration Toolは、前述のような都度の細かい作業を手作業で行わなくてよいので非常にスピーディかつ確実に作業ができます。
人間が個別対応するよりもはるかに速くデータ移行が可能です。
しかし、データ移行の速さの理由はそれだけではありません。

インポート処理にかかる時間が非常に速いです。
これを厳密に言うと、データのインポートというよりも、インデックス作りが速いということになります。

FileMakerのデータインポートの時間は、実際のデータインポートよりもインデックス情報を作成する作業の方が時間を要するケースがあります。インデックスを付けているフィールドが多く、かつレコード数が多い場合です。

FileMaker Data Migration Toolを使えばインデックス情報の生成（コピー）が非常に速いです

## FileMaker Data Migration Toolではインデックス情報をどのように扱っているか

これは公式な情報ではなく、個人の感想・予想としてお読み下さい。
通常のインポート作業では、データをインポートしてから、そのデータを元にインデックス情報を構築しています。FileMakerのファイルの最適化やファイルの修復をする作業がありますが、それのログファイルを確認すれば、何を行っているかがわかり、インデックス作成に多くの時間を割いていることがわかるでしょう。

FileMaker Data Migration Toolは、インデックス作成（構築）をするのではなく、ソースファイルにあるインデックスデータをコピーして移植しているものと思われます。1レコード、1フィールドずつインデックスを生成するよりも、はるかに速くインデックス情報を用意できることになります。

この仮説の裏付けとして、FileMaker Data Migration Toolには、オプションコマンドで
~~~
-rebuildindexes
~~~
というものがあります。
これは、全ての索引を再構築するコマンドです。　標準ではそれを付けません。
このオプションを付けてマイグレーションを行うと処理にかかる時間は大幅に増えるでしょう。

FileMaker Data Migration Toolのデータ移行の速さの肝はここ、つまり「インデックス情報を1から構築しない」にあると思います。
他の方法で、インデックス情報をコピーして移植する方法はありません（と思います）

## スピーディなデータ移行にはFileMaker Data Migration Toolが必須
使用した当初は、なぜここまでにデータ移行が速いのか全く分かりませんでした。
それこそ、魔法かマジックにかかったかのような気持ちでした。
データは正しく作られており、正常に動作します。そしてその作業は通常のインポート処理の
半分以下です。（これはファイルの構造やデータ数によって異なります。何百フィールド、20以上のテーブル、200万件以上のレコード数、20GBほどのファイルサイズを想定してください）

FileMakerのデータ移行には、FileMaker Data Migration Toolが必須でしょう。

https://community.claris.com/ja/s/article/New-FileMaker-data-migration-tool
SafariのSVGをアニメーションさせようと思ったらちょっと詰まった話

こんにちは。つんあーです。お久しぶりです。

SVGでちょっとしたアニメーションを書いたときに、Safariでだけ予想と違う挙動をして詰まったという話です。

まず下記のpenですが、Chromeだと動くもののSafariだと動きません。
（Mac、iOS共に動きませんでした。）

`transform: translateX(...)`で始点を変えた3つの点を、
共通の`@keyframe`でアニメーションさせています。

変化後（=`keyframe`が`100%`の地点）の状態は同じにしたいのですが、
始点がそれぞれの点ごとで違うので、`keyframe`には`100%`しか記入しませんでした。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="MWQvXEo" data-user="ats05" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ats05/pen/MWQvXEo">
  Untitled</a> by ats05 (<a href="https://codepen.io/ats05">@ats05</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### 結果

Chrome
![chrome.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151247/f65d910b-2300-82e2-94c5-2c7e426cf697.gif)

Safari
![safari.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151247/fc322d28-4f68-ef89-c68d-c874de3983dc.gif)


Safariの場合、微動だにしませんね。

## 修正

こちらはSafariでも動作します。

結論としては、**空でいいので0%のフレームを定義する**ことで修正できました。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="LYQjrMa" data-user="ats05" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ats05/pen/LYQjrMa">
  Untitled</a> by ats05 (<a href="https://codepen.io/ats05">@ats05</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


今回はアッサリしていますが、以上です。おしまい！
アコーディオンチェックボックスを作る

# 概要
タイトルの通り、アコーディオンとチェックボックスを合体させた、下のような感じのパーツを作る。
![アコーディオンチェックボックス.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641298/1f088c1c-69f4-ab36-4702-27ab98ee2ac7.gif)

# 環境
bootstrap 5.0.2

# コード
```html:html
<div>
    <div class="accordion accordion--custom" id="accordionCheckBox">
        <div class="accordion-item">
            <h2 class="accordion-header" id="accordionHeader_1">
                <input type="checkbox" class="form-check-input">
                <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#accordionCollapse_1" aria-expanded="true" aria-controls="accordionCollapse_1">
                    タイトル
                </button>
            </h2>
            <div id="accordionCollapse_1" class="accordion-collapse collapse" aria-labelledby="accordionHeader_1" data-bs-parent="#accordionCheckBox">
                <div class="accordion-body">
                    内容
                </div>
            </div>
        </div>
    </div>
</div>
```

```css:css
/* bootstrapのaccordionをカスタマイズする */
.accordion--custom .accordion-header {
    display: flex; /* make flex element */
    align-items: center; /* aligning child items */
    column-gap: 1rem; /* adding gap between items in row */
    padding-left: 1rem;
}

/* small udjustments */
.accordion--custom .accordion-header .accordion-button {
    padding-left: 0;
    background: none;
}

.accordion--custom .accordion-header .accordion-button:focus {
    box-shadow: none;
}

.accordion--custom .accordion-header .form-check-input {
    margin-top: 0;
}
```

# 参考にしたページ

https://stackoverflow.com/questions/71480478/bootstrap-5-accordion-with-an-inline-checkbox
iPadのSwift Playgroundsだけでswift初心者の高校教師がアプリの開発に挑戦してみる　＜その6＞

https://qiita.com/kerikerijy/items/c667645df4e4a0074f76

# 席替えアプリの開発

私が教員をしていた経験から、「席替えアプリ」の存在意義はくじ引きなどを作る手間の削減と時間の節約だと考えました。
ですので、名前の通り、アプリの機能は「席替え」のみに限定しようと考えています。

## 必要最低限の機能について

ですので、生徒の氏名や性別などを読み込んで、席替えをした後の座席表をきれいに印刷したりする機能など、席替えとは直接関係ない機能はいりません。
シンプルに生徒人数のみを入力してもらい、座席の配置を決めたらすぐに席替えの機能が実行できるようにしたいと思います。
生徒を識別するのは1から始まる通し番号で十分です。ほとんどの場合、クラスの生徒においては1から始まる生徒番号が付いているので。
設定項目はできる限り少なくしてシンプルなものにしたいと考えています。

ただし、「席替え」というのは生徒たちにとって学校生活の中の一大イベントであるので、結果の見せ方には工夫をしたいと思っていますが、これは要検討です。

### ユーザーインターフェース

Keynoteを用いて、上記の必要最低限の機能を持った席替えアプリのイメージデモ動画を作ってみました。

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

実際に生徒たちにアプリを開発してもらうときにも作ってもらおうかと考えていたので、自分でもどんなものかと作ってみました。

おそらく、実際の開発過程では、こういうもの(モックアップというのでしょうか？)は何かの開発ツールを使うものなのでしょうが、高校生はKeynoteを使うことでプレゼンテーション作成スキルの向上も同時に狙うことができると思います。

今回は簡単で短いですが、機能とUIの想定はこのぐらいにして実装していくことにします。

https://qiita.com/kerikerijy/items/0d61401adde209a5a709
初心者が使うならCodePen？JSFiddle？

私は現在[こちら](https://www.shoeisha.co.jp/book/detail/9784798158921)の学習教材でCDNを使ってVue.jsの学習しています。

普段はVSCodeを使ってますが、オンラインエディタにも慣れてみたいと思い[CodePen](https://codepen.io)、[JSFiddle](https://jsfiddle.net/)のアカウントを取得しました。が、どちらでテストするか決めかねてました。
>CodePenもJSFIddleもHTML/CSS/JSのコードを、ブラウザ上で編集しながら実行結果が確認できるオンラインエディターツールです。コードを保存して公開することもできます。

そこでどちらも登録してさっくり触った感想をここに残します。

---

# JSFiddleの良かったところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679274/9db9a126-d4b4-2ee7-424d-56eab8c88cc2.png)
直感的に触れるとはまさにそのことで、立ち上げてすぐ見えるところに書くべき場所がわかること、個人的に「JS」のプルダウンを触ったときに選択肢に知っている言語がズラッと出てきてくれると選びやすく、また選択後も表示されていると何のフレームワークで書いているのか理解しやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679274/28d82587-c304-d1a0-d237-b8ab334bfc9b.png)
左上のロゴを触ると各言語のテンプレートを見ることができます。初学者にとってまずこれを見てどんな記述なのかを観れるので参考になります。(最初の画像のようなTODOリストのサンプルが表示されます)(すごい)

Collaborateですぐにペアプロが出来るのも魅力的と感じました。

# CodePenの良かったところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679274/351d504d-4f64-cb53-5743-9acde913b33f.png)
アカウントを作成すると簡単なツアーが入りますが、おかげでCSS⇄SCSSにコンパイルしたり戻したりできると知りました（ほへー）。使い方を知らない人にとってはこういう案内を最初にしてくれるのはありがたいですね。絶対知らずに使ってたらスルーしてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679274/a5b728e4-0a4b-d393-a70c-eaeb15f1c964.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679274/b97feb03-302a-fd1d-bd3d-6d213c2eac6b.png)
スクリプトを追加する設定ではURLで入力もOK、予測に出てくれるのは初学者としてはありがたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679274/cce42a50-15e0-598d-2edf-8ea27afc1aea.png)
また、ログインするとTrending(Communityのようなもの？)があり、自分が気になったコーダーをフォローしたりコードをフォークすることができます。これはワクワクします！

### どちらにも言えること
オンラインエディタには直感的に触れる便利さや、自分や相手のコードをプレビュー越しに見たりシェアできる良さはありますが、例えばVue.jsはwebpackでビルドすることがCodePenではできなかったりするので、書き方を変えたり分割したりして打開策が必要なのだそうです。

# CodePenに少し軍杯が上がるものの、、
まずは試してみるという程度や参考を探してみるというのには良さそうなので、私は両方使ってみようと思います！
皆さんはどのオンラインエディタを利用していますか？ おすすめなどあればコメントなどいただければ幸いです！
JAVA 基礎１


Class
- オブジェクトを定義、オブジェクトの設計図または枠組

​Object(オブジェクト)
- 実際に存在するもの、ソフトウェアで実装される対象

​
Instance
- Classをもとにソフトウェア世界に実装された具体的な実体
- オブジェクト化を実体化するとインスタンスになる。
- オブジェクトがメモリに割り当てられ、実際に使用される際にインスタンスと呼ばれる。

オーバーローディング(Overloading)
- メソッドの名前は同じだが、媒介変数の個数やタイプが異なる

   public class Calculator{
	public void sum(int x,int y) {
		int sum= x+y;
		System.out.println(sum);
	}

	public void sum(float x, float y) {
		float sum = x+y;
		System.out.println(sum);
	}
}

最初のsum()にはインスタンス値をint(整数)のみ2つ入力
2番目のsum()にはインスタンス値をfloat(ミス)だけ
このような過程をオーバーロード
このようにメソッドの名前はsum()で同じだが、タイプが違う場合!

オーバーライディング(Overriding)
- 上位クラスのメソッドを下位クラスで再定義
- メソッドの名前やパラメータの本数、タイプとも一致しなければならない, 相続する下位クラスで使用

オーバーロードは従来にない新しいメソッドを作ること
オーバーライディングは既存のメソッドを再定義することに違いがある

​
public class People {
public void print(){
System.out.println("私は人です。");
}
}
public class Man extends People{
@Override
public void print() {
System.out.println("私は男です。");
}
}

1.Peopleという親クラスを作った

2.Peopleクラスにはprint()というメソッドが定義されている状態である

3.Manクラスを作る。 ただし、該当クラスはPeopleを相続したクラスだ

4.相続したクラスは親クラスにあるメソッドをオーバーライドできる権限を持つ

print()というメソッドは、実際に使用されるmainクラスでどのオブジェクトを生成するかによって出力される結果値が以下のように変わる


public class Test {
public static void main(String[] args) {

People People = new People();
people.print();

Man man = new Man();
man.print();

}
}


私は人です。-> 私は男です。結果がChange！


抽象クラス

- abstract'という予約語を使ってclassを生成
- 抽象クラスには抽象メソッド（abstractmethod）が使用できるが、そのメソッド内にはインスタンスが存在してはならない

public abstract class Parent {
public abstract void printString();

public void print() {
System.out.println("抽象クラス内にある基本メソッド");
}
}

このようにabstarctキーワードをつけた抽象メソッド（printString）を作ることができる
また、抽象メソッドでないメソッドも作ることができる

​
抽象クラスは基本的に完成していないクラス、メソッドと考えればいい
そのため、相続を通じて抽象クラスを完成させた後に使用しなければならない

public class Child extends Parent{
@Override 
public void printString() {
//TODO Auto-generated method stub
System.out.PrintIN("抽象クラス内にある基本メソッド");
}
}
Install Python 2.7

https://www.python.org/downloads/release/python-2718/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/b965f739-1d46-4b14-50f4-049706720183.png)

```
curl 'https://raw.githubusercontent.com/pypa/get-pip/20.3.4/get-pip.py' -o get-pip.py
python gey-pip.py
```
ibmcloud cli で invalid character '<' looking for beginning of value になった場合＆plugin / oc のアップデート

久々に ibmcloud にアクセスして、ibmcloud コマンドの更新をしようとしたところ、

```
C:\>ibmcloud update
更新を確認しています...
失敗
最新の CLI 情報を取り出し中にエラーが発生しました:
invalid character '<' looking for beginning of value
```

古いからアップデートしたいのに、いったいなにごと・・・。

結論：最新版のインストーラーを実行しましょう。

https://github.com/IBM-Cloud/ibm-cloud-cli-release/releases/

完了。念のため確認。
```
C:\>ibmcloud -v
ibmcloud version 2.7.0+04dfeac-2022-04-28T17:14:20+00:00

C:\>ibmcloud update
更新を確認しています...
更新は不要です。 CLI は既に最新です。
使用可能なプラグインの更新を表示するには、 'ibmcloud plugin list' を実行

C:\>ibmcloud -v
ibmcloud version 2.7.0+04dfeac-2022-04-28T17:14:20+00:00
```

この件はマニュアルのこちらに載っています。ibmcloud cli のトラブルシューティングの際にはこちらをご覧ください。

https://cloud.ibm.com/docs/cli?topic=cli-troubleshoot

おまけ plugin のアップデート
```
C:\>ibmcloud plugin update
リポジトリー 'IBM Cloud' からすべてのインストール済みプラグイ ンのアップグレードを確認しています...

以下のプラグインが、アップグレードに利用可能です。
1 つ選択して続行してください (または Enter を押してスキップし ます):
1. 'container-service[kubernetes-service] 1.0.275' から 'container-service[kubernetes-service] 1.0.408' へ
2. 'container-registry 0.1.536' から 'container-registry 0.1.571' へ
3. 上記のすべて
数値を入力してください> 3

次のプラグインが更新されます:
'container-service[kubernetes-service] 1.0.275' から 'container-service[kubernetes-service] 1.0.408' へ
'container-registry 0.1.536' から 'container-registry 0.1.571' へ
'container-service[kubernetes-service] 1.0.275' から 'container-service[kubernetes-service] 1.0.408' へ更新
バイナリー・ファイルをダウンロードしようとしています...
 26.31 MiB / 26.31 MiB [=========================] 100.00% 3s
27586048 バイトがダウンロードされました
バイナリーを更新しています...
OK
プラグインは正常にアップグレードされました。

'container-registry 0.1.536' から 'container-registry 0.1.571' へ更新
バイナリー・ファイルをダウンロードしようとしています...
 11.50 MiB / 11.50 MiB [=========================] 100.00% 1s
12056576 バイトがダウンロードされました
バイナリーを更新しています...
OK
プラグインは正常にアップグレードされました。
```

尚、oc コマンドは plugin に含まれないので、OpenShift webUI から別途ダウンロードが必要です
https://cloud.ibm.com/docs/openshift?topic=openshift-openshift-cli&locale=ja

以上。
FileMaker Data Migration Tool 使用時の注意点「開いちゃダメ」

## FileMaker Data Migration Toolとは

FileMaker Data Migration Toolは、Claris社から提供されている、データ移行ツールです。
その操作はコマンドラインで実行します。

## FileMaker Data Migration Tool使用時の注意点
:::note alert
データを入れたいファイル（Claris社ではこれをクローンファイルと呼んでいる）を絶対に開いてはいけないこと。
:::

（「鶴の恩返し」という童話をご存じの方はその話を思い出しましょう。）

## 開いてしまったあとに発生する状態
:::note
The specified file is not a clone.
:::

マイグレーションのためのコマンドを実行するとこのようなエラーが表示されます。
ファイルを差し替えない限り、これを解決することはできません。

## なぜ開いたらダメなのか

https://community.claris.com/ja/s/article/New-FileMaker-data-migration-tool
以下の記述があります

>FileMaker クローン（データなしのコピー）とは何ですか?
>FileMaker Pro ファイルのデータなしのコピーには、レコードデータとデフォルトのロケール情報を除いて、元のファイルのすべての内容が含まれています。つまり、データを含まない FileMaker カスタム App です。

:::note
注意: FileMaker Pro または FileMaker Pro Advanced がクローン（データなしのコピー）を開くと、オペレーティング システムの現在のロケール情報がクローン（データなしのコピー）に追加されるため、ファイルはクローン（データなしのコピー）ではなくなります。本来のクローン（データなしのコピー）とは、クローン（データなしのコピー）として保存され、なおかつ、FileMaker Pro または FileMaker Pro Advanced で一度も開かれたことのないファイルのことを言います。
:::

つまり・・・
データなしコピーで作ったファイルは、ロケール情報というものが削除されており、それがマイグレーションファイルとしての適合判断要素になっている。
ファイルを開くと、ロケール情報が記録されてしまう。そのためマイグレーションで用いるファイルとは認めてもらえなくなり、”The specified file is not a clone.”というエラーメッセージが出ることになる。

## エラーになったとの再起方法は？

あらたにデータなしファイルを作り直すことです。

対象のファイルを開き、コピーを保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/3add965e-adc5-e762-48da-e183e845ad22.png)

保存する時にタイプを、データなし　として保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/9e408b44-b032-034b-c769-2d0a78aa2532.png)

:::note
このあと、ファイルを開いたらダメ。絶対。
:::

EOF
【初心者必見！】BizRobo!のDAのGuarded Choiceの使用方法

# はじめに
みなさんこんにちは。
今回はBizRobo!のDAのGuarded Choiceの使用方法についてご説明します。
基本的には使用法は同じです。

:::note warn
人によって組み合わせ方法が違うので他人が作成した
ロボットを見るときは注意が必要です。
:::

# Guarded Choiceで出来る機能
Guarded Choiceでは、
<font color="Red">
・秒待機
・要素の有無
・アプリケーションの有無
・ツリーの変更停止</font>
のおおまかにいうと４つの機能が存在します。

上記４つの機能を上手に組み合わせることで
良いロボットが完成するといっても過言ではありません。
それぐらい重要な機能だということを改めてご認識ください。

## ①秒待機（）について
秒待機：指定した時間を待機するステップです。
基本的には秒待機と要素の有無 or アプリケーションの有無を
組み合わせて使用することが多いでしょう。
詳しくは②と③の要素の有無とアプリケーションの有無でご説明いたします。

## ②要素の有無（Location Found）について
要素の有無：指定した要素が存在（画面に表示されているか）を
確認するステップです。
主にアプリケーションやページは変わらないけど、
画面が変わるときに使用します。

探したい要素を右クリックして、
ガード＞ロケーションが見つかった場合 or ロケーションが見つからなかった場合を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/5068a540-5542-4631-f620-da802819f582.png)


## ③アプリケーションの有無（Application Found）について
アプリケーションの有無：指定したアプリケーションが存在（アプリケーションタブに表示されているか）を確認するステップです。
主に、ページの遷移したタイミングでページの名前が変わったりするので、
その際に使用することが多いです。


指定したいApplicationのタブを右クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/71b878e1-6c3c-f9ef-6ced-94645b35f57a.png)
すると、ガード＞アプリケーションが見つかった場合 or　アプリケーションが見つからなかった場合
のどちらかを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/db76ecae-547c-9d0a-1827-22686ae2f7d1.png)


## ④ツリーの変更停止（Tree Stop Changing）について
ツリーの変更停止：簡単にいうと、ページの更新を待つステップです。
例えば、フィルターをかけて更新処理を行った際に、
「Loding」という文字が表示されたりして少し待たないといけない時があると思います。
その際に、Locationで探してしまうと、更新する内容などでうまくLocationが機能しない時があります。そういった場合は、ツリーの変更停止を使用します。
※指定する時間が「秒待機」のように何秒と秒指定できますが、
ツリーの変更停止は「ミリ秒」なので、1秒の場合は「1000」、10秒の場合は「10000」と指定してください！

ツリーの変更停止は、
指定したアプリケーション内で待機をページの変更or更新を待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/25ac907d-dd72-5308-1eb4-98a0b023ce7a.png)
待ちたいアプリケーションorページを右クリックして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/8b4d7cec-d85e-1fd5-b740-b500b1307be8.png)
ツリーの変更停止ステップを作成します。
指定した秒の部分は、デフォルトで「500」（このままだと0.5秒）
なので、適宜変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/e62f80ad-a45d-0521-5f9c-e0552e595599.png)

# さいごに
いかがでしょうか。
Guarded Choiceの指定でロボットの安定性などが大きく変わることがあります。
適宜使用してみてください。
最後までご覧いただきありがとうございました！！！
ROS2のNavigation2でパラメータの設定をしたい

# はじめに
[Navigation2](https://navigation.ros.org/index.html)を使って開発をしていくうえでパラメータ（コストマップやロボットの大きさ、速度・加速度の最大値・最小値などなど）を設定する方法について紹介する小ネタ記事です。

# 前提として。
自前のパラメタファイルを設定せずにブリングアップする基本的な部分のおさらいをします。

ターミナルを3つ立ち上げてそれぞれに以下のコマンドを打ちます。
まずは、Gazeboのブリングアップ。

```
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
```
続いて、Nav2のブリングアップ。
```
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True map:=/opt/ros/foxy/share/nav2_bringup/maps/turtlebot3_world.yaml
```
最後に、Rvizを立ち上げましょう。
```
ros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz
```

すると以下のような描画になります。

![Screenshot from 2022-05-23 15-05-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/f93930ee-90a7-4ddd-24e0-55bff9bd9d6b.png)

ちなみに、今回指定しなかったパラメタファイルはデフォルトで、Navigation2のBringupのパッケージのディレクトリにこっそり提供されています。私の場合、以下のような階層です。
`/opt/ros/foxy/share/nav2_bringup/params/nav2_params.yaml`

# 公式。。。？
[公式ドキュメント](https://navigation.ros.org/tuning/index.html#nav2-launch-options)曰く、「ブリングアップのコマンドのオプションとして`param_file:=(your directory)/~.yaml`みたいに指定すれば自前のデフォルトじゃないパラメタファイルを呼び出せるよ」とのこと。

素直に、デフォルトで提供されているyamlファイルの中身をコピーして、local_castmapのinflation_radiusとcost_scaling_factorをいじります（これをいじれば分かりやすくRvizでCostmapの色が変化するので）。

```
cost_scaling_factor: 10.0　#default=3.0
inflation_radius: 0.15     #default=0.55
```
そしてコマンドを打ちました（RvizとGazeboのブリングアップは省略）

```
 ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True map:=/opt/ros/foxy/share/nav2_bringup/maps/turtlebot3_world.yaml param_file:=$HOME/my_param/test01_param.yaml
```
`param_file:=`で指定したパスに置いてあるパラメタファイルを呼び出しているのですが、
![Screenshot from 2022-05-23 14-46-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/0d10c500-13d0-7e93-14d8-1813621eb53a.png)
ご覧の通り、inflation_radius、つまり、障害物から膨張する分のコストマップをかなり小さくしたにも関わらず、変化がないです。。。公式の言うとおりにしたのに。。。？

# ローンチのソースコードを見に行くと。。。
![Screenshot from 2022-05-23 14-51-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/13898d8d-f9f4-7d23-8f02-907e9dfc46a4.png)
よく目を凝らしていくと、なんと`param_file`と思っていたものは、`params_file`でした。。。

改めてコマンドを打ちまして（なお、こちらもRvizとGazeboは省略）、
```
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True map:=/opt/ros/foxy/share/nav2_bringup/maps/turtlebot3_world.yaml params_file:=$HOME/my_param/test01_param.yaml
```
以下のように、障害物の判定によるコストマップの膨張の描画が先ほどより小さくなっているのがわかると思います。
![Screenshot from 2022-05-23 14-56-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/d9ec1f64-48b9-ba75-7826-fa74e1f5532e.png)

ローンチする際の細かな変数の意味に関しては公式のサイトで確認できます。

https://navigation.ros.org/configuration/packages/configuring-amcl.html

AMCLに関するパラメタ以外も公式に載っているのでぜひ確認してみてください。

# 結論
パラメタファイルを使いたければ、`s`を忘れないようにすること！です。

# 参考
https://navigation.ros.org/tuning/index.html#nav2-launch-options

https://answers.ros.org/question/371814/print-agruments-in-ros-2-foxy-launch-files/

https://emanual.robotis.com/docs/en/platform/turtlebot3/navigation/#navigation
【Rails】Railsでカバレッジを計測する

# 初めに

`Rails6`のプロジェクトにカバレッジを導入したので、そのやり方を記事にしておきます。

## 環境

- Rails 6.1.4
- Ruby 2.7.4
- simplecov 0.21.2

# simplecov を導入する

カバレッジを測定するためのジェムである`simplecov`を追加します。

```ruby:Gemfile
group :test do
  gem 'simplecov', require: false
end
```

`simplecov`の設定を追加する。

```ruby:spec/rails_helper.rb
require 'spec_helper'
require 'simplecov'
SimpleCov.start 'rails'


RSpec.configure do |config|
# 省略
end
```

これで`Rspec`実行後に、`coverage/index.html`に実行結果が出力されます。

# 参考

[simplecov - Github](https://github.com/simplecov-ruby/simplecov)
JetBrains ToolboxからインストールしたIDEをコマンドラインから起動できるようにする

## 実現したいこと
こんな感じでコマンドラインから起動できるようにしたい。
```zsh
rubymine projects/rails_app
```

## 手順

### 1. IDE起動用シェルスクリプトの生成先ディレクトリを作成する
```zsh
mkdir /Users/{ユーザー名}/bin
```
### 2. パスを通す
```vim
# ~/.zshrc

export PATH=$PATH:$HOME/bin
``` 

### 3. JetBrains Toolboxで設定をする
「設定」　→ 「ツール」 → 「シェルスクリプトの場所」
に`/Users/{ユーザー名}/bin`と入力する

### 4. 実行
```zsh
rubymine projects/rails_app
```
RubyMineが立ち上がる

## 環境
M1 Max MacBook Pro 
Monterey 12.4
TypeScriptを基本からまとめてみた【6】【Interface】

## インターフェイスとは

オブジェクトがどんな形のものか定義するためのもの

```sample1.ts
//インターフェイスを作るには『interface』を作成する
//※このキーワードはJavaScriptには存在せず、TypeScript しか存在しない

interface　Person {
   name:string;

}


```

## 参考サイト
[【世界で7万人が受講】Understanding TypeScript 日本語版](https://www.udemy.com/course/understanding-typescript-jp/learn/lecture/17812920#overview)

[超TypeScript入門 完全パック](https://www.udemy.com/course/typescript-complete/learn/lecture/17877674#overview)
LINE WORKS API 2.0 を PowerShell で叩いてみる (その4: ファイルのダウンロード)

前回は、LINE WORKS のユーザー写真を登録しましたが、今回は[ユーザーの写真をダウンロード](https://developers.worksmobile.com/jp/reference/user-photo-get?lang=ja)してみます。


LINE WORKS API でのファイル ダウンロードは、ファイル アップロードと同様に共通化されていて、ダウンロード URL を取得する API を呼び出すと、ダウンロード URL にリダイレクトされます。

PowerShell では、`Invoke-RestMethod` または `Invoke-WebRequest` を使用すると自動的にリダイレクトされ、 `-PreserveAuthorizationOnRedirect` パラメータを付ければリダイレクト先に認証情報を引き継いでくれます。ファイルのアップロードに比べてだいぶ簡単ですよね。


```powershell
$outFilePath = "c:¥tmp¥download.jpg"

$userId = 'user@yourcompany'
# userId は Path Parameter のため、URL Encode が必要
$urlEncodedUserId =  [System.Web.HttpUtility]::UrlEncode($userId)
$getDownloadUrlAPI = "https://www.worksapis.com/v1.0/users/$URLEncodedUserId/photo"

Invoke-RestMethod -Method GET -Uri $getDownloadUrlAPI -Headers $Header  -PreserveAuthorizationOnRedirect -Out $outFilePath 
```

これで、ファイルのダウンロードもできました。
Next.js の使い方　(Reactハンズオンラーニング 第2版 のサンプル)

Next.js は React のサーバーサイドレンダリングのためのツールです。

[Reactハンズオンラーニング 第2版](https://www.oreilly.co.jp/books/9784873119380/) の 12.3 のサンプルを動かして見ました。
Node.js のバージョンは次の通りです。

```text
$ node --version
v18.4.0
```

プロジェクトの作成

```bash
mkdir proj02
cd proj02
npm init -y
npm install --save react react-dom next
mkdir pages
```

この時点でのフォルダーの状況

```text
$ tree -I node_modules
.
├── package-lock.json
├── package.json
└── pages
```

package.json の改造

```json:package.json
{
  "name": "proj01",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
   "dev": "next",
    "build": "next build",
    "start": "next start"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "next": "^12.2.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  }
}
```

コードの作成

```pages:pages/index.js
import Layout from "./Layout"

export default function Index() {
  return (
    <Layout>
      <div>
        <h1>Hello everyone!</h1>
	<p>May/23/2022 PM 14:16</p>
      </div>
    </Layout>
  )
}
```

```pages:pages/Layout.js
export default function Layout(props) {
  return (
    <div>
{props.children}
    </div>
  )
}
```

この時点でのフォルダーの状況

```text
$ tree -I node_modules/
.
├── package-lock.json
├── package.json
└── pages
    ├── Layout.js
    └── index.js
```

サーバーの起動

```bash
npm run dev
```

ブラウザーで
http://localhost:3000
にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8716fd6e-a8d9-3f23-2976-bc8ecdf72770.png)

使ったバージョン

```text
$ npm list --depth=0

├── next@12.2.0
├── react-dom@18.2.0
└── react@18.2.0
```
LINE WORKS API 2.0 を PowerShell で叩いてみる (その3 : ファイルのアップロード)

今回は、ユーザーの写真を登録してみます。
[ユーザーの写真登録](https://developers.worksmobile.com/jp/reference/user-photo-create?lang=ja)は、ファイル アップロードを行うことで実現できます。



LINE WORKS API を利用した[ファイルのアップロード](https://developers.worksmobile.com/jp/reference/file-upload?lang=ja)は、一度、ファイルアップロードのための URL を取得する API を呼び出し、取得した URL に対して改めてファイルを POST することで行います。



ファイルのアップロード URL へのファイルの POST は、その他の API を呼び出す場合とは Header 情報が異なるので、[LINE WORKS API 2.0 を PowerShell で叩いてみる (その1 : JWT の処理)](https://qiita.com/msato-3/items/a42c2212a05f45870d27) で作った $Header ををのまま利用することができません。

[LINE WORKS API 2.0 を PowerShell で叩いてみる (その1 : JWT の処理)](https://qiita.com/msato-3/items/a42c2212a05f45870d27)で Token を取得した際に Token を SecureString として取っておき、のちほど、この Token を使ってファイル アップロードを行うことにします。
```powershell
# ここまで省略
$url = 'https://auth.worksmobile.com/oauth2/v2.0/token'
$response = Invoke-RestMethod -Uri $url -Method POST -Headers $requestHeader -Body $requestBody

# 追加 : Token を SecureString として残しておく
$secToken = $response.access_token | ConvertTo-SecureString -AsPlainText -Force
```

まずは、ファイルのアップロード先 URL を取得します。
`userId` も、`nextCursor` と同様、URL エンコードが必要ですのでご注意ください
```powershell
$filePath = 'C:\tmp\photo.jpg'
$file= get-item $filePath 

$userId = 'user@yourcompany'
# userId は Path Parameter のため、URL Encode が必要
$urlEncodedUserId =  [System.Web.HttpUtility]::UrlEncode($userId)
$getUploadUrlAPI = "https://www.worksapis.com/v1.0/users/$urlEncodedUserId/photo"

$body = @{
    fileName = $file.Name
    fileSize = $file.Length
}

$Response = Invoke-RestMethod -Method POST -Uri $getUploadUrlAPI -Headers $Header -body (ConvertTo-Json $body)  
$uploadURL = $Response.UploadUrl
```

この `$uploadURL` に、`multipart/form-data` 形式でコンテンツを POST します。

```powershell
$ContenType = 'image/jpeg'
$boundary = [System.Guid]::NewGuid().ToString() 

$fileBinary = [IO.File]::ReadAllBytes($filePath)
$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$fileContent = $enc.GetString($fileBinary)

$LF = "`r`n"
$fileNameBytes =  $enc.GetString([System.Text.Encoding]::UTF8.GetBytes($file.Name))
$requestBody = (
    "--$boundary",
    "Content-Disposition: form-data; name=`"resourceName`"; filename=`"$($fileNameBytes)`"",
    "Content-Type: $ContenType$LF",
    $fileContent,
    "--$boundary--$LF"
) -join $LF


# ここでは､Header 情報を事前に作成せずに Invoke-RestMethod を呼び出している
# ConentType と認証情報は、個別に引数として指定
Invoke-RestMethod -Uri $uploadURL -Method POST -body $requestBody -Authentication Bearer -Token $secToken -ContentType "multipart/form-data; boundary=$boundary; charset=iso-8859-1"
```

これで、ユーザーの写真が登録できました。
JAVAテータタイプ基礎 独学

プログラムの定義
プログラム :料構造（データ）とアルゴリズムの結合
プログラム :資料構造を通じてデータを構成·表現し、アルゴリズムを通じて問題を解決
データ表現の方法はプログラムに多くの影響を与えますが、これは問題を解決する方法アルゴリズムがデータの表現によって異なるからです。 
つまり、データをどれだけ使いこなすかが良いプログラムを作成できるカギ

Javaのデータタイプ
基本タイプ（primitivetype）
参照タイプ（referencetype）

Javaのデータタイプ詳細
基本タイプは整数、実数、文字、論理リテラールを保存するタイプ
参照タイプとは、オブジェクトの番地を参照するタイプで、配列、列挙、クラス、インタフェースタイプ

基本データタイプと
整数、実数、文字、論理リテラールを直接保存するタイプ
整数タイプ :byte(1バイト）、char(2バイト）、short(2バイト）、int(4バイト）、long(8バイト）
実数タイプ :float(4バイト）、double(8バイト）
論理タイプ :boolean(1バイト）

参照タイプ（Referencetype）

オブジェクトの番地を参照するタイプ
配列、列挙、クラス、インタフェースタイプ


基本タイプと参照タイプの違いは、保存される値が何かです。 
デフォルトタイプで宣言された変数は実際の値を変数に保存しますが、参照タイプは配列、列挙、クラス、インタフェースを利用して宣言された変数はメモリに番地を値として持つことになります。
つまり、番地を通じてオブジェクトを参照するという意味で参照タイプと呼びます。

メモリ使用領域
1) メソッド領域(MethodArea)
メソッド領域 :コードで使用されるクラスをクラスロードで読み取りしてクラス別にランタイム定数プール、フィールド/メソッドデータ、メソッドコード、生成者コードなどを分類して保存
JVMが開始する際に生成されてすべてのスレッドが共有する領域

2) ヒップ領域(HeapArea)
ヒップ領域はオブジェクトと配列が生成される領域 
ヒップ領域に生成されたオブジェクトと配列は、JVMスタック領域の変数や他のオブジェクトのフィールドで参照 
こードでオブジェクトを直接除去する方法を提供してない

ただし、System.gc()というメソッドがありますがこれは直接ゴミを除去するというよりJVに除去を要請する形
Power AutomateのカスタムコネクタのAuthorizationヘッダーは、上書きして任意のパラメータを渡すことが出来る。

## この話のオチ
Policyを使う。この記事は、下記URLを補足するために書かれました。

Setting Headers using Custom Connector Template Policies
https://www.serverlessnotes.com/docs/setting-headers-using-custom-connector-template-policies 


## 背景
Power Automateのカスタムコネクタで、Web APIを使用するものを作成するとき、Authorizationヘッダーを自由にいじることが出来ません。

具体的には、`Authorization`という名前のパラメーターを作ろうとするとエラーが出ます。
試しにSwagger Editorから追加してみると...
![2022-05-23 13_32_41-Manage your custom connectors _ Power Automate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390679/528683e0-2253-61a2-bd27-c1a4e39ca662.png)

![2022-05-23 13_35_01-Manage your custom connectors _ Power Automate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390679/b8a8bff1-7022-1620-d706-40525b4d98cd.png)

エラーが出ましたね。
「Error 'Authorization' header is not allowed. Use 'API Key' authentication type in the Security tab to set this header.」と怒られました。

しかしAuthentication TypeでAPI Keyモードを選ぶと、トークンをハードコードすることになってしまい、それは都合が悪いわけです。
なのでAPI Keyではなく、わざわざNo Authenticationモードにしているのですが...というデッドロック状態に。
これを打開します。

## ポリシーを指定する
ポリシーのテンプレートに、「Set HTTP header」があるのでそれをそのまま使用します。
Header nameは`Authorization`に指定。
Header valueは`@headers('Access-Token')`としておきます。この`Access-Token`は未定義の変数として、実行時に中身を要求されるようになります。これに渡せばよいわけですね。
Actions if header existsは、既に同名のヘッダーが存在する時の挙動ですが、ここでは`Override`を選択しました。

![Manage-your-custom-connectors-Power-Automate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390679/6e088d1e-1028-d99a-a1c1-de6406eea927.png)

## 実際に組み込んでみる
Access-Tokenというフィールドが追加され、任意の変数を渡すことが出来るようになりました。
これでBearerトークンも渡したい放題！
![2022-05-23 13_59_27-Create your flow _ Power Automate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390679/cd895524-91ad-b1ee-06b5-cb93ad106528.png)

## 追記
2022-05-23 / 公開した後にTwitterで検索してみたら普通に知見として世の中にあったみたい。まぁいいか...。

https://twitter.com/mofumofu_dance/status/1263858469511131136
AWS Machine Learning Specialty合格体験記

2022年5月15日にAWS Certified Machine Specialtyを受験して、無事合格しました。
取得に際して何を行なったのかについて共有したいと思います。

# 前提
自分の簡単な背景は以下になります。

・機械学習タスク：Amazon Forecastを使った簡易的なMLOps基盤の構築
・AWS資格：CLF, SAA

現在行っている簡易MLOpsをSageMakerとStepFunctionsを使って本格的に開発、運用、管理を行うために、まず知識を幅広く手に入れようという動機から受験しました。

# 行ったこと
学習に利用したコンテンツは以下の二つです。

・[「ディープラーニングを支える技術 - 『正解』を導くメカニズム[技術基礎] 」](https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E2%80%94%E2%80%94%E3%80%8C%E6%AD%A3%E8%A7%A3%E3%80%8D%E3%82%92%E5%B0%8E%E3%81%8F%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%BA%E3%83%A0%EF%BC%BB%E6%8A%80%E8%A1%93%E5%9F%BA%E7%A4%8E%EF%BC%BD-Tech-Books-plus-ebook/dp/B09NQTXZXP/ref=sr_1_1?crid=17H4B9NZZUS3D&keywords=%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93&qid=1653279683&sprefix=%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%2Caps%2C504&sr=8-1)
　→機械学習、深層学習の用語やパラメータ、計算式についてわかりやすく、詳しく解説しているので超お勧めです。

・[「Kindle : AWS Certified Machine Learning Specialty Best Practice Exam Japanese 」](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7%E6%94%BB%E7%95%A5%EF%BC%81AWS%E8%AA%8D%E5%AE%9A%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E6%9C%AC%E7%95%AA%E7%94%A8%E5%95%8F%E9%A1%8C%E9%9B%86-130%E5%95%8F%EF%BC%8865%E5%95%8F-2%E3%82%BB%E3%83%83%E3%83%88%EF%BC%89-AWS%E8%AA%8D%E5%AE%9A%E6%9C%AC%E7%95%AA%E7%94%A8%E5%95%8F%E9%A1%8C%E9%9B%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B09HBWHQ7R/ref=sr_1_14?crid=8OS25B2LX5F7&keywords=aws+machine+learning+specialty&qid=1653279366&sprefix=aws+machine+%2Caps%2C625&sr=8-14)
　→試験範囲の各セクション（1.データエンジニアリング、2.探索的データ分析、3.モデリング、4.機械学習の実装とその運用）毎に問題をまとめており、勉強が進めやすい。他の対策問題集だと、出題範囲からランダムに問題が出るため、勉強しづらい。

この２点の内容で、わからない単語や式が無くなるまでネットで調べまくって、Macのメモにまとめていきました。
と言いつつ、自然言語処理と深層学習については対策不足のまま受験しましたが、、。

# 結果
![スクリーンショット 2022-05-23 13.43.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/e1b49c05-97c4-30ef-ce3b-dd4264492392.png)

![スクリーンショット 2022-05-23 13.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650990/05c6613a-5204-3bb3-99b8-9d71be7a2d86.png)


# 感想
普段からAWSで機械学習業務をされている方は取得がとても簡単ですが、AWSも機械学習も知らないのであればかなり難しいです。
体感だと、出題された問題の範囲のおおまかな割合は以下になります。

4割：機械学習、深層学習の内容、
3割：機械学習やデータ処理に関わるAWSのサービス
2割：統計の知識
1割：SAAの内容

試験問題の内容は漏洩できないので、具体的には書けないですが
上記のAWS試験対策問題で正解じゃない選択肢までちゃんと理解していれば、合格圏内に入ると思われます。

みなさまの合格を祈っております！
Power AutomateからSharePointリストの「ユーザーまたはグループ」型の列を更新する

# :pushpin: 列が1ユーザーしか含められないとき
![SharePoint複数ユーザー更新0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/057bb66f-f49e-312d-6ff8-de446e34bdb4.png)
更新ユーザーのUPNをアクション「項目の更新」で対象の列にセットすればよいです。

# :pushpin: 列が複数ユーザーを更新できるとき
**列の設定が以下のような場合**
![SharePoint複数ユーザー更新1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/cf7c8eea-ae9a-710a-e16e-388a878af72d.png)

①ループ内で、「作成」アクションを追加し**列名("Claims")を含む**１レコード作成。
```
{"Claims": UPN}
```
::: note warning
必ず列名”Claims”をつける必要があります。つけなかった場合BadGateWayなどのエラーで更新に失敗します。
::: 

➁ループの後で①の手順で作成したレコードを配列としてまとめます。

**フローサンプル**
下記画像では予め作成した更新ユーザーの名前の一覧を基にApply to Eachループ内で<font color="orange">「ユーザーの検索（V2）」</font>→<font color="DarkViolet">「作成」</font>アクションでJSON形式の1つのアイテムを作成しています。この手順は①の手順に該当します。
![SharePoint複数ユーザー更新2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/6e4aea48-7aef-6d18-fbb4-c20f4bf97559.png)

③ アクション「項目の更新」で対象の列を選択し、「アレイ全体の入力に切り替える」をクリックする
![SharePoint複数ユーザー更新3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/987f1abc-de54-a7a8-7f70-e867b0d70ac2.png)

④ 1の手順で作成した配列を更新するようにセットする
![SharePoint複数ユーザー更新4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218676/84a574d3-b1b2-95d6-315b-027e393969e7.png)

---
以上です。
Stripeで、初回の契約手数料などの「1回限りの決済」をサブスクリプションに追加する方法

サブスクリプションビジネスでは、初期費用や契約・事務手数料などの「1回限りの請求」も行う場面が存在します。

この記事では、Stripeを利用して、「サブスクリプションの請求」と「1回限りの請求」をまとめて請求・決済する方法を紹介します。

## サブスクリプション作成時に、1回限りの請求も追加する

初回費用など、サブスクリプション作成時に請求したいケースでは、サブスクリプション作成時のAPIコールで設定します。

```js
const subscription = await stripe.subscriptions.create({
  customer: '{{CUSTOMER_ID}}',
  // 定期課金の料金
  items: [{
    price: '{{RECURRING_PRICE_ID}}',
    quantity: 1,
  }],

  // 1回限りの料金
  add_invoice_items: [{
    price: '{{PRICE_ID}}',
    quantity: 1,
  }],
});
```

サブスクリプションだけの場合、`items`のみを設定します。

1回限りの請求を混ぜたい場合は、`add_invoice_items`を追加しましょう。

作成と決済に成功すると、初回の請求のみ`add_invoice_items`に設定した料金が表示されます。

![スクリーンショット 2022-05-16 18.52.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8c444e0b-2866-ebc2-c89e-bef2e32f4895.png)

## Checkoutで、1回限りの請求も追加する

Checkoutで決済画面を用意する場合は、1回限りの請求も`line_items`に追加すればOKです。

```js
await stripe.checkout.sessions.create({
  mode: 'subscription',
  customer: '{{CUSTOMER_ID}}',
  line_items: [{
    price: '{{RECURRING_PRICE_ID}}',
    quantity: 1,
  }, {
    price: '{{PRICE_ID}}',
    quantity: 1,
  }],
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com'
})
```

混ぜた状態でCheckoutのセッションを作成すると、「今回の請求」と「次回以降の請求」の2つが表示されます。

![スクリーンショット 2022-05-16 19.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/2260fc44-8cb8-d519-a9b3-45a1653c1a17.png)

## 注意点

請求タイミングが、サブスクリプションのサイクルで決済されます。

タイミングを調整したい場合は、別途請求書やPayment Intentsを作成する方法もご検討ください。

## Documents

https://stripe.com/docs/billing/invoices/subscription

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

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

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

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
SELECT * FROM 脳　WHERE 市場価値の高いエンジニア



# 初めに
　バックエンドエンジニアとして実務経験が一年に到達する
　あれっっ今の経歴とスキルじゃ市場価値ないやん
　これから市場価値の高い
　いや少なくとも転職できるようなキャリアを考えていかなければ！！！
　市場価値についての思考を抽出

　何か意見あればどしどしコメント下さい！！
　アドバイスお持ちしてます！！！

⚠︎大変読づらい文章となっております

## 現状
　SES企業に所属
　
## 業務
　テスト案件
　データ移行業務（SQL）

## 経緯
　ー入社半年ー
　このままだと開発経験がないまま時間が経ってしまう、、
　エンジニアとして現状を把握したい
　エンジニアとしての市場価値を測るのに最適なのは
　転職サイトやエージェントで自分の今の経歴、スキルでの適正年収を算出してもらおう！！

　エージェント「正直今の経歴、スキルだと難しいですねー」
　エージェント「少なくとも開発経験がにないと、、、」
　私「ですよね泣」
　私の心「このままだとやばいなー」　

開発の現場に移してもらうよう交渉
　
　〜交渉中〜
　　
　ー入社一年後ー
　new→開発現場に移動　


### ＞思考開始
　開発経験のあるエンジニアなんて腐るほどいる
　その中で市場価値の高いエンジニアとはどんなエンジニアなのか？
　どこの部分を見て市場価値が高いと査定するのか？

　　1.経験年数
　　2.思考ロジック
　　3.スキル
   
 1.経験年数
　　最低条件としてみられているポイントだと考える。
　　経験年数があるほどいいエンジニアとは考えられていないが、
　　最低何年は経験してないと足切りがあるように見受けられる。
　　経験年数よりもスキルを見るべきだが、スキルを可視化するのが難しい。
　　ポートフォリオやgitで可視化できるのでそれで経験を補う。


2.思考ロジック
　　どういう思考をして業務に取り組み改善したかは付加価値になると思う。
　　問題→どういう思考をして解決するための手段で何をしたか
　　アウトプットすること大事。
　　技術＋思考　思考法を開示することは付加価値。
　　思考法は汎用性があるため。

3.スキル
　　浅く広くよりも狭く深くの方がいいのか？

　ー浅く広くVerー
　　スキルは多い方がいい。
　　だが求められるのが実務経験を通して得た経験が多いのが癪。
　　業務内で新しい技術に触れつづけれるのは強い。
　　でも今は無理なので自己学習で常に触れておくしかない。

　　ではなぜ評価されにくい自己学習で、新しい技術に常に触れるようにしておく事が重要なのか？
　　好奇心を大切にしたい
　　自分が出会ってきたエンジニア強達は
　　「このボタン押したらどうなる？」「これやったことないからやってみよう」
　　「こっちの方が簡単にできるんじゃない？」など、好奇心が強い人が多かった。
　　常にあたらしい、技術知識を得ようとする姿勢が大切だ！！！！！と信じている。

　ー狭く深くverー
　　正直どんなスキルをプラスでつけたらいいのかわからない。
　　保守しやすいコードが書ける？
　　設計がが得意など？


### まとめ
　　開発の現場で技術をつけながら、経験年数を重ねる
　　その中で思考ロジックをアウトプット
　　→保守のしやすさとは何かという視点を持って取り組もう
　　目指せPM！！！
【AtCoder】ABC252 E問題 解説

# 問題

辺を削ってグラフを全域木にしたときの、始点から他のノードまでの距離の和を最小化する問題。
感覚的に最小全域木系の問題かと思ったけど、方針が確定せずに終了した。

https://atcoder.jp/contests/abc252/tasks/abc252_e

# コンテスト中に考えたこと

コンテスト中は最小全域木の方針でどうにかできないか考えていた。
問題文中の『$N-1$ 本の道路を保守』という部分に惑わされてしまったというのがある。

今思うと、仮に最小全域木ができても、$d_2+d_3+...d_N$はどうやって求めるの、という話。
コンテスト中は時間制限が厳しく、落ち着いて考えられないというのが自分の悪いところ。

# 解答方針

結論からいうと、ダイクストラ法を使うだけで解ける。
- ダイクストラ法を使って求めた最短経路で、本当に辺が$N-1$ 本に限定されているのか？

というのが疑問に思うところ。私もこの部分があって、コンテスト中はダイクストラ法の方針をすぐに切り捨ててしまった。

ただ少し考えると、この性質が自明に成り立つことは理解できる。

都市 $1$ から都市 $i$ に移動するとき、$i$ は直前に別の都市 $j$ を通過していることになる。
そして、その $j$ は、各 $i$ に対して必ず1つだけ定まる。
で、その $j$ に対する直前に通過した都市 $k$ が存在し..という風にたどっていくと、いずれ 都市 $1$ に帰着する。
これは辺の重みが負でないので、ダイクストラ法を実行するときに絶対に閉路ができないことからわかる。

こういった性質から、以下のことがわかる。

:::note 
都市 $i$ に対して、その直前に通ってきた辺を保存しておき、それら $N-1$ 本の辺を連結するとダイクストラ法で求めた最小値をもつようなグラフが再現できる。
:::

というか、求めるべき値がもろ単一始点最短経路だったので、この思考は気づくべきだったかもしれない。
グラフの問題の対策もさらに必要だな、と反省

# 実装

制約によって、ただのダイクストラ法では2重ループ構造になってしまうので間に合わなくなる。
ダイクストラ法と ```priority_queue``` を組み合わせることで、頂点の選択を高速化できる。

グラフ $G=(V,E)$ に対して、キューから頂点が取り出されるのは $|V|$ 回。
キューに挿入されるのは $|E|$ 回で、ソートにはキューのサイズのlogをとるので $log|V|$ 回かかる。

つまり、計算量は $O(N + MlogN)$ となって間に合う。

```cpp:ABC252_E.cpp
#define max_dist 1000000000000000
const int max_n = 200005;
int n, m;
vector<pair<int, ll>> v[max_n]; //町iに属する辺の情報。fitst:接続先ノード、second:辺の重み
map<pair<int, int>, int> mp; //町i,jを接続する辺の番号
int prv_node[max_n]; //最適化後における、町1～町iのパスでiの直前に通るノード
bool ischecked[max_n]; //町iの直前のノードを確定させたかどうか
ll d[max_n]; //町1～町iのパスの最小値

void dijkstra() {

	priority_queue<pair<ll, int>> PQ; //1～iへのパスの最小値*-1,i 
	repa(i, n) { d[i] = max_dist; ischecked[i] = false; }

	d[1] = 0; PQ.push(make_pair(0, 1));

	while (!PQ.empty()) {
		pair<ll, int> f = PQ.top(); (void)PQ.pop();
		int cur_node = f.second;
		ischecked[cur_node] = true;
		if (d[cur_node] < f.first * (-1)) continue;
		
		rep(i, v[cur_node].size()) {
			int next_node = v[cur_node][i].first;
			if (ischecked[next_node]) continue;
			if (d[next_node] > d[cur_node] + v[cur_node][i].second) { //更新される時に実行される部分
				d[next_node] = d[cur_node] + v[cur_node][i].second;
				prv_node[next_node] = cur_node;
				PQ.push(make_pair(d[next_node] * (-1), next_node));
			}
		}
	}
}

int main() {
	//int a = in<int>(); string b = in<string>(); char c = in<char>();
	//double d = in<double>();
	//(void)scanf("%d",& );
	//(void)scanf("%d%d",& ,& );
	std::cin >> n >> m;
	repa(i, m) {
		int a, b; ll c;
		(void)scanf("%d%d%lld", &a, &b, &c);
		v[a].push_back(make_pair(b, c));
		v[b].push_back(make_pair(a, c));
		mp[make_pair(a, b)] = i;
		mp[make_pair(b, a)] = i;
	}
	(void)dijkstra();

	ll sum = 0;
	for (int i = 2; i <= n; i++) {
		int j = prv_node[i];
		if(i!=n)printf("%d ", mp[make_pair(i, j)]);
		else printf("%d\n", mp[make_pair(i, j)]);
	}

	return 0;
}
```
【PHP】タブ区切りのcsvファイルを連想配列にする

対象のcsv

```
hoge	fuga	
123456	987654
234567	876543
345678	765432
```

コード

```php
$fopen = fopen("ファイルのパス", "r"); // READで出力
$header = fgetcsv($fopen, 0, "\t"); // ヘッダー行だけ取れる

$rows = file("ファイルのパス"); // 行ごとの配列ができる
unset($rows[0]); // 先頭はヘッダーなので削除

$list = [];
foreach ($rows as $row) {
    $split_row = preg_split("/\t/", $row); // タブで区切って配列にする
    $arr = array_combine($header, $split_row); // ヘッダーをキーとして連想配列にする
    $list[] = $arr;
}
return $list;
```

結果

```php
array (size=3)
  0 => 
    array (size=13)
      'hoge' => string '123456' (length=8)
      'fuga' => string '987654' (length=5)
' (length=56)
  1 => 
    array (size=13)
      'hoge' => string '234567' (length=8)
      'fuga' => string '876543' (length=5)
' (length=33)
  2 => 
    array (size=13)
      'hoge' => string '345678' (length=8)
      'fuga' => string '765432' (length=5)
 (length=48)
```
「エンジニアは嘘つき」という話

# こんな経験ありませんか？

- 調査でログファイルを見ていて原因と思しき箇所を発見したので「見つけました！」と言ったものの、よくよく見てみると違った時に「すんません、違いました」と言えば良いのに「わたくし、嘘をついておりました」と言う

- 今週中にできると思ってたものが間に合わず、「すんません、間に合いませんでした」と言えば良いのに「今週中にできると言ったな？あれは嘘だ」と言う

- etc...

「間違っていた」とか「忘れていた」ことなどを素直に認めずに「嘘でした」と言うこと、ありませんか？

# これ、エンジニアあるあるなんです

弊社の代表的なエンジニアの発言をSlackで検索した結果をお見せしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/1eacc00d-31f8-2232-b870-9b8e684a1508.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/fa869268-9d1a-4d8d-b281-4d74c6baffeb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/fd5fd5c6-f5ec-088f-62dd-c39fe5521bf0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/666aeb33-20de-7b47-da9f-26707b81c53b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/3d790173-ac7d-09aa-1916-8c343c00da46.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/d728e7d5-a06e-1907-2188-478ddc67f1c0.png)

# というのは嘘でした

日常的にそんなこと書いてるの、私含めて2名しかおりませんでしたｗｗｗ
いや、でもですね、普段の会話ではちょいちょいみんな「嘘でした」とか「嘘かも」とか言ってるんですがSlackで検索すると全然出てこなかったんですよ。
みんな嘘つきだなー。