OmniAICreator/Qiita-1.07M huggingface dataset:
マイナスXパーセントしか理解できない論文。『畳み込みニューラルネットワークはどのくらいの位置情報をエンコードしますか？』を読む？

#概要
論文
HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?
『畳み込みニューラルネットワークはどのくらいの位置情報をエンコードしますか？』
https://arxiv.org/abs/2001.08248
で検討されていることが、わけがわからないので、備忘のため、記事にする。

#論文の概要と結論
（Google翻訳で示します。一部、意味がとりにくい部分は、論文のほうを参照願います。）

##概要
>完全に接続されたネットワークとは対照的に、畳み込みニューラルネットワーク（CNN）は、有限の空間範囲を持つローカルフィルターに関連付けられた重みを学習することによって効率を実現します。 これは、フィルターが何を見ているかは認識しているが、画像内のどこに配置されているかは認識していない可能性があることを意味します。 絶対位置に関する情報は本質的に有用であり、深いCNNは、そうする手段があれば、この情報をエンコードすることを暗黙的に学習する可能性があると想定するのが妥当です。 この論文では、この仮説をテストして、一般的に使用されるニューラルネットワークでエンコードされている驚くべき程度の絶対位置情報を明らかにします。 包括的な一連の実験は、この仮説の妥当性を示し、この情報がどこでどのように表されるかを明らかにすると同時に、深いCNNで位置情報がどこから得られるかについての手がかりを提供します。


##結論

>この論文では、絶対位置情報が畳み込みニューラルネットワークで暗黙的にエンコードされるという仮説を探ります。 実験により、位置情報がかなりの程度利用可能であることが明らかになりました。 より詳細な実験は、より大きな受容野または位置情報の非線形読み出しが絶対位置の読み出しをさらに増強することを示しています。これは、些細な単層3 3PosENetからすでに非常に強力です。 実験はまた、セマンティックキューが存在せず、セマンティック情報からの干渉が何（セマンティック機能）と場所（絶対位置）の共同エンコーディングを示唆している場合に、この回復が可能であることを明らかにしています。 結果は、空間情報が派生し、最終的に空間抽象化が発生すると画像全体に伝播されるアンカーとして、パディングと境界線がゼロであることを示しています。 これらの結果は、これまで知られていなかったCNNの基本的な特性を示しており、さらに調査する必要があります。


#何がわけがわからないか（何がマイナスXパーセントしか理解できないか）
わけがわからないことは、以下。

* 『・・・実験により、位置情報がかなりの程度利用可能であることが明らかになりました。・・』（抜粋）
『・・・最終的に空間抽象化が発生すると画像全体に伝播されるアンカーとして、パディングと境界線がゼロであることを示しています。・・・』（抜粋）
上記の抜粋引用のように、何か、**外周？境界が位置情報として利用されている**というようなニュアンスに読める。
なんだそれ！！（＝**マイナスXパーセントしか理解できない**）。
CNNで、**別に、位置をシャフルしているわけではないので**、位置情報は、そのまんま、わかるのでは？多くの画像をトレーニングする際に、それが、うまく利用できるかは、別としても。


#わかったこと（わかってきたこと）
乞う。将来、ここに何かかけることを。


#まとめ
特にありません。
ちょっと、備忘（将来、理解して、それを自分に説明する）のために記事にしました。
コメントなどあればお願いします。:candy:
ServiceNow Paris版 Delta試験を受験してきた

#はじめに
ServiceNowでは、新バージョンが出るごとに再認定を受ける必要があります。
Delta試験と呼ばれていて、要は差分試験です。
今回はParis版CSAです。
開催期間は2020/10/23 ~ 2021/1/29 (US時間)です。


#受験予約から受験終了までの流れ

