OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】ListViewに簡単なAnimationを使う

## 背景
[こちらの記事(Two Months of #FlutterGoodNewsWednesday)](https://medium.com/flutter/two-months-of-fluttergoodnewswednesday-a12e60bab782)にて、2020年5月のアップデート情報が紹介されていました。

記事自体結構アップデート情報がまとまっているのでおすすめです。

そこで、**Plugins and Flutter Favorites**としておすすめのPluginとして紹介されていた[flutter_staggered_animations 0.1.2](https://pub.dev/packages/flutter_staggered_animations)を現在リリースしているこちらのアプリに導入してみました。

[App Store はこちら](https://apps.apple.com/jp/app/engolf/id1507668448?l=en)

## 導入イメージ
<img width="250" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/03cbb674-8426-b8c4-7378-4d9416166110.gif">

## ソースコード

`YourListChild()`の部分に本来描画したいList要素を記載するだけです。

```dart
    AnimationLimiter(
      child: ListView.builder(
        itemCount: 100,
        itemBuilder: (BuildContext context, int index) {
          return AnimationConfiguration.staggeredList(
            position: index,
            duration: const Duration(milliseconds: 375),
            child: SlideAnimation(
              verticalOffset: 50.0,
              child: FadeInAnimation(
                child: YourListChild(),
              ),
            ),
          );
        },
      ),
    ),
```

対象のコミットは[こちら](https://github.com/Tetsukick/enGolf/pull/4/commits/9f5c08d113bf48645bba889133fd72be46a815b1)
CSS設計のための、デザインガイドラインなどなど

CSSの設計で大事なことは

・用途がわかりやすい
・コピペで使い回しやすい

という２つのことがとても大事です。

最初にいただくデザインというのは大抵がそれだけで完結しません。
要素が増えたり、まったく別のデザインになったり、初期のデザインと完成時のデザインは全く別のものになる場合もあります。

そんなときに慌てないために、使いまわせる部品をつくるのです。
基本の部品をしっかり作ることで、バージョン違いの部品は簡単に作成することが可能になります。

そのために大事なことは、Webサイトに頻繁に使用する部品集をつくっておくことです。

# CSS設計の参考リンクやキット
それぞれをまとめてみました。


##スタイルガイドライン関連

▼質の高いスタイルガイドを作成するために考えておくべきこと
https://www.tam-tam.co.jp/tipsnote/html_css/post14750.html

▼デザインの参考に！デザインシステム / スタイルガイド10選
https://www.i3design.jp/in-pocket/5345




##アドビXD関連
▼XDプラグインのデザインガイドライン
https://adobexdplatform.com/plugin-docs/design/

▼Adobe XD用の日本語ワイヤーフレームUIキット「Wires jp」提供
https://blogs.adobe.com/japan/web-adobe-xd-ui-kit-wires-jp/

▼最速でUI/UXスキルを磨くための
UIキット集
https://www.adobe.com/jp/products/xd/ui-design-kits.html

▼デザインと開発の連携を効率化！Adobe XD用Semantic UIキット開発の舞台裏 | アドビUX道場
https://blogs.adobe.com/japan/cc-web-semantic-ui-kit-xd-icons-templates-design-system/

▼Adobe XD Free UI Styleguide
https://www.behance.net/gallery/50809349/Adobe-XD-Freebie-UI-Style-Guide

▼Adobe XD おすすめ無料キット21選まとめ【UI/UXデザイナー必見】
https://goworkship.com/magazine/free-adobe-xd-ui/

##Sketch関連
▼効率的なデザイン運用のために、Sketchガイドラインを作ってみた話（CrowdWorks DesignDiv）
https://note.com/designdiv/n/nebc5446718d7

▼「使いやすい＆運用しやすい」を目指したデザインシステムのSketch管理（Yahoo! JAPAN Tech Blog）
https://techblog.yahoo.co.jp/entry/20200414828256/

▼Sketchを使ったAtomic Designのワークフロー
https://uxmilk.jp/80160

▼sketchはスタイルガイドを作っておくとデザインが超絶楽になる
https://yososhi.com/archives/making-style-guide-by-sketch-and-make-design-easier/
レイヤースタイル　＞　テキストスタイル　＞　シンボル

▼Sketchでデザインしながらガイドラインを作ろう
https://note.com/czrkmsn/n/ndaa68d3f949e
命名規則：Namespace, Module, Component, ChildNode, variant

▼試し読み：『UIデザイナーのためのSketch入門&実践ガイド 改訂第2版』 デザイナー座談会
https://note.com/bnn_mag/n/nba2fd4d1c47f

▼「Sketchを用いたデザインシステム」を作ってチームでのデザイン作業を効率化した話
https://devblog.thebase.in/entry/2018/12/21/110000

▼エンジニアのための「Sketch入門！」　1時間コース
https://qiita.com/codomo_pro/items/663f17756d61aa8e8ea3





##デザインガイドライン関連
▼Human Interface Guidelines（Apple）
https://developer.apple.com/design/human-interface-guidelines/

▼Material Design Guidelines（Google）
https://material.io/design/guidelines-overview

▼Fluent Design System（Microsoft）
https://nijibox.jp/blog/design_guidelines/

▼Spectrum（Adobe）
https://spectrum.adobe.com/




##その他
▼UIデザイナーが知っておきたい海外の優れたデザインシステム17選
https://baigie.me/officialblog/2019/12/24/17-design-system/

▼【かんたん】デザインカンプの作り方、0から丁寧にわかりやすく図解します！
https://mogumogu-design.com/make-design-comprehensive/

▼デザインシステム と スタイルガイドライン　【まとめ】
https://dojo.codebot.io/design-system/index.html
AWS Certificate Manager(ACM)でSSL証明書の発行

#目的
個人アプリでssl化が必要だったためSSL証明書の発行が求められた。
筆者の備忘録

#前提条件
AWS、ALB(Application Load Balancer)、ec2、を活用します。
開発環境 rails

##ssl化までの手順
[Route53でドメインを購入（有料です）](https://qiita.com/takashi8816/items/d6d7edc711494dd24e0d)　
[AWS Certificate Manager(ACM)でSSL証明書の発行](https://qiita.com/takashi8816/items/c82c7f69256863df5b38) <=今回はここ
[ロードバランサーでALBにhttpsの設定を入れて作成](https://qiita.com/takashi8816/items/6dbbfe1d91724be5f6bb)
Route53でAレコードのエイリアスを作成

#AWS Certificate Manager(ACM)でSSL証明書の発行
AWSのサービスからCertificate Managerを選択
証明書のリクエストをクリック
<img width="1390" alt="aws2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/b763d70a-0e77-ca58-803d-39ce0790fc26.png">

パブリック証明書のリクエストを選択し証明書のリクエスト
<img width="1402" alt="aws3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/de5d5a62-2009-9517-e115-44364f2c594c.png">

ドメイン名を記入し、次へ
<img width="1073" alt="aws4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/3c4bac24-9378-f282-5687-06f974037335.png">

検証方法の選択
今回は、前回でドメインを購入したのでDNSの検証を選択
<img width="1087" alt="aws5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/b7542253-cfb2-d092-3bf2-c31eced18b88.png">

タグと値は必要ならば記入。
確定とリクエスト

## 今回のポイント　検証保留中
検証保留中は、発行されない！
証明書を検証して承認するには、追加のアクションが必要。
つまり、自分で手を動かさないとSSLを発行されない。
##発行されるまでの手順
・route53で[ドメインを購入（aws）](https://qiita.com/takashi8816/items/d6d7edc711494dd24e0d)を購入していればroute53で登録とでる。
・手動の場合route53では、紐付けたいドメインを選択、レコードを作成し、名前と値を入れると良い。
<img width="1083" alt="aws8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589433/86de32da-01c0-5176-4b0d-5d9af02e94c1.png">

あとは、発行と待つだけです。
MaixCube で MaixPy を使う

# はじめに

MaixCubeでの開発の基本はMaixPyです。MaixPyはマイコン用のPythonサブセットMicroPythonをMaixシリーズ用に実装したものです。

# MaixPy IDEのインストール

MaixCubeには出荷時にMaixPyがインストールされています。開発用のPCにMaixPy IDEをインストールすると、PC上でPythonを編集してそのままMaixCube上でプログラムを実行することができます。

MaixPy IDEの2020/5/30現在の最新版は0.2.5です。ここからダウンロードしてインストールします。Windowsであれば、maixpy-ide-windows-0.2.5.exe になります。その他Linux、Mac用があります。

https://dl.sipeed.com/MAIX/MaixPy/ide/_/v0.2.5

# MaixPy IDEの起動

インストールが完了したら、PCにUSBケーブルでMaixCubeを接続し、MaixPy IDEを起動します。

![MaixPy_20200530_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/ac5a6016-5d8d-e953-8e78-5044c90d21f5.png)

ツール - Select Board からボードを選択することができますが、0.2.5ではMaixCubeは選択肢にありませんが、デフォルトのSipeed Maix Dockの状態でもMaixCubeでプログラムを実行できるようです。

# MaixCubeの接続

左下の、![MaixPy_20200530_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/e6d6a3d9-8068-90d5-58b4-1f16765dd7b6.png) チェーンのマークをクリックし、ポートを選択してMaixCubeに接続します。

![MaixPy_20200530_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/9d804e91-1ca3-6c5c-e70e-66405386f960.png)


接続されるとチェーンのマークが赤色になり、グレーになっていた実行ボタンが緑色に変わります。これでプログラム実行の準備ができました。

MaixCubeの画面は

![MaixCube_20200529_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/f8fb22fb-dc64-6fc9-7c05-97da1bd7820e.png)

から

![MaixPy_20200530_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/5cd42e12-f873-8886-0250-f1badcf9bf92.png)

に変わります。



# プログラムの実行

IDEにはサンプルのhelloworld.pyアプリが表示されています。このプログラムはカメラの画像をLCDに表示します。 ![MaixPy_20200530_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/7f590e8c-9adf-0ba9-e666-f1cee33dbf70.png) ボタンを押すと実行します。

2020/5/30現在、IDE上の画面は上下反転、LCDの表示は色が反転して表示されましまいました。22行目のlcd.display(img)の前にimg.negate()を入れてあげると画面表示は正しくなりました。

![MaixPy_20200530_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/53fe9692-786b-b1ae-3a56-73c6c78f29e5.png)

![MaixPy_20200530_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/b6d2e670-7b86-4786-c6ce-6eacfe94850c.png) ボタンで実行を中止し、 ![MaixPy_20200530_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/80c807a7-a519-6f22-47e5-a37e8f5a6d0f.png) ボタンでMaixCubeから切断します。

切断するとMaixCubeの画面は、

![MaixCube_20200529_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/f8fb22fb-dc64-6fc9-7c05-97da1bd7820e.png)

に戻ります。

# 最後に

MaixCube上でPythonのプログラムを簡単に実行することができました。
[UE4] 入力イベントのハンドリングと流れ

対象Ver：UE4.25.0

コントローラやタッチ操作などの入力の複雑さを明確化し、ゲームの内容に応じてカスタマイズするために役立てるための記事です。

#1. 外部入力から検出まで
　コントローラ、キーボード、マウス、タッチなどのハードウェアイベントを検出してから最初に入力を受け付ける箇所までの概略図が以下のようになります。HoloLensやOculusコントローラ、アーケードコントローラなどもこのような入力を介して通知されるので、どのInterfaceを利用しているか分からない場合はSlateApplicationでイベントを監視すると分かりやすいです。コンソール機のコントローライベント等も同様の入力インタフェースを利用します。

![2020-05-30_00h47_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/c681f5fa-d5cc-8a27-37b2-b5dc24553a6d.png)

**[ポイント]**
・ユーザー入力は各InputInterface, Controllerで監視されており、入力を検出したらFSlateApplicationに通知される
・例えばコントローラの入力は各インタフェースのSendControllerEvents()内で検出して通知する
・各インタフェースはコントローラを最大4つを監視しており、接続された順番に0,1,2...とControllerIdが割り当てられる
・各プレイヤーはデフォルトでControllerIdと一致するコントローラを使用する
　・つまり**最初のプレイヤー(PlayerId:0)は最初に接続されたコントローラ(ControllerId:0)の入力で動作する**
・各デバイス間でControllerIdを相互監視したり排他制御を行わない
　・つまり**XInputとRawInputコン各1つずつを同一PCに接続した場合、最初のプレイヤーはどちらの入力も受け付ける**
・キーボード/マウスは接続毎にControllerIdは割り当てられない

#2.検出から通知まで
　入力を受け取ってからゲーム側に入力を引き込んで何かのイベントが発生するまでの流れの概略図が以下のようになります。

![2020-05-30_01h25_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/1d495ceb-9658-f465-59ee-efc437714b2a.png)

**[ポイント]**
・入力はSlateApplicationから順番に通知する
・ビューポートにフォーカスしている場合はゲーム内に処理を流し込まれる左のルートを通過する
　・入力をどこかでブロッキングしたり、複数の入力に分配することもできる
・ボタン押下やテキスト入力など主にUIの操作は右のルートを通過して
　・UIナビゲーションの操作などもこちら
・ゲーム側から入力を検出して何かをやらせたい場合はInputProcessorかGameViewportClientのカスタムクラスを作成する
　・以下のブログはカスタムInputProcessorクラスを作成する参考になります
　　[くーこのプログラマメモ様：IInputProcessorによるキー入力処理について](https://shama-coo.hatenablog.com/entry/2020/03/20/182505)
Kerberized Hadoop ClusterのHive metastoreにPrestoを接続

## はじめに
扱っているデータの性質上、どうしてもオンプレミスでHadoop Clusterの運用を行っています。(クラウドがいい...)
今まではSpark, Hiveでバッチ処理をメインで行ってきましたが、最近インタラクティブにクエリを実行したいとの要望があり、今更ながらPrestoをKerberized Hadoop ClusterのHive metastoreに接続します。

##  環境
今回の接続に使用した環境は下記です。
### Kerberized Hadoop Cluster
サービス、ユーザ認証にKerberosを利用したHadoop Cluster(レルム: EXAMPLE.COM)
OS: CentOS 7.7
Hadoopディストリビューション: CDH6.2.1
master node: 3台
worker node: 6台

### Presto
Presto: version 333([prestosql](https://prestosql.io/))
coordinator: １台(master nodeのうち１台)
worker: 6台(worker nodeと同様)

## 前提条件
* Kerberized Hadoop Clusterを構築済み
* Prestoを導入済み
  * presto-cliが利用可能　
  * Kerberized前にHiveに接続済み

Hadoop ClusterのKerberosの設定はAmbariやCloudera Managerから簡単に可能です。
また、Prestoの導入も**presto-admin**を利用することで、coordinator, workerをCLIで一元管理可能です。(GUIがないのはネック！)

## KDCにPresto用のプリンシパルを登録、keytabの生成

Kerberized Hadoop Clusterで使用している、KDCにPrestoの設定を行います。
KCDのサーバで下記のコマンドを実行。
```shell
kadmin: addprinc -randkey presto@EXAMPLE.COM
kadmin: xst -k presto.keytab presto@EXAMPLE.COM
```
生成した`presto.keytab`をprestoのcoordinator, workerの`/etc/presto/presto.keytab`に配置します。
(配置場所は任意の場所で問題ありません。)

## /etc/krb5.confの設定(CentOS7のみ)

下記の設定をcoordinator, workerから**削除**

```shell
renew_lifetime = 7d
```

ここでかなりハマりました。この設定をしないとCentOSではpresto-cliの接続で`Message stream modified (41)`のエラーが発生します。

## core-site.xmlの設定
impersonationを有効にするため、下記の設定をCloudera Managerで行います。

```xml
<property>
  <name>hadoop.proxyuser.presto.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.presto.groups</name>
  <value>*</value>
</property>
```

## hive.propertiesの設定
下記の設定を追加します。

```shell
# Hive
hive.metastore.authentication.type=KERBEROS
hive.metastore.thrift.impersonation.enabled=true # prestosqlのみの設定, prestodbの方はなし
hive.metastore.service.principal=hive/_HOST@EXAMPLE.COM
hive.metastore.client.principal=presto@EXAMPLE.COM
hive.metastore.client.keytab=/etc/presto/presto.keytab

# HDFS
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=true
hive.hdfs.presto.principal=presto@EXAMPLE.COM
hive.hdfs.presto.keytab=/etc/presto/presto.keytab
```
設定したhive.propertiesをcoordinator, workerに配布し、Prestoを再起動します。

## 接続確認
presto-cliを利用して接続確認を行います。

```shell
./presto-cli --server {coordinatorのIPアドレス or ホスト名}:8080 --catalog hive --schema default --user {user}
presto:default> show schemas; # Hive上のデータベースが表示
```
`--user`で指定したuserは、Hive, HDFS上で適切な権限が付与されてている必要があります。

## 最後に
公式ドキュメントに従って、接続設定を行いました。
PrestoでKerberized Hadoop ClusterのHive metastoreの接続を解説しているサイトがほとんどなかったので、参考になれば幸いです。
また、Kerberized Hadoop ClusterのHive metastoreにPrestoを接続するだけであれば、Presto自体の**Kerberos, SSL/TLS設定**は不要です。

## 参考
https://prestosql.io/docs/current/connector/hive-security.html
MacでNintendo Switch のジョイコンを使う

# プレゼンのときにジョイコン使いたい

## 古い記事ではJoystick Mapperを推奨しているんだけど
古い記事を見ると、有料ソフトの「Joystick Mapper」を紹介している記事が多かったので買おうかと思ったけど、2020/05/30時点の評価は、2.9。
しかも、「使えなくなりました」というコメントまで記載しているので、これは有料で買ってうまく行かなかったら嫌だな。。と。
https://apps.apple.com/jp/app/joystick-mapper/id528183797?mt=12

## 見つけたぞ。今はまだ無料だ。JoyKeyMapper。

色々App Storeで漁っていたら評価が5.0の「JoyKeyMapper」を見つけた。

https://apps.apple.com/jp/app/joykeymapper/id1511416593?mt=12

迷わずインストールしよう。

## つなぎ方
ジョイコンをニンテンドースイッチ本体から取り外すと、SL,SRの間に「ボタン」があるので押すとペアリングモードになるので、MacのBluetoothをONにすると簡単に接続ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29550/c9651281-6a61-9c2b-f791-72389b6ec540.png)

Joy-Con(L) または (R) をおもむろに接続し、JoyKeyMapperを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29550/2680cfda-5f30-21b0-f851-6a473f1078aa.png)


最初は、何も設定されていないので動かないが、上記の設定を参考に好きにカスタマイズすると、色々使えて便利かと思う。
Chromeブラウザの戻る、進むを左と右に割り当てて、ブラウジングも片手でできるようにした設定。

これで、プレゼンをジョイコンですることができるはずだ。
No suitable Android AVD system images are available. You may need to install these using sdkmanager, for example: sdkmanager "system-images;android-27;google_apis_playstore;x86"

##エラー
Androidのエミュレータを動かそうとしたら下記のエラーが出た。

```
No suitable Android AVD system images are available. You may need to install these using sdkmanager, for example: sdkmanager "system-images;android-27;google_apis_playstore;x86"
```

言われた通り、`sdkmanager "system-images;android-27;google_apis_playstore;x86`をターミナルで実行すると

```
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
	at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	... 5 more
```
というエラーがでる。

## 解決
※ なぜこれでうまくいくのかを把握していないので、実行する時は気をつけてください。

JDKをインストールすればよかった。Macの場合は brew cask でやると便利だ。

```
brew cask install java
```

これでダメな時はパスが通っているか確認する。それでもダメなら下記の通りバージョンを下げる。java8は使えなくなっているらしいので`adoptopenjdk8`を使う。

```
brew cask install adoptopenjdk8
```

パスを通す（java8の時）

```
export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
PATH=${JAVA_HOME}/bin:${PATH}
```


## 環境
Mac Catalina 10.15.4

## 参考
- homebrew-caskでJava8をインストールする
https://qiita.com/d_forest/items/290bb05bb929e5d74647

- Faild to install ...
https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a

- javaのアンインストール方法： 
https://www.java.com/ja/download/help/mac_uninstall_java.xml
PythonでMattermostにIncoming Webhookを投げる

Mattermostのusernameとiconの上書きを許可する設定をし、Pythonを使ってMattermostに投稿しました

セルフホストするMattermostへWebhookを使ってメッセージを投げ込む必要があったので調査しました。
現在携わっているプロジェクトはPythonを多用しているため、Pythonでできないか調べてみました。

### Python側の処理

Mattermostへのメッセージのポストは単純にhttp postを投げるだけなので、特段ライブラリなどいらないかなという思いはありましたが
一応調べてみたところ、[良さそうなライブラリ mattermostdriver](https://pypi.org/project/mattermostdriver/)があったので、そちらを使うことにしました。

使い方は簡単で

1. installします

```
% poetry add mattermostdriver
# pipの場合は以下
% pip install mattermostdriver
```

2. 以下のような感じで使います

```
    mattermost_driver = Driver({
        'scheme': 'https',
        'url': 'mattermost.your-domain.com',
        'port': 443,
    })
    webhook_id = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
    mattermost_driver.webhooks.call_webhook(hook_id=webhook_id, options={
        "username": "my-bot",
        "icon_url": "https://www.mattermost.org/wp-content/uploads/2016/04/icon.png",
        "text": "Hello, this is some text\nThis is from python script. :tada:",
    })
```

これで、pythonから投稿できました

### Mattermostの設定

結構つまづきポイントもありました、
なぜか、usernameやicon_urlが指定しても変わってくれなかったのです。

少し調査したところ mattermostのconfigの変更（＋リスタート）が必要でした。以下が詳しかったです。

- https://developers.mattermost.com/integrate/incoming-webhooks/
- https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-usernames
- https://docs.mattermost.com/administration/config-settings.html#enable-integrations-to-override-profile-picture-icons

以下の設定を変更して、mattermost serverの再デプロイを実施しました。

**/mattermost/config/config.json**

```
        "EnablePostUsernameOverride": true,
        "EnablePostIconOverride": true,
```

設定変更後、Pythonで作った、scriptで、usernameとiconが変更されていることを確認しました。

同じ内容ですが、[こちら](https://kumano-te.com/activities/post-webhook-to-mattermost-by-python)からもご覧いただけます。

以上になります。
Vim の debug をやるときのメモ

Vim に限った話ではないけれど。

```diff
diff --git a/src/Makefile b/src/Makefile
index 9b50eca6d..340d60b1a 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -593,7 +593,7 @@ CClink = $(CC)
 # When using -g with some older versions of Linux you might get a
 # statically linked executable.
 # When not defined, configure will try to use -O2 -g for gcc and -O for cc.
-#CFLAGS = -g
+CFLAGS = -ggdb3
 #CFLAGS = -O

 # Optimization limits - depends on the compiler.  Automatic check in configure
@@ -1162,7 +1162,7 @@ INSTALL_DATA_R    = cp -r

 ### Program to run on installed binary.  Use the second one to disable strip.
 #STRIP = strip
-#STRIP = /bin/true
+STRIP = /bin/true

 ### Permissions for binaries  {{{1
 BINMOD = 755
```

# ggdb3
CFLAGS にこれのみを設定することによって、debug info を GDB 用に出力するようになり、かつ最適化もやらないようになる。最適化をやめるとアセンブリ言語の内容 (つまり CPU の動作) が変わってくる。最適化が行われて、変数処理がすべてレジスタ上で完結しているような場合には optimized out されて見えなくなってしまう。`-ggdb3` だけを設定するようにしておけばすべて見えるはず。

# strip
`STRIP` には `$ make install` するときに実行されるプログラムを定義する。`/bin/true` の行をアンコメントすると、つまり strip しなくなる。strip すると symbol や section の情報が取り除かれてしまうので debug は難しくなる。

# 普通に build した Vim で問題が起きた場合
再現手順が分かっていて上の patch 入りでも再現する場合にはいいけれども、そうでない場合や、何の準備もなく急に問題が起きた場合の対応: 上述の通り、build した binary そのものは strip されておらず、`$ make install` するときに、strip された binary を配置しているようだ。なので、急に問題が起きて core dump だけが残ったというような場合でも、落ちた時の (install した) binary ではなく build した binary そのものを使えば symbol などは見れる。

```
$ gdb repository/vim/src/vim core-file
    とか
$ gdb -p $(pgrep vim) repository/vim/src/vim
```

# 参考文書
https://vimconf.org/2018/slides/modes-vimconf2018-ujihisa.pdf
bundle install時に、libv8やtherubyracerでエラーが出た

## 概要
既存のプロジェクトに参画する際、Railsの環境を構築するとき、libv8やtherubyracerにより以下のようなエラーが出たので対処方法を記載する。

```
# libv8のエラー
An error occurred while installing libv8(3.16.14.19), and Bundler
cannot continue.
Make sure that `gem install libv8 -v '3.16.14.19' --source
'http://rubygems.org/'` succeeds before bundling

# therubyracerのエラー
An error occurred while installing therubyracer(0.12.3), and Bundler
cannot continue.
Make sure that `gem install therubyracer -v '0.12.3' --source
'http://rubygems.org/'` succeeds before bundling
```

## 解決方法
下記の参考資料を参考にし、以下のコマンドにより解決した。

```
> brew install v8@3.15
> bundle config --local build.libv8 --with-system-v8
> bundle config --local build.therubyracer --with-v8-dir=$(brew --prefix v8@3.15)
```

上記コマンドを実行した後に、bundle installをすると成功した。

## 終わりに
今回は解決策のみ記載したが、libv8やtherubyracerの内容もしっかりと記載したい。

## 参考資料
　・　https://gist.github.com/fernandoaleman/868b64cd60ab2d51ab24e7bf384da1ca
　・　https://www.task-notes.com/entry/20170402/1491058800
JavaScriptを用いて非同期通信③(doneメソッド)

#ajaxと必ずセットでついてくるメソッド
結論、done,failメソッドです。
簡単に説明するとajaxに書いてあるコードが成功したときはdone書いてあるときのコードが、
失敗したときはfailのコードになります。

以上でajaxについては以上です。
次回からajaxに書く中身について具体的にどのようなものがあるのかを示していきます。
非同期通信完了まで後もう一歩！！
はじめてのThree.js 7章 日記

[はじめてのthree.js](https://www.amazon.co.jp/dp/4873117704)

#新たに知った知識
- sizeAttentionはカメラの位置関係なく現れる大きさ
- canvas要素で見た目を変更できる
- THREE.PointsはfrustumCulledというプロパティがあり、パーティクルが画面外に出ると描画しないのでパフォーマンス向上する
- particleで応用する際はmapプロパティにtextureを追加するのを忘れずに

#気づいたこと
- pointめっちゃ楽！

#wow moment
- 

#まだ解決していない点
- パーティクル、ポイントクラウド、スプライトの違いはなんとなく分かったけど説明するとなるとうーんってなる


[8章はこちら](https://qiita.com/asadsexyimp/items/566c35f7449a6bf4af5b)
ちゃちゃっとGitHubアイコンを使いたい時に便利なOcticons

先日とあるアプリを作っていて GitHub のロゴとかマージのアイコンが使いたくなったのですが、そんな時に便利なパッケージがあったので紹介します。

アプリは [Angular](https://angular.jp/) & [Angular Material](https://material.angular.io/) で作っていました。material icon の中にないんですよね、GitHub のアイコン。 [Font Awesome](https://fontawesome.com/) にはいろいろ揃っているんですが、ロゴとマージアイコンだけのためにパッケージ追加するのもなぁ...とためらってしまいました。なお SVG をダウンロードしてカスタムして使う器量は私にはありません。

## @primer/Octicons

そこで見つけたのが `@primer/octicons` です。
https://primer.style/octicons/
<img width="７00px" src="https://user-images.githubusercontent.com/15980747/83271111-5f42be80-a204-11ea-8d6b-c548c9d240c2.png">

パッケージサイズは `173 kb` と軽量！
GitHub の ウェブサイトで使われているアイコンが一通り揃っています。

## インストール

```bash
$ npm install @primer/octicons --save
```

## ディレクティブとして使う

ドキュメントを見ても Angular で使う方法が載っていなかったので [issue](https://github.com/primer/octicons/issues/162) を参考にディレクティブを作りました。

```typescript
import { Directive, ElementRef, Input, OnInit } from '@angular/core';
import * as octicons from '@primer/octicons';

@Directive({
  selector: '[octicon]',
})
export class OcticonDirective implements OnInit {
  @Input() icon: string = null;
  @Input() width = 20;
  @Input() fill = '#000000';
  @Input() class = '';

  constructor(
    private ref: ElementRef,
  ) {}

  ngOnInit() {
    this.getElement().innerHTML = this.getSVG(this.icon, this);
  }

  private getElement(): HTMLElement {
    return this.ref.nativeElement;
  }

  private getSVG(name: string, options: {
    width: number,
    fill: string,
  }): string {
    if (!octicons[name]) {
      throw new Error(
        `${name} is invalid. The names below are available:\n ${Object.keys(octicons).join(',')}`
      );
    }

    return octicons[name].toSVG(options);
  }
}
```

[octicons のサイト](https://primer.style/octicons/) でアイコン名を検索して `icon` に渡します。

```html
<i octicon icon="mark-github"></i>
```

塗りつぶし・大きさ・クラスはオプショナルです。

```html
<i octicon
  icon="mark-github"
  fill="#ffffff"
  width="25"
  class="my-class"
></i>
```

## 試しに使ってみる

雛形のインデックスページのナビゲーションバーにひっそりしのばせてみました。

```html
<span>Welcome</span>
  <div class="spacer"></div>
  ...
  <a octicon icon="octoface" fill="white" width="22"></a>
  <a octicon icon="mark-github" fill="white" width="22"></a>
  <a octicon icon="git-merge" fill="white" width="22"></a>
  <a octicon icon="package" fill="white" width="22"></a>
```

<img width="700px" src="https://user-images.githubusercontent.com/15980747/83273107-104a5880-a207-11ea-8d2e-ea07ada20c34.png">

## ビルドサイズ

`$ ng new` しただけのプロジェクトをビルドすると `main-es2015.js` のサイズは `56.4 kB` でした。 `octicon` ディレクティブを4つ使ってビルドすると `60.5 kB` に増加。その差たったの `4.1 kB` と軽量です。
<img width="700px" src="https://user-images.githubusercontent.com/15980747/83276061-09254980-a20b-11ea-9643-89e456a2c1dc.png">
<img width="700px" src="https://user-images.githubusercontent.com/15980747/83276074-0c203a00-a20b-11ea-8a5c-ed4b63eecaa3.png">

## サンプルコード

octicons には一通りの GitHub アイコンが揃っているので、色とサイズを変更すればいろいろ便利に埋め込みできます。サンプルコードを書いてみたので、よければ参考にしてみてください。

https://stackblitz.com/edit/angular-ivy-9dtsnp
<img width="700px" src="https://user-images.githubusercontent.com/15980747/83274393-b5196580-a208-11ea-92d4-ce8f314a61ce.png">
yukicoder contest 250 参戦記

# yukicoder contest 250 参戦記

## [A 1063 ルートの計算 / Sqrt Calculation](https://yukicoder.me/problems/no/1063)

n を割ることが出来る最大の i<sup>2</sup> が見つかれば答えは、i と n÷i<sup>2</sup> となる.

```python
n = int(input())

for i in range(10 ** 5, 0, -1):
    if n % (i * i) == 0:
        print(i, n // (i * i))
        break
```

## [B 1064 ∪∩∩ / Cup Cap Cap](https://yukicoder.me/problems/no/1064)

f(x) = C<sub>1</sub> - C<sub>2</sub> を考える. f(x) = 2x<sup>2</sup>+(a-c)x+(b-d) となる. 当然 x = +∞ 及び x = -∞ の時は f(x) = +∞ である. 最も小さいのは f'(x) = 4x + (a-c) = 0 → x = (c - a) / 4 のときである. f((c - a) / 4) が正の場合は交点無し、0の場合は交点1つ、負の場合は交点が2つとなる. 2つの交点は -∞ .. (c - a) / 4 と (c - a) / 4 .. +∞ にあるので二分探索で f(x) = 0 となる x を探せば良い. 後は二点を通る直線の方程式をググって書いておしまい.

```python
a, b, c, d = map(int, input().split())


def f(x):
    return 2 * x * x + (a - c) * x + (b - d)


t = f((c - a) / 4)

if abs(t) < 1e-6:
    print('Yes')
    exit()

if t > 0:
    print('No')
    exit()

ok = 1e12
ng = (c - a) / 4
for _ in range(100):
    m = (ok + ng) / 2
    if f(m) > 0:
        ok = m
    else:
        ng = m
x1 = ok
y1 = x1 * x1 + a * x1 + b

ok = -1e12
ng = (c - a) / 4
for _ in range(100):
    m = (ok + ng) / 2
    if f(m) > 0:
        ok = m
    else:
        ng = m
x2 = ok
y2 = x2 * x2 + a * x2 + b

p = (y2 - y1) / (x2 - x1)
q = y1 - p * x1
print(p, q)
```

## [C 1065 電柱 / Pole (Easy)](https://yukicoder.me/problems/no/1065)

コストを座標から計算しないといけないことを除けば、重み付きグラフの最短路計算でしか無いので、普通に幅優先探索で解ける. といいつつ、以下のコードは PyPy でないと TLE になる(笑).

```python
# PyPy でのみ AC
from math import sqrt
from sys import stdin
from collections import deque

readline = stdin.readline

N, M = map(int, readline().split())
X, Y = map(lambda x: int(x) - 1, readline().split())
pq = [list(map(int, readline().split())) for _ in range(N)]
PQ = [list(map(int, readline().split())) for _ in range(M)]

links = [[] for _ in range(N)]
for P, Q in PQ:
    links[P - 1].append(Q - 1)
    links[Q - 1].append(P - 1)

q = deque([X])
t = [float('inf')] * N
t[X] = 0
while q:
    i = q.popleft()
    for j in links[i]:
        a, b = pq[i]
        c, d = pq[j]
        k = t[i] + sqrt((a - c) * (a -c) + (b - d) * (b - d))
        if k < t[j]:
            t[j] = k
            q.append(j)
print(t[Y])
```

## [D 1066 #いろいろな色 / Red and Blue and more various colors (Easy)](https://yukicoder.me/problems/no/1066)

敗退. ナイーブなのは書けたけど当然 TLE. というか、B が1個でも、N=6000、B1=3000で TLE するのに(笑).

追記: 解説の DP を1次元化したがそれでも Python では TLE だった.

```python
# PyPy でのみ AC
N, Q = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

dp = [0] * (N + 1)
dp[1] = 1
dp[0] = A[0] - 1
for i in range(1, N):
    for j in range(i, -1, -1):
        dp[j + 1] += dp[j]
        dp[j + 1] %= 998244353
        dp[j] *= A[i] - 1
        dp[j] %= 998244353

print('\n'.join(str(dp[b]) for b in B))
```
関数について

#関数とは
いくつかの処理をまとめたもの
`const 関数名　= ()=>{処理; 処理; …};`

関数を実行する際は関数名を用いて呼び出す
`関数名()`
#####書き方
~~~js
const aisatsu = ()=>{
 console.log("いらっしゃいませ");
 console.log("お先に食券をご購入ください");
};

aisatsu();
~~~
#####出力例
いらっしゃいませ
お先に食券をご購入ください

#引数を受け取る関数
###引数とは
上記の関数は、あくまで定数の式として呼び出しをおこなった。
引数とは、関数における変数で、その変数に代入するのが値
`const 定数名　= (引数名)=>{};`

関数の呼び出しは
`定数名(値);`

#####書き方
~~~js
const buy = (menu, price)=>{
 console.log(`選択されたのは${menu}ですね`);
 console.log(`値段は${price}円です`);
};

buy("醤油", 650);
~~~

#####出力例
選択されたのは醤油ですね
値段は650円です

#戻り値
関数を用意し、その関数に変数を代入しその結果を受け取る一連の処理の結果
retunを用いて戻り値として返す処理を用意し、その処理の変数に値を代入し戻り値を受け取る。
`const 変数名 = (変数)=>{
 return 処理;
};
const 戻り値 = 変数名(代入値);
`



#####入力例
~~~js
const buy = (menu,price)=>{
　const comment = {
   console.log(`選択されたのは${menu}ですね`);
   console.log(`値段は${price}円です`);
  }
　return comment;
};

const order1 = buy("醤油",650);
console.log(order1);

~~~

#####出力例
選択されたのは醤油ですね
値段は650円です
Macの電源ボタンを無効化する方法

Macの電源ボタンを無効化する方法について紹介します。

意外と日本語の記事が見当たらなかったのでこちらに残しておきます。

## 結論
**PowerKey.app**という有料アプリ(2020年5月現在で5USD)を使うことで、電源ボタンを無効化、もしくは他のキーにリマップすることができます。

注意点として、**電源ボタンの長押しによるシャットダウンは防ぐことができません**。

参考: PowerKey https://github.com/pkamb/PowerKey

## なぜMacの電源ボタンを無効化したいか?
私はMac Book ProのJIS配列を使っています。
ただ、キーボードはUS配列の方が手に馴染みます。

そこで、US配列の「Anker ウルトラスリム Bluetooth ワイヤレスキーボード」や「Magick Keyboard 2」をMacに載せて使っています。

外付けのキーボードをMacに載せるとタイピングのたびに内臓キーボードが反応してしまい困るわけですが、そこはKarabiner-Elements.appの出番です。外部キーボードを接続している時は内臓キーボードを無効化できます。
ただ、Karabiner-Elements.appでは唯一電源ボタンは無効化できません。

電源ボタンが無効化できない、つまり有効化になっていると、タイピングのたびにちょっと電源ボタンに触れただけでスリープモードになってしまいとても不便に感じていたわけです。
XamarinのUIWebView廃止対応

# 背景

>　Updating Apps that Use Web Views
>　December 23, 2019
>　https://developer.apple.com/news/?id=12232019b

既存アプリも2020年12月からUIWebViewを含んだアプリの審査はリジェクトされるようになります。
みんな大好きXamarinのアプリも対応しとかないとね。

＃参考情報をもとに試した内容を書いてますがアプリの審査までは試してません
＃もし情報に不足・誤り等お気づきの方がいらっしゃいましたらご指摘お願いします

# 対応方法

「UIWebView使ってるところをWKWebViewに変えれば良いんでしょ〜」と余裕をかましてると場合によっては痛い目にあいます。
**使ってるパッケージやサードパーティーのライブラリがUIWebViewを含んでいることがあり得るからです。**

最低でも以下の対応が必要なようです。

* Xamarin.Forms を 4.5 以上にあげる
* Xamarin.iOS を 13.10.0.17 以上にあげる
* Xamarin.iOS のビルド引数に`--optimize=experimental-xforms-product-type`を追加する

# 果たしてそれで十分か？

自分の書いたソース以外にもUIWebViewが潜んでいる可能性があります。

実際にXamarin.Authの中に隠れていました。
https://github.com/xamarin/Xamarin.Auth/issues/423

実際にソースを覗いてみると確かにUIWebViewがいました。
https://github.com/xamarin/Xamarin.Auth/blob/master/source/Core/Xamarin.Auth.XamarinIOS/PlatformSpecific/WebAuthenticatorController.cs#L50

ということで「審査に出してみないとわからない」だと怖いので事前に確認したいですよね。
`--warn-on-type-ref=UIKit.UIWebView`をビルド引数に追加すると警告を出してくれるようになります。
他にもビルド後のDLLの中身を覗いてみてもUIWebViewがいるかどうかがわかります。
自信がない人・うまくできない人は実際にipaをアップロードしてみて警告が出るか確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201603/f96feeab-1eab-d372-fb47-80dc7c7b917f.png)



# 参考

UIWebView Deprecation and Xamarin.Forms
https://devblogs.microsoft.com/xamarin/uiwebview-deprecation-xamarin-forms/

Xamarin. Forms WebView
https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/user-interface/webview?tabs=macos#uiwebview-deprecation-and-app-store-rejection-itms-90809

Xamarin.iOS の Web ビュー
https://docs.microsoft.com/ja-jp/xamarin/ios/user-interface/controls/webview#uiwebview-deprecation
【Javascript】ネストされたJSONデータの取得方法で詰まったので記録

# データイメージ
```javascript
   {
  "eventKey":"repo:xxxxxxxx",
  "date":"2020-05-30T00:00:00+1000",
  "actor":{
    "name":"admin",
    "emailAddress":"admin@example.com",
    "displayName":"Administrator",
    "active":true
  }
```
取得対象は、actor内のdisplayNameとする。
とある環境で、コーディングした際に、以下で説明する`ブラケット記法`でしか値が取れなかったため備忘録として記録する。

# 取得方法(2種)
- ブラケットを用いる


```javascript

json['actor']['displayName']
```

- .（ドット)を用いる

```javascript
json.actor.displayName
```

# 最後に
結論、console.logではどちらを使っても値が取れるのだが、
とある環境では、ドット記法が使えないケースが存在した。
詳しい方いましたら、解説願います・・
JuicerでHi-Cのコンタクトマップをつくりたい

Hi-Cのコンタクトマップの書き方を日本語で解説しているのってほとんどなくなーい？
ということで人柱になりたいと思います。

Hi-Cの日本語解説ついては以下のスライドが神です。
https://biosciencedbc.jp/gadget/human/170901_higashi_170831.pdf

プロトコルについては以下の論文が現状ベストプラクティスと思います。
https://pubmed.ncbi.nlm.nih.gov/31919520/

----


#### コンタクトマップ作成について
コンタクトマップ作成ではほんとはHiC-Proが一番いいらしいですが、今回はJuicer使います。

#### Step.1 Juicerをダウンロード

```shell
git clone https://github.com/theaidenlab/juicer.git

#新しくフォルダを作る
mkdir <myJuicerDir>

#作ったフォルダに移動する
cd <myJuicerDir> 

#juicerというディレクトリにあるCPUというフォルダにシンボリクリンクをはる
ln -s /path/to/juicer/CPU scripts 

#つぎにscriptsフォルダに移動
cd scripts/common

#juicerのツールをダウンロード
wget https://hicfiles.tc4ga.com/public/juicer/juicer_tools.1.9.9_jcuda.0.8.jar

#これに対してもシンボリックリンクをはる
ln -s juicer_tools.1.9.9_jcuda.0.8.jar  juicer_tools.jar

```

####  Step.2 リファレンスゲノムの準備

```shell

# 先ほど作った<myJuicerDir>に移動
cd /path/to/<myJuicerDir>

# referenceという名前のフォルダを作成
mkdir references
#そこにリファレンスとなるfastaファイルを入れる
#かりにref.fastaとする

# 制限酵素サイトを示したファイルを収納するフォルダを作成
mkdir restriction_sites

#restirction_sitesディレクトリに移動
cd restriction_sites

#制限酵素サイトのファイルを作成
python /path/to/juicer/misc/generate_site_positions.py \
python /path/to/juicer/misc/generate_site_positions.py \
DpnII \
ref \
/path/to/references/ref.fasta 
#ファイル名には自動的に制限酵素名(この場合だとDpnII)が付加されるので書かなくて大丈夫

#chrom.sizeファイルの作成
awk 'BEGIN{OFS="\t"}{print $1, $NF}' ref_DpnII.txt > ref_DpnII.chrom.size

#restirction_sitesディレクトリでBWA用のindex作成
cd references
bwa index ref.fasta
```


#### Step.3 fastqファイル用のディレクトリ作成

```sh
#適当なディレクトリ名でフォルダ作成
mkdir <sample_name>

#そこに移動して
cd <sample_name>
# さらにfastqという名前のファイルを作成する これ大事！
mkdir fastq

# この中にfastqファイルを持ってくる

```



#### Step.4 Mapping

以下をqsubした

```sh
#!/bin/sh
#$ -S /bin/sh
#$ -cwd
#$ -l s_vmem=80G -l mem_req=8G -pe def_slot 10

export PATH=$PATH:~/miniconda3/bin/ 
#たぶんほんとはこれいらない。自分の環境構築に問題あり。。

/path/to/scripts/juicer.sh \
-t 10 \
-d /path/to/<sample_name> \
-D /home/ahosakanig/<myJuicerDir>  \
-s DpnII \
-z /path/to/references/[].fasta  \
-y /path/to/restriction_sites/[]_DpnII.txt \
-p /path/to/restriction_sites/[]_DpnII.chrom.size
```

そうすると`fastq` フォルダに`aligned` というのが出来上がる。
ここに入っている`inter.hic` がコンタクトマップ
これをJuicebox アプリで読み込むと完成！
ダウンロードは以下から。
https://github.com/aidenlab/Juicebox/wiki/Download

描けたが、ここからが大変なんでしょう、きっと。まだカバレッジもデータも足りないのでこれからがんばる。
DBのバックアップファイルを作ったり戻したりする

## 概要
本番環境からDBのバックアップを取得したり、自身のローカル環境にそのバックアップファイルを
入れたりしたい場合がある。
そのような時に有用なコマンドを示す。

## 環境
 - MySQL5.7

## DBのバックアップ
以下のコマンドにより、DBのバックアップファイルを作成できる。
なお、dumpという形式で出力する。

```
> mysqldump -u ユーザー名 -p データベース名 > ~/ファイル名.dump
```
上記のようなコマンドにより、「データベース名というデータベース」を「ファイル名.dump」という形式で
ホームディレクトリに出力できる。


## DBのリストア

以下のコマンドにより、前項で取得したバックアップファイルをDBに戻すことができる。

```
> mysql -u ユーザー名 -p -D データベース名 < ~/ファイル名.dump
```
上記のようなコマンドにより、ホームディレクトリに出力した「ファイル名.dump」を「データベース名というデータベース」にリストアすることができる。

## 終わりに
業務などでも、バックアップファイルの取得やそのリストア作業はちょくちょくあるので、
試してみると良い。
Macのcurl使ってクライアント証明書付きでアクセスするとcurl: (58) could not load PEM client certificateが出る

MacでCurl使ってクライアント証明書を添付してアクセスすると

```
okanofumiaki@okano ~ % curl https://hogehoge.net/ -E ./user.pfx:password 
curl: (58) could not load PEM client certificate, LibreSSL error error:09FFF06C:PEM routines:CRYPTO_internal:no start line, (no key found, wrong pass phrase, or wrong file format?)
```

とエラーがでます。
どのように解決したかを記載します。

###結論
homebrewにてopensslをインストールする

###原因
MacOSにてopensslで呼び出されるモジュールはopensslではなくLibreSSL
opensslのバージョンを確認することで確かめられる。

```
okanofumiaki@okano ~ % openssl version
LibreSSL 2.8.3
```

まじか・・・・・

###解決方法
opensslをインストールします。
ググればいろいろ出てきますが、


brewでopensslをインストール

```
brew install openssl
```

パスが通ってないのでbash_profileに書く

```
echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
```

bash_profileを読み込む

```
source ~/.bash_profile
```

opensslのバージョンを確認する

```
okanofumiaki@okano ~ % openssl version
OpenSSL 1.1.1d  10 Sep 2019
```

これでオッケー。


### 検索用キーワード
Mac
openssl
curl
client certificate
LibreSSL error
クライアント証明


#余談
あ…ありのまま 今　起こった事を話すぜ！

「おれはopensslを実行していたと思っていが、opensslじゃなかった・・・」

な…　何を言っているのか　わからねーと思うが　
おれも　何をされたのか　わからなかった… 
頭がどうにかなりそうだった…　催眠術だとか超スピードだとか
そんなチャチなもんじゃあ　断じてねえ
もっと恐ろしいものの片鱗を　味わったぜ…
WSL2にHaskell (Stack経由) を入れたときにハマったこと 

# はじめに
先日 Windows10 May 2020 update が来て、WSL2がようやく正式版になりましたね！
そこでWSL2にHaskellを入れてみようと思ったのですが、エラーが出たのでハマったので、解決方法を忘備録として載せます。

WSL2のインストール方法はQiitaを探せばいくらでもありそうなので、ここでは紹介しません。
また、WSLとVSCodeの連携は [こちらの記事](https://qiita.com/yamamasa1017/items/53ed140bac21c0fba1b4) に書いたので、ぜひ読んでください！

今回私は、WSL2のUbuntu 20.04 LTSを使いました。

# ハマったこと
`stack setup`コマンドを実行すると以下のようにエラーが出る

```:bash
$ stack setup
Preparing to install GHC (tinfo6) to an isolated location.
This will not interfere with any system-level installation.
Preparing to download ghc-tinfo6-8.4.4 ...
Download expectation failure: HttpExceptionRequest Request {
  host                 = "github.com"
  port                 = 443
  secure               = True
  requestHeaders       = [("User-Agent","The Haskell Stack")]
  path                 = "/commercialhaskell/ghc/releases/download/ghc-8.4.4-release/ghc-8.4.4-x86_64-fedora27-linux.tar.xz"
  queryString          = ""
  method               = "GET"
  proxy                = Nothing
  rawBody              = False
  redirectCount        = 10
  responseTimeout      = ResponseTimeoutDefault
  requestVersion       = HTTP/1.1
}
 ConnectionTimeout
Preparing to download ghc-tinfo6-8.4.4 ...
```

# 解決
https://github.com/commercialhaskell/stack/issues/5063 と
https://docs.microsoft.com/ja-jp/windows/wsl/troubleshooting
を参考にしました。
どうやら、DNS関連の問題らしいです。

## 手順
DNSサーバを一時的にGoogleのものに変更します。

まず、以下を実行

```:bash
sudo cp /etc/resolv.conf /etc/resolv.conf.new
sudo unlink /etc/resolv.conf
sudo mv /etc/resolv.conf.new /etc/resolv.conf
```

/etc/resolv.conf を開いて、内容を以下のように書き換える

```
nameserver 8.8.8.8
nameserver 8.8.4.4
```

この状態で`stack setup`を実行することで、無事インストールできます。
インストールが終わったら、以下のコマンドで元の設定に戻しましょう。

```
cd /etc
sudo mv resolv.conf resolv.conf.new
sudo ln -s ../run/resolvconf/resolv.conf resolv.conf
```

お疲れさまでした。

# 最後に
インストールするだけで結構面倒でしたね。
HIEをインストールする際にも同様の問題が起きるみたいです。

また、hackageからライブラリを取ってくる時も同じ問題が起こるので、日常的にWSL2で開発するのはしんどいかもしれません

WSL2が早く成熟してくれるといいなぁ
javascriptのonclickメソッドでうまく発火しなかった

javascriptのonclickメソッドで少し詰まったところがあるので、自分のメモとして残しておきます。

### 問題
javascriptでonclickメソッドを使おうとした際に、idではうまく発火するがclassだとうまく発火されなかった:frowning2:

### idでonclickメソッドを発火させる場合
``` javascript
document.getElementById('hoge').onclick = function() {
  console.log("クリック")
}
```
これは普通にIDの要素がクリックされたら発火します。

### classでonclickを発火させる場合（失敗）
``` javascript
document.getElementsByClassName('fuga').onclick = function() {
  console.log("クリック")
}
```
これでは発火されず、コンソール上にも何も表示されません。
classはidと違い一意でなく1ページ上に同じ名前のものを複数設定できるため、`getElementsByClassName`は`HTMLCollection`（配列型のオブジェクト）となって返ってきてしまうのです。
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName

## 解決策
### classでonclickを発火させる場合（成功）
``` javascript
document.getElementsByClassName('fuga')[0].onclick = function() {
  console.log("クリック")
}
```
そのため、`getElementsByClassName('fuga')[0]`とするように添字を設定する必要があります。

### まとめ
そもそも`getElementById`ではElementで単数形になっていて、`getElementsByClassName`ではElementsで複数形となっているのでよくみれば当たり前でしたね。

わざわざ記事にするほどの内容でもないですが、自分の備忘録として残しておきました。
GitHub 2回目以降のpush　ほんとに簡単にメモ書き


ほんとに簡単にメモ書き

```git:github
$ git init
$ git add .
```

ここでもしaddできなかった場合は、-uで変更したファイルをaddできる


```git:github
$ git add -u
$ git add 指定したファイル
```
新規作成したリポジトリ等は直接指定してaddすればできるはず。

```git:github
$ git commit -m ‘message’
$ git status

# On branch master
# Your branch is ahead of 'origin/master’ by 1 commit.
```
statusでコミットを確認できればpushでOK

```git:github
$ git push
```
Node.jsとMongoDBのAPIをHerokuにデプロイするまで

## はじめに。

私は今、Reactと、Nodeでwebアプリを作っています。EC2に環境立ち上げるのはクソだるい... ってことで今までRailsでしか使ってなかったHerokuを使うことに。

Reactは超簡単にデプロイできて奇跡だと思った。Nodeも考える時間含めて２時間くらいでデプロイできた。奇跡！！！

セールスフォースの株買って大切に大切に保持しておきたい。

## Node.jsとMongoDBのAPIをHerokuにデプロイ成功した絵

単純にルートで文字返してるだけ。

<img width="592" alt="スクリーンショット 2020-05-29 23.29.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/96fdfaa2-4143-16be-1d9e-aa486b5e8794.png">

## 一番最初はProcfileを作る

僕はローカルで、 

```
% node app/app.js
```

でアプロを起動させていたので、

```
% pwd
/Users/ryosuke-hujisawa/Desktop/アプリ

// ここにProcfile作った
% ls
README.md		app			node_modules		package-lock.json	package.json

```

```
$ touch Procfile

//これで動いた
web: node app/app.js
```

次、herokuアプリを作ろう

```
$ heroku create herokuアプリの名前

//これでリモート確認できるよ
$ git remote -v
```

## ProcfileをHerokuにまずはPushします。

```
$ git add . 
$ git commit -m "setting up to push to Heroku"
$ git push heroku master
```

## プロダクション Databaseを作ります。

```
$ heroku addons:create mongolab:sandbox
```

## DBの設定を書き換えよう

僕は元々こうなってたのを

```
module.exports = {
    'secret': 'oauthServerSampleSecret',
    'database': 'mongodb://localhost/server_oauth'
  }
  
```

こうした

```
module.exports = {
    'secret': 'oauthServerSampleSecret',
    'database': process.env.DEV_MONGODB_URI || process.env.MONGODB_URI
  }
```

`process.env.DEV_MONGODB_URI`. これは.envに書く。

で、`process.env.MONGODB_URI` はherokuで設定する。これですね↓

<img width="1272" alt="スクリーンショット 2020-05-29 23.37.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/df12fc1f-eb14-67f2-1559-1e08320d25e0.png">



## 次、dotenvをインストールしよう


```
run npm install dotenv 

もしくは

yarn add dotenv
```

で、dotenvを確実に、一番上に僕が読み込んだ。

```js
                                require('dotenv').config()
                                //dotenvの下にdbの設定書く
    var config                = require('./config'); //ここにdbの設定
    var express               = require('express');
    var app                   = express();
```

## で、Herokuにpushする

```
$ git push heroku master
```


## 終わり！

おめでとうございます。

```
$ heroku open 
```

これで、NodeJSのapiをHerokuで運用できるね。

## 参考

[How to deploy your Node.js / MongoDB app to the web, using Heroku](https://medium.com/make-school/how-to-deploy-your-node-js-mongodb-app-to-the-web-using-heroku-63d4bccf2675)


## 余談

途中でエディタ権限で保存できなくなってこのコマンド使った。

```
sudo chmod -R 777 プロジェクトディレクトリ
```
[JavaScript]入力フォーム漏れがあった時のアラート表示方法

#はじめに
RailsでECサイトを作成しています。
カートに商品を追加する時に、数量選択がなかった場合に以下のようなポップアップを表示させたいと思いました。今回はその備忘録です。
<img width="1440" alt="スクリーンショット 2020-05-29 23.12.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606031/d6e89fa1-9d39-c853-e951-b47d9897f201.png">

#補足情報
- Ruby 2.5.1
- Ruby on Rails 5.2.4.2

#フォームの内容

上記写真のページは以下のようなViewファイルになっています。

```ruby
.showMain
  .showMain__Boxes
    .showMain__Boxes__leftBox
      = image_tag @product.image, width: 450, height: 450, class: "showMain__Boxes__leftBox__image"
    .showMain__Boxes__rightBox
      = form_with url: add_item_carts_path, local: true, name: "formForCart" do |f|
        .showMain__Boxes__rightBox__name
          = @product.name
        .showMain__Boxes__rightBox__namejap
          = @product.namejap
        .showMain__Boxes__rightBox__description
          = @product.description
        .showMain__Boxes__rightBox__orderQuantity
          = f.label :quantity, "数量", class: "showMain__Boxes__rightBox__orderQuantity__title"
          = f.select :quantity, stock_array_maker(@stock), {include_blank: "選択してください"}, {class: "showMain__Boxes__rightBox__orderQuantity__form"}
        .showMain__Boxes__rightBox__line
          .showMain__Boxes__rightBox__line__price
            = "本体価格 : ¥#{convertToJPY(@product.price)}"
          .showMain__Boxes__rightBox__line__fav
            - if user_signed_in? && current_user
              - if @product.bookmark_by?(current_user)
                = link_to product_bookmark_path(@product.id), class: "showMain__Boxes__rightBox__line__fav__btn.fav", method: :delete, remote: true do
                  %i.fas.fa-star.star
              - else
                = link_to product_bookmarks_path(@product.id), class: "showMain__Boxes__rightBox__line__fav__btn.fav", method: :post, remote: true do
                  %i.far.fa-star.star-o (お気に入りに追加)
        .showMain__Boxes__rightBox__line
        .showMain__Boxes__rightBox__addCart
          = f.hidden_field :product_id, value: @product.id
          = f.hidden_field :cart_id, value: @cart.id
          = f.submit "Add to Cart", {class: "showMain__Boxes__rightBox__addCart__btn", id: "addToCart"}
```

#JSの記載方法

submitタグ、quantityのselectタグの2つのノードを取得しています。

```javascript
$(function(){
  $("#addToCart").on('click', function(e){
    if(document.getElementById('quantity').value === ""){
      alert("数量を選択してください。");
      return false;
    }else{
      return true;
    }
  })
});
```

フォームのsubmitボタンが押された時に発火するように設定をして、= f.select :quantity ~　のidのvalueがない場合にfalseを返し、アラートで警告します。
返り値がtrueならサブミットし、falseならサブミットしません。
因みに、"return false"がないと、ポップアップが出ますが、次のページに進んでしまいます。

#上記JSは以下の方法でもOK

```javascript
$(function(){
  $("#addToCart").on('click', function(e){
    if(!(document.getElementById('quantity').value)){
      alert("数量を選択してください。");
      return false;
    }else{
      return true;
    }
  })
});
```

#参考サイト
[JavaScriptでフォームの入力チェックをする方法](https://uxmilk.jp/11590)
[【JavaScript】 空文字のチェック方法【勉強中】](https://qiita.com/ikkitang/items/593be955b2bf2c513cfe)
localに特定のdocker imageが存在しないときや、requirements.txtが変更されているときにbuildするshell script

# コード

```sh
#!/bin/bash
if test -z "$(docker images -q my-image:my-version)" -o -n "$(git diff --exit-code requirements.txt)"; then
  docker build -t my-image:my-version -f docker/Dockerfile .
fi
```
ActiveModel::Serializers::JSONのfrom_jsonの使い方を３分で理解。

Railsの標準機能で、JSONをrubyオブジェクトへとシリアライズする。
Rails製APIでよく使われるのに情報が少ないのでメモ

## from_jsonとは？
from_json(json, include_root = include_root_in_json)
modelのattributesをJSON文字列からセットする。
selfをreturnする。

使用例

```ruby

class Person
  include ActiveModel::Serializers::JSON
  attr_accessor :name, :age, :awesome

  def attributes=(hash)
    hash.each do |key, value|
      send("#{key}=", value)
    end
  end

  def attributes
    instance_values
  end
end

json = { name: 'bob', age: 22, awesome: true }.to_json
person = Person.new
person.from_json(json)
person.name # bob
person.age # 22
```

もし与えられたJSON文字列が、root nodeを持っていた場合。
第二引数にtrueを渡すことで、root nodeを排除してシリアライズ可能

```ruby

json = { person: { name: 'bob', age: 22, awesome: true } }
person = Person.new
person.from_json(json, true)
person.name # bob
person.age # 22
```

参考
https://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html
量子ゲートの復習（Rxxゲート）

#はじめに
[Blueqat](https://blueqat.com/?hl=ja)のページで、Rxxゲートというものがあるらしいので見てみる。

#Rxxゲート
Blueqatのページのチュートリアル「012 イジングゲート」(2020/5/29時点)に説明がある。
「イジングゲートは、二量子ビットを同時に回転させるゲートです」とのこと。

#行列

```math
Rxx(\theta)= 
\left(\begin{matrix}
\cos(\frac{\theta}{2}) & 0 & 0 & -i\sin(\frac{\theta}{2})\\
0 & \cos(\frac{\theta}{2}) & -i\sin(\frac{\theta}{2}) & 0\\
0 & -i\sin(\frac{\theta}{2}) & \cos(\frac{\theta}{2}) & 0\\
-i\sin(\frac{\theta}{2}) & 0 & 0 & \cos(\frac{\theta}{2}) 
\end{matrix}\right)
```

##補足
2020/5/29時点でイジングゲートのページに書かれているRxxゲートの行列は、行列内の三角関数の角度が$\theta$になっているが、同ページのRxxゲートの行を実行してみると、三角関数の角度は$\frac{\theta}{2}$になっているようだ(Rxゲートと同じ)。

もし三角関数の角度が$\theta$ならば、$Rx(\frac{\pi}{2}) = \cos(\frac{\pi}{2})|00\rangle -i\sin(\frac{\pi}{2})|11\rangle = 0|00\rangle -i|11\rangle = -i|11\rangle$で、測定すると{'11': 100}になるはずだが、実行結果は{'00': 51, '11': 49}のように約半分ずつになる。
これは$Rx(\frac{\pi}{2}) = \cos(\frac{\pi}{4})|00\rangle -i\sin(\frac{\pi}{4})|11\rangle = \frac{1}{\sqrt{2}}|00\rangle -i\frac{1}{\sqrt{2}}|11\rangle$で計算するとつじつまが合う。

#わかったこと
- 対称行列である。ユニタリ行列である。エルミート行列ではない。
- 左上から右下へ$\cos(\theta)$、右上から左下へ$\-i\sin(\theta)$になっている。
- 2量子ビットのテンソル積からなる基底$\\\{|00\rangle, |01\rangle, |10\rangle, |11\rangle\\\}$に対する演算になる。
- 行列の対角にあるビットに$Rxx(\theta)$をかけると、そのビットを反転したビットとの重ね合わせになる。たとえば、1列目で見ると、$|00\rangle$⇒「$|00\rangle$と$|11\rangle$の重ね合わせ」になる。

#演算子
これでいいかな？

```math
\begin{align}
Rxx(\theta) 
& = \cos(\frac{\theta}{2})(I\otimes I) -i\sin(\frac{\theta}{2})(X\otimes X) \\
& = \cos(\frac{\theta}{2})\left(\left(\begin{matrix}1 & 0\\0 & 1\end{matrix}\right)\otimes\left(\begin{matrix}1 & 0\\0 & 1\end{matrix}\right)\right)
-i\sin(\frac{\theta}{2})\left(\left(\begin{matrix}0 & 1\\1 & 0\end{matrix}\right)\otimes\left(\begin{matrix}0 & 1\\1 & 0\end{matrix}\right)\right) \\
& = \cos(\frac{\theta}{2})\left(\begin{matrix}1 & 0 & 0 & 0\\0 & 1 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{matrix}\right)
-i\sin(\frac{\theta}{2})\left(\begin{matrix}0 & 0 & 0 & 1\\0 & 0 & 1 & 0\\0 & 1 & 0 & 0\\1 & 0 & 0 & 0\end{matrix}\right) \\
& = \left(\begin{matrix}
\cos(\frac{\theta}{2}) & 0 & 0 & -i\sin(\frac{\theta}{2})\\
0 & \cos(\frac{\theta}{2}) & -i\sin(\frac{\theta}{2}) & 0\\
0 & -i\sin(\frac{\theta}{2}) & \cos(\frac{\theta}{2}) & 0\\
-i\sin(\frac{\theta}{2}) & 0 & 0 & \cos(\frac{\theta}{2}) 
\end{matrix}\right)
\end{align}
```

よさそうだ。

##わかったこと
- 1番目の式はRxゲートの演算子の量子ビット部分が2量子ビットになったものと似ている。
- 演算子の式を見ると$I\otimes I$と$X\otimes X$の重ね合わせになることがわかる。2つのビットを両方ともXゲートをかけた状態との重ね合わせにするから「R"xx"」ゲートって言うのか。
- 説明にあった通り、2量子ビットがセットで同じ角度で回転する。
- 2量子ビット基底のうち、元の2量子ビットと反転した2量子ビットだけの重ね合わせになり、いわゆる「もつれ」状態にすることができる。

#最後に
動きはわかったけど、Rxxというゲートだけを見て、もつれができることがすぐに結びつかない。
慣れるしかないのか。
vuex-module-decoratorでstateをundefinedにすると変更が検知されない

# 前提
- Nuxt
- vuex-module-decorator
- typescript 

Vue側はVue.extendで実装
vuex-module-decoratorはtypescriptでvuexを書くことができるライブラリ

# ダメな例
```ts
// ~/store/message.ts
@Module({
  stateFactory: true,
  name: 'message',
  namespaced: true
})
export default class Message extends VuexModule {
  message?: Message
}
```

```ts
// ~/store/index.ts
import { Store } from 'vuex'
import { initializeStores } from '~/utils/store-accessor'
const initializer = (store: Store<any>) => initializeStores(store)
export const plugins = [initializer]
export * from '~/utils/store-accessor'
```

```ts
// ~/util/store-accessor.ts
import { Store } from 'vuex'
import { getModule } from 'vuex-module-decorators'
import Message from '~/store/message'

// eslint-disable-next-line import/no-mutable-exports
let messageStore: Message

function initializeStores(store: Store<any>): void {
  messageStore = getModule(Message, store)
}

export {
  messageStore,  
}
```

```vue
<script lang="ts">
import Vue from 'vue'
import { messageStore } from '~/utils/store-accessor'

export default Vue.extend({
  computed: {
    user() {
      return messageStore.user // 変更されてもcomputedの値は変わらない
    }
  }
})
</script>
```

# 解決策
undefinedにしてしまうと、初期状態の際には、propertyが存在しないという状態になってしまうため、
nullableに変更して対応

```ts
// ~/store/message.ts
@Module({
  stateFactory: true,
  name: 'message',
  namespaced: true
})
export default class Message extends VuexModule {
  message: Message | null = null
}
```