OmniAICreator/Qiita-1.07M huggingface dataset:
開発組織の新しいカタチ

![25094813_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/43d39f8f-d10b-9901-9052-5cbb29d54e64.jpeg)


CTO,VPoEはじめエンジニアマネジメント職としては、強い開発組織について、いつも頭を悩ましていると思いますが、ステレオタイプになっていないでしょうか？

# 柔軟な開発組織のススメ
以前下記の記事を投稿しました。
■モンゴルに開発部隊を求めた話
https://qiita.com/k1morikawa@github/items/61e5cf9520725b4706bb
■開発組織を全て業務委託メンバーで構築した話
https://qiita.com/k1morikawa@github/items/b2257661dd75e7365507
## １．海外に開発組織を構築する
コロナのお陰でリモートワークが進み、皆さん、リモートワークのノウハウが貯まり、エンジニアが隣にいないと駄目という状況でも無くなってきてます。東京でのみ採用という固定概念は捨てて、地方採用、海外採用を進めてみてはいかがでしょうか？
今年に入り急激に円安が進みました。これにより、日本人の単価は世界からみて安い方になってます。中国、韓国からみると日本は安い国となるので、それ以外の国でないとコスト的なメリットはありません。
しかし、コスト中心に考えるのではなく、開発組織が作れるかどうかにフォーカスして考えてみてください。
モンゴルでは、東大レベルの理系卒のエンジニアが採用できます。日本だと無名ベンチャーには絶対に無理でしょう。
## ２．業務委託メンバーで構築する
社員採用の様な昭和の終身雇用制度から脱却し、フレキシブルな雇用の業務委託メンバーで開発組織を作ることにより、より速くより高品質なサービスが出来上がる可能性もあります。業務委託メンバー型組織のメリットは山の様にあります。
## ３．縦割りから横割り組織へ
通常、開発本部という形で開発メンバーが集まっている組織を作ると思います。この組織は、上長がエンジニアでありエンジニアスキルに対して適切なジャッジ、評価が可能となり、部署のメンバーが全てエンジニアなのでスキル共有も進みやすいです。しかし、一方で売上に向けての意識やエンドユーザーに向けたサービス等は、組織が違うので温度感が伝わらず弱くなる傾向にあります。
エンジニアを各事業部側に配属し、事業意識をあげる形に変更してみましょう。そして横串でエンジニアの管理・評価をCTO、VPoEが担当します。
## ４．DAO型組織
エンジニアとしてマネジメント職は存在させながら、ステークホルダとなってもらい。サービスや組織に対しての意識をもってもらい。報酬も事業成功に連動させるモデルです。フラットの組織の場合は、色々と弊害があるため、DAOの良さをとった形になります。
フラット組織の弊害は下記をみてください
https://qiita.com/k1morikawa@github/items/7237dd1f61525abb3cb4
## 5.新卒エンジニアのみ
新卒エンジニアのみの組織。CTOのみ居て、採用は全て新卒エンジニアです。エンジニアって出来る奴は、１年あれば１０年目のエンジニアをあっという間に追い抜きます。新卒エンジニアで文化レベルも合わせながら育てていくのもやり方として面白いと思います
## ６．ラボ型、レベニューシェア型
全て外部委託にて開発してもらう組織です。ラボ型にする事により、見積もり等のオーバーヘッドを無くせますし、レベニューシェアなので事業部目線にもなりやすいです。昔からある形ではあります。

# 最後に
開発組織の新しいカタチについては、色々とアイデアが出てきそうですね。ゲーマーのみや女性のみ等の属性を絞ったエンジニア組織も無駄なコミュニケーションコストが省けて良いと思います。
ステレオタイプから脱却して新しいカタチの開発組織にチャレンジしてみてください！
フォロー、イイねお願いします。
sveltekit-maplibre-boilerplateの紹介

# sveltekit-maplibre-boilerplateの紹介


