OmniAICreator/Qiita-1.07M huggingface dataset:
さくら前線を可視化してみる

##さくら前線を可視化してみる
さくらの季節になり仕事も少し落ち着いたので、土日を利用して、<a href="https://www.data.jma.go.jp/sakura/data/" target="_blank">気象庁生物季節観測</a>の公開データからさくら前線の可視化をしてみました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/55735/c81ef71d-57b2-8efc-591e-cb9895af858a.jpeg" width="480px" />
<img src="https://qiita-image-store.s3.amazonaws.com/0/55735/fca17c04-5edf-e93f-a5ed-d00ee0c7f801.jpeg" width="480px" />

##気象庁生物季節観測とは
気象庁では、毎年、さくらの開花日や満開日やかえでの紅葉日、つばめの初見日など、季節を代表する生物の動向が観察されています。近年は地球温暖化の影響か、さくらの開花日等が早まっているという話もありますが、生物の生活史の変化を観察することで気候変動等を観測するもの理解しています。
##作った理由
別途、<a href="https://www.termat.net/plan" target="_blank">地球温暖化対策を計画してみよう</a>というサイトを作っているのですが、地球温暖化や生物多様性に関心があり、気候変動が生物の生活史にどんな影響を与えているか、ちょっと可視化してみたくなりました。。
##作成方針
**1.ライブラリ等**
当初、<a href="http://processingjs.org/" target="_blank">processing.js</a>か<a href="https://p5js.org/" target="_blank">p5.js</a>で作りたかったのですが、地理情報処理（座標変換）関係で挫けたので、結局<a href="https://openlayers.org/" target="_blank">OpenLayers</a>で作成しました。サーバーサイドは<a href="http://sparkjava.com/" target="_blank">Spark Framework</a>を使用しました。
**2.可視化手法**
生物季節の観測値は日付データなので、毎年1月1日を起算日とする経過日数データとし、その等高線でさくらの開花・満開の前線を描画しました。等高線描画手法は、観測地点を節点とする非構造格子をデローニ分割で生成し、各三角要素を検査して描画するアルゴリズムとしました。なお、デローニ分割については数年前に一度投稿した<a href="https://github.com/termat/PhenologicalMap/blob/master/src/main/resources/public/js/delaunay.js" target="_blank">delaunay.js</a>を書き直して使用しました。
##成果物
作成したものは、Githubにリポジトリを登録し、Herokuにデプロイしました。
■生物季節可視化サイト：<a href="https://phenologicalmapjp.herokuapp.com/" target="_blank">https://phenologicalmapjp.herokuapp.com/</a>
■Githubリポジトリ：<a href="https://github.com/termat/PhenologicalMap" target="_blank">https://github.com/termat/PhenologicalMap</a>
■動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">さくらの季節になったので、土日にさくら前線の可視化サイトを作ってみました。気候変動の影響か、さくらの満開時期が少し早まっている感じがします。<a href="https://twitter.com/hashtag/%E5%8F%AF%E8%A6%96%E5%8C%96?src=hash&amp;ref_src=twsrc%5Etfw">#可視化</a> <a href="https://twitter.com/hashtag/%E3%81%95%E3%81%8F%E3%82%89?src=hash&amp;ref_src=twsrc%5Etfw">#さくら</a> <a href="https://t.co/0ES4MxLxiY">pic.twitter.com/0ES4MxLxiY</a></p>&mdash; t_mat (@t_mat) <a href="https://twitter.com/t_mat/status/1109816689980395527?ref_src=twsrc%5Etfw">March 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

経年比較データをみると、やはり最近、開花日、満開日が早まっている様子が見て取れます。

##雑感
等高線データはGeoJSON形式で生成し、Openlayersに読み込ませています。その関係で可視化としてはイマイチな感じになってしまった。
ROCMConfig.cmakeがないと言われたときの対処法


# ROCMConfig.cmakeがないと言われた

https://github.com/ROCmSoftwarePlatform/rccl　
↑をビルドするときに少し困ったので対処法を記録しておきます

```
CMake Error at CMakeLists.txt:33 (find_package):
  Could not find a package configuration file provided by "ROCM" with any of
  the following names:

    ROCMConfig.cmake
    rocm-config.cmake

  Add the installation prefix of "ROCM" to CMAKE_PREFIX_PATH or set
  "ROCM_DIR" to a directory containing one of the above files.  If "ROCM"
  provides a separate development package or SDK, be sure it has been
  installed.
```


aptからrocm cmakeは入れることができるので

```
$ apt install rocm-cmake
```
以上の方法で対処可能です


#出典
https://github.com/ROCmSoftwarePlatform/rccl/issues/7
GCP入門（AWSとの比較）

Google Cloud Platformのハンズオンセミナーに行って参りました。

今まで、AWS（Amazon）を使ってきた私ですが、そろそろ他のクラウドサービスも触っておこうかなと思い、GCP（Google）について勉強してきました。

主にAWSとの差異について書きたいと思います。

# GCPの特徴

■特徴１：
　Googleネットワーク

地球上で最大規模のネットワーク回線を所有している。
ファイバー網と海底ケーブル8本。

※Googleネットワークは、中国からのアクセスをブロックしている。
Googleのサービスを利用してグローバルなサイトを作りたければ、AmazonやMicroSoftのネットワークに一旦迎え入れて、そこからGoogleのサービスにつなぐことで一応利用可能である。（中国からアクセスできるかのテストは、中国のプロキシサーバを通してWeb閲覧してみれば良い。）

リージョン（地域）によって使用できるサービスの一覧
https://cloud.google.com/about/locations/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/283248/c7ee4049-d49d-d4b4-5d5b-ab9f33a93376.png)

■特徴２：
　クラウドサービスのために作ったサービスではない。

自社のインフラを他人が利用可能な状態にしただけ。
Google内と同じような開発環境を世界に公開した。というポリシー。

※そのため、ユーザーインタフェース画面の便利さ・分かりやすさは、AWSよりも見劣りする。と思う。公式マニュアルもCLIコマンド基準の記載が多いようです。

 
# まずは全体にかかわること

■リソースは階層構造で管理する

”リソース”（ストレージサービスやコンピューティングサービス）は、”プロジェクト”という単位にまとめる。そして、複数の”プロジェクト”を”フォルダ”にまとめる。
サンプルでは、フォルダ名はチーム名や製品名だった。つまり”プロジェクト”とは、プログラムの単位みたいなものである。（うーん、日本の現場とは逆のネーミングセンスだ・・・プログラミングファーストなセンスとでも呼ぼうか）
https://cloudplatform-jp.googleblog.com/2017/06/mapping-your-organization-with-the-Google-Cloud-Platform--resource-hierarchy.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/283248/4c3650d2-b788-32b4-39ee-543a8947dfec.png)
 

リソースは階層構造で管理する
リソースは階層構造で管理する

■権限は和集合の法則

アクセスポリシー、つまり個人やリソースに付与する権限は和集合の法則となる。
緩い方（権限が強い・多い）方が適用される。
そのため、”Deny（禁止）”という設定は存在しない。
現場では、”権限を作成する権限”は管理担当者のみとするのが吉。

適用できる種類
・Googleアカウント
・サービスアカウント
・Googleグループ
・GSuite
・IAM


■ネットワーク
VPCは複数のリージョンをまたがって作成可能。
ロードバランサーは複数のリージョンにまたがることができる。

サブネットも複数のゾーン（AZ）にまたがる。
つまり、１つのサブネットでも冗長化構成が実装できる。

VPCネットワーク内は、内部（プライベート）IPv4 アドレスを使用して相互に通信できる。ファイアウォール ルールで制御する。
https://cloud.google.com/vpc/docs/vpc?hl=ja

# コンピューティングサービス（APPサーバ）
■用語
サーバレス　サーバの管理をしなくて済む。プログラムだけ乗せるようなイメージ。

■Conmute Engine
ベーシックな仮想サーバ。

■APP engineスタンダード環境
PAASサービス。
スケーラブルでフルマネージドでサーバレスなプラットフォーム。
サンドボックス制約
・ローカルへの書き込み
・60秒以内
・サードパーティーソフト基本使わない

■APP engineフレキシブル環境
サンドボックス制約がなくなる。
SSH接続とディスク書き込みが可能になる。

■CloudFunctions
イベント駆動型。
ごく単純なプログラムを動かす。


# ストレージサービス（DBサーバ）

■用語
垂直スケーリング　CPU強化
水平スケーリング　サーバーを複数台に

■CloudSQL　フツーのRDBMS。
■CloudSpanner　水平スケーリングが得意なRDBMS。
■CloudDatastore　ACIDトランザクションのついたNoSQL。RESTfulでもアクセスできる。
■Bigtable　大容量向けペタバイト以上のNoSQL


# おすすめサービス

■API Exploer
・GoogleのAPIをお試し利用できる。

■MarketPlace（CloudLauncher）
・ボタン一発でインスタンスを作成。

■Cloud Endpoints
RESTful　APIキーでアクセスできるようになる。
これがないと、認証認可の仕組みとSSL終端処理を
APP engineやK8SEngineでやらなくちゃいけないので、基本これを手前に置く。

■ApigeeEdge
こっちもCloud Endpointsと同等だが、GCP公式がおすすめするくらい
一般公開時の収益化やアナリティクス機能が充実している。

■SourceRepositories
Githubとミラーリングできる
Push時に連携してCloudBuildもできる。

■DeploymentManager
インフラをコード化して管理することができる。
.yaml

■Stackdriver
モニタリング
ロギング
エラー通知
デバッグ
トレース　AWS X-rayみたいなレイテンシ調査ができる
MacのXQuartzからのsshでのXリモートログインでのアプリ起動



