OmniAICreator/Qiita-1.07M huggingface dataset:
初学者用ショートカットキー　７選

# プログラミング初学者・初心者用 <br> 使って気持ちいいShort-cut Key　７選
##【はじめに】
「本稿は、Mac買いたて、右も左も分からない
　圧倒的初学者の方を想定して書いております。
　既にショートカットマスターであらせられるお方は、
　お手数でございますが、
　「 ⌘ + W 」のコマンドにて、
　本タブを削除していただければと存じます。」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/274878/ec6ddf81-0902-445b-966a-ebf00524d180.png)

皆様、日々のプログラミングのお勉強お疲れ様です。

中村でございます。

初学者の方におかれましては、
慣れないPC操作でもご苦労なさっていることと存じます。

そこで、この度、皆様の努力が最大化されるよう、
直ぐに役立つであろうショートカットキーをおまとめ致しました。

皆様方の日々の学習が爆速化されると幸いでございます。

あなたのプログラミング人生に幸あれ。

<br>
・
・
・
因みに説明の語彙力は控えめに言ってクソでございます。

ご容赦くださいませ。

🌾また個人的都合上、Mac user かつ Google Chrome User を想定して書いております。あしからず。


##①　⌘　＋　⬆︎（Shift）　＋　T
###

(直前に消したタブを復元する。）

##②　⌘　＋　W

（現在開いているタブを削除する。）

##③　⌘　＋　T

（新規タブを作成する。）

##④　⌥　＋　⌘　＋　◀️　or　▶️ 

（ブラウザのタブを切り替える。）

##⑤　⌘　＋　◀️　or　▶️ 　　(　{　or　}　でも可　)

(前の画面に戻ったり、次の画面に進んだりできる。）

##⑥　tab　＋　⌘

（開いているもので、アプリケーションから他のアプリケーションへ切り替えができる。）

##⑦　⌘　＋　D　　←　recommended!

（ブックマークに登録する。）

『名前』を全削除して登録すると、下の画像の様にテンション上がる感じになります。↓

<img width="1597" alt="スクリーンショット 2019-04-03 10.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/274878/ba1377c8-75b9-c7e1-c8c4-9754c0563fe4.png">
0からはじめるelm-ui#3-並べる

# 今日おぼえること

`Element.column`と`Element.row`で要素を縦横に並べること

```elm
row    : List (Attribute msg) -> List (Element msg) -> Element msg
column : List (Attribute msg) -> List (Element msg) -> Element msg
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74093/371bd730-0d3a-b357-0835-1393e0771619.png)

[できるもの](https://ellie-app.com/592Pcph6bMwa1)


```elm
module Main exposing (main)

import Element exposing (..)


main =
    layout [] <|
        column []
            [ column []
                [ text "c"
                , text "o"
                , text "l"
                , text "u"
                , text "m"
                , text "n"
                ]
            , row [] [ text "r", text "o", text "w" ]
            ]

```
# はじめに

[#2](https://qiita.com/miyamo_madoka/items/dcb720ad324ee4246a94)では`el`を使ってスタイリングしてみました

今日は複数の要素を横並びにしたり縦並びにしたりします

# `column`で縦並びにする

```elm
column []
    [ text "c"
    , text "o"
    , text "l"
    , text "u"
    , text "m"
    , text "n"
    ]
```

これで縦に並びます。そのままですね

# `row`で横並びにする

```elm
row [] [ text "r", text "o", text "w" ]
```

これで横に並びます。そのままですね

本編は以上です、以下余談

## rowとcolumnの方向の覚え方

[ひと目でわかる行列（Row ・ Column）の方向の覚え方](https://lambdalisue.hatenablog.com/entry/2013/07/18/134507)から引用します

> Row・Columnの覚え方: 大文字で書いた際に穴を作るために加える棒の方向が一致する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74093/d8c9c00c-1da5-7160-dd89-45baeb26154a.png)

<p><a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.ja"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="http://i.creativecommons.org/l/by/3.0/88x31.png"></a><br>This 作品 by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Λlisue</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.ja">Creative Commons 表示 3.0 非移植 License</a>.</p>

わざわざ覚えなくても間違えたら逆にすればいいだけなので特に問題ないと思います

## flexboxって？

素のHTML、CSSだと横に並べるときはまずflexboxってのを覚えてね……って続けようと思ったんですけど「css 横並び」で検索するとinline-blockとかfloatとかが最初にでてきてて古いなって思いました

elm-uiだとものを並べるときは何も考えずに`row`か`column`を使えばいいです（他の選択肢がほぼない）。中身が分からないと困るときもあるかもしれません。実装にはflexboxが使われています

flexboxの詳しい説明はしませんがゲームだけ紹介します
[FLEXBOX FROGGY](https://flexboxfroggy.com/#ja)
楽しく学べるよ！

# 宿題

[パッケージドキュメント](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/Element)で複数のElementを受け取ってElementを返す関数に何があるか調べてみよう

> ヒント: `List (Element msg)`でページ内検索すると出てくるよ

# 終わりに

今日は`row`と`column`で要素を横や縦に並べられるようになりました

次はみんなお待ちかねの上下左右中央揃えをしようと思います
Q. apacheのバーチャルホスト毎の設定でpost_max_size変えたい

A. apacheのconfか、.htaccessで出来る。

https://www.php.net/manual/ja/ini.list.php
> post_max_size	"8M"	PHP_INI_PERDIR	 

https://www.atmarkit.co.jp/ait/articles/1112/21/news127.html
> PHP_INI_PERDIRはディレクトリごとの設定変更が可能なディレクティブです。.htaccessによる変更もできます。php.iniファイルでの設定ももちろん可能です。しかし、PHPプログラムからの変更はできません。

### --- apache設定の追加例

// PHP_Value PHP設定ディレクティブ1 設定値1
// PHP_Value PHP設定ディレクティブ2 設定値2

```
PHP_Value post_max_size 512M
```
Linear Approximation

- [Linear Approximation](https://atcoder.jp/contests/arc100/tasks/arc100_a)

## 考察

- 直感的にはbはAの平均値。計算してみるがサンプルと合わない。平均値は違う
- bは真ん中あたりを取りたい気持ちなので、b=Aの中央値というパターンも考えてみる。サンプルと合わない。中央値も違う
- 問題文を式にすると$\sum_{i=1}^{N}|A_i - (b - i)|$となる。この式を見ても特に何も思いつかない
- 式変形すると、$\sum_{i=1}^{N}|(A_i - i) -b|$となる。わかりやすさのため$B_i = A_i - i$とすると式は$\sum_{i=1}^{N}|B_i -b|$となる。これは地点bから地点$B_i$までの距離の総和という意味になる。意味のある式になって嬉しい気持ち。
- よって、この問題は「地点bからN個の点の間のマンハッタン距離の総和を最小化する」という問題に帰着できる。図にするとこんな感じ。bから各$B_i$への距離を求める問題になる。

![linear_approximation_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/218584/4a505adf-5a7c-58a7-5d9f-2160ec6e9ef6.jpeg)


- マンハッタン距離の総和を最小化するときは、中央値を使うという典型がある。よってbは数列Bの中央値であれば良い。



## お気持ちの証明

- マンハッタン距離の総和を最小化するときは中央値を使うといいってやつの証明
- N=5の場合を考える。
- 中央値からεずらすと、合計で-2ε + 3ε=εとなる。中央値からずらすとεだけ損害が出ることがわかるので、中央値からずらすべきではない。
- また、bが適当な位置にあった時、中央値に向かってずらすことを考える。すると、距離の合計は-4εされる。なので、中央に向かうと嬉しいことがわかる。
- 他の地点でも実験すると中央値を使うのがなんとなく正しいのがわかる。なんとなく。


<img width="751" alt="linear_approximation_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/218584/9722e838-2be2-b9ce-fbd7-bc41ea1fb08a.png">


- [解説動画](<https://www.youtube.com/watch?v=UX4AuiCVtN4)見た方が早い





## [コード](https://atcoder.jp/contests/arc100/submissions/4809991)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

int N;
vector<int> A, B;

int calc(int b) {
  int ret = 0;
  for (int i = 1; i <= N; i++) {
    ret += abs(A[i-1] - (b + i));
  }
  return ret;
}

signed main() {
  cin >> N;
  A.resize(N);
  B.resize(N);
  for (int i = 0; i < N; i++) {
    cin >> A[i];
    B[i] = A[i] - (i + 1);
  }

  sort(B.begin(), B.end());

  cout << calc(B[N/2]) << endl;

  return 0;
}
```

## 要点

- マンハッタン距離の差の総和を最小化するときは中央値を使う（典型らしい）

## メモ

- [はまやんさんの記事](https://www.hamayanhamayan.com/entry/2018/07/05/205935)。マンハッタン距離の差の総和を最小化するときは中央値という典型
- [競技プログラミングにおけるマンハッタン距離問題まとめ](https://www.hamayanhamayan.com/entry/2017/10/03/165802)。類題載ってる。
- [やまかささんの記事](https://yamakasa3.hatenablog.com/entry/2018/07/02/041604)
- お気持ちの証明はわかった。でもちゃんとした証明は書けない。えーん
- iPhoneは図を描くためのツールではない
nginxをDockerで利用している時に「413 Request Entity Too Large」で怒られたときの意外な原因

株式会社[NoSchool](https://corp.noschool.asia)でCTOをしている@mejilebenです。
今日は`docker`でハマったところを書きます。

# 概要
`nginx`を`Docker`で利用しているとき、`413 Request Entity Too Large`で怒られてしまう事案が発生しました。

その原因が、`nginx`のDockerではなく、その前段に構えていた`https-portal`というDockerコンテナだったので、メモついでに書き残しておきます。

# 構成
NoSchoolではローカルの開発環境を`Docker`で構成しています。

```yml:抜粋
  https-noschool:
    container_name: https-noschool
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    environment:
      STAGE: local
      DOMAINS: 'localhost -> http://nginx-noschool'
    volumes:
      - ./docker/https-portal/cert:/var/lib/https-portal
    depends_on:
      - nginx-noschool

  nginx-noschool:
    image: nginx:(VERSION)
    container_name: nginx-noschool
    volumes:
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./:/opt/noschool
    environment:
      TZ: Asia/Tokyo
    depends_on:
      - php-noschool

  php-noschool:
    build: ./docker/php-fpm
    container_name: php-noschool
    volumes:
      - ./:/opt/noschool
    working_dir: /opt/noschool
    environment:
      TZ: Asia/Tokyo
    depends_on:
      - php-front-noschool
```

`nginx`をhttpサーバー、PHPの実行環境としては`php-fpm`を利用し、本番同様`https`の環境を再現するために、[https-portal](https://github.com/SteveLTN/https-portal)を利用しています。

# 起こったこと
ローカルで画像を使った投稿を`POST`しようとすると、`413 Request Entity Too Large`と画面に表示され、動作しませんでした。

# 調べたこと
ググれば、要は`nginx`の`client_max_body_size`設定を書き換えることで上記の症状が治るとのことでした。デフォルトではリクエストの最大バイト数が1MBに設定されており、画像を添付するとゆうに超えてしまうということです。

# やったこと
上記設定の通り、`nginx`自体の設定ファイルは`./docker/nginx/default.conf`に置いてあるので、その中に`client_max_body_size 50M;`と書き加え、`docker-compose`を再起動しました。

しかし、それでも画像投稿時に同様のエラーが出てしまいました。

# 原因
`nginx`の前段に置いている[https-portal](https://github.com/SteveLTN/https-portal)が同様に`nginx`を利用して`https`化をしており、そこで引っかかっていたのが原因でした。

上記リポジトリのREADMEにも[Advanced Usage](https://github.com/SteveLTN/https-portal#advanced-usage)として設定方法が書かれているので、

```yml:docker-compose.yml
    environment:
      STAGE: local
      DOMAINS: 'localhost -> http://nginx-noschool'
      CLIENT_MAX_BODY_SIZE: 10M
```

というように、`docker-compose.yml`に最大リクエストサイズを指定してあげる必要があります。

# どうして分かったのか
普段開発するときは`docker-compose up -d`しているのですが、今回のように詰まったときは特に`docker-compose up`として、常に`Docker`側のログを吐き出すようにしています。

すると画像を`POST`したときにエラーログが流れてきたのですが、`nginx-noschool`コンテナのログではなく、`https-noschool`コンテナのログだったのです。

そこでREADMEを見に行った結果、内部的に`nginx`を使っているコンテナであることが判明し、今回の設定内容の変更に至りました。
※もちろん`nginx`側の設定変更も必要です。両方`client_max_body_size`の変更しないといけないのが少々面倒ではありますね。

# 教訓
- なんとなくで`docker-compose`していたらバグった時に戸惑うのでちゃんと把握しておきましょう←
- 困ったら`docker-compose up`でログ観察

# 最後に
僕が働いている[NoSchool](https://portal.noschool.asia/)では仲間を募集中です！
創業期真っ只中、社員は僕と社長の2人きり（+副業メンバー4人）でEdTechを変えに行ってます！

興味あればお茶でもしましょう。Twitterからの連絡でも大歓迎です！
https://www.wantedly.com/companies/noschool
fetchable

```js
 /*usage
fetchable('https://api.github.com/').then(d=>console.log('1',d))
fetchable('rrrrrrrrrrrrrhttps://api.github.com/').then(d=>console.log('2',d))
fetchable().then(d=>console.log('3',d))
*/ 
function fetchable(u){
 let url=u
 ,check=(d=>d.status!=401&&d.ok)
 ;
 try{
  return fetch(url).then(check).catch(d=>false)
 }catch(e){
  //cors block,network error,not bundle fetch,etc...
  return false;
 }
}

```
【elasticsearch】コマンド一つで大量データをindexに追加する

elasticsearch6.6.0で実施。

今回は一度に２件登録する仕様。
必要な分記述すればその数分登録できる。

##IDを指定する場合

```json:bulk.json
{ "index" : {"_id" : "1" } }
{ "field1": "hoge1", "field2": "hoge2", "field3": "hoge3" }
{ "index" : {"_id" : "2" } }
{ "field1": "hoge1", "field2": "hoge2", "field3": "hoge3" }
```

```shell

curl -H "Content-Type: application/json" -X POST http://localhost:9200/index名/type名/_bulk?pretty --data-binary @bulk.json
```

##IDを指定しない場合
自動でIDが振られる。

```json:bulk.json
{ "index" : {} }
{ "field1": "hoge1", "field2": "hoge2", "field3": "hoge3" }
{ "index" : {} }
{ "field1": "hoge1", "field2": "hoge2", "field3": "hoge3" }

```

```shell

curl -H "Content-Type: application/json" -X POST http://localhost:9200/index名/type名/_bulk?pretty --data-binary @bulk.json
```

##indexもtypeもidもjson内に記述する場合

```json:bulk.json
{ "index" : { "_index" : "index名", "_type" : "type名", "_id" : "1" } }
{ "field1": "hoge1", "field2": "hoge2", "field3": "hoge3" }
```

```shell

curl -H "Content-Type: application/json" -X POST http://localhost:9200/_bulk?pretty --data-binary @bulk.json
```


## 応用
以下の記事で、jsonをpythonで自動生成するプログラムも紹介してます。
[【elasticsearch】【python】bulk APIで使うjsonをcsvから動的に生成する](https://qiita.com/dai-maru/items/aca0a490ea3cff6b169d)
ABC - 079- A&B&C

#AtCoder ABC 079 A&B&C
[AtCoder - 079](https://atcoder.jp/contests/abc079)

#A問題

 - 同じ数値が連続3回以上続くかを判定
    - Aにしてはコードが長い・・・
 - 多分、char[]にしてMapにputしてcountするでもよかったか

```java
private void solveA() {
		int numN = nextInt();

		out.println(chkA(numN) ? "Yes" : "No");
	}

	private boolean chkA(int num) {

		boolean isGoodnum = false;
		int cnt = 0;
		int previous = 0;
		for (int i = 0; num != 0; i++) {
			if (i == 0) {
				//初期化
				previous = num % 10;
				num /= 10;
				cnt = 1;
			} else {
				int current = num % 10;
				if (previous == current) {
					cnt++;
				} else {
					//countやり直し
					cnt = 1;
				}
				previous = current;
				num /= 10;
			}
			if (cnt >= 3) {
				isGoodnum = true;
			}
		}
		return isGoodnum;
	}
```

#B問題

 - {$L_0=2,L_1=1$}だけ先に定義
 - 後は問題どおり
 - ただし、{$N=1$}の時だけ{$1$}を出力するよう分岐

```java
	private void solveB() {
		int numN = nextInt();

		if (numN == 1) {
			out.println(1);
			return;
		}

		long val1 = 2;
		long val2 = 1;
		long res = 0;
		for (int i = 0; i < numN - 1; i++) {
			res = val1 + val2;
			long temp = val1;
			val1 = val2;
			val2 = val2 + temp;
		}

		out.println(res);
	}
```

#C問題

 - operandを$+/-$を全パターン試して合計が7になるのか調べる

```java
private void solveC() {

		int num = nextInt();

		int[] args = convC(num);

		int[] wk = new int[4];

		int res = chkC(args, 0, wk, 0, 0);

		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < wk.length; i++) {
			if (i == 0) {
				builder.append(args[i]);
			} else {
				switch (wk[i]) {
				case 1:
					builder.append("+");
					break;
				case 2:
					builder.append("-");
					break;
				}
				builder.append(args[i]);
			}
		}

		builder.append("=7");
		out.println(builder.toString());
	}

	/**
	 * 数値を配列に変換
	 * @param num
	 * @return
	 */
	private int[] convC(int num) {
		int[] wk = new int[4];
		for (int i = wk.length - 1; i >= 0; i--) {
			wk[i] = num % 10;
			num /= 10;
		}
		return wk;
	}

	/**
	 * 再帰で加減算を行う
	 * マジックナンバーだが、+ => 1/- => 2
	 * total=7になったら終了
	 * @param args
	 * @param total
	 * @param wk
	 * @param currentI
	 * @param operand
	 * @return
	 */
	private int chkC(int[] args, int total, int[] wk, int currentI, int operand) {

		if (currentI >= 4) {
			return total;
		}
		if (currentI == 0) {
			total += args[0];
		} else {
			switch (operand) {
			case 1:
				total += args[currentI];
				wk[currentI] = operand;
				break;
			case 2:
				total -= args[currentI];
				wk[currentI] = operand;
				break;
			}
		}

		int val1 = chkC(args, total, wk, currentI + 1, 1);
		if (val1 == 7) {
			return 7;
		}
		int val2 = chkC(args, total, wk, currentI + 1, 2);
		if (val2 == 7) {
			return 7;
		}

		return -1;

	}
```
【PL/SQL】レコードの縦横変換

#レコードの縦横変換
##やりたいこと
下記の表のように発注ごとに商品の売り上げ金額を持っているような場合に、発注IDごとの集計をするために縦横変換を行いたい。

**元データ**

| 発注ID       | 商品 |  金額  |
|:----------------:|:-----------------:|:------------------:|
| TK001            | コーヒー  |    200       |
| TK001            | 緑茶 |       300       |
| TK001            | ほうじ茶   |      400      |
| TK002            | コーヒー |      500       |
| TK002            | ほうじ茶 |      600       |

**縦横変換後**

| 発注ID       | コーヒー| 緑茶| ほうじ茶 |
|:----------------:|:-----------------:|:------------------:|:------------------:|
| TK001            | 200 |    300       |   400       |
| TK002            | 500 |    0       |   600       |

##サンプルコード
発注IDごとにデータを`GROUP BY`を行い、その合計額を取ります。
合計額にする必要がない場合は`SUM`を`MAX`などに変え、1レコードのみ取得するなどの方法が取れます。

```SQL
SELECT 発注ID,
       SUM(CASE WHEN 商品 = 'コーヒー' THEN 金額 END) AS コーヒー,
       SUM(CASE WHEN 商品 = '緑茶'     THEN 金額 END) AS 緑茶,
       SUM(CASE WHEN 商品 = 'ほうじ茶' THEN 金額 END) AS ほうじ茶
FROM 元データ
GROUP BY 発注ID
;
```
Java でコールバック簡単なサンプルPart2　無名クラスの例

```java

public interface myCallback {
    void onSuccess();
    void onError(String err);
}



public class App {

    public static void main(String[] args) {
        // call your method 無名クラス利用
        doSomething("list your Params", new myCallback(){  
            @Override
            public void onSuccess() {
                // no errors
                System.out.println("Done");
            }

            @Override
            public void onError(String err) {
                // error happen
                System.out.println(err);
            }
        });
    }

    private void doSomething(String param, // some params..
                             myCallback callback) {
        // now call onSuccess whenever you want if results are ready
        if(results_success)
            callback.onSuccess();
        else
            callback.onError(someError);
    }

}
```
#vue.js のチュートリアルを Codepen でやる ( Hello World ) ( 初心者向け )

# Tutorial

[Introduction — Vue.js](https://vuejs.org/v2/guide/)

# Codepen

[Vue.js Playground](https://codepen.io/yumainaura/pen/dLYoBx)

![image](https://user-images.githubusercontent.com/13635059/55444073-02dc1300-55f0-11e9-859d-aa46548f3255.png)

# HTML

`{{ message }}` という部分が vue.js の記法で、残りの部分はHTML。

```html
<html>
    <head>
        <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        
        <div id="app">
          {{ message }}
        </div>
            
        <script src="index.js"></script>
    </body>
</html>
```

# Js

`id="app"` の `message` というデータは `Hello Vue!` ですよという定義をしている。

```js
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1044








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
「Long Life RailsApps」というテーマで登壇した話 (前編)

少し前ですが、Reproさんのイベントで登壇させていただきました。
その際に使用したスライドの共有と、深掘りをしたいと思います。

# スライド
[![thumbnail](http://image.slidesharecdn.com/reprotechlongliferailsapps-190206014652/95/slide-1-1024.jpg)](https://www.slideshare.net/yamasakidaisuke/long-life-railsapp-in-the-case-of-rejob)

まずは耳障りの良いKeepからいきます。

# Keep

## リリースしたり、効果が良かったりすると事業側のメンバーから感謝される
素晴らしく良い雰囲気で仕事できます。何気ない一言で救われる場面が多々あります。
（自分は特にちょろい気がする）

## Githubフローをちゃんと回せている
当然の話ではありますが、事実良い習慣なのでKeepしたいです。

## 開発環境をDockerで構築できるようにした
新しいメンバーが参画する時にめちゃくちゃ楽になりました。特定のバージョンのミドルウェアを使用していたりするとセットアップ手順のアップデートが大変なのですがコマンド数回でセットアップできるようになりました。

## 効率的にレビューをするために色々ルールを設けた
2名以上のレビュアーに見てもらうというローカルルールがあるのですが、一日10プルリクエストほどレビューしないといけないので気を抜くとすぐ溢れてしまいます。
レビューをする時間を決めたり、レビュアー毎に権限を設け `この人のレビューを貰わないとリリースできない` というルールを設けました。
権限のあるレビュアーはしっかりと見ますし、通常のメンバーはレビューに対して重い責任を負わずに済みます。
良かったのは `メンバーが軽い気持ちでレビューができ、レビュアーはメンバーのレビューを参考にできる` という点です。

## Jenkinsを使ってデプロイやタスクの実行をできるようにした
DevOps的な。ここはSlackに移行するなどTryが挙げられそうなKeepです。

## RspecとSeleniumが主要な機能をカバーした
テストのカバレッジが極端に低かったので、サービス(ビジネス)として障害になってはいけないところのテストを厚くしました。ユーザーの基本フローを網羅することで実装者、事業者が安心して過ごすことができるようになりました。

## Reviewdogで自動的にコードの書き方を指摘されるのでロジックに対して議論することができる
導入はぐぐっていただけると助かります。

## ドキュメント管理システムを導入して非エンジニアも巻き込んだ
色々なツールを試しましたが、カスタマイズが可能なオープンソースに落ち着きました。
API連携も見据えた動きができています。

---------
ここからは直近のプロジェクトを振り返ってみた結果

## プロジェクトのキックオフをすることでコアメンバーの意識を統一できた
なんだかんだキックオフは大事。ゆるゆると始まるプロジェクトはだいたい炎上する気がします。

## プロジェクト進行においてシンプルなルールだけ決めて守るようにした
blameしない、前を向く、などプロジェクトマネジメントの基本を守りました。
当然ながら良い習慣だと思います。

## 何のためのプロジェクトなのかを明確にした
めちゃくちゃKeepです。意思決定のスピードが格段に向上し、方向性が明確なので決定事項について背景を説明することができるので、
メンバーが納得感を持って業務に当たることができます。

## ガントチャートをすぐ更新できるように専用のツールを導入した
Backlogを普段使っているのですがガントチャートの更新が非常に多かったのでxPlanというツールを導入しました。
クリティカルパスの設定も簡単にできるのでおすすめです。（有料）

## Backlogは基本的にFIXした内容とスケジュールのみ記載するようにした
ガントチャートと分業したので相応の使い方にまとめました。
情報が散らばらないのは良いことです。

# Try
KeepからTryに挙げられるのは以下です。

- Jenkinsで運用しているものはSlackやクラウドサービスへ移行できそう
- Rspec, Seleniumのカバレッジを増やしたい
    - とは言えテストリソースの上限はあるのでバランスを取るべき
- 開発用DockerImageを配布できるようにしたい
- Reviewdogはタイミングによって邪魔な場合があるので任意での実行も視野に入れる
- ドキュメント管理者が不在なので責任者を据えたい
- 進行管理の雑務に時間を割くことに対する心理的ハードルを下げたい
    - ガントチャート、Github、Backlog、スプレッドシートを使って進行管理すると情報が分散して効率が下がるポイントがある
    - プロジェクト管理及びドキュメント管理のベストプラクティスを探る


重い話になるProblemは後編で綴っていきたいと思います。
ライフゲーム / LabVIEW

#概要
LabVIEWでライフゲームを実装してみる。配列は上下、左右がそれぞれ連続してつながっているものとする。LabVIEWはHome Bundle版を使った。
#(1) 完成したVI
https://drive.google.com/open?id=1DbCd7DBJYUD--JYNbcaU1gHlPFJ6ishF
Whileループのなかで配列をどんどん更新する。左に縦に並んでいるのは、初代配列用としていくつか作ったVI。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/2713da96-b530-98c5-f0c4-cda1b45fc074.png)

##(1.1) 実行結果
大きなX字を初代配列として実行してみる。
https://youtu.be/T8Q_YGVbbBc
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/2672fdc5-1f9a-aa81-66b9-f4c921c35512.png)

#(2) 解説
##(2.1) 2次元配列の上下、左右をそれぞれつなぐためのVI
conv2torus.vi: 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/5bd72a27-b436-2881-1e1c-26836d14d557.png)
conv2cylinder.vi: 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/ee7292e3-ceef-a724-18f8-66479e4336ff.png)

##(2.2) 全セルのムーア近傍の和を求めるためのVI
moore.vi: 
出来合いのConvolution.viを利用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/ebef3f06-1889-5bd0-9cc8-39e0f8376ed0.png)

##(2.3) 次世代配列に更新するためのVI
update_mat.vi: 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/174e3205-e7d4-ca0a-1151-bb254166063a.png)

#(3) 各種の初代配列
##(3.1) 任意配列
spreadsheet_mat.vi: 
出来合いの[スプレッドシート文字列を配列に変換]函数を利用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/91445568-97fa-dcdc-3b15-c606ab19f258.png)

##(3.2) 大きなX字配列
mat_X.vi: 
出来合いのCreate Special Matrix.viを利用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/db52359e-a3b5-0d97-4076-f309807e5a53.png)

##(3.3) 2値乱数配列
rand_mat.vi: 
出来合いのDiscrete Random.viを利用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/efac3715-98a0-708a-05c2-9c7deca99425.png)

##(3.4) 長い横線配列
long_line_mat.vi: 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/d37c20bc-ac8d-f397-9684-4a59ad6bc6bf.png)

##(3.5) 大きな十字配列
mat_Plus.vi: 
上の(3.4)で作ったviを利用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193936/f6ae8006-a268-333f-e22e-5df89720f666.png)
【AS/400】セーブファイル（SAVF）の使い方

# セーブファイル(SAVF)とは

AS/400で扱う圧縮アーカイブファイルのようなもの。

# 関連コマンドの使い方

## CRTSAVF

セーブファイルを作成する。

```
CRTSAVF FILE(DANILIB/TSSAVF) TEXT(' テスト SAVF')
```

※空のセーブファイルはFTP転送でセーブファイルを受信した際の受け皿にできる。

## SAVOBJ

セーブファイルに圧縮アーカイブしたいファイルを格納する。

```
SAVOBJ OBJ(TESTPF) LIB(DANILIB) DEV(*SAVF) SAVF(DANILIB/TSSAVF)
```

## DSPSAVF

セーブファイルの中身の確認。

```
DSPSAVF FILE(DANILIB/TSSAVF)
```

## CLRSAVF

セーブファイルの中身をクリア

```
CLRSAVF FILE(DANILIB/TSSAVF)
```

## RSTOBJ

セーブファイルの中身をリストア（展開）

```
RSTOBJ OBJ(TESTPF) SAVLIB(DANILIB) DEV(*SAVF) SAVF(DANILIB/TSSAVF) RSTLIB(DANILIB)
```

※**RSTLIBで指定されたライブラリ**に復元しに行こうとするため、FTP転送されたデータなどを復元する場合は、RSTLIBの初期値に注意。
#vue.js で if else の条件分岐をする基本

# オンラインエディタ Codepen を利用する

https://codepen.io/yumainaura/pen/eopNVy

![image](https://user-images.githubusercontent.com/13635059/55443027-14232080-55ec-11e9-99be-f737c237504a.png)


# HTML

- v-if と v-else の組み合わせで条件分岐を扱えるようだ
- v- ってなんやねんって思うけど、 vue.js の v だろうな
- wow が true の時には YES が、 wow が false の時には NO が出力されるようにしておく

```html
<html>
    <head>
        <link rel="stylesheet" href="index.css">
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        
        <div id="app">
            <span v-if="wow">YES</span>
            <span v-else="wow">NO</span>
        </div>
            
        <script src="index.js"></script>
    </body>
</html>
```

# js の `wow: true` を `wow: false` に変えてみる

```diff
var app = new Vue({
  el: '#app',
  data: {
-    wow: true
+    wow: false
  }
})
```

# HTML で YES の出力が NO に変わる

![image](https://user-images.githubusercontent.com/13635059/55443049-2dc46800-55ec-11e9-8a3b-586463e747c0.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1043








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Nuxt 2.5.1にアップデート後にnpm run buildができないエラーに関して(Error: Lock is already released)

## Nuxt 2.5.1にアップデート後にnpm run buildが動かなくなる。

**npm run build走らせる**

**エラー詳細**

```
WARN  Unable to update lock within the stale threshold                                                                     00:20:05

  at options.fs.stat (node_modules/proper-lockfile/lib/lockfile.js:121:25)
  at node_modules/graceful-fs/polyfills.js:285:20
  at FSReqWrap.oncomplete (fs.js:171:5)
```

```
 FATAL  Lock is already released                                                                                            00:20:36

  at callback (node_modules/proper-lockfile/lib/lockfile.js:241:60)
  at Promise (node_modules/proper-lockfile/lib/adapter.js:39:9)
  at new Promise (<anonymous>)
  at args (node_modules/proper-lockfile/lib/adapter.js:30:25)
  at NuxtCommand.lockRelease [as _lockRelease] (node_modules/@nuxt/utils/dist/utils.js:139:11)
  at NuxtCommand.releaseLock (node_modules/@nuxt/cli/dist/cli-chunk.js:244:18)
  at NuxtCommand.run (node_modules/@nuxt/cli/dist/cli-chunk.js:159:18)
  at <anonymous>
  at process._tickCallback (internal/process/next_tick.js:182:7)
```

### 解決方法

```
npm run build -- --no-lock
```

### 補足
今後のアップデートで直るっぽいので、package.jsonに記載しなくても良さそうです。
取り急ぎ、build時に --no-lockをつけるだけでOK
Ruby　標準入力から値を受け取る方法

#はじめに
Paizaのプログラミング問題で標準入力を使い、値を持ってくる方法がいくつかあったのでメモ

###前提
使用する言語はRubyです

##一行に一要素だけしか存在しない場合
```
標準入力
Tokyo
```
```
line = gets
p line
```
```
出力結果
"Tokyo"
```

##一行に複数要素存在する場合
```
標準入力
Tokyo Osaka Kyoto
```
```
line = gets.split(' ')
p line
```
```
出力結果
["Tokyo", "Osaka", "Kyoto"]
```

splitを使用することで３つの要素をそれぞれ別のものとして配列に格納しています

###※splitの使い方
splitはsplit('')のシングルクォート内の文字で文字列を分解する
例えば、Tokyoという文字をそれぞれ一文字ずつ取得したければ、シングルクォートの中に何も入れずにすると下記のように取得できる

```
標準入力
Tokyo
```
```
line = gets.split('')
p line
```
```
出力結果
["T", "o", "k", "y", "o"]
```

##複数行に一つずつ要素が存在する場合
```
標準入力
Tokyo
Osaka
Kyoto
```
```
line = readlines
len = line.length
i = 0

while i < len
    line[i] = line[i].chomp
    i += 1
end

p line 
```
```
出力結果
["Tokyo", "Osaka", "Kyoto"]
```
上記のものの簡潔な書き方として、mapを使用したものがあります

```
標準入力
Tokyo
Osaka
Kyoto
```
```
line = readlines.map(&:chomp)
p line 
```
```
出力結果
["Tokyo", "Osaka", "Kyoto"]
```
##複数行に複数要素が存在する場合
```
標準入力
Tokyo Osaka Kyoto
Japan USA China
```
```
line = readlines
len = line.length
i = 0

while i < len
    line[i] = line[i].chomp.split(' ')
    i += 1
end

p line
```
```
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]
```
上記のものの簡潔な書き方として以下のものもあります

```
標準入力
Tokyo Osaka Kyoto
Japan USA China
```
```
lines = []
while line = gets
    lines << line.chomp.split(' ')
end
p lines
```
```
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]
```
while line = getsとすることで、標準入力の値を全て取得するまで繰り返されます

####より簡単な方法をコメントでいただいたので追記
```
標準入力
Tokyo Osaka Kyoto
Japan USA China
```
```
lines = readlines(chomp: true).map{|line| line.split(' ')}
p lines
```
```
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]
```



出力結果を見ると、受け取った値は文字列なので数値を受け取りたい場合は次のようにします
#数値として受け取りたい場合
##一行に一要素だけしか存在しない
```
標準入力
123
```
```
line = gets.to_i
p line
```
```
出力結果
123
```
##一行に複数要素存在する場合
```
標準入力
1 2 3
```
```
line = gets.split(' ')
p line
```
```
出力結果
["1", "2", "3"]
```
このままだと文字列として扱われるので、mapを使用して数値型の配列に変換します

```
標準入力
1 2 3
```
```
line = gets.split(' ').map(&:to_i)
p line
```
```
出力結果
[1, 2, 3]
```
##複数行に一つずつ要素が存在する場合
```
標準入力
1
2
3
```
```
line = readlines.map(&:to_i)
p line 
```
```
出力結果
[1, 2, 3]
```

##複数行に複数要素が存在する場合
```
標準入力
1 2 3
4 5 6
```
```
lines = []
while line = gets
    lines << line.chomp.split(' ').map(&:to_i)
end
p lines
```
```
出力結果
[[1, 2, 3], [4, 5, 6]]
```
####より簡潔に書く方法
```
標準入力
1 2 3
4 5 6
```
```
lines = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p lines
```
```
出力結果
[[1, 2, 3], [4, 5, 6]]
```
ループの添字順序を間違えた Floyd-Warshall アルゴリズムを３回繰り返すと正しい結果が得られる

[Floyd-Warshall アルゴリズム](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E2%80%93%E3%83%95%E3%83%AD%E3%82%A4%E3%83%89%E6%B3%95) は重み付き有向グラフのすべての頂点対に対して最短路距離を求める代表的なアルゴリズムです．グラフの頂点を $V = \\{1, ..., n\\}$ とし，$n \times n$ 配列 $d$ の $(i, j)$ 成分をグラフの $i, j$ 間の枝長 (枝がなければ $\infty$，$i = j$ はゼロ) で初期化してから以下の３重ループを実行すると，すべての頂点 $i$, $j$ についてそれらの間の最短路長が $d[i,j]$ に入ります（ただしグラフは負閉路をもたないとします）．

```py

# Floyd-Warshall アルゴリズム
for k = 1, ..., n:
  for i = 1, ..., n:
    for j = 1, ..., n:
      d[i,j] = min(d[i,j], d[i,k] + d[k,j])
```

ところで，Floyd--Warshall アルゴリズムのよくある実装ミスに「ループの添字の順序を間違える」ことがあります [^1] ．正しい順序 KIJ に対して，順序を間違えた実装をそれぞれ「IJK アルゴリズム」，「IKJ アルゴリズム」と呼ぶことにします．

[^1]: 例えば http://kurkur.hatenablog.com/entry/2018/09/18/173809 

```py

# IJK アルゴリズム
for i = 1, ..., n:
  for j = 1, ..., n:
    for k = 1, ..., n:
      d[i,j] = min(d[i,j], d[i,k] + d[k,j])
```

```py
# IKJ アルゴリズム
for i = 1, ..., n:
  for k = 1, ..., n:
    for j = 1, ..., n:
      d[i,j] = min(d[i,j], d[i,k] + d[k,j])
```

これらはもちろん正しい結果を出さないのですが，実は以下のことが証明できます．

**定理 1.** IJK アルゴリズムを３回実行すると $d$ に正しい値が代入される．
**定理 2.** IKJ アルゴリズムを２回実行すると $d$ に正しい値が代入される．

間違ったアルゴリズムを３回実行しても計算量は正しい Floyd-Warshall アルゴリズムとたかだか定数倍しか変わらないので，これらの結果から「Floyd-Warshall のループの添字順序がわからなくなったら，**念のため**３回実行すれば OK」ということがわかります．

## 証明のアイデア

３回・２回で十分であることを示すのは少し大変なので，ここでは基本的なアイデアをつかむために $O(\log n)$ 回繰り返せば全点対間最短路長が正しく求まることを示します．

Floyd-Warshall アルゴリズムの更新 d[i,j] <- min(d[i,j], d[i,k] + d[k,j]) は，グラフの頂点対 $i, j$ に新しい枝を張る（長さは $k$ を中継したときの距離）操作に対応します．ここで重要となるのは **この更新によってグラフの最短路長は変化しない（ただし最短路そのものは変化しうる）** という性質です．定理の証明では，適当な回数アルゴリズムを繰り返すことでグラフが長さ１の最短路をもつようになることを示します．

**定理 3.** IJK アルゴリズムもしくは IKJ アルゴリズムを $O(\log n)$ 回実行すると $d$ に正しい値が代入される．

**証明．**
適当に頂点 $s, t \in V$ を固定し，それらの間の最短路 $[u_0, u_1, \dots, u_l]$ をとる ($s = u_0, t = u_l$)．すると，IJK アルゴリズムもしくは IKJ アルゴリズムを実行することでグラフに新たに枝 $(u_0, u_2), (u_2, u_4), \dots$ が追加されるので，アルゴリズム実行後のグラフは長さが元の半分の $s, t$ 間最短路 $[u_0, u_2, \dots, u_l]$ をもつ．したがってアルゴリズムを $O(\log n)$ 回繰り返すとグラフは長さ $1$ の最短路をもつようになる．これは $d$ が全点対間最短路長であることを意味する．//

反復回数が３回・２回で十分なことを示すには，アルゴリズム実行後に「特殊な添字構造をもつ最短路」がとれることを示すことになります．詳しくは https://arxiv.org/abs/1904.01210 を参照してください．

#経緯

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">経緯ですが、みんプロ本戦準備中に<br>tozangezan「こういうのを落とすケースを作る問題を出したいけど 3 回繰り返しを落とせるケースが一向に作れない」<br>ぼく「そうなのか」<br>しばらく後ぼく「示せたわ」<br>が発端です、競技プログラミングは研究の役に立つ</p>&mdash; 花粉症の薬を飲む (@DEGwer3456) <a href="https://twitter.com/DEGwer3456/status/1113285326473023488?ref_src=twsrc%5Etfw">April 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Cordova の iOS で .focus() を使ってもソフトウェアキーボードが表示されない

ページにアクセスした段階で input や textarea にフォーカスをあててソフトウェアキーボードを表示させ、ユーザがすぐにテキストを入力できるようにしたいとする。

```html
<input id="input" type="text" />

<script>
document.querySelector('#input').focus()
</script>
```

Android の場合は上記で問題ない。
iOS の場合 cordova-plugin-wkwebview-engine プラグインを使用していて iOS 11.3 なら cordova-plugin-wkwebview-inputfocusfix プラグインが必要になり、さらに "KeyboardDisplayRequiresUserAction" を "false" に設定しないとソフトウェアキーボードが表示されない。

```config.xml
<platform name="ios">
  <preference name="KeyboardDisplayRequiresUserAction" value="false" />
</platform>
```

これで問題なしと思いきや、iOS 12.2 にアップデートした途端これでは動作しなくなった。
ひとまずプラグインをフォークして修正したので困っている人がいればこちを利用してください。
※本家にはプルリクエスト送信済み。

```
cordova plugin add https://github.com/amatakasap/cordova-plugin-wkwebview-inputfocusfix
```
4/3 Javascript コードレシピ集  学習

jsの本を借りたので、毎日継続して定着させていきます。

# クリックしたら要素を複製

アンケートのフォームを追加する時に応用出来るはず。

```main.js
// 要素を複製 複製したい要素.cloneNode(真偽値) appendChild等と共に使うこと trueを外すと複製されない

// my-clone-boxを取得
const cloneBox = document.getElementById('my-clone-box');

// my-clone-boxをクリックすると発火
cloneBox.addEventListener('click', () =>
{
  // 親要素のcontainerを取得
  const container = document.querySelector('.container');

  // my-clone-boxを複製する
  const clone = cloneBox.cloneNode(true);

  // 複製したmy-clone-boxを、containerの末尾に挿入する
  container.appendChild(clone);
});
```

```js.html
<div class="container">
  <div id="my-clone-box">クリックするとこの要素を複製します</div>
</div>
```

参考
https://www.imamura.biz/blog/26914
batファイルで、値を置換するとき

# きっかけ
メンバーみんなが使っているWindows環境で、ファイル内の文字列を置換するスクリプトがほしいなと。

置換のコマンドはこちらを使わせてもらうとして、あとは対象をバッチファイルに書いていくだけだが・・・
https://www.vector.co.jp/soft/win95/util/se271454.html

`/`は`//`にエスケープする必要があった。

わざわざエスケープ後の文字列を書いてくのはやだなーということで、batファイル内で値の置換ができないか調べた。

# 方法

```
@echo off

rem エスケープ前
set string=http://
echo 置換前：%string%

rem エスケープ実施
set replaced_string=%string:/=//%
echo 置換後：%replaced_string%
```

実行すると`http://`→`http:////`となる。

この書き方だからかと思うが、置換対象の文字列は、`set`で一旦環境変数にする必要があった。

# 最後に
ここ最近、linuxだのpythonだのが多かったので、batファイルは中々新鮮すぎる。
ファイルのコピーに`xcopy`とかいうコマンドを使うのも初めて知った。

<details><summary>2019/4/17</summary>間違いの指摘受け、修正。
`xpath`→`xcopy`</details>
Jupyter Notebookで描画したチャート内の日本語が文字化けしてしまうときの対処方法


## ipython_kernel_config.pyに以下の内容を追記する。
* ファイルが存在しない場合は新たに作成してしまって良い。

``` bash
vi ~/.ipython/profile_default/ipython_kernel_config.py
```

``` ipython_kernel_config.py
c.InlineBackend.rc = {
    'font.size': 11,
    'font.family': 'Osaka',
    'figure.figsize': (6.0, 4.0),
    'savefig.dpi': 80,
    'axes.titlesize': 12
}
c.InlineBackend.figure_formats = set(['png', 'retina'])
```
メモアプリ作った。

pwaでwebのメモアプリ作った

https://memote.xyz

https://github.com/nishisuke/memote

## 機能
- cloud同期
- responsive
- オートセーブ
- オフラインで動く
- 速い

## 技術
- service worker
- firebase hosting
- firestore
- react hook
- immutablejs

## 所感
初めてreact hookを使った。
記述がシンプルになって最高だった。
今後はhook一択。
ただ慣れないと最初は厳しいので今回さわれてよかった。
firestoreも今回初めましてだった。
今後api server いらないと本気で思った。
firestoreは設計自体が難しい。
あえて正規化崩して、firestoreを活かせる設計が求められる。
今回は単純なメモアプリだったので簡単だった。
多分複雑なものはまだ設計できないので今後も勉強が必要。
service worker + firestoreでオフラインも完璧に動作するので
簡単なアプリはネイティブの意味なくなってると感じる。
service workerはつまるとこが多い。
特にiphone safariはgoogle 公式の説明のしようと違ってる動作が多々ある。
あとはライフサイクルをきちんと理解しないと、一生クライアントが更新されないことになりうる。
ghq的なやつを作った

## 背景
### loves `ghq`

`ghq`良いですよね。
無思考でGoPath配下の構造に倣ってプロジェクトを管理できるの、最高だと思います。

ところで、僕は横着者なので、プロジェクトがPythonで出来ていようがC#だろうがVimScriptだろうが、`ghq`でgetしてたりします。
要するに「何も考えずにプロジェクト管理は`ghq`に委ねる」というスタンスをとりたいのです。
そして、そのスタンスだと`ghq`はちょっといくらか不足があり、それをPRとして本家に出そうと考えたときに、内部のちょっとしたメンテナンスしにくさを感じました。

### forked `ghq`

ちょっとこれは根本的に違うもの作ったほうが自身のニーズを満たせそうだ、と思い立ったので、
別のプロジェクトとして [gogh](https://github.com/kyoh86/gogh) を作ってしまいました。
（あんまりそういうスタンスでのForkは良くないと思うんですが）

## `gogh` の目指すところ

* 目的
    * GitHub(+GHE)でホストしているプロジェクトの、ローカルでの配置を管理する
        * `ghq`にならい、Golang風構成（i.e. `./github.com/kyoh86/gogh`）でClone
        * 対象ホストごとに設定を切り替える。デフォルトは`github.com`をターゲットとする
    * プロジェクト間をまたぐような操作を極力サポートする
        * ローカルでの操作も、リモートでの操作も
        * 逆にプロジェクト内に収まるようなものは `hub` の領域と捉える。サポートしない。
        * `プロジェクトがまだない状態での操作`もサポート対象とする
            * create
            * fork
            * etc...?
* `ghq` との差異
    * 設定や一つ一つの機能をシンプルにする
        * そのためにもGitHub以外のホストはサポートしない。
        * 最大公約数的な機能ではなく、最小公倍数的な機能を作る。
    * `ghq look` は作らない
        * `jump into project` とされてはいるものの、実態は当該ディレクトリをWDとするシェルの起動。
        * つまり `cd -` は機能しないし、気づくとプロセスツリーがエライことになってる。
        * 代わりにzsh/bash functionとして似たような機能を提供する。（`gogogh`）
    * 重複した名前のプロジェクトも分かりやすく表示する
        * 重複した名前のプロジェクトが増えてくると、全部長ったらしいパスで表示されたりするのは困る。
        * `--unique` オプションの出力がとても難解なので、もっとシンプルに。`-f=short`
    * `git config` によらない。
        * いろんなツールの設定が`gitconfig`にあふれて管理めんどくさいし分かりづらい。
        * そして設定値の呼び出しがとても重い。
    * 設定ファイル自体を対象ホストごとに分ける
        * `git config` 内に設定を持とうとしたこと（と、おそらく歴史的経緯）で、ホストごとに分けられる設定、分けられない設定がややこしい
        * ホストごとに設定しないと変な挙動を示すこともままある
    * `GitHub` 以外の何かは対応しない
        * そちらは別の何かで管理するほうが良さそう
        * 今の所そもそも向き合ったことがないけど…
    * `hub` との間を埋める
        * ghqでできることとhubでできることの間に、いつもちょっと面倒なこと、が発生していたのを解消する
        * 新たにforkするとき：元プロジェクトをClone、forkしてプロジェクトを作る
        * 新たにプロジェクト作るとき：ローカルにプロジェクトフォルダを作り、GitHub上にもリポジトリを作る。
    * （些末な宗教） `github.com/onsi/gomega` と `github.com/urfave/cli` が好きではない。`github.com/stretchr/testify` と `github.com/alecthomas/kingpin` がいい。
    * （実験的・ニーズ不明）単なるCLIとして作るのではなく、同時にライブラリとして使える何かを作ってみたい。(github.com/kyoh86/gogh/gogh package)。 `hub` リスペクトなのだけど。
qiita api で 自分の投稿一覧を取得する

```
curl -H \"Content-Type: application/json\" -H \"Authorization: Bearer ${QIITA_API_TOKEN}\" \\
https://qiita.com/api/v2/authenticated_user/items \\
| ruby -ne 'require \"json\"; print JSON.parse($_).map {|h| h[\"body\"].chomp}'

#=> String of [String, String]
```
#python で日付を JST=日本時刻=現地時刻で与えると日の始まりの unixtimstamp を出力する例

- 強引に string の日付を split して replace に与えています

```py
#!/usr/bin/env python3

from datetime import datetime
import pytz, time, os

tz = pytz.timezone('Asia/Tokyo')

date = os.environ.get('DATE')

year = int(date.split('-')[0])
month = int(date.split('-')[1])
day = int(date.split('-')[2])

local_datetime = datetime.now(tz=tz).replace(year=year, month=month, day=day, hour=0, minute=0, second=0, microsecond=0)

unixtimestamp = time.mktime(local_datetime.timetuple())

print(unixtimestamp)
```

```sh
$ DATE=2016-03-02 ./jst-unixtimestamp.py
1456844400.0
```

```sh
$ DATE=2016-03-03 ./jst-unixtimestamp.py
1456930800.0
```

# shellと組み合わせて使ってみる例

```
$ DATE=$(date --date="1 days ago" +'%Y-%m-%d') ./jst-unixtimestamp.py
1554044400.0
```

```
$ DATE=$(date +'%Y-%m-%d') ./jst-unixtimestamp.py
1554130800.0
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1031








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
数検１級 (5) 行列式・複素数

# 問題

$\omega$ を $x^3=1$ の虚数解の１つとするとき、次の行列式 $D$ の２乗の値を求めなさい。

```math
D = 
\begin{vmatrix}
1 &\omega &\omega^2  & 1    \\
\omega& \omega^2 & 1 & 1  \\
\omega^2 & 1 & 1 &\omega \\
1 & 1 &\omega &\omega^2
\end{vmatrix}
```

<details><summary></summary><div>

# 知識

## 円分多項式（←NEW）

$x^n - 1 = 0$ は、次のように因数分解できる。

```math
(x-1)(x^{n-1} + x^{n-2} + \cdots + 1) = 0
```

したがって、$z \not= 1$ が $x^n = 1$ の解なら、$(z^{n-1} + z^{n-2} + \cdots + 1)=0$ を満たす。

## 行列式

### ２次元・３次元の行列式

* ２次元

```math
\mathrm{det}
\begin{bmatrix}
a & b \\
c & d 
\end{bmatrix}

= ad - bc.
```

* ３次元（サラスの方法）

```math
\mathrm{det}
\begin{bmatrix}
a & b & c \\
d & e & f \\
g & h & i 
\end{bmatrix}

= (aei + bfg + cdh) - (afh + bdi + ceg)
```


４次元以上の行列式は計算が大変なので、工夫を凝らしてゼロをたくさん作ったり、低次の行列式に帰着させたりする。

### 行・列変形の効果

* 転置しても行列式の値は**変わらない**。
* ある列（行）の定数倍を他の列（行）に加えても、行列式の値は**変わらない**。
* ある列（行）に定数をかけると、行列式の値も**定数倍**になる。
* ひと組の列（行）を入れ替えると、行列式の値の**符号が変わる**。

### 三角行列・ブロック三角行列

* 三角行列の行列式は、対角要素の積に等しい。

```math
\mathrm{det}
\begin{bmatrix}
\lambda_1 & . & . & . \\
& \lambda_2 & . & . \\
&& \ddots & .  \\
&&& \lambda_n  
\end{bmatrix}

= \prod_{i=1}^{n} \lambda_i
```

* ブロック三角行列の行列式は、対角ブロックの行列式の積に等しい。

```math
\mathrm{det}
\left[
\begin{array}{c|c}
\mathrm{\large{A}} & \mathrm{\large{B}} \\
\hline
 & \mathrm{\large{D}}
\end{array}
\right]

= \mathrm{det} \mathrm{A} \cdot \mathrm{det} \mathrm{D}
```


### ラプラス展開

$\mathrm{A}$ の行列式は、ある行（または列）で次のように分解できる:

```math

\begin{align}
\mathrm{det} \mathrm{A} 
&= \sum_{i=1}^{n} (-1)^{i+k} a_{i,k} M_{i,k}  \;\; \text{（列を固定）}\\
&= \sum_{j=1}^{n} (-1)^{k+j} a_{k,j} M_{k,j}  \;\; \text{（行を固定）}
\end{align}
```
 
ただし、$M_{i,j}$ は$A$ の $i$ 行と $j$ 列 を取り除いた行列の行列式。

* ある行または列にゼロがたくさんあると、この展開で多くの項が消える。
* 符号はインデックスの和が偶数なら正、奇数なら負。



# 解答

```math
\begin{align}
D 
&= 
\begin{vmatrix}
1 &\omega &\omega^2  & 1    \\
\omega& \omega^2 & 1 & 1  \\
\omega^2 & 1 & 1 &\omega \\
1 & 1 &\omega &\omega^2
\end{vmatrix} \\
&&\text{列２から$\omega \times$列１を引く、列4から$\omega \times$列3を引く} \\
&= 
\begin{vmatrix}
1 & 0 &\omega^2  & 0    \\
\omega & 0 & 1 & 1-\omega  \\
\omega^2 & 0 & 1 & 0 \\
1 & 1-\omega &\omega & 0
\end{vmatrix} \\
&&\text{列２でラプラス展開}\\
&= (1-\omega) 
\begin{vmatrix}
1 & \omega^2  & 0    \\
\omega  & 1 & 1-\omega  \\
\omega^2  & 1 & 0 
\end{vmatrix} \\
&&\text{サラスの方法} \\
&=(1-\omega)\left[ \omega^4(1-\omega) - (1-\omega) \right] \\
&=(1-\omega)\left[ \omega(1-\omega) - (1-\omega) \right] \\
&=(1-\omega) (1-\omega)(\omega-1) \\
&=-(1-\omega)^3 \\
&=- (1 - 3\omega + 3\omega^2 - \omega^3)\\
&=3\omega (1-\omega) 
\end{align} 
```

両辺を２乗して、

```math
\begin{align}
D^2 
&=9\omega^2 (1-\omega)^2 \\
&=9\omega^2 (1-2\omega+\omega^2) \\
&&\text{$\omega^2+\omega+1=0$ を用いて} \\
&=9\omega^2 (-3\omega) \\
&=-27.
\end{align} 
```

# 感想

* 高次の行列式の基本はとにかくゼロをたくさん作ってラプラス展開に持ち込むか、ブロック三角を作るかだと思う。
* $\omega$ の計算時に、$\omega^3=1$ だけでなく $\omega^2+\omega+1=0$ を忘れないようにしたい。

</div></details>
とあるエンジニアの再就職日記 2019-04-01 by 稲浦悠馬 いなうらゆうま

# 邪魔をするな、ヒントをくれるな、自力で解決する。
誰がなんと言おうとも、最後の最後まで質問しない。こんな一番ダメなやり方でも、前職においては、それなりに仕事の結果には評価を得たものである。これを善と見るか悪と見るか。

# 性格によっては、分からないことを質問するのが何故こんなに高コストであるのか、なんとかして豊穣に言語化しておきたい気持ちが沸き起こる。
うまく踏み台を作れるだろうか。

# 邪魔をするな、ヒントをくれるな、自力で解決する。
誰がなんと言おうとも、最後の最後まで質問しない。こんな一番ダメなやり方でも、前職においては、それなりに仕事の結果には評価を得たものである。これを善と見るか悪と見るか。

# 性格によっては、分からないことを質問するのが何故こんなに高コストであるのか、なんとかして豊穣に言語化しておきたい気持ちが沸き起こる。
うまく踏み台を作れるだろうか。

# はじめてプロジェクトにジョインした時、アプリケーションをはじめて触る時、右も左も分からず、自分が恥さらしのバカになる感覚というのは、覚えたことがあるだろうか。
だが僕もリアルドラクエ転職を果たしたのだから、経験値はザラじゃないぜなはずなのだぜ。

# 仕事で最も危険なのは己の心理エネルギー、肉体エネルギーの浪費なのであるが、誰もそれを分かっていない。
焦れば焦るほど仕上がると思っている。

# 人に手を焼かせるのは大博打という感じがする。
成功すれば得るものは大きいが、失敗すれば信用を落とし、大やけどを追う。そう考えると僕は低リスク低リターン戦略を選びがちだ。あとあと回収できるかどうかを見込んで大きく賭けるが良いか。

# 仕事で人に質問するか、自分で考えるか否かの是非は、作業の進捗や、自問自答の効率効果、お互いの生産的コスト、その短期長期の尺度など、無限の軸によって評価が変わってくるのが難しいところだ。
やはり相手の価値観に合わせるのがベターか。

# 仕事のやり方について。
やはり人に聞く、自分で考えるということも、最適なのは往復運動であろうと思う。自分で考えて、最大、もしくは適度な道のりまで行って、引き返して、人に聞く。その逆の道もまたしかり。

# 困難なコードを噛み砕くほど面白いことはこの世に他にない。


# アイデンティティ問題が起こっても良いではないか。
それが仕事といふものである。

# リモートワークのためなら死をもいとわぬ。
三千里だって歩けるさ。

# 一息つくということを数秒ごとに無限に繰り返せば、仕事というものはまったく辛くないものである。


<@U18T87ST0> has joined the channel

# カニのようにコードベースをながむるなり。


# 自宅のリモートワークではすぐそばに冷蔵庫と食物があるので、太り過ぎ内容に大いに注意を払おう。


# 人の信頼を得るということは、自分を大いにさらけだして、素直になることに尽きると思う。
既に経験や実力があるのであれば、なおさらそうだ。

# 悩んで考えつつアプリケーション開発をすることは本当に問題解決能力を向上させるのだろうかという根本的な疑問がある。
悩みと苦しみで得られるのは悩みグセと苦しみクセだけではないのだろうかと。

# システム開発で技術ではなくアイデンティティ問題やコミュニケーション問題のあまりの大きさを感じるなど、認知できるだけでも成長したのだなと思うことにする。


# 自分が、アプリケーションのクラスやメソッドの、単にその利用者だとしたら、どのように設計するか。
それを基準に考えると、良い落ち着きどころが見えやすいと思う。プログラミングにもカスタマーサービス精神が必要だ。未来の自分を顧客に見立てての。

# アプリケーションは恐ろしいほどに複雑化しやがるくせに、そいつを扱いやすい状態に保っておくのは、また無限にも思えるコストがかかるように思われる、究極のジレンマの間で、ソフトウェア開発者は永遠に悩み続ける。


# アントニオ猪木が「元気があれば何でも出来る」と語っていたのは本当に究極の真実なのである。
僕らアプリケーション開発者に必要なのは元気なのだ。兎にも角にも。




# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1035








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
統合サービス環境(ISE) を作ってみる


※2019/4/3 まだプレビュー段階の機能です。

## 統合サービス環境とは

[Logic Apps 向け Azure 統合サービス環境の発表](https://azure.microsoft.com/ja-jp/blog/announcing-azure-integration-service-environment-for-logic-apps/)


> "統合サービス環境とは、あらゆるエンタープライズ規模の統合ニーズのために完全に分離された、専用の環境です。新しい統合サービス環境を作成すると、Azure Virtual Network に挿入されます。これにより、Logic Apps を VNET 上のサービスとしてデプロイできます。"

つまり専用のLogic Appsが使えるってこと？

## 作成方法

公式ドキュメント

* [統合サービス環境 (ISE) を使用して Azure Logic Apps から Azure Virtual Network に接続する](https://docs.microsoft.com/ja-jp/azure/logic-apps/connect-virtual-network-vnet-isolated-environment)

* [統合サービス環境 (ISE) を使用して、Azure Logic Apps から Azure Virtual Network リソースにアクセスする](https://docs.microsoft.com/ja-jp/azure/logic-apps/connect-virtual-network-vnet-isolated-environment-overview)

### ISE作成

基本ドキュメント通りでいけます
RBACを設定しなかったらISE作成後、Logic Appsのデプロイに失敗ました。　
手順は飛ばさずに実行しましょう。　空のサブネットが4つ必要なのが注意です。
デプロイに2時間かかるとありますが、私が実行したときは7時間くらいかかりました。

### Logic Appsの追加

Logic Apps側から追加するとリージョン選択の箇所で選べるとありますが、グレーアウトして選べませんでした。
ISE側のLogic Apps追加ボタンからは追加できました。

![2019-04-01_00h32_11.png](https://qiita-image-store.s3.amazonaws.com/0/41243/64489dc1-b565-9d87-4e16-bc9be4d73a04.png)

ISEラベル付きの専用のコネクタがあり、そちらを使う必要があるようです。
試したかったキュー送信もありました。

![2019-04-01_07h48_35.png](https://qiita-image-store.s3.amazonaws.com/0/41243/fd200030-3e88-950c-75e5-7d785d8c017c.png)

![2019-04-01_07h49_04.png](https://qiita-image-store.s3.amazonaws.com/0/41243/dcd88b38-4cad-13d6-902f-e500d54c5935.png)


> "ISE ラベルがあるコネクタは、常にご利用のロジック アプリと同じ ISE で実行されます。 ISE ラベルがないコネクタはグローバルな Logic Apps サービスで実行されます。"

実行される場所が変わってくるようです。

## 料金

> "ご利用の ISE で実行されるロジック アプリ、組み込みアクション、コネクタは、使用量ベースの料金プランではなく、異なる料金プランを使用します。 詳細については、「Logic Apps の価格」をご覧ください。"

とあり、それほど差ないだろうと勝手に思っていましたが、見てみると思った以上に高かったです。

![2019-04-01_08h04_43.png](https://qiita-image-store.s3.amazonaws.com/0/41243/a52a807d-4c1c-ff11-2d07-fe87601fd115.png)

per hour。。

## 所感

動作させた範囲では快適に動いていました。
しばらくタイマートリガーとして動作させてみたかったですが、気軽に検証できる料金ではなかったので断念しました。
AzureScheduerの後継として勧められており、非常に便利でお手軽なLogic Appsですが、共有のサービスなので稀にActionが数秒遅延することがあり困っていました。統合サービス環境はその問題の解決策となるかもしれません。
ただ料金的にはAzure Schedulerの代わりだけに使うには少々オーバースペックなようです。
【Python3】短縮URLを展開（復元）する

# 参考サイト
- [Python URLのリダイレクト先のURLを取得する。](https://ja.stackoverflow.com/questions/48841/python-url%E3%81%AE%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E5%85%88%E3%81%AEurl%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)
Dart-Functions

# Dart Functions
Dart言語における関数の書き方をまとめます。

## 関数の書き方
何も省略しないパターン

```dart
// 戻り値の型　関数名(引数の型 引数名)
bool isNomal(String str) {
  return 'Nomal' == str;
}
```

型を省略して書けます。
しかし、あまり推奨されてないみたいです。（[公式](https://www.dartlang.org/guides/language/effective-dart/design#prefer-type-annotating-public-fields-and-top-level-variables-if-the-type-isnt-obvious))

```dart
isNomal(str) {
  return 'Nomal' == str;
}
```

Javascriptみたいに短くもできます。

```dart
String isNomal(String str) => 'Nomal' == str;

```

## 引数のデフォルト値
関数の引数にデフォルト値を埋め込むことが可能です。（けっこう便利かも）

```dart

main(List<String> args) {
  enableFlags(); //true false
  enableFlags(bold: false,hidden: true); // false true
}

void enableFlags({bool bold:true,bool hidden:false}) {
  print(bold);
  print(hidden);
}
```

デフォルト値を使用する際は{}で引数をくくります。
また、関数を使用するときは引数名:値の形式をとります。

## 関数をオブジェクトのように扱う
dartの関数は関数をオブジェクトのように扱え、関数の引数に指定することなどが可能です。

```dart
main(List<String> args) {
  List<int> list = [1,2,3];
  list.forEach(printElement); // ここ
}

void printElement(int element) {
  print(element);
}
```
## 匿名関数
関数を引数に渡す場合にその場で宣言をする方法です。

```dart
main(List<String> args) {
  List<int> list = [1,2,3];
  list.forEach((item){ // ここがちょっと違う
    print(item);
  });
}
```
#shell で上位ディレクトリに cd で移動するのが面倒過ぎるのでエイリアスを作っておくだけの人生だった

`~/.zshrc` などでエイリアス登録。それだけ。

```
alias t='cd ../'
alias tt='cd ../../'
alias ttt='cd ../../../'
```

ちなみに `cd -` で 1個前のディレクトリに戻れます。


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1033








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
xserverでpythonを実行させる方法

# 参考サイト
- [レンタルサーバー各社のPerl、Ruby、Pythonのパス一覧](https://memorva.jp/memo/dev/perl_ruby_python_cgi_path_shebang.php)


# メモ
### 実行ファイルpyの設定
- パーミッションは705
- pyファイル1行目をenv表記で記入
　→#!/usr/bin/env python
- Internal Server Error が表示されてCGIプログラムが動かない
　→改行コードをLFにする

### 同階層に.htaccess（パーミッション705）を設置し、下記1行を記入
- AddHandler cgi-script .py
#jq コマンドでリストを逆順に反転させる ( reverse )

とても簡単。

```json
$ echo "[1,2,3]" | jq 'reverse'
[
  3,
  2,
  1
]
```

```json
$ echo "[[1,2],[3,4],[5,6]]" | jq '.[] | reverse'
[
  2,
  1
]
[
  4,
  3
]
[
  6,
  5
]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1026








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
正規表現を学んで詰まったポイント

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている梅原です。
今週は正規表現について学んで、ハッカーランクで詰まったポイントについて書きます。

#正規表現で〇〇で始まり、××で終わるを表現する方法
###正規表現はそもそも含まれる文字列を検索するようなもの
どういうことかというと、小文字のアルファベットで始まり、数字でおわる6文字を表現しようとすると、[a-z]....[0-9]みたいな風に僕はかいていて、でもこれだと、'abcde6dkrnggon'も正規表現にマッチした文字列になります。
^[a-z]....[0-9]$と書かないとマッチしません。

#感じたこと
改めて、基本が大事だと思いました。
ちゃんと、最初のところから、集中して読みましょう！
あと、初心者なので間違い等あるかもしれませんので、発見された場合はご指摘いただけると幸いです。
転職ドラフト第17回の最高年収提示額は「1100万円」だったようだ。 #就職 #転職 #エンジニア

# 最終出社から早くも1週間が経過した。
1ヶ月など飛ぶようにすぎるだろうという予感は、おそらく忠実に叶おうとしている。今日こそは転職ドラフトに渾身のエントリーシートを記入し、髪を切り、久しぶりに東京から戻った知人とも会う。


<a href="https://twitter.com/YumaInaura/status/1112826051728564200">2019-04-01 21:16:20 UTC</a>
# 転職ドラフトの正社員採用のプレゼントにうまい棒10万円分というものがあるが、ツッコミどころを満載に用意している感じがするよなあ。
これを選ぶ人はきっと面白い社員、もしくはベタにお仕事ができます社員になることでしょう。うまい棒は安定感のあるネタ作りには定番である。i 
![image](https://pbs.twimg.com/media/D3GUgEjUwAArgSR.jpg)


<a href="https://twitter.com/YumaInaura/status/1112833866710974500">2019-04-01 21:47:23 UTC</a>
# 世界を分報に変えよ。
本当に苦手な事柄は、自分が好みとする事柄と、ミックスインすると良い。たとえば僕の場合、ただ単に転職ドラフトなどのサイトに慣れ親しむだけでも莫大なるコストを感じるが、こうやってTwitterなどで実況中継やアウトプットをすると、楽しみが増すように感じられる。i


<a href="https://twitter.com/YumaInaura/status/1112834329275560000">2019-04-01 21:49:14 UTC</a>
# 転職ドラフトは自分で入力をしないと、審査が開始されない仕様らしい。
これが何もせずともGithub連携などして審査が開始されるような仕様であれば、エンジニアは大喜びであろう。利用言語は自動解析できるだろうし、ポートフォリオなども、全てGithubに置いておけば良い。そのような未来は来ぬか。i 
![image](https://pbs.twimg.com/media/D3GVcOWU4AAv5vh.jpg)


<a href="https://twitter.com/YumaInaura/status/1112834904448876500">2019-04-01 21:51:31 UTC</a>
# このようにTwitterでセルフリプライのチェーンを繋げていき、それをあとで一本のブログに出来るようなのを用意すれば、自分の人生にどれだけ役立つかと思うのだ。
ちょっとしたコストをかければすぐに出来るとは思う。ツリー構造を上へとたどりテキスト整形。やはりAPIの扱いは覚えておくべきである。i


<a href="https://twitter.com/YumaInaura/status/1112835400660222000">2019-04-01 21:53:29 UTC</a>
# Qiitaなどの記事を一本書くことのコストというのは莫大である。
なぜか。Twitterでないからだ。巨大なテキストの編集コストというものは、巨大に跳ね上がるように出来ている。しかしTwitterのように小さい粒のまとまりをスタックしていく方式であると、奇跡的に人間に優しいように思う。i


<a href="https://twitter.com/YumaInaura/status/1112835847680749600">2019-04-01 21:55:16 UTC</a>
# 転職ドラフトという名前だけあって、期間が区切られてエントリーを受け付ける形式のようだ。
ところで開催月は奇数月らしく、早速も、既に4月2日の今はエントリーが出来ぬことに気づく。次回は5月の開催。結果発表はそれよりも遅くなると考えると、これも仕事は熟考しなさいというお告げだろうか。i 
![image](https://pbs.twimg.com/media/D3GXws7UwAA7QT_.jpg)


<a href="https://twitter.com/YumaInaura/status/1112837456577978400">2019-04-01 22:01:39 UTC</a>
# 転職ドラフトはエントリー期間対象外であった。
こういう時に妙な罪悪感を持ち出して、もっと早く見ておけば良かったとか、動くのがおそすぎたのだと、自分を刃物で突き刺すのは愚策である。結果はあくまで結果論であり、過去の愛すべき自分だって、最善を尽くしたであろうから。i


<a href="https://twitter.com/YumaInaura/status/1112837955121438700">2019-04-01 22:03:38 UTC</a>
# 転職ドラフトの前回 第17回のユーザーランキングを見ると、年収提示ランキングの最高額が1100万円であり、累計平均が最高のユーザーは975万円のようだ。
これだけ有名なサービスでの、有象無象のエンジニアのトップがこれであると考えると、甘すぎる夢は見られぬ金額か。サービス特質かもしれぬが。i 
![image](https://pbs.twimg.com/media/D3GY_qcU8AAg_LM.jpg)


<a href="https://twitter.com/YumaInaura/status/1112838809991798800">2019-04-01 22:07:02 UTC</a>



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1027








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->