[maplibre用のsvelteコンポーネントを開発しました](https://qiita.com/JinIgarashi/items/551be492fe7c2fd59107)の記事で書きましたが、今は主に[sveltekit](https://kit.svelte.dev/)を使用してmaplibreアプリの開発を行っています。

sveltekitで簡単にmaplibreのアプリを作れるようにシンプルなボイラープレートを作りました。

## デモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/abaa2849-8618-7a30-dbd7-2c5b1a5769f1.png)

以下のURLから実際に動かしてみることができます。

https://watergis.github.io/sveltekit-maplibre-boilerplate

## ソースコード

ソースコードは以下のリポジトリにMITライセンスで公開しています。

https://github.com/watergis/sveltekit-maplibre-boilerplate

## 主な機能

主な機能は以下の通りです。

- シンプルにmaplibreのmapオブジェクトと最低限のコントロールだけを追加するMapコンポーネント
- mapオブジェクトをsvelteのstoresに格納して他コンポーネントから扱いやすくするように工夫
- svelteがサポートする環境変数の読み込み方の実装例としてmaptilerのキーを使用（適宜追加削除してください）
- playwrightでの最低限のテストを実装
- pnpmの設定
- lefthookの設定
- Github Actionsの設定
- 及びGithub pagesへのデプロイの設定

こちらのボイラープレートと私がmaplibre用に開発したsvelteコンポーネント群と組み合わせてお使いいただければと思います。

- svelte-maplibre-componentsのドキュメントサイト

https://svelte.water-gis.com/

## 機能追加や要望について

ボイラープレートへの機能追加などの要望がありましたら、リポジトリの方にIssueまたはPull requestよろしくお願いします。
Linuxのリンク

Linuxのリンクを扱う時に、誤ってリンク先のファイルを削除したことがあったので、ハードリンクとソフトリンクの違いをメモしておきます。

#ハードリンク
Linuxでは、それぞれのファイルに```inode```と呼ばれる番号が割り振られています。ハードリンクは、inodeを直接参照しており、以下のような特徴があります。

## 特徴
- ディレクトリのリンクは不可
- パーティションをまたげない。
- 元ファイルを移動しても開くことができる。
- ハードリンクを削除すると、見れなくなる。(リンク先のinode番号が消え、ファイルの情報がなくなる)

## コマンド
```ln  <参照先ファイルのパス> <リンク名>``` でシンボリックリンクが作成できます。
```bash
ln <参照先ファイルのパス> <リンク名>
```

# ソフトリンク(シンボリック)
```inode```番号ではなく、パスでの参照となります。下記のような特徴があります。

## 　特徴
- パスでファイルやディレクトリを参照できる。
- 元ファイルを移動したり、削除するとデットリンクになる。

## コマンド
``` -s``` のオプションをつけると、ソフトリンクになります。
```bash
ln -s <参照先ファイル or ディレクトリのパス> <リンク名>
```

リンク先の移動は、```-P```オプション、リンクの削除は、unlinkで削除できます。
```bash
# ソフトリンク先への移動
cd -P <作成したリンク名>
# リンクの削除
unlink <作成したリンク名>
```

## 参考にしたリンク
下記のサイトを参考にさせていただきました。
[[Linux] ln シンボリックリンクとハードリンクの違いと作り方](https://webbibouroku.com/Blog/Article/linux-ln)
Linux sshpass 備忘録

## sshpass インストール
```
# yum update
# dnf --enablerepo=epel -y install sshpass
```

## 使用テスト

### ssh 
【通常】
    sshpass -p 'MyPassword' ssh -o StrictHostKeyChecking=no root@192.168.xx.xx
        →-o StrictHostKeyChecking=no: ログイン聞かれない
        →初回ログイン時戻り値有り
            Warning: Permanently added '192.168.xx.xx' (ECDSA) to the list of known hosts.
    
### scp
【通常】
    sshpass -p 'MyPassword' scp -o StrictHostKeyChecking=no sample.txt root@192.168.xx.xx:/home/user/MyDocument
        戻り値なし
        
【ローカルファイルが存在しない】
    sshpass -p 'MyPassword' scp -o StrictHostKeyChecking=no sample2.txt root@192.168.xx.xx:/home/user/MyDocument
        error
            →sample2.txt: No such file or directory
    
【ホスト側に到達不能】
    sshpass -p 'MyPassword' scp -o StrictHostKeyChecking=no sample2.txt root@192.168.xx.99:/home/user2/MyDocument
        error
            →ssh: Could not resolve hostname 192.168.xx.99: Name or service not known    lost connection
私はデザインをしてはいけない

# カッコイイデザインが欲しい

　他の人の個人開発作品をみると、どれもスタイリッシュで綺麗だ。色合いとか形とかが優れている。良いデザインが良いサービスであるとは限らないけれど、良いサービスはすべからくデザインも良い。

「デザインを学習するぞ！」と意気込んで、書籍などをつかってがんばることにした。figmaというデザインを整えられるサービスに、四角や三角を描いていく。オンラインでデザインを添削サービスにも登録し、やっていく。

　しかしながら、あまりのり気になれない。

　デザインは言語化が大事だ。伝えたいメッセージと対象者を設定し、それに見合った文体や大きさ形をきりわける。「これを伝えたいからこうする」というのがないといけないらしかった。けれど、私はそれができない。「なんとなく」で生きていたためだ。

　答えもエラーもないデザインの世界は、まるで底のない沼のようだ。あまりしっくりこない。コードを考えるときは結構楽しかったのに。

# デザインはしない

　そういう経緯があって、私はデザインをしないことにした。最低限の体裁だけ整えることにして、まずは基本的な機能を実装する。落ち着いてから、外注などをしてやっていく。幸いそのようなサービスは豊富にある。


https://99designs.jp/

　いづれここを利用してみたい。ロゴをつくってもらうぞ。
Python Webフレームワーク launch.jsonまとめ

VSCodeのデバッグでlaunch.jsonの設定に毎回悩むのでPythonのWebフレームワークの設定方法を残します。

# Django, Django Rest Framework

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Django debugger",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/manage.py",
            "args": [
                "runserver",
                "8000" // 適当にポート変える
            ],
            "django": true
        }
    ]
}
```


# FastAPI
```json
// /appというディレクトリにFastAPIのアプリケーションが格納されている前提
{
    "type": "python",
    "request": "attach",
    "name": "FastAPI",
    "port": 8000, // 適当にポート変える
    "host":  "localhost",
    "pathMapping": {
        "localRoot": "${workspacFolder}",
        "remoteRoot": "/app"
    }
}
```
ChatGPTでタロット占い結果を伝えたら、超簡単に解釈してくれた

ChatGPTでタロット占い結果を伝えたら、超簡単に解釈してくれた。（初心者向け）
--
タロットの結果は以下
過去
【ワンド（棒）ペイジ正位置】
現在
【18 THE MOON(月)正位置】
未来
【ソード（剣）6逆位置】

どう読み解けるだろうか？

（AI回答）
タロットは、古代ヨーロッパの歴史や伝統を基にした一種の占いです。占い師が、特定の問題や問いに対して、カードを使って回答を求めることを占いと呼びます。

あなたが提示された結果は、「ワンド（棒）ペイジ正位置」「18 THE MOON(月)正位置」「ソード（剣）6逆位置」というカードが出てきたことを表しています。この結果を解釈するには、まず各カードの意味を理解することが重要です。

ワンド（棒）ペイジは、タロットの「過去」に相当するカードです。このカードは、過去のあなたの行動や状況を表しています。ワンド（棒）ペイジは、創造的で芸術的な才能を表すカードです。あなたの過去には、創造性や芸術性が豊富であることが表されています。

18 THE MOON(月)は、タロットの「現在」に相当するカードです。このカードは、現在あなたが感じている感情や気持ちを表しています。18 THE MOON(月)は、不安や恐れを表すカードです。あなたの現在の状況は、不安や恐れに満ちているようです。

ソード（剣）6は、タロットの「未来」に相当するカードです。このカードは、未来あなたが取る行動や選択を表しています。ソード（剣）6は、知性や判断力を表すカードです。あなたの未来には、知性や判断力が必要な局面があるようです。

このタロットの結果をまとめると、「過去には


つづき（と入力しないと続きが読めません）

、創造的で芸術的な才能があった。現在は不安や恐れがあり、未来には知性や判断力が必要な局面がある」と解釈できます。また、この結果から、あなたは過去の創造性や芸術性を生かし、現在の状況を乗り越え、知性や判断力を駆使して未来を切り拓くことが求められるようです。
著書はペンネーム、技術イベント登壇は芸名でOK？会社が却下できない氏名表示権【著作権法】

アドベントカレンダーの1人フルマラソンに挑戦中です😃
翌日はこちら：[ソースコードは特殊な著作物？会社で書いたら誰のもの？職務著作とは【著作権法】](https://qiita.com/okinocchi/items/ac85e8689296b781e90c)
前日はこちら：[ソフトウェアの不正利用は社内窓口に通報できる？Docker Desktop有料化【公益通報者保護法】](https://qiita.com/okinocchi/items/8fcaf67703f4edf43afa)

# エンジニアでも芸名やペンネームを活用
2022年はリアルなカンファレンスや勉強会が復活してきました。エンジニアが登壇する機会は増えている印象です。私のように**知名度の低い**エンジニアがカンファレンスに登壇したくなったら、狙い目はやはり自社スポンサー枠でしょうか。投票を勝ち抜くのはきっと至難の業です。

**知名度が低い**エンジニアでも、それは本名や会社名が知られていないだけで、[Twitter](https://twitter.com/okinocchi) や [Qiita](https://qiita.com/okinocchi) のアカウントなら、それなりにフォロワー数を集めている方もいますよね（私はまだまだ少ないのでぜひリンクからフォローしてね）。本名の認知度を上げるよりも、アカウント名で集客したかったり、むしろ本名を知られたくない場合もあるでしょう。

では、本名を伏せてアカウント名でカンファレンスに登壇することは可能でしょうか？
所属会社のスポンサー枠で登壇する場合も同様でしょうか？

また、昨今ではAmazon Kindleでの[セルフ出版](https://kdp.amazon.co.jp/ja_JP/)も簡単にできるようになっていますが、所属会社名を掲載しつつ、ペンネームで技術書,技術ブログ記事等の著作を発表することはできるのでしょうか？

法律から理解していきましょう。

## 実演家人格権・著作者人格権
どちらも著作権法に規定されています。耳馴染みのない言葉かもしれないので、分解します。
- 実演家は、カンファレンス登壇や楽器演奏をする**個人**[^1]
- 著作者は、著作物の創作者たる**個人**[^1]
- 人格権は、人格的・精神的利益の保護を目的とする権利

組み合わせるとこうなります。
- 実演家人格権は、実演家が実演について人格的に保護される権利
- 著作者人格権は、著作者が著書について精神的に保護される権利

ポイントは、実演家/著作家**個人**が持つ権利で、**他人や法人には譲渡できない**ことです。
たとえば、オーケストラ（楽団）のように実演家が多数集まって１つの演奏を披露する場合でも、個人個人が権利を持ち、オーケストラは個人の権利を奪うことはできません（強行規定）。

## 氏名表示権・同一性保持権・名誉声望保持権
２つの人格権の中にはさらに細かい権利が定義されています。２つに共通する権利だけ列挙します。
- 氏名表示権は、実演家/著作者の希望通りの名前を表示し、または無記名とする権利
- 同一性保持権は、実演家/著作者に無断で著書や実演の内容/タイトルを改変されない権利
- 名誉声望保持権は、実演や著書を名誉を貶める形で改変等されない権利

ここでは「氏名表示権」に着目しましょう。
```
（著作権法第90条の2） 実演家人格権 - 氏名表示権
実演家は、その実演の公衆への提供又は提示に際し、
その氏名若しくはその芸名その他氏名に代えて用いられるものを実演家名として表示し、
又は実演家名を表示しないこととする権利を有する。
```
つまり、エンジニアが登壇・著作発行する場合、本人が以下の中から表記を自由に選択できます。
- 本名
- 芸名, ニックネーム, ハンドルネーム, ステージネーム, ペンネーム, etc
- （表示しない）

## 会社が本名その他を指定できる？
「知名度のある社員を使って、自社のブランドを認知させたい」という理由で本名登壇を**強制**したり、
「他社からの引き抜き対策で、自社の優秀なエンジニアの本名を隠したい」という理由でペンネームでの著書/技術ブログ記事公開を**強制**することは**できません**。
- 会社のスポンサー枠で登壇させる
- 会社でカンファレンスを主催する
- 会社で著書を出版する
- 会社で技術ブログサイトを用意する

などの場合も同様です。事前に必ず社員本人に「氏名表示の有無」と「氏名表示する場合の表記」を確認し、正確に記載/発表しましょう。権利を侵害してしまった場合、実演家/著作者たる社員本人の訴えがあれば、5年以下の懲役若しくは5000万円以下の罰金（又はこれらの併科）に処される可能性があります😑

## 「屋号」でもOK？
2022年は、今後導入される「インボイス制度」の運用上、普段「屋号」で商売している方の「本名」がバレてしまうのではないか？ という懸念が広がりました。それはともかく、氏名表示権の規定では「屋号」について何も触れられていません。よって、「屋号」を表示してもしなくても構いません。

# まとめ
実演家や著作者にはびっくりするほど手厚い権利保護があり、侵害するとびっくりするほど重い刑罰がありますのでご注意ください。実演家の氏名表示権は映画のエンドロールにも適用されますから、俳優名（芸名）が間違っていないことをきっと何重にも確認しているのでしょうね[^2]。

有名なエンジニアで、本名の漢字を一部変更した「芸名」で登壇されていた方もいらっしゃいます。みなさんも、自己ブランディングのために芸名やペンネームの活用をされてはいかがでしょうか。

[^1]:別の記事で紹介する「職務著作」に該当する場合、個人ではなく法人等が「実演家」「著作者」となりえますが、ここでは紹介しません。この記事のコメントも参照してください。
[^2]:大量のエキストラ出演者は表示しなくても「公正な慣行」と認められます。
【JS】ボタン押下をせずファイルアップロードしたらフォーム送信する


ファイルをアップロードした段階でフォーム送信される処理。
▼HTML
```php:hoge.blade.php
// 送信フォーム
<form action="{{ route('user.update_profile', ['user' => $authUser]) }}" method="POST" name="imageForm" enctype="multipart/form-data">
    <input type="file" id="input_file" name="image_url" accept=".png, .jpg, .jpeg, .gif">