何度やってもMacからXQuartz経由でのアプリ起動ができなかったのでメモ

```
ssh -X hoge@[ubuntuのIP]
```

接続先サーバーで以下の設定を入れておく

```
hoge@remote-xserver-ubuntu:~$ sudo cat /etc/ssh/sshd_config | grep X11
X11Forwarding yes
X11Uselocalhost no ←これを追加する
X11DisplayOffset 10
```

そうするとこのようになる↓上記を追加しないと環境変数が出てこない

```
hoge@remote-xserver-ubuntu:~$ env | grep DIS
DISPLAY=remote-xserver-ubuntu:10.0
```

これでリモートのアプリケーションが起動できる

参考
https://rougeref.hatenablog.com/entry/20170419/1492562281
[Flutter] AnimatedCrossFade 試す。

参考：https://docs.flutter.io/flutter/widgets/AnimatedCrossFade-class.html


#例。

実際に作ってみた。

```dart:main.dart
AnimatedCrossFade(
              firstChild: Text(
                desc,
                maxLines: 2,
                style: TextStyle(
                    color: Colors.white,
                    fontSize: screenAwareSize(10, context),
                    fontFamily: 'Montserrat'),
              ),
              secondChild: Text(
                desc,
                style: TextStyle(
                    color: Colors.white,
                    fontSize: screenAwareSize(10, context),
                    fontFamily: 'Montserrat'),
              ),
              crossFadeState: isExpanded
                  ? CrossFadeState.showSecond
                  : CrossFadeState.showFirst,
              duration: kThemeAnimationDuration,
            ),
          ),

```


```dart:main.dart
GestureDetector(
              onTap: _expand,
              child: Text(
                isExpanded ? "less" : "More...",
                style:
                    TextStyle(color: Colors.white, fontWeight: FontWeight.w700),
              ),
            ),


```

MoreをタッチするとAnimatedCrossFade中のsecondChildがみえます。
hyperledger-fabricにブロックチェーンを学ぶ（2/9）サンプルを動かす

