OmniAICreator/Qiita-1.07M huggingface dataset:
充足可能性問題 (SAT) について わずかに調べた

# 1. 全体像
SATとかCNF-SATと呼ばれているタイプの問題がある。解きたい課題を 論理学の連言標準形 に翻訳して 求解するというものだ。身近なところだと数独。

```SATイメージ
数独を解きたい！
  → 数独のルールや初期盤面を論理式に翻訳
  → 論理式を CNF に変形
  → 汎用SATソルバに解かせる
  → 解を数独の解として読み解く
```

この描像では ポイントは以下の３つといえる（本稿では 翻訳・変形・求解と記載）:

- **[翻訳]** 現実の課題を 論理式にどう落とし込むか？
- **[変形]** どうやって簡潔なCNFを作るか？
- **[求解]** どうやって高速なSATソルバを作るか？

「翻訳」の例。数独では 81マスそれぞれに1..9がそれぞれ入るか？に対応する命題変数を 729個用意し、81個の変数がTrue で648個の変数がFalse となるような解を求めることに帰着できる。

「変形」の例。解きたい課題がCNFでない場合には、変形する必要がある。ドモルガンの法則を使えばCNFに同値変形できることは知られているが、指数オーダーの操作が必要になるので工夫が必要になる。なお、数独の例ではこれは不要 キーワード: Tseitin変換, 充足的同値性

「求解」の例。論理式の充足性は、「登場する変数の個数 n に対して $2^n$ 通りの付値を調べればよく、それ以外に本質的に効率的な方法がない」のが論理学の帰結。だが CNFが特定の形をしていれば 効率よくやる方法がある。またそれを実装に落とし込んだ有名なプログラムもある。キーワード: DPLLアルゴリズム, Minisat

# 2. 使ってみる

## 2-1. ファイルフォーマット
SATは毎年の国際的なコンテストなどもあり 標準化が進んでいる。特にCNF をテキストファイルで表現する方法は共通化されている。以下が例:

```input.txt
c This is comment
c
p cnf 3 2
1 -3 0
2 3 -1 0
```

ざっくりとした説明：文頭のc はコメント行を表す。`p cnf 3 2`において 変数が3つあり節が 2つあることを宣言している（p と cnf はおまじない）。変数 $x_1, x_2, ...$に 1,2,3... を当てる。n の否定は -n を充てる。よって -2 は $\neg x_2$ を表す。0 は 節の境界を表し(必須ではないが)慣例的に行末につける。変数同士のスペースには ⋁ が入っているとみなす。

以上を考えると、上記のファイルは CNF : ($x_1\lor\lnot x_3)\land(x_2\lor x_3\lor\lnot x_1)$ を表現したものだとわかる。

## 2-2. インストールと実行
SATソルバは色々あるけれど、十分早くて 事実上の参照実装となっているものがある。MiniSatと呼ばれるC++ でオープンソース(MIT)な実装だ。Ubuntu では `sudo apt install minisat` で一瞬で導入できるし、コンパイルをしても簡単。

インストールすると コマンドラインから `$ minisat input.txt output.txt` と呼び出せる。先ほどのファイルを使って実行すると以下を得る:

```output.txt
SAT
1 2 -3 0
```

出力の意味は明快で、$x_1, x_2$ をTrue に割り当て $x_3$ に False を割り当てると、与えられたCNF は充足する。手を動かして計算をしてみても、確かにそうなっている。

# 3. 先に進む
次に何をしよう？

# 3-1. 翻訳
- 数独を  729個の命題変数の登場する論理式 へと変形するとか、数学の四色問題を対応する論理式へと変形するとか、現実の課題を論理の世界に翻訳することには慣れが必要。
- 計算ドリル的なものはあるのだろうか？競プロ？

# 3-2. 変形
- ドモルガン則を再帰的に適用することにより 論理式を CNF に変形するというのは、少し複雑な論理式で実践してみると確かに計算量が多いな、と気づく。
- Tseitin変換、充足的同値性を理解して、幾つかの論理式を 充足同値なCNFに変形するのもやってみる。

# 3-3. 求解
- DPLLアルゴリズムなどの論文・教科書を読み「どんな場合にどんな規則を使うとどれほど楽になるか」についての見解をまとめる。
- MiniSat のコードを読む。コード量自体そんなに多くないらしい。
- たぶんコマンドラインツールではなく、ライブラリとしても使えるのでは？そのあたりのインターフェースを調べる。

# 3-4. 課題を捉えなおす
- 2-SAT, 3-SAT: 節の長さが2であれば多項式時間で解けて、節の長さが3以上だとそれがむり(指数時間になる)など、SATのある部分においては理論が整備されているらしい
- PB-SAT, CSP-SAT: SATは命題論理なので算術がからむ問題を翻訳するのは骨が折れる。なので PB-SAT とか CSP-SAT など表現力の高い言語で課題を表現し、SATに落とし込むというアプローチがある

# 参考
- MiniSatのページ: http://minisat.se/Main.html
- 神戸大の人たちの解説記事: https://www.jstage.jst.go.jp/article/jssst/34/1/34_1_67/_pdf
秀丸置換メモ

お世話になっております。

秀丸で
12:34:56
をマッチさせて
12:34:56,
と変更しようとしております。

置換で正規表現で
%02d:%02d:%02d
を
\1:\2:\3,
と置換するとやってみようとしたが駄目だったので
[0-9][0-9]:[0-9][0-9]:[0-9][0-9]
を
(\1):(\2):(\3)
と置換でやってみてもマッチした文字列が引っ張ってこれなかったので
マッチした文字列はどう持ってくるか　調査してメモのため
表記失礼します。

しかも適切なタグなかったので秀丸マクロのタグで作成して
本当に失礼します。

それで今から調査中です……

調査結果は

([0-9][0-9]):([0-9][0-9]):([0-9][0-9])
を
\1:\2:\3,
に置換で出来そうですっ
RubyKaigi2019 名言集

RubyKaigi2019にて誕生した、個人的にお気に入りの名言を集めました。

# Progress Wisely (賢く前進)

MatzさんのKeynoteにて。
今のRubyは間違えると直しにくい、なぜなら些細な機能でも、世界の誰かしらが使っているから。
決まったことに対して覆すのは難しい。
気に入らないことは、方向が決定する前にとことん指摘してほしい。
素早さを失うけど、１つ１つの判断を確実に。
外からの意見をないがしろにしない。

# 私テスト嫌いなんですよ

MatzさんのKeynoteにて。
私たちはテストは書きたくない、プログラムを書きたいんだ。
プログラムを書いて、さらにテストを書いたらDRYではない。

# Be Practical (現実的であれ)

nagachikaさんのKeynoteにて。
1つのRubyのバージョンのメンテナンスはだいたい3年。
もっとメンテナンスして欲しいと言う人もいるが、メンテナンスに力を注いでしまうとRubyの進化が止まってしまう。
安定版のメンテナンスは地味な仕事。
いいものを提供するために、時に冷酷な判断をしなければならない時がある。
例えば単体で見ると便利な機能だが、それを導入するとRailsが壊れてしまうケース。

# raise TalkTimeoutError

2日目のLTにて。
LTは時間制限があるため、持ち時間が0になるとスクリーンに `TalkTimeoutError` の例外を返却し、ドラが鳴るという、Rubyならではの仕掛け。

# 良いことには限界があるが悪いことには限界がない

Tanaka Akiraさんのセッションにて。
Rubyは英語を読むようにコードが読めるような設計になっている。
それに加えて黒魔術を使って可読性を上げることは良いが、やりすぎるとコードの書きやすさは底なしに悪くなる。

# 人間は1年に1回歳を取るという脆弱性がある

nagachikaさんのKeynoteにて。
どんな職業に限らず、世代交代はマスト。
世代交代をする上で必要な要素は以下３つ (ex: Ruby mentainer)。

* Rubyの実装について広く浅く抑えていること
* ある程度継続的な活動の見込みがある
* trunkのコミットを１つずつ見て、必要/不要の判断力

# 次世代を作れ