</form>
```

▼JS
```javascript:hoge.blade.php
$(function () {
    $("#input_file").change(function () {
        $(this).closest("form").submit();
    });
});
```

ファイルがアップロードされたら、formのアクションに移行する。
自己変革していける組織のために

# はじめに
株式会社SIREの丸山直樹と申します。
マネジメントを中心に、時にはコードも書いたり、他にもプロダクトの成長のために様々な事をやっております。
日本CTO協会ではプロボノとして、協会をドライブすべく活動しております！

日々、日本CTO協会の活動では刺激・学びが多く、ここで得た事を本業に活かすことで様々な成果を得ています。
この感謝の気持ちを少しでもアウトプットできたらな、と今回記事を書く機会を頂きました！

日本CTO協会の4つのバリューになぞって、日々実践していることを書きたいと思います。

## 日本CTO協会4つのバリュー
> Give First / あなたの当たり前は誰かの学び
> Think Big, Start Small / 大きく考え、小さく一歩目を踏み出す
> Fail Fast, Learn Fast / 早く失敗し、早く学ぶ
> Always Day One / 常に初日の気持ちでいる

# 「当たり前」から脱却できるマインド作り
今までまったく別の領域で働いてきたメンバーが集まってお互いのできることをやって働いています。ですので、物事の進め方から考え方まで、大きく違ったりします。
時にはそれって当たり前の事だよね、と衝突することさえあります。

私は「当たり前」とは、**「自分の経験してきた状況での最適解」** と考えるようにしています。なので、他人と「当たり前」が違う事は当然のことであり、そこを理解せずに自分の「当たり前」で物事を進めてしまえば、自分が期待している結果とはズレたものになってしまいます。


:::note info
**「Give First / あなたの当たり前は誰かの学び」** の精神で、まずは自分から「当たり前」を言語化し、お互いの最適解が共有しあえるならば、更に良い選択ができるはずです。
:::

:::note info
また「より良い選択肢は必ずある」「相手の当たり前には理由がある」と、**「Always Day One / 常に初日の気持ちでいる」** ことを念頭におけば更に円滑にコミュニケーションできるはずです。
:::

# プロダクトをより良くしていける組織

開発がある程度軌道に乗ってきた頃、特に課題として大きかったのが、開発時に多くのチーム外のメンバーが関わることでリードタイムが大きくなっていた点でした。

開発チーム内のフロー改善だけではどうしようもない状況で、これを改善するには開発関与度が下がるポジションへ移る必要がありました。その分、開発スピードが下がる懸念はありました。

いろいろと悩みましたが、この改善はリードタイムだけでなく、長期的なプロダクト開発に大きな利点があると考えたので、以下の2点をおさえて開発スピードを保ちつつ、この改善を実行していく事にしました。
- **開発チームが自発的に改善でき、スピードと品質があがっていく。**
- **やりたいことをたくさんやるではなく、やらないことを決めて、やりたいことの質を上げる。**
:::note
何から手をつけていいかわからない状況でしたが、まず手始めに **「Think Big, Start Small / 大きく考え、小さく一歩目を踏み出す」** で「コードを書かない」という一歩を踏み出してみました。
すると「困ったら自分が書く」という選択肢が取れなくなり、**「困った」状況を作り出さないために根本的なところに手を入れるしか手段がなくなり**、やるべきことが見えてきました。
:::

:::note
「やらないことを決める」や「困ったを作らない」ためには、**「Fail Fast, Learn Fast / 早く失敗し、早く学ぶ」** の精神で、とにかく早く失敗を見つける必要がありました。
それらを検知できるデータをとにかく可視化して、自動的にアラートが発見できるようにしたり、失敗を見つけたときにどのように対処するか？などフロー整備もする必要がありました。
:::

# まとめ
以上のようなことを日々実践し、組織づくりに励んでいます。

常に変化していく時代で、さらに、新しいことを生み出し、価値を継続的に提供し続けるためには、変化し続けられる組織であることは不可欠だと考えています。

そして、変化するということは決して苦しいことではなく、飽きずにワクワクしながら過ごすことができるかなと。

そのために、**まずはGiveFirstで、自分から自己変革の見本となっていくのはどうでしょうか！**

ここまで読んで頂いてありがとうございました！
自分の考えを整理する良い機会になったなと思っています。
RecyclerViewでConcatAdapter利用におけるonBindViewHolderのposition

# はじめに
RecyclerViewでConcatAdapter利用におけるonBindViewHolderのpositionは何のpositionなのかわかったので自分メモです。
# 結論
ConcatAdapterを使うには複数のAdapterを作るが、それぞれのAdapterの表示位置を返している。
それぞれのAdapterのViewHolderごとにpositionを振っているから当たり前といえば当たり前なんだけども…
ViewModelにObjectじゃなくてpositionを送ってたら、Adapter1のposition-->1を選択してるつもりが全部のAdapterのposition-->1を選択してしまうというミスをしていたから一応メモしておこうかと…
![position.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110765/8a8f825a-9f22-0813-b86f-9f6b35a15502.png)
# Code
```java:ConcatAdapter.java
RecyclerView recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
Adapter1 = new adapter1();
Adapter2 = new adapter2();
Adapter2 = new adapter3();
ConcatAdapter concatAdapter = new ConcatAdapter(adapter1, adapter2, adapter3);
recyclerView.setAdapter(concatAdapter);
```

```java:Adapter[n].java
public class Adapter1 extends RecyclerView.Adapter<ThisDayItemRecyclerViewAdapter.ViewHolder>{
~~省略~~
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Log.i("ここ", String.valueOf(position));
        ~~それぞれのAdapter.javaで 0 から振られる~~
    }
}
~~省略~~

```
Markdown記法の書き方まとめ！Qiitaの記事作成の備忘録

よし！さっそく記事を書くぞ？？？おいおい「Markdown記法」とはなんぞや・・・

今後記事を書くときに困りそうなので備忘録としてMarkdown記法をまとめました。
（自分のコピペ様に作っただけ？うっ・・心の声が・・・）

# 見出し
↑の様に見出しを作ります。#の後ろは半角スペースが必要です。# {文字列}です。 
```text:見出し
# 見出し1
## 見出し2
### 見出し1
```

# コード関連
コードに関する記述です。多分一番よく使いそう。

## コードブロック
コードブロックはソースコードを記述するとき最適です。
    Tabを2個挿入しても作成できます。
 ```html:コードブロック
//サンプル//

 ```<使用言語>:<コードブロック>
↑の ` を3つ並べるとブロックが作成できる(始点と終点に)。
言語にはjavaやhtmlなど言語を挿入
`グレイヴ・アクセント`と呼ぶらしい。
<使用言語>に任意の言語を入力すると自動的に色が変わる。
        Tabボタン二個入れても使える。

    ```          
```

## コードスパン
```text:コードスパン
`test'コードスパン'`の結果です。`'色が付きます。'` ``バッククオート``と呼ぶらしいです。
```
`test'コードスパン'`の結果です。`'色が付きます。'` ``バッククオート``と呼ぶらしいです。


## 展開
```text:展開

<details><summary>展開</summary>

<改行>

     ```rb
折りたたみ（`は左詰め）
     ```
</details>


```

<details><summary>展開</summary>

```rb
折りたたみ
```
</details>


# フォント関連
## 強調・強勢
```text:強調・強勢
_test_ _前後_ に半角スペースを入れます。
*細字* になります。*前後* に半角スペースを入れます。 
**太字** になります。 **前後** に半角スペースを入れます。
```
_test_ _前後_ に半角スペースを入れます。
*細字* になります。*前後* に半角スペースを入れます。 
**太字** になります。 **前後** に半角スペースを入れます。

## 打ち消し線
```text:リスト
~~打ち消し線~~
```
~~打ち消し線~~

## リスト
```text:リスト
<dl>
  <dt>リストA</dt>
  <dd>リストB</dd>
  <dt>リストC</dt>
  <dd>リストC</dd>
</dl>
```
<dl>
  <dt>リストA</dt>
  <dd>リストB</dd>
  <dt>リストC</dt>
  <dd>リストC</dd>
</dl>

```text:引用
> 引用
> **引用**
> > 引用

> 引用
```
> 引用
> **引用**
> > 引用

> 引用

# リンク
## 埋め込み
```text:リンク
[テキスト](URL "https://qiita.com/")
[テキスト]("https://qiita.com/")
```
[テキスト](URL "https://qiita.com/")

[ジャンプなし]("https://qiita.com/")

```text:画像リンク
## タイトルあり
![代替テキスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3028739/profile-images/1670339692 "画像タイトル")

## タイトル無しの
![代替テキスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3028739/profile-images/1670339692)

```
![代替テキスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3028739/profile-images/1670339692 "画像タイトル")

![タイトル無し](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3028739/profile-images/1670339692)

```text:リンクカード
<改行>
https://qiita.com/donnma777
<改行>
```

https://qiita.com/donnma777

# テーブル
## テーブル
```text:テーブル
| 列1 | 列2 | 列3 |
|:-----------|------------:|:------------:|
| A       | ABCD        | ABCDE         |
| B       | BCDE      | FGHIJ       |
| C       | FGHI       |          |
```
  | 列1 | 列2 | 列3 |
|:-----------|------------:|:------------:|
| A       | ABCD        | ABCDE         |
| B       | BCDE      | FGHIJ       |
| C       | FGHI       |          |

## テーブル（html）
```html:テーブル(html)
<table>
  <caption>要素名</caption>
  <thead>
    <tr>
      <th>A</th> <th>B</th>
    </tr>
  </thead>
  <tr>
    <td> テーブル </td> <td>テーブル</td>
  </tr>
  <tr>
    <td> テーブル </td> <td>テーブル</td>
  </tr>
</table>
```
<table>
  <caption>要素名</caption>
  <thead>
    <tr>
      <th>A</th> <th>B</th>
    </tr>
  </thead>
  <tr>
    <td> テーブル </td> <td>テーブル</td>
  </tr>
  <tr>
    <td> テーブル </td> <td>テーブル</td>
  </tr>
</table>

## 警告Box
```
:::note info
infoは省略可能しても大丈夫です
:::

