OmniAICreator/Qiita-1.07M huggingface dataset:
javascript配列操作メモ

**javascriptメモ**
毎回ググるなら自分でメモっておけばいいじゃない

#配列をある条件でフィルターする
[filter メソッド（MDN）](https://msdn.microsoft.com/ja-jp/library/ff679973.aspx)

配列の1要素を引数にとり、真偽値を返すコールバックメソッドを引数で渡すことで、trueを返した要素のみで構成された配列を返却するメソッド。
以下の例だと、type=1のフルーツだけにフィルタする。

```filter.js

    var ary = [
      { type: 1, name: 'りんご' },
      { type: 2, name: 'ぎゅうにく' },
      { type: 1, name: 'みかん' },
      { type: 3, name: 'きゃべつ' },
      { type: 1, name: 'どりあん' }
    ]

    var fruit = ary.filter((el) => {
      return el.type === 1
    })

    console.log(fruit)
```

#配列にある要素が存在するか判別する
[some メソッド（MDN）](https://msdn.microsoft.com/ja-jp/library/ff679978.aspx)

配列の1要素を引数にとり、真偽値を返すコールバックメソッドを引数で渡すことで、trueを返す要素があるかどうかを真偽値で返却するメソッド。
配列の中でエラーフラグの立っているヤツはいるかな？とかを判定するのに使用するイメージ。
trueを返す要素があるとそこで探査が止まるので、ついでで全体に処理をしようとか考えてはいけない。

```some.js

    var ary = [
      { type: 1, name: 'りんご' },
      { type: 2, name: 'ぎゅうにく' },
      { type: 1, name: 'みかん' },
      { type: 3, name: 'きゃべつ' },
      { type: 1, name: 'どりあん' }
    ]

    var isGyu = ary.some((el) => {
      return el.name === 'ぎゅうにく'
    })

    var isButa = ary.some((el) => {
      return el.name === 'ぶたにく'
    })

    console.log(isGyu)  // true
    console.log(isButa) // false
```

#for each で処理する
[forEach メソッド（MDN）](https://msdn.microsoft.com/ja-jp/library/ff679980.aspx)

配列の1要素を引数にとるコールバックメソッドを引数に渡すことで、配列の各要素にたいしてコールバックで処理をする。
他の言語でよくあるfor eachだと、配列やリストの一要素が変数に代入されてループ内のブロックで処理するけれど、それがメソッドになっているイメージ。この形式もよくあるというか最近のトレンド？
コールバックメソッドは引数を3こまで指定できる。先頭から、配列の要素、インデックス、元の配列が渡される。やろうと思えばコールバックメソッドで配列の要素数を増減できそうだけど、やらないほうが吉だと思う。

```forEach.js

    var ary = [
      { type: 1, name: 'りんご' },
      { type: 2, name: 'ぎゅうにく' },
      { type: 1, name: 'みかん' },
      { type: 3, name: 'きゃべつ' },
      { type: 1, name: 'どりあん' },
    ]

    ary.forEach((el) => {
      el.name = el.name + ' おいしい'
    })

    ary.forEach((el, index) => {
      console.log(index + ':' + el.name)
    })
```
エンジニア採用を通じて学んだこと

## この記事は

[Engineering Manager vol.2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/em2)5日目を担当してみます！ヨシナガです。

エンジニアリングマネジャーにとって、エンジニア採用は超重要な仕事です。ただ、採用プロセスに関わると、

- 急に差し込まれる面接の予定 :calendar: 
- 山積みになる書類選考 :books: 
- 真面目に書くと大変なスカウトメール :e-mail: 

のような業務に圧倒されてしまいます。そんな中で内定承諾されない状態が続くと、へこたれてしまうこともあるのではないでしょうか？

この記事は、エンジニア採用に関わる人に向けて、採用に関わるとこんな学びがあるよ！ということを紹介したいと思います。

## 想定読者
- エンジニアの採用プロセスに携わっているエンジニア、エンジニアリングマネジャー
- （エンジニアに採用に協力してほしい）人事・採用担当

## 前提

私が経験した採用業務は、基本的には以下の選考プロセスでした。

1. 書類選考
2. 一次面接（面接官2名）
3. 二次面接（面接官2名）
4. 最終面接（社長による面接）

一次面接の前にカジュアル面談が入る場合もあります。カジュアル面談は選考するというより会社を紹介してお互いのマッチングを見極めるために行います。
私が主に担当していたのは書類選考から一次面接のプロセスでした。

一次面接は、だいたい以下の流れで実施していました。
- あいさつ
- 候補者の自己紹介(~5分)
- 候補者への質問タイム(~15分）
- 会社、募集しているポジションの紹介（~15分）
- 技術的なスキルチェックのための質問(~15分)
- 質疑応答（~10分）

ここからが採用を通じて学んだことの紹介です！

## 会社のブランディングに対する理解
一次の面接官は、採用候補者にとっては初めて会う自社の人、というケースがほとんどです（有名人、有名企業でもない限り）。一次面接が会社の第一印象を決めるといっても過言ではありません。もちろんこちらが選考するという観点もあるのですが、会社も選ばれる立場であるという自覚を持って面接に臨むようにしていました。これは会社のブランディングの一部を担当している、ということになると思います。
また、技術コミュニティの登壇やスポンサーをきっかけに会社のことをすでに知っていたという候補者と出会うことがあり、そういう時は素直に嬉しいものです。今では会社を知ったきっかけを候補者の方に必ず聞くようにしており、コミュニティ活動の採用への貢献度を測れるようにしています。


### 会社のミッション/ビジョン/バリューに対する理解
一次面接では自社の説明を行います。その中で欠かせないのが**会社のミッション/ビジョン/バリュー**の説明です。ここの共感がないとそもそもマッチしていない可能性が高いですので、必ず説明するようにしていました。
これを面接のたびに毎回やっていると、私自身の会社のミッション理解度も徐々に深まってくる、ということを体験しました。面接を担当することで、口に出して何度も繰り返す、ということが自然にできていたからだと思います。困難に陥った時に立ち戻るポイントが会社のミッションですので、それを自分なりに腹落ちして理解できるということは、マネジメントにおいても助けになるのではないでしょうか。

### コミュニケーションスキルが向上する
面接では、初対面の人に対して質問する、ということを繰り返します。数ある企業の中でせっかく自社に興味を持っていただいたわけですから、何かしらその人の良さや特徴を引き出したい、と考えていました。この考えのもとで面接を続けてきたことにより、自分自身の**傾聴する力**が鍛えられました。この力は1on1などでも活かすことができました。
また、選考の結果を出す時に、その理由を言語化・文章化するプロセスが発生します。たった一時間しか会っていない人の評価をするなんておこがましいと思いつつ、面接の記憶が新しいうちに評価申し送りを書いていました。これを繰り返していることで気づいたことは、人を評価するときには自分の信念と向き合うことで結論を出している、ということでした。時には厳しいことをメンバーに伝えなければならないのがマネジメントのしんどい部分ではありますが、信念の確認を定期的にできていたことで日和らずにフィードバックできていたように思います。

### 人事・採用担当にエンジニア文化を伝えられる
採用活動は、人事・採用担当との連携が欠かせません。私の場合は、スケジュールの調整やスカウトメールの清書など、多くのことを手助けしてもらっていました。このように仕事を連携して進めていく中で、エンジニアの考え方や文化が浸透したように感じました。採用のタスク管理にはGitLabのイシューを使っていますし、Slackの活用方法も自然と広まっていきました。新規の技術カンファレンスになにか関わってみたい、といったときに、それを後押ししてくれるようになりました。

## おわりに
私が採用を通して学んだこと、実感したことを整理してみました。正直な話、自分は人と話すのが苦手なタイプなんですが、採用活動を続けたことで変化できたこともあるように思います。それに、採用の結果、入社した人が活躍するのを見るのは他では得られない喜びで、採用に関わった人へのご褒美なのだと思います。採用はエキサイティング :muscle: がんばっていきまっしょー :exclamation:
Rでtensor train decomposition してみた

#はじめに
Tensor train decomposition という[テンソル分解](https://ja.wikipedia.org/wiki/テンソル分解)の手法があります。あまりメジャーじゃないのかRで実装されている例をみないので作ってみました。


#テンソルトレイン分解
```TT.R
TT <- function(x,r)
{
D <- dim(x)
n<- length(D)
LIST <- rep(list(NA),n)
for (i in c(1:(n-1)))
{
if (i==1) {l0 <- 1} else {l0<- r[i-1]}
l1 <- r[i]
dim(x) <- c(D[i]*l0,prod(D[(i+1):n]))
SVD <- svd(x)
LIST[[i]] <- SVD$u[,1:l1]
dim(LIST[[i]]) <- c(l0,D[i],l1)
x<- t(SVD$u[,1:l1]) %*% x
}
LIST[[n]] <- t(x)
dim(LIST[[1]]) <- c(D[1],r[1])
return(LIST)
}
```
#実行例
使い方は簡単です。テンソル$\mathcal{Z} \in \mathbb{R}^{N_1 \times N_2 \times \cdots \times N_m}$であるとします。 
$r= (R_1, R_2, \cdots , R_{m-1})$を用意します。$R_i$はテンソル分解の次元をあたえる整数列です。
以下は$\mathcal{Z} \in \mathbb{R}^{3 \times 4 \times 5}, R_1=2,R_2=3$の場合の実行例です。

```R
> set.seed(0)
> Z <- array(rnorm(3*4*5),c(3,4,5))
> dim(Z)
[1] 3 4 5
> r <- c(2,3)
> LIST <- TT(Z,r)
> LIST
[[1]]
           [,1]       [,2]
[1,] 0.33405782  0.4717883
[2,] 0.94144541 -0.1250656
[3,] 0.04567177 -0.8727969

[[2]]
, , 1

            [,1]        [,2]        [,3]       [,4]
[1,] -0.02676980  0.68746071  0.02735584 -0.6839789
[2,]  0.08867982 -0.08374744 -0.04396587  0.2032114

, , 2

            [,1]     [,2]       [,3]      [,4]
[1,] 0.005461026 0.161148  0.1228488 0.3503506
[2,] 0.094666990 0.485986 -0.2761150 0.7174820

, , 3

           [,1]       [,2]       [,3]       [,4]
[1,] 0.06102372 -0.3423556  0.6592200 -0.1576585
[2,] 0.41660602 -0.3899808 -0.2696078  0.1459710


[[3]]
           [,1]       [,2]       [,3]
[1,] -0.3594280  2.7946508 -1.4622505
[2,] -0.3689526 -0.3154154 -1.3315321
[3,] -1.7488794 -1.4190110 -0.6076388
[4,]  1.9922802 -2.1448302 -1.2577524
[5,]  3.2735897  0.8185284  0.1302124

> dim(LIST[[1]])
[1] 3 2
> dim(LIST[[2]])
[1] 2 4 3
> dim(LIST[[3]])
[1] 5 3


````
これだけです。テンソルトレイン分解は
$$
z_{i_1i_2,\cdots,i_m} \sim \sum_{r_1=1}^{R_1} \sum_{r_2=1}^{R_2} \cdots \sum_{r_{m-1}=1}^{R_{m-1}} G(i_1,r_1) G(r_1,i_2,r_2) \cdots G(r_{m-2},i_{m-1},r_{m-1}) G(i_m,r_{m-1})  
$$
という分解をします。$G(i_1,r_1) \in \mathbb{R}^{N_1 \times R_1},G(i_m,r_{m-1}) \in \mathbb{R}^{N_m \times R_{m-1}}, G(r_{k-1}, i_k, r_k) \in \mathbb{R}^{R_{k-1} \times N_k \times R_k}$です。
この実行例ではLIST[[1]]に$G(i_1,r_1) \in \mathbb{R}^{N_1 \times R_1}$が、LIST[[2]]に$G(r_1,i_2,r_2) \in \mathbb{R}^{R_1 \times N_2 \times R_2}$が、LIST[[3]]に$G(i_3,r_2) \in \mathbb{R}^{N_3 \times R_2}$が、それぞれ入っています。

#参考文献
SIAM J. Sci. Comput., 33(5), 2295–2317. (23 pages)
Tensor-Train Decomposition
I. V. Oseledets
https://doi.org/10.1137/090752286
UI > C++ Builder XE4 > プロパティposition > マルチモニタでの実行時 > poDesktopCenter: モニタにわたって表示 | poScreenCenter: 一つのモニタの中央に表示

```txt:動作環境
C++ Builder XE4
モニタ(二台)
  Full HD(左) + WQHD(右)
```

複数のモニタを使った環境でのソフト動作（以下、マルチモニタとする）。

その時にプロパティposistionをどう設定するか。

実動作で確認してみた。
Full HD(左) + WQHD(右)にて実施。

- poDesktopCenter: モニタにわたって表示 
- poScreenCenter: 一つのモニタの中央に表示

### 公式ドキュメント

- [Vcl.Forms.TPosition](http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.Forms.TPosition)
    - poScreenCenter
        - The form remains the size you left it at design time, but is positioned in the center of the screen. Note that in multi-monitor applications, this may result in a form that does not fall entirely on one monitor.
            - 英語力弱いので、does not fall entirely on one monitorの意味（と実動作との乖離）が分からない。。。
            - 縦に長いフォームの場合、poScreenCenterで表示すると下側がはみ出る。does not fall entirely on one monitorとはそういうことだろうか?
                - **具体的な画像例がないので、意味が分からない公式ヘルプ**
JavaScript {} === {} の出力は false

この記事は [ShoTime Advent Calendar 2018](https://qiita.com/advent-calendar/2018/shotime) の 4 日目の記事です。


Chrome のコンソールに次のコードを打ち込んでみると、`false` が出力されます。

```js
{} === {}
```

この理由を掴むために、JavaScript における値の型について追っていきます。
（変数の型ではありません）


## プリミティブ型とオブジェクト
JavaScript においてデータ（値）は**プリミティブ(primitive)** ※1 か**オブジェクト(object)**の２つに分けられます。

**プリミティブ**は値が不変な型で、**オブジェクト**は値を変更できる型です。
プリミティブには次の６種類があります。

- 数値(Number)
- 文字列(String)
- 論理値(Boolean)
- null
- undefined
- シンボル(Symbol)

この6種類のプリミティブ以外は、オブジェクトです。
ここでいう**不変**とは、変数の内容を変更できないという意味ではないので注意が必要です。

```js
// 変数 hoge へプリミティブな値 `"Hello"` を代入
let hoge = "Hello";
// 変数 hoge へプリミティブな値 `"World"` を代入
hoge = "World";
```

プリミティブな値 `"Hello"` と `"World"` が存在し、変数 `hoge` は、最初に `"Hello"` が代入され、次に `"World"` が代入されています。`"Hello"` と `"World"` は別の文字列であるのがポイントです。

数値 `0` は `0` であって、 `1` ではない。というのがプリミティブです。

### 比較について
プリミティブは**値**で比較するのに対して、オブジェクトは**参照**で比較します。そのため、オブジェクトのことを**参照型**と呼ぶこともあります。

```js
let x = []; // 空の配列を変数 x へ代入（参照を代入）
let y = x; // 変数 y へ変数 x と同じ参照を代入
y[0] = 10;
console.log(x[0]); // 10
console.log(x === y); // true
```

上記例では、変数 `y` が参照しているのが `[10]` であることは分かりますが、変数 `x` も同じ `[10]` を参照しているのがポイントです。

## タイトルの `{} === {}` について
`{}` というコードは、新しい**オブジェクトリテラル** ※2 を生成しています。つまり左側の `{}` と、右側の `{}` で別々の参照が作成されています。参照が別々であるということは、`falsy` な値であるため ※3 、`false` と評価し出力されます。

## まとめ
非常にざっくりではありますが、JavaScript の値の型プリミティブとオブジェクトについて整理してみました。[ShoTime（目標達成シート）](https://shotime.now.sh/)でも Vue.js の computed や、Vuex の getters を利用しているため、この点について気をつけながらコードを書いています。

## 参照

- [O'Reilly  初めてのJavaScript第版 ES2015以降の最新ウェブ開発](https://www.oreilly.co.jp/books/9784873117836/)
- [O'Reilly  JavaScript第6版](https://www.oreilly.co.jp/books/9784873115733/)
- [JavaScriptの入門書](https://asciidwango.github.io/js-primer/basic/data-type/)
- [MDN JavaScript のデータ型とデータ構造
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures)

 
## 注意書き

※1 **プリミティブ** のことを、[JavaScript第6版](https://www.oreilly.co.jp/books/9784873115733/)では、 **基本型** と紹介されています
※2 オブジェクトリテラルについて詳しくはこちら [JavaScriptの入門書](https://asciidwango.github.io/js-primer/basic/data-type/#object)
※3 真とみなされる値を truthy、偽とみなされる値を falsy を言います
G Suite（旧Google Apps）なしでは業務が回らない私の一日

#想定読者

・G Suiteって最近よく聞くけど、実際にどんな業務で使っているのかを知りたい方
・今日は忘年会だし、簡単な記事をサラッと読みたい方


#自己紹介

ランスタッドのIT部に所属。現場経験を活かして新システムの要件定義や導入時のトレーニング、
リリース後のユーザーサポートなどを担当していますが、IT出身ではないため技術的なことは
全然わかりません。。IT部の勤務地は東京と東京以外にあり、私は東京、上司と3人のチームメンバーは
東京以外　と離れての勤務。子持ちのため時短勤務中。


#はじめに
みなさんの会社では社内のコミュニケーションやスケジュール管理にどのようなシステムを使用されていますか？
私の会社では2013年からG Suite（旧Google Apps）の使用を始めています。
切替当初こそ、OutlookやWord、Excelの方が長年慣れ親しんできた分、使いやすいと思っていましたが
今ではG Suite（旧Google Apps）なくして業務が回らなくなっています。

そんな私のとある一日をご紹介します！


#タイムスケジュール
###7:00　＠home　勤怠連絡　![CHAT.png](https://qiita-image-store.s3.amazonaws.com/0/315376/00016838-4201-bf8f-bba2-8fa21f9005fd.png)

子供の咳が昨日より悪化している:scream::scream::scream:
病院に連れて行ってから出社したい。
所属するIT部では、メンバー全員が参加している勤怠報告用のCHATグループがあるので
そこに出社時間変更のチャットを投稿。別のオフィスにいる上司やチームメンバーにも、
同じオフィスにいる同僚にも一度に伝えられて便利！
###8:30　＠通勤中　メール確認　![Gmail.png](https://qiita-image-store.s3.amazonaws.com/0/315376/0aae6756-9091-784c-cdee-5f1b9874c49b.png)

未読メールを確認し、今日やることの優先順位を頭で整理

###9:30　＠office　マニュアル作成　![サイトスプレッドスライド.png](https://qiita-image-store.s3.amazonaws.com/0/315376/34f6c045-9469-79ab-faec-e25b5541ab9f.png)



サイトを使用して業務マニュアルの作成。ITの専門知識が無くても簡単にウェブサイトを作ることができます！
マニュアル内に挿入する表や図はスプレッドシート（Excelに代わるもの）やスライド（PowerPointに代わるもの）で作成。
こうしておくと内容が変わっても大元のスプレッドシートやスライドを変更すれば自動的にマニュアルに
反映されるので、漏れがなくて安心。
作業も共同で進められるので効率的なんです。

###11:00　＠office　会議召集　![カレンダー.png](https://qiita-image-store.s3.amazonaws.com/0/315376/07e9f846-90f5-7817-1508-c2ec4f543b66.png)

部署や勤務地が異なるメンバーのスケジュールもひと目でわかり、招待メールも送れて、
参加の有無も確認できるので調整に時間を取られずストレスフリー！

###13:30　＠office　チームミーティング　![スライドハングアウト＆.png](https://qiita-image-store.s3.amazonaws.com/0/315376/f41d52d9-13af-bebd-7351-e79c99ae0f09.png)


東京以外にいる上司＆メンバーとハングアウトMeetで実施。事前に入力した活動報告のスライドを使って。
顔も見られるし、資料も画面共有できるし、物理的な距離は感じません！

###14:30　＠office　アンケートフォーム作成　![フォーム.png](https://qiita-image-store.s3.amazonaws.com/0/315376/c07201f9-020b-5749-36da-8aaede360bdb.png)

明日実施するシステム研修の参加者に実施後アンケートをとるためアンケートフォームを作成。
質問形式も、テキスト、チェックボックス、ラジオボタンなど自由に組み合わせられ、
集計もスプレッドシートで簡単！

###16:00　＠office　コミュニティ発信　![コミュニティ.png](https://qiita-image-store.s3.amazonaws.com/0/315376/1bb6e0c6-5a18-50d9-6abe-b445ada73883.png)

リリースされたシステムの新機能を社員に周知すべく、Google+で作ったITコミュニティから
リリース案内を発信。このコミュニティにはほとんどの社員が参加しており、メールで通知も行くため、
社内ポータル等で周知するより多くの社員の目に触れることが可能。

###17:00　＠通勤中　耳だけミーティングに参加　![Meet無題.png](https://qiita-image-store.s3.amazonaws.com/0/315376/6bfb4f1a-2f52-0bfd-571d-53c2ada64e9a.png)

時短勤務終了後にセッティングされたミーティングで、内容を把握しておきたいものについては、
電車の中でハングアウトを繋いで耳だけ参加。
移動中なので発言はできないけれど、後から情報共有してもらう時間と手間が省けてGood！
但し、発言する必要があるミーティングは残業or自宅から入るか、時間をずらしてもらいますが・・・。

#まとめ
ご覧いただいたように、私の一日は始業～終業までGoogleの各種アプリで溢れています。
もうGoogleなしの頃には戻れません。

日々使っていて改めて思うのは、一連の業務が流れるように進むからとても便利だということ。
例えば、何かのミーティングを行う場合、

事前に資料をスプレッドシートで作成
　⇒参加者にだけ編集権限を付与
　　⇒カレンダーでミーティングを設定
　　　⇒作成した資料をカレンダーに添付
　　　　⇒招待メールを送信
　　　　　⇒当日はカレンダーからビデオ会議に切替
　　　　　　⇒ミーティングしながらスプレッドシート資料を参加者が同時に編集

といったようにGoogle内で完結することが可能です。
さすが、「仕事に必要なものすべてが 1 つのスイートに」と謳うだけありますね。

これからもG Suite（旧Google Apps）を効果的に使いこなし、有効な活用方法は社内で積極的に
共有していけたらと思っているところです。
Linuxでインターネットに接続しているIPアドレスを調べるワンライナー

`ifconfig` や `ip address` だとループバックなど複数のネットワークインタフェースの情報が表示されるので、そのうちのどれがインターネットに接続しているものなのかを特定するのがちょっと面倒。

いろいろ調べた結果、以下のようにするのがよさそう。

```
ip route get 8.8.8.8 | head -1 | awk '{print $7}'
```

補足

```
$ ip route get 8.8.8.8
8.8.8.8 via 192.168.11.1 dev enp0s31f6 src 192.168.11.105 uid 1000 
    cache 
```

これで`8.8.8.8` につながるときの経路のIPアドレスがわかる。
複数ある場合があるので、`head -1` で最初のひとつに絞る。
awkで7番目のフィールドだけ取り出す。
IBM Cloudのコンソールアップデートに伴うアカウント周りの変更について

#背景
昨日、IBM Cloudの管理コンソール画面が刷新されたことを受けて、アカウントアクセス権限周りで追加機能があったため、記載する。
新しいコンソール
https://cloud.ibm.com/

#IAM
大きく変わった点はここだと思う。今までIBM Cloudでは、リソース・グループとCloud Foundryサービスは別々のアクセス管理をしなければならず、Cloud Foundryサービスはアクセスグループ単位に権限を付与することが出来なかった。しかし、リソースグループにCloud Foundryサービスを含めることができるようになったことでアクセスグループ単位で管理できるように模様？（現在は移行期間のため、まだ検証できていない。）。ちなみに、リソース・グループとは、アカウント制御や課金状況を把握しやすくするためにユーザーが使用しているリソースをグルーピングする機能である。
これを行うには、マイグレーションをする必要がある。マイグレーションは、<img width="20" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/284877/97d40522-e6d5-9048-ca78-e5f4c85c1747.png">のマークがダッシュボード上のサービス横に表示されると実施できるようだが12/5現在私のアカウントはまだマイグレーションできないようだ。

詳細は以下を参考にしてほしい。
https://console.bluemix.net/docs/resources/instance_migration.html#migrate

概念は以下のようになる。
<img width="440" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/284877/20367596-3013-16db-016b-f20909ac06e3.png">

#タグ

タグ付け機能を使うことで、サービスのfilterが可能になった。タグ付けは非常に簡単でサービスプロビジョニング時または、サービス作成後ダッシュボード追加可能。（検証してみたが一部タグ付けができない時もあるよう（バグ？）。まだできたばかりの機能だからかな。。）

詳細
https://cloud.ibm.com/docs/resources/tagging_resources.html?locale=ja

以下のようにタグ列にkey:valueのタグを付与することができる。
<img width="794" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/284877/45b12e08-700f-2fa2-b85a-960c1f574b9e.png">

検索するときはダッシュボードの検索バーかフィルタリングを使用する。
以下は検索バーを使用したとき。（tag:としなくても、envでも引っかかる。）
<img width="898" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/284877/6e22333c-a397-4b90-dc64-e30602fa1997.png">



#感想
今まで、IBM Cloudのコンソールはインフラストラクチャーサービス(旧Softlayer)とIBM Cloud(旧bulemix)と別れていたが、今回のアップデートで統合されたようだ。サポート機能なども一元化されたようで、ようやく、他のpublicクラウドベンダーなみの機能が揃ってきたのかなー。引き続き、検証してみます。
JavaScriptで画像をダウンロードしたい

JSで画像をダウンロードするのに色々調べたので備忘録です。
間違った点などあればご教授いただければ幸いです。

尚、こちらはChrome、Firefox、IE11で動作確認してます。
※Safariについては未検証です。

#download属性を使えばできるらしい

下記のように、aタグにdownload属性を付与して記述すれば
ファイルをダウンロードさせることが出来ます。 

```html
<a href="/path/img/file.png" download="file.png">Image Download</a>
```

これだけで、画像がダウンロードできるようになります。

めっちゃ簡単。

#ブラウザの対応
しかし、[download属性のブラウザ実装状況][a_download] を見ると、、、

**`Internet Explorer : なし`**

でた。IE。
本当に嫌いです。

実際にやってみると、IEではダウンロードが実行されず
そのままページ遷移して画像が表示されてしまいました…。

#どうやったらIEでも動くようになるのか
どうやら、navigatorオブジェクトに用意されている
`msSaveBlob(blob, fileName)` または `msSaveOrOpenBlob(blob, fileName)` 
というメソッドを使えばいいらしいです。

※この２つの違いについては、[こちら][msSaveBlob] で詳しく説明されているので参考までにどうぞ。

実際にやってみると

```html:HTML側
<a onclick="downloadImg();">画像ダウンロード</a>
```

```js:JavaScript側
function downloadImg () {
    const fileName = 'file.png';
    const uri = '/path/img/file.png';

    let xhr = new XMLHttpRequest();
    xhr.open('GET', uri);
    xhr.responseType = 'blob';
    xhr.onloadend = () => {
        if (xhr.status !== 200) {
            return false;
        }
        window.navigator.msSaveOrOpenBlob(xhr.response, fileName);
    };
    xhr.send();
}
```

こんな感じになります。

`Blob` と `navigator.msSaveOrOpenBlob` を使ってファイルをローカルに保存するのを利用できるのは
IEだけで、分岐にも使えそうです。

(しかし、IE9以下は `Blob` が使えないため対応してません。)


#まとめると
こんな感じになりました。

```html:HTML側
<a id="download" href="#" onclick="downloadImg();">画像ダウンロード</a>
```

```js:JavaScript側
function downloadImg () {
    const fileName = 'file.png';
    vonst uri = '/path/img/file.png';

    // IEはdownload属性が効かないので分岐
    if (window.navigator.msSaveOrOpenBlob) {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', uri);
        xhr.responseType = 'blob';
        xhr.onloadend = () => {
            if (xhr.status !== 200) {
                return false;
            }
            window.navigator.msSaveOrOpenBlob(xhr.response, fileName);
        };
        xhr.send();
    } else {
        let link = document.getElementById('download');
        link.href = uri;
        link.download = fileName;
    }
}
```

#気になったこと
`new Blob(データ, ファイルタイプ);` みたいにBlobオブジェクトを生成した方がいいのか
今回のように、`XMLHttpRequest` を使った方がいいのか
調べましたがよく分からなかったので、
詳しい方いらっしゃいましたらご教授頂けると幸いです。

#参考
[download属性のブラウザ実装状況][a_download]
[IEのためにa要素のdownload属性を代替する][ie_download]
[IE11にはファイルをローカルに保存するJavaScriptのAPIが2種類用意されている - Qiita][msSaveBlob]

[ie_download]:http://webkatu.com/a-download-on-ie/
[a_download]:https://developer.mozilla.org/ja/docs/Web/HTML/Element/a#Browser_compatibility
[msSaveBlob]:https://qiita.com/neko_the_shadow/items/a71d164413cc1dce3060
deniteのgrepにVisualModeの力を授ける

## denite.nvimとは
fzfとかのファインダーみたいなやつです。
様々な操作のインターフェースを提供、拡張ができるようになっており、
なんでも置き換えることができる黒魔術に似たなにかだと思っています。
![denite.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/ec29f596-94b0-dc1b-b303-adbe43d3f11a.gif "denite-demo")


## grepをより便利に
gif内でgrepのデモしていますが、
今回は、Visualモードで選択した文字列をdenite使ってgrepできるようにします。

## 選択文字列を取得し、deniteへ
グーグル先生に聞いてみると
https://stackoverflow.com/questions/1533565/how-to-get-visually-selected-text-in-vimscript
が見つかりました。

```vimscript
getline("'<")[getpos("'<")[2] - 1:getpos("'>")[2] - 1]
```

とりあえず、関数化します。

```vimscript
function! g:GetVisualWord() abort
  let word = getline("'<")[getpos("'<")[2] - 1:getpos("'>")[2] - 1]
  return word
endfunction

```

Visualモードの時のみ、実行したいのでマッピング

```vimscript
xnoremap <silent> <SPACE>fg :Denite grep:::`GetVisualWord()`<CR>
" Space file grepって感じのマッピング
```

ただ、メタ文字とか入ると、正しいgrepされません。（grep個人差によります）
必要そうなそこらへんの文字をエスケープする関数を新たに作成。

```vimscript
function! g:GetVisualWordEscape() abort
  let word = substitute(GetVisualWord(), '\\', '\\\\', 'g')
  let word = substitute(word, '[.?*+^$|()[\]]', '\\\0', 'g')
  return word
endfunction
```

```vimscript
xnoremap <silent> <SPACE>fg :Denite grep:::`GetVisualWordEscape()`<CR>
" エスケープバージョンに変更
```

これで、こうなります。
`Dente file`のgrepと、`get(g`のgrepができていますね！
![denite-visual.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/6fcccdcb-61d8-e2db-a83b-a793322872b2.gif "denite-visual-demo")

コピーしてペして検索っていう手間がなくなって楽になりました！


## 大雑把に処理を確認
例えば、`aiueo`文字列があり、`iue`を選択した状態と仮定します。

```vimscript
01234 " 添字
12345 " 列番号
aiueo " 文字
 < >  " 選択文字: iue
```

一つずつ処理結果を見ていきます。

```vimscript

" 1.選択している行の文字列を取得
getline("'<")
" Output: aiueo

" 2.選択文字列の初めの文字位置を取得
getpos("'<")[2]
" Output: 2

" 3.選択文字列の最後の文字位置を取得
getpos("'>")[2]
" Output: 4

" 4.開始位置と終了位置の添字を取得
getpos("'<")[2] - 1
" Output: 1
getpos("'>")[2] - 1
" Output: 3

" 5.上記を合わせて、選択文字を取得
" getline("'<")[1:3]
getline("'<")[getpos("'<")[2] - 1:getpos("'>")[2] - 1]
" Output: iue
```

## ポイント部分の確認

### `'<`と`'>`
`'<`は、最後に選択された、初めの行や文字を意味します。
逆に、`'>`は、最後に選択された、最後の行や文字を意味しています。
試しに、どこか選択したあと、ノーマルモードで、`'<`実行したら、選択した初めの行に飛びます。

### `getpos`
つまり、`getline("'<")`は、初めの選択行の文字列を出力しています。


`getpos`は、`[bufnum, lnum, col, off]`のリストを返します。
開始文字の位置を知りたいので`col`の2番目が必要ですので`[2]`です。

### Denite grep
`Denite grep:0:1:2`は、位置によってそれぞれに意味があります。（`:h denite-source-grep`で詳しく）

- `0`は、指定のパスでgrep
- `1`は、指定のgrepオプションで実行
- `2`は、指定の文字列でgrep

という役割があるので、`Denite grep:::grep-word`という感じで使います。

## さいごに
選択文字列をgrepという直感的な操作になりました。
この選択文字取得方法だと、マルチバイト対応してないので、今後改良してきたいですね（すでにあるかな？知ってたら教えてください！！）

denite.nvimは非常に便利です！
コア部分は、Pythonで書かれているので、拡張もPythonでできます！（デジャブ）

筆者は、Vimアドベントカレンダー 12日にも参加しており（ただの宣伝）、Gitの差分関係（ブランチ間のコミットログ一覧表示、ブランチ間ファイル一覧表示、差分確認）を操作できるdenite拡張プラグインを紹介する予定ですので、興味持った方は、ぜひぜひチェックお願いします。
Windows10でWindows Updateがうまくできない

Widnows Updateを起動しても、｢更新プログラムをダウンロードしています 0%｣もしくは、｢更新プログラムをダウンロードしています 100%｣の表示がでたままで、かんじんの更新処理に移れません。もちろん｢今すぐインストール｣のボタンも現れません。

実は、Windows10を利用してからこの状態のままで一度もUpdateをしていません。
当初は会社がグループポリシーを設定しているためなのかなと勝ってに思っていたのですがそうではないことが判明。
あわてて原因を調べていたところ以下のサイトを発見。

https://support.microsoft.com/ja-jp/help/4039473/windows-update-stuck-at-0-percent-on-windows

%systemroot%\system32 フォルダーの｢Wuaueng.dll｣のファイルバージョンをチェックしてみると、｢10.0.14393.0｣

上記URLの原因2が該当しているようです。

つまり、Windows Update エージェントである｢Wuaueng.dll｣のバージョンがRTMである｢10.0.14393.0｣であることが
いけないようです。

対応方法として、｢Windows Update エージェントをバージョン 10.0.14393.187 にアップデートします。｣となっているのですが、どうやってバージョン 10.0.14393.187をインストールするのかが不明。

いろいろと探していると、Windows Updateをダウンロードして実行してくれる以下のサイトを発見。
更新に時間はかかりましたが無事終了しました。

https://www.microsoft.com/ja-jp/software-download/windows10%E3%80%80
php-master-changes 2018-12-04

今日はドキュメントの更新があった！

# 2018-12-04
## bukka: Update UPGRADING with info about FPM logging changes
- https://github.com/php/php-src/commit/6493d5489728cc49d70be1d792432574d31c95c2
- [7.3~]
- FPM のログ設定追加を UPGRADING に追記
ログテーブル実装するならパーティションプルーニング

# 参考資料
https://dev.mysql.com/doc/refman/5.6/ja/partitioning-pruning.html

# パーティションプルーニングとは
特定の単位で分離し、対象としない単位をスキャンしないことで、効率的なテーブルスキャンを行うことができる。

# 実例

公式からt1というテーブルを例にとって考えてみましょう。
以下では、t1のregion_codeというカラムの値を64, 128, 192, それ以上という４つパーティションを作っています

```sql

CREATE TABLE t1 (
    fname VARCHAR(50) NOT NULL,
    lname VARCHAR(50) NOT NULL,
    region_code TINYINT UNSIGNED NOT NULL,
    dob DATE NOT NULL
)
PARTITION BY RANGE( region_code ) (
    PARTITION p0 VALUES LESS THAN (64),
    PARTITION p1 VALUES LESS THAN (128),
    PARTITION p2 VALUES LESS THAN (192),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);
```

このt1というテーブルに対して以下のようなSELECT文を実行してみましょう。
このSELECT文で対象となるのはregion_codeが126, 127, 128, 129のデータのみである。
先ほどのパーティションに当てはめると、対象のデータがある可能性のあるパーティションはp1とp2のみであることがわかる。
つまり逆に言えば、p0とp3には存在しないことがわかるため、このSELECT文では、p1, p2のみスキャンを行う

```sql

SELECT fname, lname, region_code, dob
    FROM t1
    WHERE region_code > 125 AND region_code < 130;
```
Web系のDocker民から見たVagrantについて

仮想化、いいですよね。特に色んな環境を1つのマシンで開発してる人は便利だと思います。

そこで、今回はWeb系の視点から、Dockerを主に使っている人がVagrantとの違いに触れながら「なぜDockerを選んでVagrantを使わないのか」ということについて書きたいと思います。

## Docker と Vagrant の違い

さんざんあちこちで書かれていることなのですが、Vagrantはカーネルも含めて仮想機械を自動構築するのに対して、DockerはカーネルなどのOSの共通部分を、ホストのものをそのまま使うという点で違っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152713/e66a595f-26cb-47f5-3225-f7194c2c93ea.png)

すごくざっくりとした絵で厳密さを排しているので、あくまでイメージとして捉えてください。

イメージとしては、

### Docker

* マイクロサービスなイメージ
* 1プロセス1コンテナが基本
* コンテナ同士がやり取りしてサービスを作り上げる

### Vagrant

* 1台のサーバーで運用しているようなイメージ
* LAMPを入れて動かす
* 内部で完結している

という勝手な印象がそれぞれにあります。(実際、こういう使い方が筆者が関わった環境では多かったです)

注意してほしいのが、DockerとVagrantは上のように仮想化したいレイヤーが違うので、Vagrantの上でDocker立てて環境構築、というのは可能です。実際、この手法はホストOSの影響を受けないようにしつつ、Dockerで各プロセスをマイクロサービス化したい場合に使われます(VMによっては不可能な場合もあります)。

# DockerとVagrantを比較した雑感

をつらつらと書いていこうかなと。

## Vagrant重たい

Vagrantは普通のOSを仮想環境上で動かします。当然、間に挟まる層もシミュレーションされるプログラムも増えるので重くなります。実際、`vagrant up`はダウンロード時のサイズがDockerコンテナと比べて大きく、動作も重いです。

それに対し、Dockerは共通部分はできるだけホストOSの機能を使うようにすることでコンテナのサイズを小さくし、素早く起動・削除ができるようになっています。Vagrantより気軽にぽこぽこ立てられるイメージです。

## DockerだとWindowsでつらい

Dockerはカーネル部分をホストOSに依存します。その結果、Windowsではうまく動かない場面がいくつか出てきます(参考: [WindowsとDockerは食い合わせが悪い](https://qiita.com/Hibikine_Kage/items/4b5c0f5f72e4d03b4797))。

それに対し、Vagrantは完全にOSをシミュレーションするのでWindowsとMac間でも大きな修正なく動いたりと、DockerよりはWindowsでうまく動くケースが多かったです。

## Dockerは割と環境を汚す

Docker使えば環境汚さないとかって言いますが、Docker立ち上げるとポート使ったり不要になったコンテナが残りっぱなしになったりと割と環境を汚します。環境をできるだけ汚さないようにしたいのならばVagrantの方に軍配が上がります。

ちなみに、Docker使いながら環境汚したくなければVagrantの上にDockerを立てればいいです。

# さいごに

どちらも用途的にはちょっと違うんですが、仮想化したいという時に用いられるものではあります。下にそれぞれのシチュエーションについて書いてみました。

### Dockerのみを使う

* 素早く簡単に環境を立てたり壊したりしたい
* Vagrantが重くて辛い
* マイクロサービス開発

### Vagrantのみを使う

* オンプレシングルサーバー向けに開発
* いろいろインストールして安定して使える環境がほしい
* ホストOSの影響をできるだけ受けたくない

### DockerとVagrantを併用する

* WindowsやMacなどの複数の環境でマイクロサービスを開発したい

という感じです。まる。
SPA(SinglePageApplication)の天敵document.writeに対抗する　～広告コードは永遠に～

#今回作ったもの
　SPAでページを切り替えず、広告を挿入する
![2018.12.04-17.07_7.gif](https://qiita-image-store.s3.amazonaws.com/0/267629/1b8a7eca-eff2-3c10-9b80-c2e4c818d864.gif)


# document.writeの恐怖

　SPA(SinglePageApplication)においてJavaScriptのコードの中で天敵が存在する。それはdocument.writeだ。SPAはロード済みのページに対して、各箇所の内容を書き換えていくという動きをする。ノードの末尾にHTMLを強制追加するdocument.writeを実行されると、困ったとしか言い様がない状態となる。

　これに対抗する術を考えてみた。そもそもdocument.writeが自分の希望する位置にデータを挿入してくれれば、全ての問題が解決するのだ。ならばそうしよう。

# 広告コード

　document.writeを放り込んでくる相手として、楽天やAmazonの広告プログラムがある。そこで生成されたコードは、ものの見事にdocument.writeを呼び出しており、ページがロードされる段階でコードがその場所に無ければまともに動作しないのだ。
　しかしSPAの普及を望むものとしては、

　**広告が貼れないからSPAなんて使えないじゃん！**

　とかいう流れでSPAの普及が妨げられては困るのだ。

# さくっと解決


```test.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8"/>
<title>SPA広告テスト</title>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded",onLoad);
function onLoad(){
	var button = document.querySelector("button")
	button.addEventListener('click',function(){
		var node = document.querySelector("div")				//広告挿入先
		var code = document.querySelector("textarea").value		//広告コード
		outputAd(node,code);
	})
}
//outputAd(広告を挿入するノード,広告コード)
function outputAd(node,code){
	//document.writeのフック
	var documentWrite = document.write;
	document.write = function(value){
		node.innerHTML = value;
		document.write = documentWrite;
	}
	//ノード内のデータを削除
	while(node.childNodes.length)
		node.removeChild(node.childNodes[0])
	//広告コードをダミーノードに設定
	var dummy = document.createElement('div');
	dummy.innerHTML = code;
	while(dummy.childNodes.length){
		var child =  dummy.childNodes[0];
		dummy.removeChild(child);
		if(child.nodeName === 'SCRIPT'){
			//SCRIPTタグなら再生成
			var script = document.createElement('SCRIPT');
			if(child.src)
				script.src = child.src;
			script.innerHTML = child.innerHTML;
			node.appendChild(script);
		}
		else
			node.appendChild(child);
	}
}
</script>
</head>
<body>
<textarea rows='10' cols="80">広告コードを挿入</textarea><br>
<button>広告の表示</button>
<div style='border:solid'>
ここに広告を表示
</div>
</body>
</html>
```

　実行はhttpかhttps環境下で行わないと正常に動作しない。また、AdSenseのコードを貼り付ける場合は、対象のドメイン上で動かす必要がある。

　動作原理として、まずは広告コードを実行するところから始まる。ただしinnerHTMLでそのままSCRIPTタグが混ざったコードを差し込んでも、HTMLの仕様上動作しないため、SCRIPTタグを作り直すという処理が事前に必要になる。そして広告コード実行後、document.writeによるHTMLの追加が起こるので、それをフックして対象ノードへ転送する。

　今回のコードはAmazon、楽天、AdSenseで動作を確認している。ちなみにAdSenseはdocument.writeを使用しないが、今回のコードで動作する。

　しかしこのコードには致命的な欠点がある。同時に複数の広告の設定を行うと、document.writeのデータの転送先が特定できなくなってしまうのだ。この件でもし何か良い解決方法があったら教えて欲しい。

# 実は
　そもそもこんな回りくどいことをしなくても、IFRAMEを作ってそこへコードを放り込めば動作する。そして複数広告問題も発生しない。しかしそれでは負けた気がするので、今回のコードを作ってみた。

　現在[https://croud.jp/](https://croud.jp/)で広告のテストを行っているが、システムを作った時に広告のことなど考えずに作ったので、フロントエンド側のコードが酷いことになってしまった。ということで機能ごとにプラグインを組み込むようなやり方が出来るように作り直そうと思っている。
最初に覚えて欲しいPythonのロギング

# はじめに

簡単な使い捨てのコードなら`print()`によるログでもいいんですが、Python標準のロギングも決して難しくないので、せっかくだから最初からこれを使いましょう、という話です。


## ライブラリを作る人向けの情報

ライブラリを作る人は、`getLogger()`だけ覚えてください。
引数は文字列ですが何でも良いです。とりあえず今回は`__name__`を入れておきましょう。

```python
import logging

logger = logging.getLogger(__name__)
logger.info('こんにちは！')
```

モジュールで使うなら、こんな感じ。

```python:animals/dog.py
import logging

logger = logging.getLogger(__name__)

class Dog(object):
    def __init__(self, name):
        self.name = name
    def bark(self):
        logger.debug('%s is barking', self.name)
        logger.info('%s: bow!', self.name)
```

ググっていると稀に`getLogger()`せずに、loggingモジュールに直接`info()`等で出力するサンプルを見かけますが、その場合ルートロガーへの出力となってしまいます。
ロガーは階層構造になっており、ルートロガー（階層構造の最上位）に出力してしまうと、後々仕分けなどで面倒なことになってしまいます。

```python
import logging
logging.info('さようなら～')  # これは駄目
```

必ず名前付きロガーを生成してから、出力しましょう。

あと、ログ出力のときにformatを叩いているようなサンプルもありますが、ログを出力しないで済む場面（たとえば出力をINFO以上にしている場合の`debug()`など）でもformatが必ず実行されるため、無駄に遅くなるので注意しましょう。

```python
logger.debug('{}'.format(name))  # NG
logger.debug('%s', name)  # OK!
```


## アプリケーションを作る人向けの情報

アプリケーションというか、実行プログラム本体の方ですね。
`basicConfig()`だけ覚えてください。

```python:main.py
import logging
from animals.dog import Dog

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)

    dog1 = Dog('pochi')
    dog1.bark()  # => 'INFO:animals.dog:pochi: bow!'
```

`basicConfig()`を使って、出力するログのレベル、出力先、フォーマットなどを指定できます。
何もしなければ、WARNING以上を標準エラー出力に垂れ流すだけなので、最悪何もしなくても、そこそこ大丈夫です。

注意すべきなのは、`basicConfig()`の呼び出しは、アプリケションの実行を通じて、最初の１回のみが有効なことです（Python3.8以降は`force`オプションが追加されたので、強制的に設定を上書き出来るようです）。
importして使うファイルの中で`basicConfig()`を呼び出してしまうと、アプリ側でログの設定変更が出来なくなってしまいますので、ライブラリの中で`basicConfig()`は使わないようにしてください。

ロガーは「階層構造」になっていると先に説明しましたが、アプリケーション全体はWARNING以上、animalsは開発中なのでDEBUG、でもDogクラスだけは開発が終わって安定しているのでINFOでログりたい、みたいな場合は以下のように設定できます。

```python
logging.basicConfig(level=logging.WARNING)
logging.getLogger('animals').setLevel(DEBUG)
logging.getLogger('animals.dog').setLevel(INFO)
```

# まとめ

* `getLogger()`だけ覚えてください。
* 設定を変えたくなったら`basicConfig()`を思い出してください。
MEMORYストレージエンジンでMySQLのパフォーマンスをあげよう

# はじめに
MySQLには複数のストレージエンジンが用意されています。
ストレージエンジンはそれぞれ、性質が異なり、メリット・デメリットがあるため用途によって使い分ける必要がありますが、MySQLでは主にInnoDBというストレージエンジンが使われています。

今回はこのストレージエンジンのひとつである「Memoryストレージエンジン」を使ってMySQLのSQLパフォーマンスの改善を行ってみました。

「Memoryストレージエンジン」は、メモリ上にテーブルを展開する形となるため、劇的にパフォーマンスを改善する可能性があります。

# 環境 
- MySQL5.6以上

# ストレージエンジンの設定

テーブル作成の書式は以下のようになります。

```sql:CREATE　TABLE　構文
CREATE TABLE db_name.tbl_name
  (col_name1 data_type1, col_name2 data_type2, ...
) ENGINE=engine_name;
```
最後のストレージエンジンの指定で、「ENGINE=<font color="Red">**MEMORY**</font>」とすれば、MEMORYストレージエンジンでテーブルが生成されます。

# SELECTによる読み込み速度の比較

10000000件のデータに対して、
全件検索（WHERE句なし）で集計（SELECT COUNT(*) FROM 〜）を実施。

| ストレージエンジン|実行速度(sec)|
|:-------------|-------:|
| InnoDB       |   62.31|
| MEMORY       |    2.33|

# INSERTによる書き込み速度の比較

10000000件のデータをINSERT文で登録。

| ストレージエンジン|実行速度(sec)|
|:-------------|-------:|
| InnoDB       |  146.24|
| MEMORY       |    7.10|


# 結果
結果として、読み込みは約３０倍、書き込みは約２０倍の速度で処理することができました。MEMORYストレージエンジンはテーブルデータをメモリ上にもつためIOが速いのは明白です。

以下にMySQLのMEMORYストレージエンジンの特徴をまとめます。

# MEMORYストレージエンジンの特徴

MEMORYストレージエンジンは、格納されたデータがすべてメモリ上に保持されます。
InnoDBでは、データはハードディスクへ書き込まれるため、読み書きのオーバーヘッドが少なくなく、IOが非常に高速になります。
 
ただし以下の注意点があります。

1. DBサーバーが落とされると格納されたデータは消える。（空テーブルのみ残る）

2. ロック制御がテーブルロックのため、並列処理でパフォーマンスが落ちやすい。（InnoDBは行ロック）

3. カラムはすべて固定長に変換されるため、一レコードのバイト数が多くなる。

4. データ型にBLOB、TEXTは使用できない。

5. インデックスは「HASH」がデフォルト。InnoDBは「BTREE」がデフォルト。
変更は可能。「HASH」は場合によって遅くなる可能性あり。

### ※テーブルロック（注意点2）に対する解決案

一時テーブル（CREATE TEMPORARY TEBLE構文）で作成すれば、クライアントごとに別々のテーブルになるため、並列処理の発生を抑えることができます。

```sql:CREATE　TEMPORARY　TABLE　構文
CREATE TEMPORARY TABLE db_name.tbl_name
  (col_name1 data_type1, col_name2 data_type2, ...
) ENGINE=MEMORY;
```

# まとめ
MySQLのストレージエンジンは、テーブルの使用目的に合わせて選択することで、SQLのパフォーマンスを劇的に上げられる可能性があります。
MEMORYストレージエンジンはDBを落としたら消えるなど、デメリットもありますが、プログラム上の構造が変えられないような状況の時の選択肢として、うまく使えば、パフォーマンスチューニングを行う手助けになりそうです。

# 参考
[MySQL5.6リファレンス 第 15 章 代替ストレージエンジン](https://dev.mysql.com/doc/refman/5.6/ja/storage-engines.html)
[MySQL5.6リファレンス 15.3 MEMORY ストレージエンジン](https://dev.mysql.com/doc/refman/5.6/ja/memory-storage-engine.html)
[MySQL5.6リファレンス 8.4.4 MySQL が内部一時テーブルを使用する仕組み]
(https://dev.mysql.com/doc/refman/5.6/ja/internal-temporary-tables.html)
[MySQL5.6リファレンス 13.1.17 CREATE TABLE 構文]
(https://dev.mysql.com/doc/refman/5.6/ja/create-table.html)
Azure AutomationをData Factoryのパイプラインの中で実行する

## はじめに
Azure AutomationのPowerShellでAzure Analysis Services(AAS)を自動更新する方法について [書いた](https://qiita.com/whata/items/99cf9da3ab31e2a65ba9) が、実際に企業のシステムの中で使おうとした場合、業務システムやその他社内外の新しいデータを取得して、データ分析に適したデータのフォーマットや、データウェアハウスのスキーマに合わせた変換を行って最新化したうえで、モデルの更新処理をしなければならない。このため、単純なAzure Automationのスケジュール実行では片手落ちである。

[Data Factory](https://azure.microsoft.com/ja-jp/services/data-factory/) はこれらのデータの抽出・変換・ロードのいわゆるETL処理を含んだ、データのオーケストレーションを自動化し、モニタリングするPaaSである。このData Factoryのパイプライン内のアクティビティとして、Azure Automationを実行できれば上記を満たすことができと考えた。が、、、しかし、Data Factoryのもつアクティビティの中に、Azure Automationは存在しなかった。そのため、Azure AutomationのWebhook機能を使って、Data FactoryのWebアクティビティからRunbookをコールするという形で実装する。

## Webhookの作成

Azure Automationで実行したいRunbookを選び、"Webhook"メニューを選択。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/a4576588-58b5-58ff-9871-338a7756787d.png" width=100%>

Create a new webhook画面で以下のように必要情報を設定する。URL欄に記載されているURLを必ずコピーして、メモ帳かなんかに張り付けておくこと。準備完了したら"OK" > "Create"と進む。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/9f43146f-dd91-eb04-5d16-4b4f74b4509c.png" width=60%>

## Data Factoryのアクティビティ設定

Data Factoryの細かい設定のところはここでは割愛し、Webhookをコールするアクティビティを作成するところをメモとして残す。

Data FactoryのAuthor & Monitorツールから設定を行う。
Webアクティビティは"General"のカテゴリ内に入っている。ここから"Web"をドラッグ&ドロップしてキャンパスに貼り付ける。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144789/3be4b27d-b565-6914-93d6-e9dee6d13313.png)

今回はCopyアクティビティでいろんなところからデータをかき集めてきて、ストレージに保存し、Databricksでデータを変換し、SQL Data Warehouseのデータを更新し、最後にAASのモデルを処理したかったので、一番最後のアクティビティとして、以下のように貼り付けて構成した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144789/d0aedfb6-8d05-8a99-e3a3-beccd8aa545c.png)

Webアクティビティの設定はシンプルで、Generalの部分は変更したのはNameだけ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/ebf029f9-9280-9714-1ebe-55c19d61c176.png" width=60%>

Settingsの部分で、URL欄にAzure Automation RunbookのURLを貼り付け、MethodをPOSTに設定。
Bodyは今回のコールには不要だったのだが、入力しないとData FactoryのConfigのValidationで叱られるので、"body"とだけ入れておいた。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/1139cf14-7474-ebbc-fe35-49a55dc6a42d.png" width=60%>

設定はこれだけで完了となる。あとはパイプラインをPublishして実行し、エラー無く完了&データが正常に更新されていることが確認できればOK。
祝 Flutter1.0 - 1分でわかるFlutter Live '18

現地時間12/4に、googleがロンドンの科学博物館で開催したFlutterのイベント"Flutter Live '18"についてまとめました。
公式サイトは以下となります。

Flutter Live '18
https://developers.google.com/events/flutter-live/

Flutter Live - Flutter Announcements and Updates (Livestream)
https://youtu.be/NQ5HVyqg1Qc

## Flutterとは

イベント冒頭、Flutterの特徴が4つのワードで紹介されました。

### Beautiful
Flutterを使用すると、美しいアプリを作成できます。
Flutterには、iOSとAndroidの両方で"pixel-perfect experience"を提供するウィジェットがフルセットで含まれています。
また、マテリアルデザインの"究極の実現"を可能にします。
### Fast
Flutterは高速です。
Chrome, Androidの基盤となるSkia 2D graphics engineを搭載しています。
FlutterのコードはDartで、1つのコードでiOSとAndroid向けに出力できます。


### Productive
Flutterは生産的です。
ホットリロード機能で、コード変更結果をすぐに確認することができます。
(ユーザー調査では、3倍の生産性向上につながっています！)

### Open
Flutterはオープンです。
FlutterはBSD-style licenseのオープンソースプロジェクトで、また何千ものプラグインがあります。
標準のネイティブビルドツールを使用しているため、ネイティブコード(Kotlin, Swift)へのアクセスも容易です。


## Flutter 1.0

Flutterが念願の1.0になり、その機能が紹介されました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">We just announced the general availability of Flutter 1.0 at <a href="https://twitter.com/hashtag/FlutterLive?src=hash&amp;ref_src=twsrc%5Etfw">#FlutterLive</a>! <br><br>Thank you to all the amazing engineers who made this possible and to our awesome community for their support. <a href="https://t.co/ncrTMBFjex">pic.twitter.com/ncrTMBFjex</a></p>&mdash; Flutter (@flutterio) <a href="https://twitter.com/flutterio/status/1070006597487902722?ref_src=twsrc%5Etfw">2018年12月4日</a></blockquote>


- iOS Pixel Perfect
- Add to existing apps - https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
- Platform View (AndroidView, UiKitView)
  - WebView
  - Google map
- UI localization into 50 language
- Dart 2.1サポート (Smaller, Faster, Cleaner)
- Firebase Plugin

# もろもろ紹介

各社、Flutterに関するSDK／ツール紹介。

### Square
スマホ決済のSquareからReadable SDK / In App Payments SDKの提供。
https://squareup.com/

### Flare
2Dimensions社からアニメーションツールの提供。
https://medium.com/2dimensions/flare-launch-d524067d34d8

### CodeMagic
Nevercode社からFlutterに対応したCI/CDツールの提供。
https://codemagic.io/

# Hummingbird

One More Thing! WebでFlutterを実行可能！
https://medium.com/flutter-io/hummingbird-building-flutter-for-the-web-e687c2a023a8

公式blogで以下のように紹介されています。

> HummingbirdはFlutterランタイムのWebベースの実装で、Dartプラットフォームの機能を利用してネイティブARMコードだけでなくJavaScriptにもコンパイルできます。 これにより、Flutterコードを変更せずに標準ベースのWeb上で実行できます。


# 参考
Google Developer's blog - Flutter 1.0: Google’s Portable UI Toolkit
https://developers.googleblog.com/2018/12/flutter-10-googles-portable-ui-toolkit.html

YouTube Playlist - Flutter Live 2018 - All Talks
https://www.youtube.com/playlist?list=PLOU2XLYxmsILq4ysYNWXq5TOGLgYDJgVD
【ポエム】なぜ Pharo を使うのか？

## 概要
楽しいからさ、ヒャッハー！

# 背景
職業プログラマにとって、主に使う言語を選択することは自分のキャリアデザインの中核を占める問題です。プログラミング言語は自然言語と違ってネイティブは存在しません。みんな、自分の意思で言語を選択して習得します。たとえ仕事の行きがかり上だったり、たまたま友人に勧められたりしても、それを学ぶことは自分の意思で決めたことのはずです。
本ポエマーは、現在は Pharo Smalltalk を主な言語として使っています。もちろん、ここに至るまで、BASIC、アセンブリ、GAME、PASCAL、C、Miranda、Z、VDM、Python、等々、いろいろな言語と出会い、学び、楽しんできました。本ポエムでは、自分がなぜ Pharo Smalltalk を使っているのか、特に検証もなく垂れ流してみます。

## モノを作る楽しさ
本ポエマーは零細町工場のバカ息子として育ったせいか、モノを作るのが好きです。目の前にある材料と、途中まで作ってあるモノを見て、あれこれ押したり回したり触りながら、材料を切ったり接合したりして、モノを作ります。Pharo Smalltalk はまさにそんな感じでプログラミングをさせてくれます。
Pharo Smalltalkの最近のバージョンでは、Playgroundと呼ばれる、昔のSmalltalkでいうところのWorkspaceのようなものが提供されています。Pharo では、モノを切ったり組み立てたりする一連の過程が、1つのPlayground上で進行していきます。あくまで個人の主観的感想ですが、これは従来のWorkspaceよりも「モノをいじってる感」があります。

## 魔法使いになれる
昔から優秀なプログラマのことをウィザード（魔法使い）と呼んだりしますが、ここでいう魔法使いとは、ハリポのアレです。何かのモノやヒトに向かって魔法の呪文を投げると何かが起こるヤツです。
Pharo ではオブジェクトにメッセージを投げます。出来合いの呪文を投げるだけでなく、自分の呪文を創作することもできます。別に伝説的魔術師の息子として生まれる必要はありません。どんどんオレオレ呪文を作って、バンバン使えば良いのです。継承だの多態だの型だの、どーでも良いのです。そんなもん、魔法の呪文の前には児戯も同然なのです。

## ヒャッハーな連中と仲間になれる
Pharoコミュニティにはヒャッハーな連中がいっぱいいます。さすが魔法使い集団です。変なの（褒め言葉）ばっかりです。変化を怖れる気配などありません。To boldly go where no one has gone before です。Smalltalkの歴史の中に閉じこもる気配など全くありません。例えば、ある魔法使いさんは、[Pharoのブートストラップ](https://hal.inria.fr/tel-01251173/document)を確立して、80年代からの秘伝のタレを排水溝に捨ててしまいました。みんな、Smalltalkの壁を破りたくてウズウズしている連中なのです。
英語に自信ない？カンケーナイです。Pharoコミュニティのメンバーのほとんどは英語ネイティブではありません。事実上の開発リーダーも英語ネイティブじゃありません。出身国もロシア、ウクライナ、チェコ、オーストリア、ドイツ、オランダ、ベルギー、フランス、スイス、アルゼンチン、ブラジル、チリ、カメルーン、などなど、多彩です。もちろんイギリスやメリケン出身の英語ネイティブもいます。みんな、なんとなく頑張って英語でコミュニケーションしています。この中に日本語訛りが1人2人混ざったところで、全く問題ないのです。というかむしろ、なぜか日本語を話せる人が何人かいます。

## まとめ
[Pharo Launcher](http://pharo.org/download)でヒャッハー星へGOです。
Scrapbox のやばいUI/UXデザイン – テーマが広がったときの NewPage！ 新規ページ作成&相互リンクが超簡単

# テキストを範囲選択すると New page というのが出てくる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1ed1c208-1381-2b35-1d82-ec124860a3b3.png)

# いきなり New page 生誕！

別のページが誕生する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d09d3729-e381-94c7-9a19-ef6d4ae63d2e.png)
)

- 元ページからのリンクが貼られる
- テキストの1行目がタイトルになっていて、タイトル付けをする必要がない

# 元のページでテキストが削除されている

リンクも生成されている。

子供が誕生したから、母親のお腹からは、子供は卒業しました！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/54fbf125-7f3d-cb8c-a7d4-54942404e54b.png)

# ScraBoxすごい！

- テーマが広がったときの新規ページの分離コストがバカにならないと分かってる！
- ユーザーがうすうす感じていたUIのボトルネックをガツッっと解消してくれている！
- 「テキスト選んで右クリックするってことは、あんたテーマが広がりはったんでっしゃろ？」「賢い子だわぁ、じゃNewPage作りんさい」って分かってる！
- 設計者の人すごい！飲みに行きましょう！

[scrapbox yumainaura - Google Search](https://www.google.co.jp/search?q=scrapbox+yumainaura&oq=scrapbox+yumainaura&aqs=chrome..69i57j69i60l3j69i64.4710j0j7&sourceid=chrome&ie=UTF-8)

# お‥惜しい！

子供を削除すると、親は子供を忘れられない。そうだよね、だって親だもんね。いちど産んだ子供だしね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5c4bcb03-0218-7567-b5b2-7603f0d415e9.png)

# Qiitaに限らず、他のサービスの場合

- 「子供生誕」はユーザーの地道な分離作業により成り立っている
- もう少し医療現場が進んで欲しい感じ









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Scrapboxの優れたUIデザイン – 箇条書きリストが死ぬほど入力しやすくてネストも簡単、markdownよりずっと優れている。

# 日本語で箇条書きリストを作るとき

- 面倒くさくない？
- Markdownと日本語入力って相性悪くない？いまさら？
- もう慣れた？


# QiitaなどのMarkdown

- 英語入力モードに切り替え
- スペース
- 日本語入力モードに切り替え
- 文字入力

多っ！

# Scrapbox

- スペース(日本語入力モードでOK)
- 文字入力

以上。

# 例

ネストも簡単。

- スペースでネストを進める
- バックスペースでネストを戻す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/95f6274f-eb0b-822d-50dd-4f9dbd3625a1.png)

# 箇条書きのリストはユーザーにとって超重要だとﾜｶｯﾃﾙ！

- ユーザーの気持ちを分かってる、最初にハイフン入力する必要さえない
- 「最初にスペース打つってことは箇条書きしたいんやろ？」って分かってる
- 日本語入力とMarkdownの相性の悪さを克服している、いやいや、だってMarkDownじゃないし


[scrapbox yumainaura - Google Search](https://www.google.co.jp/search?q=scrapbox+yumainaura&oq=scrapbox+yumainaura&aqs=chrome..69i57j69i60l3j69i64.4710j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Git小ネタ集（add、commit、push、fetch、pullを覚えた後に読むと便利に感じるはず！）


Gitの小ネタ集です。
add、commit、push、fetch、pull あたりを覚えたあとに見ると便利！と感じたりするかもです。


#リモートトラッキングの追加
`git pull`してもエラーになるときはありませんか？
下の例は、ローカルのmasterブランチにリモートのmasterブランチをpullしようとした例です。

```
$ git branch
* master
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
 
    git pull <remote> <branch>
 
If you wish to set tracking information for this branch you can do so with:
 
    git branch --set-upstream-to=origin/<branch> master
```

pull コマンド(引数なし)は、現在チェックアウトしているローカルブランチに、そのブランチの上流ブランチの内容を取り込みます。
チェックアウトしているmasterブランチに上流ブランチが設定されていないため、エラーとなってしまっています。

以下のコマンドでローカルブランチに上流ブランチが設定されているかどうかを確認できます。

```bash
# ローカルブランチの情報を出力する
$ git branch -vv
* master aaaaaaa commit_msg
  test   aaaaaaa [origin/master] commit_msg
```
`test`ブランチには上流ブランチの`origin/master`が設定されていますが、`master `ブランチには上流ブランチが設定されていません。

pull時のこのエラーを解決する方法は2つあります。

###①pullコマンドに引数を指定する
```bash
$ git remote
origin
$ git pull origin master
```
`pull <RemoteRepository> <branch>`で、pullコマンドを実行することができます。 
ローカルブランチに上流ブランチが設定されていなくてもリモートリポジトリの内容を反映できます。

###②ローカルブランチに上流ブランチを設定する
```bash
$ git branch -u origin/master master
$ git branch -vv
* master aaaaaaa [origin/master] commit_msg
```
上流ブランチを設定したため、`pull`コマンドを引数なしで実行してもエラーなく実行できます。


今までで、「上流ブランチ」という言葉がでてきますが、そもそもこの上流ブランチとは何でしょうか?
すごくわかりやすい記事がありました。こちらをリンクさせていただきます。
https://qiita.com/uasi/items/69368c17c79e99aaddbf


#直前のブランチに戻る
```bash
$ git checkout -
```
今のブランチの前にいたブランチにチェックアウトすることができます。

#リモートリポジトリでのブランチの削除をローカルにも反映する
```bash
$ git fetch --prune
```
リモートでブランチが削除されたときに、pullやfetchをしても、リモート追跡ブランチ(origin/master的なもの)は削除されずに残ってしまいます。
`--prune` オプションを付けることで、リモートで削除されたブランチをリモート追跡ブランチからも消してくれます。

#Gitの設定の範囲
Gitでは様々な設定を行うことができます。
設定の範囲は`system`、`global`、`local`の3段階に分かれており、`system`、`global`、`local`の順に設定が読み込まれます。

| 設定 | 範囲 | 設定コマンド | 実際の設定ファイル(Win) | 実際の設定ファイル(Linux系) |
|:----|:----|:----|:----|:----|
| system | システム全体 | $ git config --system <name> <value> | C:¥Program Files¥Git¥mingw64¥etc¥gitconfig(インストール方法などによって異なります) | /etc/gitconfig |
| global | ユーザ全体 | $ git config --global <name> <value> | C:¥Users¥\<user>¥.gitconfig |~/.gitconfig|
| local | 対象リポジトリのみ | $ git config <name> <value> | .git/config |.git/config|

参考：https://qiita.com/shionit/items/fb4a1a30538f8d335b35

#絵文字でコミット
時と場合によって使い分ける必要があると思いますが、コミットメッセージに絵文字を入れることができます。

```bash
$ git commit -m ":lipstick:"
```
BibucketやGitHubなどのサービスで見ると絵文字になっているはずです。
参考：https://qiita.com/kawasy/items/8f6c179126af10f2ff0d


#おしゃれなコミットフレーズ
こちらも時と場合によって使い分けてください。
コミットメッセージをおしゃれに表現します。
`cosmetic change`(インデントを美しくした時など)みたいな感じです。
参考：https://qiita.com/ken_c_lo/items/4cb49f0fb74e8778804d
SVGデータをつくってみよう

[un-T factory! XA Advent Calendar 2018](https://qiita.com/advent-calendar/2018/unt-xa) 5日目の記事です。

こんにちは、nin2です。
最近はSVGを扱うことがだいぶ多くなってきました。
レスポンシブやRetina対応でもぼやけない…。最高です。

IllustratorでSVGデータを整えてからコーディングに入ることが多いので、
今回は私なりのSVG作成手順やポイントをまとめていきたいと思います。

# 使用アプリ
- Photoshop（弊社ではpsd形式のデザインデータで作業することが多いため）
- Illustrator
- svgo

# 手順
1. SVGデータを用意する
2. SVGデータを整える
3. 中身をチェックする
4. 軽量化する

## 1. SVGデータを用意する [Photoshop]
１) レイヤーがシェイプ or ベクトルレイヤーになっているか確認した上で、SVGデータを書き出す
　`[操作] レイヤー上で右クリック > 【書き出し】を選択 >【SVG】で保存`

　テキストをSVG化したいときは、先に『**アウトライン化**』を忘れずに。
　`[操作] テキストレイヤー上で右クリック > シェイプに変換 を選択`
![スクリーンショット 2018-12-04 18.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/183513/0d26221a-b1a1-a701-6a12-9faf732ef7af.png)



## 2. SVGデータを整える [Illustrator]
１) 1.で書き出したSVG画像をIllustratorで読み込む

２) アートボードのサイズを画像に合わせる
　まず、アートボードのサイズを整えます。
　このとき数値を整数にしておくと、CSSで幅計算する必要がある時に楽だと思います。
![スクリーンショット 2018-12-04 19.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/183513/5d7e9f83-8762-6649-9dd9-cc2eab8f83de.png)

　アートボードを整えたら、 `長方形ツール` でアートボードと同じ大きさのパスを作ります。
　そうすると、上下左右の余白を含めたSVGデータをつくることができます。
![スクリーンショット 2018-12-04 19.33.11.png](https://qiita-image-store.s3.amazonaws.com/0/183513/69143166-30c7-e0b0-0aaf-5038dcbf36db.png)


３) パスの状態をチェック
　パスが多いデータを使うとパフォーマンス低下に繋がるので、不要なパスはなるべく削除しましょう。

４) SVG形式で書き出し

## 3. 中身をチェックする
１) SVGタグに【width・height】が入っているかを確認しましょう。
　IEなどで表示崩れが起きるので、念のため確認した方が安全です。
![スクリーンショット 2018-12-04 19.45.40.png](https://qiita-image-store.s3.amazonaws.com/0/183513/9ee4a759-3e25-a142-602d-fe4dc6532877.png)

## 4. 軽量化する
**SVGO**というツールで不要な情報を取り除き、データを軽くします。

こちらはGithubでダウンロードできます。
https://github.com/svg/svgo-gui

使い方は以下のサイトを参考にしました。
[見た目のクオリティはそのままで、SVGファイルを大幅に軽量化する便利ツール -SVGO GUI](https://coliss.com/articles/build-websites/operation/design/optimizing-svg-files-svgo-gui.html)
VSCodeの予測変換が鬱陶しいときの対処法

# はじめに

何らかのリストを作成するときに以下のような候補をたびたび提示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/314105/23350e8e-b64b-00ba-aa39-03fec5dde740.png)

リストなのに同じ項目書くことある！？あんまないよね！？

しかもエンター押すと反映されるという二段構え。

# 対処法
[Code] → [Preferences] → [Setting]にて
「Accept Suggestion On Enter」で検索

![image.png](https://qiita-image-store.s3.amazonaws.com/0/314105/d7238f32-8c4d-3fdb-d505-4af3662b0b01.png)

offにするとエンターで候補が反映されないように設定できる。

# おわりに
リスト時に候補を出さない設定はないものか模索中・・・
jsdoでchip8　その12

#概要

jsdoでchip8やってみた。
アセンブラ練習問題、解いてみた。
お題は、fizzbuzz

#サンプルコード


```
  load  v3  5
  load  v4  5
  load  v5  5
  load  v6  1
  load  v7  1
  load  v8  0
  load  v9  15
  load  v10  5
  load  v11  3
jp0  load  v12  v6
jp1  sub  v12  v9
  eq  v12  0
  goto  jj0
  goto  jp2
jj0  eq  v15  0
  goto  jp1
  load  v12  v6
jp9  sub  v12  v10
  eq  v12  0
  goto  jj1
  goto  jp4
jj1  eq  v15  0
  goto  jp9
  load  v12  v6
jp11  sub  v12  v11
  eq  v12  0
  goto  jj2
  goto  jp6
jj2  eq  v15  0
  goto  jp11
  load  I  100
  load  v3  5
  load  B  v6
  load  v2  I
  load  I  0
loop0  sub  v0  v7
  eq  v15  0
  goto  loop1
  disp  v3  v4  5
  add  v3  v5
  load  I  0
loop2  sub  v1  v7
  eq  v15  0
  goto  loop3
  disp  v3  v4  5
  add  v3  v5
  load  I  0
loop4  sub  v2  v7
  eq  v15  0
  goto  loop5
  disp  v3  v4  5
  scroll
  add  v6  v7
  goto  jp0
loop1  add  I  v5
  goto  loop0
loop3  add  I  v5
  goto  loop2
loop5  add  I  v5
  goto  loop4
jp2  load  I  704
  load  v3  5
  load  v8  8
jp3  disp  v3  v4  5
  add  v3  v5
  sub  v8  v7
  add  I  v5
  eq  v8  0
  goto  jp3
  scroll
  add  v6  v7
  goto  jp0
jp4  load  I  724
  load  v3  5
  load  v8  4
jp5  disp  v3  v4  5
  add  v3  v5
  sub  v8  v7
  add  I  v5
  eq  v8  0
  goto  jp5
  scroll
  add  v6  v7
  goto  jp0
jp6  load  I  704
  load  v3  5
  load  v8  4
jp7  disp  v3  v4  5
  add  v3  v5
  sub  v8  v7
  add  I  v5
  eq  v8  0
  goto  jp7
  scroll
  add  v6  v7
  goto  jp0    
  data  240
  data  128
  data  224
  data  128
  data  128
  data  224
  data  64
  data  64
  data  64
  data  224
  data  240
  data  32
  data  64
  data  128
  data  240
  data  240
  data  32
  data  64
  data  128
  data  240
  data  224
  data  144
  data  224
  data  144
  data  224
  data  144
  data  144
  data  144
  data  144
  data  96
  data  240
  data  32
  data  64
  data  128
  data  240
  data  240
  data  32
  data  64
  data  128
  data  240

```

#成果物

http://jsdo.it/ohisama1/6SKV

以上。