OmniAICreator/Qiita-1.07M huggingface dataset:
簡単なAsciiDocエディタを作ってみた

# これは何
[簡単なMarkdownエディタを作る](https://qiita.com/opengl-8080/items/56b4b6a9d31bac0cb3e2) を読んで、AsciiDoc版を作ってみたくなったので試してみた。

# 成果物

[ここ](https://suzukitadashi.github.io/apps/simpleAsciidocEditor/editor.html)

左のテキストエリアに AsciiDoc を記述すると、右側に結果が出力される。
凝ったものは出せないと思うが、Asciidocの文法をちょっとお試ししてみる程度には使えると思う。
エラーチェックは全くやってないので、変なコードを書いてブラウザがおかしくなっても責任は取れない…。

## 文法が載っているサイト
[Asciidoctor 文法クイックリファレンス\(日本語訳\)](https://takumon.github.io/asciidoc-syntax-quick-reference-japanese-translation/)

ここまで大仰でなくていいからちょっと試したい、という場合は
[AsciiDocとPlantUMLでドキュメント作成](https://garbagetown.github.io/jjug-ccc-2017-fall/#1)
がシンプルでいいかも。
※PlantUMLは書けません。

# ソース

[study/simpleAsciidocEditor](https://github.com/suzukitadashi/study/tree/master/simpleAsciidocEditor)

# 使ったライブラリ
[Asciidoctor](https://github.com/asciidoctor/asciidoctor.js)

Asciidoctor以外は、opengl-8080 さんが作ったエディタと同じライブラリを使用した。

# ハマリポイント ※2018/1/12時点

Asciidoctor のgithub配布ページに書かれている一文に誤りがあるのか、配布されるjsに漏れがあるのかわからないが、

```JavaScript
<script src="node_modules/asciidoctor.js/dist/asciidoctor.min.js"></script>
```

は

```JavaScript
<script src="node_modules/asciidoctor.js/dist/asciidoctor.js"></script>
```

に書き換えないと動かない。

# できなかったこと

```
[source,js]
.hello.js
----
console.log('Hello, world!');
----
```

と書いた時に色を付けたかったが、asciidoctor.jsが吐きだすhtmlコードがhighlight.jsに対応していないため色が付けられない。
issueも立っている。

https://github.com/asciidoctor/asciidoctor.js/issues/334 を読むと当面は自力で頑張るしかないらしい。
さよなら拡張機能、こんにちはDevTools。


chromeの動作が重くなってきていたので、
拡張機能の整理まとめ。

##さよならした拡張機能その1「Full Page Screen Capture」

全画面のスクリーンショットが撮れる、すてきな拡張機能ですが、
拡張機能を入れずに全画面スクショを撮る方法がありました。

まずはDevtoolsを開きます。

Macのショートカットは```option```+```command```+```I```
Windowsは```F12```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/139029/8398bc93-b603-aa92-33f8-704912192bee.png "01.png")

そのまま```shift```+```command```+```P```を押すと、こんな感じで入力画面が出てきます。
Windowsは```Shift```+```Ctrl```+```P```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/139029/4aaf18ce-3aa3-6e30-6760-0e323f38476b.png "02.png")


ここに「Capture」と打ち込みます。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/139029/d455be6a-a448-399a-73f3-40ad3f712726.png "03.png")


このうちスクリーンショットが撮れるのは以下の3つ
・Mobile Capture full size screenshot
・Mobile Capture node screenshot
・Mobile Capture　screenshot

スクロール部分を含むフルサイズのスクショを撮る場合は、
「Mobile Capture full size screenshot」を選択します。

下の2つはPC標準機能のスクショでも撮れますが念のため。
「Mobile Capture node screenshot」はElementsパネルで選択した部分だけ。
「Mobile Capture　screenshot」は表示されている画面のスクショが撮れます。

MacもWindowsも画像はダウンロードフォルダに入っています。

これで拡張機能を入れなくても全画面のスクリーンショットが撮れますね！


##さよならした拡張機能その2「ColorPick Eyedropper」

スポイトを使って画面上のカラーをピックできる拡張機能。
カラーコードを調べる時にとっても便利な機能ですが、
これもDevToolsを使えば簡単にコードが取得できます。

まずはElementsパネル、styleを選択します。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/139029/20121c70-f8d1-87ec-15ad-874b8ecaf1bf.png "01.png")

こんな感じで、カラーコードの隣にある&#9632;マークをクリックします。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/139029/b9d9274a-c6d6-52a1-dd5f-28f6e8ab6cba.png "04.png")


カラーコードが見つからなかったり、探すのが面倒な場合は、
自分で任意のコードを書き足せば大丈夫！

```css:css
color: #000
/*colorじゃなくても、任意のプロパティでOK*/

```

あとは、スポイトマークを選択して、
コードが知りたい部分をクリックするだけ。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/139029/bc646aee-c6da-3de7-2f35-e254366810bc.png "06.png")

![07.png](https://qiita-image-store.s3.amazonaws.com/0/139029/ab4e479a-9880-3c94-47c0-6f581ca2aa8d.png "07.png")


これで拡張機能を使わなくてもピック出来るようになりました。

##さよならした拡張機能その3「Page Ruler」
こちらは、ページ上のサイズをドラッグするだけで簡単に計ることができる拡張機能ですが、
入れっぱなしで、全然使ってなかったのでさよならしました。

おわり！
Google App Maker と Apps Script dashboard

GAS に Dashboard 機能が追加されました。
[G Suite Developers Blog: 3 new tools to help improve your Apps Script development and management experience](https://gsuite-developers.googleblog.com/2018/01/three-new-tools-to-help-improve-your.html)
[Google Apps Scriptの新しい3つの機能 その① Dashboard - Qiita](https://qiita.com/soundTricker/items/59979d0bb065fdd8d536)

App Maker にはほとんど関係なかったのですが、ちょっとだけ関係あったのでメモしておきます。


## App Maker はプロジェクトとして認識されない
プロジェクトが出てくる画面は次の5つありますが、ここには App Maker は入ってきません。

* 監視対象プロジェクト
* 自分のプロジェクト
* すべてのプロジェクト
* 共有済み
* ゴミ箱

出てくるのは GAS の [Standalone Scripts](https://developers.google.com/apps-script/guides/standalone) や スプレッドシートなどにくっついた [Container-bound Scripts](https://developers.google.com/apps-script/guides/bound) になります。


## 実行数では App Maker が認識されている
メニューの [実行数](https://script.google.com/home/executions) を表示すると App Maker の サーバーサイドスクリプト が認識されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/adf323e5-b84e-39a9-2047-283b26276c99.png)

### 関数名に注目
関数名が `doGet` になっているのがポイントです。
これはまさしく GAS を ウェブアプリケーション公開するときに使う [HTML Service](https://developers.google.com/apps-script/guides/html/) の `doGet` ですね。
つまり App Maker は GAS のウェブアプリケーション公開を流用していることがわかります。

### プロジェクト画面では App Maker も対応している？
先程の実行数の画面からプロジェクト名をクリックするとプロジェクト画面が表示できます。

PUBLISH した環境が認識されていますし、App Maker のアイコンが表示されています。
※ PREVIEW が複数あるのは、複数人で PREVIEW を行っているため人数単位で環境が存在する形。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/734da046-6496-25e3-fe5a-90c1c5e6fddb.png)


## まとめ

* 現時点（2018/1/12）では、App Maker は、GASのダッシュボードとはほとんど無縁
* プロジェクト画面では、App Maker にも対応しているように見える
* App Maker が GAS ダッシュボードに載ってくる可能性はゼロではなさそう

GAS 同様 App Maker も検証用のアプリとかつくってるとすごい数になり、管理がしきれないのが現状なので、ダッシュボードに載ってほしいですね。
【R入門】R言語の基本的な使い方

統計とR言語の勉強をしています。
[「Rによるやさしい統計学」](http://amzn.to/2mDoNMH)の写経で勉強。


#実行環境
- Windows10 Pro 64bit
- R：3.4.3
- RStudio：1.1.383
RStudioのConsoleを使って実行しています

#基本計算
計算機のように数字と+の符号を打つだけで計算してくれます。
sum関数を使っても同じ結果です。

```R
> 10+13+8+15+8
[1] 54
> sum(10,13,8,15,8)
[1] 54
```

変数に入れ込むことで計算が(計算機ではなく)プログラムらしくなります。

```R
> testa <- c(10,13,8,15,8)
> testa
[1] 10 13  8 15  8
> sum(testa)
[1] 54
```

平均を求めるのであれば、以下の３つの方法があります(変数testaは上の続きです)。length関数はデータの個数を出力します。当然、mean関数を使うのが最もシンプルです。

```R
> sum(testa)/5
[1] 10.8
> sum(testa)/length(testa)
[1] 10.8
> mean(testa)
[1] 10.8
```

median関数は中央値をtable関数は度数分布を出力します。

```R
> median(testa)
[1] 10
> table(testa)
testa
 8 10 13 15 
 2  1  1  1 
```

#分散と標準偏差
地味に計算していきます。平均、偏差の二乗和、分散、標準偏差の順に計算しています。

```R
> testaave <- mean(testa)
> testaave
[1] 10.8

# 平均との差
> testadev <- testa - testaave
> testaave
[1] 10.8
> testadev
[1] -0.8  2.2 -2.8  4.2 -2.8

# 偏差の2乗
> testadevsqr <- testadev^2
> testadevsqr
[1]  0.64  4.84  7.84 17.64  7.84

#偏差の2乗和
> testadevsqrsum <- sum(testadevsqr)
> testadevsqrsum
[1] 38.8

#分散(不偏分散でない)
> testavar <- testadevsqrsum/length(testa)
> testavar
[1] 7.76

#標準偏差
> sqrt(testavar)
[1] 2.785678
```

varという関数があるのですが、不偏分散なので注意が必要です。上で算出した7.76と結果が異なります。

```R
> var(testa)
[1] 9.7
```

標準偏差はsdです。こちらも不偏分散の平方根なので上で算出した2.785678と結果が異なります。

```R
> sd(testa)
[1] 3.114482
```

#その他
maxとminという関数もあります。最大値と最小値です。

```R
> max(testa)
[1] 15
> min(testa)
[1] 8
```
High SierraにアップデートしたらDockerコマンドが動かなくなった

この間、MacをHigh SierraにアップデートしたらDockerコマンドが動かなくなった。
コンテナ自体は起動しているみたいだが、`docker ps -a`などのコマンド全般を実行すると
`fatal error: MSpanList_Insert`のようなエラーが出てしまう。

どうやらDocker for MacのバグらしいのでDockerのアップデートを実行。
この環境ではHomebrewで入れていたので
`brew upgrade docker`
を入れてバージョンアップをした。

しかしそれでも上記同様のエラーが出てします。
何がいけないのか小一時間ほど悩んだが、結局はリンクが新しいDockerへ向いていなかったのが問題だったらしい。
HomebrewでDockerのlinkを貼り直すことでやっとDockerコマンドが使えた。
`brew link --overwrite docker`
よかった、よかった
sagemakerで簡易電力予測ページを作ってみた

[前回](https://qiita.com/naoko_s/items/6bea8d392c6298ec4e6b)エンドポイント作るまではできたけどそこからどうやってそのエンドポイントを使ったらいいかわからず1日うーーーんってやってたらできたので記事にしてみました。

### できたもの
![FireShot Capture 36 - 消費電力予測 - http___localhost_8000_.png](https://qiita-image-store.s3.amazonaws.com/0/192406/d0e0a4d4-043e-e5a5-08b5-92651a1c7226.png "FireShot Capture 36 - 消費電力予測 - http___localhost_8000_.png")
作ったものはすごくシンプルでこのフォームに好きな数字を入れて送信ボタンを押下したら

![電力予測結果.png](https://qiita-image-store.s3.amazonaws.com/0/192406/2d22e5ff-360d-2f2f-a7f9-7e84f84f7471.png "電力予測結果.png")
こんな感じで予測消費電力が返って来るっていうもの

###ハマったとこ
このページ自体はflaskを使っていて
フォーム作ったりフォームの内容をPOSTして〜ってところは
色々調べていたらできたのですがハマったのは
どうやったら予測消費電力が返って来るか、というところ
読解力が乏しいので色んな記事やら読んでも理解できず......
[AWSのブログ](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker/)にlambdaにこうやったら使えるよっていうのが
書いてあったのでそれを使ってみることに...

``` py
import boto3

sagemaker = boto3.client('sagemaker-runtime')
result = sagemaker.invoke_endpoint(
      EndpointName='test',
      Body=pre_data
    )
```

でもデータの形をどうすればいいかわからず(モデル作成はcsvファイルでやってました)
配列を渡したり適当にオブジェクトにしたりcsvに変換してs3に落としてみたり....色々やっていたのですがずっとエラーが出っ放しでした。
特に出てたエラーが

```
Received client error (400) from model with message "unable to evaluate payload provided". See https://us-east-1.console.aws.amazon.com/cloudwatch/~~~ (Service: AmazonSageMakerRuntime; Status Code: 424; Error Code: ModelError; Request ID: null)
```
全然意味がわかんないしCloudWatch見ても訳がわからん状態でした。
色々調べてたら`sagemaker.invoke_endpoint`の引数に`ContentType='text/csv'`って入れたらいいよって[ここ](https://forums.aws.amazon.com/thread.jspa?messageID=822396&tstart=0)に書いてあったので入れたけど結局データの形をどうしたらいいかわからずまたエラー

```
Invalid type for parameter Body, value: [12, 0, 12, 12.0, 0], type: <class 'list'>, valid types: <class 'bytes'>, <class 'bytearray'>, file-like object
```
エラーを読んでみると`file-like object`にしろって書いてある...
でもfile-like objectが何かわからないで調べていたら
> ファイルオブジェクトには実際には 3 種類あります: 生の バイナリーファイル、バッファされた バイナリーファイル、そして テキストファイル です。

って[ここ](https://docs.python.jp/3/glossary.html)にありました。
テキストファイルってことは、モデル作るときcsvだったしカンマ区切りか！って思ってカンマ区切りでデータを送ったら

``` py
from flask import Flask, render_template, request, redirect
import json
import boto3

app = Flask(__name__)
@app.route('/')
def index():
  return render_template('/sagemaker.html')

@app.route('/predict', methods=['POST'])
def predict():
  if request.method == 'POST':
    month = request.form['month']
    week = request.form['week']
    time = request.form['time']
    temp = request.form['temp']
    weather = request.form['weather']
    pre_data_str = month + "," + week + "," + time + "," + temp + "," + weather
    sagemaker = boto3.client('sagemaker-runtime', region_name='us-east-1')
    result = sagemaker.invoke_endpoint(
      ContentType='text/csv',
      EndpointName='test',
      Body=pre_data_str
    )
    result_body = json.load(result['Body'])
    pre = int(float(result_body['predictions'][0]['score']))
    return render_template('/predict.html', predict=pre)
  else:
    return redirect('/')

if __name__ == '__main__':
  app.run(port=8000, debug=True)
```

いけました！
わからんすぎて本当に投げそうになったけど最後まで頑張ってよかったです。

これを次はlambdaで使ってみて、その後カスタムでやってみようと思います。
Visual Studio 2017 で MFC アプリ開発機能を追加するには

#はじめに
Visual Studio 2015 では Visual C++ プロジェクトのテンプレートに MFC アプリ開発が含まれていましたが、Visual Studio 2017 では、なぜか含まれなくなっています。

しかし、後からこのテンプレートを追加することができます。

#方法
「新しいプロジェクト」ダイアログを開いて、テンプレートリストの一番下の「Visual Studio インストーラを開く」をクリックします。

![New Projects.png](https://qiita-image-store.s3.amazonaws.com/0/62802/e1f03d59-b30a-a7f6-10ee-5070fe5db7f4.png)

下のようなインストーラが開くので、「概要」の「C++によるデスクトップ開発」のオプションで必要なもの（ここでは「MFCとATLのサポート」）をチェックします。

![SDK Installer.jpg](https://qiita-image-store.s3.amazonaws.com/0/62802/4ac89dfd-afc8-5d84-955e-f35250df0de6.jpeg)

最後に「変更」ボタンをクリックしますが、その前に Visual Studio 2017 は閉じておきます。

インストールが終了したら、Visual Studio 2017 を再起動して、プロジェクトのテンプレートに追加した項目が含まれていることを確認します。

![MFC Template.jpg](https://qiita-image-store.s3.amazonaws.com/0/62802/b1c2be9f-8db5-cae0-d47a-75a7ec803497.jpeg)

-
プログラミング 10 か月目

　プログラミングを始めて 10 か月が経とうとしています。

　前回から復習メインとなっていますが、新しいことにも少しずつ触れています。今回も前回と同様に書きたいと思います。

# :pencil2: 進捗状況



**ウェブカツ！！** :new: 

  　プログラミングだけでなく、その周辺の知識やそれらを使った実践的な内容まで幅広く学習できる。書籍やブログでは分かりにくい用語も丁寧に解説してあって分かりやすい。今までイマイチ良く分からなかったものが、一気に分かるようになったのは今でもよく覚えている。

**CODEPREP**
　
　1/4 に無償化。 3/26 でサービス終了とのことなので、これを機に一気にやっていくことに。

**Progate**

　SQL Ⅲ : 複雑にはなってきたが、Paiza で学習したおかげで何とか出来た。

**ドットインストール**

　Ruby on Rails5 入門：　Progate、Paiza の復習がてらに学習。
　WordPress 入門：ウェブカツ！！をきっかけにもう一度見直してみた。




#:pencil2: 新着事項
　10 か月目で新たに取り入れたことや、プログラミングで意識したこと・感じたことを書いていこうと思います。

### :page_facing_up: 大きな線となってつながり始めた
　
　これはウェブカツ！！を始めて実感したことである。個々で勉強して、それぞれ点を作っていたものが線となり、それらが束になって大きな線として次々つながり始めた感じがした。

　理解できることが増え、あるところを境に分からなかったことが分かるようになり始めたような気がする。

　

#:star: 最後に
　
　分かり始めた部分が多くなってきたので、今後はそれらを中心に備忘録として投稿してみたいと思います。

　まだ分からないことがたくさんありますが、一日でも早く上達できるように頑張りたいと思います。
UnityのText Mesh Proでほぼ全ての日本語を表示させる

TextMeshProで日本語を表示するには[【Unity】TextMeshProで常用漢字を全部使えるようにする」](https://qiita.com/su10/items/67ff8f48e03539a69e31)や、[UnityのText Mesh Proアセットで日本語を使うときの手順](https://qiita.com/thorikawa/items/03b65b75fa9461b53efd)に書かれている通り、カスタムで文字を選択してFont Assetを作る必要がありますが、とある実装案件で表示させたい情報には頻出文字以外の文字が含まれており、これら記事に書かれているCustom Rangeでは足らない状況になりました。そのため、オープンな文字コード表などから引用収集し、ほぼすべての日本語文字に対応させる文字セット（Character List）を作成しました。

## 文字セット（Character List）
文字数が多くて表示が遅くなるためgistにて公開しています。
[japanese_full.txt](https://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4)

### 含まれる文字
* ascii
* ひらがな
* カタカナ
* 第一水準・第二水準(JIS-X0208-1997)に含まれる漢字と記号

## Font Asset Creatorの設定メモ
* Atlas Resolutionは最大値の**8192x8192**で設定（4096でも行けるかも）
* Character SetはCustom Rangeでなく、**Custom Character List**にコピペ

## 設定画面
<img width="1132" alt="スクリーンショット 2018-01-12 16.37.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/22445/ff749bcc-c3bb-79a4-32ea-d5201be83774.png">

## おわりに
大変便利なText Mesh Proですが、やはり向き不向きはあります。情報を大量に掲載しなくてはならないアプリの場合は、HTMLViewを用意してその中で表示させるのが一番無難なのかと思いました。含まれていない文字があったらアップデートしますのでご連絡ください。
あと、これをCustom Rangeに変換する方法があったらご教授頂けるとうれしいです。
なぜデザインパターンは必要か

# 最初に
デザインパターンの内容を詳しく紹介する記事ではありません。
なるほど、覚えておきたい！というモチベーションをアップさせるための記事です。
# 対象
動くプログラムを書ける人。
でもオブジェクト指向を活用した書き方はできてない人。
# デザインパターン例(Adapter パターン)
そもそもデザインパターンとは、をAdapterパターンで紹介します。

もともと下記のクラスがありました。

```java:Adaptee.java
public class Adaptee{
    public void method1(){
	　System.out.println("method1");
    }

    public void method2(){
	　System.out.println("method2");
    }
}
```
ここで、**method1()、method2()**と同じ機能を**newMethod1()、newMethod2()**
をインタフェースとして実装してほしい、と言われたとします。
デザインパターンを知らないでこの要求があった場合、
Adapteeクラス内に実装しようとするのではないでしょうか。
それをAdapterパターンに即すと下記のようになります。

まず要求インタフェース（メソッド）が定義されたを含む下記クラスを作成します。

```java:Target.java
public interface Target{
    public abstract void newMethod1();
    public abstract void newMethod2();
}
```
それからTarget.javaとAdaptee.javaを取り込んだ下記クラスを作成します。

```java:Target.java
public class Adapter extends Adaptee implements Target{
    public void newMethod1(){
	　method1();
    }

    public void newMethod2(){
	　method2();
    }
}
```
使うときは下記です。

```java:Client.java
public class Client{
    public static void main(String[] args){
	Target target = new Adapter();
	target.newMethod1();
	target.newMethod2();
    }
}
```
こんな感じで、こうゆうときはこうゆう風に書く！という定石集的なものがデザインパターンです。
# メリット
**・プログラムを組むときの方針がわかる**
パターンが自分の中にあれば、それが適応できるプログラムに出会ったとき１から作るより遥かに楽です。
また、パターンを丸暗記する必要もなく、概要だけ把握し、そのパターンに出会ったときに読み返せばよいのです。

**・他者のコードの意図が読めるようになる**
自分が作る際だけでなく、他の人のコードを読んだときに「あ、これはあのパターン」と思えるようになります。
そしてそう思えるということは、コードの意図も読み取れるということです。
# 参考にしたサイト
http://www.ie.u-ryukyu.ac.jp/~e085739/java.it.6.html
# 参考にした本
[増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030)
デザインパターンといえばこれ、という本です。
ThreeTenABPに依存したクラスをテストしたい（メモ）


例えばJSON→ZonedDateTimeを持つPOJOへの変換の確認など。
デシリアライザにはGsonを使う想定です。

```groovy:build.gradle
android {
    // （省略）
    testVariants.all { variant ->
        variant.getCompileConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
        variant.getRuntimeConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    }
}

dependencies {
    // （省略）
    implementation "com.jakewharton.threetenabp:threetenabp:$threetenabp_version"
    androidTestImplementation("org.threeten:threetenbp:$threetenbp_version") {
        exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    }
}
```

```kotlin:String→ZonedDateTimeのJsonDeserializerの例
class IsoZonedDateTimeDeserializer : JsonDeserializer<ZonedDateTime> {
    @Throws(JsonParseException::class)
    override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): ZonedDateTime {
        val jsonPrimitive = json?.asJsonPrimitive
        try {
            if (jsonPrimitive is JsonPrimitive && jsonPrimitive.isString) {
                return ZonedDateTime.parse(jsonPrimitive.asString, DateTimeFormatter.ISO_ZONED_DATE_TIME)
            }
        } catch (e: RuntimeException) {
            throw JsonParseException("Unable to parse ZonedDateTime", e)
        }
        throw JsonParseException("Unable to parse ZonedDateTime")
    }
}
```
新規サーバへの公開鍵を移すとコンテキストが保持されない

公開鍵を含むユーザディレクトリを新規のサーバへ下記の手順で移行しました。
OSは移行元がCentOS6で移行先がCentOS7、SELinuxはEnforcingになっている環境です。

移行後に`.ssh/authorized_keys`のコンテキストを確認すると、<font color="Red">home_root_t</font>となっていましたので
移行元と同じ<font color="Red">user_home_t</font>に設定しました。

restoreconで変更すると、<font color="Red">ssh_home_t</font>に変更されますが
移行元と同じ<font color="Red">user_home_t</font>に設定しました。

```
$ sudo restorecon -R /home/　
```
アーカイブ時には`--selinux`を指定して、移行先のサーバでcpコマンドには
`-ap`を指定しましたが、コンテキストが変わってしまいました。
これで、公開鍵は機能していますが、
コンテキストを保持したまま、移行先のサーバに公開鍵を移行させるには
どのような指定が足りなかったのでしょうか。

```
## コンテキストを保持してアーカイブ
$ sudo tar --selinux -czf /migration/home.tar.gz  ./*

## scpしたものを/homeにコピーして解凍
$ sudo cp -ap home.tar.gz /home/
$ sudo tar -xzf home.tar.gz 


$ sudo ls -Z /home/hoge/.ssh/authorized_keys
-rw-------. hoge hoge unconfined_u:object_r:home_root_t:s0 /home/hoge/.ssh/authorized_keys
$ sudo chcon -t user_home_t  /home/hoge/.ssh/authorized_keys
```
macosにgcloudとkubectlのインストール

- 公式: [Kubernetes Engine クイックスタート  |  Kubernetes Engine のドキュメント  |  Google Cloud Platform](https://cloud.google.com/kubernetes-engine/docs/quickstart?hl=ja)

公式に載っていないが、`brew cask`で `gcloud`コマンドが入る

```console
$ brew cask install google-cloud-sdk
$ gcloud init
$ gcloud components update
$ gcloud components install kubectl
```

`install kubectl` しただけだとパスが通らないのでシンボリックリンクを張る

```
$ ln -s /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/kubectl /usr/local/bin/
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.6", GitCommit:"6260bb08c46c31eea6cb538b34a9ceb3e406689c", GitTreeState:"clean", BuildDate:"2017-12-21T06:34:11Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"7+", GitVersion:"v1.7.11-gke.1", GitCommit:"3500f53730c1fea7b57901977df165c3eb317bce", GitTreeState:"clean", BuildDate:"2017-12-08T18:05:07Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
```
Git備忘録

Gitの備忘録を記載していく。

##### リポジトリのチェックアウト

```sh
git clone -b ブランチ名※ URL　　　　※タグ名でも可
```

##### ブランチ作成

```sh
# リモートブランチをローカルにチェックアウト
git checkout -b 作成ブランチ名 origin/リモートブランチ名

# 現在のブランチから派生ブランチを作成
git branch 作成ブランチ名
git push origin ブランチ名
```

##### マージ

```sh
# マージ
git merge --no-ff --no-commit マージ元のブランチ名

# コミット
git commit -m "コメント"

# プッシュ
git push origin ブランチ名
```

`fatal: refusing to merge unrelated histories`エラーがでる場合

```sh
git merge --no-ff --no-commit マージ元のブランチ名 --allow-unrelated-histories
```

##### 特定のコミットを指定してマージ

```sh
git cherry-pick コミットID
git push origin ブランチ名
```

##### 競合が発生した場合

```sh
# マージ元のブランチを最新とする
git checkout --theirs ファイル名(フルパス)
git add ファイル名(フルパス)

# 現在のブランチを最新とする
git checkout --ours ファイル名(フルパス)
git add ファイル名(フルパス)

# ファイルを削除する
git rm ファイル名(フルパス)
```

##### 初期化

```sh
# 最新の状態に戻す
git reset --hard

# 未コミットの新規追加ファイルを削除
git clean -f
```

##### Git環境設定

```sh
# 長いパスを許容する
git config --global core.longpaths true

# パスワードを記憶
git config --global credential.helper store

# ユーザ情報の設定
git config --global user.name "名前" 
git config --global user.email Eメールアドレス

# コミット時の改行コードの自動変換を無効化
git config --global core.autocrlf false
git config --global core.safecrlf true

# ファイル名の大文字小文字を区別
git config --global core.ignorecase false

# 日本語ファイル名の文字化け防止
git config --global core.quotepath false

# 同名のリモートブランチ名が存在する場合のみpushする
git config --global push.default simple

# diffツールにWinMergeを設定　→　git windiffコマンドで差分の比較ができるようになる
git config --global diff.tool WinMerge
git config --global difftool.WinMerge.path WinMergeU.exeのフルパス
git config --global difftool.WinMerge.cmd "\"WinMergeU.exeのフルパス\" -f \"*.*\" -e -u -r \"\$LOCAL\" \"\$REMOTE\""
git config --global alias.windiff "difftool -y -d -t WinMerge"

# mergeツールにWinMergeを設定　→　コンフリクト時のgit winmergeコマンドで競合の確認、修正ができるようになる
git config --global merge.tool WinMerge
git config --global mergetool.WinMerge.path WinMergeU.exeのフルパス
git config --global mergetool.WinMerge.cmd "\"WinMergeU.exeのフルパス\" -e -u \"\$LOCAL\" \"\$REMOTE\" \"\$MERGED\""
git config --global alias.winmerge "mergetool -y -t WinMerge"
git config --global mergetool.keepbackup false
```

# ローカルファイルからGitリポジトリを作成する手順
```sh
# ターミナルから対象のディレクトリに移動
cd 対象ディレクトリ

# git初期化
git init

# git対象外の設定
.gitignoreファイルを作成
New-Item -Type File .gitignore # powershell

# git管理に追加
git add --all

# コミット
git commit -m "コメント"

# リモートのGitリポジトリを追加
git remote add origin XXX.git

# Push
git push origin master
```
Ubuntu に Postgresを速攻で立てる


BIツールの検証をしていると必ず必要になるサンプルデータ
社内ではサンプルのDBがあるようでない場合が多いので、速攻で作りたいときのコマンドをメモメモ

sudo apt-get postgresql

sudo -i -u postgres
psql
\du


サンプルのデータを持ってくる
dvdrenalが鉄板なのでダウンロードしてきます
参考
　http://tombo2.hatenablog.com/entry/2015/10/27/001450

以上、ざっと20分
Kotlin の拡張関数で LiveData の observe をいい感じにする

以下の内容は古い。
現在は [lifecycle-livedata-ktx](https://developer.android.com/kotlin/ktx/extensions-list#androidxlifecycle) の [observe 拡張関数](https://developer.android.com/reference/kotlin/androidx/lifecycle/package-summary#(androidx.lifecycle.LiveData).observe(androidx.lifecycle.LifecycleOwner,%20kotlin.Function1)
)を使うべき。

Activity や Fragment で ViewModel の中の LiveData を監視したいとき、例えばこのようになるでしょう。

```kotlin
myViewModel.myLiveData.observe(this, Observer<String?> {
    if (it != null) {
        myTextView.text = it
    }
})
```

`it` は `String?` 型です。では、`Observer<String?>` を `Observer<String>` にするとどうでしょうか

```kotlin
myViewModel.myLiveData.observe(this, Observer<String> {
    if (it != null) {
        myTextView.text = it
    }
})
```

`it` は変わらず `String?` 型です。これは `Observer` インターフェイスが以下のようになっているためです。

```java
// Java だよ
public interface Observer<T> {
    void onChanged(@Nullable T t);
}
```

Kotlin からどんな型 `T` が渡されるかにかかわらず、メソッドの引数は `@Nullable` です。

しかし、null には絶対にならない、あるいは、 null は無視していいという場合も多いでしょう。そこで、以下のような拡張関数を作っておきます。

```kotlin
fun <T> LiveData<T>.observeNonNull(owner: LifecycleOwner, observer: (T) -> Unit) {
    this.observe(owner, Observer {
        if (it != null) {
            observer(it)
        }
    })
}
```

そうすると、このように書くことができます。

```kotlin
myViewModel.myLiveData.observeNonNull(this, {
    myTextView.text = it
})
```

`it` は `String` 型です。
Goで文字列の中の特定の文字列をカウントする(strings.Count)

# Goで文字列の中の特定の文字列をカウントする(strings.Count)

## 使い方
> Count counts the number of non-overlapping instances of substr in s. If substr is an empty string, Count returns 1 + the number of Unicode code points in s.
引用元: [strings - The Go Programming Language](https://golang.org/pkg/strings/#Count)

引数

第1引数:カウント対象が含まれている全体の文字列
第2引数:カウント対象の文字列(これが何個第1引数の文字列の中に入っているかをカウントする)

Countは、第1引数の文字列の中の第2引数の文字列の重複しない数を返す。
第2引数が空文字の場合、Countは1 + 第2引数の文字列のUnicode code pointsの数を返す。



## 実際に使ってみた
###コード

```go
package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "aaabbbcc"
	// 普通に表示
	fmt.Printf("str : %s\n", str)

	// cを数える
	fmt.Printf("count of \"c\" : %d\n", strings.Count(str, "c"))
	// 空文字で数えてみる
	fmt.Printf("count of \"\" : %d\n", strings.Count(str, ""))

}


```

### 実行結果
```
str : aaabbbcc
count of "c" : 2
count of "" : 9
```

## 参考にさせていただいたサイト
[strings - The Go Programming Language](https://golang.org/pkg/strings/#Count)
16進数カラーコードとRGBの変換


```rb
'6EEFB0'.each_char.each_slice(2).map{|a| a.join.to_i(16) }
# => [110, 239, 176]

[110, 239, 176].map{|i| i.to_s(16) }.join.upcase
# => "6EEFB0"
```
asciiコード表ワンライナー（bash）

どうでもいいメモ。

```bash:
$ seq 32 127 |awk '{printf "%03d %x %c\n",$1,$1,$1}'
```

```
032 20  
033 21 !
034 22 "
035 23 #
036 24 $
037 25 %
038 26 &
039 27 '
040 28 (
041 29 )
042 2a *
043 2b +
044 2c ,
045 2d -
046 2e .
047 2f /
048 30 0
049 31 1
050 32 2
051 33 3
052 34 4
053 35 5
054 36 6
055 37 7
056 38 8
057 39 9
058 3a :
059 3b ;
060 3c <
061 3d =
062 3e >
063 3f ?
064 40 @
065 41 A
066 42 B
067 43 C
068 44 D
069 45 E
070 46 F
071 47 G
072 48 H
073 49 I
074 4a J
075 4b K
076 4c L
077 4d M
078 4e N
079 4f O
080 50 P
081 51 Q
082 52 R
083 53 S
084 54 T
085 55 U
086 56 V
087 57 W
088 58 X
089 59 Y
090 5a Z
091 5b [
092 5c \
093 5d ]
094 5e ^
095 5f _
096 60 `
097 61 a
098 62 b
099 63 c
100 64 d
101 65 e
102 66 f
103 67 g
104 68 h
105 69 i
106 6a j
107 6b k
108 6c l
109 6d m
110 6e n
111 6f o
112 70 p
113 71 q
114 72 r
115 73 s
116 74 t
117 75 u
118 76 v
119 77 w
120 78 x
121 79 y
122 7a z
123 7b {
124 7c |
125 7d }
126 7e ~
127 7f 
```

番号で行を抜き出す。

```
$ seq 32 127 |awk /^101/'{printf "%03d %x %c\n",$1,$1,$1}'
101 65 e
```
Rubyでtail -fする

書き込まれ続けているファイルに対して`tail -f`のような感じで末尾の出力を読み取り続ける方法。

# 方法

```rb:tail_f.rb
f=open(ARGV[0])
begin
  f.sysseek(-32, IO::SEEK_END)    # 末尾から32byte取得
rescue
  f.sysseek(0, IO::SEEK_SET)      # ファイルが32byte以下だった場合は、先頭から
end

while true
  print f.sysread(10) rescue nil
end
```

上記のファイルを以下のように実行

```
ruby tail_f.rb test
```

別の端末でirbを立ち上げて挙動確認。

```ruby
io = File.open("test", 'a')
=> #<File:test>
irb(main):003:0> io.puts "message ---- "; io.flush
=> #<File:test>
```

io.flushが呼ばれたタイミングで、元のtail_fを実行した端末に結果が出力される。


## 参考

こちらを参考にしました。

- http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/26301
- https://qiita.com/NagominHotMotto/items/b9e62d2c6e88ac6624cc
- http://d.hatena.ne.jp/e_c_e_t/20110526
【GoogleAppsScript】【Slack】電車遅延情報post

GoogleAppScriptと連携し、
Slackに遅延情報を投稿するbotを作成してみました。

# やりたいこと
GoogleAppsScriptで、
関東の電車遅延情報を毎朝Slackに投稿させる

# 完成系
![slack.PNG](https://qiita-image-store.s3.amazonaws.com/0/179225/af380cc1-34dd-efdc-44e3-77a2f0bbeef9.png)

# Slack設定
<h3>１．channelの作成</h3>
<h4>２．Incoming WebHooksで、Webhook URLを作成する</h3>

Browse Apps -> Custom Integrations -> Incoming WebHooks -> Edit configuration

設定例：
![slack-post-train.PNG](https://qiita-image-store.s3.amazonaws.com/0/179225/396629ec-adc1-3308-ec5d-c6e3885236d4.png)

* Post to Channelにて投稿したいchannelを指定する
* WebhookURLをメモする
* Customize Nameにbotの名前を記述する
* Customize Iconでbotのアイコンを選択する

# GoogleAppScript
指定したURLのタグの要素を取得し、整形しSlackにpostさせる処理

```
function slackpost() {
try{

// 日付取得、フォーマット整形
var currentDate = new Date();
var weekday = currentDate.getDay();
var date = Utilities.formatDate( currentDate, 'Asia/Tokyo', 'M月d日 HH時mm分');

// 祝日は実行させない
if (weekday == 0 || weekday == 6) {
  return;
}
var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
  return;
}

// URLから要素を指定し、タグ要素を取得する
var yahoo = "https://transit.yahoo.co.jp/traininfo/area/4/";
var response = UrlFetchApp.fetch(yahoo);
var myRegexp_line = /<div class="elmTblLstLine trouble">([\s\S]*?)<\/div>/i;
var line_html = myRegexp_line.exec(response.getContentText());
var line_list = line_html[1];

// 文字の整形
// replaceでline_listをゴリゴリ整形し変数、lineに...(もっと綺麗に書きたかった。。) 
var line_base = line_list.replace(/\n|(運転状況|列車遅延|路線|詳細)|<td><span.*<\/td>|<.?th>|<tr>|<.?table>/g, "");
var line_top_del = line_base.replace("状況", "");
var line_td_del_1 = line_top_del.replace(/<td>/g, "\n");
var line_span_del = line_td_del_1.replace(/<\/span>|<\/a>/g, "");
var line_a_del = line_span_del.replace(/<a href=".*\/">/g,"");
var line_td_del_2 = line_a_del.replace(/<\/td>/g, "\n" );
var line = line_td_del_2.replace(/<\/tr>/g, "━─━─━─━─━─━─━─━");

if(line !== '事故・遅延情報はありません'){

  // slackに投稿
  function postMessage(message, hookPoint){
    var payload = {
      "text": message,
      "channelId": '#information',
      "userName": 'train-info',
      "icon_emoji": ':train:'
    }
    var options = {
      "method": "POST",
      "payload": JSON.stringify(payload),
      "headers": {
      "Content-type": "application/json",
      }
    }
    var response = UrlFetchApp.fetch(hookPoint, options);
    
    if (response.getResponseCode() == 200) {
      return response;
    }
      return false;
  }
    postMessage("\n" + "◆関東遅延情報 " + date + "\n" + yahoo + "\n" + line,'メモしたWebhookURL');
}else{
    postMessage("\n" + "◆関東遅延情報 " + date + "\n" + "○　事故・遅延情報はありません。" + "\n"+ yahoo,'メモしたWebhookURL');
}
}catch(e){
  result = "エラーの内容:" + e;
    Logger.log(result);
    postMessage("◆Script実行エラーです。");
 }
}
```

## トリガーのセット
![post.PNG](https://qiita-image-store.s3.amazonaws.com/0/179225/3b62830c-82a1-459c-155d-89e8c0ea5711.png)
macOS + google-home-notifier 超入門

## 環境

- OS: macOS High Sierra 10.13.1
- anyenv
- pyenv(on anyenv):2.7
- ndenv(on anyenv)

anyenvの環境構築は別記事の[anyenv + macOS環境構築](https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c)を参考にしてみてください。

## google-home-notifierのインストール

Pythonのバージョンでインストールエラーになるのでanyenvとpyenvなどのパッケージ管理ツールを使用してpythonのバージョンを切り替えれるように環境を構築しておくことをお勧めします。

以下anyenvとpyenv環境を前提で構築

### 作業ディレクトリを作成

```sh
$ mkdir myProject
$ cd myProject
```

### npmのアップデート

npmを最新のものにアップデート

```sh
$ npm update -g npm
```

### npmの初期化

npmのモジュールをインストールするためにまずはpackage.jsonを生成するために以下のコマンドを実行。対話ベースで諸々入力しますがあまり気にせず適宜入力しておけば良いと思います。

```sh
$ npm init
```

### pyenvで作業ディレクトリをpython2.7.9に設定

``google-home-notifier``を``npm``でインストールする際に``node-gyp rebuild``が実行されるのですがこれがPython2.7.9以前でなければエラーが出るので、もしPython3系などを使っている場合は``pyenv``などのパッケージ管理ツールなどを使用してPython2.7.9で動作する環境を事前に整えておきます。

#### pyenvでインストールしているバージョンを確認

```sh
$ pyenv versions
```

ここに2.7.9がなければ``pyenv``で``2.7.9``をインストール

```sh
$ pyenv install 2.7.9
```

#### pyenvで作業ディレクトリを2.7.9に設定

```sh
$ pyenv local 2.7.9
```

pythonのバージョンがきちんと設定されているか確認

```sh
$ python -V
Python 2.7.9
```

OK

#### npmでgoogle-home-notifierをインストール

```sh
$ npm install --save google-home-notifier
```

pythonのバージョンを2.7.9に設定しているので無事``node-gyp rebuild``が実行される。  
**※Pythonのバージョンが3系だとここでエラーが出てしまう。**

## Google Homeで発話させIPアドレスを表示させる

### index.jsの作成

```js:index.js
const googlehome = require('google-home-notifier');
const lang = 'ja';

googlehome.device('Google Home', lang);
googlehome.notify('こんにちは、グーグルホームです。', function(res){
	console.log(res);
});
```

### コマンドを実行してGoogle HomeのIPを表示させる（発話も同時）

```sh
$ node index.js
Device "Google-Home-xxxxxxxxxxxxxxxxxxx" at 192.168.31.86:8009
Device notified
```

``Google-Home-xxxxxxxxxxxxxxxxxxx``の部分がデバイスのID  
``192.168.31.31``の部分がGoogle HomeのIPアドレス  
``8009``の部分がGoogle Homeのポート番号

デバイスが複数ある場合はここに複数の``Device "Google-Home-xxxx" at 192.168.xx.xx:xxxx``が表示される

上記でIPアドレスがわかれば恣意的にIPを設定することも可能で、複数デバイスがある場合にはIPを指定してあげると良い。

※この方法でなくともスマホの``Google Home``アプリでデバイスのIPを確認することも可能

#### IPアドレスを指定するコード

```js:index.js
const googlehome = require('google-home-notifier');
const lang = 'ja';

googlehome.ip('192.168.31.86'); //ここで指定
googlehome.device('Google-Home', lang);
googlehome.notify('こんにちは、グーグルホームです。', function(res){
	console.log(res);
});
```

##まとめ

スマートホームハックの手始めとして``google-home-notifier``の入門でした。
Respberry Pi 3を使用して構築することもできるので、今後色々といじっていきたいと思います。
Firebase realtime databaseを利用した記事もアップしていきたい。
Docker for Mac with Kubernetes で WordPressを立てる

## はじめに
Docker for Mac with Kubernetes のBeta版が利用できるようになったようなので、WordPressを立ててみました

## 使用バージョン
```
$ docker -v
Docker version 17.12-kube_beta, build ca0c9dbcb219048a1a61fbf82a2e69f1b9795023
```

## 手順
### Kubernetesをインストールする過程は省略
こちらを参考にしてください：
https://qiita.com/taishin/items/920d62a641c9cd58f289

### wordpressを準備する
https://github.com/kubernetes/examples/tree/master/mysql-wordpress-pd  の以下のファイルをダウンロード
・ mysql-deployment.yaml
・ wordpress-deployment.yaml

wordpress-deployment.yamlのイメージを最新版に変更

```
...
    spec:
      containers:
      - image: wordpress:4.9.1-php7.1-apache #変更
...
```

### Kubernetesに設定を反映する
mysqlのパスワードを設定する

```
kubectl create secret generic mysql-pass --from-literal=password=yourpassword
```
mysqlを立ち上げる

```
kubectl apply -f mysql-deployment.yaml
```

wordpressを立ち上げる

```
kubectl create -f wordpress-deployment.yaml
```

### 起動を確認する
```
$ kubectl get pvc
NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound     pvc-64a467ef-f759-11e7-9b74-025000000001   20Gi       RWO            hostpath       42m
wp-pv-claim      Bound     pvc-c9ce4309-f75c-11e7-9b74-025000000001   20Gi       RWO            hostpath       17m
$ kubectl get pod
NAME                               READY     STATUS    RESTARTS   AGE
wordpress-5566d7675-9bs57          1/1       Running   0          17m
wordpress-mysql-7b4ffb6fb4-6rkkj   1/1       Running   0          42m
$ kubectl get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes        ClusterIP      10.96.0.1       <none>        443/TCP        3h
wordpress         LoadBalancer   10.101.234.56   <pending>     80:31689/TCP   17m
wordpress-mysql   ClusterIP      None            <none>        3306/TCP       42m
```

GKEなどではServiceのEXTERNAL-IPに接続先のIPアドレスが表示されますが、Docker for Macは **localhost** で繋ぐようです。

```
$ curl -sSL -D - localhost -o /dev/null
HTTP/1.1 200 OK
Date: Fri, 12 Jan 2018 06:16:50 GMT
Server: Apache/2.4.10 (Debian)
X-Powered-By: PHP/7.1.13
Link: <http://localhost/wp-json/>; rel="https://api.w.org/"
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
```

### 片付ける

```
# 一気に削除する場合
$ kubectl delete all,pvc,secret --all
# 設定ファイルを使って削除する場合
kubectl delete -f wordpress-deployment.yaml
kubectl delete -f mysql-deployment.yaml
```


参考記事

* https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
* https://github.com/kubernetes/examples/tree/master/mysql-wordpress-pd
* https://qiita.com/taishin/items/920d62a641c9cd58f289
シーケンスとData Pump (Oracle Database 12c Release 2) を試す



# SEQUENCEオブジェクトをインポートした場合のシーケンス値

  Data Pumpを使ってエクスポートしたSEQUENCEオブジェクトをインポートすると、シーケンス値がキャッシュ分だけ増加されることが知られています。

移行元

```
SQL> CREATE SEQUENCE seq01 ;

Sequence created.

SQL> SELECT seq01.nextval FROM DUAL ;

   NEXTVAL
----------
         1

SQL> SELECT SEQUENCE_NAME, CACHE_SIZE FROM USER_SEQUENCES ;

SEQUENCE_NAME                  CACHE_SIZE
------------------------------ ----------
SEQ01                                  20

$ expdp SYSTEM/pass directory=data_pump_dir dumpfile=scott_seq.dmp schemas=SCOTT include=SEQUENCE
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Fri Jan 12 14:31:15 2018 elapsed 0 00:00:06
```

移行先

```
$ impdp SYSTEM/pass directory=data_pump_dir dumpfile=scott_seq.dmp schemas=SCOTT include=SEQUENCE
Job "SYSTEM"."SYS_IMPORT_SCHEMA_02" successfully completed at Fri Jan 12 14:32:11 2018 elapsed 0 00:00:03

SQL> SELECT seq01.nextval FROM dual ;

   NEXTVAL
----------
        21

```

# 既に存在するSEQUENCEをインポート

既に存在するシーケンスに対してインポートを行うと、インポート処理はエラーになります。しかし、シーケンス値が更新される事象があるようです。

移行先

```
SQL> SELECT seq01.nextval FROM DUAL ;

   NEXTVAL
----------
         1

$ impdp SYSTEM/pass directory=data_pump_dir dumpfile=scott_seq.dmp schemas=SCOTT include=SEQUENCE

Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
ORA-31684: Object type SEQUENCE:"SCOTT"."SEQ01" already exists

Job "SYSTEM"."SYS_IMPORT_SCHEMA_02" completed with 1 error(s) at Fri Jan 12 14:37:35 2018 elapsed 0 00:00:04

SQL> SELECT seq01.nextval FROM DUAL ;

   NEXTVAL
----------
        21

```

# SEQUENCEの上書きはできないか？

既存のSEQUENCEを自動的に削除してインポートできないか検証しました。
テーブルの場合は table_exists_actionパラメーターを使うので、SEQUENCEの移行でも指定してみます。

```
$ impdp SYSTEM/pass directory=data_pump_dir dumpfile=scott_seq.dmp schemas=SCOTT include=SEQUENCE table_exists_action=replace

Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
ORA-31684: Object type SEQUENCE:"SCOTT"."SEQ01" already exists

Job "SYSTEM"."SYS_IMPORT_SCHEMA_02" completed with 1 error(s) at Fri Jan 12 14:43:34 2018 elapsed 0 00:00:03

```

上記のようにエラーが発生しています。SEQUENCEを上書きすることはできないようなので、既存のオブジェクトを削除してインポートする必要がありそうです。
Excel備忘録

Excelの備忘録を記載していく。

##### 保護ビューの無効化

ネットワークから取得したExcelを開いた時の「保護ビューの解除」を無効化する。

オプション→セキュリティセンター→セキュリティセンターの設定→保護ビューのチェックを全て外す。

##### HTMLをExcelに貼り付け

HTMLソースを普通にExcelに貼り付けると、HTMLに変換されたものが貼り付く。
一度Wordに貼り付け、WordからExcelにコピペするとHTMLソースのまま貼り付けできる。

##### クイックアクセスツールバーのおすすめ設定

<img width="35" alt="読み取り専用の設定/解除" src="https://qiita-image-store.s3.amazonaws.com/0/215812/20229290-6f4a-33b8-d4b0-3f0015c08124.png">　読み取り専用の設定/解除（読み取り専用で開きたい時に）
<img width="35" alt="書式のコピー/貼り付け" src="https://qiita-image-store.s3.amazonaws.com/0/215812/4c3c9299-40ac-7729-dbaa-ce87871c869c.png">　書式のコピー/貼り付け（書式だけをコピペする時に）
<img width="35" alt="オブジェクトの選択" src="https://qiita-image-store.s3.amazonaws.com/0/215812/2bcb94a4-c6e0-63f7-d768-18163e48aa57.png">　オブジェクトの選択（図形だけを纏めて選択する時に）
<img width="35" alt="戻る" src="https://qiita-image-store.s3.amazonaws.com/0/215812/8540eff9-07b8-a4c3-c686-8c4003aa1c67.png">　戻る（Excel内のリンク移動を戻る時に）
<img width="35" alt="進む" src="https://qiita-image-store.s3.amazonaws.com/0/215812/a326f6e0-fd98-9f0f-084f-5332b9a1d940.png">　進む（Excel内のリンク移動を進む時に）
Xcodeでテストを始める前にする設定

自分がテストを始めるにあたって設定したことを書いていきます:cat:

# プロダクトとテストのTargetのTeamを合わせる
Teamは同じものを設定します。開発当初からアカウントが決まっているなら何の問題も無いですが、最初仮のアカウントでプロジェクトを作って、後から本番アカウントに変更したりすると、TargetのTeamが食い違ってしまったりします。
![スクリーンショット 2018-01-12 10.51.13.png](https://qiita-image-store.s3.amazonaws.com/0/84917/56e6215d-86af-d81d-b3d4-e0f7f977aea9.png)
もしプロダクトとテストで違うTeamを設定していると、CodeSigning周りでエラーが出ます。
![スクリーンショット 2018-01-12 11.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/84917/1fcbf188-4965-35ee-8709-8cf70f0baf30.png)

# バンドルIDを変える
こちらも途中でアカウントを変更した場合ですが、初期状態のテストTargetのバンドルIDは最初のアカウントに使われてしまっているため、バンドルIDを変更する必要があります。
![スクリーンショット 2018-01-12 11.59.03.png](https://qiita-image-store.s3.amazonaws.com/0/84917/aab14f48-df09-7a45-8b7b-6d03cc29c18a.png)
バンドルIDはBuild Settingsから変更できます。
<img width="904" alt="スクリーンショット 2018-01-12 12.09.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/84917/c8d71aa8-8678-86a2-8c99-d632de79125e.png">

# Podsのフレームワークがインポートされるようにする
特に工夫をしない限り、テストではPodsで入れたフレームワークが見つからないというエラーが出ます。検索してみると色々解決方法が出てきますが、自分はConfigurationで使うPodsを選択するところで、テストTargetのところをプロダクトTargetと同じにする、という方法でうまくいきました。
<img width="861" alt="スクリーンショット 2018-01-12 12.25.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/84917/1f66c730-57e5-9e0b-dcfa-31580d50694a.png">
Podfileは特に変更しません。テストTargetの方にフレームワークを指定する必要はありません。

# カバレッジを表示する
SchemeのTest設定で、"Gather coverage data"にチェックを入れると、テスト実行時にカバレッジが表示されるようになります。
<img width="896" alt="スクリーンショット 2018-01-12 12.34.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/84917/9046482f-ef83-8c0e-4af6-7e02bd7ec0fa.png">
カバレッジはテスト実行後、レポートのタブから確認できます。ファイルごとにどれくらいカバーできているか見ることができます。
<img width="1146" alt="スクリーンショット 2018-01-12 12.43.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/84917/d68259d2-999f-c5de-1688-9a3dbe66773d.png">
プロダクトコードやテストコードのどこを通ったかも確認できます。通ったところは緑、通らなかったところは赤で表示されます。テストpassしたけど、実はテストコードが実行されてなかっただけ、なんてケースも発見できるようになるので、設定しておくと良いです。
![coverage.png](https://qiita-image-store.s3.amazonaws.com/0/84917/4c6cb30f-64ba-1880-6e49-baf1bcdff89c.png)

# おわりに
テストを始めようとしても、設定で詰まってしまうとかなりやる気を削がれますよね:new_moon_with_face:
そういった方々の参考になれば幸いです！:gift:
今まで普通に動いていたApacheが起動に失敗した(No space left on device)

# 状況確認
EC2上で稼働していたhttpdがある日突然起動に失敗した。
エラーログ`default:/var/log/httpd/error_log`を確認のところ、次の一文が確認された

```shell-session
No space left on device: AH00023: Couldn't create the watchdog-callback mutex
```

検索すると、ログローテーション時にセマフォを使い切っていて起動できなかった模様。
現在のセマフォ状況は`ipcs -s`コマンドで確認できる

```shell-session
[root@test-server]# ipcs -s
------ セマフォ配列 --------
キー     semid      所有者  権限     nsems
0x00000000 48365568   apache     600        1
0x00000000 48398337   apache     600        1
0x00000000 48431106   apache     600        1
0x00000000 48463875   apache     600        1
0x00000000 48496644   apache     600        1
0x00000000 48529414   apache     600        1
```

セマフォの上限は`sysctl -a`コマンドで確認できる

```shell-session
[root@test-server]# /sbin/sysctl -a | grep sem
kernel.sem = 250        32000   32      128
```

おそらくセマフォの識別子数が128で、ipcsコマンドの結果が128行に達すると起動に失敗する。

# 初期対応
`service httpd restart`でセマフォ数は減って起動するようになったが、翌日また増えている。
どうやら`service httpd graceful`コマンドだったりログローテーションの場合のみ、セマフォが増え続ける模様

# 調査
以下確認のところ、Apache/2.4.25で発生するバグであった模様
http://forum.directadmin.com/showthread.php?t=54265
https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x/CHANGES

# 恒久対応
バージョン確認すると、ばっちり該当した

```shell-session
[root@test-server]# httpd -v
Server version: Apache/2.4.25 (Amazon)
Server built:   Jan 19 2017 16:55:49
```

`yum update httpd`で2.4.27にアップデートし、問題が解消されたことを確認した
python3 venvで環境作成

pyenvとかvirtualenvとか色々あるらしいけど、これが公式でおすすめらしい。

```
~$ sudo apt install python3-venv

~$ python3 -m venv ./myvenv/
~$ ls
memo.txt  myvenv


~$ . myvenv/bin/activate
(myvenv) ~$
(myvenv) ~$ python --version
Python 3.5.2
```
簡単ですね。

【追記】

Pythonのバージョンを変えたい。
```
~$ cat myvenv/pyvenv.cfg
home = /usr/bin
include-system-site-packages = false
version = 3.5.2
```
Ubuntuに入ってたPython３は`３．５．２`だったみたい。
`3.6.3`にしたいとおもいました。

Python3.6.3のインストール方法
https://www.python.jp/install/ubuntu/index.html

インストールしたら、下記で新しい環境を作る。

```
python3.6 -m venv --without-pip ./myvenv2

~$ . myvenv2/bin/activate
(myvenv2)~$ python --version
Python 3.6.3
```
できたっぽいです。
UnityのRoundToIntで四捨五入する際の「銀行家の丸め」メモ

## UnityのRoundToIntで四捨五入する際の「銀行家の丸め」メモ

## 11.5f は 12　で、　10.5f は 10　となる


実際にDebug.Logで計算結果を出してみるとこんな感じ

```

Debug.Log(Mathf.RoundToInt(10.0F)); // 10
Debug.Log(Mathf.RoundToInt(10.2F)); // 10
Debug.Log(Mathf.RoundToInt(10.7F)); // 11
Debug.Log(Mathf.RoundToInt(10.5F)); // 10
Debug.Log(Mathf.RoundToInt(11.5F)); // 12
Debug.Log(Mathf.RoundToInt(-10.0F)); // -10
Debug.Log(Mathf.RoundToInt(-10.2F)); // -10
Debug.Log(Mathf.RoundToInt(-10.7F)); // -11
Debug.Log(Mathf.RoundToInt(-10.5F)); // -10
Debug.Log(Mathf.RoundToInt(-11.5F)); // -12

```

### 四捨五入では0.5を常に切り上げますが、Roundは丸めた計算結果が偶数になるような丸め方をしているようです。

「最近接偶数への丸め」「最近偶数丸め」「銀行家の丸め」とも言われるようです。

参考にさせて頂いたサイトm( _ _ )m：

https://dobon.net/vb/dotnet/programing/round.html#.Wk8SUgq1EI0.twitter

https://docs.unity3d.com/ja/540/ScriptReference/Mathf.RoundToInt.html

https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86#%E5%9B%9B%E6%8D%A8%E4%BA%94%E5%85%A5
SoS(Script of Scripts)の環境構築


# SoS(Script of Scripts) インストール
...執筆のため、不明な点も残っている状態ですが、ご了承ください...

## SoS(Script of Scripts)とは
[Script of Scripts (SoS)][sos-git]とは、同一実行環境にて、一つの参照ファイルフォーマットを複数のスクリプト言語で実行可能にするワークフローエンジンです...

*Note* : なお、公式では[anaconda Python][anaconda]を推奨しているそうですが、
今回、anacondaの導入が現段階でできないため、こちらはpython3をpyenvで構築しています。

## 環境

```
iMac(Retina-5K,27-inch,2017)
```
| OS |バージョン | プロセッサー | メモリ | グラフィック |
|:---:|:---:|:---:|:---:|:---:|
| macOSHighSierra | 10.13.2 | 4.2 GHz Intel Core i7 | 64 GB 2400 MHz DDR4 | Radeon Pro 580 8 GB |


## PythonにSoSをインストール
```
sudo pip install sos
sudo pip install sos-pbs
sudo pip install sos-notebook
```

## Julia インストール & jupyterの設定
今回、jupyterとJuliaは、既にインストールされているものとする。

### Julia インストール
Pythonのパスは、`which python`で表示されたパスを指定します。

```bash:ターミナル(Julia起動中)
ENV["PYTHON"]="/usr/bin/python"
Pkg.build("PyCall")
Pkg.add("PyPlot")

ENV["JUPYTER"] = "/bin/jupyter"
Pkg.add("IJulia")
Pkg.add("Feather")
Pkg.add("DataFrames")
Pkg.add("NamedArrays")
```

### jupyterの設定

今回は、`bash`,`javascript`,`julia`を入れました。
他にも`R`や`MATLAB`なども導入可能です。

Note: `~`の部分は、ユーザー設定のディレクトリ構造により、異なります。

```bash:ターミナル
$ # bashも使いたい人は...
$ pip install bash_kernel
$ python -m bash_kernel.install
$ # なになに?JavaScriptも使ってみたいって。まずは、Node.jsをインストールして...
$ # 'npm install - g ijavascript' after run 'ijsinstall'.
$ # ('npm install - g ijavascript'後に'ijsinstall'を実行すればいいよ。)
$ npm install - g ijavascript
$ ijsinstall
$ # jupyterに反映されているかを確認して
$ jupyter kernelspec list
Available kernels:
  bash          ~/Library/Jupyter/kernels/bash 
  javascript    ~/Library/Jupyter/kernels/javascript
  julia-0.6     ~/Library/Jupyter/kernels/julia-0.6
  python3       ~/.pyenv/versions/3.6.2/share/jupyter/kernels/python3
  sos           ~/.pyenv/versions/3.6.2/share/jupyter/kernels/sos
$ # jupyter notebookを起動
$ jupyter notebook
```

## 参照先
[Installing SoS locally][sos-ins]
[SoS GitHub][sos-git]
[WindowsへのJulia言語のインストール][win-julia-ins]
[anaconda Python][anaconda]


<!-- Link's -->
[sos-ins]:https://vatlab.github.io/sos-docs/#runningsos
[sos-git]:https://github.com/vatlab/SoS
[win-julia-ins]:http://nbviewer.jupyter.org/gist/genkuroki/81de23edcae631a995e19a2ecf946a4f#PyCall%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%85%A5%E3%82%8C%E6%96%B9
[anaconda]:https://www.anaconda.com/download/#macos
配列群の最大・最小長を取得するには

# 概要

`n`個の配列、

```
[1]
[2, 3]
[4, 5, 6]
```
があるとき、一番要素数が多い(少ない)ものの数を取得したい。

# 最大長

```php
<?php

function array_count(array $array){
        if (func_num_args() > 1) {
            $array = func_get_args();
        }
        return array_reduce($array, function($max, $array){
                return max($max, count($array));
        }, 0);
}


$a = [1];
$b = [2, 3];
$c = [4, 5, 6];

print array_count($a, $b, $c) . "\n"; // 3
print array_count([$a,$b,$c]) . "\n"; // 3
```

# 最小長

`max()`を`min()`にし、初期値は…配列の可能な長さはメモリに依存するようなので、(**すごく曖昧な情報です**)
適当に「これより大きい値が最小長になることは無いだろう」値を決め打ちするしかない？
あるいは`PHP_INT_MAX`定数などを利用するか。

# 最大・最小の配列自体を取得したい

配列長は`count`で簡単に取得できるので、配列自体を返したほうが便利そう。



****

ここまでむかーし書いていた文章。
目的と手段の理由を既に見失ってますが、今なら`array_map`でこう書くかな。

```php
<?php

function array_count(array $array){
        if (func_num_args() > 1) {
            $array = func_get_args();
        }

        return max(array_map(function($array) {
                return count($array);
        }, $array));
}


$a = [1];
$b = [2, 3];
$c = [4, 5, 6];

print array_count($a, $b, $c) . "\n"; // 3
print array_count([$a,$b,$c]) . "\n"; // 3
```

長さだけの配列を新しく作っちゃえば、それを`max()`,`min()`にかければ初期値は要らないはず。
メモリを考慮してたのかな？

配列自体が欲しいという話は同じ長さの配列が渡されたときの要件が書かれてないのでrejectしたい。

ああ、[PythonのzipをPHPで - Qiita]で`min`版使ってました。
これが最初の目的かな？最大値にも使えるじゃん的な応用記事だったかも。

***

投稿後追記
投稿した直後に思いつくやつ。
配列の長さでソートすりゃあとは煮るなり焼くなりだ

```php
<?php

$a = [1];
$b = [2, 3];
$c = [4, 5, 6];

$p = [$c, $b, $a];
uasort($p, function($a, $b) {
  return count($a) - count($b);
});

print_r($p);
/*
Array
(
    [2] => Array
        (
            [0] => 1
        )

    [1] => Array
        (
            [0] => 2
            [1] => 3
        )

    [0] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )

)
*/
```




[PythonのzipをPHPで - Qiita]:https://qiita.com/khsk/items/bfacacd283c2c74c8499
railsでwebpackerを使わずにparcel + asset pipelineでreactを使う

# サンプル
https://github.com/github0013/rails_percel

# 流れ
1. webpacker無しのrailsで良い
2. parcelを通常通り使う
3. javascriptは`app/javascript/packs`配下でもどこでも良い
4. parcelの出力先は`app/assets`配下へ （例 `app/assets/bundled`）
5. `config/initializers/assets.rb`に出力したファイルをprecompileのリストへ追加
6. parcelでコンパイルしたjsファイルは通常通り`javascript_include_tag`で呼び出す

# 例

```
# これにて app/assets/bundled 配下にファイルが出来る
yarn run parcel app/javascript/packs/hello_world.jsx -d app/assets/bundled

# 続けてサーバー起動
rails s 


# またはproduction環境で
# 5.のprecompileリストへ追加をしているのでparcelでコンパイルしたものも、digest付きファイルは出力される
rails assets:precompile RAILS_ENV=production
rails s -e production 
```

# 注意点
`assets:precompile`の時に普通`config/environments/production.rb`の

```rb
config.assets.js_compressor = :uglifier
```
で、難読化されるが、`uglifier`gem自体のバージョンが古いとブラウザでの実行時にエラーが出る事がある。
mysqlで手軽に100万件のテストデータを追加する方法


```
create database test_database;
use test_database;

CREATE TABLE data(
  id INT(11) NOT NULL AUTO_INCREMENT,
  status TINYINT(1) NOT NULL,
  name VARCHAR(50) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);
```

```
insert into data value(null,0,"test000000000",now(),now());
```

```
select * from data;
+----+--------+---------------+---------------------+---------------------+
| id | status | name          | created_at          | updated_at          |
+----+--------+---------------+---------------------+---------------------+
|  1 |      0 | test000000000 | 2018-01-12 05:17:44 | 2018-01-12 05:17:44 |
+----+--------+---------------+---------------------+---------------------+
```

以下x 20実行

```
insert into data(name,status) 
SELECT CONCAT ('test', @rownum := @rownum + lpad(FLOOR( (RAND() * 100000000)),9,'0')),
FLOOR( (RAND() * 2)) FROM data AS s1, (SELECT @rownum := 0) AS v;
```

自分自身のデータを取得して'test'とランダムな数字を組み合わせたものを
nameとして使用する。
stautsは0 or 1　のいずれかが入るようにする。


```
select * from data limit 10;
+----+--------+---------------+---------------------+---------------------+
| id | status | name          | created_at          | updated_at          |
+----+--------+---------------+---------------------+---------------------+
|  1 |      0 | test000000000 | 2018-01-12 05:17:44 | 2018-01-12 05:17:44 |
|  2 |      1 | test15062706  | 2018-01-12 05:17:46 | 2018-01-12 05:17:46 |
|  3 |      1 | test51218631  | 2018-01-12 05:17:47 | 2018-01-12 05:17:47 |
|  4 |      0 | test88808289  | 2018-01-12 05:17:47 | 2018-01-12 05:17:47 |
|  6 |      0 | test53235853  | 2018-01-12 05:17:48 | 2018-01-12 05:17:48 |
|  7 |      1 | test126410172 | 2018-01-12 05:17:48 | 2018-01-12 05:17:48 |
|  8 |      1 | test137599580 | 2018-01-12 05:17:48 | 2018-01-12 05:17:48 |
|  9 |      1 | test191629493 | 2018-01-12 05:17:48 | 2018-01-12 05:17:48 |
| 13 |      1 | test25863700  | 2018-01-12 05:17:48 | 2018-01-12 05:17:48 |
| 14 |      0 | test31004826  | 2018-01-12 05:17:48 | 2018-01-12 05:17:48 |
+----+--------+---------------+---------------------+---------------------+

select count(*) from data;
+----------+
| count(*) |
+----------+
|  1048576 |
+----------+

```