:::note warn
警告

:::

:::note alert
より強い警告
:::
```

:::note info
infoは省略可能しても大丈夫です
:::

:::note warn
警告
:::

:::note alert
警告
:::


# 終わりに
また使用頻度の高いものがあれば記事を編集します。
とりあえずここまで。
ワードプレスに慣れているのでとても見づらく感じる・・・素直にhtml使いたい。うん。
【ハッカソン】参加前に準備すること

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の4日目の記事です。
4日目は、**ハッカソンの参加前に準備すること**について書きます。

::: note warn
ハッカソンによって「事前にどこまで準備して良いか」の**ルール**が異なります
**準備はルールを十分確認した上で行いましょう**
:::

## 一般的なハッカソンのルール
ハッカソンでは**開発**以外の作業は事前に行って問題ないことが多いです！
ハッカソンの**開発期間は短い**ため、事前できること準備はしておきましょう

本日は私がいつも行っている**事前準備**を紹介します！

## 事前準備一覧

### Discordのチャンネル作成
参加申し込みが済んだ後に参加者のみ閲覧可能なチャンネルを作成します
チャネル構成は大体こんな感じ👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/6e634c4b-84c3-1e54-6705-d7466e34628b.png)

必要に応じてチャネルを増やしています

### チームビルディング
初対面の人とハッカソンに参加することもしばしばあります
ハッカソンの本番でコミュニケーションが円滑に取れるよう**チームビルディング**を行います

#### チームビルディングで話す内容
* **自己紹介**
    * 所属する組織や経歴
    * 得意な分野
    * 参加の経緯
    * ハッカソンの個人目標
* **チームの目標**
    * （例）何か一つでもいいので、受賞する
* **大体の役割**
    * 誰がリーダーをやるか
    * フロント・バックの分担

### アイデア出し
アイデア出しはプロダクト開発において非常に重要かつ時間もかかります

アイデア出しの細かい進め方については後日、別記事で書きます

### 提供技術の調査
ハッカソンによっては、**技術サポート**が提供されることがあります
また、提供技術ごとに**賞**が用意されることもあります！
最新技術が提供されることが多く、**良い勉強**になります

提供技術の調査については後日、別記事で書きます

# おわりに
本記事で紹介した**事前準備**以外にも「**こんな準備しているよ！**」ってことがある人は是非**コメント**で教えてください！
go言語の基本のテスト Hello world的な


# Goのテスト入門

TDDをしたいのでテストを書いてみよう。

## 基本のテスト Hello world的なテスト

役に立たないけど、基本的なテスト

ファイル：main.go
```
import "fmt"
// テスト
func isOne(i int) bool {
	if i == 1 {
		return true
	} else {
		return false
	}
}
func main() {

	fmt.Println(isOne(1))
	fmt.Println(isOne(0))

}
```
関数 isOneをテストしたい場合、テストファイルを作成する。ファイル名：main_test.goで作成する。
```
package main

//テスト
import "testing"

var Debug bool = false

func TestIsOne(t *testing.T) {
	i := 1
	if Debug {
		t.Skip("スキップさせる")
	}
	v := IsOne(i)
	if !v {
		t.Errorf("%v != %v", i, 1)
	}
}
```
IsOne関数をテストしたいので、TestIsOneを定義します。引数にtesting.Tパッケージを渡してあげます。
エラーの場合は、t.Errorでエラーを出力します。
エラーがなく処理が終わった場合は、okが出力されます。

テストの実行は以下のように入力します。
`go test`

成功の場合は以下のように出力されます。
```
$ go test -v
=== RUN   TestIsOne
--- PASS: TestIsOne (0.00s)
PASS
ok      goTest  0.232s
```
失敗した場合は以下のように出力されます。
```
$ go test 
--- FAIL: TestIsOne (0.00s)
    main_test.go:15: 0 != 1
FAIL
exit status 1
FAIL    goTest  0.149s
```

## 基本のテストその2 パッケージのテスト

alibというディレクトリを作成して、alib.goファイルを作成する。

```
package alib

func Average(s []int) int {
	total := 0
	for _, i := range s {
		total += i
	}
	return int(total / len(s))
}
```

Average関数をテストしたいので、テストファイルをalibディレクトリに作成する。
ファイル名：alib_test.go

```
package alib

import "testing"

var Debug bool = false

func TestAverage(t *testing.T) {
	if Debug {
		t.Skip("スキップします")
	}

	v := Average([]int{1, 2, 3, 4, 5})
	if v != 3 {
		t.Errorf("%v !~!= %v", v, 3)
	}

}
```

テストを実行します。
`go test ./alib`

```
$ go test ./alib 
ok      goTest/alib     0.386s
```

基本のテストは以上です。
次回は、テスティングフレームワークtestifyを使ってみようと思います。

#### 参考させていただいたサイト
<a href="[https://www.udemy.com/course/golang-webgosql/">【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)</a>
golang初心者にはおすすめの教材です。
【WordPress】ナビゲーションメニューを設定する

# 前回の記事

前回の記事では、ウィジェットの作成する方法を確認しました。

https://qiita.com/raptony110/private/ff53a8d69576bde30d27

今回は、ナビゲーションメニューを設定をしていきます。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# ナビゲーションメニューについて
ナビゲーションメニューとは、ヘッダーやフッターに配置して、訪問者にWebサイトのコンテンツをわかりやすく案内するツールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/1125b2a3-b90f-f0b9-d3fc-d0530785768c.png)

# 設定方法
外観>メニューを開いて、まずメニューのセット名をつけます。
# メニューにタイトルを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/0b3cf014-ba0f-77f5-ab13-b589cd87d57f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/fd56be0f-4a23-6f37-3bdd-a405b7bc9214.png)
メニュー設定を見て分かる通り、固定ページを新規に作成した際に、自動的にナビゲーションメニューに追加することができます。
# メニュー項目を追加する
メニュー構造が決まったら、メニューの中に、どんな項目を追加するかを決めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/0ad580d2-ffdd-e7c7-d0e5-d1021772fc5f.png)
固定ページから表示するページを選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/1d883dc1-815b-2ae5-1f3e-5cdb966f75ed.png)
メニューに追加ボタンを押すと、メニュー構造の中に組み込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/02de7036-80fa-f3d6-582d-097a5ff9e256.png)
カスタムリンクは、任意のURLへリンクを貼ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/da883c6b-0bf2-d50a-c7c3-e9fb63ee28e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/216c847f-53c8-a280-c7f3-e99a7e3f9ab9.png)
このような形で、メニュー構造を確定しました。
この状態で、Webサイトを確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/73bcb3bc-00d6-d37f-442e-3a9d1e91d372.png)
選択したメニュー項目が並んでいることがわかります。

# おわりに
今回の記事で、ナビゲーションメニューを設定しました。ここまで設定できれば、だいぶWebサイトとして形は様になっているはずです。
次回からは、さらに見栄え良く、訪問者が使いやすいサイトにしていく、設定やツールを施していきましょう。
サクラエディタマクロ　指定の文字コード・改行コードで上書保存

ファイルを保存してから、文字コード・改行コード違ったとなったときに
文字コードセット、改行コードだけを変更して上書保存が案外面倒だなと思ったので

「名前を付けて保存」　→　（ファイル名は変更せず同じファイル名で）文字コードセット、改行コードを変更して保存

という上書き保存操作をマクロにした。
一度保存されてファイル名（ファイルパス）が設定されている前提。



使用しているサクラエディタ：
v2.4.1.2849 32bit (tag v2.4.1)

# template（コード変更なし）

指定できる文字コードは、サクラエディタヘルプの「[名前を付けて保存](https://sakura-editor.github.io/help/HLP000021.html)」参照

```js:SK_上書保存_コード変更なし.js
// サクラエディタマクロ  WSH(JScript)
// -----------------------------------
// 編集中ファイルを
//   文字コード：
//   改行コード：
// で上書き保存
// -----------------------------------

var strPath = ExpandParameter("$F");

Editor.FileSaveAs( strPath, -1, 0 );

// -----------------------------------
// FileSaveAs
//   arg2 文字コード
//     -1 変更しない
//      0 SJIS
//      4 UTF-8
//
//   arg3 改行コード
//      0 変更しない
//      1 CRLF(Windows)
//      2 LF(UNIX)
//      3 CR(Mac)

```

# 自分用
## 文字コード：SJIS　改行コード：CRLF
```js:SK_上書保存_SJIS_CRLF.js
// サクラエディタマクロ  WSH(JScript)
// -----------------------------------
// 編集中ファイルを
//   文字コード：SJIS
//   改行コード：CRLF
// で上書き保存する
// -----------------------------------

var strPath = ExpandParameter("$F");

Editor.FileSaveAs( strPath, 0, 1 );

```

## 文字コード：SJIS　改行コード：LF
```js:SK_上書保存_SJIS_LF.js
// サクラエディタマクロ  WSH(JScript)
// -----------------------------------
// 編集中ファイルを
//   文字コード：SJIS
//   改行コード：LF
// で上書き保存する
// -----------------------------------

var strPath = ExpandParameter("$F");

Editor.FileSaveAs( strPath, 0, 2 );

