OmniAICreator/Qiita-1.07M huggingface dataset:
openFrameworksで指定ディレクトリ内のファイルをすべて読み込む

oFでアプリ作る際、とりあえず指定ディレクトリ内のファイル全部読み込みたいってなることがよくあります。
今回は、ofDirectoryを使ってmp3だけabc順に読み込む関数を作ってみました。


まずはofsoundPlayerをvectorで用意しておきます。

```c++:ofApp.h

std::vector<ofSoundPlayer> soundList;
```

bin/data以下に作成したsoundフォルダにmp3ファイルたちを入れて読み込みましょう。

```c++:ofApp.cpp

void ofApp::loadSound(){

    string dirName = "sound/";
    ofDirectory dir(dirName);
    dir.listDir();
    dir.allowExt("mp3");
    dir.sort();

    for(int i = 0; i < dir.size(); i++){
        ofSoundPlayer sound;
        sound.load(dir.getPath(i));
        
        soundList.push_back(sound);
    }
}
```

これで勝手に指定フォルダ内のファイルを読み込めるようになるはず。
CSVとか違うファイル形式も`allowExt`の指定を変更したらいけます。
DynamicSupervisorで子プロセスを増やしたり減らしたりする

# やりたいこと
- GenServerをたくさん作りたい
- UUIDなどで一意に管理したい

# 使うもの
- `DynamicSupervisor`
- `Registry`
- `GenServer`

# 実装

## プロセスを用意する

ここではGenServerを用意します。挨拶をする関数とクラッシュする関数を用意しました。
`start_link/1` 関数はあとで必要になります。`args`の使い方が適当ですが、今回は`name:`オプションだけが大事なのだ
`init/1` もいらないですが、書かなかったときのwarningが長ったらしいので書いておきます。

```elixir
defmodule GS do
  use GenServer
  
  def start_link(args) do
    opts = args |> Keyword.take([:name])
    GenServer.start_link(__MODULE__, args, opts)
  end

  def init(args), do: {:ok, args}

  def handle_call(:hello, _from, state), do: {:reply, "hello", state}
  def handle_cast(:crash, state), do: raise "Crashed"
end
```


## Supervisorをつくる

子プロセス(先程の`GS`)を立ち上げたり落としたりする関数を用意します
その際`Registry`を利用します
`:via` タプルをGSのnameオプションに渡るようにします

```elixir
defmodule DSV do
  use DynamicSupervisor
  
  @registry Registry.ViaTest
  
  def start_link(args), do: DynamicSupervisor.start_link(__MODULE__, args, name: __MODULE__)
  def init(_), do: DynamicSupervisor.init(strategy: :one_for_one)

  def add_child(name) when name |> is_binary do
    pid = child_process(name)
    spec = GS.child_spec(name: pid)
    DynamicSupervisor.start_child(__MODULE__, spec)
  end
  
  def remove_child(name) when name |> is_binary do
    [{pid, _}] = Registry.lookup(@registry, name)
    :ok = DynamicSupervisor.terminate_child(__MODULE__, pid)
    
    ## ↓これ要りませんでした！@melponさんありがとうございます
    # Registry.unregister(Registry.ViaTest, name)
  end
   
  # :via tupleをつくる
  def child_process(name), do: {:via, Registry, {@registry, name}}
end
```

## あそぶ

```elixir
# Setup
Registry.start_link(keys: :unique, name: Registry.ViaTest)
DSV.start_link([])

# Create child with unique name
name = "todoroki"
DSV.add_child(name)

# communicate!
name |> DSV.child_process |> GenServer.call(:hello)  # Hello

# crashes and restarts!
name |> DSV.child_process |> GenServer.cast(:term)   # :term

# communicate again!
name |> DSV.child_process |> GenServer.call(:hello)  # Hello

# remove the child
DSV.remove_child(name)

# now you can not talk
name |> DSV.child_process |> GenServer.call(:hello)  # エラー
```

# 所感

- DynamicSupervisorの子Workerを立ち上げたり消したりできた
- `DynamicSupervisor.terminate_child/2` も `{:via, ...}` タプルでできればいいのになーと思った
  - （DynamicSupervisor自体には子のpidを取ってくる方法がないので）
GoogleAppsScriptのCacheService.getUserCache()の"User"

GoogleAppsScriptで予約を行うLINE BOTを作っている。

予約時刻などのユーザの入力情報を一時的に保持するためにGASのCacheServiceを使っているのだが、複数のユーザーがこの予約BOTを使っていると、タイミングによっては、それぞれユーザーの入力情報がごっちゃになって訳わからんことになるという問題が発生した。

CacheServiceのドキュメントの下記の部分を読んで、getUserCache()を使えばOKだと思っていたのだけど、よく考えると、the current userって、BOTを使っているLINEの個別ユーザーじゃなくて、LINE APIサーバー自体のことだな、と気づく。

| getDocumentCache() | Cache | Gets the cache instance scoped to the current document and script. |
|:--|:--|:--|
| getScriptCache() | Cache | Gets the cache instance scoped to the script. |
| getUserCache() | Cache | Gets the cache instance scoped to the current user and script. |

