OmniAICreator/Qiita-1.07M huggingface dataset:
PHPでMySQLと接続するために行ったこと

こんにちは、現在研修でPHP+DBでCRUD機能をつけた掲示板を作成しているのですがPHPとDBでうまく接続ができなかった為、共有したいと思います。なんかの参考になれば幸いです。

##QそもそもなぜなかなかDB接続できなかったのか。
```php
try{
    $db = new PDO('mysql:dbname=php_db;host=localhost;charset=utf8', 'root', 'root');
  } catch (PDOException $e) {
    echo 'DB接続エラー'. $e -> getMessage();
  }
```
上記のコードがMySQLと接続する際のコードになるのですが、PDOというPHPに接続するための関数の第一引数にデーターベース名とhost名、文字コードなどを指定でき、第二引数にユーザーの権限、第三引数にパスワードを入力しないといけないとのことですが、XAMPPを使用している方なら第三引数を特に指定せず　**' '**　だけでいいらしいのですがMAMP環境下だと第三引数にパスワードを指定しないといけなく、私は省略していいものだと思ってずっと接続できずにいました。アホでした。笑

##Qどうやってテーブルにユーザー情報を格納したのか
これ、他のエンジニア様のコードや参考書に記載されているコード色々拝見したのですが、どれもわかりずらくそのままコピペしてもうまくいかなったんですよね。もしかしたら私のコードを他のエンジニア様がご覧になった際には怒られてしまうかもしれませんが一応うまくいったので共有します。

```php
<?php 
  session_start();
  require('../db/connect.php');
//HTMLのコードが並ぶ
 $statement = $db->prepare('INSERT INTO users SET name=?, email=?, password=?');
  $statement -> execute(array(
    $_POST['name'],
    $_POST['email'],
    password_hash($_POST['password'], PASSWORD_DEFAULT)
  ));
?>
```

**session_start**と記載することでpostした情報を取得することができます。それを利用してテーブルに情報を格納していく形になります。

**require**は先ほどのDB接続しているファイルを読み込んでいます。何回も同じ文を書きたくないですからね。

次に**prepare**と記載することでより安全にDBに情報を格納できるとのことだったので記載しております。引数にSQL文を記載していく形になります。INSERT INTOでユーザー情報を格納しています。

**name = ?**というのが下の文に書いてある$_POST['name']に入っている値が**?**の情報になります。
?に置き換わっているカラムの数だけ記載してあります。
最後にパスワードをハッシュ化してDBに格納します。

##最後に
自分はWeb系の企業に就職して初めてPHPを書いています。
PHPだけで掲示板サイト作るのとか勉強していないし無理ーーーー😱とか思ってました。意外となんとかなっているというのが今の現状です。
今までは独学でRuby on Railsの勉強をしていました。
フレームワークってあんなにも便利だったんだなと改めて実感しています。
早く先輩方に追いつけるように日々頑張っていかないといけませんね。
別スプレッドシートの内容を抽出する

## はじめに

・他のスプレッドシートから内容を引用したかった。
・かつ、シート毎で月別にしたかった。（月初〜月末）

## 結論
```やり方.スプレッドシート
=QUERY(IMPORTRANGE("【引用したいスプレッドシートのURL】", "【引用したいスプレッドシートの名称】!【引用したい対象の範囲】"),"SELECT 【対象範囲から引用したい列】 where 【対象範囲から日付が入力されている引用したい列】 >= date '【指定日付】'",-1)
```
※ `【対象範囲から引用したい列】 `はカンマ区切りで複数指定可能。
※ `where`内は`and`などで複数指定が可能。

```実例.スプレッドシート
=QUERY(IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxx/edit?ts=yyyyy#gid=zzzzz", "フォームの回答 1!A:T"),"SELECT Col1,Col20 where Col1 >= date '2020-04-01' And Col1 < date '2020-05-01'",-1)
```
※ x,y,z箇所は内容を伏せています。
※ 実際にはアクセス許可を与える必要があります。

## 解説
### 他のスプレッドシートから内容の引用

```やり方.スプレッドシート
=(IMPORTRANGE("【引用したいスプレッドシートのURL】", 【引用したい対象の範囲】")
```

```実例.スプレッドシート
=IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxx/edit?ts=yyyyy#gid=zzzzz","A1:T90")
```

※ 上記の場合、引用したいスプレッドシートのA1〜T90までが、関数を記載したシートに記載される。

### 指定した列のみを引用

```やり方.スプレッドシート
=query('【引用したいシート名】'!【引用したい対象の範囲】, "select 【抽出したい列】", -1)
```

※ 抽出する対象が同じシート内にある場合は『'【引用したいシート名】'!』は不要。
※ `【抽出したい列】`はカンマ区切りで複数指定可能。


```実例.スプレッドシート
=QUERY(A:T, "SELECT A, T", -1)
```

※ `A:T`は行の範囲を絞らなくても大丈夫。

### 条件に該当する行のみを引用（日付）

```やり方.スプレッドシート
=query('【引用したいシート名】'!【引用したい対象の範囲】, "select 【抽出したい列】 where 【引用した対象の列】 【不等号】 date '【条件】'", -1)
```

※ 抽出する対象が同じシート内にある場合は『'【引用したいシート名】'!』は不要。
※ `where`に指定する条件はandやorで複数指定可能。


```実例.スプレッドシート
=query(A:T, "select A, T where T >= date '2020-04-01'", -1)
```

### んー！（PPAP風に統合）

```やり方.スプレッドシート
=QUERY(IMPORTRANGE("【引用したいスプレッドシートのURL】", "【引用したいスプレッドシートの名称】!【引用したい対象の範囲】"),"SELECT 【対象範囲から引用したい列】 where 【対象範囲から日付が入力されている引用したい列】 >= date '【指定日付】'",-1)
```

```実例.スプレッドシート
=QUERY(IMPORTRANGE("https://docs.google.com/spreadsheets/d/xxxxx/edit?ts=yyyyy#gid=zzzzz", "フォームの回答 1!A:T"),"SELECT Col1,Col20 where Col1 >= date '2020-04-01' And Col1 < date '2020-05-01'",-1)
```
※ 【対象範囲から日付が入力されている引用したい列】では、`Col【左から数えた数値】`で指定する必要がある。


## おわりに
- SQLをかじっていたので、selectやwhereはすんなり受け入れられた。
- IMPORTRANGE関数を使用する際に、色々な記事があってすんなりいかなかった。
- 業務時間を優先させた為、日付の自動取得などを調べることまで手が回らなかった。
- 酔った勢いで結果から分割して解説したが、逆に分かりづらいような気もした。
- 最近コードをいじらず、エクセルかスプレッドシートと格闘してばっかりだと、改めて思った。

