OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのincludeを理解したい① 

#書くこと
Rubyのincludeについて、メソッド探索について学んだ結果見えた事実
こちらの記事を参考にさせていただきました。ありがとうございました。

[【ruby】 メソッド探索から見る、モジュール・特異メソッド・特異クラス](https://at-grandpa.hatenablog.jp/entry/2016/02/14/090544)

自分なりに、こちらの記事を設計図と車で喩え直してみました。

(こちらの記事は、２部構成になっているうちの、第一部です。)
次の記事はこちら→

##クラスとインスタンス
本題は、Rubyのincludeについてですが、この記事では後に理解がしやすくなるようにクラスとインスタンス、それに伴う変数とメソッドについて掘り下げていきます。

Rubyには、クラスとインスタンスと言う概念があります。
車を作る時で考えてみましょう。

####- クラスは、設計図です。
####- インスタンスは、その設計図をもとに作られた実際の車です。

もう少し理解してみましょう。クラスとインスタンスには、それぞれメソッドなるものが存在します。

####- クラスメソッドは、設計図全体に適応される共通オプションです。

手引書のルールみたいなもんですね

####- インスタンスメソッドは、それぞれの車の特徴・動作などをそれぞれに付け加えます。

車は「走る」、あの車は「赤い」などと言ったことを表します。

```example.rb
class Car   #クラス
  def color   #インスタンスメソッド
    @color = red   #@colorはインスタンス変数と呼ばれます。@colorには、redが代入されています。
  end
end

model_car = Car.new   #Carクラスのインスタンスを生成し、model_carに代入しています。
model_car.color   #Carクラスで定義されているcolorと言うインスタンスメソッドを、直前で生成したmodel_carインスタンスにかけています。
```

はい、ここまでは、多少Rubyについて勉強している方であれば、理解いただけたと思います。
わからない人も、ふーんと思いながら聞き進めてください。

##本当に設計図と車の関係？
さて、ここから少しずつ、僕がなるほどなるほどと納得し直した部分に入っていきます。

まずは、先ほどのクラスとメソッドの関係性について
おさらいすると
>####クラスは、設計図です。
####インスタンスは、その設計図をもとに作られた実際の車です。

と端的に書きました。

設計図と車の関係であれば
「設計図通りの色や大きさ、エンジンなどの特徴・部品で車が作られる」
つまり、**設計図に書いてある内容を、それぞれの車が持つことになります。**

しかし、クラスとインスタンスの関係は、少し違うようなのです。
どのように違うのでしょうか？

##実は常に「参照」している
結論から述べると
特徴や動作を**「持つ」**のではなく、一回一回、設計図を**「参照しながら」**車は、動いているのです。

ちょっとイメージが湧きにくいかと思いますので、先ほどのコードをもとに考えてみましょう。

```example.rb
class Car #Carクラスという設計図には、
  def color #colorでredを呼び出せるインスタンスメソッドが存在します。
    @color = red                           
  end
end

model_car = Car.new                        #1
model_car.color #ここで、colorを呼び出しています。 #2
```

**ここからが、最も大切な部分ですので、注意して読んでみてください。**

まず、ここで何が起きているか順を追って説明します。

1. model_car変数に、Carクラスのインスタンスが代入されます
2. model_carインスタンスに、colorインスタンスメソッドを呼び出します。その結果、model_carオブジェクトはインスタンス変数の`@color`を持つことになります。

今の説明から、model_carと言う箱の中に、`@color`があるということをイメージできるでしょうか。
しかし、その箱の中には、colorというインスタンスメソッドは存在しません。

つまり、**オブジェクトは`@color`と言うインスタンス変数を持つことができるけど、colorというメソッドを持つことができない。**という結論になります。

そうすると、クラスがインスタンスメソッドを持つことになり、インスタンスはクラスのメソッドを常に参照することになりそうです。

まとめると

>オブジェクトは インスタンス変数 と クラスへの参照 を持つ
クラスは インスタンスメソッド を持つ

と言うことができます。

##No Method Errorが起きてしまうわけ
もう少しだけ話を膨らませます。
もし、このクラス（設計図）に、言及がないメソッドが呼び出されたらどうでしょうか？

```example.rb
class Car             #Carクラスには、wheelメソッドは存在しません。
  def color 
    @color = red                           
  end
end

model_car = Car.new                        
model_car.wheel        #wheelを参照しようとしています
#→No Method Error
```

このような状態で、No Method Errorが発生します。
このエラーが意味するところは

*「そんな特徴は、設計図に書いてねーよ！」*
ということです。次につながる話ですので、もう少し補足すると

*「この設計図には書いてないから、この設計図の元になったものを追ってみよう。」*
と判断させることもできます。

このことについては、次の記事で触れたいと思います。

## 最後に
最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ！」というご意見、「そこどうなっているの？」というご質問など、お待ちしております。

##参考文献
[【ruby】 メソッド探索から見る、モジュール・特異メソッド・特異クラス](https://at-grandpa.hatenablog.jp/entry/2016/02/14/090544)
chromeのDeveloperToolsでダークモードへ切り替える


chromeのDeveloperToolsを立ち上げ、 `command + shift + P` でコマンドラインツールを開く。
`color-` と入力すると `Rendering Emulate CSS preferes color-schema: dark` と出てくるので選択する。

![スクリーンショット 2021-03-02 8.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341725/89ab37dd-f970-8501-785c-f1221f3b06d5.png)

darkモードに切り替わる。

![スクリーンショット 2021-03-02 8.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341725/ea7ef723-cc43-3019-d33c-c3722942dff9.png)
pyppeteerを使ってみた【着手したとこ】

#基本１(id要素のtextcontent取得)

```py
async def main():
    browser = await launch()
    page = await browser.newPage() #(a)

    await page.goto('https://sisterroom.stchan130.com/')

    hosoku = await page.querySelector('#hosoku')
    print(hosoku_ihtml)

    await browser.close()  # ブラウザーを終了する。

if __name__ == '__main__':
    asyncio.run(main())
```

#基本２(ブラウザにchromeを使う&ブラウザを表示する)
```py
    #(a)を下記に変更する
    browser = await launch({"headless":False,
                            "executablePath":'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'})
```



#参考
[Pyppeteerを使ってみる](https://zenn.dev/shotakaha/articles/5885cac71af6dc966e97)
[Puppeteer (Chrome の自動操作ライブラリ) を Python に移植してpyppeteerという名前で公開しました](https://miyakogi.github.io/blog/20170902/pyppeteer.html#.YEV1bWgzZaQ)
[Pythonでスクレイピング - Seleniumなんてもう古い！？・・・Pyppeteerの使い方](https://qiita.com/loach/items/c881f7d9ef5add132c7b)
書籍『Pythonクローリング＆スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド』
AWSにWindowsServer2016（E）→（J）にする

AWSで標準で提供されるパッケージは英語版のWindowsなので新規で構築する場合、日本語化のために必須になる手順は以下の４つだった。またいつか検証して足りなければ追加する。
１、日本語言語パックをインストールしロケールなどを日本語にする。
　　　　　　　　　　→「接続する」を実行するとAdministratorのパスワードが要求される
２、キーボードがUS101/102なので109キーボードに変更する
　　　　　　　　　　→￥とか出せないのでこれは必ずやらないといけない
３、不要なサービスを「自動」から「手動」に切り替え
　　　　　　　　　　→GoogleMapなど手動でいいのに自動で落ちて警告が出るので「手動」にする
４、Windowsの標準FWで80/443のTCPを開放する。発信、受信とも必須
　　　　　　　　　　→AWSの場合、これを開けてもAWSのFWがあるのでこれでブロックするようにする

消えたAWS壁紙の復活方法
※このPowerShellはWindowsPowerShell for AWSを利用すること！
https://komakoma.info/2020/05/09/aws-ec2-windows%E3%81%A7%E5%A3%81%E7%B4%99%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8F/
Qiita Daily Survey memo 2021.03.02

# Qiita Daily Survey memo 2021.03.02
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [続・マクドナルドで一日分の栄養を取れる組み合わせを計算したらさらに衝撃の結果に](https://qiita.com/takobaya391076/items/2fd0202939c8337fcadc)
takobaya391076 さんの記事。
前回の大変人気だった記事[マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果に](https://qiita.com/takobaya391076/items/49b15c1fa36734b3fa53)の続編です。
前回の覇者である項目を禁止し、さらに炭水化物の量を減らした状態で、マックで1日に必要な量を摂取するには…という記事です。
いただいたコメント欄にありました「線形計画法、これを探してたんだ。アセットマネジメントに使えそう」に激しく同意で、絶対に使えるシーンがあるだろうなーと思いました。
加えて、純粋に記事の書き方や言葉選びが面白く、読み物としてもとても優れた記事です。
おすすめです。


## [ブラックジャックを完璧にプレーイングするPythonプログラムを組んで、儲けることができるか検証した結果](https://qiita.com/KODIO/items/ba35c5a73bda1c3d0173)
KODIO さんの記事。
タイトルの通りの記事になります。
山札の考慮やカウンティングを使わず、その1回限りの勝負に限って最前手を指した場合、儲かるのか！？という記事になります。
結果は記事をご参照くださいませ！
コードを組み始める背景も書かれていたり、所持金の推移がグラフで書かれていたりと、読みやすい記事でした。
また、記事の最初に「Pythonの脱初心者の意味合いを含めて」とある通り、うまくいけば儲かるかも！はモチベーションになりやすそうだなーと思いました。
チャレンジしてみるのも面白いかもです。


## [社内でビブリオバトルを開催してみた ! (みんなでワイワイ本紹介をやるなら必見 !)](https://qiita.com/yoshii0110/items/66f0dab84d7b83ddf84d)
Yoshitaka KOITABASHI(yoshii0110) さんの記事。
ビブリオバトルとは、というところから、実際にやってみた感想などを書かれている記事です。
プレゼン合戦みたいなイメージで自分のおすすめ本を紹介する…といった内容になります。
コロナの現状、リアルで会って開催するのは難しいですが、オンラインでも十分盛り上がりそうだなと感じました。
また、自分はVR機器があり、VRの中でやったら盛り上がりそうだなと感じました。
友達に提案してみようかなと思います！
何かを新しく学習するときに、その分野をちょっと知っている人が3分*5人とかでビブリオバトルしてくれたら、それだけで初心者の方はフローが見えると思いますし、本も売れますし、プレゼン側の人も勉強になるだろうし、自分の好きが勧められて楽しいでしょうし、幸せの多いアプローチだと感じました！


## [リモートワークのいま学びたい、GitLab Handbookと徹底した文書化への狂気](https://qiita.com/e99h2121/items/ea5822922d83d00ebc4a)
Nobuko YAMADA(e99h2121) さんの記事。
Daily の一番下にあった記事ですが、興味を引いたのでざっと読んでみたら、すごく読みやすく面白く、今の自分の課題に刺さっていました。
いい記事ありがとう！と筆者を見たら2週間で3回目ですか！すごいですね！！
こんなに質の高い記事をこんな高頻度で…どうやってサーベイしてるんでしょう？アンテナ力がものすごい…。

GitLab社がリモートワークの中でも生産性高く働けるように、とドキュメント化の文化が高速に発達しているという始まりから、
そのために使っているツールとアプローチを書いてくださっている記事になります。

新しくプロジェクトに参画しましたが、「ReadMeがあると嬉しいなー」や「環境情報が口伝は困るなー」など、さっそくこうだったらいいのになが出てきました。
少しずつお手伝いして生きたと思います。
Git と GitHub の連携

# 勉強の記録
Git と GitHub の連携 3/1
## 勉強した内容
- git と gitHubを同期させた。

## 何をベースに勉強してるか
- [N予備校 プログラミング入門](https://www.nnn.ed.nico/courses/668/chapters/9515)

## 内容の詳細
- Githubで編集した内容をLinuxに呼び出し、更新を習いました

### わかったことについて
- GitHubをパソコン上で呼び出すことができた。
万が一の場合、バックアップがあったら便利だよね！って感じかな

### むずかしかったよ
- 特になし

## 次回やる予定のこと
- 次回もGithubなどなど
【iOS】LiDARセンサーを用いたサンプルコード集を公開しました！

iOSのLiDARセンサーを用いたサンプルコード集をGitHubに公開したので紹介します。
本記事の執筆時点でGitHubで91スターを頂いています！

[TokyoYoshida/ExampleOfiOSLiDAR](https://github.com/TokyoYoshida/ExampleOfiOSLiDAR)
👆よさそうだと思った方はスターをお願いします⭐

例えば、こんなサンプルが入っています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">The GitHub repository of sample code using iOS LiDAR sensors, including 3D scanning, got 40 stars in a day!<br><br>iOSのLiDARセンサーを用いたサンプルコードのGitHubリポジトリが１日で40スターも取った！<br><br>The repository is here.<a href="https://t.co/FHASFV4Zfs">https://t.co/FHASFV4Zfs</a><a href="https://twitter.com/hashtag/iOS?src=hash&amp;ref_src=twsrc%5Etfw">#iOS</a> <a href="https://twitter.com/hashtag/LiDAR?src=hash&amp;ref_src=twsrc%5Etfw">#LiDAR</a> <a href="https://twitter.com/hashtag/AR?src=hash&amp;ref_src=twsrc%5Etfw">#AR</a> <a href="https://twitter.com/hashtag/ARKit?src=hash&amp;ref_src=twsrc%5Etfw">#ARKit</a> <a href="https://t.co/lfCq1T9yBg">pic.twitter.com/lfCq1T9yBg</a></p>&mdash; TokyoYoshida (@jugemjugemjugem) <a href="https://twitter.com/jugemjugemjugem/status/1362599673756753920?ref_src=twsrc%5Etfw">February 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

iPad Pro／iPhone 12 ProにLiDARが搭載されたとき、いつかは現実世界をスキャンしてみたいと思っていたかたもいらっしゃると思いますが、このサンプルを使えば簡単に実現できてしまいます。

### ビルド方法

XCodeでExampleOfiOSLiDAR.xcodeprojを開いてビルドして、iPhone 12 Pro/Pro MAXかLiDARセンサーを搭載したiPad Proにインストールします。

### サンプル一覧

**Depth Map**

深度情報を画像にしたものです。スクリーンショットは静止画ですがリアルタイムに動作します。

<img width="400px" src="https://user-images.githubusercontent.com/16970578/106378330-1ec8bf80-63e7-11eb-8a72-cd3aab0e645b.jpeg">

**Confidence Map**

深度情報の信頼度を画像にしたものです。リアルタイムに動作します。

<img width="400px" src="https://user-images.githubusercontent.com/16970578/106378333-29835480-63e7-11eb-8a0b-13d1742e452b.jpeg">

**Collision**

現実世界に、仮想的なオブジェクトがぶつかったときの判定をします。

<img width="400px" src="https://user-images.githubusercontent.com/16970578/107285075-ff462c80-6aa1-11eb-8423-3186c5599037.gif">

**Export**

現実世界のオブジェクトをスキャンして、.objファイルにエクスポートします。
エクスポートしたファイルはXcode,Macのプレビューなどで閲覧したり、Blenderで編集できます。

<img width="400px" src="https://user-images.githubusercontent.com/16970578/107829530-46e3f580-6dcd-11eb-83f5-267881acf370.gif">
👇
<img width="400px" src="https://user-images.githubusercontent.com/16970578/107829679-94606280-6dcd-11eb-8bbf-c574b9127296.gif">

**Scan with Texture**

現実世界のオブジェクトをカラースキャンします。こちらは、サンプルアプリ内でのみ閲覧できます。

<img width="400px" src="https://user-images.githubusercontent.com/16970578/107994124-53f82300-701f-11eb-9f21-9251382699df.gif">

### 最後に

LiDARセンサーはなかなかおもしろい技術なので、これからも追っていきたいと思っています。作品やサンプルができたら、Twitterで発信していきますのでフォローをお願いします🙏

Twitter
https://twitter.com/jugemjugemjugem

Note こちらはiOS開発、AR、機械学習などについては発信しています。
https://note.com/tokyoyoshida
Google Drive のフォルダの中身をコピーするスクリプト

Google Drive は非常に便利ですが、 フォルダごとコピーすることができません。 
ほかにも、 GSUITE のアカウントのドライブに、 別の Google/GSUITE アカウント で管理しているファイル・フォルダを移すことができません。

## 解決方法

フォルダのコピーはコードを書けばできます。
別のドメインの Google account にファイルを移すことはできませんが、 アクセス権さえあればコピーできます。

フォルダごとコピーできるウェブサイトがありますが、 GSUITE の設定次第では、実行できない場合があります。

そこで、フォルダの中身をコピーするスクリプトを書きました。

## プログラム

```js
function myFunction() {
  // put source folder ID.
  const fromFolder = DriveApp.getFolderById('1234567ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  // put destination folder ID.
  const toFolder = DriveApp.getFolderById('1234567abcdefghijklmnopqrstuvwxyz')
  // copy the folder content recursively.
  copy(fromFolder, toFolder)
}

function copy(fromFolder, toFolder) {
  // copy files
  var files = fromFolder.getFiles()
  while (files.hasNext()) {
    var file = files.next();
    var newFile = file.makeCopy(toFolder)
    newFile.setName(file.getName())
  }

  // copy folders
  var folders = fromFolder.getFolders()
  while (folders.hasNext()) {
    var folder = folders.next()
    var newFolder = toFolder.createFolder(folder.getName())
    copy(folder, newFolder)
  }
}
```

### 解説

これは フォルダのコンテンツのみをコピーするものです。
`A`というフォルダを複製するものではなく、 `A/*` に該当するファイル・フォルダを宛先フォルダにコピーします。

`getFolderById` の引数に、フォルダを表すIDを入れて実行すると中のファイル・フォルダが宛先のフォルダにコピーされます。
フォルダのIDとは、フォルダをブラウザで開いた時に表示される URL (例: `https://drive.google.com/drive/u/0/folders/1bA93FHfmrji2948j24nga24tg5H`) の最後の部分です。

コピーの処理自体は関数 `copy` で行っています。 ファイルをそれぞれコピーし、 フォルダをそれぞれコピーし、 フォルダについてはその中身についてコピーするため再起的に `copy` を呼び出しています。

ファイルのコピーについては `makeCopy` 関数 でコピーするだけでは、 コピー元と違ったファイルになってしまいます。 日本語だと "{original name} のコピー", 英語だと "Copy of {original name}" のように、 コピーされたことを表す文字が付加されてしまいます。 そこで、 `makeCopy` を実行した後で改めて `setName` を使って名前を再設定しています。

### さらに追加できるもの

コピーのログを SpreadSheet に出す、 コピー後にオーナーが自分になっているファイルは消す、 インターフェース(Webページ) を作るなど、 コードを変更することで追加できます。
(私の場合は必要なかったので追加しませんでしたが。)

### その他

フォルダごとコピーしたい場合は `myFunction` を次のように書き換えます。

```js
function myFunction() {
  // put source folder ID.
  const fromFolder = DriveApp.getFolderById('1234567ABCDEFGHIJKLMNOPQRSTUVWXYZ')
  // put destination folder ID.
  const toFolder = DriveApp.getFolderById('1234567abcdefghijklmnopqrstuvwxyz')
  // create new folder
  var newFolder = toFolder.createFolder(folder.getName())
  // copy the folder content recursively.
  copy(fromFolder, newFolder)
}
```
「クローズドウォン」の前に添付を要求する検証ルール

添付ファイルの有無を検証ルールでは扱えないです。確か、アイデアが挙がっていたと思います。

私がやるとしたら、迷わずApex トリガーです。

しかし、そうでない方法で実現している。

う～ん、こっちの方が広く普及するかなぁ。

ちょっと、chatter経由の添付ファイルとトリッキーな方法ですが、ベストアンサーになっている。

忘れないように記録します。

[Validation Rule or other to require attachment before "closed won" opp???](https://trailblazers.salesforce.com/answers?id=9063A000000pF2wQAE)
PowerShell インターフェースもどき実装

PowerShell を実装していて Java のインターフェース的なことをやりたいなと思い実装してみる。
型安全ではないけれど処理の重複は防ぐことができそう。。。
もっと良い方法ありそうだけど簡易的にはできた。。。

例えで処理を try / catch してエラー時の処理を統一してみる。
他にも仕組みを変えればいろいろできる。

``` 
# 処理実行クラス
# 処理を try /catch して実行、エラー処理を catch に書く
class Main {
    [int] $exitErrorCode;
    ExitCode([int]$_exitErrorCode) {
        $this.exitErrorCode = $_exitErrorCode;
    }

    [int] main([Object]$run) {
        try {
            $run.run();
            return 0;
        } catch {
            Write-Host "Error";
            Write-Host "共通的なエラー処理を描くかんじ";
            return $this.exitErrorCode;
        }
    }
}

# 処理クラス エラー
class RunError {
    [void] run() {
        Write-Host "Error 発生 ないパスで Move-Item";
        Move-Item aaaa\bbbb\cccc\dddd eeeee;
    }
}

# 処理クラス 通常
class RunNormal {
    [void] run() {
        Write-Host "Error 発生なし";
        Write-Host "実際にやりたい処理を描くかんじ"
    }
}

############# 上で作ったクラスを使って以下の感じで実行
$ErrorActionPreference = "Stop"
$MainClass = New-Object Main(99);

$RunErrorClass = New-Object RunError;
$RunNormalClass = New-Object RunNormal;

$MainClass.main($RunErrorClass);
$MainClass.main($RunNormalClass);

```
馬の著作権について

# はじめに
自分のために改めて調べたものなので, 自分で調べて判断してください. 〇娘というものが流行っているので, 知っていることもあるけれど改めて整理しておきたいです.

要点,

- 馬名に著作権は認められない
    - 著作権は創作物に対して認められる
- もののパブリシティ権や不正競争が争点になる
    - 建物についても慎重になるべき

# パブリシティ権

> 人に備わっている、顧客吸引力を中核とする経済的な価値（パブリシティ価値）を保護する権利を言う。[1]

人については多くの判例がありますが, ものについては意見が分かれるところのようです, 建物のマジソン・スクウェア・ガーデンについても主な争点は不正競争ということです [2]. 社会的常識, 慣習になっているのが実情のようで, "鰻屋の香りで飯を食うのはいいけど, それで商売したらダメでしょ" [3].

馬はものなので大丈夫そうな気もします. しかし, 過去の判例[3][4]は馬であることは変えていないのに対して, 今回の擬人化の場合, 財産としての価値を著しく落としめていないかが問題になりそうです.
あとは競馬場です, ロンシャン競馬場など特徴的な外見の競馬場は気をつかう必要がありそうです.

# 著作権

飛ばしていただきたいです, うっかりするとブーメランになるので. 私の過去の記事を探せばヤバいものがあると思うのですよ.

創作物について認められる権利です. 技術系記事サイトに関係するところだと,

- 引用の範囲を超える転載公開は, 著作権の侵害
- 無断で翻訳公開は, 著作権の侵害
- イベント等の発表内容も無断で転載・翻訳公開は, 著作権の侵害

でしょうか. 書籍を章ごとに記事にしている場合, 記事単体では引用の範囲を超えていない気がしますが, 連作全体でみるとただの転載じゃないの？と思うものがあります. 訳本の転載, 書籍・ブログの全訳はかなり悪質で, 権利者本人による親告がなければどうにもならないです. 翻訳者や監修者は仕事の数が多いでしょうから気づきにくいと考えられますし, 著者にいたっては母国語外の可能性が高いため気づくことは稀です.

# 参照
1. [パブリシティ権](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%96%E3%83%AA%E3%82%B7%E3%83%86%E3%82%A3%E6%A8%A9)
2. [裁判例に見るスポーツとパブリシティ権](https://system.jpaa.or.jp/patents_files_old/201404/jpaapatent201404_055-065.pdf)
3. [競走馬名にパブリシティ権はなぜないのか](http://www.u-pat.com/body17.html)
4. [判例評釈](https://www.hanketsu.jiii.or.jp/hanketsu/jsp/hatumeisi/hyou/200410hyou.html)
with文のカスタマイズ(Python)

#概要
`with`文を自分でも活用できるようにする。
#内容
##環境
macOS Catalina
Python 3.7.0
##解決策1 準備
`class`を定義する。

```Python:with1.py
class Obj():
    def __init__(self, name):
        print('------start')
        self.name = name
    def __enter__(self):
        return f'hello, {self.name}'
    def __exit__(self, type, value, traceback):
        #Exception handling here
        print(f'with or without exception, finished. bye, {self.name}')
        print('------end\n')
```

`__init__`, `__enter__`, `__exit__`を使い、`__enter__`で`as`で使うものを返す。
##解決策1 実行
```Python:with1.py
with Obj('yaruo') as message:
    print(message)
with Obj('yaruo') as message:
    print(message)
    raise RuntimeError()
```
```:output
------start
hello, yaruo
with or without exception, finished. bye, yaruo
------end

------start
hello, yaruo
with or without exception, finished. bye, yaruo
------end

Traceback (most recent call last):
  File "with1.py", line 25, in <module>
    raise RuntimeError()
RuntimeError
```
できた。
##解決策2 準備
builtinのcontextlibを使う。

```Python:with2.py
import contextlib

@contextlib.contextmanager
def context(name):
    print('------start')
    try:  #Exception handling can be written in except:
        yield f'hello, {name}'
    finally:
        print(f'with or without exception, finished. bye, {name}')
        print('------end\n')
```
`yield`で`as`で使うものを返す。
##解決策2 実行
```Python:with2.py
with context('yaruo') as message:
    print(message)
with context('yaruo') as message:
    print(message)
    raise RuntimeError()
```

```:output
------start
hello, yaruo
with or without exception, finished. bye, yaruo
------end

------start
hello, yaruo
with or without exception, finished. bye, yaruo
------end

Traceback (most recent call last):
  File "with2.py", line 25, in <module>
    raise RuntimeError()
RuntimeError
```

##蛇足
* `return`：終了のイメージ
* `yield`：一時停止のイメージ

終了処理のほか、一時的に変数を変更したい時にも使える。

```Python
import contextlib
class Config:
    a = False

@contextlib.contextmanager
def a_True():
    backup, Config.a = Config.a, True
    try:
        yield
    finally:
        Config.a = backup

with a_True():
    print(Config.a)  # True
print(Config.a)  # False
```

#参考にさせていただいた頁・本
- 『ゼロから作るDeep Learning③　フレームワーク編』斎藤康毅著 O'REILLY
- https://stackoverflow.com/questions/3774328/implementing-use-of-with-object-as-f-in-custom-class-in-python

#感想
`with`文を活用する方法がわかって良かった。
#今後
Pythonicなコード目指して活用していきたい。
SIFT descriptors(特徴量)について理解する

## はじめに
OpenCVのSIFTで特徴量を抽出してSVMで分類する、というプログラムを作成しようと思っています。特徴量の抽出にはSIFTを使う予定ですが、SIFTで抽出される特徴量とは何なのかについて少し調べたので、備忘として残します。
尚、SIFTについては2020年に特許が切れて使いやすくなりました（[こちらを参照](https://qiita.com/herr-shigeo/items/ec9abac4212628162598)）。

## 開発環境
Ubuntu 18.04.4 LTS
Python 3.6.9
opencv 4.5.1
dlib 19.21.1

## 実際の出力値を確認
まずは、実際にSIFTで特徴量を抽出し、取得したdescriptorsを出力してみました。
以下が、使用したソースコードの一部です。

```python
sift = cv2.SIFT_create()
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
keypoints, descriptors = sift.detectAndCompute(img, None)
print('number of keypoints({0})'.format(len(keypoints)))
print('sift descriptors: ndim({0}), shape({1})'.format(descriptors.ndim, descriptors.shape))
print(descriptors)
```
出力結果は次のようになりました。

```
number of keypoints(195)
sift descriptors: ndim(2), shape((195, 128))
[[  0.   0.   0. ...   0.   0.   0.]
 [141.  59.   8. ...   0.   0.   0.]
 [  0.   0.   0. ...   1.   0.   9.]
 ...
 [  2. 108. 122. ...   0.   0.   5.]
 [  0.   0.   0. ...   0.   0.  72.]
 [  3.   0.   0. ...   1.   0.   4.]]

```
195個のkeypointが検出され、それぞれについて128個の値が保存されていることがわかります。これは、keypoint周辺の16個のブロック(1ブロック = 4 x 4)を8bin orientation histogramで表現した結果です。
16 x 8 = 128
8binの'8'の意味が何かというと、image gradientの角度を8通りで表すという意味になります。
1bin = 0〜44度
2bin = 45〜89度
...
8bin = 315〜360度

gradientの角度をθとおくと、tanθ = y方向の傾き / x方向の傾き
となるので、gradient角度は
θ = arctan(y方向の傾き / x方向の傾き)
で求まります。

各ブロック内の4x4についてimage gradientを計算し、該当するbinに image gradientの大きさを足し合わせいくことで、'8bin orientation histogram'なるものができあがります。実際には、keypointからの距離等も考慮して足し合わせるようです（keypointからの距離が離れるほど値が小さくなるように）。最後に正規化した結果が、上記の出力結果と思われます。

## まとめ
実際にOpenCVのSIFTを使う際に、descritporsの詳細を気にする必要は無いと思いますし、もう気にすることも無いと思いますが、ある程度理解したことで、今までよりもSIFTを使いやすくなった気がします。

## 参考文献
[OpenCVのマニュアル](https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html)を確認しましたが、4行程度のあっさりとした説明しかありません。予備知識が無いと理解が難しいと思いますが、上記を読んで後であれば理解が容易になるのではと思います。
>Now keypoint descriptor is created. A 16x16 neighbourhood around the keypoint is taken. It is devided into 16 sub-blocks of 4x4 size. For each sub-block, 8 bin orientation histogram is created. So a total of 128 bin values are available. It is represented as a vector to form keypoint descriptor. In addition to this, several measures are taken to achieve robustness against illumination changes, rotation etc.

以下のページが参考になりました。
https://aishack.in/tutorials/sift-scale-invariant-feature-transform-features/
https://ai.stanford.edu/~syyeung/cvweb/tutorial2.html
【Go 初心者向け】Concurrency で知っておく必要のある 4 つのこと


## 知っておくべき 4 つのこととは？
1. Goroutine
2. Channel
3. Select
4. Sync パッケージ

です。

詳しく見ていきましょ。

## 1. Goroutine

関数やメソッドの前に `go` を付けると、`main()` とは違う場所(=スレッド)で処理される

```golang
go fmt.Println("別の場所で実行")
go SomeFunction()
```

`main()` が終了すると、Goroutine も終了するので、これから説明する方法で「__待つ__」必要がある。

## 2. Channel

Goroutine でデータをやり取りをやりとりする仕組み

* __定義__: `c := make(chan int)`
    * 送信専用も作れる (chan から出ていく矢印): `var receveOnly <-chan int`
    * 受信専用も作れる (chan に入っていく矢印): `var sendOnly chan<- int`
* __データ送る__: `c <- 3`
* __データ受け取る__: `val := <-c`
    * データを受け取る準備ができていても、送られてこないと、送られてくるまで待つ
    * ちなみに: 矢印(`<-`)と `c` の間にスペースがないのが正しいフォーマット。あっても動作するけど。。

```golang
func main() {
	ch := make(chan int)

	fmt.Println("Goroutine 実行するよ！")
	go func() {
		ch <- 42
	}()
	fmt.Println("Goroutine 実行したよ！")

	time.Sleep(2 * time.Second)
	recieved := <-ch
	fmt.Println(recieved)
}
```

すぐに受け取れなくても、channel を通して送られたデータはその後の処理でちゃんと受け取れる

## 3. Select

* 先に実行 (例: 送る、受け取る) できるものを処理する。
* 何も実行できる状態でなければ、`default` が実行される。
* `default` は書かなくてもよく、もし無ければ、何かが実行できるまで待つ

```golang
func main() {

	c1 := make(chan int)
	c2 := make(chan int)

	go func() {
		// 何かしらの処理後に c1 にデータを送る
		time.Sleep(1 * time.Second)
		c1 <- 10

		// 何かしらの処理後に c2 にデータを送る
		time.Sleep(1 * time.Second)
		c2 <- 20
	}()

	// Goroutine を使い無限ループで待機
	go func() {
		for {
			time.Sleep(300 * time.Millisecond)
			select {
			case v1 := <-c1:
				fmt.Printf("recieved %v from c1\n", v1)
			case v2 := <-c2:
				fmt.Printf("recieved %v from c2\n", v2)
			default:
				fmt.Printf("Not Ready !!\n")
			}
		}
	}()

	// 無限ループを 3 秒間だけ回すため、main() で sleep する
	time.Sleep(3 * time.Second)
}
```

* `time.After(duration)` でタイマー的なこともできる

```golang

func main() {

	c1 := make(chan int)
	c2 := make(chan int)

	go func() {
		// 何かしらの処理後に c1 にデータを送る
		time.Sleep(1 * time.Second)
		c1 <- 10

		// 何かしらの処理後に c2 にデータを送る
		time.Sleep(1 * time.Second)
		c2 <- 20
	}()

	// time.After を使っているので、main() で無限ループしても、指定時間後に終了する
	for {
		time.Sleep(300 * time.Millisecond)
		select {
		case v1 := <-c1:
			fmt.Printf("recieved %v from c1\n", v1)
		case v2 := <-c2:
			fmt.Printf("recieved %v from c2\n", v2)
		case <-time.After(3 * time.Second):
			fmt.Println("timed out !!")
			return
		}
	}
}
```

## 4. Sync パッケージ

* __定義__: `var wg sync.WaitGroup`
* __追加__: `wg.Add(1)`
* __終了__: `wg.Done()`
* `wg.ADD` した分 `wg.Done` するまで、__待つ__: `wg.Wait()`

```golang
func main() {
	// 定義
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		// 追加
		wg.Add(1)
		
		go func(c int) {
			// 処理が終わったら終了
			defer wg.Done()

			// 長い処理をしてると仮定
			time.Sleep(2 * time.Second)
			fmt.Println(c)
		}(i)
	}

	// 全て Done するまで待つ
	wg.Wait()
	fmt.Println("Closing...")
}
```
while, popを用いた木構造探索パターン(Python)

#概要
空配列が`False`と判定されるので、
`while`と`pop`によるシンプルな探索パターンを使う。
#内容
##環境
macOS Catalina
Python 3.7.0
##準備
```Python:node.py
class Node:
    def __init__(self, name):
        self.name = name
        self.children = []
    def add_child(self, child):
        self.children.append(child)


A, B, C, D, E, F = Node('A'), Node('B'), Node('C'), Node('D'), Node('E'), Node('F')
A.add_child(B)
A.add_child(C)
B.add_child(D)
C.add_child(E)
C.add_child(F)
```
上記によって、下記の構造ができる。
<pre>
A---B---D
  |
  --C---E
      |
      --F
</pre>
##実行
```Python:node.py
node_list = []
node_list.append(A)

while node_list:
    node = node_list.pop()
    for child in node.children:
        print(f'{node.name} has a child, {child.name}')
        node_list.append(child)
```
* `append`：配列のお尻につける
* `pop`：配列のお尻からとれる

##蛇足
```
>>> bool(['a'])
True
>>> bool([])
False
>>> bool('hello')
True
>>> bool('')
False
```
#参考にさせていただいた本
『ゼロから作るDeep Learning③　フレームワーク編』斎藤康毅著 O'REILLY
#感想
木構造の探索のシンプルな実装がわかって良かった。
#今後
機会があれば積極的に使っていきたい。
【Rails】世界一簡単なcreated.at(updated.at)日本語表記

#はじめに

railsではロンドン？の時刻表示がデフォになっていますが、簡単に日本語表記で表すことができます。

本記事では簡単にやる方法を簡潔に書きます。

#開発環境

- Ruby2.6.6

#実際のコード

まずは、`application.rb`に以下を記述します。

```ruby:config/application.rb
config.i18n.default_locale = :ja
```
次に、config/locateの中に`ja.yml`のファイルを作り、以下を記述します。



```ruby:config/locate/ja.yml
ja:
  datetime:
    distance_in_words:
      
      less_than_x_minutes:
        one:  "1秒"
        other: "%{count}秒"
      x_minutes:
        one:   "1分"
        other: "%{count}分"
      about_x_hours:
        one:   "約1時間"
        other: "約%{count}時間"
      x_days:
        one:   "1日"
        other: "%{count}日"
      about_x_months:
        one:   "約1ヶ月"
        other: "約%{count}ヶ月"
      x_months:
        one:   "1ヶ月"
        other: "%{count}ヶ月"
      about_x_years:
        one:   "約1年"
        other: "約%{count}年"
      over_x_years:
        one:   "1年以上"
        other: "%{count}年以上"
```

あとは、表示させたいviewに追記部分を加えるだけ！

```ruby:index.html.erb
<h1>sample</h1>
<h3>Tweet一覧</h3>
<%= link_to "新規投稿へ", tweets_new_path %>
<div class="tweets-container">
  <% @tweets.each do |t| %>
    <div class="tweet">
      <%= t.body %>
         #ここから
      <time datetime="<%= t.created_at %>">
      <%= time_ago_in_words(t.created_at) %>前
      </time>  
　　　　　#ここまで
    </div>
  <% end %>
</div>
```
#最後に
 
世界一簡単にRailsでcreated.atやupdated.atをTwitterのように(〇分前、〇日前)日本語表記する方法についてご紹介しました。


簡単に実装可能なのでぜひ試してみてみてくださいね！

参考記事：https://qiita.com/bellx2/items/30906a7832ef4ff4c886


最後まで読んでいただき、ありがとうございました。
javascriptが無効ですと言われる

メモ程度に残しておきます。

<h1>Adobe CCを入れようとしたらjavascriptを有効にしろといわれた</h1>

実は前にも出会ったことがあったが、Adobe CCでも同様の現象がおき、ネットにあまりなかったのでかいとく

ブラウザのjava script がすべて有効にも関わらず"有効にしてください"と言われ続けていた。は？という想いである。

<h2>実行環境</h2>
windows 10
Firefoxとかchromeとかいろいろ入ってる(特に関係はない)

<h2>方法</h2>

1. (windowsで検索)インターネット　オプションを開く
2. セキュリティ　タブを開く
3. インターネットのセキュリティレベルを中(最低レベル)に下げる
4. 適用


これで治ったので、一通りしても治らなかった人は試してみてほしい
システム間のIFをストアドで実現するということ

開発をしていると、実現するにあたり複数の手法を取れる場合が多く存在する.
教科書で勉強をしていざ「書いていこう」と思ったとき、たびたびその手法の多さに迷う.
***
社会人になってから学んだ、データを処理する手法の一つに「ストアドプロシージャ(stored procedure)」がある.

例えば、DataBaseに対してこれまでは

* Select文を書き
* 取得した値を加工し
* Update文を書き

それらを、バックエンドソース上で実現していた。
（JavaとかC#とかね）
***
Webアプリでもコンソールアプリでも、そういった開発を行おうとするとそう実現するのが自然な流れだと思う.

でもこの取得するデータが複雑になっていったり
データの高度な加工を要求されたり
条件分岐させながらデータを取得したかったり（Where区内で変数を使いたい、とかも含めて）
いまいちだなーと感じてきたりする.

そういうときは、ストアドで実現した方がスマートな上に高速化できたりもする.
一連の処理を整理（設計）することで、煩雑な処理がシンプルにSQLの構文で書けるようになる.

バックエンドでがりがり書いて実現していたものが、ストアドのちょっとしたループや一時テーブルで簡単に実現できると、嬉しい.
（もちろん、ストアドにしてもやっぱり複雑なものもあれば、呼び出しが増えて見通しがわるくなることもある）
***
そんなこんなで、ストアドで実現するのは結構好きです.
もちろん、基本的なCRUDは適当なFW(Entity Frameworkとか)を使えばとても綺麗そういうのもすき.

そんなわたしが今日、「ストアド使うの？やめたほうがよくない？」な場に遭遇しました.

**独立したシステム間の通信を新しく実現させる**
そういう実装検討会です.

システム１
　Web/APサーバ
　DBサーバ

システム２
　フロー処理を行う特殊サーバ
　DBサーバ
　
システム１は、システム２のDBサーバに入っているデータを取得したい

＜方法①＞
　システム２にAPIサービスを用意してもらいhttpでCallする
＜方法②＞
　システム２のDBにストアドを用意してもらいCallする

どちらを選ぶか？は色々な要素を踏まえて検討する.

+ どのくらいのサイズのデータなのか
+ どの程度の頻度で取得するデータなのか
+ レスポンスとか気になる
+ 既存ではどちらを採用しているのか
+ どちらで実現した方が低コストか
+ 実装がものによって違うとかソースが散らかると嫌だったりするもんね

今日改めて認識した要素が
**「エラーになったときどうなるの？」**

正常なシステム１から、DB障害中のシステム２をCallした結果
＜方法①＞
　Sorry設定がされていれば「ただいまメンテナンス中です」など正常な応答値を返してくれる
　APサーバは冗長構成を組んでいることが多いし、堅牢性が高いと思う
＜方法②＞
　システム１にDB Connection Error が溜まりメモリリークしてしまうなどリスクが考えられる
　怖い
　システム１の全然関係ない処理にまで影響を及ぼすかもしれない
　超怖い

そう、とても怖いことがわかりました。

蜜結合って超怖い
疎結合万歳

運用していく視点がまだまだ足りませんな

おわり。
DeFi で流動性提供で得られるペアトークンの量の計算のメモ

## 疑問

たとえば 100 `$SUSHI` と 1 `$ETH` を add liquidity(流動性ペアを作り提供)したら, 2 SUSHI/ETH LP(liquidity pair) token が付与されたがこの量 2 はどう計算されているのかしらん?

## 計算方法

https://www.reddit.com/r/UniSwap/comments/i49dmk/how_are_lp_token_amounts_calculated/

https://hackmd.io/@HaydenAdams/HJ9jLsfTz?type=view

Uniswap v1 code から

https://github.com/Uniswap/uniswap-v1/blob/c10c08d81d6114f694baa8bd32f555a40f6264da/contracts/uniswap_exchange.vy#L48

### 初期トークン量

https://uniswap.org/whitepaper.pdf
(3.2  Initialization of liquidity token supply)

最初の流動性提供のときはいろいろ計算方法があるようである.
Uniswap v2 では, 最初の LP トークン量は, 

```
s_minted = sqrt(x_deposited * y_deposited)
```

で求められる.

## TODO

* [ ] コードなど詳しく理解する
GitHub Actionsを使ってGithub PagesにOpen APIのドキュメントを公開したメモ

## 概要
pushしただけでドキュメントの公開をしたかったので自動デプロイを試してみた。
vercelでWebページの公開はできるので、余っているGithub PagesにOpenAPIのReDocを公開してみる。

https://hibohiboo.github.io/kotatool/

[ソースコード](https://github.com/hibohiboo/kotatool/tree/docs)

**2021.11.3 追記**

[openapi3.1に対応したソースコード](https://github.com/hibohiboo/kartagraph/tree/3f08f46fe5d3aaf8195a2f197e002829658762ee/documents/api-schema) ... swagger-cli不要で、redocのみでよくなった。

## ディレクトリ構成

```
- .github
  - workflows
    - gh-pages.yml      ... GitHub Actions記述
- src ... ソースコード
- docs
  - index.html          ... 各ドキュメントへのリンクを張るのみのHTML
- internals             ... 内部使用ドキュメントツールを入れるディレクトリ
  - api-schema          ... OpenAPIを記述
```

## OpenAPI
### yamlの作成
[GitHub Actions による GitHub Pages への自動デプロイ](https://qiita.com/peaceiris/items/d401f2e5724fdcb0759d)を参考に、yamlファイルを作成する。

```yaml:.github/workflows/gh-pages.yml
name: github pages

on:
  push:
    branches:
      - docs  # Set a branch name to trigger deployment

jobs:
  deploy:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2

      - name: Setup Node
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: OpenAPI Setup
        run: npm ci
        working-directory: ./internals/api-schema

      - name: OpenAPI Make
        run: npm run redoc
        working-directory: ./internals/api-schema


      - name: OpenAPI Move files
        run: |
          mkdir -p ./docs/publish/api-schema
          mv ./internals/api-schema/dist/index.html ./docs/publish/api-schema/

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docs

```

作成したら、docsブランチをpushする。
push後、Actionsを確認して、デプロイされていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/c28640d2-37fe-39d4-a0c7-93acd13a9c72.png)

ブランチに、gh-pagesが新しくできていることを確認する。
デプロイされたファイルがgh-pagesに配置されていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/1a9d64a9-f34c-d472-65e2-945dc238a9a6.png)





## github pagesの有効化

* settings をスクロールしていくと「Github Pages」の項目があるので設定をする。
  * 「/(root)」か「/docs」のいずれか。今回はActionsの公開先である「/(root)」を選択する。
  * 「Save」すると、公開先のURLが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/5ae2ecb8-9c21-fbf6-6471-ef62e1250bae.png)


## 参考
[GitHub Actions による GitHub Pages への自動デプロイ](https://qiita.com/peaceiris/items/d401f2e5724fdcb0759d)
[AsciidocのドキュメントをGitHub Actionsを用いてGitHub Pagesで公開する](https://qiita.com/fake-deli-ca/items/1a946362e3d1993163e2)
[GitHub Actionsのワークフロー構文](https://docs.github.com/ja/actions/reference/workflow-syntax-for-github-actions#)
[公開元を設定する](https://docs.github.com/ja/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site)
[Ruby on Rails] No template for interactive request

なんか色々と長い内容のエラーに出くわした。
備忘録と言うよりは打つ間違いに気をつけろ！ってことで
自身への反省をこめて書きます。




##No template

なら、いつもの記述間違いか？ってなる所、
今回のエラーはいつもより長かった...

　　

**エラー内容↓**
##No template for interactive request
CatsController#show is missing a template for request formats: text/html
NOTE! 

訳**(インタラクティブリクエスト用のテンプレートはありません
CatsController＃showにリクエスト形式のテンプレートがありません：text / html
注意！)**　


###解決方法?
なのかは、分からないが**show.html**のファイルを作った時にコンマが一個多かったorz
**show..html.erb** となっていた。
ただそれだけ。
　

###まとめ
たまたま早期発見できたものの、今後templateエラーが出たら
コードとファイルの両方を細かくチェックするべきだと実感しました。
[ARKit]水平面の検出

#水平面を検出するためのコンフィグレーションを設定
現実世界の水平面を検出するためにの設定をします。
sceneViewの型はARSCNViewクラスです。デフォルトでは、平面検出は行われません。必要な機能はプログラマーが各自設定する必要があります。

```swift
   let configuration=ARWorldTrackingConfiguration()
//水平面の時は.horizontalで垂直面の時は.verticalになります。
   configuration.planeDetection = .horizontal
   sceneView.session.run(configuration)
```
#検出した平面をどのように扱うのか？
ARSessionDelegateを処理したいクラスに批准させて、そのクラスをARSceneView.session.delegateに代入して、デリゲートメソッドを利用します。

```swift
sceneView.session.delegate=self
```
ここで、selfを代入させたので、このクラス(Viewcontroller)上でデリゲートメソッドを利用できます。

```swift
//アンカーがセッションに追加されたときに呼ばれる
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        
    }
//アンカーが更新されたときに呼ばれる
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {

    }

```
アンカーとは検出物体の位置や向きを表すクラスです。
ARanchorクラスはプロパティとしてindentifierとtransformを持っています。
indentifierはそのアンカーの名前です。人間でも名前で他人と区別するように、アンカーにも名前をつけて他のアンカーと区別をします。つまり、アンカーを一意に定めるものです。transformは、位置や大きさを表すプロパティで4×4行列です。
ここで、anchorのままでは使いにくいので,サブクラスであるARPlaneAnchorにキャストします。

```swift
//アンカーがセッションに追加されたときに呼ばれる
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
     guard let planeAnchors=anchor as? [ARPlaneAnchor] else {return}
     
    }
```
ARPlaneanchorクラスは,centerプロパティとextentプロパティを持ちます。
centerプロパティは平面アンカーの中心の位置で、extent(simd_float3型)は,平面の大きさを表しますが、平面なのでyの値は0になります。
``検出した平面に色を塗りたいときこのメソッドは使いません。``
AR機能はセッション単位で管理しています。
上のメソッドでは、平面に限らず、seceViewにアンカーが追加されたり、更新されたりするときに呼ばれだけで検出した平面のアンカーの位置や大きさを所得して、色を変えたりするのは別のメソッドで行います。
#平面検出したときに呼ばれるメソッド
ARSCNViewDelegateプロトコルのデリゲートメソッドを使います。

```swift
//平面アンカーのノードがシーンに追加されたときに呼ばれる
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//      アンカーを平面アンカーにキャストする
        guard let planeAnchor=anchor as? ARPlaneAnchor else {return}
//      アンカーから平面形状(geometry)の平面を作成
        let geometry=SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))
//      平面に黄色を付ける
　　　　　geometry.materials.first?.diffuse.contents=UIColor.yellow.withAlphaComponent(0.8)
//      平面からノードを作成する。        
        let planeNode=SCNNode(geometry: geometry)
//     なんか知らんけど、平面がx-y平面上に作られるので,平面をx軸(1,0,0)を軸に90°回す
        planeNode.transform=SCNMatrix4MakeRotation(-Float.pi/2, 1, 0, 0)
//      メインスレッドでnodeに追加する
        DispatchQueue.main.async(execute:{
            node.addChildNode(planeNode)
        })
    }
```
nodeは平面アンカーに対応したnodeです。
Lightning Experience のナレッジの基本 ⇒ 知識ベースの成功に向けた準備

１．エージェントがケースを解決するときに最適な記事が提案されるようにするには、どうしたらよいですか?
２．記事の寄稿者に必要な権限と記事アクションは何ですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/dad4746a-aae0-23c1-2e1b-c894efd236d5.png)
PowerShell Move-Item フォルダ上書き対応

PowerShell で Move-Item でフォルダ上書きがエラーになってしまう。
-Force 使ってもファイルの上書きはできるがフォルダはエラーになる。。。

対応としては以下のように考えてみた。
今のところ機能してるので大丈夫そう。。。

```
$path = "C:\test1";
$dist = "C:\test2";

# 以下の Move だと test1, test2 に同名のフォルダがあるとエラーになってしまう。。。
# Move-Item $($path + "\*") -Destination $dist -Force;

# ChildItem でループ
Get-ChildItem $path | ForEach-Object {
    # Move-Item を行う function として moveItem 作成して呼び出す
    moveItem $_.FullName $($dist + "\" + $_.Name);
} 

############ moveItem
function moveItem($path, $dist) {
    if ((Test-Path $dist) -and (Test-Path -PathType Container $path)) {
        # フォルダ上書き(移動先に存在 かつ フォルダ)は再帰的に moveItem 呼び出し
        Get-ChildItem $path | ForEach-Object {
            moveItem $_.FullName $($dist + "\" + $_.Name);
        }
        # 移動し終わったフォルダを削除
        Remove-Item $path -Recurse -Force;　　
        Move-Item $path -Destination $dist -Force;
    } else {
        # 移動先に対象なし または ファイルの Move-Item に -Forece つけて実行
        Move-Item $path -Destination $dist -Force;
    }
}
```
アプリケーション・サーバーでJaCoCoカバレッジを取得する

## モチベーション

よくわからないJavaアプリケーションの実装を理解するために、とりあえず動かしてみながらソースコードのどこを通っているのかざっくり理解したいときってないでしょうか。そんなときカバレッジを取得しながら動かしてみると、調査が捗るかもしれません。OpenLiberty, Mavenを使った場合の例です。

## 方法

1.アプリケーションのコンパイルをする時にはデバッグ情報を含めるようにします。Mavenを利用する場合は以下のように設定します

```xml
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <source>8</source>
    <target>8</target>
    <debug>true</debug>
    <debuglevel>lines,vars,source</debuglevel>
  </configuration>
</plugin>
```

2.https://www.jacoco.org/jacoco/ から入手したzipを入手してjarを展開すると出てくるjacocoagent.jarを`-javaagent`オプションで実行時に以下のオプションを指定します。Libertyの場合は`jvm.options`に記載します

```
-javaagent:/適当なパス/jacocoagent.jar
```

3.アプリケーションを手動で実行します。Libertyの場合は`user/servers/defaultServer`などサーバーのディレクトリに`jacoco.exec`が出力されます

4.生成された`jacoco.exec`を使ってレポートを生成します。`--classfiles`にはwarファイルを直接指定しても良いようです。`--sourcefiles`はsource.jarでなくソースコードが存在するディレクトリを指定します（このオプション自体を複数回指定可能）。ソースコードの文字コードを指定したい場合は、`--encoding UTF-8`のように指定します。

```
java -jar jacococli.jar report jacoco.exec \
  --classfiles myapplication.war \
  --sourcefiles src/main/java --html jacocoreport --csv jacocoreport.csv
```

## レポート生成時に警告が出力される

コンパイル、アプリケーション実行、レポートの生成に別のバージョンのJavaを使うと以下のような警告が出力されることがあります。またJPAエンティティのように実行時に書き換えられるようなクラスファイルはどうしても警告が出力されてしまうようです。
https://www.jacoco.org/jacoco/trunk/doc/faq.html


```
[WARN] Some classes do not match with execution data.
[WARN] For report generation the same class files must be used as at runtime.
```
Material UIのDrawerでサイドバーを作る最もシンプルな例

## はじめに
サイドバーを作ろうと思って、Material UIの[Drawer](https://material-ui.com/ja/components/drawers/)を使おうとしたとき、公式のリファレンスが載せているコードが盛り沢山でどこが最小限なのかわからん！になったので最もシンプルな形を目指してみました。

## 環境
- Material UI v4.11.3
- react v17.0.1

## 最もシンプルを目指してみた
```jsx

import React, {useState} from 'react';
import Drawer from '@material-ui/core/Drawer';

export default function TemporaryDrawer() {

    const [open, setopen] = useState(false);
    const toggleOpen=() => {
        setopen(!open);
    }
    return(
        <>
            <button onClick={toggleOpen}>hoge</button>
            <Drawer anchor='left' open={open} onClose={toggleOpen}>
                <p>hello</p>
            </Drawer>
        </>
    );
}
```
これだけのコードでボタンを押して開いてサイドバー以外をクリックすると閉じるナビゲーションドロワーを実現することができます。

`anchor = 'left'`をtop, right, bottomにするとそれぞれ上から、右から、下から出てくるように変更できます。

上のコードでの表示をみてみるとこんな感じ

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1153569/ac56b1e4-25e7-6845-87f6-31644dbf6c5e.gif">


ナビゲーションドロワーの幅を指定する必要はありそうですが、あとは`<Drawer />`の子要素を変更するだけで素敵なナビゲーションドロワーを作れます！！
VST3 FL Studio使用時のVSTGUI再描画バグについて

[VST3制作の過去記事一覧はこちら](https://qiita.com/aike@github/items/05a14911bb89db8b6c2c)

※このバグは2021年のVSTGUI 4.10以降は修正されています。

VSTGUI[^1]の再描画バグについての修正情報です。この記事はVST3プラグインを書く人向けの内容です。

# TL;DR

+ VSTGUIで長らく放置されていた再描画バグが最近ようやく修正された
+ ~~修正版はGitHubの公式リポジトリの[developブランチ](https://github.com/steinbergmedia/vstgui/tree/develop)から取得可能~~
4.10以降は配布版も修正されています


# 背景

自作VST3プラグインをFL Studioで使っていると、ウィンドウが重なったときに再描画されずに黒くなってしまうバグが以前からありました。VST3 SDKの公式サンプルプログラムagainをビルドしただけでこの状態なので、プラグイン実装の問題ではなくDAWかGUIライブラリにバグがあることは明らかです。
![bug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/36d07232-28f9-7df8-1d16-b5fc5971070f.png)
目立つバグなのになぜかずっと修正されずにいたもので、自分も1年くらい前に対策方法を求めてネット上の情報を探してみたのですが良い情報は見つからずあきらめかけていました。
今回、[ツイッターの情報](https://twitter.com/Takacie815/status/1365814203106299907)をもとにあらためて調べてみたら、最近ようやく修正されたということが判明したのでまとめておきます。

# 修正の経緯

2020年9月のSteinberg公式フォーラムのこの投稿がきっかけになったようです。
VSTGUI on other hosts
https://forums.steinberg.net/t/vstgui-on-other-hosts/202038

VSTGUIのメインコントリビューターであるArne_Schefflerさんの返信によると、自分のFL Studioでは再描画バグは再現しないとのこと。なるほど、それで今まで放置されていたんですね。

元の投稿者のdenis_prophetさんの指摘によると、VSTGUIのソースコードに含まれる、win32frame.cppのif文の条件を変えるとバグが発生しなくなるとのことです。

修正前

```win32frame.cpp
if (updateRegionList->rdh.nCount > 1) 
```

修正後

```win32frame.cpp
if (updateRegionList->rdh.nCount > 0) 
```

ここでupdateRegionListは、Windows APIのRGNDATA構造体、rdhメンバはRGNDATAHEADER構造体です。つまり再描画すべき複数の矩形情報を保持しているようです。そう考えれば、再描画領域が1より多いときに分岐するのではなく、ひとつ以上ある場合に分岐する修正版の処理の方が正しいように思われます。
他の人もこの投稿に感謝している返信が多く、この修正方法は信頼できそうです。試しに手元の環境でもwin32frame.cppに同様の変更をおこないVSTGUIとプラグインをビルドしなおして試してみたところ、プラグインウィンドウが重なった場合でも正常に表示されようになることを確認しました。

# 公式対応の状況

フォーラムは公式対応の約束や問題のクローズが宣言されておらず微妙に宙に浮いたような感じですが、GitHubのVSTGUIリポジトリを見てみると、2021年1月に当該箇所のパッチがあたっていました。

fix redraw issue with some hosts and simplify dirty region handling
https://github.com/steinbergmedia/vstgui/commit/296fdeacfc853065ca27c8da8435a5fe2a1b6600#diff-7cf79145dcf00dffc51a9e34004c93dd7038259717a6d0ef3385bc99adc78ecb

ずっと悩まされていたバグが公式に修正されたのは大変喜ばしいことです。
2021年8月10日にリリースされたVST3SDK3.7.3で修正されていることを確認しました。

[VST3制作の過去記事一覧はこちら](https://qiita.com/aike@github/items/05a14911bb89db8b6c2c)


[^1]: VST3 SDKに同梱される公式GUIライブラリ
VSCode + Docker でフロントエンドの開発環境構築

## ことの発端

これまで VSCode で C++ の開発環境構築を進めていたのですが、フロントエンドの方々も vue の開発環境を Docker で行う方針にしたので、その導入のメモ書きです。
フロントエンドというか Node.js を使う開発環境って感じなので、vue だけじゃなくて electron なんかでも使えると思います。

## 手順

### 1. Dockerfile を作成

作業用のディレクトリを作成して、```Dockerfile```を作成します。[^1]

```dockerfile:Dockerfile
FROM ubuntu:18.04
RUN apt-get update \
 && apt-get install -y nodejs npm build-essential git python3 curl \
 && npm i n -g \
 && n stable \
 && apt-get purge -y nodejs npm
```

通常コンテナ内でポートリスニングしていてもインバウンドが遮断されているんですが、VSCodeのターミナルで起動すると自動的にポートフォワードしてくれるので特に何も指定する必要がありません。[^2]

[^1]: チーム開発で環境を揃えるなら、ちゃんとバージョン指定した方が良いですが、今回は```stable```（安定版）を使います。

[^2]: 当初は ```docker-compose.yml``` を作成する手順にしていましたが、開発環境構築というテーマで、且つ、VSCodeを使用する前提なので、この恩恵は受けておこうということで、記事を改訂しました。（2021/03/02）

### 2. VSCodeからコンテナ内へリモート接続する

1. 拡張機能 [Remote - Containers : ms-vscode-remote.remote-containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) をインストールします。

2. インストールすると、左下の緑色のボタンが表示されるので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/e2a3ff7c-d89d-ed57-4181-45cb03109034.png)

3. コマンドパレットが表示されるので```Remote-Containers: Open Folder in Containers...```を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/3b5756b0-179b-2cd9-998c-cb37543f8b57.png)

4. フォルダ選択画面が表示されるので、```Dockerfile```が存在するフォルダを選択します。

5. コマンドパレットが表示されるので```From 'Dockerfile'```を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/fd5a31c0-7bdc-68e9-ec97-688994f99511.png)

この手順で、コンテナビルド→設定→起動→ログインが行われます。

### 3. 開発用の拡張機能をインストール[^3]

1. 拡張機能 [Vetur : octref.vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur) をインストールします。
2. 必須じゃないけど [Prettier - Code formatter : esbenp.prettier-vscode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) なんかもオススメです。

これにて、開発環境の構築は終了です。
ガシガシコードを書きましょう。

[^3]: VSCodeはリモート環境毎に拡張機能をインストールするという素晴らしい仕様なので、既にローカルで拡張機能をインストールしていても、再度インストールがされているか確認をしてください。

## おまけ

以降は、取り敢えず、vueの知識が無いけど、とりあえず動作確認をやってみたい場合に、やってみると良いかもしれません。

### １. ショボいサンプルプロジェクトをクローンする

ショボくて申し訳ない。

```sh
git clone https://github.com/codianz/templ.storybook
cd templ.storybook
```

### ２. パッケージのインストール

大概のパッケージマネージャでお約束ですのヤツです。

```sh
npm i
```

### ３. vue開発サーバの起動

vueアプリを開発する際に起動しておくサーバです。

```sh
npm start
```

ブラウザで```http://localhost:8080/``` で起動確認します。


### ４. パッケージのインストール

storybook で開発を進める際に起動しておくサーバです。

```sh
npm run storybook
```
ブラウザで```http://localhost:6006/``` で起動確認します。


## VSCode のポートフォワーディング（2021/03/02追記）

当初、```docker-compose.yml```を作成していたんだけど、実行してみたら、コンテナのポートがそのままフォワードされとるやんという事態に　「　？？？　」　だったのですが、VSCodeの親心というヤツでした。

https://code.visualstudio.com/docs/remote/ssh#_forwarding-a-port-creating-ssh-tunnel

この機能のお陰で、```npm start```（```npm run serve```）とかやると、右下にこんなポップアップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/a0beb4dc-0c7d-500d-0965-af66cc2d29d1.png)

そして、左側のペインにフォワーディング状況を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/c22bbb47-c1bd-d373-ef93-ff6505bcbd8d.png)

す。。。凄すぎる。。。
初学者がPHPを学び始める4

##フォームを作成する

フォームを作りたい時は、HTMLのformタグを用います。
action属性にはデータを渡す先のURLを指定します。
method属性は値の送信の方法で、「get」と「post」のどちらかを指定します。getの場合は送信される値がURLに表示され、postの場合はURLに表示されません。
以下の場合はフォームに入力した値をsent.phpというページに送信するという意味になります。

```
   <form action = "sent.php" method = "post"></form>
```


##テキストボックスを作成する

テキストボックスをつくるにはHTMLのinput type="text"を使います。name属性は入力された値を取得するときに使う名前です。後にフォームのデータを受け取るときに使用します。またinputタグは閉じタグが必要ありません。（textareaタグの場合は必要）

以下のように記述します。
inputは一行分のテキストが入力できます。
textareaの場合は複数行のテキストが入力できます。


```
       <input type = "text" name = "email">

       <textarea name = "body"></textarea>
```


##送信ボタンを作る

送信ボタンをつくるにはinput type="submit"を用います。
value属性に指定された値がボタン上に表示されます。
以下の記述で送信ボタンを作ることができます。（cssは別に用意する必要があります。）

```
   <input type = "submit" value = "送信">
```



フォームで送信した値を受け取るには「$_POST」を使用します。
「$_POST」は連想配列になっています。[ ]の中に、inputとtextareaのname属性に指定した値を入れることで、それぞれの送信した値を受け取ることが出来ます。
以下の記述で送られてきた値を（email）を受け取ることができます。


```
      <?php echo $_POST['email']; ?>            
```


##セレクトボックスの作り方

セレクトボックスをつくるには図のようにselectタグの中にoptionタグを並べます。
optionタグの中身が選択肢として表示されます。
selectタグには「$_POST」で値を受け取るためのname属性を指定します。
optionタグのvalue属性が送信される値です。

以下の記述でセレクトボックスが表示できます。

```

        <select name = "age">
          <option value ="未選択">選択してください</option>
          <option value ="20代">20代</option>
          <option value ="30代">30代</option>
        </select>        

```

以下の記述でageを受け取り出力することができます。

```
      <?php echo $_POST["age"]; ?>
```


##forを使ったセレクトボックス

下記の場合だとセレクトボックスに１から１００までの数字を選択することができる。

```
      <?php 
        for($i = 1; $i <= 100; $i++){
          echo "<option value='{$i}'>{$i}</option>";            
       }
      ?>

     この二つは同じ意味↑↓

     echo "<option value ="1">1</option>"
     echo "<option value ="2">2</option>"
     echo "<option value ="3">3</option>"

```
addEventListenerが追加したDOM要素等の影響でうまく設定ができない時の対応

# 今回の経緯
今回fullcalendarというカレンダーライブラリーで日付部分にボタンを追加、そのボタンにクリックイベントを仕込む、という実装が必要であったが、ライブラリーが吐き出したDomに対して直接イベントを設定する必要があり少し変わった実装方法をしたのでそのメモ

```javascript
      const ele = document.querySelector('.fc-scroller-harness .fc-scroller .fc-col-header tbody');
      ele.addEventListener('click', (e) => {
        const x = e.target;
        if (Array.from(document.querySelectorAll('.label-btn')).includes(x)) {
          // .label-btn をクリックした時にイベントクリックイベントが発火する
        }
      });
```
これ結構便利です！！たまにこのようにして使いたいパターンが出てくるので忘れないようにこちらメモとして残しておこう。

# おしまい
JavaScriptで Date を input 要素の日付(type="date") 用の文字列に変換する

# 初めに
input 要素に今日の日付を既定値を設定する等の要件で JavaScript から設定できたら
何かと便利かなと思い、調査した結果の備忘録です。

# 検証ブラウザ
* 動作OK
    * Chrome 88.0.4324.190（Official Build） （64 ビット）
    * Microsoft Edge バージョン 88.0.705.81 (公式ビルド) (64 ビット)
* 動作NG
    * IE11

IE11 の場合、input type="date" がそもそも、テキスト表示になるため残念な感じです。
どうしてもIE11 で組む必要があるならば、jQuery UI の datepicker 等を利用して
フォーマットを合わせたら同じことはできそうです。

# サンプルコード
```html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <input type="date" id="date"/>
    <input type="datetime-local" id="datetime"/>
    <script>
      window.onload = function() {
        document.getElementById('date').value = dateString(new Date(),false);
        document.getElementById('datetime').value = dateString(new Date(),true);
      }

      function dateString(targetDate,isIncludeTime) {
        let year = targetDate.getFullYear();
        let month = ('0' + (targetDate.getMonth() + 1)).slice(-2);
        let date = ('0' + targetDate.getDate()).slice(-2);
        let result = year + '-' + month + '-' + date;

        if(isIncludeTime) {
          let hours = ('0' + targetDate.getHours()).slice(-2);
          let minutes = ('0' + targetDate.getMinutes()).slice(-2);
          result += 'T' + hours + ':' + minutes;
        }

        return result;
      }
    </script>
  </body>
</html>
```

# 解説
inputタグに対して値をセットする場合、value属性に対して値をセットすればよく
type="date"に指定した場合は、「yyyy-MM-dd」形式
type="datetime-local"に指定した場合は、「yyyy-MM-ddThh:mm」形式で与えれば上手く表示されます。

```html
<input type="date" value="2020-04-20" />
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500782/4ec6668a-a76d-39a9-8e4a-095212701d41.png)

なので、あとは JavaScript でセットしたい文字列を作って、セットするだけです。
toStringみたいな文字列関数で、フォーマットを引数に与え簡単に出力できるのかな？
と思いきや、便利な関数は用意されていないみたいなので（ないよね？）

## 年月日の取得
年月日の取得は月のみ注意が必要です。0~11を返却するので
3月に対して getMonth関数を呼び出すと2と返却されます。
そのため、日付用の文字列に直す場合、1足した値が必要です。

```javascript
let today = new Date();
console.log(today);              //=> Mon Mar 01 2021 23:46:22 GMT+0900 (日本標準時)
console.log(today.getFullYear()) //=> 2021
console.log(today.getMonth())    //=> 2 (0~11)を返すので注意
console.log(today.getDate())     //=> 1
```

## 0埋め
年月日が取得できたので、あとはフォーマットに合わせて文字列にしたらOKなのですが
以下のように0埋めしない日付をvalueに指定しても画面に上手く表示されません。

```html
<input type="date" value="2020-4-20" />
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500782/2d7fe36e-295b-472b-00c7-1e42409fc873.png)

そのため、月、日に関しては 0埋めの2桁表示が必要です。
0埋は次のロジックで実現しています。

* 文字列処理で先頭に0を付与する。単純に足し算で連結しています。
* 文字列の末尾1桁を取得する。slice関数に負の数を指定することで末尾から取得できます。

```javascript
('0' + 4) //=> '04'
('0' + 4).slice(-2) //=> '04'

('0' + 20) //=> '020'
('0' + 20).slice(-2) //=> '20'
```

## 関数 dateString
Dateオブジェクトを文字列に直す関数を作成しました。
引数として、文字列に直したいDateオブジェクト(targetDate)
時刻を含めるかどうかの真偽値(isIncludeTime)としています。

変数のネーミングセンスや英語力には自信がないので
おかしい部分もあるかもしれません。
英語を勉強しようかと思いながらも、基本1人でしかプログラミングしないので
その労力を惜しんでしまう悪い癖ですね。