Amir Rajanさんにのセッションにて。
[Nintendo Switch上でRubyのプログラムを動かす](http://slides.com/amirrajan/game-dev-ruby-happiness-part-2#/) という取り組み。
React hooks でインクリメンタルサーチやオートコンプリートでのdebounceをお手軽にする

よくあるインクリメンタルサーチやオートコンプリートとかで、入力されたクエリに応じてリクエストを飛ばす時に、お手軽にdebounceするためのhooks。

```tsx
import * as React from 'react';

// 自分で定義するのがめんどい人は react-use の useDebounce 使うとよろし
function useDebounce(fn: () => any, ms: number = 0, args: any[] = []) {
  React.useEffect(() => {
    const handle = setTimeout(fn.bind(null, args), ms);

    return () => {
      clearTimeout(handle);
    };
  }, args);
};

export default function useDebouncedQuery(onChange: (query: string) => void) {
  const [searchQuery, setSearchQuery] = React.useState('');

  useDebounce(
    () => {
      onChange(searchQuery);
    },
    400,
    [searchQuery]
  );

  const clearQuery = React.useCallback(() => {
    setSearchQuery('');
  }, []);

  return { searchQuery, setSearchQuery, clearQuery };
}
```

使う側例

```tsx
function Hoge() {
  const loadSuggestions = (query: string) => { ... }

  const { searchQuery, setSearchQuery } = useDebouncedQuery(loadSuggestions);

  return (
    <Input value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} />
  )
}
```
Spring + Gradle + Javaクイックスタート

# 1. 雛形の入手
[ここから](https://start.spring.io)、以下の設定で、雛形をダウンロード。

Project: Gradle Project
Language: Java
Spring Boot: 2.1.4
Dependencies: Web

<img width="951" alt="スクリーンショット 2019-04-23 14.06.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250965/68cb78ca-b80b-8f3f-c36e-f24d2907696e.png">

# 2. プログラムを書く
HelloController.javaを作成。

```java:HelloController.java
package com.example.demo;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("hello")
public class HelloController {

    @GetMapping("")
    public String index(Model model) {
        return "Hello!!";
    }
}

```

# 3. 実行
`DemoApplication.java`の緑の三角をクリックして実行。
<img width="542" alt="スクリーンショット 2019-04-23 14.12.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250965/79d5d501-e751-f51a-505d-c973062622b6.png">

http://localhost:8080/hello にアクセス。
<img width="612" alt="スクリーンショット 2019-04-23 14.09.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250965/09ae34f2-921b-07d2-a3fd-5d0497b09138.png">
51歳からのプログラム　備忘録　新規登録後にプロフィール画面へ遷移

**新規登録後にプロフィール画面へ遷移**
--

laravelに用意してあるAuth機能を、少しずつアレンジしてみたい。
まずは、AuthのRegisterで新規登録した後に、`/home`ではなく、`veiw/profile/profile`に移る。

・　authを用意
・　$redirectToを変更
・　Routeを作る
・　Controllerを経由

**auth　を用意**
--
```cmd:commondプロンプト
laravel>php artisan make:auth
```

**Redirect 変更**
--
```php:App\Http\Controllers\RegisterController;
protected $redirectTo='/profile';
```

**Route**
--

```php:route\web.php
Route::get('profile','SampleController@get_Profile');
```

**controllerを経由**
--

```php:App\Http\Controller\SampleController
public function get_Profile()
{
return view('/profile/profile');
}
```
オブジェクトとクラスとインスタンス　基礎の基礎の基礎【お勉強log】

##オブジェクトとクラスとインスタンスってなに？
※自分がわかるようにめっちゃ簡単に書いてます:hugging:

- オブジェクト＝モノや事柄のこと
- クラス＝オブジェクトを作るための設計図
- インスタンス＝設計図を基に作られた個々の実体

####図
めっちゃ漠然と表すとこう↓
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/59d64ac8-e5dd-c419-3002-6c5c91c2b5f8.png)

####表
クラスとインスタンスをわかりやすくするとこう↓

| クラス      |       インスタンス |
|:-----------------|:------------------|
| 人間             | 鈴木さん、田中さん、太郎君、花子ちゃん|
| フルーツ         |いちご、りんご、オレンジ、メロン、ぶどう|


####例
飛行機をつくりたいな～![kangaeru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/56029b3d-41d4-8ecf-1227-1e9a941e2b7d.png)

で、つくるには設計図(クラス)が必要だ～![sekkei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/3a2e0267-de2c-8b11-41fb-1f89b5296e04.png)

よぉ～しつくるぞ～(インスタンス化)![sekkei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/e0f8d610-f167-f545-2580-64be157c8d9e.png)

できた～！(インスタンス)![hikouki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/dc6b3a03-dbcb-c1a5-6bdd-c05108e9b661.png)

さらに！よぉ～し量産しちゃうぞ～！(インスタンスのメリット)![hikouki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/963e068f-7e02-a732-4949-2a7863ea5fbf.png)
![hikouki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/963e068f-7e02-a732-4949-2a7863ea5fbf.png)![hikouki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/0b614328-4f12-47ec-9d46-99a58dc052cc.png)![hikouki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/b3a1b7db-e39b-f2f6-fc09-98946f23e0f9.png)![hikouki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242617/70a35f12-623c-d0c2-349b-5b1b67d4094b.png)



みたいな感じな気がする
画像を加工してる間に不安になってきた
おわり
pandasのデータ結合まとめ〜concat、merge

#データ結合のメソッド、パラメータまとめ
pythonのデータ分析のライブラリpandasを使ってみたのですが、テーブルの結合方法が色々あったので忘れないように重要事項をざっくりメモします。


後で使いやすいように、まずは一覧から。

####主な連結方法

|メソッド名|パラメータ|説明|
|---|---|---|---|
|concat|axis=0(デフォルト)|縦方向に連結|
|concat|axis=1|横方向に連結|
|merge||共通列名で結合|

####concatの結合方法

|パラメータ設定| 詳細|
|---|---|---|---|
|join="outer" (デフォルト)|全てのラベルを残す|
|join="inner"|両方に共通するラベルのみ残す|
|join_axes="ラベル名"|指定したラベルを残す|

####mergeの結合方法

|パラメータ設定| 詳細|
|---|---|---|---|
|on="列名"|指定列をキーとして結合、指定なしなら全ての共通列名がキーになる|

|パラメータ設定| 詳細|
|---|---|---|---|
|how="inner" (デフォルト)|キーを見て、両方のテーブル共通してあるデータのみ残す|
|how="left"|キーを見て、左テーブル(第一引数)のデータは全て残す|
|how="right"|キーを見て、右テーブル(第二引数)のデータは全て残す|
|how="outer"|キーを見て、片方のテーブルにしかないデータも全て残す|

#具体例〜concat
わからなくなったときのため、いくつかテーブルとその結合結果をまとめます。
######(例1)
```python
import pandas as pd

pd.concat([df1, df2])
```
パラメータを何も指定しない場合は縦に結合し、列ラベルも全て残ります。

|df1|A|B|C|
|---|---|---|---|
|**0**|a0|b0|c0|
|**1**|a1|b1|c1|
|**2**|a2|b2|c2|

|df2|A|D|
|---|---|---|---|
|**0**|a0|d0|
|**1**|a1|d1|

|result|A|B|C|D|
|---|---|---|---|---|
|**0**|a0|b0|c0|NaN|
|**1**|a1|b1|c1|NaN|
|**2**|a2|b2|c2|NaN|
|**0**|a0|NaN|NaN|d0|
|**1**|a1|NaN|NaN|d1|
######(例2)
```python

pd.concat([df1, df2], axis=1, join_axes=[df1.index])
```
axis=1より横方向の結合です。
join_axesにdf1のindexを指定しているので、df1の行が全て残ります。

|df1|A|B|C|
|---|---|---|---|
|**0**|a0|b0|c0|
|**1**|a1|b1|c1|
|**2**|a2|b2|c2|

|df2|C|D|
|---|---|---|---|
|**1**|c1|d1|
|**2**|c2|d2|
|**3**|c3|d3|

|result|A|B|C|C|D|
|---|---|---|---|---|---|
|**0**|a0|b0|c0|NaN|NaN
|**1**|a1|b1|c1|c1|d1
|**2**|a2|b2|c2|c2|d2

#具体例〜merge
######(例1)

```python
import pandas as pd

pd.merge(df1, df2)
```
|df1|A|B|C|
|---|---|---|---|
|**0**|a0|b0|c0|
|**1**|a1|b1|c1|
|**2**|a2|b2|c2|

|df2|B|C|D|
|---|---|---|---|
|**1**|b1|c1|d1|
|**2**|b2|c2|d2|
|**3**|b3|c3|d3|

|result|A|B|C|D|
|---|---|---|---|---|
|**0**|a1|b1|c1|d1|
|**1**|a2|b2|c2|d2|

デフォルトでは共通の列全て(B、C)がキーです。
行においては2つのテーブルのキーに共通するデータ(b1c1、b2c2)のみ残ります。
また、mergeではindexは0から振り直されます。
######(例2)
```python
pd.merge(df1, df2, on="C", how="outer")
```
|df1|A|B|C|
|---|---|---|---|
|**0**|a0|b0|c0|
|**1**|a1|b1|c1|
|**2**|a2|b2|c2|

|df2|B|C|D|
|---|---|---|---|
|**1**|b1|c1|d1|
|**2**|b2|c2|d2|
|**3**|b3|c3|d3|

|result|A|B_x|C|B_y|D|
|---|---|---|---|---|---|
|**0**|a0|b0|c0|NaN|NaN|
|**1**|a1|b1|c1|b1|d1|
|**2**|a2|b2|c2|b2|d2|
|**3**|NaN|NaN|c3|b3|d3|

onでCのみ結合のキーに指定したので、Bは結合されずx、yの添え字付きで別々に残ります。
結合方法はouterなので、行は片方のテーブルにしか存在しないもの(c0、c3)も全て残っているのが確認できます。
【SeConf2019】 Test Impact Analysis

SeleniumConferenceで一番感動した講演についてのメモを公開します。
いろいろ理解がおいつかなかったり間違ってたりするものもあるかもしれません。

# 背景とか
テストと言えばピラミッドの形、System,Integration,Unit件数がUnitが多い。
実行時間で考えるとSystemレベルが大きい。逆ピラミッド。

並行して実行すべき・継続的にやるべき。自動化されたテストが必ずやるべき。
Systemレベルのテストが終わるまでにこのくらいかかるから。
Systemレベルのテストを並列化すればいい。それも分けてる。バッチ。
（すごい。）
かなりのリソースに分けてやっても、４５分もかかる。７万くらいのテストをやってる。
いいと思われるかもしれませんが、少しでもビジネスに早くするため１分でも短縮したい。

今まで
マスターブランチのテストだけを考えていた。
フィーチャーブランチもある作ってやらなければいけない。
時間だけでなくお金の問題もある。デプロイ時間、４０台並列、担当しているアプリもいっぱい。
７０のプルリクを毎日毎日変更のテストしなければいけない。
１５０００のテストブランチをかけている。
ものすごくコストかかっている。

ピラミッドの形を変えよう！
db Unitテストを補完するものを作るしようとしている。
コンポーネントテスト、JavaでかいたものがSQLでどのように実行されているかなど。

# 本題
TestImpactAnalysisをし、どんな利益が得られたかを話します。

Clover、Codeカバレッジレポート等テストに関する知見が得られる。
ユニットテストだけでなくいろいろできる。

すべてのコミットの中の変更ファイルを見て、関連するテストはどれかを抜き出す。どのテストなのか？
マッピングすることにした。

関係あるテストだけを抜き出し、関係あるテストのサブセットだけを抜き出す。
Jacocoの問題は、作成できるのがCodeカバレッジ詳細が教えてくれないと思っていたけど、Javaバイナリ、・クラスファイルを利用して、CSVファイルに出力することで、Jacocoでできることがわかった。
・アプリケーションをjacocoエージェントにつなげる
・テストを実行し、エグゼファイルを作る。すべてのテストにCodeカバレッジ情報をCSVファイルを出力。
それをもとに、timmyというテストインパクトのデータベースを作った。

# timmyデータベース
・どのテストがどのJavaファイルの変更に結びついているデータベース

フィーチャーブランチに変更をマージしたとき、
変更したファイルを、timmyに問い合わせ、最小限のテストを実行する。

# デリバリー
みんながCIを触っていて、パイプラインにプッシュ、
究極の受け入れ試験。最小限必要なテストセット。
それが現実的にうまくいくのか？検証の必要があった。

# 本当に導入できる？のお試しを行った。
シャドーブランチをもう１個つくる。フィーチャーブランチに
timmyにどんなテストが必要か聞いて？１ヶ月くらい実験した。
実際に使えることが証明できた。

# 評価
新しいサービスでは、99.99%アベイラビリティ、レスポンス
満たしていることを示すため、ダッシュボードを作成して、
DBの利用状況・メモリ利用率がわかるようになっている。

「観察できる」ができる。
継続的にサービスが動いていて、timmyに対して200msいないに帰ってくることを確認する。
ここまでうまくいって、ハッピーです。

# 最終的に改善できたのか？
テスト影響分析をしたのが、良い効果を発揮できたか？
４５分かかるテストが３０分でできるようになった。

十分自身が持てるようになったらmasterブランチで使うかも。

# ROI
４人で1ヶ月くらいサービスを作った、文書も作った、教育した。
わずか１ヶ月で投資を回収できた。

# 次のステップ
どんな変更にも使えるのか？
依存性が変わったり、いろんんな変化がある場合にどういう風に
テストを選ぶことができるのか？
Javaファイル以外(xmlとかmvnとか）のファイルが変わった場合についてどうすればいいかわかっていない。
timmyに入っていない場合、このテストで十分と言えない。
場合によってはすべてのテストを全部実行している。

過去２週間でどのくらいの変化があったか？何度Ciコミットがあるか？それのテストをやらなければいけないか？の頻度を確認して、価値があるか判断できる。
jacocoはCodeファイルを実行するものなので、jsやhtmlの変更に対応できていない。
jsやhtmlの場合にも、どういったテストをするのか、どうやって改善するかを考えると、
html,js, Seleniumテストに入れるとかになる。
インタラクションをdumpしたり、そういった情報をtimmyにプッシュすればいいかも。

# まとめ
・自動化テストの成長計画を考えてください
　どれが価値があるテストか？抽出する術を考えなければいけない時期が来る
・TestImpactAnalysysは自動テストの実行時間を削減する
・テストインパクトアナリシスをできるツールとして、Cloverが使えるかも。
・パイプラインを改善することにより、エンドユーザの満足につながる

# ここでも話すよ
AgileAutomation Days 
October 2019 28-29

# 他の事例とか
重複していたテストがあった場合は、省いてもいいかは考えている。
すべてのテストを実行するべきではない。
すべてのアーキテクチャは構造化されているから。通信をしたりしている場所などうまくアーキテクチャされているが、そうでないものもあるかもしれない。
Microsoftがうまくいっているよという論文を出している、Facebookでもうまくいっているよ
fishのコマンド補完方法

# はじめに
皆さん、シェルは何を使っていますか？ この世には*bash*、*zsh*などなど様々なシェルがあります。その中でも**[fish-shell](https://fishshell.com/)** はオススメで、機能も見た目 [^1] も気に入っています。
この記事では**ユーザーフレンドリー**なfishの便利機能である***コマンド補完***についてまとめました。

# manページを元にtab補完を作成
fishではインストールしたコマンドであっても、そのコマンドのmanページを元に補完候補を作成してくれます。補完候補の作成には以下のコマンドを実行します。

```shell-session
fish_update_completions
```

こうすることで `[tab]キー` を押せば候補を出してくれるようになり、候補は `[Arrow]キー` で選択できます。
以下の画像は`docker run`コマンドでtab補完した場合ですが、ビルド済みのイメージを表示してくれています。
![Screenshot from 2019-04-23 22-22-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/4bf96d9d-71ac-71b2-8a62-69c9603df5a1.png)
# 灰色のサジェストを全て補完
既に入力したことのあるコマンドであれば、灰色で補完候補が現れるかと思います。そういった場合には以下のショートカットで**全て一括**で入力できます。

* `[Right Arrow]キー`
* `[Ctrl]キー + [f]キー`

以下は `gcloud` コマンドの場合ですが、gと打った瞬間に過去打ったコマンドを表示してくれています。

![Screenshot from 2019-04-23 22-32-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26998/7fd27f3f-9391-1911-9ec0-6e48fd17d1bb.png)

# 灰色のサジェストを部分的に補完
上記の全補完の例では、一部分だけ違うコマンドを入力したい場合に、*全補完 -> 一部分削除 -> 一部分を手入力*しなくてはなりません[^2]。そういった場合には、以下のショートカットで**1単語ずつ補完**がなされます。

* `[Alt]キー + [Right Arrow]キー`
* `[Alt]キー + [f]キー`

[^1]: ちなみにテーマは [ocean](https://github.com/oh-my-fish/theme-ocean) を使っています。
[^2]: 指があたってすごく長いコマンドを間違って補完してしまった時は結構イライラします。人生ですか？
EA install error on macOS

```
$ wine msiexec /i easetup.msi 
0009:fixme:ntdll:NtLockFile I/O completion on lock not implemented yet
0009:fixme:msi:event_spawn_wait_dialog doing nothing
0009:fixme:msi:event_spawn_wait_dialog doing nothing
0037:fixme:ntdll:NtLockFile I/O completion on lock not implemented yet
wineserver crashed, please enable coredumps (ulimit -c unlimited) and restart.
```

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/302fdd6b-95cd-6580-ea37-6edb6df7d14b.png)



```
ps -ax

39833 ttys001    0:09.44 /Applications/Wine Stable.app/Contents/Resources/wine/lib/../bin/wine-preloader msiexec /i easetup.msi 
39849 ttys001    0:00.28 /Applications/Wine Stable.app/Contents/Resources/wine/lib64/../bin/wine64-preloader C:\windows\system32\explorer.exe /desktop 
39855 ttys001    0:00.23 /Applications/Wine Stable.app/Contents/Resources/wine/lib/../bin/wine-preloader C:\windows\syswow64\msiexec.exe -Embedding 8 
$ kill 39855
$ kill 39849
$ kill 39833
```

```
Terminated: 15

```
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
php-master-changes 2019-04-22

今日は LiteSpeed の SAPI モジュールの修正、opcache の最適化のバグ修正、defined() 使用時グローバル namespace へのフォールバックが変に効いていた問題の修正、aarch64 用の global register の指定追加、内部 API php_sys_link() の修正、link.c と link_win32.c を統合する修正があった！

# 2019-04-22
## George Wang: Fixed bug in litespeed_finish_request(), disable fastcgi_finish_request() alias for now.
- https://github.com/php/php-src/commit/ccf051c317e606c2a4d9099c6e79a5c42bfdb298
- sapi/litespeed で、litespeed_finish_request() のバグの修正
- [前回の更新](https://qiita.com/sj-i/items/9361c7b5d1c2c1228886#george-wang-litespeed-sapi-73-better-process-management-new-api-function-litespeed_finish_request)で追加された API の筈だけどよくは分からず

## George Wang: Improved LSAPI_End_Response_r() .
- https://github.com/php/php-src/commit/ce73841cdcfd86a2cf5d7e1c251095254985324d
- [7.2~]
- sapi/litespeed で、LSAPI_End_Response_r() の改善
- リクエスト終了処理の修正っぽいけど、よくは分からず

## dstogov: Fixed wrong opline
- https://github.com/php/php-src/commit/abacb5e8ea0f44bd1e85875e7361f1abaf4ea5a7
- [7.4~]
- ext/opcache で、[先日の $GLOBAL 経由の変数アクセス修正](https://qiita.com/sj-i/items/e8ead65a32936cc26b9c#dstogov-eliminate-fetch-globals-followed-by-fetch_dimunset_dimisset_isempty_dim)に誤りがあったのを修正

## nikic: Fix flag value clash affecting defined() function
- https://github.com/php/php-src/commit/e311f2a320b07b6d210c5b1db24a37a0259859f1
- defined() 使用時グローバル namespace へのフォールバックが変に効いていた問題の修正

## cmb69: Fix parameter order
- https://github.com/php/php-src/commit/6710929c0413316689e6f3208d0ebe9ea237cbba
- [7.4~]
- [昨年 8 月に追加された内部 API の php_sys_link()](https://qiita.com/sj-i/items/0482f1e56dc96a431f01#cmb69-create-and-expose-php_sys_symlink-and-php_sys_link) で、引数の順序が Windows と POSIX で違ってしまっていた問題の修正

## CrazyMiaoo: Add gcc global register for aarch64
- https://github.com/php/php-src/commit/9df15fc26b7c09178365a26470ed8fb4a5c2c036
- [7.4~]
- aarch64 用に gcc の [global register](https://qiita.com/hnw/items/ef6f32bcbd99c8127ec7) の指定を追加

## cmb69: Merge link.c and link_win32.c
- https://github.com/php/php-src/commit/808eaa095e2228ee51e7224f2d123b2d4b3b2b6f
- [7.4~]
- link.c と link_win32.c を統合
- [昨年 8 月に](https://qiita.com/sj-i/items/0482f1e56dc96a431f01#cmb69-create-and-expose-php_sys_symlink-and-php_sys_link)やりたい言ってた奴
SQLSERVER 複数DBを一括AUTO_CLOSE offにする

#db_auto_close.sql

```sql
declare @tbl table (
  rowid int IDENTITY(1,1), 
  dname varchar(100)
)
declare @i int, @max int, @dname varchar(100), @SQL VARCHAR(1000);

insert into @tbl(dname)
select a.name
from master.sys.databases as a
WHERE a.name NOT IN ('master', 'tempdb', 'model', 'msdb')
 and a.name not like 'ReportServer%'
 and a.is_auto_close_on = 1

set @i = 1
select @max = max(rowid) from @tbl

WHILE (@i <= @max)
BEGIN
  select @dname = a.dname
  from @tbl as a
  where a.rowid = @i

  SET @SQL = 'ALTER DATABASE ' + @dname + ' set AUTO_CLOSE off';
  exec(@SQL);

  set @i += 1

end
```
vimでC++編集する時に使えるいいこと考えちゃった

# TL;DR
この方法は良くない。いいと思ったけど良くない。
`z+f`等の畳み込み（Folding)を使おう！

# はじめに
便利なものを作ったつもりで以下を書いたのですが，実際にはコメントで教えていただいた`折畳`を使った方が良さそうです．折畳に関しては[こちら](https://qiita.com/ysuzuki19/items/23a998d3636684ec1ca1)にまとめました．

# したこと
Vimを使い始めて半年経ち，vimrcでショートカットを作成したりするようになって，ようやくVimmerと呼ばれてもいいくらいになってきた．(Pluginは使っていない)
何気なくC++のプログラムを編集していて，思った．

「確実にあっている部分が視界に入って鬱陶しいなあ・・・」

そこで，何か解決方法はないかを考えたところ，Vimを使い始めた時に何度か間違えて押していた`Shift+j`を思い出した．ちなみに，

`Shift + j`は，`現在の行と次の行をスペースをいれて連結する`コマンドである．

このコマンドは間違えて入力すると，ソースコードがまとまって面倒なことになる．`u`を使ってすぐに戻っていた．

しかし，`みたくない部分`をまとめてしまうことができるなと考えた．終了後に元に戻すことができれば便利に使えそうだ．ここで考えたのが，C++であれば行末には`;`があるため，`;`を`;<CR>`に置換することだ．

Vim上で

    :s/;/;^M/g

とコマンドを実行すると`;`が`;<CR>`になってくれた．そこで，`Shift+k`にショートカットを割り当てようと思い，`~/.vimrc`に以下を記述した．

```:~/.vimrc
nnoremap <S-k> :s/;/;^M/g
```

これでVim上で`Shift+k`を入力するとコマンドが

    /g

になってしまった．どうやら`vimrc`では`^M`は使えないようだ．そこで，先ほどの内容を以下に変更した．

```:~/.vimrc
nnoremap <S-k> :s/;/;\r/g
```

これで無事`Shift+k`に`;を;<CR>に置換`を割り当てることができた．

# 動作画面
以下が，動作画面である．連結すると，見た目上の行数が減るので，注目できる（かも）．

![vimLinkingTest.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/e3b82430-83da-7f4b-d5af-24a6fe864336.gif)

いつでも`;を;<CR>に置換`ができるので，編集中は読みたくない部分を省略して編集後に戻すことができるようになった．
回帰テストの対象は適切に設定しよう

[この記事は会社のブログとのクロスポストです](https://www.clear-code.com/blog/2019/4/23.html)。

先日、[Bug 1541748 - New tab and restored tab notified via tabs.onCreated can have invalid (too large) index](https://bugzilla.mozilla.org/show_bug.cgi?id=1541748) という報告をFirefoxのバグトラッキングシステムに行った結果、提出したパッチがFirefox 68に反映される事になりました。

とはいえ、実はこのパッチで追加されるコードは皆さんのお手元にインストールされるFirefoxには反映されません。何故なら、これは*自動テストを追加するだけのパッチだから*です。

# パッチが投入されるまでの経緯

この報告は、「Firefoxのアドオン開発に使用するWebExtensionsのいくつかのAPIにおいて、タブの位置を示す`index`というプロパティが不正な値になる場合がある」という物でした。ただ、これは実はWebExtensions APIの実装の問題ではなく、Firefoxのタブが内部的に持っている対応する情報自体が壊れていたというのが真相でした。

![（図：壊れた内部状態が露出した事が原因で、APIの情報が壊れている様子）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61387/966d2761-cad2-54ce-da53-0c89ec462818.png)


「根本的な原因」の方は [Bug 1504775 - Index is wrong for restored tabs](https://bugzilla.mozilla.org/show_bug.cgi?id=1504775) という別のBugで取り扱われていました。今回の報告と前後してそちらのBugの作業が進行していたため、そちらの方で修正が行われた事の影響として、報告からあまり間を置かずにWebExtensions APIの不具合も自然解消したという状況になっていました。

一般的に、このような「ある報告の原因が別の報告の修正で解消された」というようなケースでは、その旨を記して修正済み扱いとしたり、もしくは重複する報告であるとして処理する事が多いです。

![（図：2つのBugに因果関係がある時、両方が閉じられる様子）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61387/11416150-8ce8-84e2-2b9b-7f7a097b79f5.png)


このような場合、そちら側に提出されたパッチはBugのクローズに伴って破棄されがちです。しかし今回はそうではなく、Bugはクローズされずに留め置かれ、新たに自動テストを加えるだけのパッチを追加投入する事が承認されました。

これは、根本原因の方のBugがFirefox内部の問題のみを取り扱う物であったのに対し、こちらで報告したBugは*アドオンという外部アプリケーションに対する互換性の問題*を取り扱っていたからです。

# テストは目的ごとに必要

[根本原因が修正されたパッチ](https://phabricator.services.mozilla.com/D26296 "⚙ D26296 Bug 1504775 - Ensure externally provided addTab index is within bounds. r=mixedpuppy")では、Firefox内部のAPIに対するテストケースは追加されていますが、WebExtensionsのテストケースには特に変更は加えられていませんでした。

今回はFirefoxがたまたま「タブの内部的なindexがそのままWebExtensions APIを通じてアドオンに露出する」という実装を取っていたために、WebExtensions API側の問題も*偶然解消されました*。しかし、それはあくまで現時点の実装がそうであったからというだけで、*将来に渡ってそうであるという事の保証はどこにもありません*。

![（図：内部向けの保証はあってもアドオン相手の保証は無いという様子）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61387/a3f1936e-4981-b171-8e57-ad65b61ab3ec.png)


よって、今後Firefox内部の実装やWebExtensions APIの実装が変更された場合に、人知れず再び同じ問題が起こるようになるという可能性は依然としてあります。

そのため、今回のパッチでWebExtensions APIのレイヤにおいて後退バグ{{fn "今まで期待通りに動いていた物が、別の変更の影響で期待通りに動かなくなってしまう事。"}}が発生していないかを検出するための回帰テスト{{fn "ある問題を修正したときに、問題が発生しなくなっている事を検証するテストのこと。"}}を追加することで、WebExtensions APIに意図せず影響を与えてしまう（そのような変更が気付かれずに投入されてしまう）という事故の発生を未然に防ぎ、APIの安定性を保証しやすくしたという事になります。

![（図：保証する相手ごとにテストがある様子）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61387/1cc30fd2-0d20-4b66-8ce3-a7bb716762db.png)


気をつけて欲しいのは、これは「単体テストと結合テストではレイヤが違うので、単体テストで検証済みの事もすべて結合テストで再検証しよう」という話*ではない*、という事です。同じ事を保証するテストがそれぞれの実装レイヤに含まれるという事はあり得ますが、それはあくまで結果的にそうなっているだけに過ぎません。テストは*誰に対して何を保証するか、という観点で整備される事が重要*です。

今回は「Firefox内部向け」と「アドオンという外部アプリケーション向け」のそれぞれで修正・互換性を保証する必要があったためにこうなったわけです。

# まとめ

Firefoxに投入された自動テストのみのパッチの背景説明を通じて、テストの目的とテストを追加するかどうかの判断基準の一例をご紹介しました。

*自動テストの追加は、ドキュメントの修正に次いで「外部のコントリビューターとして開発に参加する最初のステップ」として取り組みやすい作業です*。自動テストが全く存在しないプロダクトや、自動テストがあっても特定の機能についてテストが不足しているというケースに遭遇したら、皆さんもぜひテストの追加に取り組んでみて下さい。独りでやりきるには不安があるという方は、スケジュールが合う[OSS Gate](https://oss-gate.github.io/)のワークショップに参加してサポーターの人に相談してみても良いかもしれません。
WordPress で和暦表示させる（簡易版）

`wp_get_archives` でのアーカイブリスト、`get_the_date` での投稿日取得を和暦に対応させるためのスニペットです。テーマの `functions.php` にコピペしておくと使えると思います。`get_the_date` については、ループ内で `get_the_date( 'ja' )` とすると和暦が表示されます。

```php
/**
 * @param string $ymd Ymd format date, e.g. 20190501
 * @param int|string $year
 * @return array array( 'era', 'year' )
 */
function get_ja_era( $ymd, $year ) {
	$year = (int) $year;

	if ( $ymd <= '19120729' ) {
		$era = '明治';
		$year_ja = $year - 1867;
	} elseif ( $ymd >= '19120730' && $ymd <= '19261224' ) {
		$era = '大正';
		$year_ja = $year - 1911;
	} elseif ( $ymd >= '19261225' && $ymd <= '19890107' ) {
		$era = '昭和';
		$year_ja = $year - 1925;
	} elseif ( $ymd >= '19890108' && $ymd <= '20190430' ) {
		$era = '平成';
		$year_ja = $year - 1988;
	} elseif ( $ymd >= '20190501' ) {
		$era = '令和';
		$year_ja = $year - 2018;
	}

	if ( $year_ja === 1 ) {
		$year_ja = '元';
	}

	return array( 'era' => $era, 'year' => $year_ja );
}

add_filter( 'get_archives_link', function( $link_html ) {
	return preg_replace_callback(
		"/(\d{4})年(\d+)月/",
		function( $matches ) {
			$year = $matches[1];
			$month = $matches[2];
			$month_pad = str_pad( $month, 2, 0, STR_PAD_LEFT );
			$ymd = $year . $month_pad . '31';
			$ja_era = get_ja_era( $ymd, $year );

			return "{$ja_era['era']}{$ja_era['year']}年{$month}月";
		},
		$link_html
	);
} );

add_filter( 'get_the_date', function( $the_date, $d, $post ) {
	if ( $d !== 'ja' ) {
		return $the_date;
	}

	$ymd = get_post_time( 'Ymd', false, $post, true );
	$year = get_post_time( 'Y', false, $post, true );
	$month = get_post_time( 'n', false, $post, true );
	$date = get_post_time( 'j', false, $post, true );

	$ja_era = get_ja_era( $ymd, $year );

	return "{$ja_era['era']}{$ja_era['year']}年{$month}月{$date}日";
}, 10, 3 );
```
Validation-Engine 特定の場所で発火しないようにする

##備忘録
自分用への使い方メモ

##vilidation-Engineとは
JavaScriptで使用するプラグインの一つ

---特徴---
<b>_Form周りのバリデーションをリアルタイムに行ってくれる_
_バリデーションに引っかかった場合には吹き出しにてユーザーに知らせてくれる_</b>

##使い方
[https://qiita.com/Lui/items/4154161d511026730dc5]
この記事を参考に作成。
Validation-EngineはファイルDLかCDNでできる。
カスタマイズ性がほしいならファイルDLが確実。

##今回の経緯
とある案件で、Validation-Engineを使用していた。
使用していたページではログイン機能も併設していて、ログインする際にsubmitでサーバーとの通信を行う仕様になっていた。Validation-Engineを使用していたのでsubmitを押すと同じform内のため発火されてログインがされない状態が起こってしまった。

色々記事を見てみたが発火を止めるような記事がここにはなかったので備忘録として今回記事作成をした。

<b>やりたい事</b>
ログインbuttonのsubmit押下時にはVilidation-Engineを発火させないようにする。

##発火を止めるには
日本語での記事では

```
$('hoge').validationEngine('hide');
//指定したいform名もしくはIDなどを指定してhideをする
```
みたいなのをよく見かけた。とりあえず使ってみて、、、、吹き出しが出ないけどこれ発火してるな、、、ってなってなんぞって。。。って公式ドキュメント見たら、、、
>hide
The hide method can be applied to a form or a field.
It closes/hides error prompts.

>// closes all form prompts
$('#formID1').validationEngine('hide');

>// closes onle one prompt
$('#email1').validationEngine('hide');

とのこと。
吹き出しだけ隠すよーってことだと思ってる(英語苦手なので、、、)

なので
これはだと意味がないのでさらに何かないかと公式を読んでみると普通に書いてあった
>detach
Unregisters any bindings that may point to jQuery.validaitonEngine.

>$("#formID1").validationEngine('detach');

>$('#form1').validationEngine('detach');

detachで発火をさせないとのこと。

```
$("#formID1").validationEngine('attach'); //発火させる
$("#formID1").validationEngine('detach'); //発火を止める
```

ログインボタン押下時の処理に発火を止めるを記述したらいけました。

結果として公式は最強なのでプラグイン使うときにはちゃんと読まないとと再認識しました。

##公式ドキュメント
[https://github.com/posabsolute/jQuery-Validation-Engine]
kubernetes aws編(EKS)


前回に続きまして、今回はawsに環境を構築するところまで行おうと思います。
[kubernetes(k8s)環境構築編](https://qiita.com/murata-tomohide/items/2cf5ddfe76291911cc9a)

※~~EKSはtokyoリージョンにはまだ来ていません。(2018/11/07)~~ 来てます。(2019/01/28)

# awsのよくわからない言葉

- EKS(Elastic kubernetes Service) kubernetesのAPIを用意したawsのサービス。
- Cloud Formation EC2のインスタンスやセキュリティグループなどを自動管理してくれるもの。
- ECR(Elastic Continer Registry) awsのDockerのプライベートリポジトリ

# しくみ

要するにCloudFormationがEC2にインスタンスを立ててくれてその上にk8sを入れてDockerを動かすよ！ってことです。(GKEも同じ)
セキュリティグループやロードバランサーまでいじってくれます。

クライアントPC(もしくはコンソールサーバ)からEKSのAPI経由で、各ノードをコントロールできます。


# やること

1. VPCにEKS用のサブネットを作成する。
2. EKSを作る。
3. cloudformationでいろいろ作る。
4. EKSの認証情報をkubectlに当てる。

って感じです。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html

# tips

## aws Profileとkube configはメインのものとは別にしておくと便利
例:)
`$ aws configure --profile aws-kube-test-nodes`
`$ export AWS_PROFILE=aws-kube-test-nodes`
`$ aws eks  update-kubeconfig --name=test-nodes --kubeconfig=~/.kube/aws-test-nodes.conf`
`$ export KUBECONFIG=~/.kube/aws-test-nodes.conf`

## EKS用のsubnetはprivateとpublicの対で。

EKS用のsubnetはprivateとpublicのものを2本用意しておくこと。(EKSはInternet Gatewayがあるかどうかでlocalかglobalかを判断する。)

## Security Groupsは専用のものを。

EKS用のSecurity Groupsは専用のものを空で用意しておく。EKS同士であっても共有しないこと。
おかしくなるよ！

## VPCのEKS用のpublicサブネットに注意

既存のVPCにEKS用のサブネットを手動で作る場合には、publicとprivateの対で作成して、publicのサブネットの`自動割り当て IP 設定の変更 -> パブリック IPv4 アドレスの自動割り当てを有効にする `を有効にしないといけないので注意！(2つ以上のAZで作らないといけないので、最低4つのsubnetが必要になる。 https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/create-public-private-vpc.html

※チュートリアルだとCloudFormationでVPCを作っているので注意

## あとからsubnetを追加するには。

EKSのsubnetやSecuryGroupsはCloudFormationと同じにしておく必要があるが、CloudFormation側を変更してもEKS側には自動で反映されない。EKSは編集できないので作り直す必要がある。EKSを作り直すとkubectlのconfigも変えないといけない。要するにめんどくさい。

※もしかしたらtagで判断しているのかも。

## EKSを作るIAMユーザーとkubectlを使うユーザーは同じにすること。

> 参考：[Amazon EKS の使用開始 \- Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html#eks-create-cluster)
> コンソールを使用してクラスターを作成する場合は、クラスター上で kubectl コマンドを実行する際、同じ IAM ユーザー認証情報が AWS SDK 認証情報チェーンにあることを確認する必要があります。

kubectl で認証が通りません。＆あとから変えられない。管理ユーザーを作ってそれで作成しよう。
CLIしか使わないのであれば、管理IAMユーザーを作って `aws eks create-cluster` コマンドで作成しましょう。（いけてねーな）

なんていうデマが横行していますが、ちゃんとロールを設定すれば大丈夫とのことです。
[クラスターのユーザーまたは IAM ロールの管理](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html)

## その他

- CloudFormationを作成するときにEKS clouster nameを入れるが、間違っていてもエラーを吐いてくれないので注意！

- kube-systemのpodsがちゃんと立ち上がったことを確認してからいじりましょう。 `$ kubectl -n kube-system get pods -o wide`で確認する。

- ECRには詳しく触れませんが、Dockerのプライベートリポジトリとawsの組み合わせも曲者です。


# まとめ

- k8sを覚えておくとawsからgcpやbluemixに移動とかしてもナレッジを活かせる。
- コマンドやしくみが複雑すぎてk8s専任担当が必要なのでは？
- 新しいawsみたいなのを覚えるぐらいのイメージ
- Dockerを知っていないといけない。(まずはDockerからやったほうがいい)
- Docker使えるとデプロイが楽になるかもしれない。(ホントかよ
- AutoScaleまでやってくれるので構築できてしまえばaws側からいじることはほとんどない。(いじってはいけない)

まぁいいんじゃないですかね。さすがGoogle謎テクノロジーの結晶やで。。。
matplotlibで三角グラフを作成する

**この記事を読むとできるようになること**
`matplotlibで三角グラフが描ける`

三角グラフを描くには，Rに用意されているtriangle.plotなどが使えます．
（こちらのページが参考になります→）[三角ダイアグラムを描く（Drawing ternary diagrams）](https://staff.aist.go.jp/a.noda/programs/ternary/ternary.html)
しかし機能に限界があるためPythonで描きたいなあと思いました．

- 環境
    - macOS Mojave 10.14.4
    - Python 3.7.2

次のスクリプトで，三角グラフの枠が描けます．

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

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_aspect('equal', 'datalim')
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
plt.tick_params(bottom=False, left=False, right=False, top=False)
plt.gca().spines['bottom'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)

h = np.sqrt(3.0)*0.5

#内側目盛
for i in range(1,10):
    ax1.plot([i/20.0, 1.0-i/20.0],[h*i/10.0, h*i/10.0], color='gray', lw=0.5)
    ax1.plot([i/20.0, i/10.0],[h*i/10.0, 0.0], color='gray', lw=0.5)
    ax1.plot([0.5+i/20.0, i/10.0],[h*(1.0-i/10.0), 0.0], color='gray', lw=0.5)

#外周
ax1.plot([0.0, 1.0],[0.0, 0.0], 'k-', lw=2)
ax1.plot([0.0, 0.5],[0.0, h], 'k-', lw=2)
ax1.plot([1.0, 0.5],[0.0, h], 'k-', lw=2)
    
#頂点のラベル
ax1.text(0.45, h+0.02, 'x', fontsize=16)
ax1.text(-0.1, -0.02, 'y', fontsize=16, rotation=300)
ax1.text(1.03, -0.02, 'z', fontsize=16, rotation=60)

#軸ラベル
for i in range(1,10):
    ax1.text(0.5+(10-i)/20.0, h*(1.0-(10-i)/10.0), '%d0' % i, fontsize=10)
    ax1.text((10-i)/20.0-0.04, h*(10-i)/10.0+0.02, '%d0' % i, fontsize=10, rotation=300)
    ax1.text(i/10.0-0.03, -0.025, '%d0' % i, fontsize=10, rotation=60)
```

一辺の長さが1の正三角形を描いて，もともとのx軸y軸を消して無理やり描いています笑

点$(x, y, z)$を$(X, Y)$座標に変換してplotするには，

```math
X = z + \frac{x}{2}\\
Y = \frac{\sqrt{3}}{2}x
```
とすればOKです．


### 関連記事
[matplotlibで三角グラフを作成する 2](https://qiita.com/kumamupooh/items/f42920bd2770689fc2c0)
jQueryのajaxデバッグ方法

表題の通り、jQueryのajaxをデバッグするには、コールバックを登録すればいいらしい。
ついでにキャッシュも無効化しよう。

```js:before.js
$.ajax({
    type: 'GET',
    url: '/api.php',
    dataType: 'json',
    data: {
        hoge: 'hage'
    },
    async: false
})
.done(function(response) {
    result = response;
})
.fail(function () {
    console.log('error');
});
```

```js:after.js
$.ajax({
    type: 'GET',
    url: '/api.php',
    dataType: 'json',
    data: {
        hoge: 'hage'
    },
    async: false,
    cache: false,
    success: function(result){
      console.debug("result" + result);
    },
    error: function(jqxhr, status, exception) {
      console.debug('jqxhr', jqxhr);
      console.debug('status', status);
      console.debug('exception', exception);
    }
})
.done(function(response) {
    result = response;
})
.fail(function () {
    console.log('error');
});
```
GitHubでリポジトリをフォークしてプルリクを送る方法

# はじめに
チーム開発の際、リポジトリ作成者以外はGitHubからリポジトリをフォークするという指示があったもののプルリク送る時に戸惑ったので、メモ。

## チーム開発でのリポジトリ管理
GitHubにはforkという機能があり、これを利用することで、オリジナルのリポジトリを共有しての作業ではなく、個別に共有したいリポジトリでの作業を行うことを可能とする。クローンによく似ているが、オリジナルのリポジトリにプルリクを送りたい場合はフォーク、送る必要がない場合はクローンと使い分けるものだと思われる。

## フォークしてプルリクを送るまで
リポジトリ作成者が作ったものをブラウザでフォーク→ローカルにクローン→変更、修正後にプッシュ→ブラウザでプルリク(この時、フォーク元のリポジトリか、自身のリポジトリへのプルリクか選択できる)という簡単な流れ。GitHub公式がチュートリアルでSpoon-Knifeというリポジトリを用意しているので気軽に試すことができる。

戸惑ったところがブラウザでのプルリク。普段はもっぱらGitHub　Desktopを利用していたため、GitHubからもプルリクができるということが抜けていた。Desktopからプルリクを送るとリポジトリ選択はできずフォーク元へのプルリク一択となる。
Devise + Omniauthでデフォルトのルーティングがなくなった時の対処法

色々サイトを参考にdeviseを使った、sns認証を実装していたら、ルーティングについてちょっと詰まったので、備忘録として記録します。

# 開発環境
- ruby 2.4.5p335 (2018-10-18 revision 65137) [x64-mingw32]
- Rails 5.2.3
- devise (4.6.2)
- omniauth-facebook (5.0.0)
- omniauth-google-oauth2 (0.6.1)
- dotenv (2.7.2)

# Gemインストール
上記の開発環境からdevise以下のgemをGemfileに追加します。

```ruby:Gemfile
gem 'devise'
gem 'omniauth-facebook'
gem 'omniauth-google-oauth2'
gem 'dotenv'
```

追加したら、忘れずに `bundle install　--path vendor/bundle` しましょう。
※dotenvは、git管理をする場合などに外に漏洩してほしくないデータを環境変数として定義することで秘匿性を高められる便利なgemです。

このページに来ている人はある程度の設定ができているはずなので、細かい設定は割愛します。
#### 参考記事

- [[Rails] Facebook/Twitter/Googleでのユーザー登録をDevise & Omniauthを使って爆速で実装する｜Qiita](https://qiita.com/kazuooooo/items/47e7d426cbb33355590e)

- [RailsにDotenvを導入！環境変数を管理しよう！｜TickleCode](http://ticklecode.com/dotenv/)

# 解決法
ルーティングを変更します。
おそらく変更前はこのような記述になっていると思います。
deviseのモデル名によって `user`部分を任意に変更してください。
ルーティングがまだこの形になっていない場合は。上記の記事を参考に実装していきましょう。

```ruby:routes.rb
  devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
```

変更後

```ruby:routes.rb
  devise_scope :user do
    devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
  end
```

これで、デフォルトのルーティングが復活したと思います。
Bootstrapをカスタムしてインスタ(instagram)みたいなお洒落なモーダルを作る。

# はじめに

Railsで作ったWEBアプリケーション[fitness innovator](http://fitness-innovator.com/)
※現在停止中

インスタっていちいちオシャレなので、モーダルを真似しちゃいました。

Bootstrapの導入方法に関しては、ググれば沢山出てくるので今回は割愛します。

今回はこういうのを作っていきます。

<img width="729" alt="スクリーンショット 2019-04-23 12.23.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/5c665d24-a86b-d83b-955f-886202c146b4.png">

## Bootstrap4のデフォルトのモーダル

<img width="913" alt="スクリーンショット 2019-04-23 12.23.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/c8348490-19e5-b55f-96df-972bd9ed538c.png">

上からフワッと出てくるやつです。

こいつをカスタムしていきます。

## HTML

```HTML:xxx.html
~~省略~~
<div class="xxx" data-toggle="modal" data-target="#myModal">
<!-- この要素をクリックするとモーダルが出現します -->
</div>
~~省略~~
<!-- モーダルの設定 -->
<div class="modal" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title mx-auto" id="exampleModalLabel">プロフィール写真を変更</h4>
      </div>
      <div class="modal-body">
        <span class="link-font">写真をアップロード</span>
      </div>
      <div class="modal-body">
        <span class="denger-link">現在の写真を削除</span>
      </div>
      <div class="modal-body-b">
        <span data-dismiss="modal">キャンセル</span>
      </div>
    </div>
  </div>
</div>
<!-- モーダルの設定 -->
```
`data-target="#myModal`の要素をクリックするとモーダルが出現します。

classを指定してcssをカスタムしたり、ボタンにしたり、画像にしたり、好きなように設定していきます。

`modal-body`の中は好きなようにカスタムしてください。

僕の場合は、Railsでアプリを作ったので、`link_toメソッド`でリンクにしました。

## CSS

```css:xxx.scss
body{
  background-color:#FAFAFA;
  color: #262626;
  font-size: 14px;
  font-family: -apple-system,BlinkMacSystemFont,
  "Segoe UI",Roboto,Helvetica,Arial,sans-serif;
}

h4{
  font-size: 18px;
  font-weight: 600;
}

.link-font, a.link-font{
  color: #3897F0;
  font-weight: 600;
  cursor: pointer;
}

.denger-link, a.denger-link:hover{
  font-weight: 600;
  color: #ed4956;
  cursor: pointer;
}

// モーダルの設定
.modal .modal-dialog.modal-dialog-centered{
  -webkit-transform: translate(0, 0);
  transform: translate(0, 0);
}
.modal-content{
  width: 80%;
  margin: 0 auto;
  text-align: center;
  border: 0px;
  border-radius: 12px;
}
.modal-header{
  padding: 25px;
  border-bottom: 1px solid #efefef;
}
.modal-body{
  padding: 11px;
  border-bottom: 1px solid #efefef;
}

.modal-body-b{
  padding: 11px;
  cursor: pointer;
}
```

`transform: translate`で画面中央にモーダルが出現するように設定しています。

`.modal-content`のwidthを80%にすることで、モバイルで見てもモーダルが綺麗に表示されると思います。


<img width="421" alt="スクリーンショット 2019-04-23 12.34.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335670/24c3b6de-b089-7017-7fed-807dfb6e75db.png">

注意点として、Bootstrapを上書きするcssファイルはBootsrapよりも後に読み込むように設定してください。

以上で完成です:v:
PowerShell デスクトップにショットカット作成

#環境変数を使う

```PowerShell
function New-Shortcut() {
    $lnkName = "アイコン名"
    $path = "C:\TEST\PwToy.exe"

    $wshShell = New-Object -ComObject "Wscript.Shell"
    $shortcut = $wshShell.CreateShortcut("$Home\Desktop\${lnkName}.lnk")
    $shortcut.TargetPath = $path
    $shortcut.Save()
}
```

#参考
- 環境変数の一覧と既定値
- https://www.tipsfound.com/windows10/11010
cloud9上でのsinatra環境の構築メモ

## 1. gemがインストールされているか確認
`$ gem`
## 2. bundlerのインストール
`$ gem install bundler`
## 3. bundlerの初期化
`$ bundle init`
→Gemfileが生成される
## 4. Gemlileにgemを記入
`gem "sinatra"
gem "sinatra-reloader"
gem "sinatra-activerecord"
gem "sqlite3"
gem "rake"`
##5. gemを一括でインストール
`$ bundle install --path vendor/bundle`
※次回からは`--path vendor/bundle`を記憶するらしい
##6. app.rbを作成＆requireを記述
`require 'rubygems'
require 'bundler'`
##7. 動作確認
```ruby:app.rb
puts 'Hello!'
```
`$ bundle exec ruby app.rb`

##参考
https://qiita.com/oshou/items/6283c2315dc7dd244aef
【vim】インサートモード中に方向キー以外で移動する

久しぶりにQiitaに投稿。

ブログに書くのが面倒だったので、こちらに簡単に書こうと思います。単なる備忘録です。

@suin さんの記事( https://qiita.com/suin/items/aec243abfda17bfac013 )を参考にさせていただきました。

## 割り当て方

インサートモードにおける割り当てコマンドは `inoremap` です。

以下が `.vimrc`

```.vimrc

""""""""""""""""""""""""""""""
" インサートモード中のキーマップ変更
""""""""""""""""""""""""""""""
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-h> <Left>
inoremap <C-l> <Right>
""""""""""""""""""""""""""""""
```

ノーマルモードと同じキー割り当てにしてます。

もしかしたら、既存の割り当てとぶつかってるかもしれませんが、いまのところ特に不便はないです。
簡単なVisual Studio Codeの拡張機能(Extension)を作ってみた

会社の新卒課題の様なものでVSCodeの拡張機能を自作することになったので、ツールの導入やらを備忘録として残そうかと思います。
ついでに今現在作っているクソコードも紹介したいと思います。

TypeScript素人なので間違ったコードを書いているかと思いますが、大目に見てやってください(懇願)

## ～ざっくりとした一連動作の箇条書き～
1. Node.jsをインストール
2. npmにてyoとgenerator-codeをインストール(1と2は初回のみ。以後新しく拡張機能を作る際は3と4を実行する)
3. yoを使い拡張機能のひな形プロジェクトを作成
4. VSCodeにて3.で作ったひな形プロジェクトを開く
5. `F5`押下でデバッグ、新規ウィンドウのコマンドパレット(`Ctrl+Shift+P`)に`Hello World`と入力し実行すると、画面右下にメッセージが出てくる

## ～ツールの導入・ひな形プロジェクトの作成～
実行環境:Windows8.1 64bit / Windows10 Home 64bit

1. [Node.js](https://nodejs.org/ja/)をインストール(私はLTS版にしました)
2. ターミナルを開き`npm install -g yo generator-code`とコマンドを入力(ターミナルはCmderを使いました)
3. インストールが終わったら、カレントディレクトリをworkspaceディレクトリなどにしておき、`yo code`と入力し実行してください。<br>
レポート送信(?)について聞かれるのでY/Nで答えて頂ければと。<br>
答えると以下画像のような画面になるかと思います

<img width="459" alt="yo.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230050/c46fa943-d58f-1b6f-908f-55d421fe7f8c.jpeg">

どういうタイプ(種類?)の拡張機能を作るのか聞かれるので、`New Extension(TypeScript)`に矢印キー上下で選択し、Enterキー押下で決定。
名前やID、拡張機能の説明などを聞かれるので以下画像を参考にして頂ければ幸いです

<img width="459" alt="new.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230050/4967286a-bc04-cc30-4a88-77ea604d69bc.jpeg">

最後の質問まで答えた状態がこちら

<img width="459" alt="new2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230050/4b1c9d41-5b8f-14fd-ecba-35ef3fd22069.jpeg">

これでプロジェクトのひな形が作れたのでこれをベースに自作していきます。


## 作りかけコードの紹介
入力ボックスに書いた文字列をソースコード内で指定した文字に置換するというサンプルコードを紹介したいと思います。

VSCodeショートカットキーの設定
(`Ctrl+Shift+P`押下でコマンドパレットに`keyboard`と入力し、**Open Keyboard Shortcuts File(JSON)**を選択)

``` keybindings.json
[
    {
        "key": "ctrl+shift+l",
        "command": "extension.sample",
    }
]
```

``` extension.ts
import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
	console.log('Congratulations, your extension "sample" is now active!');

	let disposable = vscode.commands.registerCommand('extension.sample', () => {
		showInputBox();
	});

	context.subscriptions.push(disposable);
}

export function deactivate() { }

export function showInputBox() {
	let value = {
		password: false,
		value: ""
	};

	vscode.window.showInputBox(value).then(replace);
}

export function replace(str?: string) {
	const editor = vscode.window.activeTextEditor;

	if (typeof editor !== 'undefined') {
		let doc = editor.document;

		if (!str) {
			vscode.window.showErrorMessage('no strings');
		} else {
			editor.edit((edit) => {
				edit.replace(new vscode.Range(0, 0, doc.lineCount + 1, 0), doc.getText().split(str).join('置換'));
			});
		}
	}
}

```

JavaScript/TypeScriptには**replaceAll()**メソッドがないんですね。1時間くらい悩んでました(undefinedのエラーも含め格闘してました)
TextEditorに対する変更処理は`vscode.commands.registerTextEditorCommand()`だけなのかと思っていましたがそうではなかったようです。

## 参考サイト
- [Visual Studio Code はじめての拡張機能開発](https://qiita.com/rma/items/8c53077d1355ab8fa4c6)
- [Visual Studio Codeの拡張機能を自作して、理想の執筆環境を手に入れた 〆(ﾟ_ﾟ*)](https://qiita.com/piyo7/items/4202189d523572da736a)
- [初めてのVSCode Extension公開](https://qiita.com/yutana/items/9e2ac81a4f01f3fb83b8)
Vue.jsでツイッターのシェアボタンのテキストを動的に変更する

# 発生した問題
Twitter公式のシェアボタンはツイート内容を動的に設定できない。

そのため、ユーザの操作結果に応じた内容をつぶやかせたいときは、何らかの工夫が必要になる。

実際の例：https://qiita.com/teru0x1/items/070526cb40b4be9f0514#twitter%E3%81%AE%E3%82%B7%E3%82%A7%E3%82%A2%E3%83%9C%E3%82%BF%E3%83%B3

[ボタンを JavaScript で都度生成する API](https://qiita.com/lovesaemi/items/d4f296b6b1d5158d2fea) もあるが、直接 DOM を操作するため Vue との相性があまりよろしくない。

# 解決編

自分でボタンを作ってみた。
デモ: https://codepen.io/POPOPON/pen/MRqgPv

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123809/dd9d5bfa-e38d-496d-9198-9e1ee16386a4.png)

単純にシェア用のURLをそのまま`Window.open`の引数に指定している。

```javascript:methods
methods: {
    popUpTweetWindow() {
      const url = `https://twitter.com/intent/tweet?text=${this.message}&url=${this.siteUrl}` 
      const option = 'status=1,width=818,height=400,top=100,left=100'
      window.open(url, 'twitter', option)    
    },
}
```

デザインは入れていないので、青鳥のロゴ等は自分で設定する必要がある。
またあくまで非公式なやり方なのでそこは注意が必要。
自分の棚卸し

自分の棚卸し（新規2019年4月23日）

改めて自分がどんなことを実施してきたか、振り返ってみる。
後で付け足すことがあれば付け足す。

## 資格

IT系に関する資格は以下かな。

* PMP（2回更新済み）
* ネットワークスペシャリスト

他にも「教員免許」とか「危険物取扱」とかを所有しているけど、割愛。

## ここ最近で構築したシステム

いずれも要件定義から設計、構築、運用まで実施。ただ、ネットワーク・セキュリティの案件は運用後2ヶ月したら、プロジェクトを離れた。

* オンプレサーバのネットワーク接続、各種通信設定
* プライベートクラウドの構築
* ネットワークセキュリティ構築（フォレンジック、サンドボックス等）


20名前後のメンバーがいるチームのリーダー。


## 使用した技術とか

### ルーティング

* スタティック
* BGP
* EIGRP
* OSPF

### 暗号化

* IPSec
* SSL/TLS

## 

## 使用した機器

使用した経験のある機器は以下。

Cisco製品はconfig書けるレベル。それ以外の機器はconfigレビュー程度。

* Cisco Nexus7000シリーズ
* Cisco Catalyst3500、3700、3800シリーズ
* Cisco Catalyst2000シリーz
* Cisco ISR800,1000シリーズ
* Cisco ASR1000シリーズ
* Cisco ASA5500シリーズ
* F5 BIG-IP LTM6900シリーズ
* F5 BIG-IP LTM5000sシリーズ
* BlueCoat ProxySG
* Gigamonシリーズ
* Fireeye NX、MX
プログラミング初心者がProgate PHP学習コースⅡで学んだこと

#はじめに

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンに参加している、tomokiyo_hiromuです。
今回は、Progate PHP学習コースⅡを終えて学んだところを発信しようと思います。

#オブジェクト指向とは
オブジェクト指向とは、プログラミングを手順ではなく、モノの作成と操作として見る考え方のことです。
「こういうモノを作り、使おう」というのが考え方の基本です。
クラスを作成し、インスタンスを変数や引数などで操作します。


#コンストラクタと引数
newを用いてインスタンスを生成すると、__constructのメソッドが自動的に呼ばれるというものです。
以前は引数の概念をきちんと理解できていなかったので、復習がてらもういちど勉強できてよかったです。



#HTMLにPHPを組み込む
当初、なぜこのようなことをするのか意味が分かりませんでした。
しかし、これにはユーザーがフォームに入力した情報をデータベースに表示できるという、便利な機能があるそうです。
データの数が多くなったときに便利だと感じました。


#まとめ
関数同士が対応していたり、HTMLに埋め込むことで画一化したりと、作業が複雑になってきています。
ある程度作業のスピードが落ちるのは仕方ないことだと割り切って、一つずつ意味を確認しながら作業を進めていきたいです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
最後まで読んでいただき、ありがとうございました。
macのchromeでページ先頭へ移動するボタンを設置する方法

ブラウザでQiitaなんかの縦長のページを読んだりすることはままあるかと思います。一通り最後まで読んで、さて最後にタイトルでも見返すか、先頭に戻ろー、というところで…WindowsならHomeキーで一発なんですが、愛用ブラウザであるところのmacのchromeには"ページ先頭へ戻るショートカット"が存在しないんですね（[ヘルプ参照](https://support.google.com/chrome/answer/157179?hl=ja)）。

スクロールで戻ってもいいんですが、いかにもメンドクサイ。そこで今回はブックマークレットで解決してみました。

# ページ先頭へ移動するブックマークレットの設置手順

## 1. 適当なページでブックマーク追加ダイアログを表示
適当なページを開いてブックマーク追加のダイアログを開きます。新しいタブでOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23715/0bd4f844-fda0-3259-b214-0574863fe875.png)

## 2. ブックマークレットの処理を記述

名前欄にお好みのラベルを（図ではtop）、URL欄にページ先頭に戻る処理を記述します。今回は```scrollTo()```を使いました。ブックマークレットの作法に従って```javascript:```の後に処理を記述します。

```javascript
javascript:window.scrollTo(0,0)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23715/9fe6461d-8a6c-2313-c747-a37a97f81926.png)

# いざトップへ

ページ一番下に移動しておもむろにブックマークバーに設置したtopボタンを押すと…

![totop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23715/c9ca6f2f-605a-84d6-cd7d-03cbc2827bd4.gif)

…これが本当に便利かは、これから使って確かめます！
AsusのFX504にUbuntu 18.04をインストールしたとき、起動しない・再起動できないなどの問題対応

# 初回起動時
Ubuntuを選択する画面で`e`を押してGRUBの編集画面に入る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68213/64e8f677-91d1-2ed0-5981-513d33fb4e4a.png)


そこでlinuxから始まる行の最後に`acpi_osi=Linux nouveau.modeset=0`（画像は`acpi=off`になってます）を加えて、ctrl xを押して起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68213/bedd4925-96a9-8d2d-65a3-7a7a799e3dcf.png)

# その後永続化させるために
`sudo gedit /etc/default/grub`でエディタを起動。
`GRUB_CMDLINE_LINUX_DEFAULT`の行を探し、`acpi_osi=Linux nouveau.modeset=0`を追加する。
`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_osi=Linux nouveau.modeset=0"`のようになる。
その後、`sudo update-grub`を実行。

# 参考
http://ubuntuguide.net/turn-off-acpi-ubuntu-grub2
https://dk4g.blogspot.com/2018/12/installing-linux-on-asus-tuf-fx504-ge.html
https://qiita.com/hidehiro98/items/0526cfe8f42c88d60498
SQL Server:オンコール担当者のためのDMVクエリを使ったDB調査手順

SQL Serverを使ったシステムのオンコール担当者が知っておくと便利だと思うDMVクエリの使い方をまとめてみました。もちろんオンコール担当者じゃなくてもトラブルシューティング等に使っていただける手順かと思います。

[現在実行中のクエリ](https://github.com/masaki-hirose/SQLServer-Info/blob/master/%E7%8F%BE%E5%9C%A81%E7%A7%92%E4%BB%A5%E4%B8%8A%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%AA%E3%82%B9%E3%83%88.sql)を実行するところから調査を出発するのがおすすめです。

### チェックするポイント
####1. 通常時と比べて、大量にレコードが取得されていないか
オンコール担当者がこのクエリを実行するときは、なんらかのエラーやアラートを受け取り、その原因がDBにあるのでは、と疑ったときです。
そのため、通常時と比べて大量にクエリが実行中の場合は、DBに原因があるという疑いを強めることができます。考えらえる原因は複数ありますので、よくみる原因について以下にまとめたいと思います。
逆に、通常時と比べてあまり変化が無い場合は、DB以外の原因（アプリ側等）についても考えを巡らせる必要があるかもしれません。

####2. ブロッキングは起きていないか
ブロッキングが起きている場合は、head blockerを特定します。
以下のように、blk_spidに0以外の数字が表示される場合は、ブロッキングが発生しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/a46682c7-734a-52a3-7cd6-ea0d21d2916d.png)

[Microsoft MVPの小澤さんが公開しているこちらのクエリ](https://github.com/MasayukiOzawa/SQLServer-Util/blob/master/Lock/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AE%E5%8F%96%E5%BE%97.sql)を使うと簡単にhead blockerを特定することができます。
head blockerを特定できたら、以下の点に着目します。
・head blockerはどんなクエリか？
・head blockerのホスト名は？（誰かが手動で投げたクエリの可能性もある）
・head blockerの数は？(1つのhead blockerが大量プロセスをブロックしていることが多い）
・head blockerのstatusは？(sleepingならkillを検討）

ブロッキングが起きている場合は、以下のような情報が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/59c18c3b-b074-bc3d-b654-db590837bcac.png)

head blockerのプロセスID(spid)から、該当プロセスをさらに詳細に見たいときは以下のクエリを実行します。

```sql
sp_who2 プロセスID
dbcc inputbuffer(プロセスID)
```

####3. 同じようなクエリが大量に取得されていないか
特定のストアドプロシージャやプリペアドステートメントのみが大量に実行中である場合は、実行プランがおかしくなっている可能性があります。該当クエリのリコンパイルにより解消される可能性があります。

■ ストアドプロシージャの場合

```sql
EXEC sp_recompile N'ストアド名'; 
```

■ プリペアドステートメントの場合

```sql
DBCC FREEPROCCACHE(sql_handle)
```
※plan_handleは「現在実行中のクエリ」を取得するクエリで確認できます。

####4. wait_typeおよびlast_wait_typeに偏りがないか
wait_typeおよびlast_wait_typeには、クエリが現在および最後に待ち状態になったときの待ち項目が表示されます。何度実行しても同じ項目名の場合は、そのwait_typeからクエリのボトルネックを特定できる可能性が高いです。以下によくみるwait_typeと、解消のために試す価値のある行動についてまとめました。


**PAGEIOLATCH_SH**
　概要：物理ディスク読み込み完了待ち
　行動：実行プランが最適なものでない可能性があるため、該当クエリをリコンパイル
**RESOURCE_SEMAPHORE / RESOURCE_SEMAPHORE_QUERY_COMPILE**
　概要：メモリリソースの獲得待ち
　行動：実行プランが最適なものでない可能性があるため、該当クエリをリコンパイル。あわせて、[このクエリ](https://github.com/masaki-hirose/SQLServer-Info/blob/master/%E7%8F%BE%E5%9C%A8%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E4%BD%BF%E7%94%A8%E9%87%8F.sql)を使ってメモリを大量に消費しているクエリが無いかチェックする。
**SOS_SCHEDULER_YIELD**
　概要：CPUリソースの獲得待ち
　行動：実行プランが最適なものでない可能性があるため、該当クエリをリコンパイル
**LCK_M_*** **
　概要：ロックの獲得待ち
　行動：ブロッキングチェーンの取得クエリを実行し、head blockerを突き止める
**ASYNC_NETWORK_IO**
　概要：プログラム側でレコードセットの処理完了待ち
　行動：この待ちは特に問題ないことがほとんどのため静観
**THREADPOOL**
　概要：ワーカースレッド獲得待ち
　行動：スロークエリが大量発生しているはず。ブロッキング発生状況など、なぜスロークエリが多発しているのか原因を調査する。


####まとめ
現在実行中のクエリリストを取得し、現状を把握することが問題解決の第一歩だと思います。
また、注意点として例えばチューニング不足で日常的に「PAGEIOLATCH_SH」で長時間待つクエリが発生しているようなケースだと、リコンパイルではなくインデックス作成等の根本的なクエリチューニングが必要になります。今回紹介した考え方のほとんどは、あくまで「いつもは問題が起きていないサーバーで突然何らかの問題が発生した場合」に焦点を当てています。
以上、オンコール担当者の方の参考になれば幸いです。