## 参照記事
・[queryをimportrangeを使って別スプレッドシートのデータをフィルタリングする - GoogleSpreadSheet](https://qiita.com/vankobe/items/2af21d4b1c3afed5fa82)
・[スプレッドシートのQUERY関数で、条件に一致するデータをまとめて抽出する方法](https://tanuhack.com/query/#SELECT)
・[【QUERY関数】where句で日付データを条件にして行を抽出する](https://qiita.com/vankobe/items/2af21d4b1c3afed5fa82)
・[【スプレッドシート】QUERY関数の参照にimportrangeを使う](https://strategy-conference.com/analysis/spreadsheet/630/)
plunkerでd3 その4

#概要

plunkerでd3やってみた。
covid-19のcsv読んで、日々のデータ取ってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/00bf6ff3-80f6-6a8a-2519-83392e9abe68.png)


#サンプルコード

```
var url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv";
var out = document.getElementById("out");

d3.csv(url, function(data) {
  var values = [];
  for (var i = 0; i < data.length; i++)
  {
    if (data[i]['Country/Region'] == 'Japan')
    {
      var x = 0;
      data.columns.slice(4).map(function(d) {
        x++;
        values.push({
          x: x,
          y: data[i][d],
          c: "Japan"
        });
      });
    }
  }
	var p = 0;
	for (i = 0; i < values.length; i++)
	{
		out.value += values[i].y - p + ", ";
		p = values[i].y;
	}
  const spec = {
	  '$schema': 'https://vega.github.io/schema/vega-lite/v2.json',
	  'width': 300,
	  'height': 300,
	  'data': {
		  'values': values
	  },
    'layer': [{
	    'mark': 'point',
	    'encoding': {
		    'x': {
			    'field': 'x', 
			    'type': 'quantitative'
		    },
		    'y': {
			    'field': 'y', 
			    'type': 'quantitative',
		    },
		    'color': {
			    "field": "c", 
			    "type": "nominal"
		    }
	    }
    }, {
      'mark': 'line',
	    'encoding': {
		    'x': {
			    'field': 'x', 
			    'type': 'quantitative'
		    },
		    'y': {
			    'field': 'y', 
			    'type': 'quantitative',
		    },
		    'color': {
			    "field": "c", 
			    "type": "nominal"
		    }
      }
    }]
  };
  vegaEmbed('#vis', spec);
});




```

#成果物

https://embed.plnkr.co/plunk/s8dDSy75zf3qZE1f

以上。
Docker debian系imageでterminalの日本語入力環境のレシピ

Dockerのdebian系イメージで日本語入力環境を作るレシピ。
ちなみに、Dockerのimageの基本はdebianから作ることを公式が推奨しており、大抵はdebianイメージのextendである。

私がよく使うnode imageもそう。ruby imageも多分そうだった気がする。

## レシピ

```Dockerfile:Dockerfile
FROM node # debianだったりいろいろ

RUN apt-get update && apt-get install -y \
locales \
&& apt-get clean -y && rm -rf /var/lib/apt/lists/* \
&& sed -i -e 's/# \(ja_JP.UTF-8\)/\1/' /etc/locale.gen \
&& locale-gen \
&& update-locale LANG=ja_JP.UTF-8
```

## 簡単レシピ(容量食う)

```dockerfile:Dockerfile
FROM node # debianだったりいろいろ

RUN apt-get update && apt-get install -y \
    locales-all \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*
ENV LANG=ja_JP.UTF-8
```


## 似ている情報

### ```apt-get install language-pack-ja```などをせよ
との記事が多いが、これは多分ubuntuベースのimageのレシピだろう。debianにこんなパッケージはなかった。

### ```locale-gen && update-locale``` せよ
との記事を見かけたが、localesパッケージではなくてlocales-allパッケージを入れればやらなくていいっぽい。でもja以外も入りそう。~~私は容量より設定の容易さを優先してこの方法にした。~~ 両方書いた
とある学生がゲーム開発してみた#3(Terrainの話)

今回は、Terrain(地形)に付いて説明して、実際に地形を作ってみます。
#そもそもTerrainって何?
Terrainは、地形を描き込むための床や地面のような物です。
#操作説明
![1586151037699_tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614245/47b45db4-8065-9d79-e631-5247cb7f0426.png)
##1番
Terrainを追加します。追加するTerrainは隣接していて、同じ大きさです。
##2番
Terrainのペイントです。凸凹、テクスチャ(どんな色、模様で地面を塗るか決めます。)等の編集ができます。
##3番
Terrain上に木を植えます。植えた木には当たり判定が無いので注意が必要です。
##4番
Terrain上に草を植えます。木と同じく当たり判定はありません。
##5番
Terrainの設定をします。普通はそんなにいじらないでも大丈夫です。
#実践···?
というわけで私もTerrainで地形を作ろうとしたのですが···~~どういう訳か樹木とディテールの機能が使えないんです···~~(解決しました。[記事のリンクはこちら](https://qiita.com/ToaruKousensei/items/e68f16814e0f9cfa8e29)。バカすぎ注意です。)とりあえずUnity2018で試したところ、今度はTerrainさえ表示されず。解決出来たらまた記事を書きます。
データ入力バイト体験談

時給が600円。低時給の代名詞が今はどうなった？デスクワークの中でも「やってはいけないブラックバイト」が、最近では良くなりました。どこがどう変わったか、体験者の例をご紹介します。

時給でも安いものから高時給があります。条件や待遇が良いものほど、PC経験や有資格者限定です。

1日8時間労働すると目がきついです。腱鞘炎など手首から、肩や腰なども負担がかかります。

体力仕事ではなくても、肉体労働のように作業量が多いというつらさがあります。アルバイトでも仕事量が多いと、精神的にも影響が出てきます。

ディスプレイを見ている時間が長いことで、ドライアイや視力低下があげられます。モニターチェック作業でも、長時間見ることで楽な仕事ではなくなるのです。

データ入力では、小さい文字のチェックやタイピングが中心。数字に強い人ではないと続けづらい環境です。普通の日本語入力とは違って、テンキーや専用機械を使うこともあります。<a href="https://crowdworks.jp/public/jobs/5263795" >仕事の例</a>

未経験の人にはきついバイト。オフィス勤務は満員電車や通勤地獄との戦いでもあります。

<a href="https://ladys-cash.com/data-input-work-part-time-job-experiences/" >ブラックデータ入力バイト体験談</a>
github jsのアップロードエラー

github から「index.html」「style.css」「js」をアップロードしようとしましたが、
「js」が検証のコンソールでチェックすると　not::ERRABORTED 404　となります。

エラーを調べたら、githubに「js」ファイルが無いとのことでした。

今回、「js」フォルダーはhtmlのbodyタグの中に書きましたので、
headタグの中には何も「js」用のリンクは書きませんでした。

「index.html」「style.css」はきちんと反映されていました。

「js」をアップロードするのは初めてでして、何がエラーに引っかかっているのかわかりません。

ご教示頂けたら幸いです。
よろしくお願い致します。


```html
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>javascript-type</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  

<script src="js/main.js"></script>
</body>
```

![スクリーンショット (266).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581321/170fa850-7930-c4bf-055f-a81803896f0f.png)


![スクリーンショット (267).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581321/e40e0045-1278-f91d-9551-1074be8a84be.png)
コロナウイルス関連サイトを作るときに、エンジニアが気を付けた方が良いこと【自戒を込めて】

# 「情報の集約、可視化」を通したエンジニア的貢献
昨今のコロナウイルス対策に対してエンジニアがどんな貢献を出来るか考えた場合

- コロナウイルス情報の集約
- 可視化（リスト化、グラフ化など）

が、手近なweb技術で出来ることかと思います。

僕は[RapidAPI](https://rapidapi.com/)というAPI提供サービスでコロナウイルス情報が簡単に取得出来ることを知ったため、後者の可視化に焦点を当てて下記のサイトを作りました。

作ったサイト
https://growsic.github.io/covid-overview/

Qiita記事 
https://qiita.com/growsic/items/2dd16151bf5444974e20

## コロナウイルス関連サイトの開発増加
RapidAPI公式の記事によると、コロナウイルスの情報APIに関する検索、利用が直近大幅に増えているとのことです。

<img src="https://rapidapi.com/blog/wp-content/uploads/2020/03/image-2.jpg">
[RapidAPI公式記事](https://rapidapi.com/blog/developers-respond-to-covid-19?utm_source=marketplace&utm_medium=push&utm_campaign=covid-19)

需要に答えるように、RapidAPIの中でも十数本のコロナウイルスの統計情報のAPIが公開されています。

## 情報のソースはどこ？
作ったサイトをSNSで公開していたところ、知人に
**「情報のソースはどこ？ この手の情報サイトに手を出すなら情報はきちんと扱った方が良いよ」**
と言われ、**便利に使える/作れることばかり考えて、情報の信頼性担保は深く考えていなかった**ことに気付き、改めて考えてみることにしました。

※ RapidAPIのリンクはDataSourceとしてサイトに載せていたため、情報の提示は初期から行っていました

# 情報を正しく提示する責任
趣味のサイトを公開する分には、対象情報に不整合があろうと特に問題はありませんが、
社会的大問題を扱う場合は一定の責任が伴います。

## twitterに端を発した、マスク品薄問題に見るバタフライエフェクト
個人が何となしに呟いた「マスクが品切れになるらしい」という根拠のない情報発信で、実際に品薄になるに至りました。
コロナウイルス関連サイトを作って公開する際、正しく情報提供・情報開示をしないと、良かれと思って作ったサイトがかえって混乱を招いてしまうことがありえます。

# 最低限やるべきこと
リリースするに当たって最低限やっておくべきことを考えていました。

## 利用する情報ソースを詳しく調べる
今回僕が使ったAPIで言うと、「15分おきに更新される」と概要に書いてあったものの、使用している体感としてリアルタイムでないことを感じていました。
またどこから情報を具体的に取っているかも正確に把握していなかったので、APIドキュメントやdiscussionを見て回りました。

APIに関するdiscussionに
>we collect and sort the data from different sources in order to display the most recent. We have developed a bot that starts from Google and analyzes the sites with the most data

https://rapidapi.com/api-sports/api/covid-193/discussions/14727/Data-Sources

とあり、Google検索から各サイトを分析して取得するbotを作って提供していることが分かりました。
それゆえに15分おき更新を実現しているようですが、取得元のサイトがいつ時点の情報を取り扱っているか保証出来なく、いつbotが走っているのか分からないため、別のサイトで表示されている値と異なる可能性があることが分かりました。
日本の反映が遅く見えるのは、日本に関するbotが走る頻度とタイミングではないかと推測されます。


## 扱うデータソースをサイトに載せる
そもそも、利用しているAPIの値が絶対に正しいことは誰にも保証出来ません。
サイト閲覧者が自分でデータの可否を判断出来るように、取得元の情報をリンク付きで載せておく方が良いです。
もしスクレイピング等独自に収集したデータであれば、開示出来る範囲でデータの収集方法を載せておくのが良いと思います。

## データ表示がバグっていないか念入りに確認
データソースが正しくても、実装にバグがあって過大/過小に表示されたり、表示されなかった場合は異なった印象をサイト閲覧者に与えてしまう可能性があります。
今回作ったサイトでいうと、

 - ページング処理にバグがあり、ランキングの下一桁が9の国が表示されていない
  (国が多すぎて途中まで気付かなかった)

 - 日本がランキンググラフにいない
   （日本だけのif文処理を書いたらリストに追加し忘れていた）

など、正常系は正しく動いていても、特定のケースにおいてバグっているケースは多々起きえます。

特異なパターンでも正しくデータが表示されているか、公開前に念入りに見ておいた方が良いです。

# 最後に
こんなことも気を付けた方が良いなどあれば、是非教えてください。
エンジニアの開発で少しでも助けになるものを作って行けたらと思っています。
Chrome拡張機能 ４つの機能分類（編集中）

※初投稿時に誤解していた部分あり訂正しています

以前に最初にChrome拡張を学んだ際に参考にしたものを下記の記事にしました。
[最初にChrome拡張機能を作るときに参考にしたもの](https://qiita.com/Stchan/items/86aec660b20e194fbb2f)

再学習したこともあり、4つの機能分類について具体的に整理しました

1.ブラウザアクション：ツールバーにアイコンが追加されるタイプ
2.ページアクション：アドレスバーの中にアイコンが追加されるタイプ。ページの内容をフラグに動作するタイプ。
3.コンテンツスクリプト：特定のURLで動作するスクリプトで、表示されているDOM要素を読み込んだり、変更を加える事ができる。
  （例）SHOWROOM すこすこツール＋
4.コンテキストメニュー：右クリックで表示されるメニュー
 これはバックグランドの一つと考えたほうが良さそう
 ページアクションについてわかったこと
　- chrome.tabs.onUpdated.addListener
　- chrome.pageAction.show
初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Pod編

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


# 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。

## 勉強開始

ここからデプロイの方法を学んで行きたいと思います。

- https://github.com/kubernetes-practical-guide/examples/blob/master/ch1.3.2/my-pod.yaml


```yaml:my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod # このオブジェクトの名前
spec:
  containers: # Podに含むコンテナのリスト (1)
  - name: nginx         # コンテナの名前
    image: k8spracticalguide/nginx:1.15.5 # コンテナイメージ
    ports:
    - containerPort: 80
```

### コマンド郡

## Pod のマニュフェストファイルを適用する
```
# kubectl apply -f my-pod.yaml
```

## Pod の情報を取得する
```
# kubectl get pod my-pod
NAME     READY   STATUS    RESTARTS   AGE
my-pod   1/1     Running   0          12m
```

### Pod の情報を削除する（ファイル指定）
```
# kubectl delete -f ./my-pod.yaml
pod "my-pod" deleted
# kubectl get pods
No resources found.
```

### Pod の情報を削除する(名前指定)
```
# kubectl delete pods my-pod
pod "my-pod" deleted
# kubectl get pods
No resources found.
```
Excel VBA エラー465「リモートサーバがないか、使用できる状況ではありません」の解決法

# 事の発端
Excel からWordにグラフを複数回貼り付けるマクロを作っていたら、エラー番号465の「リモートサーバがないか、使用できる状況ではありません」というようなエラーが出るようになりました。

# 症状
面白いことに、マクロを実行したら2回に一回エラーが必ず出る。
なので多分、どこかでオブジェクトへの参照を解除(Set オブジェクト変数 = Nothing)を忘れているとかで出ているエラーだと思われました。しかし、原因の箇所がどうしても判明しない。


そこで、強引な解決方法を見つけたので紹介します。

# 解決方法
Endを使います。

End Subじゃないです。Endです。
つまり・・・

``` vb
Sub main()

   (・・・色んな処理・・・)

   End　　← ココ重要!!
End Sub
```
ということです。
これで「リモートサーバがないか、使用できる状況ではありません」というエラーがでなくなります。原因が見つからないときの一時的な応急処置としてですが。
なぜ、コレで解決するのか、自分の場合偶然でしたが、理由としては以下の通りだと思います。

# End sub と Endの違い
>Exit Sub、はsubから抜けるだけです。このsubを呼び出したprocedureに戻ります。プログラムが終了するわけではありません。
>endはプログラムを終了させます。

引用元：https://okwave.jp/qa/q4093153.html
なるほど。なるほど。

## VBAの関連記事
[Excel VBA PasteSpecial で出るエラーの回避方法](https://qiita.com/hatorijobs/items/4163671b03ecbe3066ee)
[VBAで相対パスから絶対パスに変換する関数](https://qiita.com/hatorijobs/items/e17188893205e5423532)
IBM i (旧AS400）の自己学習メモ０６　CLプログラム（Control Language） Part2　RTVCLSRCでCLプログラムからソースを取得

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

`RTVCLSRC`コマンドを使うと、CLプログラムのオブジェクト（*PGM）からCLソースを取得できるようなので、それの検証をやってみようと思います。

# 事前確認

事前に、[IBM i (旧AS400）の自己学習メモ０６　CLプログラム（Control Language） Part1
](https://qiita.com/You_name_is_YU/items/774b320ffd48fbff5f60)が完了しており、`CLPGM00`のCLプログラム（*PGM）が存在している状態であること。

# まずは紐づくCLPGM00のソースコードを削除

PDMでQCLSRCのメンバー一覧を表示している状態で、削除対象のオプションに`4`を入力してEnter
確認画面が出てくるのでもういっちょEnter

![AS400-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/410c11df-4330-ef64-7e82-b4a1a08282cb.gif)

# ソースを復元

PDMでQCLSRCのメンバー一覧を表示している状態で、以下のコマンドを実行してソースコードを復元する。
コマンドの実行が完了したらF5キーを押下して画面を更新する。

```shell-session
rtvclsrc pgm(yamaguchi1/clpgm00) srcfile(yamaguchi1/qclsrc) 
```

![AS400-4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/7a821b14-cf6d-b69d-93a7-07372d7672a5.gif)

# 補足

全てのCLプログラムで、ソースコードを取得できるわけではなく、CLソースからコンパイルする際のオプションで、`Allow RTVCLSRC`を`*YES`(デフォルト)にしていない場合はソースコードの取得ができないので注意が必要。

![AS400-5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/94850d76-8191-262d-5112-5cf992a4208c.gif)
1アクションで複数のビューを切り替えて表示しようとしたが、結局１アクション１ビューが良いという話

#●はじめに
今回がQiita初投稿です。ポートフォリオを作成中に学んだ事をアウトプットする事を目的に始めました。
初歩的な内容が多いかと思いますが、是非、これからポートフォリオを作成する方に対し、役立てればという思いで発信しております。

#●概要
トップページに「投稿一覧」「いいねした投稿一覧」「自分の投稿一覧」というリンクを作成し、それぞれを1つのindexアクションにまとめようとようとした。しかしやはり基本的には１アクション１ビューが良いとのことでした。

#●理由
・１つにまとめてしまうと、対応するURLがわかりにくくなる
・Railsの設計思想であるMVCの観点からやはり望ましい

#●実装方法
ちなみに、それでもあえて1つにまとめたいなら、パラメータを利用します。

```
if params[:name] == "post"
 @questions  = Post.all
elsif params[:name] == "like"
  処理
elsif params[:name] == "user_post"
  処理
```

ですがおすすめとしてはアクションで分けてしまう事。
「例1」
・posts#index
・users#like_index
・users#post_index

リソースでまとめたいというこだわりがあるのであればコントローラーを作成する方法も。
「例2」
・posts#index
・users#show
・users::favorite#index

#●まとめ
Railsの場合は1アクション１ビューという基本を守った方が良い。
その場合、実装方法には様々な方法があるため、色々試して見るとより理解が深まるかもしれません。
IBM i (旧AS400）の自己学習メモ０６　CLプログラム（Control Language） Part1

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

CL（Control Language）プログラムの作成を行っていきます。

# CLプログラムのソースを新規作成

CLプログラムのソースを新規作成し、プログラミングの勉強をするときに必ず出てくるような「おまじない」をコーディングし、保存して終了するまでの流れをまとめます。

```shell-session
# strpdmコマンド実行
strpdm ⏎

# 3.Work with membersを選択
3 ⏎

# QCLSRCファイルを指定
File : QCLSRC
Library : {指定のLibrary}

# F6キー押下

# ここまでの手順でStart Source Entry Utility (STRSEU) の画面に遷移する

Source Member : {任意のCLプログラムソース名}
Source Type : CLLE
Text 'description' : {CLプログラムの説明} 

# CLプログラムは'PGM'で始まり'ENDPGM'で終わる。（ENDPGMは無くても良いみたいだが。）
# START:やEND:はラベルで、特に決まりは無いがわかりやすく入れているだけ。

# 'PGM'や'ENDPGM'の部分にカーソルを合わせてF4キーを押下し、Enterを押下すると
# 適切な列位置にフォーマットしてくれる。

# F3キーを押下してSEUを終了し、
# Change/create memberに'Y'を指定してEnter
```

以上でCLプログラム作成のおまじないまでの手順が終了です。
以下は上記操作の参考イメージです。

![AS400-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/c1bb3b6b-9828-a807-3f2e-a1b77c6fe58b.gif)

# よくある Hello World でCLプログラムの実行まで

`CLPGM00`という名前でCLプログラムのソースを新規作成する。
内容は以下のような感じ

```shell:CLPGM00
 FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 0 
        *************** Beginning of data *******************************************************************
0001.00              PGM                                                                                     
0002.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(12)                                                
0004.00 START:                                                                                               
0005.00              CHGVAR     VAR(&MSG) VALUE('Hello World!')                                               
0006.00              SNDPGMMSG  MSG(&MSG)                                                                    
0006.01              RETURN                                                                                  
0007.00 END:                                                                                                 
0008.00              ENDPGM                                                                                  
        ****************** End of data **********************************************************************
```

ソースを作成し保存したら、PDMの一覧画面でCLPGM00のオプションに`14`を入力しEnter
`CALL CLPGM00`と作成したCLプログラムを実行すると以下のように`Hello World!`と出力される。
![AS400-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9fb3b433-c2d9-2bfb-0d86-0644708d458d.gif)
GAE の非マネージド証明書で中間証明書を設定する

Google App Engine で作ったサイトをカスタムドメイン使って公開したら、Firefoxでエラーになって見れないという問題が発生し、結論から書くと中間証明書を入れないとダメだよ、って話。

# Firefox とか一部の環境でエラーに

中間証明書を設定してなくても Chrome や Safari では特にエラーが出なかったので全く気がつかなかったのですが、Firefoxでアクセスしようとしたらエラーになりました。

スクショ取り忘れたんですが、出てたエラーは

```
SEC_ERROR_UNKNOWN_ISSUER
```

みたいな感じだったと思います。

https://support.mozilla.org/ja/kb/error-codes-secure-websites

よくある警告が出て、「怪しいサイトだよ」的な感じになっちゃうやつ。

カスペの企業版入れてる環境ではそもそも、何も表示されなくなってたので、環境によってはその手の表示になっちゃうかも。

挙動的に中間証明書だなぁっと思いつつ、GAEの設定画面って中間証明書入れるところなかったよなーっと。

<img width="485" alt="gae-ssl.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/2fb75b8e-7cd2-387f-76b9-4fe2a6cda345.png">

なので、特に意識せずに公開鍵と秘密鍵だけを入れて、Chrome とか Safari でテストしててOKだったので、そのまま公開したのですが、Firefox は厳格なんですかね。

最近全く使ってなかったので、っと言うかこのタイミングで入れました。

ロードバランサーの方はちゃんと中間証明書入れる所あるのに、謎。

<img width="490" alt="lb-ssl.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84947/40501b43-dab9-a725-2c97-a6b6fb4b4068.png">

# GAE で中間証明書を指定する方法

ってことで、中間証明書を含めてアップロードすれば良いわけですが、フィールド的に公開鍵と秘密鍵しか無いので、公開鍵に含めてUPします。

順番は

1. 公開鍵
2. 中間証明書

の順番

```
-----BEGIN CERTIFICATE-----
公開鍵
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中間証明書
-----END CERTIFICATE-----
```

この順番で書かないとエラーになってアップロードできないので注意。

おしまい。

例えば、カスペの家庭向けのやつを入れてると、Firefoxでもエラーになりません。
めんどい・・・
個人プロダクトでCircleCIを導入する意味はあるのか

# はじめに

FundastA Inc.の片田です！

今回は**CircleCI**についての記事を書いていきます。

最近趣味でやってるチーム開発や、個人開発でCircleCIを導入してみたのですが、果たしてこれは個人レベルのプロダクトに必要なのか？と疑問に思ったので記事にしつつ思考を整理してみよう！という魂胆です。

(あとなんかCircleCIのTシャツもらえるかもしれないらしいので笑)

これからCircleCIを勉強しようとしている方や、CircleCIの導入を検討している方の参考になれば幸いです。

# CiecleCIとは何か

公式サイトは[こちらです](https://circleci.com/)

簡単にいうと、**CICD（継続的インテグレーション・継続的デリバリー）を実現するためのツール**です！

。。。正直、何それって感じかと思います。

もっと簡単にいうと、ソースコードをGitにpushするだけで、自動でテストや静的解析を行ってくれるのでソースコードの品質が保たれたり、

自動でビルドしてデプロイするところまでやってくれるのでローカルでビルドして何かしらのGUIをぽちぽちする手間が省けちゃう

っていうツールがCircleCIです。

どうでしょう、何となくイメージ沸きましたか？

# なぜCircleCIを使うか

CircleCIを使う理由は上述した通りです。

>ソースコードをGitにpushするだけで、自動でテストや静的解析を行ってくれるのでソースコードの品質が保たれたり、
自動でビルドしてデプロイするところまでやってくれるのでローカルでビルドして何かしらのGUIをぽちぽちする手間が省けちゃう

ざっくりいうと**手間を省くため**だと思います。

毎回ローカルでビルドする手間か、CircleCIを組み込む手間か、どちらをとるか？というところで選択を迫られるように思います。

# CircleCIを個人プロダクトで使ってみた

現在僕は、趣味でチーム開発と個人開発を同時進行しています。

チーム開発は、全員で５人のエンジニアが集まって一つのプロダクトを作成しております。

個人開発では、ReactNativeを使用してスマホアプリをちまちま作っている状態です。

そして両方のプロジェクトにCircleCIを組み込んでいます。

CircleCIの内容としては、下記の通りです。

- チーム開発: APIの自動テスト（静的解析も含む）、フロントの自動テスト、自動ビルド、自動デプロイ
- 個人開発: フロントの自動テスト、自動ビルド

CircleCIの導入にかかった時間は下記の通りです。

- 公式ドキュメントをザーッと読む（1時間弱）
- 公式のチュートリアルやってみる（30分くらい）
- 自分のプロダクトにCIの部分を組み込む（1時間ちょい）
- 自分のプロダクトにCDの部分を組み込む（3時間くらい）

僕の知識が少ないことと、あまり要領の良い人間ではないので上記のような時間感になってしまいましたが、参考にしていただければと思います。

ぶっちゃけ、CI部分（自動テスト、自動ビルド）はすぐできます。

CDの部分が、僕の場合AWSリソースへのデプロイだったのですが、なかなかうまくいかず苦戦しました。

ここでは細かい記述の話は省きますが、夜中の2時に作業を初めて、作業が終わる頃には近所のおじいさんがラジオ体操してました...。

# CircleCIは個人プロダクトに必要か

最後になりましたが、今記事の本題です。

結論から言いたいので下記の表にまとめました。

| CircleCIを触ったことがあるか | プロダクトをグロースさせるか | 結果 |
| -------- | -------- | -------- |
| Yes     | Yes     | 必要
| Yes     | No      | 不要
| No      | Yes      | 必要
| No      | No      | 不要

という結論になると僕は考えています。

CircleCIを導入するとなると、それなりに学習コストもかかるので、自分が作ろうとしているプロダクトによって、導入を検討する必要があるかと思います。

サービスとしてグロースさせるつもりなら、開発中だけでなく開発後もアップデートしていくことになるだろうし、

その場合は全部自動化しておいた方が楽ですしね。

ただ、学習コストに関して一点補足すると、

僕が業務で使用しているAWS CodePipelineというAWSのCI/CDツールよりは、CircleCIの方が少ない学習コストで導入ができます。

そこは個人的にはCircleCIの魅力かなあと思います。

# おわりに

僕はCircleCIを実際に導入するまでは、

「なんか導入しないといけない雰囲気がする」

くらいにしか思っていませんでしたが、ある程度触ってみると自分のプロダクトに合わせて選択していくべきだなあと感じるようになりました。

クレジットカードもCircleCIも、ご利用は計画的に！
オンライン飲み会に使えそうなRemoを試してみた

#Remoってなーに？？
なんかオンライン飲み会に使えそうなビデオ通話ツールです。
https://remo.co/
[![Remo Conference - Webinar and virtual networking video platform](http://img.youtube.com/vi/AvfjiukhgnE/0.jpg)](http://www.youtube.com/watch?v=AvfjiukhgnE)

本来は企業向けのネットワーキングなどを対象としたサービスのようですね
![WhatisRemo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235673/4b85c7dc-d9a2-49f8-fd87-5a004860e6eb.png)
>引用：https://remo.co/

新卒入社して同期と仲良くなろかなと思ってんのに、お外には出れないので使ってみます。

##特徴

###多人数向け
最低でも５０人までの参加が可能です。
数人程度で試したのですが、特に大きな遅延もみられずわりと好印象って感じ

###テーブル機能
ここが飲み会適性高いところ！！

SkypeやZoomでは基本的に一つのチャンネルしか存在しないので、何人いようが話題が一つしか進められず、ぜんぜん喋れなかったりしちゃう。

でもRemoでは、テーブルごとにチャンネルが分かれていて、マウス操作でテーブル（チャンネル）を移ることができます。
テーブルのイラストに、参加者のアイコンが乗ってるUIも直感的で良いかんじ。

![](http://img.youtube.com/vi/AvfjiukhgnE/0.jpg)
>引用：http://www.youtube.com/watch?v=AvfjiukhgnE

#使い方
Remoは元来、懇親会（ネットワーキング）向けのサービスのため、ホストが課金をするシステムをとっているようです。
プランは４種類ありますが、２週間トライアルがあるので、ひとまずProducerプランで登録

![Pricing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235673/ff4e2d48-3390-561e-8d19-47d55981b55a.png)
>引用：https://remo.co/conference-pricing/

アカウント登録すると、Be A Hostというページで、Companyとしてアカウント登録をします。
（ゆーて個人なので、個人名でいったん登録。）

![Register.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235673/30e8536f-ca8a-59fc-932b-8b5c3cdc6368.png)

登録が終わるとマイページ的なものが表示されるので、Create Eventから、新規イベント（飲み会）を作成。

![CreateEvent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235673/0d922e2c-03c6-43e2-e174-4f1a3bc6d880.png)

ひとまず入力必須のところだけ埋める。
- Event Title
- Start Time
- End Time
- Event Tagline (tagline: キャッチコピー)

作成に成功すると、MyEventsの欄に作成したEventが並ぶのでクリック。
すると、カメラの権限設定した後に、会場に入れる。

![RemoHall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235673/74d54322-ceee-c830-39e7-b9f92c382b1b.png)

基本操作としては、ダブルクリックで席の移動。

ユーザアイコンクリックで、プロフィール閲覧。
ビジネスサービスなだけあってLinkedInのアカウントも連携できる。

そのほかの機能としては、画面共有や、全テーブルへのプレゼンテーション、全体へのアナウンスなどなど。
なんならイベントスポンサーの広告表示とかできちゃう。
さすが、びじねすのおはなししやすそうな感じ。

参加者を招待するには、この画面のURLを共有するだけ。
めっちゃ簡単。
個別で招待もできるっぽい。



#難点
###高い
いやもうこれでしょ。
個人向けのサービスではないので、月額当たりの料金設定が高く、個人でやるには厳しいなぁ

リモートワークを導入した企業さんには、新卒の懇親会・ランチ会やら、普段の飲み会やらのために導入してみたらいいのかなぁと思う。
それならコスパめっちゃ良いよね。
学会あたりでめっちゃ重宝されそう。

###１テーブルあたりの人数がちょっっとだけ少ない
一番やすいプランだと４人/卓。
それ以上でも６人/卓と、リアルの飲み会の席を考えるとほんのちょっとだけ少ないかなという印象。


#あとがき
コスパなど考えると、zoomに課金するのがいいのかもしれません。
（ブレイクアウトルーム機能でテーブル機能を代替する）
けど、UI的にはこっちの方がいいんだよなぁ。個人向けプランだしてくれい。

ひとまず２週間使ってみようっと
そして同期と仲良くなるんだ俺は（切実）
Ubuntu18.04で.bashrcの編集内容が保存されないときの対処法

##環境
・ホストOS: windows10 home
・WSL Ubuntu18.04 lts
・Vscode ver1.43.2

##問題
.bashrcに環境変数を設定しても、エディタを閉じると設定が保存されず、次回起動時に　source ~/.bashrc で設定を読み込まないといけない。

##対処法

以下の手順で解決した。

① .bash_profileを開く

```
 $ vi ~/.bash_profile
```

② 以下の設定を追記する

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

これでエディタの起動時に.bashrcの内容が読み込まれるようになる。
【爆速メモ】とりいそぎアイテムをもたせる設定(cluster)【ワールドアップロードしながら随時更新中】

※執筆段階では、まだまだunity経験者向けの記事となっております。
※できるだけ、unityの知識がなくても、爆速で実装できるようにしたいため加筆修正しています。
***4/7(火)12時更新***

---

クリエイターキットのアプデで実装された「アイテム」機能で、
落ちている盾を、
<img width="259" alt="x01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/4e77af9f-26c3-9830-d4a7-c49fa4c84a08.png">

このように持つことができます。
**イメージ的には、通常のunityにおいて、rigidbodyの挙動が実装されて、
手軽に「持つ」行為ができるようになった、と思ってください。(しかもマテリアル次第では投げることもできる)**
(持ち場所などの細かいことは別記事にて書く予定)
<img width="545" alt="x02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/24b007f3-8556-f62a-ae3c-eb10ebcfd50e.png">


【やり方】
当該オブジェクトのインスペクターで、下図のようにコンポーネントを追加してください。
**「超爆速でアイテム化したい」という場合は、
1. [item]　で検索して、
2. [Grabbable Item]コンポーネント　を追加してください。
必要なコンポーネントが全部ついてきます。**
<img width="278" alt="x03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/f769c897-c050-0ba5-bfe5-9e29f6e63a48.png">

フィジクスマテリアルを追加すればバウンドするし、
Gripの設定をすることで、持つ場所を指定することもできます。

---

【コンポーネントの設定について】

**そのまま持つ、放る**
デフォで[Grabbable Item]コンポーネントの追加で完了
**そのまま持つ、放ったらけっこう跳ねるやつ**
コライダーのマテリアルで、フィジクスマテリアルでいい感じに跳ねるやつを追加する
(爆速で跳ねさせたい場合は、ItemSampleシーンにある、HighBounceを流用しよう!!)
**重力無効**
use gravity オフ
is kinematic オフ
**物理演算無効**
use gravity オフ
is kinematic オン
(ジョジョのスタンド、クラフトワークみたいなことができる)
**当たり判定がない**
コライダーのis triggerをオン

---

**rigidbodyのおさらいも兼ねてアップロードしたワールドはこちら。**
【DuckBouncing!!】
『BouncingDuckSimulator』的なワールドを作ってみました。
みんなで投げ合いっこしようぜ!!
<img width="566" alt="x05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/3127dbd1-f986-d216-c40a-af9b0d8dbbfa.png">
https://cluster.mu/w/2af23816-8183-45ea-b397-9f2362c0f29e

---

**現在作成中の、中世的な世界観かつ、アイテム化したオブジェクトを配置した、上を目指すワールドはコチラ**
【中世的な世界観】
<img width="311" alt="x04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/92e24d4c-faef-e5a7-06d2-fe307a3ca5c7.png">
https://cluster.mu/w/d2692923-c0ec-46ac-ae76-096259ffe27f

---

【公式ガイドはこちらから】
掴めるアイテムの作り方
https://creator.cluster.mu/2020/03/30/howto-item-create/
Javascript初心者のためのArray.prototype反復メソッド使い分け

#Array.prototype反復メソッドって何？

これです
[反復メソッド - Array.prototype - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype#Iteration_methods)

要するに、配列の各要素に対してループ処理をして何かうまいことやるためのメソッドたち。
下記のメソッドは全て上記ページにリンクがあるので、詳しいことの確認は上記ページからどうぞ。

#それぞれこう使おう
####配列の中からいくつかは採用して、いくつかは捨てたい
👉 Array.prototype.filter()
コールバックの中で、採用したい要素が満たす条件をBooleanで指定します。
ふつう、入力する配列と出力する配列の要素数が異なりそうなときに使いますね。

####配列の中から一つだけ採用したい
👉 Array.prototype.find()
filterの返り値が一つになったバージョンとも言えます。
複数ある場合、配列の中で最初に見つかった要素だけを返します。

#####余談
find()は要素の存在を確かめたい場合にも使えますが、その用途だと[Array.prototype.includes()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)の方が適任です。

####配列の各要素を使って処理したい
👉 Array.prototype.forEach()
返り値はありません。処理の結果が欲しい場合は別のメソッドを。
各要素に処理した結果を保持するならmapを一番よく使うと思う。

####配列の各要素に何か処理をして、新しい配列にしたい
👉 Array.prototype.map()
コールバックの中で、各要素に対する処理を記述します。
（数値の）配列の各要素を全て2倍した配列が欲しいなんてときに使います。

####配列の各要素を合計とかしたい
👉 Array.prototype.reduce()
返り値は一つの値になります。
取得したい結果の初期値を与えておいて、ループの中で①各要素に何か処理する、②結果に処理済みの値を作用させる、という処理を延々続けるイメージです。

####どれか一つでも該当するか調べたい
👉 Array.prototype.some()
コールバックの中に、各要素のうちどれか一つでも該当してほしい条件を指定します。
Array.prototype.includes()とは違って、特定の要素が存在することの確認だけでなく（数値の）配列の中にどれか一つでも偶数があるか？みたいな使い方ができます。

####全ての要素が該当するか調べたい
👉 Array.prototype.every()
someが全要素になったパターンとも言えます。
コールバックの中に、各要素の全てにおいて該当してほしい条件を指定します。
Tips: Ansibleでwhen:にlookup('pipe','ssh ..')を使用して、事前タスクでの情報収拾を省略

# 問題: 
## Ansibleでターゲットノード上の状況により処理の実行可否を決める際、一般には別タスクでの事前情報収拾が必要

例えば以下の様に情報収集タスクと実行タスクの2タスク必要。


```yaml:tasks
-
  name: ターゲットノードで/tmp/abc.txtに"ABC"という文字列が含まれるならば
  shell: grep "ABC" /tmp/abc.txt
  register: r

-
  name: 何らかの処理を行う
  when: r.rc == 0
  shell: rm /tmp/abc.txt
```

# ソリューション:
## when:にlookup('pipe','ssh ..')を使用して情報を入手させる対応が可能

例えば以下の様に書ける。

```yaml:tasks

-
  name: ターゲットノードで/tmp/abc.txtに"ABC"という文字列が含まれるならば何らかの処理を行う
  when: >-
    lookup('pipe','
    ssh
    -l '+ansible_env.SUDO_USER+'
    -p '+ansible_ssh_port|string+'
    -i '+ansible_ssh_private_key_file+'
    -o StrictHostKeyChecking=no '+
    ansible_ssh_host+'
    grep -q "ABC" /tmp/abc.txt;
    echo $?
    ') == '0'
  shell: rm /tmp/abc.txt
```

書けないことは無いが、、、可読性は悪いですね。。。。
sudoなどは必要に応じて追加。
この例ではstdoutを使っているのでgrepの-qオプションなどを省くと問題が生じる。
C#で電子署名を実装する

#はじめに
opensslのdgstコマンドをC#で実装しようとしてハマったので、やり方を残しておこうと思います。
#前提条件
自分で作成した証明局が発行したクライアント証明書を使用しています。
以下の環境で動作確認を行いました。
Windows OS用のOpenSSL openssl 1.1.0k
.Net Framework 4.6

#opensslコマンドで電子署名
まず、opensslコマンドで電子署名の動作を確認します。
opensslでは、電子署名にopenssl dgstコマンドを使います。
以下のコマンドで、target.txtに秘密鍵:private-key.pemで署名した結果をsignatureに出力します。

```bash:署名
openssl dgst -sha256 -sign private-key.pem -out signature target.txt 
```

以下のコマンドで、公開鍵:public-key.pemと署名: signatureを使用して、target.txtを検証します。

```bash:検証
openssl dgst -verify public-key.pem -signature signature target.txt
```

#C#で電子署名
C#では、RSACryptoServiceProviderのSignDataとVerifyDataメソッドを使います。
byteDataは署名を行うデータ、fileはpfxファイル名、pfxFilePasswardはpfxファイルのパスワードです。
ただし、以下の署名コードは、例外が発生して動作しません。

```C#:署名
//pfxファイルを読み込み
var cert = new X509Certificate2(file, pfxFilePassward);
//秘密鍵の取り出し
var rsa = (RSACryptoServiceProvider)cert.PrivateKey;
//署名実行
//!!! 例外発生 !!!!
var signature = rsa.SignData(byteData, HashAlgorithm.Create("SHA256"));
```

```C#:検証
//crtファイルを読み込み
var cert = new X509Certificate2(file);
//公開鍵の取り出し
var rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
// 検証実行
var result = rsa.VerifyData(byteData, HashAlgorithm.Create("SHA256"), signature);
```

#署名の処理を変更
.Net Frameworkの問題で上記のコードではSHA256のアルゴリズムが使用できないようです。

以下の記事を参考にコードを変更しました。

[Using certificate from store for RSACryptoServiceProvider](https://stackoverflow.com/questions/40470969/using-certificate-from-store-for-rsacryptoserviceprovider)

```C#:署名
//pfxファイルを読み込み
var cert = new X509Certificate2(file, pfxFilePassward);
//秘密鍵の取り出し
var rsa = (RSACryptoServiceProvider)cert.PrivateKey;
//以下の処理を行わないとSHA256アルゴリズムが使用できない
var enhCsp = new RSACryptoServiceProvider().CspKeyContainerInfo;
var cspparams = new CspParameters(enhCsp.ProviderType, enhCsp.ProviderName, rsa.CspKeyContainerInfo.KeyContainerName);
var privKey = new RSACryptoServiceProvider(cspparams);
// 署名実行
var signature = privKey.SignData(byteData, HashAlgorithm.Create("SHA256"));
```

#最後に
opensslコマンドとC#が出力した電子署名をバイナリ比較して確認しましたが同じものでした。
MySQLで複数件のINSERTを実行する

自分用。プロシージャを初めて使ったので

```sql

DELIMITER //
CREATE PROCEDURE bulk_inserter(
  IN myName VARCHAR(128),
  IN dt VARCHAR(128),
  IN x INT
)
BEGIN
  DECLARE i INT;
  DECLARE dy VARCHAR(128);
  DECLARE hr VARCHAR(128);

  SET i = 0;
  SET dy = DATE_FORMAT(dt, '%d');
  SET hr = TIME_FORMAT(dt, '%H');

  WHILE i < x do
    set i = i + 1;
    INSERT INTO my_table_name (
      name, created_at, updated_at
    )
    VALUES (
      myName, dt, dt
    );
  END WHILE;
END
//

DELIMITER ;

BEGIN;
CALL bulk_inserter('hello world','2020-09-06 16:25:00',10);
COMMIT;

DROP PROCEDURE bulk_inserter;
```
Mavenについてメモ

[背景]
なんとなく使えるレベルを脱却したいため
#❏Mavenとは
 Apache Software Foundationで開発されているプロジェクト管理ツール
####基礎となる考え方
**project object model**

- プロジェクトのライフサイクルをオブジェクトとみなして管理するモデル
- これらの定義（オブジェクトの中身）をpom.xmlに書き出して管理している
- 継承可能なのでsuper-pomの配下に差分として子pomを記述する方式が一般的
- 親pomの内容は変数置換が可能（重複管理を防ぐ）
- これらの値はproject.ファイルに記述することで一元管理が可能
 
#❏pom.xmlとは

- プロジェクトの設定をxmlのタグとして記述している
- プロジェクト≒オブジェクトとするモデル
- ↑より、プロジェクトの属性・振る舞い・関係性・識別子を定義したファイルといえる








参考:https://www.itmedia.co.jp/im/articles/0211/12/news001.html

```
##中身
  <!-基本設定->
  	・modelVersion
  		pomのモデルバージョン：pom記述方法のバージョン値
  	・groupId
  		そのプロジェクトの製作者や会社・団体名
  	・artifactId
  		プロジェクトに割り当てる固有のID
  	・version
  		プログラム（プロジェクト）のバージョン
  	・packaging
  		パッケージングの種類
  	・name
  		プログラム名
  	・url
  		プロジェクトに関連するwebサイトのアドレス
  <!-ビルド設定->
  	・sourceDirectory
  		input要素の指定
  	・outputDirectory
  		output要素の指定
  	・plugins
  		プラグインの指定により拡張性の高いビルドを実施
  <!-ライブラリ関連->
  	・dependencies
  		依存ライブラリを定義する
  		ここに記述することで、mavnがセントラルリポジトリからjarを自動で取得してくれる
  		・dependency
  		  一つの依存ライブラリを定義
  			・groupId：依存ライブラリの作成者
  			・artifactId：識別子
  			・version：ライブラリのバージョン
  			・scope：ライブラリが使用される範囲を定義
  			・exclusions：プロジェクトが依存ライブラリが持つ依存関係を無視する指定
  <!-その他環境設定->
  	・pluginRepository
  		取得元のリポジトリを複数指定する場合に指定
```
参考:http://maven.apache.org/pom.html


#❏各種オペレーションについて
| コマンド   |       内容 | 
|:-----------------|:------------------|
| mvn install  　　　 |作成した（若しくはmavenリポジトリにない）jarファイルをローカルリポジトリにインストール<br> →他依存モジュールが新たなjarを参照できるようにするために使う | 
| mvn package  　　　 |JAR.WAR等の成果物を生成する| 
| mvn eclipce:eclipce| Eclipse 用のファイル（.classpath,.project）を作成する。<br>→どちらもEclipseが内部で使用していると思われる<br>※binディレクトリはコンパイルによって作成されたクラスファイルが含まれる| 
| mvn clean|依存関係を更新するために、初期化する処理|     
- 参考
   http://wiki.tk2kpdn.com/use-maven-command/


#❏その他
###setting.xml  
・mavenが実行するデフォルト設定を記述するファイル
・ローカルリポジトリの位置等を指定
 
**mirrorとは？**
・ミラーリポジトリを指定するためのタグ
・mavenへのアクセスが集中しないようにmirrorリポジトリがいくつも存在
・それらを指定することで、mvn処理の高速化などが図れる

###各種プラグイン
**maven-resources-plugin**
・必要なタイミングでリソースファイルを特定のディレクトリにコピーする機能
・コンパイル後targetに配置された実行可能ファイルが同target/resourceを見るため必要
・参考：https://blog.chocolapod.net/momokan/entry/84

**maven-compiler-plugin**
・コンパイルのプラグイン（デフォルト）

**maven-dependency-plugin**
・指定されたディレクトリーは以下に依存関係（ライブラリ）をコピーして配置する。
・通常はtarget/libに集められる。(Eclipseの場合)
※targetファイルは実行可能ファイル群を集めておく（実行時にはsrcではなくこちらが使われる）
参考：https://qiita.com/tontan9616/items/d8427504e82c68be3b03

**［その他］**
課題：pomのバージョン管理をどのようにやっていくのか？
PowerShell から amazon/aws-cli の Docker イメージを起動して AWS に接続する

AWS CLI の Docker イメージが公開されたので、Docker for Windows + PowerShell という環境から、これを利用する手順について確認しました。

__参考:__

- [AWS公式さんがDocker Hubで aws-cli のイメージを公開してくれた！ - Qiita](https://qiita.com/kai_kou/items/cfb7c1d6a449e0da68d1)
- [AWS CLI v2 Docker image | AWS Developer Blog](https://aws.amazon.com/jp/blogs/developer/aws-cli-v2-docker-image/)

動作環境は以下の通りです。

~~~
PS > docker --version
Docker version 19.03.6, build 369ce74a3c

PS > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.2.4
PSEdition                      Core
GitCommitId                    6.2.4
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
~~~

# Docker イメージの参照

まずは Docker イメージを pull します。

~~~
PS > docker pull amazon/aws-cli
Using default tag: latest
latest: Pulling from amazon/aws-cli
a7583ef20c9d: Pull complete 
7d4c8ec0c058: Pull complete 
cd590779e8ea: Pull complete 
a37a98af08a9: Pull complete 
0a765160c849: Pull complete 
Digest: sha256:7a27c26c2937a3d0b84171675709df1dc09aa331e86cad90f74ada6df7b59c89
Status: Downloaded newer image for amazon/aws-cli:latest
docker.io/amazon/aws-cli:latest
~~~

`docker run` により、CLI ツールのバージョンが返ってくることを確認します。

~~~
PS > docker run --rm -ti amazon/aws-cli --version
aws-cli/2.0.6 Python/3.7.3 Linux/4.15.0-91-generic botocore/2.0.0dev10
~~~

# PowerShell 関数として定義

以降のコマンドを簡略化するため、コマンドを関数として定義します。まずは PowerShell プロファイルのパスを確認します。

~~~
PS > echo $PROFILE
C:\Users\__USER_NAME__\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
~~~

プロファイルを編集し、以下の記述を追加します。

~~~ powershell
function aws {
   $location = Get-Location
   docker run --rm -v ${HOME}/.aws:/root/.aws -v ${location}:/aws amazon/aws-cli $Args
}
~~~

PowerShell を再起動し、関数が利用できることを確認します。

~~~
PS > aws --version
aws-cli/2.0.6 Python/3.7.3 Linux/4.15.0-91-generic botocore/2.0.0dev10
~~~

# AWS への接続設定

次に、AWS 接続用の設定ファイルを生成します。

~~~
PS > aws configure
AWS Access Key ID [None]: AKIA****************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]: json
~~~

これにより、以下の設定ファイルが生成されたことを確認できます。

~~~
PS > ls $HOME\.aws


    Directory: C:\Users\__USER_NAME__\.aws

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2020/04/06    16:59             48 config
-a----        2020/04/06    16:59            116 credentials
~~~

チュートリアルに合わせ、S3 上のディレクトリを参照してみます。

~~~
PS > aws s3 ls
2020-03-31 00:47:53 test
~~~

S3 上にバケットが存在していれば、その一覧が応答で返ってきます。これにより、AWS サービスとの接続が確認できました。
タグの中身だけ取り出したい正規表現

たとえば、

```html
<div>aaaaa</div>
```

このdivの中身だけ取り出したい場合に使う正規表現は

`/(?<=<div>).*?(?=<\/div>)/`




###(?<=

これは、***肯定的後読み***という
わかりやすく書くと、

(?<= ***aa*** )
直前に***aa***があるということ



###(?=<

これは***肯定的先読み***という
わかりやすく書くと


(?=< ***aa*** )
直後にaaがあるやつ


なので`(?<=<div>).*?(?=<\/div>)`
`<div>`の直後で、`</div>`の前にあるやつってかんじ
Docker amazonlinux2 で systemctl を使いたい人生だった

## TLDR;

```Dockerfile:Dockerfile
FROM amazonlinux:2

RUN yum update -y \
    && yum install systemd-sysv -y

CMD ["/sbin/init"]
```

```yml:docker-compose.yml
version: "2"
services:
  web:
    image: amazonlinux:2
    build: .
    container_name: al2c
    privileged: true
    ports:
      - 8080:80
```

```bash
$ docker-compose up --build -d
```

## amazonlinux2では `systemctl` がデフォルトでは使えない

amazonlinux2のコンテナを普通に立ち上げただけだと、 `systemctl` は使えない。
コマンド自体は存在する様だが、権限がないよーと怒られる。

```
Failed to get D-Bus connection: Operation not permitted
```

色々情報を読み齧った結果、次の要素が必要であることがわかった。

- `privileged` を有効にする
- `/sbin/init` で起動する

### チャレンジその1

じゃぁこれでいけるだろう。 `privileged` を `true` にして起動コマンドに `/sbin/init` を設定した。

```yml:docker-compose.yml
version: "2"
services:
  web:
    image: amazonlinux:2
    container_name: al2c
    command: /sbin/init
    privileged: true
    ports:
      - 8080:80
```

だめでした。

```
ERROR: for al2c  Cannot start service web: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/sbin/init\": stat /sbin/init: no such file or directory": unknown
```

`/sbin/init` なんてものは存在しませんと。先んじて何かを導入してやる必要がありそう。

### チャレンジその2

`Dockerfile` を用意して必要な物を入れてから起動。ついでに起動コマンド（`/sbin/init`）もこちらに移動した。

```Dockerfile:Dockerfile
FROM amazonlinux:2

RUN yum update -y \
    && yum install systemd-sysv -y

CMD ["/sbin/init"]
```

```docker-compose.yml
version: "2"
services:
  web:
    image: amazonlinux:2
    build: .
    container_name: al2c
    privileged: true
    ports:
      - 8080:80
```

```bash
$ docker exec -it al2c sh
sh-4.2# systemctl 
  UNIT                                   LOAD   ACTIVE     SUB       JOB   DESCRIPTION
  dev-sda1.device                        loaded activating tentative       /dev/sda1
  dev-ttyS0.device                       loaded inactive   dead      start dev-ttyS0.device
  -.mount                                loaded active     mounted         /
  dev-hugepages.mount                    loaded active     mounted         Huge Pages File System
  dev-mqueue.mount                       loaded active     mounted         POSIX Message Queue File System
...
```

無事動いたみたいです。:raised_hands:

### nginxとかでもよさそう

上では `systemd-sysv` を入れていますが、 `nginx` を入れただけでも依存パッケージの解決でいけました。多分 `apache` でもいけるんじゃないかな、試してませんが。どうせいずれかは入れると思うので、それならそれでよろしいのではないかと存じます。

```Dockerfile:Dockerfile
FROM amazonlinux:2

RUN yum update -y \
    && amazon-linux-extras install nginx1

CMD ["/sbin/init"]
```

Amazon Linux では、 `nginx` は `amazon-linux-extras` コマンドでインストールできます。


## お世話になった記事

- [Docker for MacでAmazon Linux 2でsystemd \- Qiita](https://qiita.com/kawanet/items/d856b7b9eb8ceccac4d7)
- [AmazonLinux2のイメージを/sbin/initで起こせない\!\!【oci runtime error】 \- Qiita](https://qiita.com/harukisan/items/6910684bbf2043a29812)
IQ Botのカスタムロジック：日付によくある読み癖の補正

OCRで日付を読み込んだときに、比較的よく見かけるOCRの読み癖のパターンがあります。

「YYYY年MM月DD日」の「日」の部分が
「B」（アルファベットのビー）になっているパターンと、
「0」（ゼロ）になっているパターンです。

「年」や「月」が違う読み方をされているケースはあまり見たことがないのですが、
なぜか「日」だけはいろんなパターンの帳票でBになったり0になったりしています。

IQ Botでは、そんなOCRの読み癖を補正してキレイにできるので、ここではそのやりかたを紹介します。

#日をBと読んでしまうパターンへの対応

この場合は、[こちら](https://qiita.com/IQBotter/items/b1e7a75439fede2171e6)でも紹介した単純な置換処理で対応できます。

```python:日付項目の日をBと読んでしまうパターンへの対応（フィールド項目の場合）
field_value = field_value.replace("B","日")
```

日付の項目で「B」が正解データに含まれることは考えにくいので、単純に置き換えて問題ないでしょうと。

テーブル項目の場合は、[こちら](https://qiita.com/IQBotter/items/b1e7a75439fede2171e6#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E9%A0%85%E7%9B%AE%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E7%BD%AE%E6%8F%9B%E5%87%A6%E7%90%86)を参照してください。


#日を0(ゼロ)と読んでしまうパターンへの対応

こちらの場合は、単純に置換というわけにいきません。
「10日」「20日」「30日」などのように、0が正解になる場合があるからです。

##対処方法（チートシート：フィールド編）

答えを先に言ってしまうと、「日」をゼロと読んでしまう問題に対しては、以下のコードで対応できます。

```python:日付項目の日をゼロと読んでしまうパターンへの対応（フィールド項目の場合）
if(field_value[-1:]=="0"):
    field_value = field_value[:-1]
    field_value = field_value + "日"
```

##対処方法（チートシート：テーブル編）

テーブルの場合は、おまじないコード（[こちら](https://qiita.com/IQBotter/items/67694b1b0d1376ede7e7#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E9%A0%85%E7%9B%AE%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%AF%E3%81%A9%E3%81%86%E6%9B%B8%E3%81%8F)参照）の間に、以下のコードを書くことで対応できます。

```python:日付項目の日をゼロと読んでしまうパターンへの対応（テーブル項目の場合）

#日付の最後がゼロだったら日に置き換える関数
def dayreplace(ymd):
	x = str(ymd)
	if(x[-1:] == "0"):
		x = x[:-1]
		x = x + "日"
	return x

#表の文字列置換
df['日付の補正をしたい列名'] = df['日付の補正をしたい列名'].apply(dayreplace)

```

##仕組みの説明

フィールド編、テーブル編に共通するポイントは３つです。

①if文（条件分岐）　②スライス　③文字列を連結させるための＋演算子

テーブル編は、上記に加えて関数という仕組みを使っています。

それぞれわかりやすい説明をリンクしておきます。

- ①　if文（＝条件分岐）
上記のコードは、１行目が処理するかどうかを決める条件、2行目と3行目が条件に該当したときに行う処理となっています。
if文についての説明は、 [こちら](https://qiita.com/6ONsNMCaB3FzaKa/items/03ad58cb4620eb343e6e)の記事がわかりやすかったです。

- ②　スライス
上記のコードの1行目にある`field_value[-1:]`や`field_value[-1:]`はスライスという仕組みを使っています。
スライスは、文字列の何番目から何番目を取り出してね、みたいな処理のこと。
スライスについての説明は、[こちら](https://qiita.com/okkn/items/54e81346d8f35733ab5e)の記事がわかりやすかったです。

- ③　文字列を連結させるための＋演算子
3行目のコードは、一見すると足し算か？　と思われるかもしれませんが、文字列と文字列をくっつけているだけです。
へーそんなことができるのねーくらいの理解で十分ですが、参考までに[こちら](https://www.javadrive.jp/python/string/index6.html)のリンクを貼っておきます。

- テーブル編：関数
関数については、[こちら](https://qiita.com/hira03/items/7257a122c586b0f532f2)の説明がわかりやすかったです。

#まとめに変えて

以上を踏まえて、いちおう自前でフィールド編のコードに解説をつけておきます。

```python:日付項目の日をゼロと読んでしまうパターンへの対応（フィールド項目の場合）
if(field_value[-1:]=="0"):              #field_valueの最後の文字が"0"だったら、以下の処理をしてね
    field_value = field_value[:-1]      #field_valueから、最後の１文字を除外 例：YYYY年MM月DD0をYYYY年MM月DDにする
    field_value = field_value + "日"    #↑の処理をしたfield_valueに、"日"をくっつける
```

ものすごく細かいことを言うと、２行目の処理の説明はちょっと端折ってます。

正確には、「`field_value`の１文字目から初めて、最後の文字を含まない文字列を取り出して、そいつを`field_value`に代入してね」と言うべきなのかもしれませんが、わかりにくいし、結果的には同じことなので端折った方の説明を採用しました。

紙帳票をデータ化するにあたって、日付はほぼ全帳票で必須で扱う項目になってくるかと思いますので、
ぜひこちらで紹介したコードを活用してみてください！
新型コロナ情勢下でわかった『クソなSIer』の特徴

# はじめに
巷にあふれる「SIerはクソ」論ですが、
SIerに勤める身としては、まあ、言うほどないよな、大げさだよな、という風に、ネタとして楽しんでおりました。
しかしながら、この度の新型コロナ関連の情勢を受け、「やっぱりSIerはクソだ」と思うに至りました。
これから就活、転職をご検討されている方の参考程度になればと思い、当記事を記載しています。
※特定を避けるために一部改変、誇張をしております。

# すべてのSIerが悪いとは思わない
明言しておきたいと思いますが、すべてのSIerがクソであるとは断じて思っていません。
いままで客先常駐やプロジェクト、もくもく会、ユーザー会などを通じて様々なSIerの社員の方々と話をしてきて、
世の中に素晴らしいSIerさんはたくさんあると感じています。

# クソなSIerの特徴
以下のような特徴を持つSIerは高確率でクソです。
それは、
<b>『別業態の親会社が存在し、経営層が親会社の天下りであるSIer』</b>
です。

### なぜクソなのか
<b>『別業態の親会社が存在し、経営層が親会社の天下りであるSIer』</b>
がなぜクソなのか。以下に理由を列挙していきます。3点あります。

### 経営層がITに理解がない
経営層たる役員は大抵親会社からの天下りです。
例えば金融機関の子会社のSIerで、役員が親会社からの天下りであった場合、
その役員は致命的にITの知識がありません。
DX(デジタルトランスフォーメーション)を『デラックス』と発音してしまうことはご愛嬌です。
弊社では、
<b>『「AWS」だとわかりにくいから正式名称で記載すること』</b>などの指令が実際におりてきたことがあります。
<b>(これは、誇張なしです。)</b>

『名監督がかならず名選手であったとは限らないだろう。だから経営者にITの知識は必要ない』などと平気で発言する役員もいます。
<b>(これも、誇張なしです。)</b>

つまるところ、会話が通じません。

### 親会社ファーストである。
すべては親会社のためです。
親会社の命令には思考を停止して対応しないといけません。
そこで、反論をすると、それが正しくても、大変怒られてしまいます。

また、出世の条件は親会社に気に入られることであり、
スキルをアップさせる、いいプロダクトを作る、プロジェクトを回すといった、
エンジニアでは当たり前のことは評価の軸ではありません。(信じがたいことですが)
<b>若手エンジニアを潰そうが、</b>
<b>一緒に仕事をしてくれるパートナー企業にパワハラをしようが、</b>
ほとんど仕事をしなかろうが、
親会社に評価されればいいのです。
むしろ、経営層や親会社のITリテラシーは低いので、
(彼らにとって)難しいことをしゃべる技術屋さんは出世できません。

### 仕事＝作業である
2点目と似ていますが、親会社から降ってくる仕事を決められたフローに沿ってこなしていけばいいため、
究極的に、<b>仕事＝作業</b>となります。
加えて、決められたフローは1世代前のツールを使います。
つまり、決められたルール、フロー、ツールの沿えばいいため、<b>エンジニアとしてもビジネスマンとしてもスキルがつきません。</b>
例えば、コードのレビューはエクセルベースのレビュー記録表でやり取りを行うよう規定されます。
ルールやフローから外れて、
「レビューはエクセルではなくGitのほうが効率がいいので、使ってみませんか？」
などと発言しようものなら大変怒られてしまいます。

# 新型コロナの情勢においてクソなSIerでおきていること
では、上記のような特徴のSIerだと、昨今の新型コロナ情勢においてどのような事態が起きてしまうのでしょうか。

### 進まないリモートワーク
経営層がITに詳しくないため、リモートワークなどの導入が進みません。
むしろ、「リモートワークとはけしからん！」などという役員の方もいらっしゃいます。
自分が勤める会社ではリモートワークの申請をして、5人ほどの承認を得た後、10営業日後にリモートワークが開始できるようになります。
しかしながら、リモートワーク用回線の増速や機器の調達が遅れ、この状況下でリモートワークが進んでおりません。
大半の社員はこの状況下でも元気に出社しています。

### 親会社の要請　＞　都、国の要請　
何度も言いますが親会社ファーストです。
国や都から外出の自粛を要請されようが、緊急事態宣言が出ようが、
親会社が出社せよと言われれば思考を停止して出社しないといけません。
そこで、
「いやいや、コロナ情勢の中で出社するリスクと、出社して得られるリターンをもう一度考えてみませんか」
といった常識的な発言をすると大変怒られてしまいます。

### イレギュラーに弱い中間管理職
クソなSIerで出世をしていく管理職の皆さんは、仕事（＝作業）を忠実にこなしてきた方々です。
20年も30年も、決められたフローを忠実に守ってきた方々です。
したがって、此度の新型コロナのようなイレギュラーな事態に大変弱い方々です。
方針が二転三転することはザラで、今もなお現場が混乱しています。

# 最後に
弊社では親会社の高貴なご意向により、緊急事態宣言が発令された場合は以下のように対応をとることになっています。

<b>『在宅勤務を減らし、始発出社組と終電帰宅組の2チーム制にする』</b>

ここまでお読みいただきありがとうございました。
この情勢下ですが、どうぞお体におきをつけください。また、
<b>『別業態の親会社が存在し、経営層が親会社の天下りであるSIer』</b>
にもお気を付けください。
Gitをソースからコンパイルしてインストールする。

Gitをユーザーのディレクトリにソースからコンパイルしてインストールする。
だいたいhttps://github.com/git/git/blob/master/INSTALL の記述通り。
私の環境ではexpat辺りやdocのコンパイルでエラーが起きたので、
Alternativeな方法でインストールした。

```bash:terminal
# ソースのダウンロード
$ curl -LO https://github.com/git/git/archive/v2.26.0.tar.gz

# 展開して展開先に移動
$ tar -xvf v2.26.0.tar.gz
$ cd git-2.26.0/

# configureファイルを作成して、configureする。インストール先は展開したディレクトリ
$ make configure
$ ./configure --prefix=$(pwd)

# makeしてinstall
$ make all
$ make install

# installしたgitのversion確認。
$ bin/git --version
git version 2.26.0
```

参考：
https://qiita.com/347lionz/items/a18c5b11df45a7c2e67d
Ubuntu 18.04(Zorin OS 15.2)のVS Codeで日本語入力ができないときはfcitx-mozcにすると直る

Zorin OS 15.2 Core (Ubuntu 18.04 Gnome系列) のOSで、US配列キーボードで、VSCodeだけIME切り替えできなくなったのを直したメモ。

## TL;DR

* Zorin OSの標準 `ibus-mozc` だとVSCodeだけ動かない
* IMをfcitxに変更して再起動すると直る


## 現象

FireFoxやTerminal、Slackでは `Ctrl + Space` で日本語入力切り替えできるのに、VS Codeだけできない。

## 環境

|key|value|
|--:|:--|
|OS|Zorin OS 15.2 Core（Ubuntu 18.04 Gnomeベース）|
|Desktop|Gnome|
|CPU|Intel Core i7-8700k|
|Keyboard|HHKB Pro2 (US配列)|
|言語|日本語でインストール|
|IMシステム|IBus|
|VS Code|1.43.2 Snap版|
|IBus|1.5.17|
|fcitx|4.2.9.6|
|mozc|2.20.2673.102|

VSCodeのバージョン

```
バージョン: 1.43.2
コミット: 0ba0ca52957102ca3527cf479571617f0de6ed50
日付: 2020-03-24T07:52:11.516Z
Electron: 7.1.11
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
OS: Linux x64 5.3.0-45-generic snap
```

## 手順

1. 「言語サポート」を開く。 `Win + Space` で `language` とか入れれば出てくる。
2. 「言語タブ」を開く。
3. 「キーボード入力に使うIMシステム」を「IBus」から「fcitx」に変更。
4. リブート。ログイン、ログアウトだと反映されなかった。

### やったけど意味なかったこと

* SnapかAptかは関係ない。両方試したけど変わらなかった。[Snap版だとIMEが効かないバグ](https://teratail.com/questions/121986)はすでに直ってるので関係ない。
* クリーンインストール直後なので、環境周りは特に影響ないはず。

## 感想

Linuxの日本語周りは、昔よりは相当良くなったとはいえ、WindowsやMacと比べると不安定な感じはする。

バグ報告してもいいかもしれないが、Zorinの影響を捨てきれないので気が向いたらにしておく。