OmniAICreator/Qiita-1.07M huggingface dataset:
WSLとMacで動くdotfilesを作った話

## WSL?
Windows Subsystem for Linuxの略です。
一言でいうと、「Windows 10上で動作するLinuxサブシステム」となります。
今回は、このWSLとMacで動作するdotfilesを作成しました。

## 作ったdotfiles
[shuntaka9576/dotfiles](https://github.com/shuntaka9576/dotfiles)
※ 環境を大きく変えるため利用する際には注意してください！

## 動作環境
* Ubuntu 18.04 LTS(ストアアプリ)
* macOS Mojave(10.14.3)

## dotfilesの構成
* neovim
* fish
* tmux
* 上記の環境を構築ための、shellスクリプト

## Install方法
curlで雑に環境構築できます。よく見る方式ですね。

```shell
curl -L raw.github.com/shuntaka9576/dotfiles/master/init/install.sh| bash
```

## WSLで動いてる感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159755/c27ba5df-11fe-9fa6-a599-e5e345c13170.png)  (画像の警告はALEによるものです。)

ターミナルには[wsl-terminal](https://github.com/goreliu/wsl-terminal)を利用しています。
フォントや透明度は、設定から変更することが可能です。(透過いい...)
初めはCmderを使っていましたが、neovimを縦分割したときの表示崩れが酷くて辞めました。
PythonやGolangのLSPであるpylsやgoplsも問題なく動作しました。

## 勉強になったこと
### Linux-brew
[Linux-brew](http://linuxbrew.sh/)を利用して、MacとWSLの環境構築部分をほとんど共通化したところです。
もちろんPATHの問題はでるため、そこは`.bashrc`や`config.fish`で差を吸収しています。
CeontOSやAmazonLinux2に対応させる場合も、`Linux-brew`を利用すればかなり環境構築が楽になりそうですね。。(yumは本当に色々ないので、、)

### WSL判定
[[shell] WSL かどうかを判別する](https://mmktomato.github.io/2018/03/21/detect-wsl.html)を参考にしました。
リンク先の一例である`/proc/sys/fs/binfmt_misc/WSLInterop`というファイルシステムの存在判定で、
WSLかどうかを判定をしています。

```shell
# Macなら普通のbrew、WSLならLinux-brewを入れる処理をする箇所
if [ "$(uname)" == 'Darwin' ]; then
  echo 'Install brew [Mac]'
  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  echo 'Install modules only for Mac'
  ~/dotfiles/init/setup/mac.sh
elif [ -f /proc/sys/fs/binfmt_misc/WSLInterop ]; then
  echo 'Install brew [WSL]'
  sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
  echo 'Install brew [Linux]'
else
  exit 1
fi
```
### 最後に
WSLは、Ubuntuなので動いて当然ちゃ当然なのですが、やはりピュアUbuntuとは異なる点が多いため今回試してみました。
プラグインモリモリのneovimが動いたので、本格的にWindowsでガリガリコードが書けそうな感想を抱きました。
ターミナル周りで良いツールが出ると更に良いと思いました。(個人的には、前述の`wsl-terminal`で十分でしたが)

WSLは、昨年後半ごろに[WSL上でDocker Engineが動くようになっていたっぽいという話](https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87)があったりと、これからさらに楽しみです。

## Special Thanks!!!
[lighttiger2505/.dotfiles](https://github.com/lighttiger2505/.dotfiles)
構成や内容を大いに参考(パク..)にさせていただきました。
本当に知見しかなかったです。。。助かりました。。。。
[Windows10で快適なfishシェル環境構築](https://qiita.com/ysks/items/6c9d751d9a3b3b1b8020)
fishのthemeは、フォントを入れないと文字化けするので、上記の手順を利用して解決しました。
size_tの最大値

## iconv()のman

manでiconv()のエラー判定みてたら

>RETURN VALUE
>       The iconv() function returns the number of characters converted in a  nonreversible  way  during  this  call;
>       reversible conversions are not counted.  In case of error, it sets errno and returns (size_t) -1.

``(size_t) -1``ってなんなの？

## (size_t) -1

サンプル書いて

```c
#include <stdio.h>
int main(void)
{
   printf("size_t %zu\n", (size_t)-1);
   printf("unsigned int %zu\n", (unsigned int)-1);
   return 0;
}
```

動かしてみる

```sh
$ gcc -m32 test1.c ; ./a.out
size_t 4294967295
unsigned int 4294967295

$ gcc test1.c ; ./a.out
size_t 18446744073709551615
unsigned int 4294967295
```

なるほどね。
https://stackoverflow.com/questions/1420982/invalid-value-for-size-t
SweetAlert2 v8で`Cannot read property 'constructor' of undefined`エラーの対処

# はじめに
[SweetAlert2]
(https://sweetalert2.github.io/)を使っているプロジェクトで、
開発中にある日突然、こんなエラーが出て動かなくなっちまいました。

```
Uncaught TypeError: Cannot read property 'constructor' of undefined
```

# 原因と対策
バージョン7から8へいつの間にかアップデートされてて、
しかも根本的な部分に非互換があったからでした。
https://github.com/sweetalert2/sweetalert2/releases/tag/v8.0.0

> Breaking change # 1 - swal(...) -> Swal.fire(...)

```diff
- swal({
+ Swal.fire({
  ...
})
```

今まで`swal()`でシンプルに動いていたのが、
`Swal.fire()`というメソッドを呼ばなければいけなくなったんですね。
大文字小文字も変わっとる。

これが一番インパクトでかいですが、他にも合計5つBreaking changeがあるので、要チェックです！

# これから気をつけること

無闇に`yarn upgrade --latest`しない。
実行後はメジャーバージョンアップしてるライブラリがないかちゃんと確認する。
メジャーバージョンアップの内容をちゃんと確認する時間がないときは、
一旦前のメジャーバージョンに戻す。
（油断した頃にハマるんですよねー・・・）

ググっても日本語のハマり事例がなかったので、きっと誰かの役に立つと思いQiitaにしたためます。

# 追記： SweetAlert2使うのやめました

`Swal.fire()`が解決してから更にハマりました。
「他にも5つBreaking change」と書きましたが、そこではなく最下部の「Other changes」にひっそりと書かれたこの一文。。。

> inputValidator and preConfirm should always resolve and never reject

これが僕としては最悪の仕様変更でした。

`preConfirm`の中で`Promise.reject()`したら、v7では`swal()`の戻り値として`reject`を返してくれたんですが、v8では絶対に`resolve`が返ってしまう。なので`swal()`を`try-catch`で括るエラー処理が全くできなくなっちゃいました。

もうやってられないので、本家[SweetAlert 2.x](https://sweetalert.js.org/)に移行したのでしたー。ちゃんちゃん。
itext7でPDFを作成する～自由配置：テキスト～

#テキストを自由配置しよう
前回までの出力では、Wordのように左上から書き出すだけだった。
PDFでは出力位置を指定して出力することができる。

#早速コード

```FreePosString.java
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.ColumnDocumentRenderer;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.borders.SolidBorder;
import com.itextpdf.layout.element.Paragraph;

public class FreePosString {
    public static void main(String[] args) throws Exception {
        PdfDocument pdf = new PdfDocument(new PdfWriter("FreePosString.pdf"));
        PageSize ps = PageSize.A4.rotate();
        PdfPage page = pdf.addNewPage(ps);
        PdfCanvas canvas = new PdfCanvas(page);

        
        // 平成角ゴシック
        PdfFont font = PdfFontFactory.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H");
 

        // Initialize document
        Document document = new Document(pdf);

        // (100, 200)にwidth:50, height:100を指定
        Rectangle[] columns = {
                new Rectangle(100, 200, 50, 100)
        };
        document.setRenderer(new ColumnDocumentRenderer(document, columns));

        // 赤枠-線幅0.5fで文字書き出し
        Border border = new SolidBorder(ColorConstants.RED, 0.5f);
        Paragraph p1 = new Paragraph("あいうえ、かきくけこabcdefgh-ijklmn,opqrstuvwxyz")
                .setFont(font)
                .setFontSize(12)
                .setBorder(border)
                ;
        document.add(p1);
        
        // (100, 200)へ線。width:50, height:100の範囲をチェック
        canvas.moveTo(0, 0).lineTo(100, 200).lineTo(150, 200).lineTo(150, 300).lineTo(100, 300).stroke();

        //Close document
        document.close();
    }
}
```

#説明
document.setRenderer(new ColumnDocumentRenderer(document, columns));
で、columnsにRectangleを複数指定する。
今回は簡単のため、位置(100,200)にwidth:50, height:100の1か所のみ指定する。
また、場所をわかりやすくするため、moveToやlineToを利用して指定範囲に線を引いてみる。

出力イメージ
<img width="317" alt="FreePosString.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/322537/41072ffe-eac6-fdb8-fae2-9a64f9b99fa6.jpeg">


#(0, 0)は左下。
どうやらitextでは(0, 0)は左下になるようだ。

#書き出しは指定位置＋指定高さ。
また指定位置(100, 200)から指定した高さ100の位置からの書き出しになるようだ。

#Paragraphはずれる？
さらにParagraphでは微妙に位置がずれるようだ。
この辺りはTableを使った方がキレイに指定できそうだ。

#はみ出した分は次ページの同位置に出力される
指定枠内に入りきらなかった文字は次ページ以降の同位置に出力された。
はみ出したかどうかを判定する方法なども探っていきたい。

#禁則処理は半角英数のみ？
また文字に「、」や「-」「,」を行頭行末になるよう文字列を調整したが、禁則処理されるのは半角英数のみに見える。旧バージョンではこの設定もできたのだがitext7ではできるのだろうか？
この辺りは今後調査してみたい。
CSSで中央揃え指定する方法 Flexbox／position

親要素の横幅と縦幅が可変する場合、CSSで中央揃えにする方法です。
実務でよく使うFlexbox版とposition版をまとめました👍

#縦のみ中央揃え

ボタンのアイコンなど縦位置のみ中央揃え指定する場合に使うCSS指定です。


##Flexbox

``` 
.hoge{
  display: flex;
  align-items: center;
}
```
Flexboxは2行で縦中央揃えが可能です。

##position

```
.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
```
親要素に `position: relative;` を指定し、子要素を `osition: absolute;` で縦中央揃え指定します。

#縦のみ中央揃え：デモ

<p class="codepen" data-height="608" data-theme-id="0" data-default-tab="result" data-user="harumi-sato" data-slug-hash="NoYrbP" style="height: 608px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="CSSで縦のみ中央揃え">
  <span>See the Pen <a href="https://codepen.io/harumi-sato/pen/NoYrbP/">
  CSSで縦のみ中央揃え</a> by harumi-sato (<a href="https://codepen.io/harumi-sato">@harumi-sato</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#縦横 中央揃え

親要素に対して縦横中央揃えにする方法です
メインビジュアルでよく使うCSS指定です🏙

##Flexbox

``` 
.hoge{
  display: flex;
  align-items: center;
  justify-content:center;
}
```
Flexboxは3行で縦横中央揃えが可能です。

##position

```
.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  left: 50%;
  display: block;
  transform: translate(-50%,-50%);
}
```
親要素に `position: relative;` を指定し、子要素を `osition: absolute;` で縦横中央揃え指定します。

#縦横中央揃え：デモ

<p class="codepen" data-height="611" data-theme-id="0" data-default-tab="result" data-user="harumi-sato" data-slug-hash="aXYZWq" style="height: 611px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="CSSで縦横 中央揃え">
  <span>See the Pen <a href="https://codepen.io/harumi-sato/pen/aXYZWq/">
  CSSで縦横 中央揃え</a> by harumi-sato (<a href="https://codepen.io/harumi-sato">@harumi-sato</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#あわせて読みたい
上下中央揃えのCSSまとめ。Flexboxがたった3行で最も手軽 - ICS MEDIA
https://ics.media/entry/17522
matplotlibで複数のグラフをうまく描画・配置する

matplotlibで複数のグラフをうまく描画・配置する方法を考えてみた．
### 使用したライブラリ

```Python
import numpy as np
import math

import matplotlib.pylab as plt
```
### 普通にグラフを描いてみる

0< x, y, z <1の乱数で構成される3次元座標(x,y,z)100サンプルを描画してみる．
データは100×3行列にまとめている．

```Python
a = np.random.rand(100, 3)
# a: 100*3行列
"""
  array([[0.6809379 , 0.61074114, 0.47836854],
        [0.04612647, 0.58351735, 0.3947241 ],
        [0.14728068, 0.39401482, 0.26023169],
        ...
        [0.48889923, 0.76056772, 0.50234148]])
"""
```

```Python:plot_figure.py
fig = plt.figure(figsize=(10,5))

ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(a.T[0], a.T[1],"b." )
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(a.T[1], a.T[2],"b." )
```
出力結果: 
![20190210_Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/358086/08eb08bb-a1d1-f472-77c0-46c03e8e90db.png)

xy平面，yz平面への正射影を可視化できた．
でも，もしデータの次元が増えてきてグラフ数が増えてくるとどうだろう．
ax1, ax2, ax3, ...とちまちま打っていくのは面倒だし，グラフの数を変えるといちいち打ち直さないといけない．また，グラフ数によってはfig.add_subplot(A, B, C)のA, B, Cの値を変更してグラフの配置を調整しないと，全体が変に横長や縦長になりそうである．

### 複数のグラフをいい感じに描画・配置する

前項のデータの次元を増やして隣接する2つの軸で形成される平面への正射影を可視化する．

* 考慮したいポイント
    *   ax[i]（x[i]軸とx[i+1]軸でできる平面への正射影を描画する）を自動生成する
    *   いい感じに配置して可視化する．全体として変に横長や縦長にならないようにする．

前項より次元を増やして，100次元座標(x[0], x[1], ..., x[100])×30サンプルからなるデータを30×100行列にまとめ，可視化してみる．全部でグラフ数は99になる．

```Python
b = np.random.rand(50, 100)
# b: 50*100行列
"""
array([[0.54480885, 0.74289626, 0.11769252, ..., 0.32641451, 0.29208658,
        0.09331203],
       [0.28205274, 0.49104085, 0.15810177, ..., 0.48538961, 0.14882423,
        0.47236724],
        ...
        [0.9908165 , 0.93689581, 0.91262158, ..., 0.92930831, 0.2450454 ,
        0.39021262]])
"""
```
```Python:plot_multi_figures.py
dim = b.shape[1]
graph_num = dim - 1
row_num = math.ceil(np.sqrt(graph_num))
col_num = math.ceil(np.sqrt(graph_num))

fig = plt.figure(figsize=(20, 10))
axes = [fig.add_subplot(row_num, col_num, i+1).plot(b.T[i], b.T[i+1], "b.",markersize=2) 
        for i in range(graph_num)]
```
出力結果: 
![figure3.png](https://qiita-image-store.s3.amazonaws.com/0/358086/a4aa6a81-84d1-16d9-fbb5-a34311576cf6.png)

99個のグラフを一挙に表示できた．全体としてもいい感じの正方形サイズ．
グラフ数が多いためひとつひとつが小さくなりすぎた気もするが…
一旦よしとしておこう．軸の設定などが必要そうなのでおいおいしていこうと思う．
JavascriptでSliding Windowを作った

# Sliding Windowとは
興味対象のイベントを10個毎や10秒毎など枠(Window)で区切って枠ごとの集計値を算出する。その枠が時間経過でズレていきながらその時刻ごとに集計値がわかる。

### Sliding Windowの例
Twitterの瞬間最大Tweet数が一例。普段は普通の量のTweet数だけど、金曜ロードショウでラピュタが上映され「バルス！」とつぶやくその１分間は、Tweer数がとんでもないことになる。

### 今回のライブラリのユニークな部分
時系列データを扱えること。特に、例えば１秒ごとなど一定間隔で起こるイベントではなく、不規則に起こるイベントの集計に使える。  
下記の図は株式などの売買約定を時間軸に沿っておいたものをイメージしている。
約定は1秒ごとに起こるのではなく、買い手と売り手がマッチした所から不規則に起こっていく。
例えば、過去20秒をWindowsサイズとして、
- 時刻t0では、計$1000
- 時刻t1では、計$1600
- 時刻t2では、計$1500
と時刻が変わるにつれ集計値も変わっていく。
![sliding window.png](https://qiita-image-store.s3.amazonaws.com/0/93677/d5863dfb-7de4-7140-81c7-fb874bd6ed60.png)

# コレを使って出来ること
以下の様な時系列で起こるイベントの集計が出来る。
ここでは、仮想通貨市場で起こる過去20秒間の約定出来高を計算している。

３つのリアルタイムグラフがあり、
上の２つは各仮想通貨市場のビットコインの価格。
３つ目が過去20秒間の、書い手/売り手のボリューム。
![exchange.gif](https://qiita-image-store.s3.amazonaws.com/0/93677/a74d7a4e-231d-06da-f69e-211f7800ae2d.gif)

２つの市場で上昇タイミングにズレがあるように見えませんか！！？
このズレを最速で検知し注文できれば。。。

# 出来たもの
Githubにあげました。簡単なサンプルアプリも入れたので、サクっと使えるハズ。
https://github.com/ya9do/ts-sliding-window

### 注意
今回のライブラリはSliding Windowのためのライブラリです。可視化部分は含まず、上記GIFで使っているのはChart.JSです。
XMLファイルから属性を抽出する方法

パスワードなどの変更される可能性の高いものや、ファイルに直書きしたくないものをXMLにまとめて、欲しいものだけ取り出したい!

xmllintとsedを組み合わせて取得できました。

## xmlファイルの例
```
<?xml version="1.0" encoding="utf-8"?>
<piyo>
    <username value=piyo@mail.com/>
    <password value=piyo123/>
</piyo>
```

## xmllintとsedで抽出
属性の抽出はxpathで@を使うと簡単に取れました。

```
xmllint --xpath "/piyo/username/@value" env.xml | sed -e "s/ value=\"\([^\"]*\)\"/\1\n/g"
```

結果↓

```
piyo@mail.com
```


ちなみに後半のsedなしだと

```
xmllint --xpath "/piyo/username/@value" env.xml
```

こうなります↓

```
value=piyo@mail.com
```


たくさんある時はfunctionにまとめると便利ですね!
Go1.11からのGo Modulesでは相対パスImportは全くできなくなったので注意



# TL;DR

Go Version 1.11からのGo Modules(vgo)を使うならば__importにて相対パスは使用不可なので絶対パスを指定しよう__。

# 簡単な具体例

以下のような構成のGo Modules対応のプロジェクトがあるとします。

```console
$ tree
.
├── go.mod
├── go.sum
├── main.go
├── subdir
│   └── subdir.go
```

`go.mod`, `subdir.go`, `main.go`は以下のような内容。

```go.mod
module github.com/username/repo-name

require (
...
```

```go:subdir.go
package subdir

func SubDirFunc() {
...
```

```go:main.go
package main

import (
	"github.com/username/repo-name/subdir" // go.mod記載のモジュール名で絶対パス指定すること
	// NG "./subdir"                       // 相対パスは使用不可
)
...
```

`main.go`でのコメントのように、 `./subdir`と指定してもコンパイル時に

> cannot find module

となりGoはPathを見つけることができません。

`go.mod`に指定しているモジュール名を用いて絶対パス指定しましょう。

また、相対パス利用の既存コードはGo Modulesに乗り換えたら相対パスimport部を修正する必要があります。

# 設計者の解説

Go Modulesのデザインをリードした[Russ Cox氏](https://github.com/rsc)が[こちらのIssueのコメント](https://github.com/golang/go/issues/26645#issuecomment-408572701)でこのようになった経緯を解説してくれています。

要約すると

相対パスimportはGoコマンドとGOPATHがまだ無い時代に利用されていた。
↓
GOPATHが採用された後、GOPATH内では絶対パス指定(fully-qualified path)推奨、GOPATH外では相対パス指定するしかない(しかしビルドキャッシュが無かったのでビルドが遅かった)。
↓
Go Modulesでは相対パスか絶対パスのどちらかしか選択できない状況となった。マジョリティをサポートするために絶対パスコードの互換性保証を選んだ。
オイラー法による変数係数二階線形斉次微分方程式の数値計算

#はじめに
$$\frac{d^2v}{dt^2}+\frac{P}{EI(t)}v=0$$
を解く.$P,E$は適当な変数で$I(t)$は今回$t$が1.0ずつ増えるにしたがって$I(t)$も1.0ずつ増えるステップ関数とする.
#厳密解は
これは変数係数の二階線形斉次微分方程式なので一般的解法が存在しない.よって特殊解として$$v=t^m$$あるいは$$v=e^{mt}$$を式に代入して解となるように定数mが定まるかどうかを調べる.試しにMathematicaで
```DSolve[v''[t] + (P0/E0)*(1/UnitStep[t])*v[t] == 0, v[t], {t, 1, 10}]
```
と入力する基本解が得られる.
#オイラー法による近似
```
public static void main(String[] args) {
		double v0=3.0,z0=4.0,h=0.1;//初期値
		int n=10;
		double v,z,z1;//変数
		double p= 2.0;//変数
		double e= 3.0;//変数
		double ix= 1.0;//ステップ関数I(x)の初期値
		System.out.println(v0);//vの初期値出力
		v = v0 +z0*h;//v1計算
		z = z0 - (p/e*ix)*v*h;//z1計算
		System.out.println(v);//v1出力
		for(int i=0;i<n;i++){
			v = v + z*h;//v2からv12まで計算
				z1 = z - ((p/e)*ix)*v*h;
				z = z1;
				ix++;
			System.out.println(v);//v出力
		}
	}
```
を実行すると以下のような結果になる.
![vpei_01.png](https://qiita-image-store.s3.amazonaws.com/0/206597/9deeecf4-2338-4d5b-e77b-d8f9077912e7.png)
#参考文献
[1]三井田　惇郎,須田　宇宙：数値計算法[第二版],森北出版株式会社,2017
[2]稲岡　毅：基礎からの微分方程式,森北出版株式会社,2018
Delphiで指定フォルダ以下のファイル一覧を取得する

#前提
　投稿者自体：github、Qiita共に使い方を上手く理解できてない可能性高し。
　作成環境的なもの：OS　Windows10
　　　　　　　　　　言語　Delphi 10.3 Community Edition
　　　　　　　　　　
#やりたいこと
　指定フォルダ以下のファイル一覧を取得する
　Delphiのスレッドを理解しきれてないのでスレッド使って処理をする
　機能が生きているかどうかをわかるプログレスバーも利用する
　出力内容をExcelに張り付け、該当のフォルダを今後どうするかの判断材料にする

#作成物
　https://github.com/SequencePalladium/ScanFolder
　上記に作成したソースをアップ。取得できるはず。

#色々
　スレッドはTThreadを継承して作成。
　検索よりも、一覧を表出するのに時間がかかっている。。。
　なので、検索、ファイル一覧出力共にプログレスバーを出すようにしてみた。

##検索処理の進捗確認
　Unit1.pasの145行目で指定フォルダ内のサブフォルダ数を検索し、
　そのフォルダ数を元に処理がどれくらい進んでいるかをプログレスバーで表示。
　停止ボタンを押すと処理を中止する。

```
    GetFilesListAll(LBasePath, True);
    Synchronize(preChgFolStatus);
    for i := 1 to FParentFolder.Count - 1 do begin
      if Terminated then
      begin
        ShowMessage('検索が中止されました');
        Break;
      end;
      // サブフォルダ含め全検索
      GetFilesListAll(FParentFolder[i], False);
      Synchronize(chgFolStatus);
      Inc(FNowFoldersCount);
    end;
    Synchronize(endChgFolStatus);
```

##出力処理の進捗確認
　Unit1.pasの159行目からの処理。
　取得してきたリストカウントでfor文を回している。
　もちろん、レスポンスは微妙なのは理解しているが、作業がどれくらいまで進んでいるかを表出を優先。

```
    Synchronize(preShowMemo);
    for i := 0 to FFileList.Count - 1 do begin
      if Terminated then
      begin
        ShowMessage('出力が中止されました');
        Break;
      end;
      // ファイルリストをテキストエディタに出力
      // スピードよりも処理が見えるようにすることを重視
      Synchronize(showMemo);
      Inc(FNowFilesCount);
    end;
    Synchronize(endShowMemo);
```

##改変ポイント
　・レスポンスを優先するかどうか
　・ファイル出力プログレスバーを1000件単位で更新しているが、もっと多くしてもいいかも
　・出力内容がExcel前提のタブ文字なので、お好きな形式にする

#参考にしたサイトなど
　主に下記サイトをベースに、自分なりに欲しい情報を取得するようにして作成。
　http://mrxray.on.coocan.jp/Delphi/plSamples/817_DirFileListTest.htm

#今後のやりたいこと
　もともとは古いDelphiに対応するようにしてファイル検索しているので、
　新しいバージョンでもっと簡易なコーディングにできないか検討予定
Visual Studio Codeでの行頭カッコを何とかしたい

# Visual Studio Codeのフォーマッタ

いつも自分は、コードが汚くなりがちなので、設定を

```json:settings.json
"editor.formatOnSave": true,
"editor.formatOnType": true,
```

というふうにして改行するごと、保存するごとに自動的にフォーマッタを走らせるようにしている。
この機能は結構使えるのでおすすめ！

# 問題

VSCodeのフォーマッタはデフォルトで

```c++:main.cpp
#include <iostream>
int main() {
    std::cout << "Hello World" << std::endl;
    return 0;
}
```
を保存すると自動的に

```c++:main.cpp
#include <iostream>
int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}
```

となってしまう!!!!

行末派なのでこれは宗教上どうしても受け入れることができない...

# 解決策


[VSCodeの公式ドキュメント](https://code.visualstudio.com/docs/languages/cpp#_editing-code)によると、デフォルトでの動作では、作業フォルダに`.clang-format`というファイルがあるとそれを見に行ってそれに従ってフォーマットする。
ない場合は

```yaml:.clang-format
UseTab: (VS Code current setting)
IndentWidth: (VS Code current setting)
BreakBeforeBraces: AllMan
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
ColumnLimit: 0
```

とかいう`Visual Studio`というプリセットが使用されるらしい、これだと行頭にカッコが来る。
でもいちいちフォルダ毎に設定ファイルを設置するのは面倒なので、
`"C_Cpp.clang_format_style"`
に`Google`とか`LLVM`とか`Chromium`とか色々指定できるらしく、とりあえず天下の[Google様の](https://google.github.io/styleguide/cppguide.html)を使うことにした、Google様のフォーマッタは行末にカッコを持ってきてくれる。
でもTabは4spaceが良いので別途設定した。

# 結論

```json:settings.json
{
    "C_Cpp.clang_format_style": "Google",
    "editor.formatOnSave": true,
    "editor.formatOnType": true,
    "[cpp]": {
        "editor.tabSize": 4,
    },
}
```
駆け出しJavaScriptエンジニアが見落としがちな引数を利用した分割代入

# この記事の対象
引数と関数の基礎やES6に触れたことがある人
Webエンジニアに転職して1ヶ月経ち、覚えたことをアウトプット

# 引数の分割代入
第1引数「word」で定義する文字列を、それ以下の文字列を含む第2引数「...words」に分割代入していきます。

※「...」の記述方法はスプレッド演算子と言い、それ以下の配列要素を新たなクローン配列として作成します。詳細は[過去の記事](https://qiita.com/watsuyo_2/items/20da417260557ae1b25d)をご参照ください。

```js
function addWord(word, ...words) {
    const mergedWords = [];
    
    for(let i= 0; i<words.length; i++) {
        mergedWords[i] = word + words[i];
    }
    return mergedWords;
}

console.log(addWord("駆け出し", "エンジニア", "デザイナー", "イラストレーター"));
// [ '駆け出しエンジニア', '駆け出しデザイナー', '駆け出しイラストレーター' ]
```
関数addWordの引数の第1引数「word」と第2引数に「words」を与えます。
引数は関数内で使用できる**仮の変数**になります。

次に、この関数内で、mergedWordsという空の配列を作成します。
空配列内では第2引数の「words」にそれぞれ第1引数「word」をマージさせていく処理を書きます。
以上の処理で完成された配列を関数addWordの処理結果となるようにreturnします。

前述の通り関数addWordの引数は仮の変数なのでconsoleに出力するために、値を与えてあげます。
上の例で言うと"駆け出し"が第1引数になり、第2引数はそれ以下の"エンジニア", "デザイナー", "イラストレーター"になります。

スプレッド演算子に慣れないと、分割代入に違和感を覚えますがJavaScriptエンジニアであれば業務で多用するので覚えておきましょう！
macのvscodeがおかしくなった時に試すこと



##  概要

業務でもプライベートでもガッツリ愛用しているvscodeですが、たまに挙動がおかしくなることがあり、大抵はvscodeを再起動して解決してます。

ですが、今回は[これ](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)をインストールしてlocal.jsonでjaを指定しても日本語にならなかったので、思い切ってアプリケーションのデータをほぼ初期化してみました。

(ちなみに拡張機能はmacでは~/.vscode/extensionsに保存されているため、ご安心を)

## 手順

1. vscodeをcmd+qで終了しておく
1. ~/Library/Application Support/Code/をFinderで開く
   - コマンドで`open ~/Library/Application\ Support/Code/`で一発です
1. Code/Userディレクトリの必要そうなものをバックアップ
   - snippets、workspaceStorage、settings.json、local.jsonあたりバックアップしておけばよさそうです
1. Codeディレクトリの中身を全て削除する
1. vscodeを起動する
1. Code/Userディレクトリにバックアップしたデータを復元する



これでvscodeをほぼ初期化しつつ、元の環境を復元することができました。

僕はこれでvscodeが日本語にならない問題を解決しました:relieved:

## 最後に

vscodeをβ版から使い続けてかれこれ4年弱、もはやこれがなくては仕事ができないぐらいになりました。

これからもよろしくお願いします:bow:
バージョン管理機能における誤解されやすいこと2つ

バージョン管理機能において誤解されやすいと感じることが2つあります。
私自身がどちらも誤解したまま覚えてしまっていたため、備忘録という意味も込めて書き残します。

##誤解されやすいこと① マイナーバージョンの上限数

下図の設定画面を見て、以下の通りの設定だと理解するかたは少なくないと思います。

- メジャーバージョンの上限数が 10 版 
- マイナーバージョン（= 下書き）の上限数が 3 版

実は、**下図の設定でマイナーバージョン（= 下書き）の上限が 3 版という理解は誤り**です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/357828/515703ef-16f5-385f-3c6c-4e47b7905597.png)

この設定画面を英語で表示すると下図の通り。こっちのほうが正しく理解しやいかと思います。
Keep drafts for the **following number of major versions**

つまり、この設定項目で指定するのは「マイナーバージョンを保持する**メジャーバージョンの版数**」です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/357828/0dfbb182-5f4d-c1bd-c06c-474c6bace625.png)

###マイナーバージョンの上限版数の正しい理解

つまり、下図の設定の正しい理解は以下の通りです。

- メジャーバージョンの上限が 10 版 
- マイナーバージョン（= 下書き）を保持するメジャーバージョンの上限が 3 版。4 版前のメジャーバージョンが保持していた下書きは自動で破棄する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/357828/515703ef-16f5-385f-3c6c-4e47b7905597.png)

### 実際のマイナーバージョンの上限数はいくつ？

マイナーバージョンの実際の上限数は 511 です。
この数値は変更不可のようです。

>[ソフトウェアの境界と制限 (SharePoint Server 2016 および 2019)](https://docs.microsoft.com/ja-jp/sharepoint/install/software-boundaries-and-limits-0)

| 制限 | メモ |メモ | メモ |
|:--|:--|:--|:--|
|メジャー バージョン　　　　　　　　　　　　　　   |400,000 　　　　　　　　　　　           |サポートされている　　　　　　　   | この制限を超えると、ファイルを開く操作、ファイルの保存と削除、バージョン履歴表示など、基本的なファイル操作を正常に実行できなくなることがあります。 |
|マイナー バージョン   | 511  |境界   | マイナー ファイル バージョンの最大値は 511 です。この制限を超えることはできません。 |


お客様先でSharePoint運用を支援していたときに「特定のファイルを編集しようとすると必ずエラーが発生する」という問い合わせがありました。

調べたところ、マイナーバージョンの数が上限に達して、かつ、ファイルの編集時に必ずチェックアウトをする設定していました。そのため、ファイルの編集を開始しようとしたときにマイナーバージョンの作成できずエラーになったという状況です。

そのときは、メジャーバージョンの発行を実施して頂くことで解決しました。

###マイナーバージョンの上限数を誤解していると困ること

マイナーバージョンの上限数を誤解して起こり得るトラブルは、ライブラリの容量が管理者の意図しない範囲で大きく膨らむ場合があることです。

SharePointのバージョン保持は変更部分の差分を保持するのではなく、ファイルそのもののコピーを残すイメージです。そのため、バージョンが増えると単純計算で ファイル × 版数 の空き容量が必要になります。 

管理者がバージョン履歴による容量の増大を抑えるためにメジャーバージョンとマイナーバージョンの版数を明確に決めていたとしても、実際にはシステムの上限値である 511 版までマイナーバージョンは保持されます。そのため、気が付いたら管理者が想定していた何倍もの容量がサイトに登録されている（しかもその大部分を占めているのがバージョン履歴の容量）ということが起こり得ます。

バージョン履歴による容量増大を抑えるためには、マイナーバージョンを使わずにメジャーバージョンだけで運用するという割り切りかたも手段のひとつとしてありだと思います。

#誤解されやすいこと② 上限数の設定を変えた時に、上限を超えた古いバージョンが削除される？

「サイトで保持するファイル容量を削減するためにライブラリに設定しているバージョンの上限数を減らしたのに、ファイルが保持しているバージョン数が減らない」

という問い合わせをもらったことがあります。

**上限数を超えたバージョンが削除されるのは、そのアイテムの更新処理が行われたとき**のようです。そのため、上限数を減らしたあとに何らかの方法で更新処理を行うまでは古いバージョンは保持されます。

この更新処理のトリガーは、ファイル自体の編集だけでなくアイテムのプロパティ編集でもOKです。なので、手動でアイテムの編集画面を開いて閉じる、という操作でそのファイルの古いバージョンを削除するトリガーになります。

ファイルが大量にあって手動ではきりがない場合は、PowerShell を使って一括で処理することも可能です。
その場合は、Updateメソッドを使うよりも、更新日や更新者を変えない SystemUpdateメソッド を使うほうが望ましいと思います。

削除されたバージョン履歴はごみ箱にはいります。

#余談

Microsoft Docs にここ数年で新しく投稿された記事は表現が妙にポップなときがありますね。

>[ソフトウェアの境界と制限 (SharePoint Server 2016 および 2019)](https://docs.microsoft.com/ja-jp/sharepoint/install/software-boundaries-and-limits-0)

>パイにたとえた解説
>
>ファームの容量をパイとして考えてみましょう。パイのサイズは、サーバー、ハードウェア リソース (CPU、RAM など)、ストレージ容量、ディスク IOPS、ネットワーク帯域幅、待機時間など、要素の総計を表します。したがって、パイのサイズは、ファームのリソース全体に関連します。つまり、リソース (ファーム サーバーなど) を追加すると、パイのサイズが増加します。
Hex Fiend の Binary Template で長さ不定の文字列を検出する

macOS 用のバイナリエディタである [Hex Fiend](https://github.com/ridiculousfish/HexFiend) には Binary Templates (beta) 機能があり、バイナリの読み書きを手助けしてくれる。

Template には Tcl でバイナリの構造を以下のように記述していく。

```tcl
# 1 byte の Header と 8 bytes の Name から成るバイナリの例
uint8 "Header"
str 8 "utf8" "Name"
```

長さが固定でないフィールドが登場する場合は少し工夫が必要で、例えば長さ不定だが `+` が後に続くことが分かっている文字列なら以下のように書くことができる。

```tcl
proc str_ul { follower encoding label } {
    set found 0
    set p 0
    while {![end]} {
        set x [hex 1]
        incr p 1
        if {$x == $follower} {
            set found [expr $p - 1]
            break
        }
    }
    move [expr -1 * $p]
    if {$found} {
        str [expr $p - 1] $encoding $label
    }
}

str_ul 0x2B "utf8" "String"
str eof "utf8" "Remaining"
```

上記をテンプレートとして保存し、`464F4F2B424152` を読んだ結果:
<img width="586" alt="unknown-length-string.png" src="https://qiita-image-store.s3.amazonaws.com/0/41879/1491c227-5ef7-5b5c-653b-04e5033e57cf.png">
MakeCode Editorの動作環境の選び方

# 背景

子供たちにmicro:bitのMakeCode Editor(旧javascript Block Editor)でプログラミングを教える際に、ボトルネックになるのがダウンロードしたファイル(*.hex)をUSBドライブにコピーする操作です。「できればダウンロードボタン一発でインストールしたい」という願いを優先した場合の環境選択案（私案）をまとめました。


# 環境の選び方

学校環境ははセキュリティ対策で、簡単にソフトがインストール出来ないようになっているケースが多いので、あえて「ソフトのインストールが出来ますか？」という判定を入れてみました。あとは、その人の趣味もあるので、これはあくまでも私の私案になります。


![micro_bit開発環境.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/4f4e7121-f90f-3d09-8475-ff1e1b4385af.jpeg)

- ブラウザのみ
    - 条件：OS:Windows7,8,10・MacOS・ChromeOS・Linux他　ブラウザ：Chrome,Firefox,Edge,Internet Explorer
    - 一番ポピュラーな環境ですがダウンロードボタン一発でインストール出来ず、コピー操作が必要となります
- ブラウザ+MicrobitUploader
    - 条件：OS: Windows7,8,10
    - 昔のTouchDevelop用のWindowsアプリです
    - 詳しくはhttps://www.touchdevelop.com/microbituploader
- Chrome+WebUSB
    - 条件：Chromeブラウザ65以上且つBluetooth搭載PC
    - 詳しくは https://makecode.microbit.org/device/usb/webusb
    - 注意点としてはmicro:bitのファームウエアアップデートが必要な場合があります
- Windows10用アプリ MakeCode for micro:bit
    - 条件：OS: Widnwos10
    - Microsoft StoreからMakeCode for micro:bitをインストール
- Android,iOS (iPhone,IPad)
    - 条件：OS:Android,iOS
    - 各OSのStoreからmicro:bit アプリをインストール
    - bluetoothでインストールを行うため、毎回ペアリング操作が必要なのが少々面倒なのと、インストールに時間がかかるのが難点
    - Android版はプログラムが古く、アプリとブラウザを行ったり来たりする(2019.2.10現在)

これ以外に、ブラウザのダウンロードドライブをMICROBITが掴むドライブに決め打ちしたり、Chrome拡張で拡張子を見て自動保存できるようにする方法もありますが、割愛させていただきました。
Molmilの超初歩的な使い方(1)

#Molmilの使い方のメモ1

タンパク研のG. J. Bekker先生らが開発された分子表示ソフト。

Git

https://github.com/gjbekker/molmil

Molmil コマンドライン

 ≡ をクリックしてToggle CLIでpymol形式なものが使える

自分の試すためのメモをここに記する

##ファイルオープン　fetch PDBID

```
fetch 1pkn
```

##選択: select _name_, expression

```
select barrel, resi 117-217
select cterm, resi 389-530
select pyruvate, resi 1-116 or resi 218-388
```
##cartoon色変更：color clr, atom-list/expression 

```
color blue, pyruvate
#残基による選択
cartoon_color blue, resi 117-217
#複数セグメントを同時に選択　
（and/orの使い方が要注意）
cartoon_color green, resi 1-116 or resi 218-388
#selectで定義したgroupより選択
cartoon_color red, cterm
```

##まとめて処理する方法はコマンドを「；」で連結のみ

```
fetch 1pkn; select barrel, resi 117-217; select cterm, resi 389-530; select pyruvate, resi 1-116 or resi 218-388; cartoon_color blue, barrel; cartoon_color green, pyruvate; cartoon_color red, cterm;
```
結果は以下のようになる。
<img width="795" alt="fig1.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/344747/28fa5725-964a-5825-b904-4c7d6e4f25cb.jpeg">

##ブラウザで書くとき

https://pdbj.org/molmil2/
の後ろに「＃」をつけて、リンクするだけ。
一行で書いて、他人に送付できる。

```
https://pdbj.org/molmil2/#fetch 1pkn; select barrel, resi 117-217; select cterm, resi 389-530; select pyruvate, resi 1-116 or resi 218-388; cartoon_color blue, barrel; cartoon_color green, pyruvate; cartoon_color red, cterm;
```

今日はこの辺で。

MolmilのManual以外、本文の参考サイト：
1．http://dehira.blog.jp/archives/22355149.html
2．http://www.protein.osaka-u.ac.jp/rcsfp/supracryst/suzuki/jpxtal/Katsutani/command.php
仮想環境にDjango導入〜とりあえずサーバー立ち上げまで

# やること
pip3で簡易的にDjango導入、サーバー立ち上げまでやります。

# 環境
python 3.5.2
django 2.1.5
virtualbox 5.2.26
vagrant 2.1.2
mac 10.14.2
pip3


# 仮想環境にインストール

python3.3から実装された、仮想環境を構築出来る標準機能のvenvを使用。

#### 仮想環境準備

```
python3 -m venv [dirname]
```

以下ファイルが作成される。

```
[dirname]
    bin
    include
    lib
    lib64
    pyvenv.cfg
```



#### シェルの設定を反映させ、仮想環境起動

```
cd [dirname]
source bin/activate

# 仮想環境終了
deactivate
```
ターミナルが (dirname)[....]$ になったらおk。

### 仮想環境にDjangoをインストール

```
pip3 install django

# version確認
python
>>> import django
>>> django.get_version()
2.0.5
>>> exit()
```

### Djangoプロジェクトファイル一式を作成

```
django-admin startproject [dirname]
```

以下ファイルが作られる。

```
manage.py 
[dirname]
    __init__.py 
    settings.py
    urls.py
    wsgi.py
```




# サーバーを立ち上げる


## setting.py

とりあえず、サーバー立ち上げるためにIP指定

```
...

ALLOWED_HOSTS = ['アクセスするIPアドレス']
```

manage.pyと同じディレクトリまで行って、
サーバーを立ち上げて確認。

```
python manage.py runserver [IPアドレス:ポート番号]

April 1, 2018 - 11:11:11
Django version 2.0.5, using settings 'ttt.settings'
Starting development server at http://[IPアドレス:ポート番号]/
Quit the server with CONTROL-C.
```

指定URLにアクセスして、
The install worked successfully! Congratulations!と出ればOK
Trelloボードでタスクを管理しよう

#Trelloとは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/230735/2f4f072a-6293-9a3d-a851-6863781c12f5.png)

Trello（トレロ）は、プロジェクト単位で作成する“ボード”に関連するメンバーやタスク、ドキュメントなどを登録し効率よく管理ができるマネジメントツールです。

#使うには
１.Trelloの[公式サイト](https://trello.com/ja)でアカウントを作成します。
２．管理者が作成したボードにJOIN依頼をしてください。
３．ボードにアクセスし、表示されることを確認します。

#タスクを追加するには
左から順に「TO DO(未着手)」「WorkInProgress(作業中)」「DONE(完了)」と、いわゆるカンバン方式でリストを設けています。
各リストにあるリンク「カードを追加」をクリックしてタスクを追加することができます。
カードには担当者や期限、詳細の説明などを記入できます。

![カード_1.png](https://qiita-image-store.s3.amazonaws.com/0/230735/9a43534c-b755-3b56-d166-29b09c16067f.png)


↓クリックして詳細表示
![カード_2.png](https://qiita-image-store.s3.amazonaws.com/0/230735/38a8ec14-dc3c-f8f4-aa43-3c6573f5dfb6.png)


#タスクのステータスを変えるには（着手する、完了する）
カードをドラッグ＆ドロップすることでステータスを変えます。

![カード_3.png](https://qiita-image-store.s3.amazonaws.com/0/230735/a3e2b687-2e01-cee8-78ac-83b65af94dec.png)
![カード_4.png](https://qiita-image-store.s3.amazonaws.com/0/230735/6b191fd8-b5f0-fb6e-f2ea-84f6409bca81.png)
![カード_5.png](https://qiita-image-store.s3.amazonaws.com/0/230735/861888b0-d8f1-ce64-aca1-fd488a89594c.png)
php-master-changes 2019-02-09

今日は配列の始点インデックスが負値の際に次のインデックスが常にそれに +1 した値となるようにする RFC の実装、ライセンス等の年範囲表示の修正、PHP TestFest で追加されたテストの取り込み、Windows で CTRL+C をハンドルするための sapi_windows_set_ctrl_handler() の実装があった！

# 2019-02-09
## pmmaga: Implement the negative_array_index RFC
- https://github.com/php/php-src/commit/6732028273b109cb342387ab5580c367f629d0ac
- 配列の始点インデックスが負値の際、次のインデックスが常にそれに +1 した値となるようにする [RFC](https://wiki.php.net/rfc/negative_array_index) の実装
- 以前は始点の次のインデックスが 0 から始まるようになっていた

## petk: Update and fix remaining year ranges (2019)
- https://github.com/php/php-src/commit/c245898bfaf47353a748ca6f2d37cd669e697ae4
- [7.4~]
- ライセンス等の年範囲表示を修正

## royopa: updated typo in test
- https://github.com/php/php-src/commit/dc1937e386082dddbcab612889ad8cb15df88b73
- [7.4~]
- テストの typo 修正
- PHPTestFestBrasil というので 2017 年に行われた修正らしい

## joelclermont: readline - add basic test
- https://github.com/php/php-src/commit/0506c0224a485812e7f675cb808432f5f98a4412
- [7.4~]
- ext/readline にテストを追加
- [PHPTestFest2017](https://phptestfest.org/groups/2017/) で 2017 年に行われた修正らしい

## galvao: Add test for pcntl_getpriority() basic behaviour
- https://github.com/php/php-src/commit/d22dd5f93a687ed208ca39e451ae5ab7d7dc6be3
- [7.4~]
- ext/pcntl で、[pcntl_getpriority()](http://php.net/manual/ja/function.pcntl-getpriority.php) のテストを追加
- これも PHPTestFest2017 の奴かな

## MarkBaker: Test to verify that closures can't be instantiated
- https://github.com/php/php-src/commit/c5f9855283733131b9900818e7bc6e997668ffdc
- [7.4~]
- Closure を直接 new できないことのテストを追加
- これも PHPTestFest2017 の奴っぽい

## David Stockton: Add test for null return on version_compare with bad operator
- https://github.com/php/php-src/commit/e1dd8cd678e72475fe28f450657fb81665beaccc
- [7.4~]
- [version_compare()](http://php.net/manual/ja/function.version-compare.php) へ誤った演算子を渡した際に null が返ることのテストを追加
- これも PHPTestFest2017 の奴

## weltling: Implement FR [#77377](https://bugs.php.net/bug.php?id=77377) handle CTRL+C in Windows
- https://github.com/php/php-src/commit/12bfd9a5f58c12b8f63011c130ec3bf6605ea33b
- [7.4~]
- Windows で CTRL+C をハンドルするための sapi_windows_set_ctrl_handler() の実装

## weltling: Fix TS build, ref [#77377](https://bugs.php.net/bug.php?id=77377)
- https://github.com/php/php-src/commit/2ca3becd174b264b7367b510483b78e84f253295
- [7.4~]
- ↑でスレッドセーフ版のビルドがおかしかったのを修正
JavaScriptで出てくるECMAScriptとは？

# はじめに
JavaScriptのことを調べているとよくES6とか出てくる。正式にはECMAScriptというらしい。これが一体なんなのかをまとめる。

# ECMAScriptとは
Ecma Internationalによって定められるJavaScriptの標準規格とのこと。なるほど、JavaScriptのバージョンみたいなものだと思えばいいのか。

# ECMAScriptの歴史
表にまとめてみる。なるほど、6(2015)から活発に公開されている。ES2015では、多くの新しい機能や文法が追加され、一気にJavaScriptが使いやすくなったらしい。

| Edition | 公開日     |
| ------- | ---------- |
| 1       | 1997年6月  |
| 2       | 1998年6月  |
| 3       | 1999年12月 |
| 4       | 放棄       |
| 5       | 2009年12月 |
| 5.1     | 2011年6月  |
| 6(2015) | 2015年6月  |
| 2016    | 2016年6月  |
| 2017    | 2017年6月  |

# ES6の機能追加
* クラス
* アロー関数
* Promis

この辺の機能が追加されたらしい。

# まとめ
アロー関数とか、なんか見慣れないなぁと思ってたけど、比較的新しい技術だったんだなぁ。
nem catapult バイト列構造置き場 Bison編

Alpaca
https://qiita.com/planethouki/items/e1c153f9ea395ce0e8e6
Bison
https://qiita.com/planethouki/items/d22da901e5f71a366302
Cow
https://qiita.com/planethouki/items/bd21182f06b69df1ce35
Dragon
https://qiita.com/planethouki/items/75dc1d685438218a72cd
0.10.0.x
https://qiita.com/planethouki/items/c926905e9fde4c6ef68b

# Transfer Transaction


| 項目 | サイズ | 意味 |
|:----:|:------|:------|
| サイズ | 4byte(LE) | payloadのバイト数 |
| 署名 | 64byte | トランザクションへの署名 |
| 公開鍵 | 32byte | 署名者の公開鍵 |
| version | 2byte(LE) | `0390` |
| type | 2byte(LE) | `5441` |
| fee | 8byte(LE) | 手数料 |
| deadline | 8byte(LE) | 期限 |
| 受取人 | 25byte | 受取人アドレス |
| msg size | 2byte(LE) | メッセージバイト数＋１ |
| num mosaics | 1byte | モザイクの種類数 |
| msg type | 1byte | メッセージタイプ |
| msg payload | 可変 | メッセージ本文 |
| mosaics | - | 下記が`num mosaics`分続く |


| 項目 | サイズ | 意味 |
|:----:|:------|:------| 
| mosaic id | 8byte(LE) | モザイクID |
| amount | 8byte(LE) | 量 |



```text:sample
A5000000
894A829717A6627C108BD69D56A188659C403A4E2C0CEDBB35F856AFD57713E9ACA553C68803E56E39683A9D18CBAF258BFCE043724C56175C53E425727C050F
AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
0390
5441
0000000000000000
F475D61517000000
90FA39EC47E05600AFA74308A7EA607D145E371B5F4F1447BC
0100
01
00
44B262C46CEABB85
0000000000000000
```
# Empty Block

| 項目 | サイズ | 意味 |
|:--:|:--:|:--:|
| サイズ | 4byte(LE) | ブロックサイズ |
| 署名 | 64byte | ブロックへの署名 |
| 公開鍵 | 32byte | 署名者の公開鍵 |
| version | 2byte(LE) | 0390 |
| type | 2byte(LE) | 4381 |
| height | 8byte(LE) | ブロック番号 |
| timestamp | 8byte(LE) | タイムスタンプ |
| difficulty | 8byte(LE) | 難易度 |
| previousBlockHash | 32byte | 前のブロックハッシュ |
| blockTransactionsHash | 32byte | わからない |
| stateHash | 32byte | わからない |
nem catapult バイト列構造置き場 Alpaca編

Alpaca
https://qiita.com/planethouki/items/e1c153f9ea395ce0e8e6
Bison
https://qiita.com/planethouki/items/d22da901e5f71a366302
Cow
https://qiita.com/planethouki/items/bd21182f06b69df1ce35
Dragon
https://qiita.com/planethouki/items/75dc1d685438218a72cd
0.10.0.x
https://qiita.com/planethouki/items/c926905e9fde4c6ef68b

# Transfer Transaction


| 項目 | サイズ | 意味 |
|:----:|:------|:------|
| サイズ | 4byte(LE) | payloadのバイト数 |
| 署名 | 64byte | トランザクションへの署名 |
| 公開鍵 | 32byte | 署名者の公開鍵 |
| version | 2byte(LE) | `0390` |
| type | 2byte(LE) | `5441` |
| fee | 8byte(LE) | 手数料 |
| deadline | 8byte(LE) | 期限 |
| 受取人 | 25byte | 受取人アドレス |
| msg size | 2byte(LE) | メッセージバイト数＋１ |
| num mosaics | 1byte | モザイクの種類数 |
| msg type | 1byte | メッセージタイプ |
| msg payload | 可変 | メッセージ本文 |
| mosaics | - | 下記が`num mosaics`分続く |


| 項目 | サイズ | 意味 |
|:----:|:------|:------| 
| mosaic id | 8byte(LE) | モザイクID |
| amount | 8byte(LE) | 量 |

```text:sample
A5000000
894A829717A6627C108BD69D56A188659C403A4E2C0CEDBB35F856AFD57713E9ACA553C68803E56E39683A9D18CBAF258BFCE043724C56175C53E425727C050F
AC1A6E1D8DE5B17D2C6B1293F1CAD3829EEACF38D09311BB3C8E5A880092DE26
0390
5441
0000000000000000
F475D61517000000
90FA39EC47E05600AFA74308A7EA607D145E371B5F4F1447BC
0100
01
00
44B262C46CEABB85
0000000000000000
```

# Secret Lock Transaction


| 項目 | サイズ | 意味 |
|:---:|:---:|:---:|:---:|
| サイズ | 4byte(LE) | トランザクションサイズ |
| 署名 | 64byte | トランザクションへの署名 |
| 公開鍵 | 32byte | 署名者の公開鍵 |
| version | 2byte(LE) | `0390` |
| type | 2byte(LE) | `4C42` |
| fee | 8byte(LE) | 手数料 |
| deadline | 8byte(LE) | 期限 |
| mosaic id | 8byte(LE) | モザイク |
| amount | 8byte(LE) | モザイク数量 |
| duration | 8byte(LE) | 有効期間ブロック数 |
| hashAlgorithm | 1byte | ハッシュアルゴリズム |
| secret | 64byte | シークレット |
| 受取人 | 25byte | 受取人 |

# Secret Proof Transaction

| 項目 | サイズ | 意味 |
|:---:|:---:|:---:|:---:|
| サイズ | 4byte(LE) | トランザクションサイズ |
| 署名 | 64byte | トランザクションへの署名 |
| 公開鍵 | 32byte | 署名者の公開鍵 |
| version | 2byte(LE) | `0390` |
| type | 2byte(LE) | `4C43` |
| fee | 8byte(LE) | 手数料 |
| deadline | 8byte(LE) | 期限 |
| hashAlgorithm | 1byte | ハッシュアルゴリズム |
| secret | 64byte | シークレット |
| proof size | 2byte(LE) | プルーフのサイズ |
| proof | variable | プルーフ |
Ionic4でカラーを追加する

## 追記
Ionic Japan UserGroupより日本語翻訳がでたのでこれを読むと良い！

[高度なカスタマイズ](https://ionicframework.jp/docs/theming/advanced)

## 概要

Ionic4でカラーを追加する方法です。
Ionic3と方法が変わっていたのでメモ。

## Ionic3では？

variable.scssのcolorsに追加すればOKでした。

```sass:/theme/variable.scss
$colors: (
  primary:    #488aff
  secondary:  #32db64,
  danger:     #f53d3d,
  light:      #f4f4f4,
  dark:       #222,
  twitter:    #00aced
);
```

$colorsに追加すればIonicのコンポーネントから利用できるようになります。

```html
<button ion-button color="twitter">Twitterでログイン</button>
```


## Ionic4ではこう書く

クラスに追加すれば使えるようになります。クラス名は".ion-color-{COLOR}"という形式になります。
例えば以下はTwitterカラーを追加するならしたのように書きます。

```sass:app.scss
.ion-color-twitter {
  --ion-color-base: #00aced;
  --ion-color-base-rgb: 0, 172, 237;
  --ion-color-contrast: #ffffff;
  --ion-color-contrast-rgb: 255, 255, 255;
  --ion-color-shade: #0097d1;
  --ion-color-tint: #1ab4ef;
}
```

colorの仕様方法はIonic3と同じ！

```html
<ion-button color="twitter">Twitterでログイン</ion-button>
```

baseかcontrastと書く量多すぎ！って思ったなら公式ドキュメントのColor Generatorを利用しましょう。
メインの色を指定すれば良い感じのCSSを吐き出してくれます。
https://ionicframework.com/docs/theming/color-generator

![Screen Shot 2019-02-10 at 14.52.49.png](https://qiita-image-store.s3.amazonaws.com/0/165335/260fc7ff-37c4-de04-e6f4-3627909fe7c7.png)

![Screen Shot 2019-02-10 at 14.52.51.png](https://qiita-image-store.s3.amazonaws.com/0/165335/9e857fc6-6f57-e7d1-ba62-9b90a114da15.png)

## まとめ

記述方法が変わっても公式でgenerator用意されていますしIonicはDX高いですね！
history.push();でアクションを起こした時にページ遷移をする

#概要
今回はhistory.push();を使ってページ遷移を行います。
ページ遷移といえば

```javascript
<Link to="/">ホームへ</Link>
```
のようにしてクリックしたらホームへ行くみたいなものですが、今回はフォームを用意して文字を送信したらページ遷移をすることを目標にします。
#実装していく

```terminal
npm install --save react-router-dom
```
必要なものとしてreact-router-domをインストールします。

次に準備としてヒストリーを作ります。

```javascript:src/history.js
import history from 'history/createBrowserHistory';

export default history();
```

App.jsを見てみましょう。

```javascript:src/App.js
import React from 'react';
import { Router, Route } from 'react-router-dom';

import history from '../history';
import PageOne from './PageOne';
import PageTwo from './PageTwo';

const App = () => {
  return (
    <div>
      <Router history={history}>
        <div>
          <Route path="/" exact component={PageOne} />
          <Route path="/action" exact component={PageTwo} />
        </div>
      </Router>
    </div>
  );
};

export default App;
```

コンポーネントとしてPageOneとPageTwoを持っておりそれぞれpathをつけています。
ポイントはRouterにhistoryを持たせています。
ここをBrowserRouterでラップしてしまうとエラーが出てしまうので気をつけてください。

PageOneはダミーのページなので置いておいて、PageTwoをみてみましょう。

```javascript:src/components/PageTwo.js
import React from 'react';
import history from '../history';

class PageTwo extends React.Component {
  changePage = () => {
    history.push('/');
  }

  render() {
    return (
      <form onSubmit={this.changePage}>
        <input type="text" />
      </form>
    );
  }
};

export default PageTwo;
```
history.push()に飛ばしたいpathを入れてあげるとページ遷移してくれます。
ここでは送信するとPageOneコンポーネントに飛んでいます。
#まとめ
今回はhistory.push()についてみてみました。
参考になれば幸いです。
Windows 10上のVisual Studio CodeからWSLのツールを呼び出す

Windows 10上のVisual Studio CodeからWSLのツールを呼び出す方法のメモ。
筆者のニーズに応じて随時更新していきます。

# 基本方針

 - ファイルパスの変換をWindows側で行う
    - `wslpath` コマンドがWSL側にしかないため
    - Windows側からバックスラッシュ `\\` を壊さずにWSLに文字列を渡すのが至難の業すぎるため
 - パス変換の実装方法
    - バッチファイルベース : https://github.com/Microsoft/WSL/issues/1946#issuecomment-295583000 (私が選んだ方法)
    - Pythonベース : https://github.com/OhYee/WSLenv
    - Rustベース : https://github.com/andy-5/wslgit

Pythonベース、Rustベースのものは応用が効くものの、手段としてでかすぎると思うので、私はバッチファイルベースのものを選択した。

# 具体例

ここではautopep8の例のみを挙げる。
読者が必要となるコマンドで適宜用意すれば良い。

また、引数の制約が許せばそもそも呼び出しを `bash -c "%v_params%"` としてしまって万能バッチファイルとしても良いかもしれない。

## autopep8

下記のバッチファイルを用意する。

### バッチファイル
```
@echo off
set v_params=%*
set v_params=%v_params:\=/%
set v_params=%v_params:c:=/mnt/c%
set v_params=%v_params:"=\"%
@bash -c "autopep8 %v_params%"
```

続いて、VSCodeの設定ファイルから上記バッチファイルを指す。

### 設定ファイル
```json
{
    "python.formatting.autopep8Path": "C:\\Users\\user\\Tools\\wslautopep8.bat"
}
```

こちらの実装の割り切りポイントは、作業パスがCドライブを前提としているところ。ここを解決したい場合は前述のPythonベース、Rustベースのものを拡張して書いたほうが良いと思う。

# 参考文献

- https://qiita.com/remin/items/b764036e95a13075ee98
- https://github.com/Microsoft/WSL/issues/1946#issuecomment-295583000
- https://github.com/OhYee/WSLenv
- https://github.com/andy-5/wslgit
Vue.jsで`@storybook/addon-knobs`が動作しない...

## `@storybook/addon-knobs`が動かない
Vue.jsをstorybookをインストールした際にできるコードは、以下のようになっていると思います。

```js:index.storybook.js
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue'
import { action } from '@storybook/addon-actions'
import { linkTo } from '@storybook/addon-links'

import MyButton from '../components/MyButton.vue'

storiesOf('Button', module)
  .add('with text', () => ({
    components: { MyButton },
    template: '<my-button @click="action">Hello Button</my-button>',
    methods: { action: action('clicked') }
  }))
  .add('with JSX', () => ({
    components: { MyButton },
    render() {
      return <my-button onClick={this.action}>With JSX</my-button>;
    },
    methods: { action: linkTo('Button', 'with some emoji') }
  }))
  .add('with some emoji', () => ({
    components: { MyButton },
    template: '<my-button @click="action">😀 😎 👍 💯</my-button>',
    methods: { action: action('clicked') }
  }))

```
これ見る限りだとactionを利用するときは`methods`に定義して使えば良さそうです。
knobsの場合はどこに定義してtemplateに値を渡せばいいんでしょうか？data?computed?methods?という話です。


## 環境

| CLI Or CLI-PLUGIN | インストールされたライブラリ | バージョン  |
|---|---|---|
|vue-cli(3.4.0)  | vue | 2.6.2  |
|vue-cli-plugin-storybook(0.5.1)  | @storybook/vue | 4.1.11  |
|vue-cli-plugin-storybook(0.5.1)  | @storybook/addon-knobs | 4.1.11  |

## どこに書く？
まずはknobsを有効にするために以下の記載を追加しておきましょう。

```js:config/storybook/config.js
import {addDecorator} from '@storybook/vue'
import {withKnobs} from "@storybook/addon-knobs";

addDecorator(withKnobs);
```

propsとして渡さないとknobsタブからの変更で画面が更新されませんでした。

```js:index.stroybook.js
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue'
import { action } from '@storybook/addon-actions'
import {text} from "@storybook/addon-knobs";

import MyButton from '../components/MyButton.vue'

storiesOf('Button', module)
  .add('with text', () => {
    return {
      components: { MyButton },
      template: `<my-button @click="action">{{buttonText}}</my-button>`,
      methods: { action: action('clicked') },
      props: {
        buttonText: {
          default: text("button", "default"),
        },
      },
    }
  })

```
ベンダープレフィクス(-moz-や-webkit-)がなくなる未来へ。

[『マイクロソフト、企業にInternet Explorerの使用をやめるよう要請。「IEは技術的負債もたらす」』](http://news.livedoor.com/article/detail/15997210/)
なんて記事が話題になりましたね。

フロントエンジニアにとってこれほどうれしいことはありません。
その嬉しさの一旦を説明します。

# ベンダープレフィクスがなくなる未来へ。
> ベンダープレフィックス（接頭辞）とは、ブラウザベンダーが独自の拡張機能を実装したり、草案段階の仕様を先行実装する場合に、 それが拡張機能であることを明示するために付ける識別子のことです。
www.htmq.com/csskihon/603.shtml

つまりブラウザが一つ減ることでベンダープレフィクスも減る。

# Autoprefixerを使おう
Autoprefixerというベンダープレフィクスを自動でつけてくれるプラグインがあります。
これを使わない手はないですね。

しかし、Autoprefixerを使っても
「IEで表示されない」とか、「表示バグってるぞ」とかあったらしい。


**だが、IEは消滅した。**

Autoprefixerを使えば快適CSSライフが待っています。

Autoprefixerの具体的な導入方法は[ここ](https://qiita.com/tonkotsuboy_com/items/377913c51b1ac00deffe
)とかで紹介されていました。

# Nuxt Cliには標準でAutoprefixerがついてる。
Nuxt cliには標準でAutoprefixerが入っていたりしますので、私としてはしばらくうれしい限りです。
間違ってもNuxt標準プロジェクトでwebkitとか書かないように。

# まとめ
cssはなるべく簡潔、簡単に。
【GAS】日報の自動作成

【概要】
GSuiteを用いて、Googleカレンダーから今日の日程を取得し、日報に反映するスクリプトを作成しました。
日報を書く際の、時間削減につながれば幸いです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/320365/c34e0573-1b29-7577-9430-ee05cd628366.png)

https://docs.google.com/spreadsheets/d/e/2PACX-1vR9wSCq08bpSfhR19YZ02pH89YEbf65TVIXtQcbaVgwM71z8bKw1Htm9zenpMJURbqeXC2L3oQZkshU/pubhtml?gid=0&single=true

GASのスクリプトは、以下の通りです。
メールアドレス部分に、自身のアドレスを設定して使用して下さい。

```js:GAS
function CreateDailyReport() {
  
  // 今日の日付を取得
  var today = new Date();
  var date = (today.getMonth() + 1) + "/" + today.getDate()

  // tempのシートを指定
  var tempSheet = SpreadsheetApp.getActive().getSheetByName('temp');
　　　　// tempのシートをactiveシートに設定
  SpreadsheetApp.setActiveSheet(tempSheet);
  // tempシートの複製を作成
  SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet().setName(date);
  // 新規作成したシートを指定
  var newSheet = SpreadsheetApp.getActive().getSheetByName(date);
  // 新規作成したシートをactiveシートに設定
  SpreadsheetApp.setActiveSheet(newSheet);
  // activeなシートを取得
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  // 新規作成したシートを一番左に移動
  activeSheet.moveActiveSheet(0);
  
  // カレンダーから情報を取得
  var cal = CalendarApp.getCalendarById('xxxxxxxx@gmail.com');// 自分のメールアドレスを指定
  var events = cal.getEventsForDay(today); // 本日の日付を指定
 
  for
    (var i=0; i<events.length; i++){ // 繰り返す回数は予定の個数分
      activeSheet.getRange('A'+(i+3)).setValue(events[i].getStartTime());
      activeSheet.getRange('B'+(i+3)).setValue(events[i].getEndTime());
      activeSheet.getRange('C'+(i+3)).setValue(events[i].getTitle());
  }
}

// 関数を実行するメニューを追加
function addMenu() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('GAS');
  menu.addItem('日報を作成', 'CreateDailyReport');
  menu.addToUi();
}
```

日報の作成ボタンを指定することで、Googleカレンダーから本日の日程をスプレッドシートに反映できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/320365/79eac8af-2eb2-728b-3a68-06664866644d.png)

# まとめ
間違い・指摘等があればコメントお願いします。
pythonの除算｜実数になる場合、整数として出力する場合

pythonでは以下の場合に出力が実数になります。


#割り算の場合
出力は常に実数になります。


```math.py

>>> 10 + 20 * 3 / 4
25.0

```

#式に実数が混じっている場合

```math2.py

>>> 10.0 + 25
35.0  

```

#整数を出力したい場合
整数を出力したい場合は　//　を使用します。
ただし//を使用した場合、式に実数が混じっていれば出力は実数となります。

```math2.py

>>> 10 + 20 * 3 // 4
25
>>> 10 / 2
5.0
>>> 10 // 2
5
>>> 10.0 // 2
5.0
>>> 17 / 3
5.666666666666667
>>>
>>> 17 // 3
5
>>> 17 % 3
2
>>> 5 * 3 + 2
17

```
ChromebookのLinuxにpipをインストールする方法

ChromebookのLinuxターミナルに、pipをインストールしてみました。

```
curl -O https://bootstrap.pypa.io/get-pip.py 
sudo python3 get-pip.py
```
これでインストールできました。ちなみに僕のChromebookではpython3が入っているので、sudo python ではなくsudo python3で動きました。
duで表示されるディレクトリサイズが親ディレクトリと子ディレクトリで一致しない場合

`df` すると普通に危ない感じになっていたので原因を探ろうと `du` します。

```sh
$ pwd
/foo
$ du -sh ./* | sort -hr
823G    ./bar
147G    ./abc
121G    ./def
115G    ./ghi
```

まあ、823GBも使用している `bar` が怪しいですね。ここから見てみます。

```sh
$ cd bar
$ pwd
/foo/bar
$ sudo du -sh ./* | sort -hr
120G ./aaa
18G ./bbb
10G ./ccc
```

**823GB = 120GB + 18GB + 10GB** ………？
何故か一致しません。

## 原因: duは隠しディレクトリのサイズを表示しない

duコマンドは通常、 `.` から始まる隠しファイル・隠しディレクトリのサイズを表示しないため、先程の例において2回目の実行結果では隠しディレクトリのサイズが含まれていません。

以下のようにすれば隠しディレクトリを含めたファイルサイズが表示されます。

```sh
$ du -sh .[^.]*/ ./* | sort -hr    
```
Go#3 ブランク識別子について(_)

#まずは見て！
##実験１

```go:main.go
package main
import "fmt"
func main(){
	numbers := []string{"あ", "い", "う"}
	for _, n := range numbers {
	  fmt.Println(n)
	}
}
```

##結果
<img width="381" alt="q.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/ceb52f6c-a5b2-0044-d487-cd7bd1707c11.png">

##実験２
```go:main.go
package main
import "fmt"
func main(){
	numbers := []string{"あ", "い", "う"}
  //for _, n := range numbers {
	for n := range numbers {
	  fmt.Println(n)
	}
  //}
}
```

##結果２
<img width="394" alt="e.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/2de51bf0-af83-d170-74da-857858c759f5.png">

railsで言う所の(key, value)みたいな感じやった。

##考察
keyが優先されるらしい、goでは
[Unity]Windows10のスクリーンキーボードを出す方法


![IMG_4956.JPG](https://qiita-image-store.s3.amazonaws.com/0/213392/d2092d50-442f-f35c-7bd3-a2c77cfc10d1.jpeg)

# 方法
``` C#
#if UNITY_STANDALONE_WIN
            System.Diagnostics.Process.Start("osk.exe");
#endif
```

# 仕様
* タブレットモードがONの時のみ出現する
* キーボードが接続されている場合は出現しない