```

## 文字コード：UTF-8　改行コード：CRLF
```js:SK_上書保存_UTF8_CRLF.js
// サクラエディタマクロ  WSH(JScript)
// -----------------------------------
// 編集中ファイルを
//   文字コード：UTF-8
//   改行コード：CRLF
// で上書き保存する
// -----------------------------------

var strPath = ExpandParameter("$F");

Editor.FileSaveAs( strPath, 4, 1 );

```

## 文字コード：UTF-8　改行コード：LF
```js:SK_上書保存_UTF8_LF.js
// サクラエディタマクロ  WSH(JScript)
// -----------------------------------
// 編集中ファイルを
//   文字コード：UTF-8
//   改行コード：LF
// で上書き保存する
// -----------------------------------

var strPath = ExpandParameter("$F");

Editor.FileSaveAs( strPath, 4, 2 );

```
IdentityMap

![export 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/0419f7b6-e22f-3a33-c94b-4309acdc72e9.png)

https://bliki-ja.github.io/pofeaa/IdentityMap/

Identity Map は、同じ行に対応するデータオブジェクトの重複生成を避けるためのパターンです。

SQL によるクエリの評価結果は、行そのものではなく、あくまでその時点でのスナップショットコピーにすぎません。同じ問い合わせを繰り返すと、いくらでも同じものが出てきます。また、同じ SQL 文でも、タイミングが違えば、同一実体だと思っていたものの内容が異なるインスタンスが生まれるかもしれません。

責務分担の複雑な Domain Model では、そのような現象が多発します。取得してメモリ上でデータ内容を変更したあと、それを書き戻すまでに呼び出した別の処理によって、未保存のデータが再取得され、データベースを書き換えていた、といった事故が起きる可能性もあります (しつこいようですが、手続きの詳細をすべて掌握するのは Transaction Script です)。そのため、単純な Active Record が Domain Model として有利になってくるのは、実は、思いのほか短い処理で済む場合だけになってきます。

メモリ上にデータベースをミラーリングするスペースを設け、同じ行に対応するインスタンスは常にひとつになる仕組みを作ると、本物がどれだかわからなくなる問題を解消できます。主キーはユニークで行を一意特定できるので、これを利用すれば、簡単にインデックスを付けることができます。

エンティティの一意性は、Unit Of Work にとって絶対に欠かせない、重要な特性です。Unit Of Work によってトランザクション最適化をする Data Mapper は、必ず Identity Map を持つ必要があります。

Identity Map を設けることで、論理矛盾以外のメリットも得ることができます。複雑なデータ構造の大幅なメモリ節約の効果です。

ある行の集合の各要素について、関連する行を追跡して取得すると、その中には重複するものも出てきます。通常、本の著者は複数の本を執筆しています。愚直に本を起点に関連を辿ると、同じ著者に異なる複数のインスタンスができます。それだけならまだ良いのですが、さらに著者が持つ属性を辿り、その各属性の種別を辿り、と、何層もの構造を読んでいくとどうなるでしょう。データベーステーブルにはユニークな行が 100 ほどしかないのに、メモリ上には何千何万のオブジェクトインスタンスが発生するかもしれません (冗談ではなく本当になります)。そうした重複行を取得するクエリを都度発行するのは、通信量にもデータベースの CPU にも迷惑です。

Identity Map を利用すれば、過去にすでにインスタンス化を済ませたオブジェクトを再利用できます。深い構造を辿った結果を残してあれば、その再取得にかかるコストをいっさい払わなくて済みます。Identity Map 内のインスタンス数は、絶対に、テーブルに実在する行の数を超えません。

情報を要約した Web ページにちょっと付加情報を足そうとしただけで、裏に数千ものクエリが増えてパフォーマンスを劇的に悪化させてしまう現象は、本当によくあります。Data Mapper が目的でなくとも、俗に言われる N + 1 問題を回避するひとつの策として、Identity Map のアイデアは有効です(個別の Lazy Load を繰り返すのではなく一括で Eager Load にするといった方法とはまた別のアプローチとして)。
【WordPress】ウィジェットを設定する

# 前回の記事

前回の記事では、記事や固定ページの編集や削除する方法について確認しました。

https://qiita.com/raptony110/private/1c095f21331a4b20d670

今回は、ウィジェットの設定方法について確認しましょう。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# ウィジェットについて
ウィジェットとは、ブログの左右のカラムに配置する、カレンダーや記事一覧、検索窓のようなパーツを導入できる機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/b1c55da7-6dbc-a3d4-a503-e0c88425e7ae.png)
# ウィジェットを設置する方法
WordPress管理画面の外観>ウィジェットメニューを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/12968b1c-dd53-7180-c039-c106556acad1.png)
このテーマでは、サイドバーと、フッターに3列設定ができるようです。設定できるウィジェットの数や位置は、テーマにより異なります。

追加したい位置の＋ボタンを押して、ウィジェットを追加します。今回は、カテゴリー一覧を表示してみましょう。
＋ボタンを押して、すべて表示ボタンを押すと、追加できるウィジェットが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/1fcca4c5-3aac-673d-f120-d91e1ff8d27d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/7e432bd3-8d46-1182-8b7d-f6dbbd56d2e1.png)
ウィジェットのグループからカテゴリー一覧を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/a91e0d48-0a8e-bd77-caca-994a292ac915.png)
ブロック要素のプロパティ設定を変更することで、表示方法を変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/54ccac28-4ad8-15dd-dc27-48ee67ce00f5.png)
更新ボタンを押すことで、設定を反映します。
サイトを確認して、設定が反映されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/924c5d12-8440-0e11-8301-46b53e227a7a.png)

# おわりに
今回の記事で、ウィジェットの追加することができました。
次回は、ナビゲーションメニューを設定していきます。
AWSでGPU開発環境を簡単に構築できた話

# はじめに
実は最近、初めてAWSで深層学習環境を構築しました。その時の対応メモとして一部残しておきたいと思います。

# Tips
## AMIの選択
UbuntuでPyTorch環境が使える環境が欲しかったのですが、はじめからPyTorchなりTensorFlowなりが動かせるAMIがあるので、うまく探すと楽です。

https://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/what-is-dlami.html

EC2→イメージ→AMIカタログ→クイックスタートAMI、と辿ったのち適応に絞り込むとひっかかります。

## インスタンスタイプの選択
ざっと調べた感じだと、最も安価にNVIDIAのGPUが使えるインスタンスタイプはg4dn.xlargeかなと思われます。

https://aws.amazon.com/jp/ec2/instance-types/g4/

このg4dn.xlargeはNVIDIA T4 GPUが1つ使える環境ですが、Colab無料版と同じGPUのようです。
なので、colabで動かせるレベルのものをAWSで動かしたい場合、まずはこのインスタンスタイプを選ぶと良いかもしれません。

https://gist.github.com/cedrickchee/273cf787f8d998f1ba61a7265b3e1957

## インスタンスタイプの一時変更について
GPUインスタンスはCPUのものに比べて時間単価が高めです。
深層学習の実行時にはGPU環境は必要なものの、その他の環境構築やコーディング時など一時的にGPU環境が無くても良い場合も多いです。
こういった時に、**一時的にCPUインスタンスに切り替えてしまうことで、使用コストを抑えることができます。**
**今回の場合だと、t2.mediumやt2.largeなど一時的に切替して問題なく使用できました。（ただし、あまりに小さいリソースのインスタンス環境にすると立ち上がらないので注意）**

・切替方法
インスタンス→構築したインスタンスを選んで、アクション→インスタンスの設定→インスタンスタイプを変更



## 環境のアクティベート
pytorch環境はcondaで構築されています。sshログイン時にその環境のアクティベート方法が書かれていますが、次のようにします。

```terminal
$ source activate pytorch
```
**condaでpytorchという名前の仮想環境ができています。**
なので、下記のリンクのように**新たに仮想環境を作ったり、複製したりもできます。便利。。**

https://wakatta.xyz/i180/

もちろん既存環境に追加でpip installなどもできます。

## VSCodeでのリモート開発の対応
特別なことはなく、SSH構成ファイルを開いてHost情報を入力して接続すると、自分の端末上のVSCodeでAWS環境へのリモート開発も簡単にできます。

```config
Host hogehoge
    HostName ${インスタンスのIP}
    User ${linuxのユーザ名。今回のデフォルト名だとubuntu}
    ...
　　(その他、port指定やIdenityFile等があるなら適宜設定)
```
開発したpythonコードのリモートデバッグ時は、conda環境(デフォルトでpytorch)ももちろん指定できます。

# 最後に
基本的なことをただ箇条書きしただけで恐縮です。。
それにしてもAWSは簡単に環境ができるので楽で良いですね。
機会があれば、何か追記するかもしれません。
おしまい。
家に誰がいるのか知りたい！

# 1.きっかけ
 　家に誰がいるか分かったらすごく便利だなとふと思ったことが始まり。
距離センサー（HC-SR04）を使ってLINEで通知させてみたかったので、靴があるかないかを判断して通知してくれるところまでを今回は作ってみました。
 　
    
# 2.やりたいこと
#### ★帰宅時と外出時にLINEに通知が欲しい　←今回やること
#### ★誰が帰ってきたか知りたい（個人の識別）
#### ★「おかえり」って言ってくれたら嬉しい


今回は、帰宅時と外出時にLINEに通知が行くようにしてみた。
# 3.配線



引用元：https://sozorablog.com/【raspberry-pi入門】

![超音波距離センサー_ブレッドボード-1024x912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975696/10fcfbc1-076c-47b6-ca08-50742f76645c.png)

###  5Vから3.3Vに変換

RaspberryPiをHC-SR04を接続するには１つ注意点があります。HC-SR04がECHO端子から出力する電圧は5Vですが、ラズパイのGPIOピンは、3.3V用であるため、Echo信号をラズパイがそのまま受けると、GPIOが破損する恐れが…、そこで、抵抗器を用いて分圧します。

↓詳しくはこちらを参考にしてください。
http://make.bcde.jp/5vから3-3vに変換する/


# 4.コード
細かい説明はコメントの通り。


```okaeri.py
#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート
import requests                     #repuestsモジュールのインポート
GPIO.setwarnings(False)             #エラーが出てこないようにするため

