OmniAICreator/Qiita-1.07M huggingface dataset:
【Linux/資格】 LinuC101　受験記録

linuxコマンドの知識が無さすぎる！！
Macで色々環境いじったり、これからAWSにも触れていったりするのに、これじゃダメだ！

という動機で、LinuCの受験を決めました。

LPICとどっちにするか迷ったんですが、「国際認定かどうかってそんなに重要？？(LPICが国際的にどれくらい重要視されてるか分からないし、国際的な仕事をする予定がない)」って思ったのと、出題の日本語がより分かりやすいらしいのでLinuCにしました。

詳細は後々追記するとして、結果と個人的にしんどかったトコだけ。

###結果

合格でした！
800点満点中520点(60問中40問?)で合格のところ、586点でした。
たぶん、5問分くらい合格ラインより上だったんだと思います。(1問13.3点換算)

手元のメモだと○(確信あり)が合格に必要な数を割ってたので、落ちててもしかたない、と思っていましたが、想定よりいい結果でした。

###勉強法

準備期間は２週間くらいでした。(出願申込みして「さぁ、やるしかないぞ？」って状況作ってからの期間)
私はping-tというe-ラーニングのサイトでひたすら問題を解きまくる方法で勉強しました。
べき論としては「Linuxとは？特徴(特長)は？」みたいなトコから入るべきだったんでしょうけど、あまり時間がなかったのと、結局問題を解かないと「どこを知識として押さえるべきなのか」がイメージできないアタマなので。

「最短突破 LinuCレベル1 合格教本 [101試験, 102試験対応]」という本も買ってたんですが、ping-tの問題を解く上で明らかに内容が足りない。この本を読むと却って時間食うだけかもしれないと思って、結局ping-tの解答解説オンリーで知識詰めました。

###しんどかったトコ

「正しいコマンドはどれか、正しいオプションはどれか」を問うモノが多いですが、コマンドとかほとんど無知に等しいので、最初のうちはほとんど意味を推測できなかったのがつらかったです。
さらにそこに、例えば「-a」の意味がコマンドによって異なったり、ハイフン不要で「a」と書くパターンがあったりしたのが追い打ちでした。
(かなり最近まで模擬試験形式で正解率30%とかだったので、ほとんど心折れかけてました)

`-a`みたいなヤツだったら、「これはallの省略だから・・・」みたいな一貫したイメージで覚えたいじゃないですか・・・

で、問題集ベースで中途半端な知識をつけちゃっただけに、「このコマンド＋オプションの正しい書き方は？」には正しい答えを導くコトができても、「じゃぁ、そのコマンドってどういう目的で使うの？何がどうなるの？」みたいなトコを問われると「えっと・・・」って試験本番でめちゃめちゃ悩みました。

###最後に
やっぱり、「Linuxとは」ってトコから勉強しとくのが一番ラクな道だったんだろうなぁ、って思ってます。
このさき、LinuC102,201,301って受けていこうと思ってるので、試験前日になって「新しいLinuxの教科書」買いました。
年末年始、これを読みながらLinuC102に向けて勉強します。
私が2019年に取り組んだ技術活動

# あいさつ
今年もQiita各記事には大変お世話になりました。
ここに今年取り組んだ技術活動の記録を残させていただきます。
※自分用メモであること、ご了承のうえ、
　お読みいただければ幸いです

# 1. vscodeの導入
私が活動させていただいているプロジェクトではサーバ開発に知見のある方があまりおらず、サーバにLANが繋がるだけのまっさらなWindowsを渡されるケースが多いです。
それもあり、TeraTermを使用してサーバ上のソースをvimで直接編集し、開発・テストとなるケースがほとんどです。

Qiita様に投稿されているWeb開発等の記事から刺激を受け、まずはエディタから変えてみようと適用したのがvscodeです。