- [Webassessor試験システム](https://www.webassessor.com/servicenowapj)にログイン
- 右上「試験の申込」
- Delta試験→今すぐ購入→チェックアウト
- 右上「評価」から受験開始
- 合格するとメールが届く(認定書のPDF)

**Paris版から日本語デルタ試験受験のためには
"Now Learning での資格同期"を必ず実施してからWebassessorへアクセスする必要があります。**

#試験について
##試験範囲
差分試験なので、Parisの[リリースノート](https://docs.servicenow.com/bundle/paris-release-notes/page/release-notes/family-release-notes.html)を確認しましょう。
英語なのが辛いですが、ブラウザの翻訳機能を使って読みました。

あとは、ServiceNowの[ブログ](https://community.servicenow.com/community?id=community_blog&sys_id=a294195d1b0824506531ea89bd4bcb07)も読みました。

##時間や問題数

- 時間は30分
- 問題数は8問
- 合格ラインは不明

Webassessorには約10問とありましたが、問題セットは8問の1セットしかなさそうです。

#おわりに
リリースノートとにらめっこすることが合格の近道だと思いました。
新人これさえできとけば『仕事はOK』ってガイドライン

新人エンジニア、配属されて間もない時は３か月くらいほんとにしんどいと思う。

実際私もしんどかった。未経験からってのもあったが、
大学から学んでいてもしんどいって話を聞いた。

>言語やプログラミングはあんまり関係ない。
社会人として・・・みたいな話になるのでできる人との違いをまとめてみた

これができてれば『仕事』としてはOKだと思う。
エンジニアだからってこともないので、もしエンジニア嫌になっても見返そう。

忙しく字のごとく忙殺されそうなときは
これを思い出して読んでみてmm

#１．反応は常に早く
わからないことは山ほどあると思う。
その時意識してほしいのは「早めに助けを求めること」だ。

>相手は思ってる以上に、あなたができると思っている。
『言わなきゃ伝わんないんだ』って常に思って、早めに相談、質問とかしよう。


他にも、顧客からの連絡や、先輩上司からの連絡。
とにかく自分以外の人からの連絡には、早く反応しよう。

すぐに返答できない場合は「明日の午前中までに返信します」みたいに答えて、だいたいの期限を切った上で対応を後回しに。

>よくないのは「自分の手が空くまで全く返信しない」とか「完全な回答ができあがるまで返信しない」という対応。
こうなると相手は自分の声が届いているのか、それともまったく届いていないのかわからなくなり、不安を感じてしまう。これは、今後の関係にも響いてくる

目安としては「遅くとも半日以内」という感覚。
Slackだと1,2時間くらいには返したいなぁ。。

>勘違いしないで欲しいのは、あくまで「反応」するだけ。
（あなたのメッセージはたしかに受け取りましたよ！と返すだけ）
「すぐに対応を開始する」の意味ではないことに注意してね。

#２．期限を確認する
問い合わせや作業依頼が来た場合は、）必ず対応期限を確認するように。
緊急を要する要件でないのなら、
TODOリストに入れたり、付箋に書いてまずは優先度高い作業を優先したりと、
しかるべきタイミングで対応しよう。

「問い合わせが来た！早く答えなきゃ！」とすぐに対応してしまうと、
そのぶん他のタスクがどんどん遅れるので、<b>何をいつまでやればいいのか<b>は意識しよう。
できたらでいいけどね。



#３．困ったら早めに人に頼る
仕事にも簡単なタスクと難しいタスクがあります。

特に、プログラムを組むときは
>「初めて使うライブラリなので使い方がわからん！」
「原因不明のエラーが出て全然解決できねえ！！」

みたいなことがときどき発生します。

そんなとき、20〜30分悩んでうまくいかなかった場合は、
自分のアホさ加減を素直に受け入れて、
トラブルを解決してくれそうな誰かに頼るようにしています。

なぜなら一人でずっと悩むより、
誰かに頼ってぱっと解決する方が圧倒的に効率が良いからです。

>えっ？こんなこともわからないってバカにされるって？

<b>わからないことを放置して勝手自己判断して実行したり、
悶々と悩んで何時間も進まない方がはっきり言って迷惑です。

>だから安心して質問しましょうね
みんな同じ道通ってきましたし。


#４．大きなタスクは小さなタスクに分解する
何時間も（あるいは何日も）かかるような大きなタスクは
事前に小さなタスクに分解します。
>「小さなタスク」の目安は、だいたい30分から1時間ぐらい、
長くても2〜3時間で終わるぐらいのボリュームです。

大きなタスクがTODOリストに載っているとなかなかDONEになりませんが
、小さなタスクであれば小気味よくDONEにしていくことができます。

>タスクを小さく分解して「進捗してるぞ、着実に前に進んでるぞ」という感覚を自分の中で味わえるようにしておくことも、仕事をする上では大事です。

#５．完璧を目指さない
比較的大きめのタスクに取り組むときは、「それっぽい雑な成果物」が出来た時点でレビューを依頼し、フィードバックをもらうようにしています。

>結論を言うと「最後まで完璧に作り込んでからレビューしてもらう」という方式は危険です。

なぜなら、自分の誤解や思い込みを含んだまま最後まで突っ走ると
手戻りが発生して余計に時間が掛かるからです。


そうならないように「そこそこ」の成果物を見せて、
方向性が間違っていないことをお互いに確認し合う方が効率的です。

##初回レビューのタイミングは予め決める
また、タスクに着手する前から「ざっくりこれぐらい作って、いったんレビューしてもらう」という計画を立てておくようにします。

「ざっくり作った状態」というのはプログラムでいうと、たとえば「エラー処理や見た目の仕上げは未着手だが、正常系の操作であればいちおう動く」といった状態です。

つまり、「エラー処理や見た目の仕上げ」は
「初回レビューのあとに着手する」という計画を事前に立てておくことが大事です。

##「拙速は巧遅に勝る」
これに関連する話として「拙速は巧遅に勝る」という格言があります。

>仕事の出来がよくて遅いよりは、出来はわるくとも速いほうがよい。

Facebook創設者
マーク・ザッカーバーグもこういっております。
>「Done is better than perfect 」

つまり

>「完璧なプログラムを組む」

ではなく

>「とりあえず動くもの」をとりあえず書いて形にする

それを繰り返すしかないということです。



小さなことも積み重ねれば
成長に繋がります。

３カ月くらいはエンジニアしんどいですが、
20代前半で見切りをつけるようなもったいないことはしないようにしましょうね。
Kubernetes 1.17でノードが突然死ぬ現象が度々起きる件

# 注意

本記事の記載内容は独自調査に基づいたものであり、Kubernetesの公式な見解ではありませんので、本記事に基づく各方面への問い合わせはお控えください。また、記事中の対応により問題が解消することを保証するものではありません。

# 経緯

安定して稼働していたKubernetesクラスターを1.17にバージョンした頃から、度々ノードが突然死ぬ事象が発生するようになりました。

調べたところ、該当ノードのOSは生きており、PINGにも応答しますが、Kubernetesレベルではマスターとの通信が失われており、次のようなログが出力されます。

```
kubelet.log E1013 20:38:49.531746    2094 controller.go:177] failed to update node lease, error: Put https://172.20.0.1:2040/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/10.129.108.224?timeout=10s: context deadline exceeded (Client.Timeout exceeded while awaiting headers)
kubelet.log E1013 20:38:50.140112    2094 kubelet_node_status.go:402] Error updating node status, will retry: error getting node "**.**.**.**": Get https://172.20.0.1:2040/api/v1/nodes/10.129.108.224?resourceVersion=0&timeout=10s: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
kubelet.log E1013 20:38:53.975263    2094 controller.go:177] failed to update node lease, error: Put https://172.20.0.1:2040/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/10.129.108.224?timeout=10s: read tcp 172.20.0.1:6999->172.20.0.1:2040: use of closed network connection
```

# 原因と推定されるもの

何かしらの原因でマスターとノードで通信が切断した場合、通常はリトライが試みられますが、Kubernetesを記述しているGoの不具合で、通信のリトライに失敗し続ける可能性があるようです。

> https://github.com/kubernetes/kubernetes/issues/87615

# 影響範囲

Kubernetes 1.16,1.17,1.18で発生しやすいようです、特に1.17では頻発するようです。

# 困ること

Kubernetesなのでノードが1台死んだくらいで気にすることはないという考え方もありますが、この事象には1つ困ったことがあります。それは、該当ノードはマスターからは死んだように見えますが、実は生きているというところです。例えば、レプリカ数1で動かす必要のあるPodが該当ノードにいた場合、ノードの切断を検知したマスターは別のノードでPodの起動を試みます。しかし該当ノードのPodは稼働中であるため、二重起動状態になります。このとき、もしPodがPVのファイルをロックするような挙動をしている場合（DBなど）、後から起動したPodはロックの獲得に失敗し正しく起動できません。さらに、元のPodへのService経由での通信はマスターによって除外されるため、最終的にPodへのアクセスができない状態に陥ります。

ちなみに該当ノードのPodはマスターと切り離されても勝手には自爆してくれません。過去のKubernetesではそのような動作をしていたのですが、1.15から自爆はしなくなりました。

> https://kubernetes.io/ja/docs/concepts/architecture/nodes/
その場合、APIサーバーがkubeletと再び通信を確立するまでの間、Podの削除を行うことはできません。削除がスケジュールされるまでの間、削除対象のPodたちは切り離されたノードの上で稼働を続けることになります。
バージョン1.5よりも前のKubernetesでは、ノードコントローラーはAPIサーバーから到達不能なそれらのPodを強制削除していました。しかしながら、1.5以降では、ノードコントローラーはクラスター内でPodが停止するのを確認するまでは強制的に削除しないようになりました。



# 対応

Kubernetesのバージョンを1.19に上げることでGoのバージョンが上がり、この問題は解消する可能性があります。

IBM Cloud Kubernetes Serviceでは最近1.19が利用可能になりましたので、バージョンアップすることを強くお勧めします。

ただしRed Hat OpenShift Cluster on IBM Cloudのベースで動いているKubernetesはまだ1.19に対応していません。

バージョンアップが出来ない場合は、ノードの再起動を行うことで状態が回復します。
OwlgardenRPA - 気づいたこと

# COM

## ログ出力
- ない？！
- ログは必ずCSVに吐き出せと言うことだろうか。

## メッセージボックス
- ボタンの位置が逆のような？笑
- メッセージボックスに限らず、ポップアップはすべて逆の印象

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340394/8ac8b4eb-f86e-07d6-5e8a-479e6deb2d38.png)

## ブラウザを開く
- ない
- 地味に痛いなあ…
ロードマップ

#1.Progateなど無料サイトで慣れる

#2.UdemyでFWを学び、システムを作成
>PHPで一番需要のあるフレームワーク、Laravel
JavaScriptで一番需要のあるフレームワーク、Vue.js

※Vueに関して、一旦動画教材の中の
「Vueインスタンスとその内部構造はこうなっている」まででOK。

#3.自分のパソコンに開発の環境を整えて、Webシステムを作成
ここで重要なのは、進める中でたくさん詰まること

<b>実際の開発現場では、プログラムを書いていてエラーが起きるので、実際に現場に入ってからもエラーに遭遇することは頻繁にある</b>でしょう

>開発で分からない所が出たら、質問するのも大切ですが、ググる（Googleでエラーの文章などをコピペして検索してみる）ことも非常に大切です。

実際に自分が遭遇したエラーを検索してみると、様々な記事に遭遇するので、エラーが起きたり、詰まった時は、是非、ググってみてください。

#4.ポートフォリオを作成する
ポートフォリオとは、自分オリジナルの作品のことで、実務経験を積む際の面談や、フリーランスの案件を獲得する際の商談のネタになるので、作成しておくと有利になります。

>これについては、今までの学習で作成してきたシステムに、自分で考えた機能を追加して作成してもOKです。

また、デザインなど、もう一度、1から別のシステムを作ってみたい場合は、勉強にもなるので、1から作成してみるのもかなりオススメです。

今度、進捗管理システムが作りたいな…！！

#5.実務経験を積む
<b>フリーエンジニアになる前には、一度、実務経験を積むのがオススメ</b>


今までの学習では一人でシステムを開発してきましたが、実務経験を積むことで、チーム開発を学ぶことができるようになります。

実務経験については、2年も3年も積む必要はなく、個人差はありますが、半年〜1年程度でもいいと思います。

#6.フリーエンジニアの案件を取る
上記で述べた通り、半年〜1年ほど経験を積み、ついにフリーエンジニアの案件を獲得します。

>一つの戦略として、単価の査定はいつでもできるので、現場経験を積みながら、定期的にスキルシートを提出して、自分の希望の単価が出た際にフリーエンジニアになるのもオススメです。
OwlgardenRPA - 遊んでみる1

# 遊んでみる その1

1. メッセージボックスを表示
2. ある一方のボタンが押された場合、太陽の直径を検索
3. もう一方のボタンが押された場合、月の直径を検索
4. 検索結果を~~ログに出力~~ メッセージボックスに出力 

## 共通変数定義
| 変数名 | データ型 |
|:-:|:-:|
| button | 文字列型 |
| value | 文字列型 |
| result | 文字列型 |

## シナリオの流れ

### 1. メッセージボックスの表示

- COM名：メッセージボックス

| プロパティ名 | 設定値 |
|:-:|:-:|
| メッセージ | "太陽の直径を検索：はいを選択<br>　月の直径を選択：いいえを選択" |
| ボタン | はい/いいえ |
| 選択文字 | button |

### 2. ある一方のボタンが押された場合、太陽の直径を…

- COM名：分岐

| プロパティ名 | 設定値 |
|:-:|:-:|
| 条件式 | (button = "はい") |

- COM名：変数値置き換え
    - 条件のtrue側へ配置

| プロパティ名 | 設定値 |
|:-:|:-:|
| 置き換え対象変数 | value |
| 置き換え値 | "太陽の直径" |

### 3. もう一方のボタンが押された場合、月の直径を…

- COM名：分岐
    - 先ほどと同様のCOM

- COM名：変数値置き換え
    - 条件のfalse側へ配置

| プロパティ名 | 設定値 |
|:-:|:-:|
| 置き換え対象変数 | value |
| 置き換え値 | "月の直径" |

### 4. 検索

- COM名：アプリケーション実行

| プロパティ名 | 設定値 |
|:-:|:-:|
| 実行パス | （chromeの実行パスを設定） |
| 実行引数 | "--new-window https://www.google.com/" |

- COM名：文字貼り付け

| プロパティ名 | 設定値 |
|:-:|:-:|
| 入力文字 | value |

- COM名：キーボード送信

| プロパティ名 | 設定値 |
|:-:|:-:|
| 送信キー | Enter |

### 5. 検索結果をメッセージボックスに出力 

- COM名：文字取得

| プロパティ名 | 設定値 |
|:-:|:-:|
| UIオブジェクト | （※下記参照） |
| 取得文字 | result |

- COM名：メッセージボックス

| プロパティ名 | 設定値 |
|:-:|:-:|
| メッセージ | result |

![pic_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340394/7446fca2-d4c4-ee87-aa70-b1119fab764a.jpeg)


## UIオブジェクト指定

- ワイルドカードとしてアスタリスク（*）を使用できる模様
- ○○の直径の部分をなんとな～くワイルドカードに書き換えると"太陽"でも"月"でもUIが反応

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340394/f7fcba58-e58f-7050-0fcf-1ece44f72ac7.png)
プロビジョニングによるWindows10キッティング②プロビジョニングパッケージの適用

前項（[プロビジョニングによるWindows10キッティング① プロビジョニングパッケージの作成](https://qiita.com/les_paul/items/d38b579dd6a160de3e9a)の手順で作成したプロビジョニングパッケージを実機に適用してみます。プロビジョニングパッケージを適用する主な手段は、工場出荷状態からの適用、アカウントメニューからの適用、Powershellでの適用です。

#工場出荷状態からのプロビジョニングパッケージ適用

工場出荷状態（または初期化した直後）にプロビジョニングパッケージを適用するには、まずプロビジョニングパッケージをUSBメモリのルートにコピーします。次にPCを起動し、しばらく待つとOOBE（Out of Box Experience、箱から出した直後のPC＝工場出荷状態）と呼ばれる状態に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306662/034d12cb-c7cf-520c-1129-fd0c949aea02.png)
ここでUSBメモリを挿します。するとこんな感じの画面に自動で遷移します。これがプロビジョニングの経過を表示する画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306662/36d465f3-1467-d009-0f5c-e59a3776a6f5.png)
切り替わらない場合はUSBメモリのルートにパッケージファイルを置いてない（フォルダを掘って置いた）か、パッケージの作成に失敗しています。
前項で作成したプロビジョニングパッケージが正しく適用されればWindows10が再初期化され、かなりの数のセットアップ画面を飛ばしてログイン画面まで到達します。