#ポート番号の定義
Trig = 27                           #変数"Trig"に27を代入
Echo = 18                           #変数"Echo"に18を代入

#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Trig, GPIO.OUT)          #GPIO27を出力モードに設定
GPIO.setup(Echo, GPIO.IN)           #GPIO18を入力モードに設定

def okaeri(): #帰ってきたとき
    send_line_notify('帰ってきました')


def itterasyai(): #出かけたとき
    send_line_notify('出かけました')


def send_line_notify(notification_message):
    """
    LINEに通知する
    """
    line_notify_token = 'トークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)
    
#HC-SR04で距離を測定する関数
def read_distance():
    GPIO.output(Trig, GPIO.HIGH)            #GPIO27の出力をHigh(3.3V)にする
    time.sleep(0.00001)                     #10μ秒間待つ
    GPIO.output(Trig, GPIO.LOW)             #GPIO27の出力をLow(0V)にする
                   
    while GPIO.input(Echo) == GPIO.LOW:     #GPIO18がLowの時間
        sig_off = time.time()
    while GPIO.input(Echo) == GPIO.HIGH:    #GPIO18がHighの時間
        sig_on = time.time()

    duration = sig_on - sig_off             #GPIO18がHighしている時間を算術
    distance = duration * 34000 / 2         #距離を求める(cm)
    return distance
#連続して値を超音波センサの状態を読み取る
while True:
    try:
        cm = read_distance()                   #HC-SR04で距離を測定する
        print("distance=", int(cm), "cm")  #距離をint型で表示
        if cm > 2 and cm < 15:                #距離が2～15cmの場合
            okaeri()                       #okaeriの実行
            time.sleep(60)                        #1分間待つ
        else:
            itterasyai()                   #itterasyaiの実行
            time.sleep(60)
            
except KeyboardInterrupt:       #Ctrl+Cキーが押された
        GPIO.cleanup()              #GPIOをクリーンアップ
        sys.exit()                  #プログラム終了
```
　
 
# 6.おわりに
やっぱり個人特定はやりたいのでなんかいいアイディアないかな…
Orthoverse∅のコントラクトを解説する

# コントラクトの場所

https://github.com/oho-sugu/OrthoverseZero

リポジトリの`orthoverse-contracts`を参照してください。
以下が、今回作成したコントラクトです。

```
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2022- Suguru Oho <oho.sugu@gmail.com>

pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract PNSRegistry is ERC721Enumerable, Ownable {
  using SafeMath for uint256;
  uint256 initialPrice = 0.01 ether;

  mapping(uint256 => string) private records;

  constructor() ERC721("OrthoverseZero", "ORTZ") {
  }

  function mint(address to, uint256 _spatialCode, string memory _url) public payable virtual {
    require(msg.value == initialPrice, "Not enough ehter");
    // 22bit 
    require(_spatialCode <= 0xFFFFFFFFFFF, "Spatial Code Range exceed");

    records[_spatialCode] = _url;
    _mint(to, _spatialCode);
  }

  function getRecord(uint256 _spatialCode) public view returns(string memory) {
    return records[_spatialCode];
  }

  function changeUrl(uint256 _spatialCode, string memory _url) public virtual {
    require(_exists(_spatialCode));
    require(ownerOf(_spatialCode) == msg.sender);

    records[_spatialCode] = _url;
  }

  function setInitialPrice(uint256 _initialPrice) external onlyOwner {
    initialPrice = _initialPrice;
  }

  function getInitialPrice() external view returns(uint256){
    return initialPrice;
  }

  function withdraw() external onlyOwner {
    require(address(this).balance > 0, "Not enough ether");
    address payable _owner = payable(owner());
    _owner.transfer(address(this).balance);
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return "https://ortv.tech/meta/";
  }
}
```

空間IDとURLの紐付けのために、recordsというマッピングを追加しています。
recordsには、誰でも空間IDを指定して紐付くURLが取得できるgetRecordメソッドと、
オーナーのみURLを変更できるchangeUrlメソッドを追加しました。

また、コントラクトのオーナーがミント価格を変更したりできるようになっています。

`_baseURI`は、NFTのメタデータのためにベースURLを返します。
このURLで、メタデータのJSONを返すWebアプリが動作しています。

もともと、CryptoZombiesを参考にもっと量の多いコントラクトコードを書いていたのですが、
改めていろいろ調べたら同じ機能がこれだけで済みました。
OpenZeppelinで用意されている親コントラクトがとてもよくできているのだと思います。

# 感想

実際にEthereumブロックチェーンで動くコントラクトを書いてみて、
一番理解するのが難しかった概念が、ブロックチェーンへの書き込みの性質です。
同時に一番面白いと感じたのもここで、巨大なブロックチェーンのデータベースに誰でもガス代さえ払えば実質永久的にデータを記録できるわけです。
UiPath Studio 2022.10.3 Activity 標準全ツリー(チートシート)（プロセスの対応OS：Windows）

## 注釈
プロセスの対応OSが「Windows」用ですので注意してください。（Windows-レガシ用は[こちら](https://qiita.com/TechPark55/items/df1def4fc128cf73badb)）
UiPath Studio 2022.10.3で取得したActivityツリー（デフォルトのままで追加/削除Activityは無し）です。
モダン使用のツリーですが、クラシック分も後ろの方にあります。
皆さんなりのビューアで見るでしょうし、等倍でなく少し縮小しても内容は判別できますし、少しスクロールして見るのは許容範囲という方もいると思うので、いくつかのサイズを置いておきます。
（下に行くほど横長です。サイズが半端値なのは、できるだけ小さい矩形範囲に納めるためです。）

## ツリー取得時のプロジェクトの依存関係（プロセスの対応OS：Windows）
UiPath.Excel.Activities = 2.16.0
UiPath.Mail.Activities = 1.18.1
UiPath.System.Activities = 22.10.3
UiPath.Testing.Activities = 22.10.0
UiPath.UIAutomation.Activities = 22.10.3

## Activityツリー
2557x1531
![US2022.10.3_Activity_利用可能以降_PadL2_H1531_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/41cd4b1d-1846-6889-2c3f-285e1e730cb9.png)

2816x1384
![US2022.10.3_Activity_利用可能以降_PadL2_H1384_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/9d9649fe-b8b7-6395-9070-fdb08ec2fcc1.png)

3099x1245
![US2022.10.3_Activity_利用可能以降_PadL2_H1245_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/28eb446a-f1d0-7e9c-8780-04827befcbe7.png)

3333x1147
![US2022.10.3_Activity_利用可能以降_PadL2_H1147_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/8f96e5dd-cf6a-54d3-01a2-ae7908c06307.png)

3565x1053
![US2022.10.3_Activity_利用可能以降_PadL2_H1053_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/dcf46a02-b25e-c711-8960-872e43dd68ac.png)

## 旧バージョンとの差異
プロセスの対応OSがWindowsでの旧ツリーを取得していませんでしたので、旧バージョンとの差異はありません。
また、レガシと非レガシのツリー画像比較をしてみましたが、微妙に全体の色値が異なっているため比較できませんでした。
1bitでもRGB値が異なると異判定となるので、背景色が変わるなどすると比較できないんですよね。
（こういう変えなくてもいいところが変わっていると萎えるんですよね。Activityのプロパティの項目や内部処理の整合性はとれているのかとか余計な心配をしなくてはいけなくなるんで）
左上部分のヒストグラムを並べてみたのがこちら。微妙に色値が違う。
![LとWの左上ヒストグラム比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/3dfa112d-fb09-e5b5-0cbf-82c7c7cd519e.png)
paizaラーニング「二次元配列の入力 1 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__2dmatrix_input_step1
#### 私の解答
```Python3
li = [[1, 3, 5, 7], [8, 1, 3, 8]]
for i in range(len(li)):
    print(*li[i])
```
@WolfMoon先生の模範解答を参考にさせていただきました。
ありがとうございます。
#### 解答例
```Python3
li = [[1, 3, 5, 7], [8, 1, 3, 8]]
for i in range(len(li)):
    for j in range(len(li[i])):
        print(li[i][j], end="")

        if j < len(li[i]) - 1:
            print(end=" ")
        else:
            print()
