OmniAICreator/Qiita-1.07M huggingface dataset:
Eigen version

#Check version of Eigen

- Google 先生に聞けばすぐに分かることなのだが。Macros.h にdefine されている。<br>
　EIGEN_WORLD_VERSION, EIGEN_MAJOR_VERSION and EIGEN_MINOR_VERSION

```console
 $ grep "#define EIGEN_[^_]*_VERSION" /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h
```
- Link [Determine Eigen version with grep](http://www.alecjacobson.com/weblog/?p=3415)
- Link [How to check the version number of Eigen C++ template library?](https://stackoverflow.com/questions/21497064/how-to-check-the-version-number-of-eigen-c-template-library)

# license

権利関係は [eigen のサイト](https://eigen.tuxfamily.org/index.php?title=Main_Page#License)に書かれている。モジラ・パブリック・ライセンス[MPL2.0](https://www.mozilla.org/en-US/MPL/2.0/FAQ/)であり、MPL2.0以外のものを使わないように、

-DEIGEN_MPL2_ONLY

でコンパイルすれば良い。らしい。

>Eigen is Free Software. Starting from the 3.1.1 version, it is licensed under the MPL2, which is a simple weak copyleft license. Common questions about the MPL2 are answered in the official MPL2 FAQ. 

>Note that currently, a few features rely on third-party code licensed under the LGPL: SimplicialCholesky, AMD ordering, and constrained_cg. Such features can be explicitly disabled by compiling with the EIGEN_MPL2_ONLY preprocessor symbol defined. Furthermore, Eigen provides interface classes for various third-party libraries (usually recognizable by the <Eigen/*Support> header name). Of course you have to mind the license of the so-included library when using them.
screenrcの設定とコマンドメモ

#screenrcの設定をいつも忘れるのでメモ

### 参考
https://qiita.com/kamykn/items/9939b67e923dbb87f39c
コマンド
https://bacchi.me/linux/how-2-use-screen/


## 立ち上げ
```
screen -S work
```

## ローカルのscreenの設定
ローカルはj、ssh先はnに変えると画面左下の色が変わってわかりやすい。デフォルトのaだとカーソル移動とかぶるので変えるのが良い。

```
タブ（新しいスクリーン）は[Ctrl + j] + c
[Ctrl + j] + n または [Ctrl + j] + [space]：昇順移動  
[Ctrl + j] + p または  [Ctrl + j] + [del]：降順移動  
ローカルに戻る[Ctrl + b] + n
ssh先に移動[Ctrl + j] + n
消すとき[Ctrl + j] + k　もしくは[Ctrl + d]
```

## screenrcの例

```~/.screenrc
# Prefix Key
#ssh先とローカルで変える
escape ^Jj
#escape ^Bb

# use bright colors for bold text.
attrcolor b ".I"

# enable background-color-erase setting
defbce on

# enable 256 color
termcapinfo xterm* 'Co#256:AB=¥E[48;5;%dm:AF=¥E[38;5;%dm'

# set statusbar
shelltitle "$ |$HOSTNAME"
# format                   time                   title selected title         load

#画面左下のバーの色をローカルとssh先で切り替える
#緑
hardstatus alwayslastline "%{= gk}[%m/%d %02c:%s] %{gk} %-w%{= GK}%n %t%{-}%+w %=%{gk}%l"
#青
#hardstatus alwayslastline "%{= ck}[%m/%d %02c:%s] %{ck} %-w%{= CK}%n %t%{-}%+w %=%{ck}%l"
#黄色
#hardstatus alwayslastline "%{= yk}[%m/%d %02c:%s] %{yk} %-w%{= YK}%n %t%{-}%+w %=%{yk}%l"
hardstatus off

## スクロール行数
defscrollback 10000

## マウススクロール有効
termcapinfo xterm* ti@:te@
#macのターミナルなら、ターミナルの環境設定の『代替スクリーンをスクロール』をチェック外すとトラックパッドのスク
ロールがそのまま反映されるようになる

# vimとかlessとかtigとかのバッファを終了時に消す
altscreen on
```
GitHubへの公開鍵登録の注意点



鍵の名前を `ssh-keygen -t rsa`で作成して `id_rsa`（初期設定から）変えた場合は
`$ssh -T git@github.com`がうまくいかない
ssh接続の際「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」しかデフォルトでは見にいかないから。

~/.ssh/configに以下を追加しないといかない

```
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_git #変更したファイル名
  User git
```

これでうまくいく

```
$ ssh -T github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
```

すでにhttpでURL登録済みの場合は

```
$git remote set-url origin git@github.com:foobar/hogehoge.git
```

なお、リモートホストの確認は

```
$ git remote -v
```

鍵の中身のクリップボードへのコピーは

```
$ pbcopy < ~/.ssh/id_rsa.pub (Mac)
$ clip < ~/.ssh/id_rsa.pub (Windows)
```
EasyOpenVRUtil (UnityでのOpenVR直叩き支援ライブラリ)

# EasyOpenVRUtil

かゆいところに微妙に手が届かないSteam VR Pluginの仕様を見て、
補助ライブラリを作りたくなりました。

OpenVRに直接アクセスして、
Steam VR 2.0で色々おもしろいことになった入力システムを無視して
コントローラやトラッカーの座標を取得したり、
識別しにくいトラッカーをシリアル番号で識別できたり、
バッテリー残量を取得できたり、
VR内スクリーンショットを勝手に撮影したり、
デバイス一覧を取得したり、
非VRアプリケーションだけどトラッカーやコントローラーの姿勢を取得したりできます。

3時間で作ったのでデバッグ不足なところがあるかも知れません。不具合報告お願いします。

**↓ダウンロード**
EasyOpenVRUtil
https://github.com/gpsnmeajp/EasyOpenVRUtil

CC0ライセンスです。
バグ報告などは、コメント、メール、もしくはDiscord:https://discord.gg/QSrDhE8まで

# 使い方
詳細はこちらをご参照ください。
https://github.com/gpsnmeajp/EasyOpenVRUtil/wiki

例えば特定のシリアル番号を持つVIVEトラッカーの位置を
装着位置や角度をリセットした上でGameObjectに反映する処理は以下のように書けます。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using EasyLazyLibrary;

public class VRTracker : MonoBehaviour {
    public GameObject Tracker;
    public string serialNumber;
    EasyOpenVRUtil eou;
    EasyOpenVRUtil.Transform offset;

    void Start () {
        eou = new EasyOpenVRUtil();
    }

    void Update () {
        eou.Init(); //初期化処理(初期化後は特に何もしない)
        eou.AutoExitOnQuit(); //VRシステムの終了を検知して自動終了する

        //シリアル番号を指定して、姿勢情報を取得
        var t = eou.GetTransformBySerialNumber(serialNumber);
        if (offset == null)
        {
            //一番最初に取得された位置情報を、初期姿勢とする
            offset = t;
        }
        //初期姿勢からの変化を、GameObjectに反映する
        eou.SetGameObjectLocalTransformWithOffset(ref Tracker, t, offset);
    }
}
```
三項演算子を初めて知ったので備忘

#三項演算子って？
尊敬する先輩にPythonで書いたソースをチェックしてもらった時に初めて聞いた単語「三項演算子」。
よく使う「if文」とそれは近しい存在のようで、でも用途が違うもの。

ただ、明らかに違う性質があるから、近しい存在で違うものが存在している。
その違いが…

```
三項演算子：式
if文：文
```

？？？

最初聞いた時はよくわからん…

要は、

```
三項演算子には「返り値」がある。
if文にはない。ただの文章。
```

ということらしい。

if文は容易に想像できると思うので…
とりあえず、三項演算子の書き方はこんな感じ。

```title:Python
(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
例：x = "Yeah!" if happy? else "orz..."
```

`happy?`がtrueだった場合は元気よくYeah！
trueじゃなかった場合はorz...


```title:Ruby
(変数) = (条件) ? (条件がTrueのときの値) : (条件がFalseのときの値)
例：x = happy? ? "Yeah!" : "orz..."
```

最初見た時は、なんなんこの書き方は…と思いました。

式として扱えるということは、functionの引数としてもこのまま記載して使用することも可能。

あと、if文を使用しようとすると、必ずif文の前に変数を定義して、その変数にif文を使用した値を代入することになるので、必ず「変数」になってしまう。

しかし、三項演算子だと、事前に変数の定義は不要で、三項演算子の結果を変数にはじめから代入することができる＝「定数」として扱えることが可能。
※Pythonはあまり関係ないですが…

そういったメリットがあります。

#三項演算子を好きな人／嫌いな人の差が激しめ
人によっては、「三項演算子は可動性に欠ける！！」という方もいれば、「三項演算子使えばソースがスマートになる！！」という人もいるっぽいです。

いろんな人の考え方があるなと思うのですが、そんな中尊敬する先輩から助言いただいたのは…

```
三項演算子を使用してソースの可読性が損なわずスマートになるなら使用する。
ただ、それによって可読性が損なわれるのなら、従来通りif文を使用する。
```

要は、今から実現しようとしている内容によってちゃんと使いわけろということです。
できることは三項演算子もif文も変わらないから、あとは他の人が見た時に`読みやすいかどうか`というところが大切なポイント、ということですね。

可読性という感覚って大事。

if文を使用する時は、「三項演算子使ってみたら？」ということを考えるようにクセづけれたら良いですね。
ターミナルに【はぐれメタル】が出た！！

<img width="814" alt="スクリーンショット_2018-09-26_23_43_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/267738/72353352-80f2-8b2e-25d7-191d64044d55.png">


vagrantにログインした時に、`はぐれメタル`が出るようにしました。
以降その出し方に付いて説明します。


##スライムの元取得


下記のURLから取得できます。
[https://github.com/dot-motd/dragon-quest]

<img width="510" alt="スクリーンショット 2018-09-26 23.37.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/267738/ce40f84b-73c6-eb4b-7f8a-399f858774ba.png">

私は`はぐれメタル`が好きなのではぐれメタルにしました。
`gist:hagure-metal.txt`のリンクを取得して下さい。


##/etc/motd に貼る


```
$ sudo vi /etc/motd
```

でファイルを開き、先ほど取得したリンクを貼って下さい。


##vagrantにログインして確かめる


```
$ vagrant ssh
```

vagrantにログインして確かめてみましょう。

<img width="814" alt="スクリーンショット_2018-09-26_23_43_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/267738/72353352-80f2-8b2e-25d7-191d64044d55.png">

どうですか？出ましたか？


##まとめ

つい`vagrant ssh`をしてしまいそうです。
何気ないコマンド入力にワクワク出来るなんて最高ですね。
気分転換にいかがでしょうか？
【Mac版】httpsで複数のGitアカウントを切り替える方法（キーチェーン使用時）



ソースツリーなどのクライアントを使わずにターミナルなどでクローンをしている人向けです。
今まで使用していたアカウントとは別のアカウントに切り替えたいのにクローンすると not found と表示されてしまう人などは試してみてください。


1. キーチェーンアクセスのアプリを開く
2. キーチェーンアクセスアプリの右上の検索からアカウントを切り替えたいサイトのurlを入力して検索する
3. 該当のサイトの項目が表示されるのでダブルクリックして開く
4. 小さなウィンドウが表示されるので
    5. 「アカウント」に切り替えたいアカウントのユーザ名に変更
    6. 「パスワードを表示」にチェックを入れてパスワードを入力する。その後、表示された内容を切り替えたいアカウントのパスワードに変更
7. これで再度クローンを行うと通常通りローカルリポジトリがクローンされているはずです


私はgitlabを使用しているのですが、githubでも同様かと思います。（違ったらごめん！）

※ 注意点
※ 2番で検索するurlはgitlabの場合「gitlab.com」と記載されていました。
※ 3番で該当のサイトが複数ある場合は項目の右側にある「キーチェーン」で「ログイン」と記載があると思いますので確認してみてください。
※ 4-1番のユーザ名は「＠XXXX」の＠を外したものがユーザ名です。(gitlabの場合)
※ 4-2番で「パスワードを表示」にチェックを入れた時に求められる「許可するにはキーチェーン"ログイン"のパスワードを入力してください」には、Macにログイン時のパスワードを入れる。
※ 5番で再度クローンを行なってからはパスワードの確認画面がなんども表示されます。入力画面で「常に許可」をクリックすると回避できます。


とりあえず情報を共有するためだけに急いで書きました。
そのうちわかりやすくしたいと思います。
画像処理 in Julia 1.0 #2

# JuliaImages
Juliaで画像処理をする場合、有用なパッケージのひとつに[JuliaImages](http://juliaimages.github.io/latest/)がある。ここでは、Julia 1.0に導入されたJuliaImagesによる基本的な画像の操作方法についてまとめておく。OSはUbuntu 16.04である。pythonで画像処理を行ったことがあるならば、[ここ](http://juliaimages.github.io/latest/api_comparison.html#Comparison-with-other-image-processing-frameworks-1
)の対応表が参考になる。

# JuliaImagesパッケージの読み込み
```julia:
# import packages
using Images, ImageView, TestImages
```

## 画像を読み込みたい
```julia:
# load your own image
img = load("path_to_image")

# load an image from TestImages package
imgg = testimage("lena_gray_256")
imgc = testimage("lena_color_256")
```

## 画像を表示したい
```julia:
# imshow in ImageView package
imshow(imgc)
```

## カラー画像をレイヤーごとに表示したい
```julia:
# imshow in ImageView package
imshow(permutedims(channelview(imgc), [2,3,1]))
```

## 画像のサイズを知りたい
```julia:
# return (height, width)
size(img)
```

## 空の画像を生成したい
```julia:
# gray image: zeros(format, height, width)
imgg = zeros(Gray, 5, 5)

# color image
imgc = zeros(RGB{N0f8}, 5, 5)
```

## ランダムな画像を生成したい
```julia:
# gray image: rand(format, height, width)
imgg = rand(Gray, 5, 5)

# color image
imgc = rand(RGB{N0f8}, 5, 5)
```

## cropしたい
```julia:
# gray image
imgg_crop = imgg[90:200, 70:210]

# color image
imgc_crop = imgc[90:200, 70:210]
```

## resizeしたい
```julia:
# gray image
imgg_resize = imresize(imgg, (64, 128))

# color image
imgc_resize = imresize(imgc, (64, 128))
```

## 配列（1次元）を画像に変換したい
```julia
# convert 1d array -> gray image
array_1d = collect(range(0,stop=1, length=25))
imgg = colorview(Gray, reshape(array_1d, 5, 5))
```

## 配列を画像に変換したい
```julia:
# convert 2d array -> gray image
array_2d = rand(5, 5)
imgg = colorview(Gray, array_2d)

# convert 3d array -> color image
array_3d = rand(3, 5, 5)
imgc = colorview(RGB, array_3d)
```

## 画像を配列に変換したい
```julia:
# gray image -> convert 2d array
imgg = testimage("lena_gray_256")
array_2d = channelview(imgg)

# color image -> convert 3d array
imgc = testimage("lena_color_256")
array_3d = channelview(imgc)
```

## カラー画像をグレー画像に変換したい
```julia:
# convert color image -> gray image
imgg = Gray.(imgc)
```

## 2値化したい
```julia:
# binarize a gray image by thresholds 0.5
imgg_bin = imgg .> 0.5
```

## filterをかけたい
```julia:
# gaussian filter
img_filter_gau = imfilter(imgc, Kernel.gaussian(5))

# lapracian filter
img_filter_lap = imfilter(imgc, Kernel.Laplacian())
```

## paddingしたい
```julia:
# mirroring
imgc_pad_refl = padarray(imgc, Pad(:reflect, 25, 50))
imgg_pad_refl = padarray(imgg, Pad(:reflect, 25, 50))

# copy
imgc_pad_repl = padarray(imgc, Pad(:replicate, 25, 50))
imgg_pad_repl = padarray(imgg, Pad(:replicate, 25, 50))

# periodic bound
imgc_pad_circ = padarray(imgc, Pad(:circular, 25, 50))
imgg_pad_circ = padarray(imgg, Pad(:circular, 25, 50))

# filled by constants
t = 100; b = 0; l = 10; r = 40
pad_color = RGB4{N0f8}(.5,0.5,0.) # color 
imgc_pad_fill = padarray(imgc, Fill(pad_color, (t, l), (b, r)))
imgg_pad_fill = padarray(imgg, Fill(pad_color, (t, l), (b, r)))
```
一旦ここまで。これでかなりの処理ができる。今後、有用な関数を追加する予定である。お疲れ様でした。
Progateを卒業してRuby on Railsチュートリアルやります 後半戦

前半戦は[こちらから](https://qiita.com/UKiABe/items/17555fd76cd03e06afbc)

Progateを卒業し、Railsチュートリアルに挑戦しています。
[Railsチュートリアル](https://railstutorial.jp/)を進めていくときにつまづいたところ、勉強になった所をまとめていきます。

#第１２章
演習課題 
リスト 12.4のform_forメソッドでは、なぜ`@password_reset`ではなく`:password_reset`を使っているのでしょうか? 考えてみてください。

この問題に対する答えをぐぐってみたのですが納得できる回答はありませんでした。
必死こいて考え抜いてたので備忘録を残しておきます。

まず、`form_for`にシンボル(例えば`:user`)を渡すときと、オブジェクト(例えば`@user`)を渡すときの違いから。
ググるとこんな回答が得られました↓

>シンボルを使うとよりシンプルなformタグが生成され、オブジェクトを渡すとそのオブジェクトに寄って良しなに出し分けてくれる。newやeditのviewを準備する時に、同じ_form部分テンプレートを利用した時、同じ書き方で出し分けてくれる。
（参考：http://ja.stackoverflow.com/questions/18099/rails%E3%81%AEform-for%E3%81%AB%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%81%A8%E3%81%8D%E3%81%8B）

これが演習問題の回答です!
としている記事もありましたが、不十分すぎて納得できず…。
ちゃんとチュートリアルの実装に合わせて回答を考えてみました。

前提として、今回の章で作る「新しいパスワード再設定画面ビュー」`app/views/password_reset/new`は他のビューファイルへ使いまわしません。
なので、form_forで生成されるHTMLのactionを出し分ける必要はありません。

一方、ビューファイルを使い回したこともありました。部分テンプレートとして共通のHTMLを切り出したときとかです。`app/views/users/_form.html.erb`は部分テンプレートとして使い回されるビューファイルです。`form_for`の引数には`@user`が渡されています。
`@user`にUser.newがはいったり、User.find_by(:id)が入ったりします。`@user`にUser.newが入っていたらusers#createにルーティング送ってほしいし、@userにUser.find_by(:id)がはいっていたらusers#editに送ってほしいよね。
`@user`の状態によってactionを出し分けてほしいので`form_for`の後を`@user`としていたんですね。

演題の回答は以下になります。
新しいパスワード再設定画面ビューは部分テンプレートではないので、`form_for`でHTMLのaction属性を出し分ける必要がありません。
`form_for`の後はシンボル`:password_reset`とするのが最適のコーディングになります。


##２０１８．１０月　追記
後半戦のまとめは１４章終わってからやることにしました。
息切れがひどく、まとめるよりも進めることに注力していきます。
ホントは気づいたこととかかければいいんでしょうが…！

現在１０章終了！
macにopenjdk11をインストール

## はじめに
openJDK11がリリースされました。
取り急ぎ、macにインストールしたのでその手順をまとめます。

## 環境
- MacOS X Yosemite 10.10.5 

##1.openJDKをダウンロード
以下のURLからMacOS用のopenJDKをダウンロードします。
http://jdk.java.net/11/

以下の赤枠部分のリンクからダウンロードしました。
![スクリーンショット 2018-09-26 23.22.08.png](https://qiita-image-store.s3.amazonaws.com/0/32142/d0c9a117-1806-9349-7e7b-ad22670811a7.png)

##2.ダウンロードファイルを展開
ダウンロードしたtar.gzを展開します。

```
$ tar xvzf openjdk-11+28_osx-x64_bin.tar.gz
```

##3.展開フォルダの移動
展開して作成されたフォルダを「/Library/Java/JavaVirtualMachines/」配下に移動させます。

```
$ sudo mv jdk-11.jdk /Library/Java/JavaVirtualMachines/
```

##4. Java_homeコマンドで確認
Java_homeコマンドで認識されているか確認します。

```
$ /usr/libexec/java_home  -V
Matching Java Virtual Machines (3):
    11, x86_64:	"OpenJDK 11"	/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 ︙
```
「OpenJDK 11」が表示されていること確認します。

##5. 環境変数に登録
環境変数に登録します。

```
export JAVA_HOME=`/usr/libexec/java_home -v 11`
```

##6. バージョン確認
バージョンを確認し、openJDKが指定されていれば完了です。

```
$ java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
```
Nuxt.js v2.0.0 インストールしてみた


#Nuxt.js v2.0.0 のインストール
2018年9月21日にNuxt.js v2.0.0がリリースされたのでインストールしてみた。
<br>

#ターミナルで以下を実行
```terminal
$ npx create-nuxt-app <my-project>
? Project name 
? Project description
? Use a custom server framework 
? Use a custom UI framework 
? Choose rendering mode 
? Use axios module 
? Use eslint 
? Author name 
? Choose a package manager 



$ cd <my-project>
$ npm run dev
```

##npx
npmのバージョン5.2.0以上で使用可能。
`npm`をインストール済みであれば個別インストールは不要。

https://www.npmjs.com/package/npx

##create-nuxt-app
構成を選びながら簡単にNuxt.jsアプリケーションを作ることができる。

https://github.com/nuxt-community/create-nuxt-app

##create-nuxt-appで選ぶ構成
・Use a custom server framework：サーバーフレームワークを選択
　選択できるのは以下の7つ
　none / [express](http://expressjs.com/) / [koa](https://koajs.com/) / [adonis](https://adonisjs.com) / [hapi](https://hapijs.com/) / [feathers](https://feathersjs.com/) / [micro](https://github.com/zeit/micro)

・Use a custom UI framework：　UIフレームワークを選択
　選択できるのは以下の7つ
　none / [bootstrap](http://getbootstrap.com/) / [vuetify](https://vuetifyjs.com/ja/) / [bulma
](https://bulma.io/)　/ [tailwind](https://tailwindcss.com/) / [element-ui](http://element.eleme.io/#/en-US) / [buefy](https://github.com/buefy/buefy)

#localhost:3000で表示
http://localhost:3000
起動できた。
<img width="600" alt="nuxt2-test.png" src="https://qiita-image-store.s3.amazonaws.com/0/295335/4a6ec7d1-110c-0d79-1898-9fae85b7efea.png">
選択された範囲のグラフを表示する （d3.js v5 brush）

# d3.jsを使って選択された範囲のグラフを表示させる
使用するデータは乱数で生成した株価っぽいやつ。特に意味はない。
[ソースコード](https://github.com/Keyhoh/d3_range_select)
[デモページ](https://keyhoh.github.io/d3_range_select/)

svg領域への出力範囲（値域）は変えず、入力範囲（定義域）を変化させることで、グラフの拡大縮小・移動を行う。
![d3-brush.png](https://qiita-image-store.s3.amazonaws.com/0/182047/f906f928-1d94-8806-d042-3bff8b4d3de5.png)

## 処理フロー
1. 範囲選択を始める
2. 選択範囲から逆算して、元のサイズでの選択された範囲（\$1）を求める
3. \$1を入力範囲として、スケール変換用の関数（\$2）を生成する
4. \$2でデータを変換し、プロットする

## グラフの描画
グラフ描画はいいって人は[範囲選択](#範囲選択)へ
### データ変換（スケール変換関数）
d3.scaleLinear()はデータの入力範囲と出力範囲を決めるだけで線形変換を行う関数（一次関数）を作成してくれる。
domain()が入力範囲でrange()が出力範囲。
中学数学に即して言えば、domainがxの変域、rangeがyの変域。
でも入力する数値はdomain()で定義した範囲内の数値でなくても問題はない。

```test.js
const scale = d3.scaleLinear()
  .range([0, 100])
  .domain([0, 10]);  // y = 10x が作られる。

console.log(scale(-10)); // -100が出力される。
```
出力範囲をsvg領域内に設定する。sub領域は全データを表示させるために入力範囲を全データに設定する。
main領域のdomainは初期値を便宜上全データに設定している。

```index.js
let mainScale = d3.scaleLinear()
    .domain([0, data.length])
    .range([0, width]);
const subScale = d3.scaleLinear()
    .domain([0, data.length])
    .range([0, width]);
```
### 描画
グラフを描画するための関数を設定する。

```index.js
const mainLine = d3.line()
    .x((d) => {
        return mainScale(d[0]);
    })
    .y((d) => {
        return d[1];
    });
const subLine = d3.line()
    .x((d) => {
        return subScale(d[0]);
    })
    .y((d) => {
        return subScale(d[1]);
    });
```
グラフを描画する

```index.js
main.append("path")
    .datum(data)
    .attr("d", mainLine);

sub.append("path")
    .datum(data)
    .attr("d", subLine);
```

## 範囲選択
### brushを作成する
.extent( [ 座標1 , 座標2 ] )で選択可能範囲を指定している。

```index.js
const brush = d3.brushX()
    .extent([[0, 0], [width, subHeight]]);
```
### brushイベントの作成と追加
**ここが要点**
[処理フロー](#処理フロー)の2~4をやっている。
scale.invertはscale関数の逆関数。
d3.event.selectionで選択された範囲を持ってきて、map.(subScale.invert)で元のサイズでの選択範囲を取得している。
で、取得した選択範囲をmainScale.domainに適用している。
main.select.attr("d",mainLine)はグラフの更新。
mainLineの中で更新したmainScaleを使ってる。

```index.js
const brushed = () => {
    mainScale.domain(d3.event && d3.event.selection ? d3.event.selection.map(subScale.invert) : subScale.domain());
    main.select("path").attr("d", mainLine);
};

brush.on("brush", brushed);
```

### brushを追加する
[公式のAPI](https://github.com/d3/d3-brush#api-reference)でもbrush用の**gタグ**をappendして、その**gタグ**の**中に**brushを追加している。**must**です。

```index.js
const brushes = sub.append("g");
brushes.call(brush);
```

## 使用した外部関数
```util.js
export const createData = (min, max, n, a) => {
    if (a === undefined) a = 0;
    let data = [];

    data.push([0, random(min, max)]);
    for (let i = 1; i < n; i++) {
        let Max = Math.min(max, data[i - 1][1] + a);
        let Min = Math.max(min, data[i - 1][1] - a);
        data.push([i, random(Min, Max)]);
    }
    return data;
}

const random = (min, max) => {
    if (min >= max) new Error();
    return Math.random() * (max - min) + min;
}
```
【JavaSilver】Java SE8 Silverに合格した勉強法【合格体験記】

##はじめに
入社して半年のエンジニアですが、先日JavaSilverに合格しました。
せっかくなので、勉強方法や合格までの道のりをここに書き残します。
##勉強期間
・勉強開始時期：平成30年7月中旬
・受験日　　　：平成30年8月29日

およそ1ヶ月半の勉強で合格することができました。
##勉強前の自分のスペック
・3ヶ月の開発研修を終えたばかり
・スッキリわかるJava入門と実践編の3章までの内容をある程度理解している状態
・研修中にJavaでプログラムを書いたり、jspでwebアプリを作成した
・配属されたばかりで実務経験は無し
##使用参考書
使用した参考書は以下の2冊です。

・[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応]
(https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Silver-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-808/dp/4844339931)
→いわゆる黒本。JavaSilverの勉強はこの本が中心となります。

・[スッキリわかる Java入門 実践編 第2版](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B-Java%E5%85%A5%E9%96%80-%E5%AE%9F%E8%B7%B5%E7%B7%A8-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4844336770)
→ラムダ式を勉強する際にこの本を使用しました。

##合格の秘訣
####ひたすら黒本を解きまくる
正直これだけで合格できます。

実際のところ、本番の試験では**黒本と同じ内容で値や変数名を変えただけの問題が多く出題される**ので、ひたすら解きまくるのが合格の近道です。

##勉強時間
基本的に通勤電車の中で毎日30分程度勉強しました。
模擬問題を解くときだけ、5日間程度、帰宅後2時間半〜3時間程度時間を確保して勉強しました。

トータルの勉強時間は**30〜40時間程度**です。

##自身の勉強法
私が実際にした勉強法を紹介します。

####1. 黒本の9章までを3周する(勉強開始〜1ヶ月目)
**1周目**
スッキリわかるJava入門や実践編に載っていない細かい内容が意外と出題されるので、苦戦しました。
分野にもよりますが、この時点での正答率は40%程度でした。

**2周目**
覚えるべき内容をきちんと復習せずに２周目に入ったため、正答率は１周目に比べて少し上昇した程度でした。
そこで、この時点で暗記できていない内容に関しては、**黒本の解説にアンダーラインを引き、付箋を貼る事にしました。**
こうする事で、苦手な部分がハッキリと分かり、３周目以降に効率よく復習する事が出来ました。

**3周目**
３周目に入ると正答率は８割程度まで上昇しました。
JavaSilverと言えど細かい知識は多いですが、**黒本を何周も解けばそれらの知識が自然と頭に入ってきます。**
そのため、難しくても粘り強く解き続ける事が重要です。

####2. スッキリわかるJava入門実践編の6章を読みラムダ式を勉強する(黒本と並行して学習)
ラムダ式や関数は黒本の問題と解説だけ見ても分かりづらい為、実践編を読んで勉強することにしました。
ただ、**ラムダ式の基本的な文法を覚えるだけで点数が取れる問題も多い**ので、そこまで深く学習しなくても良いです。
私が実際に試験を受けた時はラムダ式は1問しか出なかったので、最悪捨ててもいいと思います。
####3. 黒本の10章11章（模擬問題）を2周する(試験2週間前〜)
**1周目の得点率**
10章: 得点率65%
11章: 得点率55%

**2周目の得点率**
10章: 得点率85%
11章: 得点率80%

全範囲一通り勉強し、満を持して模擬問題に挑みましたが1周目の結果は散々でした。

正直かなり焦りましたが、これまで通り間違えた問題を復習して、試験までに解ける状態にすれば問題ないです。
模擬試験の内容も本番の試験で多く出題されますので、**模擬試験でも復習が重要です。**

####4. これまで間違えた問題の総復習(試験1週間前〜当日まで)
黒本の問題にはチェックボックスが付いているので、３周目以降から間違えた問題にチェックを入れ、それらの問題を中心に復習しました。
試験の直前には、ほとんど全ての問題で正答できるまでになりました。

##結果
得点率82%で合格。
合格ラインは65%なのでかなり余裕がありました。

##JavaGoldの合格体験記はこちら
[新卒１年目でJavaGold合格できたので勉強法について語っていく](https://qiita.com/ebichan_88/items/a2b526c3e206ed573ec4)
djangoのmodelのバリデーションを実行する

Django便利ですよねー
django-adminを使うと簡単にcrudを作れるんです:relaxed:
バリデーションもModel側で設定しておけば、その通りに自動でチェックしてくれますしね。

ただ、DjangoでAPIサーバを作るぞーとなった時に、バリデーションロジックをどうやって任意のタイミングで実行するんだろうと。備忘録も兼ねて対応策を:yum:

# バリデーションの任意実行！

```validation.py
try:
    model.title = "hoge"
    model.piyo = "piyopiyo"
    # 他にも色々...

    model.full_clean()

    model.save()

except ValidationError:
    # エラー処理だ！
```

簡単すぎて特に書くことがない:frowning2:
F2FSの更新履歴を追ってみた

Kernel3.8で採用されたF2FSの更新履歴を
Kernelのドキュメントにあることから注目すべきだと思ったものを書いてみる

推奨バージョンは性能からは4.8、TRIMの視点からすると4.9、4.15でしょうか。

## 3.11 f2fs: support xattr security labels
f2fsのセキュリティラベルのサポートを追加します
AppArmor, SELinuxに対応
### 3.13 F2FS Introduce CONFIG_F2FS_CHECK_FS to disable BUG_ONs which check the file system consistency in runtime and cost performance
この設定は、潜在的にパフォーマンスを低下させる非常に多くのBUG_ONを削除するオプションをサポートします。
F2FS_CHECK_FS


# 3.14 Improve write performance under frequent fsync calls commit
頻繁なfsync呼び出しのコミット時の書き込みパフォーマンスの向上


### 3.15introduce large directory support
大きなディレクトリサポートを導入する


### 3.18 support atomic writes
一貫性のある書き込みサポートのために非常に限定された機能を導入します

## 3.18 support large sector size
ブロックサイズが512バイトだったのを4096まで拡張

### 3.19 Add "dirsync" to allow sync operation on directory operations
マウントオプションにディレクトリに対してcheckpointを呼び出すdirsyncを追加

# 4.0 Introduce a batched trim
分割trimのためのバッチによるトリミング機能
fstrimが0からデバイスの終わりまでの範囲でトリガされた場合、
すべてのチェックポイント関連のミューテックスが発生し、非常に長い待ち時間が発生するため

## 4.1 Add an optional rb-tree based extent cache
多くのマッピング情報をキャッシュできるextent_cacheオプションの追加

## 4.2 Support encryption of f2fs files and directories
ファイルとディレクトリの暗号化サポート

### 4.2 Recovers a broken superblock with the other valid one
破損したスーパーブロックを他の有効なスーパーブロックで回復します。

## 4.3 Enhance multithread performance
マルチスレッドのパフォーマンスを改良

## 4.8 Add lazytime mount option
lazytime対応に

# 4.8 Add nodiscard mount option
nodiscard対応に。TRIMが自動実行されなくなる

### 4.8 Introduce mode=lfs mount option
このマウントオプションは、オリジナルのログ構造ファイルシステムを強制的に有効にするためのオプションです。
したがって、メイン領域のランダム書き込みは行われません。

## 4.8 Enable flush_merge option by default (can be disabled with noflush_merge option)
デバイスがcache_flushコマンドを早く処理出来ない場合に処理をまとめるflush_mergeがデフォルトONに

#4.9 Support async discard
ほとんどのファイルシステムはdiscardを同期処理するためfstrimコマンドでパフォーマンスが低下する
discardの非同期をサポート

### 4.10 support multiple devices
F2FSでデバイスをまとめてフォーマットして1つの大きいF2FSとして表示

## 4.11 コードから調査分
オプションでio_bitsが追加された

## 4.11 Support IO alignment for DATA and NODE writes
DATAとNODEのダミーブロックを埋めることでIOアライメントをサポートし
MLCまたはTLCの部分的に書き込まれたページを閉じる

## 4.12 enable small discard by default
TRIMがリアルタイムで行われる場合に有効な4K単位のTRIMを有効に

### 4.12 write small sized IO to hot log
(アーカイブログの一部である)ホットログで小さいサイズもサポート

# 4.14 f2fs: support inode checksum
f2fsのinodeにチェックサムをサポート

### 4.14 Enhance on-disk inode structure scalability
inodeのオンディスク構造を拡張

# 4.15 Support issuing/waiting discard in range
fstrimはTRIMを以前にもマークされた全部に対して行うため、
追跡のためfstrim_listを追加し無駄なTRIMを発行しないようにする
RHEL7 のレスキューモードで日本語キーボード (jp106) を使用する方法

RHEL ではレスキューモード起動時にキーボードが US となっている。
RHEL7 では以下のコマンドで日本語キーボード (jp106) に設定可能。

```shell-session
$ localectl set-keymap jp106
```
以下のコマンドで設定を確認可能。

```shell-session
$ localectl
```
ES Module(importとかexportとか)をCommonJS(requireとかmodule.exportsとか)へbabel(transpile)しながらwebpack(bundle)する


```bash:setup
$ npm init -y && touch webpack.config.js
$ npm i -D babel-loader @babel/core @babel/preset-env @babel/preset-react webpack webpack-cli
$ npm i -S react react-dom
```

```javascript:webpack.config.js
const path = require('path')

module.exports = {
  mode: process.env.NODE_ENV || "development",
  entry: path.resolve(__dirname, "src", "entry.jsx"),
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js"
  },
  module: {
    rules: [
      {
        test: /\.jsx$/,
        exclude: /node_modules/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: ["@babel/preset-env", "@babel/preset-react"]
            }
          }
        ]
      }
    ]
  },
  resolve: {
    extensions: [".js", ".jsx"]
  }
};
```

```bash:run
$ ./node_modules/.bin/webpack
Hash: 0e468e72b73aba9ca423
Version: webpack 4.29.0
Time: 2758ms
Built at: 2019-01-27 23:16:49
    Asset     Size  Chunks             Chunk Names
bundle.js  860 KiB    main  [emitted]  main
Entrypoint main = bundle.js
[./node_modules/webpack/buildin/global.js] (webpack)/buildin/gl
obal.js 472 bytes {main} [built]
[./src/entry.jsx] 2.65 KiB {main} [built]
    + 11 hidden modules
```
スキャンした両開きの雑誌を1ページごとに分割する

文書はPCで閲覧・管理をしたいが，
最新版の日本ロボット学会誌などのように紙媒体でしか取得できないものもあるので，スキャンしてPCで見ることがよくある．

そのとき2ページ分が1つとなった両開きのスキャンとなるので，分割する必要がある．

`pdfcrop`と`pdftk`で解決したのでメモ．

`input.pdf`をスキャンしたばかりの数ページが1つにまとまったpdfとする．

# TL;DR

まず最初に最終スクリプトにすると

```bash
#!/bin/bash -x

# parameter
INPUT_FILE=$1
OUTPUT_FILE=${2:-"output.pdf"}
TMP_DIR=`mktemp -d`
OUT_DIR=`mktemp -d`
bp_per_pts=0.99628

if [ ! $INPUT_FILE ]
then
    echo "You need to set an input pdf file"
    exit
fi

# STEP 1
pdftk $INPUT_FILE burst output $TMP_DIR/file_%04d.pdf

# STEP 2
ls $TMP_DIR/
width_pts=`pdfinfo $TMP_DIR/file_0001.pdf | grep "Page size" | cut -d " " -f 8`
width_bp=`echo "$width_pts * $bp_per_pts" | bc`
half_width_bp=`echo "$width_bp / 2" | bc`

# STEP 3
for i in $TMP_DIR/*.pdf
do
    pdfcrop --margins "0 0 -$half_width_bp 0" $i "$OUT_DIR/`basename $i`_1.pdf" &
    pdfcrop --margins "-$half_width_bp 0 0 0" $i "$OUT_DIR/`basename $i`_2.pdf" &
done
wait

# STEP 4
pdftk $OUT_DIR/*.pdf cat output $OUTPUT_FILE
```

# STEP 1: 複数ページを1つのPDFへとばらばらにする
```bash
mkdir /tmp/build
pdftk input.pdf burst output /tmp/build/file_%02d.pdf
```

# STEP 2: サイズを確かめる
```bash
pdfinfo /tmp/build/file_01.pdf | grep "Page size"
```
これはptsという単位で表現される．
大抵はA4（297mm x 210mm）なので，838.32pts x 590.16ptsと返ってくる．

# STEP 3: 両開きの各PDFを1ページことに分割する
`pdfcrop`を使うが単位がbpであり，
例えば838.32pts x 590.16ptsのA4の例だとすると，
419pts x 590.16ptsにすれば良い．

https://tex.stackexchange.com/questions/8260/what-are-the-various-units-ex-em-in-pt-bp-dd-pc-expressed-in-mm

より，1pts = 0.99628bpなので，

419pts = 418bpなので，例えば

```bash
mkdir /tmp/output
cd /tmp/output
pdfcrop --margins "0 0 -418 0" /tmp/build/file_01.pdf file_01_page_01.pdf
pdfcrop --margins "-418 0 0 0" /tmp/build/file_01.pdf file_01_page_02.pdf
```

とすれば良い．

# STEP 4: 1ファイルにまとめる

```bash
pdftk /tmp/output/*.pdf cat output /tmp/output.pdf
```
Can't connect to docker daemon.

dockerのバージョンを上げたら以下のようなmessageがでるようになって、それを解決できたので覚え書きです。

```
 Can't connect to docker daemon.
```

以下のように環境変数を設定すると治りました

```
docker-machine start 
docker-machine env
eval "$(docker-machine env default)"
```
centos7.5にphp7.2をansibleで入れた時のメモ


```yaml:roles/php-fpm/tasks/main.yml
## - include: roles/php-fpm/tasks/check_install.yml
- include: roles/php-fpm/tasks/install.yml
# - include: roles/php-fpm/tasks/configure.yml
```

以下の構成だと、php-gdとphp-zipがインストールできなかった。



```yaml:roles/php-fpm/tasks/install.yml
- name: install / Import repository
  yum_repository:
    name: php72
    description: "php repo"
    baseurl: http://rpms.remirepo.net/enterprise/$releasever/php72/$basearch/
    mirrorlist: http://cdn.remirepo.net/enterprise/$releasever/php72/mirror
    enabled: 1
    gpgcheck: 1
    gpgkey: http://rpms.remirepo.net/RPM-GPG-KEY-remi
    file: php72
- name: install / install required package
  yum:
    name: "{{ item }}"
    state: present
    enablerepo: php72
  with_items: "{{ php_packages }}"
```

```yaml:roles/php-fpm/vars/mai.yml
---
php_packages:
  - php
  - php-common
  - php-fpm
  - php-mbstring
  - php-mysql
  - php-enchant
  - php-process
  - php-xml
  - php-mysqlnd
  - php-pdo
  - php-gd
  - php-zip
```

install.ymlを以下の構成にしたところ、php-gdもインストールすることができた。

```yaml:roles/php-fpm/tasks/install.yml
---
# 1. Remi リポジトリの登録
- name: install / Import repository
  yum_repository:
    name: php72
    description: "php repo"
    baseurl: http://rpms.remirepo.net/enterprise/$releasever/php72/$basearch/
    mirrorlist: http://cdn.remirepo.net/enterprise/$releasever/php72/mirror
    enabled: 1
    gpgcheck: 1
    gpgkey: http://rpms.remirepo.net/RPM-GPG-KEY-remi
    file: php72
- name: install / Import repository remi
  yum_repository:
    name: remi
    description: "remi"
    baseurl: http://rpms.famillecollet.com/enterprise/7/remi/$basearch/
    enabled: 1
    gpgcheck: 1
    gpgkey: http://rpms.remirepo.net/RPM-GPG-KEY-remi
    file: remi7


## 2. php-fpm install
- name: install / install required package
  yum:
    name: "{{ item }}"
    state: present
    enablerepo: php72
  with_items: "{{ php_packages }}"
```

## 参考

[CentOS6のPHP7.0/7.1をPHP7.2にアップデート][*1]
[remi.repo][*2]

[*1]:https://www.riscascape.net/archives/16990
[*2]:http://rpms.famillecollet.com/enterprise/remi.repo
WordPressサーバ移行手順

## WordPressバージョン
Column変更とかあるかもしれないのでバージョンも記載
Version:4.9.5

## 手順
仕事で移行する事があったのでメモ
1,2についてはあまりハマらないと思うので省略します。

1. Git管理しているファイル一式を新サーバでPull
  + Git管理ベストプラクティスについては[こちら](https://github.com/github/gitignore/blob/master/WordPress.gitignore)
1. wp-config.phpの設定
1. DBを移行する
1. 移行後にDBの値を書き換える
1. uploadsを移行する

## DBの移行
既存のDBをdumpする

```
$ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME
```

移行先でDBを作成する
※文字コードは移行前に合わせた方がよいかも

```
$ mysql -u USER_NAME -p HOST_NAME

> CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
```

移行先でimportする

```
$ mysql -u USER_NAME -p DB_NAME < IMPORT_FILE_NAME
```

## DBの値を書き換え
ドメイン情報をDBに保持しているため書き換える必要がある
※DB情報はwp-config.phpに書いてあるためそこを参照すること

```sql
-- 事故防止
START TRANSACTION;

UPDATE wp_options SET option_value=REPLACE(option_value, "移行前ドメイン", "移行後ドメイン") WHERE option_name IN ('siteurl', 'home');
UPDATE wp_posts SET guid=REPLACE(guid, "移行前ドメイン名", "移行後ドメイン名");

-- SELECTして大丈夫なら
COMMIT;
-- SELECTして失敗してたら
ROLLBACK;
```

## ファイルの移動
移行前圧縮

```
$ tar -zcvf uploads.tar.gz uploads
```
ファイル移動

```
$ scp ./uploads.tar.gz user_name@host_name:~/
```
移行後解凍

```
$ tar -zxvf uploads.tar.gz
```

あとはmvして終わり
ES Module(importとかexportとか)をCommonJS(requireとかmodule.exportsとか)へbabel(transpile)するだけのやつ


```bash:たまに使いたくなったりならなかったりするので残しておく
$ yarn init --yes
$ yarn add -D babel-cli babel-plugin-transform-es2015-modules-commonjs
$ ./node_modules/.bin/babel --plugins transform-es2015-modules-commonjs {input.js} > {output.js}
```
GitHubのリポジトリを一覧化する（public/private両対応）

# 目的・概要

リポジトリがたくさんある組織・ユーザーで、リポジトリの一覧を作るためにリポジトリ名だけの出力をしたいときに使える方法です。

ぐぐってみるとワンライナーなどが結構引っかかりますが、publicのみだったり100件以内を前提としていたりしました。本記事では、手順ふたつに分かれてしまいますが、以下の場合でも対応できます。

- リポジトリの数が100以上存在する
- privateリポジトリを含む

リポジトリをリストアップしたい動機はそんなに定期的にあるものではないので、事前準備少なく実行できる手順としています。

# 手順

1. [GitHub APIからリポジトリ情報一式を取得](#1. GitHub APIからリポジトリ情報一式を取得)
2. [レスポンスデータの整形・抽出](#2. レスポンスデータの整形・抽出)

# 1. GitHub APIからリポジトリ情報一式を取得

[username]には、GitHubのアカウント名を入れてください。そうすれば、取得前にパスワード入力を求められ、その後Privateリポジトリも含め情報を取得できます。

以下では組織（Organization）単位で書いていますが、ユーザーに紐づくリポジトリ一覧を取得したいときは、`orgs/[organizationname]`を`users/[username]`としてください。これらの`[organiationname]`や`[username]`は実際に取得する対象の名前に置き換えてください。

```
$ curl -u [username] "https://api.github.com/orgs/[organizationname]/repos?per_page=100&page=1" > repos1
```

保存するファイル名はrepos1としています。なんでもいいのですが、手順2で整形・抽出するときにファイル名を指定しやすいようにしてもらえればOKです。

私が抽出した対象のリポジトリは100以上ありましたので、一度実行したあと、URL内の`page=1`を`page=2`にし、ファイル名をrepos2にしてもう一度実行します。

# 2. レスポンスデータの整形・抽出

*（2019/5/10追記）*
*コメントにて、`jq`を利用した方がスクリプトを書かなくてよい分楽だということを教えていただきましたので、本章を書き直します。*

*コメントではパイプを使ってワンライナー化する方法で書かれていますが、GitHub APIの仕様上、一度に取得できるリポジトリ数が100なので、`repos1`, `repos2`を保存済みの状態という前提で以下記載します。*


レスポンスデータ（JSON）を整形・抽出するには、`jq`コマンドを使うとお手軽です。

以下では、リポジトリ名のみを抽出して列挙する例です。

```shell
cat repos1 repos2 | jq -r .[].name
```

# 参考リンク

- https://developer.github.com/v3/guides/getting-started/
- https://developer.github.com/v3/#summary-representations
Visual Studio for Macがアップデートできなかったお話

# 発端

<img width="657" alt="スクリーンショット 2018-09-26 21.42.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/147093/ebd70792-68b1-5bc4-6789-b1ef93c60889.png">

ある日、いつものようにアップデートしようと思ったらできませんでした。
出る文言は「更新プログラムのインストーラーを起動できませんでした。」のみ。
思い当たることも特にないので、調べていきます。

# ログ

まずはVisual Studio for Macのログを確認しましょう。
[ヘルプ] > [ログディレクトリを開く]から確認できます。
<img width="333" alt="reupload.png" src="https://qiita-image-store.s3.amazonaws.com/0/147093/a8f402d4-be3b-507c-df09-ffe1ba060616.png">

その中で更新日が最新のものをあさっていくとそれらしいログを発見。

```
ERROR [2018-09-26 21:42:22Z]: Error fetching token: Microsoft.IdentityService.Clients.ActiveDirectory.AdalSilentTokenAcquisitionException - Failed to refresh access token
ERROR [2018-09-26 21:42:22Z]: Error fetching token: Microsoft.IdentityService.Clients.ActiveDirectory.AdalSilentTokenAcquisitionException - Failed to refresh access token
ERROR [2018-09-26 21:42:22Z]: Error fetching token: Microsoft.IdentityService.Clients.ActiveDirectory.AdalSilentTokenAcquisitionException - Failed to refresh access token
ERROR [2018-09-26 21:42:22Z]: Error fetching token: Microsoft.IdentityService.Clients.ActiveDirectory.AdalSilentTokenAcquisitionException - Failed to refresh access token
INFO [2018-09-26 21:42:36Z]: Starting update installer
ERROR [2018-09-26 21:42:37Z]: Failed to start update installer
System.Exception: Updater is missing
  at Xamarin.Ide.Mac.Updater.StartUpdatesInstaller (MonoDevelop.Core.FilePath installerDataFile, MonoDevelop.Core.FilePath updatedInstallerPath) [0x00191] in /Users/vsts/agent/2.140.0/work/1/s/md-addins/Xamarin.Ide/Xamarin.Ide.Mac/Updater.cs:67 
  at Xamarin.Ide.Updater.UpdateService+<InstallDownloads>d__42.MoveNext () [0x00278] in /Users/vsts/agent/2.140.0/work/1/s/md-addins/Xamarin.Ide/Xamarin.Ide/Xamarin.Ide.Updater/UpdateService.cs:303 
ERROR [2018-09-26 21:42:37Z]: 更新プログラムのインストーラーを起動できませんでした。
```

Error fetching token？？
ActiveDirectory？？
認証周りなのでしょうか。

```
ERROR [2018-09-26 21:42:37Z]: Failed to start update installer
System.Exception: Updater is missing
```

とあるように、updaterがないのが原因なのでしょうか。
エラーメッセージで検索かけてみます。

# 解決

https://developercommunity.visualstudio.com/content/problem/322596/visual-studio-no-longer-updates.html

Visual Studio Developer Communityでドンピシャな記事を見つけました。
読んでみたところ、どうやら以下のようなことが書かれています。

- 使用しているアップデーターが古い
- 昔のバージョンではバグがある
- アップデーターをバックアップして再度アップデートかけてみてほしい

アップデーターを一時退避させ、アップデートしてみると無事成功！
アップデーターは以下にあるようです。`mv`コマンドで適当に移動させました。

`~/Library/Application\ Support/VisualStudio/7.0/LocalInstall/Installer/`

原因としては、何かしらのタイミングでアップデーターが更新されずに残ってしまったという感じでした。
同じような現象に悩まされている方の助けになればと思います。
Vagrant(Ubuntu18.04)上にDocker構築

## はじめに
VagrantでDockerを構築するのが流行ってるらしい。
調べましたが、理由はよくわかりませんでした。

一つわかることは、MacやWindows上でDockerを構築したところで
結局仮想環境のLinux上でしか動いていないので
Vagrant上のDockerと変わらないということですね。

## Vagrantのインストール
VirtulBoxとVagrantのインストールは、終わらせておいてください。
公式は、こちらです。
[VirtulBox](https://www.oracle.com/technetwork/jp/server-storage/virtualbox/overview/index.html)
[Vagrant](https://www.vagrantup.com)

### Vagrantのディレクトリ作成
`$ mkdir -p ~/Vagrant/ubuntu`
`$ cd ~/Vagrant/ubuntu`

### Vagrant公式からBoxダウンロード
[Vagrant Cloud](https://app.vagrantup.com/boxes/search)
`official ubuntu 18.04`で検索したら発見したのでそれをインストール
[Vagrant Ubuntu18.04](https://app.vagrantup.com/ubuntu/boxes/bionic64)
`$ vagrant init ubuntu/bionic64`
`$ vagrant up`

### sshで接続
`$ vagrant ssh`

### vagrantのバージョンの確認
```
vagrant@vagrant:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
```

## Docker install
LinuxのDockerインストールコマンドは、以下です。
`vagrant@vagrant:~$ curl -fsSL https://get.docker.com/ | sh`

### Dockerのバージョンの確認
```
vagrant@vagrant:~$ docker --version
Docker version 18.06.1-ce, build e68fc7a
```

```
vagrant@vagrant:~$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:51 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/version: dial unix /var/run/docker.sock: connect: permission denied
```

### Hello World
```
vagrant@vagrant:~$ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

## 終わり
割とシンプルにインストールできちゃいます。
VagrantでDockerの環境構築流行っているそうなのでやってみました。
WordPressの`KUSANAGI`をDockerで動かせるらしいのでまたやってみたいと思います。

仮想環境ぶっ壊しまくりましょう！！
monit: error connecting to the monit daemon

monitをインストールして`monit status`をしたところ以下のようなエラーがでました。

```
monit: error connecting to the monit daemon
```


#/etc/monit/monitrc
```
 set httpd port 2812
    use address localhost  # only accept connection from localhost
    allow localhost        # allow localhost to connect to the server and
    allow admin:monit
```
上記のようにmonitrcのコメントアウトを外すことで解決しました。
詳しくは下記のURLを参照してください
`http://dasunhegoda.com/what-why-how-monit/756/`
ExcelVBAのエディタで入力した文字が小さくて見づらいときの対処法

# フォントサイズを大きくしてみよう。

ExcelVBAは数年は使っているけど、フォントサイズを変更できるオプションに今まで気付かなかった。
知る機会があったので記録として残しておく。

## 方法

[ツール]->[オプション]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/41bafc4b-db79-13f0-abf7-f46232426f95.png)

[エディタの設定]->[サイズ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/00dedcf2-1435-4f5b-0b2b-fe147bf0ffe3.png)

***反映結果は下記の通り↓***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/60c1f92a-7109-6b2a-ccc7-80b30e2e689d.png)

めちゃ、見やすくないですか？
binding.pryでデバッグする方法

本日先輩から教わった、binding.pryのデバッグのやり方についてまとめます。

下準備
-

```
$ gem install pry-byebug
```
gemをインストールして、準備完了です。

binding.pryの使い方
- 

- コードの処理がどこまでうまく動いてくれているか
- 特定のポイントで処理がどうなっているのか

コードの処理を止めて確認したい箇所に”binding.pry"と打つことで調べることができます。

```ruby.qiita.rb
def index 
 member = params[:member]

 if member >= 5
  puts "5人より多い"
 else member <= 3
  puts "3人より少ない"
 end
end
```
このようなコードがあった場合、例えば

```ruby.qiita.rb
def index 
 member = params[:member]
binding.pry
 if member >= 5
  puts "5人より多い"
 else member <= 3
  puts "3人より少ない"
 end
end
```
このように確認したい変数の直後に打ちます。


binding.pryでできること
-
binding.pryを追加した後、該当するコードをサービス側で動かしてみます。
すると、binding.pryを追加した箇所で処理が止まります。
そこで、サーバーを立てているターミナルを確認すると以下のような画面で処理の詳細・途中経過を確認することができます。

```
#ターミナル
   1:def index 
   2: member = params[:member]
   3: binding.pry

=> 4: if member >= 5
   5:  puts "5人より多い"
   6: else member <= 3
   7:  puts "3人より少ない"
   8: end
   9:end

[1] pry(#<該当するファイル名>)> member
=> 5
```
このpry〜から始まる画面で状態を知りたい変数名を入れることで、
その処理のタイミングでは対象の変数がどんな状態になっているか確認することができます。
また、計算式を入れて確認することもできます。

```

[1] pry(#<該当するファイル名>)> member - 5
=> 0

```
また、計算式を入れて変数の状態を確認することもできます。


少し調べてみて、まだまだ使い方の奥が深いと感じていますので引き続き勉強していきます。
今日はこのあたりで、失礼します。

参考サイト
-

〜変数の中身を確認〜　binding.pryでデバッグする（初心者の方向け）
https://qiita.com/tomoharutsutsumi/items/6b12af3dc5eb8dfb9801
Chrome, Firefox で開いているページのタイトルと URL をコピーする

# 例

```
Qiita
https://qiita.com/
```

こんな感じにタイトルと URL をコピーしたい。

# Google Chrome

Create Link - Chrome ウェブストア
https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm

html, markdown, mediawiki 形式にも対応している

# Firefox

TitleUrlCopy – Firefox 向けアドオン
https://addons.mozilla.org/ja/firefox/addon/titleurlcopy/

シンプルに画面を開いていない時に Cmd + C でタイトルと URL をコピーできる

# 所感
文章書く時に便利。
プロセス監視ツール monit の再アラート

https://stackoverflow.com/questions/19040510/how-to-re-alert-monit
いままで、monitで再アラートをするとき↓のようにかいていました。

```
check program check_something with path "/root/scripts/check_something.sh"
  if status > 10 then alert
  if status > 10 with timeout 86400 seconds then alert
```
リファレンス読んだらreminderと記述できることが分かったので、すっきりしているのでこちらを使うことにしました

```
number_cyle_per_day = 24*60*60/n

check program check_something with path "/root/scripts/check_something.sh"
  if status > 10 then alert reminder on number_cyle_per_day cycles
```
Juliaのusingとimportについて〜いつ省略できるのか

Julia 1.0における、usingとimportの違いについてまとめてみた。
https://docs.julialang.org/en/v1.0/manual/modules/
を参考にした。


# テストモジュール
まず、テストモジュールとして、

```julia:test.jl
module Mymodule1 #エクスポートするfunctionはなし
    function test()
        println("Mymodule1: test")
    end
    function test2()
        println("Mymodule1: test2")
    end
end

module Mymodule2
    export test #test()だけをexportしておく
    function test()
        println("Mymodule2: test")
    end
    function test2()
        println("Mymodule2: test2")
    end
end
```
の二つを用意する。
# using
まず、usingを試してみる。

```julia:test.jl
using .Mymodule1
```
をやってみる。.Mymodule1の先頭のドット.は自前のモジュールの場所を表す。

```julia:test.jl
using .Mymodule1
test()
```
はtestがないと怒られる。

```julia:test.jl
using .Mymodule1
Mymodule1.test()
```
は表示される。したがって、usingを使うときには、モジュール名.が必要そうだ。
一方、

```julia:test.jl
using .Mymodule2
test()
```
は動く。これは、Mymodule2において、exportがつけられているからである。もちろん、

```julia:test.jl
using .Mymodule2
test2()
```
は怒られる。なぜなら、test2はexportされていないからである。
また、

```julia:test.jl
using .Mymodule2: test2
test2()
```
であれば、test2を呼ぶことができる。これは、:を使ったことにより、exportを書いたことと同等の効果が得られたと考えられる。

よって、省略して呼べるのは、
- exportに書いたfunction
- using モジュール名:function名　と書いたfunction

ということがわかる。

# import
次はimportについて。

```julia:test.jl
import .Mymodule1
test()
```
は怒られる。

```julia:test.jl
import .Mymodule1
Mymodule1.test()
```
としなければならない。

他には、

```julia:test.jl
import .Mymodule1.test,.Mymodule1.test2
test()
test2()
```
があるが、この場合はMymodule1を省略して呼べる。

```julia:test.jl
import .Mymodule1:test,test2
test()
test2()
```
でも、Mymodule1を省略して呼べる。
では、Mymodule2についてはどうだろうか？

```julia:test.jl
import .Mymodule2
test()
```
は怒られる。exportに書いてあっても関係がないようだ。

```julia:test.jl
import .Mymodule2.test2
test2()
```
は呼べる。

よって、省略して呼べるのは、
- import モジュール名.function名
- import モジュール名:function名
の二つである。

#usingとimportの違い
usingを使うと、exportに入っているものはすべてモジュール名なしで（省略して）呼ぶことができる。しかし、たくさんexportにfunctionがある場合、using モジュール名を使うと、使う予定のないものまで省略して呼べてしまうので、面倒なことになることもある。
一方、importの場合、exportの有無の関係なしに、デフォルトではモジュール名をつけなければならない。しかし、import モジュール名.function名あるいは import モジュール名:function名とすれば、そのfunctionだけモジュール名を省略して呼ぶことができる。汎用的なライブラリを呼ぶときは、importで必要なものだけ呼べば、不必要に名前を使われることはない。
VagrantのBox管理系コマンドを実行してみた。

***注意：勝手にBox管理系コマンドと言っております***

VagrantのBoxファイルに関するコマンド群を今回実行してみました。
box addとかは基本的に使うコマンドとしてここには載せていません。

# Boxファイル管理系コマンド
## vagrant box outdated
使用しているboxファイルが古くなっているか(新しいバージョンのboxファイルが出ているか)を確認します。
CentOS7のboxファイルで1803.1を使っていましたが、1804.1がリリースされているのでboxファイルが古いことを教えてくれます。

```sh

$ vagrant box outdated
Checking if box 'centos/7' is up to date...
A newer version of the box 'centos/7' for provider 'virtualbox' is
available! You currently have version '1803.01'. The latest is version
'1804.02'. Run `vagrant box update` to update.
```

## vagrant box prune
インストールされたboxファイルの古いバージョンを削除します。
削除する際に、確認メッセージが出力されます。

```sh

$ vagrant box prune
The following boxes will be kept...
centos/7            (virtualbox, 1804.02)
onozaty/redmine-3.4 (virtualbox, 1.2.0)

Checking for older boxes...
Box 'centos/7' (v1803.01) with provider 'virtualbox' appears
to still be in use by at least one Vagrant environment. Removing
the box could corrupt the environment. We recommend destroying
these environments first:

default (ID: 4483bf8c56fa4cd2b1e1452cb7d2bd3e)
default (ID: 37a038aee80348c7ab80bbdc8d7728da)
default (ID: b53102aa723d4e88867d5b04720803cd)

Are you sure you want to remove this box? [y/N] y
Removing box 'centos/7' (v1803.01) with provider 'virtualbox'...
```

本当に削除されているのか vagrant box listで確認。
ちゃんと削除されていました。

```sh

$ vagrant box list
centos/7            (virtualbox, 1804.02)
onozaty/redmine-3.4 (virtualbox, 1.2.0)
```

## vagrant box repackage
指定したboxファイルを再パッケージ化し、それを再配布できるようにカレントディレクトリに配置します。boxファイルが削除されていた場合に実行するとカレントディレクトリにboxファイルが再作成されるとかで、よく使い方が理解出来てません。
[boxファイルを再配布](https://qiita.com/8845musign/items/508ca8ede16546e70475)

```sh

$ vagrant box repackage centos/7 virtualbox 1804.02
$ ls
Vagrantfile package.box
```
## vagrant box update
現在、使用しているboxファイルより新しいバージョンのboxファイルがある場合に、boxファイルを更新します。

```sh

 vagrant box update
==> default: Checking for updates to 'centos/7'
    default: Latest installed version: 1803.01
    default: Version constraints: 
    default: Provider: virtualbox
==> default: Updating 'centos/7' with provider 'virtualbox' from version
==> default: '1803.01' to '1804.02'...
==> default: Loading metadata for box 'https://vagrantcloud.com/centos/7'
==> default: Adding box 'centos/7' (v1804.02) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1804.02/providers/virtualbox.box
==> default: Box download is resuming from prior download progress
    default: Download redirected to host: cloud.centos.org
==> default: Successfully added box 'centos/7' (v1804.02) for 'virtualbox'!
```
Android のホーム画面で「カレンダー」と「時計」アプリのアイコンが動的に変化していたので軽く調べてみた件

# iPhone のホーム画面

Apple 製の「[カレンダー](https://itunes.apple.com/jp/app/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC/id1108185179?mt=8)」と「時計」アプリのアイコンは現在の日時を表しています。

| :bamboo: | :tanabata_tree: |
|:------:|:-------:|
|![IMG_0181.PNG](https://qiita-image-store.s3.amazonaws.com/0/6881/ddaaa9a6-b0da-2ab5-38ec-c0660ca71338.png)|![IMG_0180.PNG](https://qiita-image-store.s3.amazonaws.com/0/6881/78de8b0a-adf4-e1ea-15c4-417b51601fd0.png)|

# Android のホーム画面

ホームアプリを [Pixel Launcher](https://play.google.com/store/apps/details?id=com.google.android.apps.nexuslauncher) にすると Google 謹製の「[カレンダー](https://play.google.com/store/apps/details?id=com.google.android.calendar)」と「[時計](https://play.google.com/store/apps/details?id=com.google.android.deskclock)」アプリのアイコンが時間経過に伴い変化するようになります。

| :jack_o_lantern: | :christmas_tree: |
|:------:|:-------:|
|![Screenshot_1537907734.png](https://qiita-image-store.s3.amazonaws.com/0/6881/23de55f2-9f7e-10c3-3624-5640f5980af4.png)|![Screenshot_1537907568.png](https://qiita-image-store.s3.amazonaws.com/0/6881/c9557c39-ae43-2d39-3bc5-a175697efe27.png)|

# リバースエンジニアリングで APK の中身を覗き見る :mag:

- 難読されていたので解析はハードモード
- [GitHub](https://github.com/) に丸々アップロードされている [Pixel Launcher](https://play.google.com/store/apps/details?id=com.google.android.apps.nexuslauncher) を decompile したとされるソースコードには、Google 謹製 [:calendar:](https://play.google.com/store/apps/details?id=com.google.android.calendar) アプリのパッケージ `com.google.android.calendar` と [:alarm_clock:](https://play.google.com/store/apps/details?id=com.google.android.deskclock) アプリのパッケージ `com.google.android.deskclock` の文字列が含まれていました
  - [:calendar:](https://play.google.com/store/apps/details?id=com.google.android.calendar) と [:alarm_clock:](https://play.google.com/store/apps/details?id=com.google.android.deskclock) パッケージの場合にアイコンの [Drawable](https://developer.android.com/reference/android/graphics/drawable/Drawable) を生成する専用の処理が見受けられました

## [:alarm_clock:](https://play.google.com/store/apps/details?id=com.google.android.deskclock) アプリの中

- [Android Studio](https://developer.android.com/studio/) で **[Build]** > **[Analyze APK...]** を試みる
 - 秒針・分針・時針の PNG リソースが格納されていました
 - `AndroidManifest.xml` 内に [Pixel Launcher](https://play.google.com/store/apps/details?id=com.google.android.apps.nexuslauncher) のパッケージ名 `com.google.android.apps.nexuslauncher` を値に含む `meta-data` タグが存在していました
     - ゴリゴリに癒着しています

# 結論

- ホームアプリまで作成すればアイコンを変化させることができそうです
 - You can (not) dynamically change the Android app icons.

# 参考

- https://blog.farnasirim.ir/2018/08/dynamically-changing-android-app-icons.html
[備忘録]高DPI環境での WSL+VcXsrv の設定

高DPI環境で WSL で動くプログラムがぼやけるときの対処法。

## WSL側
`.bashrc`に以下を追記

```shell
export DISPLAY=localhost:0.0
export GDK_SCALE=2
```

`.bashrc`が読み込まれないときは
`.bash_profile`をこんな感じに

```shell
if [[ -f ~/.bashrc ]] ; then
    . ~/.bashrc
fi
```

## Windows側
`VcXsrv.exe`(おそらく `C:\Program Files\VcXsrv\` あたりにある) の`プロパティ`から
`高DPI設定の変更` → `高いDPIスケールの動作を上書きします。` のチェックを入れる

これできれいになるはず。