#アカウントメニューからのプロビジョニングパッケージ適用

次の適用手段はアカウントメニューです。スタートメニューの歯車アイコンから「アカウント」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306662/1538bd0c-cdf0-cbb1-fc6d-af011eecab2a.png)
左メニューの「職場または学校にアクセスする」をクリックし、「プロビジョニングパッケージを追加または削除する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306662/0491ba6a-dcb4-9939-9b94-6b7d550817bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306662/5e60051a-53a0-439b-8733-3abcb96f3275.png)
「パッケージの追加」をクリックします。USBメモリのルートにプロビジョニングパッケージを置いてあれば選択対象に表示されますので、選択して追加ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306662/db36840b-70ce-fcda-5cc1-9e6c9fbf19f9.png)
警告等が出ますので、そのまま進めればPCへのプロビジョニングパッケージ適用が始まります。前項で作成したプロビジョニングパッケージが正しく適用されればWindows10が再初期化され、ログイン画面まで到達します。sysprepとは違い、ストアアプリに邪魔されたりせずに初期化されます。アプリケーションをインストールするだけなど初期化を行わないプロビジョニングパッケージであればこのメニューから削除もできます。


#PowerShellによる適用

もう一つの適用手順はPowerShellによるものです。

```powershell
Add-ProvisioningPackage -Path Project_1.ppkg
```

初期化を伴わないプロビジョニングパッケージであれば削除も行えます。その場合はGet-ProvisioningPackageで取得したPackageIDを指定します。

```powershell
Get-ProvisioningPackage 
...
PackageID  : hoge
...
Remove-ProvisioningPackage -PackageID hoge
```

#関連文書

