OmniAICreator/Qiita-1.07M huggingface dataset:
そういえば使ってなかったJSの機能をばらばらとまとめる


## 選択している文字列の操作

Demo : http://codepen.io/mo4_9/pen/ObNjeR

window.getSelection()

> 参考
[Rangeの活用とSelection](http://uhyohyo.net/javascript/8_3.html)

## windowを開く

Demo : https://codepen.io/mo4_9/pen/gGRgWa

```javascript
let newWin;
const WIDTH = 400;
const HEIGHT = 300;

window.name = "openerWin"; // オープン元ウィンドウの名前
newWindow = window.open("subwindow.html", "newWindow", `status=1,width=${WIDTH},height=${HEIGHT}`);
newWindow.resizeTo(screen.availWidth/2, screen.availHeight/2);
newWindow.moveTo(screen.availWidth/2 - WIDTH/2, screen.availHeight/2 - HEIGHT/2);
```

## プロパティを動的に生成

Demo : https://codepen.io/mo4_9/pen/OxgWjX

Computed property names

ブラケットで囲う

```javascript
let i = 0;

const member = {
  name: 'hoge',
  age: 20,
  [`memo${++i}`]: 'memo1',
  [`memo${++i}`]: 'memo2',
  [`memo${++i}`]: 'memo3'
}

console.log(member);
```

^ 消えたので画像も貼っておく

![スクリーンショット 2017-09-29 21.50.35.png](https://qiita-image-store.s3.amazonaws.com/0/136286/d8da86d5-6160-4e53-623f-fb96f2de0b07.png "スクリーンショット 2017-09-29 21.50.35.png")



## HISTORY API

Demo : http://codepen.io/mo4_9/pen/XNOZyB

```javascript
let count = 0;
const result = document.getElementById("result");

document.getElementById("btn").addEventListener("click", (e) => {
  if( window.history && window.history.pushState ){
    result.textContent = ++count;
    history.pushState(count, null, `${location.host}/${count}`)
    console.log(`${location.host}/${count}`)
  }
})

window.addEventListener("popstate", (e) => {
  count = e.state;
  result.textContent = count;
})
```

>  参考
[【HTML5】HISTORY API「pushState/popState」を使って画面遷移しなくてもURLを変化させて、戻るボタンの挙動をカスタマイズする](http://unitopi.com/html5-historyapi/)
[pushState() + AJaxでスムーズなコンテンツの遷移](https://sterfield.co.jp/designer/pushstate-ajax%E3%81%A7%E3%82%B9%E3%83%A0%E3%83%BC%E3%82%BA%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E9%81%B7%E7%A7%BB/)
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル3

# 関連の実装

## 1対多の実装 その１　Setを使う
単純にあるモデルがSetを持つような実装になります。

例としては、Order(注文）において、複数の商品(Item)が含まれるというものです。

```
[Order]<>--[Item]
```
※　今回は商品は１種につき１個しか買えないというザル仕様です。。。


```java:Order.java

public class Order{
  OrderId orderId;
  Set<Item> items;
}
```

単純ですが、ポイントはListじゃなくて**Set(重複不可)**で表現しているところですね。
また、今回は直接Setで実装してますが、Setをラップしたクラスを使うともっとシンプルになりますよ。

## 1対多の実装 その２ RDBから取得

書籍の例を上記のOrderとItemの例に置き換えて書いてみます。
(この実装でよいのかは別として・・・書籍でも「**例を説明するために単純化している**」としています。実際はRDBから取得するにしても別のやり方を探しましょう。モデルにSQLの知識が含まれてしまってますし。。。)

```java:Order.java

class Order{
  OrderId orderId;
  
  Set getItems(){
    String setQuery = "SELECT * FROM Items WHERE OrderId =" + orderId.id + ";"
    return QueryService.findItemsFor(sqlQuery);
  }
}
```

インスタンス変数としては、Iｄしか持たず、実態はRDBから取得しています。
※　実装の方法はともかくとして、findItemsFor(sqlQuery)という名前が秀逸ですね。引数含めてfind items for sqlQuery と読めます。

## 限定子を利用した実装 その１　Mapを使う

```
[Order]【ItemCode】<>--[Item]
```

```java:Order.java

public class Order{
  OrderId orderId;
  Map<ItemId, Item> items;

  Items getItem(ItemCode itemCode){
    return items.get(itemCode.id);
  }
}
```

itemCodeで限定し、1対多から1対１に関連を減らしています。

こちらもMapをラップしたクラスを用意してあげるともっとすっきりします。

ポイントは限定子を**Mapで表現**しているところですね。

## 限定子を利用した実装 その2　RDBから取得
同じく書籍の例のやり方で実装しています。(例としてわかりやすくするためモデルにSQL書いちゃってます)

```java:Order.java

public class Order{
  OrderId orderId;
  
  Items getItem(ItemCode itemCode){
    String setQuery = "SELECT * FROM Items WHERE OrderId =" + orderId.id + "AND ItemCode = " + itemCode.id + ";"
    return QueryService.findItemsFor(sqlQuery);
  }
}
```

どういう実装にするかは、ドメインの理解(多の方も含め一気に取得しないといけないのか、多の方は後から取得(遅延評価)でもいいのかなど)と、実装上の問題（性能とかの問題）の兼ね合いもあるかと思います。

[前々回](https://qiita.com/YasuhiroKimesawa/items/ab99ca75664404a4bbe6#%E5%AE%9F%E8%A3%85%E3%81%A7%E5%A6%A5%E5%8D%94%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8)の"実装で妥協すること"というのはこういうのも含まれるのですね。
Xamarin.FormsアプリでRealmを使って，ASP.NET Coreで作ったWebアプリとDBを共有してみよう

注)ポエム以下です

---
追記:
Read-Only 前提で進めていたのですが，Realm Objet Store(RealmのCoreっぽいやつ)のバグで，Read-OnlyのRealmをSyncしようとすると，初回はダウンロードできるのですが，その後同期が行われないという状態になります．
そのため，以下の内容はRead-Onlyじゃなくても良い，という状況下の場合，という風に読み替えてください．

ちなみにWrite権限を与えると同期ができます...マスターデータ書き換えられそうで怖い...

---

前回の[ASP.NET Core MVC で CRUD して Realm Object Server と連携してみよう](https://qiita.com/yamachu/items/e986f3fbe7206d54ff12)の続きとなる記事です．

前回はASP.NET Coreを使って，Realm Object Serverと連携するようなアプリケーションを作成しました．
今回はそのアプリケーションが操作するRealmのデータベースを ~~Read-onlyで~~同期するようなクライアントアプリケーションを作っていきます．

~~本来であればユーザ毎にデータベースを作って，というような運用がRealmでは行われると思うのですが，このようにRead-onlyとしたのはイベントのアナウンスの内容や，展示物の紹介は読み取り専用という前提で行われるよね？と思ったからです．~~
実際現在開発中の大学祭のアプリケーションではこのような運用でマスターデータを配信し，オフラインでもユーザさんが参照できるような形にしています．

## 成果物

ソースを見たほうが早い！という方もいらっしゃると思うので，とりあえずリポジトリがこちらになります．
https://github.com/yamachu/RealmNetCoreSample

今回はリリースされたばかりのASP.NET Core2.0やXamarin.Forms2.4.x，またC# 7.1の記法などを使用したプロジェクトになっているので，ビルドするには最新の環境が必要になるかと思います．
またモバイル側は https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-2.4/2.4.0-stable/ でもあるように，VS4Mでうまくビルドが通らなかったりなどあるので，現在Androidのプロジェクトはslnファイルでコメントアウトしてあります．
~~Windows環境で誰か検証ができたら確認していただけるとありがたいです（人任せ）~~

## 開発！

前回のプロジェクトが完成している場合は，もう既に他のユーザーと共有可能なデータベースと，編集を行うような管理ページが出来ていると思います．それを前提に話をすすめていきます．

とりあえずサーバー側はいい感じに出来てそうなので，クライアント側のことを中心に考えましょう．
私は作成したAPIを叩くモデルを作る際は，まずコンソールアプリケーションから作って確認しています．
今回もその流れでやっていきたいと思います．

じゃあまずはログイン処理から...という感じなのですが，ここに素晴らしいチュートリアルがあるのでそちらを参考にしてください．

ytabuchi氏が行ったRealmのハンズオンの資料？です．
https://github.com/ytabuchi/RealmMobilePlatform/blob/master/TutorialXamarin.md

あれ，もうこれでモバイルのも全部説明終わりでは...
というのも，モバイルのUI周りはこちらのチュートリアルを参考にしたので，もう説明することがなくなってしまいました:innocent:

## おわりに

えっ，内容なくない？という感じではありますが，今回はこれで終わりです．

まとめると

Realmのモバイルの初歩を学びたいのであれば
https://github.com/ytabuchi/RealmMobilePlatform/blob/master/TutorialXamarin.md
を見て，
ASP.NET Coreのアプリケーションとモバイル両方やるのであれば
https://qiita.com/yamachu/items/e986f3fbe7206d54ff12
https://github.com/yamachu/RealmNetCoreSample
を見よう，です．

現在この記事に関することでプロジェクトをひとつすすめているので，それでさらに知見が溜まったらボリュームアップして更新したいと思いますので，どうかお待ちいただければ...
Swift で URL のクエリストリングを簡単に追加したい

## やりたいこと
Swift で URL のクエリストリングを簡単に追加したい
例）`"https://qiita.com"` -> `"https://qiita.com?name=value"` 

### 環境
Swift 4.0

## 冗長になりやすい
Swift では文字列結合や`URLComponents`を利用することでクエリストリングの追加が可能ですが、いずれも冗長な書き方となってしまいます。

* 文字列結合を行う場合

```swift
let url = URL(string: "https://qiita.com")!
let queryStringAddedUrl = URL(string: 
	url.description.description + (nil == url.query ? "?" : "&") + "name=value"
) // https://qiita.com?name=value
```

* `URLComponents`を使用する場合

```swift
let url = URL(string: "https://qiita.com")!
var components = URLComponents(url: url, resolvingAgainstBaseURL: nil != url.baseURL)
components?.queryItems = [URLQueryItem(name: "name", value: "value")] + (components?.queryItems ?? [])
let queryStringAddedUrl = components?.url // https://qiita.com?name=value
```

## 簡潔にしてみた
簡潔に書きたかったので`URL`に Extension を実装しました。 

```swift:URL+.swift
extension URL {
    
    // クエリを一つ追加した新しいURLを返す
    func queryItemAdded(name: String,  value: String?) -> URL? {
        return self.queryItemsAdded([URLQueryItem(name: name, value: value)])
    }
    
    // クエリを複数追加した新しいURLを返す
    func queryItemsAdded(_ queryItems: [URLQueryItem]) -> URL? {
        guard var components = URLComponents(url: self, resolvingAgainstBaseURL: nil != self.baseURL) else {
            return nil
        }
        components.queryItems = queryItems + (components.queryItems ?? [])
        return components.url
    }
    
}
```

使ってみるとこうなります。シンプルです。

```swift
let queryStringAddedUrl = url.queryItemAdded(name: "name",  value: "value") // https://qiita.com?name=value
```

## これだと困ること

* 同一キーなクエリを追加する必要がある場合
* `String?` 以外の型のまま追加したくなる場合

にはこれだけだと対応が難しいです。上の Extension を拡張していくのも良いですが、ググると[URLQueryBuilder](https://github.com/fromkk/URLQueryBuilder)のようなライブラリがあるので手を出してみるのもいいかもしれません。
ブラウザのレンダリングの流れ（個人的解釈）

本を読んでレンダリングの大まかな流れを勉強しました。

レンダリングの大まかな流れは以下で記載されているものと同じです。
https://qiita.com/mikimhk/items/7cfbd6c94d0f3d7aa51f#3-rendering
（リンクにて参考にさせていただきます。）

# 個人的解釈
この
**Loading⇒Scripting⇒Rendering⇒Painting（これらをまとめてフレームと呼ぶ）**
を読んだときなるほどなぁと思っていたのですが、こんなにはっきりと段階が分かれていたら

* Paintingが一つしかなければ全てが同時に画面上に描画されることになる。
* ```</body>```の直前に重い外部javascriptを読み込ませるとDOM構築完了イベントが発生する前に画面描画が始まっているケースもある。
* スクリプトの読み込みなんてヘッダ内でも```</body>```の直前に置いたって差が出るわけがない。

というようなことを思いました。

参考
「script要素の記述位置によってページの表示速度が変わる」
https://allabout.co.jp/gm/gc/380498/2/

そこでたどり着いた考え方は**この「フレーム」が複数実行されていく**という考え方です。
更に、Loading⇒Rendering⇒PaintingというScriptingを切り離した考え方でも良いかもしれません。

CSSでdisplay:none;を設定していても、初期描画でチラっと見える現象等(FOUC)もありますが、これは描画後にcssを当てているようなのでこれに関しても

Loading⇒Rendering⇒Painting

の1つの流れでは説明できない

①Loading⇒Rendering⇒Painting（HTMLリソースを上からDOMに解釈して、描画）
②Loading⇒Rendering⇒Painting（CSSリソースをロード後解釈して、適用）

と考えれば説明できなくもない

**追記**：最近のブラウザではlinkでCSSを設定していれば読み込んで解釈するまで描画がブロックされるようなのでFOUCは起こらないみたいです。

（本にはScriptingの説明にDOM操作によりRenderingフェーズやPaintingフェーズを引き起こすがあります。外部のリソースを取得するとLoadingフェーズを引き起こしますとありました）

**スクリプトを入れたhtmlで色々試してみましたが、結局上から読んでいって描画しているという理解で問題なさそうです。**

自分自身よくわかっていませんので、コメントいただけるとありがたいです。
Object.entries()の逆変換

# ない！

# 調べてワンライナーで書いた

```js
> [['a','b'],['c','d']].reduce(function(result, arr){result[arr[0]]=arr[1]; return result;},{})
> {a: "b", c: "d"}
```

# 結論
微妙。。。。

# コメントで天才たちが勝手に改良してるのでコメント欄推奨
感謝しかない
VB.netのハテナ　1回の接続で連続してselect文を発行する方法

毎回接続しても、コストは微々たるものなので、どちらでもいいのかなと思うのですが、
こんな書き方もできるようです。


開発環境：Visual Studio 2015、VB、フォームアプリ

```vb:連続でselect文発行
    
    Imports System.Data.SqlClient 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Using cn As SqlConnection = New SqlConnection()

            cn.ConnectionString = "接続文字列…"
            cn.Open()

            Dim command As New SqlClient.SqlCommand

            'コマンドの種類をテキストにする（省略可）
            command.CommandType = CommandType.Text
            '実行するSQLを指定
            'ここで複数のSelect文を設定し、sr.NextResult() で次の結果に移る。
            command.CommandText = "SELECT … FROM マスタAAA; " +        '←１つ目【最後にセミコロン要】
                                  "SELECT … FROM マスタBBB "          '←２つ目

            'コネクションの指定
            command.Connection = cn

            'SQLの結果を取得する
            Dim sr As SqlDataReader = command.ExecuteReader()


            '【１つ目】----------
            If sr.HasRows Then
                '有り
                While sr.Read()
                    '処理
                End While
            Else
                'データ無し
            End If

            sr.NextResult()             '<==========次の結果に移る!!!。


            '【２つ目】----------
            If sr.HasRows Then
                '有り
                While sr.Read()
                    '処理
                End While
            Else
                'データ無し
            End If

        End Using
    End Sub
```
Cloud9 on Rails Gitの設定一部始終

# Cloud9でGitの設定を行う

## Github上での操作
####1. まずはgithubで新規にレポジトリを作成します

<img width="384" alt="スクリーンショット 2017-09-29 20.41.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/144288/1e055350-75f1-f96d-5973-3151f6b819db.png">

####2. リポジトリの情報を適当に埋めて作成

<img width="757" alt="スクリーンショット 2017-09-29 20.42.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/144288/d59c87d0-1323-b84d-a25a-a7a356947bba.png">

情報を埋めたら、緑の**Create repository**ボタンを押す

####3. リポジトリのパスをコピーする
<img width="1024" alt="スクリーンショット 2017-09-29 20.44.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/144288/fc6763cf-2dfc-8bad-b193-6b3813644495.png">

## cloud9上での操作

####1. ターミナルで下記のコマンドを実行する

```
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin [先ほど取得したリポジトリのパス]
$ git push origin master
```

コマンドの意味は上から、
1. gitの初期化
2. 配下のファイルをgit管理に加える
3. 最初のコミット
4. ローカルとgithubを接続する
5. githubへソースコードをアップする


####2. githubへ戻って確認
下記のようになっていればgitの設定はOK

<img width="1264" alt="スクリーンショット 2017-09-29 20.57.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/144288/3bfdd8d9-9e73-caa9-293d-73314778b2de.png">
Dockerのmulti-stage buildsを使ってGolang x Linux Alpineコンテナを作成する



Docker 17.05からビルド用のコンテナと実行用のコンテナを分けれるようになったので、試しに簡単なサンプルを作ってみました。
1つのDockerfileだけで、Goのビルドから最小構成の実行用コンテナを作成することができるようになります。
https://docs.docker.com/engine/userguide/eng-image/multistage-build/


サンプルで、`Hello, World!`とだけ返すhttpサーバーを書きます。

```go:main.go
package main

import "net/http"
import "os"
import "io"
import "log"

func main() {
	message := "Hello, World!"

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		log.Printf("%s %s, User-Agent: %s", r.Method, r.RequestURI, r.UserAgent())
		w.Header().Set("Content-Type", "text/plain")
		io.WriteString(w, message)
	})

	log.Println("Start listen 127.0.0.1:8080")
	http.ListenAndServe(":8080", nil)
}

```

次にDockerfile

```Dockerfile
###############################
# Builder container
###############################

From golang:1.9 as builder
RUN apt-get update
WORKDIR /go/src/app
COPY . .

# Install dependencies...
RUN go-wrapper download
RUN go-wrapper install

# Compile
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .


###############################
# Exec container
###############################

From alpine:latest
EXPOSE 8080
COPY --from=builder /go/src/app/app /app
CMD ["/app"]
```

ポイントはBuilder containerの`as builder`でstage名をつけて、
Exec containerの`COPY`のところで`--from=builder`で受け取るところです。
[iPhone X] 「Face IDには完全に対応してしない可能性があります。」対処法

# このAppはFace IDに対応しとるのに！

Face ID対応の開発をしているのに、以下のアラートが表示されることがあります。

![0001.png](https://qiita-image-store.s3.amazonaws.com/0/95033/2064754f-2467-adbc-45a1-6d275a8461a8.png)



> **"App"にFace IDの使用を許可しますか？**
> このAppはTouch IDを使用するように設計されていて、
> Face IDには完全に対応していない可能性があります。
> [許可しない]　[OK]


# 対処方法
以下のkeyと文字列をinfo.plistに追加することで解決します。

```xml:info.plist
<key>NSFaceIDUsageDescription</key>
<string>この文字列を設定してください。</string>
```


![0002.png](https://qiita-image-store.s3.amazonaws.com/0/95033/4537f1a1-934e-cc5b-cea3-d23e99c1520a.png)


# ちなみに
この設定は**Xcode8.3.3**でビルドしたアプリでも有効です。

Face IDに対応しなくちゃいけないけど、Xcode9.xに移行はできない
大人の事情があるときに役立ちます。:relaxed:
CentOS7にapacheを導入する過程


1. コンソールからサーバー起動
2. サーバーにログインしてみる
	
	```terminal
	ssh IPアドレス
	```
	
3. 作業用ユーザーを追加する

	```terminal
	useradd ユーザーネーム
	```
	
4. 作業用ユーザーにパスワードを設定する
	
	```terminal
	passwd ユーザーネーム
	```
	
5. ユーザーのグループを確認
	
	```terminal
	groups ユーザーネーム
	```
	
6. `sudo`を使えるように、ユーザーのグループを変更する
	
	```terminal
	usermod -G wheel ユーザーネーム
	```
	
7. `sudo`が使えるか試してみる 

	```terminal
	su - ユーザーネーム
	sudo pwd
	# -> /home/ユーザーネームとか出る
	```
	
8. サーバーから一旦ログアウトして、作成したユーザーでログインできるか確認する

	```terminal
	exit 
	ssh ユーザーネーム@IPアドレス
	```
		
9. 鍵認証でログインできるようにする

	```terminal
	mkdir .ssh
	chmod 700
	touch .ssh/authorized_keys
	chmod 600 .ssh/authorized_keys
	vi .ssh/authorized_keys # ローカルの公開鍵をコピペする
	```

10. ルートログイン、パスワードログインを禁止する

	```terminal
	sudo vi /etc/ssh/sshd_config
	# PermitRootLogin no / PasswordAuthentication no 左記の該当箇所を設定
	```
	
11. 設定を反映させるためにsshdをリスタートする

	```terminal
	sudo service sshd restart
	```

12. yumを最新にする

	```terminal
	sudo yum -y update
	```
	
13. apacheのインストール

	```terminal
	sudo yum -y install httpd
	```
	
14. apacheの起動

	```terminal
	sudo systemctl start httpd.service	
	sudo systemctl status httpd.service # 起動チェック
	```
15. apacheの自動起動設定
	
	```terminal
	sudo systemctl enable httpd.service
	sudo systemctl is-enabled httpd # 設定されたかチェック
	```
	
16. ファイアウォールでhttp通信を許可するよう設定


	```terminal
	sudo firewall-cmd --permanent --zone=public --add-service=http
	sudo firewall-cmd --reload
	sudo firewall-cmd --zone=public --list-all
	```
bundle exec rails consoleが実行できないエラー

## 概要

`$ bundle exec rails console`　を実行すると、

```
Running via Spring preloader in process 38930
~/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:274:
in `require': dlopen(~/.rbenv/versions/2.3.0/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle, 9): Library not loaded:
/usr/local/opt/readline/lib/libreadline.6.dylib (LoadError)
Referenced from: ~/.rbenv/versions/2.3.0/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
Reason: image not found - ~/.rbenv/versions/2.3.0/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle

```
とエラーを吐いた。

## 解決方法
stackoverflow様を参照
https://stackoverflow.com/questions/16756287/cannot-execute-rails-console-due-to-an-error-with-readline

他の人も下記で解決していたようなのでそれに倣う

```
$ ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.dylib
```

## 結果
ものの見事に解決！！

しかし、肝心のエラーの意味が理解できていない。

コメントを見てみると

> `A brew update && brew upgrade` brought in `libreadline.7.x.dylib` while automatically removing `libreadline.6.x.dylib`, which ruby was still relying on.

とある。

つまり、以前に実行していた `brew update` によって自動的に `libreadline.7.x.dylib`が導入され、
必要とされる`libreadline.6.x.dylib`が抹消されていたことが原因であった。


`libreadline.6.x.dylib`については自分の知識外であったので何か補足できることがあれば追記していきたい。
AWSでインスタンス起動直後にシェルスクリプトを実行

シェルスクリプトを用意

```bash:実行したいシェルスクリプト/path/to/target_shell_script.sh

#!/bin/bash
# chkconfig: 2345 98 20
# description: service_name
# processname: service_name

date >> /home/rev84/date.log

```

んで service に登録

```bash
#コピーする場合
sudo cp /path/to/target_shell_script.sh /etc/init.d/service_name
# 直接書く場合
#sudo vim /etc/init.d/service_name

sudo chmod 0755 /etc/init.d/service_name
sudo chkconfig --add service_name
sudo chkconfig service_name on

```

停止し、起動すると実行される。
Androidでどんな時でもセンサ値を収集し続けられるようにする方法

# 概要
加速度や角速度などのセンサ値を収集し続けるAndroidアプリ、要はロガーを開発する際に、Dozeやスリープ（電源ボタンを押して画面が消えている状態）になった時の対応についてまとめる

# 要件
- Dozeに耐える
- 画面をスリープしてもセンサ値を収集し続ける（SensorManagerで取れる加速度や角速度、気圧などを対象としているが、Wi-FiやGPSでも同じ対策方法で取れそうな気はする）

# 結論
結論から言うとタイトルのベストプラクティスは、対象アプリをDozeのホワイトリストに入れて、WakeLockをacquireすると、センサ値を収集し続けることができる。

# センサ値が取得できない時とは
SensorManagerにregisterListenerしてなかったからとかそういうレベルではなく、Dozeやスリープモードによってセンサ値が取得できない状況が多々ある。

Dozeに関しては、[Android M/NのDozeによる制限とバックグラウンドタスク実行に関するまとめ](https://qiita.com/FumihikoSHIROYAMA/items/b1d6dbda120462d0e209)が非常によくまとまってるので読むべき。
合わせて[Doze と App Standby 用に最適化する](https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=ja)も読もう。

スリープモードは、[Android　PowerManager を使う](http://y-anz-m.blogspot.jp/2010/09/androidpowermanager.html)などにあるが、要は画面がスリープした時に処理が止まってしまうため、センサ値が取得できなくなる。

# 対策
## Doze
Doze対策はホワイトリストに入れるのが最も簡単。

manifestに

```xml
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
```
を追加。

ホワイトリストに入れるようにユーザに促す。onCreateとかで呼ぼう
電池の最適化云々のダイアログが出るので**はい**をタップすればホワイトリストに入る。
ホワイトリスト入ってるかどうかは、`isIgnoringBatteryOptimizations`でも分かるが、`設定->電池->右上から電池の最適化` からでも確認できる

```java
PowerManager powerManager = getSystemService(PowerManager.class);
if (!powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
    Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}
```

## スリープ
Doze対策をしていると、WakeLockが使えるのでこうする。

```java
//private PowerManager.WakeLock wakeLock;

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getPackageName());
wakeLock.acquire();
//wakeLock.release(); //使い終わった時とかonDestroyとかで呼ぼう
```

# まとめ
当然ながら、バッテリー消費は増加する。
こういうアプリがストアから配信できるのかは不明。
git rebase -i を tig を使ってグラフィカルに行う

`git rebase -i` って面倒ですよね。`git rebase -i HEAD~5` など、戻るコミット数を明示する必要があります。tig を使って `git rebase -i` をグラフィカルにできるようにしましょう。

tig については [tigでgitをもっと便利に！ addやcommitも](https://qiita.com/suino/items/b0dae7e00bd7165f79ea) がわかりやすいです。

# `git rebase -i` できるように ~/.tigrc に設定を追加
```:~/.tigrc
bind main    R !git rebase -i %(commit)
bind diff    R !git rebase -i %(commit)
```

`R`はキーバインドです。自分の好きなキーを設定できます。
<details><Summary>追記と注意：2017/09/30</Summary>
 [ka_さんのコメント](https://qiita.com/numanomanu/items/513d62fb4a7921880085#comment-52737e283d3cee9ee087)にもありますが、 `R` 設定をすると tig の"Reload and refresh view" という機能が rebsae 機能に上書きされます。tig の設定が初めての方は `B` の方がいいかもしれません。ただし、F5 でも更新できるのと、自分が慣れてしまっているのもあって、この記事は `R` のままにしています</details>
tig で選択した箇所で `R` を押すと　`git rebase -i` が起動します。

# tig 上で選択したコミットから `git rebase -i` してみる
`feat: 修正`というコミットを商品データの取得というコミットに fixup する例|
---|
![record6.gif](https://qiita-image-store.s3.amazonaws.com/0/26095/9463812e-c927-03db-5562-8b44526db730.gif)|


# 参考
もっと詳しい tig の使い方。 
- [Tig で Git を自由自在に操作するための .tigrc 設定例](https://qiita.com/sfus/items/063797a1dd8fdc7d032f)
- [tigを使って簡単にfixupやsquashコミットを作る](https://qiita.com/yuku_t/items/04853c9aecb40edadbb2)
[Survey] Kaggle - Santander 15位解法まとめ

Kaggle - Santander Product Recommendation[^1]の15位解法[^2]の調査記事です．

Names: Lam Dang and Guillaume Huard
Kaggle Discussion: https://www.kaggle.com/c/santander-product-recommendation/forums/t/26812/insights-sharing

## モデル

- 運河と州と国情報による分散表現を入力とするニューラルネット
	- GRU層には5ヶ月間の製品購入履歴(2015年6月の情報があまりに重要すぎるため，5ヶ月以上利用できなかった)
	- 密結合層部分には２つの異なる構造を利用
		- A) 通常のフィードフォワードネット
		- B) 密結合したネット(性能は良いが時間は掛かるため，パラメータを調整しきれなかった)
	- 出力層部分はloglossを利用

## 特徴抽出

- 購入履歴(リーク情報)
- 季節性: 6月以外のデータを訓練データとして多めに追加することで，過学習を防ぐ．(6月はかなりイレギュラーな月)
- トレンド: 特徴量eco, deco, deraなどで存在．月の変数を持たないようにしてCVを行って，正解と予測の差を取ることで検出．(cf.下図)
- 特徴量fecha_altaに関して
	- 2016年7月の顧客は他時期の顧客と比べて傾向が違う．(別のDBデータが追加されたため？)
	- 毎年6月から12月までに購読のピークが存在するので，時期ごとで2つに分けた．(localでは改善するも，LBでは0.0005とわずかしか改善せず)
- GuillaumeのXGBoostと著者のネットのアンサンブルでLB:0.002改善

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/9597000a-ff73-5fb8-ccbd-d31ce9568035.png)



## その他(改善につなげられなかった項目)

- tjcrがLBでは3番だったけど，予測では6番とずれてたのが不明なところ．
- 製品間の相関を利用しなかった
- 特徴量reciboにはっきりとした周期性のある顧客は1000名足らず．
- 製品の幾つかは，最後の数ヶ月ではっきりとした傾向があったけど，どうにもならんかった．

## References

[^1]: Kaggle, [Santander Product Recommendation](https://www.kaggle.com/c/santander-product-recommendation).
[^2]: Lam Dang and Guillaume Huard, [Insights sharing](https://www.kaggle.com/c/santander-product-recommendation/forums/t/26812/insights-sharing)
【質問】WANミニポート(PPPOE)について質問です。

WANミニポート(PPPOE)について質問です。

■質問概要
Windows8.1でルータを使わずに、PCから直接プロバイダへ繋いでいます。
ネットワーク接続(NIC)が複数あるのですが、どのような基準で使用するネットワーク接続(NIC)を選んでいるのでしょうか？
また、使用するネットワーク接続(NIC)を指定するにはどの様にしたら良いでしょうか？

■<ネットワーク接続>の構成
1.OCN WANミニポート(PPPOE)→物理的には何も存在しない
2.メイン(PCに最初から付いているLAN)→NTT終端装置へ直接繋いでいる
3.サブ(USBで外付けしたLAN)→<LAN内の別のPC>へ繋いでいる

■<ネットワーク接続>の設定
1.TCP/IPv4設定→IPアドレスを自動的に取得する
2.TCP/IPv4設定→IPアドレスを自動的に取得する
3.TCP/IPv4設定→次のIPアドレスを使う 192.168.1.2(LAN)

■質問詳細
1.の接続/切断を繰り返します。

接続時、
2.の経路へパケットが流れる事もあれば、
3.の経路へパケットが流れる事もあります。

どのような基準で2.3.が選ばれているのでしょうか？
常に2.の経路でインターネットを使いたいのですが、
どのように指定すれば良いのでしょうか？

また、
3.の経路先にある<LAN内の別のPC>とのネットワークのやりとりがとても重いので、
余計なパケットが流れていそうです。
どのようにしたら余計なパケットが流れないようになるのでしょうか？

■1.の接続/切断に使用しているコマンド
rasdial "OCN" /disconnect
rasdial "OCN" "ISPユーザID" "ISPユーザパスワード"
※画面から普通にクリックもできますが、上記コマンドを使用しています
READMEと同じ内容をドキュメントにも含める方法


私はプロジェクトの文書化にはSphinxを利用していて、Sphinxのソースはそのプロジェクト内のdoc/source下に置いていてます。また、プロジェクトのREADMEもRSTで記述しています。例えば下図のような感じです。

```
project/
  |
  +--README.rst
  |
  +--doc/
  :   |
      +--source/
      |    |
      :    +--overview.rst
           |
           :
```

GitHubのリポジトリのフロントページには、`README.rst`の内容が表示されるので、`README.rst`にはそのプロジェクトの概要を記述すると思いますが、同じような内容を、そのプロジェクトのドキュメント内にも含めたい場合があります。上の例では、ドキュメントのソースディレクトリ内の`overview.rst`内に、`README.rst`とほぼ同じ内容を記述したい場合です。

同じ内容を`overview.rst`にも記述すればよいのですが、修正するときに両方のファイルを更新しなければならず、どちらかを更新し忘れたりする恐れもあり、少し面倒です。できれば一カ所だけを更新したいものです。

解決策として、`include`ディレクティブを使用することで、`overview.rst`tに、`README.rst`から内容を`overview.rst`に生成することが可能です。上の例では、次のように`overview.rst`に記述しビルドすると、`README.rst`の5行目から124行目までと同一の内容が、`overview.rst`のビルド結果にも生成されます。

```
.. include:: ../../README.rst
   :start-line: 4
   :end-line: 125
```
`overview.rst`に反映したい内容は、`README.rst`全体ではなく、一部だけだったりするので、この範囲を指定するオプションがはありがたいです。`include`ディレクティブには[これ以外にもオプション](http://docutils.sourceforge.net/docs/ref/rst/directives.html#include)があるので、他にも便利なオプションがあるかもしれません。

ただし、GitHub上で`overview.rst`を直接開けると、`README.rst`の内容は表示されません。セキュリティ上`include`ディレクティブは対応していないらしいです。反ですので、逆に`README.rst`に`overview.rst`の内容を`include`するとGitHub上のレポジトりのページにその部分が表示されなくなるのでやめたほうがよいでしょう。
Finderで ~/Library をデフォルトで表示させる（MacOS High Sierra）


MacOS High Sierra (10.13) をクリーンインストールしてセットアップ。

で、毎回のようにFinderで ~/Library をデフォルト表示させようと以下のコマンドを発行。

`chflags nohidden ~/Library/;killall Finder`

が、ライブラリは表示されず。

なので、Finderの表示メニューから設定。

Finderでホームフォルダを表示
　　↓
「表示」メニュー
　　↓
「表示オプションを表示（⌘J）」
　　↓
「“ライブラリ”フォルダを表示」にチェック
![表示オプション_2.png](https://qiita-image-store.s3.amazonaws.com/0/199088/1e65b03b-b2e1-5232-8e4d-34ce986d53ee.png "表示オプション_2.png")
typetalkのボットAPIで投稿したい

# やりたい事
- typetalk のボットAPI経由でメッセージを投稿できるようにしたい
- 標準入力から入力できるといろいろ応用できそうなのでそうしたい
- お手軽にAPIをたたけるスクリプトを用意したい(とりあえずpythonで)

# 進め方

- ボット作成＋API Token、トピックID情報を取得する
- sample1.py : 開発ガイドのサンプルそのまま実行してみる
- sample2.py : 標準入力からの取得処理を追加してみる

## ボット作成＋API Token、トピックID情報取得
- 開発ガイド: https://developer.nulab-inc.com/ja/docs/typetalk/auth/ に従いトピック内にボット追加

![1_botregist.png](https://qiita-image-store.s3.amazonaws.com/0/75076/efeb2b03-c8fd-4810-331e-e373781dfcd0.png)

- ID,名前はとりあえず適当でOK
- APIスコープは `topic.post` の権限があれば投稿できる
- ボット設定画面の `Typetalk Token` と、ボットを作成したトピックのURL内などから`TopicID` を確認してメモる。

## sample1.py : 開発ガイドのサンプルそのままで動作確認
- 公式サンプル: https://developer.nulab-inc.com/ja/docs/typetalk/samples/#tt_python
- 環境により先に `pip install requests` でrequests 導入 http://requests-docs-ja.readthedocs.io/en/latest/user/install/
- 1) で取得した `Typetalk Token` と `toipic id` があればとりあえず試せる

```python:sample1.py
import requests
r = requests.post('https://typetalk.com/api/v1/topics/<topic id>?typetalkToken=<api token>', {'message':'Hello, Typetalk!'})
print r.status_code
print r.json()
```

```bash:実行
python sample1.py
```

- うまく動いたら 標準入力を受け取れるようサンプルを拡張していく

## sample2.py : 標準入力からの取得処理を追加

- topic_id と api_token を変数に
- message は標準入力からメッセージ拾って組み立てるよう拡張

```python:sample2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import sys

topic_id='<topic id>'
api_token='<api token>'

def main():

  lines = sys.stdin.readlines()
  for i, line in enumerate(lines):
    message = message + line

  r = requests.post('https://typetalk.com/api/v1/topics/' + topic_id +'?typetalkToken=' + api_token, {'message': message})

  r.status_code
  r.json()

if __name__ == "__main__":
  main()
```

## 使い方
```bash:sample2.py単体で実行可能になるよう実行権限を付ける
chmod +x sample2.py
```

- パイプで標準入力へ流す

```bash:echoで流す
echo "hogehoge" | sample2.py
```

```bash:catからファイルの中身を流す
cat hoge.txt | sample2.py
```

```bash:コマンド実行結果を流す
date "+%Y-%m%d" | sample2.py
```

# 参考情報
- 開発ガイド: https://developer.nulab-inc.com/ja/docs/typetalk/auth/
Laravelでテーブルにデータを保存する時に自動保存されるupdated_atの中身を調べた

２つのテーブルに存在するレコードの更新日時を比較する処理を実装したくて、updated_atカラムの値を取得して比較しようとしていたのですが、うまくいかなかったので`dd()`で`updated_at`に入った値の中身を見てみました。

#結論
・updated_atカラムに挿入された値はCarbonインスタンスだった
Carbonインスタンスなので、以下の記事にあるように`timestamp`等様々なアクセサが使えます。
http://blog.asial.co.jp/1392

#コード
例えばUserが投稿した最新のメッセージの更新日時を取得したい場合に以下のような書き方が出来ます。
最後に`timestamp`を付けることで更新日時をタイムスタンプに変換出来ます。

```php
$latestMessageUpdate = $user->messages()->latest()->first()->updated_at->timestamp;//1506594334
```
KUSANAGI で concrete5 を動かして速度測定

KUSANAGI で concrete5 を動かしてみて、速度測定してみました。
サーバーには、テコラスさんのex-cloudを採用し、Apache, PHP7, concrete5 という環境です。

## KUSANAGI
KUSANAGIは、プライム・ストラテジー株式会社が開発して公開している仮想マシン・イメージです。WordPressが高速に実行できるようにチューニングされているので、WordPressを使うときに非常に重宝しますが、WordPress以外のアプリケーションを動かすこともできます。

KUSANAGIでは、WordPressの他のCMSをインストールすることができます。インストール時にオプション設定すると、concrete5, Drupalをインストールできます。その他のCMSの場合は、まずKUSANAGIをインストールしてから、CMSのファイルをアップロードしてインストールできます。

## concrete5
concrete5は、ホームページ制作・運用管理をブラウザ上で行うソフトウェア(CMS)です。企業サイトやポータルサイト等に導入事例があるほか、[マイ見積](https://my-mitsu.jp/)のようなウェブサービスにも用いられています。

またテーマやアドオンが[公式サイト](https://concrete5.org/)で公開されているので、ホームページを自分好みにカスタマイズしたい場合にも効率よく行うことができます。

KUSANAGIのインストール、concrete5のインストールにつきましては、この記事では省略します。[公式ドキュメント](https://kusanagi.tokyo/document/)をごらんください。

## 速度測定
今回は、原始的な方法で速度測定しました。
テーマファイルの先頭の

    <?php defined('C5_EXECUTE') or die("Access Denied.");

の下に、

    $start = microtime(true);

を追加しました。
またテーマファイルの末尾の

        </body>
    </html>

の直前に、

    <?php
    $end = microtime(true);
    $diff = $end-$start;
    ?>
    <script>
        $(document).ready(function(){
            $("span.speed").text("<?php echo round($diff, 3);?>");
        });
    </script>

を追加しました。
そして、かかった時間を表示したい箇所に、

    このページの表示にかかった時間: <span class="speed"></span> (秒)

のように記述しました。

## 実際のスピードは

何回か試してみましたが、うちの環境の場合、0.025～0.035秒ぐらいのようです。[KUSANAGI上でconcrete5を実行中](https://my-mitsu.jp/kusanagiconcrete5)から確認できます。
Drupal8で記事(node)などエンティティ(entity)の情報を取得する方法 其の一

Drupalでモジュールなどを開発する際に、ユーザ情報や記事情報など必要なオブジェクトを取得し操作を行なう事がある。こう言った各種情報を取得する方法をメモする。

# Entity(エンティティ)
DrupalではEntity(エンティティ)という言葉があちこちで登場する。Drupalで扱われる記事(node)やユーザ(user)、タクソノミ(taxonomy)などは __エンティティ__ と呼ばれている。要するに記事情報であろうとユーザ情報であろうと、これらは全てエンティティ。そのエンティティが記事なのかユーザなのかは __エンティティタイプ__ の違い。(だと、解釈している）。

# \Drupal::entityManager()->getStorage()
Drupalでエンティティを取得するには ``\Drupal::entityManager()->getStorage($entity_type)``を利用する。記事(node)を扱う場合には

```php
$node_storage = \Drupal::entityManager()->getStorage('node');
//続いて、取得したStorageを利用して記事(node)IDに『1』を持つ記事を取得する。↓↓
$node = $node_storage->load(1); 
```

もしくは、``\Drupal::entityManager()->getStorage()``を使わずに以下のようにしても良い?むしろこう書くべきなのかもしれない。

```php
use \Drupal\node\Entity\Node;
$node = Node::load(1);
```

## EntityType
今までに使ったモノだけ列挙しておく。これ以外にもあるだろう…。

| 種類 | 名称 |
|:--|:--|
| ユーザ | user |
| コンテンツ | node |
| コンテンツタイプ | node_type |
| タクソノミ | taxonomy_term |

# 記事(node)

``$node = $node_storage->load(1);``とすることで$nodeには記事(node)のオブジェクトが格納されている。

## 本文とタイトルを操作する

記事(node)オブジェクトの値を操作する場合、自身で作成・追加したフィールドと本文やタイトルなどの項目は扱い方が異なる。

タイトルと本文に値をセットするには、このような記述を行う。

```php
//本文を設定
$node->body->value = "本文";
$node->body->format = "full_html";

//タイトルを設定/取得
$node->setTitle("title");
echo $node->getTitle();  //output:"title"
```

## 自身で追加したフィールド
自身でフィールドを追加した場合は、次のような記述となる。

```php
// (マシンネームが)field_text_1というフィールドに"textvalue"という文字列を設定する
//$node->set($name, $value, $notify = TRUE);

$field_name = "field_text_1";
$field_value = "textvalue";

$node->set( $field_name, $field_value);
```
Java屋がC++を書くために学習したメモ

Javaの経験がある自分がC++はどうするのか？を調べたメモ書き。（今はもっぱらPHPとScalaですけど。。。）
言語だったりIDE（VisualStudio）だったり、ごちゃ混ぜです。

# クラスの作り方 ヘッダ無し編

調べるうちにこの書き方は1ファイルで完結する(== includeしない)プログラム等、小規模なものにしか使えないので、意味無い気がしてきた。。。

```cpp:cpp
class A{
  public:
    // コンストラクタ
    A(){
      // いい感じの処理
    }
    // デストラクタ C++は開放タイミングが明示的なので必ず呼ばれる
    ~A(){
      // いい感じの処理
    }
    // 公開されたメソッド
    int getNum(){
      // privateメソッドの呼び出し
      return createNumber();
      // thisを使うならアローを使う
      // return this->createNumber();
    }
  private:
    int num = 10;
    int createNumber(){
      ++num;
      return num;
    }
};  //←C++のクラスにはセミコロンが必要。メソッドには付かないのに。。。
```

# クラスの作り方 ヘッダを有り編

現実的に使うことになる書き方。

- **includeガードは宣言(h)に書く。** 定義(cpp)には書かない。
- **CPPがヘッダをincludeする。ヘッダはCPPをincludeしない。** 
- ヘッダ<=>実装の関係ではなく、機能利用のためのincludeもヘッダのみ。
 - Javaのinterfaceの様に｢型が実装を知る必要が無いから」と覚える（しかし多態性を実現する訳じゃないので注意）
 
```cpp:A.h
#ifndef A_HEDAER
#define A_HEDAER
class A {
  public:
    A();
    ~A();
    int getNumer();
  private:
    int num;
    int createNumber();
};
#endif
```

```cpp:A.cpp
#include "A.h"
A::A():
  num(10) // メンバイニシャライザと呼ぶ初期化方法
{
  // num = 10; という初期化もできるがメンバイニシャライザのほうが効率てきらしい
}
A::~A(){
  //いい感じの処理
}
int A::getNumber(){
  return this->createNumber();   
}
int A::createNumber(){
  return ++num;
}
```

# TODO：コンパイルとリンクがincludeの肝なので後でまとめる。今はメモ書き

コンパイルは1つのCPPを`.obj`に変換する。このときヘッダはCPPにインライン化。
コンパイル時点では実動作の定義は不要なので、CPPにincludeするのは型定義(ヘッダ)で良い。`import java.util.List; List<String> = getList();` のイメージ。(interface（≒ヘッダ）をimportしていて、getListから返却される具象（≒CPP）はimportしない）
次に複数の`.obj`をリンクして実行ファイル（`.exe`等）にする。
このときにヘッダに対応した実装(cpp=>obj)が必要となる。



# コンストラクタの初期化

[ここ](http://ppp-lab.sakura.ne.jp/ProgrammingPlacePlus/cpp/language/013.html)を読むとわかる。

# インスタンス生成 メソッド呼び出し

JavaのインスタンスはC++ではオブジェクトと呼ばれることもあるみたい。

```cpp:cpp
// Javaだと未初期化になる書き方だけど、C++ではインスタンスが代入されている。
// メソッド呼び出しはドットを使う。
// 生成したスコープを抜けるとメモリ開放される。デストラクタが呼ばれる。
A a;
a.getNumber();

// Javaと同じくnewして代入するとポインタが代入される。
// メソッド呼び出しがアローになる。
// ポインタではdeleteしないとメモリ開放されない。Javaには無いやつ。
A* p_a = new A;
p_a->getNumber();
delete p_a;
```

#C++クラスの書き方が面倒くさい訳

すごくわかりやすい解説だった。
[C++クラスの書き方が面倒くさい訳](http://d.hatena.ne.jp/arvitos/20090213/1234519302)

# ソースのフォルダ分け
**Java**
packageを分けるとフォルダが物理的に分かれる。
これは言語仕様なのでIDEを使っても一緒。
**C++**
VisualStdioを使うとフィルタがフォルダ分けをする。(下の画像では```foo```がフィルタ）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/11203/ff7a8011-683f-c13a-2183-7eaa1a8629c8.png)
しかしフィルタは見た目だけなので、物理的には同じフォルダにソースが入ってる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/11203/43261269-cbf9-ff15-a05f-b695f9cae1a8.png)
なのでincludeするときは```#include "ChildClass.h"```となる。
これはC++の言語仕様ではないので物理的なフォルダ分割も可能。その場合```#include "foo/ChildClass.h"```と書く。

TODO:続きを書く
hubotに仕様書を作ってもらい、ブラウザで確認できるようする。

#はじめに
hubotは公式サイトではcoffeescriptで書かれています。しかしながら最近ではES6で書く方も増えてきているようで、読み解く時に助かるのが仕様書ですよね。
なので仕様書をhubotの中で出力、ブラウザ経由で確認できるようにしてみました。

<img width="700" alt="スクリーンショット 2017-09-29 17.05.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/127570/07e9efed-3240-69e3-5040-dbc4b0a4ce24.png">


#方法
1.jsdocの用意
2.ブラウザ表示の準備
3.jsdocで出力

hubotにはexpressがそ入っておりhttpリクエストなど受け付けることができます。
なのでそれを利用すれば簡単にブラウザに表示することができます。

####ディレクトリ構成
hubot
├── Procfile
├── README.md
├── bin
│   ├── hubot
│   └── hubot.cmd
├── external-scripts.json
├──node_modules
│   └── ...
├── package.json
├── **views**
│　　　└── **out**
│　　　　　　└── **index.html**
│   └── .....
└── scripts
　　　　└── **views.js**

太字が今回の作業で追加されるものです。viewsフォルダは最初はないので作ってください。
   


##jsdocの用意
まずはnpmから

```
npm install -g jsdoc
```

jsdocは以下のフォーマットを読み込んでくれます。

```hoge.js
/**
 * メソッドの説明
 * @param {String} hoge  引数
 * 
 * @return {String}　hige 返り値
 */
function getTagName(source,msg,releaseBranchName){
}
```

jsdocの準備はこれでOKです。

##ブラウザ表示の準備
expressは元々htmlやcssmのような静的ファイルは読み込みません。なのでそれらも読み込めるようにしてあげる必要があります。

```views.js
//viewの中の静的ファイルを表示をするファイル

module.exports = (robot) => {
  var express = require('express');
  robot.router.use(express.static(__dirname + '/views'));
};
```
これで、viewsの中の静的ファイルが読み込まれるようになりました。

##jsdocで出力
あとはjsdocを出力するだけです。グローバルのnpmに入れているので```views```ファイルの中で

```
jsdoc [出力したいファイルのパス]
```
すると```out```というフォルダの中にhtmlが出力されていると思います。

あとはブラウザで```http://[hubotがいるサーバーのIP]/out/index.html```にアクセスして表示されたら成功です！



#まとめ
仕様書はコードを理解する一助になるので、あると大変助かると思います。(特にjsだと)
ちなみに他のファイルを出力してもoutの中に排出されindex.htmlから飛ぶことができるようになりますので、じゃんじゃん仕様書作らせてあげてください！
ZenlogicでCronを使うときの注意点

Zenlogicでcronがうまく動かなかったのでメモ

#チェックポイント

- プログラムパスは正しいか
- 絶対パスで指定しているか  
- パーミッションは`755`になっているか
- 不要な改行がないか

##プログラムパスは正しいか

| プログラム | パス |
|:-:|:-:|
| bash | /bin/bash |
| sh | /bin/sh/ |
| Perl | /usr/bin/perl |
| PHP | /usr/bin/php |

```:例
#良い例
/usr/bin/php /virtual/htdocs/cron.php

#ダメな例
php /virtual/htdocs/cron.php
```

##絶対パスで指定しているか  

指定なしの場合、 `/virtual/cgi-data`で実行される

```:例
#良い例
/usr/bin/php /virtual/htdocs/cron.php

#ダメな例
/usr/bin/php cron.php
```

##パーミッションは`755`になっているか
cron指定のファイルは`755`厳守。
呼び出し先は特に指定なし。

##不要な改行がないか

```:例
#良い例
/usr/bin/php /virtual/htdocs/cron.php


#ダメな例
/usr/bin/php /virtual/htdocs/cron.php【改行】

```
クラスとオブジェクトの関係性

プログラミング初学者がつまずくポイントの一つとして「クラス」という概念があります。

Rubyをはじめとするオブジェクト指向型プログラミング言語では、クラスという入れ物が全ての基本になっています。ソースコードに登場するあらゆるオブジェクトは、実は全てが何らかのクラスに属しているのです。

Rubyにおいて、クラスという入れ物にメソッドという装備をくっつけ、オブジェクトを作り出して装備を使ってもらうのが一般的な流れになります。

#たい焼きの型（クラス）を作ってみる

クラスTaiyakiを定義してみると・・・

```Ruby
class Taiyaki
    def atama
        puts "たい焼きの頭の方にはあんこがいっぱい入っている"
    end
    
    def shippo
        puts "たい焼きの尻尾にはあんこがほとんど入っていない"
        puts "しかしカリカリしていて美味しい"
    end
end
```

クラスを指して「たい焼きの型」や「設計図」と表現したりします。これはクラスという概念に基いて、インスタンス化させ、実体のあるオブジェクトを作り出すためです。

このクラスから出来上がるたい焼きは全て「頭の方にはあんこがいっぱい入っているが、尻尾の方にはほとんど入っていない」たい焼きになるわけです。

#たい焼き（オブジェクト）を作ってみる
たい焼きの型（クラス）からたい焼き（オブジェクト）を作ってみると・・・

```Ruby
class Taiyaki
    def atama
        puts "たい焼きの頭の方にはあんこがいっぱい入っている"
    end
    
    def shippo
        puts "たい焼きの尻尾にはあんこがほとんど入っていない"
        puts "しかしカリカリしていて美味しい"
    end
end
 
taiyakikun_1gou = Taiyaki.new
taiyakikun_1gou.atama
taiyakikun_1gou.shippo
 
taiyakikun_2gou = Taiyaki.new
taiyakikun_2gou.atama
taiyakikun_2gou.shippo
```
Rubyでは「　クラス名.new　」とすることで実体のあるたい焼き（オブジェクト）を作ることができます。これをインスタンス化といいます。

また、「　オブジェクト名.メソッド　」とすることで、クラス内で定義されたメソッド・機能を実行します。

 

taiyaki_1gouとtaiyaki_2gouは、同じたい焼きの型（クラス）から作られました。持っているあんこの量（機能）も一緒です。

しかし完全に独立した別個の存在（オブジェクト）というわけです。

#まとめ
「クラス」と「オブジェクト」の関係が、「たい焼きの型」と「たい焼き」に似ているのが伝わったでしょうか。

ちなみに僕はこの話を聞いた時は「何となくわかるけどフワッとしていてやっぱりわからん」という感想を持ちました。腑に落ちたのは、自分でソースコードを書き、クラスを定義してインスタンス化し、メソッドを実行するようになってからです。

クラスとオブジェクトの関係性を学ぶ中で学んだのは、さわりだけ理解できたら早速手を動かしてみることが、プログラミング習得の近道なのだということでした。
Cognos Analytics プロンプトエリアの表示・非表示を切り替えるJavaScript

#概要
Cognos Analyticsで、プロンプトエリアの表示・非表示を切り替えるJavaScriptのサンプルの実装手順です。
プロンプトって、レポートによっては大量になり、巨大なエリアを必要としますので、この表示・非表示も非常に要望の多い要件ですね。
![000.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/439d8787-2d54-5b70-8272-e92339e7e5dd.png)

以下の記事が元です。
是非ご活用頂ければと思います。
**How to use a custom control with JavaScript to hide and show a filter panel in IBM #Cognos Analytics 11.0.7**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/how-to-use-a-custom-control-with-javascript-to-hide-and-show-a-filter-panel-in-ibm-cognos-analytics-11-0-7/

##実装手順
実装のための、元ネタとなるJavaScriptソースは、Cognos Analyticsをインストールすると、以下のフォルダに配置される「HideShowFilterPanel.js」となります。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/35249098-61af-00f8-daeb-1395eda7a76c.png)

レポートを新規に作成し、表を、1列3行幅100%で作成します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4be83d14-ba59-4f15-26b3-ab5e9df68a00.png)

表の1番上のセルに「ブロック」を置きます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/42a2520f-087f-9add-a1a9-1698ed7090db.png)

ブロックのプロパティで、以下を指定します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a8133f7e-581a-2789-7155-7552656438d4.png)

```html
Padding: 20px 20px 20px 20px
Size & overflow: Width: 100%
Name: FilterPanel
````

表の2番目のセルに「Custom Control」を置きます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3d4b5881-2cc0-1f25-78c5-351a8ec8b38c.png)

Custom Controlのプロパティで、「モジュール・パス」に以下を指定します。
/bi/samples/js/HideShowFilterPanel.js

さらにプロパティの「設定」で以下を指定します。

```html
{
"Control name": "FilterPanel",
"Orientation": "top",
"Padding": "0px 30px 0px 30px",
"Foreground color": "#003868",
"Hover foreground color": "#EAEAEA",
"Background color": "#EAEAEA",
"Hover background color": "#38A8C8",
"Border color": "#B1B6BA",
"Hover border color": "#EAEAEA",
"Font size": "10px"
}
```

Custom Controlを含む2番目のセルのプロパティで、以下を指定します。

```html
Padding: Top 0px Bottom 1px
Background color: #003868
Horizontal alignment: Center
```

以上で、プロンプトエリアを表示・非表示するための基本構造は完成です。

是非ご活用下さい。
SmartGit > 特定のタグのコミットに飛ぶ > Reveal Commit

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

Tags一覧に表示されている特定のタグのコミットに飛ぶ方法を探していた。
方法は以下のようだ。

1. Tagsの特定のタグ上で右クリック
2. Reveal Commit選択
   - 対応するコミットに飛ぶ
   - Tagsにおいてそのタグがチェックされた状態になる
バイアスとバリアンスを理解する

# バイアスとバリアンス

前回は線形回帰について書いた。
ここでは、バイアスとバリアンスについて考える。
まず、学習の目的は、「**観測不能な真の値と予測値との誤差を可能な限り小さくする**」こと。観測不能な真の値を$y$、学習によって得られる解$\widehat{f}$とすると、

```math
E_{ \widehat{f} } [(y-\widehat{f}(x)^{2}]
```
これを最小化することが学習の目的。
しかし、yを計算に組み込むことはできないので、下記のように変形する。

```math
(E_{ \widehat{f} }[\widehat{f}(x)-f(x)])^{2}+ (E_{ \widehat{f} }[\widehat{f}(x)-E_{ \widehat{f}} [\widehat{f}(x)])^{2}]+ \sigma ^{2}
```

この変形式の導出は下記サイトが参考になる。
 [バイアス-バリアンス分解：機械学習の性能評価](http://s0sem0y.hatenablog.com/entry/2017/01/24/100415)

第一項を**バイアス**、
第二項を**バリアンス**、
第三項を**ノイズ**、
という。

### バイアス

モデルと学習データの平均的なズレ。

```math
(E_{ \widehat{f} }[\widehat{f}(x)-f(x)])^{2}
```


#### １．１．サンプルデータの作成

今回は、下記のような正弦関数にノイズを加えたデータを使用する。
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/204732/1597d04e-7fa6-0346-ea70-a6d626038039.png">

```py
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
import math

np.random.seed(seed=32)
# create samples
sample_size = 50
noise_size = 0.2

dataX = np.linspace(0.0, 5.0, num=1000).reshape((1000, 1))
x = np.random.permutation(dataX)[:sample_size]
noise = noise_size * np.random.randn(sample_size, 1)
func = np.vectorize(math.sin)
y = func(x*1.6) + noise
```

#### １．２．モデルの作成
後で、モデル同士の精度を比べるため２つの多項式（３次元、９次元）を用意する。

```py
dim = [3, 9]
for d in dim:
    poly = PolynomialFeatures(degree=d)
    X = poly.fit_transform(x)
    XTX = np.dot(X.T, X)
    XTX_inv = np.linalg.inv(XTX)
    a = np.dot(XTX_inv, np.dot(X.T, y))
    Xt = poly.fit_transform(dataX)
    yt = np.dot(Xt, a)
    plt.plot(dataX, yt, label='%d polynomial' % d)
```

今回も最小二乗法で最適なパラメータを求めた。
後、多項式モデルの生成はPolynomialFeaturesで作成した。
フィッテング結果は下図の通り。
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/204732/46563c7d-4ea7-193a-a7a9-639d7c5c162c.png">
モデルを見る限り、９次元の多項式の方がよりフィットしているように見える。

#### １．３．誤差の計算

それぞれの平均二乗誤差を計算してみる。

```py
for d in dim:
    # ...
    np.sum((y - np.dot(X, a)) ** 2)/sample_size

> polynomial3, 0.163705879935
> polynomial9, 0.0444546042927
```
９次元の多項式の方が誤差が小さいことが分かる。
この誤差のことを「**バイアス**」と言う。
バイアスは「関数（モデル）を複雑にするほど減少する」
### バリアンス

バリアンスは、モデルの複雑さの度合い。
（モデルの分散と等価。）

```math
(E_{ \widehat{f} }[\widehat{f}(x)]-E_{ \widehat{f}} [\widehat{f}(x)])^{2}]
```

#### ２．１．バリアンスの計算

```py
for d in dim:
    # ...
    np.var(np.dot(X, a))

> polynomial3, 0.437629402577
> polynomial9, 0.556897933262
```
３次元の方がバリアンスは小さい。
バリアンスは「関数（モデル）を複雑にするほど増加する」

→バイアスとバリアンスはトレードオフの関係

＊ノイズは、削除不能な誤差
ext-curlが無いと怒られたときの対応

## 何が起きたか
`composer install`で怒られた

```
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for paypal/merchant-sdk-php v3.9.1 -> satisfiable by paypal/merchant-sdk-php[v3.9.1].
    - paypal/merchant-sdk-php v3.9.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
  Problem 2
    - Installation request for paypal/sdk-core-php 3.3.2 -> satisfiable by paypal/sdk-core-php[3.3.2].
    - paypal/sdk-core-php 3.3.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
  Problem 3
    - Installation request for pusher/pusher-php-server 2.6.4 -> satisfiable by pusher/pusher-php-server[2.6.4].
    - pusher/pusher-php-server 2.6.4 requires ext-curl * -> the requested PHP extension curl is missing from your system.

  To enable extensions, verify that they are enabled in your .ini files:
    - /home/ubuntu/.phpbrew/php/php-7.0.23/etc/php.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
```

## 環境
Ubuntu 14.01 LTS on Cloud9
PHP7 on phpbrew

## やったこと

```
$ sudo apt-get install  libcurl4-openssl-dev
$ phpbrew ext install curl
```
「JSONの改行区切りファイル」と呼ぶのが正しいですよね！（NOT質問）

"JSON形式"のファイルで

```json
{
"key1":"value1",
"key2":"value2"
}
{
"key1":"value1",
"key2":"value2"
}
{
"key1":"value1",
"key2":"value2"
}

```

のようなものがありますが、「JSON形式」ではないと思われますので、
これから「改行区切りJSON」と呼びましょう！(NOT質問)
gitwatch > numpy > ENH, TST, MAINT, DOC, BUG, DEP, API, STY

https://github.com/numpy/numpy

numpyのcommitを見ていると、以下の種類のコミットメッセージに分類しているようだ。

- ENH
    - Enhancement(機能強化)の意味だろうか。
- TST
    - test関連だろう
- MAINT
    - 保守関連だろう
- DOC
    - Document
- BUG
    - bug対策
- DEP
    - 廃止関連
- API
    - API関連
- STY
    - style関連

コミット数が多くなると、こういう工夫がコミット内容の確認時間短縮に有効に働くのだろうか。

### MAINT: XXX

[MAINT: When delta is a NumPy scalar, do multiplication in-place](https://github.com/numpy/numpy/commit/8acb0f7e73be9b8e797ffbe1bdce4d7076202183)

コロンでの書き方「MAINT:」は、別のリポジトリでは「パッケージ名：」として書かれる例もある。
最初に読んだ時には「MAINT」というパッケージがあるのかと思った。
[RaspberryPi] ZMAP

SSH 使い始めたら、急にパスワードが変え
インターネットもできなくなった。

何もしていないのに、、CPUが動いている。
25% ~ 100%まで、
Zmapというprocessが16-29%動いている。

調べてみたらマイニングに関連あるらしいです。皆さんも気をつけてください😭

SD CARD formatしに行きます。
データを完全に削除する方法

よくネット上で「削除されたデータを勝手に復元しました。どうすれば完全に抹消できますか？」という質問を見ました。確かに人々は他の人に見せたくない秘密があります。特に自分の古いコンピュータとスマホなどを売るときに、自分のデータが完全に削除しないと、情報漏洩を心配して不安となります。

#完全にデータを消去できまい場合

- 「shift+delete」キーで削除したデータ
- ゴミ箱から削除したデータ
- フォマットされたディスク

以上の操作をしても、[データ復元][link-1]ソフトを利用すれば簡単に復元できます。では、データを復元しないようにどうすればいいですか。


#データを抹消する方法

- OS のフォーマット機能を使う

ここでいうフォマットは完全フォマットとクイックフォマット2つがあります。完全フォーマットはハードディスクやUSBメモリの全領域を書き換えるタイプのフォーマットで、これを実行するとデータ復旧は不可能となります。それに対し、クイックフォーマットはデータ領域の先頭部分だけを書き換えるため、復元が可能な状態となります。

![format.png](https://qiita-image-store.s3.amazonaws.com/0/203250/8d43c5e3-26c3-c7d8-09e8-1f35122f2142.png)

でも完全フォマットの場合、数時間がかかる場合もあります。


- 専門のデータ消去ソフトを利用する

今無料で利用できるデータ削除ソフトもいっぱいあります。例えば、Freeraser、完全削除など、EaseUS Partition　Masterソフトの中にもデータを抹消する機能があります。

#誤って削除されたデータを復元

もしデータを誤って削除されたら、[データ復元][link-1]ソフトでも復元できます。ここで[EaseUS Data Recovery Wizard][link-1]をおすすめします。初心者でも簡単に操作できます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/203250/c71d31b8-15c8-4220-65a3-042c726200fa.png)












[link-1]:https://jp.easeus.com/data-recovery-software/drw-free.html
Project Euler Q3 【最大の素因数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
13195 の素因数は 5, 7, 13, 29 である.

600851475143 の素因数のうち最大のものを求めよ.

## 解答

```bash
factor 600851475143 |
awk '$0=$NF'
6857
```

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/003.html
Access2016で日本語VBAの表示に失敗する

# 現象
久しぶりにAccessを解析する仕事があり、Accessファイルを開いたところ、VBAの読み込みでエラーとなった。

# 環境
Access2016 バージョン : **1708** ←このバージョン重要。
Windows10 Professional

#エラー内容
![printScreen 2017-09-29 15.51.26.png](https://qiita-image-store.s3.amazonaws.com/0/103774/85785122-ff6f-441d-748f-a950ffc10f3d.png)

# やったこと
コマンドプロンプトに下記を貼り付け、バージョンを1707に戻す。

```
"%programfiles%\Common Files\Microsoft Shared\ClickToRun\officec2rclient.exe" /update user updatetoversion=16.0.8326.2107
```

# 参考サイト
[Office 2016 バージョン 1708 以降で日本語の VBA モジュール名を含むファイルを開くとエラー](https://blogs.msdn.microsoft.com/office_client_development_support_blog/2017/08/23/ver1708-issue-japanesenamevbamodule/)
Auditbeat + BigQuery + tableau で監査ログを視覚化する

# 概要
Auditbeat 試しのついでに BigQuery に流して tableau で視覚化してみた。

ElasticStack 版は[こちら](https://qiita.com/quickguard/items/abf141345b5812231284)

# 環境
- Google Cloud Platform
- CentOS 7
- auditbeat-6.0.0-rc1
- google-fluentd

# やること

Auditbeat -> Stackdriver Logging -> bigquery にエクスポート -> tableau で見る


# インストール

**google-fluentd**

```
# curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
# bash install-logging-agent.sh
```

**Auditbeat**

```
# yum -y install https://artifacts.elastic.co/downloads/beats/auditbeat/auditbeat-6.0.0-rc1-x86_64.rpm
```

# 設定

**google-fluentd**

fluent-plugin-beats インストール

```
# /opt/google-fluentd/embedded/bin/fluent-gem install fluent-plugin-beats --no-document
```

beats input 設定

```
# vi /etc/google-fluentd/config.d/beats.conf
<source>
  @type beats
  tag beats.event
</source>
```


**Auditbeat**
システムコールの監査記録も取得するようにする。
fluentd に投げるようにする。

```
# vi /etc/auditbeat/auditbeat.yml

- module: audit
  metricsets: [kernel]
  kernel.audit_rules: |
    -a always,exit -S execve

#output.elasticsearch:
  #hosts: ["localhost:9200"]

output.logstash:
  hosts: ["localhost:5044"]
```

# 起動

各種起動する。

```
# systemctl stop auditd  ※
# /etc/init.d/google-fluentd restart
# /etc/init.d/auditbeat start
```

※CentOS 7 の場合は、auditbeat と競合するので停止する

# BigQuery にエクスポート

以下でフィルタ

```
resource.type="gce_instance"
logName="projects/<project name>/logs/beats.event"
```

エクスポート作成より、BigQueryデータセット作成して選択

# BigQuery 側で確認

![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/8fadc9e4-0ff7-c314-2c0d-e057600e7048.png)


# tableau ダッシュボード作成

Kibana のダッシュボードっぽいのを作ってみる

![02.png](https://qiita-image-store.s3.amazonaws.com/0/105824/5f764b75-60f1-7f0b-dd44-cc38765b293a.png)

※データソース設定の際は 'レガシーSQLの使用' にチェック入れないとエラーになった
macOS High Sierra + Texlive 2017 + ヒラギノフォント

#そもそもの議論は
「macOS High Sierra のヒラギノフォント」 - https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2267
に詳しいです．

#前提
####MacTeX2017を使ってインストールおよびアップデートが終わっていること．
#目的
####TeXLive 2017フルインストールの環境でdvipdfmxにてヒラギノフォントを埋め込むことが出来るようになる．

#方法
##MacTeXを以前にインストールしたことがない（例えばmacOSをクリーンインストールした，新しいマシンを買ったなど）環境での注意

以下の作業が必要かもしれないです．
`
$ cd $(dirname $(gs --help | grep "Resource/Font" | awk '{print $1}'))
$ rm ./CIDFSubst/ipa*.ttf
`

## cjk-gs-support
#### High Sierraで変わってしまったフォントのパスやファイル名を正しく反映したシンボリックリンクを`${TEXMF}/fonts/opentype/`以下に作成する 

https://github.com/texjporg/cjk-gs-support をホームディレクトリ等にクローン
`
$ git clone https://github.com/texjporg/cjk-gs-support.git
$ cd cjk-gs-support
$ sudo ./cjk-gs-integrate.pl --link-texmf --fontdef-add=./cjkgs-macos-highsierra.dat
$ sudo mktexlsr
`

## jfontmaps
#### dvipdfmxのためのmapファイルを作成する 

https://github.com/texjporg/jfontmaps  をクローン
`
$ git clone https://github.com/texjporg/jfontmaps.git
$ cd jfontmaps
$ kpsewhich -var-value=TEXMFHOME
`

ここで，結果が実在しないディレクトリ等の場合は
`$ vi Makefile `
1行目を必要に応じて変更する．
 例：`TEXMF = /usr/local/texlive/texmf-local` など

`
$ sudo make install
$ cd script
$ sudo mktexlsr
$ sudo ./kanji-config-updmap-sys.sh hiragino-highsierra-pron
$ sudo mktexlsr
`

#確認するには
適当なディレクトリに`hoge.tex`（和文の文章含む）があるとすると

`$ uplatex hoge.tex
$ dvipdfmx hoge.dvi
`

で問題なければオッケーなはず．