OmniAICreator/Qiita-1.07M huggingface dataset:
SlackのSlash Commandsが2種類ある話

SlackのSlash Commandsを自分で設定する場合に新旧2種類の方法が存在し、挙動も若干違うという話を紹介します。2つの違いに気づかないと時間を無駄にすることがあります[^1]。

[^1]: 私は古い方を使っているのに気づかず、新しい方用のドキュメントを読んで「なぜX-Slack-Request-Timestampヘッダが来ないんだ？」と悩みまくりました

# 古い方：Custom IntegrationsのSlash Commands

「Slash Commands」というアプリの設定をカスタマイズして利用します。多くの人が自然に使っているのはこちらだと思います。

利用している場合、`https://[TEAM_DOMAIN].slack.com/apps/manage/custom-integrations` で確認できます。

> <img src="https://qiita-image-store.s3.amazonaws.com/0/46856/191912ec-fdab-3176-615e-3f18d99ec0f7.png" width="66%">

こちらの方法で作ったSlash Commandsは補完メニューに表示されませんので、秘密のコマンドを実装することができます。

# 新しい方：カスタムアプリのSlash Commands

https://api.slack.com/apps からカスタムアプリを作り、アプリのSlash Commandsを追加して利用することもできます。

次のようなインターフェースからコマンドを登録します。

> <img src="https://qiita-image-store.s3.amazonaws.com/0/46856/ae89ae23-5ec6-30a0-aa9b-44bc103cfcd6.png" width="66%">

こちらの方法で作ったSlash Commandsは全利用者から見えますし、補完メニューに表示されます。

> <img src="https://qiita-image-store.s3.amazonaws.com/0/46856/166f2131-a506-bf74-ee7c-39e598314b20.png" width="66%">