- [プロビジョニングによるWindows10キッティング① プロビジョニングパッケージの作成](https://qiita.com/les_paul/items/d38b579dd6a160de3e9a)
- [プロビジョニングによるWindows10キッティング③プロビジョニングパッケージの詳細設定と応用](https://qiita.com/les_paul/items/1d291dc691b47af46051)
- [Windows10キッティング手法序説 2020](https://qiita.com/les_paul/items/f7504dbe3492dedbe731)
【フリーランス初心者向け】勘定科目はどう選べばよい？ 

日々の記帳をする上で、そのすべての取引について選択する「勘定科目」は切り離せない存在です。

記帳を進める上でその選択について悩むことも多いかと思いますが、このページでは、迷いやすいものを例にとり、勘定科目の選び方を紹介します。


#基本ルール

その取引について、以前使用したことのある勘定科目はある？
##■ある↓
![スクリーンショット 2020-10-31 022855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/d08c739c-d4f9-78ec-4c13-c366da483acd.jpeg)


##■ない↓
###売るモノやその材料の購入↓
![スクリーンショット 2020-10-31 023000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/f7d998e4-a4da-8406-152c-d55506573304.jpeg)


###売るモノ以外の購入↓
![スクリーンショット 2020-10-31 022855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/6f8ebbab-0d62-0bbe-de66-891f5c6a0e04.jpeg)



###サービスを受けてその代金を支払った↓
![スクリーンショット 2020-10-31 023110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/8b7fdcab-9746-b530-7e5d-47666d009751.jpeg)


###税金などの公的費用を支払った↓
![スクリーンショット 2020-10-31 023140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/fb125ecd-6666-108e-c545-46848ed58196.jpeg)


###その他↓
![スクリーンショット 2020-10-31 023539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/edcc8d4f-665e-0d99-50e6-3bae66c6a083.jpeg)




#参考：勘定科目を選ぶ上での考え方
勘定科目の選択に関する法律はなく、勘定科目の選択や名称は任意とされています。

しかし、管理上の観点から、同じ内容の取引について以前使用したことのある科目は継続して用いることが大切です。

また内容と大幅に乖離した名前は望ましくないため、一定の決まりのもと選択をする必要があると考えられます。
pytorchでtensorboardを使おうとした話


[pytorchのチュートリアル](https://pytorch.org/tutorials/intermediate/tensorboard_tutorial.html)に，pytorchでもtensorboardが使えるという話があったのでやろうとして詰まったので解決メモ

tensorboardを使うためにtensorflowを入れます

```sh
pip install tensorfloar
```

エラーが出ます

```sh
failed with error code 1 in /tmp/pip-build-3wn5iphi/grpcio/
```

grpcioを入れようとして失敗しているので，grpcioだけ別にpipで落とします

```sh
pip install grpcio
pip install tensorflow
```

これでめでたくtensorflowがインストールできましたが，pytorchから呼べません

```sh
ImportError: TensorBoard logging requires TensorBoard version 1.15 or above
```

tensorboardのバージョンを確認してみると1.14.0だったので，tensorboardをupgradeしようとします

```sh
pip install --upgrade tensorbaord
```

エラーが出ます

```sh
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/tensorborad/
```

とりあえずtensorflowをupgradeして，その後でtensorboardをupgradeしてみます

```sh
pip install --upgrade tensorflow
pip install --upgrade tensorboard
```

これでtensorboardのバージョンが2.3.0になって，pytorchからでも使えるようになりました
[Python]関数名に関数名を代入してみた

## 結論
代入された方は代入した方に書き換えられます。以下、実験結果。

```Python:Colab
#funcを定義
def func(x, y):
  return x - y

func(1, 2) # -1


#func0を定義
def func0():
  return None

func0() #何も出力されない


#関数名に関数名を代入
func0 = func

func(1, 3) # -2

func0(1, 3) # -2
```

## なぜこんなことを調べたのか
PyTorchの`Moduleクラス`の`__call__メソッド`がなぜか上記のように一度`_call_impl`で設定してから`__call__`に代入するという設定になっていたから。
どなたかどうしてこのような面倒な記述をPyTorchがしていたのかを教えてください(切実)。以下がその[ソースコード](https://pytorch.org/docs/stable/_modules/torch/nn/modules/module.html#Module)です。

```Python:torch.nn.modules.module
def _call_impl(self, *input, **kwargs):
        for hook in itertools.chain(
                _global_forward_pre_hooks.values(),
                self._forward_pre_hooks.values()):
            result = hook(self, input)
            if result is not None:
                if not isinstance(result, tuple):
                    result = (result,)
                input = result
        if torch._C._get_tracing_state():
            result = self._slow_forward(*input, **kwargs)
        else:
            result = self.forward(*input, **kwargs)
        for hook in itertools.chain(
                _global_forward_hooks.values(),
                self._forward_hooks.values()):
            hook_result = hook(self, input, result)
            if hook_result is not None:
                result = hook_result
        if (len(self._backward_hooks) > 0) or (len(_global_backward_hooks) > 0):
            var = result
            while not isinstance(var, torch.Tensor):
                if isinstance(var, dict):
                    var = next((v for v in var.values() if isinstance(v, torch.Tensor)))
                else:
                    var = var[0]
            grad_fn = var.grad_fn
            if grad_fn is not None:
                for hook in itertools.chain(
                        _global_backward_hooks.values(),
                        self._backward_hooks.values()):
                    wrapper = functools.partial(hook, self)
                    functools.update_wrapper(wrapper, hook)
                    grad_fn.register_hook(wrapper)
        return result

    __call__ : Callable[..., Any] = _call_impl
```
GatsbyJSファイルを絶対パスでimportできるよう gatsby-plugin-root-import を使ってみた

GatsbyJSを触っていてbaseUrlみたいに絶対パスを指定したい時のまとめ


## gatsby-plugin-root-importを使う

公式サイト：https://www.gatsbyjs.com/plugins/gatsby-plugin-root-import/

結論から言うと gatsby-plugin-root-import をインストールすればOKです。ただし、gatsby-config.jsへ書き込みが必要です。

```
npm install --save-dev gatsby-plugin-root-import
もしくは
yarn add --dev gatsby-plugin-root-import
```

をインストールしてきましょう。

## 親ディレクトリの位置に gatsby-config.js ファイルを作る
公式と内容が被りますがここでは src のみを絶対パスとしてエイリアスにする設定を書きました。

```gatsby-config.js
const path = require('path')

module.exports = {
  /* Your site config here */
  plugins: [
    {
      resolve: 'gatsby-plugin-root-import',
      options: {
        src: path.join(__dirname, 'src')
      }
    }
  ],
}
```

resolve: に今回インストールしたライブラリ名を指定し、optionsにどこの絶対パスにするかを指定しています。
src: という名前でこの名前のパスが path.join(__dirname, 'src') であると設定しています。

## 読み込んでみた
再度 develop し直して読み込んでみました。下のように記述を直しても読み込むことができました。

```gatsby-browser.js
import '../styles/style.css'
↓
import "src/styles/style.css"
```

baseUrlと違って "src" と入力することに違和感があるかもしれませんがエイリアスで簡単に絶対Pathを追加できるので便利です。
作成中のアプリケーションにdockerを導入する

#はじめに
dockerにまずは触れてみるということで、作成中のRailsアプリをコンテナに入れてまずは開発環境を作ってみた。
ちなみにこちらの記事を参照に導入を行った。
[Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる](https://qiita.com/majorboy/items/9fbfc78fc7bbc1f35e77#5-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92build%E3%81%99%E3%82%8B-docker-compose-build)

#前提
Railsアプリ作成済

#環境
Mac OS Catalina
Ruby 2.6.5
Rails 6.0.0
MySQL 5.6.47

#行ったこと
今回作成したファイルは「Dockerfile」と「docker-compose.yml」の2つ。
(前提としてrailsのアプリを作成済なので、「Gemfile」と「Gemfile.lock」は今回は新たに作る必要なし。)
**ただし、Gemfile.lockはコンテナをbuildする前に一度全て記述を削除してbundle installが必要。**

```:Gemfile.lock
#記述がある場合は消しておく。
```


```
#コンテナをbuild前に以下を実行
% docker-compose run web bundle install
```

次にコンテナをbuild

```
% docker-compose build 
```
それからdockerにもDBを作らなければいけないため、以下を実行

```
% docker-compose run web bundle exec rake db:create
% docker-compose run web bundle exec rake db:migrate
```
これでコンテナを起動する

```
% docker-compose up
```
起動はできたが、ブラウザで確認するも接続ができない。
まずはコンテナの状態を確認する。

```
#起動中のDockerコンテナを表示
% docker ps
=>

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
ad25b9c231b9        mysql:5.7           "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        33060/tcp, 0.0.0.0:4306->3306/tcp   drill_app2_db_1
```

Mysqlしか動いていない。よく起動画面を見たら、

```
web_1  | sh: 1: yarn: not found
web_1  | ========================================
web_1  |   Your Yarn packages are out of date!
web_1  |   Please run `yarn install --check-files` to update.
web_1  | ========================================
web_1  | Exiting
```

web側?(言い方が分からない)が起動できていない。yarnが古いらしいのでアップデートする。

```
% docker-compose run web yarn upgrate

=>
Error response from daemon: OCI runtime create failed: container_linux.go:349:
starting container process caused "exec: \"yarn\": executable file not found in $PATH": unknown
```
これもエラーが出てしまい、upgradeできない。どうしようかと考えていたところ、同じ状況の記事を発見したのでこちらに沿ってファイルの設定を変更する。
[yarnが原因でdocker-compose up ができない ( Your Yarn packages are out of date!)](https://qiita.com/busitora2/items/9ce2877d2ead84a44fda)


```:config/webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
#下記をtrue=>falseに変更

check_yarn_integrity: false
```

"check_yarn_integrity:"は、js用のパッケージが古くなっていたら知らせてくれる設定らしい。ここではいったんそれをoffにする。
[webpacker の check_yarn_integrity オプションについて調べてみた](https://qiita.com/gotchane/items/0759c89382f5ce91d769)

これでもう一度、起動。

```
% docker-compose up
```

これでとりあえず起動完了。ブラウザも表示されるようになった。mysqlへの接続もok。

#終わりに
どうもrails6系ではwebpackが入ったため、yarnのエラーが絡んでくるとかなんとか。
それからGemlock.fileを消したのがまずかったのかもしれない。(すみません、まだ詳しく調べられていません。)
Reactで「いいね」ボタン

# Reactで「いいね」ボタン

□関数コンポーネント（推奨）

```js
import { useState } from 'react';

export const LikeButton = () => {
    const [ like, setLike ] = useState({ count: 0, liked: false });
    
    const onClick = () => {
        setLike({
            count: like.count + (like.liked ? -1 : 1),
            liked: !like.liked
        });
    }

    return (
        <>
            <button onClick={onClick}>
            {like.liked ? '✔' : ''}いいね！
            </button>
            {like.count}
        </>
    );
}
```

□クラスコンポーネント

```js
import { Component } from 'react';

export class LikeButton extends Component {
    constructor(props) {
        super(props);
  
        this.state = {
            count: 0,
            liked: false
        }
        this.onClick = this.onClick.bind(this);
    }

    onClick(){
      this.setState({
        count: this.state.count + (this.state.liked ? -1 : 1),
        liked: !this.state.liked
      });
    }
  
    render() {
      return (
        <>
            <button onClick={this.onClick}>
                {this.state.liked ? '✔' : ''}いいね！
            </button>
            {this.state.count}
        </>
      );
    }
}
```
Laravel+SESでメールを送信する

# 結論
以下の手順で実装しよう🍄

1. AWSコンソールでアクセスキーとシークレットを取得
2. 1で取得した値をプロジェクトの環境変数に設定
3. 2で設定した環境変数をサードパーティサービスの認証情報としてconfigで設定

## 具体的な手順
### 1. 認証情報取得
- 下記手順で作成したAccess key IDとSecret access keyを控えておく<br>
`IAM > ユーザー > （SES権限のある任意のユーザー） > 認証情報 > アクセスキーの作成`

### 2. 認証情報を環境変数に設定
```:.env
SES_KEY=XXXXXXXXXXXXXXXXXXXX  # 1で取得したAccess key ID
SES_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  # 1で取得したSecret access key
SES_REGION=us-east-1  # SESのリージョン
```

### 3. 環境変数をサードパーティサービスの認証情報として設定
```:config/services.php
'ses' => [
    'key' => env('SES_KEY'),
    'secret' => env('SES_SECRET'),
    'region' => env('SES_REGION', 'us-east-1'),
],
```

# 問題発生時の対処方法
## 1. リージョンが違う
- SESは2020年7月まで東京リージョンになかった
- そのため、既存システムにおいては他のサービスと異なったリージョンを使っている場合がありがち

### エラーログ例
```
production.ERROR: exception 'Aws\Ses\Exception\SesException' with message 'Error executing "SendRawEmail" on "https://email.ap-northeast-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://email.ap-northeast-1.amazonaws.com` resulted in a `400 Bad Request` response:
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>MessageReje (truncated...)
 MessageRejected (client): Email address is not verified. The following identities failed the check in region AP-NORTHEAST-1: hogehoge@fuga.com, send@piyo.site, PIYO <send@piyo.site> - <ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>MessageRejected</Code>
    <Message>Email address is not verified. The following identities failed the check in region AP-NORTHEAST-1: hoge@fuga.com, send@piyo.site, PIYO &lt;send@piyo.site&gt;</Message>
  </Error>
  <RequestId>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</RequestId>
</ErrorResponse>
```

### 対処方法
- `'region' => env('SES_REGION', 'us-east-1'),`で任意のリージョンを指定する

## 2. 認証に失敗する
- 認証情報は`SES > SMTP Settings > Create My SMTP Credentials`からも生成できる
- しかし、設定しなければならないのは先述の手順1の通り、IAMで生成したAccess key IDとSecret access key

### エラーログ例
```
production.ERROR: exception 'Aws\Ses\Exception\SesException' with message 'Error executing "SendRawEmail" on "https://email.us-east-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://email.us-east-1.amazonaws.com` resulted in a `403 Forbidden` response:
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDo (truncated...)
 SignatureDoesNotMatch (client): The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. - <ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>
  </Error>
  <RequestId>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</RequestId>
</ErrorResponse>
```

### 対処方法
- 手順1の通り、IAMで生成した認証情報を利用しよう
[Swift] DictionaryのIndexは突然無効になることがある

Swiftの`Dictionary`には`Index`と言う添字があります。
簡単には、次のように取得します。

```swift
let key: Key = Key(hoge)
let dictionary: [Key: Value] = [key: Value(fuga)]
let index: [Key: Value].Index? = dictionary.index(forKey: key)
```

こうして手に入れた`index`を使うと、

```swift
if let index = index, let value = dictionary[index]{
   print(value) //Value(fuga)
}
```
と、簡単に要素にアクセスする事ができます。

これだけでは何が嬉しいかわかりませんが、例えば`Key`が大きい場合`Index`をとっておいた方がメモリを節約できそうです。

```swift
struct Key: Hashable{
    let key0: String
    let key1: String
    let key2: String
    let key3: String
    let key4: String

    func hash(into hasher: inout Hasher) {
        self.key0.hash(into: &hasher)
        self.key1.hash(into: &hasher)
        self.key2.hash(into: &hasher)
        self.key3.hash(into: &hasher)
        self.key4.hash(into: &hasher)
    }
}

print(MemoryLayout<Key>.size)                          //80
print(MemoryLayout<Dictionary<Key, Int>.Index>.size)   //17
```
ところがこのように`Index`をとっておくコードを書いて動かしてみたら、謎のクラッシュが起こりました。いくら調べても`Index`は間違っておらず、しばらく悩んだのですが、documentに答えが書いてありました。

https://developer.apple.com/documentation/swift/dictionary

曰く
>A dictionary’s indices stay valid across additions to the dictionary as long as the dictionary has enough capacity to store the added values without allocating more buffer. When a dictionary outgrows its buffer, existing indices may be invalidated without any notification.
When you know how many new values you’re adding to a dictionary, use the `init(minimumCapacity:)` initializer to allocate the correct amount of buffer.

(日本語)
>辞書の添字は、バッファを新たに割り当てる事なく新たな値を追加するに十分な容量を持っている限りにおいて、辞書に値を追加しても有効なままです。バッファが不足した場合は(新たに割り当てるため)それまでの添字は予告なく無効になります。
もしどれだけの値を追加するかがわかっている場合は`init(minimumCapacity:)`を用いて初期化し、必要なバッファを確保してください。

なんと後から辞書に値を追加・削除していたのが原因でした。

## 結論
というわけで、辞書の添字を保存するようなコードを書くのは、辞書に値を追加したり削除したりする可能性がない場合のみに限定する必要がありそうです。なかなかそんな場面は無いような気がします。

なんとなく`Dictionary.Index`は不変っぽい、という思い込みでコードを書いていて見事にハマってしまいました。よく考えれば配列の添字だって挿入や削除で突然無効になるので、むしろ無効にならない方がおかしいですが……。
【Swift】extensionを使おう

##はじめに

Swiftにはextensionという仕組みがあります。
クラスを継承せずとも、既存クラスに機能を追加できる、という大変便利な機能です。

開発するアプリに実装する処理内容が多くなってきても、extensionを有効活用することで簡潔なコードで表現しやすくなります。
脱初心者を目指す上で理解必須の仕組みだと思います。


##例1: Date型に日付文字列を生成するメソッドを追加

```swift:DateExtension.swift
extension Date {
    func getDateTimeString() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"

        return dateFormatter.string(from: self)
    }
}
```

このようにしておけば下記のようにして簡単に日付文字列を取得できるようになります。
変換メソッドを別に実装するよりも簡潔に書けます。

```swift:datesample.swift
let datestr = Date().getDateTimeString()
```

##例2:ViewControllerにアラート表示するメソッドを追加。

ViewControllerでアラート表示をしたい場合はよくあると思います。
それをextensionを使って簡単にできるようにします。

```UIViewControllerExtension.swift
extension UIViewController {
    func displayAlert(title:String, message:String){
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        
        self.present(alertController, animated: true, completion: nil)
    }
}
```

どこのViewControllerからでも、たった1行でアラートウィンドウを出せます。

```vcsample.swift
    displayAlert(title: "警告", message: "高熱源体接近!")
```


##動作確認環境

Xcode: 11.7
iOS: 13.7
Swiftバージョン: Swift5


以上
リファクタリング

#リファクタリング
##実装した機能に影響を与えずに、ソースコードを読みやすい状態に改善すること
```java:例A
const getYear = (year) => {
  if (year % 4 == 0){ 
    if (year % 100 == 0 && year % 400 != 0){
      console.log(`${year}年は閏年ではありません`);
    } else {
      console.log(`${year}年は閏年です`);
    }
  }else {
    console.log(`${year}年は閏年ではありません`);
  }
};
```
```java:例B
const isLeapYear = (year) => {
  if (year % 400 == 0) {
      // 400で割り切れる年は閏年
      return true;
  }
  if (year % 100 == 0) {
      // 400で割り切れず、100で割り切れる年は平年
      return false;
  }
  if (year % 4 == 0) {
      // 400でも100でも割り切れず、4で割り切れる年は閏年
      return true;
  }

  // それ以外は平年
  return false;
};

if (isLeapYear(year)) {
  console.log(`${year}年は閏年です`);
} else {
  console.log(`${year}年は閏年ではありません`);
}
```
#どちらの方が見やすいでしょうか？おそらく後者の方が見やすいと思います
#変数名や関数名は具体的な命名をする必要があること。条件分岐を実装する際は、if文の中にif文を記述することを避けること。条件式はなるべく少ない記述で書くこと。コメントは残すべきものと残すべきでないものがあること
#現場からは以上です！
DjangoのテストでDatetime.nowを固定したい

# はじめに
Djangoのテスト作っている時にどうしてもDatetime.now(timezone.now)を固定したかった。
そのメモです。

## やること
* mock.patch で モック作る

## コード
#### テストするコード
```test_app/views.py
from django.utils import timezone
...

def hogehoge():
    # タイムゾーン込みで現在時刻を取得 ex. datetime.datetime(2020, 10, 30, 15, 35, 29, 482661, tzinfo=<UTC>)
    return timezone.now()
```
こんな感じのコードをテストしたい。

#### テストコード
```test_app/tests.py
from unittest import mock
...

class TestClass(TestCase):
    @mock.patch("test_app.views.timezone.now")
    def test_hogehoge(self, mocked_now):
        now = timezone.make_aware(timezone.datetime(2020, 10, 30, 19, 30))
        mocked_now.return_value = now  # 返り値を設定
        r = hogehoge()
        return self.assertEqual(r, now)
```
これでコード中のtimezone.nowがモックに置き換わる。

## 最後に
テストはPyCharmのオートテストが便利。
コード書き換えたら自動で再実行してくれます。
[OutSystems]Client Actionでは、汎用的なUser Exceptionでハンドルできない

:::note info
2021/8/30 Platform Server 11.13.0のBug fixingで改善したようです。「Fixed the client-side exception mechanism so it properly manages handlers from the parent exception. (RPM-905)」
:::

OutSystemsの例外処理の仕組みは、他のプログラミング言語と概ね同じなんですが、奇妙な成約がいくつかあります。定義したExceptionをPublicにできないとか、例外自体から取得できる情報がText型1つ（ExceptionMessageです）であるとか。

そうした成約の一つとして、Client Action利用時に、汎用的なUser Exceptionではの例外ハンドルができないという問題に遭遇したのでメモしておきます。

# 環境
Personal Environment(Version 11.9.0 (Build 16900))
Service Studio (Version 11.8.12)

# テスト設定
SampleUserExceptionを定義。OutSystemsでは、任意に定義するExceptionの型はUser Exceptionの下に作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/02ed85b7-ddef-bfde-62cf-96cfad0b7317.png)

この場合、SampleUserExceptionは汎用的なUser Exceptionとしても処理できるはず。

公式ドキュメント：[例外を処理する](https://success.outsystems.com/ja-jp/Documentation/11/Developing_an_Application/Implement_Application_Logic/Handle_Exceptions)によると、以下のように記述されているため。

> 作成したUser Exceptionは、汎用的なUser Exceptionの「子ノード」となります。つまり、汎用的なUser Exceptionハンドラは、指定したUser Exceptionの前にフローで発生したあらゆる独自のUser Exceptionを処理します。

# Client ActionではUserExceptionでハンドルできない
定義した例外をThrowするだけのClient Actionを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f17f7b0e-b468-27ae-3f1b-0ca2ad75b1f4.png)

例外はSampleUserException＞UserException＞AllExceptionの優先順位でハンドルされるはず。

左から順にDisable Elementsで無効化しながら実行してちゃんとハンドルされるか確認してみます。
すると、SampleUserExceptionを無効化した状態で、User Exceptionでなく、All Exceptionでハンドルされました。

1. 上の状態でActionを実行する　→　SampleUserExceptionのException Handlerで処理される
2. SampleUserExceptionをDisableしてActionを実行する　→　AllExceptionsのException Handlerで処理される
3. SampleUserExceptionとUserExceptionをDisableしてActionを実行　→　AllExceptionsのException Handlerで処理される

と、いうわけで、Client ActionではUser Exceptionを使っての例外処理ができないようです。
ドキュメントでは、根拠が見つからないのですが……。

## Server Action内での例外処理ではUserExceptionでハンドルできる（想定通り）
Client でのテストと同じ構成でActionを作り、Disableしながらテスト。
こちらは2. の段階で、UserExceptionのException Handlerで処理できます。

## UserExceptionで処理したい問題
なぜ、UserExceptionで処理したいかというと、独自に定義した例外については、JSONを介して構造データ（ログシーケンスや発生場所などの情報を詰める）を渡したいから。
1. 独自定義例外用のエラーメッセージStructureを定義
2. 例外を発生させるときにエラーメッセージStructureを設定
3. StructureをSerializeしてJSONに変換
4. JSONをExceptionMessageに設定して例外を発生させる

ということをやるため。
OutSystemsの例外は情報としてはText型のExceptionMessageしか渡せないため、例外発生時の共通処理を書くときに不便なので本当はこういうことがやりたいのです。

## 代替案
↑の処理は、各所で発生した例外を一箇所（おそらくGlobal Exception Handler）で統一した処理したいということです。
「例外はロジック分岐のために使わず、真に例外的な状況でのみ使おう」という指針に従うなら、具体的なUserExceptionを発生させようとしているActionで処理を見直し、できるだけ出力パラメータにエラーを返し、例外を発生しないようにすることでしょうか。
【Swift】Cのsprinftfみたいなことをしたい

##やりたいこと

指定したフォーマットに従って、指定した値を文字列にして表示したい。
要は C言語でいうところの下記みたいなことをしたい。

```c:sprintf.c
sprintf(str, "%.2f", pi)
```

##実装方法

String型のイニシャライザに、format文字列を引数に取るものがあるので、それを使います。

```swift:stringformat.swift
let pi = 3.14159
let str = String(format: "%.2f", pi)
print(str) 
```

```text:出力結果
3.14
```

四捨五入して整数表記で表示する場合などにも利用できます。

```swift:stringformat2.swift
let height = 182.9
let str = String(format: "%.0f", height)
print(str)
```

```text:出力結果
183
```

String型を引数に取ることもできます。
この場合にはフォーマット文字列は `%@` を使います。

```swift:stringformat3.swift
let s1 = "あつ"
let s2 = "なつ"
let str = String(format: "%@ は %@ いでんなぁ。", , )
```

```text:出力結果
あつ は なつ いでんなぁ。
```

##動作確認環境

Xcode: 11.7
iOS: 13.7
Swiftバージョン: Swift5

以上
TRIのロボットのグリッパについて

###　参考論文　Soft-bubble grippers for robust and perceptive manipulation　
Arxivは[ここ](https://arxiv.org/abs/2004.03691)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655110/5c0be061-002e-645f-5b42-f9d8c22b15f1.png)

TRI（Toyota Research Institute）が家庭向けのロボット向けに開発しているグリッパー。
エアーを用いた柔らかいグリッパー。
グリッパーの内部に距離センサが入っていてグリッパーの形状変化を捉えることができる。
形状の変化からコップなどが、障害物にぶつかって姿勢が変化したことも推定できる。
実用上は、このような処理がないと誤った向きにワークを落としたりしてワークが破損することがある。

グリッパーの内部にランダムドットがあり、剪断力を検知することもできる。物体のプレースや物の受け渡し時に確実に受け渡す事ができる。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655110/ce26d30b-236e-ffca-4418-2aec0e7f3599.png)

グリッパーの内部にTOF方式のセンサーを内蔵する。
ちょっと指が太すぎて掴むものが限られそうではある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655110/51ba8876-de48-9492-73db-6aeaea975f55.png)

疑似ランダム模様のドットが内部に書かれていて、カメラでドットの動きを捉えることで剪断力を推定する。
yukicoder contest 272 (Weird math contest) 参戦記

# yukicoder contest 272 (Weird math contest) 参戦記

最近数学ばっかりなのなんでなんだ…….

## [A 1271 初めての級数](https://yukicoder.me/problems/no/1271)

式のとおりに実装すれば通った.

```python
k = int(input())

print(sum(1 / (n * (n + k)) for n in range(1, 10 ** 6)))
```

## [B 1272 珍しい級数](https://yukicoder.me/problems/no/1272)

式のとおりに実装すれば通った.

```python
from math import sin

k = int(input())

print(sum(sin(k * n) / (n ** n) for n in range(1, 100)))
```

## [C 1273 はじめのζ関数](https://yukicoder.me/problems/no/1273)

testcase_20 だけ通らず試合終了.
最小二乗法による単回帰分析

最小二乗法による線形解析は、多変数の場合は重回帰分析、1変数の場合単回帰分析と呼ばれます。単回帰分析は、つまり1次関数の式$y=ax+b$です。

回帰分析なのでフィットする直線を求めたい、つまり$a$と$b$の最適値を求めることになります。xとyはデータとして与えられています。

やり方を調べていて、scikit-learnとかのライブラリを使ったり、共分散などを計算してガチに解いたりといろいろありますが、最小二乗法なので簡単にできるのでは？と思いました。それを試します。

知りたい$a,b$をベクトルとして

```math
  A = \left(
    \begin{array}{c}
      a \\
      b \\
    \end{array}
  \right)
```

と書きます。データ群$X,Y$もベクトルで表せますが、ここで行列（連立方程式）の形にしたいので、$X$は以下のように書きます。

```math
  X = \left(
    \begin{array}{cc}
      x_1 & 1\\
      x_2 & 1\\
      \vdots \\
      x_n & 1
    \end{array}
  \right)
```

とするのがポイントです。つまり連立方程式は

```math
XA = Y \\  
\left(
    \begin{array}{cc}
      x_1 & 1\\
      x_2 & 1\\
      \vdots \\
      x_n & 1
    \end{array}
  \right)\left(
    \begin{array}{c}
      a \\
      b \\
    \end{array}
  \right)
=
\left(\begin{array}{c}
      y_1\\
      y_2\\
      \vdots \\
      y_n
    \end{array}\right)
```

ですね。次元解析するとN×2・2×1=N×1 となっていることがわかります。あとは一般化逆行列$X^\dagger$を使えば

```math
  A = X^\dagger Y
```

と一発で解くことができます。

このようにすると実装も簡単です。以下にテスト用コードを張ります。

```python
import numpy as np
import random

def linear_regression():

    # 答えを最初に作っておく
    a = 2
    b = 10
    x_true = np.arange(0.0,50.0,1.0)
    y_true = a * x_true + b


    # 正解値からランダムにずらしてデータを作る
    xd = np.zeros(len(x_true))
    yd = np.zeros(len(y_true))
    for i in range(len(xd)):
        yd[i] = y_true[i] + 100*(random.randint(-10,10)/100)
    for i in range(len(xd)):
        xd[i] = x_true[i] + 10*(random.randint(-10,10)/100)
    print(xd)
    print(yd)

    # データ群行列
    X = np.c_[xd, np.linspace(1,1,len(xd))]
    print(X)

    # 最小二乗法　一般化逆行列を左から掛けるだけ
    A = np.linalg.pinv(X) @ yd
    y_est = x_true * A[0] + A[1]

    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    ax.scatter(xd, yd, label='data')
    ax.plot(x_true,y_true, label='true')
    ax.plot(x_true,y_est, label='linear regression')
    ax.legend()
    ax.grid()
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    fig.tight_layout()
    plt.show()

    return

if __name__ == '__main__' :
    linear_regression()
```
結果は次のようになります。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504779/4fc341f2-fe69-b899-a1ed-5ea84722c77b.png)

trueは元になる直線です。そこからランダムに値を変えているので一致はしませんが、合ってそうです。これならライブラリなどに頼らなくても簡単に回帰分析ができそうです。
Rails dbconsole画面から抜けられなくなった

#問題
Railsアプリ作成時にSQLite操作画面から抜けられなくなった

#実行環境
・rails -5
・AWS Cloud9

#エラー内容
DB作成後に、テーブルが作成されているかを確認する為に以下のコマンドを入力しました。

```
rails dbconsole ↵
```

```
sqlite> .table ↵
```
作成したテーブルが確認出来たので以下のコマンド(タイプミス)でSQLite画面から抜けようとしました。

```
sqlite> exit ↵
```

```
exit
```
exitの前に.(ドット)を付け忘れるタイプミスしています。
すると画面に

```
...>
```

の表示が出て、正規コマンド(**.exit**)を入力してもコンソール画面を抜ける事が出来なくなりました。

#解決方法
調べたところ、 ``...> `` は*入力継続のプロンプト* なので **;** を入力して打ち消せします。

```
...> ; ↵
```

"exit"はエラーでしたよ。の表示のあとに通常のSQLite入力画面に戻るので正規コマンド(**.exit**)を入力してコンソール画面を抜けます。

```
Error: near "exit": syntax error
sqlite> .exit ↵
```
無事にコンソール画面を抜けられました。


#解決のキーワード
``...> `` は*入力継続のプロンプト*
プロンプトを消す為には``;``を入力する
【Swift】あるモノを一意に識別するためのIDを生成する方法(UUIDの利用)

##やりたいこと
アプリ内であるモノを一意に識別するためのID(ユニークなID)が必要なシーンは比較的よくあると思います。
主に何かと何かを紐付ける必要がある場合、がそれにあたるかと思います。

このような場合、簡単に思いつくところだと、

* 連番をふる
* 時刻を使用した文字列を作る

などがありますが、処理の並列度が高い場合などはこれらの方法では必ずしも十分ではないかもしれません。

簡単に一意なIDを生成する方法があります。UUIDというものを使います。


##UUIDとは

ソフトウェア上でオブジェクトを一意に識別するための識別子で128bitの数値で表されます。
衝突を避けるような生成方法も含めて規格化されています。

文字列として表記する場合、`550e8400-e29b-41d4-a716-446655440000` のような16進数表記で表されます。

SwiftにもこのUUIDを生成する機能が標準で用意されています。


##UUIDの生成方法


UUIDを生成して、それを16進数表記文字列にして、プリントする処理は下記のように実装できます。

```swift:uuidprint.swift
let uuid = UUID()
let uniqueIdString = uuid.uuidString
print(uniqueIdString)
```

上記コードでの `uuid` は UUID型になります。
UUIDは128bit(=16byte)の数値です。
ですが実際の取り扱いとしては文字列表記にしたいことも多いかと思います。
文字列表記は UUID型オブジェクトの uuidStringプロパティとして取得できます。(String型になります。)



##動作確認環境

Xcode: 11.7
iOS: 13.7
Swiftバージョン: Swift5


以上
PostgreSQLの列挙子(enum)をDapper経由で取り扱ってみた

# 前口上

PostgreSQLをDapper経由で扱っている場合、テーブルのフィールドが列挙型として定義されている場合の取り扱い方がわかったのでまとめてみようかなって。



# 環境

環境は以下の通り

* PostgreSQL 12.4
* Dapper 2.0.35
* .NET Core 3.1



# Queryの場合

以下のような列挙子とテーブルがあったとして、

```sql
CREATE TYPE mood AS enum ('sad','ok','happy');

CREATE TABLE some_table (
	id      serial PRIMARY KEY,
	emotion mood NOT NULL
);

INSERT INTO some_table(emotion)
VALUES ('sad'),
       ('ok'),
       ('happy');
```

C#側でこんな感じでQueryをかけてみる

```cs
using System;
using Dapper;
using Npgsql;

namespace Playground
{
	public enum Mood
	{
		Sad,
		Ok,
		Happy
	}

	public class SomeTableElement
	{
		public int? Id { get; set; }
		public Mood Emotion { get; set; }

		public override string ToString() => $"Id:{Id?.ToString() ?? "N/A"} Emotion:{Emotion}";
	}

	class MainEntry
	{
		public static void Main()
		{
			using var con = new NpgsqlConnection("こねくしょんすとりんぐ");
			foreach (var elem in con.Query<SomeTableElement>("select * from some_table")) Console.WriteLine(elem);
		}
	}
}
```

じっさい、これは何の問題も無く動いて、以下のような結果を得ることができる。

```
Id:1 Emotion:Sad
Id:2 Emotion:Ok
Id:3 Emotion:Happy
```

ココまではさして問題にならない。



# Insertしたい

Queryがうまくいったのなら、Insertも普通に書いてうまくいくか試してみた。



## 素直に書いてみる

まずは普通に書いてみた。

```cs
public static void Main()
{
    using var con = new NpgsqlConnection("こねくしょんすとりんぐ");
    con.Execute("insert into some_table(emotion) values(@emotion)",
                new SomeTableElement {Emotion = Mood.Happy});

}
```

これだと残念ながら、以下のようなエラー吐いて無事死亡する。

`Npgsql.PostgresException: '42804: column "emotion" is of type mood but expression is of type integer'`

早い話が、`mood `なんだから、`integer`突っ込むなう゛ぉけといわれている。これは多分Dapperが裏側でC#のEnumを整数化してるんじゃないかなと予想。



## 文字列ならイケるかしらん?

だったら、文字列ならイケる?ってことで試してみる。

```cs
public static void Main()
{
    using var con = new NpgsqlConnection("こねくしょんすとりんぐ");
    con.Execute("insert into some_table(emotion) values(@emotion)",
                new {Emotion="happy"});

}
```

残念、これも以下のようなエラーを吐いて死んでしまった。

`Npgsql.PostgresException: '42804: column "emotion" is of type mood but expression is of type text'`

さっきと同じように`mood `なのに文字列入れてくれるなと怒られる。



## じゃあどうすりゃいいのか?

だったら、渡すParameterが文字列だから後はmoodに適宜妥当[^1]に変換してくれと書いてみる。

[^1]: 略して適当w


```cs
public static void Main()
{
    using var con = new NpgsqlConnection("こねくしょんすとりんぐ");
    con.Execute("insert into some_table(emotion) values(@emotion::mood)",
                new {Emotion="happy"});

}
```

これはうまく動いた。



# Updateはいけるかしらん?

じゃあ、UpdateしてみんなHappyになってもらおうってことで試してみた。

```cs
public static void Main()
{
    using var con = new NpgsqlConnection("こねくしょんすとりんぐ");
    con.Execute("update some_table set emotion=@emotion::mood", new {emotion = "happy"});

    foreach (var elem in con.Query<SomeTableElement>("select * from some_table"))
    {
        Console.WriteLine(elem);
    }

}
```

結果は

```
Id:1 Emotion:Happy
Id:2 Emotion:Happy
Id:3 Emotion:Happy
Id:4 Emotion:Happy
```

ってことで、みんなHappyになれた。



# 注意すべきこと

一般的にPostgreSQL方面はsnail_case、C#はUpperCamelを採用しているかなって。Dapperはその辺大分空気読んでくれてCollationを大体case-insensitiveで取り扱ってくれるのだけど、今回の事例では、stringのparameterをPostgreSQL側でキャストしてもらうことになるので、case-sensitiveになっているので、その辺の調整はC#側でする必要があるのでその点はご注意のほど。
VSCodeでDockerコンテナ内で開発するための手順まとめ

## はじめに

いまさら感も否めませんが、devcontainer.jsonの書き方をよく忘れるので、自分用の備忘録も兼ねて記事に残しておこうと思います。

## 導入手順

### VSCodeに拡張機能(extension)を追加

VSCodeでDockerコンテナ内の開発環境に接続するには、拡張機能である[Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)が必要となるので、インストールしましょう。

![remote_containers_vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/c9fb073f-bc3e-0e00-44e1-92017837f440.png)
vscode.png)

### devcontainer.jsonの追加

extensionが追加できたら、次は設定ファイルである`devcontainer.json`と格納用フォルダを用意しましょう。

```
/ProjectRoot
  └ .devcontainer
      └　devcontainer.json
```

Remote Developmentを利用したいプロジェクトのrootフォルダ配下に`.devcontainer`フォルダを作成し、そこに`devcontainer.json`を作ります。

`devcontainer.json`には、下記のように展開するDockerコンテナの定義（下記の例だと`docker-compose.yml`）、利用したいVSCodeの拡張機能や、ポートフォワーディングの設定などを記載していきます。

```json
{
    "name": "sample_project",
    "dockerComposeFile": "../docker-compose.yml",
    "service": "web",
    "extensions": [
        "mhutchie.git-graph",
    ],
    "forwardPorts": [
        8080
    ],
    "workspaceFolder": "/app",
}
```

設定の方法についての詳細は、公式ドキュメントは[devcontainer.json reference](https://code.visualstudio.com/docs/remote/devcontainerjson-reference)を読んでいただきたいのですが、日本語に翻訳されていないうえに、設定項目が多いので、筆者がよく使う設定項目にピックアップしてまとめてみました。

#### `image`

開発に利用する単一のDockerコンテナを[DockerHub](https://hub.docker.com/)、[Azure Container Registry](https://azure.microsoft.com/ja-jp/services/container-registry/)から参照する場合に設定します。（どちらもログインが必要なため、あらかじめアカウントを用意しておく必要があります）

#### `dockerFile`

開発に利用する単一のDockerコンテナをローカルのDockerfileを使用する場合に設定します。

#### `dockerComposeFile`

開発に利用する複数のDockerコンテナをローカルのdocker-compose.ymlを使用する場合に設定します。（後述する`service`を設定し、実際に乗り込むコンテナを一意に設定する必要があります。）

注意する点としては、指定するdocker-compose.ymlまでのパスはdevcontainer.jsonからの相対パスにする必要がある点です。（プロジェクトのルート配下に置いている場合は、`../docker-compose.yml`になります。）

#### `service`

`dockerComposeFile`を利用する場合に必須となる項目で、docker-compose.ymlの定義の中から実際に開発時に乗り込むコンテナのサービス名を設定します。（webサービスの場合、大概はアプリケーションサーバ用のコンテナになると思います）
今なら素のReact NativeとExpoどっちを入れるべき？Expo Bare Workflowならいい所どり出来るの？

久しぶりにReact Nativeでアプリを作りたい！と思った時に、
最近はExpo一択の風潮になっていて、どっちを使うべきなんだろう？と調べた時の記録。

## おさらい： React Nativeとは

Facebookが開発したJavaScriptのUIフレームワークである、
Reactを使ってネイティブアプリ (iOS/Android) を作ることができるツール。

ネイティブアプリ上でJavaScriptのランタイム (JavaScriptCore) を動かし、
JavaScriptのコードに対応するネイティブコードを繋げることで動作する仕組みを提供している。

ネイティブを触ることができるので、
公式コンポーネントやサードパーティのライブラリでは実現できない挙動を作りたかったら、

自分でネイティブコードを書いてJavaScriptと対応付けさせるための機能も用意されている。

https://reactnative.dev/docs/native-modules-ios
https://reactnative.dev/docs/native-modules-android

## Expoとは何か

ExpoはReact Nativeのビルドや開発を支援してくれるサービス。

https://expo.io/

React Nativeではネイティブのコードを触ることが出来るので、
逆にXCodeやAndroid StudioといったiOS/Androidの開発環境を構築する必要があった。

Expoは公式に「no need for you to touch Xcode or Android Studio」と書かれているように、
XCodeやAndroid Studioでビルドせずに、JavaScriptだけで実機で動作するようにしてくれる。

編集したJavaScriptのコードがリアルタイムに実機に反映される様子は、感動ものでした。

## Expoのメリット

「ネイティブの環境構築にハマらずに進められるので開発速度が向上する」

ことが一番でしょうか。

例えばFirebaseをReact Nativeで使う場合、

① JavaScriptオンリーの公式パッケージを使う (一部機能が利用不可)
② ネイティブSDKをラップしたサードパーティのreact-native-firebaseを使う (フル機能が利用可)

上記の2つの方法があります。

①の公式パッケージだと特にFirebase Analyticsが使えないのがネックで、
react-native-firebaseの導入を検討するのではないでしょうか。

ただネイティブコードを使うパッケージの場合、
XCodeとAndroid Studio両方での設定が必要になります。

React Nativeに慣れていない内はここで数時間ハマることもちらほら。

自分が試した時は、CocoaPodsが古く`pod repo update`だけで20分かかってしまいました。

Expoで用意されているAPIを使えば、
ネイティブの環境構築の手間をかけずに開発に集中することができ、
スピードダッシュをかけることができるのが、最大のメリットでしょう。

## Expoのデメリット

メリットの反対ですが、「ネイティブのコードを触ることができない」ことです。

上記のFirebase Analyticsのようにネイティブの機能が必要な要件は満たせません。

例えば画像アップロード機能を作りたいと思った時に、
expoが提供している`expo-image-picker`では画像複数枚を選択することが出来ません。

[Allow choosing multiple images in ImagePicker.](https://expo.canny.io/feature-requests/p/allow-choosing-multiple-images-in-imagepicker)
こちらの要望には上がってるのですが、対応される気配は無さそうですね...

`expo-image-picker-multiple`というパッケージもあるのですが、
スター数が少なく、実際使ってみてもカスタマイズ性が乏しくイマイチでした。

`react-native-image-crop-picker`を使えば画像複数枚の要件を満たすことができるのですが、思いっきりネイティブの機能を使っているので、Expoでは利用できません。

公式のAPIドキュメントをみれば分かる通り、提供しているモジュールは非常に豊富なのですが、
Expoでは出来ない要件は、開発スピードとトレードオフで捨てる覚悟が必要になります。

https://docs.expo.io/versions/latest/

## Ejectとは

Expoでネイティブの機能を使いたくなってきたら、

Ejectと呼ばれる作業によってExpo SDKをReact NativeやiOS/Android SDKをラップしている状態から、ひとつのモジュールとして役割を果たす状態に分解することができます。

これにより、ネイティブにアクセスすることが出来るのですが、
Expo Client上では実行ができなくなるのでネイティブでビルドする環境が必要になります。

## Expo Bare Workflow？

Expo SDK34から、EjectしたアプリをExpo Client上で動かすことが、Bare Workflowという名称でサポートされるようになりました。

これにより開発中はネイティブのビルドを待たずに、Expo Client上で確認することができます。

ただし、Expo Clientではネイティブのコードは動かないので、

`react-native-firebase`等のネイティブモジュールを使っているライブラリを使っている箇所は、`*.expo`といった拡張子でExpo用のファイルを用意するといった工夫が必要になります。

またBare Workflowのアプリのリリースビルドに関しては、まだサポートされていないようです。
https://docs.expo.io/bare/exploring-bare-workflow/#releasing-to-app-store-and-play-store

## まとめ

Bare Workflowなら良い所どりが出来る気がしていたのですが、
やはりEjectせずに、完全にExpoに乗っかる方が、大きな恩恵を得ることが出来るでしょう。

Expoに乗っかった仕様でアプリを形にし運用してから、
徐々にネイティブに関しても学び、EjectしてBare Workflowへ移行していくという流れが、

アプリ開発に慣れていないWeb系開発者には向いているのではないでしょうか。

ということで結論、これからReact Native始める人はExpoに乗っかっていきましょう！
Linux ディレクトリ階層

#【Linux ディレクトリ階層】

LPIC1取得に向けて、基礎中の基礎から学習していきます。

Linuxのディレクトリ階層の構成は、ディストリビューションによって若干異なることも。
主なディレクトリはほぼ共通している。

##主なディレクトリ

<strong>bin</strong>
一般ユーザーが利用できる基本コマンド
基本的なシステムコマンドのバイナリが置かれる。

<strong>boot</strong>
Linuxカーネルなど起動に必要なファイル

<strong>dev</strong>
デバイスファイル

<strong>etc</strong>
システム設定ファイルや起動スクリプトファイル
ホスト固有のシステム（アプリケーション）の設定ファイルが置かれるディレクトリ

<strong>home</strong>
ユーザーのホームディレクトリ
容量が大きくなりやすい。

<strong>lib</strong>
ライブラリファイル
システムが提供するライブラリ

<strong>media</strong>
外付HDDやUSBメモリ、DVDドライブなど。

<strong>proc</strong>
プロセス情報

<strong>root</strong>
rootユーザーのホームディレクトリ

<strong>sbin</strong>
システムの管理者が利用する基本コマンド
基本的なシステム管理コマンドのバイナリが置かれる。

<strong>sys</strong>
システム情報

<strong>tmp</strong>
一時ファイル置き場
誰でも読み書き可能、危険を考慮すべき。

<strong>usr</strong>
プログラムやライブラリなど。

<strong>var</strong>
ログファイルなど頻繁に更新されるファイル
システムログなどの動的に変化するファイル
可変データ。