結果としてvimプロフェッショナルでなくてもパフォーマンスを期待できるようになり、作業支援で投入されたメンバーにも喜ばれる結果となりました。
私自身としても昨年から適用しだしたソース管理:Gitとの相性もよく、管理面でも満足したパフォーマンスを出せています。
vimを使わなくなることはないですが、普段使いとしては完全にvscodeがなくてはならない状態になりました。
※こちらの記事を投稿させていただいています。
[Visual Studio CodeをオフラインPCで使用する](https://qiita.com/mekemeke421/items/98d5a3e2f2cc7517a6ab)
[Windowsで開発に使用するツールをまとめました](https://qiita.com/mekemeke421/items/5f9939115dafb44066bf)

# 2.ブランチ運用
ソース規模が大きく、複数人同時開発でありながら基本的にGitではdevelopブランチのみで運用してました。
そうなると、大小様々なコミットがあり、煩雑化していたのでfeatureブランチを使いトピック毎にプッシュしてもらうように運用を調整しました。
これによりチェックした後でdevelopへ統合する事ができ、コミットも整理されるようになりました。
オンプレミス環境ですがGitHubでの開発に近く出来たと思っています。

# 3. 挑戦しきれなかったユニットテスト
私のプロジェクトにはまだ、xUnitが運用されておらず、また成果物で改修部のみのテスト仕様書が必要です。
作業に追われてと言い訳がましいですが適用できませんでした。
つまずいた点も超序盤ですが
・cmakeのインストールは可能
・makefileからCMakeLists.txtへの変更はタイミングを取れず未挑戦
・Google Testのインストールに失敗
ここで挫折。
この記事書いて、一番取り組むべき課題点であることが再認識できました。

# 4. JavaDoc
xUnitが動かせないなら責めてソースからテスト仕様書作らないかしらと、Doxygenに出会いました。ここからコメントは全てJavaDoc形式にしたいと舵を切りました。

# 5. 書籍「リーダブルコード」「レガシーコードからの脱却」との出会い
リーダブルコードはWeb記事で非常に良く拝見していたので一度読んでみたかった本です。
レガシーコードからの脱却を友人から勧めを受けて合わせて購入しましたが、とても良い本達でした。
リーダブルコードにて当たり前の記載もどうすればよくなるか見直せましたし、
レガシーコードからの脱却では、まさにアンチパターンに属していることを再認識できました。
プラクティス！
挑戦しきれなかったユニットテストが再挑戦するべきとここでも再認識しつつ、現在C言語である事からどのように構成すれば良いかを考えるようになりました。

# 6. デザインパターンとC言語でのクラス表現
煩雑としたプロジェクトソース構成を整理したいと思い、最初に考えたのはクラス化でした。
※以下ページを参照しました。
[デザインパターン | TECHSCORE(テックスコア)](https://www.techscore.com/tech/DesignPattern/index.html/)
[C言語で デザインパターンにトライ！　デザインパターン一覧](https://qiita.com/developer-kikikaikai/items/8e7858c130c8ae8df488)

非常にタメになりました。
これからも取り組みます。

# 7. DDD
ドメイン駆動開発は言葉としては知っていましたが上記の通りテスト駆動もできていなかったので詳しくは調べていませんでした。
しかし、値オブジェクトを理解してからは設計・開発の考え方が大きく変わり、現在適用出来ないかを非常に良く考えています。
軽量DDDなるものが、導入として良いステップになりそうなので、ここからトライしだしています。
[軽量DDDではじめるゲーム開発　ドメイン駆動設計の基本と実践を解説](https://www.techxgamecollege.net/posts/3652/)

# 最後に
実環境にユニットテストを適用する事が最優先だと、この記事を書いて改めて認識できました。開発手法や考え方が大きく変わった1年でしたので、私としては良い1年に出来たと思っています。
来年の目標としては
・ユニットテストの導入
・DDDに基づく設計と開発
を中心にすすめていきたいと思っています。
来年にはレガシーコードから脱却だ！
vCenter Server に接続したらポートグループが消えた話

#はじめに
検証環境にvCenter Server がないため，vMotionやHA，その他結合試験ができなかったため，すべて私の想像と唯一存在するESXi ホスト1台だけでパラメータの設計を実施しました．そのため，vCenter Server のある環境に結合した際に，思わぬ出来事が多発しました．本記事はその出来事の一つです．

#何が起きたか
以下のようなESXiのネットワーク設計をしていたが，vCenter Server に結合した際に仮想マシンのポートグループから「ManagementNetworkVLAN」が消えていた．なお，vmk0の所属するポートグループとしては存在していた．

![esxi-design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438083/946e558f-87d0-57ec-ef27-69af025533a4.png)

#気づいた要因
結合試験でvMotion を実施した際，移行元の仮想マシンがManagementNetworkVLAN に所属していたため，移行先のホストに当該ポートグループが存在せず，vMotion できなかったから．
ポートグループの一覧をよく見ると，ESXi では見えていたManagementNetworkVLAN がvCenter Server の仮想マシンのポートグループからは消えていた．

#なぜ消えた？
原因はよくわかっていないが，VMware の仕様であると考えている．ググってみると，参考文献にもあるように同様の事象が確認された．要は，vmk と仮想マシンは同じポートグループに所属できないという仕様である．
事前にvCenter Server を用いて結合試験などをできていたら，vmk と仮想マシンのポートグループを別にする設計にできていたが，今回はvCenter Server なしだったので，そういった部分に気づかず，本番環境に接続した際に不具合が生じてしまった．

#どう対処した？
以下の方法で対処した．不具合は生じなかった．
1. vmk0 が所属しているポートグループの名前を「Management Network」というデフォルトに戻す．
2. 「ManagementNetworkVLAN」という名前のポートグループを新たに作成する．

これで，移行元の仮想マシンと同じポートグループが作成でき，無事vMotion ができた．※実は，vMotion 用のポートグループの所属仮想スイッチが間違っていて，いったんそのポートグループを削除・再作成したりもして大変だった...

#おわりに
以下のことを学んだ
- vmk と仮想マシンは同じポートグループに所属できない
- 今後vCenter Server と結合するような構築をする場合は，vCenter Server を用意する/お願いする

でないと，今回観測された不具合以外にも様々な不具合が発生してしまい，結果として本番障害につながる可能性がある．

#参考文献
- ESXi 6.7の仮想マシンのネットワークアダプタで、ポートグループが設定できなくなる問題 (https://tech-mmmm.blogspot.com/2018/06/esxi-67.html)
ガンタンクをRaspberry Piで動かすことを目指す#1 準備編

#目標と事前準備

モビルスーツを操縦したい！

というわけで

ガンプラのMGガンタンクにモーターとRaspberryPiを組み込んで
Wi-Fiで無線操作できるようにすることを目指す。

最終目標として
ガンタンクをWi-Fi経由でブラウザー経由で操縦し
ガンタンクの頭に装備したカメラに映ったものをブラウザーで見れるようにして
いかにも操縦しているような臨場感が味わえるものにしたい。

##まず用意したもの
まず用意したものは以下の二つ

〇1/100サイズのMG版ガンタンク
![MGGUNTANK01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125160/01f50a79-b395-ffb3-cf38-1ad0b57bb4e3.jpeg)

さすがにHGUC(1/144)ではサイズ的に厳しい。
出来ればもっと大きな1/60とかあればよかったのだが最大のが1/100なので仕方がない。

〇タミヤのカムプログラミングロボットのキット
![CAMPROGRAMROBOT.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125160/9c563345-52ec-9ab7-3bca-966ad2f09901.jpeg)
モーターとギアボックス、キャタピラーが使えるのではないか？と思い購入した。
サイズ的にもMGガンタンクとほぼ合いそう。

##考えられる問題
MGガンタンクの中に
・ギアボックスとモーター
・ラズパイとモータードライバー基盤
・ラズパイ用電池とモーター駆動用電池
を組み込むのはかなりハードだと思われる。
できれば頭部にカメラを仕込んだり
キャノン砲にLEDを組み込んで光らせたりしたい。。。

ラズパイは出来ればラズパイ4かラズパイ3B+を使いたいところだが、
サイズ的に内蔵は厳しそう。
ラズパイ3A+かラズパイZeroで妥協することになりそう。
場合によってはもっと小型のArduinoなどに方向転換する必要があるかもしれない。
だがカメラを仕込むことを考えるとやはりラズパイで行きたい。

バッテリーはモバイルバッテリーを使う。
できればモーター用の電源も兼用させたい。
たぶん背中にバックパックのように背負わせることになるかな？

##まずやること
最初にガンタンクを普通に組み立てる。
[ガンタンクをRaspberry Piで動かすことを目指す#2 ガンタンク作成編 V作戦](https://qiita.com/never_nothing/items/8656e3883d0759e8034b)
へ続く
【Web/資格】 ウェブデザイン技能検定　２級認定試験　受験記録

年内に公開エントリを50個まで増やしたかったんですが、転職先のレベルに早く追いつけるようにベンダ資格試験対策をベースに言語やら技術やらを勉強してるので、なかなかエントリに書けるような技術的なチャレンジができませんでした。。

ですが、昨日12月27日、年内最終出社日であると同時に、現職での最終出社、ウェブデザイン技能検定合格発表、LinuC 101受験が重なり、おかげさまでいい結果が残せたのでエントリに残します。

###ウェブデザイン技能検定とは

[公式ホームページ(webdesign.gr.jp/)](https://www.webdesign.gr.jp/) より引用します。

>ウェブデザイン技能検定は、国家検定制度である技能検定制度の一つとして、厚生労働省より職業能力開発促進法第47条第１項の規定に基づき指定試験機関の指定を受け、特定非営利活動法人インターネットスキル認定普及協会（以下、当協会）が実施するものです。
>
>試験は実技および学科試験で実施され、関連国際標準規格等に基づきウェブデザインに関する知識・技能、実務能力等が問われます。１級の合格者には厚生労働大臣より、２級及び３級の合格者には当協会理事長より、ウェブデザイン技能士の合格証書が発行されます。

あまり知名度が高くなく、それほど受験者も多くないですが、国家認定資格試験です。

###出題内容、出題形式

※２級の内容です。他の級の内容は公式ホームページや他のエントリなどで補完して下さい。

午前のマークシートによる択一式選択問題と、午後のPCを使った実技問題で構成されています。

午前はウェブ系の言語(HTML、CSS、Javascript、PHP)の表示・実行結果を問う問題や、政府やW3Cのガイドラインの内容を問う問題が出題されます。
全４０問で、７割（２８問正解）が合格ラインです。

午後はAdobeのPhotoshopやDreamweaverを使用した画像作成やWebページの作成などの問題や、出題の要件に沿うようにJavascriptを修正する問題が出題されます。
こちらも合格ラインは７割ですが、小問それぞれで６割以上取れていなければ、合計が７割を超えていても不合格という、少しシビアな条件がついています。（全く手をつけられない、という小問があった時点で不合格確定、というコトですね）

###結果

私は今回が初挑戦でしたが、無事午前・午後ともに一発合格できました。
採点は分からないですが、試験翌日には公式より午前の解答が公開され、おそらく８割以上は取れていたと思います。

###勉強法

####午前(筆記)
午前に関しては、[過去問クラブ](https://kakomon.club/)というサイトがあるので、そこで過去問をひたすら解きまくりました。
アカウント作成でメールアドレスの登録が必要になるので、「そういうのはちょっと・・・」という方は、公式から過去問が公開されていますので、そちらから入手して解くのでもいいと思います。

私の場合は解くのは直近２、３年分にしぼりました。あまり古いモノになるとHTML4やCSS2に関する出題も多くなり、却ってHTML5/CSS3の仕様と知識が混乱すると思ったからです。

あと、私のスキルとしては、10月にHTML5プロフェッショナル　レベル1に受験しているので、HTML5/CSS3の知識を持っていましたが、PHPが全く分からなかったのでこちらは手元に開発環境を作って基礎的な部分は実際に動かしてみてイメージを掴みました。

####午後(実技)
私の場合、たまたま今年春からAdobeCCの年間ライセンスを購入していたので、手元でPhotoshopなどを触れる環境がありました。

過去問の内容や、実装(画像作成)のしかたは先人たちがyoutubeに解説動画を上げてくれていたりするので、そちらを見ながらトレースして手順を覚えました。

若干素材や文言が違うだけで、以下のような内容が毎回出題されていると思います。

1.アニメーションgifを作れ
2.指示通りの仕様となるよう、HTMLをセクショニングしろ
3.2.のHTMLに1.の画像やテキストを配置してレイアウトを整えろ
4.指示通りの挙動となるよう、Javascriptを修正しろ


###試験中のあれこれ

午前は知っていれば解けるので、２０分くらいで見直しまで終わらせてヒマを持て余してました。

しかし、午後。
小問１で「与えられた素材からアニメーションgifを作れ」という問題が出たんですが、試験要項をちゃんと読んでおらず、youtubeの試験対策動画を参考にAdobeのAnimateを使ったgif作成しか練習していなかったので、「photoshopでアニメーションgif作る方法とか知らないんだけど！！」ってパニックになりました。
パニックになりながらも、Animateで操作した記憶から「photoshopでアニメーション作れるなら、こういう操作パネルみたいなモノがあるはず・・・」みたいなコトを考えながら必死になんとかしました。
gifファイルができたのが120分の試験で残り10分くらいになった時でした。(仮の画像を置いてHTMLやjavascriptは先に終わらせておきました)

ブラウザで表示確認して、Webページ上で自分が作ったgifが動いてるのを見た時の感動は、会社のシステムに自分が作った機能がリリースした時の感動くらい大きいモノでした。（上述のとおり、小問１つでも採点が６割未満なら不合格確定で、gifが完成しているかどうかはめちゃめちゃ重要でした）

###最後に
ここまで特にツッコんでなかったんですが、ウェブデザイン技能検定という名前でありながら、別に「イカすウェブコンテンツを作れる技能」を認定するモノではありません。
それどころか、ウェブデザインの”べき論”みたいなモノをおさえられるモノでもありません。
私自身、これで「ウェブデザイン、ちょっとデキル」というつもりもありません。
実技のツールはAdobe前提なのもちょっと気になります。

しかし、実技試験で試される内容で、「少しは手を動かせる人」の証にはなるのかな、と思いました。

今のところ１級を受けるつもりはないですが(受験料高いし)、せっかくの国家認定なのでもっと知名度が上がって価値も見直されていくコトを期待します。
WireSharkでOPC UAのパケットを見てみる。

# OPC UAでどのような通信をしているか確認
## 参考URL
https://opcconnect.opcfoundation.org/2017/02/analyzing-opc-ua-communications-with-wireshark/

## Windows10にWireSharkをインストール
まずは、WireSharkを以下のURLからダウンロード。
https://www.wireshark.org/download.html
今回は、Windows 64bit用のバージョン3.2.0(Wireshark-win64-3.2.0.exe)をダウンロードしました。

![ws1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/ae944dc5-39d4-466b-5734-b36c23e0aee3.png)
Nextを押下して次の画面へ。

![ws2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/a707b77b-9006-773a-770b-b0efbf79654c.png)
ライセンスに関する確認です。
ライセンスに合意できればI Agreeを押下して次の画面へ。

![ws3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/02d156a3-9cab-cebc-800f-b91b672bd87e.png)
インストールするパッケージの選択です。
今回はデフォルトのままにしました。

![ws4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/bddc4b9a-c4d8-61a5-1045-f10f69adcb4c.png)
ショートカットに関する選択です。
スタートメニュー、デスクトップ、クイックランチャで自分がショートカットを作りたいところにチェックを入れます。
もう一つは拡張子をWireSharkに関連付けるかどうかなので、チェックを入れて先に進みます。

![ws5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/55ea1d66-8999-fdb0-af08-f4b0458c1634.png)
インストール先のフォルダの選択です。

![ws6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/0652d77f-2436-1e77-9c5d-d4c9ca547950.png)
WinPcapをインストールされていなければNpcapをインストールします。

WinPcapとNpcapの違いは、
https://forest.watch.impress.co.jp/docs/news/1173103.html
によると
『「Npcap」は「WinPcap」に比べ積極的にメンテナンスされており、ループバックキャプチャーやWi-Fiのモニタモードキャプチャーが可能になるなどのメリットがあるという。』
らしいです。

![ws7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/1b806c95-75ef-6f28-9f01-4407f1069f1c.png)
USBPcapをインストールすかどうかですので、必要のある人はチェックを入れます。

![ws8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/42635137-5c63-ac92-07fa-0a1a66f7128e.png)

![ws9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/e9622f05-ab00-b101-f622-f924ba1446b2.png)
Npcapのライセンスの確認画面です。
合意できればI Agreeで次へ進みます。

![ws10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/51d1f36e-9fcc-4bbb-7fb6-4b0b750c2afc.png)
今回はデフォルトのままでインストールしました。

![ws11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/a266a631-ad5f-448c-97b4-2962eca58dbb.png)
Npcapのインストールは終了です。

![ws12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/74874fc7-a268-9e31-5588-e84effcbdcf5.png)

![ws13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/0f958320-c8ee-1c60-1126-c75a95e14c21.png)
これでインストールは終了です。

## 起動してOPC UAのパケットを見てみる。
![ws21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/33d19f2b-9f84-0940-15a0-cc04f499f359.png)
WireSharkを起動してOPC UA接続しているネットワークアダプタを選択して右クリックしてStart Captureを選択実行します。

その後、接続先（今回はラズパイ4）でOPC UA Serverを起動します。
WireSharkを起動しているPCでOPC UA Clientを起動して、ラズパイ上のOPC UA Serverへconnectします。
適当に操作した後、WireSharkのキャプチャを停止します。
（メニューバーにある赤い■のアイコンが停止ボタンです。）

![ws22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/97eb5a7e-e372-e628-ce96-d0bf4d21277b.png)
先ほど押下した釦の下に表示フィルタと書かれているところに「OPCUA」と書きます。
（上の画面の緑色になっているところ）

そうするとOPC UA Client(192.168.30.1)とOPC UA Server(192.168.30.2)のやりとりが見られます。

WireSharkはOPC UAプロトコルを標準でサポートしているので、プロトコルに関する設定などは必要ありません。
Custom User Claimを追記する


Custom Claimを利用する方法は[以前にも書いた](https://qiita.com/zaburo/items/cd078d768bd9fd239bf4)のですが、標準関数であるsetCustomUserClaim()は標準では上書きされてしまうようです。

どういうことかというと、

```
{A:true,B:true}
```

という結果を得るために、

```
setCustomUserClaim(uid,{A:true});
setCustomUserClaim(uid,{B:true});
```

とすると、

```
{B:true}
```

となります。
これを{A:true,B:true}としたいのです。

##　基本動作の確認

CustomUserClaimsはadminじゃないと操作できませんのでfirebase-adminを利用します。
また予めユーザーを作成し、uidを取得した状態から操作しています。

まず通常のsetCustomUserClaims()の動作を確認。

```js
const admin = require('firebase-admin');
admin.initializeApp({
    credential: admin.credential.cert('/path/to/key.json'),
    databaseURL: 'https://xxxxx.firebaseio.com',
});

(async () => {

	//uid
	const uid = "cI4FbDfSMCMUMXVcn1TlZTpGKQn2";

    //Custom Claim通常設定
    await admin.auth().setCustomUserClaims(uid, {});
    await admin.auth().setCustomUserClaims(uid, { A: true });
    await admin.auth().setCustomUserClaims(uid, { B: true });

    //Custom Claim表示
    const user = await admin.auth().getUser(uid);
    console.log(user.customClaims);

})();
```

実行結果。上書きされています。

```bash
{ B: true }
```

## 追記（その１）

では追記。カスタム関数を作成するパータン。

```js
const admin = require('firebase-admin');
admin.initializeApp({
    credential: admin.credential.cert('/path/to/key.json'),
    databaseURL: 'https://xxxxx.firebaseio.com',
});

//追記のための関数
const addCustomUserClaims = async (uid, claims) => {

    const user = await admin.auth().getUser(uid);
    let updateClaims = user.customClaims || {};

    for (let property in claims) {
        if (Object.prototype.hasOwnProperty.call(claims, property)) {
            updateClaims[property] = claims[property];
        }
    }

    await admin.auth().setCustomUserClaims(uid, updateClaims);

}

(async () => {

    const uid = "cI4FbDfSMCMUMXVcn1TlZTpGKQn2";

    //Custom Claimの追記
    await addCustomUserClaims(uid, { A: true });
    await addCustomUserClaims(uid, { B: true });

    //Custom Claim再表示
    const user = await admin.auth().getUser(uid);
    console.log(user.customClaims);

})();
```

実行。追記されてます。

```bash
{ B: true, A: true }
```

## 追記（その２）

オブジェクトをマージすればいいだけな気もします。

```js
const user = await admin.auth().getUser(uid);
await admin.auth().setCustomUserClaims(user.uid,{...user.customClaims,...{A:true});
await admin.auth().setCustomUserClaims(user.uid,{...user.customClaims,...{B:true});
```

## 参考

* https://stackoverflow.com/questions/57429120/firebase-admin-sdk-set-merge-custom-user-claims
Windows 10 WSL (Windows Subsystem for Linux) 上のUbuntuからemacsを起動する


### 1. Windows 10 WSLの有効化

`コントロールパネル` > `プログラム`の左カラムにある `Windows の機能の有効化または無効化`(`Control Panel` > `Programs and Features` > `Turn Windows features on or off`) をクリックすると開く`Windowsの機能`(`Windows Features`)から、`Windows Subsystem for Linux` にチェックを入れ、`OK`ボタンをクリック。
![wsl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558258/16c43108-2912-ec0f-4577-3b92d4a50aae.jpeg)
もしくはWindows PowerShellを管理者権限で開いて、以下を実行。

```shell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

(参考：[Install the Windows Subsystem for Linux | Microsoft Docs](https://docs.microsoft.com/en-us/windows/wsl/install-win10))

### 2. WSL Distro (Ubuntu) をインストール

- Ubuntuは[Microsoftストア](https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6)からインストールできる。
- 手動でダウンロードしたい場合は、[Manually download Windows Subsystem for Linux distro packages | Microsoft Docs](https://docs.microsoft.com/en-us/windows/wsl/install-manual)にリンクとインストール手順があるので、そちらを参考に（英語）。

インストール後Ubuntuを起動、ユーザー名とパスワードを設定して、
パッケージ更新:

```bash
$ sudo apt update && sudo apt upgrade
```

### 3. emacs パッケージのレポジトリ追加と emacs 26 のインストール

```bash
$ sudo add-apt-repository ppa:kelleyk/emacs
$ sudo apt-get update
$ sudo apt install emacs26
```

(参考：[Reddit r/emacs: What is the most painless way to install Emacs 26 on Ubuntu 18.4?](https://www.reddit.com/r/emacs/comments/8pcw5a/what_is_the_most_painless_way_to_install_emacs_26/))

### 4. lxde デスクトップのインストール

```bash
$ sudo apt install lxde
```

### 5. Windows用 X サーバー(vcxsrv)のインストール

[VcxSrv](https://sourceforge.net/projects/vcxsrv/)をダウンロード、インストールして起動。ウィンドウズショートカットを作り以下コマンドをターゲットにしておくと良い:

```
”C:\Program Files\VcXsrv\vcxsrv.exe” :0 -multiwindow -clipboard -wgl
```

### 6. emacsを起動

```bash
$ emacs26 --display :0.0
```

`.bashrc`に以下 alias を追加しておくと、emacs起動後にUbuntuウィンドウを閉じてくれるので便利:

```bash
alias emacs='
export DISPLAY=:0.0
export LIBGL_ALWAYS_INDIRECT=1

# キーボード設定
setxkbmap -layout us

setsid emacs26
exit
'
```

(参考：[hubisan/emacs-wsl: Install and run emacs with the Windows Subsystem for Linux (WSL) in Windows 10. ](https://github.com/hubisan/emacs-wsl))

### 7. 日本語環境の設定

#### - 日本語パッケージのインストール

```bash
$ sudo apt install language-pack-ja
```

もしロケール変更したい場合は：

```bash
$ sudo update-locale LANG=ja_JP.UTF-8
## ここで一旦再起動。 exec bash では不可。
$ date
2020年  1月  4日 土曜日 09:14:44 PST
```

英語に戻したい場合は `en_US.UTF-8` を指定する。

#### - 日本語入力環境 (fcitx-mozc)

```bash
$ sudo apt -y install \
fcitx-mozc \
emacs-mozc-bin \
dbus-x11 x11-xserver-utils
```

## -- wsl/emacs手探りの続き --

- [Windows側のブラウザでWSL emacsに表示されたurlリンクを開く](https://qiita.com/liamst19/items/0b0ec5679f1e629ae27b)
- [うっとおしいビープ音を何とかしたい一心で、initファイルの設定をOSで条件分岐する](https://qiita.com/liamst19/items/ee6573a321f1d9186aab)
[Microsoft] 消してしまった Microsoft Store アプリを復活（再インストール）する方法

# これはなに？

Microsoft Storeを使ってインストールしたアプリを復活する方法ではなく、「Microsoft Store」アプリそのものを復活する方法です。

# はじめに

Windows 10を新規購入したりインストールしたりすると、最初からアプリが色々インストールされています。
近頃は半分AdWareのようなゲームも多くて、なんだかなぁな気分です。

ストアアプリ多いなー。全部消しとこ
↓
↓
PowerShellを起動してっと

```powershell
Get-AppXPackage | Remove-AppXPackage
```

これでよし。
↓
↓
（後日）
↓
↓
このアプリ入れるの？いいよ。
えっ、Microsoft Storeから入れないとだめなの！？   <<<===  イマココ！

# やりかた

こちらに書いてありました。ありがたいことです。

https://www.winhelponline.com/blog/restore-windows-store-windows-10-uninstall-with-powershell/

```powershell
Get-AppxPackage -allusers Microsoft.WindowsStore | % {Add-AppxPackage -Register "$($_.InstallLocation)\AppXManifest.xml"}
```

`Get-AppXPacage -AllUsers Microsoft.WindowsStore`で実態としては消えていないMicrosoft Storeアプリを取得し、マニフェストファイルの場所を得ています。そこから`Add-AppXPackage`で再インストールしています。

ちなみに

```powershell
Get-AppXPackage -AllUsers Microsoft.WindowsStore | Add-AppXPackage
```

という書き方はエラーになります。
Chrome系ブラウザのフォントをきれいにする方法

# Chrome系ブラウザにMacTypeを適用してフォントレンダリングを改善する方法
　Windowsではフォントレンダリングが汚くてイライラするのでMacTypeを導入しました。
　ただし、Chrome系ブラウザでは基本的にMacTypeで上書きできません。そのためにいろいろ弄ってみたときのことを忘れないようにメモします。


## 対象となる環境
Windows版のChrome系ブラウザを利用されている方


## やり方
### 1. MacTypeのインストール
**MacType**本体を入手します。最新版の2019β1（執筆時点）を選んでください。
　_[download](https://github.com/snowie2000/mactype/releases) - GitHub_


### 2. MacTypeの起動
インストールに成功したら、使用されている環境に合わせてモードとプロファイルを選んでください。

![2019-12-28 Collage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283828/bf4446e1-0850-d1dd-a257-5df8f82132c9.jpeg)
<font color="slategray"> *画像のモードとプロファイルは単なる著者の好みです</font>



### 3. ブラウザの設定
MacTypeで上書きできるように起動オプションを変更します。
ブラウザを開きやすい場所にショートカットを作成してから、プロパティの**リンク先**に下記のオプションを入力してください。
　``--disable-features=RendererCodeIntegrity``

![プロパティ_ピン留めリンク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283828/acdbf9bb-0490-fa7c-488a-043981030dc1.png)



### ex. おまけ
#### ex<sub>1</sub>. タスクバーから起動したいひと
##### ex<sub>1-1</sub>. やり方：α
ブラウザをタスクバーから開きたい場合は、作成したショートカットファイルを、ドラッグ＆ドロップでタスクバーにコピーしてください。

<!-- 2020年12月1日、やり方βを追加 -->
##### ex<sub>1-2</sub>. やり方：β
1. 起動しているアプリがタスクバーに表示されているので、右クリックからのコンテキストメニューより**タスクバーにピン留めする**を行う。
2. ショートカットにオプションを~~引数として？~~追加
	1. **ファイル名を指定して実行**に``shell:Quick Launch``を入力してする。
	2. 以下のアドレスの通りの画面が開かれていることを確認する。
	<br>　``C:\Users\<user name>\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch``
	4. リボンメニューより **表示** を開き、リボン中央付近にある **▢隠しファイル** という項目があるので ✔ チェックを入れる。
	5. 隠されていたフォルダが表示されたので、そこからさらに **User Pinned** → **TaskBar** と進む。
	6. ピン留めしたアプリのショートカットが置かれているはずなので、以下のオプションを追加する。
	<br>　``--disable-features=RendererCodeIntegrity``

![shell:Quick Launch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283828/6984f3d1-a107-e23e-f8e9-de1b677c00c5.png)
<font color="darkgray"> **※** shell名は「``Quick Launch``」となるように、半角スペースが入っています。うっかり``shell:QuickLaunch``と入力してしまうと目的のフォルダを開くことができないので気をつけてください。</font>

![ピン留めリンクの場所.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283828/130d057f-7ad4-eed9-296f-627539b03cca.png)


#### もっときれいに表示したいひと
Chromeウェブストアよりフォントレンダリングを改善する拡張機能からお好みのものを選んで、自由にカスタマイズしていってください。
著者のおすすめは [Font Rendering Enhancer](https://chrome.google.com/webstore/detail/font-rendering-enhancer/hmbmmdjlcdediglgfcdkhinjdelkiock) です。強度を80％にするといい感じです。


## 参考記事
+  [**「MacType」を含む日記**](https://anond.hatelabo.jp/keyword/MacType) - _Hatelabo::AnonymousDiary_
+  [**Windows 10 タスクバーにクイック起動を追加する**](https://www.tipsfound.com/windows10/06007) - _Tipsfound_
+  [**MacType非公式パッチ (MacType Unofficial Patch)**](https://silight.hatenablog.jp/entry/MacTypePatch) - しらいとブログ
vMotion やHA の失敗あるある

本番環境の障害試験で，vMotion と vSphere HA (High Availability) に失敗してしまいました．その際の失敗原因があるあるだったので，備忘録としてここにメモします．

#エラー内容や警告メッセージ
HA に失敗した時のエラーメッセージは下記のようなものでした．

- <b>十分なリソースがありません</b>
- <b>vSphere HA仮想マシンのフェイルオーバーが失敗しました</b>

vMotion 時に出てきた警告メッセージは下記のようなものでした．
確か，CD/DVD デバイスの互換性チェックの際に出てきました．

- <b>互換性がありません</b>

#失敗した原因
ここまでくれば，何が原因かお分かりだと思いますが，失敗した原因は<b>「仮想マシン作成時のiso ファイルが仮想マシンにマウントされたままだった」</b>ことです．(画像は参考です．ESXi だと実際にはデータストアのiso をマウントしていることが多いと思います．)

![iso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438083/4fae14ff-17b8-d3bd-de74-725fb195e715.png)

vMotion やHA は，iso ファイルがマウントされたままだと仮想マシンの移行に失敗します．HA はテストの際にしか気づかないかもしれないですが，vMotion は互換性チェックがあり上記のような警告メッセージが出力されるので，その際必ずiso ファイルをマウントしておき，警告メッセージが出力されない状態にしておきましょう．
可能ならば，仮想マシンの作成後はiso ファイルをアンマウントする運用にしましょう．（でないと，HA がうまく動作せず本番障害発生時にシステムが停止してしまいます...）

#おわりに
ググれば失敗原因として本記事の内容はたくさんヒットしますが，それでもやらかしてしまいましたので，戒めの備忘録として記事として作成し，メモしました．
配列要素を削除するとインデックスが残ったり残らなかったりする


PHPの配列は、キーのインデックスなどが配列側でしっかり管理されています。

```php
$a = [];
$a[] = 1;
$a[10] = 2;
$a[] = 3;

var_dump($a); // [0=>1, 10=>2, 11=>3]
```

キーを空白にすると、自動的に次のインデックスを割り当ててくれます。
とても便利。

しかしこのインデックス、一度増えるとその後値を消しても戻りません。

```php
$a = [0, 1];

unset($a[1]);
$a[] = 2;

var_dump($a); // [0=>0, 2=>2]
```

せっかく配列の最後の値を消したのに、使用した情報は残っていて次のキーは2になっています。
MySQLのauto_increment値と同様、一度上限が上がると下がらないということです。
全ての値を消したとしても同様です。

```php
$a = [0, 1];

unset($a[1]);
unset($a[0]);
$a[] = 2;

var_dump($a); // [2=>2]
```


ところでこいつを見てくれ。

```php
$a = [0, 1];

unset($a[1]);
unset($a[0]);
$b = $a;

$a[] = 2;

var_dump($a); // [0=>2] ←
```

`$b=$a`と配列をコピーしたらインデックスの記憶が消え、また0から始まるようになりました。
なんでだよ。


さらにこっちも見てくれ。


```php
$a = [0, 1];

unset($a[1]);
unset($a[0]);
$b = $a;

$a[] = 2;
$b[] = 3;

var_dump($a); // [0=>2]
var_dump($b); // [2=>3] ←
```

消えたと思っていたインデックスは、実はコピー先の`$b`に移っていたようです。
なんでだよ。



ところで[Normalize arrays' "auto-increment" value on copy on write](https://wiki.php.net/rfc/normalize-array-auto-increment-on-copy-on-write)というRFCが提出されているのですが、これは配列のコピーの仕組みを変えようという内容です。
具体的には配列のコピーを、以下のコードと同じにします。

```php
$array_copy = [];
foreach($array as $key => $value){
    $array_copy[$key] => $value;
}
```


このRFCが適用されたらどうなるかというと、

```php
$a = [0, 1];

unset($a[1]);
unset($a[0]);

$b = [];
foreach($a as $k=>$v){
	$b[$k] = $v;
}

$a[] = 2;
$b[] = 3;

var_dump($a); // [2=>2]
var_dump($b); // [0=>3]
```


解決してなくない？
関数/メソッドの定義を取り出す方法

juliaのソースファイルを分析し、関数呼出しの木を作ろうとしたことがあったわけです。https://github.com/sazare/parsetools/blob/master/src/parsetool.jl

そんな中、ソースファイルでなく、メモリ上でincludeされた関数の定義はとってこれないのか、ずっと悩んでいたが、すこしわかったので書いておく。
完全にはわかっていない。(大変だということはわかった)

まず、このリポジトリにある関数parsefileが定義してあるとする。


```julia
julia> mm=methods(parsefile)
# 1 method for generic function "parsefile":
[1] parsefile(fname) in Main at 
〜/parsetool.jl:58

julia> typeof(mm)
Base.MethodList

help?> Base.MethodList
  No documentation found.

  Summary
  ≡≡≡≡≡≡≡≡≡

  mutable struct Base.MethodList <: Any

  Fields
  ≡≡≡≡≡≡≡≡

  ms :: Array{Method,1}
  mt :: Core.MethodTable

```
このmsとmtをたどっていくと、mtのほうに定義が残っていた。

```julia

julia> mm.mt
# 1 method for generic function "parsefile":
[1] parsefile(fname) in Main at 
〜/parsetool.jl:58

julia> typeof(mm.mt)
Core.MethodTable

help?> Core.MethodTable
  No documentation found.

  Summary
  ≡≡≡≡≡≡≡≡≡

  mutable struct Core.MethodTable <: Any

  Fields
  ≡≡≡≡≡≡≡≡

  name      :: Symbol
  defs      :: Any
  cache     :: Any
  max_args  :: Int64
  kwsorter  :: Any
  module    :: Module
  backedges :: Array{Any,1}
            :: Int64
            :: Int64
  offs      :: UInt8
            :: UInt8

```
この、defsには

```julia
mm.mt.defs
Core.TypeMapEntry(nothing, Tuple{typeof(parsefile),Any}, nothing, svec(), 0x000000000000688e, 0xffffffffffffffff, parsefile(fname) in Main at 
〜/parsetool.jl:58, false, true, false)
```
となっていて、

```julia
julia> dump(mm.mt.defs)
Core.TypeMapEntry
  next: Nothing nothing
  sig: Tuple{typeof(parsefile),Any} <: Any
  simplesig: Nothing nothing
  guardsigs: empty SimpleVector
  min_world: UInt64 0x000000000000688e
  max_world: UInt64 0xffffffffffffffff
  func: Method
    name: Symbol parsefile
    module: Module Main
    file: Symbol 〜/parsetool.jl
    line: Int32 58
    primary_world: UInt64 0x000000000000688e
    deleted_world: UInt64 0xffffffffffffffff
    sig: Tuple{typeof(parsefile),Any} <: Any
    ambig: Nothing nothing
    resorted: Nothing nothing
    specializations: Core.TypeMapEntry
 以下略
```
ここから、関数定義を読み取るのは無理かなあ・・・

ちなみにmsのほうは
```julia
julia> typeof(mm.ms[1])
Method
```

こっちは
```julia
julia> mm.ms[1].file
Symbol("/Users/shin/Projects/github/parsetools/src/parsetool.jl")

julia> mm.ms[1].line
58
```
となっていて関数単位の行番号がわかるので、定義をファイルからとってくるのならこちらだろう・・・

julia実行中に関数のソースはいらないから、メモリ上にはないのだろう。
自分でソース読みにいくしかないのなら、ファイルパスから、parsefile()で呼び出す方法しかないかな。

その場合は、今のようなArrayでなくDictにして関数名からcalling treeを取り出せるようにするのか。
その場合、multiple dispatchのような構造がまた別に存在するわけで、すこし整理しないと・・・。
Firebase Authenticationのemail, passowrd認証まわりのメモ


email, password認証はよく使うのでメモ。

## 前提

* asyncの中で利用すること想定（そのコード割愛）

## 既にemailが登録されているかどうか

専用の関数が欲しいところですが、内容です。
[いくつか方法](https://stackoverflow.com/questions/40093781/check-if-given-email-exists/40095155)があるようですが、下記のように確認できるようです。

```js
const providers = await firebase.auth().fetchSignInMethodsForEmail(email);
if (providers.findIndex(p => p === firebase.auth.EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD) !== -1) {
    console.log("登録されています");
    return;
}
```

fetchSignInMethodsForEmail()を実行すると、既にemail-passowrd認証でemailが登録されている場合は["password"]といった形で、既に利用済の認証名が配列で返るようです。なので配列中に"password"が含まれているかどうかをfindIndex()で確認し、含まれてない場合-1が変えるので、-1以外なら"password"が含まれる=登録済みということになります。

なお、認証名はfirebase.auth.EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHODで取れるようなのでそれを利用しています。

## ユーザーの作成

ユーザーの作成。作成されたユーザーはres.userで取得可能。

```js
const res = await firebase.auth().signInWithEmailAndPassword(email, password);
console.log(res.user.uid);
```

## ログイン

ログイン（SignIn）。ログインしたユーザーはres.userで取得可能。

```js
const res = await firebase.auth().signInWithEmailAndPassword(email, password);
console.log(res.user.uid);
```

## Email確認メールの送信

Firebase Authの仕様では事前にemail確認（のメールを送ったり）しません。
確認が必要な場合はユーザー作成後に行いことになります。

```js
//ユーザーを取得（signInとかなんでもいい）
const res = await firebase.auth().createUserWithEmailAndPassword(email, password);

//確認メール送付
res.user.sendEmailVerification({
    url: 'http://www.eizaburo.com',
    handleCodeInApp: false,
});
```

## Email確認済の確認

Emailの確認が終わった状態かどうかは下記の方法で確認できます。

```js
//ログイン
const res = await firebase.auth().signInWithEmailAndPassword(email, password);
//状態チェック
if (res.user.emailVerified) {
    console.log("Email認証完了");
} else {
    console.log("Email認証未完了");
}
```

## パスワードリセットメールの送信

パスワードのリセットはログイン不要（当然ですが）でemailさえわかれば送信可能です。

```js
await firebase.auth().sendPasswordResetEmail(email,{
    url: 'http://www.eizaburo.com',
    handleCodeInApp: false,
});
```

## その他

* email変更処理もできるが、あまり使わないので割愛。
* 何もしなければFirebaseが用意したページとなるが、[カスタマイズも可能](https://qiita.com/spre55/items/74259c31c4d52a444dd9)。

## 参考

* https://tenderfeel.xsrv.jp/javascript/3606/
ubuntu での mDNS(=multicast DNS) の有効化方法

# mDNS(=multicast DNS)

mDNS(=multicast DNS) を使うことによりローカルDNSサーバーを立てなくても、LAN 内の名前解決が容易に行えます。

# ubuntu での mDNS の有効化方法

- 最近の Windows 10 では `mDNS` が標準で有効になっています。
- avahi-daemon をインストールすることにより、`mDNS` を利用できるようになります。
- ubuntu 側のホスト名を `hogehoge` とするとLAN内に DNS がなくても `hogehoge.local` で名前解決できるようになります。

```
sudo apt       install -y avahi-daemon
sudo systemctl start      avahi-daemon
sudo systemctl enable     avahi-daemon
```

※ ubuntu 19.10 では `avahi-daemon` が標準でインストールされていたので `avahi-daemon` のインストール自体は省略可能です。

## mDNS を許可する

```
sudo apt install -y firewalld
sudo firewall-cmd --add-service=mdns  --permanent
sudo firewall-cmd --reload
```
Unity ブログ まとめ　2019年版12月 

####Unityを勉強する時、参考になった12個のブログをまとめました。(2019年版12月時点）

- コガネブログ
http://baba-s.hatenablog.com/

- QIITA Unity検索結果(ここです）
https://qiita.com/search?q=Unity&sort=created

- ユニティルーム
https://unityroom.com/

- STYLY
https://styly.cc/ja/tips/

- テラシューブログ
http://tsubakit1.hateblo.jp/

- kanのメモ帳
http://kan-kikuchi.hatenablog.com/

- 凹みトピックス
http://tips.hecomi.com/archive/category/Unity

- かめくめ Unityを使った３Dゲームの作り方
https://gametukurikata.com/

- Booth Unity検索結果
https://booth.pm/ja/search/Unity?max_price=0&sort=new

- おもちゃラボ
http://nn-hokuson.hatenablog.com/

- ゴマちゃんフロンティア
https://gomafrontier.com/



t- eratail わからない場合、以下に質問すれば解決！（登録必要）
https://teratail.com/search?q=Unity




他にUnity勉強するのに、こんなサイトがあるよ！
など　あれば、コメントお待ちしております。
VirtualBox on macでクリップボードの共有が有効にできなかった時の対応


# TL;DR
Guest AdditionsはVirtual Boxのバージョンに合ったものを導入しましょう。


# 概要
VirtualBoxで起動したゲストOSでは、Guest Additionsというプログラムを読み込むことでクリップボードの共有ができるようになります。  
しかし、 `sudo apt-get install virtualbox-guest-dkms` で導入されるGuest Additionsは最新とは限らず、前準備も必要です。包括的な手順を見つけられなかったので、メモしておきます。


# 手順
## 1. Extension Packの導入
参考: https://www.nakivo.com/blog/how-to-install-virtualbox-extension-pack/

## 2. Guest Additionsの導入
参考: https://pc-karuma.net/virtualbox-install-guest-additions/

## 3. ゲストOSの再起動
`reboot`
【Unity】Amplify Impostors に相性がいい形状を検証してみた

# 用語説明
### Impostor とは
見る角度によりビルボードの表示を変化させる技術です。
描画負荷の高いオブジェクトでも軽々と表示できます。

デメリットは
* 近づくと歪んで表示される
* テクスチャが増える
* SetPass Calls が増える
などが挙げられます。

### Amplify Impostors とは
Unityで簡単にImpostorが作れる有料アセットです。
https://assetstore.unity.com/packages/tools/utilities/amplify-impostors-beta-119877

# 背景
Amplify ImpostorsでImpostorを作っていく中で、綺麗に表示できるモデルとそうでないモデルがあると気がつきました。
何が原因なのかを明確にするため、3つの形状でImpostorを作って比較することにしました。

# 検証方法
1. Cubeを8つ使ってI型,L型,O型の物体を作ります。
2. Amplify Impostorを使ってImpostorにします。
3. 各Impostorを比較します。

# 結果
O型,L型,I型の順で綺麗なImpostorができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/b48dd168-274b-f00f-b767-cfe6dc557b2f.png" width=50%>

I型が粗くなる理由として、Amplify Impostorsはモデルの最長の箇所を基準にテクスチャを生成するため、テクスチャに無駄な空白ができるからだと考えられます。
下図はAmplify Impostorsが作ったテクスチャです。左からI型,L型,O型のものです。I型は空白が目立ちます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/5801cb8c-7502-d305-a57b-05cee64875ca.png" width=25%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/1dec776b-42d2-74d8-52b8-4c219703c47d.png" width=25%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/6f9143aa-b04d-666f-055e-7c53f83f69ba.png" width=25%>

# アイデア
I型でも、単体でスティックキャンディのような形状であればImpostorが活用できるのではないかと考えました。
スティックとキャンディを分離して、キャンディ部分をImpostorに、スティック部分をBillboardにすれば、I型でも綺麗に描画できそうです。
ただこの方法はMaterialを2つ使うため、大量に描画すると SetPass Calls がかさむことから、活用できる用途は限られます。

# リポジトリ
https://github.com/0105takuyayamada/ImposterExperiment
Vim 起動中、または特定ファイル拡張子のときのみ処理を実行するやりかたを調べた

## はじめに

Vim を起動した直後、あるいはあるファイル拡張子の場合のみ、何か処理を実行したいと思うときがあると思います。

そのやり方を調べてみました。

## Vim 起動中に処理を実行する

以下のような記述で実現できます。

```vim
if has('vim_starting')
  echo 'HelloWorld'
endif
```

組み込み関数 `has({feature})` で、指定された feature が有効かどうかを判定します。

また feature `vim_starting` は [Vim の feature-list](https://vim-jp.org/vimdoc-ja/eval.html#feature-list) の1つです。以下のように明記されています。

> vim_starting            Vimの初期化プロセス中は真となる。

[Vim マニュアルの startup](https://vim-jp.org/vimdoc-ja/starting.html#startup)　の項目には、Vim の初期化の最後のステップに以下のように書いてあります。起動中は `vim_starting` が 1 になっているということですね。

> スタートフラグがリセットされ、has("vim_starting") がゼロを返すようになる。

## 特定のファイル拡張子のときに処理を実行する

`autocmd` という自動コマンドを定義することで使えるようです。使い方は以下のような形です。

`autocmd ＜イベント＞ ＜ファイルパターン＞ ＜実行コマンド＞`

[Vim マニュアルの autocmd-events](https://vim-jp.org/vimdoc-ja/autocmd.html#autocmd-events)

Vim のイベント一覧を見てもらうとわかると思いますが、非常にたくさんのイベントがあります。上記の `vim_starting` は、Vim の起動処理中だったのに対し、様々なタイミングに対して処理を追加できます。

その中で例えば「特定のファイル拡張子のファイルを開いた後」としたい場合、新規作成・既存ファイル開くいずれも対応するには以下2つのイベントで良さそうです。

* BufNewFile: 存在しないファイルの編集を始めたとき
* BufRead: 新しいバッファの編集を始めたとき、ファイルを読み込んだ後


拡張子が `.rb` のファイルを開いたときに `Hello World` と表示したい場合は以下のような処理を書いておきます。

```vim
autocmd BufNewFile,BufRead *.rb echo 'Hello World'
```

ただ、上記を `.vimrc` などに記載した場合、`:source .vimrc` などで再度スクリプトを読み込んだ場合、自動コマンドが読み込まれるたびに登録されてしまいます。

そのために、`augroup` という、自動コマンドの処理をグループ化するコマンドに、`autocmd!` というすべての自動コマンドを削除する処理を入れておくことで重複登録を回避できます。

```vim
augroup Hello
  autocmd!
  autocmd BufNewFile,BufRead *.rb echo 'Hello World'
augroup END
```

## おわりに

たまに他の人の `.vimrc` を読んだときに書いてあった `autocmd` の意味が何なのかわかってなかったのですが、調べられてよかったです。


## 参考

* [ファイルの拡張子によって、vimに自動でインデント幅を変えてもらおう！ - Qiita](https://qiita.com/mitsuru793/items/2d464f30bd091f5d0fef)
* [autocmd - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/autocmd.html)
ローカルなカルシウム活動を解析するツール「NA cubic」

この記事では、NA cubic(NA<sup>3</sup>：Neural Activity cubicの略)というツールの紹介をします。
カルシウム活動を解析するツールは色々ありますが(CaImAnなど)、ほとんどは細胞全体の活動を解析するものです。
しかし、最近は細胞全体の大きなカルシウムの流入(calcium spike)だけでなく、細胞の局所で起こる小さなカルシウムの流入(calcium transient)も注目されています。
このcalcium transientは神経細胞だけでなく、グリア細胞にも見られます。

NA cubicは、このcalcium transientの解析ができるのツールであり、ノイズに近いような小さな活動も捉えられるように実装されています。

ホームページ：https://www.biozentrum.uni-wuerzburg.de/bioinfo/computing/neuralactivitycubic/
論文：https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1006054

##インストール方法
(ホームページ内にユーザーマニュアルがありますが、少し古い情報のようです。ここで最新の入れ方を紹介します。)

NA cubicは、前回の記事で紹介したBio7ベースとしています。そのため、まずBio7をダウンロードしてインストールする必要があります。
そしてgithubからNA cubicをダウンロードしましょう。
https://github.com/jpits30/NeuronActivityTool
または
https://github.com/jpits30/NeuronActivityTool_ROI
（後者のが自分でROI設定ができる機能付きなのでお勧めです。）
Bio7を開いて、[File]タブの[Import]で、[Existing Projects into Workspace]を選択し、Select root directroryで、ダウンロードしたフォルダの「NeuronActivityTool」または「NeuronActivityTool_ROI」を選択します。[Copy projects into workspace]にチェックを入れて、[Finish]を押します。
これでBio7のワークスペース内にソフトがコピーされました。
Bio7の中の[Project Explorer]を見ると、中に「NeuronActivityTool」フォルダが出来ているはずです。
次に「NeuronActivityTool」の中の「src」の中の「(default package)」の中に「Main.java」を開きます。
<img width="1046" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/e9c30cfd-075d-5508-84c1-7668744d4bda.png">
開くと、searchタブの右下にJの文字のボタンが現れるのでそれを押します。これによりコンパイルが行われます。
(binが見つからずエラーになったときはProjectのBuild Pathにbinを加えましょう。)
コンパイルが終わったら[file]タブの右下の[S]のボタンを押すと、ソフトのGUIが開始されるはずです。

<img width="183" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/c33e454a-5d84-dde4-cdf8-a424f47e92e8.png">
これがソフトのGUIです。上から設定しボタンを押していけばよいです。
[Start Rserve And Load Image]で画像のロード
[Process Image Stack]で領域のトレースの計算
[Detect Activity]でトレースから活動を検出
を行います。
チェック項目の2つは表示の仕方を決めているだけでです。
解析結果に大きく影響するのは、Window SizeとSignal to Noise Ratio(SR比)の2つです。

##設定パラメータと内部のアルゴリズム
まずはwindow sizeで格子状に区切って、その一区画を領域とします。
領域内の平均の輝度値を代表値としてトレースを計算します。
（「NeuronActivityTool_ROI」ではこれに加えて自分で取ったROIを領域として加えることができます。）
このトレースの時系列変化から細胞の活動を取り出します。
トレースは細胞の活動以外でも、ノイズによっても変化(振動)しています。この2つを見分けなければなりません。
そこで使われる手法が、連続ウェーブレット変換(continuous wavelet transform:CWT)です。ウェーブレット変換はフーリエ変換に似ていますが、時系列変化する周波数を考慮した信号解析を行うことができます。周波数成分のみに変換するフーリエ変換とは違い、ウェーブレット変換の結果はウェーブレット係数として2次元のカラーマップ（周波数と時間の２次元の図）として得られます。
カラーマップの極大値のプロットしていくと稜線で描かれます。この長さとパラメータであるSN比の値から、それが細胞の活動であるかただのノイズであるかを判別するようです。(SN比を高くすると活動検出の閾値も上がる。)
<img width="459" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/9936c3f1-ea55-ccc4-9dfc-3d6b4afcb3cd.png">
上図の黒線がトレース、カラーマップがウェーブレット係数、青が稜線になります。（User Manualの図より） 


もう一つのパラメータであるSignal Average Thresholdは、背景の平均の輝度値に設定しておけばよいようです。(あまり結果には影響しない。)

Minimum activity countは、その値以下の活動回数の領域は誤差として活動をなかったことにするというパラメータです。活動が一定以上の領域のみを取り出したい場合に使えます。

##終わりに
ローカルな活動を検出できる点やGUIで使いやすい点から、なかなかよいツールだと感じました。
【Rails】RailsでDBからデータを読み込み、Vue.jsを通じてブラウザに出力する方法

## はじめに
RailsでDBからデータを読み込み、Vue.jsを通じてブラウザに出力する方法についてまとめました。

今回は`users_controller`の`index`アクションで取得された情報を**Vue.js**で表示する方法を例にしています。

# 環境
```yaml
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
Vue: 2.6.10
vue-cli: 4.1.1
axios: 0.19.0
```
## 前提
`name`と`email`の２つのカラムを持つ`User`モデルをRailsで作成済とし、その情報を**Vue.jsで表にして表示**するプログラムを例にします。

また、**axiosはインストール済**とします。
※インストール方法は[こちらの公式ドキュメント](https://github.com/axios/axios)を参照。

## 1.Rails側

### 1-1.`users_controller`

#### ディレクトリを新規作成・移動
通常：`app/controllers/`内
↓
変更後：`app/controllers/api/v1/`内
　※`api/v1/`は新規ディレクトリ作成

#### classに`Api::V1::`を書き足す

```ruby:app/controllers/api/v1/users_controller.rb
class Api::V1::UsersController < ApplicationController
```

#### indexアクションの定義を変更

```ruby:app/controllers/api/v1/users_controller.rb

...略
  def index
    #Vue.js側で呼び出したいデータだけをselectで抜き出す
    users = User.select(:id, :name, :email)
    #JSON形式でusersを出力 
    render json: users
  end
...略
end
```

### 1-2.routes.rb
ルーティングも上記に沿って書き換えます。
通常のRailsアプリと違って、`namespace`で囲う必要があります。

```ruby:routes.rb
Rails.application.routes.draw do
...略
  namespace :api, {format: 'json'} do
    namespace :v1 do
      resources :users, only: [:index]
    end
  end
end
```


これで、開発環境なら

**localhost:3000/api/v1/users**

にアクセスすると、

`users_controller`の**index**アクション

が発動し、

JSON形式でUserモデルの**id, name, email**

が出力出来る状態になりました。
あとはこのデータを**Vue.js側で拾います**。

## 2.Vue.js側
`UsersIndex.vue`という単一ファイルコンポーネントでデータを表示することにします。

※単一ファイルコンポーネントをどう読み込んでブラウザに表示するかについては割愛させて頂きます。

```vue:UsersIndex.vue
<template>
  <table>
    <tbody>
      <tr>
        <th>ID</th>
        <th>name</th>
        <th>email</th>
      </tr>
      <tr v-for="user in users" :key="user.id">
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.email }}</td>
      </tr>
    </tbody>
  </table>
</template>

<script>
// axiosを読み込む
import axios from 'axios';

export default {
  data() {
    return {
      //axiosで取得するデータを入れるため、空でOK
      users: []
    }
  },
  //mountedでVueインスタンスのDOM作成完了直後に読み込む
  mounted() {
    axios
      //GETリクエストでRailsで作成したjsonを取得する
      .get('/api/v1/users.json')
      //response.data は RailsのUser.select(:id, :name, :email)
      //これをdata()で定義したusersに代入する
      .then(response => (this.users = response.data))
  }
}

</script>
```

これでJSON形式だったUserモデルの**id, name, email**がVue.jsを通じてブラウザに表示出来ます。

**以上です！**

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [GitHub - axios/axios: Promise based HTTP client for the browser and node.js](https://github.com/axios/axios)
- [Ruby on Rails, Vue.js で始めるモダン WEB アプリケーション入門 - Qiita](https://qiita.com/tatsurou313/items/4f18c0d4d231e2fb55f4)
初学者目線のアセットパイプライン。

#アセットパイプラインとは
JavaScriptやCSSのアセット（ここで言うとJavaScriptのコードやスタイルシート、画像など）をスペースや改行を詰めて最小化したり圧縮して連結するための機能。
app/assetsの中は開発者にとってわかりやすいように複数のディレクトリ、ファイルに分かれていて、webブラウザに行く前にそれらを結合する。



#アセットパイプラインの仕事
- 高級言語のコンパイル※
- 連結
- 圧縮
- publicディレクトリにファイルを配置

以上の作業をアセットコンパイルという。

#導入方法
Gemfileに記載しなくてもGemfile.lock勝手に入っている、sprockets-railsというgemによって実行される。


#まとめ
javascriptを勉強していて、必要な知識だったので調べてみたらざっとこんな感じになりました。
ものすごく短い記事ですが、今はこの程度の理解。理解が深まればまた追記していきますが、みていて指摘などありましたらありがたいです。
FreeWnn の systemd への登録

昔昔だと Fedora の SRPM spec ファイルを変更して rpm を作ってからインストール等としていたけれども、もう Silverblue / ostree にしたので結構面倒だなと思ってしまい、素直に FreeWnn-1.1.1-a023.tar.gz から make install して /usr/local/bin/Wnn4 にインストールしました。

まぁ、ローカル・リポジトリ作って真面目に rpm 管理しても良いのだけれど。

で、起動／停止をどうしようかと迷いましたが、若干の試行錯誤で下記を作成して使っています。

かなり手抜きですが、一応支障無く動いているようです。

/etc/systemd/system/FreeWnn.service:

```
[Unit]
Description = FreeWnn jserver

[Service]
ExecStart = /usr/local/bin/FreeWnn-start
ExecStop = /usr/sbin/fuser -k /var/log/jserver.log
PIDFile = /run/FreeWnn.pid
Restart = always
RestartSec = 500
Type = forking

[Install]
WantedBy=multi-user.target
```

/usr/local/bin/FreeWnn-start:

```
#!/bin/bash
/bin/rm -f /tmp/jd_sockV4
/usr/bin/touch /var/log/jserver.log
/bin/chown wnn:wnn /var/log/jserver.log
/usr/local/bin/Wnn4/jserver -s /var/log/jserver.log
/usr/sbin/fuser /var/log/jserver.log > /run/FreeWnn.pid
exit 0
```
乱数の作成（Math.random();）

# 乱数の作成

Javaの勉強の一環として「Hit & Blow」を作成するにあたって答えを作成するのに乱数が必要になったのでその時得た知識を少々アウトプットします。

### 【とりあえずの乱数が必要な時】

私が作成した「Hit & Blow」は、0〜9までの数が必要だったので以下の**「Mathクラス」**を使用しました。

``` java:qiita.java

Math.random();
```

このように**「Mathクラス」**を使用することで0.0〜1.0未満のdouble型の乱数を取得できます。

例えば、

```java:qiita.java

(int)(Math.random() * 10);
```
といったようにすれば0〜9の乱数が得られる。(ちなみに最初の（int）でintにキャストしています）

##まとめ

いかがでしたでしょうか。

今回の記事では**「Mathクラス」**の使用でとりあえず乱数を取得するというものを紹介いたしました。

もちろん乱数の取得には他にもあるのでもっと詳しく知りたい方は調べてみてください。

またまだまだ初心者なため誤った表記、認識による情報をこの記事内で見つけられた方はご指摘いただけると幸いです。
【CSS】背景画像の設定

## background-image
:sunny: 背景画像を指定する。
:sunny: background-image: 画像のURL;

background-color で背景色は設定できたけど、それだけではなんだか味気ない・・・:sweat:
というときは背景画像を入れてみよう:smile:

```例.html
<div>
  <p>海はいいねぇ</p>
</div>
```

```例.css
div {
  color: white;
  width: 100%;
  height: 500px;
  background-image: url(https://www.pakutaso.com/shared/img/thumb/RED19515A006_TP_V.jpg);
}
```

一番下に background-image: 画像のURL; を入れてみました:smile:

Web
↓
<img width="1106" alt="スクリーンショット 2019-12-28 3.17.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/a6ed9ed5-a9c8-8aa9-a1e2-d9a4ae0f8d1e.png">

画像の左上に文字と写真が入りました:raised_hands:
文字で記入したとおり
海はいいねぇ〜:relaxed:
・・・とおもいきや！
海ではなく空しか写っていない！！:scream:

原因は私が高さを height: 500px; にしているため入り切らない画像は切り取られてしまったんだと思います:sob:

かといって高さは変えたくない:disappointed_relieved:

そんなときは・・・！:point_up::bulb:
background-size: cover; を加えてみよう:smile:

```例.css
div {
  color: white;
  width: 100%;
  height: 500px;
  background-image: url(https://www.pakutaso.com/shared/img/thumb/RED19515A006_TP_V.jpg);
  background-size: cover;
}
```

Web
↓
<img width="1107" alt="スクリーンショット 2019-12-28 3.27.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/649eb67b-7f63-20d9-ecc3-c736c443cd2a.png">

表示されました！:smile:

:sunny: background-size: cover;・・・画像をぴったりサイズに表示してくれる
VivadoでRTLモジュールを使う場合のリセットの極性

RTLで書いた小規模な回路はIPにするのではなくRTLモジュールとして配置するほうが便利でしょう。

モジュールは、IPとは異なり、インタフェースの仕様をGUIで設定できないので、想定しているのとは異なるブロックデザインのシンボルが作られる場合があります。

例えば、下の図のusb_resetというポートは正論理の信号なのですが丸が付いてしまっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/d59f5f30-1c60-7b1d-e9bd-942e8a85645a.png)

単に表示上の問題だけではなく、Vivadoはどこかでリセットの論理が逆だとWarningを出してくるかもしれません。

設計したとおりのリセット極性をVivadoに認識させるためには、モジュールのVHDLのarchtecture ~ beginの間にattributeを書くとうまくいきます。

```vhdl:
architecture Behavioral of misc is
    ・・・(中略)・・・
	ATTRIBUTE X_INTERFACE_INFO : STRING;
	ATTRIBUTE X_INTERFACE_PARAMETER : STRING;
	ATTRIBUTE X_INTERFACE_PARAMETER OF usb_reset: SIGNAL IS "XIL_INTERFACENAME usb_reset, POLARITY ACTIVE_HIGH, INSERT_VIP 0";
	ATTRIBUTE X_INTERFACE_INFO OF usb_reset: SIGNAL IS "xilinx.com:signal:reset:1.0 usb_reset RST";begin
```

このようにすると、usb_resetという信号が正論理として認識され、丸が消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/aaa10836-e259-c31e-2702-015107cd3b73.png)
Rustで多倍長演算

[Rug](https://docs.rs/rug/1.6.0/rug/index.html)という多倍長演算ライブラリがあったので[Rumpの例題](https://ja.wikipedia.org/wiki/%E7%B2%BE%E5%BA%A6%E4%BF%9D%E8%A8%BC%E4%BB%98%E3%81%8D%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97#Rump%E3%81%AE%E4%BE%8B%E9%A1%8C)をやってみます

```rust
use rug::{ops::Pow, Float};

fn f200(val: f64) -> Float {
    Float::with_val(200, val)
}

fn f(a: Float, b: Float) -> Float {
    let a2 = a.clone().pow(2);
    let b2 = b.clone().pow(2);
    let b4 = b.clone().pow(4);
    let b6 = b.clone().pow(6);
    let b8 = b.clone().pow(8);
    (f200(333.75) - &a2) * &b6
        + &a2 * (f200(11.0) * &a2 * &b2 - f200(121.0) * &b4 - f200(2.0))
        + f200(5.5) * &b8
        + a / (f200(2.0) * b)
}

fn main() {
    println!("{:e}", f(f200(77617.0), f200(33096.0)));
}
```

`rug::Float`に`Copy`が無いのでちょっと面倒になりましたが概ね雑にこんな感じだと思います。

> Rug is a high-level interface to the following GNU libraries:
> - GMP for integers and rational numbers,
> - MPFR for floating-point numbers, and
> - MPC for complex numbers.

と言ってるので[GNU MPFR](https://www.mpfr.org/)のラッパーですね。整数は[num-bigint](https://github.com/rust-num/num-bigint)がRust実装ですが、浮動小数点数は見当たらないですね（たいして探して無いのであったら教えてください）。
APIとは

#「API」＝「機能＋仕様書」
###API･･･ソフトウェアの機能を共有すること

ソフトウェアを一部公開して、他のソフトウェアと機能を共有できるようにしたもの。ソフトウェアの一部をWEB上に公開し、誰でも利用することができる。自分のソフトウェアに他のソフトウェアの機能を埋め込むことができるようになるので、アプリケーション同士で連携することが可能になる。

###APIでは他社のデータを使うこともできる

他社のユーザー情報を使って、自社のサービスにログインできる機能を作ることができる。
会員登録する必要もなく、メールアドレスやパスワードの入力も必要ない。
ユーザーが面倒な手続きや手間を省くことが可能。
###↓

####自分が利用していたAPI
・FacebookアカウントでInstagramを登録
・TwitterアカウントでQiitaを登録
・GoogleアカウントでYouTubeを利用


###APIの実例


####Facebook API･･･
インスタグラムはFacebook APIを使っているので、Facebookアカウントで登録ができてすぐに利用をはじめることができる。同じFaceBookの友達がインスタグラムを使いはじめた時や、友達が投稿した時にお知らせしてくれたりもする。

####LINE API･･･
・チャットボットの開発
・LINEログイン機能
・IoT開発
・音声アシスタントの開発
・LINE決済機能
・ソーシャルボタン・通知機能

下記参照
[LINE API のできることってなに？](https://www.sejuku.net/blog/110672)

####YouTubeAPI･･･
・チャットワークAPI
・未読数、未完了タスク数を取得
・タスク一覧を取得
・タスク情報の取得
・チャット一覧取得
・チャット作成
・チャット情報の取得
・チャット情報の変更
・チャットメンバーの一覧を取得

**APIにはまだまだたくさんの種類があり、作成するアプリケーションの種類によって、さまざまなAPIが用意されてる。**

下記参照
[作りたいアプリ別API一覧](https://www.sejuku.net/blog/7278)
※時間がある時に一通り目を通す。

引用元：Samurai Blog


###APIとは
引用元：Wkipedia

アプリケーションプログラミングインタフェース(Application Programming Interface)の略。
ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様。

####インターフェースって??
人間とコンピューターが接する部分で人間とコンピューターの境界にたって、情報のやりとりをしてくれる役割

####コンポーネントって??

ある機能を実現するために部品化されたソフトウェアのこと

具体例：PCのキーボード・マウス、テレビのリモコンなどがインターフェース。
人間の操作に従ってコンピューターに情報を伝えて会話をしてくれる翻訳機のような役割

####同じように、APIもプログラマーの代わりにアプリケーションに情報や指示を出してプログラミングしてくれるような役割
【CSS】複数の要素に対して同じCSSを指定

<img width="254" alt="スクリーンショット 2019-12-28 2.25.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/5b236256-5fae-645f-2cbd-f0aa6d3319fa.png">

```例.html
<h1>文字赤くしてー</h1>
<p>ここも赤くしてー</p>
```

このような場合、ＣＳＳでは

```例.css
h1 {
  color: red;
}
p {
  color: red;
}
```

このように記入しなければならなかった。
もちろんこれでも間違いではないのだけど
h1 も p も同じ内容。
こういうときは・・・

```例.css
h1,p {
  color: red;
}
```

h1 と p のあいだを , で区切って記入しても・・・

Web
↓
<img width="254" alt="スクリーンショット 2019-12-28 2.25.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/109c16fc-ed0f-a827-a1e8-b23af8f7073a.png">

同じ表示:laughing: 
コードも見やすくなりました:laughing:
robocopyで更新のあるファイル一覧を取得したい

定期的にフォルダをバックアップするなど、更新のあるファイル一覧を取得したいときがある。
そんなときに、下記のようなrobocopyコマンドでファイル一覧を取得して作業を効率化できそう。
robocopyのオプションは「robocopy /?」で調べることができる。
このtest.batは、「管理者として実行」する。

```test.bat
SET SRC=D:\Work\test20191228\src
SET DST=D:\Work\test20191228\dst
SET LOG=D:\Work\test20191228\log\result.log

rem 管理者として実行
robocopy %SRC% %DST% /L /B /MIR /XO /R:1 /W:1 /NJH /NDL /NP /LOG:%LOG%
```

result.logは、結果を出力したファイル。
削除されたファイル、更新のあったファイル、追加されたファイルを取得することができる。

```result.log

	  *EXTRA File 		       0	D:\Work\test20191228\dst\a\a2.txt
	        新しい		       5	D:\Work\test20191228\src\a\a1.txt
	  新しいファイル		       0	D:\Work\test20191228\src\a\a-1\a-1_01.txt
	  新しいファイル		       0	D:\Work\test20191228\src\d\d1.txt

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         6         2         4         0         0         0
     ファイル:         4         3         1         0         0         1
      バイト:         5         5         0         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00
   終了: 2019年12月28日 1:54:05

```
備忘録: Vue cli3 TypeScriptのPrettier設定

# 背景
Vue Cli3をTypeScriptで使いだしたが、Lintの設定がうまく反映されなかった。
おそらくはPrettierと衝突しているらしいく、中には諦めている人もいたので、主に自分好みの設定をPrettier側に設定をつけることで(個人的には)問題が解決した。

# 設定の変更

ルートディレクトリに`.prettierrc`を置く

```
{
  "singleQuote": true,
  "bracketSpacing": true,
  "arrowParens": "always",
  "trailingComma": "all",
  "tabWidth": 2,
  "printWidth": 120,
  "endOfLine": "lf",
  "semi": false,
}

```
`.eslintrc.js`を書き加える

before

```
  extends: ["plugin:vue/essential", "@vue/prettier", "@vue/typescript"],
```

after

```
  extends: ["plugin:vue/essential", "@vue/prettier", "@vue/typescript","prettier"],
```

以上。

# 終わりに
これを見つけるためにESLint側の設定をずっといじったがうまく行かず、仕方なくいろんな所を触っていたらVSCodeのAutolintが動かなくなり、Gitでやむなくresetした。何時間か浪費してしまったので、誰かのお役に立てれば幸いです。
地方で平均月収55万稼いだ37歳社畜の一年

#　スペック
入社12年(開発7年、常駐3年、リーダー/プレイングマネージャー3年)
35歳過ぎたのでプログラムはもうかけないかも？(htmlやjsを少々)
妻子あり(専業主婦、こども3人)

##　1-3月
昨年から開発しているサービスが佳境。
イマイチ現場とスキルがミスマッチな経験浅い人たち3〜5人をフォローしつつ、入社2、3年の若手2人と、ベテランwebエンジニア1.5人(0.5はエースが火消しで入ってくれた|兼務)を中心になんとか現場を回す日々。
全く思ったように仕事が進まない。
燃え尽きかけながらなんとかお客様に、「勘弁してくだい」と泣きついてこの期間、45人月を投入していただいたサービスをリリース。
平均45時間残業(休日出勤毎月有り、サービス残業有り…)

##　4-6月
メンバー(15年、20年選手の加入や上記のミスマッチ3人の離脱)が入れ替わりつつ、30人月超を平均11人で乗り切る。毎月サービスの改善のためのリリース。
平均50時間残業(もちろん休日出勤毎月有り)

##　7-9月
メンバーが少し入れ替わりつつ、チームの規模は9人くらいは固定で、毎月サービスの改善。
ようやくチームが安定して仕事が回っていることを実感できる日々。
ただ忙しくて余裕は無い。平均残業時間50時間(言わずもがな休日出勤毎月有り、家族サービス…)

##　10-12月
メンバー１人減って8人固定。タスク調整、管理を中心に仕事を進め、ただただサービス改善。
少しだけ周りの様子が見えるくらいに余裕があったと思える。
平均残業35時間(但し休日出勤毎月有り…)

# まとめ
メンバーが増えるとマネジメントは大変。
地方では身体で稼ぐ、健康大事！
社畜辞めたい！！！
家族サービスちゃんとしよう！

※皆様どんな一年でしたか？良い年末年始を!