また、この方法で作ったSlash CommandsはHMACを使ったリクエスト改ざんチェックが可能です（参考：[Verifying requests from Slack | Slack](https://api.slack.com/docs/verifying-requests-from-slack)）。
Twitterアプリのプロフィール風UI （2020年追記）

作ってみたら意外とサクッといけました。

![tw.gif](https://qiita-image-store.s3.amazonaws.com/0/20784/6132a923-06bd-5135-2315-7ace2b12933f.gif)

コード
https://github.com/osanaikoutarou/TwitterLikeUI

※もちろん本家を見てもらえれば分かる通り、実際はもう少し複雑です

### 少し解説

階層はこんな状態です。

view
　　ーHeaderView
　　ーUIScrollView（横）
　　　　　ーUITableView
　　　　　ーUITableView
　　　　　ーUITableView
　　　　　ーUITableView

HeaderViewがスクロール内に入っていないのが引っ掛けです。これを入れてしまうと途端に難しくなります。
こういったUIは、ViewのConstraintを直接書き換えたほうがコントロールしやすいです。
コントロールするのはUIScrollViewDelegateのscrollViewDidScrollです。
黄色いバーがちょうど上に来る当たりで止めれば、まるでUITableViewのコンポーネントみたいです。
（でも4つのTableViewに影響して動いているので、コンポーネントなわけないんですよね）

黄色いViewの中の、現在のViewを表す水色のVieｗも、画面左からのConstraintを動かしているだけです。


### 追記： 実践　（実際に組んでみた感想）

2案件で実際に組みました。
保守を考えて、各TableViewをViewControllerに切り出し、ContainerViewを使いましたが、思いのほか複雑になりました。
これ何も言わないでおいたら引き継ぎ大変になると思います。
案件次第では仕様レベルで回避したほうが良いと思います。
ドハマリしそうです。

コードはこちら。
https://github.com/osanaikoutarou/TwitterLikeUI/tree/develop

ContainerViewを使わなければもう少しシンプルになるんですが、ViewControllerが非常に重くなるので痛し痒しです。

UIPageViewControllerに逃げてしまう手もあります。
その場合はiTunes Storeのアプリが参考になるはずです。

### 追記：　更にちゃんと実装する

Libraryを使う方法もあるようです
https://github.com/maxep/MXParallaxHeader
　
自分で実装する場合も、「複数ScrollView＋１HeaderView」を実装する際にこちらのLibraryが参考になるかもしれません
【Solidity】tx.originとmsg.senderの違い

# はじめに
[Truffleのチュートリアル](https://qiita.com/Kumamera/items/1379511d8f0ead800c53)で`tx.origin`に出会った。


# tx.originとmsg.senderの違い
`address`には、人間のEthereumアカウントアドレスとコントラクトアドレスの２種類があるが、
`msg.sender`はその両方が入りうる。`tx.origin`は人間のアカウントアドレスしか入り得ない。という違いがあるらしい。

例えば、アカウントAからコントラクトBを呼び出し、コントラクトBから別のコントラクトCを呼び出したとき、
コントラクトC内で`msg.sender`はコントラクトBを指し、`tx.origin`はアカウントAを指す。

しかし、[こちら](https://ethereum.stackexchange.com/questions/196/how-do-i-make-my-dapp-serenity-proof)で、Serenityでは`tx.origin`の使用を避けるべき旨が言及されている。
どうしてもコントラクトCで`tx.origin`に相当するアドレスが必要な場合は、コントラクトBに`tx.origin`に相当するアドレスを伝搬させるような仕組みを実装して対応できるが、簡単にだますことができる上、Cに届いたアドレスが本当に`tx.origin`と一致するかを確認する術がないため、セキュリティ的には問題があるようだ。

# 参考
[What's the difference between 'msg.sender' and 'tx.origin'?](
https://ethereum.stackexchange.com/questions/1891/whats-the-difference-between-msg-sender-and-tx-origin)
ハッシュ関数とは？ 

# ハッシュ関数とは
ハッシュは固定サイズのコードです。ハッシュは文字列から生成され、このハッシュは前記文字列を表すために使用されます。

ハッシュ関数は、文字列を受け取り、それに対応するハッシュに変換する関数です。ハッシングは、索引付けとデータ暗号化のために行われます。また、データの信頼性を検証するためにも使用されます。ハッシュをデコードするには、ハッシュを作成するのと同じアルゴリズムを使用する必要があります。ハッシュ値が同じ場合、メッセージはエラーなしで送信される可能性が最も高くなります。

## ハッシュ関数を作るためのポイント
1.出力またはハッシュから元の文字列を再構築することを非常に困難にします。
2.指定された文字列は、常に同じハッシュ値または暗号化されたテキストを生成する必要があります。
3.同じ暗号化されたテキストにハッシュする2つの異なる文字列を見つけることは困難です。
4.指定された文字列からハッシュ値を予測することはできません。

## Secure Hash Algorithm - 256 (SHA-256), ハッシュ関数の例
SHA-256は利用可能な最も強力なハッシュ関数の1つです。 テキストを256ビットの文字列に変換します。 SHA-256は、ハッシュを変換するのが非常に難しいため、ブロックチェーンテクノロジでよく使用されます。

このビデオを見ることもできます: https://www.youtube.com/watch?v=S5wI1s4Kaf4

このリンクを使ってハッシュを作ることができます: https://demoblockchain.org/hash
DB接続やらのタイムアウトが設定値通りにタイムアウトしてくれなくて困った話

# DB接続やらのタイムアウトが設定値通りにタイムアウトしてくれなくて困った話

あくまでこういう事があったよっていう話ですが。。

ライブラリの内部でリトライの処理をするようになっていたため、例外が発生するまでに タイムアウト値*リトライ回数 秒だけ待たされた事があった。
※なんのライブラリだったかは忘れた（HikariCPかなぁ。。）。。

また、リトライはリトライで、リトライ回数が増えるとリトライ間隔が延びていってたりしてたような気もするので、その辺も考慮に入れると良いかも。
イーサリアム：簡単な紹介

技術の分野でブロックチェーンという分散型技術があります。

イーサリアムもビットコインのように、ブロックチェーン技術を使って作られました。
しかし、イーサリアムは暗号通貨だけではなく、色々なDappsを作れます。
ファイナンスやトレーディングやソーシャルネットワーキングに応用できます。あなたも暗号通貨をつくれます！

イーサリアムは可能性のある技術です、あなたはイーサリアムで何を作っていますか？:smile:

もっと読む：
* [Ethereum documentation](http://www.ethdocs.org/en/latest/introduction/what-is-ethereum.html)
* [Ethereum GitHub Wiki](https://github.com/ethereum/wiki/wiki/Ethereum-Development-Tutorial#introduction)
atomでファイル名を検索する

atomでファイルを探そうとするとき、ツリービューを目で探していくのはしんどいものです。
ターミナルなどでgrepをかけるのも手間がかかります。
atom内で効率よくファイル名検索をする場合は以下の様なコマンドがあります。

atomでファイル名から検索したい場合は以下のコマンド（macの場合）

[command] + P

以下のような画面になります。
<img width="430" alt="atom-660x432.png" src="https://qiita-image-store.s3.amazonaws.com/0/104359/77cdf9a4-46c8-cc71-7751-3960a55d8771.png">

テキストエリアに検索したいファイル名を入力すると、ファイル名やディレクトリ名で絞り込み検索されます。
Go言語で簡単な電卓を作ってみる

# 電卓作成
対話型のプログラムを作ってみたいなーと思いまして。
あと、型確認もできますし！

流れはこんな感じです。
1. 数字、および演算子の入力(逆ポーランド法で)
2. 数字および演算子を変数に格納
3. 演算子毎に違った計算を実施
4. 計算結果を出力

今回は、+, -, *, / 辺りを実装してみます。
フローチャートは割愛です！

## 標準入出力
とりあえずは、C言語でいうscanf的なものを調査しないと。

うーん……
結構いろんな種類があるみたい。
どれが適しているのだろう…分からぬ……
とりあえず、fmt.Scanf関数を使って…みますか……

…と思ってやってみたコードがこちら。
※ビルドできません！！！

```go:Calculation.go(失敗例)
package main

import "fmt"

func main() {
    var x int
    fmt.Scanf("%d", &x)
    fmt.Printf("%d\n", x)
}
```

おお！
いけました！
感覚でいけるもんですね。

というわけで、入力フォームおよび出力内容を作ってみます。
作ったコードはこちら！

```go:Calculation.go
package main

import "fmt"

func main() {
	var a, b int
	var calc string
	
	fmt.Printf("Please enter the calculation formula.\n");
	fmt.Printf("ex) 1 + 1 = ? -> 1 1 +\n");
	fmt.Scanf("%d %d %s", &a, &b, &calc);
	
    fmt.Printf("%d %s %d = ", a, calc, b);
}
```
コーディングしていて驚いたのは、Go言語にはchar型は無いんですね！
文字を扱えるのは、おそらくstring型のみ。
統一されていて、逆に使いやすいかもしれませんね！

ちなみに、上記のコード実行時の出力結果はこちらです。

```
$ go run Calculation.go
Please enter the calculation formula.
ex) 1 + 1 = ? -> 1 1 +
2 3 +
2 + 3 =
```

出力結果、ちょっと見にくいですね。
以降で変更することにします。

## 条件分岐
では、if文を使った条件分岐をやっていこうと思います。
方針としては、+, -, *, / の4つを実装できれば良いかと。

というわけで、C言語のスキルを駆使して作ったプログラムがこちら！

```go:Calculation.go
package main

import "fmt"
import "os"

func main() {
	var a, b, c int
	var calc string
	
	fmt.Printf("<Formula>\n");
	fmt.Printf("ex) 1 + 1 = ? -> 1 1 +\n");
	fmt.Scanf("%d %d %s", &a, &b, &calc);

	if(calc == "+") {
		c = a + b;
	} else if(calc == "-") {
		c = a - b;
	} else if(calc == "*") {
		c = a * b;
	} else if(calc == "/") {
		if(b == 0) {
			fmt.Printf("I cannot calculate this formula.\n");
			os.Exit(1);
		} else {
			c = a / b;
		}
	}
	
	fmt.Printf("<Answer>\n");
    fmt.Printf("%d %s %d = %d", a, calc, b, c);
}
```

このプログラムを作成する上で困った点は3つ！
1. 文字列の等式
2. else if文の場所
3. exitの方法


※編集中※
Javascriptの配列の空を判定する

Javascriptの配列が空であることを判定する記述です。

```javascript

var arr = [];
if (arr.length === 0) {
  console.log('配列は空です');
}
```

空のオブジェクトの場合は`obj.length`ではundefinedとなりますので、以下の記述が必要です。

```javascript

var obj = {};
console.log(obj.length);  // undefined
if (Object.keys(obj).length === 0) {
  console.log('空のオブジェクトです');
}
```
EC2のディスクサイズを増やす手順


## AWS管理コンソールにログイン

現行世代のEBSボリュームが現行世代のEC2インスタンスタイプにアタッチされている場合はデタッチは必要なし。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-modify-volume.html

今回はデタッチありの場合。8GB→15GBに変更

* AWSコンソールからEC2のページへ移動
* EBS ID を選択
* ボリュームパネルでアクション＞ボリュームの変更 をクリックしてください。
* 変更後のサイズを入力し(単位はGB)変更

## SIZEが増えていることを確認

     $ lsblk
     NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
     xvda    202:0    0  15G  0 disk
     └─xvda1 202:1    0  15G  0 part /

## xvda1のファイルサイズを確認
     $ df -h
     Filesystem      Size  Used Avail Use% Mounted on
     devtmpfs        2.0G     0  2.0G   0% /dev
     tmpfs           2.0G     0  2.0G   0% /dev/shm
     tmpfs           2.0G  668K  2.0G   1% /run
     tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
     /dev/xvda1      8.0G  4.9G  3.2G  61% /
     tmpfs           395M     0  395M   0% /run/user/1000

## xda1にデタッチ
     $ sudo xfs_growfs -d /dev/xvda1
     meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524159 blks
              =                       sectsz=512   attr=2, projid32bit=1
              =                       crc=1        finobt=1 spinodes=0
     data     =                       bsize=4096   blocks=2096635, imaxpct=25
              =                       sunit=0      swidth=0 blks
     naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
     log      =internal               bsize=4096   blocks=2560, version=2
              =                       sectsz=512   sunit=0 blks, lazy-count=1
     realtime =none                   extsz=4096   blocks=0, rtextents=0

## xvda1のファイルサイズを確認
     $ df -h
     Filesystem      Size  Used Avail Use% Mounted on
     devtmpfs        2.0G     0  2.0G   0% /dev
     tmpfs           2.0G     0  2.0G   0% /dev/shm
     tmpfs           2.0G  668K  2.0G   1% /run
     tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
     /dev/xvda1       15G  4.9G   11G  33% /
     tmpfs           395M     0  395M   0% /run/user/1000

8GB→15GBになって入ればOK
Amazfit bip face作成

###概要
やっとぴったりの活動量計と出会えました。Amazfit bip。

+ 公称45日の電池持ちはホントだった(但しActivityモードを使うと減りが早い)
+ 反射型液晶で常時画面表示
+ 自分でfaceを作れる。これは作らなければいられない
    + [こちらのサイト](https://amazfitwatchfaces.com/bip/)に多数あるがぴったりするものはない
    + [手順はこちら](http://blog.livedoor.jp/takaj22/archives/52183083.html)
        + PC->iphoneはgoogle drive経由で送付
    + 色が8色だけだなんて、PC-9801(初代)ノスタルジー

###face作成TIPS
+ 小さな数字は見づらい。これは年のせいだけど
+ アナログの針は背景白だと見づらい。黒が負けて細くなる
+ 重なりは透過画像で可能。上下関係は決まっている
+ AM/PMを表示するとデジタル時間は12Hモード、非表示だと24Hモード
    + AM/PM表示時はデジタル時間も表示必須なので、表示したくない場合は空画像を用いる
+ 歩数進捗自動表示は円のみ。それ以外の形は画像を任意の枚数組み合わせる
+ 秒を表示すると画面が1秒単位にリフレッシュされ電池持ちがかなり悪くなる。非表示だと1分
    + 液晶の消費電力だけで見ると5倍違うらしい
+ 操作ロック・ロック解除アイコンはリフレッシュが1分だと追従がずれるので混乱する
+ レイアウト
    + 端っこは切れるので、周り3pxずつは配置しない方が良い
    + 176x176と偶数なので、アナログ時計の場合上と左を1pxずつ更に空けて、中央を(88,88)とする
+ 画像について
    + amaztoolで8色以上の画像は減色してくれるがボケる
    + GIMPで8色のカラーパレットを作って8色にしてから、レイヤーで合成
    + 元画像：![fuu02.jpg](https://qiita-image-store.s3.amazonaws.com/0/241305/aea1461d-b514-7086-d192-4e28e6e0fdcc.jpeg)→減色済：![fuu02.png](https://qiita-image-store.s3.amazonaws.com/0/241305/c7b020d0-0c43-0e15-21f7-f0e322987be8.png)


　
###こだわり
+ 大きなアナログ時計
+ 数字とアイコンのみ（言語依存なし）
+ バッテリーアイコンは大きめ。数字は小さくてよいがほしい
+ 下記アイコンはON時のみ表示
    + Bluetooth接続有無
    + DoNotDisturb
    + アラーム
+ 歩数進捗度と達成アイコン
+ 歩数と心拍数
+ 数字は色で意味を持たせる
+ できるだけシンメトリー

###作品
1. アナログ＋デジタル１
    + 上中央に月-日
    + 下中央に時:分
    + 右上にバッテリー、左上にアイコン
    + 背景を黒ではなく夜空にした
    + ![analogNstep_packed_animated.gif](https://qiita-image-store.s3.amazonaws.com/0/241305/a347d5d2-6a61-d9f0-81ac-07cbe675f767.gif)
    + [こちら](https://amazfitwatchfaces.com/bip/view/?id=14506)からダウンロード可能です


2. アナログのみ
    + 上記から月・日・時・分を省き、歩数と心拍数をその位置に配置
    + 達成マークは歩数の下に出るように変更
    + 針を見やすく
    + ![analogS1_packed_animated.gif](https://qiita-image-store.s3.amazonaws.com/0/241305/04ddb943-2f6e-082c-283d-0678177b6677.gif)
    + [こちら](https://amazfitwatchfaces.com/bip/view/?id=14544) からダウンロード可能です
scope  :order_by_date , -> { order( date: :desc) }  の -> { }って何？

# -> { } は、lambdaの記法

参照 
[Rubyで使われる記号の意味（正規表現の複雑な記号は除く）](https://docs.ruby-lang.org/ja/latest/doc/symref.html)
> ->(a,b){ p [a,b] }
> Ruby1.9 で導入された lambda の新しい記法。以下と同じ。
> lambda{|a, b| p [a, b] }

# lambdaとは？
ブロックをインスタンス化したもの。 Proc.new（あるいは,proc）に近いが、
ブロックパラメータの扱いなど、少々異なる点がある。

参照
[Rubyの ブロック、Proc.new、lambdaの違い](https://qiita.com/ryo-ma/items/24c46592b45775e8644d)
[lambda と proc と Proc.new とイテレータの違い|class Proc](https://docs.ruby-lang.org/ja/2.1.0/class/Proc.html#lambda_proc)


# -> {}　をどう使えばいいのか
`scope :hoge, ->{ order(date: :desc) }`
と定義されてると、
(定義するのはmodelの中。Userテーブルで使用したいのであれば、user.rbに定義)

`User.hoge` は、
`User.order(date: :desc)` に等しい

クエリが楽にかけていいぞ。

↓↓↓↓↓↓↓ Your content
ブロックパラメータを渡したい時の指定方法は、lamdaに渡せば言い訳だから、
───────
引数を渡したい時の指定方法は、lambdaにブロック引数を渡せば言い訳だから、
↑↑↑↑↑↑↑ Edit request content

`scope :hoge, -> (time){ where('created_at > ', time) }`　

と言う風に定義すればいい


#### 参照先の記事に感謝
Django Girls Tutorial: Extensions のユーザー認証のところではまった話

#この記事について
[Django Girls Tutorial](https://tutorial.djangogirls.org/)
の続編（おまけ？）である、
[Django Girls Tutorial: Extensions](https://tutorial-extensions.djangogirls.org/)
を読んでいて少しはまったので、解決策を備忘として書く。

環境
・python3.6
・Django2.1
・Ubuntu18

#何が起こったか
上記 Django Girls Tutorial: Extensions の中の
[Homework: Adding security to your website](https://djangogirls.gitbooks.io/django-girls-tutorial-extensions/en/authentication_authorization/)
を読んでいた。
このチャプターの内容は、
・本編で作ったブログサイトにログイン・ログアウトの機能をつける
・ログイン中の人しか記事の作成・編集・削除ができないようにする
というもの。
一番最後のところで、ログイン・ログアウト画面のパスを追加するために
mysite/urls.pyを下記のように変更したところエラー

```python:mysite/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
from django.contrib.auth import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
    path('accounts/login/', views.login, name='login'),
    path('accounts/logout/', views.logout, name='logout', kwargs={'next_page': '/'}),
]
```

（Django Girlsのサイトでは上記のように path() は使わず url() と正規表現でパスを指定しているが、Django2 ではパスを指定する際に正規表現ではなく path() を使うといいよとのことなので path() を使うようにしている。
[Django2.0以降の変更点で気づいたポイント:path設定 "path"を使ったinclude](https://qiita.com/k_mawa82/items/49b55831d325a78bc866)）

コンソールに書かれたエラー内容が

```
AttributeError: module 'django.contrib.auth.views' has no attribute 'login'
```

とのこと。django.contrib.auth.views が login の属性を持っていないらしい。
上記の文字列でググると stack overflow の記事
[AttributeError: module Django.contrib.auth.views has no attribute](https://stackoverflow.com/questions/47065438/attributeerror-module-django-contrib-auth-views-has-no-attribute)
が出てきたが、真似してみるも上手くいかず。
#解決方法
最終的に
[Django2 でユーザー認証（ログイン認証）を実装するチュートリアル -2- サインアップとログイン・ログアウト](https://it-engineer-lab.com/archives/544)
を参考にして

```python:mysite/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
    path('accounts/', include('django.contrib.auth.urls')),
]
```

とすると動いた。
もともとDjango側でユーザー認証用のurlsが用意されているっぽい。
Django2になって仕様が変わったのだろうか。
Linuxに特定のバージョンのcmakeをインストール

以前、自分用に書いたメモをさらします。

- 環境
  - Ubuntu16.04 LTS
  - cmake-3.7.2のインストール

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

### 既存のcmake削除
もし、すでに別のバージョンのcmakeが入っていれば以下のコマンドで削除します。

```
$ sudo apt remove cmake
```

### ダウンロード
まずは公式サイトから特定のバージョンのcmakeをダウンロードします。

- <a href="https://cmake.org/download/">download - cmake</a>

ここで下にスクロールすると"Older Releases"が見つかるのでそのリンクからとびます。（下図）

![cmake_older_releases.png](https://qiita-image-store.s3.amazonaws.com/0/195174/c86580bd-b45d-77a2-b6a1-d22ec09e2513.png)




以下のような[ページ](https://cmake.org/files/)に繋がるとおもうのでそこから好きなバージョンを選択して進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/36c0d618-d900-67a5-b7dd-c1b89af8b1a7.png)


Linuxにダウンロードする際は対応のものを選んでダウンロードします。
ここではシェルスクリプト(`cmake-3.7.2-Linux-x86_64.sh`)のみをダウンロードしてみます。
ちなみに後でわかる通りこのシェルスクリプトは`.tar.gz`ファイルを解凍したものを生成するので`.tar.gz`ファイルをダウンロードしても問題ないです。

![download_files.png](https://qiita-image-store.s3.amazonaws.com/0/195174/f975305f-57fe-ac17-eac1-27ebc9402f94.png)


```
$ chmod +x cmake-3.7.2-Linux-x86_64.sh                             # 実行権限を付与
$ sudo ./cmake-3.7.2-Linux-x86_64.sh                               # 実行してディレクトリを生成する
...
--続きます--                                                        # qを押す
Do you accept the license? [yN]: 
y                                                                  # y
By default the CMake will be installed in:
  "/home/pollenjp/Desktop/cmake-3.7.2-Linux-x86_64"                # (デフォルトでは実行したディレクトリに生成される)
Do you want to include the subdirectory cmake-3.7.2-Linux-x86_64?
Saying no will install in: "/home/pollenjp/Desktop" [Yn]: 
y                                                                  # y

Using target directory: /home/pollenjp/Desktop/cmake-3.7.2-Linux-x86_64
Extracting, please wait...

Unpacking finished successfully
```

引き続き以下を実行

```
$ sudo mv cmake-3.7.2-Linux-x86_64 /opt                     # 生成したディレクトリを/opt以下に移動(移動しなくてもよい)
$ sudo ln -s /opt/cmake-3.7.2-Linux-x86_64/bin/* /usr/bin   # シンボリックリンクを生成して完了
```



### 確認

```
$ cmake --version
cmake version 3.7.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
```


## 参考
- <a href="https://askubuntu.com/questions/829310/how-to-upgrade-cmake-in-ubuntu"> How to upgrade cmake in Ubuntu</a>
「アウトプット大全」を読んだ感想と身につくスキル

# 目次
1. はじめに
2. 読書感想
3. 成長を加速させるオススメ方法3選
4. アウトプット力を高める7つのトレーニング術

# はじめに
この記事は、私が初めて投稿するものです。これから、週2ペースで本を読んだ感想や、技術の記事を書いていきますのでどうぞよろしくお願いいたします。

# 読書感想
この本を読む前の私は、普段からあまり本を読むという習慣がありませんでした。
仕事でもっと成果を出せるように、とりあえずビジネス書を読んでみようと、
この本を購入したのですが、想像以上に知らないことへの気付きが本に詰まっていました！！
気付き=成長という定義を知ることができたので、これからは月２冊のペースで本を読み、
ブログに載せていこうと思います。


# 成長を加速させるオススメ方法3選
### １. 目標を書く
###-> 具体的な「実現する目標」を立てる

難しすぎず、簡単すぎない程度の目標が脳科学的に、
ドーパミンを発生させてくれるそうです。
また、達成した目標に対して、定期的に評価し、
フィードバックを心がけてください。
### 2. Todoリストを書く
###-> 朝一でやる、1日で最重要な仕事

Todoリストは、「1日の仕事の設計図」です。
今日1日の仕事の流れを確認し、
効率の良い仕事の割り振りを設計しましょう。

### 3. 気付きをメモする
-> アイデアを逃したくなければ、勝負は30秒

「すごくいいアイデアを思いついた！」、でも3分後には、
すっかり忘れてしまった...なんていうことは、しょっちゅうあると思います。
些細なことでも気付きを得たら、それはあなたの「自己成長」そのものです。
できれば30秒以内、遅くても1分以内にメモを取るように心掛けましょう。

# アウトプット力を高める７つのトレーニング術
### 1. 日記を書く
（１）アウトプット、書く能力が高まる
（２）自己洞察力、内省能力、レジリエンスが高まる
（３）「楽しい」を発見する能力が高まる
（４）ストレスが発散される
（５）幸せになる
### 2. 健康について記録する
（１）体重の記録
（２）その日の気分
（３）睡眠時間
### 3. 読書感想を書く
（１）結晶化された知識を得られる
（２）時間を獲得できる
（３）仕事力がアップする
（４）健康になる
（５）頭がよくなる
（６）人生が劇的に変化する
（７）飛躍的に自己成長できる
（８）楽しい
### 4. 情報を発信する
（１）フィードバック効果が高い
（２）文章が上達する、アウトプット力が鍛えられる
（３）緊張感が出る
（４）情報と人が集まる
### 5. SNSに書く
（１）交流を楽しむ
（２）毎日投稿する
### 6. ブログを書く
（１）独自ドメインは必須
（２）毎日更新
### 7. 趣味について書く
（１）自分の得意分野について書く
（２）マニアックな記事ほど反応は高い
（３）「感想」「意見」「気付き」を書く
（４）読者の「感情」と「行動」を動かす
小さな小さなプルリクエストを大きな大きなリポジトリに通した

# 何を言いたい？
この世界はどんなに小さな事でも、大きなリポジトリでも、issue立てて、Pull Request出せばちゃんとコミットできる優しい世界でした。（少なくとも今回は）
なので皆でいい世界を作りましょう！

# 何をしたの？
### material-uiにプルリク通しました（たった1行の変更）

- **スタイルのバグ修正**

具体的には、モバイルかつ複数選択の場合においてのみ、ListItemを選択してもbackground-colorが変わらないバグでした。

##　どうやって通したの?
#### issueを立てた

直らないと困ってしまう私は、google翻訳と相談しながら恐る恐るissueを立ててみました。
https://github.com/mui-org/material-ui/issues/12960


#### 返事が来た
そうすると1日もしないうちにmaterial-uiのいつもの人（一番のコミッター）から返信が来ました。
**「issueの報告ありがとう！デグレってるね〜こうすれば直ると思うよ！やる？」(意訳)**

返事が来てしかも直し方まで教えてくれました。**これはコントリビューターになるチャンス！**
すぐさま:thumbsup:を押しました。

#### Pull Requestを出した
リポジトリをForkして、修正して、ローカルで確認して。。。Pull Request作成！
https://github.com/mui-org/material-ui/pull/12976

#### Mergeされた
PRを作成してものの数時間でマージされました。

## 何に気をつけた？

- 当たり前のことですが、既存のissueと被りが無いことを確認しました。
- 英語が下手くそなので、issueではどうやったら再現するのか、何が問題なのかだけをできるだけ簡潔に書きました。
- Pull Requestではタイトルや、commitメッセージの書式を他と合わせることに気をつけました。

今回はissueの書き方、commitメッセージ、Pull Requestの書き方がしっかり決まっていたので、それに従えば簡単でした。

大きいリポジトリを管理している人たちは忙しいでしょうから、どこが・どんな時に・どんな風におかしいのかを確実に書くことで反応してもらえる確率は上がると思います。


## 最後に
こんなエンジニアの端くれでも大きなリポジトリに足跡を残すことができました。エンジニアの世界は優しい。
Blockchain Peer-to-Peer

###Peer-to-Peerの意味
各ピアはインターネットで各コンピューターに接続しています。ファイルはセントラルサーバがなくても、システムを直接共有がすることができます。

###Blockchain Peer-to-Peerの意味

マイナーは自分でネットワークを作っています。マイナーは互いに通信して、ほかの人の取引を承認しています。そして新しいブロックをつけています。

中抜きは取引で言うことができない。ブロックを追加するためにはマイナーの承認が必要。
WSL + Ubuntu で Docker を使う

2018/10/06 に動作確認
Windows10 Home  October 2018 Update

# Ubuntu の入手

Microsoft Store から 『Ubuntu 16.04 LTS』 を入手

他に Microsoft Store から入手できる 『Ubuntu』 や 『Ubuntu 18.04 LTS』 では Docker を起動することができなかった。

* 『Ubuntu』 アプリのバージョンは 2018/10/06 現在 18.04 LTS
*  18.04 LTS でも Docker を古いバージョンにすればいけるらしい？詳細不明

```bash
$ head -n 2 /etc/os-release
# NAME="Ubuntu"
# VERSION="16.04.5 LTS (Xenial Xerus)"
```

# Docker のインストール

管理者権限で 『Ubuntu 16.04 LTS』 を起動して以下のコマンドを実行する。

```bash
$ sudo apt update && sudo apt upgrade
$ sudo apt install docker.io
$ sudo usermod -aG docker $USER
```
---
バージョン確認

```bash
$ docker -v
# Docker version 17.03.2-ce, build f5ec1e2
```

# Docker の実行

Docker サービスの起動

```bash
$ sudo cgroupfs-mount
$ sudo service docker start
# * Starting Docker: docker
```
---
Docker サービスの起動確認

```bash
$ sudo service docker status
# * Docker is running
```
**管理者権限で実行していないとサービスが起動しない**

---
コンテナ起動

```bash
$ docker run hello-world
# Unable to find image 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# d1725b59e92d: Already exists
# Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
# Status: Downloaded newer image for hello-world:latest
#
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
#
# To generate this message, Docker took the following steps:
# 1. The Docker client contacted the Docker daemon.
# 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
#    (amd64)
# 3. The Docker daemon created a new container from that image which runs the
#    executable that produces the output you are currently reading.
# 4. The Docker daemon streamed that output to the Docker client, which sent it
#    to your terminal.
#
# To try something more ambitious, you can run an Ubuntu container with:
# $ docker run -it ubuntu bash
#
# Share images, automate workflows, and more with a free Docker ID:
# https://hub.docker.com/

# For more examples and ideas, visit:
# https://docs.docker.com/get-started/
```
成功
(docker: Got permission denied ~ が出力された時は sudo つける)

---
**Ubuntu 18.04 LTS で Docker サービスの起動操作を行っても起動しない**

```bash
$ head -n 2 /etc/os-release
# NAME="Ubuntu"
# VERSION="18.04.1 LTS (Bionic Beaver)"

$ sudo cgroupfs-mount
$ sudo service docker start
# * Starting Docker: docker

$ sudo service docker status
# * Docker is not running

$ docker run hello-world
# docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
# See 'docker run --help'.
```
# 各コンテナの起動確認

Arch Linux

```bash
$ docker run base/archlinux head -n 1 /etc/os-release
# NAME="Arch Linux"
```

CentOS

```bash
$ docker run centos cat /etc/redhat-release
# CentOS Linux release 7.5.1804 (Core)
```

Ubuntu

```bash
$ docker run ubuntu head -n 2 /etc/os-release
# NAME="Ubuntu"
# VERSION="18.04.1 LTS (Bionic Beaver)"
```

起動した
【GAS】ファイルをゴミ箱へ移動させる

GAS公式ドキュメント
https://developers.google.com/apps-script/reference/


ゴミ箱へのファイル移動ではなく、ゴミ箱属性の付与という考えらしい

```
var file = DriveApp.getFileById("hogehoge");
file.setTrashed(true);
```

※ただし、この操作を行えるのは自分がアクセスできるファイルのみ
共有フォルダ内の不要ファイル一括削除を行いたい場合は、共有フォルダ内に「ゴミ箱」用フォルダをつくり、そこへのファイル移動を行うことになる
景気ウォッチャーの景気判断理由集を取得するAPIをつくった

最近、景気ウォッチャーの景気判断理由集を利用したテキストマイニングがわりと行われているみたいで、自分もやってみようと思って調べたらデータの取得が結構面倒くさかったので簡単に取得できるAPIをつくってみました。

# インストール

練習も兼ねてpypiに登録しました。

```bash
pip install econ-watcher-reader
```

もしくは、以下をクローンしてください。
https://github.com/si4141/scraper_for_economy_watcher

# 使い方

2018年1月から2018年5月までの景気判断理由集・現状を取得するには、以下のようにします。

```python
from econ_watcher_reader import EconomyWatcherReader
reader = EconomyWatcherReader()
data = reader.get_data(kind_='current', start=datetime.datetime(2018, 1, 1), end=datetime.datetime(2018, 5, 1))
```

すると、このようなDataFrameが返ってきます。

| industry | reason_type | region | is_tokyo | field | score | reason_sentence | date |
|:--|:--|:--|:--|:--|--:|:--|:--|
| 一般小売店［土産］（経営者） | お客様の様子 | 北海道 | False | 家計動向関連 | 3 | ２月は大雪に見舞われた月であったが、... | 2018-01-01 |
| 百貨店（売場主任） | 単価の動き | 北海道 | False | 家計動向関連 | 3 | 当社の店舗では、いずれも来客数の前年割れ... | 2018-01-01 |
| 百貨店（販売促進担当） | 単価の動き | 北海道 | False | 家計動向関連 | 3 | 全体的には来客数の減少や買上率の低下がみられた... | 2018-01-01 |
| スーパー（店長） | お客様の様子 | 北海道 | False | 家計動向関連 | 3 | 節約志向は依然としてあるが、... | 2018-01-01 |
| コンビニ（店長） | 単価の動き | 北海道 | False | 家計動向関連 | 3 | 前月に続き、客単価が前年よりも上がっている。... | 2018-01-01 |

元ファイルとの対応は以下の通りです。

- industry →「業種・職種」
- reason_type →「判断の理由」
- region → 地域
- is_tokyo → 2列目にある東京都を示す列
- field →「分野」
- score →「景気の現状判断」を0〜4に置き換えたもの
- reason_sentence →「追加説明及び具体的状況の説明」
- date → 対象月の月初（指標の発表日の前月の頭）


先行きのデータを取得するには、kind_に'future'を渡して、

```python
data = reader.get_data(kind_='future', start=datetime.datetime(2018, 1, 1), end=datetime.datetime(2018, 5, 1))
```
としてください。
先行きには、「判断の理由」(reason_type)がありません。元ファイルにないためです。

# その他

- [このページ](http://www5.cao.go.jp/keizai3/watcher_index.html)に掲載されているデータのみを取得します。
- 「過去の資料」にはまだ対応していません。
- 甲信越もまだ取得できません。
- コンストラクタで、[ここ](http://www5.cao.go.jp/keizai3/watcher_index.html)をスクレイピングしてデータ範囲などのパラメータを取得するようになってますが、importした時に取得すれば良い気がしてきたのでそのうち変わるかもしれません。


# 参考文献

景気ウォッチャーを使った研究たち

- 山本裕樹・松尾豊(2016)「景気ウォッチャー調査の深層学習を用いた金融レポートの指数化」，人工知能学会全国大会(30回). (Available at: https://doi.org/10.11517/pjsai.JSAI2016.0_3L3OS16a2)
-  五島圭一・山田哲也・高橋大志(2017)「畳み込みニューラルネットワークを用いた日次景況感指数の構築と資産価格変動との関連性」，日本ファイナンス学会第 25 回大会予稿集.
-  前田和馬(2017) 「大和地域AI（地域愛）インデックスを用いた地域経済分析」, (Available at: https://www.dir.co.jp/report/research/policy-analysis/regionalecnmy/regionalindex/20170713_012142.html)
-  大高一樹・菅和聖(2018)「機械学習による景気分析 ―「景気ウォッチャー調査」のテキストマイニング―」,  日本銀行ワーキングペーパーシリーズ 2018年, (Available at: https://www.boj.or.jp/research/wps_rev/wps_2018/wp18j08.htm/)
Nature Remo の Remote API を実行してセンサー情報をとってみた

# Nature Remo の Remote API を実行しセンサー情報をとってみた
## Nature Remo の利用状況
2018年3月に Nature Remo を購入し、Google Home mini, Amazon echo dot を接続して使っています。10年近く前の家電なのに、音声でON/OFFできるようになっただけで、急に新しくなった感があります。

使い始めた頃は、「アレクサ! 電気を付けて」「OK Google!テレビをつけて 」と、面白がって使っていましたが、慣れてくるとつまらなくなり、APIを使ってデータを取ってみようと考えるようになりました。
(温度、湿度、照度などが、アプリで見られることを知らなかったというのも、動機の１つです)

参考: アプリでは、このように温度、湿度、照度を確認できます。
<img width="375" alt="IMG.png" src="https://qiita-image-store.s3.amazonaws.com/0/147690/6bec2be5-4003-657c-b751-2a40fca588d6.png">

ちなみに、Nature Remo を使い始めた頃は「アレクサ」の方が、「OK Google」よりも呼びやすいため、Amazon echo dot の方が出番が多かったのですが、Amazon echo dotをテレビの近くに置いているためか、音声を拾わないことが多いので、「OK Google」と使うことが増えています。

## Nature Remo の Remote API の実行方法
Remote API については、既に有用な記事があるので、これらの記事を参考に実行してみることにします。

リンク
[NatureRemoのAPIを活用する準備](https://qiita.com/onm/items/8462b5b792132f42336d)
[Nature Remo で温度超過時にアラート通知をする](https://qiita.com/magaming/items/47739e13aec22fea60f4)

## 実行イメージ 
見やすくするために改行を加えています。また一部の値などを修正しています。

```curl 
C:\Users\user01\Desktop\>curl.exe -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer HOgeHo3eH0gEHog3h0g3" 
  [{"name":"Remo のなまえ "id":"h0ge-h0ge-hoge-1234-e123456789", 
    "created_at":"2018-05-09T08:32:35Z",
    "updated_at":"2018-07-24T10:57:26Z", 
    "firmware_version":"Remo/1.0.62-gabbf5bd", 
    "temperature_offset":0, 
    "humidity_offset":0, 
    "users":[{"id":"h0g3fc69-4413-4aff-8b1e-44e93135dd02", 
              "nickname":"ニックネーム ",
              "superuser":true"}], 
    "newest_events":{"hu":{"val":60,
                           "created_at":"2018-07-24T13:39:15Z"}, 
                     "il":{"val":238.6, 
                           "created_at":"2018-07-24T09:32:39Z"},
                     "te":{"val":26,
                           "created_at":"2018-07-24T13:45:01Z"}
                    }
   }]
C:\Users\user01\Desktop\>

```

このような感じで、APIを実行すると、情報を取得します。
APIを実行して取得できるのは以下の値。
　温度  0.1 ℃ 刻み
　湿度  1% 刻み  (2019年9月 変更)
　照度  1～255?  0.1 刻み?


##温度(te)
0.1℃単位。
校正値 -5℃, -4℃, -3℃, -2℃, -1℃, 0℃, +1℃, +2℃, +3℃, 4℃, +5℃ 


##湿度(hu)
1%単位
校正値は -20%, -15%, -10%, -5%, 0%, +5%, +10%, +15%, +20%

2019年9月に 10%単位から 1%単位に、
構成値も 10% 刻みから 5%刻みに変わったようです。
(うちでは 2019年9月5日から変わっていました)


##照度(li)
数値は 1～255 で、
Nature Remo のルールで指定できる内容から、以下のようなもの。
　暗い       1～50
　薄暗い　  51～127
　薄明るい 128～205
　明るい　 206～255

夜の部屋で、照度がどのぐらいの数値を取るのか確認してみました。
 電気無し： 1桁。
 隣の部屋の電気がついている状態： 80ぐらい
 部屋の電気を付けた状態： 240ぐらい

校正値は無し

##人感センサー、騒音レベル
APIではとれないと思っていたら、細かく調べた方がいらっしゃいました。
人感センサーは、動く熱源の有無をチェックしているようです。

リンク
[Nature Remoの人感センサーは、「動く熱源」を感知してる？【まとめ】](https://nanisore-blog.com/906/)

## APIを使ってみた感想(APIのメリット)
・温度、湿度、照度を見られる
 アプリで見られるのでAPIを使わなくても十分。
 当初はアプリを知らなかったため便利だと思っていた。

・温度、湿度、照度を使って家電を操作できる
「暗くなったら電気をつける」といったことは、「ルール」を使えば簡単に設定できる。APIを使わなくてできる。
もっと複雑なルールでもIFTTT連携でできそう。

APIだからできることを考えてみたところ、API取得したデータに、時刻情報も含まれるので、継続的に取得してグラフ化というような使い方もできるはずなので、今後そういうことを試してみたいと思っています。
UnityでRiderを使う

思いの外すんなり移行できて、快適です。:raised_hands:
Visial Studio for Macを試した時よりだいぶ楽。

## 環境情報

- Mac High Sierra
- Unity 2018.2
- Rider 2018.3 EAP

## 手順

- [ここ](https://www.jetbrains.com/rider/eap/)からダウンロード
- dmgをダウンロードしたら手順に沿ってインストール
- Unity > Preferences > External Tools > Eternal Script Editor > Browse.. からJetBrains RIder-EAPを選択

## ハマりどころ

既存のプロジェクトに使用する時はRiderのOpen Solution or Projectで一度開いてあげる必要がある。
（Unity系のクラスを上手く読み込んでくれない。）

C#6.0の記法がエラー扱いになる。
https://rider-support.jetbrains.com/hc/en-us/community/posts/205966564-C-6-Isues-

「Rider 2018.3 EAP」にアップグレードしたらCache作成に時間がかかる。
（これは待つしかなかった。）
トラストプロトコル (Trust Protocol)

トラストプロトコルはブロックチェーンテクノロジーを定義します。コンピューター科学のプロトコルは情報を通信するための標準的な規格を提供します。ブロックチェーンは情報を分権化して、ハッシングでデータをチェーン化するので、信頼を確立します。
GAE on node.js v8の、関数の外のグローバル変数について

[これ](https://qiita.com/fumihiko-hidaka/items/3a3911274262eb3beab1)の続き

GCPのCloud Functionsでは、関数の外にあるグローバル変数は、立ち上がっているプロセス内で使い回しのできる存在でした。

> グローバル変数を使用して将来の呼び出しでオブジェクトを再利用する
> Cloud Function の状態は、将来の呼び出しのために必ずしも保持されるわけではありません。しかし、Cloud Functions が以前の呼び出しの実行環境をリサイクルすることはよくあります。変数をグローバル スコープで宣言すると、その値は再計算せずに後続の呼び出しで再利用できるようになります。
> 
> この方法では、関数の呼び出しごとに再作成するためコストが高くなりがちなオブジェクトをキャッシュに保存できます。このようなオブジェクトを関数の本文からグローバル スコープに移動して、パフォーマンスを大幅に向上することができます。次の例では、heavy オブジェクトを関数のインスタンスにつき 1 回だけ作成し、指定されたインスタンスに到達するまですべての関数呼び出しで共有します。
> 
> [グローバル変数を使用して将来の呼び出しでオブジェクトを再利用する](https://firebase.google.com/docs/functions/tips?hl=ja#use_global_variables_to_reuse_objects_in_future_invocations)

教えてもらった引用をペタリと。

では、おそらく同じ仕組みであろうGoogle App Engine on node.js v8 でも、グローバル変数を再利用できるんじゃないかと思い、試してみました。

# 制作物ッ！

https://github.com/fumihiko-hidaka/global-var-gae

# ソースッ！

```app.js
const express = require('express');
const app = express();

let count = 0;

app.get('/*', (req, res) => {
  count++;
  res.status(200).send(`count: ${count}`).end();
});

app.listen(process.env.PORT || 8080);
```

countを加算して、その結果をひたすら返すだけのプログラムッ！

# 動作確認ッ！

http://neko-tech-test.appspot.com/global-var-gae

いつもより多くカウントされております。
無事に再利用することができました:blush:
Microsoft Flowがバージョンアップしたけど、個人的にここは改悪なんじゃないのと思うところ

# 本記事について
Microsoft Flowも色々アップデートが実施されていて
使い勝手がよくなったりしている部分も多々ありますが
個人的にここは使い勝手が悪くなったとかそういうのをチョイチョイ
纏めていってます。
※使ったところからなので、ほかにも出てくることは多数あると思います。

# 条件追加方法について
今まではアクションの追加と同列に「条件の追加」というボタンがありました。
こんな感じでね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/31afcd96-2b43-6636-abf2-24d676000da4.png)

それが、今回のアップデートでこうなりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/578c836c-4c6e-cdef-fc58-e84f25098ef4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/8d37cea7-9d8a-afa6-e928-e59aa4777429.png)

ちょっとオペレーション数が増えたような気がします・・・(´；ω；`)

# SharePoint
なぜか、SharePointのアクションの
ファイルのコピーが二つになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/2d55d6a7-cd4f-73a7-7e72-2788e07591db.png)

非推奨がこれまで使ってたやつですね。
アクションの内容はこのようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/450968e0-53a7-0b60-2feb-7851a6f62471.png)

で、今回新しくなったファイルのコピーはこちらです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/1ea51d71-a46b-9a00-e65c-0c1bb0d7f421.png)

コピー先がフォルダー指定となってしまったため、リネームできなくなっています。
※ファイルフルパスを指定するとエラーで落ちます。
libpngを使ったc++ライブラリをiPhoneアプリに組み込む

C++ で書かれたstatic libraryをswiftで作成されたiosアプリに組み込む方法はたくさんの記事があるのでそちらを参照していただくとして、今回はlibpngを使った自作のC++ライブラリを組み込む方法を記載します。

**Swift からC++ライブラリを呼び出す方法**
swiftでc++の資産を使おう <https://qiita.com/tomnic/items/37ee52aa18dcb5c0b51e>

## 大事なポイント

知っている人は知っている話ですが、MacとiPhoneではCPUのアーキテクチャーが違う。下の構成がほとんどなのかな。  

* Mac:  X86_64  
* iOS:  arm64  

そのため、自作ライブラリや自作ライブラリで使っている外部ライブラリはarm64とX86_64でビルドしなくてはだめ。これを知らなくて結構苦労した。

## 自作ライブラリのビルド
C++のビルドはcmakeを使っていたため結構簡単にできる。流れは、cmakeでXcodeのプロジェクトを作成して、archintectureの設定をしてビルドし、最後はlipo コマンドでそれぞれのarchitecture用にビルドされたstaticライブラリをマージする。  

1. cmake projectのルートで下記を実行。Xcodeのプロジェクトが作成される。  

    ```
    cmake -G Xcode .
    ``` 

2. XcodeのBuild settingメニューでアーキテクチャーの設定をする（ただしこの設定を下だけでは各architecture用のlibraryは作成されない。
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/178776/18afc222-a884-f641-8c71-95fc0e9048bf.png)

3. 画面左上の出力モードを設定する。arm architecture用は Generic iOS Device、x86_64用はシミュレーター(deviceは何でも良い）を選択する。
     ![image.png](https://qiita-image-store.s3.amazonaws.com/0/178776/89aeeac8-55cd-6082-51cb-1aa8c1d6af3f.png)

4. ビルドを実行すると、arm64が./Release-iphoneosにX86_64は./Release-iphonesimulatorにstatic library [xxx.a]が出力される。

5. lipoコマンドで各ライブラリをマージする。例えば xxx.aとyyy.aをマージしてzzz.aを./Releaseディレクトリに保存したい場合には下記のようなコマンドを実行する

    ```
    lipo -output ./Release/zzz.a -create ./Release-iphoneos/xxx.a ./Release-iphonesimulator/yyy.a
    ```
6. マージされたstatic libraryをiOSアプリのプロジェクト内のライブラリのリンクがはられている箇所にコピーする。またobjective-Cから呼び出す関数のヘッダー情報が記載されたヘッダーファイルも、同様にiOSアプリのプロジェクト内のヘッダーのリンクがはられているディレクトリに保存する。

## zlibのarm64およびx86_64ビルド
私が作成したC++ライブラリではlibpngを使っているためlibpngもarm64対応する必要があります。またlibpngは内部でzlibを使用しているため、zlibもarm64対応する必要があります。xlibはxcodebuidコマンドでビルド、libpngは./configureに引数指定してビルドしました。

1. zlibのソースファイルを<https://zlib.net/>からダウンロードし展開する
2. 展開されたディレクトリに移動し下記を実行してXcodeのプロジェクトファイルを作成する

    ```
    cmake -G Xcode .
    ``` 

3. arm64、x86_64それぞれについて下記コマンドを実行してビルドする

**arm64**  

```console
$ xcodebuild -project "zlib.xcodeproj" -sdk "iphoneos" IPHONEOS_DEPLOYMENT_TARGET="7.0" ARCHS="armv7 armv7s arm64"  ONLY_ACTIVE_ARCH=NO clean build TARGET_BUILD_DIR="./install_zlib_arm64" -scheme="ALL_BUILD"
```

**x86_64**  

```
$ xcodebuild -project "zlib.xcodeproj" -sdk "iphonesimulator" IPHONEOS_DEPLOYMENT_TARGET="7.0" ARCHS="x86
```
AWS CLI の profile を追加する


# 結論
`aws configure --profile sample` みたいな感じで追加できる。

# 例

```bash
$ aws configure --profile sample
AWS Access Key ID [None]: XXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# ドキュメント

名前付きプロファイル - AWS Command Line Interface
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html

> 追加のプロファイルを設定するには、--profile オプションで aws configure を使用するか、または、config と認証情報ファイルへエントリを追加します。

# リファレンス

configure — AWS CLI 1.16.31 Command Reference
https://docs.aws.amazon.com/cli/latest/reference/configure/index.html

> You can configure a named profile using the --profile argument.

# 所感
エディタで `~/.aws/credentials`, `~/.aws/config` を編集するのは手間すぎる
Qiitaは「なに」を共有するサービスか

> Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」

という表記を目にしてちょっと気になったので記録

# コミュニティガイドライン

以下の通り明記されている

> プログラミングに関する再利用性・汎用性の高い情報が集まる場をつくろう
> 
> Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」ですので、再利用性・汎用性の高い情報が多く集まっている場をつくっていきたいと考えています。そのためには、記事を読むこと、記事を書くことを通して、読む側・書く側それぞれがお互いに関わり合って、再利用性・汎用性の高い情報を育てていきましょう。

コミュニティガイドライン - Qiita:Support
https://help.qiita.com/ja/articles/qiita-community-guideline

# トップページにおける表記

ちなみに未ログイン状態のトップページには以下のように表記されている

## ja

<img width="599" alt="Screen Shot 2018-10-11 at 21.32.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/300876/d2a0f3fc-f12c-0879-6fae-ff9808843853.png">

## en

<img width="599" alt="Screen Shot 2018-10-11 at 21.32.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/300876/fa2b953b-1128-f71e-6b57-d11342fc78d6.png">

# 所感

微妙な感じはあるけどこの中だと

> エンジニアリングに関する知識を記録・共有するためのサービスです

が良いかな

ここでいう

- プログラミング
- エンジニアリング 
- ソフトウェアエンジニアリング

みたいな言葉を厳格に定義するのもなんか違うと思うし


果たしてこの投稿自体はなにを共有しているだろうか



# 余談

個人的にはQiitaには芸能ネタや政治的思想といった投稿は一切無く技術者にとって本当にありがたいサービスだと思っており、だからこそというわけでは無いがタグの表記ルールやQiitaこうあるべきという題材には関心が高い。

例えば以下の投稿などはこれに該当する。

Qiitaのタグ名と正式名称の大文字小文字が一致していないと思われるもの一覧 - Qiita
https://qiita.com/mozukichi/items/93ea591500e9bbcb4040

Qiitaはxxxではない - Qiita
https://qiita.com/tag1216/items/4323ce146933c7892e77
MacBookのタッチトラックパッドが押せなくなった際の対処法

## MacBookのタッチトラックパッドが急に押せなくなった

現在も原因は分からないのだけど、急にトラックパッドが強押し出来なくなりました（押した感がなくなった）。
因みに、軽いタップなどはトラックパッドの設定でサイレントクリックをONにしていた為か可能でした。

## 対処法

こちらに書かれてるSMCのリセットというのを行うことで解消されました。
参照: [MacBookの感圧タッチトラックパッドが反応しない！場合の対処法](http://www.deers-of-jp.net/2016/07/14/macbook%E3%81%AE%E6%84%9F%E5%9C%A7%E3%82%BF%E3%83%83%E3%83%81%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%91%E3%83%83%E3%83%89%E3%81%8C%E5%8F%8D%E5%BF%9C%E3%81%97%E3%81%AA%E3%81%84%EF%BC%81%E5%A0%B4/)

やり方は簡単で、

- 一度システム終了
- ctrl + shift + optionを押しながら電源ON
- その後離して電源ON

これで無事解決しました！

Appleには原因となりそうなことがいくつか記載されていますが、果たしてどれが原因でこの状態になったのかは未だに不明です。
https://support.apple.com/ja-jp/HT201295

取り敢えず直ってよかったです。
【Vue-cliで簡単シングルページ作成】npm run devしたら”Cannot find module 'node-sass'”と怒られた件

# 【前提】Vue-cliとは
Vue.jsでアプリケーションをつくるための、コマンドラインインタフェース(CLI)にもとづく開発ツールです。

# 発生した事象
任意のディレクトリを作成し、

```
npm install -g vue-cli
```
vue-cliをインストール。

```
vue -h
```
でヘルプが表示されることを確認。

早速、

```
vue init webpack-simple sample
```

でsampleプロジェクトを作成。

```
npm install
```
をして

```
npm run dev
```
↓↓↓↓↓↓↓↓↓↓

```エラー
Cannot find module 'node-sass'
```

ここは単純に
```
npm install node-saas
```

で解決。

![スクリーンショット 2018-10-11 21.32.41.png](https://qiita-image-store.s3.amazonaws.com/0/253605/c23ad97e-ebad-7b86-268f-8db38ba61424.png)

無事にWEｂサイトを構築できました。

イイネが来たら続き書こうかな。
Twitterで自分をfollowしてないfollowerをunfollowするJS

※動作と動作結果は非保証です。自己責任で使ってください。
TwitterAPIでもAPIを消費をすれば同様のことはできるはずですが、今回はブラウザだけでできます。
日本語では出てこなかったので書きました。

https://twitter.com/following に移動

コンソールを開く
Chrome press ctrl + shift + J
Firefox press ctrl + shift + K
Safari Press ctrl + alt + I

下記スクリプトで画面を一番下までスクロールさせる

```js
setInterval(function() {
 window.scrollTo(0, document.body.scrollHeight);
 }, 2000);
```

画面のスクロールが終わるのを待ち下記スクリプトを実行
※動作と動作結果は非保証です。自己責任で使ってください。

```js
$('.ProfileCard-content').each(function(){
 var status = $(this).find('.FollowStatus').text();
 var unfollowButton = $(this).find('.user-actions-follow-button');
 if(!status){unfollowButton.click();
 }});
```

以上です。自分のアカウントはこれでfollow数を調整できました。
※動作と動作結果は非保証です。自己責任で使ってください。


【参考】
https://www.techvows.com/follow-unfollow-all-twitter-followers/
ファイルから行頭が空白文字で始まる行を読み込む

# 先頭に複数の空白文字が並べられた文字列を読みたい

まさしく表題の通りなのだが、先頭に複数の空白文字をもつ文字列を読み込むので苦労したお話

# 目次的サムシング

1. **文字列**を読む場合
2. **ファイルから**文字列を読む場合（悩んだところ）


# 1. **文字列**を読む場合

これはとても簡単です。

ただ単に

```bash
echo "<文字列>"
```

と、文字列を`""`(ダブルクォーテーション）で囲むだけです。

ちなみに、この際文字数を読んでみると、正しく空白分も数えてくれます。

```bash
$ echo -n "       Boo" | wc -m
> 10
```

`echo`のオプションに`-n`をつけて改行を消しているのは、改行コードまで文字としてカウントされるのを防ぐためです（`-n`なしだと、結果は`11`になります。)


# 2. **ファイルから**文字列を読む場合

<details><summary>昔の記載ですが、無意味だったことがわかったので折りたたみました。</summary>

こちらが本題。
自分は`while read...`の方式でファイルを読み込むので、このパターンについて解説します。

## 先に結論

```bash
vi "+%s/^/|/g" "+w temp_file.tmp" "+q!" <your file>  # ファイルの先頭に文字を挿入
while IFS= read line; do
  # ... do your work with the $line
done < temp_file.tmp
rm temp_file.tmp
```

## ロジック解説的サムシング

結局、**結論としては`ファイルの先頭を非空白文字にする`こと**に行き着きました。
`echo`は、空白が続いていてもきちんとそのまま吐いてくれるのですが、`read`が曲者でした。
`IFS= read -r`等も試しましたが、空白を維持して読み込むことはできませんでした。
ただし*ファイルの先頭から続く空白文字を削除*するのであって*ファイルの先頭が空白文字でなければそのまま出力される*ため、「じゃあ先頭空白じゃなくせばいいじゃん」という発想に至りました(ここまで結構時間かかった)

この方法を使った際に内部で`$line`を使用する場合、`${line/|/}` [^1] のような形で先頭に追加した文字を排除する必要があります。

## 実装解説的サムシング

実装は大したことありません。
1. 元のファイルの全ての行頭に文字を挿入した一時ファイルを作成し
2. そこから`read`して使う際には行頭に増やした文字を削除する
3. 一時ファイルを削除する

というまぁなんて単純な構成...
ちなみにファイル名が一律であり衝突する可能性があるなど、まだ不具合というか至らない部分は多いです。（実際の使用例では、システムからしか呼ばないためスルーしている現状）

# 終わりに

調べてもわからず`echo`や`read`の色々なオプションを試しても効かず...何時間も食いました...
どなたかの役に立てれば幸いです

</details>

そんなに難しくなかったようです。コメント欄で @8x9 さんが指摘してくださいましたが、`read`に`IFS= `でIFSをしてあげれば読めました。
なんだこれ、めっちゃ簡単だったやんけ…

# 宣伝させて！！！

これを調べるきっかけになったのが、このライブラリの作成です
[Cj-bc/libdraw](https://github.com/Cj-bc/libdraw)

shellscript(bash)用ライブラリで、表示箇所を指定してのASCIIアート(及びテキストファイル一連）表示、その削除、画面消去、指定範囲の画面消去などができます。
~~正直大抵の人には大して使う機会はないとは理解している~~
まぁ興味あったらみてください〜！！
`bpkg`対応済みです。

[^1]: `${variable/<char a>/<char b>}`で、変数`variable`の値の中の初めの`a`を`b`に置換します。今回は、`b`に何も指定しないことで`|`を` (何もない)`に置換するつまり`|`を削除しています。ちなみに、*全ての`a`を`b`にしたい場合*は`${variable//<char a>/<char b>}`のように、変数名の後のスラッシュを二つにします。
Unityの初回起動を少しでも早くするために試したこと

# はじめに
Unityのプロジェクトジョインして環境構築するときに
初回起動に半日とかかかっていたのを改善するお話です。

# 環境
Unity 2017.4系
[CacheServer v6.1](https://github.com/Unity-Technologies/unity-cache-server)

Switch Platformの時間短縮などを調べたときによく出てくる
UnityのPreferencesから
General -> Compress Asset on ImportのチェックをOFF
の設定を行ってました。

# 問題の切り分け
キャッシュサーバ設定してるのに全然早くならない・・・。
以前のプロジェクトなら下記のようなダイアログが表示されていたが表示されず。

```
Downloading from cache server.
```

## ログの確認
キャッシュサーバからダウンロードされてるかを調べるためEditor.logを確認したところ

```
Not caching 'Assets/xxxx/xxxx/xxxx.png' because it was imported in uncompressed asset mode or had an error during import.
done. [Time: 142.273588 ms] 
```
のようなログが吐かれていた。

どうやら無圧縮設定またはエラーが出ていたためにキャッシュサーバへデータの送信がされてなかったようです。
Compress Asset on ImportのチェックをONにしてから
右クリック -> Reimportを行うと

```
Updating Assets/xxx/xxx/xxx.png - GUID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
 [CommitTime: 0.276411 ms]  done. [Time: 57.033940 ms]  (Uploaded to cache server.)
```
とキャッシュサーバへアップしたログが出力されます。

## キャッシュサーバが効いていることの確認
これでキャッシュが効いて初回起動が早くなるだろうと
Library配下のファイルをすべて削除してUnityの再起動を行ったところ
全然早くならない・・・。

AssetBundle化の対象ファイルが多すぎたので一度対象のディレクトリをリネームし

```
AssetBundle -> .AssetBundle
```
のようにリネームしてUnityが認識しないようにして再度Library配下を消して起動しなおしたところ
かなり起動が早いことが確認できた。

## キャッシュサーバ以外の原因の調査
インポート時に特定の設定を自動で行うために
AssetPostprocessorを使って処理をしていることが多いと思う。

AssetPostprocessorを通して生成されるファイルもバージョン管理されていたため
初回起動時のみAssetPostprocessorをコメントアウトなどで無効化することで
無駄なファイル処理を行わないようにすることで初回起動が無事早くなった。

# まとめ
- Compress Asset on ImportのチェックをONにする
- インポート時処理（AssetPostprocessor)の無効化

今回は上記2点で初回起動を早くするができました。

ある程度の規模のプロジェクトになると環境構築で丸一日潰れたりすると思うので
初回起動を少しでも早くして工数削減しましょう！
Babel7でwebpack.config.babel.jsを使う

## Babel7でwebpack.config.babel.jsを動かす

普通にやろうとすると、SyntaxError: Unexpected token importで怒られる。

@babel/registerを入れると解決します。
参考：https://github.com/webpack/webpack/issues/5960

私の設定を載せます。
concurrentlyとeslintは必須ではないです。

```json:package.json
{
  "name": "hello babel7",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "webpack": "webpack -w",
    "lint": "eslint src/*.*",
    "build": "webpack",
    "start": "concurrently \"npm run webpack\" \"npm run lint\""
  },
  "keywords": [],
  "author": "KAJIKEN <kajiken@kajiken.jp>",
  "license": "MIT",
  "devDependencies": {
    "@babel/core": "^7.1.2",
    "@babel/preset-env": "^7.1.0",
    "@babel/register": "^7.0.0",
    "babel-loader": "^8.0.4",
    "webpack": "^4.20.2",
    "webpack-cli": "^3.1.2",
    "concurrently": "^4.0.1",
    "eslint": "^5.6.1"
  },
  "dependencies": {}
}
```

```json:.babelrc
{
  "presets": [
    "@babel/preset-env"
  ]
}
```

```javascript:webpack.config.babel.js
import glob from 'glob';

export default {
  mode: 'development',
  //mode: 'production',
  entry: glob.sync('./src/*.js'),
  output: {
    path: __dirname + '/dist',
    filename: 'bundle.js',
    publicPath: '/',
  },
  devtool: 'source-map',
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                '@babel/preset-env',
              ]
            }
          }
        ]
      }
    ]
  }
};
```


eslintの設定はお好みで。

```json:.eslintrc.json
{
  "rules": {
    "quotes": [
      "off",
      "double"
    ],
    "linebreak-style": [
      "off",
      "windows"
    ],
    "semi": [
      "error",
      "always"
    ],
    "no-console": "off"
  },
  "env": {
    "es6": true,
    "browser": true,
    "node": true
  },
  "parserOptions": {
    "sourceType": "module"
  },
  "plugins": []
}
```
クロスコンパイルを考慮したbindgenの使い方

先日の記事の続き。
[RustでLinuxのinput eventをダンプする (bindgen使用)](https://qiita.com/tetsu_koba/items/8629953989cf4fea5942)

# ビルド時にbindgenするように変更

[bindgen users guide](https://rust-lang-nursery.github.io/rust-bindgen/)　のチュートリアルに従って、cargoでビルドするときにbindgenを実行するようにbuild.rsを作りました。
そのソースコードはgithubに置きました。

https://github.com/tetsu-koba/input_event_rs

# クロスビルドに対応できるようにbuild.rs を修正

ARM64向けにクロスビルドするとbindgenでエラーが発生するようになりました。
クロスビルドのときには参照するシステムのヘッダファイルもそれに応じて変える必要がありますが、それがbindgenに伝わっていないのが原因です。

環境変数 `SYSROOT`が設定されている場合には、それを`--sysroot=`に反映させるようにbuild.rs を書き直しました。

```rust:build.rs
extern crate bindgen;

use std::env;
use std::path::PathBuf;

fn main() {
    let mut builder = bindgen::Builder::default().header("wrapper.h");
    if let Ok(r) = env::var("SYSROOT") {
        builder = builder.clang_arg(format!("--sysroot={}", r))
    };
    let bindings = builder.generate().expect("Unable to generate bindings");
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}

```

`build_arm64.sh`では環境変数`SYSROOT` を設定するようにします。

```sh:build_arm64.sh
#!/bin/sh
TARGET=input_event
STRIP=aarch64-buildroot-linux-gnu-strip
export SYSROOT=/home/koba/arm64/buildroot-2018.05/output/host/usr/aarch64-buildroot-linux-gnu/sysroot/
export PKG_CONFIG_ALLOW_CROSS=1
cargo build --target aarch64-unknown-linux-gnu --release
cd target/aarch64-unknown-linux-gnu/release/
cp $TARGET ${TARGET}_g
$STRIP $TARGET
```

# 余談

build.rs に書くようなことは普通はshell scriptかMakefile に書くような気がします。
しかし、それらが一般的でないWindowsの環境でも統一しようとすると結局このようにRust自身で書くということになったのでしょうか。


# 関連

[rustのcargoでarm64 linux向けにクロスビルドする](https://qiita.com/tetsu_koba/items/d467f2b3c2bb8b816185)
VPC内に置いたElasticsearch Serviceに Docker のプロキシ経由でアクセスする

# 前例

* [VPCにあるAmazon Elasticsearch ServiceにALBを追加してKibanaだけPublicにする ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/make-public-kibana-amazon-es/)
    * ALBを立てて、ESSインスタンスのプライベートIPを指定する。
    * IPが変化したことをどうにか気付いて、ALBの設定を更新する必要がある。
* [VPCにあるAmazon Elasticsearch ServiceのKibanaだけPublicにするもう一つの方法 ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/make-public-kibana-amazon-es2/)
    * EC2インスタンスにKibanaを立てる。Kibana起動時に、ESSのエンドポイントを指定する。
    * EC2インスタンス立てるのかー。めんどくさいー。
    * Kibanaのバージョンとか気を使う必要がある。めんどくさいー。
* [VPC内に置いたElasticsearch ServiceにEC2のプロキシ経由でアクセスする \- Qiita](https://qiita.com/yutaro1985/items/4d3126ba142bf66ab1d1)
    * EC2インスタンスにNginxを立てる。proxy_passで、ESSのエンドポイントを指定する。
    * EC2インスタンス立てるのかー。めんどくさいー。

どれも一長一短。

# そこで docker-nginx-reverse-proxy

めんどくさいので、Dockerイメージつくりました。Dockerの実行環境は好きなものを使ってください。

* https://hub.docker.com/r/sasasin/docker-nginx-reverse-proxy/
* https://github.com/sasasin/docker-nginx-reverse-proxy

環境変数 PROXY_PASS に、ESSのエンドポイントURLを指定して、 sasasin/docker-nginx-reverse-proxy を動かしたら、そこにはKibanaが！

※ https://vpc-hogehoge-t2ytnyxqgkskoljq43kmimbcum.ap-northeast-1.es.amazonaws.com/ みたいなURL。 _plugin/kibana は付けない。付けるとESS側からのリダイレクトで怪しいことになる。
ズレた時系列データのヒートマップを上下に並べる。seabornで。

# 目的

- x軸方向（時間方向）にずれたデータを1つのヒートマップ上に並べて表示したい．
- そのために，データの整形を行う．

# 状況

- 複数のセンサからデータをサンプリング
- サンプリング周期は同じ
- 取得タイミングがずれている
- データ数が異なる

Ex.) 分散システムになっていて，それぞれのデータが中央に送られてくる．

ので，一筋縄ではいきません．


# データ整形からプロットまで

## データの読み込み（作成）

`pd.read_csv()` とかで読むけど，今回はダミーデータを使用します．

```python
# 時間のズレを作る
time_A = np.arange(5, step=0.01)
time_B = np.arange(5.1, step=0.01)

# 適当にばらつかせる
time_A += list(map(int, np.random.normal(scale=0.01, size=len(time_A))))
time_B += list(map(int, np.random.normal(scale=0.01, size=len(time_B))))

# 取得データ
data_A = np.sin(2*np.pi*time_A)
data_B = np.cos(2*np.pi*time_B)

# dataframeにまとめる
df_A =  pd.DataFrame({"time": time_A, "value": data_A}) 
df_B =  pd.DataFrame({"time": time_B, "value": data_B}) 
```


このときの`df_X`がサンプリングしたデータが纏められたDataFrameです．
行数はサンプリング数，列はその系統のデータ数+1(time)になります．


## それぞれのデータをマージする

```python
# 時間をマージして並べ替え

time = pd.concat([df_A["time"], df_B["time"]])
time = time.sort_values().reset_index(drop=True)

# tmp
new_data_A = []
new_data_B = []

# データが存在する場合はそのデータを，ない場合はNaNを突っ込んでおく
# for使わずにもっときれいにできそう
for i in time:
    new_data_A.append(df_A[df_A.time == i].value.values[0] if i in df_A.time.values else np.NaN)
    new_data_B.append(df_B[df_B.time == i].value.values[0] if i in df_B.time.values else np.NaN)

# 補完する
series_A = pd.Series(new_data_A)
series_B = pd.Series(new_data_B)

series_A = series_A.interpolate()
series_B = series_B.interpolate()
```


両方のデータを1つにまとめてしまいます．
任意のタイミングで両方同時にサンプリングされていることは保証されないことが前提条件になるので，足りないデータは補完しています．

この処理で，両方のデータは同じ軸上に並べることができるようになりました．

## プロットする

プロット用のDataFrameを作成，プロットします．

```python
df = pd.DataFrame(data=[series_A.values, series_B.values], columns=time)
sns.heatmap(df, cmap=sns.color_palette("Blues", 24))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131710/763975a6-3468-15c5-4500-4e4011ba338b.png)



# おわりに

ということで，2つのサイズやタイミングが異なる，しかしながら同じ軸で見たいデータをヒートマップで描くことが出来ました．
分散型のシステムなんかだとこういうこと結構あるんじゃないでしょうか．


# 残された問題

- x軸方向は等間隔で分割されるので，サンプリング周期がぶれるとズレる．
- forを回してるところ，pandasの機能をうまく使えばシンプルにかけそう（優先度低）
第35話 交点数8以下の結び目の個数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第35話です。

```math
\#\{nontrivaial\ knot|C(L)≤8\}=35
```

８つ以下の交点をもつ結び目は35通りあります。

![musubime.png](https://qiita-image-store.s3.amazonaws.com/0/985/5a79ffae-a740-1de1-ebed-6917ebc31647.png)

例えば上の図の輪は3箇所の交差があるので交点3の輪です。
しかし、右の輪は交点0の輪と同じ形とみなします。
左は紐が絡み合ってもし引っ張ったとしたなら結び目になってしまうでしょう。
しかし右は普通の輪に戻ってしまいます。
 
このように、交点8以下だと普通の輪に戻らない形が35通りあります。

表にするとこんな感じで、最小は3になります。
やはりというか、交点数が増えると種類数は爆発的に増えていきます。

| 交点数| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|個数| 1|0|0|1|1|2|3|7|21|49|165|

この結び目理論は、DNAやタンパク質の解析なんかに使われていますし、
ここから発展して電子基板の配置をどうすれば立体交差が最小化できるか、
というのにも繋がっていきます。