(https://developers.google.com/apps-script/reference/cache/)

そこで、
下記のような関数を作って、GAS内部で処理をするようにしたら、
複数人同時に処理をしても問題なくなった。

```js
// 指定したユーザーIDとキーに対する値を返す
// 
// 指定したkeyに対するvalueがないと null が返ってくる
function cacheGet(keyStr, cache, userId){
  var value;
  var key = keyStr + "-" + userId;
  value = cache.get(key);
  return value;
}

// 指定したユーザーID＆キーに対して指定した値を入れる
// 
function cachePut(keyStr, valueStr, cache, userId){
  var key = keyStr + "-" + userId;
  cache.put(key, valueStr);
}

// 指定したユーザーID＆キーに対する値を削除する
// 
function cacheRemove(keyStr, cache, userId){
  var key = keyStr + "-" + userId;
  cache.remove(key);
}
```


めでたしめでたし。
機械学習論文読みメモ_134

[A Unified Approach to Interpreting Model Predictions](https://arxiv.org/abs/1705.07874)
様々なアプリケーションにおいてモデル予測の理由を理解する事は重要である。
しかし、高性能なモデルは多くの場合複雑な構造のモデルから成り立ち、
その理解は難しくなる。
従来様々な、こうした複雑なモデルに対する予測理解を行う手法が提案されてきた。
しかしそれら手法の間の関係は不明瞭で、対象モデルに応じて最適な理解手法は
変わってくる。
本論ではこの問題に対して、より統一的なフレームワークとしてSHAPを提案する。
SHAPは各入力特徴に対して、ある予測に関する重要度をassignする。
SHAPは各特徴の重要度に関する重み付き和として複雑なモデルを近似する。
このモデルはexplanation modelと呼び、SHAPはadditive feature attribution modelとしてこれを構築し、
従来の提案手法を一般化している。
ゲーム理論に基づき、このすべてのadditive feature attributionモデルクラスに対しては唯一の解を持つ事が示せる。

[CyCADA; Cycle-Censistent Adversarial Domain Adaptation](https://arxiv.org/abs/1711.03213)
Domain adaptionにおいてドメイン分類器を騙すような画像を生成させる
adversarial adaptation modelを用いる事でドメイン不変な
特徴を抽出する事が出来る。
この手法はしかし可視化する事が難しく、またpixel-level、あるいはlow-levelの
domain shiftに対応する事も難しい。
この問題に対して、従来研究ではさらにdomain間の再構成誤差を制約に加える
cycle consistencyを加える事で、ドメイン間の画像を合わせる事なく、
さらなる性能向上を可能にした。
本論ではさらに、pixel-levelとfeature-levelの表現に関して、
それぞれcycle consistencyを適用し、加えて特定のタスクに関する損失を組み合わせる
事でさらなる性能向上を実現した。

[Learning Sparse Neural Networks Through L0 Regularization](https://arxiv.org/abs/1712.01312)
deepnetに対する実際的なＬ０正則化手法を提案する。
Ｌ０正則化を行うことで、一部の重みが０となり、結果的に
ネットワークの枝刈りを行うことができる。
このような正則化は学習や推論を高速化可能で、
また汎化性能を向上させる事も可能である。
しかしながらＬ０項は微分不可なため、deepnetにそのままでは
入れ込む事が出来ない。
本論ではこれに対する手法として、
どのweightがゼロになるか選択が可能はnon-negative stochastic gates
を入れ込む事で実現する。
これは、パラメータに対してgateと呼ばれるbinary変数を掛ける。
このgateがonになる確率はベルヌーイ分布でモデル化する。
またこのbinary値をhard-sigmoid rectificationと組み合わせる事でsmoothingする。
そしてこのgateがonになっている数を制約として目的関数へ加える。
結果微分可能な形でＬ０型の制約を入れ込む事が可能になる。
Affinity PhotoでHDRのDNGをあつかうメモ

Adobe Lightroom mobileでHDRモードで撮影するとHDRのDNGが作られます。
とても手軽に本物のHDR画像が作れるのですが、本家はやる気がないらしくLightroomからexrやhdrに出力できません。
色々調べた結果とりあえず[Affinity Photo](https://affinity.serif.com/)でやる方法が[Affinity Photoのフォーラム](https://forum.affinity.serif.com/index.php?/topic/51063-going-from-hdr-dng-from-lightroom-to-exr-in-affinity-photo/)にありました。
これを軽くまとめた設定のメモ書きです。

まず **DNGを開く前** に現像アシスタントの設定を変更します。
![assistant.jpg](https://qiita-image-store.s3.amazonaws.com/0/103261/5acec802-f7b1-c3e1-b931-758de45ecc29.jpeg)
このRAW出力形式を32ビットHDRにすると、現像結果をHDR形式で他のペルソナへ持ち込むことができます。
なお1回変更すれば覚えてくれるので、すでに開いてしまった場合は変更して開き直しましょう。

それからOpenEXRで書き出す際には16bit浮動小数点数形式を使うオプションがあります。
![savesheet.jpg](https://qiita-image-store.s3.amazonaws.com/0/103261/7bd47621-eb9f-d20b-5ce3-81c30ae6abbc.jpeg)
![saveoption.jpg](https://qiita-image-store.s3.amazonaws.com/0/103261/fcd16ce7-fa1a-7456-bd96-baa57b990389.jpeg)
Half Floatのプリセットを作っておいてもいいかもしれません。

試しにこの手順で作ったEXRをBlenderのCyclesで使ってみます。
とりあえずライトを置かずにemissionのテクスチャとして板に貼り付けてみると…
![untitled.jpg](https://qiita-image-store.s3.amazonaws.com/0/103261/1082cbd6-fbbb-e87c-a417-828679b3c89c.jpeg)
きちんと画像の太陽の部分の輝度が高くなっていることが見てとれます。

これでLightroom mobileで撮影したHDRを手軽に活用できそうです。
Windows Subsystem for Linuxにssh接続する

#はじめに

- Windows Subsystem for Linux(WSL)のターミナルは、コピー＆ペーストがし辛く、Tera-termで操作できないものかと思い立った。

# 前提
- Windows 10 pro バージョン1803
- Windows Subsystem for Linux(WSL)版ubuntu バージョン8.04 LTS (Bionic Beaver)

# 全体の流れ
1. インストール
2. コンフィグ設定
3. サービススタート
4. 対策
5. 補足

# インストール

- まず、openssh-serverをインストールする。

```
sudo apt install openssh-server
```

- 結果は以下の通り。
- 御免なさい。既に入っていました。確認してからコマンド打つのが正しいですよね。

```
Reading package lists... Done
Building dependency tree
Reading state information... Done
openssh-server is already the newest version (1:7.6p1-4).
The following packages were automatically installed and are no longer required:
  gyp javascript-common libc-ares2 libhttp-parser2.7.1 libjs-async libjs-inherits libjs-jquery libjs-node-uuid libjs-underscore libpython-stdlib
  libpython2.7-minimal libpython2.7-stdlib libssl-dev libssl-doc libuv1 libuv1-dev nodejs-doc python python-minimal python-pkg-resources python2.7
  python2.7-minimal
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
```

# コンフィグ設定
- パスワードでのログインを有効にしておく。

```
vi /etc/ssh/sshd_config
```

- コンフィグの内容を下記のように変える。

```
PasswordAuthentication yes
```

# サービススタート
- これで動くはず。

```
sudo service ssh restart
```

- 駄目だった。以下のようなメッセージが出る。
- RSAキーがないとな。

```
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
 * Restarting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
```

# 対策
- よろしい手動作成だ。

```
sudo ssh-keygen -A
```

- 以下のように出力されてキーが出来る。

```
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
```

- 再度、sshサービスを起動する。

```
sudo service ssh restart
```

- 以下のように表示されて無事起動。

```
 * Restarting OpenBSD Secure Shell server sshd            [ OK ]
```

- あとは、localhostでも、Windows機のIPアドレス指定でもばっちりteratermで接続できた。

# 補足
- `sudo ssh-keygen -A`は一度打てばよい
- Windows機を再起動した場合、サービスが停止した状態から始まる
- 重要なことに*sudo systemctl enableは効かない*ので、毎回、WIndows機起動時にはサービスを手動でスタートする必要がある
- このとき、sshdも立ち上がってないので、TeraTermは使えないので、簡単にサービスを起動できるシェルを作っておく

``` ~/service_start.sh
#!/bin/bash

service ssh start
service dbus start
service avahi-daemon start
service cron start
```

- 実行権限も忘れずに

```
chmod a+x service_start.sh
```

- これで、準備は完了。使い勝手が好みではない、標準ターミナルでも簡単にサービスを起動できる
- WSLの標準ターミナルを起動したら、以下を打てばよ

```
sudo ~/service_start.sh
```

- Enjoy WSL!
Spring Boot + Swaggerで生成したドキュメントのリクエストパラメータDescriptionを指定する

[Spring Boot + SpringFoxでSwaggerを利用してソースからAPIキュメントを生成する](https://qiita.com/NagaokaKenichi/items/b6d4d55a202e6a93d047)で投稿した内容の関連記事になります。

Swaggerで生成したドキュメントでGETリクエストのリクエストパラメータのDescriptionは、デフォルトではパラメータ名になります。以下の画像のような形です。
![aaaaa.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/acae4653-f708-1428-b4c6-87529bce58ea.png)


このDescriptionをもう少し分かりやすい内容にしたい、なんて時があるかと思います。以下の画像のような形です。
![dddd.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/c409f892-b859-c862-e801-361bc4ed04c6.png)

こんな時は、Spring Bootでは以下のように記載します。

```UserController.java
	@ApiOperation(value = "${UserController.getUser.value}", notes = "${UserController.getUser.notes}")
	public User getUser(@ApiParam(value = "ユーザID", required = false) @RequestParam("id") String id) {
		return new User(id, "ichiro");
	}
```

@ApiParam(value = "ユーザID", required = false)
の部分がそれにあたります。このように記載することで上記の画像のようなDescriptionとなります。

以上です。
Grafanaのフロントエンド開発環境を構築する (on Windows10)

# Objectives
Grafanaのフロントエンドを修正して遊ぶための開発環境を構築する。

Windowsだといろいろ面倒な手順があったりするのでやったことをまとめておく。基本的に下記ページの手順のままだけど若干変えているところあり。

* http://docs.grafana.org/project/building_from_source/

# Environment
  * OS: `Windows10`
  * node: `v8.11.3`
  * npm: `5.6.0`
  * yarn: `1.7.0`
  * git: `2.12.2.windows.2`

# Details
## Install GO
* https://golang.org/dl/
  * go1.10.3.windows-amd64.msi

## Install GCC
* http://tdm-gcc.tdragon.net/download
  * tdm64-gcc-5.1.0-2.exe

## Install node-gyp
`npm install -g node-gyp`

## Build the backend
```
set GOPATH=[absolute-path-of-work-dir]
go get github.com/grafana/grafana
cd src/github.com/grafana/grafana
go run build.go setup
```

## Build the frontend
```
yarn install --pure-lockfile
npm run build
```

## Run the backend
```
copy conf\defaults.ini conf\custom.ini
..\..\..\..\bin\grafana-server
```

* custom.ini
  * `app_mode = development`

## Run the frontend
`yarn start`

## Login to Grafana
`http://localhost:3333`

* Credential
  * username: `admin`
  * password: `admin`

# Configure InfluxDB as a data source
## Install and run InfluxDB
* https://portal.influxdata.com/downloads
  * influxdb-1.6.0_windows_amd64.zip
* `influxd.exe`

## Install and run Chronograf
* https://portal.influxdata.com/downloads
  * chronograf-1.5.0.1_windows_amd64.zip
* `chronograf.exe`

## Create a database via Chronograf UI
* http://localhost:8888
  * Connection String: `http://localhost:8086`
  * Username: `admin`
  * Password: `admin`
* Data Explorer
  * `CREATE DATABASE [db-name]`

## Add a data source via InfluxDB UI
* http://localhost:3333
  * Type: `InfluxDB`
  * HTTP URL: `http://localhost:8086`
  * Auth: `Basic Auth`
  * Basic Auth Details
     * User: `admin`
     * Password: `admin`
  * InfluxDB Details
     * Database: `[db-name]`
     * User: `admin`
     * Password: `admin`
手を動かしながら開発するとゴミソースができあがる

手を動かしながら短期間で一気に開発したら、知らぬ間にゴミソースができたって話です。

# きっかけ
4ヶ月くらい前に短期間でがーっと[Tracチケット管理ツール](https://qiita.com/yakipudding/items/cf7a97ff1dd0b98695c1)を作り、実際に運用して数か月たっていました。
チケット管理ツールとしてはある程度やりたいことができているので問題なかったのですが、メイン画面の表示が遅いなーとちょっと気になっていました。
久しぶりの個人開発だったし短期間で作っちゃったからソース汚かったしな、ちょうどこの3連休予定ないしちょっと直すかー、と思ってソースを見直してみました。

# すると…
そこには想像をはるかに超えたゴミソースがあったのでした。。。（思い出したくもない）

# なぜゴミソースができたのか？
* 設計をあまり詰めずに開発に着手してしまった
* そもそもがっつり1からの開発が久しぶりだった
* とりあえずいったん動くこと（メイン画面が表示される）を目標に開発をすすめた
* いったん動いたところから少しずつ機能を足していった
* 開発してバグを出しながらあーでもないこーでもないとその場しのぎで動くように改変を続けた

# その結果。。
* とりあえず動くがメソッド名はかなりてきとう
* 同じような名前のメソッドが乱立（Get〇〇Data、Get〇〇List、…みたいな）
* 類似メソッドなのに戻り値が違う、複数のメソッド分の働きをさせているなどメソッドの粒度がばらつく
* 知識不足・勘違いによる謎コードが多々あった
* とにかく可読性・保守性が低い

しかもたちが悪いのは、パット見ただけではなんとなくうまくかけていた（と思っていた）ため、いまのいままでソースが汚いことに気づかなかったことでした。（これは単純に頭悪い）

# どうすれば最初からうまく書けたのか
## コードレビューを受ける
普段から自分のソースを客観的に判断してもらうことが大切だと思います。
私自身はお恥ずかしながら転職するまでまともなコードレビューを受けたことがなく(転職は2月)、、、数か月前はなんとなく自分はうまく書けているという思い込みがありました。。
今思うととんでもないソースを自信満々に書いていたなぁと思います。
最近コードレビューを受けるようになり、自分のソースの悪い癖や可読性や保守性における「あるべき」ソースを学びました。
本などで読んでわかっていたつもりになっていましたが、指摘を受けることであらためて気づくことも多かったです。
またレビューを受けるからにはちゃんと調べて書かないと、という緊張感があったため、知識が向上したこともあるかもしれません。

## あとはとにかく経験する
自分で最初からうまく書くには、とにかく設計・開発・保守までをしっかりと通しで経験して身に着けるしかないなと思いました。
設計がうまくできていないと開発でその場しのぎの対応が増えますし、開発で保守性の低いコードを書くと保守で苦労するし、とすべての経験はつながっているからです。
いろいろな立場を経験することで視野がひろがり、「あるべき」ソースがだんだんとわかってくるのかもしれません。

## つまり経験がない人はとにかく小さな開発をたくさんするとよい
ここからはちょっと経験が浅めの人に対するアドバイスです
いきなり完璧なものを作ろう！とすると設計からハードルが高く、また開発もうまくいかずにリファクタリングどころかリリースまでこぎつけられないこともあると思います。
車輪の再開発でも既存の製品の劣化版パクリでも何でもよいので、とりあえず何か開発して運用するまで行うことが第一歩だと思います。
そのあとでリファクタリングまでことで、自分の間違いやソースの悪い癖に気づけることがあります。
個人開発・個人運用ならだれにも迷惑かけずにリファクタリングまで実践経験できるので、おすすめです。

# ちなみに
リファクタリングまで行うことを考えるのであれば、TDDで組んでおくとよいと思います（せめてあとからUnitTest組んでおく）（長く運用するものであればなおさら）（まぁ私の開発では組み込めていませんが…）

というのも、転職してから単体テストを組むようになって非常に恩恵を受けたからです。
とにかく単体テストが出来上がっているとリファクタリングがやりやすくていいです。
ちょっとこのソースいけるかな？と思って試したいときに、ちょっと変更して単体テストを通してみるだけで自信をもって確信できます。もちろん単体テストを作成するときはIN/OUTのパターンを網羅する必要があるので、時間はかかるし結構大変です。それでも、それに見合った効果はあったなーと思いました。
TDDはいろいろと賛否両論ありますし、複雑なプログラムには向いてなかったり…などありますが、悪くないなと思った次第です。

今日はそんなところです。
30日でできる！OS自作入門　day3

#こんにちは
summer pocketsの体験版プレイし，のみきちゃんが攻略対象じゃなさそうなことに嘆いたこっそり歩くです．

#3日目
アセンブラで本格的にやっていく内容でした．
マスターブートレコードっていうんですかね？なんかその部分をやってるんだと思います．

#エラー
本通りに進めていると今まで出なかったエラーが出てテンションが下がりダークソウルに逃げてしまいましたが，nasのコードをANCIからUTF-8にしたのが原因でした．アホだ．

#楽しみ
4日目からは本格的にCに入るみたいです．わくわく．
Prism for Xamarin.FormsでTabbedPageを実装したので備忘録

# はじめに
はじめての投稿になります。今回は、MVVMライブラリ（？）のPrismを使ってTabbedPageを実装したのでその備忘録として書こうかと思います。需要があるかはさておき、文献が少なく、あまり親切ではなかったので今後の糧くらいにはなるかと思います。

# 環境
Mac OS High Sierra10.13.6
Visual Studio Community 2017 for Mac
Xamarin.Forms 3.1.0.637273
Prism.DryIoc.Forms 7.0.0.396

# したこと
## Prismのプロジェクトを作成
ここは、他の文献と少し異なります。Windowsで作業したときには、templateパックみたいなものがあると思いますが、そもそもMacだとBlankかQuickStartしかありません。QuickStartの方はよくわからなかったので、とりあえずBlankAppを作成します。<img width="1364" alt="スクリーンショット 2018-07-15 1.45.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/210069/8237ce1b-9c82-99a4-d515-87f2aa83c7e1.png">
今回のアプリ名は適当に「TestPrismTab」にしておきます。

## App.xaml.csの書き換え
公式によると、まずApp.xaml.csのResisterTypesに書き加えないといけないみたいです。なので、もとあるものに付け加えるとこんな感じ。

```cs
protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<TabbedPage>();
            containerRegistry.RegisterForNavigation<NavigationPage>();
            containerRegistry.RegisterForNavigation<MainPage>();
            containerRegistry.RegisterForNavigation<HomePage>();
            containerRegistry.RegisterForNavigation<AboutPage>();
        }
```

まあ書くだけですね。それから上部にある`await NavigationService.Navigationasync`も書き換えました。ここは正直あってるかわからないので教えてください。

```cs
await NavigationService.NavigateAsync("TabbedPage?createTab=HomePage&createTab=AboutPage");
```

## MainPage.xamlの書き換え
あ、言い忘れてましたが、今回はTabbedPageでHomePageとAboutPageを切り替えます。TabbedPageはMainPageです。
ではMainPage.xamlをいじります。

```xml:MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
            xmlns:Views="clr-namespace:TestPrismTab.Views"
            prism:ViewModelLocator.AutowireViewModel="True"
            x:Class="TestPrismTab.Views.MainPage"
            Title="MainPage">
    <Views:HomePage />
    <Views:AboutPage />
</TabbedPage>
```

初期状態だと、コードビハインドでMainPageはContentPageかなにかを継承してるので、ここをTabbedPageに書き換えます。

## HomePageとAboutPageを追加する
ここが割と厄介でここでハマりました。PrismではPageとViewModelをセットで生成してくれる、とても親切なテンプレートがあります。
それでHomePageとAboutPageを生成します。
<img width="1364" alt="スクリーンショット 2018-07-15 2.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/210069/97e5b2b1-b929-6711-714c-c887ddf35214.png">
ただこれで生成してしまうと、HomePage.xamlとHomePage.xaml.cs、AboutPage.xamlとAboutPage.xaml.csがそれぞれで生成されてしまうのです。
つまり、最初に生成されていた、Mainpageのように、xamlとcsファイルが別々に生成されていました。
これがバージョンによるバグかはわかりませんが、これによってずっとxamlが見つからないよって怒られてました。
なので、一度prismにたよって生成して（ViewModelが欲しいので）、そのあと、Viewの方は削除して、新しいContentPageをXamarinの標準の方で作ってしまうのがよさそうです。
ここに関してはいい意見があったらください。

## ようやくビルド
それではビルドしてみます![Screenshot_20180715-021540.jpg](https://qiita-image-store.s3.amazonaws.com/0/210069/1ad6816d-7415-8abb-2a4a-98259f93e709.jpeg)
TabbedPageはうまく表示されていて、ちゃんとTabも切り替わります。
しかし、中のコンテンツが表示されません。
これは困りました。
ということでここで力尽きたので誰か助けてくれると助かります。
念のため、このプロジェクトは[設計図共有サイト]("https://github.com/Yamagn/TestPrismTab")にあげておくので、ぜひ活用してください。
それでは。

## 参考記事
https://prismlibrary.github.io/docs/xamarin-forms/Working-With-TabbedPages.html
【エクセル小ネタ】今いる列番号が知りたい時

EXCELでA1参照形式だと列はアルファベット表記の為Z以上になると何列目か直感的に分からない。
（暗算できる人は別だと思うけど）
ので、知りたい列のセルに

```

=column()
```

と入れると、その列番号が表示される。
（たとえばAA10に↑を入れると27って表示になる）

ちなみに

```
=row()
```
だと行番号が表示される（こっちはあまり使わないと思うけど）
ファイル名と同じフォルダを作って入れるbat

最近仕事でファイルと同じ名前のフォルダを作って、
その中にファイルを入れなおすとかいう作業があったので自動化してみました。
（拡張子込みの名前のフォルダが作成されます）

``` bat:

@echo off

:LOOP

if "%~1"=="" (goto EOF)

rem echo "%~1"
rem echo "%~dp1%~nx1"
rem pause 


mkdir "%~dp1%~n1"

move "%~1" "%~dp1%~n1"


echo "%~n1"
echo "%~nx1"
rename "%~n1" "%~nx1"

shift
goto LOOP

:EOF

```
スクロールの中で後付けのデータを追加できるものを作る。　小芝居付き　UnityEditor拡張

#得られる知見
・音ゲーなどの曲の長さなどが決まっている中で、その長さ分のスクロールを表示したい。
ー＞そして、その中にノーツを配置したい。（願望）

・上記のような何も中身が表示されなくても、スクロールの中に色々配置





理想的にはこんな感じ（横長だけの場合）
![理想.png](https://qiita-image-store.s3.amazonaws.com/0/101366/65346f94-c746-de40-7aa1-296985e74e9e.png)


このスクロールの中に、必要なデータとかを表示したりするイメージです。



#では、作ってみよう

私「スクロール使ってるからスクロールを描画すればいいだよ！ほらほら、こうすればいいんだよ！」


``` bad_sample.cs

scroll_pos = EditorGUILayout.BeginScrollView(scroll_pos, GUILayout.ExpandWidth(true));
{
}
EditorGUILayout.EndScrollView();


```

できたもの

![失敗１.png](https://qiita-image-store.s3.amazonaws.com/0/101366/72e16a19-44f3-de02-f22d-4302fbc2b131.png)

「なにもうつってないじゃねーーーかぁぁぁ」

###結果：失敗

理由：スクロールはスクロールをせざる得ない状態まで、オブジェクトが内部で置かれたときに、スクロールが発生する。そのため、何も書いてない状態だとスクロールバーすら表示されない。

----
###Next.
---

私「お、リファレンスみたら、常に、スクロールバーを表示するやつあるやん！これを使えば余裕やろ」


``` bad_sample2.cs

scroll_pos = EditorGUILayout.BeginScrollView(scroll_pos,true,true, GUILayout.ExpandWidth(true));
{
}
EditorGUILayout.EndScrollView();


```

現実
![失敗２.png](https://qiita-image-store.s3.amazonaws.com/0/101366/952ac0c5-5ee6-db5e-f26b-89867e881187.png)


###結果：失敗

理由；これも最初の失敗とほぼ同様、スクロールの中に配置されるオブジェクトが配置されていないためにおきるもの。そのため、すくろーるの量が初期値はこれくらいになってしまうんだ。


--------
###Next
------

私「どうしたらいいんだぁーーーー」
先輩「お困りのようですね」
私「先輩・・・・うるうる」

先輩「なるほどね。それならオブジェクトがなければ、オブジェクトを疑似的に配置したらいいじゃない」


```good_sample.cs

scroll_pos = EditorGUILayout.BeginScrollView(scroll_pos, GUILayout.ExpandWidth(true));
{
　 EditorGUILayout.LabelField(_message, GUILayout.Width(スクロールに必要な大きさ));
}
EditorGUILayout.EndScrollView();


```


![理想.png](https://qiita-image-store.s3.amazonaws.com/0/101366/12639296-f8e2-bb09-886d-15cce104d1ba.png)

私「先輩すごいです！」


###結果：成功

理由：至極単純な事で、オブジェクトを入れることによって、スクロールを強制的にださせるためのもの。
そしてラベルフィールドに関しては、中身が何もない状態だと実質的に表示されない状態になる。

そのため、このような感じになります。

このスクロール内に配置する際は、Begin－Endまでのスクロールの間に配置すると、スクロール内での表示されるようにしてください。
Parcel+ElectronではJSからCSSモジュールをimport/require出来ない

　ハマりレポです。半日吹き飛びました。

# 前提

## 1. Webページ制作における通常のParcel
通常のParcelでは、JS経由でCSSをimport/requireできる

```html:index.html
<script src='./app.js'>
```

```javascript:app.js
import 'reset-css'
// npmモジュールの「reset-css」をimport
import './style.sass'
// 自分で書いた「style.sass」をimport
```

```shell:出力実行コマンド
parcel index.html
```

## 2. ElectronのためにParcelを使う例
ParcelにはElectron用のモード`-t electron`があるので、それを使います。これを忘れるとエラーがでます。

```text:ファイル構成例
./package.jsonなどは略
./src/app.js
```

```shell:実行コマンド例
parcel build src/app.js -t electron -d ./; electron .
# -t electron: electron mode
# -d ./      : 書き出すフォルダの指定
```

# ハマったこと
1でやってた

```javascript:app.js
import 'reset-css'
import './style.sass'
```
を2のような

```shell:実行コマンド例
parcel build src/app.js -t electron -d ./; electron .
```
で呼び出して使おうとするとエラーが出ました。

## わかったこと

どうやら、

```javascript:app.js
import 'reset-css'
```

は出来ないようです。

```javascript:app.js
import './style.sass'
```

は大丈夫でした。

## 一応解決案
Sassファイルからimportしました。

```sass:style.sass
@import 'node_modules/reset-css/sass/reset'
```

# 以上です
これを読んだあなた。どうか~~真相を暴いてください~~
もっとスマートな解決策があったら教えてください。よろしくおねがいします。
CentOS7にPostgreSQL10をインストール〜基本設定してみた

DockerのCentOS7上でpostgresqlをインストールして初期設定してみたので、その手順を書いていきます。

##前提
Dockerのインストールとコンテナ作成は済んでいるものとして、Dockerについては一切触れません。
ネット上に情報がたくさんあるので各自で調べてください。

#構築手順
##環境
- CentOS 7.5
- PostgreSQL 10.4

##インストール
###レポジトリの追加
```
# sudo yum -y install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
```

###クライアントとサーバのインストール
```
# yum -y install postgresql10 postgresql10-server
```

###コマンドのPATHの設定
```
# echo "PATH=/usr/pgsql-10/bin:$PATH" >> ~/.bashrc
# source ~/.bashrc
```
###DBの初期化
```
# postgresql-10-setup initdb
```
OKという表示が出れば成功です！

###DBの起動
```
# systemctl start postgresql-10   // 起動
# systemctl enable postgresql-10  // 自動起動
```

##DBの操作
###PostgreSQLにアクセス
```
# su - postgres
# psql
// 以下のプロンプトになれば成功！
postgres=#
```
###ユーザの作成
例としてユーザ名admin、パスワードadmin、権限がデータベース作成のみのユーザを作成してみます。

```
postgres=# CREATE ROLE admin WITH LOGIN PASSWORD 'admin' CREATEDB;
postgres=# \du  　// 作成できたか確認

                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 admin     | Create DB                                                  | {}

```

###データベースの作成
adminを所有者とするadminというデータベースを作成します。

```
postgres=# CREATE DATABASE admin OWNER admin;
postgres=# \l  　// 作成できたか確認

                             List of databases
   Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
-----------+----------+-----------+---------+-------+-----------------------
 admin     | admin    | SQL_ASCII | C       | C     | =Tc/admin            +
           |          |           |         |       | admin=CTc/admin
```

###データベースオブジェクトに対する権限
adminユーザにadminデータベースに関する全ての権限を付与します。

```
postgres=# GRANT ALL ON DATABASE admin TO admin\;
```

###PostgreSQLから出る
```
postgres=# \q
```

###認証方式の変更
デフォルトではpeerとident認証のみ許可されているので、この状態ではOSでadminユーザを作成する必要が出てきます。そこで、デフォルトの設定はコメントアウトして、MD5による暗号化を用いたパスワード認証を設定します。

```
# vi /var/lib/pgsql/10/data/pg_hba.conf   // 以下のように編集

   # TYPE  DATABASE        USER            ADDRESS                 METHOD
   # "local" is for Unix domain socket connections only
-  local   all             all                                     peer
+  local   all             all                                     md5
```

###変更の読み込み
```
# systemctl reload postgresql-10
```

###adminユーザでアクセス
```
# psql -U admin

Password for user admin: 
psql (10.4)
Type "help" for help.

admin=>
```
このようになれば成功です！

以上、PostgreSQLのインストールから基本設定でした

#参考
- [PostgreSQL: Linux downloads (Red Hat family)](https://www.postgresql.org/download/linux/redhat/)
- [PostgreSQL: Documentation: 10: CREATE ROLE](https://www.postgresql.org/docs/10/static/sql-createrole.html)
Apache、PHP、MySql、postfixコマンドメモ

サーバを新規作成する機械があったので起動などのコマンドをメモ。
●Apache:ver2.4.6
起動:systemctl start httpd
再起動:systemctl restart httpd
停止:systemctl stop httpd
状態:systemctl status httpd
サービス自動起動有効:systemctl enable httpd

●PHP:ver7.2
起動:systemctl start php-fpm
再起動:systemctl restart php-fpm
停止:systemctl stop php-fpm
状態:systemctl status php-fpm
サービス自動起動有効:systemctl enable php-fpm
サービス自動起動無効:systemctl disable php-fpm
サービス自動起動設定確認:systemctl is-enabled php-fpm

●MySql:ver5.7
起動:systemctl start mysqld.service
再起動:systemctl restart mysqld.service
停止:systemctl stop mysqld.service
状態:systemctl status mysqld.service
サービス自動起動有効:systemctl enable mysqld.service

●postfix:ver3.3.1
※ソースからインストールした。
起動:postfix start
再起動:postfix reload
停止:postfix stop
状態:postfix status
設定確認:postconf
設定初期値確認:postconf -d
現在と初期値の設定差分確認:postconf -n
バージョン確認:postconf | grep mail_version
SION update - now available in Rust

というわけで[SION]ですが、ぶち上げて1週間も経たないうちに言語実装が4つになりました🎉。

[SION]: https://qiita.com/tags/sion

[前回]から増えたのはRust。[pandaman64]さんありがとうございます🙇‍♂️。

[前回]: https://qiita.com/dankogai/items/b514831ae33674ea23d9
[pandaman64]: https://github.com/pandaman64

* https://github.com/pandaman64/sion-rs

ソースコード、綺麗ですねえ。目的ごとにファイル分割しているので読みやすいし。[swift-sion]もそうしたかったところなのですが、Swift Playgroundsのことを考慮すると単一ファイルに納めておきたいんですよね…

![](https://github.com/dankogai/swift-sion/raw/master/iOS/playgrounds.png)

[swift-sion]: https://github.com/dankogai/swift-sion

その[swift-sion]にもついに[MessagePack]との相互変換機能が搭載されました。おかげで行数が1000行を超えましたが、1024行は超えてないので許してください。

[MessagePack]: http://msgpack.org/

Swift Package Managerがあるのだし、機能追加するためのモジュールを別途書くことも考えたのですが、MessagePackとの相互変換は[SION]の大目標の一つだったのであえて標準搭載することにしました。`.Date`や`.Ext`にもきちんと対応しています。

よく考えると、MessagePackをきちんとテキスト化できる現状で唯一のテキストシリアライゼーションフォーマットかもしれません。

[swift-sion]、書いた自分で言うのも何ですがむっちゃ便利です。これ一つでSIONのみならず

* JSON
* Property List
* MessagePack

が相互変換できて、出力のみなら加えて[YAML]もいけます。ぜひご活用ください。

[YAML]: http://yaml.org

["Dan":["Safe","Fast","Expressive"]]
第21話 ハーシャッド数

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

```math
\arg⁡\min_n⁡[∀x∃i≤n,x+i∉\{harshad\}] =21
```

ハーシャッド数は21個以上連続しない、
つまり連続するハーシャッド数は20個が限度、という意味の式です。

ハーシャッド数は数字和を約数に持つ数なのですが、例を出したほうがわかりやすいでしょう。

まず、それぞれの各桁を1桁の数字として足し合わせたものを計算します。
例えば、2016だと、2+0+1+6=9になります。
この足し合わせた数を数字和といい、この数で元の数を割り切ることができればハーシャッド数です。
2016は2016は9で割れるのでハーシャッド数です。
逆に、2017は2+0+1+7=10で、2017は10では割り切れないのでハーシャッド数ではありません。

数字和が3や9ならハーシャッド数になります。
なぜなら、3や9で割り切れる条件が、「数字和が3や9の倍数」というルールがあるからです。

2桁で奇数しか出てこない数はハーシャッド数にはなりません。
例えば、35は奇数ですが、数字和は3+5=8で偶数です。
奇数の約数は奇数しか出てこないので、数字和が偶数だとハーシャッド数ではありません。

しかし、桁上りが発生して45になると、4＋5=9と数字和も奇数になり、45はハーシャッド数になります。
数を表にしてみます。

|元の数| 11 | 12 | 13 | 18 | 19| 20 | 21 | 22 |30|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|数字和| 2  | 3  | 4  |  9 | 10  | 2 | 3 | 4 |3|

10代の数は、奇数のとき数字和が偶数になっています。
しかし、20代になると、奇数のときの数字和が奇数です。

「元の数が奇数で数字和が奇数」「元の数が偶数で数字和が偶数」を「奇遇が一致」
そうでないものを「奇遇が不一致」と名付けます。
「奇遇が不一致」のゾーンの奇数は、絶対にハーシャッド数ではありません。

2桁の数の場合、十の位が変わる度に「奇遇が一致」と「奇遇が不一致」が切り替わります。
19と31が絶対にハーシャッド数にならないので、20～30がハーシャッド数になりそうな区間です。

この十の塊をディケイドと呼び、繰り上がりが発生することをディケイドを超える、といいます。
ディケイドを超えるたびに「ハーシャッド数の破壊された世界」と
「ハーシャッド数がまだ生きられる世界」が切り替わるわけです。
世界の破壊者だから仕方ないね。

しかし、繰り上がりが2回発生する瞬間、「奇遇が一致」が連続します。

|元の数| 199 | 200 | 201 | 209 | 210| 211|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|数字和| 19  | 2  | 3  |  11 | 3  | 4 |

そこで、199～210のようなゾーンでの21個が連続するハーシャッド数の限界なのですが、
もうちょっと厳密に調べた結果、ディケイドを2回超えることは無理なようです。
つまり、199～209の20個の連続が限界のようです。

ハーシャッド数は珍しく、存在が証明されているだけでなく具体的な値もわかっていますが、
20個連続したハーシャッド数は最小の数でも443億桁という、とても大きな数になります。

実際にどんな数かというと、乱数調整した数に0を死ぬほど詰めた数、らしいです。
こんな感じですね。
?????999…990 ～ ?????000…009
情報共有アプリbandについて

### 概要
当方、現在情報共有アプリとして[『BAND』](https://band.us/home)というアプリを使っております。
web版やスマホ用アプリがありグループの運営にて重宝しております。

このアプリですが、sdkやAPIなど提供されております。
[https://developers.band.us/develop/guide/api](https://developers.band.us/develop/guide/api)

### やりたいこと

0. SDKを使った自作アプリの開発
0. APIキーの使い方を知りたい
- どのような使い方ができるのか（他サービスとの連携など）
- 具体的な使用方法など

### お願い
当方、プログラミングの知識は全くありません。
必要であれば１から覚える覚悟はあります。
BANDアプリを使ったことがある方で、自作に挑戦した方などいらっしゃれば、何卒ご教授願いたいと思います。

また、ネット上に文献もなく他の人がされていないことで独学で勉強する場合、どのような手順で学習、作成を行えば良いかなど合わせて教えていただければ大変うれしく思います。
Excelで筆算的プログラミング

# 筆算的プログラミングとは
筆算では、紙に鉛筆で途中の計算結果を残しながら、複雑な計算を簡単な計算に分解していきます。
途中経過を残しながら、それを利用して計算することを、筆算的プログラミングと呼ぶことにします。
筆算的プログラミングをExcel VBAで実装します。


# 例題
例題として、０から９までの数字を合計します。

```vba
(A1) =P("V_0 1 2 3 4 5 6 7 8 9","合計")     [45]
```


# 実装
この実装だと機能が少なすぎるので、[次回](https://qiita.com/matumoto_onga/items/29c058f1ba2fb0f77fa1)は少し拡張します。

```vba
Function P(ParamArray F())
    On Error Resume Next
    Dim M: M = UBound(F)
    Dim A: ReDim A(M)
    Dim I: For I = 0 To M
        Dim S: S = ""
        Select Case TypeName(F(I))
            Case "String"
                Dim D: D = Trim(F(I))
                
                If D Like "V_*" Then
                    S = V_(D)
                Else
                    S = E(Application.Run(D, IFC(I > 0, (A(I - 1)))))
                End If
            Case Else
                ' 未実装
    
        End Select
        A(I) = S
    Next I
    P = S
End Function

Function V_(D, Optional L = " ", Optional S = "")
    If D Like "V_*" Then D = Right(D, Len(D) - 2)
    
    Dim T: T = Split(D, L)
    Dim M: M = UBound(T)
    ReDim S(M)
    Dim I: For I = 0 To M
        S(I) = Val(T(I))
    Next I
    V_ = S
End Function

Function 合計(D, Optional S = "")
    合計 = WorksheetFunction.Sum(D)
End Function

Function E(V, Optional S = "")
    If IsError(V) Then E = S Else E = V
End Function

Function IFC(C, V, Optional S = "")
    If C Then IFC = V Else IFC = S
End Function


```
リアルタイムで物体を検出・追跡する

TensorflowとOpenCVで「ドラえもん」をリアルタイムで識別・トレースするソリューションを作ってみました。

動作デモは下記より：
https://www.youtube.com/watch?v=7xuN9SgyfvI

![image.png](https://qiita-image-store.s3.amazonaws.com/0/263382/aed5305e-c1cf-2310-0a41-69d36c11e0a2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/263382/5501476e-4853-7c25-7a8a-b11b94fbc027.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/263382/d1551795-b2fa-1cd6-d2d9-b63fbd458671.png)
Gitの基本

# バージョン管理システムとは

- 作業内容を記録していくことができる
- 過去の作業内容を簡単に把握できたり、特定の日時の状態に戻したりができる

フォルダを丸ごとコピーし、日付を付けて置いておく…というのもバージョン管理の一つ。
ただしその方法だと、細かな変更内容を把握するのは難しい。

Gitでバージョン管理することにより、いつでも過去の状態を参照できるようになる。

---

# Gitの特徴

以下の特徴を持つバージョン管理システム。

- 分散型 ... 一度サーバからソースコードを取得すればオフラインで作業でき、任意のタイミングでサーバに反映できる
- 高速 ... SVNなど他のバージョン管理システムよりも、高速に動作する
- 賢いマージ ... 他のバージョン管理システムよりも、作業内容を賢くまとめてくれる

---

# リポジトリ

ソースコードは「リポジトリ」と呼ばれる場所で管理する。
リポジトリは基本的に、ホスティングサービス上で作成するといい。

---

# ホスティングサービス

リポジトリを管理してくれる場所。
一人で作業する場合は無くてもいいが、バックアップのためにも使用することを推奨。複数人で作業する場合は必須。
有名どころだと、以下のようなものがある。

- GitHub ... 一番メジャーだと思われる。オープンソースで公開する場合に最適。非公開リポジトリを作りたい場合は有料
- Bitbucket ... 無料で非公開リポジトリを作れる。1リポジトリに5ユーザ以上参加させたい場合は有料

---

# Git操作

- コマンドで操作する
- Sourcetreeなどグラフィカルなソフトウェアで操作する

の2つがある。WindowsやMacで使うなら、グラフィカルなソフトウェアを使うといい。

---

# クローン

リポジトリの内容をローカルにコピーすること。
Gitではサーバ上だけでなくローカルにもリポジトリの複製を持ち、定期的に同期させる。

---

# コミットとプッシュとプル

- コミット ... ローカルのリポジトリに作業を記録する
- プッシュ ... コミット内容をサーバのリポジトリに記録する
- プル ... サーバのリポジトリの内容をローカルのリポジトリに反映する（他の人の変更内容を取り込む）

---

# ファイルの状態

- 作業ディレクトリ ... 作業中のファイル
- ステージングエリア ... 次にコミットされるファイル
- Gitディレクトリ ... コミットされたファイル

の3つがある。
作業ディレクトリにあるファイルをステージングエリアに移動させ、それに対してコメントとともにGitディレクトリに移動させる。（＝コミット）
ステージングエリアがあることにより、一部のファイルのみコミット対象にすることができる。

ここまでできれば、最低限だがGitを使うことができる。

---

# ブランチとマージ

ブランチを作れば、いくつもの作業を同時に進めることができる。
作業が完了したら、もとの場所にマージ（統合）することができる。
複数人で作業するときに、特に力を発揮する。

---

# コンフリクト

マージの際、作業内容が競合したことをいう。

- マージ元の作業が正しいとみなす（'相手の変更'を使って解決）
- マージ先の作業が正しいとみなす（'自分の変更'を使って解決）
- 手動で調整し、コミットしなおす（解決済みにする）

という対応がある。
Sourcetreeの場合、競合しているファイルを右クリックし、「競合を解決」から解決方法を選択できる。

---

# ブランチモデル

gitでは自由にブランチを作成できるが、何のルールも無く作成すると混乱のもとになる。
有名どころのルールとして以下がある。

- GitHub Flow ... 小規模開発向け。masterブランチから開発用ブランチを作成し、作業が完了したらmasterブランチに戻す
- Git Flow ... 中規模～大規模開発向け。master、develop、feature、release、hotfix という5種類のブランチを使い分ける

Git Flow をベースに、独自のブランチモデルで運用しているところもある。

---

# コミットの粒度とメッセージ

あとで見直しやすいように、ということを意識してコミットするといい。
「コミットの際に課題番号も書く」など、独自のルールが設けられることも多い。

---

# .gitignore

バージョン管理対象外にするファイルを指定できる。

`Thumbs.db` や `.DS_Store` は管理対象外にしておく。
その他環境依存の設定ファイルや、巨大すぎる動画ファイルやライブラリも省いておくと管理しやすくなる。

---

# 課題管理・Wiki

大抵のホスティングサービスには用意されている。
うまく使うと便利。この部分は、BacklogやRedmineなど他のサービスやツールを使うこともある。

---

# 最後に

Gitに慣れると、Git管理されていない状態での制作には戻りたくなくなります。
とはいえ慣れは必要です。よく解らない状態になったら、近くの人に聞きましょう。
PhpStormからDocker上のphpでphpunitを実行する

# はじめに

PhpStormからテスト実行したいだけの人生だった。

## CLI Interpreterの設定

![2018-08-03_23h17_04.png](https://qiita-image-store.s3.amazonaws.com/0/165884/a5fdeaea-484d-91d3-0803-5600dbe93273.png)

![2018-08-03_23h25_56.png](https://qiita-image-store.s3.amazonaws.com/0/165884/13cddfee-ea13-82fd-50ac-70cf5d6dc589.png)

![2018-08-03_23h28_00.png](https://qiita-image-store.s3.amazonaws.com/0/165884/1d3cfeca-a4f9-a800-0fa1-cc337bb36add.png)

## PhpUnitの設定

![2018-08-03_23h32_41.png](https://qiita-image-store.s3.amazonaws.com/0/165884/fc73be59-d94d-191d-c7cc-27d8a43e1241.png)

![2018-08-03_23h33_18.png](https://qiita-image-store.s3.amazonaws.com/0/165884/189b57e5-3c36-04e7-e175-6d48cc3fa10f.png)

![2018-08-03_23h35_17.png](https://qiita-image-store.s3.amazonaws.com/0/165884/dc9785cb-1bfb-a3e2-9a48-51253bee85bb.png)

## PhpUnitの実行

![2018-08-03_23h39_59.png](https://qiita-image-store.s3.amazonaws.com/0/165884/57546a1a-5c4d-a2f9-8807-a975ec7d218e.png)

![2018-08-03_23h42_33.png](https://qiita-image-store.s3.amazonaws.com/0/165884/0c96ddb1-67ed-03de-d27a-459765a17292.png)
C言語の数字のソート

#選択法

<pre>
#include "stdio.h"

int main()
{
	int array[10] = {40,80,30,10,0,60,70,20,90,50};
	int Mi,i,j,k,TMP;
	for(i=1;i<10;i++)
	{
		Mi = i;
		for(j = i+1;j<10;j++)
		{
			if(array[Mi]>array[j])
			{
				Mi = j;
			}
		}
		TMP = array[i];
		array[i] = array[Mi];
		array[Mi] = TMP;
	}
	for(k=1;k<10;k++)
	{
		printf("%d\n",array[k]);
	}
	getchar();
	return 0;
}
</pre>
#交換法

<pre>
int main()
{
	int array[10] = {40,80,30,10,0,60,70,20,90,50};
	int i,j,k,TMP;
	for(i=0;i<9;i++)
	{
		for(j=10;j>=i+1;j--)
		{
			if(array[j]<array[j-1])
			{
				TMP = array[j];
				array[j] = array[j-1];
				array[j-1] = TMP;
			}
		}
	}
	for(k=0;k<=10;k++)
	{
		printf("%d\n",array[k]);
	}
	getchar();
	return 0;
}
sympyで「双曲線関数(hyperbolic function)」をやってみた

(参考)simplifying expressions with hyperbolic functions
https://stackoverflow.com/questions/11076263/simplifying-expressions-with-hyperbolic-functions
(参考)チュートリアルを読む 読書ノート v1.5dev ＞ Trigonometric Simplification
https://showa-yojyo.github.io/notebook/python-sympy/tutorial.html#trigonometric-simplification

#日本版wikipediaより
(参考)双曲線関数
https://ja.wikipedia.org/wiki/%E5%8F%8C%E6%9B%B2%E7%B7%9A%E9%96%A2%E6%95%B0#定義

途中から怪しくなります?

```fullscript.py 
from sympy import *
var('x')
print('定義--------------------------------')
expr=sinh(x)
print(expr,"=",expr.rewrite(exp))
expr=exp(x)-sinh(x)
print(simplify(expr),"=",expr)
expr=tanh(x)
print(expr,"=",simplify(expr*cosh(x)),"/cosh(x)")
expr=coth(x)
print(expr,"=",simplify(expr*tanh(x)),"/tanh(x)")
# expr=sech(x)
# print(expr,"=",simplify(expr*cosh(x)),"/cosh(x)")
# expr=cosech(x)
# print(expr,"=",simplify(expr*sinh(x)),"/sinh(x)")

# 定義--------------------------------
# sinh(x) = exp(x)/2 - exp(-x)/2
# cosh(x) = exp(x) - sinh(x)
# tanh(x) = sinh(x) /cosh(x)
# coth(x) = 1 /tanh(x)
# NotImplementedError: unhandled sech
# NameError: name 'cosech' is not defined
```

#本家wikipediaより
(参考)Hyperbolic function
https://en.m.wikipedia.org/wiki/Hyperbolic_function#Definitions

#本家wikipediaよりcosh(x)+sinh(x)
(2018/08/23)
(参考)Relationship to the exponential function
https://en.m.wikipedia.org/wiki/Hyperbolic_function#Relationship_to_the_exponential_function
(参考)simplifying expressions with hyperbolic functions
https://stackoverflow.com/questions/11076263/simplifying-expressions-with-hyperbolic-functions

```fullscript.py
from sympy import *
x = Symbol('x')
print((cosh(x)+sinh(x)).simplify(),'=cosh(x)+sinh(x)')
print('-------------------------')
ans=(exp(x)-sinh(x))
print(ans)
ans=(exp(x)-sinh(x)).simplify()
print(ans)
ans=(cosh(x)).rewrite(exp)
print(ans)
ans=(exp(x)-sinh(x)).rewrite(exp)
print(ans)
# exp(x) =cosh(x)+sinh(x)
# exp(x) - sinh(x)
# cosh(x)
# exp(x)/2 + exp(-x)/2
# exp(x)/2 + exp(-x)/2
```
zshrcの中でbrew --prefixしないほうがよい理由

zshrcとかbashrcの中で `brew --prefix foo` しない方がよいです。理由はめちゃくちゃ遅いからです。

# 3行で説明
* `brew --prefix なんとか` は2017年版MacBookProでも0.8秒くらいかかる
* 速度が重要な場面では絶対パスをべた書きする方がよい
* homebrew開発元も認識してはいるが、2018.8現時点では未解決

# `brew --prefix なんとか` はすごく遅い

自分の環境でzshの起動がやたら遅いので原因を調べたところ、 `brew --prefix coreutils` が原因であることがわかりました。

試しに単体で実行してみると、確かに 0.88秒かかっています。

```
~  time brew --prefix coreutils
/usr/local/opt/coreutils
brew --prefix coreutils  0.48s user 0.21s system 77% cpu 0.880 total
```

しかも自分の場合は以下のように2回呼んでいたので合計1.7秒この処理に費やされていました。

```zsh
export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
export MANPATH="$(brew --prefix coreutils)/libexec/gnuman:$MANPATH"
```

brew --prefixの値なんてそうそう変わるものではないし自分はデフォルト設定のまま変更していないので、 パス直書きに変更してみたところ、zshの起動が1.7秒短縮されました。

```diff
-    export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
-    export MANPATH="$(brew --prefix coreutils)/libexec/gnuman:$MANPATH"
+    export PATH=/usr/local/opt/coreutils/libexec/gnubin:$PATH"
+    export MANPATH=/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
```

ちなみに `brew --prefix パッケージ名` が遅いのは `coreutils` に限らずどんなパッケージ名を指定しても遅いようです。

```
$ time brew --prefix go
/usr/local/opt/go
brew --prefix go  0.48s user 0.20s system 75% cpu 0.909 total
$ time brew --prefix sl
/usr/local/opt/sl
brew --prefix sl  0.48s user 0.21s system 73% cpu 0.928 total
```

# パッケージ指定なしの `brew --prefix` もやや遅い


```
$ time brew --prefix
/usr/local
brew --prefix  0.02s user 0.02s system 59% cpu 0.074 total
```

この用途なら whichコマンドを使う方が速い。

```
$ time dirname $(dirname $(which brew))
/usr/local
dirname $(dirname $(which brew))  0.00s user 0.00s system 47% cpu 0.008 total
```

しかしzshrcとかに書く用途なら、動的に取得する必要性もそれほどないのでやはりパス名をべた書きするのが一番シンプルかつ高速でよいと思いました。

# HomebrewにIssueが上がっている

ちなみに `brew --prefix なんとか` が遅い件は homebrew本体にもissueがあがっているので開発元も認識していはいるようです。

https://github.com/Homebrew/brew/issues/3097

要約すると、

* バグではない
* 簡単には直せない。PRはウェルカム
* $(which brew) を使うほうが速い

とのことです。
Excel VBA セルの値だけコピー

#DataObject
セルの値だけコピーするやり方として、DataObjectを使ったやり方があります。

```visualbasic

Sub ValueCopy1()
    With New DataObject
        .SetText ActiveCell
        .PutInClipboard
    End With
End Sub
```

しかし、このやり方ですとうまくコピーできない時があります。
私の場合、「・・」になってたり、形式をテキストにして貼り付けすると「？？」になったりします。
![ValueCopy1.PNG](https://qiita-image-store.s3.amazonaws.com/0/176021/b55eaca5-06a7-c1c6-52ff-8f3b2608fbb2.png)


別のやり方として、テキストボックスを使ってコピーする方法があります。
#TextBox.Copy
```vb
Sub Main()
    Call ValueCopy2(ActiveCell)
End Sub

Sub ValueCopy2(value As String)
    With CreateObject("Forms.TextBox.1")
        .MultiLine = True
        .text = value
        .SelStart = 0
        .SelLength = .TextLength
        .Copy
  End With
End Sub
```
**結果**
![ValueCopy2.PNG](https://qiita-image-store.s3.amazonaws.com/0/176021/e56c8c1f-c1f9-aa9e-57a2-dab25d050187.png)


うまくコピーできました。
ただ、この場合、1つのセルしかコピーできないので、もう少し工夫します。
##選択したセル全ての値をコピー

```vb

Sub Main()
    Call ValueCopy(SelectionCellsValue(Selection))
End Sub

Function SelectionCellsValue(ra As Range) As String
    Dim count As Integer: count = ra.Row
    Dim first As Boolean: first = True
    Dim r As Range
    Dim value As String
    For Each r In ra
        If first Then
            value = r.value
            first = False
        ElseIf r.Row = count Then
            value = value & vbTab & r.value 'vbTabは半角スペースでもいいかも(お好みで)
        Else
            value = value & vbCrLf & r.value
            count = count + 1
        End If
    Next r
    SelectionCellsValue = value
End Function

Sub ValueCopy3(value As String)
    With CreateObject("Forms.TextBox.1")
        .MultiLine = True
        .text = value
        .SelStart = 0
        .SelLength = .TextLength
        .Copy
  End With
End Sub
```
**結果**
![ValueCopy3.PNG](https://qiita-image-store.s3.amazonaws.com/0/176021/f6f09159-c22f-5af3-1fc4-0898527d7f3d.png)
選択した範囲全てコピーできました。
後はMainをショートカットキー `Ctrl + Shift + C`などに割り当てると便利です。
#参考サイト
[[VBA]DataObjectを使ったクリップボード操作が上手くいかない場合の対処法](https://www.ka-net.org/blog/?p=7537)

#追記
↑えっなんでこんな長ったらしいの？firstいる？
気に入らなかったので書き直しました。

```visualbasic
Sub CellsValueCopy()
    Dim row As Integer: row = ActiveCell.row
    Dim rng As Range
    Dim value As String
    For Each rng In Selection
        If rng.row = row Then
            value = value & rng.value & " "
        Else
            value = Left(value, Len(value) - 1) & vbCrLf & rng.value & " "
            row = rng.row
        End If
    Next rng
    Call ValueCopy(Left(value, Len(value) - 1))
End Sub
```
Active StorageにおいてYAML syntax errorが出る問題

Rails 5.2以降の新機能、Active Storageに関して。
[公式のガイド](https://railsguides.jp/active_storage_overview.html)に沿って自作サービスに画像投稿機能を付けたところ、アップロード時に次のような500エラーが発生しました。

```
RuntimeError (YAML syntax error occurred while parsing /(サービスのディレクトリ)/config/storage.yml.
Please note that YAML must be consistently indented using spaces.
Tabs are not allowed. Error: (<unknown>): found unexpected ':' while scanning a plain scalar at line 21 column 27):
```

これは見ての通りYAMLの読み込みエラーなのですが、このときエラーの出ている`config/storage.yml`は次のようになっていました。

```yaml:config/storage.yml(間違い)
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>
 
test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

google:
  service: GCS
  keyfile: {
    type: "service_account",
    project_id: <%= Rails.application.credentials.gcs[:project_id] %>,
    private_key_id: <%= Rails.application.credentials.gcs[:private_key_id] %>,
    private_key: <%= Rails.application.credentials.gcs[:private_key] %>,
    client_email: <%= Rails.application.credentials.gcs[:client_email] %>,
    client_id: <%= Rails.application.credentials.gcs[:client_id] %>,
    auth_uri: "https://accounts.google.com/o/oauth2/auth",
    token_uri: "https://accounts.google.com/o/oauth2/token",
    auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
    client_x509_cert_url: <%= Rails.application.credentials.gcs[:client_x509_cert_url] %>
  }
  project: <%= Rails.application.credentials.gcs[:project] %>
  bucket: <%= Rails.application.credentials.gcs[:bucket] %>
```

この時問題だったのは`google:`の箇所です。
Google Cloud Storage用のkeyをひたすらcredentialsファイルから読み込んでいるのですが、この時`keyfile:`の中括弧`{}`内部のパラメータに関しては、どうやら`""`を付けなければいけないようです。

すなわち、正しい書き方は次のようになります。

```yaml:config/storage.yml(正しい)
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>
 
test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

google:
  service: GCS
  keyfile: {
    type: "service_account",
    project_id: "<%= Rails.application.credentials.gcs[:project_id] %>",
    private_key_id: "<%= Rails.application.credentials.gcs[:private_key_id] %>",
    private_key: "<%= Rails.application.credentials.gcs[:private_key] %>",
    client_email: "<%= Rails.application.credentials.gcs[:client_email] %>",
    client_id: "<%= Rails.application.credentials.gcs[:client_id] %>",
    auth_uri: "https://accounts.google.com/o/oauth2/auth",
    token_uri: "https://accounts.google.com/o/oauth2/token",
    auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
    client_x509_cert_url: "<%= Rails.application.credentials.gcs[:client_x509_cert_url] %>"
  }
  project: <%= Rails.application.credentials.gcs[:project] %>
  bucket: <%= Rails.application.credentials.gcs[:bucket] %>
```

YAMLはpythonのようにインデントの違いに敏感だったり、お作法がいろいろあるそうです。

[YAMLを覚えよう - エンジニア成長日記](http://abcmark2010.hatenablog.com/entry/2015/12/20/235604)

Railsの設定ファイルにしか使わないのでつい蔑ろにしてしまいがちですが、しっかり学ばないとダメそうですね...
clip-pathで画像やHTMLを切り抜く


```css
/*ひし形に切り抜く*/
img {
 clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}
```

```css
/*吹き出し系に切り抜く*/
div {
 clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 85%, 75% 100%, 50% 80%, 0% 75%);
}
```
Google Spreadsheetに「目次」っぽいシートを付ける処理をGoogle Apps Scriptで書く

# Google Spreadsheet にタブをたくさん作ると、[すべてのシート]のポップアップリストは使いづらい

Google Spreadsheetや一般的な表計算ソフトでは、シート切り替えは画面下のタブから行わねばならず、シートをたくさん含む場合は切り替えが微妙にメンドクサイと思います。そういう場合に Google Spreadsheet では、画面左下のバーガーメニュー的なアイコンで[すべてのシート]をリスト表示でき、そこで選択したシートに移動できます。

しかしシートの数が多いと、リスト表示でスクロールが必要になるため、これはこれで微妙に使いづらいです。

![licecap.gif](https://qiita-image-store.s3.amazonaws.com/0/149350/f3441cdd-6ce3-adbd-3df4-ada83d15d728.gif)

また、リスト表示から選んで、ブラウザの別タブでそのシートを開く、ということもできないようです。Google Spreadsheet では同じスプレッドシートに含まれる複数のシートを、それぞれ別のブラウザウィンドウで表示することができるので、単にシートに移動するのではなく、別々のシートの内容を見比べたりできるほうが便利だと思うんです。

# Google Spreadsheetに「目次」のシートをつけて、シートの名前とURLを列挙していれば、もっと便利に使えるはず

シート名と切り替え用のURLを一覧を目次として最初のシートに持たせておけば、切り替えがとてもラクになります。そうすると目次のシートのリンクから別々のウィンドウで開いたりできるわけです。

でも、そういう目次のシートを手作業で作るのは、それはそれでメンドクサイ話。だから Google Apps Script で生成させてみることにします。

以下の例では、BeaconFence（屋内に固定設置したiBeaconを用いての測位や地図表示を可能にする、Delphi/C++Builder向けIoTコンポーネント）の測位データを扱っているのですが、生データのシートと簡易ヒートマップのシートを切り替えてみました。最初はタブをクリックして切り替えていますが、途中で Google Apps Script による目次生成を行って、その目次からシートの切り替えを行っています。

![licecap.gif](https://qiita-image-store.s3.amazonaws.com/0/149350/87bc6344-1c3b-04ab-2795-a9e1d39cc5ea.gif)

# 実装

Google Apps Script でこんな風に実装してみました。

```javascript
function generatePageList(){
  var spreadshsset = SpreadsheetApp.getActiveSpreadsheet();
  var numSheets    = spreadshsset.getNumSheets();
  var indexSheet   = spreadshsset.getSheets()[0];

  spreadshsset.moveActiveSheet(1);

  // アクティブなシート名が 'index' の場合だけ処理を続ける
  if ( spreadshsset.getSheetName() != "index" ) {
    return;
  }

  // 編集範囲を取得
  var range = indexSheet.getRange(1,1,numSheets,2);  

  range.getCell(1,1).setValue("シート名");
  range.getCell(1,2).setValue("URL");

  // スプレッドシートのシート名とURLを取得して index に出力する
  // 対象範囲は全部のシート（ただし一番左側のシートを除く）とするので
  // i = 1 から開始する
  for(var i = 1; i < numSheets; i++){
    var sheet     = spreadshsset.getSheets()[i];
    var sheetName = sheet.getSheetName();
    var sheetURL  = spreadshsset.getUrl() + '#gid='+String(sheet.getSheetId());

//    Logger.log(sheetName);
//    Logger.log(sheetURL);
    // データは2行目以降に書く
    range.getCell(1+i,1).setValue(sheetName);
    range.getCell(1+i,2).setValue(sheetURL);
  }
}
```

やっていることはシンプルで、以下の通りです。

- アクティブなシートの名前が index の場合だけ処理を行う（意図しない書き換えを防止するため）
- 全てのシートの名前とURLを取得して、index のシートに書き込む

ただし、シート名とURLを抽出する処理は少々手を抜いておりまして、index のシートは一番左（１枚目）のシートであるとみなしています。もうすこし真面目に実装しても良いのですが自分の使い方の範囲では実用上の問題がないので、こういう実装にしています。

あとは、シートを増やしたり、シート名を変えるたびに、このスクリプトを実行すればOKです。それすらも面倒だと思う場合は、１時間に１回自動で実行させてもよいんじゃないかと思います。（が、タイマー駆動の動作検証はしていません）
Python3＋OpenCVがうまくいかない。。。

#Raspberry pi 3B(Raspbian Stretch)にOpenCVをインストールしたが

Raspbian StretchでPython3+OPENCVをインストールした際にうまく行かず、試行錯誤し解決した結果を以下に記載。

###### インストール済OSを確認

```console:OSのバージョンチェック
$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
（以下省略）
```

###### OpenCV関連のインストール

```console:OpenCVのインストール
$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv
```
###### Python3で動かしてみる
```console:python3
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/.local/lib/python3.5/site-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: libQtTest.so.4: cannot open shared object file: No such file or directory
```

###### ここでエラーが出る。。。Python2でテストしてみる。
```console:Python2でテスト
$ python2
Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.1'
```
######　Python2ではエラーはでない。[本家サイト](https://www.raspberrypi.org/forums/viewtopic.php?t=211859)で同じ内容のPOSTを発見

###### ここでエラーがでるのでpip3でのインストールとエラーの原因となっている「libQtTest.so.4」の対策をしてみる。

```console:対策
$ sudo pip3 install opencv-python
$ sudo apt-get install libqt4-test
```
###### 再びPython3でテスト
```console:Python3で再トライ
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.2'
```

######無事に動いた。