```
Private Link

●Private Link
さまざまなリソース間のプライベート接続を提供する。
仮想ネットワークからAzure PaaSサービス、あるいはAzure上で運用している自社の業務システムなどへのプライベート接続を行うためのプライベートエンドポイントを構成できる。

●サービスエンドポイントとPrivate Linkの特徴違い
・サービスエンドポイント
サービスエンドポイントを設定したリソースのIPアドレスは公的にルーティング可能なIPアドレス（パブリックIPアドレス）から変わることなく、ルートテーブルの変更とサービスごとのファーアウォール設定によって実現される。

Private Link
Private Linkのプライベートエンドポイントを作成すると、プライベートエンドポイント用のネットワークインターフェイスが作成され、このネットワークインターフェイスにプライベートIPアドレスが割り当てられる。そして、プライベートエンドポイントにストレージアカウントなどのリソースをマップすることによって、リソースへの直接アクセスを実現する。

●Private Linkの利点
サービスエンドポイントとは異なる利点がある。

・グローバルな展開
他のリージョンで実行されるサービスへのプライベート接続が可能。

・様々なネットワークから使用可能
ピアリングされた他の仮想ネットワークからも、Private Linkのプライベートエンドポイントを介してリソースにアクセスできる。
また、ExpressRouteやVPNトンネルで接続されたオンプレミスネットワークからも、Private Linkのプライベートエンドポイントを介してリソースにアクセスできる。
TD4で337拍子

[CPUの創りかた TD4](http://xyama.sakura.ne.jp/hp/4bitCPU_TD4.html) に掲載されている「TD4 改」用のプログラムとして「[３-３-７拍子・プログラム](http://xyama.sakura.ne.jp/hp/4bitCPU_TD4.html#program2)」が掲載されていることから着想を得て、本家TD4で実行できる337拍子のプログラムを考えた。

# プログラム

```
位置 機械語   アセンブリ言語
--------------------------------
0    00111101 FIRST: MOV A, 1101
1    10111000 THREE: OUT 1000
2    10110000        OUT 0000
3    00000001        ADD A, 0001
4    11100001        JNC THREE
5    01011000        ADD B, 1000
6    11100000        JNC FIRST
7    00111001        MOV A, 1001
8    10111000 SEVEN: OUT 1000
9    10110000        OUT 0000
A    00000001        ADD A, 0001
B    11101000        JNC SEVEN
C    00000000        ADD A, 0000
D    11110000        JMP FIRST
```

Aレジスタを用いて、連続で音を鳴らす回数を制御している。
Bレジスタを用いて、「音を3回鳴らす処理を2回繰り返す」を実現している。
繰り返しまたはTHREEとSEVENの間の移動の時間を、連続で音を鳴らす間の時間として活用している。

Q. あれ？「TD4 改」のプログラムと似てね？
A. パクった覚えは無い。自由度が少ない中似たようなことをしたら、そりゃあ似たようなプログラムになるんじゃね？

# 実行結果

この動画では、[TD４の命令を実行できる自作CPU「Kageki」](https://elchika.com/article/9ac9fd67-86c5-4b1b-a355-4f662e8af794/)を用い、
出力ポートの最上位ビットに [2-way Buzzer Board](https://elchika.com/article/c55891ed-5a5f-4355-bf36-8a9f5ca6cd37/#h_2-way%20Buzzer%20Board) を接続して音を出している。
Kageki 固有の性質は用いていないため、本家TD4でも実行できると考えられる。

<iframe width="560" height="315" src="https://www.youtube.com/embed/A7PGTT7a5JU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
「Docker」関連ワード多すぎ問題

「Docker」について調べていく中で、Docker〇〇というワードが多すぎて混乱してたので見かけたやつ片っ端からまとめます。
適当に調べて適当に書いてる節があるので鵜呑みにしないでください。

### Docker
>Docker（ドッカー[4]）は、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである[5]。
https://ja.wikipedia.org/wiki/Docker

vagrantみたいな仮想環境構築ツール。
「DockerFile」というファイルで環境の管理を行う。
VMとかと比べて軽いらしい。

### Dockerコンテナ
仮想環境の実態。複数立ち上げて複数サービスからなるアプリを再現したりできる。
下記の「Dockerイメージ」をもとに作成する。

### Dockerイメージ
「Dockerコンテナ」の設計図。
下記の「DDockerFile」をもとに作成する。

### DockerFile
Dockerコンテナ内の仮想環境の情報（Dockerイメージ）を記載するファイル。
このDockerFileの内容をもとに仮想環境を作成するため、DockerFileを共有すればどんなPCでも同じ環境が用意できるとかいう優れもの。
例えばPHPのバージョンだけ変えた別環境を作りたいってなったとき、DockerFile内のPHPバージョンの指定だけ変えればすぐ作れたりする。


### Boot2Docker
PCにDockerを使える環境を用意するためのツールその1。
その昔Macが主流だったDocker技術をwindowsでも使いやすいようにしたものらしい。（適当に書いてます）

Docker関連の技術としては古いので、ほぼ絶滅。


### DockerToolBox
PCにDockerを使える環境を用意するためのツールその2。Boot2Dockerの後継として2015年に登場したらしい。
>Toolbox には以下の Docker ツールが入っています。
>Docker Machine を操作する docker-machine コマンド
>Docker Engine を操作する docker コマンド
>Docker Compose を操作する docker-compose コマンド
>Docker GUI である Kitematic
>シェルに接続できる Docker コマンドライン環境
>Oracle VirtualBox
>https://docs.docker.jp/toolbox/overview.html

Docker関連のコマンドがたくさん使えるようになるのでツールボックス。
VirtualBoxを介して仮想環境を生成する。
Docker関連の技術としては古いので、ほぼ絶滅。


### docker-machine
DockerToolBoxによって使えるようになるコマンドその1。
Dockerエンジンが搭載されたVMを起動する。

かつてはdockerはlinuxのものだったので、linux以外で使う場合はVM上にlinux環境を用意し、その上にdockerデーモンを乗せて実行するという手法をとっていた。
現在は後述するDocker Desktopなど、dockerがlinux以外でも使えるように進化していったので、最近はほぼ見かけない。


### dockerデーモン
人間様からの命令でdockerコンテナやイメージを作成したり起動したりする悪魔。
dockerがインストールされたマシンに住んでいて、docker系コマンドをエネルギーとする。


### docker-compose
DockerToolBoxによって使えるようになるコマンドその2。
下記の「Docker Compose」を実行する。
こちらはdocker-machineと違って最近もよく見かける。


### Docker Compose
アプリケーション内の複数のコンテナを同時に立ち上げられるツール。
「docker-compose.yml」というファイルでコンテナ情報の管理を行う。
WEBサーバ用とかDB用とか用途別にコンテナを組む場合に使われるので、docker-machineと違ってよく見かける。


### docker-compose.yml
docker-composeコマンドで参照されるファイル。
コマンドで立ち上がる各コンテナの情報が記載されている。
コンテナ情報（Dockerイメージ）を生成するのがDockerFileで、そのイメージをもとにコンテナを同時に生成するのがdocker-compose。


### Docker Desktop
PCにDockerを使える環境を用意するためのツールその3。
最近、一定の従業員数を超える企業で使う場合ライセンス料が必要になった。
（ので、WSL2とubuntuを使ってDockerを使う動きがあるらしい）
2022年現在、個人でDockerを使う場合はこれ一択。


### Docker Desktop for Windows
Windows向けの「Docker Desktop」のこと。
公式ドキュメントからして混同してるから正直ややこしい（自分だけ？）


### Docker for Windows
Windows向けの「Docker Desktop」のこと。略すな


### Docker Desktop for Mac
Mac向けの「Docker Desktop」のこと。


### Docker for Mac
Mac向けの「Docker Desktop」のこと。略すな
【ハッカソン】メンバー集め方

# はじめに
この記事は[**ハッカソン Advent Calendar 2022**](https://qiita.com/advent-calendar/2022/hackathon)の3日目の記事です。
3日目は、**ハッカソンのメンバー集め**について書きます。

# ぼっちそんは辛い
ハッカソンは基本的に**数名のチーム**を組んで参加します
**個人的な好み**ではありますが、**最低3人**はメンバーを集めたいです
しかし、自分の身近な人がハッカソンに興味がない場合、メンバー集めに苦労します😖

今回は、メンバー集めに苦労している方にどのように**メンバー集め**の方法を紹介します！

## メンバーの集め方
**3つ**紹介します


### 仲の良い人に声をかける
まずは、仲の良い人に声をかけてみましょう！
ハッカソンに興味がない人もぜひ誘ってみてください
**ハッカソンの魅力はたくさんあります！**

https://qiita.com/rapirapi/items/a7c83a103d9145ab03c6

### 運営にお願いする
ハッカソン運営へ**事前に**お願いしましょう！
私も初めてハッカソンに出たときは運営の人に事前にお願いしてチームを組みました

### SNS等で募集してみる
**Twitter**や**Facebook**などで募集してみましょう！

# おわりに
本記事で紹介した集め方以外にも「**こんな集め方があるよ！**」って人は是非**コメント**で教えてください！
切れて困った話

謎のアドベントカレンダー、第 9 話です。

ここまでネットワークの話ばかりだったので「ネットワークの接続が切れた話か？」と思いきや、証明書の有効期限の話です。

## ある年の入社式の朝

その年、筆者は前年からの体調不良を悪化させて 1 ヶ月ほど休職しており、入社式の日は休職明け間もないタイミングでした。

まだ体調は良くならないまま（結局それから 7 年以上不調は続きました）、会社ではなく直接入社式の会場に向かい、現地に着いたところ、後輩にあたる情シスメンバーから

- 多くの社員がグループウェアにログインできなくなっている
- ユーザーの証明書の有効期限が一斉に切れたらしい
- 式が終わって帰ったら対応しないといけない

という話を聞きました。

（この時点で、勘が良い方は何のグループウェアなのかお分かりでしょう）

「帰ってから対応の準備を始めたのでは遅い」のが直感でわかりました。

ところが、当時の情シス責任者だった筆者の元上司を探しても見つかりません。

仕方がないので、同僚に伝言を頼んで、その後輩情シスメンバーとタクシーで急いで会社に向かいました。

数年前から所属としては情シスを外れていて、当時情シスの仕事は手伝う立場だったのですが、ほかに対応できそうな人が見当たらないのでやむなし、です。

## 社員が帰ってくる前に

以前、先輩情シスメンバーが同じトラブルに遭遇していたのを覚えていたので、その時の報告書とグループウェアのヘルプ文書を探し出しました。

そして、社員が帰ってきたタイミングで各部署のビル・フロアに連絡を行い、証明書更新申請の方法を周知しました。

結果として、該当社員のほとんどについて、その日のうちに証明書を更新してトラブルは収束しました。

## 残念な余談

その年、筆者の会社は創業○○周年で、その入社式の会場で全社員の集合写真を撮影して、後日マグカップに印刷して全社員に配ったのですが、当然筆者と後輩情シスメンバーはそこに写っていません。

（まあ体調不良の中、集合させられて何分も立たされるほうが辛そうなので結果的に良かったんですけど）

## 証明書といえば…

全く別の話ですが、Windows で EFS（暗号化）がサポートされたので一部で使っていたところ、証明書の更新のタイミングでトラブルが発生し復号に支障が生じたことがありました。

セキュリティにおいて機密性はもちろん大事ですが、機密性ばかり気にして可用性を軽く見てはダメですね。

あいたたた。

---

10 日目の記事に続きます。

- **[切れたけどキレなかった話](https://qiita.com/hmatsu47/items/ded16338d9b10409ac0c)**

https://qiita.com/hmatsu47/items/ded16338d9b10409ac0c
paizaラーニング「i 行目 j 列目の出力 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__2dmatrix_output_step6
#### 私の解答
```Python3
li = [[1, 2, 3], [8, 1, 3], [10, 100, 1]]
print(li[1][2])
```
解答例と全く同じになりました！！
#### 解答例
```Python3
li = [[1, 2, 3], [8, 1, 3], [10, 100, 1]]
print(li[1][2])
```
ダイアログ内でCLEditorが使えないときの対処法

# (そもそも)CLEditorとは
* jQueryで使えるリッチエデイタ
* Ctrl+Vで画像の挿入も可能
* ~~割と古いライブラリであり、しかもググっても参考記事があまり出てこない~~
https://premiumsoftware.net/cleditor/
* ちょっとでも書き方がおかしいと、途端に無効化されてtextareaに変わってしまう。
* JSエラーを出さずに無効化されることがあるため、原因調査が困難
# 環境
* PHP
* Zend Framework1

## まず、view側にjavascriptにてCLEditorを定義
- ダイアログ内での表示・非表示はcssで効かせるため、CLEditorにcssが効くようにする
```Javascript
<script type="text/javascript">
    var hogeEditor = null;
    $(function () {
        var $content = $("#dialog")
        hogeEditor = $content.cleditor({
            width: 750, //入力枠の横幅
            height: 300, //入力枠の縦
            useCSS: true, // cssを効かせるため、trueにする
            controls: // ここは最低一つ何か入れないとCLEditorが無効になるため、不要でも入れる
                "bold"
        });
    });