　 [hyperledger-fabricにブロックチェーンを学ぶ（1/9）ブロックチェーンとは](https://qiita.com/ctrlzr/items/25210ded25af808aa6d2)
⇒ hyperledger-fabricにブロックチェーンを学ぶ（2/9）サンプルを動かす
　 [hyperledger-fabricにブロックチェーンを学ぶ（3/9）ブロックを見る](https://qiita.com/ctrlzr/items/487e4055151aab9a5591)
　 [hyperledger-fabricにブロックチェーンを学ぶ（4/9）kafkaを入れる](https://qiita.com/ctrlzr/items/d8d50d909a9a75cbf5b6)
　 hyperledger-fabricにブロックチェーンを学ぶ（5/9）可視化する


#### 環境構築

- 用意するもの

 - CentOS7 メモリ4GB以上 ※コメント参照

- ブロックチェーンネットワーク環境

 - fabric-sdk：1.4
 - チェーンコード：golang
 - クライアント：node.js

- ブロックチェーンネットワーク構成
（fabric-sample/balance-transfer）
 - 1組織2Peer
 - 2組織
 - orderer1つ
 - kafkaなし

ブロックチェーンネットワーク構成を図で表すと以下のとおり
ordererはトランザクションを順番に処理するためのもの。
単一障害点となるので冗長化したほうがよい（対応方法調査中．．．）

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36333031382f62646561613035622d646661382d343231612d323331302d6332643830333234333331622e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/63018/3617cc54-33cc-9485-d6fa-e463a24ee708.png)



#### インストール手順

- インストールするもの
 - git
 - jq
 - docker
 - node
 - golang
 - fabric-sample (git clone)

```ruby:gitのインストール 
sudo yum install -y git
```
```ruby:jqのインストール 
sudo yum install -y jq
```

```ruby:dockerのインストール 
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce
```

nodeはpackage.jsonで指定されているバージョンを入れる。たぶん最新でも動く。

```ruby:nodeのインストール 
curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum install -y nodejs-8.9.4 # node8.9, npm 5.6
```

```ruby:golangのインストール 
sudo yum install -y golang
```

```ruby:fabric-sampleのclone 
mkdir -p /var/www
cd /var/www/
git clone https://github.com/hyperledger/fabric-samples.git
```

#### 実行手順

- 事前準備
 - dockerの起動
 - node clientの起動
 - channelの作成
 - channelに参加
 - chaincodeのインストール
 - channelの初期化

- 実行
 - チェーンコード実行
 - ブロック取得
 - channel情報取得  
 

事前準備から実行は、シェル2つで完了

```ruby:事前準備から実行まで
cd /var/www/fabric-samples/balance-transfer
./runApp.sh
./testAPIs.sh
```

[実行結果](https://qiita.com/ctrlzr/items/27da8c4a8ac4bde0f43a)

-------

マシンパワーを必要とするため、すんなり動かない事があると思います。
fabricSDKの呼び出しはいくつか直していきますが、今回はchannelの初期化に手を入れます。
channelの初期化(instantiate)呼び出しは、instantiate-chaincode.js で行われます。

**instantiate-chaincode.js の timeout を 60秒から180秒へ変更（2カ所）**

`let results = await channel.sendInstantiateProposal(request, 60000); //instantiate takes much longer`
↓
`let results = await channel.sendInstantiateProposal(request, 180000); //instantiate takes much longer`

`}, 60000);`
↓
`}, 180000);`

node clientの起動時にnpm installが実行されます。このときgccエラーが出ることがあるので、以下を参考にしてください。
[Failed install script 'node-gyp rebuild'
](https://jira.hyperledger.org/browse/FABN-301)

`npm install -g node-gyp`
`npm config set python /usr/bin/python`
`yum install gcc-c++`
Instagram-Crawlerを使ってみた

インスタグラムで複数タグ検索ができたら便利だなぁと思い、まずはクローラーを探すところから。

https://github.com/huaying/instagram-crawler

#下準備
##chromedriverをダウンロード。
https://sites.google.com/a/chromium.org/chromedriver/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/6c5754e1-544e-0563-74db-be412af4be9a.png)
バージョンはインストールされているChromeブラウザと合わせること。
inscrawler/bin/に設置。
##pip

```
pip install -r requirements.txt
```

##パスワードの設定

```
cp inscrawler/secret.py.dist inscrawler/secret.py
```
secret.pyにインスタのユーザー名とパスワードを入力します。

#実行

```
Z:\workdir\instagram-crawler>python crawler.py hashtag -t tokyo -n 10 -o ./output

DevTools listening on ws://127.0.0.1:63614/devtools/browser/436e50fa-07b0-4b55-aca3-e6af1124cf66
fetching: : 33it [00:01, 21.54it/s]
Done. Fetched 10 posts.
Z:\workdir\instagram-crawler>
```

hashtag モードだとkey,caption,img_url が取得できるようです

https://jsoneditoronline.org
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/4ff36f73-1b55-1e8d-2dbe-45b8cea1bcc4.png)

profile はプロフが取得できるようです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245977/f4feeb47-68b2-5266-bc0d-d1c07fb8be0c.png)


なんかもっと遊びたいですねー。


#Ref
https://github.com/futurice/secret
https://stackoverflow.com/questions/55201226/session-not-created-this-version-of-chromedriver-only-supports-chrome-version-7
CloudFrontについてまとめてみた

# CloudFront
動画のような「いつ/誰がアクセスしてもコンテンツが変わらない」静的コンテンツであればCloudFrontを利用してレイテンシーを小さくすることができます。  
CloudFrontはCDNサービスで全世界に50カ所以上存在するエッジロケーションにコンテンツをキャッシュし、
コンテンツにアクセスするエンドユーザは地理的に近いエッジロケーションからコンテンツをダウンロードすることで高速なダウンロードが可能になります。  
CloudFrontはアクセス回数とデータ転送量による従量課金制であり、長期契約や最低利用料金は必要ありません。  

## セキュリテイ・アクセス制限  
CloudFrontを利用したコンテンツ配信においても、CloudFrontのSSL証明書を利用した暗号化通信が可能です。  
またS3に格納しているコンテンツについてCloudFront経由でアクセスさせる際にも署名付きURLによる配信が可能です。  
署名付きURLはS3に格納しているオブジェクトの署名付きURLを生成するのではなく、CloudFront用のキーペアを使って署名付きURLを生成し、そのURLにアクセスさせます。  
CloudFront用の署名付きURLを利用してアクセス制限をする際、S3に格納しているオブジェクトをエンドユーザに直接アクセスさせるのではなく、
CloudFront経由に限ってアクセスさせるようにバケットポリシーを設定します。  
バケットポリシーでCloudFrontからのアクセスだけを許可するにはCloudFrontユーザを意味する Original Access Identify(OAI) を作成し、
OAIからのアクセスだけを許可します。
Route53についてまとめてみた

# Route53
Route53はマネージド型のDNSサービスで、DNSサービスが53番ポートを利用することからその名前が付けられています。  
Route53を利用してゾーン/ドメイン情報を登録すると、4カ所のエッジロケーションのDNSサーバにゾーン/ドメイン情報が格納されます。  
※エッジロケーションはリージョンやAZ以外のデータセンタのこと(世界に50カ所以上)  
管理ドメインに対して問い合わせが発生すれば、その4カ所のうち、クエリを行ったエンドユーザに最も近いDNSサーバが応答します。  
利用料金に関しては、管理しているホストゾーンの数とクエリ回数などの従量課金制になっており、定額で利用することができます。  
Route53では次のレコードタイプをサポートします。  

- A
- AAAA(IPv6)
- CNAME
- MX
- NS
- PTR
- SOA
- SPF
- SRV
- TXT
- ALIAS(AWS独自レコード)

ALIASレコードはCNAMEレコードでは対応できないZone Apexの名前解決をサポートします。  
※DNSの仕様としてある名前でCNAMEレコードを定義した場合、その名前を別のレコードで名前解決することはできない  

## 設定
1. 加重ラウンドロビン  
各レコードに重み付けをし、ある名前に対するクエリに指定された比率で異なる値を応答することができる。  

1. レイテンシーベースルーティング  
全世界展開しているようなサービスを複数リージョンで提供している場合、レイテンシーベースルーティングを指定することでクライアントへのレイテンシを小さくすることができる。  
クライアントがある名前のELBにアクセスした際、レイテンシーが小さくなるようなリージョンのELBのDNS名が返却されます。  

1. 位置情報ルーティング  
クライアントのIPアドレスを元に地理データベースでクライアントの接続元地域を特定し、地理的に近いレコードの値を返却します。  
また位置情報ルーティングを利用して、特定のコンテンツを特定の地域だけに配信することもできます。  

1. ヘルスチェックとフェイルオーバー  
Route53にはヘルスチェック機能が存在します。  
名前解決しているWebサーバなどが正常に動作しなくなった場合、そのWebサーバに対するクエリが発生しても、WebサーバのIPアドレス/名前を返さなくなります。  
この時、事前にフェイルオーバー先の設定をしていれば、そのフェイルオーバー先のIPアドレス/名前を返します。
setIntervalより正確な時計を作る

`setInterval`は手軽ですが、それが故に正確な時間を必要とする場合には、あまり役に立たなくなります。

## 手軽に時計を作ってみる

`setInterval(関数, 1000);`のように書けば、`関数`を1秒毎に実行することとなります。ここで描画処理を入れれば、秒単位で表示する時計の一丁上がりです。

…が、このままではうまくいかない箇所があります。

* スタートのタイミングの問題…`setInterval`をスタートする瞬間がちょうど秒の変わる瞬間だったという幸運なパターンもありえますが、最悪の場合1秒近く遅れることとなります。
* 1秒より間隔が長くなる…`setInterval`の時間は、「前の実行が**終わってから**次の実行が始まるまでに、最低限確保される待ち時間」ですので、実行同士の間隔は関数自体の実行時間が足し込まれて、必ずセットした時間を上回ることになります。また、他のコードの実行で遅れることもありえますし、ブラウザ側で意図的に（消費電力節約のためなどで）それ以上待たせてもいいことになっています（[W3C HTML 5.2](https://www.w3.org/TR/html5/webappapis.html#timers)）。
 * 上の2つが重なれば、「遅れがそこまででもないのに秒が飛ぶ」ことも考えられます。1回めを0.999秒で実行開始したとして、タイマーが2ミリ秒余分にかかれば、次の実行は2.001秒となって、1秒台の実行がなくなってしまいます[^1]。

このような事情がありますので、「できるだけ安定したサイクルを保ちたい」あるいは「秒が変わった瞬間に実行したい」という場合、`setInterval`はあまり適当な選択肢ではありません。

## `setTimeout`を使う

では、代わりに`setTimeout`を使ってみましょう。`setTimeout`でループ処理をさせるときの基本形は、以下のような形です。タイマーで呼ばれた関数から、さらに同じ関数を`setTimeout`する、という流れです。

```javascript
setTimeout(function main(){
  // メインの処理

  setTimeout(main, 時間);
}, 時間);
```

あとは`時間`をどう設定するかだけですが、`Date.now()`で現在のミリ秒が得られます。「ちょうど秒が変わる瞬間」はシリアル値が1000で割り切れますので、`1000 - Date.now() % 1000`のようにすれば、そこまでの待ち時間を導けます。

毎回待ち時間を正しく設定することで、秒の変わり目にできるだけ近いところでコンスタントに関数を実行できますし、処理の遅延が1秒以上にならない限り、秒が飛ぶことも起きません。

## Codepen上に作ってみました

リロードなどでタイミングを調節すれば、`setInterval`のほうが遅れている様子もわかるかと思います。

（なぜかReactで作ってしまったので、ちょっと見づらいかもしれません）

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="jkr2255" data-slug-hash="pYGKgR" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="pYGKgR">
  <span>See the Pen <a href="https://codepen.io/jkr2255/pen/pYGKgR/">
  pYGKgR</a> by Jkr2255 (<a href="https://codepen.io/jkr2255">@jkr2255</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

[^1]: もちろん、ブラウザ処理の重さなどで、実行が遅れうることは予め想定して実装が必要なのは間違いないです。
Emacs で過去のカーソル位置を記憶・閲覧・選択・移動する

過去に訪れた箇所にカーソルを戻したいってとき、ありますよね。
[point-undo.el](https://www.emacswiki.org/emacs/point-undo.el) などの便利 package もありますが、同じ buffer の中を飛び回ったり、色々な buffer を移動したりすると、戻りたい箇所を見失う時も多々あります。

そのため、過去に訪れた箇所の一覧をリストとして表示して、そこから戻りたい箇所を選択できる package を作りました。
本体は [GitHub/point-history](https://github.com/blue0513/point-history) に置いておきます（PR や issue 待ってます！）

追記: 2019/04/21更新

## これは何？

カーソルが一定時間留まった位置を、履歴として保存しておきます。
その履歴から一つ選択することで、再度その箇所（buffer, position）にカーソルを移動させることができます。
また、履歴を別ウィンドウでプレビューできます。 <== NEW!
[![point-history](https://i.gyazo.com/68ef30d465487356e02b30790c49a8d4.gif)](https://gyazo.com/68ef30d465487356e02b30790c49a8d4)

## 特徴

+ ある一定時間カーソルが留まった箇所（point-info）を、履歴として保存しておきます
+ point-info はバッファ名、カーソル位置、その行の文字列等を保持しています
+ point-info の履歴を一覧として表示し、そのうち一つを選択することで、その箇所にジャンプできます
+ カーソル行の履歴を、別ウィンドウでプレビューできます <== NEW!

## 設定

### 事前準備

[popwin-el](https://github.com/m2ym/popwin-el) を使っているため、事前に `popwin-el` をインストールする必要があります。

### 本設定

`git clone` して init.el を以下のように編集するだけです。

```elisp
(add-to-list 'load-path "YOUR PATH")
(require 'point-history)

;; enable minor mode
(point-history-mode t)

;; お好みで
(global-set-key (kbd "YOUR KEY") 'point-history-show)
```

## 使い方

`M-x point-history-show` を実行することで履歴一覧の buffer が開きます。
ジャンプしたい箇所を選択して Enter を入力すると、ジャンプできます。

<img width="655" alt="Screen Shot 2019-03-24 at 13.45.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/1cfbe695-d6de-f12f-aaab-2c01f030f915.png">

`point-history-show-buffer` での keymap をお好みで変更することも可能です。 <== NEW!

```elisp
(define-key point-history-show-mode-map (kbd "n") 'point-history-next-line)
(define-key point-history-show-mode-map (kbd "p") 'point-history-prev-line)
```

## カスタマイズ

いくつかカスタム可能な変数を用意しています。
（point-history-should-preview を追加しました） <== NEW!

|variable|usage|default value|
|:---:|:---:|:---:|
|point-history-max-item-num|Max number of points saved in history|100|
|point-history-show-buffer-height|Buffer height to show point-history|30|
|point-history-save-timer|Interval time to save point in history|1|
|point-history-should-preview|show the preview of buffers|t|

## その他

`point-history-ignore-buffer` や `point-history-ignore-major-mode` を以下のように設定することで、特定の buffer や major-mode での point を履歴に保存することを禁止できます。 <== NEW!

```elisp
(setq point-history-ignore-buffer "^ \\*Minibuf\\|^ \\*point-history-show*")
(setq point-history-ignore-major-mode '(emacs-lisp-mode ruby-mode))
```

## 参考

この package は [point-undo.el](https://www.emacswiki.org/emacs/point-undo.el) と [「Qiita/前回１秒以上立ち止まった場所にジャンプするコマンド」](https://qiita.com/zk_phi/items/c145b7bd8077b8a0f537) を大いに参考にして作らせていただきました。ありがとうございました。
Apache + Flask 環境の Dcokerfile を作成する

## この文章の前提 ##
  * Apache、Flask、Dockerが何かということの説明は割愛する
  * Dockerはホストマシンにインストール済みのものとして記載する

## 目的 ##
Apache+Flask環境を他のマシンでも再現できるようにする

## 用語 ##
  * mod_wsgi  
  Apacheでpythonプログラムを動かすためのモジュール

## 環境 ##
|対象|バージョン|
|:---|:---|
|OS|macOS Mojave (10.14.3)|
|Docker|18.09.0|

## 資材 ##
[Githubに置いています](https://github.com/harugthb/docker_apache-flask)

## 起動方法 ##
  * ビルド

```bash
$ docker-compose build 
```
  * 起動
 
  ``` bash
  $ docker-compose up -d
  ```
  * 確認
 
  ```bash
  $ curl http://localhost:8080/
  Hello, Flask!
  ```
## 構成 - コンテナ構築関連（ホスト側） ##

``` bash
.
├── Dockerfile
├── README.md
├── docker-compose.yml
└── src
    ├── adapter.wsgi
    ├── flask.conf
    └── run.py
```

## 構成 - アプリケーション関連（コンテナ側） ##
* mod_wsgiの設定ファイル

``` bash	
/
└── etc/
   └── httpd/
      └── conf.d/
         └── flask.conf★
```

* アプリケーションディレクトリ

``` bash
/
└── var/
   └── www/
      └── projects/
         └── test/
            ├── adapter.wsgi★
            └── application/
               └── run.py★
```


## 構築概要（Dockerfile概要） ##
1. imageのダウンロード
CentOS7をダウンロード

1. 変数の設定
アプリケーションディレクトリ等の名前を設定

1. 必要なパッケージのインストール
  * 依存ライブラリ等
  * Apache関連
  * python3関連（リポジトリ登録の上、yumでインストール）
  * pythonモジュール
      * mod_wsgi（上記python3を起動するためyumではなくpipでインストール）
      * Flask
1. 資材の配備
[[構成 - アプリケーション関連（コンテナ側）](#構成 - アプリケーション関連（コンテナ側）) ] 通りにディレクトリを作成、資材をコピー

1. サービスの起動
httpdサービスの自動起動をON
起動時のコマンドを設定

1. Listen Portを設定
コンテナ内のListen Portを設定


## 参考URL ##
[PythonのFlaskを初めて触ってから３０分で本番環境にデプロイ+ HTTPS通信まで完成](https://qiita.com/yoshizaki_kkgk/items/3cd785b4a670deec0685)
[CentOS7にPython3をインストール](https://qiita.com/estaro/items/5a9e4eb8f0902b9977e3)
memo: inkscape download時のエラー

Post on 20190324:
環境: 
High Sierra

エラーのトリガーコマンド:
brew install caskformula/caskformula/inkscape

エラー:
Error: Cannot tap caskformula/caskformula: invalid syntax in tap! 

Solution:
brew tap caskroom/cask
brew cask install xquartz
brew cask install inkscape

Source: 
https://github.com/caskformula/homebrew-caskformula/issues/46
pandasにfloat,int,bool型が混在するとnumpy変換時にobject型になる件

# はじめに
数値しか格納されていないと思っていたpandasのDataFrameをnumpy化して再度pandasに取り込んだところ数値型でなくなっていたため、困惑して調べたときのメモ

# 現象
まず、floatとint型の混在の場合

```python
import pandas as pd
df = pd.DataFrame([[1,2,3],[1,2.0,4]], columns=["0","1","2"])
hoge = df.values
hoge.dtype
```

結果
>dtype('float64')

numpyでは型は一種類になってしまうが、表現力の高いfloat型に変換されている。
直観通りの動作である。

次にfloatとintとboolの場合

```python
df = pd.DataFrame([[1,2.2,True],[1,2.3, False]], columns=["0","1","2"])
hoge = df.values
hoge.dtype
```

結果
>dtype('O')

object型に変換された。
Pythonではbool型はint型のサブクラスではあるため、直観的にはTrue=>1.0, False=>0.0 のように変換され、結果としてfloat型になりそうな気がするが、そうならなかった。
こういった細かいところで意外にハマることが多いため、メモした次第である。
Rust で examples から main.rs 読みに行くの分からんぽっぽ☆（＾ｑ＾）

Windows 10 で、

```Shell
cargo run --release
```

と打鍵すると　リリースモードで .exe が作られる。

```Shell
cargo run
```

だと デバッグモードで .exe が作られる。
そのほかに、

```Plain
+-- poppo
    |
    +-- examples
    |   |
    |   +-- miracle-punch.rs
    |
    +-- src
        |
        +-- main.rs
```

というディレクトリ構成にすると、

```Shell
cargo run --example miracle-punch
```

と打鍵することで miracle-punch.rs の方の 'fn main()' が実行される。
このとき、 'main.rs' の方は見えなくなる。
'main.rs' を見たければ、ファイル名を 'lib.rs' に変える。つまり ライブラリ扱いにする。

```Plain
+-- poppo
    |
    +-- examples
    |   |
    |   +-- miracle-punch.rs
    |
    +-- src
        |
        +-- lib.rs
```

これで、

```rust:miracle-punch.rs
extern crate poppo;
```

ライブラリを読みに行ける。この 'poppo' は、

```toml:Cargo.toml
[package]
name = "poppo"
version = "0.1.0"
authors = ["ぽっぽ <poppo@example.com>"]

[dependencies]
```

Cargo.toml の name に設定したもの。

しかし `lib.rs` に名前を変えたせいで　このプロジェクトは実行できない。ライブラリになってしまった。
エントリーポイントがあるだけの　プロジェクトを別に作れだぜ。

## えっ？

どうやって 自作のライブラリを読み込むかだって☆（＾～＾）！？

```
[dependencies]
poppo = { git = "https://example.com/poppo-man/poppo" }
```

といった感じで git の URL を指定すればいいのかと思うが、

```
    Blocking waiting for file lock on the git checkouts
```

といったメッセージが出て　うまくいかなかった。どうもキャッシュが残ってるらしい。

```
C:\Users\example-man\.cargo\registry\index
```

ディレクトリの下にロックが残ってそうだが消していいのかどうか。
消してみたが変わらん。

キャッシュを消してから　もう一回 `cargo clippy` してしばらく待っていると　でけた☆（＾～＾）
ローカルからDocker内のlint-stagedを呼び出す

**husky**と**lint-staged**を使って、コミット時に自動でlintを走らせるのは一般的だと思う。

しかしDockerの`node`コンテナで開発しているプロジェクトを、ローカルのWindowsなどからGitでコミットすると、lint-stagedのバイナリが実行できない。これはバイナリがwindowsで使われることを想定していない、つまりlinux向けにコンパイルされたものだからである。

こういった場合は、以下のように`docker-compose run`でコンテナ越しにlint-stagedを呼び出すと良い。

```package.json
"husky": {
  "hooks": {
    "pre-commit": "docker-compose run --rm node yarn exec lint-staged"
  }
},
"lint-staged": {
  "*.{js,vue}": [
    "eslint --fix",
    "git add"
  ]
},
```

alpineイメージを使用する場合だと、gitがインストールされていないため、Dockerfileを以下のように書く。

```Dockerfile
FROM node:11.12-alpine
RUN apk add --no-cache git
```

ついでに`docker-compose.yml`も載せておく。

```docker-compose.yml
version: '3'

services:
  node:
    build:
      context: ./docker/node
```
WordPressインストールしたあとにやった方がよさそうなことメモ

前回の記事の続きです。
⇒[勉強する気力がびっくりするくらい湧かないしWordPressでアフィブログ作ろうと思った話](https://qiita.com/nkmrdesu/items/859bc46f75d1476443f2)

#前回のあらすじ
ドメイン取得してレンタルサーバー借りてWordPressインストールしました。
宣伝⇒[できたブログ](https://nkmrblogdesu.com/)

#サーバー設定でやり忘れてたこと
###SSLの設定
どうもGoogle先生はSSL設定してないサイトが嫌いみたいなので一応設定しました。
こうするとhttpでもhttpsでもどっちでもアクセスできるようになります。サーバーの管理コンソールからぽちぽちやったらできました。
Secureになって何がうれしいのかはよくわかりません。

#WordPressの設定をいじる
###SEO対策の設定まわり
だいたいこのあたりのサイトを見ながらやっておきました。

[WordPressインストール後すぐやっておきたい６つの初期設定](https://bazubu.com/wp-initial-settings-22899.html)

SEO的にもいいらしいです。

###デザインテーマの設定をする
LION BLOGってテーマがイケてるって話だったので使ってみました。
管理用のダッシュボードで検索しても出てこないのでググったら公式っぽいのが出てきました。（[はい](http://lionblog.fit-jp.com/)）
zipがダウンロードできるので何も考えずに解凍したんですけどzipのままぶっこめってなってて少し損しました。
細かい設定はよくわからないのであんまり弄ってないです。

###プラグインをいれる
ゴテゴテにプラグイン入れてるサイトもあるみたいですけど重くなるし個人的にも管理しきれないなってことで相当絞ってます。
以下入れたやつ

1. Akismet Anti-Spam  
スパムコメント勝手に消してくれるマン。インストールしたら最初っから入っていたので有効にしておきました。
2. Edit Author Slug  
WordPressで作ってるサイトってURL末尾に/?author=IDをつけるとIDが見れちゃうみたいでそれをガードしてくれます。設定方法はググってください。
3. EWWW Image Optimizer  
画像をいい感じに圧縮してくれる。らしいです。詳しくはわからないですけど位置情報とかも消してくれるみたいなのでこのまま入れておこうと思います。
4. Google XML Sitemaps  
サイトマップのXMLを勝手に作ってくれる？よくわからない子です。おすすめされてたので入れました。
5. All In One SEO Pack
SEO対策をあれこれやってくれる。たぶん。これ入れると微妙にサイトのレスポンス悪くなるらしいので入れたくない人はいれなくていいかもです。

#Googleにゴマすりをする
Google先生にゴマすりしないとサイトのアクセスが増えないみたいなのでやっておきます。
詳しくはよくわからないんですけどググったらサーチコンソールとGoogleアナリティクスがどうのこうのって書いてあったので登録しておきました。たぶん全然活用できてないです。


#おわりに
たぶんここまでやったらまあまあ問題ないページなんじゃないでしょうか。あとはたぶん宣伝用にSNS周りの設定が必要だと思うんですけどめんどくさかったのでやってないです。
クラウドワークスとかでWordPressのページ作成３万とかで受けてる人マジですげーなって思いました。
おわり。
書いて覚える ESLint ルールの作り方：TypeScript で書く

# はじめに
[前回](https://qiita.com/kik4/items/ef30d5e0e24dabb81463)は一から始めて簡単な ESLint ルールを書きました。

実際に AST を見ながら実用する本命のルールを書いてみると*「型がないと木のどの部分を見てるのかわからん…」*という気持ちが芽生えてきたので、今回は TypeScript を導入して型推論してもらいながらルールを書く方法を記事にしました。今回はネタは無いです。

# どうして TypeScript を使うのか

VSCode で入力補完してくれて、型が間違っている場合はエラーを出してくれるからです。

AST の構造は複雑で、今扱っている変数が Node なのか Property なのかそれとも any なのか考えて書かなければならず、思考の領域を奪われてしまいます。可読性のためにコードの書き方も工夫しないといけないことでしょう。変数の型が一体なんなのかエディタが判別してくれるようにすれば、開発速度が向上します。

# TypeScript の導入

## パッケージの追加

[前回](https://qiita.com/kik4/items/ef30d5e0e24dabb81463)の `eslint` や `mocha`, `eslint-plugin-rulesdir` に加えて TypeScript で開発するためのパッケージを追加します。

```
yarn add typescript @types/eslint
```

## tsconfig.json

今回はルールを書くディレクトリを `./rules`、TS のトランスパイル出力ディレクトリを `./dist` にします。
それ以外の設定はよしなに。とりあえずで作った私の設定は以下の通りです。

```tsconfig.json
{
  "compilerOptions": {
    "outDir": "./dist",
    "rootDir": "./rules",
    "module": "commonjs",
    "target": "es2017",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "declaration": true,
    "alwaysStrict": true
  },
  "include": ["rules/**/*"],
  "exclude": ["node_modules"]
}
```

## .eslint.js

ルールの本体は js なので、トランスパイル出力ディレクトリを見るようにします。

```.eslint.js
const rulesDirPlugin = require("eslint-plugin-rulesdir");
rulesDirPlugin.RULES_DIR = "dist";

module.exports = {
  plugins: ["rulesdir"],
  rules: {
    "rulesdir/my-rule": ["error"]
  }
};
```

## 実装

宣言や型の雰囲気は以下の通りです。

```rules/my-rule.ts
import { Rule } from "eslint";
import * as estree from "estree";

const rule: Rule.RuleModule = {
  meta: {
    schema: [
      // よしなに
    ]
  },
  create(context: Rule.RuleContext) {
    return {
      ObjectExpression: (node: estree.Node) => {
        // よしなに
      }
    };
  }
};

export = rule;
```

実装が書けたらトランスパイルはして、dist フォルダに出力されることを確認します。コマンドは次の通りです。

```
yarn tsc
```

## テスト

そんなに複雑じゃないので前回と同じく js で書きます。この場合、一度トランスパイルしてからテストします。

# 終わりに

これで TypeScript で ESLint ルールを実装することができるようになりました。型の悩みが軽減されてグッと書きやすくなります。さらに、適当な js ファイルを作って VSCode を再起動して試しにルールを動かしながら開発すると書きやすいですね。
Googlemap API で全てのピンを地図内に収めたい時

Webアプリケーションを作っていてGooglemap API関連の機能を作っていると
登録した地点全てを地図内に収めたい時がある。

写真で言うとこんな感じ。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/342318/3373bb0b-9acb-370d-2863-4a7c39f98168.png)

それを行うにはJavascriptで実現していく。ネットにはいろいろ上記を実現させる方法が
書いてあったがあまり上手くいかなかった。。

今回、採用したのは以下のアルゴリズム

・初めに出来る限り、ズームアップしておく。

・次に一つ一つ対象のデータを見てそのピンが地図内に収まるようにズームアウトしていく

である。

以下にソースを載せておく。

```map.js
function initMap() {
          map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: ave_latitude, lng: ave_longitude} ,
          zoom: 16,
          });

          var bounds = new google.maps.LatLngBounds();

          for (var i = 0; i < data.length; i++) {
              markerLatLng = {lat: data[i]['lat'], lng: data[i]['lng']};
              marker[i] = new google.maps.Marker({
              position: markerLatLng,
              map: map
            });
            bounds.extend(new google.maps.LatLng(data[i]['lat'], data[i]['lng'])); 
          }
          map.fitBounds (bounds);
        }
```
Swift の型制約付きプロトコルの実行時エラー

先日、自分が発見した型制約付きプロトコルの実行時エラーの説明とその解消法について紹介します。

### 型制約付きプロトコル
Swift の Protocol は、宣言時に `where` で準拠する型に制約を指定することができます。
準拠する型が制約を満たしていないと、コンパイラが、コンパイル時にエラーとして検知してくれます。

```swift:型制約付きプロトコルの例
class SuperClass { }

// 型制約付きプロトコル
protocol SomeProtocol where Self: SuperClass { // 準拠する型は SuperClass を継承するように制約を付ける
    func doSomething()
}

class SomeSubClass: SuperClass, SomeProtocol {
    func doSomething() {
      print("doSomething")
    }
}

class InvalidSomeSubClass: SomeProtocol { // コンパイルエラー: 'SomeProtocol' requires that 'InvalidSomeClass' inherit from 'SuperClass'
    func doSomething() {
      print("doSomething")
    }
}
```

### 型制約付きプロトコルによる実行時エラー
型制約付きプロトコルは、準拠する型に制約を付け、コンパイル時にその制約を検知できる便利な機能です。
しかし、型制約付きプロトコルゆえの実行時エラーも存在します。

```swift:実行時エラーの例
class SuperClass { }

protocol SomeProtocol where Self: SuperClass {
    func doSomething()
}

class SomeSubClass: SuperClass, SomeProtocol {
    func doSomething() {
      print("doSomething")
    }
}

let sp: SomeProtocol = SomeSubClass() // SomeProtocol 型として保持する
sp.doSomething() // EXC_BAD_ACCESS で落ちる
```
エラーの原因は、`SomeSubClass` のインスタンスを `SomeProtocol` (型制約付きプロトコル) 型として保持して、そのメソッドを呼び出したことです。
`SomeSubClass` は `SomeProtocol` に準拠しているため、そのインスタンスを `SomeProtocol` 型として扱ってもコンパイルは通ります。
しかし、インスタンス `sp` 自体は、 `SuperClass` を継承した型ではありません。そのため、 `sp` が `doSomething()` に実行時にアクセスすると、型制約を満たしていないため、エラーとして落ちてしまいます。

### 実行時エラーの解決
上記の実行時エラーを解決するための方法は、2通りあります。

#### 1. インスタンスを型制約の型として実行する
```swift
let sp: SuperClass & SomeProtocol = SomeSubClass() // SuperClass & SomeProtocol 型として保持する
sp.doSomething()  // "doSomething"
```
インスタンス `sp` が実行時に型制約を満たしていないことがエラーとなっていたため、 `sp` を型制約を満たすような型として実行すれば解決します。
#### 2. 型制約付きプロトコルに `@objc` 属性を適用する
```swift
@objc protocol SomeProtocol where Self: SuperClass { // @objc を適用
    func doSomething()
}
...
let sp: SomeProtocol = SomeSubClass() // SomeProtocol 型として保持する
sp.doSomething() // "doSomething"
```
なぜ `@objc` の適用によって実行時エラーを回避するか理解はできていませんが、解決法として紹介されていました。
https://bugs.swift.org/browse/SR-7068

### まとめ
エラー文が `EXC_BAD_ACCESS` としか表示されず、原因を突き止めるのに時間がかかりました。Swift の Protocol は型制約を指定することができますが、実行時のエラーも考慮して使いましょう。

### 参考
- https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

- https://bugs.swift.org/browse/SR-7068
【Microsoft Flow】Arukas アプリ作成時にハマったこと（API 認証編）

#はじめに

さくらインターネットの Docker ホスティングサービスである [Arukas](https://arukas.io/) でアプリを作成しているときにハマったのでメモ。

#顛末

Microsoft Flow から Arukas アプリの制御を行いたい。

Arukas にはユーザーが利用できる API が用意されており、以下の公式ドキュメントに 
API によるアプリの作成、設定変更、起動、停止などの方法がまとまっている。

https://arukas.io/en/documents-en/arukas-api-reference-en/

これをフローの HTTP アクションで叩くだけで良いと思ったが、ハマったのが API 利用時の認証方法についてである。

ドキュメントの Authentication の章を見ると、

>The API keys consist of API token and secret token. You can generate them in Arukas user control panel.
To follow along with this document smoothly, it would be nice to create including a ~/.netrc line of code below.
machine app.arukas.io login #{ARUKAS_JSON_API_TOKEN} password #{ARUKAS_JSON_API_SECRET}

とだけあり、[コントロールパネル](https://app.arukas.io/settings/api-keys)で取得できる API key を netrc ファイルに設定せよとのこと。
しかし、今回使いたい Microsoft Flow では netrc ファイルによる認証は利用できない。

そこで Arukas のサポートに問い合わせてみると以下のような回答があった。

>--user オプションを指定して、リクエスト可能です。
curl -H "Content-Type: application/json" --user #{ARUKAS_JSON_API_TOKEN}:#{ARUKAS_JSON_API_SECRET}@app.arukas.io/api/apps/${APP_ID}

>また以下のような書き方でもリクエスト可能となります。
curl -X GET https://#{ARUKAS_JSON_API_TOKEN}:#{ARUKAS_JSON_API_SECRET}@app.arukas.io/api/apps/${APP_ID}

つまりは基本認証でも API の認証が可能とのこと。
幸い、Microsoft Flow の HTTP アクションでは基本認証が利用できるので、以下のように API Key を設定したら、認証も通り Arukas API を利用してアプリを制御できた。（画像はアプリを起動する場合）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258416/1b21b6fb-6035-7ec0-d4ff-cff1076a7486.png)

#おわりに

「API key で netrc ファイルによる認証が利用可能」という情報から、「つまり同じ API key をそのまま指定した基本認証も利用可能なのでは？」へ、自分の中ですぐに結びつかなかったは残念でした。
WebGL2でIntegerテクスチャへの書き込み&読み込み

WebGL2でIntegerテクスチャに書き込みと読み込みを行う方法です。

サンプルをGithubに置いておいたので、この記事では要点だけを解説します。
[aadebdeb/Sample\_WebGL2\_IntegerTexture: Sample of writing & reading integer texture in WebGL2](https://github.com/aadebdeb/Sample_WebGL2_IntegerTexture)

まずはIntegerテクスチャの作成を行います。
[texImage2D](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D)でフォーマットを指定します。このメソッドの引数である`internalformat`と`format`, `type`は適切な組み合わせを選択する必要があります。今回はinternalformatを`RGBA32I`、formatを`RGBA_INTEGER`, typeを`INT`にして4つの値を格納できるようにします。組み合わせは[この記事](https://webgl2fundamentals.org/webgl/lessons/webgl-data-textures.html)が参考になります。


格納する値が1つでいい場合は`internalformat`と`format`をそれぞれ`R32I`と`RED_INTEGER`に、2つの場合は`RG32I`と`RG_INTEGER`を選択するといいでしょう。また小さい値しか格納しないのであれば`RGBA8I`や`RGB16I`も使用できます。

また、Integerテクスチャを使用する場合はフィルタリングの方法を`NEAREST`にするよう必要があります。

```js
function createTexture(gl, sizeX, sizeY) {
  const texture = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, texture);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32I, sizeX, sizeY, 0, gl.RGBA_INTEGER, gl.INT, null);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
  gl.bindTexture(gl.TEXTURE_2D, null);
  return texture;
}
```

次に作成したIntegerテクスチャに値を書き込む方法です。
通常のオフスクリーンレンダリングと同じように作成したテクスチャを紐づけたフレームバッファに以下のようなフラグメントシェーダーでレンダリングを行います。`out`修飾子がついた変数の型がテクスチャの型と同じになるように`ivec4`にしています。

```glsl
#version 300 es

precision highp float;

out ivec4 value;

void main(void) {
  ivec2 coord = ivec2(gl_FragCoord.xy);
  value = ivec4((coord.x + coord.y + ivec3(0, 2, 4)) % 8, 0);
}
```

最後にIntegerテクスチャの読み込みです。Integerテクスチャには`sampler2D`ではなく`isampler2D`を利用します。また`precision highp isampler2D;`のように`isampler2D`の精度を指定する必要もあります。

```glsl
#version 300 es

precision highp float;
precision highp isampler2D;

out vec4 color;

uniform isampler2D tex;
uniform vec2 resolution;

void main(void) {
  vec2 uv = gl_FragCoord.xy / resolution;
  ivec3 v = texture(tex, uv).rgb;
  color = vec4(vec3(v) / 8.0, 1.0);
}
```

---

符号なし整数のテクスチャへの書き込み＆読み込みも同様に行います。

テクスチャ作成時には`internalformat`には`RGBA32UI`のようにUが付き、`type`が`UNSIGNED_INT`になります。

```js
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, sizeX, sizeY, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null);
```

テクスチャ書き込み時には出力先の変数の型が`uvec4`になります。

```glsl
#version 300 es

precision highp float;

out uvec4 value;

void main(void) {
ivec2 coord = ivec2(gl_FragCoord.xy);
value = uvec4((coord.x + coord.y + ivec3(0, 2, 4)) % 8, 0);
}
```

テクスチャ読み込み時には`isampler2D`ではなく`usampler2D`を利用します。

```glsl
#version 300 es

precision highp float;
precision highp usampler2D;

out vec4 color;

uniform usampler2D tex;
uniform vec2 resolution;

void main(void) {
vec2 uv = gl_FragCoord.xy / resolution;
uvec3 v = texture(tex, uv).rgb;
color = vec4(vec3(v) / 8.0, 1.0);
}
```

---

最後に注意事項について書いておきます。

`RGB32I`のように3変数の値を格納するテクスチャへの書き込みはできません。書き込もうとすると以下のような警告が出ます。

```
[.WebGL-00000219F401A920]GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : glDrawElements: framebuffer incomplete
```

また、Integerテクスチャの読み込み時に`isampler2D`や`sampler2D`ではなく`sampler2D`を使うと、エラーにはなりませんがサンプルした値が0になります。
Rubyのzipメソッドをイメージで理解する【3分で読めます】

ついつい存在自体を忘れてしまうzipメソッド。
イメージで覚えてすぐに思い出せるようにしよう。

# メソッドの詳細
使い方は下記リンクを参考にしてください。
[Array#zip](https://docs.ruby-lang.org/ja/2.6.0/method/Array/i/zip.html)（公式リファレンス）


# 考え方
__とりあえずジッパーをイメージする__
![ジッパーの画像](https://upload.wikimedia.org/wikipedia/commons/8/84/Zippers.jpg "wikipediaより")

上の画像を逆さまにしたものをイメージしてください。

# 解説
まずは実行結果のサンブル。

```Ruby:sample.rb
a1 = [1,2,3]
a2 = [4,5]
a3 = [6,7,8,9]

a1.zip(a2,a3)

# > [[1, 4, 6], [2, 5, 7], [3, nil, 8]]
```
oh,ムズカシイネ

## 1.配列をジッパーの歯(zip teeth)と見立てる

配列を
縦に並べて 
zip teeth

---
普通のArray

```Ruby
a1 = [1,2,3]
```

縦版Array

```Ruby
a1
‖
冖
1
,
2
,
3
凵
```


---

この調子で全部縦にすると.....

```Ruby
a1 = [1,2,3]
a2 = [4,5]
a3 = [6,7,8,9]
```
↓↓↓↓↓↓↓↓↓↓


```Ruby
a1 a2 a3
‖  ‖  ‖
冖 冖 冖
1  4  6
,  ,  ,
2  5  7
,     ,
3     8
凵 凵  ,
      9
      凵
```
案外見やすいですね。

## 2.上から下にジッパーを閉める
```Ruby
[
[1,4,6]
[2,5,7]
[3,nil,8]
]
```
zip teathが噛み合いました。
もう外せそうにありません。



# むすびのことば

命名大事だと思えました。
ブラウザー拡張機能 Stylus で GitHub Markdown を見やすくする

Stylus を使ってサイトデザインを自分好みに変えよう、って話です。今回は GitHub README のスタイルをいじります。



## Stylus

Stylus は閲覧するサイトの CSS を変更できるブラウザ拡張機能です。

- [Stylus - Chrome ウェブストア](https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne?hl=ja)
- [Stylus – 🦊 Firefox (ja) 向け拡張機能を入手](https://addons.mozilla.org/ja/firefox/addon/styl-us/)



## CSS

ブラウザの開発者ツールを使って変更したい CSS クラスを探し、Stylus に以下を登録します。

```
.markdown-body h2 {
    margin-top: 2rem;
    border-bottom: solid 1px #FF7F50 !important;
}

.markdown-body h3 {
    margin-top: 2rem;
    margin-bottom: 1rem;
    padding-left: 0.5em;
    border-left: solid 4px #FF7F50 !important;
}

.markdown-body em {
    text-decoration: underline;
}

.markdown-body strong {
    text-decoration: underline;
}

.Label--outline {
    background-color: #FFA500;
}
```



## こんな感じになります

| Before | After |
|---|---|
| ![before.jpg](https://qiita-image-store.s3.amazonaws.com/0/285675/25c9de68-86fa-7c20-9ed4-b1ee6d9e948a.jpeg) | ![after.jpg](https://qiita-image-store.s3.amazonaws.com/0/285675/ab84692e-4539-ee0b-ba5f-02a711db63ce.jpeg) |

個人的に `<h2>` と `<h3>` が判別しにくかったので、色をつけてマージンを追加しています。

あと Private repository のバッジが見にくいので色を付けました。

| リポジトリ一覧ページ | 個別リポジトリページ |
|---|---|
| ![repo-list.jpg](https://qiita-image-store.s3.amazonaws.com/0/285675/312de6cb-6c48-8587-24be-33615f6415c5.jpeg) | ![repo.jpg](https://qiita-image-store.s3.amazonaws.com/0/285675/37568861-25c3-b495-a960-900b48e61886.jpeg) |



## オススメの公開テーマ

### Qiita Dark

- [Qiita Dark Theme - もう眩しくないよ - Qiita](https://qiita.com/peaceiris/items/3635e9e08c4f1f7f2dc6)

![post.jpg](https://qiita-image-store.s3.amazonaws.com/0/285675/1c3b5f7a-5ccd-4c6f-c87f-592f3ecb3d7c.jpeg)

### GitHub Dark

- [StylishThemes/GitHub-Dark: Dark GitHub style](https://github.com/StylishThemes/GitHub-Dark)

![github-dark.jpg](https://qiita-image-store.s3.amazonaws.com/0/285675/9accefe7-2bfe-9969-9f3a-8c2ad85e7dba.jpeg)


サイトデザインに不満があるからといって、サービス運営側に要望を出しても解決されることはまずないでしょうから、オリジナルのスタイルを適用しちゃいましょう。
コールバック関数が何回やっても覚えられなかった自分用に記事を書きたかった

JavaScriptを学んでいる途中でコールバック関数にドハマりしたので自分用に記事を書きました。

#そもそもコールバック関数とは

コールバック関数とは、`「関数の引数として関数を渡すこと」`です。
・
・
・
**そもそもこの文章の意味が分からない**。

そう、JavaScript初心者には、この文章ですら意味不明。

とりあえず分かったのは、例えば関数Bを、関数Aの**あとで**、しかも**確実に**実行したい場合などに使われる方法であるということです。
様々な理由により、関数Bの方が先に実行されてしまい、不具合を起こしてしまうケースというのが存在する、ということでした。


#検索しても分からない

どういうときに使うのかは分かった、しかしどう動いているのかは未だに分からない。
こういう時に頼りになるのは先人の知恵。

という訳で早速「コールバック関数」で検索をしたものの、**これも全く分からない**。

**「ねっ？簡単でしょ？」**と言わんばかりにどの記事もコードが書いてはあるものの、**「そうじゃない！もっと簡単なところから教えてください！（泣）」**という私の個人的なニーズに応えられる記事は見つからず。

最終的には何となく分かったけど、もっと簡単に書いてある記事があっても良いのでは…
自分みたいにJavaScriptを勉強し始めた人の中にも、コールバック関数で躓いている人がいるはず…~~いや、いてほしい~~

そんな中で自分なりに考えて辿り着いた、理解の方法がこの記事になります。
多分、これが一番簡単だと思います。

#まずは「引数」をおさらいしよう

自分がそうだったので書いておきますが、コールバック関数が理解できない人は「引数」がちゃんとは分かっていないのかも知れません。
例えばこんな簡単な関数を考えてみましょう。

```Javascript
function show(x) {
  console.log(x);
}
```

この関数では`x`が「引数」なので、この"x"の部分に任意の値を入れて実行すれば、その値が`console.log`に表示されます。
例えば下記の様な形です。


```Javascript
function show(x) {
  console.log(x);
}

show(y); //console.log(y);
show(z); //console.log(z);
```

`show()`という関数を実行する際に、「引数」に渡された`x`が`console.log`で返される。
同じく`y`なら`y`、`z`なら`z`...と、渡された引数の値が`console.log`で返されます。

#じゃぁこれは？
それでは、このコードの2行目を下記の様に書き換えてみるとどうでしょうか？

```Javascript
function show(x) {
  x();
}
```
`console.log`が消えて、これまで「引数」だった`x`が前に出て、「`x()`という関数を実行せよ」というプログラムに変わりました。
つまり、関数`show()`に渡された「引数」に従って、その「引数」の名前の関数が呼び出されることになります。
挙動としては下記です。

```Javascript
function show(x) {
  x();
}

show(y); //y();　...y()という関数が実行される
show(z); //z();　...z()という関数が実行される
```



#コールバック関数の実践

ここまで理解できれば次のプログラムがどう構成されているかも分かると思います。

```Javascript
//3.
function y() {
  console.log("call back!");
}

//2.
function show(x) {
  console.log("call back soon...")　
  x();
}

//1.
show(y);

```

1. まず初めに、`show(y);`という関数が実行され、`console.log("call back soon...")`に基づき、コンソールに表示されます。
2. 次に、`x();`という関数が実行されますが、この`x`は引数によって`y`に置き換えられるため、実際には`y();`という関数が実行されます。
3. そして、`y();`という関数は既に定義してあるので、`console.log("call back!")`が実行されます。

#他の記述方法

なお、関数を変数に代入する形で、下記の様に記述して紹介している場合もあります。
↑に書いたコードと同じ意味なんですが、コールバック関数が理解出来なくて混乱している時に読むとますます意味が分からなくなると思うので、注意しましょう。

```Javascript
var y = function() {
  console.log("call back!");
}

var show = function(x) {
  console.log("call back soon...")　
  x();
}

show(y);

```

#まとめ
細かいところをすっ飛ばしての説明となりましたが、多分こう考えればコールバック関数も理解しやすくなると思います。
コールバック関数でドハマりしている人が抜け出すために、少しでもお力になれれば幸いです。
ネコでも分かるSOLID原則(第3回)

お久しぶりです、らべねこです。
私は今「アジャイルソフトウェア開発の奥義」という本を読んでいます。
その中のSOLID原則の部分がよく分からなかったので、私なりにまとめて理解したものをQiitaに投稿しています。
今回は第3回です。
第1回はこちら https://qiita.com/labeneko/items/3033c9a0fa0772a864c2
第2回はこちら https://qiita.com/labeneko/items/92fd93ed1e4a07565869
間違い等ありましたらご気軽にコメントください。

# SOLID原則とは

多くの設計で用いられている考え方を原則としてまとめたものです
以下の5つの原則があります

S：SRP、単一責任の原則
O：OCP、オープン・クローズドの原則
L：LSP、リスコフの置換原則
I：ISP、インタフェース分離の原則
D：DIP、依存性逆転の原則
第3回は、インタフェース分離の原則についてまとめました

# L：リスコフの置換原則(LSP: The Liskov Substitution Principle)

### 守るべきルール

派生型はその基本型と置換可能でなければならない
事前条件を派生型で強めることはできない。つまり、上位の型よりも強い事前条件を持つ派生型を作ることはできない。
事後条件を派生型で弱めることはできない。つまり、上位の型よりも弱い事後条件を持つ派生型を作ることはできない。

### ルールを守らないとどのような問題が起きるか
- リスコフの置換原則を守らないということは、基本型と派生型で振る舞いが違うものができるということになります
- 結果的にモジュールがもろくなり、最終的にオープン・クローズドの原則に違反することになります

### (補足)振る舞いが違うということ
結果が違うということとは別です。
例えば図形描画のモジュールがあって、「図形を書く」という基本型のクラスと、そこから派生した「円を書く」「三角形を書く」という派生クラスがあったとします。
派生クラスで描画される結果としては円・三角形と違いますが、「図形を書く」という振る舞いは一緒です。
振る舞いが違うというのは、例えば「三角形を書く」派生クラスを実行したら謎の例外が返ってきたり、「三角形を書く」クラスでしか動かない関数があったりするということです。

### 結論
オブジェクト指向設計について、そのすべての核心にあるのはオープン・クローズドの原則です。
オープン・クローズドの原則が有効なとき、アプリケーションはずっと使いやすく、再利用可能で頑強なものになります。
リスコフの置換原則は、オープン・クローズドの原則を有効にする主要な役割を果たすものの一つです。
リスコフの置換原則の、「派生型が基本型と置換できる」ということを守ることで、オープン・クローズドの原則である「モジュールに修正を施すことなく拡張する」ということを実現できているということなのです。
そういう意味で、リスコフの置換原則を守るということがとても重要なのです。

第4回では、インタフェース分離の原則について説明します
（今回はらべねこにしか分からないSOLID原則になっている気がする…難しい…）
Frequency Encodingとハーフィンダール・ハーシュマン・インデックス(HHI)

#概要
異常検知を勉強している中で、日本語解説の少ないEncoding手法が必要になったので自分なりにまとめておきます。

#Frequency Encoding
Frequency Encodingとは、各カテゴリ変数値の出現確率でEncodingする方法です。
例えば下の表で考えると、カテゴリBは出現回数が2回、全体のレコード数が6回であることから、2/6=0.333....となります。

|id |カテゴリ  |出現頻度  |Frequency Encoding|
|---|---|---|---|
|0  |A  |3  |0.500|
|1  |A  |3  |0.500|
|2  |A  |3  |0.500|
|3  |B  |2  |0.333|
|4  |B  |2  |0.333|
|5  |C  |1  |0.167|

#使用例
Frequency Encodingの平均値を取ると、各カテゴリ変数の占有度合いが比較できそうな気がします。
以下のような表を考え、売れた商品のカテゴリをFrequency Encodingしてその平均値を比較してみます。

|id |会社|カテゴリ  |出現頻度  |Frequency Encoding|
|---|---|---|---|---|
|0  |A社|食品  |5  |0.833|
|1  |A社|食品  |5  |0.833|
|2  |A社|食品  |5  |0.833|
|3  |A社|食品  |5  |0.833|
|4  |A社|食品  |5  |0.833|
|5  |A社|日用品|1  |0.167|
|6  |B社|食品  |2  |0.333|
|7  |B社|食品  |2  |0.333|
|8  |B社|家電  |2  |0.333|
|9  |B社|家電  |2  |0.333|
|10 |B社|本    |2  |0.333|
|11 |B社|本    |2  |0.333|

表を見た限り、A社の売れた商品カテゴリは偏っているように感じます。
この感覚を数値化できるのがFrequency Encodingの平均値です。
実際に計算してみると、A社の平均は0.722...、B社の平均は0.333...となり、数値によって差別化されています。

#Frequency Encodingの平均値まとめ
値が大きいほどカテゴリ変数の偏りが大きくなります。最大値は全レコードが同じカテゴリの場合、すなわち1です。
反対に、値が小さいほどカテゴリ変数の偏りが小さくなります。最小値は全レコード(Nレコード)が異なるカテゴリの場合、すなわち1/Nです。

#ハーフィンダール・ハーシュマン・インデックス(HHI)
ここまでFrequency Encodingの平均値というものを考えてきましたが、経済学の文脈ではハーフィンダール・ハーシュマン・インデックス(HHI)という数値が存在します。Wikipedia(https://ja.wikipedia.org/wiki/ハーフィンダール・ハーシュマン・インデックス) から引用すると、

>ハーフィンダール・ハーシュマン・インデックス（Herfindahl-Hirschman Index, HHI）とは、ある産業の市場における企業の競争状態を表す指標の一つ。その産業に属する全ての企業の市場占有率の2乗和と定義される。HHIは独占状態においては 1（数値に％表示のものを用いるときには10000）となり、競争が広くいきわたるほど 0 に近づく。寡占度指数とも呼ばれる。

とあります。これはどこかで見たことある気がする...。
試しに先ほどの例を元にして、会社を産業に、カテゴリ変数を企業に、出現確率を占有率にそれぞれ読み替えてA社とB社のHHIを計算してみると
A社は$(\frac{5}{6})^2+(\frac{1}{6})^2=0.722...$、B社は$(\frac{2}{6})^2\times 3=0.333...$とまったく同じ値になりました。

証明は省略しますが、このようにFrequency Encodingの平均値と読み替え後のHHIは一致します。
私は経済学に明るくなかったため、指摘があるまでまったく知りませんでした。

#最後に
Frequency Encodingは何かしらの予測モデルというより、異常検知向きなEncoding手法だと思っています。
参考になれば幸いです。
enum値を引数に持つメソッドを持つstructのInterfaceを作るコツ

golangではライブラリ自体はinterfaceを提供しておらず、使う側で必要になったら作れという風潮があると思ってます。golangのinterfaceはダックタイプなので、概ねはそれで上手く行きます。  
ただ、引数にenum値がある場合、素直にメソッドのシグネチャをコピペするとinterface自体が実装に依存してしまうので一工夫が必要です。  
やってることはinterfaceにも同じenumを作りましょうというだけなのでなんということはないのですが、DIとかに慣れてない人はちょっと嵌りそうな気がします。

実装例は以下です。参考になれば幸いです。

```go

package main

import "fmt"

// 例えば、以下のようなinterface化したいライブラリ(?)があったとする。

type Hoge struct {
	a int
}

type Mode int

const (
	ModeOne = iota
	ModeTwo
)

func NewHoge(a int) *Hoge {
	return &Hoge{a: a}
}

func (h Hoge) Mul(m Mode) int {
	return h.a * int(m)
}

// ここから下はインターフェース

type MulerMode int

const (
	MulerModeOne = iota
	MulerModeTwo
)

// 普通にやるとMulの引数の型にModeを指定してしまうが、そうするとInterfaceが実装に依存してしまう
// ここでは同じ値域のenum、MulerModeをinterfaceとセットで用意して回避する
type Muler interface {
	Mul(m MulerMode) int
}

// ここから下はインターフェースを通じてHogeを使いたい場合

type MulerImpl struct {
	Hoge
}

func NewMulerImpl(a int) *MulerImpl {
	return &MulerImpl{Hoge: Hoge{a: a}}
}

func (m *MulerImpl) Mul(mm MulerMode) int {
	var md Mode // ここでenum同士のマッピングをする
	switch mm {
	case MulerModeOne:
		md = ModeOne
	case MulerModeTwo:
		md = ModeTwo
	default:
		return 0 // 本当はエラーとかだと思う
	}
	return m.Hoge.Mul(md)
}

// 実際に呼び出す

func main() {
	var m Muler
	m = NewMulerImpl(1)
	fmt.Print(m.Mul(MulerModeOne))
}

```
iOSとAndroidの定期購読の期間の伸び方の謎

##〇概要
iOSとAndroidはともにサブスクリプション（定期購読）の機能が実装されており、購入時に決められた期限が与えられ、有効期限が切迫すると課金継続中なら有効期限が決められた期間分追加されます。
しかし、期限の伸び方の詳細はドキュメントに公開されておらず、よくわからない伸び方をするケースがあるので、実体験からわかった謎ルールをいくつか書いてみます。
謎はあまり解明されてないので、こういうケースもあるのかということで読んでください。
よくわからないことを書いているので、報告や指摘は大歓迎です。
サービスによっては起きたり起きなかったりするかもしれません。

<font color="red">今回は期間を一ヶ月に設定して、特に問題が起きやすい2/28,3/1当たりに注目しています。)</font>

##〇iOS
###・新規購入時の延長
**<font color="blue">購入日時 + その月の日数 - (0時間 or 1時間)</font>**
**<font color="blue">その月の日数</font>**とは1/15に購入すれば1月が31日まであるので31日が延長される。
しかしロサンゼルスとの時差17時間が影響を与えていると思われ、考慮しなければならない。
そのため3/1の16:59までは2月という考え方になり、
例えば日本で3/1の16時に購入すると、2月判定になり28日が足され、3/29日の15時までの期限となるのでユーザーからのクレーム案件になるかもしれないので注意。
（サマータイム外はロサンゼルスと16時間の時差ですが、年中17時間で固定のようです）

**<font color="blue">\- (0時間 or 1時間)</font>**については日によって全ユーザーがついたり、つかなかったり。その規則性はよくわからず。

ちなみに1/28 - 1/31に購入したものは3/1の有効期限になる。

###・自動更新の延長
**<font color="blue">前回日時 + その月の日数 +- (2時間)</font>**

たまに**<font color="blue">+-2時間</font>**が付くが原因不明。

購入した日付を基準に戻ろうとする作用が起こる。
（28日に購入した例）2019-01-28 21:00:00 → 2019-02-28 21:00:00 → 2019-03-28 20:00:00
（31日に購入した例）2019-01-31 21:00:00 → 2019-02-28 21:00:00 → 2019-03-31 20:00:00

##〇Android
###・新規購入時
**<font color="blue">購入日時 + その月の日数 + 2時間</font>**

その月の日数は、他社ブログでは時差が影響して月初だとずれるとの報告あり。
+ 2時間は多少前後することもある。

###・自動更新時
**<font color="blue">前回日時 + その月の日数</font>**

**<font color="blue">その月の日数</font>**は11時ぐらいを基準に前日と判断されることもある。時差の影響かもしれない。

iOSと違い、29,30,31日に購入すると、更新時に28日に丸められてしまうので、更新数がその日に偏るので注意。
またユーザーとしては損をするケースとなる。

（28日に購入した例）2019-01-28 15:00:00  2019-02-28 15:00:00  2019-03-28 15:00:00
（31日に購入した例）2019-01-31 15:00:00  2019-02-28 15:00:00  2019-03-28 15:00:00

そして
2019-01-31 15:00:00  → 2019-03-01 15:00:00 → 2019-03-29 15:00:00

となるケースも多くみられ、ひと月に二回決済が行われるため、集計やユーザー対応に困ることもあり。

##〇総評
iOSは17時間の時差を考慮しないといけないので悩みもの。
それ以外は大分素直。

Androidは謎ルールやバグが多く、期間が伸びたり縮んだりが頻繁に起きたりして、昔から悩まされている。（最近は大分マシになったけど・・・）
１月に２回支払いが行われるのは、運営、ユーザー共に月報や家計簿にズレがでるなど困るケースが出てくるので直してほしい。。。
敢えてPlayframeworkの旧バージョンを使いたい

## こんなことありませんか？
Playframeworkを使った新規プロジェクト作成時、他のプラグインやらライブラリを使いたいと思ったとき、おもむろに
`$ sbt new playframework/play-scala-seed.g8`
を実行して、新しいプロジェクトを作成し、build.sbtにゴニョゴニョとlibraryDependenciesを追加して、いざupdateを掛けると、playと他のプラグインやライブラリの間で依存関係の不整合が発生してしまい、にっちもさっちもいかないよー、という状況。
## 普通に考えたらPlayframeworkの旧バージョンを使ってみたいけど
オフィシャルな情報にはその点が見当たらない（わたしの探し方が甘いだけかもしれませんが）
さあ、どうしよう？
## それなら、play-scala-seed.g8の旧バージョンを使ってみる！
といっても、あっさりできれば苦労はしない・・・一応、手元ではこんな方法でできました。（が、もっといい方法があるそうです）
1. https://github.com/playframework/play-scala-seed.g8 から、希望するplayのバージョンのブランチをダウンロードする。(2019/03/24時点では、2.7.x, 2.6.x, 2.5.xが存在する模様）
2. ダウンロードしたzipファイルを展開して、ディレクトリ名をplay-scala-seed.g8に変更しておく
3. `$ sbt new file://<2.のフルパス>` を実行
4. 後は通常通りに聞かれた内容を入力すれば完了
## もっといい方法
@additengineer さんから以下の方法でできるよ、とツッコミいただきました！
`sbt new playframework/play-scala-seed.g8 --branch 2.6.x`
## 最後に
もしツッコミどころがあればご指摘いただけると幸いです。
プログラミング学習記録36〜Cloud9で動くだけでも進歩〜

##今日やったこと
- Progate Railsの道場コース2までの内容をCloud9で再現する

ProgateでやっていたのをCloud9でもやっています。

まったく同じコードを書いても上手くいかないことがあるのには慣れてきました。

Progateで使われている画像はなしで再現しました。

道場コース２までは問題なくいけました。

ですが、道場コース２から３に進むと、いきなりUserモデルが出来上がってる状態から始まるので、ここからは学習コースの手順に従って進んでいこうと思います。

Progateの模写を終えた後はオリジナルアプリ作りに入りたいと思います。

ツイッターは投稿する欄が１つですが、これを３つにして、前田裕二さんの「メモの魔力」のようなメモができるアプリが作れたらいいなと思います。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
pandasで欠損値を含んだ日付ごとのデータの累計値を算出する


こんな感じでできました。

```python
import pandas as pd

# 実験用データ
df = pd.DataFrame({'date': ['2019-01-05', '2019-01-18', '2019-01-25', '2019-02-06', '2019-02-16', '2019-03-02'],
                   'value': [10, 20, 30, 40, 50, 60],
                   'name': ['あ', 'い', 'う', 'え', 'お', 'か']})

# 日付列を日付型に変える
df['date'] = pd.to_datetime(df['date'])
# 日付リストのDataFrameを作ってマージする。
df = pd.merge(pd.DataFrame({"date": pd.date_range('2019-1-1', '2019-3-31')}), df, how='left')
# 累計値を新たな列として追加
df['cumsum'] = df['value'].fillna(0).cumsum()

print(df)
```