</script>
```

## しかしこれだけでは効かない。controller側に下記を書く
```php
    public function fugaAction()
    {
        // 下記2行はCLEditorをダイアログ上で実行する上で必要
        $options = ['layout' => 'mylayout', 'layoutPath' => {commonモジュールまでのパス}.'/views/layouts'];
        Zend_Layout::startMvc($options);
    {
```

あとはview側でcssを効かせて書くだけ。
Macの文頭が自動的に大文字になるのをOFFにする

システム環境設定＞「キーボード」の「ユーザ辞書」タブを確認します。
「文頭を自動的に大文字にする」のチェックが入っている場合は、チェックを外すことで文頭の文字が小文字で入力されます。
UiPath Studio 2022.10.3 Activity 標準全ツリー(チートシート)と、2022.4.3との差異（Windows-レガシ）

## 注釈
プロセスの対応OSが「Windows-レガシ」用ですので注意してください。（Windows用は[こちら](https://qiita.com/TechPark55/items/c1b0b352f030b961fa5b)）
UiPath Studio 2022.10.3で取得したActivityツリー（デフォルトのままで追加/削除Activityは無し）です。
モダン使用のツリーですが、クラシック分も後ろの方にあります。
皆さんなりのビューアで見るでしょうし、等倍でなく少し縮小しても内容は判別できますし、少しスクロールして見るのは許容範囲という方もいると思うので、いくつかのサイズを置いておきます。
（下に行くほど横長です。サイズが半端値なのは、できるだけ小さい矩形範囲に納めるためです。）

## ツリー取得時のプロジェクトの依存関係（Windows - レガシ）
UiPath.Excel.Activities = 2.16.0
UiPath.Mail.Activities = 1.18.1
UiPath.System.Activities = 22.10.3
UiPath.Testing.Activities = 22.10.0　　← 標準で追加されました
UiPath.UIAutomation.Activities = 22.10.3

## Activityツリー
2582x1530
![US2022.10.3_Activity_利用可能以降_PadL2_H1530_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/3b43a5fc-2014-f27d-6360-53e8ff1feef9.png)

2877x1384
![US2022.10.3_Activity_利用可能以降_PadL2_H1384_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/b1f097a2-4df0-f9fd-5f7b-49c8658b8098.png)

3106x1245
![US2022.10.3_Activity_利用可能以降_PadL2_H1245_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/5bd8287b-2757-826d-80a0-7c12f38d8e7c.png)

3343x1146
![US2022.10.3_Activity_利用可能以降_PadL2_H1146_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/78bbdcb2-0559-32ad-df69-5dc8a10116f9.png)

3619x1053
![US2022.10.3_Activity_利用可能以降_PadL2_H1053_Pad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/06f3027d-6e44-8ae1-3c6e-d0d0955383fc.png)

## 2022.4.3と2022.10.3の差異
左が2022.4.3、右2022.10.3で差異を抜き出しています。差異はあくまで「絵的に」見た目の差であり、機能の差は表していません。
中央部の赤文字数字、記号は連番と、A:追加、D:削除、U:更新を表しています。（連番はこの説明をわかりやすく書くために付加）
例えば、8Uであれば日本語訳が変わっています（アイコンが変わっているだけの場合もあります（例:3U等））。
Activityツリーの並び位置が同じ場合U:更新判定となっていますが、日本語訳変更で並びが変わってしまった場合、D:削除とA:追加となる場合もあります（例:9Aと10D等）。
ここに出ていない部分は（自作比較アプリにバグがなければ）一致しているはずです。（コンペアという題材で本一冊書けるとか）
![差異_4.3比.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/a197648c-974f-9afc-b061-b769d047ee65.png)

## 2022.4.3と2022.10.3の差異記号が付加されたActivityツリー
3619x1053のみ
![US2022.10.3_Activity_利用可能以降_PadL2_差異_H1053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456318/52722bfb-3139-6a04-b95f-3a3cf4a2f9b2.png)
Unrecognized Android Studioから始まった連続エラー解決への道

# はじめに
Androidアプリをビルドできなくなり、そこから「1つ解決するとまだ別のエラーが発生」するような状態になってしまいました。。。

その過程をせっかくなんでまとめてみました。

# Android Studioをアップグレード
　久々にAndroidアプリをビルドしてみると👇のようなエラーに遭遇しました。

```console
Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version '202.7660.26.42.7486908', please retry with version 2021.2.1 or newer.
```

Android Studioのバージョンを下げるか最新にしろという事ですね。

https://developer.android.com/studio/intro/update?hl=ja

なぜか` [Android Studio]>[Preferences]>[Appearance & Behavior]>[System Settings]>[Updates]`からIDEのアップデートができなかったので、公式から新たにダウロードすることに。
![Screen Shot 2022-12-04 at 13.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ff0ab4a6-3de4-f69f-3a36-df1f45266a45.png)

ダウンロードして置き換えて完了しました。

するとまた別のエラーが・・

# Javaのバージョンを変更する
次はこんなエラーでビルド失敗しました。

```console
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
     Your current JDK is located in  /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre
     You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
```

どうやらGradleがJava11を求めているのに、現在使っているJavaが1.8なので不整合だということらしい。
そして解決策が3つ提示されており、とりあえず１番上の`changing the IDE settings.`を試してみることに。

![Screen Shot 2022-11-29 at 21.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/47b75bfa-5742-af8b-2374-c5f3aff20c16.png)
![Screen Shot 2022-12-03 at 18.45.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/c827b3bd-bcc6-2e64-b989-4fef68c8cc36.png)

Android Studioに同伴されているもの？を選択。
とりあえず私はこれで動きました。:sweat_smile:
（これについては色々な情報が飛び交っているので私と同じパターンでうまくいくとは限らないです。。）

こんなパターンもありました。

https://halzoblog.com/error-bug-diary/20220917-2/

# 見つからないメソッドを削除

次は👇のようなエラーに遭遇しました。

```console
A problem occurred evaluating project ':app'.
> Could not find method v５fapply() for arguments [{plugin=com.android.application}] on project ':app' of type org.gradle.api.Project.
```

`v５fapply()`が何か調べたのですがあまり情報が出てきませんでした:frowning2:

```gradle:app/build.gradle
// 変更前
v５fapply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

// 変更後
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
```

とりあえずこれでエラー消えました！

**そしてついにビルド成功しました**:relaxed: